KlusekPospolity Temat założony przez niniejszego użytkownika |
[C++] Zmniejszenie ilości warunków if. » 2015-11-27 17:02:44 Jako raczkujący w C++ chciałem stworzyć mały programik kostki która po wpisaniu komendy wylosowałaby jedną bądź dwie liczby. Czy jest możliwość nie wypisywania każdego warunku z osobna? Mam na myśli: if(liczba==0) {cout<<"\n$ "<<imie<<" wylosowal "<<liczba<<" oczek na 6.\n\n";} if(liczba==5) {cout<<"\n$ "<<imie<<" wylosowal "<<liczba<<" oczek na 6.\n\n";} Pomyślałem, że powtarzalność wyniku jak:" oczek " przy liczbach 0,5,6 można zamieścić w jednym warunku. Jakieś propozycje? :) #include<iostream> #include<cstdlib> #include<string> #include <ctime> using namespace std; int main() { cout << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" << endl; cout << "$ $$$" << endl; cout << "$ kostka v0.1 $$" << endl; cout << "$ $" << endl; cout << "$$ by KLUCHA $" << endl; cout << "$$$ $" << endl; cout << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n" << endl; srand( time( NULL ) ); int liczba, licznik = 1; string wybor, kostka, imie, wyjscie, kostkax2; kostka =( "/p kostka" ); kostkax2 =( "/p kostka x2" ); wyjscie =( "wyjdz" ); cout << "$ Podaj imie i nazwisko postaci!\n"; getline( cin, imie ); do { cout << "\n$ Wpisz '/p kostka' by wylosowac.\n$ Wpisz '/p kostka x2' zeby wylosowac dwa razy.\n$ Wpisz 'wyjdz' aby opuscic program.\n\n"; cin.clear(); cin.sync(); getline( cin, wybor ); if( wybor == kostka ) { liczba =( rand() % 7 ) + 0; if( liczba == 1 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczko na 6.\n\n"; } if( liczba == 0 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n\n"; } if( liczba == 5 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n\n"; } if( liczba == 6 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n\n"; } if( liczba == 2 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n\n"; } if( liczba == 3 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n\n"; } if( liczba == 4 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n\n"; } } if( wybor == kostkax2 ) { for( licznik = 1; licznik <= 2; licznik++ ) { liczba =( rand() % 7 ) + 0; if( liczba == 1 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczko na 6.\n"; } if( liczba == 0 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n"; } if( liczba == 5 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n"; } if( liczba == 6 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n"; } if( liczba == 2 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n"; } if( liczba == 3 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n"; } if( liczba == 4 ) { cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n"; } } } } while( wybor != wyjscie ); return 0; }
|
|
carlosmay |
» 2015-11-27 17:22:06 Możesz napisać funkcję, która będzie obsługiwać losowanie. Kostka ma 6 boków, więc losowanie zera należy ominąć. A co do tych if'ów, to if( wybor == kostka ) { liczba =( rand() % 7 ) + 0; cout << "\n$ " << imie << " wylosowal " << liczba << " oczko na 6.\n\n"; } if( wybor == kostkax2 ) { for( licznik = 1; licznik <= 2; licznik++ ) { liczba =( rand() % 7 ) + 0; cout << "\n$ " << imie << " wylosowal " << liczba << " oczko na 6.\n"; } }
są one całkiem niepotrzebne. Bez nich program robi to samo. Do losowania użyj <random> np: #include <random> #include <iostream> using namespace std;
int main() { random_device rd; mt19937 gen( rd() ); uniform_int_distribution < int > dist( 1, 6 ); cout << dist( gen ); cout << endl; return 0; }
|
|
wilkoo13 |
» 2015-11-27 17:24:00 Ja bym użył "swtich" |
|
pekfos |
» 2015-11-28 00:41:13 Po co tu w ogóle warunki? liczba =( rand() % 7 ) + 0; if( liczba == 1 )
{ cout << "\n$ " << imie << " wylosowal " << liczba << " oczko na 6.\n"; }
if( liczba == 0 )
{ cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n"; } if( liczba == 5 )
{ cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n"; } if( liczba == 6 )
{ cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n"; } if( liczba == 2 )
{ cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n"; } if( liczba == 3 )
{ cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n"; } if( liczba == 4 )
{ cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n"; }
|
W zależności od wylosowanej liczby, albo robisz to samo, albo to samo, w paru innych przypadkach - to samo. A np dla liczby 4 wyjątkowo robisz.. to samo. Jedyne, co się zmienia, to odmiana słowa 'oczko', a to możesz trzymać w tablicy. Będziesz mieć identyczny efekt bez żadnych warunków i bez pisania w kółko tego samego kodu. |
|
KlusekPospolity Temat założony przez niniejszego użytkownika |
» 2015-11-28 18:39:42 Chwilkę się pobawiłem i stworzyłem funkcje które ułatwiły mi zadanie. Oceńcie moje wypociny :) #include <ctime> using namespace std;
int liczba, licznik; string wybor, kostka, imie, wyjscie, kostkax2;
void oczko() { cout << "\n$ " << imie << " wylosowal " << liczba << " oczko na 6.\n"; } void oczka() { cout << "\n$ " << imie << " wylosowal " << liczba << " oczka na 6.\n"; } void oczek() { cout << "\n$ " << imie << " wylosowal " << liczba << " oczek na 6.\n"; }
int main() { cout << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" << endl; cout << "$ $$$" << endl; cout << "$ kostka v0.1 $$" << endl; cout << "$ $" << endl; cout << "$$ by KLUCHA $" << endl; cout << "$$$ $" << endl; cout << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n" << endl; srand( time( NULL ) ); kostka =( "/p kostka" ); kostkax2 =( "/p kostka x2" ); wyjscie =( "wyjdz" ); cout << "$ Podaj imie i nazwisko postaci!\n\n"; getline( cin, imie ); do { cout << "\n$ Wpisz '/p kostka' by wylosowac.\n$ Wpisz '/p kostka x2' zeby wylosowac dwa razy.\n$ Wpisz 'wyjdz' aby opuscic program.\n\n"; cin.clear(); cin.sync(); getline( cin, wybor ); if( wybor == kostka ) { liczba =( rand() % 6 ) + 1; switch( liczba ) { case 1: oczko(); break; case 2: oczka(); break; case 3: oczka(); break; case 4: oczka(); break; case 5: oczek(); break; case 6: oczek(); break; } } if( wybor == kostkax2 ) { for( licznik = 1; licznik <= 2; licznik++ ) { liczba =( rand() % 6 ) + 1; switch( liczba ) { case 1: oczko(); break; case 2: oczka(); break; case 3: oczka(); break; case 4: oczka(); break; case 5: oczek(); break; case 6: oczek(); break; } } } } while( wybor != wyjscie ); return 0; }
|
|
pekfos |
» 2015-11-28 19:00:39 Słabo. Funkcji nie zastosowałeś zbyt poprawnie i można to było zrobić jeszcze prościej. Podałem sposób. |
|
carlosmay |
» 2015-11-28 19:04:46 Można to jeszcze trochę uprościć: void oczko( const string & str ) { cout << "\n$ " << imie << " wylosowal " << liczba << " " << str << " na 6.\n"; }
int main() { srand( time( NULL ) ); string str[ 3 ] = { "oczko", "oczka", "oczek" }; kostka =( "/p kostka" ); switch( liczba ) { case 1: oczko( str[ 0 ] ); break; case 2: oczko( str[ 1 ] ); break; case 3: oczko( str[ 1 ] ); break; case 4: oczko( str[ 1 ] ); break; case 5: oczko( str[ 2 ] ); break; case 6: oczko( str[ 2 ] ); break; }
Do każdego powtarzającego kodu można napisać funkcję, jak w tym programie 'switch'. |
|
« 1 » |