Utolsó módosítás: 2009. március 19.
munkaidő: 90 perc
A következő hibás kódrészlet a binomiális együtthatókból álló Pascal-háromszöget állítja elő.
01 #include <stdio.h>
02 void
03 sor(int) {
04 int k, v;
05 v = 1;
06 for (k = 0; k <= n; k++) {
07 printf("%4d ", v);
08 v = v * (n - k) / (k + 1);
09 }
10 printf("\n");
11 }
12 int
13 main(void) {
14 int m, n;
15 scanf("%d", &m);
16 for (n = 0, n < m; n++)
17 sor(n);
18 return 0;
19 }
A kódban van két egyszerű szintaktikai hiba. Amikor megpróbáljuk lefordítani a kódot a gcc -lm -Wall -O -o z1g0 z1g0.c paranccsal, a fordító ezekre a következő hibaüzenetekkel figyelmeztet.
z1g0.c: In function 'sor': z1g0.c:3: error: parameter name omitted z1g0.c:6: error: 'n' undeclared (first use in this function) z1g0.c:6: error: (Each undeclared identifier is reported only once z1g0.c:6: error: for each function it appears in.) z1g0.c: In function 'main': z1g0.c:16: warning: value computed is not used z1g0.c:16: error: expected ';' before ')' token
Javítsa ki a két elírást a kódban!
A program a binomiális együttható néhány sorát írja ki. Így például ha bemenetnek a 8 számot írjuk be, akkor a kimenet a következő táblázat.
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1
Nézzük meg a következő hibás programot!
01 #include <stdio.h>
02 int
03 main(void) {
04 int count, k, c;
05 count = 0;
06 while (EOF != (c = getchar())
07 if ('0' <= c && c <= '9') {
08 count = 10 * count + (c - '0');
09 } else {
10 if (0 == count)
11 count = 1;
12 for (k = 0; k < count; k++)
13 putchar(c);
14 count = 0;
15 }
16 return 0;
17 }
Ha ezt a programot a gcc -lm -Wall -O -o z1g1 z1g1.c paranccsal lefordítjuk, a fordító a következő hibaüzenettel figyelmeztet egy egyszerű elírásra a programban.
z1g1.c: In function 'main': z1g1.c:7: error: expected ')' before 'if' z1g1.c:17: error: expected expression before '}' token z1g1.c:4: warning: unused variable 'k'
Javítsa ki az elírást!
A program a bemenetben szereplő számok alapján megismétel karaktereket, pontosabban egy (esetleg többjegyű) szám utáni karaktert annyiszor megismétel, amennyi a szám értéke. Így pl. ha a bemenetre azt írjuk, hogy a5bc, akkor a kimenet abbbbbc lesz. Egy bonyolultabb bemenet látható a bal oldalon, a megfelelő kimenet a jobb oldalon.
11 3,8;3, 7 ,,18;,, 5 ,24;, 3 ,28;, ,30;, ,12;''4 ''12;, 11;12 11; 11;14 11; 10;16 10; |
,,,;;;;;;;;,,,
,,;;;;;;;;;;;;;;;;;;,,
,;;;;;;;;;;;;;;;;;;;;;;;;,
,;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
,;;;;;;;;;;;;'' '';;;;;;;;;;;;,
;;;;;;;;;;; ;;;;;;;;;;;
;;;;;;;;;;; ;;;;;;;;;;;
;;;;;;;;;; ;;;;;;;;;;
|
Jelenlegi formájában a program nem kezeli helyesen a 0 számot, például az a0bc bemenetre a kimenet abc lesz, de mi azt szeretnénk, hogy ac legyen. Magyarázza meg, miért van ez.
Javítsa ki a programot úgy, hogy működjön nullára is.
01 #include <stdio.h>
02
03 int
04 main(void) {
05 char line[100];
06 int pos = 0, c;
07 while ('\n' != (c = getchar())) {
08 line[pos++] = c;
09 }
10 while (0 < pos)
11 putchar(line[--pos]);
12 putchar('\n');
13 return 0;
14 }
A fenti (helyes) program megfordít egy, a bemeneten megadott sort. Például ha a bemenet a következő:
Goromba rab morog.
akkor a kimenet ez lesz:
.gorom bar abmoroG
Mi történne, ha a fenti programban pos++ helyett azt írnánk, ++pos?
Ez a program nem működik jól, ha túl hosszú sort adunk meg neki bemenetként. Javítsa ki úgy, hogy ilyenkor a sor elejét írja ki fordítva, de persze rövid sorra is működjön.