Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Milan Brzek
Člen
Avatar
Milan Brzek:21.3.2019 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.3.2019 10:35
Avatar
Milan Brzek
Člen
Avatar
Odpovídá na Milan Brzek
Milan Brzek:21.3.2019 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.3.2019 10:36
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na Milan Brzek
Ilja Židkov:21.3.2019 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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
21.3.2019 12:48
Avatar
Milan Brzek
Člen
Avatar
Odpovídá na Ilja Židkov
Milan Brzek:21.3.2019 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.3.2019 13:01
Avatar
krepsy3
Tvůrce
Avatar
krepsy3:21.3.2019 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.3.2019 13:15
Programátor je stroj k převodu kávy na kód.
Avatar
krepsy3
Tvůrce
Avatar
krepsy3:21.3.2019 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.3.2019 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.3.2019 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.3.2019 14:26
Avatar
plelovsky
Člen
Avatar
Odpovídá na Ilja Židkov
plelovsky:21.3.2019 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
21.3.2019 15:27
Avatar
simon.steiner:21.3.2019 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
21.3.2019 16:07
Avatar
Ilja Židkov
Člen
Avatar
Odpovídá na plelovsky
Ilja Židkov:21.3.2019 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.3.2019 16:44
Avatar
plelovsky
Člen
Avatar
Odpovídá na Ilja Židkov
plelovsky:21.3.2019 17:00

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

 
Nahoru Odpovědět
21.3.2019 17:00
Avatar
krepsy3
Tvůrce
Avatar
krepsy3:21.3.2019 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.3.2019 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.