[C++] instrukcja wyboru

Awatar użytkownika
Ceplusplusik
Użytkownik
Użytkownik
Posty: 228
Rejestracja: 7 paź 2012, o 17:02
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 94 razy

[C++] instrukcja wyboru

Post autor: Ceplusplusik »

Witam serdecznie. W trakcie wykonywania tego programu na Dev-C++ pojawiają się następujące błędy (daję link do obrazka):

Podaję kod:

Kod: Zaznacz cały

#define _USE_MATH_DEFINES
#include <iostream>
#include <math.h>
using namespace std;

int main ()
{
	
	char opcja;
	
	do
	{
		
	cout << "Wybierz opcje (K,k-kula, W,w -walec, S,s - stozek, Q,q-wyjscie)"; cin>>opcja;
	switch (opcja)
	{
			case 'k':
			case 'K': 
			
				double promienKuli;
				cout << "Wprowadz dlugosc promienia kuli= " << endl;
				cin >> promienKuli;
				double poleKuli=4*M_PI*pow(promienKuli, 2);
				double objetoscKuli=(4*M_PI*pow(promienKuli, 3))/3.0;
				
				cout << "Pole kuli wynosi= " << poleKuli << endl;
			
				cout << "Objetosc kuli wynosi= " << objetoscKuli << endl;
				
			
			case 's':
			case 'S': 
			
				double tworzacaStozka, promienStozka, wysokoscStozka;
				cout << "Wprowadz dlugosc promienia stozka= " << endl;
				cin >> promienStozka;
				cout << "Wprowadz dlugosc wysokosci stozka= " << endl;
				cin >> wysokoscStozka;
				double poleStozka=M_PI*pow(promienStozka, 2)+M_PI*promienStozka*sqrt(pow(promienStozka, 2)+pow(wysokoscStozka, 2));
				double objetoscStozka=(M_PI*pow(promienStozka, 2)*wysokoscStozka)/3.0;
				
				cout << "Pole stozka wynosi= " << poleStozka << endl;
			
				cout << "Objetosc stozka wynosi= " << objetoscStozka << endl;
		
			case 'w':
			case 'W': 
			
				double promienWalca, wysokoscWalca;
				cout << "Wprowadz dlugosc promienia walca= " << endl;
				cin >> promienWalca;
				cout << "Wprowadz dlugosc wysokosci walca= " << endl;
				cin >> wysokoscWalca;
				double poleWalca=2*M_PI*pow(promienWalca, 2)+2*M_PI*promienWalca*wysokoscWalca;
				double objetoscWalca=M_PI*pow(promienWalca, 2)*wysokoscWalca;
			
				cout << "Pole walca wynosi = " << poleWalca << endl;
			
				cout << "Objetosc walca wynosi = " << objetoscWalca << endl;
			
			case 'q':
			case 'Q':
				cout << "Koniec programu." << endl;
		}
	} while (opcja != 'Q' && opcja!= 'q');
	return 0;
}

Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C++] instrukcja wyboru

Post autor: miki999 »

Witaj,

obrazek jest za mały i nic nie widać, ale na ogół pokazane komunikaty mówią o co chodzi. Na pierwszy rzut oka: brak breaków przy case'ach i brak defaulta w switchu (chociaż to nie powinno skutkować błędem).
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] instrukcja wyboru

Post autor: lukequaint »

Otocz klamrami kod zawarty w case.
Awatar użytkownika
Ceplusplusik
Użytkownik
Użytkownik
Posty: 228
Rejestracja: 7 paź 2012, o 17:02
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 94 razy

[C++] instrukcja wyboru

Post autor: Ceplusplusik »

W porządku, elegancko . Druga opcja była pomocna. Jeszcze jedno pytanie: jakiej instrukcji użyć, żeby program po wykonaniu jednej z instrukcji wracał do wyjściowego pytania? Czy użyć tutaj goto? . Pozdrawiam.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C++] instrukcja wyboru

Post autor: miki999 »

Możesz użyć goto, jak Ci akurat pasuje.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] instrukcja wyboru

Post autor: Afish »

Nie używaj goto, użyj pętli, warunków, podprocedur, break, continue, ale nie goto.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C++] instrukcja wyboru

Post autor: miki999 »

Nie zaleca się używania goto, ale to tylko sugestia, pod warunkiem, że skok odbywa się do labela zadeklarowanego w dalszej części kodu.

A jeżeli nie mam racji, to proszę o uzasadnienie, bo sam chętnie się czegoś nowego nauczę
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] instrukcja wyboru

Post autor: Afish »

Od strony syntaktycznej (ba, nawet semantycznej i pragmatycznej) użycie goto będzie zapewne jak najbardziej poprawne, ale ma ono kilka wad:
1. Zaciemnia kod - goto nic nie mówi o celu skoku. Skaczemy do czegoś na kształt podprocedury, do pętli, do bloku else wyrażenia warunkowego? Nic o tym nie wiemy, więc potrzebujemy czasu na zastanowienie.
2. Nie ma żadnej przewagi nad konstrukcjami języka - pętle, warunki itp. zostały stworzone właśnie po to, aby uniknąć goto. W hello worldzie tego nie widać, ale w większym kodzie wady goto ujawniają się od razu, szczególnie wtedy, gdy nad kodem pracuje kilka osób. Ale skoro ten kod jest krótki, to tym bardziej nie ma potrzeby na stosowanie tej konstrukcji. No i pozostaje kwestia doświadczenia poprzedników programistów: skoro sugerują nieużywanie goto, to pewnie coś jest na rzeczy.
3. Pierwszy argument można obalić w ten sposób: "nazwę porządnie etykietę, to będzie wiadomo, gdzie skaczę". To też nie jest rozwiązanie, bo zapewne nazwa będzie zawierała określenie w stylu "else", "if", "function" itp, więc dlaczego nie użyć wbudowanej konstrukcji? Najważniejsze pytanie zada osoba z zewnątrz, a będzie ono brzmiało: "dlaczego goto? Co ono tutaj oznacza"?

Oczywiście nie oznacza to, że nie wolno używać tej konstrukcji, ale sensownych zastosowań niemal nie ma. Osobiście znam tylko jedno: wyskoczenie z wielokrotnie zagłębionej pętli. Przy czym to też nie jest dobry argument, bo w czystym kodzie nie powinna się pojawić taka sytuacja.

Osobną kwestią jest używanie goto tam, gdzie nie mamy innych konstrukcji - w językach asemblerowych, na poziomie kodu maszynowego lub w innych niskopoziomowych zastosowaniach. Ale na szczęście tutaj nie mamy takiej sytuacji.
Gouranga
Użytkownik
Użytkownik
Posty: 1588
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[C++] instrukcja wyboru

Post autor: Gouranga »

goto jest dobre do niedużych programów i tylko dla dobrych programistów, którzy potrafią porządnie nazywać labele. Dodatkowo nie powinno się używać goto w projektach zespołowych, gdyż zaciemnia kod i o ile sam autor wie o co chodzi to ktoś czytający kod łatwiej połapie się w formułach języka (pętlach, ifach...) niż w labelach
Awatar użytkownika
Ceplusplusik
Użytkownik
Użytkownik
Posty: 228
Rejestracja: 7 paź 2012, o 17:02
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 94 razy

[C++] instrukcja wyboru

Post autor: Ceplusplusik »

W porządku, dziękuję Wam za pomoc . Pozdrawiam.
ODPOWIEDZ