Tablice - zrozumienie

0

Witam serdecznie znowu na forum. Dziś trochę studiuję o tablicach w c++...Tu mam pytanie informacyjne:
Oto jest kod:

 #include <iostream>
#include<time.h>
#include<cstdlib>

using namespace std;

int main()
{


//const int max = 10;
int tablica[10];


        cout<<endl<<"Szufladka nr.1: " <<tablica[1] ;
        cout<<endl<<"Szufladka nr.2: " <<tablica[2] ;
        cout<<endl<<"Szufladka nr.3: " <<tablica[3] ;
        cout<<endl<<"Szufladka nr.4: " <<tablica[4] ;
        cout<<endl<<"Szufladka nr.5: " <<tablica[5] ;
        cout<<endl<<"Szufladka nr.6: " <<tablica[6] ;
        cout<<endl<<"Szufladka nr.7: " <<tablica[7] ;
        cout<<endl<<"Szufladka nr.8: " <<tablica[8] ;
        cout<<endl<<"Szufladka nr.9: " <<tablica[9] ;
        cout<<endl<<"Szufladka nr.10: " <<tablica[10] ;
        cout<<endl<<"Szufladka nr.11: " <<tablica[11] ;
        cout<<endl<<"Szufladka nr.12: " <<tablica[12] ;

        return 0;


    }

a to co po tym kodzie się kompiluje:

 
Szufladka nr.1: 0
Szufladka nr.2: 0
Szufladka nr.3: 4292368
Szufladka nr.4: 2686672
Szufladka nr.5: 2686728
Szufladka nr.6: 2686916
Szufladka nr.7: 1957792981
Szufladka nr.8: -1509972237
Szufladka nr.9: -2
Szufladka nr.10: 10
Szufladka nr.11: 1958042564
Szufladka nr.12: 4292368
Process returned 0 (0x0)   execution time : 0.155 s
Press any key to continue.

I tu mam pytania:

  1. Dlaczego w szufladkach 1 i 2 mam wartości zerowe?
  2. Tablice o ile wiem są numerowane od 0. Wiec powino być szufladek od 0 do 9. I po uruchomieniu szufladki od 10 wzwyż nie powinne być uwzględniane, program powinien się wysypać po próbie kompilacji... A program się kompiluje z szufladkami po za nr. 10
  3. W jaki sposób najszybciej zrobić zeby każda szufladka posiadała stałą liczbę i z tego losowała przykładowy nr. szufladki?
    Bardzo prosiłbym o wytłumaczenie tego zadania... Nie chcę przechodzić z lekcji do lekcji bez zrozumienia co z czym się je....
2

Nie wiadomo jakie wartości znajdują się w tablicy, gdyż po takiej definicji nie została przeprowadzona żadna inicjalizacja. Nikt nie sprawdza, czy elementy tablicy, które próbujesz odczytać w ogóle istnieją - to Twój obowiązek.

Dostęp do zmiennej, która nie została zainicjalizowna żadną wartością - undefined behavior.
Dostęp do elementu, ktory znajduje się poza tablicą - undefined behavior.

0
Endrju napisał(a):

Nie wiadomo jakie wartości znajdują się w tablicy, gdyż po takiej definicji nie została przeprowadzona żadna inicjalizacja. Nikt nie sprawdza, czy elementy tablicy, które próbujesz odczytać w ogóle istnieją - to Twój obowiązek.

Dostęp do zmiennej, która nie została zainicjalizowna żadną wartością - undefined behavior.
Dostęp do elementu, ktory znajduje się poza tablicą - undefined behavior.

Dzięki za info.... Poradziłem sobie...Ale mam problem z wyczytaniem tablic ręcznie...Tzn: jak wpisuję szufladkę np. 1 to powinno mi dać wynik: 2, szufladka:10 wynik 20 itd..

 #include <iostream>
#include<time.h>
#include<cstdlib>

using namespace std;

int main()
{


const int max = 10;
int tablica[10] {2,4,6,8,10,12,14,16,18,20};
int znak;

for(int i=0; i<max;i++)
{
   // tablica[i]+1;
   cout <<"wpisz numer tablicy od 1 - 10: ";
   cin>>tablica[i];
   cout<<tablica[i];

     return 0;
}

 }

wynik:

wpisz numer tablicy od 1 - 10: 9
9
Process returned 0 (0x0)   execution time : 3.828 s
Press any key to continue. 
0

Przecież nie wczytujesz tam nic do zmiennej i, trochę czytania ze zrozumieniem.

0

Zamiast

 cin>>tablica[i];

powinno być cin>>i;

0
Aterwik napisał(a):

Zamiast

 cin>>tablica[i];

powinno być cin>>i;


Dzięki za wskazówkę, Działa. Cały czas myślałem zę powinno być : cin>>tablica[i]..Ostatnie pytanie , dlaczego jak podaję szufladkę nr.np 14 to wyskakuje mi liczba:
```cpp
 wpisz numer tablicy od 1 - 10: 14
2686768
Process returned 0 (0x0)   execution time : 6.177 s
Press any key to continue.

Do szufladki 9 liczby się zgadzają jak podaję...

0

Bo próbujesz się dostać do pamięci, która nie należy do tablicy: przyp, twoja tablica ma tylko 10 elementów.

Na ten moment powinieneś używać kontenera zapewniającego bounds checking, np std::array lub std::vector przez .at()

http://en.cppreference.com/w/cpp/container/array/at
http://www.cplusplus.com/reference/vector/vector/at/

0

@spartanPAGE co do mazania po nieswojej pamięci... Taka tablica to ciągły obszar pamięci. Więc nawet dwuwymiarowe tablice można brać tak naprawdę jako jednowymiarowe:)

Poniższy kod po skompilowaniu pokazuje prawidłowe wartości, mimo, że jest nieprawidłowy:

#include<stdio.h>

int main(){
    int tab[2][2];
    tab[0][0] = 0;
    tab[0][1] = 1;
    tab[1][0] = 2;
    tab[1][1] = 3;

    int *wsk = tab;

    int i;
    for(i=0;i<4;i++)
        printf("%d",*(wsk++));
    printf("\n");
    return 0;
}

Pokazuje dlatego, że tablica jest ciągłym obszarem pamięci i teoretycznie wychodząc tutaj poza zakres czytamy kolejny wymiar tablicy :)

Taka ciekawostka :)

https://ideone.com/tullOA

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