If i Pętle.

0

Nie potrafię zrozumieć dlaczego w tym kodzie p zawsze przyjmuje wartość 0.

 for(int i = 0; n>i; n--)
    {
        if(t[i]==1)
            p = p+i;
    }
    cout << p;
0
int n,p=0;
int t[1000000];
int main()
{
    cin >> n;
    cin >> t[1000000];
    for(int i = 0; n>i; n--)
    {
        if(t[i]==1)
            p = p+i;
    }
    cout << p;
    return 0;
4
KomnatoMan napisał(a):

Nie potrafię zrozumieć dlaczego w tym kodzie p zawsze przyjmuje wartość 0.

 for(int i = 0; n>i; n--)
    {
        if(t[i]==1)
            p = p+i;
    }
    cout << p;

Mam prośbę.
Przestań nam zawracać d. zanim zobaczysz i przyswoich choć kilka kartek podręcznika C. Tak od 1 do 20 strony wystarczy
Pętla jest TOTALNIE bez sensu i nie widzę powodów więcej się nią zajmować.

2

Jak myślisz, co robi ta instrukcja? :-) (ewentualnie: co chcesz, aby robiła)

cin >> t[1000000];
2
KomnatoMan napisał(a):
> int n,p=0;
> int t[1000000];
> int main()
> {
>     cin >> n;
>     cin >> t[1000000];
>     for(int i = 0; n>i; n--)
>     {
>         if(t[i]==1)
>             p = p+i;
>     }
>     cout << p;
>     return 0;
> ```

Nie dostałeś już wielokrotnie rady aby nie używać zmiennych globalnych? Pomijając już, że `cin >> t[1000000];` wczytuje do elementu POZA tablicą, a pierwsze milion elementów pozostaje zerami.
3

wpisujesz liczby, powiedzmy 10, a reszta jest automatycznie uzupełniana 0, chyba

Niestety nie - wczytuje jedną liczbę i zapisuje ją pod indeks 1000000 w tablicy t; np. jeśli użytkownik wpisał 123, efektywnie otrzymujesz:

t[1000000] = 123;

Jest to dodatkowo off-by-one error (tj. mażesz po losowej pamięci znajdującej się poza tablicą), ponieważ ostatnim indeksem Twojej tablicy jest 1000000 - 1 = 999999.

Jeśli chcesz wczytać n liczb, musisz wykorzystać pętlę.

4

Nie ma magii — komputer Ci nie czyta w myślach i jeszcze przez długi czas nie będzie. Użyj tej samej metody jak w poprzednim temacie — linijka po linijce, napisz co Ty chcesz, żeby robiła i zastanów się, skąd komputer miałby o tym wiedzieć…

Z Twoim kodem, jak poprzednio, jest sto jeden rzeczy źle. Ale najkrótsza odpowiedź na Twoje pytanie (i tylko na nie): p zawsze przyjmuje wartość 0, bo Twój if z linijki dziewiątej sprawdza w kółko to samo — nie zmieniasz nigdzie wartości i, więc ona zawsze jest taka, jak ją zadałeś na początku, czyli równa 0. Więc patrzysz, czy t[0] jest równy jeden, nie jest (bo masz tablicę zer), więc ciało tej instrukcji warunkowej nie jest wykonywane nigdy.

Zatem, koniec końców, nie zmieniasz wartości p nigdzie, więc jest takie, jakie było na początku — a w linijce pierwszej dałeś mu wartość zero.

1

Jest jeszcze gorzej, ta pętla do iteracji używa n nie i!
Wynik jest taki, że if(t[i]==1) zawsze odnosi się do pierwszej komórki tablicy.
a do p cały czas dodawane zero, bo taką wartość ma cały czas ma i.

0

Możesz pozbyć się tych **złych **pętli w procesie wczytywania, przy okazji pozbywając się globalnej tablicy.

    std::vector<int> box;
    std::copy_n( std::istream_iterator<int>(std::cin), 10, std::back_inserter(box) );

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