Többdimenziós adatszerkezet
Ha listába listát teszünk, akkor többdimenziós adatszerkezetet tudunk létrehozni.
1A Táblázatos, kétdimenziós adatszerkezet
1autok = [
2 ['Toyota', 'Corolla','japán'],
3 ['Mazda', '3','japán'],
4 ['Hyundai', 'i20','Korea'],
5 ['Audi', 'A6','Német'],
6 ['Ferrari', 'F50','Olasz'],
7 ['Renault', 'Clio','Francia'],
8 ['Ford', 'Focus','Amerika']
9 ]
10
11for auto in autok:
12 print('Márka:', auto[0], end=" ")
13 print('Típus:', auto[1], end=" ")
14 print('Ország:', auto[2])
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6int main() {
7 vector<vector<string>> autok = {
8 {"Toyota", "Corolla", "japán"},
9 {"Mazda", "3", "japán"},
10 {"Hyundai", "i20", "Korea"},
11 {"Audi", "A6", "Német"},
12 {"Ferrari", "F50", "Olasz"},
13 {"Renault", "Clio", "Francia"},
14 {"Ford", "Focus", "Amerika"}
15 };
16
17 // C++ban az auto kulcsszó, ezért Auto lett a változónév
18 for (const auto& Auto : autok) {
19 cout << " Marka: " << Auto[0];
20 cout << " Tipus: " << Auto[1];
21 cout << " Orszag: " << Auto[2];
22 cout << endl;
23 }
24
25
26 return 0;
27}
1B Táblázatos, kétdimenziós látszólag asszociatív adatszerkezettel
1Marka=0
2Tipus=1
3Orszag=2
4autok = [
5 ['Toyota', 'Corolla','japán'],
6 ['Mazda', '3','japán'],
7 ['Hyundai', 'i20','Korea'],
8 ['Audi', 'A6','Német'],
9 ['Ferrari', 'F50','Olasz'],
10 ['Renault', 'Clio','Francia'],
11 ['Ford', 'Focus','Amerika']
12 ]
13
14for auto in autok:
15 print('Márka:', auto[Marka], end=" ")
16 print('Típus:', auto[Tipus], end=" ")
17 print('Ország:', auto[Orszag])
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6int main() {
7 int Marka=0;
8 int Tipus=1;
9 int Orszag=2;
10 vector<vector<string>> autok = {
11 {"Toyota", "Corolla", "japán"},
12 {"Mazda", "3", "japán"},
13 {"Hyundai", "i20", "Korea"},
14 {"Audi", "A6", "Német"},
15 {"Ferrari", "F50", "Olasz"},
16 {"Renault", "Clio", "Francia"},
17 {"Ford", "Focus", "Amerika"}
18 };
19
20 // C++ban az auto egy kulcsszó, így azt nem használhatjuk változónévként
21 for (const auto& auto1 : autok) {
22 cout << "Marka: " << auto1[Marka];
23 cout << " Tipus: " << auto1[Tipus];
24 cout << " Orszag: " << auto1[Orszag];
25 cout << endl;
26 }
27
28 return 0;
29}
1C Táblázatos, kétdimenziós adatszerkezet külön változókkal kiíratva
1autok = [
2 ['Toyota', 'Corolla','japán'],
3 ['Mazda', '3','japán'],
4 ['Hyundai', 'i20','Korea'],
5 ['Audi', 'A6','Német'],
6 ['Ferrari', 'F50','Olasz'],
7 ['Renault', 'Clio','Francia'],
8 ['Ford', 'Focus','Amerika']
9 ]
10
11for marka, tipus, orszag in autok:
12 print('Márka:', marka, end=" ")
13 print('Típus:', tipus, end=" ")
14 print('Ország:', orszag)
1#include <iostream>
2#include <vector>
3#include <string>
4using namespace std;
5
6int main() {
7 vector<vector<string>> autok = {
8 {"Toyota", "Corolla", "japán"},
9 {"Mazda", "3", "japán"},
10 {"Hyundai", "i20", "Korea"},
11 {"Audi", "A6", "Német"},
12 {"Ferrari", "F50", "Olasz"},
13 {"Renault", "Clio", "Francia"},
14 {"Ford", "Focus", "Amerika"}
15 };
16
17 // C++17-nél korábbi verziókban nem működik.
18 for (const auto& [marka, tipus, orszag] : autok) {
19 cout << "Marka: " << marka;
20 cout << " Tipus: " << tipus;
21 cout << " Orszag: " << orszag;
22 cout << endl;
23 }
24
25 return 0;
26}
Az autók adatai egy-egy 3 elemű listában vannak elmentve, ahol sorrendben a Márka, Típus, Ország tulajdonságok vannak megadva. ha létrehozunk ezeknek megfelelő változókat, amelyek az indexszámokat tárolják, akkor beszédesebb változómegadást tudunk létrehozni. Az eredeti lista elemeit így lehet megjeleníteni:
autok[3][0] = autok[3][Marka] = Audi
autok[5][2] = autok[5][Orszag] = Francia
Az előbbi adatszerkezethez hozzáfűzés
Létrehozunk egy adatelemet (autót), majd bele tesszük az autok nevű listába
ujauto=['BMW','M8','Német'] autok.append(ujauto)
2A Táblázatos, kétdimenziós adatszerkezet beolvasása fáljból
Példafájl: Könyvek adatait pontosvesszővel tagoltan tartalmazó konyvek(ev (egész), negyedev (egész), eredet, leiras, peldanyszam (egész)) kiadas.txt nevű fájl.
A fájl minden sorában egy-egy könyv kiadására vonatkozó adatok szerepelnek:
a kiadás ideje (év és negyedév), a könyv eredete (ma = magyar, kf = külföldi), a mű leírása, valamint a kiadott példányszám.
Soron belül a felsorolt adatokat pontosvessző választja el egymástól.
1kiadasok=[]
2
3f = open("kiadas.txt","r", encoding="utf-8")
4
5for sor in f:
6 sor = sor.strip() # felesleges láthatatlan karakterek eltávolítása a sor elejéről és a végéről (pl. szóköz, sortörés karakter)
7 if sor=="":
8 continue # üres sorok figyelmen kívül hagyása
9 kiadas = sor.split(';') # sor szöveg feldarabolása és listává alakítása
10 kiadas[0] = int(kiadas[0]) # év egésszé alakítása
11 kiadas[1] = int(kiadas[1]) # negyedév egésszé alakítása
12 kiadas[4] = int(kiadas[4]) # példányszám egésszé alakítása
13 kiadasok.append(kiadas) # a kiadások lista feltöltése a kiadas nevű tagolt, átalakított listával
14
15f.close()
16
17for kiadas in kiadasok:
18 print(kiadas)
2B Ugyanez beszédes kulcsokkal, kommentek nélkül.
Lépések: fájlkezelés, ciklus a soronkénti bejáráshoz, strip() kitörli a láthatatlan sorvég karaktereket, üres sorok átugrása a hibák elkerülése érdekében, sorok feldarabolása és ha szükséges, átalakítása, kiadas lista feltöltése, végül kiíratás.
1ev = 0
2negyedev = 1
3eredet = 2
4leiras = 3
5peldanyszam = 4
6kiadasok=[]
7
8f = open("kiadas.txt","r", encoding="utf-8")
9
10for sor in f:
11 sor = sor.strip()
12 if sor=="":
13 continue
14 kiadas = sor.split(';')
15 kiadas[ev] = int(kiadas[ev])
16 kiadas[negyedev] = int(kiadas[negyedev])
17 kiadas[peldanyszam] = int(kiadas[peldanyszam])
18 kiadasok.append(kiadas)
19
20f.close()
21
22for kiadas in kiadasok:
23 print(kiadas)
1#include <iostream>
2#include <fstream>
3#include <sstream>
4#include <vector>
5#include <string>
6using namespace std;
7
8string strip(string szoveg) {
9 int start = szoveg.find_first_not_of(" \t\r\n");
10 if (start == string::npos) return "";
11 int end = szoveg.find_last_not_of(" \t\r\n");
12 return szoveg.substr(start, end - start + 1);
13 }
14
15struct Kiadas {
16 int ev;
17 int negyedev;
18 string tipus;
19 string kiado;
20 int peldanyszam;
21 };
22
23int main() {
24 vector<Kiadas> kiadasok;
25 ifstream f("kiadas.txt");
26
27 string sor;
28 while (getline(f, sor)) {
29 sor = strip(sor);
30 if (sor.empty())
31 continue;
32 stringstream ss(sor);
33 Kiadas k;
34 string temp;
35
36 getline(ss, temp, ';'); k.ev = stoi(temp);
37 getline(ss, temp, ';'); k.negyedev = stoi(temp);
38 getline(ss, temp, ';'); k.tipus = temp;
39 getline(ss, temp, ';'); k.kiado = temp;
40 getline(ss, temp, ';'); k.peldanyszam = stoi(temp);
41 kiadasok.push_back(k);
42 }
43
44 f.close();
45
46 for (const auto& kiadas : kiadasok) {
47 cout << kiadas.ev << " "
48 << kiadas.negyedev << " "
49 << kiadas.tipus << " "
50 << kiadas.kiado << " "
51 << kiadas.peldanyszam << endl;
52 }
53
54 return 0;
55}
Tehát a fájlból adatszerkezetbe történő átalakítás lépései:
- beolvasás soronként,
- adatsorok feldarabolása és listává alakítása,
- egyes adatok átalakítása számmá,
- adatsorokat tartalmazó listák eltárolása egy nagy listában.
Ha a beolvasandó fájl első sora tartalmaz mezőneveket, vagy bármi más információt, akkor a for ciklus előtt például egy head = f.readline()utasítással átléphetjük az első sort.
3 Táblázatos, kétdimenziós adatszerkezet beolvasása fáljból mezőnevekkel
Példafájl: kerulet(szam, nev, lakossag (egész), terulet (valós)) tabulatorral tagoltan tartalmazó kiadas.txt nevű fájl.
1keruletek=[]
2f = open("kerulet.txt","r", encoding="utf-8")
3head = f.readline()
4
5for sor in f:
6 sor = sor.strip()
7 if sor=="":
8 continue
9 ker = sor.split("\t") # tabulátorral tagolás
10 ker[2]=int(ker[2])
11 ker[3]=ker[3].replace(",", ".") # tizedes vessző tizedes ponttá alakítása
12 ker[3]=float(ker[3])
13 keruletek.append(ker)
14
15f.close()
16
17for kerulet in keruletek:
18 print(kerulet)
Ebben a feladatban külön érdemes megnézni a tabulátorral tagolást és valós, tizedes pontos számmá alakítást!