[c++]lista...[Rozw.]

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
tssmoq
Użytkownik
Posty: 53
Rejestracja: 2004-12-14, 19:52
Kontakt:

[c++]lista...[Rozw.]

Post autor: tssmoq »

Mam problem z funkcja szukania obiektu w liscie jednokierunkowej, znaczy sie, blad jest sygnalizowany dopiero przy wypisywaniu (ostatnia linija kodu), ale mysle, ze blad popelniam gdzies wczesniej dlatego wklejam prawie caly kod (wybaczcie)...

Kod: Zaznacz cały

#include <iostream>
#include <string>
using namespace std;

class Lista;
class Usluga
{
	char *nazwaU;
	float cenaU;
	int iloscU;
	Usluga *next;

public:
    
	Usluga(const char *usl,int ile, float cen);
	Usluga(Usluga &usl);
	Usluga(const char *usl);
	friend class Lista;
	~Usluga(){delete nazwaU;}
	friend ostream &operator<<(ostream &o,Usluga usl);
	friend ostream &operator<<(ostream &o,Lista &lis);
};

Usluga::Usluga(const char *usl):cenaU(0),iloscU(1),next(NULL)
{
	nazwaU = new char[strlen(usl)+1];
	strcpy(nazwaU,usl);
}
	
Usluga::Usluga(const char *usl,int ile,float cen):cenaU(cen),iloscU(ile),next(NULL)
{
	nazwaU = new char[strlen(usl)+1];
	strcpy(nazwaU,usl);
}

Usluga::Usluga(Usluga &usl):cenaU(usl.cenaU),iloscU(usl.iloscU),next(NULL)
{
	nazwaU=new char[strlen(usl.nazwaU)+1];
	strcpy(nazwaU,usl.nazwaU);
}
ostream &operator<<(ostream &o,Usluga usl)
{
	o<<usl.nazwaU<<"   "<<usl.iloscU<<"   "<<(usl.cenaU*usl.iloscU);
	return o;
}



class Lista
{
	Usluga *first;
public:
	Lista():first(NULL){}
	void dodaj_usluge(char *nazwa,int ile, float cena);
	friend ostream &operator<<(ostream &o, Lista &lis);
	Usluga szukaj_usl(const char *naz);
};
Usluga Lista::szukaj_usl(const char *naz)
{
	Usluga *tmp=first;
	while(tmp!=NULL)
	{
		if(!strcmp(tmp->nazwaU,naz))tmp=tmp->next;
		else return *tmp;
	}
}

ostream &operator<<(ostream &o, Lista &lis)
{
	Usluga *usl=lis.first;
	while(usl!=NULL)
	{
		o<<*usl<<endl;
		usl=usl->next;
	}
	return o;
}
void Lista::dodaj_usluge(char *nazwa,int ile,float cena)
{
	Usluga *nowa_usl=new Usluga(nazwa,ile,cena);
	nowa_usl->next=first;
	first=nowa_usl;
}

int main()
{
	int b;
	Lista podst;
	podst.dodaj_usluge("DE61",1,33.20);
	podst.dodaj_usluge("CAS6",1,3.50);
	podst.dodaj_usluge("DE63",1,53);
	podst.dodaj_usluge("DA11",1,7.35);
	podst.dodaj_usluge("CE1",1,3.20);
	podst.dodaj_usluge("SA22",1,9.40);
	podst.dodaj_usluge("UE41",1,13.05);
	podst.dodaj_usluge("CCE44",1,83.20);
	podst.dodaj_usluge("AE6",1,18.20);
	
	cout<<podst.szukaj_usl("CAS6");	

}
z gory wielkie dzieki za wszelkie sugestie
Ostatnio zmieniony 2007-07-29, 10:02 przez tssmoq, łącznie zmieniany 1 raz.

Awatar użytkownika
mina86
Moderator
Posty: 3330
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [c++]lista...[Rozw.]

Post autor: mina86 »

tssmoq pisze:blad jest sygnalizowany dopiero przy wypisywaniu
Jaki błąd?
tssmoq pisze:#include <string>
Nigdzie z tego pliku nagłówkowego nie korzystasz, natomiast brakuje Ci:

Kod: Zaznacz cały

#include <cstring>
tssmoq pisze: Usluga(Usluga &usl);

Kod: Zaznacz cały

    Usluga(const Usluga &usl);
tssmoq pisze: ~Usluga(){delete nazwaU;}

Kod: Zaznacz cały

    ~Usluga() { delete[] nazwaU; }
tssmoq pisze: nazwaU = new char[strlen(usl)+1];
strcpy(nazwaU,usl);

Kod: Zaznacz cały

    size_t count = strlen(usl) + 1;
    nazwaU = new char[count]; 
    memcpy(nazwaU,usl, count);
i analogicznie w pozostałych konstruktorach.
tssmoq pisze: friend ostream &operator<<(ostream &o,Usluga usl);
friend ostream &operator<<(ostream &o,Lista &lis);

Kod: Zaznacz cały

    friend ostream &operator<<(ostream &o, const Usluga &usl); 
    friend ostream &operator<<(ostream &o, const Lista &lis);
tssmoq pisze:Usluga::Usluga(Usluga &usl):cenaU(usl.cenaU),iloscU(usl.iloscU),next(NULL)

Kod: Zaznacz cały

Usluga::Usluga(const Usluga &usl):cenaU(usl.cenaU),iloscU(usl.iloscU),next(NULL)
tssmoq pisze:ostream &operator<<(ostream &o,Usluga usl)

Kod: Zaznacz cały

ostream &operator<<(ostream &o, const Usluga &usl)
tssmoq pisze: friend ostream &operator<<(ostream &o, Lista &lis);

Kod: Zaznacz cały

    friend ostream &operator<<(ostream &o, const Lista &lis);
tssmoq pisze: Usluga szukaj_usl(const char *naz);

Kod: Zaznacz cały

    const Usluga &szukaj_usl(const char *naz);
tssmoq pisze:Usluga Lista::szukaj_usl(const char *naz)

Kod: Zaznacz cały

const Usluga &Lista::szukaj_usl(const char *naz)
Ostatnio zmieniony 2007-07-28, 12:58 przez mina86, łącznie zmieniany 1 raz.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.

Awatar użytkownika
tssmoq
Użytkownik
Posty: 53
Rejestracja: 2004-12-14, 19:52
Kontakt:

Re: [c++]lista...[Rozw.]

Post autor: tssmoq »

wielkie dzieki, o to wlasnie chodzilo, choc w samej funkcji wyszukujacej jest tez blad, poprawnie zaczelo dzialac, gdy zmienilem warunek na

Kod: Zaznacz cały

if(strcmp(tmp->nazwaU,naz)!=0)tmp=tmp->next;
i jeszcze mala prosba, gdyby chcial ci sie pokrotce opisac dlaczego size_t a nie sizeof to bede juz dozgonnie wdzieczy, tzn juz jestem ;)

ok juz wiem size_t jest potrzebne memcopy
Ostatnio zmieniony 2007-07-29, 10:54 przez tssmoq, łącznie zmieniany 1 raz.

Awatar użytkownika
mina86
Moderator
Posty: 3330
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [c++]lista...[Rozw.]

Post autor: mina86 »

tssmoq pisze:wielkie dzieki, o to wlasnie chodzilo, choc w samej funkcji wyszukujacej jest tez blad, poprawnie zaczelo dzialac, gdy zmienilem warunek na Kod:

Kod: Zaznacz cały

if(strcmp(tmp->nazwaU,naz)!=0)tmp=tmp->next;
Albo krócej:

Kod: Zaznacz cały

if (strcmp(tmp->nazwaU,naz) tmp = tmp->next;
Osobiście zmieniłbym funkcje wyszukującą na:

Kod: Zaznacz cały

const Usluga *Lista::szukaj_usl(const char *naz) {
    Usluga *tmp = first; 
    while (tmp && strcmp(tmp->nazwaU,naz)) {
        tmp = tmp->next; 
    }
    return tmp;
}
W ogóle dopiero teraz zauważyłem, że w Twoim kodzie funkcja niewiadomo co miałaby zwracać jeżeli element nie istnieje, a więc zwracanie przez referencje może nie zadziałać.
tssmoq pisze:i jeszcze mala prosba, gdyby chcial ci sie pokrotce opisac dlaczego size_t a nie sizeof
sizeof to jednoargumentowy operator zwracający rozmiar w bajtach argumentu (np. sizeof(int), sizeof nazwa_zmiennej, sizeof wyrazenie), a size_t to typ liczb całkowitych dodatnich używany często do określania rozmiarów tablic etc. Operator sizeof zwraca wynik typu size_t.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.

ODPOWIEDZ