Bevezetés a programozásba I. 5. gyakorlat Surányi Márton PPKE-ITK 2010.10.05.
C++ A C++ egy magas szint programozási nyelv. A legels változatot Bjarne Stroutstrup dolgozta ki 1973 és 1985 között, a C nyelvb l (FONTOS! C /= C++ (nem egyenl ) ). A nyelvnek jelenlegi is érvényben lév szabványa 2003-as (C++03), de már fejlesztés alatt van a következ (C++0x). A nyelv támogatja a procedurális programozást is. Ez már valódi programozási nyelv, tehát a fordító ténylegesen futtatható állományt állít el (általában exe-t) A nyelv fájlkezelése valódi, tehát a fájlok ténylegesen léteznek a merevlemezen. A programozás "nyelve" angol, vagyis a kulcsszavak angol nyelv ek (pl. int, string, if, for, while, main, class, true, false)
Fordítás konzolon A fordítóprogram itt már ténylegesen külön program. A gyakorlatokon a GCC (Gnu Compiler Collection)-t fogjuk használni, illetve elvárjuk, hogy a beadott feladatok forduljanak GCC-vel. A GCC egy nagyobb programcsalád (C fordítót is tartalmaz), ebb l a C++ fordító a g++ paranccsal érhet el. A félév során a Code::Blocks-ot fogjuk használni a gyakorlatokon, természetesen mindenki olyan környezetet használ, amilyet szeretne, egyetlen követelmény, hogy "g++ -Wall -pedantic"-al forduljanak a turdus-on.
Hello World! Feladat Feladat: Írjunk programot, ami kiírja, hogy "Hello World"! (a turdus-on (konzolon) fordítsuk, és futtassuk) Specikáció: BE: (nincs) KI: "Hello World"
Típusok C++ típusok EGÉSZ : int : ha int-et osztunk int-tel, akkor az egészosztás! (PlanG-ban DIV volt) VALÓS : double LOGIKAI : bool KARAKTER : char SZÖVEG : string : #include<string> szükséges! fájlok, tömbök: hamarosan
Típusok Trükk az egészosztásra #include <iostream> using namespace std; int main() { int a = 10; // az eredmény 0: cout << a / 100 << endl; // trükk: cout << a / 100.0 << endl; // így az eredmény 0.1 return 0;
Elágazás Vezérlési szerkezetek - elágazás PlanG-hoz hasonlóan, itt is lehet elágazást írni: if (feltétel ) { else { ha a feltétel igaz ez a blokk fut le ha hamis, akkor ez Megjegyzés: az else ág elhagyható.
Elágazás Vezérlési szerkezetek - elágazás PlanG-tól eltér en itt lehet "különben ha" ágat megadni (akárhány ilyen ágat megadhatunk): if (feltétel1) { ha feltétel1 igaz, akkor ez a blokk fut le else if (feltétel2) { ha feltétel1 nem igaz, és feltétel2 igaz, akkor ez a blokk fut le else if (feltétel3) { ha feltétel1, feltétel2 nem igaz, és feltétel3 igaz, akkor ez a blokk fut le else { ha egyik sem igaz, akkor ez a blokk fut le
Ciklusok Vezérlési szerkezetek - ciklusok - elöltesztel s A C++-ban van elöltesztel s- és hátultesztel s ciklus is. Elöltesztel s: while(feltétel) { ciklusmag - amíg a feltétel igaz, addig fut El ször kiértékeli a feltételt, ha igaz, akkor lefut a ciklusmag, majd újra kiértékeli, ha igaz újra lefut... Tehát, ha a feltétel már az elején hamis, akkor a ciklusmag egyszer sem fut le.
Ciklusok Vezérlési szerkezetek - ciklusok - hátultesztel s Hátultesztel s ciklus: do { ciklusmag - utasítások while(feltétel); El ször lefut a ciklusmag, aztán kiértékeli a feltételt. Ha igaz, akkor megint lefut a ciklusmag, és megint kiértékeli... Tehát, ha a feltétel hamis, akkor is lefut egyszer a ciklusmag!
For ciklus Vezérlési szerkezetek - ciklusok - számláló ciklus PlanG-ban a számláló ciklust egy elöltesztel s ciklus segítségével alkalmaztuk. Ez C++-ban így nézne ki: int i = 0; while(i < n) { utasítások ++i; De a C++ ad egy egyszer bb formát: a for ciklust: for(int i = 0; i < n; ++i) { utasítások M ködés szempontjából teljesen megegyezik a fenti "while-os" ciklussal.
For ciklus Vezérlési szerkezetek - ciklusok - for ciklus Általánosan így néz ki: for(kezdeti kif.; ciklusfeltétel; léptető kif.) { utasítások
For ciklus For ciklus - példa Mit csinál a következ program? #include <iostream> using std::cout; using std::endl; int main() { for (int i = 0; i < 10; ++i) cout << i << endl; return 0;
Összehasonlítások, m veletek M veletek Amint már láttuk az értékadás nem ":=" -vel, hanem "=" -vel történik. Pl: i = 0; +,-,*,/: PlanG-hoz hasonlóan, kivétel az egészosztás, ami automatikusan akkor történik, ha egy int-et akarunk osztani egy int-tel. maradék (PlanG-ban MOD): % Pl: kifejezés arra, hogy egy szám páros-e: (a % 2) == 0 FONTOS! a C++-ban a kalap (ˆ) nem hatványozást jelent, hanem bitenkénti KIZÁRÓ VAGY-ot (XOR)!
Összehasonlítások, m veletek Összehasonlítások Az egyenl ségvizsgálat dupla egyenl ségjellel történik: Pl: (a == 3) (Erre érdemes odagyelni, mert a szimpla egyenl ségjel az értékadás!) (A nem-egyenl : "!=") Kisebb-nagyobb, stb. : PlanG-hoz hasonlóan. Logikai ÉS: && (alt gr + c) Pl: if (a > 9 && a < 100)... Logikai VAGY: (alt gr + w) Pl: if (t == 0 t == 1)... Logikai tagadás (NEM):! (felkiáltójel) Pl: if (!(i < 0))...
Összehasonlítások, m veletek M veletvégzés és értékadás egyszerre, inkrementálás num = num * 5; helyett írhatjuk ezt: num *= 5; (és ez igaz a többi m veletre is. Pl: sum += 2; counter -= 10, stb.) Ezáltal egyrészt kevesebbet kell gépelni, másrészt átláthatóbb lesz a kód. Az i = i + 1; helyett írhatnánk, hogy i += 1;, de erre van egy még egyszer bb jelölés: ++i vagy i++. (Ugyanez m ködik csökkentéssel (dekrementálás): i--;)
Összehasonlítások, m veletek ++i vagy i++? Nézzük az alábbi programrészt: int i = 0; cout «++i «endl; Ez ezt írta ki, hogy 1. (Ha balról jobbra nézzük: el ször a ++ van, aztán az 'i'; tehát el ször növeli, aztán veszi az 'i' értékét.) int i = 0; cout «i++ «endl; Ez pedig azt, hogy 0. (Ezt is balról jobbra olvasva: el szöt adja 'i' értékét, majd megnöveli) (Ugyanez igaz a dekrementálásra is.) for ciklusban a ++i -t használjuk, mert bizonyos esetekben hatékonyabb!
Tabulálás, kódolási stílusok A helyes tabulálásról A helyes tabulálás használata fontos! A kód sokkal olvashatóbb, ha az egyes blokkok tabulálva vannak. Pl: Tabulálás nélkül: for(int i=0;i<n;++i){ while(a!=200) cout<<"a nem 200"<<endl; if(a<=200){for(int j=0;j<10;++j){ if(t%10==0){if(4<5){ t*=1; else{ if(5>=4) t++; g/=2;
Tabulálás, kódolási stílusok Helyesen tabulálva for(int i = 0; i < n; ++i) { while(a!= 200) cout << "a nem 200" << endl; if(a <= 200){ for(int j = 0; j < 10; ++j) { if(t % 10 == 0) { if (4 < 5) { t *= 1; else { if (5 >= 4) t++; g /= 2;
Tabulálás, kódolási stílusok Coding style, indent style Láthatjuk, hogy a második kód "szell sebb" is. Pl: i=0; helyett i = 0; -t írtunk. Coding, programming style linkek érdekl d knek: http://en.wikipedia.org/wiki/indent_style http://geosoft.no/development/cppstyle.html http://www2.research.att.com/~bs/bs_faq2.html http://en.wikibooks.org/wiki/c%2b%2b_ Programming/Programming_Languages/C%2B%2B/Code/ Style_Conventions (tipp)
Változók Globális, lokális változók Amint láthattuk, a program futása a main() függvénnyel kezd dik. Ezen függvényen kívül deklarált változók az globális változóknak nevezzük, a függvényeken belüli változókat pedig lokális változóknak. A globális változók mindenhol elérhet ek és érvényesek, tehát a kívül deklarált változók a main() függvényben is elérhet ek. FIGYELEM! A globális változók használata er sen kerülend! Akinek ilyet látunk a házi feladatában, azt nem fogjuk elfogadni! Megjegyzés: ez a tiltás nem vonatkozik a globális konstansokra, de azt is csak indokolt esetben használjuk!
Számkitalálós Els játék C++-ban Feladat: Írjunk számkitalálós játékot! A számítógép generál egy véletlen számot 0 és 100 között, majd bekér egy számot. Ha eltaláltuk, akkor nyertünk; ha nem, akkor a számítógép megmondja, hogy kisebb, vagy nagyobb annál, mint amit beírtunk! BE: egész szám 0 és 100 között KI: kisebb, vagy nagyobb-e, illetve eltaláltuk-e
Számkitalálós Els játék C++-ban #include <iostream> #include <cstdlib> using namespace std; int main() { srand( time(0) ); // random-generator inicializalas int secret = rand() % 100; // egy szam 0-100 kozott int number = 0; bool guessed = false;
Számkitalálós Els játék C++-ban (folyt.) while(!guessed) { cout << "Kerek egy szamot: "; cin >> number; if (number == secret) { cout << "Kitalaltad! A szam: " << secret << endl; guessed = true; else if (number < secret) { cout << "Ennel nagyobb!\n"; else if (number > secret) { cout << "Ennel kisebb!\n"; return 0;
Számkitalálós Feladat Feladat: I-1.) Döntsd el egy egész számról, hogy páros-e! (Szövegesen írjuk ki) Specikáció: BE: pozitív egész szám KI: páros-e
Számkitalálós I-1. #include <iostream> using std::cout; using std::cin; using std::endl; int main() { int number; cout << "Kerek egy egesz szamot:"; cin >> number; if ( (number % 2) == 0 ) cout << "A szam paros.\n"; else cout << "A szam paratlan.\n"; return 0;
Számkitalálós Feladatok I-4.) Számítsd ki egy adott sugarú gömb térfogatát! II-1.b) "Rajzolj" ki egy NxN-es négyzetet *-okból! II-6.) Állíts el N darab véletlenszámot!
Számkitalálós Házi feladatok II-4.) Sorold fel az els N négyzetszámot! I-7.) Döntsd el két számról, hogy megegyezik-e az el jelük! III-5.) Add meg két természetes szám legnagyobb közös osztóját!
Számkitalálós Szorgalmi feladat II-9.) Sorold fel azokat a másodfokú egyenleteket, amelyek minden együtthatója 0 és 10 közötti egész szám, és pontosan egy megoldása van!