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!
![]() ![]() |
![]() |
![]() |