You are on page 1of 56

Bevezets a programozsba

7. Gyakorlat

Bevezets a C++ nyelvbe

Fejleszti krnyezet

A flv sorn Code::Blocks-ban fogunk


dolgozni, ms IDE hasznlatt nem
tmogatjuk.
Letlts:
http://www.codeblocks.org/downloads/26
rdemes a codeblocks-13.12mingw-setup.exe
fjlt telepteni, mert az tartalmazza a mingw
fordtt is.
Hasznos oldalak: www.cppreference.com
www.cplusplus.com

Code::Blocks
Program szerkeszt
Eszkztr

Projekt kezel

Fordt ablak

j project ltrehozsa

Ez kell neknk

s utna nyissunk
konzol alkalmazst

j project ltrehozsa 2.
Adjunk nevet a projektnek

A projekt knyvtr szerkezete

A main fjl

Code::Block

Hasznos tippek

Plugins/Manage Plugins
Disable

DoxyBlocks plugin
(Egy csom gyorsbillentyre r telepedett nem lehet
tle rendesen zrjeleket hasznlni)

Settings/Editor/Keyboard shortcuts
Itt is

ki lehet venni egyesvel a billentykhz rendelt


extra szolgltatsokat

Els C++ programunk


#include <iostream>

//precompilernek

using namespace std;

//nvtr hasznlat

int main()
//f fggvny, program belpsi pontja
{
cout << "Hello world!" << endl;
return 0;
PROGRAM hello_world
}
Ki: "Hello world!",SV
PROGRAM_VGE

Programok fordtsa

C++ programok a .cpp kiterjeszts fjlok, ezek


szerkeszthetek szvegszerkesztvel, vagy valamilyen C++
programozsi krnyezettel

(pl.: DevC++, Code::Blocks, Visual Studio, KDevelop, Eclipse...)

A programozsi krnyezetek ltalban projektekben


dolgoznak, hogy tbb fjlbl ll programokat is knnyen
tudjunk kezelni
Mivel nincs automatikus kdformzs, neknk kell figyelnnk
arra, hogy:

A programunk kinzete, tabullsa megfelel legyen


(Formzsban segtsget nyjthat: Plugins/Source Code
Formatter(Astyle))
Ne keverjk a kis-nagybetket sehol, hiszen a C++
megklnbzteti ket!

Programok fordtsa

Ha megszerkesztettk a programot, fordtanunk kell.


Ezt a feladatot a fordtprogram ltja el.

tbb lpsben vgzi a feladatt, elszr assembly kdot


generl, majd abbl gpi kdot
vannak elfordtsi lpsek, mint a fjltartalom bemsols,
illetve a defincik behelyettestse

Fordts kzben zeneteket kapunk, ezek lehetnek:

hibk (error): hiba, amirt nem sikerlt lefordtani a


programot, ezeket javtanunk kell
figyelmeztets (warning): nem hibk, de lehetsges,
hogy futsi idej hibt okoznak, ezeket ersen javasolt
megnzni, s javtani (ha szksges)

Programok fordtsa

A fordt a legjobb tudomsa szerint adja meg a


hiba helyt, de ez lehet tves jelzs is, ezrt ha a
megadott helyen nem tallunk hibt, keressk
mshol.
Mi a g++ s mingw fordtprogramokat fogjuk
hasznlni
Hasznos kapcsolk:

a -Wall megjelenti az sszes


lehetsges
hibalehetsget
a pedantic csak a szabvnyos kdot fogadja el
a Werror kapcsolval
a figyelmeztetseket
szigorthatjuk

Egy C++ program felptse

Fejrsz

Trzsrsz

A program trzsrsze

A programok trzsrsze fggvnyekbl ll

a fggvny a program egy sajt mkdssel rendelkez


rsze (alprogramja), amely rtket ad vissza az t
meghv utastsnak
a visszaadott rtk a visszatrsi rtk, amelyet a return
utastssal adunk meg, a fggvny mkdse mindig lell
ennl a pontnl, ezrt amit utna runk, az nem kerl
vgrehajtsra
az ltalunk rt programban a programhv eljrs a main
fggvnyt hvja meg (az pedig tovbbi fggvnyeket hvhat
meg, ez majd lesz ksbb)
A main fggvny egsz tpus (visszatrsi rtk), ezrt
a fggvny vge eltt vissza kell adnunk egy egsz
szmot -> hibakdknt szolgl

Program szerkezete
Ez a sor jelli a kezdett a
programunk main
fggvnynek. Minden C++
program a main fggvny
elejn kezdi a futst ezrt
ktelez, hogy minden C++
programban legyen main
fggvny.

Program szerkezete
Ez a sor egy egyszer C++
utasts. Az egyetlen sor ami
most ebben a programban
lthat hatssal br. A cout
egyszer output stream. A sor
jelentsem hogy egy karakter
sorozatot a kimenetre
helyezznk.(ebben az esetben
a Hello world! Mondatot s egy
sorvge karaktert)

A cout vltoznv az iostream


knyvtrban van deklarlva ezrt
szksges, az #include <iostream>
sor.
Vegyk szre: a sor vgt ;
karakter jelli. Azaz minden C++
kifejezst ;-vel zrunk le.

Program szerkezete
A return utasts jelzi a main
fggvny vgt. A return-t
kvetheti egy kd (ebben az
esetben 0). A 0 mint
visszatrsi kd ltalban azt
jelenti, hogy a programunk gy
mkdtt ahogy vrtuk s nem
trtntek hibk a futs alatt.

A program fejrsze

A program elejn van a fejrsz, ami tartalmazza:

a program mkdshez szksges tovbbi fjlok neveit


a programban hasznlt nvtereket

a programban elre definilt elnevezsek (makrk)


rtkeit
ezek olyan elnevezs-rtk prok, amelyeknl a fordts
eltt az elfordt behelyettesti a programban az els rtk
(elnevezs) sszes elfordulst a msodik rtkkel
o szerkezete: #define <elnevezs> <rtk>
o pl.: #define ALMA 100 // a programban az ALMA
o

helyre mindenhova 100-t r

hasznlata ltalban kivlthat konstans vltozkkal, ezrt


ritkn kerl el

A program fejrsze

Mivel a C++ utastsai s tpusai tbb fjlban helyezkednek


el, az rand C++ programok ltalban nmagban nem
mkdkpesek, hanem hasznlnunk kell ezekben a
fjlokban megrt utastsokat
Mi is elhelyezhetjk a programkdunkat tbb fjlban (majd
ksbb lesz), amiket szintn hasznlni szeretnnk
Ehhez meg kell adnunk, hogy mely fjlokat szeretnnk
hasznlni a programban

#include <fjlnv> - a beptett fjlok kztt keres, amik a


C++ krnyezetben megvannak
#include fjlnv - az ltalunk ltrehozott fjlok kztt keres

Ekkor a program fordtsakor a berakott fjlok teljes tartalma


tmsoldik a mi programunkba

A program fejrsze

Amikor tovbbi beptett fjlokat hasznlunk a programban, az ott


tallhat utastsok csoportostva vannak gynevezett nvterekbe,
hogy megklnbztessk a klnbz funkcikat ellt utastsokat
A programban meg kell mondanunk, hogy melyik nvtrbl
szrmaznak a hasznlni kvnt utastsok, ennek hrom mdja

Globlis nvfelolds: a fejrszben kiadjuk a using namespace


<nvtrnv> utastst, ekkor a program htralev rszben a megadott
nvtr minden elemt hasznljuk (ltalban ez a clravezetbb, de
knnyen nvtkzshez vezethet) pl.: using namespace std;
Explicit nvfelolds: a hasznland utastst a kvetkez
<nvtrnv>::<parancsnv> formban rjuk le amikor hasznlni
szeretnnk, ekkor megmondjuk, hogy a parancs a megadott nvtrbl
val, pl.: std::cout, std::endl
Konkrt elem nvfelolds: csak a hasznland utasts adjuk meg
globlisan, mely a program htralv rszben rvnyes lesz.
using <nvtrnv>::<parancsnv> pl.: using std::cout;

Prbljuk ki!

Nyisstok meg a 07_Demo nev projectet s


nzzk meg a main.cpp tartalmt.

Mit csinl?

Kommentek

A C++ tbb fle jellst is lehetv tesz


kommentekez.
//line comment
/* block comment
mg ez a sor is comment egszen
a kvetkez karakterekig */

Vltozk s adattpusok

Vltozk elnevezse:

Ugyanazok a szablyok vonatkoznak r mint


Plang-ban nhny kiegsztssel:
Nem

lehet egyezs a C++ fordtjnak fenntartott


specilis kulcsszavakkal(pl.: tpus nevekkel)
A C++ case sensitive azaz klnbsget tesz kis s
nagybet kztt. Teht a v_1 nem azonos a V_1
vltoznvvel.

Vltozk s konstansok

A PLanG-gal ellenttben vltozkat brhol


deklarlhatunk a kdunkban, nincs kln
deklarcis rsz

ha minden programblokkon, fggvnyen kvl


deklarljuk ket, akkor a deklarls pontjtl a
program vgig brhol (brmilyen fggvnyben,
illetve programblokkban) elrhetek lesznek, ezek az
gynevezett globlis vltozk
ha
valamely
programblokkban,
fggvnyben
deklarljuk ket, akkor csak annak vgig lesznek
elrhetek, utna megsemmislnek, s nem lehet
hivatkozni rjuk, ezeket loklis vltozknak
nevezzk

Vltozk s adattpusok

Alapvet adattpusok

* Az rtkek a rendszertl fggnek amin a program fordtva lett. Ezek az


rtkek a legtbb 32 bites rendszerre rvnyesek.

Tpusok

Logikai tpus:

kulcsszava: bool
felvehet rtkek: true, false
meg lehet adni neki egsz szmokat is, ekkor a 0 rtke a
hamis, minden ms igaz, ha kiratunk egy logikai vltozt,
akkor 0-t, vagy 1-t r ki
logikai, illetve bitenknti mveletek vgezhetek rajta, a
bitenknti mvelet megfeleltethet a logikai mveletnek (pl.
tagads s komplementer)
pl.: bool a, b, c;
a = true; b = false;
c = a || !( a && b ) && true;
Bitenknti mveletek: ( &, |, ^, ~, <<, >> : and, or, xor, not, shl, shr)

Tpusok

Egsz tpus:

attl fggen, mekkora mreten szeretnnk eltrolni


az rtket, klnbz kulcsszavakat hasznlhatunk:
short (16 bit) [32768, 32767]
o int (32 bit)
[2147483648, 2147483647]
o long (32 bit) [2147483648, 2147483647]
ezek az ltalnos mretek, de a szabvny nem adja meg
pontosan, ezrt fordtknt klnbzhet a mret
az egsz tpusok kompatibilisek egymssal, illetve a logikai
s vals tpussal
o

pl.: int a = 2, b = 4;
a = (a* (b + 6) 4.3) % a; // VIGYZAT! Minden rszeredmny
int-lesz!

Tpusok

Vals, lebegpontos tpusok:

kulcsszavai: float (32bit), double (64bit), longdouble (96bit)


a mretek implementcifggek (balrl jobbra
nvekven), a tpusok kompatibilisek egymssal, az
egsz tpusokkal, illetve a logikai tpussal
mindent tud, amit az egsz

Karakter tpus: kulcsszava:char

(8bit)

a karaktereket szimpla idzjelben kell megadnunk


mivel tnylegesen a karakterek ASCII kdjt trolja,
hasznlhatak a matematikai mveletek is rajta
pl.: char a, b = y; (a++ == b)

Tpusok

Szveg (string) tpus:

kulcsszava: string
dupla idzjelben kell megadnunk
nem beptett tpus, hanem ksbb lett hozzrva a
nyelvhez, ezrt hasznlatakor hivatkoznunk kell az t
tartalmaz fjlra, amelynek neve megegyezik a tpusnvvel
(#include <string>)
igazbl
karakterek
tmbjeknt
mkdik,
azrt
hasznlhat az indexel ([ ]) opertor
lekrdezhet a hossza: <vltoznv>.size();
szveget lehet konkatenlni az sszeads (+) opertorral
pl.: stringa = a, b = szveg;
a = a+ + b;
// konkatenci
int x = a.size();
// x= 8 lesz

Tpusok

Tmbk:

minden tpusbl kszthetnk tmbt olyan mdon, hogy


megadjuk a mrett a vltoz ltrehozsakor a [ ]
opertor segtsgvel
mretknt csak egsz rtk adhat meg (egsz tpus
vltoz is, de ezt ne hasznljuk)
a tmb csak az adott tpusbl tartalmazhat rtkeket

pl.: int a[10]; // 10 elem egszekbl ll tmb ltrehozsa

elem lekrdezse s belltsa ugyanezzel az opertorral,


ahol az indexek 0-tl a tmb mrete-1-ig tartanak, ha
tlindexelnk, az futsi idej hibhoz vezet
lehet tbbdimenzis tmbket (mtrixokat) is kszteni
(azaz tmbk tmbjt)

Vltozk deklarlsa

A PLanG-gal ellenttben vltozkat brhol deklarlhatunk


a kdunkban, nincs kln deklarcis rsz!
C++-ban a vltoz deklarls szintaxisa a kvetkez:
[adattpus azonostja] [rvnyes vltoznv]

Pl.:

int a;
float ez_az_en_szamom;

Ha deklarlunk egy vltozt akkor az a sajt blokkjn bell


hasznlhat a deklarls utn. Ha minden blokkon kvl
hozunk ltre vltozt akkor az n. globlis vltoz.
Egyszerre tbb azonos tpus vltozt is deklarlhatunk:

int a,b,c;

Prbljuk ki!

A 07_Demo nev projectet s nzzk meg a


main.cpp-ben a blokk kommentben tallhat
rszt!

Az elz main()-t tegytek egy blokk kommentbe,


hogy kiprbljuk.

Opertorok
Mvelet

Opertor

rtkads

Logikai mveletek

==, !=, <, >, >=, <=

Tagads, s, Vagy

!, &&, ||

A balrtk egyezzen
meg a jobbrtkkel.
pl.: b = 3
Logikai eredmny
sszehasonlt
mveletek.
pl.: b == 3 **
Logikai mveletek
opertorai.
Pl.: !(b && a)||true

**gyakori hiba az rtkads s egyenlsgvizsglat keverse

Opertorok
Mvelet
Aritmetikai
mveletek
rtkads s
mveletvgzsre
rvidebb rsmdok

Opertor

+, -, *, /, %(modulo)

Azonos jells a Div


(egsz/egsz) s a
vals/vals osztsra!!
Hasznlat:
a = a+b helyett a +=b
Tbbinl hasonlan.

+=,-=, *=, /=, %=

Opertorok

rtkmdostsok

eggyel nveli, vagy cskkenti az egsz szm rtkt


inkrementls (++), dekrementls( )
pl.: a++ // nveljk meg a rtkt 1-gyel
Kt mdon lehet megadni, a vltoz eltt, illetve mgtt. A
klnbsg a visszatrsi rtkben van.
Azaz ha eltte olyan utasts tallhat, amely rtket vr,
akkor trtnhet az rtk tadsa a mdosts eltt, illetve
utn is
b = a++; //postfix, a rtkt tadjuk b-nek,
majd a-t nveljk, tmeneti vltozval dolgozik
b = ++a; //prefix, a rtkt nveljk, majd
tadjuk b-nek

Opertorok

Specilis rtkadsok, amelyekkel tbb utastst


egyszerre adhatunk ki:

add hozz (+=),


pl.: a = a+2 helyett a += 2
vond ki belle (-=)
vedd a modulojt(%=), pl.: a = a%2 helyett a %= 2

Tmbelem megcmzse ([ ])

tmb (vektor), illetve szveg (string) brmely elemt


lekrdezhetjk, mdosthatjuk
az indexels 0-tl kezddik
pl.: a[3]
// az a tmb 3-as index eleme

Konzol

A C++ adatbeolvassra s megjelentsre konzol


felletet hasznl (persze lehet grafikus krnyezetet is
rni hozz), ezrt az ltalunk rt programok futhatnak
Dos, Windows s Linux alatt is, csak mindig az adott
rendszeren kell lefordtanunk ket
A konzolon csak egyfle sznben, egyfle bettpussal
tudunk kiratni karaktereket
A konzolra trtn beolvass-kirsnl a mveleteket
kln fjlban, az iostream (input-output stream)-ben
talljuk, ezrt ezt kell hasznlnunk a programban:
#include <iostream>
Az iostream a standard nvtrbe tartozik:
using namespace std;

Konzol

Kirs a cout, beolvass a cin utastssal trtnik,


valamint a << s >> opertorokkal, amikkel tbb
kirand rtket vlaszthatunk el

nem tvesztendek ssze a bitenknti opertorokkal


bekrsnl csak vltozba olvashatunk be rtket
kirsnl az opertorok kztt lehetnek vltozk s
konstansok tetszleges tpusbl, illetve trdeljelek,
pldul a sorvge jel (endl)
pl.: int a;
cin >> a;
cout<< A rtke: << a;
cout<< Egy sor << endl << Msik sor;

C++ konzol be-, kimenet

Ksztsnk el egy olyan programot, amely


bekr egy szt a konzolrl, majd visszarja
felkiltjellel egytt.

C++ konzol be-, kimenet


#include <iostream>

// Konzol mveleteket tartalmaz bels fjl hozzadsa

using namespace std;


string szo;
int main() {
cin >> szo;
szo = szo + '!';
cout << szo + '\n';
cout << "Hossza: " << szo.size();

return 0;
}

PROGRAM felkialtojel
VLTOZK:
szo: SZVEG
BE: szo
szo := szo + '!'
KI: szo, SV
** kirja a szt s sortrst vgez
KI: "A hossza: ", |szo|
** a kvetkez sorba a hosszt rja ki
PROGRAM_VGE

Feladat

Adott sugar kr terletnek


kiszmtsa.
(A sugr legyen egy paramter.)
Oldalhosszakkal adott tglatest
trfogata.

Elgazs

Elgazst az if szval tudunk kezdeni. Szintaxisa:


if(felttel)
{
utastsok
}
Megadhat opcionlisan klnben illetve
klnben_ha g
if(felttel)
utastsok
{
}
utastsok
else
}
{
else if(felttel)
utastsok
{
}

C++ elgazs

Ksztsnk el egy olyan programot, amely


eldnti egy beolvasott szmrl, hogy pozitv-e.

C++ elgazs
#include <iostream> // Konzol mveleteket tartalmaz bels fjl hozzadsa
using namespace std;
double szam1;
int main() {
cin >> szam1;

PROGRAM pozitiv_e
VLTOZK:
szam1: VALS

if( szam1 > 0 ) {


cout << "pozitiv" <<endl;
BE: szam1
} else {
HA (szam1 > 0)
** felttel
cout << "nem pozitiv" <<endl;AKKOR
KI: "pozitv ** ha igaz
}
return 0;
}

KLNBEN
KI: "nem pozitv" ** ha hamis
HA_VGE
** elgazs vge
PROGRAM_VGE

C++ feltteles opertor

Feltteles opertor (vagy if-then-else opertor)

<felttel> ? eredmny1 : eredmny2


7<5 ? 4 : 3
7==5+2 ? 4 : 3
8>6 ? x : y
a>b ? a : b

// visszatrs: 3, mivel 7 nem kisebb, mint 5


// visszatrs: 4, mivel 7 egyenl 5+2-vel
// visszatrs: az x vltoz rtkvel
// visszatrs: a nagyobb vltoz
rtkvel a s b kzl

PL.:
szam1>0 ? cout<<"pozitiv"<<endl : cout<<"nem pozitiv<<endl;

Feladat

Msodfok egyenlet megold


Ellenrztt mdon olvass be egy pozitv
egsz szmot: ha nem szmot kapsz,
hibazenet utn olvasd be jra. Ha t
prblkozs utn sem kapsz szmot, egy
hibazenettel llj meg. Egybknt rd ki a
kapott szm hromszorost.
Negatv szmot is ismerj fel.
Tizedestrtet is ismerj fel.
Hatvnykitevs alakot is ismerj fel (2e3 =
2*10^3 = 2000, 2e-3 = 0.002).

Programming is fun

Egy ltvnyosabb feladat:

codingame.com
Tutorial

feladat.

Copdingame

Vlasszuk ki a C++-t

Az als teszt
esetekkel tudjuk
megnzni, hol jrunk.

Codingame

Konzol kezels

Teljestend tesztesetek

Feladat megjelentse s alatta a lers

Ide
rhatod
a
kdot

Ciklusok: while / do

Ell tesztels:
while(felttel)
{
ciklus mag
}

Htul tesztels:
do
{
ciklus mag
} while(felttel)

C++ htul tesztel ciklus

Olvassunk betket a konzolrl, melyeknek


visszaadjuk a nagybets verzijt, egszen
addig, amg .-ot nem kapunk.

C++ htul tesztel ciklus


#include <iostream>

// Konzol mveleteket tartalmaz bels fjl hozzadsa

using namespace std;


char x;

int main()
{

PROGRAM karakter_konverzi
VLTOZK:

do {

cin >> x;

x: KARAKTER

cout << (char)toupper(x);


} while( x != '.');

CIKLUS

BE: x
return 0;
}

KI: NAGY x

AMG (x /= '.')
PROGRAM_VGE

Szmll ciklus /
for ciklus

Inicializls

Ciklus felttel

Ciklusvltoz
nvelse

A for ciklus elnye, hogy egy sorban, egy helyen


sszefoglalja a ciklus futshoz szksges sorokat.
Akr tbb rtk inicializlsa, vltoztatsa is
lehetsges.
Pl.: for(int n = 0, int i = 100 ; n < i ; n++, i--)

C++ szmll ciklus

Szmoljuk s rjuk ki a konzolra 5 felhasznl


ltal megadott szm tlagt.

C++ szmll ciklus


#include <iostream>

// Konzol mveleteket tartalmaz bels fjl hozzadsa

using namespace std;

int a;
double s;

int main() {
s = 0;
for( int i=0; i<5; i++ ) {
cin >> a;
s = s + a;
}

PROGRAM tlag
VLTOZK:
a, i: EGSZ, s: VALS
s := 0
i := 0
** ciklusvltoz
CIKLUS AMG (i < 5)
BE: a
s := s + a
i := i + 1 ** i-t eggyel nveljk
CIKLUS_VGE
KI: "A szmok tlaga: ", s / 5
PROGRAM_VGE

cout << "A szamok atlaga: " << s / 5 << endl;


return 0;
}

Feladat

Add meg az els N darab Fibonacci


szmot.
Egsz szmhrmasok tetszleges
sorozatt mdostsd gy, hogy minden
hrmas nvekv sorrendben legyen.
Szmtsd ki egy szm faktorilist.

Gyakorl feladatok

Egsz szm rkvetkezje

Van-e negatv

Krjnk be egy szmtartomny als s fels hatrrtkt a


felhasznltl. (Ha a kt rtk egyenl, jelezzk a hibt a
felhasznlnak s krjnk be egy j rtket.)
Krjnk be hrom szmot a felhasznltl, amelyek a megadott
tartomnyba esnek. Ha a tartomnyon kvli szmot adott meg, akkor
krjk azt be jra!

Tmb generls

Olvassunk be a konzolrl 5 db szmot s mondjuk meg, vane kztk


negatv rtk

Tartomnyba es szm beolvas

Krjnk be egsz szmot a konzolrl, s rjuk ki az eggyel megnvelt


rtkt.

Egy tetszleges mret tmbt tltsk fel pratlan szmokkal!

F.gy.: 2.1,2.4

Hzi feladatok

2.1a. rj ki N darab *-ot a kpernyre.


3.4 Add meg egy termszetes szm legnagyobb valdi
osztjt.
3.10 Add meg egy tetszleges(N hossz) egsz
szmsorrl, hogy hny eleme kisebb az tlagnl.
s az els 4 heti hzibl 8 feladat.

You might also like