Bevezetés a programozásba I. C++ alapok
Bevezetés a programozásba I.
5. gyakorlat C++ alapok Surányi Márton PPKE-ITK
2010.10.05.
Bevezetés a programozásba I. C++ alapok
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)
Bevezetés a programozásba I. C++ alapok
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.
Bevezetés a programozásba I. C++ alapok Hello World!
Feladat
Írjunk programot, ami kiírja, hogy "Hello World"! (a turdus-on (konzolon) fordítsuk, és futtassuk) Feladat:
Specikáció: BE: (nincs) KI: "Hello World"
Bevezetés a programozásba I. C++ alapok 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
Bevezetés a programozásba I. C++ alapok Típusok
Trükk az egészosztásra
#include
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; }
Bevezetés a programozásba I. C++ alapok Elágazás
Vezérlési szerkezetek - elágazás
PlanG-hoz hasonlóan, itt is lehet elágazást írni: if (feltétel ) {
}
ha a feltétel igaz ez a blokk fut le
else {
}
ha hamis, akkor ez
Megjegyzés: az else ág elhagyható.
Bevezetés a programozásba I. C++ alapok 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 }
Bevezetés a programozásba I. C++ alapok 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.
Bevezetés a programozásba I. C++ alapok 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!
Bevezetés a programozásba I. C++ alapok 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.
Bevezetés a programozásba I. C++ alapok For ciklus
Vezérlési szerkezetek - ciklusok - for ciklus
Általánosan így néz ki: for(kezdeti kif.; ciklusfeltétel; léptet˝ o kif.) utasítások }
{
Bevezetés a programozásba I. C++ alapok For ciklus
For ciklus - példa
Mit csinál a következ® program? #include using std::cout; using std::endl; int main() { for (int i = 0; i < 10; ++i) cout << i << endl; return 0; }
Bevezetés a programozásba I. C++ alapok Ö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)!
Bevezetés a programozásba I. C++ alapok Ö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) ...
NEM): !
Logikai tagadás (
if (!(i < 0)) ...
(felkiáltójel) Pl:
Bevezetés a programozásba I. C++ alapok Ö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--;)
Bevezetés a programozásba I. C++ alapok Ö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!
Bevezetés a programozásba I. C++ alapok 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=4) t++; g/=2;}}}}}
Bevezetés a programozásba I. C++ alapok 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; } } } } }
Bevezetés a programozásba I. C++ alapok 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)
Bevezetés a programozásba I. C++ alapok 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!
Bevezetés a programozásba I. C++ alapok Számkitalálós
Els® játék C++-ban
Í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! Feladat:
BE: KI:
egész szám 0 és 100 között kisebb, vagy nagyobb-e, illetve eltaláltuk-e
Bevezetés a programozásba I. C++ alapok Számkitalálós
Els® játék C++-ban
#include #include 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;
Bevezetés a programozásba I. C++ alapok 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; }
Bevezetés a programozásba I. C++ alapok Számkitalálós
Feladat
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
Feladat: I-1.)
Bevezetés a programozásba I. C++ alapok Számkitalálós
I-1. #include using std::cout; using std::cin; using std::endl; int main() { int number; cout << "Kerek cin >> number; if ( (number % cout << "A else cout << "A return 0; }
egy egesz szamot:"; 2) == 0 ) szam paros.\n"; szam paratlan.\n";
Bevezetés a programozásba I. C++ alapok Számkitalálós
Feladatok
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! I-4.)
Bevezetés a programozásba I. C++ alapok Számkitalálós
Házi feladatok
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! II-4.)
Bevezetés a programozásba I. C++ alapok Számkitalálós
Szorgalmi feladat
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!
II-9.)