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

Program zwraca dziwne wartosci - C++

VPS Starter Arubacloud
0 głosów
875 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 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,020 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,460 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,020 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,020 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ź 146 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez binkey Użytkownik (530 p.)
0 głosów
1 odpowiedź 496 wizyt
pytanie zadane 25 maja 2017 w PHP przez Justyna Obywatel (1,210 p.)
–1 głos
1 odpowiedź 891 wizyt
pytanie zadane 14 marca 2019 w Grafika i multimedia przez Nimplex Początkujący (460 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...