Ok. To teraz wystawianie oceny ;) Czy da się dodać funkcję wirtualną w klasie 'osoba', tak aby wywoływała zgodnie z oczekiwaniami albo metodę studenta, albo pracownika? Czy mam to wywoływać jako konstruktor, tak jak próbuję, lecz mi nie wychodzi?
#include <string>
#include <time.h>
#include <iostream>
#include <fstream>
#define N 20
using namespace std;
/////////////deklaracje
void fun(string aa);
void menu();
class osoba {
protected:
float ocena;
string nazwisko;
public:
osoba* nast;
osoba(float ocena1, string nazwisko1)
{ ////konstruktor dodaj
ocena = ocena1;
nazwisko = nazwisko1;
}
osoba()
{ ////konstruktor dodaj
ocena = -1;
nazwisko = "none";
}
virtual void wypisz() = 0; //metoda wirtualna - wypisz
// virtual osoba* ocen(osoba* glowa, int id) = 0;
///setery
void setOcena(float ocena1) { ocena = ocena1; }
void setNazwisko(string Nazwisko) { nazwisko = Nazwisko; }
virtual void setID(int id) = 0;
virtual void setNR(int nr) = 0;
//getery
virtual int getID() = 0;
virtual int getNR() = 0;
float getOcena() { return ocena; }
string getNazwisko() { return nazwisko; }
};
class student : public osoba {
protected:
int ID;
public:
student* nast;
student(int ID1, string nazwisko1, float ocena1)
: ID(ID1)
, osoba(ocena1, nazwisko1)
{
}
student(osoba* glowa)
{
string naz = "null";
osoba* wsk = glowa;
int a = NULL;
//ID = a;
//nazwisko = naz;
cout << "Podaj nr ID studenta: ";
while ((scanf_s("%d", &a)) != 1 || a <= 9999 || a >= 100000 || getchar() != '\n') {
cout << "Nr ID musi skladac sie z 5 cyfr!\n";
cout << "Wprowadz ponownie:\n";
while (getchar() != '\n')
;
}
while (wsk != NULL) {
int ID = wsk->getID();
if (ID == a) {
cout << "Student z takim ID juz figuruje w bazie\n";
while ((scanf_s("%d", &a)) != 1 || a <= 9999 || a >= 100000 || getchar() != '\n') {
cout << "Nr ID musi skladac sie z 5 cyfr!\n";
cout << "Wprowadz ponownie:\n";
while (getchar() != '\n')
;
}
wsk = glowa;
}
wsk = wsk->nast;
}
cout << "\nPodaj nazwisko studenta: ";
cin >> naz;
ID = a;
nazwisko = naz;
}
student(osoba* glowa, int id)
{
fun("Edycja oceny studenta: ");
osoba* wsk;
wsk = glowa;
while (wsk != NULL) {
if (wsk->getID() == id) {
float ocena;
while ((scanf_s("%f", &ocena)) != 1 || ocena != 2 && ocena != 3 && ocena != 3.5 && ocena != 4 && ocena != 4.5 && ocena != 5 || getchar() != '\n') {
cout << "Ocena to cyfra z przedziału [2,5]! Uwzgledniane sa oceny polowiczne.\n";
cout << "Wprowadz ponownie:\n";
while (getchar() != '\n')
;
}
wsk->setOcena(ocena);
}
wsk = wsk->nast;
}
}
void wypisz()
{
cout << ID << "\t\t";
cout << nazwisko << "\t\t";
if (ocena != -1) {
printf("%.1f\t\t\n\n", ocena);
}
else {
cout << "\n\n";
}
}
///setery
void setNR(int id) { id = ID; }
void setID(int id) { id = ID; }
//getery
int getNR() { return ID; }
int getID() { return ID; }
~student()
{
delete nast;
}
};
class pracownik : public osoba {
protected:
int nr_umowy;
public:
pracownik* nast;
pracownik(int NR1, string nazwisko1, float ocena1)
: nr_umowy(NR1)
, osoba(ocena1, nazwisko1)
{
}
pracownik(osoba* glowa)
{
string naz = "null";
osoba* wsk = glowa;
int a = NULL;
//ID = a;
//nazwisko = naz;
cout << "Podaj nr umowy pracownika: ";
while ((scanf_s("%d", &a)) != 1 || a <= 999999 || a >= 10000000 || getchar() != '\n') {
cout << "Nr umowy musi skladac sie z 7 cyfr!\n";
cout << "Wprowadz ponownie:\n";
while (getchar() != '\n')
;
}
while (wsk != NULL) {
int ID = wsk->getID();
if (ID == a) {
cout << "Pracownik z takim nr juz figuruje w bazie\n";
while ((scanf_s("%d", &a)) != 1 || a <= 999999 || a >= 10000000 || getchar() != '\n') {
cout << "Nr umowy musi skladac sie z 7 cyfr!\n";
cout << "Wprowadz ponownie:\n";
while (getchar() != '\n')
;
}
wsk = glowa;
}
wsk = wsk->nast;
}
cout << "\nPodaj nazwisko pracownika: ";
cin >> naz;
nr_umowy = a;
nazwisko = naz;
}
osoba* ocen(osoba* glowa, int nr)
{
fun("Edycja oceny pracownika: ");
osoba* wsk;
wsk = glowa;
while (wsk != NULL) {
if (wsk->getNR() == nr) {
float ocena;
while ((scanf_s("%f", &ocena)) != 1 || ocena < 0 || ocena > 5 || getchar() != '\n') {
cout << "Ocena to liczba z przedzialu [0,5]!\n";
cout << "Wprowadz ponownie:\n";
while (getchar() != '\n')
;
}
wsk->setOcena(ocena);
return wsk;
}
wsk = wsk->nast;
}
}
void wypisz()
{
cout << nr_umowy << "\t\t";
cout << nazwisko << "\t\t";
if (ocena != -1) {
printf("%.1f\t\t\n\n", ocena);
}
else {
printf("\n\n");
}
}
///setery
void setID(int id) { nr_umowy = id; }
void setNR(int NR) { nr_umowy = NR; }
///getery
int getID() { return nr_umowy; }
int getNR() { return nr_umowy; }
~pracownik()
{
delete nast;
}
};
class lista {
public:
osoba* glowa;
lista()
: glowa(NULL)
{
}
void dodaj(osoba* dodaj)
{
if (glowa == NULL) {
glowa = dodaj;
glowa->nast = NULL;
}
else {
osoba* wsk;
for (wsk = glowa; wsk->nast != NULL; wsk = wsk->nast)
;
wsk->nast = dodaj;
wsk->nast->nast = NULL;
}
}
void wypisz_s()
{
fun("Wyświetlanie listy studentów");
osoba* a;
cout << "\t\t** STUDENCI ** \n\n";
cout << "Nr ID\t\tNazwisko\tOcena\n\n";
for (a = glowa; a != NULL; a = a->nast) {
if (a->getID() < 100000)
a->wypisz();
}
}
void wypisz_p()
{
fun("Wyświetlanie listy pracowników: ");
osoba* b;
cout << "\t\t** PRACOWNICY ** \n\n";
cout << "Nr \t\tNazwisko\tOcena\numowy\n\n";
for (b = glowa; b != NULL; b = b->nast) {
if (b->getNR() > 999999)
b->wypisz();
}
cout << endl;
}
};
int main()
{
lista* nowa = new lista();
osoba* glowa = NULL;
osoba*wsk = glowa;
int wybor = 1;
while (wybor != 0) {
menu();
cin >> wybor;
system("cls");
if (wybor == 1) {
nowa->dodaj(new student(glowa));
system("cls");
}
if (wybor == 2) {
nowa->dodaj(new pracownik(glowa));
system("cls");
}
if (wybor == 3) {
//osoba* wsk;
//wsk = glowa;
int nr1;
cout << "Podaj ID studenta, ktorego ocene chcesz zmienic:\n";
cin >> nr1;
cout << "Wpisz ocene:\n";
student(glowa, nr1);
}
/*
if (wybor == 4) {
osoba* wsk;
wsk = glowa;
int nr1;
cout << "Podaj nr umowy pracownika, ktorego ocene chcesz zmienic:\n";
cin >> nr1;
cout << "Wpisz ocene:\n";
wsk->ocen(glowa, nr1);
}
*/
if (wybor == 10) {
nowa->wypisz_s();
nowa->wypisz_p();
system("pause");
system("cls");
}
}
return 0;
delete nowa;
}
void menu()
{
fun("Wyswietlanie MENU: ");
cout << "\n\n\t\t**MENU**\n\n";
cout << "1) Dodaj nowego studenta\n";
cout << "2) Dodaj nowego pracownika\n";
cout << "3) Wystaw ocene studentowi\n";
cout << "4) Ocen pracownika\n";
cout << "5) Usun studenta z listy\n";
cout << "6) Usun pracownika z listy\n";
cout << "7) Drukuj\n";
cout << "8) Sprawdz, ilu studentow otrzymalo dana ocene\n";
cout << "9) Sortuj wzgledem oceny\n";
cout << "\n10) Wyswietl aktualna liste\n";
cout << "0) WYJSCIE\n\n";
cout << "Co chcesz zrobić? :\n " << endl;
}
ofstream wej("raport.txt");
void fun(string aa)
{
time_t czas;
string bum = aa;
struct tm* ptr;
time(&czas);
ptr = localtime(&czas);
char* data = asctime(ptr);
//std::cout << "Data: " << data;
ofstream plikout("raport.txt", ios::app);
wej << bum << " Data: " << data << endl;
}