Witam, muszę zrobić program z menu i kilkoma podmenu, z każdego podmenu musi być możliwość cofnięcia się do wcześniejszego menu oraz wyjścia z programu. Muszę to zastosować w programie na zaliczenie, użyłem goto i wszystko pięknie działało, ale nauczyciel mówi, żebym to zrobił bez goto i za bardzo nie mogę wygłówkować... Macie jakieś propozycje?
Spróbuj tak:
int menu;
switch(menu)
{
case 1:
//jakiś kod
break;
case 2:
//jakiś kod
break;
//...
case 'N':
//jakiś kod
break;
default:
//jakiś kod
break;
}
google: automat skończony
na przykład na funkcjach, schemat menu:
void menu(){
bool powrot=false;
while(!powrot){
cout<<"blablabla, wybierz:";
switch(){
case 1:podmenu1();
case 2:podmenu2();
case EXIT: powrot=true;
}
}
}
Ja bym to zrobił tak: (nie mogłeś napisać jaki język więc zakładam że C++):
Wygląda na przerośnięte, ale interfejs, możliwość rozszerzania i skalowalność ładna. Wszystko co trzeba dopisać to zmienić metodę main na tworzenie innych obiektów.
Jakbym ja był wykładowcą/nauczycielem to wersje z funkcjami zaliczyłbym ledwo na trójczynę :) .
#include <vector>
#include <stdio.h>
using namespace std;
class menuNode
{
char *title;
char *text;
menuNode *parent;
vector<menuNode*> subnodes;
public:
menuNode(char *title,
char *text);
void addSubmenu(menuNode *subnode);
char *getTitle();
char *getText();
int size();
menuNode* childAtNdx(int ndx);
};
menuNode::menuNode(char *title, char *text)
{
this->title = title;
this->text = text;
this->parent = 0;
subnodes = vector<menuNode*>();
}
void menuNode::addSubmenu(menuNode *subnode)
{
subnode->parent = this;
this->subnodes.push_back(subnode);
}
char *menuNode::getTitle()
{ return title; }
char *menuNode::getText()
{ return text; }
int menuNode::size()
{ return subnodes.size(); }
menuNode* menuNode::childAtNdx(int ndx)
{
if (ndx == 0) return parent;
else return subnodes[ndx - 1];
}
void showMenu(menuNode *node)
{
printf(" .:%s:. \n", node->getTitle());
printf("%s\n", node->getText());
int max = node->size() + 1;
for(int i = 0; i < max; i++)
{
char *text;
if (node->childAtNdx(i) == 0)
{ text = "return"; }
else
{ text = node->childAtNdx(i)->getTitle(); }
printf(" - %2d : %s\n", i, text);
}
}
void menuSession(menuNode *menu)
{
while (menu)
{
showMenu(menu);
int choice;
scanf("%d", &choice);
if (choice > menu->size())
{ printf("invalid child\n"); continue; }
menu = menu->childAtNdx(choice);
}
}
int main()
{
menuNode mainMenu = menuNode("main menu", "this is main menu");
mainMenu.addSubmenu(new menuNode("sub1", "sub1 text"));
mainMenu.addSubmenu(new menuNode("sub2", "sub2 text"));
menuSession(&mainMenu);
}
PS. nie powinno być żadnych błędów, ale gwarancji nie dam...
MSM napisał(a)
Jakbym ja był wykładowcą/nauczycielem to wersje z funkcjami zaliczyłbym ledwo na trójczynę :) .
Pierwsze co mi przyszło do głowy, to było drzewko obiektów, ale uznałem, że jeśli ktoś używa goto, to powinienem dać najmniej skomplikowaną odpowiedź...
MSM napisał(a)
Jakbym ja był wykładowcą/nauczycielem to wersje z funkcjami zaliczyłbym ledwo na trójczynę :) .
A jak Ja bym był nauczycielem, to skarciłbym za używanie starego stdio.h :)
oj biedny ty uczniu, biedny... ;p