Info 2 első zárthelyi feladatsor

Utolsó módosítás: 2009. március 19.

munkaidő: 90 perc

Binomiális együtthatók

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

1. feladat.

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 

Egyszerű tömörítés

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'

2. feladat.

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;
           ,,,;;;;;;;;,,,
       ,,;;;;;;;;;;;;;;;;;;,,
     ,;;;;;;;;;;;;;;;;;;;;;;;;,
   ,;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
  ,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
 ,;;;;;;;;;;;;''    '';;;;;;;;;;;;,
 ;;;;;;;;;;;            ;;;;;;;;;;;
;;;;;;;;;;;              ;;;;;;;;;;;
;;;;;;;;;;                ;;;;;;;;;;

3. feladat.

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.

4. feladat.

Javítsa ki a programot úgy, hogy működjön nullára is.

Megfordítás

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

5. feladat.

Mi történne, ha a fenti programban pos++ helyett azt írnánk, ++pos?

6. feladat.

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.