• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyswietlanie tablicy

Object Storage Arubacloud
0 głosów
2,290 wizyt
pytanie zadane 9 kwietnia 2019 w C i C++ przez four Użytkownik (720 p.)

Siemka co robie nie tak w poniższym programie, bo próbuje wyświetlić tablicę obiektów na kilka sposobów i nie działa

#include<iostream>
using namespace std;
class Pies
{
private:
	char imie[16];
	char rasa[16];

public:
	Pies() {}
	friend istream &operator>>(istream &is, Pies &f) {
		return is >> f.imie >> f.rasa;
	}
	friend ostream &operator<<(ostream &output, const Pies &D) {
		output << D.imie << D.rasa;
		return output;
	}
	Pies(char imie[16], char rasa[16]) {}

};

int main()
{
	int licznik = 0;
	Pies tab[100];
	char wybor;
	while (true)
	{
		cout << "Wybierz opcje: " << endl;
		cin >> wybor;
		switch (wybor)
		{
		case 'N':
		{
			char im[16];
			cout << "Podaj imie psa: " << endl;
			cin >> im;

			char n[16];
			cout << "Podaj rase psa: " << endl;
			cin >> n;

			tab[licznik] = Pies(im, n);
			licznik++;
			break;
		}
		case 'W':
		{
			cout << tab << endl;
			break;
		}

		}
	}
	
}

 

1
komentarz 9 kwietnia 2019 przez program naczelny Gaduła (3,320 p.)
napisz co nie działa bo nikt ci nie pomoże. Jeżeli masz jakieś errory to też powinneś o nich powiadomić.
komentarz 9 kwietnia 2019 przez four Użytkownik (720 p.)
program się kompiluje, ale nie działa case W, który powinien wyświetlić tablicę obiektów Pies
komentarz 9 kwietnia 2019 przez kenjiro244 Dyskutant (8,600 p.)
Case W działa tak jak powinien czyli wypisuje adres pod jakim znajduje się tablica

1 odpowiedź

0 głosów
odpowiedź 9 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)

Pierwszy problem to pusty konstruktor.

Drugi zaś to próba wypisania całej tablicy na raz, a nie poszczególnych elementów.

Na początek napisz jakiś konstruktor.

Następnie zamień:

cout << tab << endl;

na:

for(int i=0;i<licznik;++i)
    cout << tab[i] << endl;

w linii 49.

Powinieneś zamienić jeszcze w liniach 6 i 7:

    char imie[16];
    char rasa[16];

na:

    char* imie;
    char* rasa;

Kod już działa, ale moim zdaniem wymaga wielu poprawek:

  • Nie powinieneś używać using namespace std;
  • Powinieneś używać angielskich nazw zmiennych itp.
  • Lepiej nazywać zmienne, tak, żeby było wiadomo co oznaczają.
  • W C++ używać string zamiast char*.
komentarz 9 kwietnia 2019 przez four Użytkownik (720 p.)

A co jest jeszcze nie tak z wyswietlaniem, bo jednak nie działa 

      case 'W':
        {
             
            for(int i=0;i<licznik;++i)
            cout << tab[i] << endl;
            break;
        }
  

 

komentarz 9 kwietnia 2019 przez DeBos123 Nałogowiec (44,950 p.)
Napisz co dokładnie nie działa i wyślij cały kod.
komentarz 10 kwietnia 2019 przez j23 Mędrzec (194,920 p.)
edycja 10 kwietnia 2019 przez j23

@DeBos123, doradziłeś OP, żeby zmienił tablice na wskaźniki, ale nie pociągnąłeś do końca tematu i kod jest z błędami.

 

Jak już mają być wskaźniki, to tak (choć lepiej użyć std::string):

class Pies
{
private:
	char* imie;
	char* rasa;

public:
	friend istream &operator>>(istream &is, Pies &f) 
	{
		/* niezbyt bezpieczna implementacja, ale nie chce mi się dłubać w tym */
		char buff[256];

		is >> buff;
		delete[] f.imie;
		f.imie = strcpy(new char [strlen(buff) + 1], buff);

		is >> buff;
		delete[] f.rasa;
		f.rasa = strcpy(new char [strlen(buff) + 1], buff);

		return is;
	}

	friend ostream &operator<<(ostream &output, const Pies &D) {
		
		output << D.imie << D.rasa;
		return output;
	}

	Pies& operator=(const Pies& pies)
	{
		if(&pies == this) return *this;
		delete[] imie;
		delete[] rasa;
		imie = strcpy(new char [strlen(pies.imie) + 1], pies.imie);
		rasa = strcpy(new char [strlen(pies.rasa) + 1], pies.rasa);
		return *this;
	}

	Pies(const Pies &pies) 
		: Pies(pies.imie, pies.rasa)
	{}

	Pies(const char *im = "", const char *ra = "") 
	{
		imie = strcpy(new char [strlen(im) + 1], im);
		rasa = strcpy(new char [strlen(ra) + 1], ra);
	}
	
	~Pies()
	{
		delete[] imie;
		delete[] rasa;
	}
};

 

komentarz 10 kwietnia 2019 przez four Użytkownik (720 p.)
A da się to zrobić, nie zamieniając na wskaźniki tak jak było na początku, po porostu normalne tablice??
komentarz 10 kwietnia 2019 przez j23 Mędrzec (194,920 p.)

Da się. Do kopiowania łańcuchów znakowych do tablicy użyj funkcji strcpy,

Podobne pytania

0 głosów
1 odpowiedź 135 wizyt
0 głosów
2 odpowiedzi 220 wizyt
pytanie zadane 12 kwietnia 2022 w C i C++ przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 542 wizyt
pytanie zadane 22 marca 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...