Informatika3-2024/Gyakorlat1
(egy szerkesztő 11 közbeeső változata nincs mutatva) | |||
12. sor: | 12. sor: | ||
** Van mind3 oprendszerre | ** Van mind3 oprendszerre | ||
** Windows-on, ha még nincs C fordítónk akkor a '''codeblocks-#.#mingw-setup.exe'''-ot telepítsük ez egyben a codeblocks IDE és a mingw fordító | ** Windows-on, ha még nincs C fordítónk akkor a '''codeblocks-#.#mingw-setup.exe'''-ot telepítsük ez egyben a codeblocks IDE és a mingw fordító | ||
+ | * [https://www.onlinegdb.com/online_c_compiler online c fordító] | ||
+ | ** Ha nagyon sürgõsen kell és nincs idõ semmit telepíteni | ||
Ha megvan a fordítónk akkor próbáljuk meg lefordítani ezt a rövid C kódot: | Ha megvan a fordítónk akkor próbáljuk meg lefordítani ezt a rövid C kódot: | ||
25. sor: | 27. sor: | ||
* Ha a parancssoros gcc úton járunk akkor hozzunk létre egy új file-t hello.c néven, majd parancssorban: '''gcc hello.c -o hello''' | * Ha a parancssoros gcc úton járunk akkor hozzunk létre egy új file-t hello.c néven, majd parancssorban: '''gcc hello.c -o hello''' | ||
* Parancssorban ezután a '''hello''' vagy '''hello.exe''' paranccsal tudjuk lefuttatni a lefordított programot. IDE-ben általában van egy '''Run''' parancs. | * Parancssorban ezután a '''hello''' vagy '''hello.exe''' paranccsal tudjuk lefuttatni a lefordított programot. IDE-ben általában van egy '''Run''' parancs. | ||
+ | |||
+ | * Aki parancssorban marad ajánlom a '''gcc -W -Wall hello.c -o hello''' fordítási módot, hogy lássunk figyelmeztetéseket is ne csak hibákat. | ||
+ | |||
+ | |||
+ | == Szándékos hibák == | ||
+ | |||
+ | Rontsd el a "hello.c" kódot a következő módokon, majd mindig mentsd el és fordítsd le újra (és a következő elrontás előtt mindig állítsd vissza a helyes verziót): | ||
+ | * törölsz egy pontosvesszőt a sor végéről | ||
+ | * a printf-es sorban x helyett valami más betűt írsz | ||
+ | * létrehozol egy y nevű egész típusú változót az x után, de nem használod a kódban | ||
+ | * kitörlöd az utolsó } -t | ||
+ | * törlöd a "return 0;" sort | ||
+ | |||
+ | |||
+ | == Feladatok == | ||
+ | |||
+ | Minden feladathoz nyiss új projektet IDE-ben vagy írd új file-ba ha parancssorból dolgozol! | ||
+ | |||
+ | ===== 1. Feltételes print ===== | ||
+ | Így néz ki egy if, else if, else utasítás: | ||
+ | <c> | ||
+ | if (/* feltétel */) { | ||
+ | /* parancsok */ | ||
+ | } else if (/* feltétel */) { | ||
+ | /* parancsok */ | ||
+ | } else { | ||
+ | /* parancsok */ | ||
+ | } | ||
+ | |||
+ | </c> | ||
+ | |||
+ | Egészítsd ki a következő kódot a megjegyzések helyén! | ||
+ | |||
+ | <c> | ||
+ | #include<stdio.h> | ||
+ | |||
+ | int main(void) { | ||
+ | /* x és y változók deklarálása, értékadás */ | ||
+ | |||
+ | printf("X erteke: %d\n", x); | ||
+ | printf("Y erteke: %d\n", y); | ||
+ | |||
+ | printf("\n"); | ||
+ | |||
+ | /* egy feltételes utasítással (if, else if, else) érd el hogy mindig igaz állítás kerüljön a képernyőre */ | ||
+ | printf("%d nagyobb mint %d!\n", x, y); | ||
+ | printf("%d nagyobb mint %d!\n", y, x); | ||
+ | printf("%d ugyanannyi mint %d!\n", x, x); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | Ha kész, módosítsd úgy a kódot, hogy ne legyen beleírva az elején az ''x'' és az ''y'' értéke, hanem a program a felhasználótól kérjen be egész számokat, a ''scanf()'' függvény segítségével! Példa egy ''z'' egész típusú változó bekérésére: | ||
+ | |||
+ | <c> | ||
+ | int z; | ||
+ | printf("Add meg z értékét: "); | ||
+ | scanf("%d", &z); | ||
+ | /* innentől z-nek van értéke (ha a felhasználó tényleg egész számot adott meg) */ | ||
+ | </c> | ||
+ | |||
+ | |||
+ | ===== 2. For ciklus ===== | ||
+ | Segítségnek itt egy for ciklus példa: 0-tól 9-ig kiírjuk a számokat, vagyis a ciklusváltozó értékét (általában ''i''-nek vagy ''j''-nek nevezzük a ciklusváltozót, ami tipikusan minden körben növekszik eggyel, de persze máshogy is lehetne): | ||
+ | |||
+ | <c> | ||
+ | int i; | ||
+ | for (i = 0; i < 10; i++) { | ||
+ | printf("A ciklusváltozo erteke: %d\n", i); | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | Egészítsd ki a következő kódot úgy hogy 1-tõl 100-ig a páros számokat írja ki. | ||
+ | |||
+ | <c> | ||
+ | #include<stdio.h> | ||
+ | |||
+ | int main(void) { | ||
+ | /* deklarációk és értékadások */ | ||
+ | |||
+ | for (/* inic. */ ; /* feltétel */; /* minden ciklusmag végén */) { | ||
+ | printf("%d\n", i); | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | |||
+ | ===== 3. Do / while ciklusok ===== | ||
+ | |||
+ | Írj C kódot, ami a felhasználótól egy ciklusban egész számokat kér be addig, amíg 0 értéket nem kap. Ekkor pedig írja ki a képernyőre a kapott nemnulla számok átlagát! | ||
+ | |||
+ | Segítség a nem egész értékű változó (''atlag'') ''float'' tipusú legyen, majd a kiírása: | ||
+ | <c> | ||
+ | printf("%f", atlag); | ||
+ | </c> | ||
+ | |||
+ | Példa '''while''' ciklusra: | ||
+ | |||
+ | <c> | ||
+ | while ( /* feltétel */ ) { | ||
+ | /* utasítások amik minden körben lefutnak */ | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | Létezik '''do-while''' ciklus is, ami egyszer mindig lefuttatja a magját és csak utána kezdi teszteni a feltételt: | ||
+ | |||
+ | <c> | ||
+ | do { | ||
+ | /* utasítások amik minden körben lefutnak */ | ||
+ | } while (/* feltétel */); | ||
+ | </c> | ||
+ | |||
+ | |||
+ | ===== 4. Egyszerű gyökkeresés ===== | ||
+ | |||
+ | Egészítsd ki a következő kódot, amely megkeresi az 5329 négyzetgyökét (lesz neki, és egész)!<br\> | ||
+ | (Segítség: nem kell hogy haténkony legyen a kód, elég ha egyesével végigpróbálgatjuk a számokat hogy az-e a gyöke.) | ||
+ | <c> | ||
+ | #include<stdio.h> | ||
+ | |||
+ | int main(void) { | ||
+ | int szam = 5329; | ||
+ | int gyok; | ||
+ | /* szamolj valamilyen ciklusban, valoszinuleg egy feltetel is kell majd a cikluson belul */ | ||
+ | |||
+ | printf("A %d gyoke %d\n", szam, gyok); | ||
+ | return 0; | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | |||
+ | ===== 5. Sakktábla ===== | ||
+ | |||
+ | Rajzolj ki egy ''NxN''-es sakktábla mintát, ahol X-szel jelöljük a fekete mezőket, és üresen hagyjuk (egy szóköz) a fehéreket. Nem kell keretet adni a táblának. A sakktábla méretét (''N'') a felhasználótól kérd be! | ||
+ | |||
+ | Tipp: a ciklusokat egymásba is ágyazhatjuk, de ilyenkor nagyon kell figyelni a ciklusváltozókra! | ||
+ | |||
+ | Egymásba ágyazott ciklus példa: | ||
+ | <c> | ||
+ | #include<stdio.h> | ||
+ | |||
+ | int main(void) { | ||
+ | int i; | ||
+ | int j; | ||
+ | |||
+ | for(i = 0; i < 10; i++) { | ||
+ | printf("i: %d \n", i); | ||
+ | for(j = 0; j < i; j++) { | ||
+ | printf(" (%d, %d) ", i, j); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | } | ||
+ | </c> | ||
+ | |||
+ | |||
+ | == Extra feladatok == | ||
+ | |||
+ | Ha eddig eljutottunk, vagy unalmasnak találtuk a fenti feladatokat, akkor leprogramozhatjuk a példákat az [https://math.bme.hu/~kkovacs/info3/EA1_hu.pdf elsõ elõadásról]. Vagy ránézhetünk ezekre a bonyolultabb feladatokra. | ||
+ | |||
+ | ===== 6. Relatív prímek ===== | ||
+ | |||
+ | Írjunk programot mely bekér két pozitív egész számot (n, m), majd kiírja az n-el relatív prím számokat 0-tól m-ig. | ||
+ | |||
+ | ===== 7. Gyök ===== | ||
+ | |||
+ | Írjunk programot mely bekér egy pozitív számot és visszaadja a gyökét 0.0001 pontossággal. | ||
+ | |||
+ | ===== 8. Barkóba ===== | ||
+ | |||
+ | Írjunk programot mely a [https://hu.wikipedia.org/wiki/Barkochba barkóba] játékot szimulálja. A játékosnak gondolnia kell 0 és 100 között egy egész számra. A program feltesz egy kérdést a játékosnak, amire a játékos 0 (nem) vagy 1 (igen)-el válaszolhat. Majd addig tesz fel kérdéseket amíg biztosan meg tudja mondani hogy mi volt a gondolt szám, ekkor azt kíírja. (Hogyan tudjuk a leggyorsabban megtalálni a számot?) |
A lap jelenlegi, 2024. február 15., 01:47-kori változata
Tartalomjegyzék |
C fordítás
Szabadon lehet bármilyen fordítót/IDE-t használni. Ha valakinek még nincs választása, ezeket tudom ajánlani:
- gcc
- Ha nagyon minimalisták akarunk lenni akkor lehet parancssorból fordítani és egy tetszõleges szövegszerkesztõben írni a programokat
- Linux-ok nagy részén alapból telepítve van
- Mac-en a "cc" parancs hasonlóan mûködik
- Windows-on kicsit bonyolultabb vagy [cygwin https://www.cygwin.com/]-t, vagy a [w64devkit https://github.com/skeeto/w64devkit]-et ajánlom
- codeblocks
- Egyszerû opensource IDE
- Van mind3 oprendszerre
- Windows-on, ha még nincs C fordítónk akkor a codeblocks-#.#mingw-setup.exe-ot telepítsük ez egyben a codeblocks IDE és a mingw fordító
- online c fordító
- Ha nagyon sürgõsen kell és nincs idõ semmit telepíteni
Ha megvan a fordítónk akkor próbáljuk meg lefordítani ezt a rövid C kódot:
#include <stdio.h> int main() { int x = 2; printf("hello world! %d\n", x); return 0; }
- IDE-kben érdemes "Empty C project"-et létrehozni.
- Ha a parancssoros gcc úton járunk akkor hozzunk létre egy új file-t hello.c néven, majd parancssorban: gcc hello.c -o hello
- Parancssorban ezután a hello vagy hello.exe paranccsal tudjuk lefuttatni a lefordított programot. IDE-ben általában van egy Run parancs.
- Aki parancssorban marad ajánlom a gcc -W -Wall hello.c -o hello fordítási módot, hogy lássunk figyelmeztetéseket is ne csak hibákat.
Szándékos hibák
Rontsd el a "hello.c" kódot a következő módokon, majd mindig mentsd el és fordítsd le újra (és a következő elrontás előtt mindig állítsd vissza a helyes verziót):
- törölsz egy pontosvesszőt a sor végéről
- a printf-es sorban x helyett valami más betűt írsz
- létrehozol egy y nevű egész típusú változót az x után, de nem használod a kódban
- kitörlöd az utolsó } -t
- törlöd a "return 0;" sort
Feladatok
Minden feladathoz nyiss új projektet IDE-ben vagy írd új file-ba ha parancssorból dolgozol!
1. Feltételes print
Így néz ki egy if, else if, else utasítás:
if (/* feltétel */) { /* parancsok */ } else if (/* feltétel */) { /* parancsok */ } else { /* parancsok */ }
Egészítsd ki a következő kódot a megjegyzések helyén!
#include<stdio.h> int main(void) { /* x és y változók deklarálása, értékadás */ printf("X erteke: %d\n", x); printf("Y erteke: %d\n", y); printf("\n"); /* egy feltételes utasítással (if, else if, else) érd el hogy mindig igaz állítás kerüljön a képernyőre */ printf("%d nagyobb mint %d!\n", x, y); printf("%d nagyobb mint %d!\n", y, x); printf("%d ugyanannyi mint %d!\n", x, x); return 0; }
Ha kész, módosítsd úgy a kódot, hogy ne legyen beleírva az elején az x és az y értéke, hanem a program a felhasználótól kérjen be egész számokat, a scanf() függvény segítségével! Példa egy z egész típusú változó bekérésére:
int z; printf("Add meg z értékét: "); scanf("%d", &z); /* innentől z-nek van értéke (ha a felhasználó tényleg egész számot adott meg) */
2. For ciklus
Segítségnek itt egy for ciklus példa: 0-tól 9-ig kiírjuk a számokat, vagyis a ciklusváltozó értékét (általában i-nek vagy j-nek nevezzük a ciklusváltozót, ami tipikusan minden körben növekszik eggyel, de persze máshogy is lehetne):
int i; for (i = 0; i < 10; i++) { printf("A ciklusváltozo erteke: %d\n", i); }
Egészítsd ki a következő kódot úgy hogy 1-tõl 100-ig a páros számokat írja ki.
#include<stdio.h> int main(void) { /* deklarációk és értékadások */ for (/* inic. */ ; /* feltétel */; /* minden ciklusmag végén */) { printf("%d\n", i); } return 0; }
3. Do / while ciklusok
Írj C kódot, ami a felhasználótól egy ciklusban egész számokat kér be addig, amíg 0 értéket nem kap. Ekkor pedig írja ki a képernyőre a kapott nemnulla számok átlagát!
Segítség a nem egész értékű változó (atlag) float tipusú legyen, majd a kiírása:
printf("%f", atlag);
Példa while ciklusra:
while ( /* feltétel */ ) { /* utasítások amik minden körben lefutnak */ }
Létezik do-while ciklus is, ami egyszer mindig lefuttatja a magját és csak utána kezdi teszteni a feltételt:
do { /* utasítások amik minden körben lefutnak */ } while (/* feltétel */);
4. Egyszerű gyökkeresés
Egészítsd ki a következő kódot, amely megkeresi az 5329 négyzetgyökét (lesz neki, és egész)!
(Segítség: nem kell hogy haténkony legyen a kód, elég ha egyesével végigpróbálgatjuk a számokat hogy az-e a gyöke.)
#include<stdio.h> int main(void) { int szam = 5329; int gyok; /* szamolj valamilyen ciklusban, valoszinuleg egy feltetel is kell majd a cikluson belul */ printf("A %d gyoke %d\n", szam, gyok); return 0; }
5. Sakktábla
Rajzolj ki egy NxN-es sakktábla mintát, ahol X-szel jelöljük a fekete mezőket, és üresen hagyjuk (egy szóköz) a fehéreket. Nem kell keretet adni a táblának. A sakktábla méretét (N) a felhasználótól kérd be!
Tipp: a ciklusokat egymásba is ágyazhatjuk, de ilyenkor nagyon kell figyelni a ciklusváltozókra!
Egymásba ágyazott ciklus példa:
#include<stdio.h> int main(void) { int i; int j; for(i = 0; i < 10; i++) { printf("i: %d \n", i); for(j = 0; j < i; j++) { printf(" (%d, %d) ", i, j); } printf("\n"); } printf("\n"); }
Extra feladatok
Ha eddig eljutottunk, vagy unalmasnak találtuk a fenti feladatokat, akkor leprogramozhatjuk a példákat az elsõ elõadásról. Vagy ránézhetünk ezekre a bonyolultabb feladatokra.
6. Relatív prímek
Írjunk programot mely bekér két pozitív egész számot (n, m), majd kiírja az n-el relatív prím számokat 0-tól m-ig.
7. Gyök
Írjunk programot mely bekér egy pozitív számot és visszaadja a gyökét 0.0001 pontossággal.
8. Barkóba
Írjunk programot mely a barkóba játékot szimulálja. A játékosnak gondolnia kell 0 és 100 között egy egész számra. A program feltesz egy kérdést a játékosnak, amire a játékos 0 (nem) vagy 1 (igen)-el válaszolhat. Majd addig tesz fel kérdéseket amíg biztosan meg tudja mondani hogy mi volt a gondolt szám, ekkor azt kíírja. (Hogyan tudjuk a leggyorsabban megtalálni a számot?)