Reguli și șabloane
Cele 8 reguli de mai jos ar fi adus înapoi aproape toate punctele pierdute. Apoi: șablonul de pornire, funcțiile de știut pe de rost și lista de verificat înainte să apeși „Trimite”.
Reguli care îți salvează puncte
Citește tot inputul pe bucăți
inlocuireK: eroareNu te baza pe ReadLine rând cu rând. La inlocuireK, k și n erau pe același rând; la Secvente, numerele erau pe mai multe rânduri. Șablonul cu ReadToEnd().Split(...) merge mereu.
int k = int.Parse(Console.ReadLine()); // randul e "3 5" -> crapa
int n = int.Parse(Console.ReadLine());int K = int.Parse(t[k++]);
int n = int.Parse(t[k++]);Write vs WriteLine
Sort10: −80p, ElemPP: −100pWrite lasă cursorul pe același rând, WriteLine trece la rând nou. Din cauza asta s-au pierdut puncte la Sort10 (20) și ElemPP (0).
Console.WriteLine(v[i] + " "); // fiecare numar pe alt randConsole.Write(v[i] + " "); // toate pe acelasi randTextul se scrie exact ca în enunț
Maxim: −20p„NU EXISTA” nu e același lucru cu „nu exista”. Evaluatorul compară literă cu literă. La Maxim s-au pierdut 20 de puncte din asta.
Console.WriteLine("nu exista");Console.WriteLine("NU EXISTA");Vectorul are mărimea n
VerifDiferite: −60pnew int[n], nu un număr ales la întâmplare. La VerifDiferite, new int[200] cu n până la 500 a dus la 40 de puncte.
int[] v = new int[200];int[] v = new int[n];Min / max pornesc de la primul element
MinMax: trecut din norocmn = mx = v[0]. Nu porni de la 0, 10 sau 10000: dacă numerele sunt toate negative sau toate uriașe, răspunsul iese greșit.
int mn = 10000, mx = 10;int mn = v[0], mx = v[0];Șterge afișările de test
Afisare: 0pOrice Console.WriteLine pus «ca să văd ce se întâmplă» strică răspunsul. La Afisare a dus la 0 puncte.
for (int i = 0; i < n; i++)
Console.Write(v[i] + " "); // TEST - uitat in cod!// doar afisarile cerute de enuntFișiere: numele exact și Close()
risc de 0pNumele fișierelor se copiază din enunț (minmax.in / minmax.out). Fără fout.Close(), fișierul de ieșire poate rămâne gol.
StreamWriter fout = new StreamWriter("MinMax.txt");
fout.WriteLine(rez); // si fara Close()StreamWriter fout = new StreamWriter("minmax.out");
fout.WriteLine(rez);
fout.Close();Compilează înainte să trimiți
4 probleme: 0p4 din 22 de probleme au fost erori de compilare (E.C.): paranteze lipsă, ' ' vs " ", = în plus. Rulează programul o dată pe exemplul din enunț.
char[] x = {" "}; // " " e text, nu caracter
int[] v = new int =[n]; // = in pluschar[] x = { ' ' };
int[] v = new int[n];Șablonul de pornire
Citește tot inputul o dată și îl taie în numere, deci nu mai contează dacă numerele sunt pe un rând sau pe mai multe. Variabila k arată la al câtelea număr ai ajuns. Lecția despre citire →
using System;
class Program
{
static void Main()
{
char[] sep = { ' ', '\n', '\r', '\t' }; // spatiu, rand nou, tab
string[] t = Console.In.ReadToEnd().Split(sep, StringSplitOptions.RemoveEmptyEntries);
int k = 0; // "degetul": al catelea numar urmeaza
int n = int.Parse(t[k++]);
int[] v = new int[n];
for (int i = 0; i < n; i++)
v[i] = int.Parse(t[k++]);
// ... rezolvarea ...
Console.WriteLine(rezultat);
}
}Write afișează și rămâne pe rând; WriteLine afișează și trece la rândul următor. Când enunțul spune „separate prin spațiu”, folosești Write(x + " ").Funcții de știut pe de rost
Suma cifrelor
static int SumaCifre(int x)
{
int s = 0;
while (x > 0) { s += x % 10; x /= 10; }
return s;
}Aduni ultima cifră, o tai, repeți până nu mai sunt cifre.
Oglinditul
static long Oglindit(long x)
{
long r = 0;
while (x > 0) { r = r * 10 + x % 10; x /= 10; }
return r;
}Fiecare cifră nouă se pune la dreapta, iar cele vechi se «împing» spre stânga (·10).
Cmmdc (Euclid)
static int Cmmdc(int a, int b)
{
while (b != 0) { int r = a % b; a = b; b = r; }
return a;
}Împarți și păstrezi restul, până restul devine 0. Ultimul împărțitor e cmmdc-ul.
Pătrat perfect
static bool PatratPerfect(int x)
{
int r = (int)Math.Sqrt(x);
return r * r == x;
}Iei radicalul, tai zecimalele și verifici dacă la pătrat dă înapoi numărul.
Sortare + descrescător
Array.Sort(v); // crescator
for (int i = n - 1; i >= 0; i--) // parcurs invers = descrescator
Console.Write(v[i] + " ");O singură linie sortează crescător. De la coadă obții ordinea descrescătoare.
5 întrebări, în ordinea asta
- Ce primesc? Citește «Date de intrare»: câte numere, în ce ordine, pe ce rânduri. Scrie-le pe hârtie.
- De unde citesc? Tastatură (Console) sau fișier (nume.in)? Asta schimbă doar începutul și finalul programului.
- Ce trebuie să afișez? Citește «Date de ieșire»: un număr? DA/NU? mai multe numere pe un rând? Exact ce text?
- Fac exemplul de mână Ia exemplul din enunț și rezolvă-l pe hârtie, fără cod. Dacă nu-l poți face de mână, nu-l poți programa.
- Cazurile speciale Ce fac dacă nu există nicio soluție? Dacă n = 1? La egalitate pe cine aleg?