C# pentru începători

Citirea datelor în C# cu Console.ReadLine și TryParse

Citește numere în C# cu Console.ReadLine și int.TryParse. Separă textul invalid de limitele problemei și tratează corect sfârșitul intrării.

Textul introdus în consolă nu devine automat număr. Console.ReadLine() returnează textul unei linii, fără separatorul de linie. Dacă intrarea s-a terminat, rezultatul este null, adică absența unei valori. O linie goală există, dar conține zero caractere; nu este același lucru cu sfârșitul intrării. Notația string? arată că variabila poate conține un text sau null.

Pentru a obține un întreg folosim int.TryParse. Metoda încearcă conversia și întoarce un bool care spune dacă a reușit. În același timp, parametrul out primește valoarea numerică. Cele două rezultate au roluri distincte: succesul conversiei și numărul citit.

Ideea pe care o folosim

În apelul int.TryParse(text, out int number), declarăm variabila number chiar la locul apelului. Dacă rezultatul bool este false, nu folosim number ca și cum ar fi o intrare validă. În particular, zero este o valoare numerică legitimă și nu poate înlocui verificarea succesului.

Conversia și validarea domeniului sunt două etape separate. Textul „101” se convertește corect în int, dar poate încălca o cerință care permite numai valori până la 100. Textul „doi” nu poate trece nici de prima etapă.

Intrare și rezultat

Citim o singură linie care trebuie să reprezinte un întreg între 0 și 100 inclusiv. Dacă textul lipsește, nu are format întreg sau depășește intervalul tipului int, afișăm TEXT_INVALID. Dacă numărul se convertește, dar este în afara intervalului 0..100, afișăm IN_AFARA_LIMITELOR. Altfel afișăm dublul lui. Programul se oprește după primul rezultat.

Exemplu urmărit

Pentru linia „42”, TryParse reușește, number primește 42, verificarea limitelor trece și afișăm 84. Pentru „101”, conversia reușește, dar verificarea domeniului produce IN_AFARA_LIMITELOR. Pentru „42.5”, conversia la int eșuează și afișăm TEXT_INVALID. Nu rotunjim și nu tăiem partea fracționară a textului.

42 se convertește și respectă limitele, 101 se convertește dar depășește domeniul, iar 42.5 nu este text întreg.42 se convertește și respectă limitele, 101 se convertește dar depășește domeniul, iar 42.5 nu este text întreg.Mărește schema ↗

De ce obținem acest rezultat

Ordinea verificărilor împiedică folosirea datelor înainte de validare. Primul if tratează conversia; return încheie Main în caz de eroare. Al doilea if verifică restricția problemei numai după o conversie reușită. Abia apoi calculăm dublul, care este cel mult 200. Numărul zero trece ambele verificări și produce zero, fără să fie confundat cu un eșec.

Program complet C#

using System;

class Program
{
    static void Main()
    {
        string? text = Console.ReadLine();
        if (!int.TryParse(text, out int number))
        {
            Console.WriteLine("TEXT_INVALID");
            return;
        }

        if (number < 0 || number > 100)
        {
            Console.WriteLine("IN_AFARA_LIMITELOR");
            return;
        }

        Console.WriteLine(2 * number);
    }
}

Greșeli de evitat

Nu folosi int.Parse fără să decizi cum tratezi o conversie nereușită: acesta poate arunca o excepție pentru un text invalid. TryParse este potrivit când invaliditatea reprezintă o ramură obișnuită a programului. Nu afișa mesaje suplimentare precum „Introdu numărul” dacă formatul rezultatului cere numai răspunsul; acestea ar modifica ieșirea verificată automat.

Exersează

  1. Ce produce „0”? Răspuns: 0, fiind o intrare validă.
  2. Ce produce „−1”? Răspuns: IN_AFARA_LIMITELOR, deoarece conversia reușește.
  3. Ce produce o linie goală? Răspuns: TEXT_INVALID. La fel și un număr prea mare pentru int, precum 999999999999.

Continuă parcursul C#

Vezi Primul program C#: Console.WriteLine și Main. Vezi Variabile și tipuri în C#: int, double și bool. Vezi Condiții în C#: if, else și operatori logici.

Documentație de referință: Microsoft Learn.

Întrebări frecvente

Ce întoarce Console.ReadLine la finalul intrării?

Null, adică lipsa unei linii. O linie goală introdusă cu Enter este un text gol, nu null.

Ce rol are out în TryParse?

Permite metodei să scrie rezultatul numeric în variabila indicată. Valoarea bool întoarsă separat arată dacă rezultatul este valid.

TryParse verifică și limitele problemei?

Nu. Verifică posibilitatea conversiei la tipul cerut. Restricții precum 0..100 se verifică explicit după succesul conversiei.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →