Diskuze: Omezení Switche (nebo TryParse) - nováček
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Takže ano, dokázal jsem si ošetřit pouze vstup textu, ale ne čísla a o to mi právě jde.
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.
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
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;
}
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;
}
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.
Ty jsi taky nedodržel zadání: podle něj časem v menu budou možnosti 1,
2, 10
bool wrongInput = false;
do
{
switch (Console.ReadLine())
{
case "1":
break;
case "2":
break;
case "10":
break;
default:
wrongInput = true;
break;
}
} while (wrongInput)
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+.
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;
}
Zobrazeno 12 zpráv z 12.