Strona 1 z 1
[C++] Ciąg liczb
: 13 sty 2013, o 14:56
autor: syylwia
Hej:) Może mi ktoś powiedzieć dlaczego program nie działa?
Kod: Zaznacz cały
#include <iostream.h>
#include <math.h>
int main()
{
int n;
int ilosc=0;
int suma=0;
cout<<"Wprowadz ciag liczb zakonczony zerem: "<<endl;
while(n!=0)
{
cin>>n;
if(n<0 && n%2==0)
{
suma+=n;
ilosc+=1;
}
}
cout<<"Suma liczb ujemnych, parzystych: "<< suma <<endl;
cout<<"Ilosc: "<<ilosc<<endl;
if (suma%3)
{
cout<<"Suma nie jest podzielna przez 3"<<endl;
}
else
{
cout<<"Suma jest podzielna przez 3"<<endl;
}
system("pause");
}
[C++] Ciąg liczb
: 13 sty 2013, o 15:05
autor: Althorion
Zacznijmy od najważniejszego: testujest w pętli while zmienną n która nie została zainicjalizowana — może być w niej wszystko, test jest nieprzewidywalny. Zmień to na pętlę do - while. Po drugie, kod ten jest niezgodny ze standardem i w ogóle kompilator powinien odmówić współpracy (brak przestrzeni nazw, zła nazwa plików nagłówkowych, niezadeklarowana funkcja system). Po trzecie, całość działa tak, że ze standardowego wejścia bierze ciąg znaków i próbuje go umieścić w zmiennej n - incie. Zostanie zrobione tak że ciąg zostanie ucięty na pierwszym białym znaku i będzie dokonana konwersja. Zupełnie nie o coś takiego Ci zapewne chodziło.
Kosmetyka:
1. dziwnie stawiasz klamry przy wyrażeniach if - else, zwłaszcza że przy jednolinijkowych nie są one potrzebne
2. zamiast pisać ilosc += 1 częściej zapisuje się ++ilosc
3. nigdzie nie wykorzystujesz biblioteki cmath
[C++] Ciąg liczb
: 13 sty 2013, o 15:15
autor: syylwia
Dzięki Dopiero się uczę. A o co chodzi z tym: brak przestrzeni nazw, zła nazwa plików nagłówkowych, niezadeklarowana funkcja system?
[C++] Ciąg liczb
: 13 sty 2013, o 15:26
autor: Althorion
W C++ od '89 pojawiły się przestrzenie nazw. Poszukaj sobie o tym informacji w Internecie. W skrócie — jeśli korzystasz z funkcji z biblioteki standardowej to musisz napisać albo std::nazwaFunkcji(), albo w pewnym momencie zawrzeć polecenie using namespace std;.
Pliki nagłówkowe z których korzystasz nie mają rozszerzenia .h, a ponadto biblioteka matematyczna nosi nazwę cmath (c przed nazwą biblioteki mówi że jest napisana w C, nie w C++).
Funkcja system(), z której korzystasz w ostatniej linijce jest funkcją z biblioteki cstdlib, której nie masz załączonej.
A, i jeszcze kluczowo ważne, a przeoczyłem — funkcja typu int musi zwrócić wartość int. U Ciebie int main() nie zwraca niczego. Pod sam koniec napisz return 0;.
BTW, tak ja bym to napisał:
Powinno działać, aczkolwiek pisałem bez sprawdzenia, nie mam teraz żadnego kompilatora pod ręką, na Windowsie siedzę.
[C++] Ciąg liczb
: 13 sty 2013, o 15:36
autor: syylwia
Dzięki za wyjaśnienia:) Twój kod mi nie działa, ale używasz w nim dziwnych rzeczy wiec nie wiem o co chodzi: istringstream inputNumbers(inputNumbersString); albo while (inputNumbersString >> n) ?? pierwsze widze niestety.
W kazdym badz razie poprawilam kod i dalej nie dziala dobrze
Kod: Zaznacz cały
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int n=0;
int ilosc=0;
int suma=0;
cout<<"Wprowadz ciag liczb zakonczony zerem: "<<endl;
do
{
cin>>n;
if(n<0 && n%2==0)
{
suma+=n;
++ilosc;
}
}while(n!=0);
cout<<"Suma liczb ujemnych, parzystych: "<< suma <<endl;
cout<<"Ilosc: "<<ilosc<<endl;
if (suma%3)
cout<<"Suma nie jest podzielna przez 3"<<endl;
else
cout<<"Suma jest podzielna przez 3"<<endl;
system("pause");
return 0;
}
[C++] Ciąg liczb
: 13 sty 2013, o 16:01
autor: Althorion
Tak, racja. Głupie dwa błędy u mnie — jedna literówka (pomyliłem zmienne żeby być dokładnym) i druga, która Ciebie też dotyczy, to zapomnienie tego, jak działa cin.
A działa on tak, że przerywa odczyt na pierwszej spacji. Nie wczyta więc całej linii, przestanie na pierwszej wartości. Żeby wczytać całą linię, trzeba użyć funkcji
getline.
Mój poprawiony kod:
Kod: Zaznacz cały
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string inputNumbersString;
cout << "Podaj ciag liczb zakonczony zerem: ";
getline(cin, inputNumbersString);
istringstream inputNumbers(inputNumbersString);
int n = 0;
int numbersCount = 0;
int sum = 0;
while (inputNumbers >> n)
if (n < 0 && 0 == n%2) {
sum += n;
++numbersCount;
}
cout << "Suma liczb ujemnych, parzystych: " << sum << endl;
cout << "Liczba wartosci: " << numbersCount << endl;
if (sum%3)
cout << "Suma nie jest podzielna przez trzy." << endl;
else
cout << "Suma jest podzielna przez trzy." << endl;
return (0);
}
O
istringstream sobie poczytaj w sieci, bez niego zabawa będzie znacznie smutniejsza. Linię liczb oddzielonych spacjami będziesz musiała wczytać jako stringa i potem operować na nim, co jest nieprzyjemne jeśli się robi ręcznie.
[C++] Ciąg liczb
: 13 sty 2013, o 16:17
autor: syylwia
ale przecież ciąg jest wczytywany poprawnie używając entera a nie spacji...
[C++] Ciąg liczb
: 13 sty 2013, o 16:35
autor: Althorion
Nie rozumiem tego zdania.
[C++] Ciąg liczb
: 13 sty 2013, o 17:10
autor: marcinz
syylwia pisze:ale przecież ciąg jest wczytywany poprawnie używając entera a nie spacji...
Chodzi chyba o to, że użytkownik wpisuje po kolei dane (wtedy nie trzeba kombinować ze stringami) i program ma badać tylko jeden ciąg (?). Metoda Althoriona jest owocna, gdy takiego dane są zapisane w pliku i trzeba po kolei testować każdą linię.
[C++] Ciąg liczb
: 13 sty 2013, o 17:19
autor: syylwia
Ale czy ktoś wytłumaczy czemu to nie działa?
[C++] Ciąg liczb
: 13 sty 2013, o 17:35
autor: marcinz
Ale co nie działa? Masz błąd kompilacji? Czy może masz jakieś dane wejściowe, dla których jest zła odpowiedź?
[C++] Ciąg liczb
: 13 sty 2013, o 17:56
autor: syylwia
juz nic, mój bład;)