A leckében a másolási, kiválogatási illetve szétválogatási tételt alkalmazzuk a feladatok megoldásához. Az implementáció során a bemenő értékeket szöveges fájlokból olvassuk ki.
Az animáció bemutatja a fájlkezeléssel kapcsolatos tudnivalókat és néhány összetett tétellel megoldható feladatot.
Egy sorozatban adottak időpontok óra, perc formában. Írjunk programot, mely minden időponthoz meghatározza a nap eleje óta eltelt percek számát!
Megoldás
Másolás
Az animáció bemutatja a másolási tételt.
Bemenet
N:Egész
Időpontok:Tömb[1..N:TIdőpont]
TIdőpont=Rekord(óra,perc:Egész)
Kimenet
ElteltPercek:Tömb[1..N:Egész]
Előfeltétel
N≥0 …
Utófeltétel
∀i∈[1..N]: ElteltPercek[i]=Eltelt(Időpontok[i])
Definíció
Eltelt:TIdőpont→Egész
Eltelt(időpont):=időpont.óra*60+időpont.perc
#include <iostream> #include <fstream> #include <string> using namespace std; const int MAXN=100; struct TIdopont{ int ora,perc; }; void Beolvas(string fajlNev, int &n, TIdopont idopontok[]); int Eltelt(TIdopont idopont); void Masolas(int n, TIdopont idopontok[], int elteltPercek[]); void Kiiras(string fajlNev, int n, int elteltPercek[]); int main() { int N; TIdopont Idopontok[MAXN]; int ElteltPercek[MAXN]; Beolvas("Ido.be",N,Idopontok); Masolas(N, Idopontok, ElteltPercek); Kiiras("Ido.ki",N, ElteltPercek); return 0; } void Beolvas(string fajlNev, int &n, TIdopont idopontok[]) { //Helyes bemenetet feltetelezunk string eldob; cout<<"-------------------------------------------------------\n"; cout<<"Idopont szamitas\n\n"; cout<<"-------------------------------------------------------\n"; ifstream ifs(fajlNev.c_str()); if (ifs.is_open()) { ifs>>n; cout<<n<<" darab idopont van"<<endl; for (int i=0;i<n;i++) { ifs>>idopontok[i].ora; ifs>>idopontok[i].perc; //Kepernyore is kiirunk cout<<idopontok[i].ora<<" "; cout<<idopontok[i].perc; cout<<endl; } ifs.close(); } cout<<"\n"; } int Eltelt(TIdopont idopont) { return idopont.ora*60+idopont.perc; } void Masolas(int n, TIdopont idopontok[], int elteltPercek[]) { for (int i=0;i<n;i++) { elteltPercek[i]=Eltelt(idopontok[i]); } }; void Kiiras(string fajlNev, int n, int elteltPercek[]) { ofstream ofs(fajlNev.c_str()); cout<<"-------------------------------------------------------\n"; cout<<" Eltelt percek \n"; cout<<"-------------------------------------------------------\n"; if (ofs.is_open()) { ofs<<" Eltelt percek \n"; for (int i=0;i<n;i++) { ofs<<elteltPercek[i]<<endl; //Kepernyore is kiirunk cout<<elteltPercek[i]<<endl; } ofs.close(); cout<<endl; } };
Egy könyvtári nyilvántartásban a következőket tároljuk: könyv szerzője, címe, példányszáma, a kikölcsönzött példányszám. Adjuk meg azokat a könyveket, amelyekből kettő vagy annál kevesebb van a könyvtárban!
Kiválogatás
Az animáció bemutatja a kiválogatási tételt.
Bemenet
N:Egész
Nyilvántartás:Tömb[1..N:TKönyv]
TKönyv=Rekord(szerző,cím:Szöveg;példányszám,kikölcsSzám:Egész)
Kimenet
KevésDb:Egész
KevésKönyv:Tömb[1..N:Egész]
Előfeltétel
N≥0 …
Utófeltétel
KevésDb=SZUM(i=1..N;Kevés(Nyilvántartás[i])) 1 és
∀i∈[1..KevésDb]: Kevés(Nyilvántartás[KevésKönyv[i]]) és
KevésKönyv⊆(1,2,...N)
Definíció
Kevés:TKönyv→Logikai
Kevés(könyv):=(könyv.példányszám-könyv.kikölcsSzám)<2
#include <iostream> #include <fstream> #include <string> using namespace std; const int MAXN=100; struct TKonyv{ string szerzo,cim; int peldanyszam,kikolcsSzam; }; void Beolvas(string fajlNev, int &n, TKonyv nyilvantartas[]); bool Keves(TKonyv konyv); void Kivalogatas(int n, TKonyv nyilvantartas[], int &kevesDb, int kevesKonyv[]); void Kiiras(string fajlNev, int kevesDb, int kevesKonyv[], TKonyv nyilvantartas[]); int main() { int N,KevesDb; TKonyv Nyilvantartas[MAXN]; int KevesKonyv[MAXN]; Beolvas("konyvtar.be",N,Nyilvantartas); Kivalogatas(N, Nyilvantartas, KevesDb, KevesKonyv); Kiiras("konyvtar.ki",KevesDb, KevesKonyv,Nyilvantartas); return 0; } void Beolvas(string fajlNev, int &n, TKonyv nyilvantartas[]) { //Helyes bemenetet feltetelezunk string eldob; cout<<"-------------------------------------------------------\n"; cout<<"Konyvtari nyilvantartasi adatok\n\n"; cout<<"-------------------------------------------------------\n"; ifstream ifs(fajlNev.c_str()); if (ifs.is_open()) { ifs>>n; cout<<n<<" darab konyv van"<<endl; for (int i=0;i<n;i++) { getline(ifs,nyilvantartas[i].szerzo,','); getline(ifs, nyilvantartas[i].cim,','); ifs>>nyilvantartas[i].peldanyszam; ifs>>nyilvantartas[i].kikolcsSzam; //Kepernyore is kiirunk cout<<nyilvantartas[i].szerzo<<" "; cout<<nyilvantartas[i].cim<<" "; cout<<nyilvantartas[i].peldanyszam<<" "; cout<<nyilvantartas[i].kikolcsSzam; cout<<endl; } ifs.close(); } cout<<"\n"; } bool Keves(TKonyv konyv) { return (konyv.peldanyszam-konyv.kikolcsSzam)<2; }; void Kivalogatas(int n, TKonyv nyilvantartas[], int &kevesDb, int kevesKonyv[]) { kevesDb=0; for (int i=0;i<n;i++) { if (Keves(nyilvantartas[i])) { kevesKonyv[kevesDb]=i; kevesDb++; } } }; void Kiiras(string fajlNev, int kevesDb, int kevesKonyv[], TKonyv nyilvantartas[]) { ofstream ofs(fajlNev.c_str()); cout<<"-------------------------------------------------------\n"; cout<<kevesDb<<" db 2-nel kevesebb konyv van a konyvtarban\n"; cout<<"-------------------------------------------------------\n"; if (ofs.is_open()) { for (int i=0;i<kevesDb;i++) { ofs<<nyilvantartas[kevesKonyv[i]].szerzo<<"\t"; ofs<<nyilvantartas[kevesKonyv[i]].cim<<"\t"; ofs<<nyilvantartas[kevesKonyv[i]].peldanyszam<<"\t"; ofs<<nyilvantartas[kevesKonyv[i]].kikolcsSzam<<endl; //Kepernyore is kiirunk cout<<nyilvantartas[kevesKonyv[i]].szerzo<<"\t"; cout<<nyilvantartas[kevesKonyv[i]].cim<<"\t"; cout<<nyilvantartas[kevesKonyv[i]].peldanyszam<<"\t"; cout<<nyilvantartas[kevesKonyv[i]].kikolcsSzam<<endl; } ofs.close(); cout<<endl; } };
A BKV utasszámlálást végzett. Ismerjük, melyik járaton hány férőhely van, és átlagosan hányan utaztak rajta. Zsúfolt az a busz, ahol a férőhelyek legalább 80%-a foglalt. Üres, ha 20%-nál kisebb a kihasználtság. Készítsünk programot, mely a járatokat szétválogatja zsúfolt, üres és egyéb buszok szerint!
Szétválogatás
Az animáció bemutatja a szétválogatási tételt.
Bemenet
N:Egész
Járatok:Tömb[1..N:TJárat]
TJárat=Rekord(férőhely,foglaltság:Egész)
Kimenet
ÜresDb:Egész, Üresek:Tömb[1..N:Egész],
EgyébDb:Egész, Egyebek:Tömb[1..N:Egész],
ZsúfoltDb:Egész, Zsúfoltak:Tömb[1..N:Egész]
Előfeltétel
N≥0 …
Utófeltétel
ÜresDb=SZUM(i=1..N;Üres_e(Járatok[i])) 1 és
∀i∈[1..ÜresDb]: Üres_e(Járatok[Üresek[i]]) és
Üresek⊆(1,2,...N) és
ZsúfoltDb=SZUM(i=1..N;Zsúfolt_e(Járatok[i])) 1 és
∀i∈[1..ZsúfoltDb]: Zsúfolt_e(Járatok[Zsúfoltak[i]]) és
Zsúfoltak⊆(1,2,...N) és
EgyébDb=N-ÜresDb-ZsúfoltDb és
∀i∈[1..EgyébDb]: (nem Üres_e(Járatok[Egyebek[i]]) és nem Zsúfolt_e(Járatok[Egyebek[i]])) és
Egyebek⊆(1,2,...N)
Definíció
Üres_e:TJárat→Logikai
Üres_e(járat):=(járat.foglaltság/járat.férőhely)<0,2
Zsúfolt_e:TJárat→Logikai
Zsúfolt_e(járat):=(járat.foglaltság/járat.férőhely)>0,8
#include <iostream> #include <fstream> #include <string> using namespace std; const int MAXN=100; struct TJarat{ int ferohely,foglaltsag; }; void Beolvas(string fajlNev, int &n, TJarat jaratok[]); bool Ures_e(TJarat jarat); bool Zsufolt_e(TJarat jarat); void Szetvalogatas(int n, TJarat jaratok[], int &uresDb, int uresek[], int &zsufoltDb, int zsufoltak[],int &egyebDb, int egyebek[]); void Kiiras(string fajlNev, int uresDb, int uresek[], int zsufoltDb, int zsufoltak[],int egyebDb,int egyebek[],TJarat jaratok[]); int main() { int N,UresDb,ZsufoltDb,EgyebDb; TJarat Jaratok[MAXN]; int Uresek[MAXN]; int Zsufoltak[MAXN]; int Egyebek[MAXN]; Beolvas("BKV.be",N,Jaratok); Szetvalogatas(N,Jaratok, UresDb,Uresek,ZsufoltDb,Zsufoltak,EgyebDb,Egyebek); Kiiras("BKV.ki",UresDb,Uresek,ZsufoltDb,Zsufoltak,EgyebDb,Egyebek, Jaratok); return 0; } void Beolvas(string fajlNev, int &n, TJarat jaratok[]) //Helyes bemenetet feltetelezunk string eldob; cout<<"-------------------------------------------------------\n"; cout<<"BKV utasszamlalas\n\n"; cout<<"-------------------------------------------------------\n"; ifstream ifs(fajlNev.c_str()); if (ifs.is_open()) { ifs>>n; cout<<n<<" darab jarat van"<<endl; for (int i=0;i<n;i++) { ifs>>jaratok[i].ferohely; ifs>>jaratok[i].foglaltsag; //Kepernyore is kiirunk cout<<jaratok[i].ferohely<<" "; cout<<jaratok[i].foglaltsag; cout<<endl; } ifs.close(); } cout<<"\n"; } bool Ures_e(TJarat jarat) { return (jarat.foglaltsag/(float)jarat.ferohely)<0.2 ; }; bool Zsufolt_e(TJarat jarat) { return (jarat.foglaltsag/(float)jarat.ferohely)>=0.8 ; }; void Szetvalogatas(int n, TJarat jaratok[], int &uresDb, int uresek[], int &zsufoltDb, int zsufoltak[],int &egyebDb, int egyebek[]) { uresDb=0; zsufoltDb=0; egyebDb=0; for (int i=0;i<n;i++) { if (Ures_e(jaratok[i])) { uresek[uresDb]=i; uresDb++; } else { if (Zsufolt_e(jaratok[i])) { zsufoltak[zsufoltDb]=i; zsufoltDb++; } else { egyebek[egyebDb]=i; egyebDb++; } } } }; void Kiiras(string fajlNev, int uresDb, int uresek[], int zsufoltDb, int zsufoltak[],int egyebDb,int egyebek[],TJarat jaratok[]) { ofstream ofs(fajlNev.c_str()); cout<<"-------------------------------------------------------\n"; cout<<uresDb<<" db 20%-nál kevesbe kihasznalt jaratok \n"; cout<<"-------------------------------------------------------\n"; if (ofs.is_open()) { ofs<<uresDb<<" db 20%-nál kevesbe kihasznalt jaratok \n"; for (int i=0;i<uresDb;i++) { ofs<<jaratok[uresek[i]].ferohely<<"\t"; ofs<<jaratok[uresek[i]].foglaltsag<<"\n"; //Kepernyore is kiirunk cout<<jaratok[uresek[i]].ferohely<<"\t"; cout<<jaratok[uresek[i]].foglaltsag<<"\n"; } cout<<"-------------------------------------------------------\n"; cout<<zsufoltDb<<" db 80%-nál jobban kihasznalt jaratok\n"; ofs<<zsufoltDb<<" db 80%-nál jobban kihasznalt jaratok\n"; cout<<"-------------------------------------------------------\n"; for (int i=0;i<zsufoltDb;i++) { ofs<<jaratok[zsufoltak[i]].ferohely<<"\t"; ofs<<jaratok[zsufoltak[i]].foglaltsag<<"\n"; //Kepernyore is kiirunk cout<<jaratok[zsufoltak[i]].ferohely<<"\t"; cout<<jaratok[zsufoltak[i]].foglaltsag<<"\n"; } cout<<"-------------------------------------------------------\n"; cout<<egyebDb<<" db 20-80% kozotti kihasznaltsagu jaratok\n"; ofs<<egyebDb<<" db 20-80% kozotti kihasznaltsagu jaratok\n"; cout<<"-------------------------------------------------------\n"; for (int i=0;i<egyebDb;i++) { ofs<<jaratok[egyebek[i]].ferohely<<"\t"; ofs<<jaratok[egyebek[i]].foglaltsag<<"\n"; //Kepernyore is kiirunk cout<<jaratok[egyebek[i]].ferohely<<"\t"; cout<<jaratok[egyebek[i]].foglaltsag<<"\n"; } ofs.close(); cout<<endl; } };
A BKV utasszámlálást végzett. Ismerjük, melyik járaton hány férőhely van, és átlagosan hányan utaztak rajta. Zsúfolt az a busz, ahol a férőhelyek legalább 80%-a foglalt. Üres, ha 20%-nál kisebb a kihasználtság. Készítsünk programot a zsúfolt és az üres buszok kiválogatására!