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.