Bucla while în C#: repetare până la o santinelă
Folosește while în C# pentru citire până la zero. Înțelege santinela, oprirea la sfârșitul intrării și acumularea fără a număra valoarea de stop.
În acest material
Bucla while repetă un bloc cât timp condiția sa este adevărată. Condiția este verificată înainte de fiecare iterație, deci corpul poate să nu se execute deloc. Este utilă când numărul pașilor nu este cunoscut înainte de citire.
O santinelă este o valoare specială care semnalează sfârșitul datelor utile. În exemplul nostru, zero este santinela. El oprește citirea și nu contribuie nici la numărul valorilor, nici la sumă. Alegerea santinelei face parte din contractul problemei, nu este o regulă generală a limbajului.
Ideea pe care o folosim
Citirea are trei rezultate importante: o linie cu un întreg valid, o linie cu text invalid sau sfârșitul intrării. Console.ReadLine() întoarce null numai în ultimul caz. Păstrăm linia într-o variabilă, verificăm line != null, apoi încercăm conversia cu TryParse.
break încheie bucla curentă, continuând cu instrucțiunile de după ea. return încheie metoda Main și, aici, programul. Folosim break pentru o oprire normală la santinelă și return pentru o intrare invalidă.
Intrare și rezultat
Citim întregi, câte unul pe linie, fiecare între −1000 și 1000. Ne oprim la primul zero sau la sfârșitul intrării. Sunt permise cel mult 1000 de valori utile înainte de oprire. Afișăm numărul lor și suma, separate prin spațiu. Pentru text invalid, valoare în afara limitelor sau depășirea numărului permis afișăm INVALID. Datele de după primul zero sunt ignorate.
Exemplu urmărit
Pentru liniile 4, −2, 7, 0, valorile utile sunt numai 4, −2 și 7. Numărătorul evoluează 1, 2, 3, iar suma 4, 2, 9. Când citim zero, executăm break înaintea actualizării acumulatoarelor, astfel răspunsul este 3 9. Pentru intrarea care începe cu zero, rezultatul este 0 0, fără nicio valoare utilă.
Valorile 4, −2 și 7 contribuie la suma 9; santinela zero oprește procesarea fără a fi numărată.Mărește schema ↗
De ce obținem acest rezultat
La începutul fiecărei iterații, count și sum descriu exact valorile valide deja procesate. Conversia și verificarea limitelor au loc înainte de adunare. Dacă valoarea este santinela, oprirea păstrează acumulatoarele neschimbate. Altfel includem valoarea și citim linia următoare. Această citire face progresul buclei: nu prelucrăm aceeași linie la nesfârșit. La sfârșitul intrării, condiția devine falsă și afișăm rezultatul acumulat.
Program complet C#
using System;
class Program
{
static void Main()
{
int count = 0;
long sum = 0;
string? line = Console.ReadLine();
while (line != null)
{
if (!int.TryParse(line, out int value) || value < -1000 || value > 1000)
{
Console.WriteLine("INVALID");
return;
}
if (value == 0)
{
break;
}
if (count == 1000)
{
Console.WriteLine("INVALID");
return;
}
count++;
sum += value;
line = Console.ReadLine();
}
Console.WriteLine($"{count} {sum}");
}
}
Greșeli de evitat
Nu aduna valoarea înainte de verificarea santinelei dacă aceeași schemă trebuie să funcționeze și cu o santinelă nenulă. Chiar și pentru zero, numărătorul ar deveni greșit. Nu pune citirea următoarei linii numai într-o ramură executată uneori. Pentru m valori procesate, timpul este O(m), iar memoria suplimentară O(1); nu memorăm întreaga listă.
Exersează
- Pentru 5, 0, 99, răspunsul este 1 5; 99 nu se mai citește ca dată utilă.
- Pentru intrare goală, răspunsul este 0 0.
- Pentru 2 și −2 urmate de sfârșitul intrării, răspunsul este 2 0. Suma zero nu înseamnă că nu am citit valori.
Continuă parcursul C#
Vezi Citirea datelor în C# cu Console.ReadLine și TryParse. Vezi Condiții în C#: if, else și operatori logici. Vezi Bucla for în C#: numărare și acumulare.
Documentație de referință: Microsoft Learn.
Întrebări frecvente
Ce este o santinelă?
O valoare convenită care semnalează oprirea procesării. Aici zero oprește citirea și este exclus din rezultatul acumulat.
Este obligatoriu să apară zero?
Nu în contractul acestei lecții. Sfârșitul intrării este acceptat ca oprire normală și produce rezultatul valorilor deja citite.
Care este diferența dintre break și return?
Break iese din bucla curentă. Return încheie metoda, deci în Main oprește programul înainte de instrucțiunile rămase.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.