Struktury danych, Programowanie, wykłady C++


Struktury danych

Organizowanie danych w paczki

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. Deklaracja struktury wygląda następująco:

struct wlasna_nazwa_typu
{
 
//tutaj deklarujemy zmienne jakie mają się znaleść nowym, własnym typie
};

Przykładowo, jeśli chcemy utworzyć strukturę do przechowywania danych osoby, możemy to zrobić tak:

struct OsobaST
{
 
std::string imie;
 
std::string nazwisko;
 
std::string telefon;
 
int wiek;
};

Jak wykorzystujemy strukturę 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. Czyli zapis OsobaST nowa_osoba; utworzy nam zmienną o nazwie nowa_osoba, której typem jest OsobaST.

Odczytywanie i zapisywanie danych do struktury

Odczytywanie i zapisywanie danych do zmiennej, która jest strukturą jest bardzo prosta. Mianowicie podajmy nazwę zmiennej, stawiamy kropkę a następnie podajemy nazwę pola jakie ma być wczytane/wyświetlone. Przykład wczytywania/wypisywania danych do/ze struktury.

cin>>nowa_osoba.imie;
cin>>nowa_osoba.nazwisko;
cin>>nowa_osoba.telefon;
cin>>nowa_osoba.wiek;
cout<<nowa_osoba.imie<<
" "<<nowa_osoba.nazwisko<<endl;
cout<<
"tel: "<<nowa_osoba.telefon<<" wiek: "<<nowa_osoba.wiek<<endl;

Struktury a funkcje

Język C++ umożliwia tworzenie funkcji wewnątrz struktury. Nie będziemy jednak tego teraz omawiali, ponieważ temat ten zostanie omówiony dla klas.

Tworzymy dużą aplikację

Zanim przystąpimy do pisania dużej aplikacji musimy uświadomić sobie, co chcemy napisać. Następnie ustalamy jakie możliwości ma mieć nasz pisany program. Określenie możliwości programu już na samym jego początku jest kluczowe dla każdego projektu. Dzięki temu, wiemy co chcemy pisać i dążymy do rozwiązywania problemów, jeśli na takie natrafimy.

Nazwij plik tak, aby kojarzył Ci się z zadaniem które wykonuje. Ponieważ napiszemy prostą książkę telefoniczną, to plik nazwiemy ksiazkatel.cpp.

Określenie zadań

Zadania organizujemy sobie najlepiej w krótkie punkty, aby mieć możliwość odhaczania rzeczy, które zostały napisane. Tak więc lista rzeczy, które chcielibyśmy napisać to:

Ponieważ nie znamy obsługi plików to nie deklarujemy chęci wczytywania i zapisywania danych. Zresztą na tym etapie projektu wczytywanie i zapisywanie danych jest zbędne - narazie trzeba myśleć o napisaniu wymienionych elementów.

19.4.3. Ustalamy ograniczenia

Ponieważ nie znasz jeszcze dynamicznego zarządzania pamięcią, musimy wstępnie przyjąć, że program ma mieć ograniczoną ilość danych. Maksymalna ilość osób jaka może być w bazie to będzie załóżmy 50 osób. Na początku programu utworzymy stałą, która ułatwi nam później ewentualne zwiększenie limitu osób.

Ustalamy dane jakie ma posiadać osoba

Kolejnym etapem jest ustalenie danych, jakie mamy wczytywać do programu. Dla nas będzie to:

Jeśli chcesz mieć więcej pól utwórz już strukturę, która będzie magazynowała dane jednej osoby.

Dzielimy zadania na funkcje

Aby kod nie przerósł naszych możliwości i nie zapanował w nim chaos, musimy ustalić deklaracje funkcji, jakie przydałby nam się do zarządzania danymi. Ja proponuję takie rozwiązanie:

OsobaST WczytajOsobe(void);
void WyswietlDaneOsoby(OsobaST);
void WyswietlListeOsob(OsobaST tablica[],int iloscElelemtow);
void KasujOsobe(OsobaST tablica[],int &iloscElelemtow,int indeksDoSkasowania);
void DodajOsobe(OsobaST tablica[],int &aktualnaIloscElementow);
void EdytujDaneOsoby(OsobaST&);

Ponieważ chcielibyśmy mieć listę, którą będziemy przesuwali strzałkami, to będzie nam potrzebna taka informacja jak element zaznaczony na liście. Modyfikujemy więc deklarację funkcji odpowiedzialną za wyświetlanie danych i dopisujemy nowy parametr.

void WyswietlListeOsob(OsobaST tablica[],int iloscElelemtow,int zaznaczElement);

Jak się dłużej zastanowimy, to dojdziemy do wniosku, że gdy będzie w bazie więcej osób, niż wierszy na ekranie, to nie zmieszczą nam się osoby wszystkie osoby na niej. Będziemy więc musieli zacząć wyświetlać listę od któregoś indeksu (niekoniecznie od zerowego). Znowu modyfikujemy deklarację funkcji tak, aby uwzględniała to.

void WyswietlListeOsob(OsobaST tablica[],int iloscElelemtow,int zaznaczElement,int WyswietlOdElementu);

Określamy zadania dla bloku głównego

Blok główny chcemy, żeby zarządzał klawiaturą i wywoływał zadania. Wywoływanie zadań będziemy dodawali stopniowo, w miarę rozwoju programu. W bloku głównym umieścimy tablicę z danymi, którą będziemy przekazywali za pomocą parametrów do odpowiednich funkcji.

Przystępujemy do kodowania

Po wprowadzonych poprawkach na etapie projektowania aktualne funkcje wydają się rozsądnie zaprojektowane, więc przystępujemy do kodowania bloku głównego programu. Jeśli będzie potrzeba wprowadzania jeszcze modyfikacji, oczywiście zrobimy to już w locie. Nie należy jednak wychodzić z założenia, że wszystko będziemy pisali w locie, bo tak to mało co będzie nam prawdopodobnie poprawnie działało.

#include <iostream>
#include <conio.h>
#include "console.ddt"
#define MAX_OSOB 50
using namespace ddt::console;
using namespace std;
struct OsobaST
{
 
string imie;
 
string nazwisko;
 
string telefon;
};
OsobaST WczytajOsobe(
void);
void WyswietlDaneOsoby(OsobaST);
void WyswietlListeOsob(OsobaST tablica[],int iloscElelemtow);
void KasujOsobe(OsobaST tablica[],int &iloscElelemtow,int indeksDoSkasowania);
void DodajOsobe(OsobaST tablica[],int &aktualnaIloscElementow);
void EdytujDaneOsoby(OsobaST&);
void WyswietlKomunikaty(void)
{
  gotoxy(1,25);
  cout<<
"[ESC] Wyjscie     ";
  cout<<
"[INSERT] Dodaj wpis     ";
 
return;
}
int main()
{
  OsobaST osoby[MAX_OSOB];
 
int iloscOsob=0;
 
bool koniec=false;
 
while(koniec!=true)
 
{
    clrscr();
    WyswietlKomunikaty();
   
unsigned char znak=getch();
   
switch(znak)
   
{
     
case 27://ESC
      koniec=
true;
     
break;
   
}
 
}
 
return(0);
}

Jedyną rzeczą, której do tej pory nie omówiliśmy to #define nazwa wartosc;. Generalnie zapis taki wykorzystujemy do zdefiniowania stałej, która podczas kompilacji jest wstawiana w miejsca w których pojawia się nazwa. Dyrektywy preprocesora zostaną omówione w jednym z dalszych rozdziałów.



Wyszukiwarka

Podobne podstrony:
Algorytmy i struktury danych AiSD-C-Wyklad05
Algorytmy i struktury danych, AiSD C Wyklad04 2
Algorytmy i struktury danych AiSD-C-Wyklad04
tp w 12 Programowanie strukturalne, INFORMATYKA, PROGRAMOWANIE, wykłady
Algorytmy i struktury danych, AiSD C Wyklad03 2
Algorytmy i struktury danych, AiSD C Wyklad04
Algorytmy i struktury danych Wykład 8 Języki programowania
Algorytmy i struktury danych Wykład 1 Reprezentacja informacji w komputerze
Algorytmy i struktury danych Wykład 3 i 4 Tablice, rekordy i zbiory
Algorytmy, struktury danych i techniki programowania wydanie 3
Algorytmy wyklady, Elementarne struktury danych
ALS - 009-005 - Program Sortowanie INSERTION SORT, Informatyka - uczelnia, WWSI i WAT, wwsi, SEM II,
wyk.9, Informatyka PWr, Algorytmy i Struktury Danych, Architektura Systemów Komputerowych, Assembler
wyk.7.1, Informatyka PWr, Algorytmy i Struktury Danych, Architektura Systemów Komputerowych, Assembl
ALS - 007-005a - Program drzewa BST, Informatyka - uczelnia, WWSI i WAT, wwsi, SEM II, Algorytmy i S
wyk.7, Informatyka PWr, Algorytmy i Struktury Danych, Architektura Systemów Komputerowych, Assembler
wyk.8, Informatyka PWr, Algorytmy i Struktury Danych, Architektura Systemów Komputerowych, Assembler
Algorytmy struktury danych i techniki programowania

więcej podobnych podstron