Element tablicy 0, 1 a nazewnictwo

0

Czy mając na myśli tab[0] mówimy pierwszy element tablicy czy zerowy? Jak powiemy zerowy to nie robimy niedopowiedzeń ale co jak chcemy powiedzieć tab[1] to element pierwszy, czy drugi?

PS. Tak się zastanawiam po prostu nad słusznością indeksowania od 0... No bo matematycznie, nie jest to zbyt poprawne.

3

Pierwszy element o indeksie 0... :P

0

Generalnie faktycznie zaczyna się od zera (z przyczyn mi nieznanych, niezrozumiałych i błędogennych ), ale już np w fortranie nr elementu = nr indeksu czyli 1 element to tab[1]. Chyba że sami zdecydujemy inaczej. Ps zwykle robię tablicę o jeden element za dużą, i numeruję elementy normalnie czyli od 1.

10

Ps zwykle robię tablicę o jeden element za dużą, i numeruję elementy normalnie czyli od 1.

Genialnie. Darmowa obfuskacja.

1

W C/C++ też można zaczynać od np 1:

double *Tb=(new double[3])-1;
for(unsigned i=1;i<=3;++i) cout<<Tb[i];
delete[] Tb+1;

Z tym że to absolutnie NIE MA sensu, cała arytmetyka indeksów jest prostsza (oraz bardziej naturalna) przy indeksacji od 0.
Jedyny problem jest z nazewnictwem ja sobie radzę z tym za pomocą dwóch pojęć:

  • Numer elementu (pierwszy, drugi)
  • Indeks elementu (o indeksie 0, o indeksie 1)
    jak muszę coś komuś wytłumaczyć.
1
sig napisał(a):

Generalnie faktycznie zaczyna się od zera (z przyczyn mi nieznanych, niezrozumiałych i błędogennych ), ale już np w fortranie nr elementu = nr indeksu czyli 1 element to tab[1]. Chyba że sami zdecydujemy inaczej. Ps zwykle robię tablicę o jeden element za dużą, i numeruję elementy normalnie czyli od 1.

o matko =/ Ja tam wole numerowanie od zera, w większości przypadków upraszczał mi kodowanie,
np mapowanie macierzy MxN na tablice M*N:

  • wzór przy indeksach od zera: y*N + x,
  • przy numeracji od 1 (indeksy macierzy też od 1): (y-1) * N + (x-1) + 1 = (y-1)N + x.

Do tego komplikacje w C/C++, takie coś musiałoby być prawdą *(tab) = *(tab + 0) = tab[1] co z tym zrobić?

  1. ustalić że *(tab) i *(tab+0) jest błędne? za każdym razem trzeba by było pamiętać o dodawaniu extra 1 do tab przy odwołaniu w ten sposób, mało tego co z iterowaniem *(tab++) ?
  2. zrobić równość *(tab) = *(tab + 0) = *(tab + 1)? robi sie bez sensu ... pierwszy element byłby wskazywany dwa razy
  3. A może *(tab) = tab[1] *(tab+1) = tab[2] .. tutaj znowu inny problem... trzeba pamiętać kiedy indeksować od 0 a kiedy od 1, można się pogubić.

Zapomniałem jeszcze o jednej sytuacji, co z aplikacjami low level? Jak trzeba by było rozumieć przypisanie:
MemHandler* mem = 0xA00000; ?? To analogiczny problem jak wyżej. Jeżeli to oznacza że pierwszy element ma taki adres... to mem[1] ma taki adres... wiec czym jest (*mem) ??

Albo taki manewr:
int *handle = &tab[5]; co wskazuje na element nr 5?? (*handle+1)? czym znowu miało by być (*handle) ?

4

http://en.wikipedia.org/wiki/Zero-based_numbering

A co z godzinami? Dla przykładu godzina rozpoczynająca się o 0:00 jest przecież pierwszą godziną w ciągu całej doby, więc czemu ma numer 0?

Czy 0 jest liczbą naturalną? Jest to kwestia umowna: http://pl.wikipedia.org/wiki/Liczby_naturalne

2

A co z godzinami? Dla przykładu godzina rozpoczynająca się o 0:00 jest przecież pierwszą godziną w ciągu całej doby, więc czemu ma numer 0?

bo 00:38 oznacza że od północy minęło zero godzin pełnych, i 38 minut godziny pierwszej.

Komentator meczu, gdy zegar pokazuje 45:20, mówi że to jest „czterdziesta piąta minuta” meczu, i popełnia błąd, bo 45 minut już minęło, a leci 46-a.

2

bo 00:38 oznacza że od północy minęło zero godzin pełnych, i 38 minut godziny pierwszej.

No właśnie!

A tab[0] oznacza miejsce w pamięci wskazane przez tab i przesunięcie od niego o 0sizeof(typ_tego_co_tam_wkładasz) bajtów.
A tab[1] to tab i przesunięcie tego o 1
rozmiar bajtów.

Innymi słowy, od początku tablicy "minęło" i bajtów, nim dostaliśmy się do jej i-tego elementu.

Proste i logiczne. Indeksowanie od 1 natomiast jest dla mnie nienaturalne i niezrozumiałe.
A najbardziej irytujące są języki, które tak jak VBA, czasami indeksują tak, a czasami tak :/

0

Wygrzebałem właśnie:

Lata naszej ery liczy się od 1 zamiast od 0, bo ówcześni nie znali 0 :) http://pl.wikipedia.org/wiki/N.e.
Astronomowie numerują lata p.n.e. w inny sposób, niż nieastronomowie: http://pl.wikipedia.org/wiki/Przed_nasz%C4%85_er%C4%85

Brak jest ponadto roku zerowego (powinien nim być właśnie 753 od założenia Rzymu), ponieważ Dionizy nie znał tej liczby - pojęcie zera przywędrowało na Bliski Wschód dopiero wraz z Arabami, którzy przejęli je od Hindusów, a w Europie pojawiło się około XI wieku.

Nic dziwnego, że numerujemy od 1. skoro tyle wieków nie znaliśmy 0. :]

0

Dobra! Czyli jak jest 13:30, to to czternasta? Mogę powiedzieć czternasta trzydzieści?

1 użytkowników online, w tym zalogowanych: 0, gości: 1