Kordian Temat założony przez niniejszego użytkownika |
[C++] Napisy w strukturach oraz działania na nich. » 2016-01-12 01:36:01 Witam, napotkałem kolejny problem na swojej drodze, którego nie jestem w stanie rozstrzygnąć. struct czlowiek { char * imie; char * nazwisko; }
Zainiciowałem struktury następująco, przy użyciu funkcji uzupełnij: czlowiek uzupelnij( char * imie, char * nazwisko ) { czlowiek c; c.imie = new char[ strlen( imie ) + 1 ]; c.nazwisko = new char[ strlen( nazwisko ) + 1 ]; strcpy( c.imie, imie ); strcpy( c.nazwisko, nazwisko ); return c; } main... czlowiek c1 = uzupelnij( "anna", "Bak" ); czlowiek c2 = uzupelnij( "Kuba", "Kowal" );
Teraz chciałbym napisać funckję, która sprawdzi, jakiej płci są moi ludzie tzn. gdy na ostatnim miejscu imienia występuje litera 'a', jest to kobieta, mężczyzna w przeciwnym przypadku.(Kuba jest jedynym wyjątkiem, nie bierzemy go pod uwagę). Pytanie brzmi: co powinna przyjmować moja funkcja plec jako argument? Muszę się odnieść do struktury w sposób c.imię czy raczej działać na wskaźniku? Nie wiem, które (o ile w ogóle) rozwiązanie jest dobre, proszę kogoś doświadczonego o jasne objaśnienie. |
|
mateczek |
» 2016-01-12 05:58:20 skompiluj sobie i zobacz jak działa !!! czy nie lepiej z char przejść na string ?? skoro używasz c++ (po temacie wnoszę !!!) #include <iostream> #include<string> using namespace std;
struct _czlowiek { enum _plec { kobieta = 'k', menzczyzna = 'm' }; string imie; string nazwisko; _plec plec; _czlowiek( string _imie, string _nazwisko ) { imie = _imie; nazwisko = _nazwisko; if( imie[ imie.size() - 1 ] == 'a' ) plec = kobieta; else plec = menzczyzna; } }; int main() { _czlowiek pracownik( "alina", "kowalska" ); cout <<( char ) pracownik.plec << endl; _czlowiek pracownik2( "piotr", "xinski" ); cout <<( char ) pracownik2.plec << endl; } wracając do twojego kodu można struct czlowiek { char * imie; char * nazwisko; char plec; } czlowiek uzupelnij( char * imie, char * nazwisko ) { czlowiek c; int rozmiarImie = strlen( imie ); c.imie = new char[ rozmiarImie + 1 ]; c.nazwisko = new char[ strlen( nazwisko ) + 1 ]; strcpy( c.imie, imie ); strcpy( c.nazwisko, nazwisko ); if( imie[ rozmiarIme ] == 'a' ) c.plec = 'k'; else c.plec = 'm'; return c; } zawsze lepiej użyć class zamiast struktury. powód jest prosty :) struktura ma domyślne składowe publiczne i nie ma jak zabezpieczyć się przed działaniem #include <iostream> #include<string> using namespace std;
struct czlowiek { char * imie; char * nazwisko; }; int main() { czlowiek c1; c1.imie = "ala"; cout << c1.imie << endl; }
|
|
notabigthreat |
» 2016-01-12 18:25:05 @UP: zawsze lepiej użyć class zamiast struktury. powód jest prosty :) struktura ma domyślne składowe publiczne i nie ma jak zabezpieczyć się przed działaniem
|
1) struct to jest klasa. 2) W struct można używać public , protected , private tak, jak w klasie definiowanej słowem kluczowym class . 3) Konwencją jest, by na górze klasy umieszczać składowe publiczne. Ze struct jest to domyślne. |
|
Kordian Temat założony przez niniejszego użytkownika |
» 2016-01-12 21:18:02 Nie wiem co to jest string, ani z czym to się je - nigdy się z tym nie zapoznywałem, tak samo z klasami. Chciałem tylko wiedzieć, co powinna przyjąć moja funkcja jako argument. |
|
mateczek |
» 2016-01-12 21:49:27 Jeśli rozwiązanie z dodatkowym polem "płeć" Ci nie leży. To funkcja jako argument może przyjąć samo "imię" bądź "osobę" #include <iostream> #include<cstring> using namespace std; char func( char imie[] ) { int rozmiar = strlen( imie ); if( imie[ rozmiar - 1 ] == 'a' ) return 'k'; else return 'm'; }
int main() { char * imie = "alicja"; cout << func( imie ) << endl; } |
|
Kordian Temat założony przez niniejszego użytkownika |
» 2016-01-13 00:41:41 Tylko wtedy jaka jest gwarancja, że funckja przyjmie imie akurat z mojej struktury człowiek? Mogę sobię przecież stworzyć inny napis imie w mainie. |
|
michal11 |
» 2016-01-13 00:56:07 Przekazuj strukturę przez wskaźnik void fun( struct czlowiek * c ); |
|
mateczek |
» 2016-01-13 11:09:15 Tylko wtedy jaka jest gwarancja, że funckja przyjmie imie akurat z mojej struktury człowiek? |
Dlatego Ci zaproponowałem użycie stringów i klas (domyślna ochrona składowych prywatnych) miast takiej struktury. Ponieważ taka struktura nie daje Ci żadnej gwarancji #include<iostream> #include<cstring>
struct czlowiek { char * imie; char * nazwisko; };
int main() { czlowiek c1; char napis[ 30 ] = "alicja"; c1.imie = napis; strcpy( napis, "wlazl kotek na plotek i mruga" ); std::cout << c1.imie << std::endl; }
|
|
« 1 » |