Problem z prostym programem

0

Jestem poczatkujacym programista w c++, porgramuje w tym jezyku od moze tygodnia i mam pewien problem... otoz pisze sobie program (zamieszcze go ponizej), ktory wg. mnie powinien zrobic wszystko po mojej mysli, a jednak jest inaczej: program powinien krok po kroku:

  1. Wypisac napis 'fizyka' z gwiazdek
  2. Deklaracja zmiennych itd.
  3. Wyswietla tekst przed pierwsza petla 'do...while'
  4. Wypisuje menu
  5. Sprawdza wybor
  6. Tutaj program wykonuje kod wg. wyboru
  7. Sprawdza czy uzytkownik programu chce kontynuowac czy zamknac
    I tutaj pojawia sie pierwszy blad: jezeli wpiszemy 'nie' program nie konczy swojej pracy... (polecmy dalej)
  8. Sprawdza czy uzytkownik nie chce 'oszukac' programu i nie wpisuje np. liczb
  9. Jezeli uzytkownik programu wpisal co innego to bedzie pytal o 'tak' lub 'nie' dopoki uzytkownik tego nie wpisze
    Drugi blad: program pomimo wpisania 'nie' nie konczy programu
#include <iostream>
using namespace std;

int main()
{
	cout << "**********     **     **********     **      **     **      **             **" << endl; // 1. Wypisac napis 'fizyka' z gwiazdek
	cout << "**             **             **      **    **      **     **             ***" << endl; 
	cout << "**                           **        **  **       **    **             ****" << endl; 
	cout << "**             **           **          ****        **   **             ** **" << endl; 
	cout << "**             **          **            **         **  **             **  **" << endl; 
	cout << "*****          **         **             **         *****             **   **" << endl; 
	cout << "**             **        **              **         **  **           ********" << endl; 
	cout << "**             **       **               **         **   **         **     **" << endl; 
	cout << "**             **      **                **         **    **       **      **" << endl; 
	cout << "**             **     **********         **         **     **     **       **" << endl; 

	long me = 91688714; // 2. Deklaracja zmiennych itd.
	long we = 41388964;
	long ma = 78338748;
	long jo = 628814130;
	long sa = 1277154522;
	long ur = 2721374330;
	long ne = 4348655010;
	int pred = 12;
	char tak[4] = "nie";
	char nie[4] = "tak";
	


	char koniec[4];
	int wybor, predwy;
	long odleg;

	cout << "Oto program ktory umozliwi ci obliczenie ile dni zajmie podroz na planety\n ukladu slonecznego" << endl; // 3. Wyswietla tekst przed pierwsza petla 'do...while'
	cout << endl;

	do
	{

		cout << "Wybierz planete do ktorej czas podrozy chcialbys poznac: " << endl; // 4. Wypisuje menu
		cout << " 1 - Merkury" << endl;
		cout << " 2 - Wenus" << endl;
		cout << " 3 - Mars" << endl;
		cout << " 4 - Jowisz" << endl;
		cout << " 5 - Saturn" << endl;
		cout << " 6 - Uran" << endl;
		cout << " 7 - Neptun" << endl;
		cout << " 8 - Wprowadz swoje wlasne dane" << endl;
		cin >> wybor; // 5. Sprawdza wybor

			if ( wybor == 1) // 6. Tutaj program wykonuje kod wg. wyboru
			{
				cout << " Odleglosc do Merkury wynosi 91 688 714km" << endl;
				cout << " Srednia predkosc statku kosmicznego to " << pred << "km/s" << endl;
				cout << " Tak wiec na Merkury dolecimy w ciagu " << me / pred / 60 / 60 / 24 << " dni." << endl;
				cout << endl;
				cout << " Czy chcialbys poznac czas podrozy do innej planety?" << endl;
				cout << " Prosze o odpowiedz tak/nie" << endl;
				cin >> koniec; // 7. Sprawdza czy uzytkownik programu chce kontynuowac czy zamknac

				if ( koniec != tak || koniec != nie ) // 8. Sprawdza czy uzytkownik nie chce 'oszukac' programu i nie wpisuje np. liczb

					do // 9. Jezeli uzytkownik programu wpisal co innego to bedzie pytal o 'tak' lub 'nie' dopoki uzytkownik tego nie wpisze
					{
							cout << " Nie wpisales tak lub nie!" << endl;
							cout << endl;
							cout << " Czy chcialbys poznac czas podrozy do jakiejs planety?" << endl;
							cout << " Prosze o odpowiedz tak/nie" << endl;
							cin >> koniec;

					} while ( koniec == tak || koniec == nie );
			}
	} while ( koniec == tak || koniec == nie );
	return 0;
} 

Probowalem rozwiazac ten problem na wszystkie znane mi obecnie sposoby, ale jestem w 99% procentach przekonany, ze ten blad wynika z faktu, iz wczesniej programowalem w pascalu i raczej nie czuje tego c++, no ale coz, musze to zrobic... Prosze o wyrozumialosc, poniewaz wiem ze ten program nie jest zadnym wyzwaniem intelektualnym, wiec mysle ze mozecie mi pomoc :)

0

if ( koniec != tak || koniec != nie )
to trzeba zapisać
if ( koniec != tak && koniec != nie )

w przeciwnym wypadku zawsze będzie prawda, pomyśl.

W wewnetrznym do.. while:
} while ( koniec != tak && koniec != nie );

w zewnetrznym
} while ( koniec == tak );

Ale jest jeszcze jeden haczyk, typu tablicowego char nie można tak porównywać, (chyba że wiesz co robisz).
Zamiast tego użyj typu string w naglowku string.
Jeżeli chcesz koniecznie to zrobić na char'ach to należy użyć funkcji strcmp( const char * str1, const char * str2 );

0

@rafal-prog się mylisz.

Lista twoich błędów:

  • wszystkie twoje 'zmienne' powinny być stałymi
  • tak się nie porównuje c-stringów
  • co jeśli ktoś wpadnie na genialny pomysł i w konsoli wpisze mamciewdupie zamiast jakichś 4 literek jak sobie założyłeś?
0

Dziekuje bardzo, obydwoje mieliscie racje. Program juz dziala bezblednie.

w przeciwnym wypadku zawsze będzie prawda, pomyśl.

W wewnetrznym do.. while:
} while ( koniec != tak && koniec != nie );

w zewnetrznym
} while ( koniec == tak );

Racja, zmienilem to i program nie ma juz zadnych problemow ;)

Zamiast tego użyj typu string w naglowku string.

Naprawde mi to pomoglo, znalazlem sobie poradnik na necie jak zadeklarowac zmienna typu string i nagle program zaczal dzialac.

wszystkie twoje 'zmienne' powinny być stałymi

Prawda, to juz zostalo poprawione, ale nie wszystkie, bo niektore beda uzywane w dalszej czesci programu ktorej jeszcze nie ma. (program ten 'przepisuje' z pascala)

tak się nie porównuje c-stringów

To nawet nie byly stringi, ale dzieki rafal-prog sa juz stringami.

co jeśli ktoś wpadnie na genialny pomysł i w konsoli wpisze mamciewdupie zamiast jakichś 4 literek jak sobie założyłeś?

Juz sie zabezpieczylem przeciwko takiemu czemus.

Dziekuje wam za pomoc, w programie byl jeszcze jeden blad, mianowice z druga petla do..while, kiedy wpisalo sie np. dwa razy litere 'a' to program konczyl swoja prace, a powinien zapetlac. Zrozumialem jednak ze do..while kontynuuje prace kiedy otrzyma prawde, a nie falsz. wiec linijka:

} while ( koniec == tak || koniec == nie );

Zmienila sie na linijke:

} while ( koniec != "tak" && koniec != "nie" );

Jeszcze raz dziekuje wszystkim za pomoc, temat do zamkniecia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1