1 A Code::Blocks fejlesztőkörnyezet
Az integrált fejlesztőkörnyezetek (integrated development
environment, IDE) a programok fejlesztését – készítését,
tesztelését, hibakeresését segítő programok. A C nyelv szabványos és
elterjedt volta miatt rengeteg ilyen készült hozzá. A Prog1/Szoflab1
tárgyakban az ajánlott fejlesztőkörnyezet a
Code::Blocks nevű, ingyenesen
letölthető szoftver, ami megtalálható a HSzK gépein is. (Ennek
linuxos változata is van, amely pl. az Ubuntu Linuxban csomagból
elérhető, codeblocks
néven.)
Indítsd el a Code::Blocks programot! Válaszd ki a File menü New/Project… menüpontját! Az alábbi ábrákon látható módon folytasd a projekt létrehozását! Figyelj minden részletre!
- A projekt típusának válaszd ki a
Console application
-t. Nyomd meg aGo
gombot. - A következő oldalon a programozási nyelvet kell megadnod. Ez legyen a C.
- Ezután arról érdeklődik a Code::Blocks, hogy mi legyen a projekt neve. Írd be, hogy „elso”. Alatta kell beállítanod
azt a mappát, ahol a projekt fájlok tárolódnak. Ha ez üresen van hagyva, akkor válaszd ki a
...
gombot megnyomva a Dokumentumok mappádat. (Jegyezd meg a mappa elérési útját!) - A negyedik ablakban a fordítóprogramot lehet megadni. Ha nem a „GNU GCC Compiler” van kiválasztva, akkor válaszd azt, továbbá ha a „Create "Debug" configuration” nem lenne beikszelve, akkor azt javítsd ki. De ezek így szoktak lenni.
- Ezzel létre is jött a projekt. A bal oldalon, a „Management” résznél láthatóak a hozzá tartozó fájlok. A „Sources”
mappát kinyitva megtalálod a fő programmodult, a
main.c
-t. Ebben egy helló világ program van. - A programodat a „Build and run” (zöld play gomb + sárga fogaskerék) gombra kattintva indíthatod el, vagy a Build/Build and run menüpontot választva. Ilyenkor előbb lefordítja a gép, és aztán el is indítja. Ennek eredménye így kell kinézzen.


Fontos: a projekt neve ne tartalmazzon ékezetes betűket!


Fontos: a megadott mappanév ne tartalmazzon ékezetes betűket, szóközöket! Sok program ezeket nem szereti.


2 Helló Világ
A Code::Blocks eleve úgy hozta létre a projektet, hogy egy egyszerű helló világ programot tett bele.
Figyeld meg a szövegszerkesztőben a kódot: ki van színezve. Mely szavak színesek, és vajon milyen csoporto(ka)t alkotnak az azonos színű szavak? Miért jó vajon ez a szolgáltatás? Áttekinthetőbb a kód, segít észrevenni bizonyos elgépeléseket. Sok környezet az összetartozó zárójelpárokat is kiemeli.
Írd át így a kiírt szöveget:
printf("Hello\nworld\n\n!");
Mit tapasztalsz? És ha így írod át a szöveget, ékezetekkel?
printf("Helló Világ!");
Sajnos Windowson az ékezetes betűket tartalmazó szövegek másképp jelennek meg egy menüs-grafikus programokban, mint a parancssorban. Ennek okáról majd lesz szó. Egyelőre egyszerűbb ékezet nélküli szöveget használni: Hello Vilag!
A futtatható program
Keresd meg a lefordított programot a számítógépen! Ez valahol abban a mappában lesz, amelyiket kiválasztottad a projekt létrehozásánál.
Nyiss egy parancssori ablakot (cmd), és a múlt laboron tanult módon navigálj el ebbe a mappába. A
main.c
mellett néhány másik fájlt is fogsz találni. Lesz egy bin
nevű
mappa is, azon belül pedig a Debug
. És még azon belül – ott a lefordított program, az
elso.exe
. Indítsd el!

A lefordított program egy fájl, amely tartalmazza azokat a számítógépnek szóló utasításokat, amelyek végül kiírják a kívánt szöveget; és még egy sor egyéb dolgot, amelyek az operációs rendszernek kellenek. Az ilyet futtathatónak szokás nevezni (vagy a szakzsargonban binárisnak, binary). Ilyen fájlokat tartalmaznak a programok telepítői is (installer).
A lefordított program emberi fogyasztásra már alkalmatlan. Próbáld meg kiíratni a tartalmát a
type
(Linuxon:cat
) paranccsal, látni fogod.
Tipp: ha nem emlékszel a mappa nevére, meg tudod keresni. A Code::Blocks az ablakának bal oldalán sorolja fel a projekthez rendelt fájlokat, a „Management/Project” sávon. Itt van a
main.c
nevű is. Jobb klikk, „Properties…”: a „File name (absolute)” résznél látod a fájl teljes elérési útját, mappákkal együtt:
C:\Documents and Settings\Név\Dokumentumok...
– Windows XP.C:\Users\Név\...
– Windows 7./home/név/...
– Linux.
A kimenet átirányítása
Irányítsd át az előző laboron tanult módon, a >
karakterrel a programod
kimenetét egy hello.txt
nevű fájlba! Írasd ki a keletkező szövegfájlt
a type
paranccsal!
Láthatod, hogy a programod ugyanúgy viselkedik, mint a többi parancssori program – alapértelmezés szerint a konzol ablakba kerül a kimenete, de kérésre át is lehet irányítani azt fájlba. Ezt az operációs rendszer intézi, és a programon nem kell módosítást csinálni hozzá. Ezek a konzolos, vagy más néven parancssori programok; a projekt létrehozásánál éppen azt adtuk meg a típussal, hogy ilyet szeretnénk írni.
3 Hibák a programban
Az alábbi programkód egy csomó hibát tartalmaz. Másold be a fejlesztőkörnyezetbe a helló világ helyett!
#include <studio.h>; int main{} { int x; printf("Kedves felhasznalo!"); printf("Irj be egy szamot, es en kiirom a negyzetet!"); scanf("%d", x); x = x*x printf("x negyzete: %f", x); }
Próbáld meg lefordítani (Build/Build menüpont)! Figyeld meg a Code::Blocksban alul a hibaüzeneteket. Egy hibaüzenetre kattintva fent, a szerkesztőben a kurzor a hivatkozott sorra ugrik. Haladj a felső hibaüzenettől! Figyeld meg az üzenet szövegét, és javítsd ki a hibákat! Összesen hét hiba van a kódban. Ha működik a program, tegyél sortöréseket is a kiírásba, ne folyjanak egymásba az üzenetei!
Érdemes az összes hibát és figyelmeztetést megszüntetni! A hibaüzenetekből kétféle van:
- Hiba (error)
- Ezek olyan nyelvtani hibák, amelyek miatt egyáltalán nem fordítható le a program.
- Figyelmeztetés (warning)
- Ezek nem C nyelvtani hibák. A program ugyan lefordítható, de a fordítóprogram gyanúsnak, szokatlannak, valószínűsíthetően hibásnak ítéli őket. A figyelmeztetésekkesel leforduló programok sokszor nem működnek helyesen.
Megoldás
#include <stdio.h> int main() { int x; printf("Kedves felhasznalo!\n"); printf("Irj be egy szamot, es en kiirom a negyzetet!\n"); scanf("%d", &x); x = x*x; printf("x negyzete: %d", x); return 0; }
4 A tartály
Feladat: írj programot, amely segít kiszámolni a felhasználónak, hogy hány doboz festéket kell vennie a lábakon álló tartály festéséhez!
A tartálynak ismerjük a magasságát és az átmérőjét. Mindenhol le kell festeni, az oldalát, a tetejét és az alját is. Tudjuk azt is, hogy egy doboz festék 2 m2 felület lefestéséhez elegendő.
Tartaly festese Milyen magas? 2 Mennyi az atmeroje? 1.2 4.900885 doboz festek kell.
Figyelj arra, hogy a program kódjában tizedesvessző helyett tizedespontot kell használni (pl.
3.14
), ugyanígy a bemenet megadásánál is. Ha nem jön ki a fenti eredmény, gondold át, helyes-e a képlet, amit használsz.
A kiírás formátuma
A felhasználónak nem túl hasznos információ, ha milliomod dobozokkal számolunk.
Kerekítsd ezért az eredményt egy tizedesjegyre: a printf
-ben a %f
-et
módosítsd %.1f
-re. Ez azt jelenti, hogy a tizedespont után egyetlen számjegy
fog megjelenni.
4.9 doboz festek kell.
Megoldás
#include <stdio.h> int main() { double atmero, magas; double sugar, doboz; printf("Tartaly festese\n\n"); printf("Milyen magas? "); scanf("%lf", &magas); printf("Mennyi az atmeroje? "); scanf("%lf", &atmero); sugar=atmero/2; doboz=(2*sugar*sugar*3.14159265 + magas*2*sugar*3.14159265) / 2; printf("\n%.1f doboz festek kell.\n", doboz); return 0; }
5 Nyomkövetés
A nyomkövetés (debug) módban lehetséges a program soronként történő végrehajtása, és a változók vizsgálata a futtatás alatt. Ez akkor nagyon hasznos dolog, ha egy hibát keresünk.
Soronkénti végrehajtás
Lépj a kurzorral abba a sorba, ahol üdvözlöd a felhasználót a „Tartály festése” szöveggel. Válaszd ki a menüből a „Debug/Run to cursor” parancsot, vagy nyomd meg az F4-et! A program elindul, de futása ilyenkor fel van függesztve, a kimeneti ablak még teljesen üres. A fejlesztőkörnyezetben egy sárga nyíl mutatja a forráskód mellett, hogy éppen hol tart a végrehajtás. A „Debug/Next line” (F7) paranccsal lehet végrehajtani a mutatott sort, és továbbhaladni a következőre.
Kattints a „Debug/Debug windows/Watches” menüpontra. Erre előjön egy ablak, amelyet a címsoránál fogva el tudsz helyezni a Code::Blocks ablakának jobb szélére:

Ezen a „Local variables” kategóriát kibontva látod a változóid értékét. Folytasd a programod végrehajtását soronként! Pirossal jelzi a gép azokat a változókat, amelyeknek az értéke éppen változott. Figyeld meg, hogy azok pedig, amelyek még nem kaptak értéket a program futása során, értelmetlen számot tartalmaznak.
Próbáld ki azt is, hogy a programnak értelmetlen bemenetet adsz! Indítsd el újra, soronkénti végrehajtással. Amikor kérdezi a tartály magasságát, írd be, hogy „kacsa”. Folytasd a végrehajtást soronként! Figyeld meg a változók értékét! Mit tapasztalsz? Kap akár a magasság, akár az átmérő változó értéket? Beszéld meg a laborvezetővel!
Töréspontok
A festékből csak egész számú dobozt tudunk venni. Írj ezért
printf %.0f
-et a program végén, hogy ne írjon ki törtrészt!
Írasd ki, hány doboz festék kell egy 1,2 m átmérőjű, 2 m magas tartályhoz.
Próbáld ki azt is, hogy 1,1 m átmérőjű, 2 m magashoz mennyi kell.
Helyesek az eredmények?
Sokszor nem szeretnénk az egész programot sorról sorra végrehajtani, hanem csak egy adott ponton megállítani. Erre egy megoldás az is, ha töréspontot (breakpoint) helyezünk el benne. Ugorj a kurzorral a kiírás sorára! Válaszd ki a menüből a „Debug/Toggle breakpoint” (F5) parancsot. Ilyenkor egy piros pötty megjelenik a sorszám mellett, és a program futás közben itt meg fog állni. Válaszd ki a „Debug/Start” (F8) parancsot. Add meg a programodnak a magasságot: 2 méter, és az átmérőt: 1.1 méter. Ezután aktiválódik a töréspont, és a kiírás előtt áll a program. Figyeld meg a dobozok számát tároló változód értékét (4.406 kell legyen). Végezd el a kiírást is, és figyeld meg a programod kimenetét!
Miért hibás a kimenet? Miért volt rossz gondolat a printf %.0f
-fel
módosítani a programot?
Tipp: a Code::Blocksban csak akkor tudod nyomkövetés módban futtatni a programot, ha elhelyeztél legalább egy töréspontot. Különben a „Debug/Start” menüpont hatására lefut az egész program. Ezért kényelmesebb sokszor a fentebb említett „Debug/Run to cursor” használata. Ha más nem, tehetsz a
main()
utolsó sorára, areturn 0
-ra is töréspontot.
6 Szakasz hossza
Írj programot, amely a felhasználótól bekéri két síkbeli pont x
és y
koordinátáit, és kiírja a közéjük húzott egyenes szakasz
hosszát (Pitagorasz tételével)! Fontold meg, hogy milyen adattípusokat kell használni!
A művelethez szükség lesz gyökvonásra, amelyhez a C nyelv matematikai könyvtárában található sqrt()
függvény használható. Ez a math.h
-ban van megadva. Tehát a program elejére a következő sort kell
beírni:
#include <math.h>
Megjegyzés: aki Linuxon, parancssorból fordítja a programot, hozzá kell csatolnia a matematikai könyvtárat a futtathatóhoz a
-lm
kapcsolóval.
Megoldás
#include <stdio.h> #include <math.h> /* Gyökvonás miatt */ int main(){ double x1, y1, x2, y2; /* Koordináták tárolása */ double hossz; /* Eredmény tárolása */ /* Beolvasások */ printf("x1="); scanf("%lf", &x1); printf("y1="); scanf("%lf", &y1); printf("x2="); scanf("%lf", &x2); printf("y2="); scanf("%lf", &y2); /* Hosszúság kiszámítása */ hossz = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); printf("A ket szakasz tavolsaga: %f", hossz); return 0; }
7 Másodfokú egyenlet
Írj programot, amely az ax2+bx+c=0
másodfokú
egyenlet együtthatóit kérdezi a felhasználótól, és kiírja az egyenlet
x1
és x2
megoldását!
A megoldóképlet:

Próbáld ki a bal oldalt látható egyenletekre! Ezekkel ellenőrizni tudod a megoldásod. Próbáld ki aztán a jobb oldali egyenletekre is. Mit tapasztalsz? Miért? Számold ki papíron, és beszéld meg a laborvezetővel!
egyenlet | megoldás |
---|---|
2x2-x-6=0 | x1=2, x2=-1.5 |
x2-12x+35=0 | x1=5, x2=7 |
egyenlet | megoldás |
---|---|
x2-2x+1=0 | ? |
x2+2x+10=0 | ? |
8 Ferde hajítás
Egy ágyúból kilőtt golyó v0
(m/s) kezdeti sebességgel, alfa
(fok)
szöggel indul. Írj programot, amely bekéri ezeket az adatokat, továbbá egy
t
(mp) időpontot. Írja ki, hogy abban a pillanatban épp
hol jár a golyó (x
és y
koordináta), továbbá hogy milyen messze
van az ágyútól légvonalban!


Ehhez a math.h
függvényei, a sin()
és a cos()
használhatóak. Vigyázz arra, hogy a szöget ezeknek radiánban kell megadni! 1°=π/180 rad.
g=9,81 m/s2.
Megoldás
#include <stdio.h> #include <math.h> int main() { double v0, alfa, t; double alfa_rad, x, y, r; printf("Ferde hajítás\n"); printf("v0="); scanf("%lf", &v0); printf("alfa="); scanf("%lf", &alfa); printf("t="); scanf("%lf", &t); alfa_rad = alfa*3.141593/180; x = v0*t*cos(alfa_rad); y = v0*t*sin(alfa_rad)-9.81/2*t*t; r = sqrt(x*x+y*y); printf("x=%f\n", x); printf("y=%f\n", y); printf("r=%f\n", r); return 0; }
9 Haladóknak
- Írj programot, amely kiszámítja az
4 5 + 4 + (2 − (3 − (6 + ─))) 5 ─────────────────────────── 3(2−7)
tört valós (tizedestört) értékét! (−0.986667-et kell kapj).Megoldás
#include <stdio.h> int main() { double d; /* valahol szerepelnie kell a kifejezésben egy valós számnak. különben egész osztás történik. */ d=(5+4+(2-(3-(6+4.0/5))))/(3*(2-7)); printf("%f", d); return 0; }
- Írd át úgy a másodfokú egyenlet programot, hogy vegye az figyelembe a diszkrimináns előjelét! Írd meg úgy, hogy a) komplex gyökök esetén írja ki azt, hogy nincs valós megoldás; b) komplex gyökök esetén írja ki azokat.
- Írj programot, amely a fizz-buzz játékot játssza! Ez a számokat növekvő sorrendben írja ki; de minden 3-mal osztható helyére azt, hogy „fizz”, az 5-tel oszthatók helyére pedig azt, hogy „buzz”. Ha mindkét feltétel teljesül, akkor a kiírandó szöveg „fizzbuzz”.
- Írj programot, amely a felhasználótól számokat kér, egészen
addig, amíg 0-t nem kap! Írja ki ezeknek a számoknak az a)
összegét, b) szorzatát.
(Ha használszif()
-et, rosszul csinálod – van egyszerűbb megoldás is!)Megoldás
#include <stdio.h> int main() { int szam, szorzat; szorzat = 1; /* első */ printf("Szam vagy 0? "); scanf("%d", &szam); while (szam!=0) { szorzat = szorzat*szam; /* többi */ printf("Szam vagy 0? "); scanf("%d", &szam); } printf("Szorzatuk: %d\n", szorzat); return 0; }
-
Egy gazda szeretné körbekeríteni a telkét drótkerítéssel. Írj programot, amely kiszámítja, hogy mennyi kerítésre lesz szüksége! A program kérje egymás után a kerítésoszlopok koordinátáit (x, y koordinátapárok), számítsa ki az aktuális és az előző oszlop távolságát, és összegezze a távolságokat! Az összegzést addig folytassa, amíg a megadott koordináták nem egyeznek az elsőként megadott koordinátapárral, vagyis míg vissza nem ér a kezdőoszlophoz!
(Ha használtál tömböt, feleslegesen sok memóriát foglalsz. Nem kell tömb a programhoz. Ha használtál
if()
-et, akkor pedig rosszul szervezted a ciklust. Az sem kell!)Megoldás
#include <stdio.h> #include <math.h> int main() { double kx,ky; /* Kezdőpont koordinátái */ double x1,y1,x2,y2; /* További pontok koordinátái */ double ossz; /* Kerítés hossza */ /* Kezdőpont beolvasása */ printf("Kezdopont x="); scanf("%lf",&kx); printf("Kezdopont y="); scanf("%lf",&ky); /* A legelső pont is ez lesz */ x1=kx; y1=ky; /* További pontok beolvasása */ printf("Tovabbi pontok:\n"); printf("x="); scanf("%lf",&x2); printf("y="); scanf("%lf",&y2); /* Összeg lenullázása */ ossz=0; /* Addig megyünk amíg a beolvasott pont nem ugyanaz mint az eredeti */ while (x2!=kx || y2!=ky){ /* Minden hozzáadjuk a kerítéshez az új szakaszt */ ossz = ossz + sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); /* Az előző pont helyére az új pont kerül */ x1=x2; y1=y2; /* Az új pont helyére újat olvasunk */ printf("x="); scanf("%lf",&x2); printf("y="); scanf("%lf",&y2); } /* A végén még hozzá kell adni az utolsó darabot */ ossz = ossz + sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); /* Összeg kiírása */ printf("Osszeg: %f\n",ossz); return 0; }