[c++] powrot do poczatku programy po wykonaniu bloku z case

Awatar użytkownika
SK8
Użytkownik
Użytkownik
Posty: 213
Rejestracja: 29 sie 2007, o 10:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 29 razy
Pomógł: 36 razy

[c++] powrot do poczatku programy po wykonaniu bloku z case

Post autor: SK8 »

Mam taki program, który jest (prymitywnym) kalkulatorem. Nie wiem co trzeba dodać jeżeli chcę aby po wykonaniu powiedzmy mnożenia z case 1: program wracał do linijki Podaj nr działania. Dopiero się uczę wiec może się ten program jest pewnie trochę zakręcony zwłaszcza w dwóch ostatnich funkcjach, ale mimo wszystko proszę o pomoc. Zastanawiałem się czy nie można do tego użyć instrukcji

Kod: Zaznacz cały

 goto 
ale tam gdzie chcę wrócić chyba nie ma żadnej etykiety...
Oto kod:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

// ********************************* DEKLARACJE FUNKCKCJI *************************************

float mnozenie (float a, float b);
float dzielenie (float a, float b);
float dodawanie (float a, float b);
float odejmowanie (float a, float b);
float fmin (float a, float b);
float fmax (float a, float b);
float fsng (float a);
float wb (float a);
float zb_a(); //pobieranie pierwszej liczby
float zb_b(); //pobieranie drugiej liczby

// ******************************** KONIEC DEKLARACJI ****************************************

float main()
{
	cout << "Witaj w Calc. Wybierz dzialanie:
"
		<<"1-mnozenie
"
		<<"2-dzielenie
"
		<<"3-dodawanie
"
		<<"4-odejmowanie
"
		<<"5-funkcja min
"
		<<"6-funkcja max
"
		<<"7-funkcja sng
"
		<<"8-wartosc bezwzgledna
"
		<<"Podaj nr dzialania:	"; //TU CHCE WROCIC PO MNOZENIU
	short int nr;
	cin >> nr;

	switch(nr) //wywolywanie funkcji w zaleznosci od podanego numeru dzialania
	{
	case 1:
		{
			float a = zb_a();
			float b = zb_b();
			float wynik = mnozenie (a, b);
			cout <<a<<" * "<<b<<" = "<<wynik <<"
";
			break;
		}
	case 2:
		{
			float a = zb_a();
			float b = zb_b();
			float wynik = dzielenie (a, b);
			cout <<a<<" / "<<b<<" = "<<wynik <<"
";
			break;
		}
	case 3:
		{
			float a = zb_a();
			float b = zb_b();
			float wynik = dodawanie (a, b);
			cout <<a<<" + "<<b<<" = "<<wynik <<"
";
			break;
		}
	case 4:
		{
			float a = zb_a();
			float b = zb_b();
			float wynik = odejmowanie (a, b);
			cout <<a<<" - "<<b<<" = "<<wynik <<"
";
			break;
		}
	case 5:
		{
			float a = zb_a();
			float b = zb_b();
			float wynik = fmin (a, b);
			cout <<"Mniejsza liczba to:	"<<wynik <<"
";
			break;
		}
	case 6:
		{
			float a = zb_a();
			float b = zb_b();
			float wynik = fmax (a, b);
			cout <<"Wieksza liczba to:	"<<wynik <<"
";
			break;
		}
	case 7:
		{
			float a = zb_a();
			float wynik = fsng (a);
			if(wynik < 0)
				cout << "Twoja liczba jest ujemna. Funkcja przyporzadkuje jej wartosc -1.
";
			else 
				if(wynik==0)
				cout << "Twoja liczba jest rowna 0. Funkcja przyporzadkuje jej wartosc 0.
";
				else 
				cout << "Twoja liczba jest dodatnia. Funkcja przyporzadkuje jej wartosc 1.
";
			break;
		}
	case 8:
		{
			float a = zb_a();
			float wynik = wb (a);
			if(wynik >= 0)
				cout << "Wartosc bezwzgledna z "<<a<< " = "<<wynik <<"
";
			else
				cout << "Wartosc bezwzgledna z "<<a<< " = "<<-wynik <<"
";
			break;
		}
	}
}

// ************************************ DEFINICJE FUNKCJI LICZACYCH ******************************************************

// ***** POBIERANIE LICZBY A *********************************************************************************************
float zb_a()
{
	cout << "Podaj pierwsza liczbe:	";
	float a;
	cin  >> a;
	return a;
}

// ***** POBIERANIE LICZBY B *********************************************************************************************
float zb_b()
{
	cout << "Podaj druga liczbe:	";
	float b;
	cin  >> b;
	return b;
}

// ***** MNOŻENIE ********************************************************************************************************
float mnozenie (float a, float b)
{
	float wynik;
	wynik = a * b;
	return wynik;
}

// ***** DZIELENIE *******************************************************************************************************
float dzielenie (float a, float b)
{
	float wynik;
	wynik = a / b;
	return wynik;
}

// ***** DODAWANIE *******************************************************************************************************
float dodawanie (float a, float b)
{
	float wynik;
	wynik = a + b;
	return wynik;
}

// ***** ODEJMOWANIE *****************************************************************************************************
float odejmowanie (float a, float b)
{
	float wynik;
	wynik = a - b;
	return wynik;
}

// ***** FUNKCJA MIN *****************************************************************************************************
float fmin (float a, float b)
{
	if(a <= b)
		return a;
	else
		return b;
}

// ***** FUNKCJA MAX *****************************************************************************************************
float fmax (float a, float b)
{
	if(a >= b)
		return a;
	else
		return b;
}

// ***** FUNKCJA SNG *****************************************************************************************************
float fsng (float a)
{
	return a;
}

// ***** WARTOSC BEZWZGLEDNA *********************************************************************************************
float wb (float a)
{
	return a;
}

//************************************ KONIEC DEFINICJI FUNKCJI **********************************************************
DerSchmetterlig
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 25 gru 2007, o 21:56
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 1 raz
Pomógł: 1 raz

[c++] powrot do poczatku programy po wykonaniu bloku z case

Post autor: DerSchmetterlig »

Oczywiście, że możesz użyć instrukcji goto chociaż nie powinno się tego stosować.

Aby to zrobić wstawiasz etykietę, do której "wróci" program po tym jak wykona dalsze instrukcje.
Np.

Kod: Zaznacz cały

...
poczatek: //etykieta
 cout << "Witaj w Calc. Wybierz dzialanie:
" 
...
goto poczatek; //powrot do etykiety
...
Musisz jednak pamiętać, aby do case dodać jeszcze jedną opcje kończenia programu, bo jeśli tego nie zrobisz program będzie powtarzał się w nieskończoność.

Pozdrawiam
Ostatnio zmieniony 31 gru 2007, o 15:19 przez DerSchmetterlig, łącznie zmieniany 1 raz.
Awatar użytkownika
SK8
Użytkownik
Użytkownik
Posty: 213
Rejestracja: 29 sie 2007, o 10:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 29 razy
Pomógł: 36 razy

[c++] powrot do poczatku programy po wykonaniu bloku z case

Post autor: SK8 »

okej dzięki. Spróbuję to jeszcze przerobić na if'y.

[ Dodano: 31 Grudnia 2007, 15:14 ]
a wtedygoto poczatek wchodzi zamiast break?
DerSchmetterlig
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 25 gru 2007, o 21:56
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 1 raz
Pomógł: 1 raz

[c++] powrot do poczatku programy po wykonaniu bloku z case

Post autor: DerSchmetterlig »

SK8 pisze: a wtedygoto poczatek wchodzi zamiast break?
Nie. goto poczatek; wstawiasz tylko przed } zamykającą main.

Kod: Zaznacz cały

int main()
{
poczatek:
... //dalsze instrukcje
goto poczatek;
}

/* FUNKCJE */
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] powrot do poczatku programy po wykonaniu bloku z case

Post autor: kadiii »

Uzyj pętli, to jedyne słuszne rozwiązanie w tym wypadku. I oczywiście musi być też jakiś warunek zakończenia bo ta pętla z goto jest oczywiście nieskończona. Czyli robisz np. zmienną int dalej=1 i np.
while(dalej)
{
TWÓJ KOD...
coutdalej;
}
Awatar użytkownika
SK8
Użytkownik
Użytkownik
Posty: 213
Rejestracja: 29 sie 2007, o 10:18
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 29 razy
Pomógł: 36 razy

[c++] powrot do poczatku programy po wykonaniu bloku z case

Post autor: SK8 »

aha no tak, bo break; wychodzi do pierwszej instrukcji po switch.
Zrobiłem to z pętlą, dzięki kadiii.
ODPOWIEDZ