Kordian Temat założony przez niniejszego użytkownika |
[C++] Napisy w strutkturach, funkcje. » 2016-01-16 23:12:27 Dobry wieczór wszystkim, nie mogę uporać się z pewnymi zagadnieniami odnośnie napisów. Oto problem: muszę napisać funkcję, która zaślubi dwie osoby, czyli przypisze jednej z nich nazwisko drugiej bądź przypisze drugiej nazwisko podwójne. Moje osoby są zdefiniowane w strukturze (i tak musi pozostać, nie dotykam klas.) w następujący sposób: struct czlowiek { char * imie; char * nazwisko };
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; }
int main() { czlowiek c1 = uzupelnij( "Anna", "Kowalska" ); czlowiek c2 = uzupellnij( "Jan", "Bracki" ); }
Moje pytanie: funkcja slub, którą mam napisać powinna przyjmować dwie zmienne typu czlowiek, jak to zapisać? Nie mogę chyba napisać void slub(czlowiek c, czlowiek c), prawda? |
|
Gibas11 |
» 2016-01-16 23:16:34 Nie, możesz za to void slub( czlowiek & kobieta, czlowiek & mezczyzna ) i operować na oryginałach obiektów. |
|
mateczek |
» 2016-01-17 05:22:16 jest "new" brak "delete". masz wyciek pamięci w tym programie. Pisanie takiego programu na wskaźnikach uważam za kiepską decyzję !!! ze wszystkim jest 2 razy więcej roboty !!! a i o wycieki pamięci łatwo!!! #include<iostream> #include<cstring> using namespace std;
struct czlowiek { char * imie = NULL; char * nazwisko = NULL; ~czlowiek() { } };
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; }
void slub( czlowiek & c1, czlowiek & c2 ) { int roz = strlen( c1.imie ); if(( c1.imie[ roz - 1 ] ) == 'a' ) { delete[] c1.nazwisko; c1.nazwisko = new char[ strlen( c2.nazwisko ) + 1 ]; strcpy( c1.nazwisko, c2.nazwisko ); } else { delete[] c2.nazwisko; c2.nazwisko = new char[ strlen( c1.nazwisko ) + 1 ]; strcpy( c2.nazwisko, c1.nazwisko ); } } int main() { czlowiek c1 = uzupelnij( "Anna", "Kowalska" ); czlowiek c2 = uzupelnij( "Jan", "Bracki" ); slub( c2, c1 ); cout << c1.imie << " " << c1.nazwisko << endl; delete[] c1.imie; delete[] c2.imie; delete[] c1.nazwisko; delete[] c2.nazwisko; return 0; } |
|
Kordian Temat założony przez niniejszego użytkownika |
» 2016-01-17 10:05:15 void slub( czlowiek & c1, czlowiek & c2 )
Ta funkcja przyjmuje jako argument konkretnych ludzi, nie mogę jej wywołać na innych ludziach, tak? Wpisanie w mainie slub(&c3,&c4) zadziała? |
|
Gibas11 |
» 2016-01-17 10:13:10 Zadziała, nazwy argumentów w funkcjach są niezwiązane z tymi podawanymi podczas wywołania, funkcja mogłaby przyjmować nawet czlowiek & abcd i czlowiek & efgh. |
|
Kordian Temat założony przez niniejszego użytkownika |
» 2016-01-17 10:57:53 Rozumiem, mógłbym prosić o sprawdzenie mojej funkcji, która powinna zwracać nazwisko dwuczłonowe? Tzn. pierwsza osoba przyjmuje podwójne nazwisko, coś mi nie działa. char * slub( czlowiek & c1, czlowiek & c2 ) { int i = 0, j = 0; char * nazwisko_slubne = new char[ strlen( c1.nazwisko ) + strlen( c2.nazwisko ) + 2 ]; strcpy( nazwisko_slubne, c1.nazwisko ); nazwisko_slubne[( strlen( c1.nazwisko ) ) + 1 == '-' ]; i = strlen( c1.nazwisko ) + 1; for( i; i < strlen( c1.nazwisko ) + strlen( c2.nazwisko ) + 2; i++ ) { nazwisko_slubne[ i ] = c2.nazwisko[ j ]; j++; } return nazwisko_slubne; }
Na razie nie zwalniam pamięci przydzielonej tablicy, bo dev świruje. |
|
mateczek |
» 2016-01-17 12:35:00 |
|
Kordian Temat założony przez niniejszego użytkownika |
» 2016-01-17 12:50:57 Wydaje mi się, że mój kod jest logiczny: najpierw przepisuje nazwisko1 do nowo stworzonej tablicy, potem wstawiam - między dwoma nazwiskami i od miejsca w którym stoi '-' +1 przpisuje drugie nazwisko, więc powinienem dostać c1.nazwisko-c2.nazwisko, a tak nie jest, dlaczego? Męczę się z tym juz drugą godzinę i nie wiem jak zmodyfikować kod. |
|
« 1 » 2 |