Jak zrobić menu z powrotami bez goto?

0

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?

0

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;
}
0

google: automat skończony

0

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;
    }
  }

}
 
0

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...

0
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ź...

0
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 :)

0

oj biedny ty uczniu, biedny... ;p

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