c/c++ jak to lepiej zrobic

0

Witam,
Mam dwie sprawy.
Pierwsza:
Mam sobie menu za pomocą switch case i zawsze robilem tak:

poczatek:
    TRESC
    cin >> wybor;
    switch(wybor)
    {
    case 1:
        {
            TRESC
        }
    case 2:
        {
            TRESC
        }
    case 3:
        {
            TRESC       
        }
    case 4:
        {
            TRESC
        }
    case 5:
        {
            TRESC
        }
    }
    goto poczatek;

Wiem ze to jest malo profesjonalnie i dlatego pytam czy da sie szybko i sprawnie zrobic to inaczej ? (Chodzi o to zeby np.: user wybiera jakas opcje programu, nastepnie ta opcja sie wykonuje i potem znowu program powraca do glownego menu)

Druga sprawa jak chce wylosowac liczby z przedzialu 0 - 99 to powinienem zrobic:
przyklad:

tab[i][j] = rand() % 100

Chodzi mi o to czy %100 da losowe liczby z zakresu 0 - 99 ??

2

Ad 1: http://4programmers.net/Forum/1100492
Ad 2: Nie, reszta z dzielenia przez 100 daje wynik w granicach od -13 do +666 ;P

1

Hej,
Najprościej zamienić goto na pętle.
Kod poniżej korzysta z tablicy wskaźników na funkcję, jednak chyba lepiej by było zamknąć "menu" w klasę i użyć std::map.

 
#include <iostream>

using namespace std;

enum E_MENU
{
    E_OPT_MIN = 0,
    E_OPT_0   = 0,
    E_OPT_1,
    E_OPT_2,
    E_OPT_EXIT
};

struct sSomeData
{
    int m_iData;
};

typedef void(*pFunc)(sSomeData a_sData);

void opt0(sSomeData a_sData)
{
    cout<<"Opt0"<<endl;
}
void opt1(sSomeData a_sData)
{
    cout<<"Opt1"<<endl;
}
void opt2(sSomeData a_sData)
{
    cout<<"Opt2"<<endl;
}
bool initMenu(pFunc a_aTab[])
{
    a_aTab[E_OPT_0] = opt0;
    a_aTab[E_OPT_1] = opt1;
    a_aTab[E_OPT_2] = opt2;
}

bool handleOpt(E_MENU a_eOpt, pFunc a_aTab[], sSomeData a_sData)
{
    bool fRes = false;
    if(E_OPT_MIN <= a_eOpt && E_OPT_EXIT > a_eOpt)
    {
        (a_aTab[a_eOpt])(a_sData);
        fRes = true;
    }
    return fRes;
}

void runMenu(sSomeData a_sData)
{
    pFunc _aTab[E_OPT_EXIT];
    initMenu(_aTab);
    int _iOpt;
    
    do{
        cout << "Wybierz opcje 0-2" <<endl;
        cin >> _iOpt;
    }while(true == handleOpt(static_cast<E_MENU>(_iOpt), _aTab, a_sData));
}

int main()
{
    sSomeData _sData = {1};
    runMenu(_sData);
    
    return 0;
}
1
#include <iostream>
#include <functional>
#include <unordered_map>
#include <string>
using namespace std;

int main() {
	string greetings = "Hello, you filthy world!";
	
	unordered_map<string, function<void()>> menu = {
		{"Foo", []{ cout << "Foo" << endl; }},
		{"Greet", [&]{ cout << greetings << endl; }}
	};
	
	for(auto const & menu_item: menu) {
		cout << "> " << menu_item.first << endl;
	}
	
	string decision;
	cin >> decision;
	menu.at(decision)();
	
	return 0;
}
Input Output
Greet
> Greet
> Foo
Hello, you filthy world!

http://ideone.com/0LXyOD

//EDIT:
Obsługa błędu:

if(menu.count(decision)) {
    menu[decision]();
}
else {
    cout << "Na a ah" << endl;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1