A leckében az ellenőrzött beolvasás C++-os mikéntjével ismerkedünk meg, valamint a konstans tömbök tipikus felhasználásával foglalkozunk.
A lecke végére a hallgatónak ismernie kell (konstans) tömbök specifikációbeli, algoritmikus és C++ nyelvi megfelelőit, használatát, fel kell tudnia ismernie, mikor használja ezt a struktúrát.
Az animáció segítséget nyújthat a feladatok megoldásában a specifikálástól a kódolásig:
Írjunk programot, amely egy 1 és 7 közötti számhoz megadja, hogy az a hét melyik napja!
A feladat két célnak felel meg:
Bemenet
N: Egész
Konstansok
MaxNap: Egész = 7
Nap: Tömb[1..MaxNap:Szöveg] = (Hétfő, Kedd,…, Vasárnap)
Kimenet
HétNapja: Szöveg
Előfeltétel
N∈[1..7]
Utófeltétel
HétNapja=Nap[N]
#include <iostream> using namespace std; int main() { const int MaxNap=7; const string Nap[MaxNap]= {"hétfő","kedd","szerda","csütörtök", "péntek","szombat","vasárnap"}; int N; string HetNapja; //ellenőrzött beolvasás bool rossz; do { cout << "A het hanyadik napjara kivancsi: "; cin >> N; rossz=(N>MaxNap || N<1); if (rossz) { cout << "A napnak 1 es " << MaxNap << " koze kell esnie!" << endl; } } while (rossz); //megoldás HetNapja=Nap[N-1]; //kiírás cout << "A megadott nap:" << HetNapja << endl; return 0; }
Írjunk programot, ami megadja, hogy egy magyar kártya mennyit ér a 21-es játékban!
Célszerű a feladat megoldását az alábbi lépésekre bontani:
először előfeltétel nélkül oldjuk meg a feladatot
ügyeljünk a 0-tól való indexelésre
valósítsuk meg az ellenőrzött beolvasást
hatékonyság: a megoldásból kivehető az a rész, mely újra meghatározza a kártya sorszámát (ciklus), hiszen az ellenőrzött beolvasás során ez már megvalósult melléktermékként
Bemenet
K: Szöveg
Konstansok
MaxKártya: Egész = 8
Kártya: Tömb[1..MaxKártya:Szöveg] = (VII, VIII,…, Ász)
Érték: Tömb[1..MaxKártya:Egész] = (7, 8, 9, 10, 2, 3, 4, 11)
Kimenet
É: Egész
Előfeltétel
K∈Kártya
Utófeltétel
i∈[1..MaxKártya]: K=Kártya[i] és É=Érték[i]
#include <iostream> using namespace std; int main() { const int MaxKartya=8; const string Kartya[MaxKartya]= {"VII","VIII","IX","X","Alsó","Felső", "Király","Ász"}; const int Ertek[MaxKartya]= {7,8,9,10,2,3,4,11}; string K; int E; //ellenőrzött beolvasás bool rossz; do { cout << "Add meg a kártyát: "; cin >> K; int i=0; while (i<MaxKartya && Kartya[i]!=K) { i=i+1; } rossz=i>=MaxKartya; if (rossz) { cout << "Ez nem kártya!" << endl; } } while (rossz); //megoldás int i=0; while (Kartya[i]!=K) { i=i+1; } E=Ertek[i]; //kiírás cout << "Az értéke:" << E << endl; return 0; }
Határozzuk meg, hogy ha egy tábor a hét adott napján kezdődött és adott hosszú volt, akkor milyen napon fejeződött be? (Például ha kedden kezdődött és 10 napos volt, akkor csütörtökön fejeződött be.)
Bemenet
KezdőNap: Szöveg
Hossz: Egész
Konstansok
MaxNap: Egész = 7
Nap: Tömb[1..MaxNap:Szöveg] = (Hétfő, Kedd,…, Vasárnap)
Kimenet
VégNap: Szöveg
Előfeltétel
KezdőNap∈Nap és Hossz>0
Utófeltétel
VégNap∈Nap és
Sorszám(VégNap)=((Sorszám(KezdőNap)+(Hossz-1)-1) mod 7)+1
Definíció
Sorszám:Szöveg→Egész
Sorszám(p):=(j∈[1..MaxNap]: Nap[j]=p)
#include <iostream> using namespace std; int main() { const int MaxNap=7; const string Nap[MaxNap]= {"hétfő","kedd","szerda","csütörtök", "péntek","szombat","vasárnap"}; string KezdoNap, VegNap; int hossz; //ellenőrzött beolvasás bool rossz; do { cout << "Milyen nap kezdődik a tábor:"; cin >> KezdoNap; int i=0; while (i<MaxNap && Nap[i]!=KezdoNap) { i=i+1; } rossz=i>=MaxNap; if (rossz) { cout << "Ez nem lehet!" << endl; } } while (rossz); do { cout << "Hány napig tart:"; cin >> hossz; rossz=hossz<=0; if (rossz) { cout << "Legalabb egynek kell lennie!" << endl; } } while (rossz); //megoldás int i=0; while (Nap[i]!=KezdoNap) { i=i+1; } VegNap=Nap[(i+(hossz-1)) % 7]; //kiírás cout << "A tábor zárónapja:" << VegNap << endl; return 0; }
Írjunk programot, amely egy hónapnévhez a sorszámát rendeli!
A feladat specifikációja és algoritmusa szerepelt előadáson. A házi feladat célja a konstans tömbökhöz tartozó kódolás gyakoroltatása.
Bemenet
H: Szöveg
Konstansok
MaxHónap: Egész = 12
HóNév: Tömb[1..MaxHónap:Szöveg] = (január, február,…, december)
Kimenet
S: Egész
Előfeltétel
H∈HóNév
Utófeltétel
1≤S≤MaxHónap és HóNév[S]=H
#include <iostream> using namespace std; int main() { const int MaxHonap=12; const string HoNev[MaxHonap]= {"január","február","március","április", "május","június","július","augusztus", "szeptember","október","november", "december" }; string H; int S; //ellenőrzött beolvasás bool rossz; do { cout << "Melyik hónapnak akarja tudni a sorszámát:"; cin >> H; int i=0; while (i<MaxHonap && HoNev[i]!=H) { i=i+1; } rossz=i>=MaxHonap; if (rossz) { cout << "Ez nem lehet!" << endl; } } while (rossz); //megoldás int i=0; while (HoNev[i]!=H) { i=i+1; } S=i+1; //kiírás cout << "A hónap sorszáma: " << S << endl; return 0; }
Írjunk programot, amely megadja egy hónapról, hogy melyik évszakba tartozik!
Bemenet
H: Szöveg
Konstansok
MaxHónap: Egész = 12
MaxÉvszak: Egész = 4
HóNév: Tömb[1..MaxHónap:Szöveg] = (január, február,…, december)
ÉvszakNév: Tömb[1..MaxÉvszak:Szöveg] =(tél, tavasz, nyár, ősz)
Kimenet
Évszak: Szöveg
Előfeltétel
H∈HóNév
Utófeltétel
Évszak∈ÉvszakNév és
Évszak=ÉvszakNév[((Sorszám(H) div 3) mod 4)+1]
Definíció
Sorszám:Szöveg→Egész
Sorszám(p):=(j∈[1..MaxHónap]: HóNév[j]=p)
#include <iostream> using namespace std; int main() { const int MaxHonap=12; const int MaxEvszak=4; const string HoNev[MaxHonap]= {"január","február","március","április", "május","június","július","augusztus", "szeptember","október","november", "december" }; const string EvszakNev[MaxEvszak]= {"tél","tavasz","nyár","ősz"}; string H,Evszak; //ellenőrzött beolvasás bool rossz; do { cout << "Melyik hónapról akarja tudni, hogy melyik évszakban van:"; cin >> H; int i=0; while (i<MaxHonap && HoNev[i]!=H) { i=i+1; } rossz=i>=MaxHonap; if (rossz) { cout << "Ez nem lehet!" << endl; } } while (rossz); //megoldás int i=0; while (HoNev[i]!=H) { i=i+1; } Evszak=EvszakNev[((i+1) / 3) % 4]; //kiírás cout << "Az évszak: " << Evszak << endl; return 0; }
Írjunk programot, amely egy 1 és 99 közötti számot betűkkel ír ki!
Írjunk programot, amely egy 1 és 99 közötti számot szövegként olvas be, és átalakítja számmá!