[C++] Ciąg liczb

syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] Ciąg liczb

Post 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");
}
Ostatnio zmieniony 13 sty 2013, o 17:57 przez syylwia, łącznie zmieniany 2 razy.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Ciąg liczb

Post 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
syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] Ciąg liczb

Post 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?
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Ciąg liczb

Post 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ę.
syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] Ciąg liczb

Post 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;
}
Ostatnio zmieniony 13 sty 2013, o 15:38 przez Althorion, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Ciąg liczb

Post 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.
syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] Ciąg liczb

Post autor: syylwia »

ale przecież ciąg jest wczytywany poprawnie używając entera a nie spacji...
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Ciąg liczb

Post autor: Althorion »

Nie rozumiem tego zdania.
marcinz
Użytkownik
Użytkownik
Posty: 370
Rejestracja: 26 sty 2010, o 21:41
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 2 razy
Pomógł: 53 razy

[C++] Ciąg liczb

Post 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ę.
syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] Ciąg liczb

Post autor: syylwia »

Ale czy ktoś wytłumaczy czemu to nie działa?
marcinz
Użytkownik
Użytkownik
Posty: 370
Rejestracja: 26 sty 2010, o 21:41
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 2 razy
Pomógł: 53 razy

[C++] Ciąg liczb

Post 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ź?
syylwia
Użytkownik
Użytkownik
Posty: 60
Rejestracja: 30 kwie 2009, o 20:02
Płeć: Kobieta
Podziękował: 20 razy
Pomógł: 1 raz

[C++] Ciąg liczb

Post autor: syylwia »

juz nic, mój bład;)
ODPOWIEDZ