Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Podmínky v C#

Ahojte ve spolek! Zkouším si naprogramovat menu v restauraci. Jen jsem se trochu sekla u podmínek. Byl by někdo prosím tak hodný a mrknul se mi na to a případně dal radu? Ve VS mi to háže chybu, že A,B,C atd. neexistuje. A pak ještě mi to nechce přijmout - string prani.
Kdo se do toho pustí, bude nejlepší! Předem moc děkuju... :)
Pro info - učím se programovat teprve pár týdnů, tak se mi moc kdyžtak nesmějte :)


using System;

namespace menu
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*** Vítejte v naší restauraci! ***");
            Console.WriteLine("Vyberte prosím z následující nabídky: ");
            Console.WriteLine("1. Polévky");
            Console.WriteLine("2. Předkrmy");
            Console.WriteLine("3. Hlavní jídla");
            Console.WriteLine("4. Dezerty");
            Console.WriteLine("5. Nápoje");
            Console.Write("Vybraná možnost 1..5: ");
            int vybranaKategorie = int.Parse(Console.ReadLine());

            switch (vybranaKategorie)
            {
                case 1:
                    Console.WriteLine("POLÉVKY: ");
                    Console.WriteLine("A: Domácí vývar s nudlemi");
                    Console.WriteLine("B: Čočková");
                    break;
                case 2:
                    Console.WriteLine("PŘEDKRMY: ");
                    Console.WriteLine("C: Šunková rolka s křenem");
                    Console.WriteLine("D: Topinka s pikantní směsí");
                    break;
                case 3:
                    Console.WriteLine("HLAVNÍ JÍDLA: ");
                    Console.WriteLine("E: Kuřecí řízek s bramborem");
                    Console.WriteLine("F: Svíčková s knedlíkem");
                    Console.WriteLine("G: Vepřo knedlo zelo");
                    break;
                case 4:
                    Console.WriteLine("DEZERTY: ");
                    Console.WriteLine("H: Zmrzlinový pohár");
                    Console.WriteLine("I: Jablečný závin");
                    break;
                case 5:
                    Console.WriteLine("NÁPOJE: ");
                    Console.WriteLine("J: Sodovka");
                    Console.WriteLine("K: Minerální voda");
                    Console.WriteLine("L: Jablečný džus");
                    Console.WriteLine("M: Pivo");
                    Console.WriteLine("N: Turecká káva");
                    break;
                default:
                    Console.WriteLine("Neznámá volba");
                    break;
            }
            Console.WriteLine("Zvol písmeno A..N: ");
            string vybranaMoznost = Console.ReadLine();

            switch (vybranaMoznost)
            {
                case A:
                    Console.WriteLine("Zvoleno: Domácí vývar s nudlemi.");
                    break;
                case B:
                    Console.WriteLine("Zvoleno: Čočková.");
                    break;
                case C:
                    Console.WriteLine("Zvoleno: Šunková rolka s křenem.");
                    break;
            }
        }
    }
}
Předmět Autor Datum
Nemělo by to A, B, C být v uvozovkách?
Rce 03.04.2021 23:41
Rce
IMHO nemelo, protoze by to pak byl string a se stringama to IMHO nefunguje. Ja bych spis zkusil apos…
gilhad 04.04.2021 03:04
gilhad
Se stringama to samozřejmě funguje, takže dát to do uvozovek je správná rada.
Wikan 04.04.2021 06:16
Wikan
Jde pouzit string ve switch? Nemela by ta vybranaMoznost byt declarovana jako CHAR? Jinak RCE ma pra…
Jan Fiala 04.04.2021 03:02
Jan Fiala
Stejně bych to dělal úplně jinak :-D menu.h : #include <iostream> enum ETyp {submenu,polozka,nic}…
gilhad 04.04.2021 07:42
gilhad
Krasny kod z roku 1989. Nicmene, tazatel chtel C#.
MaSo 04.04.2021 07:58
MaSo
Hmm, nějak jsem zaměnil # a ++ - nicméně to funguje a mělo by to jít celkem snadno upravit. Pokud s… poslední
gilhad 04.04.2021 08:22
gilhad

IMHO nemelo, protoze by to pak byl string a se stringama to IMHO nefunguje. Ja bych spis zkusil apostrofy (pak jde o znak) a vybrat prvni znak z odpovedi:


switch (vybranaMoznost[0]) 
            {
                case 'A':
                    Console.WriteLine("Zvoleno: Domácí vývar s nudlemi.");
                    break;
                case 'B':
                    Console.WriteLine("Zvoleno: Čočková.");
                    break;
                case 'C':
                    Console.WriteLine("Zvoleno: Šunková rolka s křenem.");
                    break;
            }

A jeste spis bych to resil prez funkce a pole.
A taky bych to v pripade ABC prevedl na velke znaky, aby stisknute 'a' se bralo jako 'A'
A osetril bych si default vsude
A resil odpovedi v druhe urovni s ohledem na uroven prvni, aby si nekdo nevybral "5. Nápoje" a v detailech "A: Domácí vývar s nudlemi"
A protoze bych to resil s ohledem na uroven prvni, tak v druhe urovni by to vzdy zacinalo ABCD... nikoli JKLM...
A dal tam moznost navratu, kdyz se po volbe polivek rozmyslim, ze nechci polivku, ale pivo
A vubec bych udelal vsechno uplne jinak :) ale snad aspon nektere napady zaujmou ...

Stejně bych to dělal úplně jinak :-D

menu.h :


#include <iostream>
enum ETyp {submenu,polozka,nic};

struct TVyber  {
	const char *nadpis;
	int polozka;
	};

struct TMenu_Line {
	const char *nadpis;
	int cena;
	ETyp typ;
	union {
	TMenu_Line (*submenu)[];
	int polozka;
	void *nic;
	};
	
	};

mygetchar.cpp : https://stackoverflow.com/questions/22028142/read-only-one-char-from-cin

#include <iostream>     // cout, cin, streambuf, hex, endl, sgetc, sbumpc
#include <iomanip>      // setw, setfill
#include <fstream>      // fstream

// These inclusions required to set terminal mode.
#include <termios.h>    // struct termios, tcgetattr(), tcsetattr()
#include <stdio.h>      // perror(), stderr, stdin, fileno()

using namespace std;

char mygetchar()
{
    struct termios t;
    struct termios t_saved;

    // Set terminal to single character mode.
    tcgetattr(fileno(stdin), &t);
    t_saved = t;
    t.c_lflag &= (~ICANON & ~ECHO);
    t.c_cc[VTIME] = 0;
    t.c_cc[VMIN] = 1;
    if (tcsetattr(fileno(stdin), TCSANOW, &t) < 0) {
        perror("Unable to set terminal to single character mode");
        return -1;
    }

    // Read single characters from cin.
    std::streambuf *pbuf = cin.rdbuf();
        char c;
        c = pbuf->sbumpc();

    // Restore terminal mode.
    if (tcsetattr(fileno(stdin), TCSANOW, &t_saved) < 0) {
        perror("Unable to restore terminal mode");
        return -1;
    }
    return c;
   }

menu.cpp :

#include "menu.h"
#include "mygetchar.cpp"
const char *clearScr="\033[2J\033[1;1H";
const char *yellow="\033[33,m";
const char *normal="\033[0,m";

#define MENU 0,submenu, submenu:(TMenu_Line (*)[])&(TMenu_Line [])
#define POLOZKA(A,B) (A),polozka, polozka:(B)
#define KONEC nullptr,.cena=0,nic,nic:nullptr

TMenu_Line *Vyber(const char * nadpis, TMenu_Line (*menu)[]) {
	while (true) {
		std::cout  <<clearScr<<nadpis<<'\n';
		
		char maxch='A';
		for (int i=0;(*menu)[i].typ != nic; i++) {
			maxch=(char)('A'+i);
			std::cout  <<'\t'<<yellow<<maxch<<normal<<" - "<<(*menu)[i].nadpis;
			if ((*menu)[i].typ == submenu) std::cout << "  ==> ";
			if ((*menu)[i].typ == polozka) std::cout << "\t Cena : "<< (*menu)[i].cena << ",- Kč  ";
			std::cout <<'\n';
			//<<"Účetní položka :"<<(*menu)[i].polozka<<'\n';
		};
		
		std::cout <<"Zadejte A.."<<maxch<<" pro výběr, nebo <Esc> pro návrat: ";
		char x;
		x=mygetchar();
		if (x==033) return nullptr;
		if ((x>='a') && (x<='z')) x += 'A'-'a';
		if ((x<'A') || (x>maxch)) continue;
		int i = x-'A';
		if ((*menu)[i].typ == polozka) return &((*menu)[i]);
		if ((*menu)[i].typ == submenu) {
			TMenu_Line *retval=Vyber((*menu)[i].nadpis,(*menu)[i].submenu);
			if (retval) return retval;
			};
		};
};

TMenu_Line menu[] = {
	{"Polévky",MENU {
		{"Domácí vývar s nudlemi",POLOZKA(20,1001)},
		{"Čočková",POLOZKA(30,1002)},
		{KONEC}
		}
	},
	{"Předkrmy",MENU {
		{"Šunková rolka s křenem", POLOZKA(15,2001)},
		{"Topinka s pikantní směsí", POLOZKA(15,2002)},
		{KONEC}
		}
	},
	{"Hlavní jídla",MENU {
		{"Kuřecí řízek s bramborem",POLOZKA(105,3001)},
		{"Svíčková s knedlíkem",POLOZKA(150,3002)},
		{"Vepřo knedlo zelo",POLOZKA(145,3003)},
		{KONEC}
		}
	},
	{"Deserty", MENU {
		{"Zmrzlinový pohár",POLOZKA(50,4001)},
		{"Jablečný závin",POLOZKA(45,4002)},
		{KONEC}
		}
	},
	{"Nápoje", MENU {
		{"Studené", MENU {
			{"Sodovka",POLOZKA(5,5001)},
			{"Minerální voda",POLOZKA(10,5002)},
			{"Jablečný džus",POLOZKA(20,5003)},
			{KONEC}
			}
		},
		{"Teplé", MENU {
			{"Turecká káva",POLOZKA(25,6001)},
			{"Černý čaj",POLOZKA(25,6002)},
			{KONEC}
			}
		},
		{"Alkoholické", MENU {
			{"Rum",POLOZKA(50,7001)},
			{"Pivo",POLOZKA(45,999)},
			{KONEC}
			}
		},
		{"Fakt jen pivo",POLOZKA(45,999)},
		{KONEC}
		}
	},
	{"Prostě jen pivo",POLOZKA(45,999)},
	{KONEC}
};

int main(int argc,char *argv[]) {
	TMenu_Line *vyber = Vyber("*** Vítejte v naší restauraci! ***\nVyberte prosím z následující nabídky: ",(TMenu_Line (*)[])&menu);
	if (vyber) {
		std::cout <<clearScr <<"Produkt : "<<vyber->nadpis<<'\n'<<"Cena: "<<vyber->cena<<",- Kč\nÚčetní položka : "<<yellow<<vyber->polozka<<normal<<'\n';
		return 0;
	} else {
		std::cout  <<clearScr<<"Host si nevybral nic :(\n";
		return 1;
	};
}


Hmm, nějak jsem zaměnil # a ++ - nicméně to funguje a mělo by to jít celkem snadno upravit.

Pokud se nelíbí mygetchar, tak se používá na jediném místě a jde místo nej použít cokoli, co vrací jeden znak a ten soubour vyhodit celý - proto jsem to dal zvlášť.

Ale jestli to umíš líp, tak se nestyď a hoď sem tvojí variantu, ať vidíme, jak se to podle tebe dělá dnes - těším se, že to tu do odpoledne bude ve vší kráse :-D

Zpět do poradny Odpovědět na původní otázku Nahoru