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

Program zwraca dziwne wartosci - C++

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
991 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,480 p.)

Witam. Na wstępie chciałbym dodać iż jestem początkującym programistą, o ile można mnie już tak nazywać :) 

Wczoraj ukończyłem odcinek Pana Mirosława na temat polskiego SPOJA. Stronka przypadła mi do gustu i kilka problemów już na niej ukończyłem. Niestety jednak znalazłem się w kompletnej czarnej dziurze odnośnie zachowania mojego programu i zwracania bardzo dziwnych liczb w problemie http://pl.spoj.com/problems/SUMA/

Po wpisaniu liczb całkowitych, np. takich jakie są przykładowe w tym problemie na SPOJU, to otrzymuję w konsoli nie wiadomo skąd wzięte liczby. Czasem jest to 40010, czasem kilka milionów. Analizowałem kod na spokojnie, ale nie potrafię sobie z tym poradzić. Poniżej zamieszam kod źródłowy: 

 

#include <iostream>
#include <windows.h>

using namespace std;


int main()
{
    int ilosc;
    int tab[10000];
    int a;

    cin>>ilosc;

    for (int i=0; i<ilosc; i++)
    {
        cin>>tab[i];
        a+=tab[i];
        cout<<a<<endl;
    }



    return 0;
}

 

Z góry dziękuję za wszystkie odpowiedzi i pozdrawiam. 

1 odpowiedź

+2 głosów
odpowiedź 30 grudnia 2015 przez Grzyboo Nałogowiec (28,860 p.)
wybrane 30 grudnia 2015 przez Konrad Nabożny
 
Najlepsza
Musisz zainicjować zmienną. W C++ tworzona zmienna nie ma automatycznie wartości 0. Dlatego:

int a = 0;
komentarz 30 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)

1. zainicjaLIZOWAĆ zmienną
W informatce przyjęła się ta forma: http://sjp.pwn.pl/poradnia/haslo/inicjalizowac;9919.html

2. Zmienna globalna oraz statyczna jest wstępnie inicjalizowana zerem.

komentarz 30 grudnia 2015 przez event15 Szeryf (93,790 p.)

No bo inicjacja to może być najwyżej seksualna. Może być też rytuał inicjacji, jak w masonerii. wink

komentarz 30 grudnia 2015 przez Avernis Nałogowiec (27,400 p.)
komentarz 30 grudnia 2015 przez Grzyboo Nałogowiec (28,860 p.)
Przepraszam, obiecuję poprawę.
komentarz 30 grudnia 2015 przez Konrad Nabożny Stary wyjadacz (13,480 p.)

To na prawdę działa o.O. Nie sądziłem że to będzie aż tak banalne. :) Dziękuję za pomoc, jednakże mam jeszcze jedno pytanie. Nie zawsze przy inicjalizacji zmiennej nadawałem jej wartość 0, a programy działały w miarę sprawnie, bez podobnych problemów. Jaki może być tego powód? 

komentarz 30 grudnia 2015 przez Grzyboo Nałogowiec (28,860 p.)
Tworzysz zmienną, która zostaje umieszczona gdzieś w nieużywanej pamięci. W tej pamięci mogą znajdować się jakieś śmieci, które nie zostały wyczyszczone, ale też może być pusta. Jeżeli pusta, to a logicznie będzie miało wartość 0. Jeżeli nie to wartość a jest uzależniona od tego, co tam siedziało wcześniej w pamięci.
komentarz 30 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Jeżeli zdefiniujesz zmienne poza funkcją main() i jakąkolwiek inną funkcją, to wtedy zmienna jest inicjalizowana zerem.

Twój program działałby, gdybyś umieścił zmienne tak:

#include <iostream>
// #include <windows.h> a na co to tutaj? 0_0
 
using namespace std;
 
int a;
 
int main()
{
    int ilosc;
    int tab[10000];
 
    cin>>ilosc;
 
    for (int i=0; i<ilosc; i++)
    {
        cin>>tab[i];
        a+=tab[i];
        cout<<a<<endl;
    }
 
 
 
    return 0;
}

Nie należy jednak tak robić, bo zmienne globalne, to zło :-)

komentarz 30 grudnia 2015 przez Avernis Nałogowiec (27,400 p.)
A ja właśnie nie mogę pojąć dlaczego? Wiem jedynie że wtedy taka zmienna ma już zaklepaną nazwę i żadna inna nie może jej użyć
komentarz 30 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)

To z nawą to też istotna sprawa, ale nie najważniejsza. Zmienna globalna to całkowite zaprzeczenie programowania Obiektowo Orientowanego. To jest niedopuszczalne, że jakieś funkcje korzystałyby z tej samej zmiennej, z czego każda funkcja może ją swobodnie modyfikować. Mało tego! Konwencje pisania klas w C++ mówi, że publiczne powinny być tylko i wyłącznie metody (funkcje składowe). Tylko.

To jeszcze nie wszystko. Czasami mamy potrzebę zdefiniować jakąś globalną stałą dla programu. Jakieś ważna wartość, z której korzystają inne funkcje, np.const int doba = 24;
To konwencja mówi, żeby unikać nawet takich zapisów i zamiast nich stosować funkcje:

int doba()
{
	return 24;
}

Więc jak widzisz, od globalizacji naprawdę wszyscy starają się uciekać. Największy zarzut przeciwko używaniu globalnych obiektów jest w programowaniu Obiektowo Orientowanym (OO). Cała ta technika polega na tym, że istnieją klasy, które porozumiewają się miedzy sobą i TYLKO ze sobą nie dając nawet takiej możliwości innym.

Są oczywiście niezbędne wyjątki jak chociażby strumienie "cout" i "cin". Są to obiekty zdefiniowane w zakresie globalnym, ale w tym przypadku ma to oczywiście sens :-)

Podobne pytania

0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez binkey Użytkownik (530 p.)
0 głosów
1 odpowiedź 775 wizyt
pytanie zadane 25 maja 2017 w PHP przez Justyna Obywatel (1,210 p.)
–1 głos
1 odpowiedź 1,091 wizyt
pytanie zadane 14 marca 2019 w Grafika i multimedia przez Nimplex Początkujący (460 p.)

93,164 zapytań

142,175 odpowiedzi

321,922 komentarzy

62,490 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 453p. - Marcin Putra
  2. 453p. - dia-Chann
  3. 447p. - Łukasz Piwowar
  4. 443p. - CC PL
  5. 431p. - Łukasz Eckert
  6. 428p. - rafalszastok
  7. 423p. - Adrian Wieprzkowicz
  8. 423p. - Michal Drewniak
  9. 418p. - rucin93
  10. 410p. - Piotr Aleksandrowicz
  11. 408p. - ksalekk
  12. 402p. - Mariusz Fornal
  13. 401p. - Dawid128
  14. 383p. - Hubert Chęciński
  15. 340p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...