Programowanie obiektowe - lista zadań nr 3.
Korzystając z klasy Student z poprzedniej listy, stworzyć
listę jednokierunkową umoŜliwiającą wczytanie dowolnej liczby
obiektów typu Student. Składniki klasy muszą być chronione
(private) i dostępne tylko za pomocą odpowiednich metod.
NaleŜy stworzyć Menu umoŜliwiające:
a) Dodanie i wprowadzenie danych nowego studenta na koniec
listy (zwiększając o 1 licznik z ilością obiektów klasy
student - licznik nie moŜe być zmienną globalną)
b) Dodanie i wprowadzenie danych nowego studenta na początek
listy (zwiększając o 1 licznik z ilością obiektów klasy
student - licznik nie moŜe być zmienną globalną)
c) Wyświetlenie ilości aktualnie zapisanych studentów oraz
ich danych (imię, nazwisko, numer indeksu)
d) Wyświetlenie informacji o jednym studencie na podstawie
wczytanego z klawiatury numeru indeksu (wszystkie informacje
z klasy Student)
e) Usunięcie pojedynczego studenta na podstawie wczytanego z
klawiatury numeru indeksu
f) Skasowanie całej listy i zakończenie programu.
Nowe elementy w liście mają być tworzone dynamicznie. Proszę
pamiętać o zwalnianiu pamięci przy kasowaniu elementów z
listy.
#include <iostream>
#include <string>
using namespace std;
/*class Student
{
public:
//skladniki publiczne
//funkcje do obsługi
// void dodajEL(); //dodaje studenta
// void usunEL(); //usuwa studenta
private:
}; //koniec klasy*/
struct EL {
int nr_i; //numer indeksu
EL *next; //nastepny element
};
string imie;
string nazwisko;
//prototypy funkcji
void dodajELp(EL *&s); //dodaje element na poczatek
void dodajELk(EL *&s); //dodaje element na koniec
void wyswietlEL(EL *&s); //wyswietla element
void usunEL(EL *&s); //usuwa jeden element
//void usun(EL *&s); //usuwa wszystko
int ileEL(EL *&s); //liczy elementy
EL *start = NULL;
int main()
{
int wybor;
do {
cerr << "Co chcesz zrobic?\n\n"
<< "[1] Wpisz 1, by dodac studenta na koniec listy "<< endl
<< "[2] Wpisz 2, by dodac studenta na poczatek listy "<< endl
<< "[3] Wpisz 3, by policzyc zapisanych studentow "<< endl
<< "[4] Wpisz 4, by wyswietlic informacje o studencie "<< endl
<< "[5] Wpisz 5, by usunac studenta "<< endl
<< "[6] Wpisz 6, by skasowac liste "<< endl
<< "[0] Wpisz 0, by zakonczyc program "<< endl;
cin >> wybor;
switch(wybor)
{
case 1: dodajELp(start); break; //jest
case 2: dodajELk(start); break; //jest po czesci
case 3: cout << "Jest "<< ileEL(start) << " zapisanych studentow " << endl << endl; break; //jest
// case 4: wyswietlEL(start); break; //nie ma
case 5: usunEL(start); break; //jest
// case 6: usun(start); break; //nie ma
case 0: break;
}
} while(wybor!=0);
system("pause");
return 0;
}
void dodajELp(EL *&s) //dodawanie elementow listy - studentow
{
system("cls"); //czysc ekran
if(s==NULL) //jezeli pierwszy element
{
s=new EL; //stworz nowy
s->next = NULL; //z wartoscia NULL
cerr << "Wpisz imie studenta: " << endl;
cin >> imie;
cerr << "Wpisz nazwisko studenta: " << endl;
cin >> nazwisko;
cerr << "Podaj nr indeksu: " << endl;
cin >> s->nr_i;
}
}
void dodajELk(EL *&s) //dodawanie elementow listy - studentow
{
if(s->next==NULL)//tu dopisac warunek koncowego elementu!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
EL *e = new EL;
e->next = NULL;
s=new EL; //stworz nowy
s->next = NULL; //z wartoscia NULL
cerr << "Wpisz imie studenta: " << endl;
cin >> imie;
cerr << "Wpisz nazwisko studenta: " << endl;
cin >> nazwisko;
cerr << "Podaj nr indeksu: " << endl;
cin >> s->nr_i;
/*EL *licznik = start;
int ile=0;
while(licznik->next!=NULL)
{ ile++;
licznik=licznik->next;
}
licznik->next=e;
for(int i=ile-1;i<=ile;i++)
{
licznik=licznik->next;
}*/
}
}
void usunEL(EL *&s) //usun studenta
{
system("cls"); //czysc ekran
int x_nr; //numer indeksu podawany przy usunieciu
cerr << "Podaj nr indeksu do usuniecia: \n";
cin >> x_nr;
EL *licznik = start; //licznik na poczatek
while(licznik->next!=NULL) //petla przechodzimy az do elementu przedostatniego listy
{
if(licznik->nr_i==x_nr) //jezeli numer indeksu zgadza sie z szukanym
{
//if(licznik->next==NULL)
//{
delete s; //usun studenta
//}
}
licznik=licznik->next; //przypisz dla aktualnego elementu listy, kolejna wartosc
}
}
int ileEL(EL*&s) //licznik elementow
{
system("cls");
int x=0;
while(s!=NULL)
{
x++;
s=s->next;
}
return x;
}
Napisałem program oparty na funkcjach, ale nie działa tak ja powinien.
Np nie rozumiem dlaczego dodawanie elementu koncowego listy (wybór 2) zawiesza działanie programu.
Gdy chciałem usunąć konkretnego studenta po nr indeksu, także zawiesiła się konsola.
Czemu tak się dzieje?