Van egy csinos kis érettségi feladat c++hoz. Tudnavalaki segíteni? Mit rontok el? :D
A feladat (Szakmai közép 2006 május 18 II. rész 3. feladat):
Egy vektorban különböző cégek napi tőzsdei záró árfolyama szerepel.
Készítsen programot az ön által ismert nyelven, mely megadja azt a céget, amelyik az adott
időszak folyamán a legnagyobb nyereséget érte el! Tekintse legnagyobb nyereségnek azt,
ahol az utolsó nap záróegyenlege és az első nap záróegyenlegének különbsége a legnagyobb.
A feladat megoldásához alkalmazzon programozási tételt!
Töltse fel a vektort az alábbi adatokkal!
CÉG 1. nap 2. nap 3. nap
Alfa Bt. 1500 1709 1839
Beta Kft. 3000 3291 3255
Gamma Rt. 1000 1279 1285
Delta Bt 14000 14208 14263
----------------------------------------
A kódom:
#include <iostream>
#include <vector>
using namespace std;
struct cegek{
string nev;
vector<int> szamok;
};
struct kulonbozet{
string ceg;
int ertek;
};
void beker(vector<cegek> &adatok);
void kulonbozetet_von(vector<cegek> adatok, vector<kulonbozet> &adat);
string max(vector<kulonbozet> adat);
int main(){
vector<cegek> adatok;
vector<kulonbozet> adat;
beker(adatok);
kulonbozetet_von(adatok,adat);
cout<<"A legnagyobb teljesitmenyt a "<<max(adat)<<" erte el."<<endl;
}
void beker(vector<cegek> &adatok){
int szam;
for(int i=0;i<4;i++){
adatok.push_back(cegek());
cout<<"Add meg a(z) "<<i+1<<". ceg nevet!"<<endl;
getline(cin,adatok[i].nev);
for(int j=0;j<3;j++){
cout<<"Add meg a(z) "<<j+1<<". adatot!"<<endl;
cin>>szam;
adatok[i].szamok.push_back(szam);
}
}
}
void kulonbozetet_von(vector<cegek> adatok, vector<kulonbozet> &adat){
for(int i=0;i<adatok.size();i++){
adat.push_back(kulonbozet());
adat[i].ceg=adatok[i].nev;
adat[i].ertek=adatok[i].szamok[adatok[i].szamok.size()-1]-adatok[i].szamok[0];
}
}
string max(vector<kulonbozet> adat){
int mini=adat[0].ertek;
for(int i=1;i<adat.size();i++){
if(adat[i].ertek<mini){
mini=i;
}
}
return adat[mini].ceg;
}
-----------------------------------
Nos így hivatalosan még nem tanultunk a struct-ról, de szerintem a feladatról lerí, hogy ezzel célszerű hozzáfogni. (Meg, amúgy is az érdekel, hogy mi lehet a gond.)
Hibaüzenet nincs.
A program ugyan lefut, de a bekérésnél az a gond, hogy ugyan az első cégnevet bekéri, de utána már csak a 3 adatot kéri be, a maradék 3 cégnevet átugorja (cout-al kiírja a cuccost, de nem eszi meg csak simán tovább lép).
A segítségért előre is köszi, ill. ha más hibát is észre vesztek/van megjegyzés azt is szívesen fogadom.
A hiba természetesen a beker() függvényben volt:
Itt a javított változat:
void beker(vector<cegek> &adatok)
{
for(int i=0;i<4;i++){
adatok.push_back(cegek());
cout<<"Add meg a(z) "<<i+1<<". ceg nevet!"<<endl;
getline(cin,adatok[i].nev);
for(int j=0;j<3;j++)
{
cout<<"Add meg a(z) "<<j+1<<". adatot!"<<endl;
string szam;
getline(cin,szam);
adatok[i].szamok.push_back(atoi(szam.c_str()));
}
}
}
Ez tuti jó, most fordítottam:)
Néhány megjegyzés:
-függvényprototípust személy szerint nem használnék ebben a programban.
-iktass be egy típusellenörzést is a bekérésbe. Ehhez az isnumeric függvény, vagy egy reguláris kifejezés is megteszi.
-én a feladatot objektummal csináltam volna, de ez lényegtelen igazából, utóbbi nem sokat változtatott volna a kódon, bár kicsit áttekinthetőbbé tenné
Nem akarok hülyének tűnni, de a tied csak annyiban más, hogy stringként kéri be a számot, majd azt átkonvertálja integerbe.
Az miért működik és az enyém miért nem mikor (ugyanazt?) simán int-be megkapja?
Én a getline-al stringet kapok be mindenképpen még akkor is ha nem string típusú változót deklarálok. Emiatt kel a konverzió, ami nem igazán c++-os, de a c++-osnál bár kemény 1 utasítás lenne félőnek tartottam, hogy az <sstring>-et nem fogod ismerni
Nálad annyi a baj, hogy nem sort olvastál be, hanem csak simán olvastál adatot.
A c++ valamennyire aszinkron, legalább is tapasztalataim szerint, biztos egy jobban értő megmondja-e hogy ez így van-e
Az aszinkronitás azt jelenti, hogy mindig azt hajtja végre előbb, legalább is ahogy láthattad a cin-él és a cout-nál amelyik kevesebb erőforrást igényel. Így a cin- végrehajtását azután időzítette a compiler, hogy a cout lefutott, ezért érdemesebb getline-t használni, amihez kellet a konverzió. Így nincs baj ezzel az időzítéssel szal a programod jó, csak erre is figyelni kell néha.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!