You are on page 1of 74

OOP els fejezet

C++ Alapok

Tartalom

C++ program struktrja Adatok brzolsa s a beptett tpusok Elfeldolgoz (preprocessor) utastsai Megjegyzsek (comments) I/O Opertorok s kifejezsek Folyamatirnytsa

Msodik genercis prog. nyelv


mov ax,3 int 10h mov ah,9 ; kpernytrls ; kirats kezdetnek belltsa (9-es szolgltats) ; a legels karakterre DX mutat ; ciklus, tszr hajtdik vgre ; ide ugrunk vissza a ciklus vgn ; a ciklus magja, maga a kirats
; AH=9 s DX-et mr elzleg bellt.!)

lea dx,szoveg mov cx,5 ide: int 21h


loop ide

; ciklus vge

C++ 3. genercis prog.nyelv


... while ( x <= 10 ) { // 10 ciklus y = x * x; // szmol vmt cout << y << endl;// eredmnyt kir total += y; // hozzadja y total ++x; // nveli x-et } // while vge ...

Egy C++ program struktrja

A C++ program definicik s deklarcik gyjtemnye:


Adattpus definicik Globlis adatok definicija Fggvnyek definicija (alprogramok) Osztlydefinicik A main() fggvny definicija (a programunk belpsi pontja ).

Procedurlis vs. OO

Procedurlis nyelveknl a programokat alprogramok-eljrsokkal ptjk fel (procedure subroutine). Az objektum orientlt nyelveknl a programok objektum tpusokbl (osztly) tevdik ssze (classes). C++ tudja mindkettt! Kezdjk a procedurlis szemllettel, majd ttrnk a OO-re.

Hello World++
// Hello World program #include <iostream.h> int main(void) {
megjegyzs Elfeldolgoz utastsa

A programunk vgrehajtsa itt kezddik.

cout << "Hello World\n"; return 0;

A program utastsai

}
A program befejezse (0 az OK)

Zrjelekkel jellt utasts blokk ( main fggvny).

Alkalmazs ksztse

Meddig rjunk egy programot?

szerkeszts

fordts

futtats

Adatok brzolsa Vltozk s konstansok


A vltozk definicijval helyet foglalunk (allocate) a memriban rsmd - Syntax

[const] tpus nv [= rtk]; A tpus lehet beptett vagy felhasznl ltal definilt A nv az a szmok, betk s az alhzsjel tetszleges sorozata(*!) Az rtkads opcionlis (deklarci) A const kulcssz konstansot jell

Vltozk - variables
A nevek megadsnl gyeljnk arra, hogy: Az angol abc betkszlett hasznljuk (A` -> Z, s a -> z, a szmokat (0 -> 9) s az alhzs jelt (`_`). Az els karakter nem lehet szm! A kis s a nagy bet klnbznek szmt (CaseSensitive)! A vltoz nevnek maximlis hosszt a fordt hatrozhatja meg. Nvnek nem adhat foglalt sz.

A C lefoglalt szavai

asm
auto break

continue
default delete

float
for friend

new
operator private public register return

signed
sizeof static switch template this

try
typedef union

case
catch char class

do
double else enum

goto
if inline int

protected struct

unsigned
virtual void volatile

const

extern

long

short

throw

while

Plda vltoz nevekre


KerekekSzama osszeg_2 2_osszeg _szoveg mennyi Mennyi valt 3 // OK // OK // nem OK // OK // OK //OK, de < > mennyi // nem OK

Adatok brzolsa Beptett tpusok (Built-in)


Karater: char, unsigned char Egsz szm - integer: (unsigned) int, short, long Lebegpontos - floating point: float, double, long double Boolean: bool

Adattpusok karaktertpus
char
Egyszeres idzjelek kz (aposztf) zrt egy vagy tbb karaktersorozat, pl.

char betu=x; char sztring[]= Piros Bicikli;


(a karaktersorozat \0 val van lezrva)

escape szekvencik (elttk a pl. \n

\ jel),

cout<<OOP\n ;

Adattpusok egszek 1

integer
pl. int x=42; Lehetnek decimlis (10-es), oktlis (8-as) vagy hexadecimlis (16-os) szmrendszerben Pldk:

short ev=18; (2 byte) (signed) int fizetes=42000; (4 byte) (signed) long ar=420000; (4 byte) (signed) unsigned int szazad=21;(csak pozitv)
Mdostk: u, U, L, l :

Unsigned eljelnlkl: 125U, 072u, 0xFFABu Long- hossz: 12345L, 1234568l Kombinlva: 65432UL

Adattpusok egszek 2

Tpus

hossz

tartomny

unsigned char 8 bit 0 - 255 char 8 bit -128 - 127 enum 16 bit -32,768 - 32,767 unsigned int 16 bit 0 - 65,535 short int 16 bit -32,768 - 32,767 int 32 bit 2,147,483,648- 2,147,483,647 unsigned long 32 bit 0 - 4,294,967,295 long 32 bit -2,147,483,648 - 2,147,483,647 float 32 bit -3.4 * (10**-38) - 3.4 * (10**+38) double 64 bit 1.7 * (10**-308) - 1.7 * (10**+308) long double 80 bit 3.4 * (10**-4932) - 1.1 * (10**+4932)

Adattpusok lebegpontosak

Nem egsz szmok brzolsra hasznljuk (floating point) Pldk:


float kamat = 0.01; (4 byte) double pi = 3.141592654; (8 byte) long double kicsi = 4.11E-3; (10 byte)

Adattpusok igaz/hamis

Logikai mveleteknl hasznljuk a bool tpust. rtkkszlete:


Igaz (true) 0-tl klnbz rtk, Hamis (false) nulla

Adattpusok mg nhny plda


char c; char ch = *; float x; int n; bool flag = true; const duble lbound = -273.00; short s = 10; short t = s;

Adattpusok Felsorols

Felsorolt tpusok
enum felNeve { nv1 [= rtk1], nv2, nv3, ... } nvx egyedi azonostk rtkx-ek egsz szmok Alaprtelmezett rteke a nv1-nek 0 A sorszm egyesvel n Kezdrtk lehet negatv szm is

Adattpusok Felsorols
pldk enum nyelvek{angol, magyar, spanyol}; enum szinek {piros, kek, zold}; enum szinek {piros=2, kek, zold}; //kek =3 enum szinek {piros=1, kek=5, zold}; Deklarci: nyelvek Pista; enum nyelvek Pista; Pista = magyar; //rtkads

Adatok brzolsa Bal- s jobbrtk


A balrtk (Lvalue) hely a memriban ahova runk A jobboldali rtk (Rvalue) egy adat az olvasott helyrl A baloldali vltozk engedelyezik az ltaluk lefoglalt memria mez rtknek vltoztatst A jobboldali vltozk rtkt nem lehet megvltoztatni

AdatTpusok Typedefs

A typedef-el adattpusoknak szinonmkat hozhatunk ltre. rsmd: typedef tpus szinonima_neve Pldk:
typedef char *String; // String nevek; typedef unsigned char Byte; // Byte ascii; typedef char Screen[80]; // Screen disply;

Elfeldolgoz utastsai
Az elfeldolgoz klnll rsze a C++ programozsi krnyezetnek. Feladata: beszrja a fejlcfjlokat a forrsfjlunkba, szvegek helyettestset vgzi, s lehetv teszi a feltteles fordtst. Az utastsok a sorelejn tallhat # jellel kezddnek.

Elfeldolgoz utastsai fjlok beillesztse (Include)

Az include fjl utaststst ad a fordtnak, hogy egy msik fjlbl programsorokat illessze be a mi kdunk kz rsmd: #include fajl
A fordt az aktulis knyvtrban keresi

#include <fajl>
Keress a standard knyvtrakban

C++ elfeldolgoz

ideiglenes fajl (C++ program)

C++ Fordt (Kompajler)

C++ program

Futtathat program

#define makro plda (rgi md!!!)

#define square(a) (a * a)

y = square(x); Behelyettests utn: y = (x * x); z = square(y*x);

z = (y*x * y*x);

Megjegyzsek
Egysoros megjegyzsek (comments) // szveg Tbbsoros megjegyzsek /* szveg ... mg tbb szveg.... mg..... */

Ki/bemenet (I/O)

A C++ IOStream knyvtra (<iostream.h>) a kvekezkppen kezeli a ki- s bevitelt:


// olvas a billentyuzetrol // kiir a kepernyore // kiir a kepernyore

cin >> nev; cout << nev; cerr << nev;

Az I/O mveleteknl tipusellenrzs trtnik, csak a megfelel tpus rtkek lesznek elfogadva

Pillants a memrira
cin >> integer1; (45 lett bevve)
integer1 45

cin >> integer2; integer2 (72 lett bevve) sum = integer1 + integer2;
integer1 integer2 sum

integer1

45 72

45

72
117

I/O Pldk
char name[10]; int ev; cout << Kerem a nevet: ; cin >> nev; cout << Hany eves vagy: ; cin >> ev; cout << A neved << nev << endl; cout << Te most << ev << eves vagy endl;

Opertorok & Kifejezsek Szmtan

Aritmetikai opertorok: +, -, *, /, % *
szorzs

/
oszts Egszek osztsakor elhagyodnak a tizedesek !
7 / 5 eredmnye 1

%
Modulus oszts maradka
7 % 5 eredmnye 2 (7ben az 5 meg van 1szer, 7ig marad mg kett)

Opertorok & Kifejezsek Szmtan

Kirtkelsi sorrend:
Elszr a zrjelben lev mveletek

Szorzs, oszts, maradkkpzs a kvetkez


Kirtkels balrl jobbra trtnik

sszeads, kivons marad a vgre


Kirtkels balrl jobbra trtnik

Opertorok & Kifejezsek Relcis op.

sszehasonlt opertorok: <, >, ==, <=, >=, !=


Eredmnyl bool tpust ad (igaz/hamis) Struktrkat nem lehet sszehasonltani

Logikai opertorok: &&, ||, ! Bitenknti opertorok: ~, ^, &, |

(rszletek ksbb)

Hozzrendels

Egyszer hozzrendels
var = exp; x = 5; y = 2*x;

sszeadsos hozzrendels
var += ertek ekvivalens a var = var + ertek; Ervnyes minden ktoperandusos szmtani mvre s a bitopertorokra, pl: x += 5; y &= 0xFF00; i*=j; k/=32; stb.

Increment & Decrement


Inkrementls ++ Dekrementls -Lehetnek prefix vagy postfix opertorok


prefix -vm eltt, postfix vm mgtt, utn (tmbkkel s struktrkkal nem)

Csak a beptett alaptpusokkal mkdnek


Pldk: x++; ++x; z = 2 * ++x; z = 2 * x++;

Plda
int i=5, j=11, M; M=i+j; M=i++ +j; M=++i +j; M=i-- +j; M=i+j- -; M=- -i+- -j;

16 16 18 18 17 14

Feltteles utasts Az if struktra

Els alak:

a) if (kifejezs)utasts;
b) if (kifejezs) { utastsok; } if ( x > 0) { avg = sum / x; cout << tlag= << avg << endl; }

Feltteles utasts if s az if-else

Msodik alak:

if (kifejezs) { utasts(ok); } else { utasts(ok); }

if (x > 0) { avg = sum / x; cout << tlag= << avg << endl; } else { Cout << tlag <<nem <<rtelmezett; }

Feltteles utasts if s if-else

Harmadik alak: if (kifejezs) {


utasts1; } else if (kifejezs) { utasts2; } else { utasts3; }

A switch
cin>>jegy; //csak int vagy char lehet! switch (jegy){ case 1: cout<<elgtelen;break; case 2: cout<<elgsges;break; case 3: cout<<kzepes;break; case 4: cout<<j;break; case 5: cout<<jeles;break; default : cout<<ilyen jegy nincs!; }

Ciklusok while
while (kifejezs) { utasts1; } int n = 0; while (r > m) { n++; r -= m;

Ciklusok do while
do { utasts1; } while (kifejezs);
do { : cout << Mg egyszer?; cin >> valasz; } while (valasz == i);

Ciklusok for
for (exp1; exp2; exp3) { utasts(ok); }
for (n = 10; n >= 0; n--) { cout << n << endl; }

for vs while
cout << Jegyek szama ==> ; cin >> jegyekSzama; cout >> Dikok szma ==> cin >> diakSzam;

ciklSzam = 0;
while (ciklSzam < diakSzam) { cout << A dik jegye ==> ; cin >> jegy; szazalek = 100 * jegy / jegyekSzama; cout << A diak eredmenye %-ba: ; cout << szazalek ; ciklSzam = ciklSzam +1; }
NB: a ciklusvltoz inicializlsa

for vs while
cout << Jegyek szama ==> ; cin >> jegyekSzama; cout >> Dikok szma ==> cin >> diakSzam; ciklSzam = 0; while (ciklSzam < diakSzam) { cout << A dik jegye ==> ; cin >> jegy; szazalek = 100 * jegy / jegyekSzama; cout << A diak eredmenye %-ba: ; cout << szazalek ; ciklSzam = ciklSzam +1; }
NB: a ciklus felttele

for vs while
cout << Jegyek szama ==> ; cin >> jegyekSzama; cout >> Dikok szma ==> cin >> diakSzam; ciklSzam = 0; while (ciklSzam < diakSzam) { cout << A dik jegye ==> ; cin >> jegy; szazalek = 100 * jegy / jegyekSzama; cout << A diak eredmenye %-ba: ; cout << szazalek ; ciklSzam = ciklSzam +1; }
NB: a ciklusvltoz rtkvltoztatsa

for vs while
cout << Jegyek szama ==> ; cin >> jegyekSzama; cout >> Dikok szma ==> cin >> diakSzam; for (cikSzam = 0; cikSzam<diakSzam; cikSzam++) { cout << A dik jegye ==> ; cin >> jegy; szazalek = 100 * jegy / jegyekSzama; cout << A diak eredmenye %-ba: ; cout << szazalek ;
}

NB: a ciklusvltoz inicializlsa

for vs while
cout << Jegyek szama ==> ; cin >> jegyekSzama; cout >> Dikok szma ==> cin >> diakSzam; for (cikSzam = 0; cikSzam<diakSzam; cikSzam++) { cout << A dik jegye ==> ; cin >> jegy; szazalek = 100 * jegy / jegyekSzama; cout << A diak eredmenye %-ba: ; cout << szazalek ;
}

NB: a ciklus felttele

for vs while
cout << Jegyek szama ==> ; cin >> jegyekSzama; cout >> Dikok szma ==> cin >> diakSzam; for (cikSzam = 0; cikSzam<diakSzam; cikSzam++) { cout << A dik jegye ==> ; cin >> jegy; szazalek = 100 * jegy / jegyekSzama; cout << A diak eredmenye %-ba: ; cout << szazalek ;
}

NB: a ciklusvltoz rtkvltoztatsa

Ciklusok for x2
const char buf[]=A legjobb burek a ; const char *p; int szamlal = 0;

for (p = &buf[0]; *p != \0; p++) {


if (*p = ) szamlal ++; } cout << Szokozok szama= << szamlal << endl;

Ciklusokrl valamit
Leggyakoribb hibk :
Ciklus amely sose ll meg (vgtelen cikl. ) Ciklus mely tl hamar lell

Ciklus mely nem indul el

Activity_1
Mit r ki?
for ( int szam= 0; szam< 5; szam++ ) { cout << szam= << szam << endl; }

Activity_2
Mit r ki?
for ( int szam= 0; szam!= 5; szam++ ) { cout << szam= << szam<< endl; szam= szam+ 1; }

Activity_3
Mit r ki?

beng = 5; boom=0; while (beng > 0) { boom += beng ; beng-- ; } cout << A boom= << boom;

Activity_4
Mit r ki?

boom=0; beng=0; while (beng > 0) { boom += beng ; beng-- ; } cout << A boom= << boom;

Vgtelen ciklus an infinite loop osszeg = 0 ; szam = 5; while (szam > 0) { osszeg += szam ; szam++; } cout << Az osszeg:

Activity_5
Logikai hiba! Ellenrizzk le a cikl. felttelt!

<< osszeg;;

Bemenrtk ellenrzse
A while ciklus gyakori alkalmazsa a bemeneten megjelen rtkek ellenrzse. Pldul: 1. Ha azt szeretnnk megtudni, hogy a bevitt rtk az adott tartomnyba esik-e. 2. Leellenrizzk, hogy a felhasznl milyen vlaszt adott (kisbets i vagy n, vagy nagybets I vagy N).

Bemenet ellenrzse_1
float jegy=0,maxJegy=0 cout<< Krem a legnagyobb jegyet"; cin >> maxJegy; cout<< Krem a dik jegyt"; cin >>jegy;

while(jegy<0||jegy>maxjegy)
{ cout<<venytelen jegy! Krem jra"; cin>>jegy; } cout << jegy /maxJegy*100;

Bemenet ellenrzse_2
cout <<Folytatni szeretn?(I,i,N,n); cin>> valasz; while((valasz!=I)&&(valasz!=i)&&(va lasz!=N)&&(valasz!=n)) { cout << Hibas valasz! Krem jra; cin >> valasz; } A ciklus addig forog mig a valaszra nem kapunk I, i, N vagy n!

Plda ciklusokra
Szmtsuk ki az egsz tpus alap egsz hatvnyt! Alkalmazzuk a for, a while s a do while ciklusokat!

#include <iostream> using namespace std; void main (){

hatvnyszmol

int i, alap, kitevo; double hatvany=1; cout<<"Alap=";cin>>alap; cout<<"Kitevo=";cin>>kitevo; if (kitevo) { for (i= 1;i<=abs(kitevo);i++) hatvany*=alap; if (kitevo<0) hatvany=1./hatvany; } cout << "hatvany="<<hatvany; }

#include <iostream> using namespace std; void main (){ int i, alap, kitevo; double hatvany=1; cout<<"Alap=";cin>>alap; cout<<"Kitevo=";cin>>kitevo;

hatvnyszmol

if (kitevo) { n=kitevo;if (kitevo<0) n=abs(n); while (n>0){ hatvany*=alap; n--; } if (kitevo<0) hatvany=1./hatvany; cout << "hatvany="<<hatvany; }

#include <iostream> using namespace std; void main (){ int i, alap, kitevo; double hatvany=1; cout<<"Alap=";cin>>alap; cout<<"Kitevo=";cin>>kitevo;

hatvnyszmol

if (kitevo) { n=kitevo;if (kitevo<0) n=abs(n); do { hatvany*=alap; n--; }while (n>0) if (kitevo<0) hatvany=1./hatvany; cout << "hatvany="<<hatvany;

break & continue


break kilp a ciklusbl continue folytatja a kvetkez ciklussal for (;;) { cout << vlszts? ; cin >> valasz; if (valasz == q) break; }

Esettanulmny

Els plda
rjon olyan C++ programot, amely karaktereket olvas be a billentyzetrl mindaddig, amig Entert nem kap. Jelentse meg a kvetkez adatokat: A nagybets karakterek szmt. A kisbets karakterek szmt. A szmok szmt. Az egyb karakterek szmt. Az sszes karakterek szmt.

Analzis
karakterek olvassa a billentyzetrl Enterig. ==> ciklus, teszt az Enter kdjra

Nagybetk szma ==> szmll a A..Z karaktrkre Kisbetk szma ==> szmll a..z karakterekre Szmok szma ==> szmll 0..9 karakterekre Egyb karaktere szma ==>
szmll mindazokra, amik az 1. 3-hoz nem tartznk.

sszes karaterek szma ==>


globlis szmll az ssz karaktere

Tervezs
Szmllk inicializlsa Beolvasni ch ( 1 karaktert) Amig (while) nincs Enter csinld inkrementld (nveld 1-el) az Osszes-et Ha (if) ch nagybet, akkor nveld a Nagybetu-t else if ch kisbet, akkor nveld a Kisbetu-t else if ch az szm, akkor novel a Szamok-at else nveld az Egyeb-et olvasd be ch-t A while vge Kirni a szmllk rtkeit

Program csontvza
#include <iostream.h>
// // // // // // // // Nev: Kovacs Pista. Csoport: 1G23 Project: Elso gyakorlat Datum: 2006.02.29 Ez a program meghatarozza a standard bemeneten megjelent karaktersorozatban a nagybetuk, a kisbetuk, a szmok s egyb karakterek szmt.

int main() { return 0; }

Vltozk deklarlsa
char ch; int Osszes int Nagybetuk int Kisbetuk int Szamok int Egyeb

= = = = =

0; 0; 0; 0; 0;

Loop Structure
cout << Krem a karakterek: ; cin >> ch; while ( ch != \n ) { Osszes++; : cin >> ch; }

Karakterek tesztelese
if (ch >= A && ch <= Z)

Nagybetuk++;
else if (ch >= a && ch <= z)

Kisbetuk++;
else if (ch >= 0 && ch <= 9) Szamok++; else Egyeb++;

A ciklus
cout << Krem a karaktereket: ; while ( (ch = cin.get()) != \n ) { Osszes++; : }

Eredmnyek megjelentse
cout << "Nagybetuk =" << Nagybetuk

<< "\nKisbetuk= " << Kisbetuk << "\nSzamok=" << Szamok

<< "\nEgyeb=" << Egyeb<< endl; cout << "Osszes karakterek szama=" << Osszes << endl;

You might also like