złożone struktury danych tablice i pliki
Przy olbrzymiej liczbie danych musimy je zorganizować w pamięci w pewne struktury.
Najważniejsze struktury (we wszystkich językach) to tablice i pliki.
Tablice.
Tablice to struktury o ściśle określonej liczbie elementów (obiektów) tego samego typu.
Tablica ma jeden identyfikator (nazwę) oraz może mieć wiele indeksów (wymiarów).
Tablice jednowymiarowe i dwuwymiarowe odpowiadają bezpośrednio matematycznym
wektorom i macierzom.
Tablice mogą mieć więcej wymiarów również w c/c++ ale język ten nie jest przyjazny
dla tablic (tak jak FORTRAN, Pascal i szczególnie Matlab).
Inna nazwa potoczna to zmienna indeksowana.
Dostęp do tablic jest indeksowany
(do dowolnego elementu znając indeksy lub wskazniki).
Uwaga: Kompilatory C nie kontrolują wielkości tablic !!!!. Można zapełniać i czytać
Elementy spoza zadeklarowanego zakresu. I ingerować w obce dane.
Kontrola tablic jest obowiązkiem samego programisty.
int k[6]; - oznacza deklarację tablicy jednowymiarowej o sześciu elementach:
k[0], k[1], k[2], k[3], k[4], k[5].
można to sobie wyobrazić geometrycznie jako np. 6 ksiązek na półce.
Uwaga:
W języku c/c++ indeks tablicy zawsze zaczyna się od zera!!!
Pamiętajmy, że dla deklaracji float x[100] nie istnieje element x[100] !!!,
ale sami musimy tego pilnować !!!!.
tablicę można wstępnie zapełnić przy deklaracji np:
int k[6] = {1, 2, 7, 9, 1, 3}.
Oczywiście można pózniej zmieniać wartości elementów np: k[5] = 9/3; lub w pętli
for (i=0; i<=5;i++) k[i] = 2*i +7;
Jedna z najważniejszych (najgenialniejszych) cech języka c/c++ to
W języku c/c++ nazwa tablicy jest z definicji niezmiennym
wskaznikiem do jej pierwszego elementu
to znaczy p to jest wskaznik do p[0], a więc *p pobiera wartość z p[0];
(p+3) to wskaznik do p[3]; &p[3] jak ktoś nie kuma to też wskaznik do p[3];
p+3 == &p[3]; Do funkcji można przekazać całą macierz podając jako argument
nazwę tablicy.
Wtedy wewnątrz funkcji mając wskazniki p, p+1 itd. można manipulować
wartościami w tablicy.
Nie wolno próbować zmienić wartości stałego adresu p
- np. p = p+2 jest niepoprawne;
deklaracja: kolor x[5] = {red,blu,gr,yl,mag};
pointer: x x+1 x+2 x+3 x+4
zmienna: x[0] x[1] x[2] x[3] x[4]
przepisanie:
x[1] = x[4]; lub x[1] = *(x+4);
#include
plik:
double x[5]= {0.0, 0.1, 0.2, 0.3, 0.4 }; /* double y[5]={1,2,3,4,5}; */
array1.c
int main()
{
x[1] = x[4]; printf ("x[1] = %lf \n", x[1]); /* klasyczne przypisanie*/
x[1] = *(x+2);printf ("x[1] = %lf \n", x[1]); /* przypisanie z wskaznika */
x[1] = *(x+8);printf ("x[1] = %lf \n", x[1]); /* przypisanie spoza tablicy */
/* tu mozna jakies inne wyprobowac */
system("PAUSE"); return 0;
}
Tablice dwuwymiarowe (macierze)
Taka tablica ma wiersze (pierwszy indeks) oraz kolumny (drugi indeks);
Geometrycznie to szafa z książkami na półkach.
Deklaracja float k[2][4]; oznacza tablicę o 2 wierszach i 4 kolumnach.
Nadal indeksujemy od zera!!!!.
a więc:
k[0][0] k[0][1] k[0][2] k[0][3]
k[1][0] k[1][1] k[1][2] k[1][3]
Można zapełnić wstępnie:
int k[2][4] = {2, 4, 6, 8, 7, 5, 6, 3}; lub nawet:
int k[2][4] = { {2, 4, 6, 8},
{7, 5, 6, 3} } ; kompilator pominie wewnętrzne nawiasy.
Tu również k oznacza adres elementu k[0][0] natomiast (k+5) to adres
do elementu k[1][1] (a to jest faktycznie trudniejsze w użyciu.
Najłatwiej operować elementami k[1][2], ale wskazniki po nabraniu wprawy
są wygodne.
Tym niemniej jak ktoś nie kuma to wskaznik do elementu k[1][1]
to również &k[1][1].
W języku c/c++ bardzo rzadko wykonuje się działania na macierzach
typu mnożenie (lub nie daj Boże) odwracanie.
Tablice służą zazwyczaj do przechowywania wartości,
które fizykalnie do tego się nadają.
Pliki
Pliki to struktury o zmiennej i nieokreślonej liczbie elementów tego samego typu.
Elementy są ładowane do pliku sekwencyjnie (kolejno dorzucane np. wierszami)
i tak samo są odczytywane. Dla nas najważniejsze są pliki tekstowe
(z jawnym kodem ASCII) na dysku. Ponieważ pozwalają przenosić dane
do innych programów.
Można je też modyfikować po drodze każdym edytorem plików tekstowych
(np. Notepadem a nie Wordem).
Przy operacjach na plikach trzeba
a) zdefiniować plik,
b) zapisać lub odczytać coś z pliku,
c) zamnknąć plik;
Obsługa plików w c/c++ bo ta jest zawsze.
Deklaracja : FILE *we, *wy2 oznacza oczywiście, że we oraz wy2 są wskaznikami
do plików.
Otwarcie pliku :
we = fopen ( data1 , rt ); wy1 = fopen( wyniki , wt );
opcja a dopisuje do pliku.
Przy otwieraniu pliku do czytania gdy go nie ma, program wysypuje się .
Plik otwierany do zapisu, gdy go nie ma, jest zazwyczaj tworzony.
Po otwarciu pliku czytnik-pisak ustawia się na początku pliku.
Można to zmienić odpowiednią instrukcją.
Zamknięcie pliku: fclose (wy);
Dobry gotowiec: if ((we = fopen( Dane , rt )) == NULL)
{fprintf (stderr, Nie ma pliku! \n ; return(1);}
Zapis i odczyt z pliku już znamy należy dodać tylko wskazniki do plików
na początku listy argumentów:
fprintf (wy3, control, arg1, arg2, ); oraz
fscanf(we, control, arg1, arg2, );
Program Przebieg1.c oblicza przebieg typowego przebiegu funkcji
i ładuje wyniki do pliku tekstowego.
Można go obrabiać graficznie w Excelu lub Matlabie.
Takie pliki otrzymujemy przy eksperymentach z rzeczywistymi układami
automatyki na wyższych latach studiów i w często pracy.
dla stdio
#include
#include
int i,m,nprzeb,mmax; float t,y; FILE *wy;
main()
{
wy = fopen("c:\\mmmat4\\plotfile\\OUT2", "wt");
t=0.0;nprzeb=1;mmax=100;
for(m=1;m<=100;m++) {
y = 1.0 - exp(-t/2);
fprintf(wy," %20.12f %20.12f\n",t,y);
t+=0.1; }
fclose(wy);
printf ("aby zakonczyc press k: " ); scanf ("%d");
return(0);
}
Troszkę więcej liczący: przeb_stdio.c
#include
#include
int i,m,nprzeb,mmax; float t,y,z; FILE *wy;
main()
{
wy = fopen("c:\\mmmat4\\plotfile\\OUT2m", "wt");
t=0.0;nprzeb=1;mmax=100;
for(m=1;m<=100;m++)
{
y = 1.0 - exp(-t/2);
z = y - 0.1*sin(10*t);
fprintf(wy," %20.12f %20.12f %20.12f\n",t,y,z);
t+=0.1;
}
fclose(wy);
printf ("aby zakonczyc press k: " ); scanf ("%d");
return(0);
}
Obsługa plików tekstowych w c++ ( nie używamy w laboratorium! )
dołączyć należy: oraz .
Przy pracy z plikami dyskowymi musimy sami zdefiniować sobie strumienie
(dla klawiatury i monitora były predefiniowane).
definicja obiektów klas ofstream i ifstream (klasy bazowej fstream):
ofstream wy; lub ifstream we4; (klasy traktujemy jak typy własne)
otwarcie pliku do którego (lub z którego) ma płynąć strumień:
wy.open ( c:\\wyniki\\out2 ); (dostęp do funkcji z obiektu operatorem . ;
zapis do strumienia: wy << itd ; we4 >> itd .
zamknięcie strumienia: wy.close ();
Uwaga: tu mamy przyklad jak korzystać z obiektów klasy fstream. Aby zapisać
własne klasy i obiekty trzeba poznać ideę programowania obiektowego.
#include
#include
#include
int i,m,nprzeb,mmax; double t, y, z;
main()
{
ofstream wy ; wy.open ("c:\\mmmat4\\plotfile\\out2");
t=0.0; nprzeb=2; mmax=100;
for(m=1;m<=100;m++)
{
y = 1.0 - exp(-t/2); z = y - 0.1*sin(5*t);
wy << t << " " << y << " " << z << endl;
t += 0.1;
}
wy.close ();
}
Wyszukiwarka
Podobne podstrony:
Andrzej Sapkowski Wiedźmin Sezon Burz Rozdzial 1
Sezon 10
wiedza i praktyka sezon letni w firmie
Sezon na pokrzywę
Napisy do Once Upon a Time sezon 01, odcinek 19
Sezon na misia 2
Plotkara sezon 4 odcinek 17
Plotkara sezon 4 odcinek 14
sezon 7a
TVN Style Przepisy Sezon 2 odc 1 7
Dr House sezon 7 S07E10 Carrot or Stick
Napisy do Once Upon a Time sezon 01, odcinek 13
Once Upon a Time sezon 01, odcinek 11
więcej podobnych podstron