Összegzés (mint a sorozatszámítás leggyakoribb változata), eldöntés, kiválasztás, keresés, megszámolás, maximumkiválasztás algoritmusmintákkal tervezett programok (újra)implementálása (paraméterekkel, globális programváltozókkal).
Adott egy hőmérsékletsorozat. Állapítsuk meg, hogy szigorúan monoton növekvő-e!
Eldöntés
Lásd korábbi gyakorlatok.
Lásd korábbi gyakorlatok.
Induljunk ki a korábbi gyakorlat házi feladat példájának kódjából, és azt alakítsuk át.
#include <iostream> #include <windows.h> using namespace std; int Db; const int MaxDb=10; double H[MaxDb]; bool SzigMonNo; void beolvasdarab(); void beolvashomersekletek(); void megoldas(); void kiiras(); void billrevar(); int main() { beolvasdarab(); beolvashomersekletek(); megoldas(); kiiras(); billrevar(); return 0; } //ellenőrzött darab_beolvasás void beolvasdarab() { do { cout<<"Hany homerseklet van megadva (2-"<<MaxDb<<")?"; cin>>Db; if ((Db<2) || (Db>MaxDb)) { cout<<"Rossz adat!"<<endl; } } while ((Db<2) || (Db>MaxDb)); } // hőmérsékletek beolvasása void beolvashomersekletek() { for (int i=0; i<Db; ++i) { cout<<endl<<"A(z) "<<i+1<<". homerseklet?"; cin>>H[i]; } } //megoldás void megoldas() { int i=0; while (i<Db-1 && H[i]<H[i+1]) { i++; } SzigMonNo=i==Db-1; } //kiírás void kiiras() { if (SzigMonNo) { cout<<endl<<"A sorozat szigoruan monoton novekvo."<<endl; } else { cout<<endl<<"A sorozat nem szigoruan monoton novekvo."<<endl; } } //billrevár void billrevar() { system("pause"); }
Induljunk ki a korábbi gyakorlat házi feladat példájának kódjából, és azt alakítsuk át.
#include <iostream> #include <windows.h> using namespace std; //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 beolvashomersekletek(int n, double H[]); void megoldas(int n, const double H[], bool &SzigMonNo); void kiiras(bool SzigMonNo); void billrevar(); int main() { int Db; bool SzigMonNo; be_int("Meresek szama:",Db,2,-1,"Hibas szam"); double H[Db]; beolvashomersekletek(Db,H); megoldas(Db,H,SzigMonNo); kiiras(SzigMonNo); billrevar(); 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); } // hőmérsékletek beolvasása void beolvashomersekletek(int n, double H[]) { for (int i=0; i<n; ++i) { cout<<endl<<"A(z) "<<i+1<<". homerseklet?"; cin>>H[i]; } } //megoldás void megoldas(int n, const double H[], bool &SzigMonNo) { int i=0; while (i<n-1 && H[i]<H[i+1]) { i++; } SzigMonNo=i==n-1; } //kiírás void kiiras(bool SzigMonNo) { if (SzigMonNo) { cout<<endl<<"A sorozat szigoruan monoton novekvo."<<endl; } else { cout<<endl<<"A sorozat nem szigoruan monoton novekvo."<<endl; } } //billrevár void billrevar() { system("pause"); }
Egy N szóból álló szövegből keressük ki a leghosszabb szót!
Maximumkiválasztás
Bemenet
N:Egész
Szavak:Tömb[1..N:Szöveg]
Kimenet
Lhsz:Szöveg
Előfeltétel
N≥1 és ∀i∈[1..N]: Hossz(Szavak[i])>0
Utófeltétel
∃i∈[1..N]: Lhsz=Szavak[i] és ∀i∈[1..N]: Hossz(Lhsz)≥Hossz(Szavak[i])
#include <iostream> #include <windows.h> using namespace std; //sz[0..n-1] szövegtömb beolvasása -- minN<=n<=maxN void be_string_tomb(string kerd, int &n, string sz[], int minN, int maxN); //leghosszabb szó kiválasztása: void leghosszabbSzo(int n, string sz[], string &lhsz); //eredménykiírás: void kiiras(string lhsz); //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); //konvertálás: int -> string string intToStr(int x); void billentyureVar(); int main() { //Bemenet: int N;//a szavak darabszáma const int maxN=100;//a maximális darabszám string szavak[maxN];//a szósorozat //Kimenet: string lhsz;//a leghosszabb szó cout << "\nKerem a szósorozatot!" << endl; be_string_tomb("Szo",N,szavak,1,maxN); leghosszabbSzo(N,szavak,lhsz); kiiras(lhsz); billentyureVar(); return 0; } //sz[0..n-1] szövegtömb beolvasása -- minN<=n<=maxN void be_string_tomb(string kerd, int &n, string sz[], int minN, int maxN) { //tömb-elemszám beolvasása: be_int("\n"+kerd+"-sorozat hossza:",n,minN,maxN,"Hibas a darabszam!"); //a tömb beolvasása: cout << "\n"+kerd+"-elemek:" << endl; for (int i=0;i<n;++i) { do { string kerd="\n"+intToStr(i+1)+". "; cout << kerd; cin >> sz[i]; if (sz[i].length()==0) { cout << "Ures szo nem lehet!"; } } while (sz[i].length()==0); } } //leghosszabb szó kiválasztás: void leghosszabbSzo(int n, string sz[], string &lhsz) { int max=sz[0].length(),maxi=0; for (int i=1; i<n; ++i) { if (sz[i].length()>max) { max=sz[i].length(); maxi=i; } } lhsz=sz[maxi]; } //eredménykiírás: void kiiras(string lhsz) { cout << "\nA leghosszabb szo: " << lhsz << "," << lhsz.length() << " hosszal." << endl; } //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); } //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"); }
Adott egy természetes számokból álló N-es. Határozzuk meg az inverziók számát, azaz hány pár van benne fordított sorrendben?
Megszámolás
Bemenet
Db:Egész
Sz:Tömb[1..Db: Egész]
Kimenet
InvDb:Egész
Előfeltétel
Db≥0 és ∀i∈[1..Db]: Sz[i]>0
Utófeltétel
InvDb=SZUM(i=1..Db-1) SZUM(j=i+1..Db;Sz[i]>Sz[j]) 1
#include <iostream> #include <windows.h> using namespace std; //int tömb beolvasása, elemszáma -- n (<=maxN) //elemei minE és maxE közöttiek void be_int_tomb(string kerd, int &n,int t[],int maxN, int minE,int maxE); //inverziószámlálás: int inverzioSzam(int n, int v[]); //eredménykiírás: void kiiras(int db); //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); //konvertálás: int -> string string intToStr(int x); void billentyureVar(); int main() { //Bemenet: int N;//a számok darabszáma const int maxN=100;//a maximális darabszám int sz[maxN];//a számsorozat //Kimenet: int invDb;//az inverziók száma cout << "\nKérem a sorozatot!" << endl; be_int_tomb("Sorozat",N,sz,maxN,0,-1); invDb=inverzioSzam(N,sz); kiiras(invDb); billentyureVar(); return 0; } //int tömb beolvasása, elemszáma -- n (<=maxN) //elemei minE és maxE közöttiek void be_int_tomb(string kerd, int &n,int t[],int maxN, int minE,int maxE) { //tömb-elemszám beolvasása: be_int("\n"+kerd+"-elemek szama:",n,0,maxN,"Hibás a darabszam!"); //a tömb beolvasása: cout << "\n"+kerd+"-elemek:" << endl; for (int i=0;i<n;++i) { string kerd="\n"+intToStr(i+1)+". :"; be_int(kerd,t[i],minE,maxE,"Hibas ertek!"); } } //inverziószámlálás: int inverzioSzam(int n, int v[]) { int db=0; for (int i=0; i<n-1; ++i) { for (int j=i+1; j<n; ++j) { if (v[i]>v[j]) { ++db; } } } return db; } //eredménykiírás: void kiiras(int db) { cout << endl<<"Az inverziok szama:" << db << "." << endl; } //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); } //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"); }
Egy T fős baráti társaság egy nyaralás minden napján feljegyezte, hogy aznap mennyit költöttek. Készíts programot, ami meghatározza, hogy hány olyan nap volt, amikor fejenként 100 eurónál is többet költöttek.
Egy fesztivál minden napján feljegyezték, hogy hány belépőt adtak el aznap. Készíts programot, ami meghatározza, hogy melyik napon voltak a legtöbben a fesztiválon!