Funkca/klasa zaprzyjaźniona


(Druii) #1

Witam

Jestem laikiem jeśli chodzi o programowanie, ale chciałbym się nauczyć. Dostaliśmy kiedyś zadanie na ćwiczeniach a ja chce je zmodyfikować, żeby poćwiczyć przed egzaminem. Zapewne dostane niezły ochrzan za styl i wykonanie, ale jak pisałem, uczę się :slight_smile:

Wykonanie jest kompletnie moje, wiec polecenia z ćwiczenia nie wkleję, lecz podam to co sam zamierzałem zrobić.

Wykonałem 3 klas (kura, krowa, swinia). Każda klasa ma jakieś zminne prywatne (np: krowa ma: ilosc [czyli ilosc krow],waga,mleko,wiek).

class krowa

{

	private:

		int waga;

		int wiek;

		int mleko;

		int ilosc;

	public:

		krowa()

		{

			cout << "Sprawdzamy stan krow! " << endl << endl;

		}

		void wypisz_krowe(int wiek[],int waga[], int mleko[],int s);

		int podaj_ilosc();

		void dodaj_wiek();

		void dodaj_waga();

		void dodaj_mleko();

		int wypisz_wiek()	{ return wiek;}

		int wypisz_waga()	{ return waga;}

		int wypisz_mleko()	{ return mleko;}


};

W main wklepuje ilość krów a potem na rzecz obiektu mucka (klasa krowa), wywołuje dodawanie wagi, mleka i wieku krowy do tablicy (oczywiscie w petli ktora dziala od 0 do Ilosc).

krowa mucka;

	cout << "Podaj ile masz krow [1-10] ";

	x=mucka.podaj_ilosc();

	int waga[x], wiek[x], mleko[x];	

	for(i=0;i
	{

		cout <<"Podaj wiek " << i+1 << " krowy [1-5 lat]" << endl;

		mucka.dodaj_wiek();

		wiek[i]=mucka.wypisz_wiek();


		cout <<"Podaj wage " << i+1 << " krowy [30-90 Kg]" << endl;

		mucka.dodaj_waga();

		waga[i]=mucka.wypisz_waga();


		cout <<"Podaj ilosc mleka w litrach na tydzien " << i+1 << " krowy [20-35 L]" << endl;

		mucka.dodaj_mleko();

		mleko[i]=mucka.wypisz_mleko();	

	}

	if(x>0) mucka.wypisz_krowe(wiek,waga,mleko,x);

Potem w osobnej metodzie wyswietlam tabele:

cout << "L.p | Gatunek | wiek | waga | mleko | zysk |" << endl; 

	cout << "-------------------------------------------------|" << endl;

for(int i=0;i
	{

	cout << i+1 <<" | KROWA | " << wiek[i]<< " | " << waga[i]<<" | " << mleko[i]<< endl;	

	}[/code]




To jest taka podstawa do tego co chciałbym zrobić :)

Wszystko działa poprawnie, nie da się wpisać zbyt wielkiej/małej wagi, zbyt małej/wielkiej ilość mleka czy złego wieku. Wszystko ustaliłem w metodach każdej klasy.



Moje zadanie to:

Chciałbym stworzyć (najlepiej) klase lub kilka funkcji która:

1. Pobrała by mi wartości wagę/wiek/mleko i z gotowego wzoru (zrobiłem jakiś taki - ważne że by pobrało dane) obliczyło zysk (na 1 krowie).

2. Wyświetliło listę krów/świń/kur razem z obliczonym zyskiem.



Zamieszczam swój kod:

nagłowek

[code]#ifndef _MOJE_BBL_H_ #define _MOJE_BBL_H_ #include #ifndef C16 #include #include #include using namespace std; #else #include #endif inline void stop(void) {; cout << "Nacisnij [Enter]";cin.get();}; #endif
Main

#include "Moja_BBL.h"

#include "krowa.cpp"

#include "swinia.cpp"

#include "kura.cpp"


int main()

{


	int i=0,x=0,z=0,c=0;


	krowa mucka;

	cout << "Podaj ile masz krow [1-10] ";

	x=mucka.podaj_ilosc();

	int waga[x], wiek[x], mleko[x];	

	for(i=0;i
	{

		cout <<"Podaj wiek " << i+1 << " krowy [1-5 lat]" << endl;

		mucka.dodaj_wiek();

		wiek[i]=mucka.wypisz_wiek();


		cout <<"Podaj wage " << i+1 << " krowy [30-90 Kg]" << endl;

		mucka.dodaj_waga();

		waga[i]=mucka.wypisz_waga();


		cout <<"Podaj ilosc mleka w litrach na tydzien " << i+1 << " krowy [20-35 L]" << endl;

		mucka.dodaj_mleko();

		mleko[i]=mucka.wypisz_mleko();	

	}

	if(x>0) mucka.wypisz_krowe(wiek,waga,mleko,x);


	cout << endl << "-----------------------------------------" << endl << endl;


	swinia prosie;

	cout << "Podaj ile masz swin [1-5] ";

	z=prosie.podaj_ilosc();

	int waga2[z], wiek2[z], mieso2[z];	

	for(i=0;i
	{

		cout <<"Podaj wiek " << i+1 << " swini [1-3 lat]" << endl;

		prosie.dodaj_wiek();

		wiek2[i]=prosie.wypisz_wiek();


		cout <<"Podaj wage " << i+1 << " swini [25-75 Kg]" << endl;

		prosie.dodaj_waga();

		waga2[i]=prosie.wypisz_waga();


		cout <<"Podaj ilosc miesa w kg " << i+1 << " swini [20-65 Kg]" << endl;

		prosie.dodaj_mieso();

		mieso2[i]=prosie.wypisz_mieso();	

	}

	if(z>0) prosie.wypisz_swinie(wiek2,waga2,mieso2,z);


	cout << endl << "-----------------------------------------" << endl << endl;


	kura kurak;

	cout << "Podaj ile masz kur [1-100] ";

	c=kurak.podaj_ilosc();

	int waga3[c], wiek3[c], jajka3[c];	

	for(i=0;i
	{

		cout <<"Podaj wiek " << i+1 << " kury [1-24 miesiecy]" << endl;

		kurak.dodaj_wiek();

		wiek3[i]=kurak.wypisz_wiek();


		cout <<"Podaj wage " << i+1 << " kury [2-6 Kg]" << endl;

		kurak.dodaj_waga();

		waga3[i]=kurak.wypisz_waga();


		cout <<"Podaj ilosc jejek " << i+1 << " kury [0-7 sztuk]" << endl;

		kurak.dodaj_jajka();

		jajka3[i]=kurak.wypisz_jajka();	

	}

	if(c>0)kurak.wypisz_kure(wiek3,waga3,jajka3,c);


	return 0;

}

Krowa

#include "Moja_BBL.h"


class krowa

{

	private:

		int waga;

		int wiek;

		int mleko;

		int ilosc;

	public:

		krowa()

		{

			cout << "Sprawdzamy stan krow! " << endl << endl;

		}

		void wypisz_krowe(int wiek[],int waga[], int mleko[],int s);

		int podaj_ilosc();

		void dodaj_wiek();

		void dodaj_waga();

		void dodaj_mleko();

		int wypisz_wiek()	{ return wiek;}

		int wypisz_waga()	{ return waga;}

		int wypisz_mleko()	{ return mleko;}


		//double oblicz(int _waga, int _wiek, int _mleko);

		//narazie oblicz jest tutaj, bo ogolnie jakos nie poradzilem sobie z nia

};


int krowa::podaj_ilosc()

{


	cin >> ilosc;

		while(ilosc>9){

		cout << "BLAD! Twoja stajnia pomiesci maxymalnie 9 krow! Podaj od 1 do 9!" << endl;

		cin >> ilosc;

		}

		if(ilosc<1)

		{

			cout << "#INFO# Niestety, nie posiadasz krow" << endl;

		}

	return ilosc;


}


void krowa::dodaj_wiek()

	{

		cin >> wiek;

		while(wiek>5 || wiek <= 0){

		cout << "BLAD! Zly zakres! Podaj od 1 do 5!" << endl;

		cin >> wiek;

		}

		if(wiek>4) cout << "#INFO# Pomysl o sprzedarzy, lub uboju Twojej krowy" << endl;

		if(wiek<2) cout << "#INFO# Twoja krowa jest jeszcze mloda, nie licz na wielka ilosc mleka" << endl;


		cout << endl;

	}


void krowa::dodaj_waga()

{

		cin >> waga;

		while(waga>90 || waga <= 29){

		cout << "BLAD! Zly zakres! Podaj od 30 do 90!" << endl;

		cin >> waga;

		}

		if(waga<50) cout << "#INFO# Twoja krowa jest wychudzona!"<< endl;

		if(waga>80) cout << "#INFO# Twoja krowa jest zbyt otyla!" << endl;


		cout << endl;


}


void krowa::dodaj_mleko()

{

		cin >> mleko;

		while(mleko>45 || mleko <= 10){

		cout << "BLAD! Zly zakres! Podaj od 20 do 35!" << endl;

		cin >> mleko;

		}

		if(mleko>35) cout << "#INFO# To chyba cud!, az tyle mleka!" << endl;

		if(mleko<20) cout << "#INFO# Krowa jest chyba chora ;/" << endl;


		cout << endl;

}


/* wzor do obliczen (to ten wzor)

void krowa::oblicz(int *wiek, int * waga, int * mleko)

{

	if(*wiek=1 || *wiek =5) a=0.5;

	if(*wiek=2 || *wiek =4) a=0.7;

	if(*wiek=3) a=1;

	if(*waga>70 || *waga <50) b=1.75;

	if(*waga<70 && *waga >50) b=2;

	zysk = a * (*waga/10) * (*mleko*b);

	cout << zysk;	

}

*/



void krowa::wypisz_krowe(int wiek[],int waga[], int mleko[],int s)

{


	cout << "L.p | Gatunek | wiek | waga | mleko | zysk |" << endl; 

	cout << "-------------------------------------------------|" << endl;



	for(int i=0;i
	{

	cout << i+1 <<" | KROWA | " << wiek[i]<< " | " << waga[i]<<" | " << mleko[i]<< endl;	

	}	

}

[/code]




Swinia

[code]#include "Moja_BBL.h" class swinia { private: int waga; int wiek; int mieso; int ilosc; public: swinia() { cout << "Sprawdzamy stan swin! " << endl <> ilosc; while(ilosc>5){ cout << "BLAD! Twoja stajnia pomiesci maxymalnie 5 swin! Podaj od 1 do 5!" <> ilosc; } if(ilosc<1) { cout << "#INFO# Niestety, nie posiadasz swin" <> wiek; while(wiek>3 || wiek <= 0){ cout << "BLAD! Zly zakres! Podaj od 1 do 3!" <> wiek; } if(wiek>2) cout << "#INFO# Najwyzszy czas, ubic swinie!" << endl; if(wiek<2) cout << "#INFO# Musisz poczekac conajmniej rok!" << endl; cout <> waga; while(waga>75 || waga <= 24){ cout << "BLAD! Zly zakres! Podaj od 25 do 65!" <> waga; } if(waga<30) cout << "#INFO# Twoja swinia jest wychudzona!"<65) cout << "#INFO# Twoja swinia to niezly okaz!" << endl; cout <> mieso; while(mieso>65 || mieso <= 20){ cout << "BLAD! Zly zakres! Podaj od 25 do 55!" <> mieso; } while((waga-(waga/10)) { cout << "Nie mozliwe jest by bylo wiecej miesa od wagi swini!" <> mieso; } if(mieso>55) cout << "#INFO# Wspalniale, niezly kawal miesa!" << endl; if(mieso<25) cout << "#INFO# Ta swinia to byl niewypal" << endl; cout << endl; } void swinia::wypisz_swinie(int wiek[],int waga[], int mieso[],int s) { cout << "L.p | Gatunek | wiek | waga | mieso" << endl; cout << "-----------------------------------------" << endl; for(int i=0;i { cout << i+1 <<" | SWINIA | " << wiek[i]<< " | " << waga[i]<<" | " << mieso[i]<< endl; } }
Kura

#include "Moja_BBL.h"


class kura

{

	private:

		int waga;

		int wiek;

		int jajka;

		int ilosc;

	public:

		kura()

		{

			cout << "Sprawdzamy stan kur! " << endl << endl;

		}


		void wypisz_kure(int wiek[],int waga[], int jajka[],int c);

		int podaj_ilosc();

		void dodaj_wiek();

		void dodaj_waga();

		void dodaj_jajka();

		int wypisz_wiek()	{return wiek;}

		int wypisz_waga()	{ return waga;}

		int wypisz_jajka()	{ return jajka;}


};


int kura::podaj_ilosc()

{


	cin >> ilosc;

		while(ilosc>100){

		cout << "BLAD! Twoja stajnia pomiesci maxymalnie 100 kur! Podaj od 1 do 100!" << endl;

		cin >> ilosc;

		}

		if(ilosc<1)

		{

			cout << "#INFO# Niestety, nie posiadasz kur" << endl;

		}

		if(ilosc<10)

		{

			cout << "#INFO# Oplaca Ci sie trzymac tyle kur?" << endl;

		}

	return ilosc;


}


void kura::dodaj_wiek()

	{

		cin >> wiek;

		while(wiek>24 || wiek <= 0){

		cout << "BLAD! Zly zakres! Podaj od 1 do 24!" << endl;

		cin >> wiek;

		}

		if(wiek>20) cout << "#INFO# Twoja kura ma prawie 2 lata, zrob sobie rosol :)" << endl;

		if(wiek<7) cout << "#INFO# Nie licz ze mniej niz polroczna kura da jakies jajko..." << endl;

		cout << endl;

	}


void kura::dodaj_waga()

{

		cin >> waga;

		while(waga>7 || waga <= 1){

		cout << "BLAD! Zly zakres! Podaj od 2 do 5!" << endl;

		cin >> waga;

		}

		if(waga<1) cout << "#INFO# Ta kura w ogole zyje? Daj jej zboze!"<< endl;

		if(waga>6) cout << "#INFO# Ta kura to chyba jakis mutant! "<< waga <<" kg!" << endl;


		cout << endl;


}


void kura::dodaj_jajka()

{

		cin >> jajka;

		if(wiek < 7)

		{

			jajka=0;

			cout << "#INFO# Twoja kura nie znosi jeszcze jajek ;/" << endl;	

		}

		else {


			while(jajka>7 || jajka <= 0)

			{

			cout << "BLAD! Zly zakres! Podaj od 0 do 7!" << endl;

			cin >> jajka;

			}

		}




		if(jajka>6) cout << "#INFO# Twoja kura chyba znosi zlote jaja!" << endl;

		if(jajka<0) cout << "#INFO# No niestety, nie ma nic" << endl;

		cout << endl;

}


void kura::wypisz_kure(int wiek[],int waga[], int jajka[],int c)

{

	cout << "L.p | Gatunek | wiek | waga | jajka" << endl;

	cout << "-----------------------------------------" << endl; 

	for(int i=0;i
   {

       cout << i+1 <<" | KURA | ";

       if(wiek[i]<10)

       {

             cout << "0";

       }

       cout << wiek[i]<< " | " << waga[i]<<" | " << jajka[i]<< endl;   

   } 	

}

Nie wiem jak za pomoca jakieś klasy/czy funkcji zaprzyjaznionej (ktora powstała by w osobnym pliku) pobrać odpowiednie dane z tabelek (bo kazde zwierze np: krowa ma rozne parametry [wage/wiek/mleko] ktore porzebne sa we wzorze (przygotowany tylko jeden wzor w krowie))


([alex]) #2

Coś w twoim projekcie pochrzanione. Jeżeli jeden obiekt np typu kura oznacz pewną ilość kur to czego dotyczy wiek? Natomiast jeżeli jeden obiekt to jedna kura to czego dotyczy ilość?

Ta funkcja zaprzyjaźniona (o której mówisz) nie może czegoś takiego zrobić, podam ci przykład:

Mam przed sobą przedmiot, odpytaj mnie o jego właściwości, możesz?

A no nie bo nie wiesz co mam przed sobą, tak samo ta funkcja dostaje nie wiadomo co więc nie może nic z tego wyciągnąć.

Można to rozwiązać inaczej. Wszystkie te klasy pochodzą od ZwierzeHodowlane, które już ma w sobie parę pól np waga, wiek, ilosc (która to ilosc koliduje z wagą i wiekiem ale o tym już mówiłem).

Wtedy taka funkcja dostaje wskaźnik lub referencję na ZwierzeHodowlane z którego wyciągamy podstawowe parametry.

Z tym że specyficznych i tak nie wyciągniesz chyba że napiszesz straszliwego if else if else if else if else

Jedynie co można zrobić to dać pewną wirtualną metodę w klasie ZwierzeHodowlane, którą nadpisać w klasach pochodnych która skonwertuje wszystkie parametry do jednego typu, np:

konwersja do string

wpisanie do strumienia


(Drobok) #3

Prawda jest taka, że te twoje klasy są całkowicie bez sensu. Gdyż są one tylko i wyłącznie przesiadką dla globalnej tablicy :))

Wywal zmienne (wiek itd) z maina, zmień zmienne prywatne na talice. Postaraj się tak wszystko ogarnąć, by w main było tylko pobieranie / odczyt.

Ja bym sobie zrobił strukturę krowa, potem klasę w której mam prywatne tablice tej struktury. Trzymaj dane w klasie !!

Co do twojej funkcji, wszystko się sprowadza do tego, że przekazujesz wskaźniki, używasz wskaźników.

Możesz to zrobić na dwa sposoby:

Przekazujesz element i pobierasz element podstawiasz do wzoru w stylu:

cout zysk(krowa[2]) - pseudokod

int zysk(int costam, int costam2){return costam*costam;}

Przekazujesz tablicę, oraz element z którego liczysz (wtedy pobierasz wskaźnik, ale używasz elementu)

cout zysk(krowa, 2);

int zysk(int* krowa, int i){return krowa[i];}

(Druii) #4

Dzięki za wskazówki.. :slight_smile:

Jednym zdaniem.. startuje prawie od zera ;d

Ale przynajmniej wiem w czym tkwi problem..

-- Dodane 29.01.2013 (Wt) 15:21 --

Jak w pętli dodawać obiekty?

np:

for(i=0;i
	{

	krowa+i.dodaj_krowe();

	}

tylko żeby za każdym razem zamiast i zmieniała się liczba w zakresie od 0 do r? Próbowałem takim kodem.. ale doszedłem do wniosku że i tak z tego będzie string :confused:

string nazwa(int l)

{

	string x; int i;


		cout << "Krowa ";

		for(i=0;i
		{

			cout << i;

		}

}

Wyczytałem na necie taka wskazówkę...

ale nie potrafię jej zastosować do swojego programu :confused:


(Wojcirej) #5

Może pomyśl o tablicy obiektów danej klasy?

Przykładowo miałbyś klasę bazową Zwierzę, potem trzy klasy pochodne: krówka, kura, świnka. Każda z nich miałabyś jakieś tam twoje dane prywatne, do tego dla każdej nich można pokusić się o wirtualną metodę do wpisywania tych danych.

Taką tablicę łatwo zadeklarować:

Zwierze *zoo[100]; //tablica wskaźników

I teraz np. jakbyś chciał dodać sobie świnkę, robisz tak:

zoo[i]=new świnka; //alokacja pamięci dla itego wskaźnika 

zoo[i]->Wpiszdane(); //metoda wpisująca dane dla obiektu klasy świnki

Analogicznie miałbyś np. z krówką:

zoo[i]=new krówka;

zoo[i]->Wpiszdane();

I teraz jeżeli nazwałbyś identycznie metody do wpisywania danych, nic się nie dzieje - dzięki temu, że są one wirtualne, będą się odnosiły do klasy pochodnej (czyli wybranego przez ciebie zwierzaczka), a nie bazowej(czyli klasy Zwierzę).

Oczywiście do tego przydałby się jakieś proste menu na ifach czy case'ach, aby poprawnie manewrować indeksami i przemieszczać się po itych elementach zoo. :slight_smile: