Tablice jednowymiarowe to struktury danych, które można sobie wyobrazić jako tabele o jednym wierszu i wielu kolumnach (ewentualnie na odwrót). Ich cecha jest to, że składają się z komórek, do których możesz się odwołać za pomocą indeksów numerowanych zazwyczaj od zera do wartości równej jej rozmiarowi - 1. Dla przykładu, pisząc coś takiego:
long tabela[5];
Sygnalizujesz kompilatorowi, że ma utworzyć tablice o rozmiarze 5 elementów. Taka tablica będzie miała 5 komórek o indeksach od 0 do 4. W tym przypadku nie powiedziano w sposób jawny jakie wartości mają się znaleźć w tych komórkach więc o ile dobrze pamiętam pojawią się tam wartości, których raczej się nie spodziewasz. Taka tablica mogłaby wyglądać np. tak.
Indeks 0 |
Indeks 1 |
Indeks 2 |
Indeks 3 |
Indeks 4 |
12 |
1008 |
4 |
12204 |
12485 |
Pisząc następujący kod:
tabela[2] = 5;
Sygnalizujesz kompilatorowi, że ma odwołać się do komórki o indeksie 2 i ustawić tam wartość równą 5. Po takim poleceniu powyższa tablica zmieni się w następujący sposób:
Indeks 0 |
Indeks 1 |
Indeks 2 |
Indeks 3 |
Indeks 4 |
12 |
1008 |
5 |
12204 |
12485 |
Natomiast pisząc taki kod:
tabela[3];
Wydajesz polecenie "odczytaj mi wartość z komórki o indeksie 3". Wartość ta jest równa 12204. Oczywiście zamiast podawać konkretny numer komórki w postaci stałej (w tym przypadku liczby 3) można podać indeks komórki za pomocą zmiennej (np tabela[i] - wtedy będzie to oznaczało "odczytaj mi wartość z komórki o indeksie i", czyli indeks komórki będzie zależeć od wartości i. Jak i będzie równe 2 to odwołasz się do komórki o indeksie 2 a jak i będzie równe 4 to odwołasz się do komórki o indeksie 4. Wartości większej niż 4 nie możesz w tym przypadku podać bo wyjedziesz poza zakres tablicy, która ma 5 elementów czyli indeksy od 0 do 4.).
Istnieje możliwość zasygnalizowania kompilatorowi aby ustawił wartość we wszystkich komórkach. Jeżeli więc zamiast pisać tak:
long tabela[5];
Napiszesz tak:
long tabela[5] = { 0, 1, 2, 3 ,4 };
To dostaniesz taką tablicę:
Indeks 0 |
Indeks 1 |
Indeks 2 |
Indeks 3 |
Indeks 4 |
0 |
1 |
2 |
3 |
4 |
W efekcie nie będziesz musiał przypisywać wartości do komórek za pomocą wyrażenia:
tabela[i] = i;
Witam ponownie dziś chciałem się zapytać o tablice a mianowicie:
w poniższym przykładzie aby dobrze działał muszę zdefiniować tablice przypisując jej wartość "i" "tabela[i]=i;" moje pytanie brzmi dlaczego.
Ponieważ w tablicy masz wartości losowe gdyż tak ją zadeklarowałeś. Zanim więc odczytasz z niej jakieś wartości należy je najpierw tam umieścić. Zapis:
tabela[i] = i;
Oznacza "umieść wartość i w komórce o indeksie i". Oczywiście nie musisz tam umieszczać w tablicy akurat takich danych. Równie dobrze możesz tam umieścić same piątki czyli:
tabela[i] = 5;
lub sam wzór wyliczania wartości może być inny. Na przykład możesz napisać:
tabela[i] = i * i;
Wtedy w tablicy powinieneś mieć wartości: 0, 1, 4, 9, 16. Dane w komórkach tablicy możesz mieć jakie tylko chcesz pod warunkiem, że będą to dane których rzeczywiście oczekujesz i typ danych będzie kompatybilny. Mimo wszystko zanim coś pobierasz z tablicy należy najpierw to coś tam wsadzić.
Dlaczego nie wystarczy samo "tabela[i];"
Ten zapis jest raczej kompletnie bez sensu. Oznacza "odczytaj mi wartość która jest umieszczona w komórce i a następnie nic z tym nie rób". Odczytuje się wartości w jakimś konkretnym celu. Możesz np. wypisać wartość na ekran konsoli:
cout << tabela[i] << endl;
To już ma sens bo takie polecenie mówi "odczytaj mi wartość która jest umieszczona w komórce i a następnie wyślij ją na strumień cout (spowoduje to wyświetlenie wartości na ekranie)". Sens ma także takie wyrażenie:
tabela[i] = tabela[i] * 2;
Ponieważ oznacza ono "Odczytaj wartość z komórki o indeksie i, pomnóż ją przez dwa a następnie umieść ją w komórce o tym samym indeksie". Oznacza to, że wszystkie komórki tablicy zostaną pomnożone przez dwa (oczywiście dane na których pracujemy powinny być wcześniej umieszczone w tej tablicy). Powyższy zapis powinieneś oczywiście zredukować do postaci:
tabela[i] *= 2;
Nie zmienia to jednak faktu, że oba zapisy są tożsame pod względem efektu działania (co nie oznacza, że zamienne ponieważ drugi zapis może być nieco szybszy pod względem działania).
Reasumując: tablice to dane, które są takim ciągiem komórek i żeby coś z nich odczytywać wypadałoby najpierw coś do nich wpisać.