LEKCJA 5 - TABLICE I REKORDY

W tej lekcji wrócimy do operowania zmiennymi. Znasz już podstawowe typy (int, float, char) i umiesz przechowywać je w pamięci. Dla każdej nowej zmiennej deklarowałeś nazwę i przypisywałeś ją do określonego typu. Niedługo zaczniesz pisać programy bardziej skomplikowane, w których będziesz używał wielu zmiennych. Deklarowanie każdej z nich z osobna okaże się wtedy zupełnie niepraktyczne.

Dlatego poznasz dziś tablice. Tablica jest to uporządkowany zbiór wielu zmiennych jednego typu. Typ tych zmiennych określa typ tablicy. Na przykład, jeśli w tablicy będziemy przechowywać liczby typu int, to tablica też jest typu int. Uporządkowanie tablicy oznacza, że jej elementy nie są przechowywane w niej ot tak, lecz każdy ma swoje miejsce.

Deklaracja i proste użycie tablicy wygląda tak:

#include <stdio.h> 
#include <conio.h> 
main (void) 
{ 
int tablica[5]; 
int suma; 
clrscr(); 

printf("Podaj pierwszą liczbę: \n"); 
scanf("%d",&tablica[0]); 


printf("Podaj drugą liczbę: \n"); 
scanf("%d",&tablica[1]); 

printf("Podaj trzecią liczbę: \n"); 
scanf("%d",&tablica[2]); 

tablica[3]=5;
tablica[4]=23;

suma=(tablica[0]+tablica[1]+tablica[2]+tablica[3]+tablica[4]); 

printf("Suma elementów tablicy wynosi: %d\n",suma); 

getch(); 
return 0 ; 
} 

Jak łatwo zauważyć, deklaracja tablicy wygląda prawie identycznie jak deklaracja łańcucha (tak naprawdę jest jednak odwrotnie, bo to łańcuch był traktowany jako tablica znaków). Należy w niej jednak zaznaczyć ilość elementów znajdujących się później w tablicy. Nie musimy używać ich wszystkich, lecz np. pierwsze trzy, ale zawsze należy określić ich ilość i dopilnować, aby tej granicy nie przekroczyć. Inaczej mówiąc, jeśli na samym początku zadeklarujemy tablicę: int tablica[10], to nie możemy potem używać elementu tablica[11]. Zauważmy również, że zliczanie elementów tablicy zaczynamy od elementu numer zero. Dlatego tablica w powyższym przykładzie jest tablicą pięcioelementową, zawiera bowiem elementy o numerach: 0,1,2,3,4.

Nasz przykładowy program oblicza sumę z elementów tablicy. Elementy te można wczytać z klawiatury dzięki funkcji scanf() lub też przypisać im wartość w kodzie programu. Ponieważ wszystkie elementy tablicy są typu int, zatem tablica ta też jest typu int. Nie może się zdarzyć, że jeden z elementów byłby innego typu.

Przedstawiona tu tablica była niewielka, ale można też tworzyć większe tablice. Oprócz tego można również używać tablic dwu- i więcej wymiarowych. Tablica dwuwymiarowa w zasadzie nie różni się od układu współrzędnych kartezjańskich. Deklaracja tablicy dwuwymiarowej może wyglądać tak: int tablica[9][9];. Znaczy to, że tablica ma w sumie 100 elementów (np. 10 wierszy i 10 kolumn). Odwołanie do któregoś z elementów tej tablicy zapisujemy np. tablica[nr_kolumny][nr_wiersza] (choć, wydaje się, ze powinno być na odwrót, ale jest właśnie tak). Elementu tablicy możemy używać tak jak każdej innej zmiennej. Np. jeśli tablica zawiera liczby można napisać: a=9*tablica[3][1]+5;.

W rzeczywistości zdarza się jednak często, że potrzebujemy przechować w pamięci dane różnych typów, jednakże w wielu kopiach. Na przykład tworzymy bazę danych z informacjami na temat uczniów w jakiejś klasie. O każdej osobie potrzebujemy zapamiętać jego imię, nazwisko, numer w dzienniku i średnią. Widać więc, że wszystkie te dane nie mogą być jednego typu (imię i nazwisko - typ char*, numer - typ int, średnia - typ float). Oczywiście można stworzyć cztery tablice określonych typów, i w każdej z nich przechowywać określone informacje, np. w pierwszej imiona, w drugiej nazwiska itp. Jest to jednak niezbyt praktyczne wyjście, ponieważ łatwo poplątać informacje o każdej z osób.

Do rozwiązania tego problemu służą rekordy. Zbierają one w całość informacje różnych typów.

#include <stdio.h> 
#include <conio.h> 
main (void) 
{ 
struct {
char *imie, *nazwisko; 
int numer; 
float srednia; 
}uczen[30]; 

clrscr(); 

uczen[0].imie="Anna";
uczen[0].nazwisko="Miedzianowska";
uczen[0].numer=1;
uczen[0].srednia=4.5;

uczen[0].imie="Jan";
uczen[0].nazwisko="Kowalski";
uczen[0].numer=2;
uczen[0].srednia=4.0;

printf("Imię pierwszej osoby to %s.\n",uczen[0].imie);

printf("Nazwisko pierwszej osoby to %s.\n",uczen[0].nazwisko);

printf("Średnia drugiej osoby to %.2f.\n",uczen[0].srednia); 

getch(); 
return 0 ; 
} 

Po uruchomieniu program napisze:

Imię pierwszej osoby to Anna.
Nazwisko pierwszej osoby to Miedzianowska.
Średnia drugiej osoby to 4.00

Rekord deklarujemy jak każdą inną zmienną. Deklarację rekordu rozpoczynamy słówkiem struct. Następnie między nawiasami klamrowymi deklarujemy zmienne wchodzące w skład rekordu. Nazywa się to polami rekordu. Po zamknięciu nawiasu klamrowego piszemy nazwę rekordu. Może to być pojedynczy rekord postaci:

struct{
  int zmienna1;
  float zmienna2;
  char zmienna3;
}nazwa;

Takich rekordów możemy zadeklarować kilka lub też utworzyć zbiór takich samych rekordów w postaci tablicy (tak, jak w przykładzie). Pojedynczy rekord jest więc traktowany jako pojedyncza zmienna. Ta zmienna mówi nam jednak o wiele więcej niż pojedyncza zmienna typu np. int. Rekordy zebrane w tablicy deklaruje się na zasadzie:

struct{
  int zmienna1;
  float zmienna2;
  char zmienna3;
}nazwa[ilosc_pol];

A jak odczytać wartości zapisane do rekordu? Nie można wypisać wartości rekordu (np. w funkcji printf), jeśli nie określimy pola, o które nam chodzi. Znaczy to, nie możemy zapytać programu jednocześnie o cały rekord numer1, ale możemy zapytać o każde z pól rekordu numer1. Uściślenie, o jakie pole nam chodzi następuje po napisaniu nazwy tablicy rekordów, numeru rekordu w nawiasie kwadratowym, a następnie po kropce wypisaniu nazwy interesującego pola. Tak właśnie zrobiliśmy w naszym przykładzie.


Podsumowując:

  1. Tablica jest to uporządkowany zbiór elementów tego samego typu.
  2. Zliczanie elementów zaczynamy od 0.
  3. Numer elementu w tablicy umieszczamy za nazwą tablicy w nawiasie kwadratowym.
  4. Rekord to powiązanie kilku zmiennych różnego typu w jedną całość.
  5. Możemy tworzyć tablice, które jako swoje elementy przechowują rekordy.
  6. Przy odwołaniu do elementu takiej tablicy należy sprecyzować konkretne pole rekordu.


Autorem Kursu C++ jest Anna Miedzianowska (http://annamiedzianowska.republika.pl/).


Baner reklamowy: