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

[C++] Napisy w strukturach oraz działania na nich.

Ostatnio zmodyfikowano 2016-01-13 11:09
Autor Wiadomość
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ąć.
C/C++
struct czlowiek {
    char * imie;
    char * nazwisko;
}

Zainiciowałem struktury następująco, przy użyciu funkcji uzupełnij:
C/C++
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.
P-143381
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ę !!!)
C/C++
#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

C/C++
struct czlowiek {
    char * imie;
    char * nazwisko;
    char plec;
}
czlowiek uzupelnij( char * imie, char * nazwisko )
{
    czlowiek c;
    int rozmiarImie = strlen( imie ); // żeby dwa razy nie kręcić pętlą zmienna tymczasowa licząca rozmiar
    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
C/C++
#include <iostream>
#include<string>
using namespace std;

struct czlowiek {
    char * imie;
    char * nazwisko;
};
int main()
{
    czlowiek c1;
    c1.imie = "ala";
    cout << c1.imie << endl;
}
P-143382
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.
P-143404
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.
P-143408
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ę"
C/C++
#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;
}
P-143410
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.
P-143425
michal11
» 2016-01-13 00:56:07
Przekazuj strukturę przez wskaźnik
void fun( struct czlowiek * c );
P-143426
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

C/C++
#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;
}
P-143427
« 1 »
  Strona 1 z 1