PHP týden Letní akce
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: Omezení Switche (nebo TryParse) - nováček

Aktivity (4)
Avatar
Milan Brzek
Člen
Avatar
Milan Brzek:21. března 10:35

Ahoj,

s C# začínám a jsem úplný nováček, každopádně jsem si dal nějaký cíl co chci udělat ( aby mě to učení víc bavilo).
Teď aktuálně rěším problém s ošetřením vstupů od uživatele.
Chci aby uživatel napsal číslo, aktuálně v menu je možnost 1a 2 časem bude třeba 10.
Chci aby uživatel pokud napíše něco jiného, tak aby mu vyhodila hláška že je idiot a mohl znovu napsat číslo.
můj kod aktuálně vypadá takhle

Zkusil jsem: while (!int.TryParse(Con­sole.ReadLine(), out VstupDva))
Console.Write­Line("Neplatné číslo, zadejte prosím znovu:");
switch (VstupDva)
{
case 1:
MenuJedna vyrobaD = new MenuJedna();
vyrobaD.Dss();
break;

case 2:
MenuJedna vyrobaBSSD = new MenuJedna();
vyrobaBSSD.BDss();
break;

 
Odpovědět 21. března 10:35
Avatar
Milan Brzek
Člen
Avatar
Odpovídá na Milan Brzek
Milan Brzek:21. března 10:36

Takže ano, dokázal jsem si ošetřit pouze vstup textu, ale ne čísla a o to mi právě jde.

 
Nahoru Odpovědět 21. března 10:36
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Milan Brzek
Ilja Židkov:21. března 12:48

Přikládám moje řešení. Jelikož jsi do C# nový, nechtěl jsem používat LINQ.

Celá podstata spočívá v metodách

Array.GetLowerBound(Array.Rank)

a

Array.GetUpperBound(Array.Rank)

které vracejí nejnižší / nejvyšší indexy v poli určitého rozměru (Array.Rank).

using System;

namespace Input
{
    class Program
    {
        static void Main(string[] args)
        {
            // Jsem na Macu ve Visual Studiu Code. V tradičním Visual Studio tohle ignoruj.
            Console.Clear();

            // Výzva uživatele ke zvolení operace.
            Console.Write("Zvolte operaci: \n");

            // Nabídka voleb.
            string[] menu =
            {
                "Volba 1",
                "Volba 2",
                "Ukoncit"
            };

            // Iteruj skrz všechny nabídky v menu...
            for (var i = 0; i < menu.Length; i++)
                // a zobraz jejich index zvýšený o 1 (čistě z kosmetického důvodu, aby první možnost nebyla 0)
                // a samotný název volby.
                Console.WriteLine($"{(i + 1)}: {menu[i]}");

            // Ukládá zvolenou položku uživatele.
            int selection;

            // Uloží nejnižší index v jednorozměrném poli (našem menu)
            // a inkrementuj index o 1 (opět čistě z kosmetického důvodu)
            var firstIndex = menu.GetLowerBound(0) + 1;

            // Uloží nejvyšší index v jednorozměrném poli (našem menu)
            // a inkrementuj index o 1 (opět čistě z kosmetického důvodu)
            var lastIndex = menu.GetUpperBound(0) + 1;

            // Ošetři vstup uživate.
            // Dokud vstup uživate nebude v rozsahu našeho menu...
            while (!int.TryParse(Console.ReadLine(), out selection) || selection < firstIndex || selection > lastIndex)
                // upozorni uživatele na chybu.
                Console.WriteLine($"Zvolte prosim polozky od {firstIndex} do {lastIndex}");

            // Větvení tvé následující logiky...
            switch (selection)
            {
                case 1:
                    Console.WriteLine("Jedna");
                    break;
                case 2:
                    Console.WriteLine("Dva");
                    break;
                case 3:
                    Console.WriteLine("Konec");
                    break;

                default:
                    Console.WriteLine("Konec");
                    break;
            }

            Console.ReadKey();
        }
    }
}

V reálu, předpokládám, že by to mohl být jakýsi combo box, jehož položky bych indexoval klasicky od 0 až po délku pole.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 21. března 12:48
Avatar
Milan Brzek
Člen
Avatar
Odpovídá na Ilja Židkov
Milan Brzek:21. března 13:01

moc děkuji za odpověď. Musím si to projít a porozumět tomu, protože jsem po pravděnečekal tak púro mě složité řešení.

Každopádně, díky moc

 
Nahoru Odpovědět 21. března 13:01
Avatar
krepsy3
Redaktor
Avatar
krepsy3:21. března 13:15

Nabízím jednodušší řešení

int vstup = 0;
while (!int.TryParse(Console.ReadLine(), out vstup) || (vstup < 1 && vstup > 2))
{
    Console.WriteLine("neplatná volba, zadejte prosím číslo od 1 do 2:");
}

switch (vstup)
{
    case 1:
        //věci pro vstup 1
        break;

    case 2:
        //věci pro vstup 2
        break;
}
Nahoru Odpovědět 21. března 13:15
Programátor je stroj k převodu kávy na kód.
Avatar
krepsy3
Redaktor
Avatar
krepsy3:21. března 13:20

Oprava, omlouvám se, předchozí má podmínku špatně a už mi itnetwork nedovolil editovat komentář

int vstup = 0;
while (!int.TryParse(Console.ReadLine(), out vstup) || !(vstup >= 1 && vstup <= 2))
{
    Console.WriteLine("neplatná volba, zadejte prosím číslo od 1 do 2:");
}

switch (vstup)
{
    case 1:
        //věci pro vstup 1
        break;

    case 2:
        //věci pro vstup 2
        break;
}
Nahoru Odpovědět 21. března 13:20
Programátor je stroj k převodu kávy na kód.
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na krepsy3
Ilja Židkov:21. března 14:26

Tuším, že jsi tak trochu nedodržel zadání...

Chci aby uživatel napsal číslo, aktuálně v menu je možnost 1 a 2 časem bude třeba 10.

!(vstup >= 1 && vstup <= 2))  // Konstanty!

Čili stejně musíš získat indexy menu. Vrátím se ke svému závěrečnému komentáři:

.. že by to mohl být jakýsi combo box, jehož položky bych indexoval klasicky od 0 až po délku pole.

Představ si, že bych tyhle položky načítal odněkud z back-end API. V tomto případě, bych musel manuálně upravit podmínku a zkompilovat nové .dll.

 
Nahoru Odpovědět 21. března 14:26
Avatar
plelovsky
Člen
Avatar
Odpovídá na Ilja Židkov
plelovsky:21. března 15:27

Ty jsi taky nedodržel zadání: podle něj časem v menu budou možnosti 1, 2, 10 :-)

 
Nahoru Odpovědět  +1 21. března 15:27
Avatar
simon.steiner:21. března 16:07
bool wrongInput = false;
do
{
        switch (Console.ReadLine())
        {
                case "1":

                        break;
                case "2":

                        break;
                case "10":

                        break;
                default:
                        wrongInput = true;

                        break;
        }
} while (wrongInput)
 
Nahoru Odpovědět  +1 21. března 16:07
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na plelovsky
Ilja Židkov:21. března 16:44

Tady bych doporučil nejdříve přečíst zadání než komentovat. Jo a ještě předtím, setřiď si posloupnost 1, 2, 10.... že by až pak 3?

...třeba 10...

To může znamenat více než 2 až do 10+.

 
Nahoru Odpovědět 21. března 16:44
Avatar
plelovsky
Člen
Avatar
Odpovídá na Ilja Židkov
plelovsky:21. března 17:00

Dělám si srandu :-) To zadání je blbě formulované.

 
Nahoru Odpovědět  +1 21. března 17:00
Avatar
krepsy3
Redaktor
Avatar
krepsy3:21. března 17:17

Dobrá, v tom případě mi to nedá a hodím sem ještě jedno řešení, které je ultimátní a řeší všechny možné případy

Dictionary<int, string> = new Dictionary<int, string>();
Dictionary.Add(1, "volba 1");
Dictionary.Add(2, "číslo 2");
Dictionary.Add(10, "desítka");

//výpis voleb (položek slovníku) na obrazovku

int vstup = 0;
while (!int.TryParse(Console.ReadLine(), out vstup) || !Dictionary.ContainsKey(vstup))
{
    Console.WriteLine("neplatná volba, zadejte prosím číslo platné volby:");
}

switch (vstup)
{
    case 1:
        //věci pro vstup 1
        break;

    case 2:
        //věci pro vstup 2
        break;

    case 10:
        //věci pro vstup 10
        break;
}
Nahoru Odpovědět 21. března 17:17
Programátor je stroj k převodu kávy na kód.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.