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.
pierwszy program C++
-
- Beginner
- Posty: 100
- Rejestracja: 12 lutego 2007, 14:35
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;
}
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;
}