C++ programozás 6. – Adatbekérés

Adatbekérés, avagy készítsünk interaktív programokat

Ahogy előre haladunk a programozás tanulásában egyre inkább felmerül az az igény, hogy ne csak előre megadott adatokkal dolgozzon a program, hanem menet közben mi is adhassunk neki munkát. Vagy egyszerűen csak befolyásoljuk a program működését. Az is szempont lehet, hogy adatbekéréssel tesztelésre szolgáló bemeneti értékekkel kideríthessük az esetleges szemantikai hibákat.

Az adatbekérést többféle módon is megoldhatjuk, én maradok az egyik egyszerű, direkt erre a feladattípusra készített objektum, a cin használatával. Látni fogjuk, hogy ez rugalmasan használható többféle típusú adat bevitelére is, és a használata meglehetősen egyszerű.

A cin egy objektum, amely az adatok bemeneti oldalával foglalkozik. Mivel emelt érettségin konzolos alkalmazásokat készítünk, ez azt jelenti, hogy a program futási ablakába begépelt dolgokat tudjuk vele beolvastatni, és felhasználni a programunkban.

cin

Egy érték beolvasása

Az adatbekéréshez gyakorlatilag a kiíratásra használt cout objektum párját, a cin-t kell használni. Ez is egy objektum, mely a bemeneti adatfolyamot szimbolizálja. Konzolos alkalmazások esetén a cin a billentyűzetről történő beolvasásnál kap fontos szerepet. Lássuk akkor hogyan.

Egész szám beolvasása:

int szam;
cout << "Irj be egy egesz szamot: ";
cin >> szam;
cout << "A beirt szam: " << szam << endl;

Valós szám beolvasása:

double valos;
cout << "Irj be egy valos szamot: ";
cin >> valos;
cout << "A beirt szam: " << valos << endl;

Szöveg beolvasása:

string nev;
cout << "Irj be egy nevet: ";
cin >> nev;
cout << "Hello " << nev << "!" << endl;

Az utolsó példával azért jócskán előreszaladtam a tananyaggal, de a példák szerintem egyértelműek. Egy adat bekérésekor gyakorlatilag annyit kell tennünk, hogy létrehozunk egy olyan változót, amilyen típusú adatot be szeretnénk olvasni. Ezek után a cin objektummal beolvastatjuk (begépeljük a konzolba), majd átirányítjuk a megfelelő változóba. Technikailag a >> jel bal oldalán álló változó dönti el, hogy milyen bemenetet fogadunk el, tehát annak típusa mindenképpen olyan legyen, amilyen begépelt adattal dolgozni szeretnénk.

Többszörös beolvasás

Előfordulhat, hogy valamilyen oknál fogva több adatot szeretnénk egyszerre beolvastatni a programunkkal. Ekkor egy kiíratáshoz hasonló utasítás láncolatot kell készítenünk. Nézzünk egy konkrét példát.

int a;
int b;
int c;
cout << "Irj be harom egesz szamot szokozzel elvalasztva: ";
cin >> a >> b >> c;
cout << "A beirt szamok: " << a << " " << b << " " << c << endl;

Itt három adat beolvasása történik egyszerre. A felhasználó begépeli a kért számokat, majd a cin fogadja az első beírt értéket, majd várja a következő begépelését, de még nem történik meg a kiíratás, mert majd kell egy harmadik is. Ha mind a három értéket begépelte, akkor folytatódik a program, addig csak várja a bemeneti adatokat.

Láthatod, hogy kifejezetten kértem a bekéréskor, hogy szóközökkel gépelje be, ennek ellenére ettől jóval rugalmasabb a cin. Elfogadja szóközös elválasztáson kívül a tabulátoros, vagy enter-es tagolást is. Sőt, akár ezek kevertjeit is! Ha mondjuk 4 adatot kellene begépelni, elfogadná, ha az első után szóközt ütve írod be a másodikat, majd tabulátor után a harmadikat, majd enter után a negyediket, és utána enterrel zárod le az egészet. Csak ekkor fog továbblépni, és mind a négy bemeneti adatot helyesen tárolja el.

A háttérben annyi történik, hogy az egymás után begépelt adatok utáni whitespace (üreshely) karaktereket figyeli, és ezek darabszáma alapján tartja nyilván, hogy melyik begépelt adat hova tartozik. Ilyen whitespace karakternek tekintjük a szóközt, tabulátort és az entert is, ezért fogadja el ezt a kevert bevitelt is, mert mindegyik egy konkrét adat bevitelét zárja le. Vagyis az utolsó enter (a 4. whitespace) zárja le a teljes bevitelt, és ez alapján meglesz mind a négy bevitt adat. Az egész adatbeviteli folyamat végét mindenképpen csak enterrel lehet lezárni. Ha több adatot adsz meg, akkor elölről feldolgozva addig folytatja az eltárolást, ameddig a cin utáni >> jelekkel el nem éri a kívánt darabszámot, az összes többit figyelmen kívül hagyja. Ha 3 számot vársz, akkor az előző példa az 1 2 3 4 5 bemenetnél a 4 és 5 számokat figyelmen kívül hagyja.

A többszörös bevitelnél a típusokat is lehet keverni, de cin utáni változók sorrendjének meg kell egyezni a bekérni kívánt változók típusának sorrendjével. Lássunk erre is egy példát.

string nev;
int egesz;
double valos;
cout << "Ird be a kutya nevet, eletkorat (ev) es tomeget (valos szam): ";
cin >> nev >> egesz >> valos;
cout << "A kutya neve: " << nev << " kora: " << egesz << " tomege: " << valos << endl;

Nem mindegy, hogy a változókat a kiemelt sorban pontosan olyan sorrendben helyezem el a beolvasásban, mint amilyen sorrendben azt be szeretnék gépelni. Ha a sorrend nem jó, hibás eredményeket kapok.

Ez a fejezet még folytatódhatna, de igazából a többi kapcsolódó anyag a string (karakterlánc) kezeléshez és a fájlkezeléshez kapcsolódik, így valószínűleg majd oda fogom megírni.

Következő lecke: Logikai műveletek, logikai kifejezések

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

*

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .