Strona 2 z 2

: 03 marca 2010, 14:16
autor: malinkalive
grucha pisze:

Kod: Zaznacz cały

 do
     {
      std::cout << "1 Bez" << std::endl]
A co według ciebie robi ta pętla? Zabezpiecza przed wpisaniem innej wartości niż 1-5. Nie jest ci potrzebna albo ona, albo default. Obstawiałbym pętle, bo nieciekawie reaguje na wpisanie do akcji np. litery.[/quote]

Dokładnie miała zabezpieczać przed innym znakiem niż 1-5 ale dziwnie reaguje na litery, pominięcie jej nie wiele daje ponieważ menu wyboru wyświetlane jest tylko raz.

: 03 marca 2010, 15:09
autor: grucha
Generalnie musisz się zdecydować na którąś z dróg. Jak zabezpieczasz się w pętli przed złymi danymi, to nie ma co sprawdzać tego ponownie parę linijek niżej (no chyba, że zabezpieczamy się przed jakimiś błędami, ale wtedy to już inna bajka). Ja bym ten komunikat o złych danych dał właśnie do pętli. Poza tym cały ten kod ma trochę nieścisłości (zwłaszcza zważywszy na treść zadania). Moja wersja wygląda tak:

Kod: Zaznacz cały

#include <iostream>

using namespace std;

enum wzor {bez, rododendron, sosna, fiolek, czekolada};

wzor podloga[20][15]; // tablica musi być globalna, żeby funkcja mogła ją zmieniać

int menu()
{
	int tmp;
	cout << "1 Bez" << endl;
	cout << "2 Rododendron" << endl;
	cout << "3 Sosna" << endl;
	cout << "4 Fiolek" << endl;
	cout << "5 Czekolada" << endl;
	cout << "Twoj wybor: ";
	cin >> tmp;
	return tmp;
}

void tlo(wzor pattern)
{	
	// wypełnianie tablicy
}

int main(int argc, char *argv[])
{
	int akcja = menu();

	while (akcja < 1 | akcja > 5) // pętla zabezpieczająca przed wpisaniem niepoprawnych danych
	{
		cout << endl << "Zly wybor liczba nie zawiera sie w [1,5]" << endl;
		akcja = menu();
	}
	
	switch (akcja)
	{
       	case 1: 
       		cout << "Wybrano Bez" << endl;
       		tlo(bez);
       		break;               
      	case 2: 
       		cout << "Wybrano Rododendron" << endl;
       		tlo(rododendron);
       		break;
       	case 3: 
       		cout << "Wybrano Sosna" << endl;
       		tlo(sosna);
       		break;
       	case 4: 
       		cout << "Wybrano Fiolek" << endl;
       		tlo(fiolek);
       		break;
       	case 5: 
       		cout << "Wybrano Czekolada" << endl;
       		tlo(czekolada);
       		break;
       	default: 
       		cout << "Błąd!" << endl; // nie powinno tu dojść, bo pętla wyżej ma temu zapobiec
       		break;
	}

	return 0;
} 

: 03 marca 2010, 20:11
autor: piter
Kiedyś zastanawiałem się jak rozwiązać problem z wpisaniem przez użytkownika litery lub dowolnego ciągu znaków i w swoim rozwiązaniu użyłem typu string zamiast int.

Kod: Zaznacz cały

#include <iostream>

using namespace std;

enum wzor {bez, rododendron, sosna, fiolek, czekolada};

wzor podloga[20][15]; // tablica musi być globalna, żeby funkcja mogła ją zmieniać

string menu()
{
    string tmp;
    cout << "1 Bez" << endl;
    cout << "2 Rododendron" << endl;
    cout << "3 Sosna" << endl;
    cout << "4 Fiolek" << endl;
    cout << "5 Czekolada" << endl;
    cout << "Twoj wybor: ";
    cin >> tmp;
    return tmp;
}

void tlo(wzor pattern)
{   
    // wypełnianie tablicy
}

int main(int argc, char *argv[])
{
    string akcja = menu();

    while (akcja.length() > 1 || akcja[0] < '1' || akcja[0] > '5') // pętla zabezpieczająca przed wpisaniem niepoprawnych danych
    {
        cout << endl << "Zly wybor liczba nie zawiera sie w [1,5]" << endl;
        akcja = menu();
    }
   
    switch (akcja[0])
    {
           case '1':
               cout << "Wybrano Bez" << endl;
               tlo(bez);
               break;               
          case '2':
               cout << "Wybrano Rododendron" << endl;
               tlo(rododendron);
               break;
           case '3':
               cout << "Wybrano Sosna" << endl;
               tlo(sosna);
               break;
           case '4':
               cout << "Wybrano Fiolek" << endl;
               tlo(fiolek);
               break;
           case '5':
               cout << "Wybrano Czekolada" << endl;
               tlo(czekolada);
               break;
           default:
               cout << "Błąd!" << endl; // nie powinno tu dojść, bo pętla wyżej ma temu zapobiec
               break;
    }

    return 0;
}