Tablice znakowe
Wojtek Mierzwa
Nie da się
Tablice do przechowywania znaków.
Char zdanie[80];
Kod ASCII – tablica znaków
Ciąg liter zakończony znakiem 0 (zero)
(null).
Inicjacja tablicy znaków
Char zdanie [80] = { „lot”};
Znak null został automatycznie dopisany po
ostatniej literze t dzięki temu, że
zainicjowaliśmy tablicę ciągiem znaków
ograniczony cudzysłowem.
l
o
t
null
0 1 2
3 4
...
...
80
Inny sposób
Char zdanie [80] = {'l', 'o', 't'};
To to samo co:
Zdanie [0] = 'l';
Zdanie [1] = 'o';
Zdanie [2] = 't';
reszta elementów wypełniona zerami.
Jak sprawdzić długość
C-stringu??
char napis1[] = { "Nocny lot"} ;
char napis2[] = { 'N', 'o', 'c', 'n', 'y',
' ', 'l', 'o', 't' } ;
cout << "rozmiar tablicy pierwszej : "
<< sizeof(napis1) << endl ;
cout << "rozmiar tablicy drugiej : "
<< sizeof(napis2) << endl ;
Błędy
Char t1[1] = { „a”};
Char t1[1] = { ' a '};
Wpisanie do tablicy znakowej teksu jest
możliwe tylko w czasie inicjacji.
Błędny zapis:
zdanie [80] = „nocny lot”;
zdanie = „nocny lot”;
Jak to zrobić??
Tworzymy funkcje, która wpisują nam znak po
znaku do tablicy.
Zajmuje się tym biblioteka standardowa w paru
wariantach.
Kopiujemy znak po znaku aż do znalezienia znaku
null (0).
void strcpy(char cell[], char zrodlo[])
{ for (int i = 0; ; i++)
{cel[i] = zrodlo[];
if (cel[i] == 0) break;
}}
Strcpy
Char start [] = {„Liczba uczestników na
starcie = 79”};
Char meta[80];
strcpy(meta, start);
Cout << meta;
Strncpy
Aby się zabezpieczyć przed samym sobą.
Kiedy pomylimy się i będziemy chcieli
wpisać tablicę znaków o rozmiarze [80] do
tablicy np. [5].??
Strncpy
Aby zabezpieczyć się przed błędami,
możemy stosować funkcję
StrNcpy
#include <iostream>
using namespace std ;
#include <cstring>
int main()
{
char tekst[] = { "Uwaga, tarcza zostala przepalona !"} ;
char komunikat[120] ;
strcpy(komunikat, tekst);
cout << komunikat << endl ;
strncpy(komunikat, "1234567890abcdef" , 9 ); //
cout << komunikat ;
strcpy(komunikat, "--A ku-ku --!" ) ;
cout << "\nNa koniec : " << komunikat << endl ;
}
C-string
Nic trudnego.
Po prostu znaki ustawione jeden po drugim,
a na ich końcu znak null (bajt zerowy (0);
Nazwa C-stringu to adres miejsca w
pamięci gdzie się on zaczyna.
Zapowiedz wskaźników.
Tablice wielowymiarowe
Tablice tablic to tablice wielowymiarowe.
Int wielo[2] [2];
czytamy: tablica wielo jest dwuelementową
tablicą, z których każdy jest
dwuelementową tablicą liczb typu int.
Inny zapis
W pascalu zapisywaliśmy:
wielo[i , j];
my zapisujemy w c++:
wielo [i] [j];
def:
typ_elementu nazwa_tablicy [wymiar_1][wymiar_2][wymiar_3] . . . ;
Przykład
ddd [4] [2].
ddd [0] [0]
ddd [0] [1]
ddd [1] [0]
ddd [1] [1]
ddd [2] [0]
ddd [2] [1]
ddd [3] [0]
ddd [3] [1]
Inicjacja tablicy wielo
Elementy tablicy wielowymierowej
umieszczane są kolejno w pamięci
komputera tak, że najszybciej zmieniają się
najbardziej skrajny prawy indeks.
Tablica jest przechowywana „rzędami”.
Inicjacja tablicy wielo
Int wielo [4] [2] = {10, 20, 30, 40 ,50, 60,
70, 80};
ddd [0] [0] = 10;
ddd [0] [1] = 20;
ddd [1] [0] = 30;
ddd [1] [1] = 40;
ddd [2] [0] = 50;
ddd [2] [1] = 60;
ddd [3] [0] = 70;
ddd [3] [1] = 80;
Przykłady inicjacji
int tab[ 10 ]; // ¬ sama definicja bez inicjalizacji
int tab_inicjalizowana[ 10 ] = { 20, -3, 12, 1, 0, 7, -5, 100, 2, 5 };
char tab_znakow[ 5 ] = { ‘a’, ‘B’, ‘\n’, ‘1’, ‘\0’ };
float macierz_A[ 3 ][ 2 ] = { {1,1}, {3.5,7.0}, {-15,100} };
float macierz_B[ 3 ][ 2 ] = { 1, 1, 3.5, 7.0, -15, 100 };
Przykłady
Kostka rubika
Kostka rubika
char kostka_Rubika [ 3 ][ 3 ][ 3 ];
Przesyłanie tablicy
wielowymiarowej do funkcji
Wszystkie tablice przesyłane są do funkcji
przez referencje.
Odbieranie tablicy przez funkcję
Co funkcja musi wiedzieć o tablicy:
Typ elementów tej tablicy
Po drugie – aby funkcja mogła łatwo obliczać sobie,
gdzie w pamięci jest określony element tablicy – na
przykład: gdzie w stosunku do tablicy jest
element [1][15] – musi znać liczbę kolumn w tej
tablicy.
Błędny zapis:
void fff (long m[] [] []);
Przyszłość
O czym trzeba pamiętać
Nie umieszczać nic w elementach poza
tablicą.
Tablica ma stałe rozmiary, nie możemy jej
tak nagle powiększyć.
W bibliotece standardowej C++ umieszczono definicje
nowych typów (klas), które nie tylko imitują tablice,
ale mają pewien rodzaj inteligencji i same dbają o
rozmiar takiej tablicy.
BIBLIOGRAFIA
•Jerzy Grębosz „Symfonia C++ Standard
wydanie 2006
•Krótki kurs C++ Część IVAutor: Darek
Ostolski