• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskazanie pozycji w tablicy jednowymiarowej - nie zawsze dziala

Object Storage Arubacloud
0 głosów
758 wizyt
pytanie zadane 23 stycznia 2016 w C i C++ przez VitGryfny Użytkownik (620 p.)

Witam,

Mój kod nie zawsze wyświetla tekst, który mówi o pozycji wybranej liczby w tabeli a wręcz działa zupełnie losowo. Nie bardzo wiem dlaczego :(

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

using namespace std;

int n; //ilosc elementow w tablicy
int i; // licznik dla petli for rysujacej tablice
int no_arr; // wybarny numer ktorego pozycje chcemy poznac

int main()
{
    srand(time(NULL));
    cout << "Ilu elementowa tablice chcesz stworzyc: " << endl;
    cin >> n;

    int tablica[n];

    cout << "Oto tablica wypelniona losowymi wartosciami z przedzialu 0-49: " << endl;
    for(i=1;i<=n;i++)
    {
        tablica[i]=rand()%50;
    }

    for(i=1;i<=n;i++)
    {
        cout << "|" << tablica[i] << "|";
    }
    cout << endl;
    cout << "Wybierz jedna z wyzej podanych liczb aby poznac jej pozycje w tablicy: " << endl;
    cin >> no_arr;
    //cout << no_arr << endl;
    //cout << n;

    for(i=1;i<=n;i++)
    {
        if(no_arr==tablica[i])
        {
            cout << "Wybrana liczba znajduje sie na " << i << " pozycji." << endl;
            break;
        }
        else
        {
          i++;
        }
    }

    return 0;
}

 

1 odpowiedź

+4 głosów
odpowiedź 23 stycznia 2016 przez Sedi Stary wyjadacz (10,200 p.)

Na początek zamień wszystkie 

i=1;i<=n;i++

na:

i=0;i<n;i++

No i nie potrzebujesz robić i jako globalnej zmiennej :) - Możesz ją tworzyć za każdym razem, gdy tworzysz pętle

komentarz 23 stycznia 2016 przez Pablo99 Obywatel (1,110 p.)
Numeracja w c++: (rodem z USA) liczba pierwsza(w tablicy) ma indeks 0 więc i=0 . Liczba o indeksie 1 jest druga w tablicy
komentarz 23 stycznia 2016 przez draghan VIP (106,230 p.)

Dodatkowo zwróciłbym uwagę na fragment:

    for(i=1;i<=n;i++)
    {
        if(no_arr==tablica[i])
        {
            cout << "Wybrana liczba znajduje sie na " << i << " pozycji." << endl;
            break;
        }
        else
        {
          i++;
        }
    }

Blok else jest zupełnie niepotrzebny, rzekłbym że wręcz niepoprawny. W każdym obiegu pętli zwiększasz wartość zmiennej i o jeden, więc dodatkowa inkremendacja w przypadku niedopasowania szukanej liczby powoduje przeskok o dwie pozycje w tablicy.

komentarz 23 stycznia 2016 przez VitGryfny Użytkownik (620 p.)
Jest co cenne spostrzeżenie (odnośnie indeksowania począwszy od 0) nie mniej wydaje mi się, że działa to dobrze właśnie w takiej formie jak napisałem (choć nie zastanawiałem się nad tym zbytnio). Pozdrawiam! :)
komentarz 23 stycznia 2016 przez Sedi Stary wyjadacz (10,200 p.)
Niestety, to nie jest dobrze. Musisz wiedzieć, że gdy przekroczysz rozmiar tablicy, który zarezerwowałeś zazwyczaj trafisz na śmieci, ale może zdarzyć się tak, że dostaniesz się do adresu, która nie należy do Ciebie, a może być potrzebny dla działania innego programu lub systemu. Wtedy takie coś może zakończyć się błędem krytycznym.
komentarz 23 stycznia 2016 przez draghan VIP (106,230 p.)

@Sedi - w teorii każdy proces ma własną wirtualną przestrzeń adresową i nie powinien - nawet przy pomocy złego operowania wskaźnikami - naruszyć danych innego procesu. Dba o to - a przynajmniej powinien - system operacyjny.

W praktyce, jeśli wyjdziesz poza zakres i nie próbujesz nadpisać danych, do których nie powinieneś mieć dostępu, nie powinno stać się nic złego. Gorzej z zapisem, co zazwyczaj kończy się błędem związanym z naruszeniem ochrony pamięci. :)

Odrobina informacji tutaj.

@VitGryfny

Jest co cenne spostrzeżenie (odnośnie indeksowania począwszy od 0) nie mniej wydaje mi się, że działa to dobrze właśnie w takiej formie jak napisałem

W C++ jest to jeden z bardzo częstych błędów początkujących. Nie jest to poprawne. Tablice ZAWSZE indeksuje się w zakresie <0; n-1>, dla n-elementowych tablic. Zauważ, że wartość o indeksie n już do takiej tablicy nie należy.

Podobne pytania

0 głosów
1 odpowiedź 182 wizyt
0 głosów
1 odpowiedź 554 wizyt
pytanie zadane 3 listopada 2022 w C# przez JoannS Początkujący (250 p.)
+1 głos
1 odpowiedź 199 wizyt

92,580 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...