TFeri.hu

A C++ nyelv alapjai 6. rész PDF Nyomtatás E-mail
  
Tartalomjegyzék
A C++ nyelv alapjai 6. rész
További gyakorló feladatok
Minden oldal

11. fejezet: Tömbök gyakorlati használata példákkal

Már láttunk gyakorlatban vektorokat és mátrixokat (avagy tömböket). Némi ismétlésként tekintsük át őket!
Deklaráció: típus név [elemszám];
Minta: int akarmi [5];  // Ez egy 5-elemű, 1-dimenziójú tömböt deklarál, melynek minden eleme egész (int) lesz.

Az elemeket akár a deklaráció alkalmával is feltölthetjük. Például:
int akarmi [] = { 16, 2, 77, 40, 12071 };
Nem szabad elfelejteni, hogy az egyes elemekre hivatkozni a következőképpen lehet:
akarmi[0] // Ez lesz 16
akarmi[1] // Ez lesz 2...


Gyakorlati példában vegyünk fel két tömböt! Az egyikbe rakjuk bele az első 5 Árpád-házi király nevét, majd a másodikba az uralkodásuk idejét (től-ig).
---------------------------------------------
// Árpád-házi királyok
#include <iostream>
using namespace std;
#define ELVALASZT " ----- "
int main ()
{
// Deklarációs rész - értékadással
string kiraly [5] = {"Szent Istvan", "Orseolo Peter", "Aba Samuel", "Orseolo Peter", "I. Andras"};
int uralk[6][1];
uralk[0][0]=1000;
uralk[0][1]=1038;
uralk[1][0]=1038;
uralk[1][1]=1041;
uralk[2][0]=1041;
uralk[2][1]=1044;
uralk[3][0]=1044;
uralk[3][1]=1046;
uralk[4][0]=1046;
uralk[4][1]=1060;
// Kiiratási rész
cout <<"Elso 5 Arpad-hazi kiralyunk\n";
for (int i=0;i<5;i++)
{
cout << kiraly[i] <<ELVALASZT;   //Király nevének kiírása
cout << uralk[i][0] <<" - " <<uralk[i][1] <<"\n"; //Uralkodási évének kiírása
}
return 0;
}
---------------------------------------------

Egyes C++ nyelvjárásokban megengedett a többszörös értékadás, tehát két változónak is ugyanazt az értéket adhatjuk, de ez sajnos itt nem lehetséges!
Ettől függetlenül érdemes megnézni a többszörös értékadás ötletét, mivel így megkíméltük magunkat attól, hogy több ugyanolyan értéket egymás után többször is be kelljen gépelnünk.

Kicsi kitérőként tanuljunk meg képernyőt törölni! Ehhez egy új beépülő kell, majd jöhet maga a parancs is:
---------------------------------------------
#include <iostream>
#include <cstdlib>            // Ez lesz az új beépülő modul.
using namespace std;
int main ()
{
system("cls");            //Ez pedig maga a képernyőtörlés.
}
---------------------------------------------


Most ezt a királyos programot bővítsük annyival, hogy minden uralkodó után írassuk ki, hogy hány évig uralkodott. Ez persze csak a kiíratási részt érinti. Most csak a kiíratási részt másolom ide:
---------------------------------------------
// Kiíratási rész
cout <<"Elso 5 Arpad-hazi kiralyunk\n";
for (int i=0;i<5;i++)
{
cout << kiraly[i] <<ELVALASZT;   //Király nevének kiírása
cout << uralk[i][0] <<" - " <<uralk[i][1] <<"\n"; //Uralkodási évének kiírása
cout <<ELVALASZT <<"Uralkodas hossza: " <<uralk[i][1]-uralk[i][0] <<" ev.\n\n";
}
return 0;
---------------------------------------------


Még egy csavart tegyünk bele! Ugyanis kellene az is, hogy ki uralkodott a leghosszabb ideig. Ehhez be kell vezetni még pár változót, hogy munkánkat megkönnyebbítsük. Íme az (egyik lehetséges) eredmény:
---------------------------------------------
// Árpád-házi királyok
#include <iostream>
#include <cstdlib>
using namespace std;
#define ELVALASZT " ----- "
int main ()
{
// Deklarációs rész - értékadással
string kiraly [5] = {"Szent Istvan", "Orseolo Peter", "Aba Samuel", "Orseolo Peter", "I. Andras"};
int uralk[6][1];
int hossz[6];
uralk[0][0]=1000;
uralk[0][1]=1038;
uralk[1][0]=1038;
uralk[1][1]=1041;
uralk[2][0]=1041;
uralk[2][1]=1044;
uralk[3][0]=1044;
uralk[3][1]=1046;
uralk[4][0]=1046;
uralk[4][1]=1060;

// Kiiratási rész
system("cls");
cout <<"Elso 5 Arpad-hazi kiralyunk\n";
int legtobb;                                                // Ez legyen a leghosszabb ideig uralkodó indexe
int leghosszabb = 0;                                        // Ennyi ideig uralkodott
for (int i=0;i<5;i++)
{
cout << kiraly[i] <<ELVALASZT;   //Király nevének kiírása
cout << uralk[i][0] <<" - " <<uralk[i][1] <<"\n\n"; //Uralkodási évének kiírása
hossz[i] = uralk[i][1]-uralk[i][0];            //Uralkodás hosszának kiszámítása
cout <<ELVALASZT <<"Uralkodas hossza: " <<hossz[i] <<" ev.\n";
if (hossz[i]>leghosszabb)
{
//               cout <<"\n Ez hosszabb lesz!";           //Csak a tesztelés miatt maradt benne!
legtobb = i;
leghosszabb = hossz[i];
}
}
cout <<"\n\n Legtovabb uralkodott: " <<kiraly[legtobb];
cout <<"\n Uralkodas hossza: " <<leghosszabb;
return 0;
}
---------------------------------------------

Ami még a vektorokhoz tartozik, azok a karakteres vektorok. Lássunk erre is egy példát!
Deklaráljuk a következő tömböt: char jenny [20];
Ez ugye egy 20-elemű vektor, melynek minden egyes tagja 1-1 karakter.
Fel lehet tölteni például a következővel:
Hello\0, ahol az egyes elemek értéke a következő lesz:
jenny[0]="H"
jenny[1]="e"
jenny[2]="l"
jenny[3]="l"
jenny[4]="o"
jenny[5]="\0"

Ez utóbbi lesz a szöveget lezáró jel, ami a rendszernek fontos. Lényeges, hogy bár mi "\0"-át látunk, ami látszólag 2 db karakternyi helyet foglal, de a rendszer ezt egyetlennek érzi!
Az előző deklarációt így is meg lehet oldani: char jenny[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
Viszont ez esetben a tömb vége a \0 mutatójánál lesz, azaz 5-nél, nem pedig 20-nál.
Tudom, hogy ez egy meglehetősen bonyolult, de lesz még egyszerűbb is! Íme:
char jenny [] = "Hello";

Lássunk egy gyakorlati példát is! Kérjük be a felhasználó családnevét, majd egy sima üdvözlet után írjuk vissza:
---------------------------------------------
// Karakteres tömbök használata
#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
char kerdes[] = "Kerem a csaladi nevet: ";
char udv[] = "Hello, ";
char nev [80];
cout << kerdes;
cin >> nev;
system("cls");
cout << udv << nev << "!";
return 0;
}
---------------------------------------------


Vegyük észre, hogy a kiírásnál, illetve a cin-nel történő bekérésnél nem kell a zárójeleket használni!Érdemes észrevenni, hogy a rendszer igen gördülékenyen működik, ha valakinek csak egy családi neve van, mint általában. De mi van, ha a teljes nevét kérjük, ami több, mint egy tagú. Ilyenkor sajnos csak a családnevet kapjuk vissza. A probléma onnan ered, hogy a cout és (nekünk most főleg) a cin automatikusan minden egyes szó mögé tesz egy "\0" jelet, amivel lezárja az aktuális szót. Ezzel a kiírásunkat, sajnos agyoncsapja. Helyette egy apró trükköt kell alkalmazni, mégpedig egy új beépülőt is be kell vetni, ami egy új bekérési lehetőséget ad.
---------------------------------------------
// Karakteres tömbök használata 2.
#include <iostream>
#include <cstdlib>                // Ez a képernyőtörlés miatt kell
#include <string>                 // Ez az új beépülő

using namespace std;

int main ()
{
char kerdes[] = "Ke'rem a teljes neve't: ";
char udvozlet[] = "Hello, ";
string teljesnev;               // Immár szöveget kérünk, nem karaktereket
cout << kerdes;
getline(cin,teljesnev);         // Ez az új szöveg-bekérési eljárás
system("cls");
cout << udvozlet << teljesnev << "!";
return 0;
}
---------------------------------------------




 
Ulti Clocks content

Hirdetés