~~Ahoj, mám následující zadání:
~~Menza vaří 5 obědů denně, každé jídlo má svou cenu, ID, popis a energetickou hodnotu. V CSV souboru jsou uloženy jídelníčky pro dny v určitém období. Pro konkrétní obědy strávníka, určené v jiném CSV souboru způsobem datum, jídlo číslo X, zapište do výstupního souboru podle voleb z klávesnice pro zadané období:
přehled všech odebraných jídel, jejich kumulativní cenu a celkovou cenu a počet jídel,
energetickou hodnotu odebraných jídel jednotlivě, kumulativně a celkově a průměrnou energetickou hodnotu z odebraných jídel,
nejčastěji se opakující odebrané jídlo.
Berte v úvahu, že strávník nemusí odebrat stravu každý den. ID určuje jednoznacně o jaké jídlo se jedná, využijte toho při určení opakujících se jídel.
~~Poznámky:
jména vstupních a výstupních souboru musí být možno zadat v bežící aplikaci (nesmí být nemenitelne zadána jen ve zdrojovém kódu programu),
nepoužívejte diakritiku v názvech souborů,
odevzdávejte .zip archiv s požadovaným obsahem,
nevkládejte do odevzdávaného souboru balast (.obj/.pch/.pdb soubory a další soubory, které se ze zdrojových kódů vygenerují při překladu),
velikost odevzdávaného archinu nesmí překročit 7 MiB (delší soubor bude odmítnut).
Můj problém: Nevím si vůbec rady s vytvořením funkce na nejčastěji se opakující odebrané jídlo. Zde přikládům csv soubor s vytvořeným jídelníčkem a mými objednávkami a můj zdrojový kód:
CSV soubor Jídelníček:
1,"Spanelsky ptacek /hovezi, vejce, uzenina,okurek/, dusena ryze",41,215
2,"Perstynsky veprovy platek /uzenina,zampiony/, testovinova ryze",37,300
3,"Zapecene testoviny se spenatem a uzenym, okurek",37,250
4,"1ks varene vejce, fazolky na smetane, varene brambory",36,350
5,"Veprovy platek zapeceny s nivou a anglickou slaninou, smazene hranolky",51,500
6,"Kureci smes s bylinkovou omackou, testoviny",47,400
7,"Zapekane palacinky s tvarohem",39,450
8,"Soulet s hrachem a zeleninou, okurek",22,410
9,"Jizersky drak /hovezi,cesnek/, smazene hranolky",50,1000
10,"Veprove kostky po vidensku /cibule/, dusena ryze",35,600
11,"Uzene maso, krenová omacka, houskove knedliky",39,700
12,"Bramborory gulas s fazolovymi lusky, chleb Moskva",39,550
13,"Mamincino kure /testoviny,jatra,zampiony/",39,900
14,"Pekingske maso /veprove,zampiony,solamyl/, kari ryze",37,600
15,"Sekany veprovy rizek s celerem, mastene brambory",40,350
16,"Kynuty makovy zavin",33,200
17,"Hovezi varene /zadni/, duseny spenat, varene brambory",49,850
18,"Ohnive maso /veprove,leco,feferony/, spagety",36,1000
19,"Pecena krkovicka, strapacky se zelim",40,325
20,"Zampionova cina /zampiony,paprika,rajcata/, dusena ryze",30,450
CSV soubor Můj výběr:
1.12.2013,3
2.12.2013,5
4.12.2013,10
Zdrojový kód:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
using namespace std;
typedef struct
{
int id;
string nazev;
int cena;
int energie;
}jidlo;
typedef struct
{
string datum;
int id;
}objednani;
/** \brief Vypocet druhe mocniny
*
* \param n Cislo, ktere mocnime
* \return Mocnina cisla n
*
* Funkce pro vypocet druhe mocniny zadaneho cisla
*/
int mocnina(int n)
{
return n*n;
}
bool prevedeni(string a,int&b)
{
istringstream iss(a);
iss>>b;
return iss.good();
}
jidlo *nacitani(string nazev_souboru,int &velikost_pole)
{
ifstream soubor_jidel(nazev_souboru.c_str());
string obed;
int pozice=0;
for(velikost_pole=0;;velikost_pole++)
{
getline(soubor_jidel,obed);
if(soubor_jidel.eof())
{
break;
}
if(obed.length()==0)
{
cout<<"Nespravny vstup."<<endl;
}
}
jidlo *pole=new jidlo[velikost_pole];
soubor_jidel.clear();
soubor_jidel.seekg(ios_base::beg);
string jidlo1;
while(true)
{
getline(soubor_jidel,jidlo1);
if(soubor_jidel.eof())
{
break;
}
if(!soubor_jidel.bad())
{
int pos=jidlo1.find(',');
string str1=jidlo1.substr(0,pos);
int pos1=jidlo1.find('"')+1;
int pos2=jidlo1.find('"',pos1)-3;
string str2=jidlo1.substr(pos1,pos2);
int pos3=jidlo1.find(',',pos2);
int pos4=jidlo1.find(',',pos3)-pos2-1;
string str3=jidlo1.substr(pos3+1,pos4-1);
int pos5=jidlo1.find(',',pos3);
string str4=jidlo1.substr(pos5+4);
jidlo j;
prevedeni(str1,j.id);
j.nazev=str2;
prevedeni(str3,j.cena);
prevedeni(str4,j.energie);
pole[pozice]=j;
pozice++;
}
else
{
cout<<"Nespravny vstup."<<endl;
}
}
return pole;
}
objednani *nacitani1(string jmeno_souboru, int &velikost_pole1)
{
ifstream soubor_objednavek(jmeno_souboru.c_str());
string objednavka;
int pozice1=0;
for(velikost_pole1=0;;velikost_pole1++)
{
getline(soubor_objednavek,objednavka);
if(soubor_objednavek.eof())
{
break;
}
if(objednavka.length()==0)
{
cout<<"Nespravny vstup."<<endl;
}
}
objednani *pole1=new objednani[velikost_pole1];
soubor_objednavek.clear();
soubor_objednavek.seekg(ios_base::beg);
string chut;
while(true)
{
getline(soubor_objednavek,chut);
if(soubor_objednavek.eof())
{
break;
}
if(!soubor_objednavek.bad())
{
int poz1=chut.find(',');
string podretezec1=chut.substr(0,poz1);
string podretezec2=chut.substr(poz1+1);
objednani x;
x.datum=podretezec1;
prevedeni(podretezec2,x.id);
pole1[pozice1]=x;
pozice1++;
}
else
{
cout<<"Nespravny vstup."<<endl;
}
}
return pole1;
}
jidlo *sekvencni_vyhledavani(jidlo *pole,int velikost_pole,int id)
{
for(int i=0;i<velikost_pole;i++)
{
if(pole[i].id==id)
{
return &pole[i];
}
}
return NULL;
}
int cena(jidlo *jidelnicek,int pocet_jidelnicek, objednani *muj_vyber, int pocet_muj_vyber)
{
int celkova_cena=0;
for(int i=0;i<pocet_muj_vyber;i++)
{
celkova_cena+=sekvencni_vyhledavani(jidelnicek,pocet_jidelnicek,muj_vyber[i].id)->cena;
}
return celkova_cena;
}
int * kumul_cena(jidlo *jidelnicek,int pocet_jidelnicek,objednani *muj_vyber,int pocet_muj_vyber)
{
int kumulativ_cena=0;
int *pole_cen=new int[pocet_muj_vyber];
for(int i=0;i<pocet_muj_vyber;i++)
{
kumulativ_cena+=sekvencni_vyhledavani(jidelnicek,pocet_jidelnicek,muj_vyber[i].id)->cena;
pole_cen[i]=kumulativ_cena;
}
return pole_cen;
}
int * kumul_energie(jidlo*jidelnicek,int pocet_jidelnicek,objednani *muj_vyber,int pocet_muj_vyber)
{
int kumulativni_energie=0;
int *pole_energii=new int[pocet_muj_vyber];
for(int i=0;i<pocet_muj_vyber;i++)
{
kumulativni_energie+=sekvencni_vyhledavani(jidelnicek,pocet_jidelnicek,muj_vyber[i].id)->energie;
pole_energii[i]=kumulativni_energie;
}
return pole_energii;
}
int energie(jidlo *jidelnicek,int pocet_jidelnicek, objednani *muj_vyber, int pocet_muj_vyber)
{
int celkova_energie=0;
for(int i=0;i<pocet_muj_vyber;i++)
{
celkova_energie+=sekvencni_vyhledavani(jidelnicek,pocet_jidelnicek,muj_vyber[i].id)->energie;
}
return celkova_energie;
}
int prumerna_enrgie(jidlo *jidelnicek,int pocet_jidelnicek, objednani *muj_vyber, int pocet_muj_vyber)
{
return energie(jidelnicek,pocet_jidelnicek,muj_vyber,pocet_muj_vyber)/pocet_muj_vyber;
}
int prumerna_cena(jidlo *jidelnicek,int pocet_jidelnicek,objednani *muj_vyber,int pocet_muj_vyber)
{
return cena(jidelnicek,pocet_jidelnicek,muj_vyber,pocet_muj_vyber)/pocet_muj_vyber;
}
int main()
{
string menza;
cout<<"Zadej nazev jidelnicku:"<<endl;
cin>>menza;
int velikost_pole;
jidlo*jidelnicek=nacitani(menza,velikost_pole);
for(int i=0;i<velikost_pole;i++)
{
cout<<jidelnicek[i].nazev<<endl;
}
string menu;
cout<<"Zvol jidlo:"<<endl;
cin>>menu;
int velikost_pole1;
objednani*muj_vyber=nacitani1(menu,velikost_pole1);
int*kumulativni_ceny=kumul_cena(jidelnicek,velikost_pole,muj_vyber,velikost_pole1);
int*kumulativni_energie=kumul_energie(jidelnicek,velikost_pole,muj_vyber,velikost_pole1);
for(int i=0;i<velikost_pole1;i++)
{
cout<<muj_vyber[i].datum<<" "<<muj_vyber[i].id<<" "<<kumulativni_ceny[i]<<" "<<sekvencni_vyhledavani(jidelnicek,velikost_pole,muj_vyber[i].id)->energie<<" "<<kumulativni_energie[i]<<endl;
}
cout<<"Celkova cena: "<<cena(jidelnicek,velikost_pole,muj_vyber,velikost_pole1)<<endl;
cout<<"Prumerna cena: "<<prumerna_cena(jidelnicek,velikost_pole,muj_vyber,velikost_pole1)<<endl;
cout<<"Celkovy pocet jidel: "<<velikost_pole1<<endl;
cout<<"Celkova energie: "<<energie(jidelnicek,velikost_pole,muj_vyber,velikost_pole1)<<endl;
cout<<"Prumerna energeticka hodnota: "<<prumerna_enrgie(jidelnicek,velikost_pole,muj_vyber,velikost_pole1)<<endl;
delete [] jidelnicek;
delete [] muj_vyber;
return 0;
}