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

Program zwraca dziwne wartosci - C++

0 głosów
483 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,310 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 (29,010 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 (42,580 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 (94,730 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,070 p.)
komentarz 30 grudnia 2015 przez Grzyboo Nałogowiec (29,010 p.)
Przepraszam, obiecuję poprawę.
komentarz 30 grudnia 2015 przez Konrad Nabożny Stary wyjadacz (13,310 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 (29,010 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 (42,580 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,070 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 (42,580 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ź 75 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez binkey Użytkownik (530 p.)
–1 głos
1 odpowiedź 106 wizyt
pytanie zadane 14 marca w Grafika i multimedia przez Nimplex Początkujący (380 p.)
0 głosów
1 odpowiedź 86 wizyt
pytanie zadane 22 kwietnia 2018 w C# i .NET przez kuba802802 Początkujący (360 p.)
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

64,021 zapytań

110,396 odpowiedzi

231,162 komentarzy

47,800 pasjonatów

Przeglądających: 176
Pasjonatów: 5 Gości: 171

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...