Nemůžu najít chybu - kód pro vstup – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nemůžu najít chybu - kód pro vstup – C / C++ – Fórum – Programujte.comNemůžu najít chybu - kód pro vstup – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
24. 8. 2008   #1
-
0
-

Učím se C++ s knihou "Mistrovství v C++", jsem u lekce 7 (Funkce) a dělám programátorská cvičení. Mám danou strukturu student, která má následující vlastnosti:

const int SLEN=20;

struct student
{
char fullname[SLEN];
char hobby[SLEN];
int ooplevel;
}

a mám udělat fci, která přebírá v argumentech ukazatel na pole těchto struktur a možnou délku, která do tohoto pole načte struktury a vrátí opravdovou (načtenou) velikost pole. Vstup (načítání struktur) se ve funkci ukončí buď, když je dosaženo maximální velikosti, nebo když uživatel místo jména dalšího žáka zadá pouze prázdný řádek. Napsal jsem tedy tento kód:
int getinfo(student pa[], int n)

{
char slovo[SLEN];
int i=0;
cout << "Jmeno studenta " << i+1 << ": ";
cin.getline(slovo,SLEN);
while (strcmp(slovo,"\n")&&(i<n))
{
strcpy(pa[i].fullname,slovo);
cout << "Hobby: ";
cin.getline(slovo,SLEN);
strcpy(pa[i].hobby,slovo);
cout << "Level OOP: ";
cin >> pa[i].ooplevel;
cin.get();
i++;
if (i<n)
{
cout << "\nJmeno studenta " << i << ": ";
cin.getline(slovo,SLEN);
}
}
return i;
}

Cyklus ale bohužel nefunguje vůbec jak má. Podmínka cyklu se jakoby vůbec nevyhodnocuje. Nevíte někdo, kde mám chybu?

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Reklama
Reklama
24. 8. 2008   #2
-
0
-

Ahá, už jsem to fixnul, nemůžu testovat

strcmp(slovo,"\n")

ale
strcmp(slovo,"")

je to zvláštní, vždyť cin.getline(); by mělo vzít (narozdíl od cin.get(slovo,SLEN)) i znak '\n', ne?

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
czbero0
Stálý člen
24. 8. 2008   #3
-
0
-

Proč by měl cin.getline brát \n? Stačí si přečíst název té metody - getline, ten snad hovoří za vše. Ale hlavně, že to máš vyřešeno (bez ironie :-))

Nahlásit jako SPAM
IP: 62.240.178.–
http://moddb.com/mods/police-brutality/
24. 8. 2008   #4
-
0
-

Ne, jen jsem to špatně pochopil z výkladu. Myslel jsem si, že cin.get(char[],int); přečte řádek (nebo počet znaků, podle toho, co se stane dřív) a znak enteru (tedy '\n') zanechá na vstupu (což také udělá) a cin.getline(char[],int); přečte (a zapíše do řetězce) vše, včetně znaku nového řádku. Což je pravda pouze způli, getline zřejmě znak nového řádku akorát zahodí, nezapíše.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
24. 8. 2008   #5
-
0
-

A vůbec, narozdíl od Pascalu mám se vstupem docela problém. C++ má sice tisíc různých způsobů čtení,

ch=cin.get(); //vrací znak, číslo 'zřejmě' převádí na znak, čte všechno, včetně '\n'

cin.get(ch); //čte jeden znak, ukládá do charu, číslo uloží jako znak, jak je to s EOL nevím
cin.get(neco,5); //čte do řetězce stylu jazyka C, buď do znaku EOL (a zanechá ho ve frontě), či po uvedenej počet
cin.getline(neco,5); // jako předchozí, ale znak EOL 'zřejmě' zruší, nezapíše (?)
getline(cin,str); //čte do stringů (řetězce stylu jazyka C++), EOL 'zřejmě' také zruší, nezapíše
cin >> i; //načítá do čehokoliv, přeskakuje bílé znaky, čte pouze po další bílý znak, ostatní nechá ve frontě

z toho by se jeden pomátl, stejně není nic nad
read(p); //nebo

readln(p);

a p může být string, integer či cokoliv jiného.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Ace McIntosh0
Super člen
24. 8. 2008   #6
-
0
-

To Garret Raziel : cin.getline() načítá vstup znak po znaku do té doby, než narazí na znak nového řádku (řekněme např '\n'), který pak nahradí nulovým znakem. Zato cin.get() jej ponechá ve vstupní frontě. To je celé kouzlo.

Jinak jako zarytý Pascalista můžu jen souhlasit s tím, že v Pascalu je to řešeno jednodušeji:-). Ale zase se s těmi řetězci nedají dělat takové kejkle, i to může někdy chybět.

Nahlásit jako SPAM
IP: 84.42.174.–
24. 8. 2008   #7
-
0
-

To Ace McIntosh : Je pravda, že třeba číselnej/znakovej vstup se v Pascalu kontroluje blbě, zatímco v C++ se dá ošetřit lehce, načíst do čehokoliv a pak akorát

if (cin.fail())

{
cin.clear();
string *s=new string;
getline(cin,s);
delete s;
}

a uživatel si může zadávat co chce.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Ace McIntosh0
Super člen
24. 8. 2008   #8
-
0
-

To Garret Raziel : No, to je právě to, že v Pascalu musíš mít předem definovaný datový typ a do něj pak ukládáš. I takováto "typová kontrola" se ale dá implementovat kličkováním (kód pak samozřejmě docela nabobtná, ale to se v Pascalu děje často:-) - já jsem na to zvyklý), ale záleží spíš na situaci, zda je to potřeba a kam by se data měla ukládat. V dnešní době, kdy je grafické rozhraní programů zcela běžnou záležitostí, se takovéto záležitosti dávají snadno odchytávat pomocí událostí (zlatý objektový přístup:-) ) a není to takový problém jako v konzolových aplikacích. Pro mě jednoznačně není důvod nezůstat u Delphi (samozřejmě zároveň při pěstování C++:-) ), zvlášť když jsem viděl nový featury ve VCL a nový komponenty, který bude mít Delphi 2009. Mňam:-D.

Nahlásit jako SPAM
IP: 84.42.174.–
24. 8. 2008   #9
-
0
-

Hm, taky trochu fušuju (fušování zatím znamená http://www.sourceforge.net/projects/volcano) do Delphi (možná proto, že Pascal docela umím). Povídej, linkuj, Turbo Delphi Explorer je naprostá bomba. Co bude v 2009 navíc?


Tak, co mě napadá z mého Pascalovského myšlení je načíst to do charu a pak kontrolovat, jestli je onen znak v rozmezí čísel. Pak buď odečíst od ord(ch) 48, nebo zahlásit špatný vstup.
//Je pravda, že věci jako třeba vstup vhodné hodnoty si Delphi ošetřují samy.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Ace McIntosh0
Super člen
24. 8. 2008   #10
-
0
-

Samozřejmě, ani já si nemůžu Turbo Delphi Explorer vynachválit, díky jeho licenci umožňující komerční využití (ne jako Personal verze ostatních Delphi, který maj navíc mnohem míň komponent a myslímže nemaj ty databázové). Tomu se říká Pohádka (snad jediný omezující faktor je nemožnost si přidávat vlastní komponenty, co ale na tom, když jich tam máš hafo integrovaných + můžeš linkovat knihovny a zdroje). Jinak Je to sice již starší produkt (Součást BDS 2006), ale dostačující (sice tam není tolik vytříbená podpora Win Vista, ale to je mi zatím srdečně jedno).

Před několika dny jsem našel něco o nadcházející verzi Delphi (codename "Tiburón"), dokonce jsem narazil na oficiální videa od CodeGearu, podle kterých určitě je na co se těšit. Prý má být inplemetováno veliké množství maličkostí, které programátorům ulehčí život (většinou se jedná o konstrukce známé z jiných jazyků, např. ukončení cyklu Exit s parametrem - návratovou hodnotou funkce, ve které se cyklus nachází, a mnoho dalších...). Také mě zaujaly nové komponenty a vylepšení těch stávajících (Edit, Button...) Videa to jsou tato, doporučuji zhlédnout od začátku až do konce:

Novinky v IDE Delphi a C++ Builder 2009
http://dn.codegear.com/article/38441

Novinky ve VCL:

http://dn.codegear.com/article/38383

Jediné čeho se bojím, že nebude nějaká free verze ekvivalentní k výbornému Turbo Delphi. Dá-li bůh, budu určitě minimálně já + tisíc a jeden programátor v Delphi velmi spokojen. A když nedá, tak holt zůstanu u Turba:-D. Kdoví jak to nakonec bude (CodeGear docela mlží).

------------------------------

Určitě je jedno z řešeních i ten ord(), stačí prostudovat ASCII tabulku a máš vyhráno (teda téměř - kód se sám nenapíše - ach jo:-) ). Ale možná že by nastal problém na systémech s jinou znakovou sadou (nejsem si jistý), takže by se muselo napsat víc způsobů (malicherný problém) s nějakou detekcí, pak by to jistě fungovalo spolehlivě.

Nahlásit jako SPAM
IP: 84.42.174.–
Ace McIntosh0
Super člen
24. 8. 2008   #11
-
0
-

To Garret Raziel : A hele, to je dobré, ten tvůj projekt Volcano se mi zamlouvá, určitě je to boost pro tvé programátorské schopnosti. Akorát mě trochu zarazilo, jak se můžeš vyznat v těch nepojmenovaných unitách:-D (ne že bych je já teda vždy pojmenovával...). A díky za tip na "fušárnu" Sourceforge.net, tohle mě nakoplo abych taky takhle fušoval do Delphi:-). Můj vlastní projekt už čeká na schválení:-D.

Open Source zdar!

Nahlásit jako SPAM
IP: 84.42.174.–
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, 72 hostů

Podobná vlákna

Nemuzu najit chybu — založil Franceq

Nemuzu najit chybu... — založil anonym

Nemuzu najit rozdil — založil Franceq

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ý