Definiowanie metod w klasach

0

Witam, próbuje rozwiązać takie zadanko w którym mam napisać definicje klasy sala która ma niepubliczne pola
id - stale pole tekstowe określające nazwę sali, maxOsob - akt. liczba miejsc zajętych w sali oraz metodę Wykorzystanie - % wykorzystania miejsc siedzących w sali oraz publiczne metody:

  • 3 parametrowy konstruktor określający nazwę sali, liczbę miejsc w sali (domyślnie 30) i zajętych (dom. 0)
  • doSali z 1 parametrem typu całkowitego, określającym ile osób chce wejść do sali, jeśli wartość parametru jest za duża metoda odpowiednio zmienia liczbę miejsc zajętych (do pełnego wykorzystania sali) i rzuca wyjątek z komunikatem, że nie wszyscy chętni weszli do sali; w pozostałych przyp. zmienia odpowiednio liczbę miejsc zajętych a wynikiem metody jest liczba miejsc zajętych.
    Do tej pory napisałem tyle:
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Sala
{
protected:
    string  id;
    int  maxOsob;
    int  ileosob;
    double Wykorzystanie()
    {return ileosob/maxOsob*100;}

public:
    Sala(string id,int maxos=30,int ileos=0):id(id),maxOsob(maxos),ileosob(ileos){}

    void doSali(int osoby){
        if(osoby<0){
            string wyjatek="Nie może być liczba ujemna";
            throw wyjatek;
        }
        if (osoby>(maxOsob-ileosob)){
                int iloraz=maxOsob-ileosob;
            string wyjatek="Za duza liczba osob ale wpuściliśmy";

            ileosob=maxOsob;
            throw wyjatek;
        }
        else{
            ileosob+=osoby;
            cout<<ileosob;
        }
    }

    void zSali(int osoby){
        ileosob-=osoby;
    }

Czy dobrze mam zapisaną metodę doSali?

2

W kazdej galezi masz cos nie tak

  • rzucanie stringami
  • walidacja z efektem ubocznym
  • wynik zwracany na cout
0

Program działa ale czy to jest poprawnie zrobione?

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Sala
{
protected:
    string  id;
    int  maxOsob;
    int  ileosob;
    double Wykorzystanie()
    {return ileosob/maxOsob*100;}

public:
    Sala(string id,int maxos=30,int ileos=0):id(id),maxOsob(maxos),ileosob(ileos){ }

    void doSali(int osoby){
        if(osoby<0){
            string wyjatek="Nie moze być liczba ujemna";
            throw wyjatek;
        }
        if (osoby>(maxOsob-ileosob)){
                int iloraz=maxOsob-ileosob;
            string wyjatek2="Za duza liczba osob ale wpuscilismy";

            ileosob=maxOsob;
            throw wyjatek2;
        }
        else{
            ileosob+=osoby;
            cout<<ileosob<<endl;
        }
    }

    void zSali(int osoby){
        ileosob-=osoby;
    }

    void wyswietl(){
        cout<<"Nazwa sali "<<id<<endl;
        cout<<Wykorzystanie()<<endl;
        cout<<ileosob<<"\n"<<maxOsob<<endl;
    }
};

int main()
{

    Sala *sala1=new Sala("Zielona",32,16);
    sala1->wyswietl();
    try{
    sala1->doSali(8);
    }
    catch(string w){
        cout<<w<<endl;
    }
    sala1->wyswietl();
    return 0;

0

Przed wszystkim nie ma komentarzy. Po drugie stosujesz polskie nazwy zmiennych jezuuu. W kalsie zrob setter i getter a pobrane wartosci wyswietlaj dopiero w programie testujacym a nie w klasie. Weź no ty się lepiej za wypikanie bułek xD

0
Piotr cezary napisał(a):

Program działa ale czy to jest poprawnie zrobione?

  • Jeśli dzielisz liczbę całkowitą przez liczbę całkowitą to wynikiem jest... na pewno nie double. Musisz jedną z nich rzutować na double.
  • W poleceniu nie widzę informacji, że masz rzucać wyjątek jeżeli podasz 0 jako parametr doSali
  • Nie rzucaj string. Zrób po ludzku, np. throw runtime_error{"Za duza liczba osob"};
  • Nie potrzebnie używasz new. (i brakuje delete)
  • Nie słuchaj "porad" od @masterO, bo bredzi.
0

Przed wszystkim nie ma komentarzy.

To akurat bardzo dobrze.

W kalsie zrob setter i getter a pobrane wartosci wyswietlaj dopiero w programie testujacym a nie w klasie

o_O Jasne, przeciekające warstwy to najlepsze rozwiązanie. Co tam jakieś obiekty domenowe, OOP, wiązanie operacji z danymi, lepiej klepać proceduralnie jak w latach 70, same struktury i funkcje :D

Jedynie to nazewnictwo faktycznie warto zrobić po angielsku, ale jak masz takie wymagania w zadaniu to nic nie poradzisz. Ale nadal masz doSali które nic nie zwraca, a powinno.

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