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.