Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Napisy w strutkturach, funkcje.

Ostatnio zmodyfikowano 2016-01-17 17:51
Autor Wiadomość
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:
C/C++
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?
P-143613
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.
P-143614
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!!!

C/C++
#include<iostream>
#include<cstring>
using namespace std;

struct czlowiek {
    char * imie = NULL;
    char * nazwisko = NULL;
    ~czlowiek() {
        //delete[] imie;
        //imie=NULL;
        //delete[] nazwisko;
        //nazwisko =NULL;
    }
};

czlowiek uzupelnij( char * imie, char * nazwisko ) // to jest wogóle do bani !!! tworzysz obiekt tymczasowy dla którego rezerwujesz pamięć new
{
    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;
} //obiekt tymczasowy powinnien przestać istnieć // i nawet zwolnić pamięci nie można w destruktorze!!!!

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;
}
P-143618
Kordian
Temat założony przez niniejszego użytkownika
» 2016-01-17 10:05:15
C/C++
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?
P-143621
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.
P-143622
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.
C/C++
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.
P-143624
mateczek
» 2016-01-17 12:35:00
jak dla mnie problem będzie podobny !!!

http://cpp0x.pl/forum/temat/​?id=21964
P-143628
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.
P-143629
« 1 » 2
  Strona 1 z 2 Następna strona