[C++] Program obsługujący bibliotekę

0

Witam
Mam do napisania program obsługujący bibliotekę-wypożyczalnię oparty o bazę danych. W programie trzeba uwzględnić dwa rodzaje użytkowników -student z ograniczonym czasem wypożyczenia ustalanym przy wypozyczeniu oraz nauczyciel -bez limitu czasu. Są do wypożyczenia po jednym egzemplarzu ksiązki, gazety lub nagrania.
Napisałem taki oto kod:
( Są zawarte dwie klasy i dwie klasy dziedziczące)
Na razie mam taki problem, że nie wiem jak napisac metodę w klasie "rejestracja", która będzie dodawać użytkownika. Potem następną metodę, która będzie dodawać usuwać i modyfikować wypożyczenia u użytkownika. Na razie sie na tym zatrzymałem, proszę o pomoc

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
///**************************---KLASY---*********************************************//
class rejestracja {
	public:
	int rozmiar_tablicy=1;
	string wydawnictwo,autor,tytul;
	// string ksiazka[];
	string* ksiazka =  new string[rozmiar_tablicy] ;
	int i;
	void dodaj() {
		cout<<"Podaj tytul ksiazki";
		cin>>tytul;
		cout<<"Podaj autora";
		cin>>autor;
		cout<<"Podaj wydawnictwo";
		cin>>wydawnictwo;
		rozmiar_tablicy++;
		ksiazka[rozmiar_tablicy]+=tytul+autor+wydawnictwo;
	}
};

class uzytkownik  {
	protected:
		string imie,nazwisko,nazwa;
	int numer_uzytkownika;
};

class student:uzytkownik {
	private:
		string czaswypozyczenia();
};

class nauczyciel:uzytkownik {
};
class ksiazka:rejestracja {
};
///*********************************************************************************//
int main() {
	poczatek:
		int haslo;
	string tytul;
	cout<<"Witamy w wypozyczalni"<<endl				/// haslo do dorobienia
	<<"Prosze podac haslo";
	cin>>haslo;
	if (haslo!=123456) {
		cout<<"Haslo bledne";
		goto poczatek;
	}
	cout<<"Co chcesz zrobic?"
		<<"1. Zarejestrowac nowego uzytkownika"<<endl
		<<"2. Zarejestrowac nowa ksiazke"<<endl
		<<"3. Zmienic dane uzytkownika";
	int wybor;
	cin>>wybor;
	switch(wybor) {
		case 1:
					cout<<"Podaj rodzaj nowego uzytkownika (nauczyciel/student)";
		cin>>wybor;
		//			int nauczyciel,student;
		case 2:
		        rejestracja();
		break;
	}
	system("pause");
	return 0;
}

kod w <code class="cpp"> i sformatowany automatem (niezbyt ładnie sformatował, ale było /naprawdę/ gorzej) - msm

1

Sam kod wygląda tragicznie. Zacznij od podzielenia każdej klasy na definicje w pliku .h i implementacje w .cpp. Po 2 wszystko co masz w funkcji main oprogramuj w osobnej klasie - w funkcji main masz mieć tylko wywołanie metody np

int main()
{

   Application app;
   app.exec();

}
0
emacs napisał(a):

Sam kod wygląda tragicznie. Zacznij od podzielenia każdej klasy na definicje w pliku .h i implementacje w .cpp. Po 2 wszystko co masz w funkcji main oprogramuj w osobnej klasie - w funkcji main masz mieć tylko wywołanie metody np

int main()
{

   Application app;
   app.exec();

}

Te int main jest źle skopiowane. Powinno być tak:
int main()
{
poczatek:

int haslo;

string tytul;
cout<<"Witamy w wypozyczalni"<<endl /// haslo do dorobienia
<<"Prosze podac haslo";
cin>>haslo;

if (haslo!=123456)
{ cout<<"Haslo bledne";
	goto poczatek;}

cout<<"Co chcesz zrobic?"
<<"1. Zarejestrowac nowego studenta"<<endl
<<"2. Zarejestrowac nowego nauczyciela"<<endl
<<"3. Zarejestrowac nowa ksiazke"<<endl
<<"4. Zmienic dane uzytkownika";

int wybor;
cin>>wybor;

string imie,nazwisko;
int indeks;
uzytkownik ddt;
switch(wybor)
...

To, że klasy powinny być w innych plikach to wiem, mam zamiar zrobić to na koniec. Jak klasy będą gotowe.

0

To badziewie nadaje się wyłacznie do kosza.
Zacznij od przeczytania czegokolwiek o formatowaniu kodu, po czym jakikolwiek kurs C++ pierwsze kilka stron.
Wtedy zacznij od początku.

0

Dobrze, zostawmy więc resztę kodu.

Pytanie: Jak dopisać dane do tablicy "ksiazka"? Nie potrafię odnaleźć błędu..

class rejestracja {
    
    int rozmiar_tablicy=1;
    string wydawnictwo,autor,tytul;
    string* ksiazka =  new string[rozmiar_tablicy] ;
    void dodaj() 
{
        cout<<"Podaj tytul ksiazki";
        cin>>tytul;
        cout<<"Podaj autora";
        cin>>autor;
        cout<<"Podaj wydawnictwo";
        cin>>wydawnictwo;
        rozmiar_tablicy++;

    }
}; 
0
nurek11 napisał(a):

Dobrze, zostawmy więc resztę kodu.

Pytanie: Jak dopisać dane do tablicy "ksiazka"? Nie potrafię odnaleźć błędu..

class rejestracja {
    
    int rozmiar_tablicy=1;
    string wydawnictwo,autor,tytul;
    string* ksiazka =  new string[rozmiar_tablicy] ;
    void dodaj() 
{
        cout<<"Podaj tytul ksiazki";
        cin>>tytul;
        cout<<"Podaj autora";
        cin>>autor;
        cout<<"Podaj wydawnictwo";
        cin>>wydawnictwo;
        rozmiar_tablicy++;

    }
}; 

W tym kodzie nie ma błędu tylko jest niekompletny.

Brakuje Ci tej linijki:

ksiazka[rozmiar_tablicy]+=tytul+autor+wydawnictwo;

i ona jest błędna.

Można by ją ew. poprawić na:

ksiazka[rozmiar_tablicy]=tytul+";"+autor+";"wydawnictwo;

ale potem będziesz miał problem z odczytaniem tych danych.

0

Czyli lepiej by było wpisywać dane do osobnych tablic?

0
nurek11 napisał(a):

Czyli lepiej by było wpisywać dane do osobnych tablic?

To by nie było takie złe, z tym że musiałbyś dodać klasę "kontener książek", która by tymi zarządzała.
Zwróć uwagę na fakt że aktualnie klasy masz skopane - np. metody tylko private lub protected.

przykład

class KolekcjaKsiazek {
  private:
  vector<string> tytulKsiazki_;
  vector<string> autorKsiazki_;
  vector<string> wydawnictwoKsiazki_;

public:
void dodaj(string tytul, string autor, string wydawnictwo) {
  tytulKsiazki_.push_back(tytul);
  autorKsiazki_.push_back(autor);
  wydawnictwoKsiazki_.push_back(wydawnictwo);
}

size_t size() {
  return tytulKsiazki_.size();
}

void clear() {
  tytulKsiazki_.clear();
  autorKsiazki_.clear();
  wydawnictwoKsiazki_.clear();
}

string dajTytul(int index) {
  return tytulKsiazki_[index];
}

...
};

Edit: wylazła ze mnie Java.

0

Podzieliłem program na pliki cpp i h.
Wyglada to teraz tak:

// uzytkownik.h 
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;


class uzytkownik						//*****  UZYTKOWNIK  ********** //
{

	string imie;
	string nazwisko;
	int indeks;
    int liczba_wypozyczen;  // musi byc mniejsza od 3

public:

void dodaj_uz();
void modyfikuj();

};

// ksiazka.h
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

class ksiazka				//*****  KSIAZKA  ********** //
{

    string tytul;
	string autor;
	string wydawnictwo;
	int ISBN;

public:
void dodaj_ks();
void modyfikuj_ks();


};


//uzytkownik.cpp
#include <iostream>
#include <cstdlib>
#include <string>
#include "uzytkownik.h"
#include <fstream>

using namespace std;


void uzytkownik::dodaj_uz()
{
cout<<"Podaj imie";
cin>>imie;
cout<<"Podaj nazwisko";
cin>>nazwisko;
cout<<"Podaj indeks";
cin>>indeks;
}

void uzytkownik::modyfikuj()
{
}

// ksiazka.cpp

#include <iostream>
#include <cstdlib>
#include <string>
#include "ksiazka.h"
using namespace std;



void ksiazka::dodaj_ks()
{
cout<<"Podaj tytul";
cin>>tytul;
cout<<"Podaj autora";
cin>>autor;
cout<<"Podaj wydawnictwo";
cin>>wydawnictwo;
cout<<"Podaj ISBN";
cin>>ISBN;
}

void ksiazka::modyfikuj_ks()
{
}

//main


#include <iostream>
#include <cstdlib>
#include <string>
#include "uzytkownik.h"
#include "ksiazka.h"

using namespace std;

///**************************---KLASY---*********************************************//


class student:uzytkownik				//*****  STUDENT  **** ******//
{
int czas_wypozyczenia; // w miesiacach

};

class nauczyciel:uzytkownik				//*****  NAUCZYCIEL  ********** //
{

};


int main()
{
poczatek:


	int haslo;
	cout<<"Witamy w wypozyczalni"<<endl
		<<"Prosze podac haslo";
	cin>>haslo;


	if (haslo!=123456)
	{ cout<<"Haslo bledne";
		goto poczatek;}

	cout<<"Co chcesz zrobic?"
	<<"1. Zarejestrowac nowego studenta"<<endl
	<<"2. Zarejestrowac nowego nauczyciela"<<endl
	<<"3. Zarejestrowac nowa ksiazke"<<endl
	<<"4. Zmienic dane studenta"<<endl
    <<"5. Zmienic dane nauczyciela";

    int wybor;
    cin>>wybor;

    student s1;
    nauczyciel n1;
    ksiazka k1;

	switch(wybor)
{
		case 1:
        s1.dodaj_uz();
        break;

        case 2:
        n1.dodaj_uz();
        break;

        case 3:
       k1.dodaj_ks();
        break;

        case 4:
        s1.modyfikuj();
        case 5:
        n1.modyfikuj();
}
}

Wyskakuje błąd, "void uzytkownik::modyfikuj() is inaccessible ". Nie potrafię znaleźć przyczyny :/

W jaki sposób mogę tworzyć nowe obiekty?
Wiem, że sposób który jest w funkcji"switch" jest błędny ale to były eksperymenty.. Na razie jestem w kropce..

Mam jeszcze problem z zaprogramowaniem funkcji "modyfikuj" tak, żeby mogła zmieniać, dodawać i usuwać wypożyczone pozycje u uzytkownika

0
class student:public uzytkownik
0

Dziękuję.

Mam zdefiniowaną klase uzytkownik tak:

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


class uzytkownik						//*****  UZYTKOWNIK  ********** //
{
protected:
	string imie;
	string nazwisko;
	int nr;  // indeks
    int liczba_wypozyczen=0;  // musi byc mniejsza od 3

public:

void dodaj_uz();
void modyfikuj();
void wyswietl();

}; 

Oraz klase pochodną nauczyciel i student:

#include <iostream>
#include <cstdlib>
#include <string>
#include "uzytkownik.h"


using namespace std;

class student :public uzytkownik				//*****  STUDENT  **** ******//
{

int czas_wypozyczenia; // w miesiacach

public:
void ustalCzas();
};

#include <iostream>
#include <cstdlib>
#include <string>
#include "uzytkownik.h"


using namespace std;

class nauczyciel:public uzytkownik				//*****  NAUCZYCIEL  ********** //
{
int nr; // PESEL

};

I teraz wyskakuje blad przy klasie uzytkownik
"error: previous definition of 'class uzytkownik'"
oraz
"error: redefinition of 'class uzytkownik'"

W czym jest teraz problem? :/

1
#pragma once

lub: #ifndef UZEYTKOWNIK_H
#define UZEYTKOWNIK_H

#endif


Uwaga **pragma once** - nie jest w standardzie.
0

Dzięki, zadziałało ;)

Teraz pytanko:
Jak stworzyć metodę wirtualną w moim przypadku, tak, żeby po prostu w jednej był int pesel a w drugiej int indeks?

**student.h**

#include <iostream>
#include <cstdlib>
#include <string>
#include "uzytkownik.h"
#include <fstream>

using namespace std;


void uzytkownik::dodaj_uz()
{
cout<<"Podaj imie";
cin>>imie;
cout<<"Podaj nazwisko";
cin>>nazwisko;
cout<<"Podaj numer indeksu";
cin>>indeks;  //indeks
}

**nauczyciel.h**

#include <iostream>
#include <cstdlib>
#include <string>
#include "uzytkownik.h"


using namespace std;

class nauczyciel:public uzytkownik				
{
int pesel; // PESEL

public:
void dodaj_uz()
{
cout<<"Podaj numer pesel";
cin>>pesel;  //pesel
}\
**
uzytkownik.cpp**

#include <iostream>
#include <cstdlib>
#include <string>
#include "uzytkownik.h"
#include <fstream>

using namespace std;


void uzytkownik::dodaj_uz()
{
cout<<"Podaj imie";
cin>>imie;
cout<<"Podaj nazwisko";
cin>>nazwisko;

}
1
#include <iostream>
#include <memory>

class Base
{
public:
	virtual ~Base() {};

	virtual int getInfo() const = 0;
};

class Derived1 : public Base
{
public:
	Derived1(int x) : d1_(x) {}
	virtual int getInfo() const final { return d1_; }

private:
	int d1_;
};

class Derived2 : public Base
{
public:
	Derived2(int x) : d2_(x) {}
	virtual int getInfo() const final { return d2_; }

private:
	int d2_;
};

int main()
{
	std::unique_ptr<Base> d1(new Derived1(1));
	std::unique_ptr<Base> d2(new Derived2(2));

	std::cout << d1->getInfo() << std::endl << d2->getInfo();

	return 0;
}

http://ideone.com/TxOtRJ

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