C++ dzienniczek.

0

Witam. Zmagam się z takim małym dziennikiem, mocno okrojonym. Wiem, że najłatwiej byłoby zrobić to na wektorach, ale staram się zrobić w najbardziej tradycyjny sposób i po swojemu napisać funkcję push_back po swojemu z użyciem konstruktora kopiującego, ale ni cholery nie rozumiem zasady działania. Jakieś sugestie jak się za to zabrać?

 #include <conio.h>
#include <istream>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <stdio.h>
#include <string>
 
using namespace std;
 
class Student
{
public: 
    string nazwisko;
    int indeks;
	bool obecnosc[7];
	float *oceny;
	Student(string nazw="NAZWISKO",int ind=0)
	{
		nazwisko=nazw;
		indeks=ind;
	}
};
 
class Dziennik
{
private:
	Student *tablica;
	unsigned iloscstudentow;
	unsigned licznikzajec;
public:
	Dziennik(unsigned iloscs=0,unsigned licznikz=1):tablica()
	{
		tablica=new Student[iloscstudentow];
		iloscstudentow=iloscs;
		licznikzajec=licznikz;
	}
	Dziennik(Dziennik &);
	void dodajStudenta(Student stu)
	{
		Student *nowa(tablica);
		nowa=new Student[iloscstudentow+1];
		nowa[iloscstudentow+1]=stu;
		delete []tablica;
		++iloscstudentow;
		tablica=nowa;	
	}
	void sprawdzObecnosc()
	{
		cout<<licznikzajec;
		bool x;
		switch(licznikzajec)
		{
		case 1:
            {
				for(int i=0;i<iloscstudentow;i++)
				{
					cout<<"Czy uczen: "<<tablica[i].nazwisko<<" jest obecny? (1-tak, 0-nie)";
					cin>>x;
					tablica[i].obecnosc[1]=x;
				}
            }
        break;

		case 2:
            {
				for(int i=0;i<iloscstudentow;i++)
				{
					cout<<"Czy uczen: "<<tablica[i].nazwisko<<" jest obecny? (1-tak, 0-nie)";
					cin>>x;
					tablica[i].obecnosc[2]=x;
				}
            }
        break;

		case 3:
			{
				for(int i=0;i<iloscstudentow;i++)
				{
					cout<<"Czy uczen: "<<tablica[i].nazwisko<<" jest obecny? (1-tak, 0-nie)";
					cin>>x;
					tablica[i].obecnosc[3]=x;
				}
			}
		break;

		case 4:
			{
				for(int i=0;i<iloscstudentow;i++)
				{
					cout<<"Czy uczen: "<<tablica[i].nazwisko<<" jest obecny? (1-tak, 0-nie)";
					cin>>x;
					tablica[i].obecnosc[4]=x;
				}
			}
		break;

		case 5:
			{
				for(int i=0;i<iloscstudentow;i++)
				{
					cout<<"Czy uczen: "<<tablica[i].nazwisko<<" jest obecny? (1-tak, 0-nie)";
					cin>>x;
					tablica[i].obecnosc[5]=x;
				}
			}
		break;

		case 6:
			{
				for(int i=0;i<iloscstudentow;i++)
				{
					cout<<"Czy uczen: "<<tablica[i].nazwisko<<" jest obecny? (1-tak, 0-nie)";
					cin>>x;
					tablica[i].obecnosc[6]=x;
				}
			}
		break;

		case 7:
			{
				for(int i=0;i<iloscstudentow;i++)
				{
					cout<<"Czy uczen: "<<tablica[i].nazwisko<<" jest obecny? (1-tak, 0-nie)";
					cin>>x;
					tablica[i].obecnosc[7]=x;
				}
			}
		break;

		default: cout<<"Zajec bylo tylko 7!";
		}
		++licznikzajec;
	}
	void dodajOcene(int indeks,float ocena)
	{
		
	}
};
 
int main()
{
	Dziennik dzien;
    for(;;)
    {
        cout<<"Dostepne opcje: "<<endl;
        cout<<"1. Dodanie studenta."<<endl;
		cout<<"2. Sprawdzenie obecnosci."<<endl;
        cout<<"3. Dodanie oceny."<<endl;
        cout<<"4. Wyjscie."<<endl;
        cout<<"Wybieram: ";
        char odpowiedz;
        odpowiedz=_getch();
        cout<<endl;
 
        switch(odpowiedz)
        {
        case '1':
            {
				string nazw;
				int ind;
				cout<<"Podaj nazwisko studenta: ";
				cin>>nazw;
				cout<<"Podaj indeks studenta: ";
				cin>>ind;
				Student *s=new Student(nazw,ind);
                dzien.dodajStudenta(*s);
            }
        break;
 
		case '2':
            {
				dzien.sprawdzObecnosc();
            }
        break;
 
        case '3':
            {
				int ik;
				float oc;
				cout<<"Podaj numer indeksu studenta dla ktorego chcesz wprowadzic ocene: ";
				cin>>ik;
				cout<<"Podaj jaka ocene chcesz wprowadzic: ";
				cin>>oc;
				dzien.dodajOcene(ik,oc);
            }
        break;
 
        case '4':
            {
                exit(0);
            }
        break;
 
        default: cout<<"Nie ma takiej opcji w menu!";
        }
        getchar();
        getchar();
        system("cls");
    }
    return 0;
}
3
  1. Pozbądź się wszystkich C-tablic, które robią co najwyżej syf.
  2. DRY & KISS - w wielu miejscach kod jest bez sensu lub można go skrócić do 2 linijek jedną pętlą.
  3. Przemyśl zależności.
  4. Poczytaj o konstruktorze kopiującym i zadaj sobie pytanie czy naprawdę go potrzebuję? 1
  5. Jeśli nie chcesz użyć gotowych klas z biblioteki standardowej, napisz swój własny szablon o podobnym działaniu.
  6. Wstaw taki kod po dołączeniu nagłówków:
#define getch _getch
#define _getch static_assert(false, "Do not even try to use getch, fool.");

1 - w większości przypadków nie

0

Niestety mam związane ręce w niektórych aspektach. Ma to wyglądać tak:

Klasa Student o argumentach:
-string nazwisko
-int indeks
-tablica bool obecnosci[7]
-tablica int oceny (dynamiczna)

Klasa Dziennik o metodach:
-dodajucznia(Student s)
-sprawdzobecnosc()
-dodajocene(int nrindeks,int ocena)

  • konieczne użycie konstruktora kopiującego.

Smuteg :C gdyby nie to to od razu bym się wziął za vektory i byłoby 100% łatwiej.

2

Przeto pozycja ucznia w dzienniku mówi o jego indeksie.
Ale w formie takiej jaka tutaj występuje musisz po prostu skopiować wszystkie elementy; W przypadku tablic pomocną okaże się być funkcja memcpy

1

Dodałbym do tego co już tu napisano, że taki realoc jaki robisz jest nieefektywny i bezsensowny. Robi się to przydzielając z góry ciut więcej pamięci, by realokacje robić jak najrzadziej, albo stosuje się inny typ danych, np listę tablic.

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