Wielokrotne użycie "if"

0

Siemka. Jeśli zły dział to przepraszam, na wstępie ;)
A teraz do rzeczy:
Dopiero zaczynam swoją przygodę z C++, piszę w Microsoft Visual C++ Express. Zrobiłem programik, który oblicza wyniki z działań. Chciałem go jednak zmienić, by na początku można było wybrać typ działania. Dlatego chcę użyć do tego funkcji if. Oto co wymyśliłem:

 #include <iostream>
int main ()
{
	double a, x, z;
	std::cout << "Programik sluzy do obliczania wynikow z dzialan. W liczbach z przecinkiem uzywaj kropki." << std::endl;
	std::cout << "Wybierz typ dzialania: 1 = dodawanie 2 = odejmowanie 3 = mnozenie 4 = dzielenie" << std::endl;
	std::cin >> a;
	if (a==1)
	std::cout << "Wprowadz 1 liczbe: \t";
	std::cin >> x;
	std::cout << std::endl << "Wprowadz 2 liczbe: \t";
	std::cin >> z;
	std::cout << std::endl << "Wynik z dodawania: \t" << x+z << std::endl;
	system ("PAUSE");
	return 0;
		if (a==2)
	std::cout << "Wprowadz 1 liczbe: \t";
	std::cin >> x;
	std::cout << std::endl << "Wprowadz 2 liczbe: \t";
	std::cin >> z;
	std::cout << std::endl << "Wynik z odejmowania: \t" << x-z << std::endl;
	system ("PAUSE");
	return 0;
			if (a==3)
	std::cout << "Wprowadz 1 liczbe: \t";
	std::cin >> x;
	std::cout << std::endl << "Wprowadz 2 liczbe: \t";
	std::cin >> z;
	std::cout << std::endl << "Wynik z mnozenia: \t" << x*z << std::endl;
	system ("PAUSE");
	return 0;
			if (a==4)
	std::cout << "Wprowadz 1 liczbe: \t";
	std::cin >> x;
	std::cout << std::endl << "Wprowadz 2 liczbe: \t";
	std::cin >> z;
	std::cout << std::endl << "Wynik z dzielenia: \t" << x/z << std::endl;
	system ("PAUSE");
	return 0;
} 

Niestety to nie działa. Kiedy odpalam programik i wybieram "1", czyli dodawanie jest ok, wyświetla się "Wprowadz 1 liczbe" wprowadzam, potem pyta o druga i pokazuje wynik. Jednak gdy wybieram np. 3, to już nie działa. Najpierw nic się nie wyświetla, mogę wpisać np. 14, potem pyta o drugą liczbę i pisze "Wynik z dodawania:" i podaje wynik, który jest poprawny, jeśliby dodawać, ale powinno wtedy mnożyć. Co robię źle?

Wersja pierwotna:

 #include <iostream>
int main ()
{
	double x, z;
	std::cout << "Programik sluzy do obliczania wynikow z dzialan. W liczbach z przecinkiem uzywaj kropki." << std::endl;
	std::cout << "Wprowadz 1 liczbe: \t";
	std::cin >> x;
	std::cout << std::endl << "Wprowadz 2 liczbe: \t";
	std::cin >> z;
	std::cout << std::endl << "Wynik z dodawania: \t" << x+z << std::endl;
	std::cout << "Wynik z odejmowania: \t" << x-z << std::endl;
	std::cout << "Wynik z mnozenia: \t" << x*z << std::endl;
	std::cout << "Wynik z dzielenia: \t" << x/z << std::endl;
	system ("PAUSE");
	return 0;
} 

PS. W wersji pierwotnej, czyli bez wyboru typu działania, wszystko jest ok i oblicza jak trzeba.

0

Polecam wrócić do książki, z której się uczysz i poczytać więcej o instrukcji (nie funkcji) if. O blokach i tych śmiesznych klamerkach - { i }.

1

Musisz wziąć instrukcje które się mają wykonać jeśli warunek jest spełniony w klamry {}

if(a==1){
  //tu instrukcje
}
 

możesz też zainteresować się instrukcją switch ;]

0

użyj klamr po if wykona/nie wykona się tylko 1 instrukcja i przejdzie dalej

0

Dzięki wszystkim za pomoc :) Już wiem :)

0

Gdybym to ja był kompilatorem, oberwałbyś ode mnie za 5 linie, gdzie pisze <ort>"sluzy"</ort> :P

0

Poczytaj sobie jeszcze o instrukcji switch, w Twoim przypadku będzie bardziej odpowiednia niż używanie if.

0
antosiek3 napisał(a)

Gdybym to ja był kompilatorem, oberwałbyś ode mnie za 5 linie, gdzie pisze <ort>"sluzy"</ort> :P

JEST NAPISANE

0

Tak czy siak, jak pisałem, już działa:

 #include <iostream>
int main ()
{
	double a, x, z;
	std::cout << "Programik sluzy do obliczania wynikow z dzialan. W liczbach z przecinkiem uzywaj kropki." << std::endl;
	std::cout << "Wybierz typ dzialania: 1 = dodawanie 2 = odejmowanie 3 = mnozenie 4 = dzielenie" << std::endl;
	std::cin >> a;
	if (a==1)
	{
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z dodawania: \t" << x+z << std::endl;
	}
	if (a==2)
	{
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z odejmowania: \t" << x-z << std::endl;
	}
			if (a==3)
			{
			std::cout << "Wprowadz 1 liczbe: \t";
			std::cin >> x;
			std::cout << std::endl << "Wprowadz 2 liczbe: \t";
			std::cin >> z;
			std::cout << std::endl << "Wynik z mnozenia: \t" << x*z << std::endl;
			}
			if (a==4)
			{
			std::cout << "Wprowadz 1 liczbe: \t";
			std::cin >> x;
			std::cout << std::endl << "Wprowadz 2 liczbe: \t";
			std::cin >> z;
			std::cout << std::endl << "Wynik z dzielenia: \t" << x/z << std::endl;
			}

	system ("PAUSE");
	return 0;
}

EDIT.
Za radą jakiegoś szanownego usera pouczyłem się troszkę o switch i próbowałem zmienić kod... ale coś znów nie działa :/ Szukam błędu ale lipa. Kompilator mówi mi że "switch statement contains no 'case' or 'default' labels" a później kilkanaście razy na zmianę "illegal case" i "illegal break".

Oto kodzik:

 #include <iostream>
int main ()
{
	int a;
	std::cout << "Programik sluzy do obliczania wynikow z dzialan. W liczbach z przecinkiem uzywaj kropki." << std::endl;
	std::cout << "Wybierz typ dzialania: 1 = dodawanie 2 = odejmowanie 3 = mnozenie 4 = dzielenie" << std::endl;
	std::cin >> a;
	double x,z;
	switch ( a );
	{
	case 1:
		{
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z dodawania: \t" << x+z << std::endl;
		break;
		}
	case 2:
		{
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z odejmowania: \t" << x-z << std::endl;
		break;
		}
	case 3:
		{	
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z mnozenia: \t" << x*z << std::endl;
		break;
		}
	case 4:
		{	
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z dzielenia: \t" << x/z << std::endl;
		break;
		}
	default:
		std::cout << "Nie istnieje taki typ dzialania." << std::endl;
	}

	system ("PAUSE");
	return 0;
}
1

Switcha zamykasz w tej samej linii, w której otwierasz:

switch ( a ) /* --> */ ; /* <-- o, tutaj */
0

Mógłbyś jeszcze te swoje operacje wrzucić do jednej mapy.

std::map<std::string, std::function<int(int, int)>> operations;
operations["dodawanie"] = [](int first, int second) -> int { return first + second; }; // itd.

No, ale na twoim obecnym poziomie to chyba tylko ciekawostka.

0

Dobra... udało mi się to zrobić i wszystko działało, ale teraz gdy próbuję odpalić program znów coś się popsuło :/ A działało :(

 #include <iostream>
int main ()
{
	int a;
	std::cout << "Programik sluzy do obliczania wynikow z dzialan. W liczbach z przecinkiem uzywaj kropki." << std::endl;
	do
	{
	std::cout << "Wybierz typ dzialania:" << std::endl << "[1] Dodawanie" << std::endl << "[2] Odejmowanie" << std::endl << "[3] Mnozenie" << std::endl << "[4] Dzielenie" << std::endl << "[0] Wylacz program" << std::endl;
	std::cin >> a;
	double x,z;
	switch ( a )
	{
	case 1:
		{
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z dodawania: \t" << x+z << std::endl << std::endl << std::endl;
		break;
		}
	case 2:
		{
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z odejmowania: \t" << x-z << std::endl << std::endl << std::endl;
		break;
		}
	case 3:
		{	
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z mnozenia: \t" << x*z << std::endl << std::endl << std::endl;
		break;
		}
	case 4:
		{	
		std::cout << "Wprowadz 1 liczbe: \t";
		std::cin >> x;
		std::cout << std::endl << "Wprowadz 2 liczbe: \t";
		std::cin >> z;
		std::cout << std::endl << "Wynik z dzielenia: \t" << x/z << std::endl << std::endl << std::endl;
		break;
		}
	default:
		{
			std::cout << "Nie istnieje taki typ dzialania." << std::endl << std::endl << std::endl;
		}
	}
	} while (a = 0);
	system ("PAUSE");
	return 0;
}
0

dev c++ 4.9.9.2 kompiluje się

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