Vissza az előzőleg látogatott oldalra (nem elérhető funkció)Vissza a modul kezdőlapjáraUgrás a tananyag előző oldaláraUgrás a tananyag következő oldaláraFogalom megjelenítés (nem elérhető funckió)Fogalmak listája (nem elérhető funkció)Oldal nyomtatása (nem elérhető funkció)Oldaltérkép megtekintéseSúgó megtekintése

Tanulási útmutató

Összefoglalás

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.

Követelmény

Önállóan megoldható feladatok

Másolási, kiválogatási, szétválogatási tételt alkalmazó feladatok implementálása szöveges fájlokkal

Az animáció bemutatja a fájlkezeléssel kapcsolatos tudnivalókat és néhány összetett tétellel megoldható feladatot.

Az animáció bemutatja a fájlkezeléssel kapcsolatos tudnivalókat és az összetett tételek használatát.

Flash lejátszó letöltése

Fájlkezeléssel kapcsolatos ismeretek és egyéb feladatok

Feladat: „Összetett programozási tételek 1.” feladatsor/1.

Feladat

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

Alkalmazott tétel

Másolás

Az animáció bemutatja a másolási tételt.

Az animáció bemutatja a másolási tételt

Flash lejátszó letöltése

Másolási tétel

Specifikáció

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

Algoritmus

A képen a másolás eljárás struktogrammal megvalósított változata látható.
A képen a eltelt azonosítójú függvény struktogrammal megvalósított változata látható.

Kód

#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;
    }
};

Vissza a tartalomjegyzékhez

Feladat: „Összetett programozási tételek 1.” feladatsor/4.

Feladat

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!

Vissza a tartalomjegyzékhez

Megoldás

Alkalmazott tétel

Kiválogatás

Az animáció bemutatja a kiválogatási tételt.

Az animáció bemutatja a kiválogatási tételt

Flash lejátszó letöltése

Kiválogatási tétel

Specifikáció

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

Algoritmus

A képen a kiválogatás eljárás struktogrammal megvalósított változata látható.
A képen a kevés azonosítójú függvény struktogrammal megvalósított változata látható.

Kód

#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;
    }
};

Vissza a tartalomjegyzékhez

Feladat: „Összetett tételek 1.” feladatsor/12.

Feladat

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!

Vissza a tartalomjegyzékhez

Megoldás

Alkalmazott tétel

Szétválogatás

Az animáció bemutatja a szétválogatási tételt.

Az animáció bemutatja a szétválogatási tételt

Flash lejátszó letöltése

Szétválogatási tétel

Specifikáció

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

Algoritmus

A szétválogatás eljárás struktogrammal megvalósított változata.

A képen az üres_e azonosítójú függvény struktogrammal megvalósított változata látható.

A képen a zsúfolt_e azonosítójú függvény struktogrammal megvalósított változata látható.

Kód

#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;
    }
};

Vissza a tartalomjegyzékhez

Házi feladat

Az „Összetett programozási tételek 1. ” feladatsor/8.

Feladat

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!

Vissza a tartalomjegyzékhez

Fel a lap tetejére
Új Széchenyi terv
A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszirozásával valósul meg.