Nagy ZH

Ez az oldal minta NZH-kat tartalmaz, a 2011-es őszi félév alapján.

1 NZH minta

1. Beugró

Írj olyan függvényt, ami paraméterül kap egy pozitív egész számot, s paramétersoron visszaadja a kapott szám osztóinak számát!

Add meg a 73&96 értékét 2-es, 10-es és 16-os számrendszerben!

Generálj egy véletlenszámot 5 és 100 között!

Mit ír ki a következő programrészlet?

int tomb[100]={0,1,2};
int osszeg=0;
int i=0;
for (i=2;i<100;i++)
   osszeg+=tomb[i];
printf("%d\n", osszeg);

Írj olyan C függvényt, ami visszatérési értékként megadja a legnagyobb 4 jegyű prímszámot!

2. Parancssori

Írj olyan C programot, ami a 3. parancssori paraméterben megadott szöveges fájlba írja a parancssori argumentumokat! (Feltételezhető, hogy a felhasználó elegendő paramétert ad meg.)

3. Pénztár

Egy áruházban 32 pénztár van. A tulajdonos nyomon szeretné követni egy napi forgalom adatait az egyes kasszáknál. Így minden vásárláskor egy központi gépen megjelenik a kassza sorszáma és a fizetett összeg a következő alakban:
11 : 33800     (szám szóköz karakter szóköz szám) 11-es kassza, 33800 Ft
Záráskor 0 : 0 adattal zárul az aznapi forgalom figyelése.

  1. Írj olyan programot, ami a standard outputra a nap végén kiírja, hogy melyik kasszánál mekkora volt a bevétel. Ha egy kassza az adott napon nem üzemelt, akkor az ne jelenjen meg.
  2. A kimeneten jelenjen meg annak a kasszának a sorszáma is, ahol a legnagyobb összbevételt regisztrálták az adott napon.

4. Sztringes

Készíts függvényt, mely paraméterként kap három karaktertömböt, és az első kettőben lévő sztringet először rendezi, majd összefésülve, azaz betűnként felváltva átmásolja a harmadikba. Pl.: s1=„ebadc”, s2=„1426375”, az eredmény: s3=„a1b2c3d4e567”.

Megoldás

#include <stdio.h>
#include <string.h>

void rendez(char *s) {
    int hossz = strlen(s);
    int i;
    
    /* szelsoertek kereseses rendezes */
    for (i=0; i<hossz-1; ++i) {
        int minindex, j;
        char temp;

        /* minkeres */
        minindex=i;
        for (j=i+1; j<hossz; ++j)
            if (s[j]<s[minindex])
                minindex=j;
        
        /* csere */
        temp=s[i];
        s[i]=s[minindex];
        s[minindex]=temp;
    }
}

void osszefesul(char *s1, char *s2, char *s3) {
    int i, j, cel;
    
    i = j = cel = 0;
    /* amig nem fogyott el mindket sztring, azaz
     * amig barmelyikben van meg karakter, azaz
     * ha az egyikben van karakter VAGY a masikban van karakter */
    while (s1[i]!='\0' || s2[j]!='\0') {
        if (s1[i]!='\0')
            s3[cel++]=s1[i++];
        if (s2[j]!='\0')
            s3[cel++]=s2[j++];
    }
    /* lezaro nulla a cel vegere */
    s3[cel]='\0';
}

/* topdown, hogy ne kelljen omlesztett kodot irni, es
 * hogy ne kelljen a rendezest ketszer leirni */
void rendez_es_osszefesul(char *s1, char *s2, char *s3) {
    rendez(s1);
    rendez(s2);
    osszefesul(s1, s2, s3);
}

int main() {
    char s1[]="fghjsnvcx";
    char s2[]="98712357348371";
    char s3[50];
    
    rendez_es_osszefesul(s1, s2, s3);
    
    printf("s1 rendezve: %s\ns2 rendezve: %s\nosszefesulve: %s\n", s1, s2, s3);
    
    return 0;
}

2 NZH 2011

1. Beugró

Írj C programot, amely a „welcome.txt” nevű szöveges fájlba írja a „Welcome to the real world!” szöveget és egy újsor karaktert!

Megoldás

#include <stdio.h>

int main() {
    FILE *fp;
    fp=fopen("welcome.txt", "wt");
    fprintf(fp, "Welcome to the real world!\n");
    fclose(fp);
    return 0;
}

Írj C függvényt, amely átvesz két egész típusú mutatót, és felcseréli a mutatott értékeket!

Megoldás

void csere(int *pa, int *pb) {
    int temp=*pa;
    *pa=*pb;
    *pb=temp;
}

Írj C függvényt, amely átvesz egy egészekből álló tömböt, és kiírja a tömb utolsó elemét! Írj kódrészletet, amely definiál egy tömböt, és meghívja vele a függvényt!

Megoldás

void utolso(int tomb[], int meret) {
    printf("%d", tomb[meret-1]);
}

int t[5]={1, 2, 3, 4, 5};
utolso(t, 5);

Mennyi d értéke? double d = 3 / 4; Mennyi d értéke? float d = 9 / 2;

Megoldás

0 és 4 /* egész osztás! */

Írj C függvényt, amely egy előjel nélküli egész értéket vesz át, és logikai IGAZ értéket ad vissza, ha a szám 1, és logikai HAMIS értéket, ha a szám nem 1!

Megoldás

int egy_e(unsigned szam) {
    return szam==1;
}

Írj C programot, amely kiírja az összes parancssori paraméterét (a program nevét ne írja ki)!

Megoldás

int main(int argc, char *argv[]) {
    int i;
    for (i=1; i<argc; ++i)
        printf("%s\n", argv[i]);
    return 0;
}

Írj C függvényt, amely átveszi egy kocka oldalhosszát (valós érték), és két, paraméterként átvett valós típusú pointer által mutatott változóban visszaadja a kocka felszínét és térfogatát!

Megoldás

void kocka(double a, double *pA, double *pV) {
    *pA=6*a*a;
    *pV=a*a*a;
}

Írj C függvényt, amely átvesz két sztringet, és a második sztring első karakterét úgy teszi át az elsőbe, hogy az első egy egybetűs C sztringet alkosson (pl. „példa” -> „p”)! Írj kódrészletet, amely definiálja a szükséges változókat, és meghívja velük a függvényt!

Megoldás

void elsobetu(char ide[], char ebbol[]) {
    ide[0]=ebbol[0];
    ide[1]='\0';
}

Definiálj struktúratípust típusdefinícióval, amely alkalmas egy gömb méretének és térbeli helyének tárolására!

Megoldás

typedef struct Gomb {
    double x, y, z; /* kozeppont */
    double r;       /* sugar */
} Gomb;

2a. Egyszer szerepel

Írj egy olyan C függvényt, amely paraméterként kap két, egész számokat tartalmazó tömböt, valamint a első tömb elemszámát, és átmásolja a második tömbbe azokat az értékeket, amelyek csak egyszer fordulnak elő az elsőben (biztosan beleférnek)! Visszatérési értékként adja a második tömbbe betett elemek számát! Az első tömb nem módosítható! (Írhatsz segédfüggvényt is.) Pl. be: {-5,9,2,-5,3,-1,7,2,2,4}, ki: {9,3,-1,7,4}

Megoldás

int hanyszor(int forras[], int meret, int mit) {
    int i, db=0;
    for (i=0; i<meret; i++)
        if (forras[i]==mit) db++;
    return db;
}

int masol(int forras[], int meret, int cel[]) {
    int i1, i2;
    for (i1=i2=0; i1<meret; i1++)
        if (hanyszor(forras,meret,forras[i1])==1)
            cel[i2++] = forras[i1];
    return i2;
}

2b. Egyszer szerepel (sztringen)

Írj egy olyan C függvényt, mely két, az angol abc kisbetűiből álló sztringet vesz át, és átmásolja az első sztringbe azokat a karaktereket, amelyek csak egyszer fordulnak elő a másodikban (biztosan beleférnek)! (Írhatsz segédfüggvényt is.) Írj main() függvényt, melyből meghívod a másoló függvényt! Pl. „madarnyelven” => „mdrylv”

Megoldás

int hanyszor(char forras[], char mit) {
    int i, db=0;
    for (i=0; forras[i]!=0; i++)
        if (forras[i]==mit) db++;
    return db;
}

void masol(char forras[], char cel[]) {
    int i1, i2;
    for (i1=i2=0; forras[i1]!=0; i1++)
        if (hanyszor(forras,forras[i1])==1)
            cel[i2++] = forras[i1];
    cel[i2]=0;
}

int main() {
    char forras[]="Hello", cel[20];
    masol(forras, cel);
    puts(cel);
    return 0;
}

3a. Mavadávárnyevelv

Írj C függvényt, mely két sztringet vesz át paraméterként, amelyekből a második az angol abc kisbetűiből álló szöveget tartalmaz! A függvény az elsőbe írja be a második "madárnyelvű" változatát, azaz a magánhangzókat megkétszerezi, és közéjük egy 'v' betűt rak. Felteheted, hogy az első sztring elég nagy, hogy elférjen benne az új érték! Írj main() függvényt, melyből meghívod a madárnyelv függvényt! Pl. „madarnyelven” => „mavadavarnyevelveven”

Megoldás

#include <stdio.h>

int maganhangzo(char c) {
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

void madar(char *cel, char *forras) {
    int icel, iforr;

    icel = iforr = 0;

    while (forras[iforr]!='\0') {
        cel[icel++] = forras[iforr];

        if (maganhangzo(forras[iforr])) {
            cel[icel++] = 'v';
            cel[icel++] = forras[iforr];
        }

        ++iforr;
    }

    cel[icel] = '\0';
}

int main() {
    char ezt[] = "madarnyelven";
    char madarul[50];

    madar(madarul, ezt);

    printf("%s\n", madarul);

    return 0;
}

3b. Kettőnullakettő (madárnyelv számokon)

Írj C függvényt, amely paraméterként kap két, egész számokat tartalmazó tömböt, valamint az első tömb elemszámát, és a másodikba beírja az első olyan változatát, amely a páros számokat két példányban teszi bele, és közéjük egy 0 értéket rak! Felteheted, hogy a második tömb elég nagy, hogy elférjenek benne az új értékek! Visszatérési értékként adja a második tömb elemszámát! Az első tömb nem módosítható! Pl. be: {-5,9,2,-5,3,-1,7,2,2,4}, ki: {-5,9,2,0,2,-5,3,-1,7,2,0,2,2,0,2,4,0,4}

Megoldás

#include <stdio.h>

int tomb(int *forras, int *cel, int forras_meret) {
    int iforr, icel;

    icel = 0;
    for (iforr = 0; iforr < forras_meret; ++iforr) {
        if (forras[iforr] % 2 == 0) { 
            cel[icel++] = forras[iforr];
            cel[icel++] = 0;
            cel[icel++] = forras[iforr];
        }
        else cel[icel++] = forras[iforr];
    }

    return icel;
}

int main() {
    int forras[] = {-5,9,2,-5,3,-1,7,2,2,4}; 
    int cel[50], cel_db, i;

    cel_db = tomb(forras, cel, 10);

    for (i = 0; i < cel_db; ++i) printf("%d ", cel[i]);

    return 0;
}

4a. Prímszámos

Írj C programot, amely pozitív egész számokat kér be a felhasználótól! A számsorozat végét 0 jelzi. (A 0 után még érkezhet egyéb adat a bemeneten, de ezt a program már ne dolgozza fel!) Garantált, hogy a felhasználó maximum ezer darab számot ad meg a 0 előtt. A program írja ki az összes, a számok átlagánál kisebb beolvasott prímszámot a beolvasás sorrendjével ellentétes sorrendben! Az átlagszámításba a sorozat végét jelző 0 ne számítson bele!

Megoldás

#include <stdio.h>

int prim(unsigned szam) {
    unsigned oszto;
    for (oszto=2; oszto<szam; oszto++) {
        if (szam % oszto == 0)
            return 0;
    }
    return 1;
}

double atlag(unsigned *tomb, int meret) {
    double sum=0.0;
    int i;
    for (i=0; i<meret; i++)
        sum += tomb[i];
    return sum/meret;
}

int main() {
    unsigned tomb[1000], szam;
    int db, i;
    double atl;

    db=0;
    scanf("%u", &szam);
    while (szam!=0) {
        tomb[db++]=szam;
        scanf("%u", &szam);
    }
    atl=atlag(tomb,db);
    for (i=db-1; i>=0; i--)
        if (tomb[i]<atl && prim(tomb[i]))
            printf("%u\n",tomb[i]);
    return 0;
}

4b. Négyosztós

Írj C programot, amely pozitív egész számokat kér be a felhasználótól! A számsorozat végét 0 jelzi. (A 0 után még érkezhet egyéb adat a bemeneten, de ezt a program már ne dolgozza fel!) Garantált, hogy a felhasználó maximum tízezer darab számot ad meg a 0 előtt. A program írja ki az összes, a legkisebb beolvasott szám tízszeresénél nagyobb olyan beolvasott számot, amelynek pontosan négy osztója van, a beolvasás sorrendjével azonos sorrendben! A legkisebb szám meghatározásánál a 0-t ne vegye figyelembe!

Megoldás

#include <stdio.h>

int oszto(unsigned szam) {
    unsigned i, db=0;
    for (i=1; i<=szam; i++)
        if (szam%i==0)db++;
    return db;
}

unsigned legkisebb(unsigned *tomb, int meret) {
    int i, min=tomb[0];
    for (i=1; i<meret; i++)
        if (tomb[i]<min)min=tomb[i];
    return min;
}

int main() {
    unsigned tomb[10000], szam, min10;
    int db, i;

    db=0;
    scanf("%u", &szam);
    while (szam!=0) {
        tomb[db++]=szam;
        scanf("%u", &szam);
    }
    min10=legkisebb(tomb,db)*10;
    for (i=0; i<db; i++)
        if (tomb[i]>min10 && oszto(tomb[i])==4)
            printf("%u\n",tomb[i]);
    return 0;
}

3 PZH 2011

1. Beugró

Írj egy függvényt, amely kap paraméterként egy egészekből álló tömböt, és visszatér egy véletlenszerűen választott elemével.

Megoldás

int veletlen(int tomb[], int meret) {
   return tomb[rand()%meret];
}

Írj függvényt, amely megmondja egy karakterről, hogy az angol ábécé kisbetűje-e.

Megoldás

int karakter(char c) {
   return c>='a' && c<='z';
}
/* VAGY */
int karakter(char c) {
   return islower(c);
}

Adott egy struct Pont { int x, y; } struktúra. Definiálj ilyenből 150 elemű tömböt! Nyisd meg a „pontok.dat” nevű bináris fájlt, és írd bele a tömb tartalmát! (Elég egy kódrészlet, nem kell teljes program.)

Megoldás

struct Pont csucsok[150];
FILE *fp=fopen("pontok.dat", "wb");
fwrite(csucsok, sizeof(struct Pont), 150, fp);
fclose(fp);

Mennyi 23^25? Írd le a számokat és az eredményt is kettes és tízes számrendszerben!

10111 23
11001 25
-----
01110 14

Definiálj felsorolt típust, és annak segítségével adatszerkezetet, amely 3x3-as amőba játék pályáját tudja tárolni.

Megoldás

typedef enum Cella { ures, kor, iksz } Cella;
Cella palya[3][3];   

2. Medián

Írj programot, amely fájl vége jelig olvas a szabványos bemenetről valós számokat, amelyek egy rendezetlen számsort alkotnak. A felhasználó helyes bemenetet ad meg, és legfeljebb 1000 darab beolvasott szám lesz. Írja ki a program a rendezett számsor mediánját. Ha a számsorban páratlan számú elem van, akkor ez a középső; ha páros számú, akkor a két középső számtani közepe. (A rendezés legyen algoritmikusan helyes és indokolható! A „százezerszer végigmegyünk a tömbön és addigra talán rendezett lesz” jellegű megoldások nem érnek pontot.) A program működjön helyesen akkor is, ha nem volt beírt szám! Ilyenkor 0-t írjon ki.

Megoldás

#include <stdio.h>

void rendez(double tomb[], int meret) {
   int i;
   
   for (i=0; i<meret; ++i) {
      int minindex, j;
      double temp;
      
      minindex=i;
      for (j=i+1; j<meret; ++j)
         if (tomb[j]<tomb[minindex])
            minindex=j;
            
      temp=tomb[i];
      tomb[i]=tomb[minindex];
      tomb[minindex]=temp;
   }
}

int main() {
   double tomb[1000], be;
   int db;
   
   db=0;
   
   while (scanf("%lf", &be)==1)
      tomb[db++]=be;
   
   rendez(tomb, db);
   
   if (db==0)
      printf("%f", 0.0);
   else {
      if (db%2==0)
         printf("%f", (tomb[db/2-1]+tomb[db/2])/2);
      else
         printf("%f", tomb[db/2]);
   }
   
   return 0;
}

3. Sztring másolása

Írj függvényt, amely átvesz paraméterként egy karaktertömböt és annak méretét; továbbá egy sztringet. Másolja ez az utóbbi sztringet az előbbi karaktertömbbe! Ha nem fér bele, akkor a forrás sztring végét el kell hagyni. A keletkező karaktertömbbe tehát olyan sztringet kell írni, amely a lehető legnagyobb részét tartalmazza az eredetinek. Térjen vissza logikai igazzal, ha a teljes sztring másolódott, és hamissal, ha le kellett vágni a végét a másoláskor. (Az eredeti sztring nem módosítható.) Írj egy main függvényt, amelyben példát mutatsz a függvény meghívására, olyat is, amelyben a teljes sztring másolódik, és olyat is, amelyben nem. Mindkét esetben jelenjen meg egy üzenet is, hogy teljes volt a másolás vagy hiányzik a sztring vége.

Megoldás

#include <stdio.h>

int sztringmasol(char *ide, int meret, char const *ezt) {
   int i;
   
   for (i=0; i<meret-1 && ezt[i]!='\0'; ++i)
      ide[i]=ezt[i];
   
   ide[i]='\0';
   
   return ezt[i]=='\0';
}

int main() {
   char ide[10];
   int sikerult;
   
   sikerult=sztringmasol(ide, 10, "hello");
   printf("%s: ", sikerult? "befert":"nem fert be");
   printf("[%s]\n", ide);

   sikerult=sztringmasol(ide, 10, "0123456789");
   printf("%s: ", sikerult? "befert":"nem fert be");
   printf("[%s]\n", ide);
   
   return 0;
}

4. Mondatok számolása

Add meg egy tetszőleges, standard bemenetről érkező, tetszőleges hosszúságú szövegről, hogy hány teljes mondat van benne! A bemenetnek fájlvége jelnél van vége. Mondatnak tekintünk minden olyan karaktersorozatot, amelyik nagybetűvel kezdődik, és egy vagy több ponttal, kérdőjellel vagy felkiáltójellel végződik. Pl. „Helló, Dolly!!! Hogy vagy?! Jól, köszönöm.” – 3 mondat.

Megoldás

#include <stdio.h>

/*
           nagybetű       ?!.              többi
      
start      mondatban      -                -
mondatban  -              sz++, start      -
*/

int nagybetu(char c) {
   return c>='A' && c<='Z';
}

int irasjel(char c) {
   return c=='?' || c=='!' || c=='.';
}

int main() {
   enum Allapot { start, mondatban } all;
   
   int c, sz;
   
   sz=0;
   all=start;
   
   while ((c=getchar())!=EOF) {
      switch (all) {
         case start:
            if (nagybetu(c))
               all=mondatban;
            break;
         case mondatban:
            if (irasjel(c)) {
               sz++;
               all=start;
            }
            break;
      }
   }
   printf("%d mondat.\n", sz);
   
   return 0;
}

4 PPZH 2011

1. Beugró

Adott n egy egész típusú változó, melynek értéke egy háromjegyű szám. Add meg azt a kifejezést, amely az n szám középső számjegyét szolgáltatja!

Megoldás

n/10%10

Definiálj struktúratípust targy típusnévvel, amellyel tantárgyakat lehet reprezentálni a következő adataival: tárgy neve, kódja (max 30 ill. 10 karakteres szöveg), szemesztere, kreditje (egész)! Definiálj egy ilyen típusú változót, és adj neki kezdőértéket! Pl. Programozás (VIEEA100) 1. szemeszter, 5 kredit.

Megoldás

typedef struct targy {
   char nev[31];
   char kod[11];
   int szemeszter;
   int kredit;
} targy;

targy prog1={"Programozas", "VIEEA100", 1, 5};

Írj C programot, amely a „valami.txt” nevű szöveges fájl tartalmát a szabványos kimenetre írja! A program adjon hibaüzenetet a szabványos hibakimenetre, ha a fájl nem nyitható meg!

Megoldás

#include <stdio.h>

int main() {
   FILE *fp=fopen("valami.txt", "rt");
   
   if (fp==NULL) {
      fprintf(stderr, "nem tudom megnyitni\n");
   } else {
      int c;
      while ((c=fgetc(fp))!=EOF)
         putchar(c);
      fclose(fp);
   }
   return 0;
}

Mit ír ki az alábbi kódrészlet?

int a=30, b=12;
while (a!=0 && b!=0) { if(a>b) a-=b; else b-=a; }
printf("%d", a+b);

Írj C programot, amely kiírja két, parancssori paraméterként átvett egész szám összegét! (A parancssori paraméterek mindig sztringek, az egész számokat ezekből kell kinyerni.)

Megoldás

#include <stdio.h>

int main(int argc, char *argv[]) {
   printf("%d", atoi(argv[1]) + atoi(argv[2]));
}

2. C++ kommentek tartalma

Írj egy olyan C nyelvű teljes programot, amely a szabványos bemenetről olvasott, szintaktikailag helyes C++ programból kinyeri a megjegyzések tartalmát, és kiírja a szabványos kimenetre. C++-ban a megjegyzések a // karaktersorozattal kezdődnek és a sor végéig tartanak.
// mint ez itt
Rajzold fel a megoldáshoz tartozó állapot- és tevékenységtáblát! (5 pont)
Kódold le az állapotgépet és egészítsd ki a fenti specifikáció szerinti programmá! (5 pont)

3. Túrázó

A Mátrában túráztunk. Utunk során a pillanatnyi helyzetünket egy GPS egység percenként rögzítette. A túra után a GPS egységből az alábbi formátumban kapjuk meg az adatokat: először egy egész szám, az adatpontok darabszáma (gyakorlatilag a túra hossza percben, plusz 1), majd ezt követően éppen ennyi darab számhármas, az egyes pontok x, y és z koordinátái, ahol z a magasság. (Ezeket nyugodtan tekinthetjük derékszögű koordinátarendszerbeli adatoknak, hisz a bejárt terület igen kicsi a Föld felszínéhez viszonyítva.) Ezt a GPS-ből származó adatsorozatot kapja majd a programunk a szabványos bemenetén, az utolsó adat után még egy valós számhármasban pedig a Kékestető pozícióját. Írj egy olyan C nyelvű teljes programot, amely meghatározza és a szabványos kimenetre írja a szabványos bemenetről olvasott adatok ismeretében

  1. a túra hányadik percében jártunk legközelebb a Kékestetőhöz, és mennyi ez a távolság,
  2. utunk két legtávolabbi pontjának a távolságát, azaz az összes lehetséges pontpár térbeli távolságának a maximumát.

A túra biztosan nem tart tovább 20 óránál. (Két pont távolsága a Pitagorasz-tétellel számolható.)

4. Bites

Írj függvényt, amely paraméterként vesz át egy pozitív egész számot, és a szám kettes számrendszerbeli alakját a szintén paraméterként álvett karaktertömbbe írja sztringként! Nem használhatsz könyvtári függvényt a megvalósításhoz.