w07, Studia PK, JiPP, Wykłady - Chmaj

Nie obrażaj więc mojej inteligencji poprzez czynione na pokaz zaniżanie własnej.
Tablice

grupa obiektów tego samego typu
ë
tablica

tablica – ciąg obiektów
tego samego typu
,
zajmuj
ą
cy ci
ą
gły obszar w pami
ę
ci

korzyść – zamiast wielu definicji poszczególnych
obiektów jedna wspólna; odniesienia do n-tego
elementu tablicy

składnia definicji
typ nazwa_tablicy
[
rozmiar
]
np.
int a[10];
rezerwuje w pamięci miejsce dla 10
liczb typu int
rozmiar
– to musi być stała, znana juŜ w trakcie
kompilacji; niedopuszczalne
rozwiązanie jak niŜej:
int rozmiar;
cout << ”Jaki ma by
ć
rozmiar tabeli ? ”;
cin >> rozmiar;
{
int tablica[rozmiar]; /* TU JEST
Ź
LE */
...
}

moŜliwość definicji tablicy o wielkości dopasowanej
do potrzeb – dynamiczna alokacja tablicy
Elementy tablicy

definicja
int a[4];
określa tablicę 4-elementów: a[0], a[1], a[2], a[3]

numeracja zaczyna się od zera, kończy na
(rozmiar–1) (inaczej niŜ w innych językach !!!)

gdy się będziemy odnosili do zakresu 1..rozmiar, to:
o
zapominamy o a[0]
ë
tracimy jeden element
o
próbujemy zmieniać wartość elementu a[rozmiar] – to juŜ
nie jest element tablicy
o
kompilator nie kontroluje dopuszczalnego zakresu
indeksu tablicy, nie blokuje próby zmiany wartości
a[rozmiar] – to na ogół prowadzi do zniszczenia
zawartości innej komórki pamięci (zwykle przyległej do
tablicy a)
Przykład:
int a, b[4], c;
int k;
a=c=0;
for (k=0; k<=4; k++)
b[k]=2*k+1;
cout << a << endl;
a=9
Wnioski:

tablica n-elementowa: numeracja 0..n-1

element o indeksie n (czyli a[n]) nie istnieje

kompilator nie zajmuje się sprawdzaniem
poprawności zakresu – to jest rola programisty

zysk – szybszy dostęp do tablicy

próba podstawienia elementu o indeksie n –
zniszczenie wartości innych zmiennych
Obsługa tablic

na ogół pętle for; dwie moŜliwe formy
for (k=0; k<rozmiar; k++)
lub:
for (k=0; k<=rozmiar-1; k++)
Inicjalizacja tablic

podobnie jak dla typów fundamentalnych moŜliwa
inicjalizacja w trakcie definicji
int a[4] = {15,3,0,-7}; /*równowaŜne poniŜszemu ciągowi*/
int a[4];
a[0]=15;
a[1]=3;
a[2]=0;
a[3]=-7;

gdy lista krótsza niŜ rozmiar tablicy – pozostałe
elementy podstawiane zerami
int a[4] = {15, 3}; // a[0]=15; a[1]=3; a[2]=0; a[3]=0;
int a[4] = { };
// zerowanie tablicy

gdy lista dłuŜsza niŜ rozmiar tablicy – błąd kompilacji
int a[4] = {15, 3, 0, -7, 8}
// błąd kompilacji !!!

jeszcze jedna forma definicji i inicjalizacji zbiorczej
int a[ ] = {1, 2, 3, 4, 5, 6};
o
nie podajemy rozmiaru tablicy
o
kompilator liczy ilość elementów w liście, na tej podstawie
ustala rozmiar tablicy, rezerwuje pamięć i ją inicjalizuje
Działania na tablicach

w C nie ma globalnych operacji na tablicach

musimy określić działanie dla kaŜdej ze składowych
int a[4] = {0, 1, 2, 3};
int b[4] = {1, 2, 3, 4};
int c[4], k;
c = a + b;
// operacja nielegalna !!!!!
for (k=0; k<4; k++)
c[k] = a[k] + b[k];
Tablica jako argument funkcji

dwa przypadki
o
funkcja zaleŜy od pojedynczego (skalarnego) argumentu i
jest wywoływana z argumentem aktualnym równym
jednemu z elementów tablicy
o
funkcja zaleŜy od tablicy jako całości

przypadek pierwszy
int kwadrat(int k)
{
return k*k;
}
int main()
{
int w1, w2, m=5;
int a[100]={1,2,3,4,5,6};
w1=kwadrat(m);
w2=kwadrat(a[4]);
}

przekazanie poprzez wartość (jak do tej pory)

mechanizm taki sam, jak dla typów fundamentalnych

przypadek drugi
Przykłady:

funkcja, która oblicza długość wektora
reprezentowanego przez tablicę

transformacja tablicy zawierającej temp. Fahrenheita
na tablicę z temperaturami w skali Celsjusza
Problemy:

jak przekazać całą tablicę (często – duŜo wartości)?

jak zwrócić wynik, który jest tablicą?
Rozwiązanie – przekazanie tablicy przez adres. Jest
ono oparte na dwóch zasadach ogólnych:
1. Tablicę przekazujemy do funkcji podając adres
jej początku
2. Nazwa tablicy jest jednocześnie adresem jej
zerowego elementu
#include <cmath>
#include <iostream>
using namespace std;
double dlugosc(double x[ ], int n)
{
int k;
double s=0.0;
for (k=0; k<n; k++)
s+=x[k]*x[k];
return sqrt(s);
}
int main()
{
double a[3]={1.1, -0.7, 1.0};
cout << “Dlugosc wektora ddd = ” << dlugosc(a, 3)) << endl;
}
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • alter.htw.pl
  • Powered by WordPress, © Nie obrażaj więc mojej inteligencji poprzez czynione na pokaz zaniżanie własnej.