x-kom hosting

Prosty program w cpp

Jula007
utworzono
utworzono

Dzień dobry!

 

Otóż napisałam dzisiaj program na zajęcia w szkole i nie mogę znaleźć błędu. Po  poprawnej odpowiedzi na 3 pytanie, zamiast wyświetlić się "Poprawnie!" i przejść do kolejnego pytania, od razu wyświetla wszystkie kolejne pytania zawarte w programie razem z odpowiedzią "Zle" pomimo nie odpowiadania na żadne z nich. Nie mogę znaleźć rozwiązania tego problemu, dlatego proszę o pomoc.

 

Z góry bardzo dziękuję!

Pozdrawiam

 

#include <iostream>
#include <cstdlib>

using namespace std;

string wyraz;

int liczba;

int main()


{

	
	cout << "Wszystkie odpowiedzi podawac z malych liter" << endl;
	
	cout << endl;
	
	cout << "Jak mial na imie pierwszy krol polski?" << endl;
	cin >> wyraz;
	
	if(wyraz=="boleslaw") 
	{
	cout << "Poprawnie!";
	}
	else
	{
	cout << "Zle";
	}
	cout << endl;
	
	cout << "W ktorym roku Polska odzyskala niepodleglosc?" << endl;
	cin >> liczba;
	
	if(liczba==1918) 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "Jak nazywalo sie ludobujstwo ludonosci polskiej w wolyniu?" << endl;
	cin >> wyraz;
	
	if(wyraz=="zbrodnia wolynska") 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "W ktorym roku zakonczyla sie II wojna swiatowa?" << endl;
	cin >> liczba;
	
	if(liczba==1945) 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "Jakie stanowisko zajmowal Jozef Pilsudzki w 1918 roku?" << endl;
	cin >> wyraz;
	
	if(wyraz=="tymczasowy naczelnik panstwa") 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "W ktorym roku odbyla sie bitwa pod Grunwaldem?" << endl;
	cin >> liczba;
	
	if(liczba==1410) 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "Co okresla godzina W?" << endl;
	cin >> wyraz;
	
	if(wyraz=="powstanie warszawskie") 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "W ktorym roku odbyla sie zbrodnia katynska?" << endl;
	cin >> liczba;
	
	if(liczba==1940) 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "Co nazywamy Wolnym Miastem?" << endl;
	cin >> wyraz;
	
	if(wyraz=="gdansk") 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	cout << "W ktorym roku Polska przyjela chrzest?" << endl;
	cin >> liczba;
	
	if(liczba==966) 
	{
	cout << "Poprawnie!";
	}
	else 
	{
	cout <<"Zle";
	}
	cout << endl;
	
	return 0;
}

 

-n3veR
komentarz
komentarz

Tak na szybko, to ciężko stwierdzić. Kompilator powinien wyrzucić Tobie więcej informacji.

Od siebie mogę jedynie dodać, że zmienne, które przyjmujesz od usera, warto zerować przed pytaniami.

burner82
komentarz
komentarz

Żaden ze mnie programista, ale może chodzi o problem ze spacją - spróbuj czy jak wpiszesz pojedynczy wyraz (zamiast dwóch), to czy przejdzie do kolejnego pytania.

  • 1 miesiąc później...
fernandez
komentarz
komentarz

Przyczyn może być kilka. Żeby dokładnie wiedzieć co się zadziało, to musiałbyś napić, co podałeś jako wejście oraz jakiego środowiska używasz (OS, kompilator, wiersz poleceń).

Natomiast skutek jest taki, że cin jest w stanie błędu i po prostu już nie przyjmuje żadnych innych danych. Jeśli zostanie wykryty błąd strumień wejściowy trzeba zareagować np. zresetować, przed wywołaniem kolejnego cin <<:

#include <sstream>
#include <limits>

... 

if (cin.fail())
{
  cin.clear();
  cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

Natomiast to co kolega wyżej napisał to inny problem i nie rozwiążesz go w taki prosty sposób.

Operator "<<" cin pobierze dane do pierwszego napotkanego "białego" znaku, czyli np. spacji czy nowej linii. Czyli jeśli ktoś wprowadzi w jednej linii dane oddzielone spacjami to wczytana zostanie tylko ta pierwsza. Kolejne wywołania operatora << spowoduje automatycznie wczytanie reszty.

I tutaj jest kilka rozwiązań. Najprościej to po prostu resetować strumień jak poprzednio, nie sprawdzając już czy jest OK czy nie. Ale chyba najbezpieczniej to pobrać po prostu całą linię używając getline(), ale uwaga z bilbioteki string (LINK do dokumentacji). Zwłaszcza gdy oczekiwana wartość powinna posiadać spacje pomiędzy.

Po wczytaniu należy już samemu przeparsować wiadomość. Żmudna czynność, ale jak chce się zabezpieczyć to tak trzeba.

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.