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

Błąd w obliczeniach w kodzie.

Object Storage Arubacloud
0 głosów
165 wizyt
pytanie zadane 22 lipca 2016 w C i C++ przez NTXFN Gaduła (3,430 p.)

Oto kod:

#include <iostream>

using namespace std;

int fun(int x);

int y = 0;

int main() {
	int times, x;
	cin >> times;
	for (int i = 0; i < times; i++) {
		cin >> x;
		cout << fun(x) << " " << y << endl;
	}
	return 0;
}

int fun(int x) {
	y += x;
	return x * 2;
}

A teraz dane i ich wyniki:

100  
1     
2 0  
2     
4 1  
3     
6 3   
4      
8 6   
5      
10 10
6      
12 15

Do y powinno być dodawane x a nie jest. Czemu? To samo miałem w innym programie bardziej skomplikowanym który robił to samo: wywoływał funkcję która modyfikowała zmienną globalną. 

Sprawdzałem w Dev-C++ na kompilatorze GCC oraz w Code::Blocks na kompilatorze Microsoft Visual C++ 2010. 

 

4 odpowiedzi

+2 głosów
odpowiedź 22 lipca 2016 przez Szykem2 Nałogowiec (29,510 p.)
wybrane 22 lipca 2016 przez NTXFN
 
Najlepsza

Zauważ, że pożądany wynik otrzymujesz przy kolejnej iteracji.

O co tu chodzi. Chodzi o to, że obiekt cout przy wypisywaniu buforuje sobie wartości i przy wywołaniu funkcji ma już zbuforowaną wartość zmiennej globalnej y, którą ustawiłeś na 0. Dopiero potem buforuje wartość wyniku funkcji, która zmienia wartość globalnego y. jeżeli zmienisz odrobinę kod to już masz wynik taki jaki chcesz:

int res = fun(x);
cout << res << " " << y << endl;

Nie pamiętam mechaniki działania obiektu cout, więc wiele więcej teraz nie jestem w stanie powiedzieć, ale myślę że jest to wystarczająco wyczerpująca odpowiedź.

0 głosów
odpowiedź 22 lipca 2016 przez Porcupine Nałogowiec (31,560 p.)
W dziwnym formacie trochę przedstawiłeś te wyniki... Ale te linie gdzie są dwie liczby obok siebie wydają się być ok.....
0 głosów
odpowiedź 22 lipca 2016 przez adas94 Nałogowiec (29,200 p.)
wyniki y są dobre, tylko o 1 iterację później.
0 głosów
odpowiedź 22 lipca 2016 przez Bondrusiek Maniak (61,370 p.)

Wyniki są dobre lecz są wykonywane w kolejnej iteracji. Rozdziel ten kod (przy wywoływaniu cout)

 

#include <iostream>

using namespace std;

int fun(int x);

int y = 0;

int main() {
    int times, x;
    cin >> times;
    for (int i = 0; i < times; i++) {
        cin >> x;
        cout << fun(x) ;//tutaj
        cout << " " ;
        cout << y << endl;//koniec edycji
    }
    return 0;
}

int fun(int x) {
    y += x;
    return x * 2;
}

 

 

Podobne pytania

0 głosów
2 odpowiedzi 116 wizyt
pytanie zadane 14 lutego 2023 w C i C++ przez piotr_domanski Bywalec (2,080 p.)
+1 głos
1 odpowiedź 190 wizyt
pytanie zadane 6 października 2021 w C i C++ przez <młody_programista> Początkujący (450 p.)
0 głosów
3 odpowiedzi 153 wizyt
pytanie zadane 5 marca 2021 w C i C++ przez Krystian000 Nowicjusz (150 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 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!

...