Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
ahoj prosím o radu, ve funkci main uživatel zadá slovo a jiná funkce hledá v souboru zda toto slovo existuje, pokud ano vypíše ho, pokud ne vypíš chybu a zeptá se zda chce uživatel slovo zadat znovu a pokud ano vyskočí znovu nabídka pro zadání slova, ale já nevím jak zase zpětně skočit do main, kde se zadává, pro pochopení uvedu příklad
find(string s)
{
/*nejake prikazy pro hledani slova v souboru*/
if (slovo je nalezeno)
{
vypis nalezeneho slova
}
else
{
cout << "slovo nenalezeno" << endl << "chcete hledat znovu? " << endl;
cin >> answer;
if (answer == "n")
exit(0);
else if (answer == "y")
A TADY BYCH PRAVE POTREBOVALA SKOCIT ZASE DO MAIN NA ZACATEK
}
}
main()
{
string slovo;
cout << "zadejte slovo" << endl;
cin >> slovo;
find(slovo);
}
Offline

Asi nejelegantneji tak, že funkce find bude typu bool nebo int, pokud uzivatel zada N na otazku zda hledat znovu, bude funkce mit s false nebo 0, pokud cokoli jineho (Y), tak funkce vrati true, 1 nebo cokoli jiného, si vymysli, ale doporucuji true nebo 1. No a v mainu testuj na stav promenne, pokud bude po funkci 0, program skonci, main vrati nulu (pokud vraci, ja ji psaval void), pokud ma promenna (třeba newTest) hodnotu true, pak se zavola funkce znovu (napadá mně teď goto a navesti hned za hlavicku main() ) jasne, nebo chces kousek kodu, jak to myslim?
#include <iostream>
using namespace std;
bool find(char s[50]); // taky piseme prototypy, i ve strasich verzich, s tim using namespace a pod. muzou byt potize, zalezi co mas za verzi compileru
int main(char argv[], int argc)
{
char slovo[50];
bool newFind = true;
while(newFind == true)
{
cout << "zadejte slovo" << endl;
cin >> slovo;
newFind = find(slovo);
}
return 0;
}
bool find (char s[50])
{
/*nejake prikazy pro hledani slova v souboru*/
if (slovo je nalezeno)
{
vypis nalezeneho slova
}
else
{
cout << "slovo nenalezeno" << endl << "chcete hledat znovu? " << endl;
cin >> answer;
if (answer == "n")
return(false);
else if (answer == "y")
return (true)
else cout << "Spatne zadana odpoved, koncim....\n";
}
}
Pouzivas cout a cin, takze pracujes s C++, pouzivam ty same vymozenosti, jako jsou prototypy funkci, misto string pouzivejme radeji char[], pripadne dynamicke prideleni, i kdyz v tomto pripad je s tim dost psani, atd. :) Pochopila?
Offline

Souhlasim, ovsem za danych okolnosti... i kdyz mas pravdu, ze do-while ma stejny efekt, a navic to vypada lip...Ja se do-while nikdy nenaucil poradne pouzivat :)
Offline

frank_horrigan napsal(a):
(idealne goto a navesti hned za hlavicku main() )
Pouzivas cout a cin, takze pracujes s C++, pouzivam ty same vymozenosti, jako jsou prototypy funkci, misto string pouzivejme radeji char[], pripadne dynamicke prideleni, i kdyz v tomto pripad je s tim dost psani, atd. :) Pochopila?
Nás teda učily goto vůbec nepoužívat - držím se toho, program je pak přehlednější a neříkej ideálně - používat goto není nejlepší volba.
A proč ne string? Tam alespoň nemusíš kontrolovat velikost.
Offline

Dobra, kluci, dobra :) sam jsem se goto take vyhybal, ale obcas se mi v kodu objevilo (bez nej by to nebylo uplne prehledny, priznavam, while nebo do-while udělá stejnou práci, ovsem to mne nenapadlo). Za slovo idealne se omlouvam, vim ze to idealni neni, byl to prvni napad, dalsi, jiny, byť lepší se mi vymýšlet pro dany problem v danou hodinu vymýšlet nechtělo.
Takže ok, na goto si dám majzla, a příslušný vzorek kódu přepíšu
Gladiator01: jde o to, ze jsem se nikdy s tridou string (nebo jak je to implemenotavny, myslim ze jako trida) nesetkal, pouze jsem o tom četl v učebnici, a nevím, jestli je dobré "střílet brabce bazukou", tedy na párřádkový kód zavádět zbytečnou string, když jde o jedno slovo. A myslim, ze 50 znaků ani nevezme moc paměti, a postihne 99,9% všech platných slov. Kdyz nechci hlidat velikost, hodim na to dynamické přidělení, porad jsou to dva radky navic, než string.. Jinak krom toho, že string neznam a nevyplati se na jeden řetezec jej zavadet nic nemam :)
Offline

↑ frank_horrigan:
A kde se to má naučit, když ne na takovýhto jednoduchých programech?
Stačí přilinkovat jednu knihovnu navíc a místo char* použít string, co je na tom těžkého? A krom toho jsem v C++ a jestli se nepletu zde se používá pro práci s řetězci string a char řetězec je na bázi C.
Offline
Ahoj nečítal som všetky príspevky(kvôli času), ale takýto problém sa dá riešiť veľa spôsobmi, napríklad aj takto...
void find()
{
string slovo;
char volba;
cout << "Zadejte slovo: " << endl;
cin >> slovo;
if (slovo je nalezeno) {
cout << slovo;
}
else {
cout << "Slovo nenalezeno." << endl << "Chcete hledat znovu ?" << endl;
cin >> volba;
switch(volba) {
case 'A' || 'a' :
find();
break;
case 'N' || 'n' :
break;
}
}
}
int main()
{
find();
}Offline
↑ hradecek: tohle řešení s rekurzí mi taky nepřijde zrovna šťastný
Offline
↑ Stýv:
Ja nehovorim ze rekurzia je najlepsie riesenie, ja hovorim ze je to jedno z rieseni...
Napríklad ďalšie možné riešenie:
#include <iostream>
#include <string>
using namespace std;
int main()
{
char volba;
do {
string s;
cout << "Zadaj hladane slovo: ";
cin >> s;
if(s == ..........) {
cout << s << endl;
break;
}
else {
cout << "Slovo nebolo najdene." << endl;
cout << "Hladat znovu ? A/N ";
cin >> volba;
system("CLS");
if(volba == 'A' || volba == 'a')
continue;
else
break;
}
} while(true);
return 0;
}takto sa dá vyhnúť príkazu GOTO...
Offline
Stránky: 1