Podstawy programowania v2 (2008) - Laboratorium 1
LISTA 6. DYNAMICZNE STRUKTURY DANYCH
1. Tablice struktur
Program 1.1 Napisz program, w którym zdefiniujesz strukturę danych
const int MAX = 100;
const int STUD = 300;
struct student {
char nazwisko[MAX], imie[MAX];
int album;
};
W pętli głównej programu zbuduj
MENU:
1 – Wyswietl liste
2 – Dodaj studenta
3 – Znajdz studenta
4 – Usun studenta
W – Wyjscie
Zdefiniuj globalną tablicę struktur student o rozmiarze STUD i opracuj procedury: dodawania, znajdowania i wyświetlania studenta oraz wyświetlania listy. Każda z opcji powinna posiadać odpowiednią funkcję obsługi. Wpisz dane kilku studentów i przetestuj działanie funkcji. Następnie dodaj opcję odnajdowania i usuwania studenta na podstawie wpisanego nazwiska lub albumu.
UWAGA: Proszę zadbać o zunifikowaną formę zapisu bez względu na formę wprowadzania danych dla ułatwienia późniejszego przetwarzania, np. zamieniać na duże litery początki imion i nazwisk, a reszta małe litery lub wszystko dużymi literami.
2. Przeciążanie operatorów
Program 2.1 Uzupełnij poniższy program z przeciążonymi operatorami: + += - -= dla struktur liczb zespolonych o dodatkowe operacje dzielenia i mnożenia.
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
struct zespol{
int a,b; //a+bi; składowa rzeczywista a i urojona b
};
void fnWyswietl(zespol z){
cout<<"("<<z.a<<setiosflags(ios::showpos)<<z.b<<"i)"
<<resetiosflags(ios::showpos);
};
void fnWyswietl(zespol z1,zespol z2,zespol wynik, char operat[4]){
fnWyswietl(z1);cout<<" "<<operat<<" ";fnWyswietl(z2); cout<<" = ";fnWyswietl(wynik);cout<<endl;
}
zespol operator-(zespol z1) { //jednoargumentowy '-'
zespol wynik={0,0};
wynik.a=-1*z1.a;
wynik.b=-1*z1.b;
return wynik;
}
zespol operator+(zespol z1) { //jednoargumentowy '+'
zespol wynik={0,0};
wynik.a=z1.a;
wynik.b=z1.b;
return wynik;
}
zespol operator+(zespol z1,zespol z2) { //dwuargumentowy '+'
Podstawy programowania v2 (2008) - Laboratorium 2
zespol suma={0,0};
suma.a=z1.a+z2.a;
suma.b=z1.b+z2.b;
return suma;
}
zespol operator+(zespol z1,int rzeczyw) { //dwuargumentowy '+'
zespol suma={0,0};
suma.a=z1.a+rzeczyw;
suma.b=z1.b;
return suma;
}
zespol operator+(int rzeczyw,zespol z1) { //dwuargumentowy '+'
zespol suma={0,0};
suma.a= rzeczyw+z1.a;
suma.b=z1.b;
return suma;
}
zespol operator-(zespol z1,zespol z2) { //dwuargumentowy '-'
zespol suma={0,0};
suma.a=z1.a-z2.a;
suma.b=z1.b-z2.b;
return suma;
}
zespol operator-(zespol z1,int rzeczyw) { //dwuargumentowy '+'
zespol suma={0,0};
suma.a=z1.a-rzeczyw;
suma.b=z1.b;
return suma;
}
zespol operator-(int rzeczyw,zespol z1) { //dwuargumentowy '+'
zespol suma={0,0};
suma.a=rzeczyw-z1.a;
suma.b=-1*z1.b;
return suma;
}
zespol operator+=(zespol z1,zespol z2) { //dwuargumentowy "+="
zespol suma={0,0};
suma=z1+z2;
return suma;
}
zespol operator+=(zespol z1,int rzeczyw) { //dwuargumentowy "+="
zespol suma={0,0};
suma=z1+rzeczyw;
return suma;
}
zespol operator+=(int rzeczyw, zespol z1) { //dwuargumentowy "+="
zespol suma={0,0};
suma= rzeczyw+z1;
return suma;
}
zespol operator-=(zespol z1,zespol z2) { //dwuargumentowy "-="
zespol suma={0,0};
suma=z1-z2;
return suma;
}
zespol operator-=(zespol z1,int rzeczyw) { //dwuargumentowy "-="
zespol suma={0,0};
suma=z1-rzeczyw;
return suma;
}
zespol operator-=( int rzeczyw, zespol z1) { //dwuargumentowy "-="
zespol suma={0,0};
suma= rzeczyw-z1;
Podstawy programowania v2 (2008) - Laboratorium 3
return suma; }
///////////////////////////////////////////// MAIN /////////////////////////////////////////////////
int main(){
zespol x={2,3},y={4,5},wynik;
wynik=x+y; //dwuargumentowy '+'
fnWyswietl(x,y,wynik,"+");
zespol k={4,3};
fnWyswietl(+wynik,k,wynik+=k,"+"); //jednoargumentowy '+' i dwuargumentowy "+="
fnWyswietl(k=-wynik); //jednoargumentowy '-'
cout<<endl;
wynik=x-y;
fnWyswietl(x,y,wynik,"-");
fnWyswietl(wynik,k,wynik-=k,"-"); //dwuargumentowy "-="
fnWyswietl(x);cout<<" + 5 = ";fnWyswietl(wynik=x+5);cout<<endl;
//dodawanie rzeczywistej po prawej cout<<"5 + ";fnWyswietl(x);cout<<" = ";fnWyswietl(wynik=5+x);cout<<endl;
//dodawanie rzeczywistej po lewej fnWyswietl(x);cout<<" - 5 = ";fnWyswietl(wynik=x-5);cout<<endl;
//odejmowanie rzeczywistej po prawej cout<<"5 - ";fnWyswietl(x);cout<<" = ";fnWyswietl(wynik=5-x);cout<<endl;
//odejmowanie rzeczywistej po lewej system("PAUSE");
return 0;
}
Program 2.2 Przerób program 2.1 zmieniając funkcje wyświetlania na przeciążony operator skierowania strumienia ”<<”.
3. Tablice wskaźników na struktury powoływane dynamicznie
Program 3.1 Przerób program 1.1 zmieniając tablicę struktur student na tablicę wskaźników do struktur student.
Dane studentów powinny być dodawane jako dynamicznie powoływane struktury przez operator new, a kolejne wskaźniki wpisywane do globalnej tablicy wskaźników na strukturę student o rozmiarze STUD. Odtwórz pełną funkcjonalność programu.
Rysunek pomocniczy:
(UWAGA: OSTROśNIE ZE WSKAŹNIKAMI DLA NIEISTNIEJĄCYCH REKORDÓW W TABLICY): const int MAX = 100;
const int STUD = 300;
struct student {
char nazwisko[MAX], imie[MAX];
int album;
};
int stud=0;
student *TabStud[STUD];
new
[0]
SEGMENT:OFFSET
nazwisko
imie
album
new
[1]
SEGMENT:OFFSET
nazwisko
imie
album
new
[2]
SEGMENT:OFFSET
nazwisko
imie
album
stud [3]
?????:?????
????? (Uzycie grozi: Segmentation Fault)
[4]
?????:?????
????? (Uzycie grozi: Segmentation Fault)
[5]
?????:?????
????? (Uzycie grozi: Segmentation Fault)
.......
[STUD-1]
?????:?????
????? (Uzycie grozi: Segmentation Fault)
Podstawy programowania v2 (2008) - Laboratorium 4
4. Dynamiczne struktury danych na przykładzie listy Program 4.1 Przerób program 3.1 zmieniając tablicę wskaźników do struktur student na listę jednokierunkową.
Dane studentów powinny być dodawane jako dynamicznie powoływane struktury przez operator new i dopisywane na koniec listy. Odtwórz pełną funkcjonalność programu. Proszę zwrócić uwagę na różne przypadki: lista pusta i wpięcie na końcu listy.
Rysunek pomocniczy:
wezel 1
wezel 2
wezel n
pierwszy
nastepny
nastepny
.........
nastepny
NULL
dane
dane
dane
Program 4.2. Przerób program 4.1 zmieniając sposób dołączania elementów do listy. Nowi studenci powinni być dołączani do listy we właściwym miejscu w porządku rosnących numerów albumu. Program powinien najpierw znaleźć właściwe miejsce dołączenia do listy, a potem je wykonać. Proszę zwrócić uwagę na różne przypadki: lista pusta, wpięcie na początku listy, na końcu listy oraz pomiędzy istniejącymi węzłami.