Rendszer és Szoftvertechnológia Tanszék Programozás I. 1.4, 1.5, 1.6, 1.7 Rendszer és Szoftvertechnológia Tanszék
1.4. Formázott adatbevitel és kivitel Áttekintés: A változók kezdeti értékadással, értékadással, és/vagy adatbeviteli művelet során kaphatnak értéket. A printf függvényt üzenetek, illetve változókban tárolt értékek képernyőn való formázott megjelenítéséhez használjuk. A C++ lehetővé teszi különleges karakterek használatát a printf függvénnyel, hogy tabulátor vagy új sor karaktert állítsunk elő, vagy akár hangot adjunk ki a számítógép beépített hangszórójából. A scanf függvény a szabványos beviteli eszközről olvas be adatokat. printf és scanf: könyvtári függvények, prototípus az STDIO.H állományban.
A printf és a scanf függvények segítségével megadott formátum szerint lehet kiírni ill. beolvasni alap típusú adatokat és sztringeket. 1.4.1. mintaprogram #include <stdio.h> #include <conio.h> void main (void) { //kedvenc számom clrscr (); //képernyő törlés int szam; //az egész típusú, szam nevű változó deklarálása printf ("Add meg a kedvenc számodat (1-999) !"); //Tájékoztató szöveg kiírása a képernyőre scanf ("%d", &szam); //egy szám beolvasása a billentyűzetről, //a kapott érték a szam nevű változóba kerül printf ("A kedvenc számod: %d", szam); //a kedvenc szám kiírása a képernyőre getch (); //billentyű leütésére vár }
A printf függvény printf (formátumstring, változólista); A formátumstring: általában string konstans: normál karaktersorozatok speciális konverziókat előíró karakterek: az argumentumok értelmezésének módja, a megjelenítés formája. A konverziós előírás teljes formája hat részre osztható, ebből egyes részek elhagyhatók: %- 1 2 . 4 l f % jel _____________| jelző _ ______________| minimális mezőszélesség__| pontosság _______________| méretmódosító _____________| konverziós betű ______________|
1.4.2. mintaprogram -részlet: egész számok formázott kiírása int i=1342, j=-8769; printf ("\n%d%d",i,j); printf("\ni=%5d j=%8d",i,j); -------------------------------------------------------- 1342 –8769 i= 1342 j= -8769
1.4.3. mintaprogram -részlet: lebegőpontos számok formázott kiírása float a=12.1234567,b=0.00034567; printf("\n1. a=%10.2f",a); printf("\n2. a=%15.8f",a); printf("\n3. a=%10.2e",a); printf("\n4. b=%10.5f",b); printf("\n5. b=%15.7f",b); printf("\n6. b=%10.2e",b); ---------------------------------------- 1. a= 12.12 2. a= 12.12345670 3. a= 1.21e+01 4. b= 0.00035 5. b= 0.0003457 6. b= 3.46e-04
Különleges kimeneti karakterek használata 1.4.1. táblázat: Escape szekvenciák Escape szekvencia Decimális kód jelentés \a 7 hangjelzés \b 8 BckSpace \n 10 LinrFeed ………….. (nemgrafikus karakterek)
A scanf függvény A scanf függvény formázott adatbevitelt valósít meg: a szabványos beviteli eszközről olvas be adatokat, és az esetek többségében a printf konverziók fordítottját hajtja végre. Hívásának általános formája: scanf (formátumstring, változó_címlista); Az argumentumlista memóriacímeket tartalmaz, ahová a beolvasott elemeket el kell helyezni. Mint az 1.4.1. mintaprogramban láthatjuk, egy változónak megfelelő memóriacímet a & operátorral jelölünk ki. scanf ("%d",&szam);
Túlcsordulási hibák adat bevitelnél Futtassuk például az 1.4.1. mintaprogramot. Gépeljük be az 50000 számot: - túlcsordulási hiba keletkezik. Típuseltérési hibák adat bevitelnél Ha a program egy adott típusú (pl. int) értéket vár, a felhasználó pedig más típusú (pl. char) értékeket visz be: hiba keletkezik.
Ellenőrző kérdések Mire szolgál a formátumstring a printf és a scanf függvényeknél ? Az argumentumlistában szerepelhetnek-e konstansok ? Mi a hatása a printf függvény formátum-stringjében elhelyezett \n escape szekvenciának ? Adjon meg három escape szekvenciát, melyet a printf utasítás formátumstringjében gyakran használhatunk. A printf függvény hívásának általános formája. A printf függvény formátum-stringje milyen karaktercsoportokból áll ? Mit határoz meg a printf függvény formátum-stringjében megadható konverziós előírás? Írjon fel néhány példát. A printf függvény formátum-stringjében megadható konverziós előírás hat részre osztható. Melyek ezek és mi a szerpük ? Mi történik, ha a scanf utasításban az argumentumlista elemeinél a változónevek elé nem tesszük ki a & operátort ? Mely esetekben lép fel túlcsordulási hiba adat bevitelnél ?
Mi a hiba az alábbi printf függvényhívásban ? float a=12.33, b=0.22; printf (”\na:%d”, a, ”b:”, b);
Egyszerű műveletek elsajátítása Áttekintés: Matematikai műveletek végzésére a programjainkban aritmetikai műveleti jeleket használunk. A megfelelő sorrendben történő műveletvégzéshez a fordító precedenciát (elsőbbségi osztályt) rendel hozzá az egyes műveleti jelekhez. Zárójelek használatával a kifejezésekben irányíthatjuk azt a sorrendet, mellyel a program végrehajtja az egyes műveleteket. C++ programokban az inkrementálás (++) és a dekrementálás (--) műveleti jelet használhatjuk az egyes értékek változókhoz való hozzáadására, illetve kivonására.
Matematikai alapműveletek 1.5.1. táblázat: a C++ matematikai alapműveletei Műveleti jel (operátor) Példa * fizetendo = egysegar * db; / atlag = bevetel / db; % maradékos osztás !!! maradek = egesz / oszto; + bevetel = nettoar + afaertek; - profit = bevetel - koltseg
1.5.1 mintapélda: egyszerű aritmetikai alapműveletek #include <stdio.h> #include <conio.h> void main (void) { //Egyszerű aritmetikai műveletek clrscr; printf ("\n4+3=%d",4+3); printf ("\n15-6=%d",15-6); printf ("\n1.1234*2=%f",1.1234*2); printf ("\n16/5=%d",16/5); getch (); }
1.5.2. mintapélda: aritmetikai alapműveletek szemléltetése #include <stdio.h> #include <conio.h> void main (void) { // ÁFA-s számla egy tételének kezelése // a változók deklarációja: float nettoertek = 560; //egy tétel nettó értéke float forgalmi_ado = 0.25; // ÁFA szorzó float fizetett_osszeg = 1000; //a vevo altal fizetett osszeg float ado, visszajar, osszesen; //ado , vevonek visszajar //szamla osszesen értéke clrscr; //számítások: ado = nettoertek * forgalmi_ado; osszesen = nettoertek + ado; visszajar = fizetett_osszeg - osszesen; //az eredmények megjelenítése printf("\nA fizetendő összeg:%10.2f Ft",osszesen); printf("\nVisszajár: %10.2f Ft",visszajar); printf("\nA számla érték %10.2f Ft ÁFA-t tartalmaz",ado); getch (); }
Változó értékének növelése 1-gyel darab = darab + 1; A C++ biztosít egy inkrementálási műveleti jelet, a dupla plusz jelet (++): db++; A dekrementálás műveleti jele a C++-ban A dupla mínusz jel (--) a dekrementálás műveleti jele, ami 1-gyel csökkenti a változó értékét. darab = darab -1; darab--;
A prefix (előtag) és a postfix (utótag) inkrementálás műveleti jelek ++valtozo; valtozo++; A C++ ezt a két műveleti jelet különbözőképpen kezeli ! Példa: kovetkezo_sor = sor++; //postfix inkr. Az előző utasítással megegyező eredményt ad a következő két utasítássor végrehajtása: kovetkezo_sor = sor; sor = sor + 1; Most vizsgáljuk meg a következő utasítást: kovetkezo_sor = ++sor; //prefix inkr.
Feladat ! int db = 0; db++; printf ("\ndb: %d",db--); //kerülendő !!! Mi jelenik meg a képernyőn az alábbi kis program-rész lefutása után ? Mennyi lesz db változóban letárolt érték az alábbi program-részlet lefutása után: int db = 0; db++; printf ("\ndb: %d",db--); //kerülendő !!!
Az aritmetikai műveletek precedenciaszabálya Példa: eredmeny = 1 + 2 * 3; eredmeny = 1 + 2 * 3; eredmeny = 1 + 2 * 3; = 3 * 3; = 1 + 6; = 9; = 7; A fordító minden műveleti jelhez precedencia (elsőbbségi) osztályt rendel hozzá, mely meghatározza, hogy milyen sorrendben kell a műveleteket elvégezni. A rendszer a magasabb precedenciájú műveleteket végzi el előbb, mint az alacsonyabb precedenciájú műveleteket.
Precedencia-táblázat, balról-jobbra szabály 1. precedencia-osztály: ++ -- 2. precedencia-osztály: * / % 3. precedencia-osztály: + - Az azonos precedencia-osztályba tartozó aritmetikai műveletek között a sorrendet a balról-jobbra szabály határozza meg. Példa: eredmeny = 12 / 3 * 4; A műveletek sorrendjének irányítása zárójelekkel koltseg = (darab1 + darab2) * egysegar;
Aritmetikai műveletek túlcsordulása 1.5.4. mintapélda, aritmetikai művelet túlcsordulása #include <stdio.h> #include <conio.h> void main (void) { //Túlcsordulási hiba két egész szám szorzásakor int eredmeny; clrscr (); eredmeny = 200 * 300; printf ("\n200*300=%d",eredmeny); getch (); } 200*300=-5536
Idézet … Lehet, hogy a kemény munka nem azonos a tehetséggel, de az biztos, hogy a legjobb helyettesítője. James A. Garfield
1.6. Operátorok és kifejezések A feladatok megoldásához szükséges, elméleti zh-n is számonkérésre kerül.
1.7. Könyvtári függvények A függvény a C program olyan névvel ellátott egysége, amely a program más részeiből hívható, amikor a függvényben definiált, paraméterezhető tevékenységsorozatra szükség van. Példa: #include <stdio.h> void main (void) { int n = 2; printf ("\nn=%d, a hatványérték: %lf", ++n, pow (2, n)); } A fordító az alábbi hibajelzést adja: Function pow should have a prototype.
Matematikai rutinok: prototípus a math.h vagy a float.h fileban. int abs(int x); double fabs(double x); long double fabsl(long double (x)); long int labs(long int x); /* abs example */ #include <stdio.h> #include <math.h> void main(void) { int number = -1234; printf("number: %d absolute value: %d\n", number, abs(number)); }
A függvények visszatérési típusa A visszatérési típus meghatározza a függvényérték típusát, amely tetszőleges skalár (char, short, int, long, float, double, signed, unsigned, felsorolási vagy mutató) vagy strukturált (struct, union) lehet. Alapértelmezés szerint: int típusú lesz a függvényérték. A void típus felhasználásával olyan függvények készíthetők, amelyek nem adnak vissza értéket.
Matematikai rutinok: (prototípus a math.h fileban. ) int abs(int x); double fabs(double x); long double fabsl(long double (x)); long int labs(long int x); /* abs example */ #include <stdio.h> #include <math.h> void main(void) { int number = -1234; printf("number: %d absolute value: %d\n", number, abs(number)); }
Matematikai rutinok: (prototípus a math.h fileban. ) int abs(int x); double pow(double x, double y); double sqrt(double x); Szögfüggvények: x értékét radiánban kell megadni ! double cos(double x); double sin(double x); double tan(double x); Miért fontos ismerni a visszatérési érték típusát ?
Adatfolyam - kezelő függvények és makrók : prototípus az stdio Adatfolyam - kezelő függvények és makrók : prototípus az stdio.h fileban. int printf (const char *format [, argument, ...]); int scanf (const char *format [, address, ...]); int fflush(FILE *stream); Az fflush függvény kiűríti a puffert, ha pufferelt adatátvitel történt. Példa: scanf ("%d", &darabszam); fflush (stdin);
Konzol és port input/output: void clrscr(void); void clreol (void); void gotoxy (int x, int y); int wherex (void); int wherey (void); Szöveges ablak törlése Sor törlése szöveges ablakban a cursor pozíciótól a sor végéig a cursor mozgatása nélkül. A gotoxy a megadott x,y pozícióba mozgatja a kurzort az aktuális szöveges ablakban. Ha a koordináták nem valósak, a függvényhívás hatástalan marad. (pl. gotoxy (40,30)) wherex a kurzor vízszintes pozícióját adja vissza (1...80) az aktuális szöveges ablakban, wherey pedig a függőleges pozíciót (1..25 vagy 1..43 vagy 1..50).
Konzol és port input/output: int getch(void); int getche(void); int putch(int ch); Mindkét függvény egyetlen karaktert olvas közvetlenül a billentyűzetről. Getch nem írja a képernyőre a kapott karaktert, getche viszont a szöveges ablakba írja azt vissza a direkt videot vagy a BIOS-t használva.Visszatérési érték: mindkét függvénynél a billentyűzetről beolvasott karakter kódja. A putch függvény az aktuális szöveges ablakba küldi a ch karaktert.Visszatérési érték: siker esetén a kiírt karakter, egyébként EOF.
Példa a getche használatára a Help-ből /* getche example */ #include <stdio.h> #include <conio.h> void main(void) { char ch; printf("Input a character:"); ch = getche(); printf("\nYou input a '%c'\n", ch); getch (); }
Véletlen szám generálás int random(int num); void randomize(void); random visszatérési értéke egy véletlenszám 0 és (num-1) között. randomize véletlenszerűen inicializálja a véletlenszám generátort. A random meghívását megelőzően kell aktivizálni egyszer a programban, így minden program futtatáskor véletlen szám keletkezik.
Véletlen szám generálás /* random example */ #include <stdlib.h> #include <stdio.h> #include <conio.h> /* prints a random number in the range 0 to 99 */ void main(void) { randomize(); printf("Random number in the 0-99 range: %d\n", random (100)); getch (); }
…