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.
Zobrazeno 12 zpráv z 12.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
