Tablice
Tablica to ciąg zmiennych (inaczej: obiektów) tego samego typu, które zajmują ciągły obszar w pamięci. Poszczególne składniki tablicy to jej elementy.
Deklaracja tablicy zbudowanej z dziesięciu elementów typu int:
int tabl[10]; - w pamięci zostaje zarezerwowane miejsce dla 10 liczb typu int tj. 40 bajtów. Rozmiar takiej tablicy jest wartością stałą tj. musi być znaną podczas kompilacji.
Zadeklarowana tablica posiada następujące elementy:
tabl[0] tabl[1] tabl[2] tabl[3] tabl[4]
tabl[5] tabl[6] tabl[7] tabl[8] tabl[9]
ostatni element 10-elementowej tablicy ma numer 9 (ogólnie dla n-elementowej tablicy) ma numer n-1.
Nadanie wartości poszczególnym elementom (tzw. inicjalizację) można przeprowadzić w momencie definicji tablicy:
int a[3] = {2, 25, 8 };
co jest równoważne zapisowi: int a[] = {2, 25, 8 }; - kompilator utworzy tablicę "a" trójelementową.
Jedynie przy inicjalizacji kompilator sprawdza czy wymiar tablicy nie został przekroczony (tj. czy nie za dużo liczb wstawiono w nawiasy klamrowe).
Gdy liczb będzie mniej niż wymiar tablicy kompilator wstawi zera.
Tablice mogą być wielowymiarowe.
Przykład deklaracji tablicy dwuwymiarowej:
int AGA[4][6];
Tablica AGA:
Ma 4 wiersze o numerach od 0 do 3.
Ma 6 kolumn o numerach od 0 do 5
Zapis AGA[2][4] można traktować jako element w 3 wierszu i 5 kolumnie
[0][0] |
[0][1] |
[0][2] |
[0][3] |
[0][4] |
[0][5] |
[1][0] |
[1][1] |
[1][2] |
[1][3] |
[1][4] |
[1][5] |
[2][0] |
[2][1] |
[2][2] |
[2][3] |
|
[2][5] |
[3][0] |
[3][1] |
[3][2] |
[3][3] |
[3][4] |
[3][5] |
WIERSZ 1
WIERSZ 2
WIERSZ 3
WIERSZ 4
1 2 3 4 5 6
K O L U M N Y
Traktując tablicę AGA jako tablicę tablic, zapis AGA[2][4] oznacza 5 element w 3 tablicy. W pamięci tablica AGA jest ciągłym obszarem składającym się z 4 zbiorów po 6 liczb każdy:
[0][0] |
[0][1] |
[0][2] |
[0][3] |
[0][4] |
[0][5] |
[1][0] |
[1][1] |
[1][2] |
[1][3] |
|
|
|
|
[2][4] |
[2][5] |
[3][0] |
[3][1] |
[3][2] |
[3][3] |
[3][4] |
[3][5] |
Tablicę wielowymiarową inicjować można następująco:
int ARA[2][4]= {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
};
Łańcuchy to tablice składające się ze znaków. Koniec łańcucha jest sygnalizowany przez pierwszy napotkany znak '\0' (=null).
char znaki [5] = {'w', 'i', 't', 'a', 'j'}; - to jest tablica znaków
char znaki [6] = {'w', 'i', 't', 'a', 'j' '\0'}; - to jest łańcuch, ta definicja jest równoważna następującej: char znaki [6] = "witaj";
Przekazywanie tablicy do funkcji
Tablice przesyła się do funkcji podając tylko adres początku tej tablicy. Jest to więc przekazywanie przez parametr - zawartość tablicy można w funkcji zmienić i informacja ta będzie przekazana do segmentu wywołującego funkcję.
Przykład
funkcja: void funk(int ADA[]);
tablica: ADA[] = {1, 2, 3, 4, 5};
wywołanie funkcji: funk(ADA);
ponieważ ADA jest adresem zerowego elementu to poniższe zapisy są równoważne:
ADA &ADA[0]
podobnie:
ADA + 2 &ADA[2]
Program: tablica float ADA[] zainicjowana jako zbiór liczb rzeczywistych w funkcji Zmiana(float ADA[]) stanie się zbiorem wartości sinusów dla kolejnych kątów zmieniających się co 100.
#include <stdio.h>
#include <math.h>
void zmiana(float []);
void main(void)
{
float ADA[]={0., 1., 2., 3., 4., 5., 6., 7., 8., 9.};
int i;
for (i=0; i<10;i++) printf("%7.1f",ADA[i]);
printf("\n\n");
zmiana(ADA);
for (i=0; i<10;i++) printf("%7.4f",ADA[i]);
printf("\n\n");
}
void zmiana(float TT[])
{
int i=0;
while (i<=9)
{
TT[i]=sin(10*TT[i]*3.14/180);
i++;
}
return;
}
Prototyp funkcji, której parametrem jest tablica wielowymiarowa wymaga podania wielkości wszystkich kolejnych wymiarów z wyjątkiem pierwszego, to jest np.: void funk(float [] [20] [3]);
Program obliczający iloczyn dwu macierzy WxW (przykładowo W=3)
#include <stdio.h>
#include <math.h>
#define W 3
void wczytaj(int [][W]);
void druk(int [][W]);
void iloczyn(int [][W], int [][W], int [][W] );
void main(void)
{
int ADA[W][W],BET [W][W],ILO[W][W];
wczytaj(ADA);
wczytaj(BET);
printf("\n\n");
druk(ADA);
druk(BET);
iloczyn(ADA,BET,ILO);
druk(ILO);
return;
}
void druk(int A[][W])
{
int i,j;
for (i=0; i<W;i++)
{
for (j=0; j<W;j++) printf("%5d",A[i][j]);
printf("\n");
}
printf("\n\n");
return;
}
void wczytaj(int A[][W])
{
int i,j;
printf("Podaj elementy macierzy\n");
for (i=0; i<W;i++)
for (j=0; j<W;j++) scanf("%d",&A[i][j]);
return;
}
void iloczyn(int A[][W], int B[][W], int C[][W])
{
int i,j,k,s;
for (i=0; i<W;i++)
for (j=0; j<=2;j++)
{
s=0;
for (k=0; k<W;k++) s=s +A[i][k]*B[k][j];
C[i][j]=s;
}
return;
}
Program wyznacza kąt pomiędzy dwoma wektorami.
#include <stdio.h>
#include <math.h>
#define N 3
void wczytaj(float []);
void druk(float []);
float il_skal (float [],float []);
float dlug (float []);
float kat(float [],float []);
void main(void)
{
float alfa,ADA[N],BET [N];
wczytaj(ADA);
wczytaj(BET);
printf("\n\n");
druk(ADA);
druk(BET);
alfa=kat(ADA,BET);
printf("alfa=%5.2f\n\n",alfa);
return;
}
void druk(float A[N])
{
int i;
for (i=0; i<N;i++) printf("%7.2f",A[i]);
printf("\n\n");
return;
}
void wczytaj(float A[N])
{
int i;
printf("Podaj skladowe wektora\n");
for (i=0; i<N;i++) scanf("%f",&A[i]);
return;
}
float dlug (float A[N])
{
int i;
float d=0;
for (i=0;i<N;i++) d=d+A[i]*A[i];
return sqrt(d);
}
float il_skal (float A[N],float B[N])
{
int i;
float s=0;
for (i=0;i<N;i++) s=s+A[i]*B[i];
return s;
}
float kat(float A[N], float B[N])
{
float a;
a=acos(il_skal(A,B)/dlug(A)/dlug(B));
return a*180./3.1416;
}
INFORMATYKA WYKŁAD 5 Temat: Język C 8
Funkcja może być typu void - wynik jej działania to zmiana wartości parametru ADA.
Prototyp funkcji może nie zawierać nazwy tablicy, musi natomiast zawierać informację [], że parametr jest tablicą
Nazwa tablicy jest równocześnie adresem jej zerowego elementu
Numeracja elementów tablicy zaczyna się od zera