Organizacja danych
Jeśli próbowałeś już pisać jakąś bazę danych, np. przechowującą kontakty telefoniczne do różnych osób to zauważyłeś pewnie, że szukanie nazw tablic i posługiwanie się wieloma tablicami dla jednej osoby nie jest wygodne. Z pomocą przychodzą tu
struktury, które pozwalają na zorganizowanie danych w wygodniejszy sposób.
Struktury potrafią przechowywać różne typy danych. Deklaracja
struktury wygląda następująco:
struct Uzytkownicy_DDT
{
std::string nik;
std::string haslo;
short data_zalozenia_konta;
std: string status;
};
Elementy charakteryzujące ten typ danych to:
? słowo kluczowe
struct, które informuje kompilator, że będzie definiowana struktura,
? opis struktury opisujący zawartość struktury,
? jest to najprostsza postać klasy.
W przykładzie został wykorzystana
biblioteka string, zapoznaj się z nią nim przejdziesz do analizy kursu!
Wykorzystanie struktury w praktyce
Ponieważ wiemy już jak utworzyć własny, bardziej złożony typ danych to dobrze by było, gdybyśmy teraz wiedzieli jak go możemy wykorzystać. Zmienną deklarujemy tak samo, jak w przypadku standardowych typów danych.
#include <iostream>
#include <string>
#include <conio.h>
struct Uzytkownicy_DDT
{
std::string nik;
std::string haslo;
short lp;
std::string status;
std::string rodzaj_konta;
};
int main()
{
using namespace std;
Uzytkownicy_DDT PiotrSzawdynski =
{
"PiotrSzawdynski",
"!@#$%%^",
1,
"Aktywny",
"Admin"
};
Uzytkownicy_DDT Pietrzuch =
{
"Pietrzuch",
"@m@m$@#@",
24,
"Aktywny",
"Moderator"
};
Uzytkownicy_DDT Piotrus_Pan;
Piotrus_Pan.haslo = "PanPiotr";
Piotrus_Pan.lp = 927;
Piotrus_Pan.nik = "Piotrus_Pan";
Piotrus_Pan.rodzaj_konta = "Uzytkownik";
Piotrus_Pan.status = "zablokowany";
cout << "Oto lista uzytkownikow forum DDT"
<< endl << "Nik " << PiotrSzawdynski.nik
<< endl << "haslo " << PiotrSzawdynski.haslo
<< endl << "Nr usera " << PiotrSzawdynski.lp
<< endl << "Status " << PiotrSzawdynski.status
<< endl << "Rodzaj Konta "
<< PiotrSzawdynski.rodzaj_konta
<< endl
<< endl << "Nik " << Pietrzuch.nik
<< endl << "haslo " << Pietrzuch.haslo
<< endl << "Nr usera " << Pietrzuch.lp
<< endl << "Status " << Pietrzuch.status
<< endl << "Rodzaj Konta "
<< Pietrzuch.rodzaj_konta
<< endl
<< endl << "Nik " << Piotrus_Pan.nik
<< endl << "haslo " << Piotrus_Pan.haslo
<< endl << "Nr usera " << Piotrus_Pan.lp
<< endl << "Status " << Piotrus_Pan.status
<< endl << "Rodzaj Konta "
<< Piotrus_Pan.rodzaj_konta;
getch();
return( 0 );
}
Analiza kodu
Jak pewnie się zorientowałeś
strukturę można wypełnić podobnie jak tablicę, gdy oczywiście przed uruchomieniem programu znamy wartości jakie ma zawierać. Co warte podkreślenia
struktura Uzytkownicy_DDT posiada trzy obiekty
PiotrSzawdynski, Pietrzuch, Piotrus_Pan. By wprowadzić bądź wyświetlić wartości danego obiektu, musimy użyć
kropki( . )!!!nazwa_obiektu.nazwa_zmiennej = wartosc_wprowadzana
Większość kompilatorów po wprowadzeniu kropki z klawiatury wyświetla podpowiedz dla danego obiektu(typy danych dla tego obiektu(struktury)).
WAŻNE !!! dla niektórych kompilatorów należy użyć
słowa kluczowego static Uzytkownicy_DDT PiotrSzawdynski.static Uzytkownicy_DDT PiotrSzawdynski =
{
"PiotrSzawdynski",
"!@#$%%^",
1,
"Aktywny",
"Admin"
};
Tablice struktur
#include <iostream>
#include <string>
#include <conio.h>
struct DDT
{
std::string nik;
std::string haslo;
std::string status;
std::string rodzaj_konta;
};
int main()
{
using namespace std;
DDT Uzytkownicy[ 3 ];
cout << "Wprowadz dane.\n";
for( short licz = 0; licz < 3; licz++ ) {
cout << "Podaj nik ";
cin >> Uzytkownicy[ licz ].nik;
cout << "Podaj haslo ";
cin >> Uzytkownicy[ licz ].haslo;
}
cout << endl
<< "Oto rezultat wprowadzonych danych:"
<< endl;
for( short licz = 0; licz < 3; licz++ ) {
cout << "Uzytkownik " << licz + 1
<< " Nik " << Uzytkownicy[ licz ].nik
<< " haslo " << Uzytkownicy[ licz ].haslo
<< endl;
}
getch();
return( 0 );
}
Właściwie nie ma różnić między użyciem tablicy zmiennych a tablicy struktur. Oczywiście możemy też wypełnić tablice w ten sposób:
DDT Uzytkownicy[ 3 ] =
{
{ "PiotrSzawdynski", "!@#$%%^" },
{ "Pietrzuch", "@m@m$@#@" },
{ "Piotrus_Pan", "PanPiotr" }
};
Przypisanie struktury do struktury
Tak jak zmienną można przypisać do innej zmiennej tak samo można postąpić z strukturą danych. Wystarczy użyć operatora ?=?.
#include <iostream>
#include <string>
#include <conio.h>
struct DDT
{
std::string nik;
short wiek;
char plec;
};
int main()
{
using namespace std;
DDT Monika, Mariola, Kasia;
Monika.nik = "Mika";
Monika.plec = 'K';
Monika.wiek = 20;
Kasia = Mariola = Monika;
cout << "Wyswietla uzytkownikow plci pieknej"
<< endl
<< "Nik - " << Kasia.nik << endl
<< "Nik - " << Mariola.nik << " wiek "
<< Mariola.wiek << endl
<< "Nik - " << Monika.nik << " plec "
<< Monika.plec << endl;
getch();
return( 0 );
}
Ćwiczenia
1. Farmer zwrócił się do Ciebie z prośbą byś napisał program, który będzie przechowywał informacje o rodzajach zwierząt jakie posiada. Zwierzęta to krowa, koza, kura, pies i świnia. Cechy tych zwierząt to nazwa, waga, wiek(podany w tygodniach), oraz data nabycia(zakupu). Farmer dodał, iż krowę i świnię kupił 24-04-08r od znajomego, pies przybłąkał się 6.05.02r, natomiast kozę i kurę dostał w prezencie od wójta 23.02.09. Niestety resztę cech musisz określić sam, na podstawie przyjętych średnich(google) dla tych zwierząt. Dane mają być zawarte w strukturze. Rezultatem programu ma być:
a) pierwszy program? wyświetlenie wszystkich danych w przejrzysty i zrozumiały dla użytkownika sposób, użytkownik nic nie podaje, program wyświetla tylko dane.
b) drugi program? program ma poprosić o wprowadzenie nazwy i wagi(w kilogramach) zwierzęcia(mają być wprowadzone trzy zwierzaki) , oraz wyświetleniu danych w odwrotny sposób do tego w jaki zostały wprowadzone, oraz zachowaniu takiej kompozycji
Trzoda zawiera m.in.:
1.->nazwa_zwierzecia jego waga to waga_zwierzecia( podana w gramach ) gram.
2.->
3.->