CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wskazniki i iteracje ze stringami

Wskazniki i iteracje ze stringami

dział ogólny

Wskazniki i iteracje ze stringami

Nowy postprzez rogal180 » piątek, 7 października 2011, 18:04

Witam , chciałem nauczyć się programować obiektowo w c++. Pisząc program pomieszałem coś i się pogubiłem .Chciałbym aby w metodzie imie_osoby po kolei pytał o imię dla danego "1" i "0" . Wykonuje tylko dla pierwszego , potem od razu kończy program . W ogóle mam problem z tymi wskaźnikami - wyświetla się ich adres zamiast wartości . Jest to program konsolowy . Może ktoś ma pomysł jak rozwiązać problem . Z góry dziękuję .
Pozdrawiam

KOD cpp:     UKRYJ  
#include "stdafx.h"
#include <iostream>
using namespace std;

class Czlowiek
{
protected:
        int *p;
public:
     int losuj_osoby(int dlugosc,int *p)
     {
      p = new int [dlugosc];

         for(int i=0;i<dlugosc;i++)
        {
            p[i] = rand() % 2;
        }

        for(int i=0;i<dlugosc;i++)
        {
            cout << p[i] << endl;
        }
        cout << endl << endl;
        return *p;
     }
};

class Student : public Czlowiek
{
protected:
    int *wiek;
    string *imie;
public:
    int wiek_osoby(int dlugosc, int *p)
    {
        wiek = new int [dlugosc];

        for(int i=0;i<dlugosc;i++)
        {                    
            cout << endl;
            cout << *(p++) << " podaj wiek : ";
            cin >> wiek[i];
        }
        for(int i=0;i<dlugosc;i++)
        {                    
            cout << endl << p[i] <<" Masz " << wiek[i] << " lat ";
            cout << endl;
        }
    return *wiek;
    }

        int imie_osoby(int dlugosc,int *p)
        {
                imie = new string [dlugosc];

                for(int i=0;i<dlugosc;i++)
                {
                        cout << endl << p[i] << " Podaj imie : ";
                        cin >> imie[i];
                        getchar();
                }
        return *imie;
        }
             
};


int _tmain(int argc, _TCHAR* argv[])
{
    int *p,dlugosc;  

    Czlowiek osoba1;
    Student student1;

    cout << " Podaj dlugosc kolejki : ";
    cin >> dlugosc;

    p = new int [dlugosc];

    osoba1.losuj_osoby(dlugosc,p);
    student1.wiek_osoby(dlugosc,p);
    student1.imie_osoby(dlugosc,p);

    cout << endl << endl;
    delete[] p;
    system("PAUSE");
    return 0;
}
 
Avatar użytkownika
rogal180
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): wtorek, 12 kwietnia 2011, 23:43
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 7
OpenSuse
Kompilator: Dev C++
Visual Studio 2010 Pro
Gadu Gadu: 0
    Windows 7Firefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez polymorphism » piątek, 7 października 2011, 20:13

KOD cpp:     UKRYJ  
int losuj_osoby(int dlugosc,int *p)
{
        p = new int [dlugosc]; // zdecyduj się, o które 'p' Ci chodzi. To z parametru, czy to, które jest polem klasy.

        ...
       
        return *p; //<--- po co to?
}


KOD cpp:     UKRYJ  
int imie_osoby(int dlugosc,int *p)
{
        ...

        for(int i=0;i<dlugosc;i++)
        {
                ...
                getchar(); //<--- po co to?
        }
       
        return *imie; //<--- wtf?!
}


KOD cpp:     UKRYJ  
int wiek_osoby(int dlugosc, int *p)
{

        for(...)
        {                    
                ...
                cout << *(p++) << " podaj wiek : ";
                ...
        }
       
        for(...)
        {                    
                cout << endl << p[i] << ...; //<--- bład, 'p' wksazuje na koniec tablicy (patrz pętla wyżej)
                ...
        }
       
        return *wiek; //<--- po co?
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
rogal180
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez rogal180 » piątek, 7 października 2011, 22:17

Oki , problem wskaźników rozwiązany , tylko jeszcze ten ciąg z imieniem . Raz wczyta i koniec .
KOD cpp:     UKRYJ  
#include "stdafx.h"
#include <iostream>
using namespace std;

class Czlowiek
{
protected:
        int *p;
public:
     void losuj_osoby(int dlugosc,int *p)
     {
         for(int i=0;i<dlugosc;i++)
        {
            p[i] = rand() % 2;
        }

        for(int i=0;i<dlugosc;i++)
        {
            cout << p[i] << endl;
        }
        cout << endl << endl;
     }
};

class Student : public Czlowiek
{
protected:
    int *wiek;
        string *imie;
public:
    void wiek_osoby(int dlugosc, int *p)
    {
        wiek = new int [dlugosc];

        for(int i=0;i<dlugosc;i++)
        {                    
            cout << endl;
            cout << p[i] << " podaj wiek : ";
            cin >> wiek[i];
        }
        for(int i=0;i<dlugosc;i++)
        {                    
            cout << endl << p[i] <<" Masz " << wiek[i] << " lat ";
            cout << endl;
        }
    }

        void imie_osoby(int dlugosc,int *p)
        {
                imie = new string [dlugosc];

                for(int i=0;i<dlugosc;i++)
                {
                        cout << endl << p[i] << " Podaj imie : ";
//                      cin >> imie[i];
                }
        }
             
};


int _tmain(int argc, _TCHAR* argv[])
{
    int *p,dlugosc;  
    Czlowiek osoba1;
    Student student1;
        cout << " Podaj dlugosc kolejki : ";
    cin >> dlugosc;
    p = new int [dlugosc];
    osoba1.losuj_osoby(dlugosc,p);
    student1.wiek_osoby(dlugosc,p);
        student1.imie_osoby(dlugosc,p);

    cout << endl << endl;
    delete[] p;
    system("PAUSE");
    return 0;
}
 
Avatar użytkownika
rogal180
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): wtorek, 12 kwietnia 2011, 23:43
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 7
OpenSuse
Kompilator: Dev C++
Visual Studio 2010 Pro
Gadu Gadu: 0
    Windows 7Firefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez polymorphism » sobota, 8 października 2011, 10:30

Nie rozumiem, jak raz wczyta i koniec? Jeśli strumień cin nie wejdzie w stan błędu, co w przypadku czytania do stringa jest dość mało prawdopodobne, powinien odczytać dlugosc słów ze strumienia. Nie ma innej opcji.




Mała uwaga na przyszłość:
KOD cpp:     UKRYJ  
for(int i=0;i<dlugosc;i++)
{
        cout << endl << p[i] << " Podaj imie : ";//    cin >> imie[i];                        <---- !!!
}

Jak wklejasz kod, to wklejaj go w formie, która u Ciebie działa lub powinna działać. Ten fragment niczego nie wczytuje!
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez rogal180 » sobota, 8 października 2011, 11:48

Przez tą właśnie tą linijkę w komentarzu , kod nie chce się kompilować .Teraz w przesłanym kodzie znajduje się , wyjście błędów .


1>c:\zadanie_1\zadanie\zadanie\zadanie.cpp(55): error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)
1> c:\program files\microsoft visual studio 10.0\vc\include\istream(1053): could be 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &&,signed char *)'



Hmm...
Z ciekawości wrzuciłem kod do Deva C++ i działa bez problemu . A w VS nie . Może jakaś dodatkowa biblioteka potrzeba jest w VS ?

OK. Dodałem #include <string> i działa również w VS . Dzięki za pomoc .
Avatar użytkownika
rogal180
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): wtorek, 12 kwietnia 2011, 23:43
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 7
OpenSuse
Kompilator: Dev C++
Visual Studio 2010 Pro
Gadu Gadu: 0
    Windows 7Firefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez rogal180 » sobota, 8 października 2011, 19:45

Tym razem chciałem utworzyć konstruktor i destruktor dla klasy Czlowiek ,

KOD cpp:     UKRYJ  
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class Czlowiek
{
private:
        int *p;
        int dlugosc;
public:
         Czlowiek(int*,int);
         ~Czlowiek();
         void losuj_osoby(int dlugosc, int *p);
};

class Student : public Czlowiek
{
private:
        int *wiek;
        string *imie;
public:
        void wiek_osoby(int dlugosc, int *p);
        void imie_osoby(int dlugosc, int *p);            
};

Czlowiek:: Czlowiek(int *s,int nazwa)
{
        p = new int[strlen ( s ) + 1];
        strcpy(p, s);
        dlugosc = nazwa;

        cout << " Konstruktor klasy Czlowiek " << endl;
}

Czlowiek:: ~ Czlowiek()
{
        delete[] p;
        delete osoba1;

        cout << " Wywolano destruktor" << endl;
}

void Czlowiek::losuj_osoby(int dlugosc,int *p)
     {
         for(int i=0;i<dlugosc;i++)
        {
            p[i] = rand() % 2;
        }

        for(int i=0;i<dlugosc;i++)
        {
            cout << p[i] << endl;
        }
        cout << endl << endl;
     }

 void Student::wiek_osoby(int dlugosc, int *p)
    {
        wiek = new int [dlugosc];

        for(int i=0;i<dlugosc;i++)
        {                    
            cout << endl;
            cout << p[i] << " podaj wiek : ";
            cin >> wiek[i];
        }
        for(int i=0;i<dlugosc;i++)
        {                    
            cout << endl << p[i] <<" Masz " << wiek[i] << " lat ";
            cout << endl;
        }
    }

void Student::imie_osoby(int dlugosc,int *p)
        {
                imie = new string [dlugosc];

                for(int i=0;i<dlugosc;i++)
                {
                        cout << endl << p[i] << " Podaj imie : ";
                        cin >> imie[i];
                }

        for(int i=0;i<dlugosc;i++)
                {
                        cout << endl << p[i] << " Witaj , " << imie[i] << " !!! ";
                }
        }


int _tmain(int argc, _TCHAR* argv[])
{
    int *p,dlugosc;  

    Czlowiek osoba1;
    Student student1;

    cout << " Podaj dlugosc kolejki : ";
    cin >> dlugosc;

    osoba1.losuj_osoby(dlugosc,p);
    student1.wiek_osoby(dlugosc,p);
    student1.imie_osoby(dlugosc,p);

    cout << endl << endl;

    system("PAUSE");
    return 0;
}
 


ale oczywiście kompilator krzyczy :


1>c:\studia\semestr iii\programowanie obiektowe\zadanie_domowe_1\zadanie_domowe\zadanie_domowe\zadanie_domowe.cpp(29): error C2664: 'strlen' : cannot convert parameter 1 from 'int *' to 'const char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\studia\semestr iii\programowanie obiektowe\zadanie_domowe_1\zadanie_domowe\zadanie_domowe\zadanie_domowe.cpp(30): error C2664: 'strcpy' : cannot convert parameter 1 from 'int *' to 'char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\studia\semestr iii\programowanie obiektowe\zadanie_domowe_1\zadanie_domowe\zadanie_domowe\zadanie_domowe.cpp(39): error C2065: 'osoba1' : undeclared identifier
1>c:\studia\semestr iii\programowanie obiektowe\zadanie_domowe_1\zadanie_domowe\zadanie_domowe\zadanie_domowe.cpp(39): error C2541: 'delete' : cannot delete objects that are not pointers
1>c:\studia\semestr iii\programowanie obiektowe\zadanie_domowe_1\zadanie_domowe\zadanie_domowe\zadanie_domowe.cpp(96): error C2512: 'Czlowiek' : no appropriate default constructor available
1>c:\studia\semestr iii\programowanie obiektowe\zadanie_domowe_1\zadanie_domowe\zadanie_domowe\zadanie_domowe.cpp(97): error C2512: 'Student' : no appropriate default constructor available

Avatar użytkownika
rogal180
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): wtorek, 12 kwietnia 2011, 23:43
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 7
OpenSuse
Kompilator: Dev C++
Visual Studio 2010 Pro
Gadu Gadu: 0
    Windows 7Firefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez polymorphism » sobota, 8 października 2011, 19:57

KOD cpp:     UKRYJ  
Czlowiek:: Czlowiek(int *s,int nazwa)
{
        p = new int[strlen ( s ) + 1];
        strcpy(p, s);
        ...

strlen i strcpy to funkcje do obsługi łańcuchów znakowych. s nie wskaźnikiem na łańcuch znakowy, jest wskaźnikiem na liczbę/liczby typu int. Kompilator wytknął Ci tą niezgodność typów w pierwszym błędzie.

Do kopiowania bloków pamięci masz funkcję memcpy.


error C2512: 'Czlowiek' : no appropriate default constructor available


Zdefiniowanie jakiegokolwiek konstruktora parametrycznego powoduje, że domyślny konstruktor znika, dlatego musisz go zdefiniować w sposób jawny, jeśli oczywiście jest to konieczne. A w tym przypadku jest...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez rogal180 » niedziela, 9 października 2011, 00:13

Prosty program z konstruktorem i destruktorem ale nie działa . Nie wiem dlaczego .

KOD cpp:     UKRYJ  
#include "stdafx.h"
#include <iostream>
using namespace std;

class Prostokat
{
private:
        int *szerokosc, *wysokosc;
public:
        Prostokat(int, int);
        ~Prostokat();
        int area();
};

int Prostokat::area()
{
        return (*szerokosc * *wysokosc);
}

Prostokat::Prostokat(int a, int b)
{
        szerokosc = new int;
        wysokosc = new int;
        *szerokosc = a;
        *wysokosc = b;
}

Prostokat::~Prostokat()
{
        delete szerokosc;
        delete wysokosc;
}


int main()
{
        Prostokat figura;
        figura.area();

        system("Pause");
        return 0;
}


 
Avatar użytkownika
rogal180
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): wtorek, 12 kwietnia 2011, 23:43
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 7
OpenSuse
Kompilator: Dev C++
Visual Studio 2010 Pro
Gadu Gadu: 0
    Windows 7Firefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez polymorphism » niedziela, 9 października 2011, 10:42

No przecież napisałem dlaczego to nie działa! Musisz zdefiniować konstruktor bezparametrowy, ewentualnie podać parametry przy tworzeniu obiektu figura. Zajrzyj do książek.

KOD cpp:     UKRYJ  
szerokosc = new int;
wysokosc = new int;

Po jakiego grzyba szerokosc i wysokosc tworzysz na stercie?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez rogal180 » niedziela, 9 października 2011, 10:57

Mam książkę Symfonie , ale tam są tylko proste przykłady konstruktorów . Możesz pokazać mi jakiś przykład ?
Avatar użytkownika
rogal180
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): wtorek, 12 kwietnia 2011, 23:43
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 7
OpenSuse
Kompilator: Dev C++
Visual Studio 2010 Pro
Gadu Gadu: 0
    Windows 7Firefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez polymorphism » niedziela, 9 października 2011, 12:01

Chyba żartujesz. Przecież Twój problem jest banalny i nie wymaga jakiejś specjalistycznej wiedzy. Zresztą nie wierzę, żeby w Symfonii nie było omówienia konstruktorów, ich rodzajów, włącznie z przykładowymi kodami. Przecież to jedna z najpopularniejszych książek do nauki C++ w Polsce. Po prostu trzeba przysiąść i zrozumieć.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wskazniki i iteracje ze stringami

Nowy postprzez Cyfrowy Baron » niedziela, 9 października 2011, 13:19

Wtrącę się na chwilę. Konstruktor to też funkcja, a jeżeli funkcja oczekuje argumentów, to czy możesz wywołać funkcję nie przekazując jej argumentów - NIE!
Tutaj jest podobnie. Utworzyłeś konstruktor klasy z argumentami, więc tworząc obiekt w oparciu o tą klasę musisz przekazać do konstruktora argumenty określonego typu. Jeżeli nie potrzebujesz przekazywać tam żadnych konkretnych wartości to przekaż wartość NULL. Tak wogóle to jeżeli nie przekażesz konstruktorowi odpowiednich wartości to funkcja area nie ma czego zwracać.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 3 gości