Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zmniejszenie ilości warunków if.

Ostatnio zmodyfikowano 2015-11-28 19:04
Autor Wiadomość
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? :)


C/C++
#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;
}
P-140915
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
C/C++
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:
C/C++
#include <random>
#include <iostream>
using namespace std;

int main()
{
    random_device rd;
    mt19937 gen( rd() );
    uniform_int_distribution < int > dist( 1, 6 ); // ustawienie dystansu
    cout << dist( gen ); // uzycie generatora z zakresem liczb
    cout << endl;
    return 0;
}
 
P-140917
wilkoo13
» 2015-11-27 17:24:00
Ja bym użył "swtich"
P-140918
pekfos
» 2015-11-28 00:41:13
Po co tu w ogóle warunki?
C/C++
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.
P-140969
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 :)
C/C++
#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;
}
P-141009
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.
P-141012
carlosmay
» 2015-11-28 19:04:46
Można to jeszcze trochę uprościć:
C/C++
void oczko( const string & str ) // jest tylko jedna funkcja
{
    cout << "\n$ " << imie << " wylosowal " << liczba << " " << str << " na 6.\n"; // str to wyrazy przekazane w argumencie
}

int main()
{
    // ....
    srand( time( NULL ) );
   
    string str[ 3 ] = { "oczko", "oczka", "oczek" }; // tablica z wyrazami
   
    kostka =( "/p kostka" );
    // ....
   
    switch( liczba )
    {
    case 1: oczko( str[ 0 ] ); break; // wywolanie jednej funkcji z roznymi wyrazami
    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'.
P-141013
« 1 »
  Strona 1 z 1