odkaz na string v C++ problem s programom

Programovacie jazyky, rady, poradňa...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

odkaz na string v C++ problem s programom

Príspevok od používateľa reDo »

mal som za ulohu z knihy vytvorit program ktory ma funkciu a ta premiena male an velke pismena pozite toto mam ale njkde to prelozit pomozete?

Kód: Vybrať všetko

#include <iostream>
#include <cstring>
#include <cctype>
#include <string>
using namespace std;

string & velke(string & zmena);
int main()
{
string slovo;
cout<<"Zadaj slovo alebo q:\n";
cin>>slovo;
velke(slovo);
cout<<slovo<<endl;
system("pause");
}
string & velke(string & zmena)
{
       int i=0;
       if(zmena!=toupper('q')){
       while(zmena[i]!='\0'){
       zmena[i]=toupper(zmena[i]);
       i++;
       }
       
       }
       
       return zmena;
}
                             
       
                              
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

no v prvom rade mas zle ukazatele

Kód: Vybrať všetko

velke(slovo); // posielas hodnotu stringu -> da sa ale ty chcs posielat ukazatel ;) 
a dalej mas

Kód: Vybrať všetko

string & velke(string & zmena) // tj vezme sa hodnota stringu potom sa pohlada v pamati co je na tom mieste a to sa ulozi do stringu (ak som to spravne pochopil ale jednoducho je to totalna blbost) 
:arrow: chyby su minimalne v tychto riadkoch. a je to treba nahradit

Kód: Vybrať všetko

velke(&slovo); // posielam adresu stringu
...
string * velke(string * zmena) // vytvori premenu kde ulozi adresu stringu ->tzn. dostanem ukazatel na string
dalej som to neskumal a divim sa preco ti prekladac nevyhodil kopu warningov, ked uz ti to islo prelozit

// este nechapem tejto podmienke:

Kód: Vybrať všetko

 if(zmena!=toupper('q')) 
co tym chcel autor povedat? inak retazce sa porovnavaju pomocou strcmp alebo v C++ string::compare()
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

no az an to posledne by mi vsetko islo lebo iba to oznacil prekladac za chyba inak nic ine a ta funkcia mus mat parameter odkaz na string to je tak v knihe a tiez vysvetlis mi to compare to este nwm :roll:
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

takze som si to skopcil ... a tu je result
k tomu prototypu fcie: sorry moze byt aj tak
dalej ti chyba return 0; v main funkcii
osobne by som tam tu podmienku nedaval..jednoducho to bude konvertovat male na velke a ked nezada nic tak to aj nic neskonvertuje a skonci

a porovnavanie retazcov sa robi pomocou funkcii...lebo inak to porovnava adresy tych retazcov v pamati a to vo vacsine pripadov nie je to iste...slovo "alfa" moze byt v pamati ulozene viacej krat.

porovnacie funkcie su dve:
strcmp - ceckovska fcia http://www.cplusplus.com/reference/clib ... ng/strcmp/ (nezabudni ze string nie je to iste ako char*)
compare - c++ metoda stringu http://www.cppreference.com/wiki/string/compare

inak odporucam zohnat nejaku knizku (najlepsie od Herouta - Učebnice jazyka C) najskor na c-cko a potom ist na c++
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

C som sa uz ucil a C++ sa ucim z Mistrovstvi v C++ to string viem ze je ine ako char ale da sa k nemu pristupovat aj takto no ak by ti to nevadilo mohol by si sem dat cely zdrojak o ktrom hovoris
:roll:
to return 0; to tam skoro ani nemusi byt

string ahoj;
ahoj;

//autoeditácia príspevku ( 23 Jun 2009, 19:58 )
mohol b ysi mi to compoaro vysvetlit a ukazat ho po lopate ??? pls moc soom z toho nepochpil :roll:
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

reDo napísal: to return 0; to tam skoro ani nemusi byt

string ahoj;
ahoj;

mohol b ysi mi to compoaro vysvetlit a ukazat ho po lopate ??? pls moc soom z toho nepochpil :roll:
ad return 0; : tak s takym programovanim sa na to mozes vykaslat :? ...prototyp vracia int tak treba vratit int,
ad string ahoj; ahoj; : som nepochopil co tym chcel autor povedat
ad compare: rozdiel medzi compare a strcmp je ten ze strcmp je funkcia zatial co compare je metoda triedy string. metody sa volaju tak ze sa za premennu danej triedy napise bodka alebo -> (sipka, ak ide o ukazatel na premennu). pouzitie napr.

Kód: Vybrať všetko

string str1 = "adam";
string str2 = "eva";
if (str1.compare(str2) == 0) {std::cout << "nieco je tragicky zle" << std::endl; } // ak 0 tak su rovnake (podla tabulky na tej stranke)
if ((string ("adam") ).compare(str1) == 0) {std::cout << "je to adam" << std::endl; } // pretypovanie lebo chceme metodu triedy string a retazce v zdrojaku su zatial vo vacsine prekladacoch ako const char *
if (str2.compare("eva") == 0) {std::cout << "je to eva" << std::endl; } // parameter moze byt aj char* nielen string (zase v ramiku na tej stranke)
tu je ten zdrojak:

Kód: Vybrať všetko

#include <iostream>
#include <cstring>
#include <cctype>
#include <string>
using namespace std;

string & velke(string & zmena);
int main()
{
string slovo;
cout<<"Zadaj slovo alebo q:\n";
cin>>slovo;
velke(slovo);
cout<<slovo<<endl;
system("pause");
return 1;
}

string & velke(string & zmena)
{
       int i=0;
       while(zmena[i]!='\0'){
       zmena[i]=toupper(zmena[i]);
       i++;
       }
       return zmena;
}
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Príspevok od používateľa bart11 »

tuti napísal:

Kód: Vybrať všetko

...
return 1;
}
... 
Len taká drobnosť, pokiaľ sa nemýlim. V tomto prípade to dôležité ani nieje, ale return 1, vo funkcii main, znamená, že program skončil s chybou.
reDo napísal: ... ale njkde to prelozit ...
Inak je vhodné si všímať čo vypisuje kompilátor!
A pokiaľ nevieš čo tá správa znamená a hľadáš pomoc na fórach, je vhodné uviesť aj chybovú správu od kompilátora.
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

return 1... :oops: drobna chybicka ...hore napisem dobre a do zdrojaku zle
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

dakujem za vuysvetlenie ale zabudol som an jednu vec :oops: ze ak je ten string ak oto slovo q/Q tak koniec :oops:
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Príspevok od používateľa bart11 »

Použi podmienku if() break. Inak, prečo máš návratovú hodnotu (odkaz) string, keď ju aj tak nepoužívaš. Bolo to v tej knihe tak napísané, že musíš to mať alebo pre neskoršie použitie? Ja by som použil void, ale to som ja.
1) A ešte, keď niekto napíše Q/q v slove (napr.: aqo), aj vtedy sa má ukončiť cyklus alebo len keď to bude samotný znak (čiže: q)?
2) V prípade, že chceš ukončiť cyklus aj pri výskyte znaku q v slove o n-znakoch, chceš aby sa vypísali aj ostatné písmena, alebo len tie, ktoré boli premenené na veľké? Napr:
vstup: ancqe
výstup: ANCQ // výpis len zmenených znakov
výstup2: ANCQe // výpis aj nezmenených znakov
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

bart11 napísal:Použi podmienku if() break. Inak, prečo máš návratovú hodnotu (odkaz) string, keď ju aj tak nepoužívaš. Bolo to v tej knihe tak napísané, že musíš to mať alebo pre neskoršie použitie? Ja by som použil void, ale to som ja.
1) A ešte, keď niekto napíše Q/q v slove (napr.: aqo), aj vtedy sa má ukončiť cyklus alebo len keď to bude samotný znak (čiže: q)?
2) V prípade, že chceš ukončiť cyklus aj pri výskyte znaku q v slove o n-znakoch, chceš aby sa vypísali aj ostatné písmena, alebo len tie, ktoré boli premenené na veľké? Napr:
vstup: ancqe
výstup: ANCQ // výpis len zmenených znakov
výstup2: ANCQe // výpis aj nezmenených znakov
no ja som to s tym q/Q tiez moc nepochopil...a hlavne mi prijde divne ze sa potom nebude dat retazec "q" previest na velke

s tomu preco vracat ten retazec naspat aj ked sa dalej nepouzije...dovod preco sa to tak robi a ja osobne to robim tiez je jednoduchy: mozes funkcie retazit a nepotrebujes pomocnu premennu napr:

Kód: Vybrať všetko

do {
cin>>slovo;  // nacitanie pokial nie je napisane exit (nezalezi na velkosti pismen)...
} while (velke(slovo).compare("EXIT") != 0)
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

vazne prepacte za tu navra. hodnotu odkazu som beginner sry a dakujem za to s tym q/Q a tym compare :)
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

tuti napísal:a dalej mas Kód:
string & velke(string & zmena) // tj vezme sa hodnota stringu potom sa pohlada v pamati co je na tom mieste a to sa ulozi do stringu (ak som to spravne pochopil ale jednoducho je to totalna blbost)
Zle si to pochopil. string & zmena totiz znamena referenciu na typ string, to znamena, ze po vyvolani fcie velke(slovo); posielas odkaz(referenciu), nie hodnotu.
Dalsia vec, stringy mozes porovnavat pomocou operatora ==, kedze je pretazeny, teda mozes if (zmena == "Q") je platny kod. Mozes teda takto porovnavat retazce, ale nie retazec a znak, preto nefungovalo if(zmena!=toupper('q')), lebo toupper() vracia znak.
A main() nemusi vraciat nulu.
Staci teda len zmenit if(zmena!=toupper('q')) na if(zmena!="q" && "Q") a bude sa to dat skompilovat.
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

neutronmind napísal:Zle si to pochopil. string & zmena totiz znamena referenciu na typ string, to znamena, ze po vyvolani fcie velke(slovo); posielas odkaz(referenciu), nie hodnotu.
som rad se si mi to osvetlil :) ja som zasadne robil ukazatele a potom som ich musel vo funkciach dereferencovat a to sa to tam potom hviezdickami a zatvorkami len tak hemzilo
neutronmind napísal: Dalsia vec, stringy mozes porovnavat pomocou operatora ==, kedze je pretazeny, teda mozes if (zmena == "Q") je platny kod. Mozes teda takto porovnavat retazce, ale nie retazec a znak, preto nefungovalo if(zmena!=toupper('q')), lebo toupper() vracia znak.
jop pretazovanie operatorov :oops: a clovek zvyknuty z cecka pouzije funkciu iked operator je lepsie citatelny ako funkcia
neutronmind napísal: Staci teda len zmenit if(zmena!=toupper('q')) na if(zmena!="q" && "Q") a bude sa to dat skompilovat.
skompilovat sice hej ale aby to robilo to co ma tak to musi byt if(zmena!="q" && zmena!="Q")

a este edit: toupper('q') je trosku kravina...staci napisat 'Q'
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Príspevok od používateľa reDo »

tuti dikes za vsetk oa neutromindovi etse raz velke vdaka za vysvetlenie :) :)
Napísať odpoveď