menu
shopping_cart
0
KOSÁR

6. lecke

Pompás feladatok

lightbulb_outlineMegismerjük a vezérlőkaraktereket és a kommenteket.

Névkiíró

Írjuk ki a nevünket a képernyőre! Egyszerűen írjuk át a printf parancs idézőjelek közötti szövegét a saját nevünkre. Az ékezetes karaktereket kerüljük, mert azt némelyik operációs rendszer nem szereti. Módosítsd a programot, hogy a saját nevedet írja ki!

#include<stdio.h>

int main() {

    printf("Horvath Lorand");

return 0;
}

nevkiiro.c c

Hiba a kódban

Vétsünk egy hibát a kódban! Például hagyjuk el a printf(); parancs utáni pontosvesszőt. Próbáljuk lefordítani, olvassuk el a hibalistát, és vonjuk le a következtetéseket. Ha kitöröljük a printf parancs utáni pontosvesszőt, akkor a fordító nem tudja meghatározni, hogy hol található a printf parancs vége, így hibát jelez. A hibalistában angolul olvasható a hibás sor száma. A Code::Blocks fejlesztőkörnyezet egy piros négyzetet is rak a hibakereső az egyik sorhoz – bár nem ahhoz amelyikben vétettük a hibát.

#include<stdio.h>

int main() {

    printf("Arnold Schwarzenegger")

return 0;
}

hiba.c c

Ha elolvassuk alul, a hibakereső üzenetét, akkor ő azt mondja, hogy:

Line 8 - Error: expected ; before return

Azaz 8. sor - Hiba: hiányzik egy pontosvessző a return előtt. A Code::Blocks fejlesztőkörnyezet nem pontosan abba a sorba rakja a hibát jelző piros négyzetet ahol van a hiba. Ő nem tudja pontosan megmondani a hiba helyét, csak annyit, hogy a 8. sor előtt van a hiba. De ez is jó nekünk, mert szemmel vissza tudjuk keresni a hiányzó pontosvessző helyét. A leggyakoribb hiba a pontosvessző hiánya szokott lenni, erre nagyon figyeljünk. Sőt, mielőtt pánikba esnénk, hogy nem műküdik a programunk mindig olvassuk el a hibakereső üzeneteit, mert hasznosak. Néha sajnos tört angolsággal tárja elénk a hibákat a hibakereső, olvassunk figyelmesen!

Külön sorba

Írjuk ki a nevünket két külön sorba. A tanulók nagy többségének első próbálkozása ez:

#include<stdio.h>

int main() {

    printf("Numlock");
    printf("Holmes");

return 0;
}

kulonsor.c c

Ez nem fog működni. Ha jobban belegondolunk, senki nem mondta meg a számítógépnek, hogy miután befejezte az első printf parancs futtatását, utána új sorban kezdje a második kiírást. A számítógép egymás után sorban dolgozta fel a parancsokat, és nem talált olyat, hogy ”kell új sor”. Ezt is külön nekünk le kell programozni úgy, hogy a szövegbe vezérlőkaraktereket szúrunk.

A vezérlőkarakter láthatatlan, nem kerül kiírásra. Visszaper \ karakterrel kezdődik, és vezérlő szerepet tölt be. Az új sorba ugrásért a \n vezérlőkarakter felel. Ezt kell arra a helyre beszúrni a printf parancson és az idézőjeleken belül, ahol új sorban szeretnénk kezdnei a kiírást. A feladat két lehetséges megoldása:

#include<stdio.h>

int main() {

    printf("Numlock\n");
    printf("Holmes");

return 0;
}

kulonsor_ok.c c

Bár végül is így rövidebb: (Persze ilyenkor nem kell a két szó közé szóköz karakter sem.)

#include<stdio.h>

int main() {

    printf("Numlock\nHolmes");

return 0;
}

kulonsor_ok2.c c

Sok vezérlőkarakter létezik de ,mi szinte csak a \n új sorba ugrató karaktert fogjuk használni. A teljes lista itt található:

\n  Új sor kezdése. A legfontosabb szövegben használatos vezérlőkarakter
\a  Csengő (figyelmeztető beep hangot ad a számítógép beépített hangszóróján)
\b  Backspace, 1 karakter törlése balra
\f  Lapdobás (nyomtatásnál használatos vezérlő funkció)
\t  Tabulátor, mintha csak a TAB gombot megnyomnád a billentyűzeten
\h  Függőleges tabulátor
\r  Kocsi vissza (a sor elejére ugrik, a kiírást innét folytatja)
\”  Idézőjel kiírása
\'  Aposztróf kiírása
\\  Visszaper (backslash) jelet így kell kiíratni. 
\0  Karakterlánc záró nulla (később részletesen foglalkozunk ezzel)
\o##    ASCII karakter oktálisan
\x##    ASCII karakter hexadecimálisan

Kiemelnék néhány fontosabb vezérlőkaraktert:

A \a, csengő karakter a 80-as 90-es években volt népszerű. A kezdetleges számítógépekben, az alaplapon megtalálható volt egy beépített kis tudású hangszóró (régi megnevezése PC Speaker), ami csak ”csipogni” tudott, különböző frekvenciájú beep üzenetek megszólaltatására volt képes, és az akkor népszerű DOS operációs rendszer gyakran küldött rajta figyelmeztető hangokat. Példaul, ha a program hibát észlelt, akkor a proramozó a printf parancs segítségével kiírt egy hibaüzenetet, és az üzenet után odafűzte a \a vezérlő karaktert, aminek hatására a számítógép pittyent egyet. A mai modern operációs rendszerek korában, amikor a számítógéphez különálló, nagy tudású hangszóró van csatlakoztatva, ennek a beépített alaplapi hangszórónak a jelentősége elsilányult. Sőt nagy valószítűséggel ha kiadjuk a \a vezérlőkaraktert nem fogunk semmit hallatni, mert ehhez a hangszóróhoz, csak a számítógép indításakor, az alaplapon található BIOS chip fér csak hozzá.

A \f lapdobást végző vezérlőkarakter szintén a 80-as évekből maradt vissza: Ekkoriban a számítógépek gyakran nem képernyőn jelenítették meg az üzeneteiket, hanem nyomtatóhoz voltak hozzákapcsolva, és itt nyomtatták ki a kimenetüket. A \f vezérlőkarakter a nyomtatót vezérli, és annyit csinál, hogy a folyamatban lévő nyomtatást befejezi, és kiadja a lapot.

A \” idézőjelet kiírató vezérlőkarakterre azért volt szükség, mert ha csak natúran, a szöveg közepébe szúrnánk be az idézőjelet, akkor a C fordító úgy érzékelné, hogy ott van a szöveg vége. Látjuk, hogy a printf parancs az idézőjelek közötti szöveget képes kiírni, tehát a szöveg elején és a végén is van egy idézőjel. Teljesen megbolondítanánk, ha csak úgy a szöveg közepére is elhelyeznénk egyet.

A \\ visszaper jelet kiírató vezérlőkarakterre azért volt szükség, mert, ha csak 1 darab \ per jelet írnánk a szövegbe, akkor azt hihetné a C fordító, hogy az utána következő karakter vezérlő szerepet tölt be. Ha kettő darab \\ per jelet írunk egymás után, akkor már tudni fogja a fordító, hogy biztosan per jelet kell kinyomtatnia a konzolablakra.

A kódolási stílus

Ejtsünk pár szót a kódolási stílusról. Az alapkoncepció az, hogy ha valami valamiben benne van, azt egy TABulátor karakterrel beljebb kezdjük. Egyelőre nekünk 1 darab blokkunk van, ez a main blokk. Ez kapcsos zárójellel kezdődik és végződik. Ezen blokkon belül van a printf parancs ezért ezt kicsit beljebb kezdjük. A későbbiekben sok blokkot fogunk létrehozni, egymás alatt / fölött egy és egymásba ágyazva, ezért szokjuk ezt a stílust.

Ezen kívül teljesen mindegy milyen a kód kinézete, de a saját munkánkat könnyítjük meg vele, ha szép. Például így is nézhet ki:

#include<stdio.h>

int main() {printf("Numlock\nHolmes"     )
    ; return 
0
;}

kulonsor_ok.c c

Juj, ez ocsmány volt.

Három szabály van amit kód gányolása során be kell tartani:

  1. A #include mindig legyen külön sorban, azt nem szabad birizgálni

  2. Az idézőjelek közötti, printf parancs által kiírt szöveget nem szabad csak úgy két sorba törni, az jó ha egyben marad.

  3. A parancsokat sem szabad két sorba törni, és szóközökkel teletűzdelni.

Az EXE

Keressük meg a sajátgépben a lefordított .exe, és kattintsunk rá duplán. Mi történik? Csak egy villanást látunk. Elromlott a program? Nem. Mivel nem a fejlesztőkörnyezeten belül futtattuk, aki megállítja a programot miután lefutott, így csak egy villanást láttunk, a program azonnal bezáródott.

Térjünk vissza a fejlesztőkörnyezetbe, és javítsuk a programot. Szúrjuk be a getchar(); parancsot a printf után. Ez a parancs azt csinálja, Enter lenyomásáig várakoztatja a programot. Ha fordítjuk és futtatjuk, akkor a fejlesztőkönyezetben semmi változást nem tapasztalunk, ám ”natúran”, az operációs rendszerből indítva már látszik a getchar hatása, és megáll a program.

Számolás

Gyakoroljunk egy kicsit, és számoltassuk el a programunkat háromig. 1, 2, 3 ezt kellene kiírnia a képernyőre a programnak. Persze, hogy legyen is kihívás a feladatban a számokat gombnyomásra írassuk ki. Tehát megnyomjuk az Entert, és megjelenik az 1-es szám, megnyomjuk mégegyszer, jön a kettes és így tovább...

A printf és getchar összekombinálásával tudjuk a feladatot megoldani. Ez sajnos itt online nem fog működni, mert nem valós időben látod a program eredményét, de ha Code::Blocks-ban kipróbálod, akkor szuper lesz!

#include<stdio.h>

int main() {

    getchar();
    printf("1");
    getchar();
    printf("2");
    getchar();
    printf("3");

return 0;
}

egyketha.c c

Ha futtatjuk a programot, az történik amit szerettünk volna – és az érdekes az, hogy minden számot külön sorba ír a program, pedig nem használtuk a \n vezérlő karaktert. Ez azért történt, mert helyette mi nyomogattuk az Enter gombot, és ez meg is jelent a konzolablakon oly módon, hogy a kiírás a következő sorban folytatódott.

A megjegyzések

Hogy ne felejtsük el azt, mit csinál a programunk lehetőségünk van megjegyzéseket fűzni a kódhoz. Két fajta megjegyzés van:

  1. egysoros megjegyzés, amit a // jellel kezdődik és csak sor végén helyezkedhet el. Ha pl egy parancs elé írjuk őt, akkor azzal a parancsot érvénytelenítjük. Hoppáré, ez még hasznos is lehet!

  2. többsoros megjegyzés ami a /* jellel kezdődik */ végződik.

#include<stdio.h>

/*
A program készítője: Juli
Napsütéses délután, 26 fok.
*/

int main() {

    printf("asd"); // kiir valamit

    // printf("123");

return 0;
}

megjegyzes.c c

A megjegyzéseket a fordító figyelmen kívül hagyja, mintha ott sem lennének!