2. ELTE
Tartalom
Adatokkal kapcsolatos fogalmak
A típus – általában
Elemi típusok – egész, valós, logikai, karakter
Kódolás – adminisztráció
Kódolás – C++ alapok
Hibakeresés – C++ alapok
Elágazások – C++
2014.10.06. 2/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
3. ELTE
Adatokkal kapcsolatos
fogalmak
Konstans
az az adat, amely a műveletvégzés során nem
változtathatja meg értékét, mindvégig ugyanab-ban
az „állapotban” marad.
Változó
az ilyen adatféleségnek lényegéhez tartozik a
„változékonyság”, más szóval:
vonatkozhatnak rá olyan műveletek is, ame-lyek
új értékkel látják el. Tudományosabban
fogalmazva: nem egyelemű az állapothalmaza.
2014.10.06. 3/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
4. ELTE
Adatokkal kapcsolatos
fogalmak
Értékadás
az az utasítás, ami révén a pillanatnyi állapot-ból
egy másikba (a meghatározottba) kerül át
a változó. (Nyilvánvaló, hogy konstans adat-ra
nem vonatkozhat értékadás, az egy, kez-dőértéket
meghatározón kívül.)
Típus
olyan „megállapodás” (absztrakt kategória),
amely adatok egy lehetséges körét jelöli ki az
által, hogy rögzíti azok állapothalmazát és az
elvégezhető műveletek készletét.
2014.10.06. 4/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
5. ELTE
Az adatjellemzők
összefoglalása
Azonosító
Az a jelsorozat, amellyel hivatkozhatunk a tartal-mára,
amely által módosíthatjuk tartalmát.
Kezdőérték
A születéskor hozzárendelt érték.
Konstansoknál nyilvánvaló; változóknál dek-larációban
kap-e, adható-e, vagy futáskor
szerez értéket magának.
2014.10.06. 5/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
6. ELTE
A típus
Összetettség (strukturáltság) szempontjá-ból
beszélhetünk
strukturálatlan (vagy skalár, elemi) típusról,
ha (az adott szinten) szerkezetet nem tulaj-donítunk
neki; vagy
strukturált (más szóval: összetett) típusról, ha
(elemibb) összetevőkre bontjuk.
2014.10.06. 6/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
7. A beolvasáson, a kiíráson
és értékadáson túliakkal
ELTE
Elemi típusok
Egész típus
Értékhalmaz: –231..+231 –1
(Min'Egész..Max'Egész)
Példaként: 4-bájtos
ábrázolást feltételezve.
Műveletek: +, – , *, Div (egészosztás) , Mod
(osztási maradék), – (unáris mínusz), ^
(pozitív egészkitevős hatványozás)
Relációk: =, <, , , , >
Ábrázolás: kettes komplemens kódú
Változatai: méret és előjel szerint sokfélék
foglalkozunk csak.
2014.10.06. 7/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
8. ELTE
Elemi típusok
Valós típus
Értékhalmaz: ????..????
(Min'Valós..Max'Valós nem definiáltak, vagy imple-mentációfüggőek)
Műveletek: +, –, *, /, ^, – (unáris mínusz)
Relációk: =, <, , , , >
Ábrázolás: lebegőpontos ábrázolás (pontosabb len-ne,
ha e típust racionálisnak neveznénk, mert csak
racionális számot képes ábrázolni)
2014.10.06. 8/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
9. ELTE
Elemi típusok
Logikai típus
Értékhalmaz: Hamis..Igaz
(Min'Logikai..Max'Logikai: Hamis, illetve Igaz)
Műveletek: nem, és, vagy (a szokásos logikai
műveletek)
Relációk: =, <, , , , >
Ábrázolás: 0B = Hamis, –1B = Igaz
(esetleg: 1B = Igaz)… ahol xB=x érték
„bináris egészként” ábrázolva
Megjegyzés: a rendezésnek nem nagy a gyakorlati
jelentősége.
2014.10.06. 9/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
10. ELTE
Elemi típusok
Karakter típus
Értékhalmaz: 0..255 - kódú jelek – ASCII
(Min'Karakter..Max'Karakter: a 0, illetve a 255 kódú
karakter)
Műveletek: karakter-specifikus nincs
(esetleg a Kód:KarakterEgész függvény, és
inverze a Karakter:EgészKarakter függvény,
amelyek a belső ábrázolással hozza kapcsolatba)
Relációk: =, <, , , , >
(a belső ábrázolásuk alapján → nem ABC-sorrend!)
2014.10.06. 10/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
11. ELTE
Kódolás
(adminisztráció)
Célszerűen a programok forrása
tartalmazzák:
1. a szerző adatait,
2. a feladat szövegét és
3. a feladat specifikációját; valamint
4. használható algoritmusmagyarázatokat;
5. a fejlesztés –esetleg– még hátralévő
teendőit.
2014.10.06. 11/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
12. ELTE
Kódolás
(adminisztráció)
Kis szívesség a Code::Blocks-tól:
A szerző adatai (1.) a sablonba (a
template-be) fixen beépíthetők.
1. Pl.:
//Gipsz Jakab
//GIJKAFT.ELTE
//gija@elte.hu
…
#include <iostream>
…
Ezek a programomnak
„csak” a megjegyzései
lesznek. A fordító
számára érdektelen
információk.
2014.10.06. 12/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
13. Ezek a programomnak
„csak” a megjegyzései
ELTE
Kódolás
(adminisztráció)
Sőt a továbbiak is elkezdhetők. Pl.:
//Gipsz Jakab
//GIJKAFT.ELTE
//gija@elte.hu
//
//Feladat:
// … itt a szöveg …
//
//Specifikáció:
//… itt a specifikáció …
//
//Teendők:
//TODO a feladatszöveg kitöltése
//TODO a specifikáció megalkotása
//TODO …
#include <iostream>
…
lesznek. A fordító
számára érdektelen
információk.
A „teendők” („TO-DO”-k)
elemei bárhova elhelyezhetők.
Szintaxisa:
//TODO a teendő szövege
2014.10.06. 13/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
15. ELTE
Kódolás
(adminisztráció)
A sablon alapján egy új projekt
létrehozása:
… és a helye:
Ebből következik, h. csak az
általam „mindig” használt
gépen használható szolgáltatás.
2014.10.06. 15/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
16. ELTE
Kódolás
(adminisztráció)
A tennivalók „kikeresése”:
A kérdéses teendőre kattintva a
kurzor a forráskód megfelelő
sorának az elejére kerül.
2014.10.06. 16/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
17. ELTE
Kódolás
(C++ alapok)
Programszerkezet – main függvény
int main()
{
lokális adatdeklarációk
…
a függvénytörzs végrehajtható utasításai
…
return fvÉrték;
}
Alaptípusok:
int – egész long – egész
float – valós double – valós
char – karakter string – szöveg
bool – logikai
Deklaráció:
típus adatazonosító,…;
2014.10.06. 17/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
18. ELTE
Kódolás
(C++ alapok)
Értékadás:
megjegyzés1
képlet, formula
változó=kifejezés; //típusegyezés!!!
Értékazonosság (pl. logikai kifejezésben):
kifejezés==kifejezés /* típusegyezés */
Egyéb relációk (pl. logikai kifejezésben):
megjegyzés2
kifejezés!=kifejezés /* nem azonos? */
kifejezés<=kifejezés /* kisebb-egyenlő? */
kifejezés<kifejezés /* kisebb? */
…
Logikai operátorok:
kifejezés1 && kifejezés2 /* és */
kifejezés1 || kifejezés2 /* vagy */
Figyelem! Nem: <<
2014.10.06. 18/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
19. ELTE
Kódolás
(beolvasás és kiírás kérdése)
Beolvasás és kiírás (valamint fájlkezelés)
szempontjából a nyelvek kétfélék le-hetnek:
A nyelv (eleve) tartalmaz beolvasó és
kiíró utasításokat. (Pl. Pascal.)
A nyelv szabványos eljáráskönyvtár-ban
tartalmaz beolvasó és kiíró eljá-rásokat
(függvényeket). (Pl. a C és
leszármazottai, így a C++ is.)
2014.10.06. 19/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
21. ELTE
Kódolás
(C++ alapok)
String (=karakterlánc) konstans:
"kl" – kl = tetszőleges hosszúságú karakterlánc
Karakter konstans:
'k' – k = egyetlen karakter
Könyvtárfájlok (header-fájlok):
o #include <…> – a rendszeré
o #include "…" – saját
Névtér
o using namespace …
2014.10.06. 21/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
22. ELTE
Hibakeresés, hibajavítás
*
hibák
Fordítás során kiírt hibák javítása
o Hibaüzenet értelmezése
o A hiba okának kiderítése
o A hiba keletkezési helyének keresése
o A hiba kijavítása
Futtatás során fellépő hibák javítása
o Tesztelés
o A hiba keletkezési helyének keresése
o A hiba kijavítása
2014.10.06. 22/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
25. ELTE
Hibakeresés
(C++ alapok)
A futás után… warning: character constant too long for its type
2014.10.06. 25/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
26. Feltételes fordítás
ELTE
Hibakeresés
(C++ alapok)
Nyomkövetés, debugger nélkül – nyomkö-vetést
támogató saját kiírások:
Csak akkor fordul be a kódba, ha DEBUG definiált
2014.10.06. 26/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
27. Feltételes fordítás
ELTE
Hibakeresés
(C++ alapok)
Nyomkövetés, debugger nélkül – nyomkö-vetést
támogató saját kiírások (folytatás):
Most a DEBUG nem definiált.
2014.10.06. 27/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
28. ELTE
Feladatok elágazásra:
vércsoport – 1
Feladat:
Egy ember vércsoportját (Rh negatív vagy pozitív)
egy génpár határozza meg. Mindkét gén lehet „+”
vagy „–” típusú. A „++” és a „+ –” típusúak az
„Rh pozitívok”, a „– –” típusúak pedig „Rh nega-tívok”.
Írjunk programot, amely megadja egy ember vércso-portját
a génpárja ismeretében!
2014.10.06. 28/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
29. ELTE
Feladatok elágazásra:
vércsoport – 1
Specifikáció:
Bemenet: x,yK
Kimenet: vS
Előfeltétel: x,y{"+", "–"}
Utófeltétel: (x="+" vagy y="+") és v="Rh+"
vagy (x="–" és y="–") és v="Rh–"
Algoritmus:
x="+" vagy y="+"
I N
v:="Rh+" v:="Rh–"
2014.10.06. 29/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
Innentől kezdve el-hagyjuk
a program-paraméterek
dekla-rálását,
a beolvasást,
és kiírást
K=Karakterek halmaza
S=Karakter-sorozatok
(szövegek) halmaza
Elolva-sandó
a jegyzet!
30. ELTE
Feladatok elágazásra:
vércsoport – 2
Feladat:
Egy ember vércsoportját (A, B, AB vagy 0) egy gén-pár
határozza meg. Mindkét gén lehet a, b vagy 0
típusú.
A vércsoport meghatározása: A={aa,a0,0a};
B={bb,b0,0b}; AB={ab,ba}; 0={00}.
Írjunk programot, amely megadja egy ember vércso-portját
a génpárja ismeretében!
2014.10.06. 30/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
31. ELTE
Feladatok elágazásra:
vércsoport – 2
Specifikáció:
Bemenet: x,yK
Kimenet: vS
Előfeltétel: x,y{"a", "b", "0"}
Utófeltétel:
(x="a" és y≠"b" vagy x≠"b" és y="a")
és v="A" vagy
(x="b" és y≠"a" vagy x≠"a" és y="b")
és v="B" vagy
(x="a" és y="b" vagy x="b" és y="a")
és v="AB" vagy
x="0" és y="0" és v="0"
2014.10.06. 31/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
32. ELTE
Feladatok elágazásra:
vércsoport – 2
Algoritmus1:
x="a" és y≠"b" vagy x≠"b" és y="a"
I N
v:="A" x="b" és y≠"a" vagy
x≠"a" és y="b"
I N
v:="B" x="a" és y="b" vagy
x="b" és y="a"
I N
v:="AB" v:="0"
Kétirányú elágazások egymásba ágyazásával.
2014.10.06. 32/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
33. ELTE
Feladatok elágazásra:
vércsoport – 2
Algoritmus2:
x="a" és
y≠"b" vagy
x≠"b" és
y="a"
x="b" és
y≠"a" vagy
x≠"a" és
y="b"
v:="A" v:="B" v:="AB" v:="0"
Sokirányú elágazással.
x="a" és
y="b" vagy
x="b" és
y="a"
x="0"
és
y="0"
2014.10.06. 33/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
34. ELTE
Feladatok elágazásra:
vércsoport – 2
Algoritmus3:
vana:= x="a" vagy y="a"
vanb:= x="b" vagy y="b"
vana
Lokális változók
deklarálása
I N
vanb vanb
I N I N
v:="AB" v:="A" v:="B" v:="0"
Segédváltozók bevezetésével.
2014.10.06. 34/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
Változó
vana,
vanb:Logikai
35. ELTE
Kód:
Kódolás
(C++)
kétirányú sokirányú
elágazás (általános)
if (Felt)
{
UtI
}
else
{
elhagyható
UtH
}
if (Felt1) {
Ut1
}
else if (…) {
…
}
else if (FeltN) {
UtN
}
else {
Ut
Kódolási stílus- elhagyható
}
változatok
(ANSI/K&R)
2014.10.06. 35/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
36. ELTE
Kód:
Kódolás
(C++)
kétirányú sokirányú
elágazás (speciális)
if (Felt) {
UtI
}
else {
UtH
}
elhagyható
switch (kif)
{
case érték1: Ut1; break;
case … : … ; break;
case értékN: UtN; break;
default : Ut ;
}
elhagyható
Kódolási stílus-változatok
(K&R/ANSI)
2014.10.06. 36/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
39. ELTE
Kódolás
(C++)
Kód1:
//név: Szabó Emerencia
//ETR-azonosító: SZEKAAT.ELTE
//drótposta-cím: sze@elte.hu
//Feladat: Vércsoport meghatározás I. - A,B,O
#include <iostream>
using namespace std;
int main()
{
char x,y;
string v;
cout<<"Vercsoport meghatarozasa"<<endl<<endl;
do {
cout<<"Kerem a vercsoportot meghatarozo egyik gent (a/b/0):";
cin>>x;
}while ((x!='a') && (x!='b')&& (x!='0')); //az előfeltétel szerint csak a,b vagy 0 lehet
do {
cout<<"Kerem a vercsoportot meghatarozo masik gent (a/b/0):";
cin>>y;
}while ((y!='a') && (y!='b')&& (y!='0')); //az előfeltétel szerint csak a,b vagy 0
Ciklus (!), amelyből a
kilépés az Ef.
teljesülésekor.
L. még korábban is!
2014.10.06. 39/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
40. ELTE
Kódolás
(C++)
Kód1:
//név: Szabó Emerencia
//ETR-azonosító: SZEKAAT.ELTE
//drótposta-cím: sze@elte.hu
//Feladat: Vércsoport meghatározás I. - A,B,O
if (((x=='a')&&(y!='b'))||((x!='b')&&(y=='a'))){ //az a és b domináns gén
v="A";
}
else{
if ((((x=='b')&&(y!='a'))||((x!='a')&&(y=='b')))){//az a és b domináns gén
#include <iostream>
v="B";
}
else{
using namespace std;
int main()
{
if ((((x=='b')&&(y=='a'))||((x=='a')&&(y=='b')))){
v="AB";
}
else{
char x,y;
string v;
cout<<"Vercsoport v="0";
meghatarozasa"<<endl<<endl;
do {
}
}
cout<<"Kerem a vercsoportot meghatarozo egyik gent (a/b/0):";
cin>>x;
}
}while ((x!='a') && (x!='b')&& (x!='0')); //az előfeltétel szerint csak a,b vagy 0 lehet
do {
cout<<v<<" a vercsoportja!"<<endl;
return 0;
cout<<"Kerem a vercsoportot meghatarozo masik gent (a/b/0):";
cin>>y;
}while ((y!='a') && (y!='b')&& (y!='0')); //az előfeltétel szerint csak a,b vagy 0
}
Kód
jegyzet-ként
2014.10.06. 40/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
41. ELTE
Kódolás
(C++)
Kód3:
//név: Szabó Emerencia
//ETR-azonosító: SZEKAAT.ELTE
//drótposta-cím: sze@elte.hu
//Feladat: Vércsoport meghatározás III. - A,B,O
#include <iostream>
using namespace std;
int main()
{
char x,y;
string v;
bool vana,vanb;
cout<<"Vercsoport meghatarozasa"<<endl<<endl;
do {
cout<<"Kerem a vercsoportot meghatarozo egyik gent (a/b/0):";
cin>>x;
}while ((x!='a') && (x!='b')&& (x!='0')); //az előfeltétel szerint csak a,b vagy 0 lehet
do {
cout<<"Kerem a vercsoportot meghatarozo masik gent (a/b/0):";
cin>>y;
}while ((y!='a') && (y!='b')&& (y!='0')); //az előfeltétel szerint csak a,b vagy 0
2014.10.06. 41/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
42. ELTE
Kódolás
(C++)
Kód3:
//név: Szabó Emerencia
vana=((x=='a')||(y=='a'));
//ETR-azonosító: SZEKAAT.ELTE
vanb=((x=='b')||(y=='b'));
//drótposta-if (vana) cím: {
sze@elte.hu
//Feladat: Vércsoport meghatározás III. - A,B,O
if (vanb) {
v="AB";
}
else {
#include <iostream>
v='A';
using namespace std;
}
}
else {
int main()
{
if (vanb) {
v='B';
char x,}
y;
string else v;
{
bool vana,v='vanb;
0';
}
cout<<"Vercsoport meghatarozasa"<<endl<<endl;
do {
cout<<"Kerem a vercsoportot meghatarozo egyik gent (a/b/0):";
cin>>x;
}
cout<<v<<" a vercsoportja!"<<endl;
return 0;
}while ((x!='a') && (x!='b')&& (x!='0')); //az előfeltétel szerint csak a,b vagy 0 lehet
do {
cout<<"Kerem a vercsoportot meghatarozo masik gent (a/b/0):";
cin>>y;
}while ((y!='a') && (y!='b')&& (y!='0')); //az előfeltétel szerint csak a,b vagy 0
}
Kód
jegyzet-ként
2014.10.06. 42/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
43. ELTE
Kódolás
(C++)
A konzol input kódolása az előfelté-tel
alapján (skalár változóba):
Előfeltétel: Helyes(x)
ahol a Helyes(x) egy x-től függő logikai kifeje-zést
rövidít most
do{
cout << "kérdés:"; cin >> x;
if (!Helyes(x))
{
cout << "hibaüzenet" << endl;
}
}while (!Helyes(x));
2014.10.06. 43/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
44. ELTE
Kódolás
(C++)
Ugyanez egyszerűbben:
cout << "kérdés"; cin >> x;
if (!Helyes(x))
{
cout << "nhibaüzenet" << endl;
exit(hibakód);
}
Jó szokás a hibátlansághoz rendelni a
0 megállási kódot, s ettől eltérőt a
különleges hibaesetekhez.
'n' = sorvégjel
2014.10.06. 44/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
45. A beolvasáshoz szükséges
ELTE
Kódolás
Szintaktikus (és szemantikus) ellenőrzéssel:
Értelemszerűen csak bizonyos típusú változóba
történő olvasásnál alkalmazható (pl. valamely szám
típusúba).
bool hiba;
string tmp;
…
lokális változók.
(C++)
2014.10.06. 45/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
46. cin-nek –mint objektumnak
(bemeneti folyamnak)– vannak
metódusai/tagfüggvényei.
ELTE
Kódolás
(C++)
Szintaktikus (és szemantikus) ellenőrzéssel:
Értelemszerűen csak bizonyos típusú változóba
történő olvasásnál alkalmazható (pl. valamely szám
típusúba).
bool hiba;
do{
string tmp;
…
cout << "kérdés:"; cin >> x;
hiba=cin.fail();
if (hiba || !Helyes(x))
{
cout << "hibaüzenet" << endl;
cin.clear(); getline(cin,tmp,’n’)
}
}while (hiba || !Helyes(x));
Ilyen a fail() is.
Az input-puffer ürítése.
'n' = sorvégjel;
olvasás sorvégjelig
2014.10.06. 46/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
47. ELTE
Ugyanez egyszerűbben:
Például, ha majd fájlból történik a beolvasás:
Olvas(fájl,x) [Helyes(x)]
Kódolás
(C++)
cout << "kérdés:"; cin >> x;
if (cin.fail() || !Helyes(x))
{
cout << "hibaüzenet" << endl;
exit(hibakód);
}
2014.10.06. 47/48
Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 2. előadás
Elolva-sandó
a jegyzet!