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.
- Í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.
- 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);
Megoldás
6
Í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 ittRajzold 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
- a túra hányadik percében jártunk legközelebb a Kékestetőhöz, és mennyi ez a távolság,
- 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.
