Informatika2-2014/Gyakorlat09

A MathWikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „== 1. gyakorlat == === C fordítás konzolban === ===== Első fordítás gcc-vel ===== Nyiss egy szövegszerkesztőt, és másold be egy új fájlba a "hello.c" kódj…”)
 
 
(egy szerkesztő 9 közbeeső változata nincs mutatva)
1. sor: 1. sor:
== 1. gyakorlat ==
+
=== Előadás ===
 
+
https://docs.google.com/presentation/d/1TiC4mp_oNR2o3q5L0lV9nO-Q1YizBtmsYDRB2HByd3w/edit#slide=id.g27017fa94_050
 
=== C fordítás konzolban ===
 
=== C fordítás konzolban ===
  
30. sor: 30. sor:
 
gcc -W -Wall -o hello hello.c
 
gcc -W -Wall -o hello hello.c
 
</code>
 
</code>
 
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
 
* töröld a legelsõ #include sort
 
  
 
<br />
 
<br />
63. sor: 55. sor:
  
 
<br />
 
<br />
=== Feladatok ===
 
 
Minden feladatot új file-ba mentsd a CodeBlocks-ban (esetleg Codelite-ban új project-be)!
 
 
===== 1. Feltételes print =====
 
 
===== Segítség =====
 
 
A következõ egy egyszerû feltétel, leteszteli hogy 'x' nulla vagy nem, majd kiírja a számot:
 
 
<c>
 
#include<stdio.h>
 
 
int main(void) {
 
    int x = -5;
 
   
 
    if(x == 0){
 
        printf("Nulla");
 
    } else{
 
        printf("Nem nulla");
 
    }
 
    printf("A szam: %d \n\n", x);
 
 
    return 0;
 
}
 
</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>
 
 
 
<br/>
 
<br/>
 
 
== Ismétlés ==
 
 
* Fordítás '''gcc'''-vel:
 
 
<code>
 
gcc -W -Wall -o hello hello.c
 
</code>
 
 
* A program futása a main függvénnyel kezdõdik, ezáltal mindig kell, hogy létezzen.
 
* Pontosvesszõk a sor végén.
 
* Blokkok kapcsoszárójelekkel.
 
* A változókat deklarálni kell (meg kell adni a típusukat).
 
* stdio.h-ban hasznos függvények, pl: printf
 
* Egy példa printf-re:
 
 
<c>
 
printf("A %d nagyobb mint a %d\n.", 3, 2);
 
</c>
 
 
* A 3 és a 2 sorban be lesz helyettesítve a string-be, a \n a sorvége karakter.
 
 
* Az if a szokásos módon mûködik, a szintaxis:
 
 
<c>
 
if(feltetel){
 
    utasítások
 
} else if(feltetel){
 
    utasítások
 
}
 
...
 
} else{
 
    utasítások
 
}
 
</c>
 
 
 
== A gyakorlat anyaga ==
 
 
==== Beolvasás ====
 
 
* A programunk felhasználójától beolvashatunk adatokat '''elõre deklarált változókba'''. Ezt egyszerûen a '''scanf''' függvénnyel tehetjük meg (stdio része).
 
* A '''scanf''' elsõ paramétere egy string, mellyel megadjuk, hogy milyen minta szerint érkezik a beolvasandó adat. Legegyszerûbb esetben, ez lehet egy "%d", azaz egy egész számot olvasunk be.
 
* A további paraméterek a már deklarált változók pointerei, errõl késõbb részletesen lesz szó, jelenleg legyen elég annyi, hogy a változók elég egy & jelet kell tenni.
 
 
* Egy példa a '''scanf''' használatára:
 
 
<c>
 
int z;
 
printf("Add meg z értékét: ");
 
scanf("%d", &z);
 
</c>
 
 
* Amint a '''scanf'''-hez ér a program a terminálban megjelenik egy kurzor és bementet vár a felhasználótól. A '''z''' változónk felveszi ezt a megadott értéket.
 
 
* Egy scanf-el több adatot is bekérhetünk egyszerre, de az átláthatóság kedvéért, ezt csak olyan esetekben tegyük, ahol logikus, hogy egyszerre több adat érkezik (pl fix méretû mátrix egy sora).
 
  
  
==== Ciklusok ====
+
=== Ciklusok ===
  
===== For ciklus =====
+
==== For ciklus ====
  
 
* A for ciklus nem a sage-ben megszokottak szerint mûködik, hisz itt nincsenek listáink amiket bejárhatnánk.
 
* A for ciklus nem a sage-ben megszokottak szerint mûködik, hisz itt nincsenek listáink amiket bejárhatnánk.
213. sor: 97. sor:
 
* Ez a példa azt is mutatja, hogy a ciklus fejének különbözõ részei egymástól függetlenül elhagyhatók, valamint hogy létezik végtelen ciklus.
 
* Ez a példa azt is mutatja, hogy a ciklus fejének különbözõ részei egymástól függetlenül elhagyhatók, valamint hogy létezik végtelen ciklus.
  
===== While ciklusok =====
+
==== While ciklusok ====
  
 
* A while ciklus a már sage-ben megszokottak szerint mûködik, addig fut, amíg igaz a fejében található feltétel.
 
* A while ciklus a már sage-ben megszokottak szerint mûködik, addig fut, amíg igaz a fejében található feltétel.
258. sor: 142. sor:
 
* Bejött egy új típus, a float, õ a lebegõpontos szám, mondhatjuk, hogy a tizedestört. A printf és scanf-ben használandó mintája a "%f".
 
* Bejött egy új típus, a float, õ a lebegõpontos szám, mondhatjuk, hogy a tizedestört. A printf és scanf-ben használandó mintája a "%f".
  
 
+
=== Feladatok ===
== Feladatok ==
+
* Írd ki az első 100 számot és azok négyzetét
 
+
* Írd ki az első k Fibonacci számot (most C-ben:))
==== 1. For ciklus ====
+
* Írd ki  az első 10 számot és paritásukat.
 
+
* Írd ki az első 12 szám faktoriálisát.
Egészítsd ki a következő kódot a megjegyzések helyén! Adjuk össze a számokat 1-tõl kezdve, egyesével, pl: 1 + 2 + 3 = 6. A programunk azt a számot adja ki, hogy az elsõ hány darab számot kell összeadni, hogy legalább 4212-t kapjunk.
+
==== Üzemanyag ====
 
+
* A program bemenetként kapja meg, hogy a felhasználó hány gallon üzemanyagot használna fel.
<c>
+
* A program írja ki az alábbi információkat:
#include<stdio.h>
+
** A felhasznált üzemanyag mennyisége literben
 
+
***1 gallon = 3.7854 l
int main(void) {
+
** Az üzemanyag gyártásához szükséges olaj mennyisége hordóban mérve.
    /* változók deklarálása, értékadás */
+
*** Mindenképpen egész hordók vásárlására van szükség.
    /* i-t is deklarálni kell ! */
+
*** 1 hordó olajból 19.5 gallon üzemanyag készíthető.
   
+
** A megfelelő CO2 terhelés kg-ban
    for (/* inicializálás */ ; /* feltétel */; /* minden ciklusmag végén */) {
+
*** 1 gallon üzemanyag esetén ez ~ 9 kg CO2
        /* számolás */
+
** A hordókban  vásárolt alapanyag olaj ára az aktuális árfolyamon 3 különböző pénznemben: EUR, USD, HUF.
    }
+
==== Legnagyobb közös osztó ====
    /* kiírás */
+
* Határozd meg két szám legnagyobb közös osztóját
    return 0;
+
==== Fizika ====
}
+
* A program bemenetként kapja meg, hogy az űrutazáshoz használt űrhajó sebessége hány %-a a fény sebességének (300 000 000 m/s).
</c>
+
** Például 10% esetén a bemenet 0.1 és ekkor az űrhajó sebessége 30 000 000 m/s
 
+
** Az űrhajó tömegét, feltéve, hogy nyugalmi tömege 70,000 kg.
Ha ezt sikerült megoldani, akkor egészítsük ki úgy a kódot, hogy a 4212-nek megfelelõ számot a for ciklus elõbb scanf-el kérjük be a felhasználótól.
+
** Azon eltelt időket, melyeket az űrhajósok érzékelnének, ha a következő objektumokra utaznának a Földről:
 
+
*** Alpha Centauri: 4.3 fényév
 
+
*** Androméda Galaxis 2 000 000 fényév
==== 2. Do / while ciklusok ====
+
** Segítség:
 
+
*** http://hu.wikipedia.org/wiki/Id%C5%91dilat%C3%A1ci%C3%B3
Írjunk egy korábbi példa mintájára egy programot, ami a felhasználótól egész számokat kér be, amíg egymás után két azonos számot nem kap. Ha ez megtörtént, akkor írja ki, hogy hány számot adtunk be.
+
*** http://hu.wikipedia.org/wiki/Relativisztikus_t%C3%B6meg
 
+
Most talán segít, ha már a cikluson kívül is kérünk be elõre számokat, és nem hátultesztelõs ciklust használunk, de azzal is kényelmesen meg lehet oldani, sõt for ciklussal is.
+
 
+
==== 3. Min / Max ====
+
 
+
Írj programot, ami pontosan 5 számot kér be a felhasználótól, majd kiírja közülük a legnagyobbat. (Érdemes valami értelmes szöveggel pl: "A legnagyobb: %d")
+
 
+
Ha ez megvan, egészítsd ki a programot, hogy ne csak a maximálisat, hanem a minimálisat is írja ki.
+
 
+
==== 4. 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>
+
 
+
==== 5. Prímtényezõ keresés ====
+
 
+
Írj programot, ami megkeresi egy a felhasználó által adott szám prímtényezõit és sorban kiírja azokat. (A hiba elkerülése végett elõször vizsgáljuk meg, hogy nem 0-t vagy 1-et kaptunk-e.)
+
 
+
Nem kell bonyolultra gondolni azonnal, meg lehet oldani úgy is, hogy egyesével megpróbáljuk elosztani az adott számunkat 2-tõl kezdve egyesével haladva egész számokkal, amíg 1-hez nem jutunk.
+
 
+
Emlékezzünk, hogy a maradék képzés (modulo) jele C-ben is a %
+
 
+
==== 6. Pi közelítés ====
+
 
+
Közelítsd a Pi-t, a négyzetszámok reciprokösszege segítségével (ez ugye Pi négyzet per 6). Ha úgy mint az stdio.h-t betöltöd a math.h-t akkor mûködni fog az sqrt függvény, mellyel a gyökvonást megoldhatod.
+
 
+
Valamint, ha már sikerült közelíteni, akkor a 4 * atan(1) kifejezéssel ellenõrizheted magad (ennek elég jól kell becsülnie a Pi-t).
+

A lap jelenlegi, 2014. április 16., 14:08-kori változata

Tartalomjegyzék

Előadás

https://docs.google.com/presentation/d/1TiC4mp_oNR2o3q5L0lV9nO-Q1YizBtmsYDRB2HByd3w/edit#slide=id.g27017fa94_050

C fordítás konzolban

Első fordítás gcc-vel

Nyiss egy szövegszerkesztőt, és másold be egy új fájlba a "hello.c" kódját:

#include <stdio.h>
int main() {
    int x = 2;
    printf("hello world! %d\n", x);
    return 0;
}

Nyiss egy konzolt és menj abba a könyvtárba (cd paranccsal) ahová elmentetted a "hello.c"-t.

Fordítsd le, készíts "hello" nevű futtatható fájlt:

gcc -o hello hello.c

Futtasd le a kapott programot!

Második fordítás gcc-vel

Mostantól használjuk a gcc warning-kapcsolóit, hogy lássuk a kisebb hibákat, figyelmeztetéseket is!

gcc -W -Wall -o hello hello.c


CodeBlocks használata

Használat

  • A feladatokhoz hozzatok létre mindig egy új üres file-t (File / New / Empty file), ezt mindenképpen .c kiterjesztéssel mentsétek el pl: feladat1.c.
  • Fordítani a Build / Build-el tudtok, vagy a megfelelõ ikonnal, a lefordított programot a Build / Run -al indíthatjátok, vagy egyszerûbben F9-el fordíthattok majd utána azonnal indíthatjátok is a programot.


CodeLite használata

Beállítások

  • Indítsd el a CodeLite fejlesztői környezetet!
  • Állítsd át az indentálást (tabulálást/beljebbezést) a Settings -> Global Editor Preferences menüpont alatt a General -> Indentaiton résznél hogy ne használjon tab karaktereket
  • Hozz létre egy új Workspace-et és benne egy új projektet (mindenképp külön könyvtárban: Create the project under a separate directory legyen bepipálva), segítség itt az oldal vége felé

Használat

  • Minden feladat megoldását új projektbe kell tenni, hogy a main() függvények ne ütközzenek (egy projekten belül nem lehet több belőle).
  • A narancssárga az aktív projekt a workspace-en belül. Ha menüből kiválasztod a fordítást (Build -> Build project vagy F7 billentyű) akkor ez mindig az aktív projektet fogja lefordítani, ha épp másik file van megnyitva a szerkesztődben, akkor is! Ugyanígy a futtatásnál is (menüből Build -> Run vagy Ctrl-F7) az aktív projekt main() függvénye fog lefutni!



Ciklusok

For ciklus

  • A for ciklus nem a sage-ben megszokottak szerint mûködik, hisz itt nincsenek listáink amiket bejárhatnánk.
  • Ehelyett a for a while ciklushoz nagyon hasonlóan mûködik, a szintaxis:
for(inicializálás; feltétel; inkrementálás){
    utasítások
}
  • Az inicializálás részben adhatjuk meg azokat az utasításokat amiket csak egyszer a ciklus kezdetekor szeretnénk végrehajtani, ha úgy gondolunk rá mint egy szummára, akkor ez lehet az i = 0 például.
  • A ciklus akkor áll le, amikor a feltétele hamis lesz, tehát amíg igaz, addig fut.
  • Az inkrementálás lépés a ciklus belsejében levõ utasíások (a ciklus magja) után hajtódik végre. Itt tipikusan növelünk egy ciklusváltozót, de akármi mást is lehetne csinálni.
  • Példa egy for ciklusra, ami kiírja a számokat 0-tól 9-ig:
int i;
for (i=0; i<10; i++) {
    printf("A ciklusváltozo erteke: %d\n", i);
}
  • Az i++ egyenértékû az i = i + 1 vagy az i += 1 utasítással.
  • Példa egy sokkal kevésbé hagyományos for ciklusra:
int i = 1;
int j = 1;
for (; i + j != j * 2; i = j + 1) {
    j = i * 2;
}
  • Ez a példa azt is mutatja, hogy a ciklus fejének különbözõ részei egymástól függetlenül elhagyhatók, valamint hogy létezik végtelen ciklus.

While ciklusok

  • A while ciklus a már sage-ben megszokottak szerint mûködik, addig fut, amíg igaz a fejében található feltétel.
  • Talán annyi plusz van, hogy bevezetjük a hátul tesztelõs ciklust, a do while ciklust. Ez a nevébõl is kikövetkeztethetõen utólag tesztel, tehát a magja legalább egyszer lefut.
  • A szintaxis:
while(feltétel){
    utasítások
}
do{
    utasítások
} while(feltétel);
  • Példa egy bonyolultabb while ciklusra, a feladatokban lesz egy hozzá nagyon hasonló:
  • A felhasználótól egy ciklusban egész számokat kér be addig, amíg 0 értéket nem kap. Ekkor pedig kiírja a képernyőre a kapott nemnulla számok átlagát.
#include<stdio.h>
 
int main(void) {
    int i = 0;
    float sum = 0;
    int szam = 0;
 
    do{
        scanf("%d", &szam);
        sum += szam;
        i++;
    } while(szam != 0);
 
    i--;
    printf("%f", sum / i);
 
    return 0;
}
  • Bejött egy új típus, a float, õ a lebegõpontos szám, mondhatjuk, hogy a tizedestört. A printf és scanf-ben használandó mintája a "%f".

Feladatok

  • Írd ki az első 100 számot és azok négyzetét
  • Írd ki az első k Fibonacci számot (most C-ben:))
  • Írd ki az első 10 számot és paritásukat.
  • Írd ki az első 12 szám faktoriálisát.

Üzemanyag

  • A program bemenetként kapja meg, hogy a felhasználó hány gallon üzemanyagot használna fel.
  • A program írja ki az alábbi információkat:
    • A felhasznált üzemanyag mennyisége literben
      • 1 gallon = 3.7854 l
    • Az üzemanyag gyártásához szükséges olaj mennyisége hordóban mérve.
      • Mindenképpen egész hordók vásárlására van szükség.
      • 1 hordó olajból 19.5 gallon üzemanyag készíthető.
    • A megfelelő CO2 terhelés kg-ban
      • 1 gallon üzemanyag esetén ez ~ 9 kg CO2
    • A hordókban vásárolt alapanyag olaj ára az aktuális árfolyamon 3 különböző pénznemben: EUR, USD, HUF.

Legnagyobb közös osztó

  • Határozd meg két szám legnagyobb közös osztóját

Fizika

  • A program bemenetként kapja meg, hogy az űrutazáshoz használt űrhajó sebessége hány %-a a fény sebességének (300 000 000 m/s).
Személyes eszközök