Vissza az előzőleg látogatott oldalra (nem elérhető funkció)Vissza a modul kezdőlapjáraUgrás a tananyag előző oldalára (20)Ugrás a tananyag következő oldalára (teszt)Fogalom 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

Másolás, kiválogatás, szétválogatás, unió, metszet algoritmusmintákkal tervezett programok implementálása

Követelmény

Önállóan megoldható feladatok

A másolás, kiválogatás, szétválogatás, metszet, egyesítés, összefuttatás algoritmusmintákkal tervezett programok implementálása

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

Feladat

Egy sorozatban adottak időpontok óra, perc formában. Írjon programot, mely minden időponthoz meghatározza a nap eleje óta eltelt percek számát!

Vissza a tartalomjegyzékhez

Megoldás

Alkalmazott tétel

Másolás

Specifikáció

Bemenet

N:Egész

Idők:Tömb[1..N:TIdő]

TIdő=Rekord(óra,perc:Egész)

Kimenet

ElteltIdő:Tömb[1..N:Egész]

Előfeltétel

N≥0 és ∀i∈[1..N]: 0≤Idők[i].óra≤23 és 0≤Idők[i].perc≤59

Utófeltétel

∀i∈[1..N]: ElteltIdő[i]=Idők[i].óra*60+Idők[i].perc

Algoritmus

A 1. feladat algoritmusa, struktogrammal.

Kód

#include <iostream>
#include <windows.h>
using namespace std;
struct TIdo
{
    int ora, perc;
};
//beolvassa a minN..maxN közötti egész számot (maxN<minN => végtelen)
void be_int(string kerdes, int &n, int minN, int maxN, string uzenet);
void beolvas(int n, TIdo idok[]);
void masolas(int n, const TIdo idok[], int elteltido[]);
void kiiras(int n, const int elteltido[]);
int main()
{
    int n;
    be_int("Hany idopont van?",n,0,-1,"Nem lehet negativ darabszam");
    TIdo idok[n];
    int elteltido[n];
    beolvas(n, idok);
    masolas(n, idok, elteltido);
    kiiras(n, elteltido);
    return 0;
}
//beolvassa a minN..maxN közötti egész számot (maxN<minN => végtelen)
void be_int(string kerdes, int &n, int minN, int maxN, string uzenet)
{
    bool hiba;
    string tmp;
    do
    {
        if (maxN>=minN)
        {
            cout << kerdes << " (" << minN << ".." << maxN << "):";
            cin >> n;
            hiba=cin.fail() || n<minN || n>maxN;
        }
        else
        {
            cout << kerdes << " (" << minN << "..):";
            cin >> n;
            hiba=cin.fail() || n<minN;
        }
        if (hiba)
        {
            cout << uzenet << endl;
            cin.clear();
            getline(cin,tmp,'\n');
        }
    }
    while(hiba);
}
void beolvas(int n, TIdo idok[])
{
    for (int i=0; i<n; ++i)
    {
        do
        {
            cout<<i+1<<". ora: ";
            cin>>idok[i].ora;
            if (idok[i].ora<0 || idok[i].ora>23)
            {
                cout<<"Ez nem lehet!"<<endl;
            }
        }
        while (idok[i].ora<0 || idok[i].ora>23);
        do
        {
            cout<<i+1<<". perc: ";
            cin>>idok[i].perc;
            if (idok[i].perc<0 || idok[i].perc>59)
            {
                cout<<"Ez nem lehet!"<<endl;
            }
        }
        while (idok[i].perc<0 || idok[i].perc>59);
    }
}
void masolas(int n, const TIdo idok[], int elteltido[])
{
    for (int i=0; i<n; i++)
    {
        elteltido[i] = idok[i].ora * 60 + idok[i].perc;
    }
}
void kiiras(int n, const int elteltido[])
{
    cout<<endl;
    for (int i = 0; i<n; i++)
    {
        cout << i+1 << ". idotartam: " << elteltido[i] << endl;
    }
}

Vissza a tartalomjegyzékhez

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

Feladat

Egy osztály tanulóinak a különböző tárgyakból kapott év végi osztályzatai alapján adjuk meg azokat a tanulókat, akiknek utóvizsgát kell tenniük (azaz valamiből 1-est kaptak)!

Vissza a tartalomjegyzékhez

Megoldás

Alkalmazott tétel

Kiválogatás

Specifikáció

Bemenet

N,M:Egész

Jegyek:Tömb[1..N,1..M:Egész]

Kimenet

Db:Egész

Bukottak:Tömb[1..N:Egész]

Előfeltétel

N≥0 és M≥0 és ∀i∈[1..N]: ∀j∈[1..M]: 0≤Jegyek[i,j]≤5

Utófeltétel

Db=SZUM(1..N;bukott(i)) 1 és

∀i∈[1..Db]: bukott(Bukottak[i]) és Bukottak⊆(1,2,…,N)

Definíció

bukott:Egész→Logikai

bukott(i):=∃j∈[1..M]:Jegyek[i,j]=1

Algoritmus

A 2. feladat algoritmusa, struktogrammal.
A 2. feladat algoritmusában meghívott függvény, struktogrammal.

Kód

#include <iostream>
#include <windows.h>
using namespace std;
#define MaxN 100
//globálissá tesszük a feladatparamétereket,
//mert a bukott(i) függvény használja őket
int N,M;
int Jegyek[MaxN][MaxN];
int Db;
int Bukottak[MaxN];
void beolvas(int &n, int &m, int Jegyek[MaxN][MaxN]);
void be_int(string kerdes, int &n, int minn, int maxn, string uzenet);
string intToStr(int x);
bool bukott(int i);
void kivalogatas(int n, int m, int Jegyek[MaxN][MaxN], int &db,
                 int Bukottak[]);
void kiiras(int db, int Bukottak[]);
void billentyureVar();
int main()
{
    beolvas(N, M, Jegyek);
    kivalogatas(N, M, Jegyek, Db, Bukottak);
    kiiras(Db, Bukottak);
    return 0;
}
void beolvas(int &n, int &m, int Jegyek[MaxN][MaxN])
{
    be_int("Hany tanulo van?",n,0,MaxN,"Rossz letszam!");
    be_int("Hany tantargy van?",m,0,MaxN,"Rossz tantargyszam!");
    for(int i=0; i<n; ++i)
    {
        for(int j=0; j<m; ++j)
        {
            string s=intToStr(i+1)+". tanulo "+intToStr(j+1)+". jegye:";
            be_int(s,Jegyek[i][j],1,5,"Rossz jegy!");
        }
    }
}
void be_int(string kerdes, int &n, int minn, int maxn, string uzenet)
{
    bool hiba;
    string tmp;
    do
    {
        if (maxn>=minn)
        {
            cout << kerdes << " (" << minn << ".." << maxn << "):";
            cin >> n;
            hiba=cin.fail() || n<minn || n>maxn;
        }
        else
        {
            cout << kerdes << " (" << minn << "..):";
            cin >> n;
            hiba=cin.fail() || n<minn;
        }
        if (hiba)
        {
            cout << uzenet << endl;
            cin.clear();
            getline(cin,tmp,'\n');
        }
    }
    while(hiba);
}
void kivalogatas(int n, int m, int Jegyek[MaxN][MaxN], int &db,
                 int Bukottak[])
{
    db = 0;
    for (int i=0; i<n; i++)
    {
        if (bukott(i))
        {
            Bukottak[db] = i;
            db=db+1;
        }
    }
}
bool bukott(int i)
{
    int j;
    bool l;
    j=0;
    l=false;
    while(j<M and not l)
    {
        l=Jegyek[i][j]==1;
        ++j;
    }
    return l;
}
void kiiras(int db, int Bukottak[])
{
    if(db==0)cout << endl << "Nincs bukott tanulo!" << endl;
    else
    {
        cout << endl << "A bukottak sorszamai:" << endl;
        for (int i = 0; i<db; i++)
        {
            cout << i+1 << ".: " << Bukottak[i]+1 << ". tanulo" << endl;
        }
    }
}
//konvertálás: int -> string
string intToStr(int x)
{
    string s="";
    bool neg=x<0;
    //előjel letagadása:
    if (neg) x=-x;
    while (x>0)
    {
        char c=char(x%10+48);//utolsó számjegy
        x=x/10;//utolsó számjegy nélkül
        s=c+s;
    }
    //x=0 esete:
    if (s.length()==0) s="0";
    //a negatív előjel hozzáragasztása:
    if (neg) s="-"+s;
    return s;
}
void billentyureVar()
{
    system("pause");
}

Vissza a tartalomjegyzékhez

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

Feladat

Ismert egy iskola tanulóinak névsora a tanulók személyi számával. Válogassuk szét a lányokat és a fiúkat!

Vissza a tartalomjegyzékhez

Megoldás

Alkalmazott tétel

Szétválogatás

Specifikáció

Bemenet

N:Egész

Tanulók:Tömb[1..N:TTanuló],

TTanuló=Rekord(név,szemszám:Szöveg)

Kimenet

FDb,LDb:Egész

Fiúk,Lányok:Tömb[1..N:Egész]

Előfeltétel

N≥0 és ∀i∈[1..N]: Jele(Tanulók[i].szemszám,1)∈(’1’,’2’,’3’,’4’)

Utófeltétel

FDb=SZUM(i=1..N;Jele(Tanulók[i].szemszám,1)∈(’1’,’3’)) 1 és

LDb=N-FDb és

∀i∈[1..FDb]: Jele(Tanulók[Fiúk[i]].szemszám,1)∈(’1’,’3’) és

∀i∈[1..LDb]: Jele(Tanulók[Lányok[i]].szemszám,1)∈(’2’,’4’) és

Fiúk⊆(1,2,…,N) és Lányok⊆(1,2,…,N)

Algoritmus

A 3. feladat algoritmusa, struktogrammal.

Kód

#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
struct TTanulo
{
    string nev;
    string szemszam;
};
void be_int(string kerdes, int &n, int minN, int maxN, string uzenet);
void beolvas(int n, TTanulo tanulok[]);
void szetvalogatas(int n, TTanulo tanulok[], int &fdb, int fiuk[],
                   int &ldb, int lanyok[]);
void kiiras(int fdb, int fiuk[], int ldb, int lanyok[]);
void billentyureVar();
int main()
{
    int N, Fdb, Ldb;
    be_int("Hany tanulo van?", N, 0, -1, "Hibas darabszam!");
    TTanulo Tanulok[N];
    int Fiuk[N];
    int Lanyok[N];
    beolvas(N, Tanulok);
    szetvalogatas(N, Tanulok, Fdb, Fiuk, Ldb, Lanyok);
    kiiras(Fdb, Fiuk, Ldb, Lanyok);
    return 0;
}
//beolvassa a minN..maxN közötti egész számot (maxN<minN => végtelen)
void be_int(string kerdes, int &n, int minN, int maxN, string uzenet)
{
    bool hiba;
    string tmp;
    do
    {
        if (maxN>=minN)
        {
            cout << kerdes << " (" << minN << ".." << maxN << "):";
            cin >> n;
            hiba=cin.fail() || n<minN || n>maxN;
        }
        else
        {
            cout << kerdes << " (" << minN << "..):";
            cin >> n;
            hiba=cin.fail() || n<minN;
        }
        if (hiba)
        {
            cout << uzenet << endl;
            cin.clear();
            getline(cin,tmp,'\n');
        }
    }
    while(hiba);
}
void beolvas(int n, TTanulo tanulok[])
{
//Helyes szemelyi szamokat feltetelezunk
    for (int i = 0; i<n; i++)
    {
        cout<<i+1<<". tanulo:"<<endl<<"\tneve:";
        cin>>tanulok[i].nev;
        cout<<"\tszem. szama:";
        cin>>tanulok[i].szemszam;
    }
}
void szetvalogatas(int n, TTanulo tanulok[], int &fdb, int fiuk[],
                   int &ldb, int lanyok[])
{
    fdb = 0;
    ldb = 0;
    for (int i=0; i<n; i++)
    {
        if (tanulok[i].szemszam.at(0) == '1'
            || tanulok[i].szemszam.at(0) == '3')
        {
            fiuk[fdb] = i;
            fdb=fdb+1;
        }
        else if (tanulok[i].szemszam.at(0) == '2'
                 || tanulok[i].szemszam.at(0) == '4')
        {
            lanyok[ldb] = i;
            ldb=ldb+1;
        }
    }
}
void kiiras(int fdb, int fiuk[], int ldb, int lanyok[])
{
    if (fdb==0)cout << endl << "Nem volt fiu!" << endl;
    else
    {
        cout << endl << "Fiuk:" << endl;
        for (int i = 0; i<fdb; i++)
        {
            cout << i+1 << ".: " << fiuk[i]+1 << ". tanulo" << endl;
        }
    }
    if (ldb==0)cout << endl << "Nem volt lany!" << endl;
    else
    {
        cout << endl << "Lanyok:" << endl;
        for (int i = 0; i<ldb; i++)
        {
            cout << i+1 << ".: " << lanyok[i]+1 << ". tanulo" << endl;
        }
    }
}
void billentyureVar()
{
    system("pause");
}

Vissza a tartalomjegyzékhez

Házi feladat

Feladat

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

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.