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;
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;
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;
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ć.
Jak myślisz, co robi ta instrukcja? :-) (ewentualnie: co chcesz, aby robiła)
cin >> t[1000000];
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.
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ę.
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.
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
.
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) );