Programozás alapjai 9.Gy: Struktúra 2. Ördögi részletek P R O A L A G 35/1 B ITv: MAN 2018.11.10
Euró árfolyam statisztika Az EURO árfolyamát egy negyedéven keresztül hetente nyilvántartjuk (HUF / EUR). Írjon C programokat az alábbi kérdések megválaszolására. a) Hányszor volt a negyedévben 300 Ft alatt az árfolyam értéke? Az adatokat egy tömb inicializálásával adja meg. b) Monoton nőtt-e az árfolyam a negyedév során? A válasz kiírását feltételes operátorral valósítsa meg. Az adatokat ellenőrzött módon olvassa be! c) Melyik héten volt a legmagasabb, és melyiken a legalacsonyabb az árfolyam? Melyek voltak ezek a szélsőértékek? d) Mennyi az adott negyedévre vonatkozó átlagos árfolyam érték? Előjelhelyesen írja ki, hogy az egyes adatok mennyivel térnek el az átlagtól. Az adatokat véletlenszerűen generálja. Ezt a feladatot pointer használatával is oldja meg. A feladatot a strukturált programtervezési alapelv betartásával, azaz minden végrehajtandó funkciót külön függvényként megvalósítva készítse el! 35/2
Megírandó függvények A tömb elemeinek beolvasása ellenőrzött módon. Tömb elemeinek kiírása. Tömb feltöltése véletlenszámokkal. Megadott értéknél alacsonyabb árfolyamok megszámolása. Annak megállapítása, hogy a tömb elemei monoton növekvő sorozatot alkotnak-e? Eldöntendő kérdés. A tömbelemek átlagának kiszámítása. A tömbelemek, és azok átlagtól való eltérésének kiírása. A tömb legkisebb elemének meghatározása. A tömb legnagyobb elemének meghatározása. 35/3
1 A főprogram, és a beolvas és a kiír függvények prototípusa #include <stdio.h> /* Saját függvények prototípusa */ void beolvas(float *tomb, int meret); void kiir(float *tomb, int meret); int main() { int N = 12; float tomb[12]; beolvas(tomb, N); kiir(tomb, N); return 0;... 35/4
1 A beolvas függvény definíciója void beolvas(float *tomb, int meret) { int i, ok; char ch; for(i=0; i<meret; i++) { do { ok = 1; printf("%d. érték: ", i+1); if (scanf("%f", &tomb[i])!=1) { printf("hibás input\n"); while ((ch=getchar())!= '\n'); ok = 0; while (!ok ); return ; 35/5 Feltételezzük, hogy a beolvasott érték helyes Ha nem sikerült egy darab helyes értéket beolvasni Ciklussal kiolvassuk a pufferből a hibás karaktereket Jelezzük, hogy a beolvasott érték helytelen Addig próbálkozunk, míg ok értéke nem 1!
1 A kiír függvény definíciója void kiir(float *tomb, int meret) { int i; for(i=0; i<meret; i++) { printf("%d. érték: %.2f \n", i+1, tomb[i]); return ; 35/6
2 A főprogram, feltöltés véletlenszámokkal és megadott értéknél kisebb elemek megszámolása #include <stdio.h> #include <stdlib.h> #include <time.h> A véletlenszám generáláshoz kell! void feltolt(float *tomb, int meret); int szamlal(float *tomb, int meret, float limit); int main() { int N = 12, db; float tomb[12], limit = 300.0; feltolt(tomb, N); db = szamlal(tomb, N, limit); printf("az árfolyam értéke %d-szer volt %.2f alatt.", db, limit); return 0;... 35/7
2 A főprogram, feltöltés véletlenszámokkal és megadott értéknél kisebb elemek megszámolása void feltolt(float *tomb, int meret) { int i; srand(time(0)); for (i=0; i<meret; i+=1) { tomb[i]=rand()%31+280; return ; A két határ különbsége + az alsó határ int szamlal(float *tomb, int meret, float limit) { int i, db=0; for (i=0; i<meret; i+=1) { if (tomb[i] < limit) db++; return db; Alsó határ: 280, Felső határ: 311 35/8
3 A főprogram, és a monotonitás vizsgálat #include <stdio.h> void beolvas(float *tomb, int meret); int monoton_e(float *tomb, int meret); int main() { int N = 12; float tomb[12]; beolvas(tomb, N); if (monoton_e(tomb,n)) printf("az Euro árfolyama monoton nőtt."); else printf("a számsorozat nem monoton növő."); return 0; int monoton_e(float *tomb, int meret) { int i; for (i=1; i<meret; i++) if (tomb[i-1]>tomb[i]) return 0; return 1;... (+beolvas függvény!) 35/9
4 A főprogram, átlagszámítás, átlagtól eltérés kiírása #include <stdio.h> void beolvas(float *tomb, int meret); float atlagol(float tomb[], int meret); void eltereskiir(float tomb[], int meret, float atlag); int main() { int N = 12; float tomb[12]; beolvas(tomb, N); float atlag = atlagol(tomb, N); printf("\nátlag: %.2f\n", atlag); printf("atlagtol valo elteresek:\n"); eltereskiir(tomb, N, atlag); return 0; 35/10
4 A főprogram, átlagszámítás, átlagtól eltérés kiírása float atlagol(float tomb[], int meret) { float eredmeny, sum=0.0; int i; for(i=0; i<meret; i++) sum += tomb[i]; eredmeny = sum/meret; return eredmeny; void eltereskiir(float tomb[], int meret, float atlag) { int i; for (i=0; i<meret; i++) printf("%d. \t %.2f HUF/EUR \t %.2f\n", i+1, tomb[i], tomb[i]-atlag); printf("\n"); return ;... (+beolvas függvény!) 35/11
5 A főprogram, legkisebb elem indexének meghatározása #include <stdio.h> void beolvas(float *tomb, int meret); int minindex(float *tomb, int meret); int main() { int N = 12; float tomb[12]; beolvas(tomb, N); int mini = minindex(tomb, N); printf("\nlegkisebb elem értéke: %.2f", tomb[mini]); return 0; int minindex(float *tomb, int meret) { int i, minidx=0; for(i=1; i<meret; i++) { if(tomb[i]<tomb[minidx]) minidx=i; return minidx;... (+beolvas függvény!) 35/12
35/13
6 Készítsünk saját függvény könyvtárat a függvényekből. Készítsünk hozzá saját header állományt is. Alkalmazzuk ezt a könyvtárat a feladatban. A saját header neve legyen skheader.h A függvények definícióját helyezzük el az skheader.c nevű fájlban: 1. Keressük meg a projektünket a fájlrendszerben: 2. Hozzunk létre egy skheader.c nevű fájlt Új \ Szöveges dokumentum Neve: skheader.c 35/14
6 3. Nyissuk meg a fájlt jegyzettömbbel 2x 4. Írjuk bele a következőket: 35/15 5. Mentsük le, ha elkészült
6 4. Írjuk bele az skheader.c fájlba a következőket: #include <stdio.h> #include "skheader.h" A minindex függvény kódja A maxindex függvény kódja Másoljuk ide a függvények kódját! A beolvas függvény kódja 5. Mentsük le, ha elkészült 35/16
6 Készítsünk saját függvény könyvtárat a függvényekből. Készítsünk hozzá saját header állományt is. Alkalmazzuk ezt a könyvtárat a feladatban. A saját header neve legyen skheader.h A függvények prototípusát helyezzük el az skheader.h nevű fájlban: 1. Keressük meg a projektünket a fájlrendszerben: 2. Hozzunk létre egy skheader.h nevű fájlt Új \ Szöveges dokumentum Neve: skheader.h 35/17
6 3. Nyissuk meg a fájlt jegyzettömbbel 2x 4. Írjuk bele a következőket: 35/18 5. Mentsük le, ha elkészült
6 Készítsünk saját függvény könyvtárat a függvényekből. Készítsünk hozzá saját header állományt is. Alkalmazzuk ezt a könyvtárat a feladatban. Írjuk át a main függvény kódját: #include <stdio.h> #include "skheader.h" int main(){ int N = 12; float tomb[12]; beolvas(tomb, N); int mini = minindex(tomb, N); printf("\nlegkisebb elem értéke: %.2f", tomb[mini]); int maxi = maxindex(tomb, N); printf("\nlegnagybb elem értéke: %.2f", tomb[maxi]); return 0; 35/19 Az " " azt jelzi a fordítónak, hogy a headert a main függvénnyel azonos mappában találja meg Az < > azt jelzi a fordítónak, hogy a headert a rendszermappában találja meg ( \lib\include\stdio.h) Nyugi! Bár lefordul, még nem működik!
6 A kód életre keltése 1. Jobb klikk a projekt nevére \ Add files 2. Adjuk hozzá az skheader.c fájlt 3. Jelöljük ki, milyen céllal adjuk a projekthez a fájlt 4. Újból jobb klikk a projekt nevére \ Add files 5. Adjuk hozzá az skheader.h fájlt 6. Jelöljük ki, milyen céllal adjuk a projekthez a fájlt 7. Ellenőrizzük le a hozzáadott fájlokat 8. Fordítás, futtatás, nagy mosoly :-) 35/20
Házi feladatok Készítsünk saját függvény könyvtárat paraméterezhető méretű int, char, float és double tömb ellenőrzött beolvasását és kiírását megvalósító függvényekből. Készítsünk hozzá saját header állományt is. A feladathoz készítsen lineáris keresést megvalósító függvényt. A feladathoz készítse el a minimum kiválasztásos rendezés algoritmusát megvalósító függvényt. Saját függvénykönyvtárát egészítse ki az int, float és double tömbökre vonatkozó alapalgoritmusok definíciójával (összegzés, szélsőérték kiválasztás, lineáris keresés). 35/21
35/22
Sztringkezelő függvények Inicializáljon, illetve Esc+Enter lenyomásáig olvasson be a szabványos bemenetről egy szöveget. Ezen a szövegen az alábbi műveleteket hajtsa végre. a) A szöveg megfordítása, illetve fordított kiírása. b) A szöveg nagybetűssé konvertálása. c) A szövegben az E betűk megszámolása. A feladatot a strukturált programtervezési alapelv betartásával, azaz minden végrehajtandó funkciót külön függvényként megvalósítva készítse el! 35/23
7 A főprogram, és a prototípusok #include <stdio.h> #include <string.h> #include <ctype.h> #define N 100 #define ESC 10 Sztringkezelő függvények Karakterkonverziós függvények Az Esc ASCII kódja Windowsban void beolvas(char *szoveg); char* forditvamasol(const char *forras, char *cel); int main() { char szoveg[n], forditott[n]; beolvas(szoveg); printf("a beolvasott szöveg:\n%s", szoveg); char *p; p = forditvamasol(szoveg, forditott); printf("\na szöveg megfordítva:\n%s", p); return 0;... 35/24
7 A függvények definíciója void beolvas(char *szoveg) { int i=0; char ch; printf("esc+enter lenyomasaig olvassa a karaktereket: \n"); printf("de a szöveg végén csak egy Enter-t nyomj!\n"); while ((ch=getchar())!= ESC) { szoveg[i] = ch; i++; szoveg[i] = '\0'; return ; char* forditvamasol(const char *forras, char *cel) { char *seged = cel; int i = strlen(forras)-1; while (i>=0) { *cel = forras[i]; 35/25 cel++; i--; *cel = '\0'; return seged; Ha a szöveg beolvasását a scanf("%s", szoveg); utasítással valósítja meg, az nem tartalmazhat space karaktert.
8 Szöveg megfordítása helyben char* megfordit(char *szoveg) { char *p = szoveg; char seged; int i, j; for(i=0, j=strlen(szoveg)-1; i<strlen(szoveg)/2; i++, j--) { seged = szoveg[i]; szoveg[i] = szoveg[j]; szoveg[j] = seged; return p; A kód hívása a main függvényben: char *p2; p2 = megfordit(szoveg); printf("\na megfordított szöveg:\n%s", p2); 35/26
8 Szöveg fordított kiírása void forditvakiir(char *szoveg) { int i; for(i=strlen(szoveg)-1; i>=0; i--) printf("%c", szoveg[i]); printf("\n"); return ; A kód hívása a main függvényben: forditvakiir(szoveg); 35/27
8 Szöveg nagybetűssé konvertálása char* nagybetusenmasol(const char *forras, char *cel) { char *seged = cel; while (*forras) { *cel = toupper(*forras); //ctype.h függvénye cel++; forras++; *cel = '\0'; return seged; A kód hívása a main függvényben: char *p3; p3 = nagybetusenmasol(szoveg, nagybetus); printf("\na szöveg nagybetűsen:\n%s", p3); 35/28
8 Szöveg nagybetűssé konvertálása helyben char* nagybetusit(char *szoveg) { char *seged = szoveg; while(*szoveg) { *szoveg=toupper(*szoveg); szoveg++; *szoveg = '\0'; return seged; A kód hívása a main függvényben: char *p4; p4 = nagybetusit(szoveg); printf("a szöveg nagybetűsítve:\n%s", szoveg); 35/29
8 Szöveg nagybetűs kiírása void nagybetuvelkiir(char *szoveg) { int i; for(i=0; i<strlen(szoveg); i++) printf("%c", szoveg[i]); printf("\n"); return ; A kód hívása a main függvényben: nagybetuvelkiir(szoveg); 35/30
8 Szövegben az E-betűk megszámlálása int Ebetuk(char *szoveg) { int db=0; while(*szoveg) { if (*szoveg=='e') db++; szoveg++; return db; A kód hívása a main függvényben: int db = Ebetuk(szoveg); printf("\n\na szövegben %d db 'E' betű van.", db); 35/31
8 A teljes főprogram #include <stdio.h> #include <string.h> #include <ctype.h> #define N 100 #define ESC 10 void beolvas(char *szoveg); char* forditvamasol(const char *forras, char *cel); char* megfordit(char *szoveg); void forditvakiir(char *szoveg); char* nagybetusenmasol(const char *forras, char *cel); char* nagybetusit(char *szoveg); void nagybetuvelkiir(char *szoveg); int Ebetuk(char *szoveg); 35/32
8 A teljes főprogram int main() { char szoveg[n], forditott[n], nagybetus[n]; beolvas(szoveg); printf("a beolvasott szöveg:\n%s", szoveg); char *p; p = forditvamasol(szoveg, forditott); printf("\n\na szöveg megfordítva:\n%s", p); char *p2; p2 = megfordit(szoveg); printf("\na megfordított szöveg:\n%s", p2); printf("\na megfordított szöveg fordított kiírása:\n"); forditvakiir(szoveg); p2 = megfordit(szoveg); //A szöveg visszafordítása char *p3; p3 = nagybetusenmasol(szoveg, nagybetus); printf("\na szöveg nagybetűsen:\n%s", p3); printf("\na szöveg nagybetűkkel kiírva:\n"); nagybetuvelkiir(szoveg); p2 = nagybetusit(szoveg); printf("a szöveg nagybetűsítve:\n%s", szoveg); int db = Ebetuk(szoveg); printf("\n\na szövegben %d db 'E' betű van.", db); return 0; 35/33
8 Futási eredmény 35/34
VÉGE VÉGE 35/35