Másolás, kiválogatás, szétválogatás, unió, metszet algoritmusmintákkal tervezett programok implementálása
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!
Másolás
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

#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;
}
}
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)!
Kiválogatás
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


#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");
}
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!
Szétválogatás
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)

#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");
}
Összetett programozási tételek 1 feladatsor/6.
![]() ![]() |
![]() |
![]() |