Klasy i konstruktory

0

Witam mam takie zadanie:

Poniższe zadania dotyczą tematów: "Zaawansowane funkcje użytkownika", "Preprocesor, a moduły", "Klasy", "Konstruktory i destruktory".

WSKAZÓWKI:

  • zastanów się jakich potrzebujesz obiektów składowych dla swojej klasy,
  • zastanów się jakich potrzebujesz funkcji składowych dla swojej klasy,
  • pamiętaj, że w poniższych programach wszystkie obiekty składowe muszą być prywatne,
  • pamiętaj, że w poniższych programach funkcje składowe mogą być prywatne albo publiczne.

Zaprojektować klasę jako osobny moduł (patrz: dalej). W klasie publiczne są TYLKO funkcje składowe. Stan początkowy klasy ustalamy za pomocą konstruktora klasy.

Aby zaliczyć program należy utworzyć klasę umożliwiającą wyświetlanie wydruku analogicznego do przykładowych wydruków pokazanych poniżej. Należy wzorować się na przykładowym programie przedstawionym w temacie: Definiowanie klasy w osobnym module.

Klasa ma realizować następujące zadanie:
"Sejf" - do przechowywania euro oraz dolarów (zdefiniowac maksymalne kwoty osobne dla obu walut). Wkładanie i wyjmowanie pieniędzy oraz informowanie o stanie sejfu możliwe jest tylko przy otwartym sejfie. Przykładowy wydruk:

Sejf zamknięty (objętość sejfu to maksymalnie: 1000 banknotów)
Wkładam 5x10$...
BŁĄD: nie można nic włożyć do zamkniętego sejfu
Wyciągam 5x10$...
BŁĄD: nie można nic wyciągnąć z zamkniętego sejfu
Otwieram sejf...
Sejf otwarty - w środku znajduje się:
10x500€ = 5000€
40x100$ = 4000$
Razem banknotów: 50
Wkładam 5x10$, 5x1$...
Sejf otwarty - w środku znajduje się:
10x500€ = 5000€
40x100$ + 5x10$ + 5x1$ = 4055$
Razem banknotów: 60
Wkładam 1000x100$...
BŁĄD: za dużo banknotów (w sejfie zmieści się jeszcze tylko 940 banknotów)
Sejf otwarty - w środku znajduje się:
10x500€ = 5000€
40x100$ + 5x10$ + 5x1$ = 4055$
Razem banknotów: 60
Zamykam sejf...
Sejf zamknięty (objętość sejfu to maksymalnie: 1000 banknotów)

#include <iostream> //załączanie bibliotek

using namespace std;

int indeks, i;

class sejf{
  private:
    int l_bank; // liczba banknotów
    int euro[7]; // nominaly euro - 5, 10, 20, 50, 100, 200, 500
    int dolar[6]; // nominaly dolara - 1, 5, 10, 20, 50, 100
    bool otwarty; // otwarte, zamkniete?
    int max;
  public:
    sejf(int max_);
    void otworz(); // deklaracja funkcji skladowych
    void zamknij();
    void wloz(bool waluta, int nom, int ilosc); // if you know what i mean 
    void wyciagnij(bool waluta, int nom, int ilosc);
    void info();
};

sejf::sejf(int max_){
  max=max_;
  for(i=0;i>6;i++){
    euro[i]=0;
  }
  for(i=0;i>5;i++){
    dolar[i]=0;
  }
}

void sejf::otworz(){
  cout << "Otwieram sejf...\n";
  otwarty = 1;
}

void sejf::zamknij(){
  cout << "Zamykam sejf...\n";
  otwarty = 0;
}

void sejf::wloz(bool waluta, int nom, int ilosc){
  if(otwarty=1){
    if(max-l_bank<ilosc){
      cout << "BLAD: sejf nie zmieści tyle banknotów.\n";
    }
    else{
      if(waluta=0){
        switch(nom){ // sprawdzanie czy nominal jest prawdziwy
          case 5: indeks=0;
          case 10: indeks=1;
          case 20: indeks=2;
          case 50: indeks=3;
          case 100: indeks=4;
          case 200: indeks=5;
          case 500: indeks=6;
          default: cout << "Nieprawidlowy nominal!\n"; // błąd
        }
        euro[indeks]=ilosc;
        cout << "Wkladanie " << ilosc << " banknotow euro o nominale " << nom << "\n";
      }
      else{
        switch(nom){ // sprawdzanie czy nominal jest prawdziwy
          case 1: indeks=0;
          case 5: indeks=1;
          case 10: indeks=2;
          case 20: indeks=3;
          case 50: indeks=4;
          case 100: indeks=5;
          default: cout << "Nieprawidlowy nominal!\n"; // błąd
        }
        dolar[indeks]=ilosc;
        l_bank+=ilosc;
        cout << "Wkładanie " << ilosc << " banknotow dolarowych o nominale " << nom << "\n";
      }
    }
  }
  else{
    cout << "BLAD: nie można nic włozyc do zamknietego sejfu\n";
  }
}

void sejf::wyciagnij(bool waluta, int nom, int ilosc){
  if(otwarty=1){
    if(max-l_bank<ilosc){
      cout << "BLAD: sejf nie zmieści tyle banknotów.\n";
    }
    else{
      if(waluta=0){
        switch(nom){ // sprawdzanie czy nominal jest prawdziwy
          case 5: indeks=0;
          case 10: indeks=1;
          case 20: indeks=2;
          case 50: indeks=3;
          case 100: indeks=4;
          case 200: indeks=5;
          case 500: indeks=6;
          default: cout << "Nieprawidlowy nominal!\n"; // błąd
        }
        euro[indeks]=ilosc;
        cout << "Wkladanie " << ilosc << " banknotow euro o nominale " << nom << "\n";
      }
      else{
        switch(nom){ // sprawdzanie czy nominal jest prawdziwy
          case 1: indeks=0;
          case 5: indeks=1;
          case 10: indeks=2;
          case 20: indeks=3;
          case 50: indeks=4;
          case 100: indeks=5;
          default: cout << "Nieprawidlowy nominal!\n"; // błąd
        }
        dolar[indeks]=ilosc;
        l_bank+=ilosc;
        cout << "Wkładanie " << ilosc << " banknotow dolarowych o nominale " << nom << "\n";
      }
    }
  }
  else{
    cout << "BLAD: nie można nic włozyc do zamknietego sejfu\n";
  }
}

void sejf::info(){
  if(otwarty=0) cout << "\n\nSejf zamkniety"; cout << "Sejf otwarty";
  cout << ", maksymalna liczba banknotow to " << max << ".\n" <<"W srodku znajduje sie:\n" << "€:\tNominal\tIlosc\n\n";
  cout << "\t5\t" << euro[0] << "\n";
  cout << "\t10\t" << euro[1] << "\n";
  cout << "\t20\t" << euro[2] << "\n";
  cout << "\t50\t" << euro[3] << "\n";
  cout << "\t100\t" << euro[4] << "\n";
  cout << "\t200\t" << euro[5] << "\n";
  cout << "\t500\t" << euro[6] << "\n\n";
  cout << "$:\tNominal\tIlosc\n\n";
  cout << "\t1\t" << dolar[0] << "\n";
  cout << "\t5\t" << dolar[1] << "\n";
  cout << "\t10\t" << dolar[2] << "\n";
  cout << "\t20\t" << dolar[3] << "\n";
  cout << "\t50\t" << dolar[4] << "\n";
  cout << "\t100\t" << dolar[5] << "\n";
}

int main(void){
  sejf pancerniak(1000);
  pancerniak.wloz(1,20,40);
  pancerniak.otworz();
  pancerniak.wloz(0,50,768);
  pancerniak.wloz(1,100,60);
  pancerniak.info();
  pancerniak.zamknij();
};

Tylko to nie działa poprawnie , wkładanie w ogóle nie działa i nie wiem co tu jest jeszcze źle, dodam tylko że jestem zielony w programowaniu. ;P

0

Tak na pierwszy rzut oka if(x=y) jest bledem w programowaniu porownujemy przez operator == a przypisujemy przez =

0

@Krycho ma rację, aż razi w oczy :P. Jeżeli napiszesz

 if(otwarty=1)

to najpierw zostanie do zmiennej przypisane 1, a następnie sprawdzony warunek. Ten zawsze się spełni a natomiastif(otwarty=0)

 nigdy

A przepraszam a co to jest?
```cpp
int indeks, i;

Wytłumacz się :P Nie potrzebujesz tutaj zmiennych globalnych. Powinny być to zmienne lokalne w metodach tam gdzie ich używasz.

0

Dobra znalazlem wszystkie bledy i po prostu tragedia ;p Brac sie za klasy bez opanowania petli i switcha? No niezbyt

Wywal zmienne globalne to Od razu.
Petla for w konstuktorze nie wykona sie ani razu!!!! przemysl sobie to
Liczba banknotow oraz otwarty musza byc zainicjalizowane w konstuktorze bo takto maja nieokreslone wartosci!
Wiesz w jaki sposob wykonuje sie switch? Kiedy trafi na prawidlowy case to potem wykonuje wszystkie nastepne tez. Trzeba uzyc breakow!

Po tych zabiegach bedzie dzialac.

0

@Krycho a mogłbyś to poprawić?

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

//nominaly euro - 5, 10, 20, 50, 100, 200, 500
//nominaly dolara - 1, 5, 10, 20, 50, 100


string StringToLower(string strs)  // prosty 'tolower' tylko dla potrzeb TEGO programu
{
	int len = strs.length();
	for(int i = 0; i < len; i++)
	{
		strs[i] = tolower(strs[i]);
	}
	return strs;
}

class SEJF
{
	int liczba_banknotow;
	int euro[7];
	int dolar[6];
	bool isOpen;
	int max_bill;
public:
	void otworz_sejf();
	void zamknij_sejf();
	void pobierz_kase(int nBanknotow, string waluta, int nominal);
	void dodaj_kase(int nBanknotow, string waluta, int nominal);
	void dane_sejfu();
	SEJF(int max_banknotow);
};


SEJF::SEJF(int max_banknotow)
{
	max_bill = max_banknotow;
	for(int i = 0; i < 7; i++)
		euro[i] = 0;
	for(int i = 0; i < 6; i++)
		dolar[i] = 0;
	isOpen = false;
	cout << "Sejf zamkniety (objetosc sejfu to max: " << max_bill << " banknotow)\n";
	liczba_banknotow = 0;
}

void SEJF::otworz_sejf()
{
	cout << "Sejf otwarty...\n";
	isOpen = true;
}
void SEJF::zamknij_sejf()
{
	cout << "Sejf zamkniety...\n";
	isOpen = false;
}
void SEJF::pobierz_kase(int nBanknotow, string waluta, int nominal)
{
	int index = 0;
	if(!isOpen)
	{
		cout << "BLAD: nie mozna wyciagnac kasy z zamknietego sejfu\n";
		return;
	}
	if(nBanknotow > max_bill || nBanknotow > liczba_banknotow)
	{
		cout << "BLAD: w sejfie nie ma tyle banknotow\n";
		return;
	}
	if(StringToLower(waluta) == "euro")
	{
		switch(nominal)
		{
		case 5 : index = 0; break;
		case 10: index = 1; break;
		case 20: index = 2; break;
		case 50: index = 3; break;
		case 100: index = 4; break;
		case 200: index = 5; break;
		case 500: index = 6; break;
		}
		if(euro[index] < nBanknotow)
		{
			cout << "Brak tylu banknotow tego nominalu...\n";
			return;
		}
		euro[index] -= nBanknotow;
		liczba_banknotow -= nBanknotow;
		cout << "Pobieram " << nBanknotow << " euro...\n";
	}
	else if(StringToLower(waluta) == "dolar")
	{
		switch(nominal)
		{
		case 1: index = 0; break;
		case 5: index = 1; break;
		case 10: index = 2; break;
		case 20: index = 3; break;
		case 50: index = 4; break;
		case 100: index = 5; break;
		}
		if(dolar[index] < nBanknotow)
		{
			cout << "Brak tylu banknotow tego nominalu...\n";
			return;
		}
		dolar[index] -= nBanknotow;
		liczba_banknotow -= nBanknotow;
		cout << "Pobieram " << nBanknotow << " dolarow...\n";
	}
}
void SEJF::dodaj_kase(int nBanknotow, string waluta, int nominal)
{
	int index = 0;
	if(!isOpen)
	{
		cout << "BLAD: nie mozna wyciagnac kasy z zamknietego sejfu\n";
		return;
	}
	if(nBanknotow > max_bill || (liczba_banknotow + nBanknotow) > max_bill)
	{
		cout << "BLAD: w sejfie nie pomiesci sie tyle banknotow\n";
		return;
	}

	if(StringToLower(waluta) == "euro")
	{
		switch(nominal)
		{
		case 5 : index = 0; break;
		case 10: index = 1; break;
		case 20: index = 2; break;
		case 50: index = 3; break;
		case 100: index = 4; break;
		case 200: index = 5; break;
		case 500: index = 6; break;
		}
		euro[index] += nBanknotow;
		liczba_banknotow += nBanknotow;
		cout << "Wkladam " << nBanknotow << " euro...\n";
	}
	else if(StringToLower(waluta) == "dolar")
	{
		switch(nominal)
		{
		case 1: index = 0; break;
		case 5: index = 1; break;
		case 10: index = 2; break;
		case 20: index = 3; break;
		case 50: index = 4; break;
		case 100: index = 5; break;
		}

		dolar[index] += nBanknotow;
		liczba_banknotow += nBanknotow;
		cout << "Wkladam " << nBanknotow << " dolarow...\n";
	}
}

void SEJF::dane_sejfu()
{
	if(isOpen)
		cout << "SEJF jest otwarty - znajduje sie w nim:\n";
	else
		cout << "SEJF jest zamkniety - znajduje sie w nim:\n";

	int sumban = 0;
	
	cout << euro[0] << "x5 + " << euro[1] << "x10 + " << euro[2] << "x20 + " << euro[3] << "x50 + " 
		 << euro[4] << "x100 + " << euro[5] << "x200 + " << euro[6] << "x500 euro = ";
	sumban = euro[0] * 5 + euro[1] * 10 + euro[2] * 20 + euro[3] * 50 + euro[4] * 100 + euro[5] * 200 + euro[6] * 500;
	cout << sumban << "\n";
	cout << dolar[0] << "x1 + " << dolar[1] << "x5 + " << dolar[2] << "x10 + " << dolar[3] << "x20 + " 
		 << dolar[4] << "x50 + " << dolar[5] << "x100 = ";
	sumban = 0;
	sumban = dolar[0] * 1 + dolar[1] * 5 + dolar[2] * 10 + dolar[3] * 20 + dolar[4] * 50 + dolar[5] * 100;
	cout << sumban << "\n";

}


int main()
{
	SEJF sejfik(500);

	sejfik.dodaj_kase(200,"euro", 50);
	sejfik.dodaj_kase(50, "euro", 100);
	sejfik.dodaj_kase(100, "dolar", 100);
	sejfik.otworz_sejf();
	sejfik.dodaj_kase(200,"euro", 50);
	sejfik.dodaj_kase(50, "euro", 100);
	sejfik.dodaj_kase(100, "dolar", 100);
	sejfik.dane_sejfu();


	cin.sync();
	cin.get();
	return 0;
}

Nie testowalem w calosci

1 użytkowników online, w tym zalogowanych: 0, gości: 1