Prečo mi nefunguje tento cyklus FOR – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Prečo mi nefunguje tento cyklus FOR – C / C++ – Fórum – Programujte.comPrečo mi nefunguje tento cyklus FOR – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Timeshifter0
Newbie
21. 7. 2009   #1
-
0
-

Takže, tu mám program (zo 7. lekcii):

#include <iostream>

using namespace std;
void upravapolozky (int cislopolozky);
void vypis (int pocetpoloziek);
struct katalog
{
char nazov[20];
float cenaEUR;
float cenaSK;
} polozka[40];
int main()
{
cout << "Vitajte v editore poloziek v katalogu!\nChcete pridat polozky? (A/N)";
char volba[2];
char maleano[] = "a";
char velkeano[] = "A";
int cislo = 0;
cin.get(volba, 2);
cin.get();
while ((volba[0] == maleano[0])||(volba[0] == velkeano[0]))
{
++cislo;
upravapolozky(cislo);
cout << "Chcete zadat dalsiu polozku? (A/N) ";
cin.get(volba, 2);
cin.get();
}
vypis (cislo);
cin.get();
cin.get();
return 0;

}
void upravapolozky (int cislopolozky)
{
cout.precision(15);
cout << "Zadajte nazov polozky: ";
cin.get(polozka[cislopolozky].nazov, 19);
cin.get();
cout << endl << "Zadajte cenu polozky v mene EURO: ";
cin >> polozka[cislopolozky].cenaEUR;
cin.get();
polozka[cislopolozky].cenaSK = polozka[cislopolozky].cenaEUR * 30,126;
}
void vypis (int pocetpoloziek)
{
cout.precision(2);
if (pocetpoloziek = 0)
cout << endl << "\t\t\tKatalog je prazdny! Program je ukonceny.";
else
{
cout << "Cislo\t--\tNazov\t--\t--\tCena EURO\t--\tCena SKK" << endl;
int i = 0;
for (int i = 0;i<pocetpoloziek;++i) //TUTO MI TO ROBÍ PROBLÉMY!!!
{
cout << i+1 << "\t\t" << polozka[i+1].nazov << "\t\t" << polozka[i+1].cenaEUR << "\t\t" << polozka[i+1].cenaSK << endl;
}
cout << "Koniec vypisu. Chcete niektoru polozku zmenit? (A/N)";
char volbaedit[2];
char maleano[] = "a";
char velkeano[] = "A";
cin.get(volbaedit, 2);
cin.get();
if ((volbaedit[0] == maleano[0])||(volbaedit[0] == velkeano[0]))
{
cout << "Zadajte cislo polozky: ";
int cisloupravy;
cin >> cisloupravy;
cin.get();
upravapolozky(cisloupravy);
cout << "Upraveny katalog:" << endl;
vypis(pocetpoloziek);
}
else cout << "Program skoncil.";
}
}

Výpis mi nefunguje, pretože mi nechce stanoviť hodnotu i na 0... Namiesto toho má hodnotu -858993460. Co mám zle? Pomôžte mi, prosím...

Nahlásit jako SPAM
IP: 85.135.152.–
Reklama
Reklama
ondra.holub+1
Stálý člen
21. 7. 2009   #2
-
0
-

- Na řádku 43 je špatně nspsané číslo - má tam být desetinná tečka, ne čárka.
- Na řádku 48 se neporovnává pocetpolozek s nulou, ale přiřazuje se nula do pocetpolozek (chybí tam jedno rovnítko). Takže pocetpolozek se vynuluje, výsledek je nula, podmínka tedy není splněna a přejde se do else větve.
- Řádek 53 je zbytečný

Nahlásit jako SPAM
IP: 194.138.12.–
Timeshifter0
Newbie
21. 7. 2009   #3
-
0
-

Aha, díki moc, už si len znormalizujem výstup a vstup a bude to OK. Akým príkazom sa dá vypísať formátovať výpis reálneho čísla? Teda, počet platných číslic, zaokrúhlenie a tak...

Nahlásit jako SPAM
IP: 85.135.152.–
ondra.holub
~ Anonymní uživatel
253 příspěvků
21. 7. 2009   #4
-
0
-

Zkus si pohrát s tímto příkladem a bude to jasné:

#include <iostream>

#include <iomanip>

int main()
{
const double d = 123456.789;

std::cout << std::fixed << std::setw(20) << std::setprecision(12) << d << '\n';
std::cout << std::scientific << std::setw(20) << std::setprecision(12) << d << '\n';
}

Nahlásit jako SPAM
IP: 194.138.12.–
Timeshifter0
Newbie
22. 7. 2009   #5
-
0
-

Aha, takže na klasické vypisovanie čísel (pre človeka zrozumitelné) musím ísť teda cez fixed. Šírku vyhradenú pre číslo si nastavím cez setw a počet desatinných pomocou setprecision. Diki moc!

Nahlásit jako SPAM
IP: 85.135.154.–
milan_m0
Newbie
23. 7. 2009   #6
-
0
-

riadok 22,23:
++cislo;
upravapolozky(cislo);
mozes veselo napisat ako jeden riadok upravapolozky(++cislo); pozri si co je post-inkrementacia a pre-inkrementacia

riadok 48:
if (pocetpoloziek = 0)//tu ti priradi do pocetpoloziek nulu a vyhodnoti to cele ako nulu pretoze vysledok tej operacie je nula cize vysledok podmienky je nepravda.
nahrad to za if (pocetpoloziek == 0)// takto porovnas obsah tej premennej s nulou

riadok 53: vymaz pretoze v riadku 54 robis to iste znova(deklarujes premennu i a inicializujes ju na 0)
riadok 54:
for (int i = 0;i<pocetpoloziek;++i) //TUTO MI TO ROBÍ PROBLÉMY!!!
for (int i = 0;i<pocetpoloziek;i++) //v sumare je to to iste ale radsej si zvykni pouzivat toto


riadok 56:
cout << i+1 << "\t\t" << polozka[i+1].nazov << "\t\t" << polozka[i+1].cenaEUR << "\t\t" << polozka[i+1].cenaSK << endl;
by mal vyzerat
cout << i+1 << "\t\t" << polozka[i].nazov << "\t\t" << polozka[i].cenaEUR << "\t\t" << polozka[i].cenaSK << endl;
pretoze pole indexujes od nuly

... a hraj sa stym a skusaj:)

Nahlásit jako SPAM
IP: 91.127.37.–
ondra.holub
~ Anonymní uživatel
253 příspěvků
23. 7. 2009   #7
-
0
-

To milan_m :
> for (int i = 0;i<pocetpoloziek;++i) //TUTO MI TO ROBÍ PROBLÉMY!!!
> for (int i = 0;i<pocetpoloziek;i++) //v sumare je to to iste ale radsej si zvykni pouzivat toto

V čem je i++ lepší než ++i? U základních typů je to jedno a u iterátorů je právě naopak lepší ++i, protože se nemusí dělat kopie objektu.

Nahlásit jako SPAM
IP: 194.138.12.–
Bald3rr0
Super člen
23. 7. 2009   #8
-
0
-

To ondra.holub : rozdíl mezi preinkrementací a postinkrementací je ten, že preinkrementace nejprve k proměnné přičte 1 a vrátí hodnotu a postinkrementace vrátí hodnotu a až poté přičte 1. Můžeš si to zkusit na následujícím příkladě:

int x = 5;

int y = 5;
cout << "++x = " << ++x; // Vypíše 6
cout << "\ny++ = " << y++; // Vypíše 5
// pořád platí, že x == y (x == 6; y == 6)

Nahlásit jako SPAM
IP: 82.100.0.–
ondra.holub
~ Anonymní uživatel
253 příspěvků
23. 7. 2009   #9
-
0
-

To Bald3rr :
No to já vím, jaký je v tom rozdíl. Měl jsem na mysli právě ten for cyklus:
> for (int i = 0;i<pocetpoloziek;++i) //TUTO MI TO ROBÍ PROBLÉMY!!!
> for (int i = 0;i<pocetpoloziek;i++) //v sumare je to to iste ale radsej si zvykni pouzivat toto
Tam je to (jak jsem psal) pro základní typy (jako int apod.) jedno, ale pokud se jedná např. o iterátor, tak je právě chyba preferovat postinkrementaci (jak někdo psal ve výše citovaném doporučení).

Takže abych shrnul co jsem tím myslel: pokud je významově jedno, která varianta se použije, je lepší si zvyknout na prefixovou variantu, protože někdy může být efektivnější a nikdy není horší.

Nahlásit jako SPAM
IP: 194.138.12.–
milan_m0
Newbie
23. 7. 2009   #10
-
0
-

to ondra.holub: sorry tak s tou pre inkrementaciou mas asi pravdu:), mne len zo zvyku pride postinkrementacia taka prirodzenejsia, pretoze to tak pisem stale a prislo mi to uz ako gramaticka ked vydis niekde ypsilon tam kde nema byt. tipujem ,ze ty ked pises takyto jednoduchy cyklus asi tiez davas postinkrementaciu a nelamentujes nad tym:) ale ber to tak ze som nic nepovedal.
a diky za poucenie asi dam na teba a zvyknem si na preinkrementaciu

Nahlásit jako SPAM
IP: 91.127.37.–
m->29+6
Super člen
23. 7. 2009   #11
-
0
-

while ((volba[0] == maleano[0])||(volba[0] == velkeano[0]))  {

++cislo;
upravapolozky(cislo);
...
Toto by nemalo byť naopak?
while ((volba[0] == maleano[0])||(volba[0] == velkeano[0]))  {

upravapolozky(cislo);
++cislo;
...
Pretože ako som si tak letmo všimol tak to číslo predávané funkcii potom v tej funkcii používaš ako index poľa a to sa indexuje od nuly. Ty ho ale začínaš plniť od 1. Preto potom musíš upravovať aj výpis i+1.
Potom tam ešte dosť nechápem prečo maleano[2], resp. velkeano[2] keď to môžu byť chary a volať to môžeš takto:
char volba;

cin.get(volba).get();
while (volba == 'a' || volba == 'A')...

Nahlásit jako SPAM
IP: 213.151.218.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 118 hostů

Podobná vlákna

Prečo mi tento zdroj nefunguje? — založil Timeshifter

Proc nefunguje tento kod — založil kucape2

Nefunguje cyklus — založil sedlons

Prečo sa to vypína? — založil delphak

Výnimky. Kedy a prečo? — založil thomas

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý