Informatika2-2015/Gyakorlat10
22. sor: | 22. sor: | ||
A ''main()'' függvénynek az előadáson említettel ellentétben ''int'' kell hogy legyen a visszatérési típusa. (A ''void'' is működik, de arra panaszkodik a fordító.) És ezért a végén vissza kell térni 0-val (ami egy egész szám ugye). A 0 azt jelenti hogy hibátlanul lefutott a program, tehát az ilyen feladatoknál a ''return'' mindig 0 legyen, ne az amit kiszámoltatok. | A ''main()'' függvénynek az előadáson említettel ellentétben ''int'' kell hogy legyen a visszatérési típusa. (A ''void'' is működik, de arra panaszkodik a fordító.) És ezért a végén vissza kell térni 0-val (ami egy egész szám ugye). A 0 azt jelenti hogy hibátlanul lefutott a program, tehát az ilyen feladatoknál a ''return'' mindig 0 legyen, ne az amit kiszámoltatok. | ||
+ | |||
+ | == Feladat megoldások == | ||
=== percdij === | === percdij === |
A lap 2015. április 27., 11:28-kori változata
Tartalomjegyzék |
10. gyakorlat - C tömbök és karakterláncok
Ezen a gyakorlaton az előző heti előadás anyagát dolgozzuk fel.
Feladatok
Feladatok a CloudCoder-en megtalálhatóak. Ajánlott sorrend:
- percdij
- turista
- szamok
- eratosztenesz
- romai
C program és C függvény
Ezen a gyakorlaton, és mostantól, vannak olyan feladatok, ahol nem függvényt, hanem teljes programot kell írni. Ez azt jelenti hogy:
- a bemenetet nem függvényparaméterként kapod, hanem scanf()-el kell beolvasni
- a kimenetet nem return-ölni kell, hanem printf()-elni
- kell lennie main() függvénynek
A main() függvénynek az előadáson említettel ellentétben int kell hogy legyen a visszatérési típusa. (A void is működik, de arra panaszkodik a fordító.) És ezért a végén vissza kell térni 0-val (ami egy egész szám ugye). A 0 azt jelenti hogy hibátlanul lefutott a program, tehát az ilyen feladatoknál a return mindig 0 legyen, ne az amit kiszámoltatok.
Feladat megoldások
percdij
int percdij(int telefon, int hossz) { int dijak[] = {20, 35, 12, 7, 78, 44, 31, 19}; --telefon; return dijak[telefon] * hossz; }
turista
Két lehetséges megoldás is van. Az egyik az, hogy végigmenve a felhőkarcolókon, mindegyikre külön ellenőrizzük, hogy lesz-e még utána magasabb, még egy ciklussal. Ennek a kódja:
#include <stdio.h> int main() { int magassag[10]; int i, j; for(i = 0; i < 10; ++i) { scanf("%d", &magassag[i]); } int osszeg = 0; for(i = 0; i < 10; ++i) { int mindkisebb = 1; for(j = i+1; j < 10; ++j) { if(magassag[j] >= magassag[i]) { mindkisebb = 0; } } if(mindkisebb == 1) { osszeg += magassag[i]; } } printf("%d", osszeg); return 0; }
Van egy másik lehetséges megoldás, amire nehezebb rájönni, de könnyebb leprogramozni. Itt visszafelé megyünk végig a felhőkarcolókon, és számontarjuk hogy mekkora volt eddig a legmagasabb. Ha a most következő alacsonyabb annál, akkor nem látszik, és nem kell beszámítani. Ha magasabb annál, akkor be kell számítani, és mostantól az számít a legmagasabbnak. Kódban ez a megoldás így néz ki:
#include <stdio.h> int main() { int magassag[10]; int i; for(i = 0; i < 10; ++i) { scanf("%d", &magassag[i]); } int max = 0; int osszeg = 0; for(i = 9; i >= 0; --i) { if(magassag[i] > max) { osszeg += magassag[i]; max = magassag[i]; } } printf("%d\n", osszeg); return 0; }
szamok
Itt is több lehetséges megoldás van. Szerintem a legegyszerűbb, ha a számok végét keressük csak meg, tehát azokat a helyeket, ahol az aktuális betű egy számjegy, de a következő már nem. Erre kód:
#include <ctype.h> int szamok(const char mondat[]) { int i; int db = 0; for(i = 0; mondat[i]; ++i) { if(isdigit(mondat[i]) && !isdigit(mondat[i+1])) ++db; } return db; }
eratoszthenesz
#include <stdio.h> int main() { int N; scanf("%d", &N); int prime[200]; int i, j; for(i = 0; i < N; ++i) { prime[i] = 1; } for(i = 2; i < N; ++i) { if(prime[i]) { printf("%d ", i); for(j = 2*i; j < N; j+=i) { prime[j] = 0; } } } return 0; }
romai
Ez nem egy szép megoldás, de megírni nekem ezt volt a legegyszerűbb:
#include <stdio.h> int main() { int N; scanf("%d", &N); char ki[20]; int i = 0; while(N >= 1000) { ki[i] = 'M'; ++i; N -= 1000; } if(N >= 900) { ki[i] = 'C'; ki[i+1] = 'M'; i += 2; N -= 900; } if(N >= 500) { ki[i] = 'D'; i += 1; N -= 500; } if(N >= 400) { ki[i] = 'C'; ki[i+1] = 'D'; i += 2; N -= 400; } while(N >= 100) { ki[i] = 'C'; i += 1; N -= 100; } if(N >= 90) { ki[i] = 'X'; ki[i+1] = 'C'; i += 2; N -= 90; } if(N >= 50) { ki[i] = 'L'; i += 1; N -= 50; } if(N >= 40) { ki[i] = 'X'; ki[i+1] = 'L'; i += 2; N -= 40; } while(N >= 10) { ki[i] = 'X'; i += 1; N -= 10; } if(N >= 9) { ki[i] = 'I'; ki[i+1] = 'X'; i += 2; N -= 9; } if(N >= 5) { ki[i] = 'V'; i += 1; N -= 5; } if(N >= 4) { ki[i] = 'I'; ki[i+1] = 'V'; i += 2; N -= 4; } while(N >= 1) { ki[i] = 'I'; i += 1; N -= 1; } ki[i] = 0; printf(ki); return 0; }
Egy rövidebb megoldás, ami viszont használ mutatókat tartalmazó tömböt, és az strcat() függvényt a string.h beépített könyvtárból.:
#include <stdio.h> #include <string.h> #define ERTEKEK_DB 13 int main() { int N; scanf("%d", &N); const char *nevek[ERTEKEK_DB] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; int ertekek[ERTEKEK_DB] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; char ki[20]; ki[0] = 0; int i; for(i = 0; i < ERTEKEK_DB; ++i) { while(N >= ertekek[i]) { N -= ertekek[i]; strcat(ki, nevek[i]); } } printf(ki); return 0; }