Vytvorte program, který bude z príkazové rádky volán vzdy s jedním parametrem. Tímto parametrem bude císlo predstavující letopocet, pro který se má ze seznamu lidí predaného na standardním vstupu vytvorit setrídený seznam tech, kterí se v tomto roce narodili. Jednotlivé záznamy vstupního seznamu mají následující tri atributy práve v tomto poradí: jméno, príjmení a rok narození.
select_people
a jeji definici umístete do oddeleného modulu narozeni.C.
Funkce musí mít tento prototyp:
vector<string> select_people(multimap<string, int> &people, int rok);
people je odkaz (reference) na indexovaný kontejner (asociované pole),
které asociuje retez ve tvaru "príjmení jméno" typu string s rokem narození typu
int daného cloveka. Parametr rok urcuje letopocet, podle kterého
bude proveden vlastní výber odpovídajících záznamu z pole people. string, který obsahuje abecedne setrídený seznam
podle príjmení. Ctrl
D). narozeni.C -- modul
obsahující definici funkce select_people,
narozenimain.C
-- hlavní modul. Samozrejme nezapomente správne pojmenovat hlavickový soubor
popisující rozhraní k modulu narozeni.C.
strtol deklarované v hlavickovém souboru cstdlib.
Muzete samozrejme také zvázit pouzití makra isdigit a
funkce atoi. Uvedomte si vsak, ze funkce atoi
nedetekuje chyby!
sort
deklarované v hlavickovém souboru algorithm. Presvedcete se, jak jsou jednotlivé
asociované záznamy v kontejneru multimap usporádány a je-li vubec
potreba seznam trídit ;-). multimap je mozné vyuzít
funkci insert(pair<string, int>(string, int)). map a multimap pouzitý
jako ukazatel ukazuje na strukturu slozenou z klíce first a
asociované hodnoty second. Je-li it iterátor,
lze proto psát napr. it->firstg++ -ansi -Wall -pedantic -o narozeni narozeni.C narozenimain.C
#include<iostream>
#include<cstdlib>
#include<map>
#include<vector>
using namespace std;
vector<string> select_people(multimap<string, int> &people, int rok);
#include "narozeni.h"
vector<string> select_people(multimap<string, int> &people, int rok)
{
vector<string> vystup;
vector<string>::iterator t;
multimap<string, int> zoznam;
multimap<string, int>::iterator p;
t=vystup.begin();
for (p=people.begin(); p!=people.end(); ++p)
if (p->second == rok) vystup.insert(vystup.end(), p->first);
return vystup;
}
#include "narozeni.h"
//==========================MAIN================================================
int main(int argc,char *argv[])
{
int rok_nar;
string meno,priezvisko;
long rok;
multimap<string, int> zoznam;
multimap<string, int>::iterator p;
vector<string> vystup;
vector<string>::iterator t;
if(argc==2) // bol zadany 1 parameter // ========testovanie argumentu========
{
for(int i=0; argv[1][i]!='\0'; i++)
if (!isdigit(argv[1][i]))
{
cout << '\'' << argv[1] << '\'' << " nie je platny datum narodenia!!!\n";
return 1;
}
}
else
{
cout<<"Zadaj spravne parameter: <nazov programu> <rok>!"<<endl;
return 2;
};
rok=strtol(argv[1],NULL,10);
//========================nacitanie vstupu======================================
while(cin >>meno >> priezvisko >> rok_nar)
{zoznam.insert(make_pair(priezvisko+" "+meno,rok_nar));}
//==========================VYSTUP==============================================
vystup=select_people(zoznam,rok);
//vystup netreba triedit pretoze ho multimap+iterator uz utriedil
cout<<endl;
if (vystup.size()==0)
cout << "V roku "<<rok<<" sa nenarodil nikto"<<endl;
else
{cout<<"V roku "<<rok <<" boli narodeny:"<<endl;
for (t=vystup.begin(); t!=vystup.end(); ++t)
cout << *t <<endl;
}
return 0;
}