C# programozás kezdőknek › 2.4 lecke · mini projekt

C# tanfolyam · 2.4 lecke · mini projekt

Mini projekt: tanulmányi átlag kalkulátor

Most mindent összerakunk, amit eddig tanultál: változókat, adatbekérést, típuskonverziót és operátorokat. A végén lesz egy saját programod, amely kiszámolja a jegyeid átlagát.

  • kb. 45–60 perc
  • kezdő szint
  • projektfeladat
Két kilencedikes diák az 5, 4 és 4 jegyből számolt tanulmányi átlagot ellenőrzi C# mini projektben

A projekt végére

  • egy feladatból megtervezed a program lépéseit;
  • eldöntöd, milyen változókra és típusokra lesz szükséged;
  • kisebb részekből, lépésenként építed fel a programot;
  • helyesen számolsz tizedes átlagot;
  • teszteléssel megkeresed a program gyenge pontjait.

Ehhez használod

Ha a Program.cs fájlodban van Main(), a kódot a kapcsos zárójelei közé írd.

A feladat

Készíts programot, amely bekéri a tanuló nevét és három tantárgy jegyét, kiszámolja az átlagot, és két tizedesjegyre kerekítve kiírja. Így néz ki a kész program futás közben:

Így működik majdKonzol
=== Tanulmányi átlag kalkulátor ===Add meg a neved: AnnaMatematika jegy: 5Magyar jegy: 4Informatika jegy: 4Érvényes jegyek: True, True, TrueAnna átlaga: 4,33

Így dolgoznak a programozók is

Nem egyszerre írjuk meg az egész programot. Kis lépésekben haladunk, és minden lépés után lefuttatjuk, hogy lássuk, működik-e. Ha hiba van, így könnyű megtalálni: csak az utolsó lépésben lehet.

Tervezés: előbb gondolkodunk, utána kódolunk

Minden program ugyanarra a három lépésre bontható, amit a számítógép működésénél is láttál:

  1. BemenetA név és a három jegy bekérése a felhasználótól.
  2. FeldolgozásA szövegek átalakítása számmá, majd az átlag kiszámítása.
  3. KimenetAz eredmény kiírása olvasható formában.

Mit gondolsz? Milyen változókra lesz szükség?

Írd fel a füzetedbe: milyen adatokat kell a programnak tárolnia, és milyen típusúak legyenek? Gondold végig a jegyeket és az átlagot is!

Változótábla
A program változói
VáltozóTípusMiért ez?
nevstringszöveg
jegy1, jegy2, jegy3inta jegyek egész számok (1–5)
siker1, siker2, siker3boolsikerült-e az átalakítás
atlagdoubleaz átlag tizedes szám is lehet

Első lépés: fejléc és név

Kezdjük a legegyszerűbb résszel. A Console.Write() miatt a felhasználó ugyanabba a sorba gépel, ahol a kérdés áll.

Program.cs – 1. lépésC#
Console.WriteLine("=== Tanulmányi átlag kalkulátor ===");Console.Write("Add meg a neved: ");string nev = Console.ReadLine();

Te jössz!

Gépeld be és futtasd! Ha működik, jöhet a következő lépés. Ha a ReadLine alatt zöld hullámvonalat látsz, az csak a CS8600 figyelmeztetés, a program lefut.

Második lépés: a jegyek bekérése

A jegyek szövegként érkeznek, ezért a TryParse() segítségével alakítjuk őket egész számmá. Az első jegy így néz ki:

Program.cs – 2. lépésC#
Console.Write("Matematika jegy: ");string adat1 = Console.ReadLine();bool siker1 = int.TryParse(adat1, out int jegy1);

Te jössz!

Írd meg ugyanígy a magyar és az informatika jegy bekérését is! Figyelj a változónevekre: adat2, siker2, jegy2 és így tovább.

Ellenőrzés
Console.Write("Magyar jegy: ");string adat2 = Console.ReadLine();bool siker2 = int.TryParse(adat2, out int jegy2);Console.Write("Informatika jegy: ");string adat3 = Console.ReadLine();bool siker3 = int.TryParse(adat3, out int jegy3);

Harmadik lépés: az átlag kiszámítása

Az átlag a jegyek összege osztva a jegyek számával. Első ötletként sokan ezt írják:

Első próbálkozásC#
double atlag = (jegy1 + jegy2 + jegy3) / 3;

Mit gondolsz? Mennyi lesz az átlag 5, 4 és 4 jegynél?

Az atlag változó double, tehát tizedes számot is tud tárolni. Akkor biztosan 4,33 lesz?

Megoldás

Nem, 4 lesz! A jobb oldalon minden érték int: a 13 és a 3 is. Két egész szám osztásakor egész osztás történik, a tört rész levágódik, és csak ezután kerül a 4 a double változóba.

Hibavadászat: a megoldás egyetlen karakter

Ha legalább az egyik operandus double, tizedes osztás történik. Elég a 3 helyett 3.0-t írni:

double atlag = (jegy1 + jegy2 + jegy3) / 3.0;

Ez a hiba azért alattomos, mert a program hibaüzenet nélkül lefut, csak rossz eredményt ad. Ezért kell mindig tesztelni!

Negyedik lépés: az eredmény kiírása

Az átlag lehet végtelen tizedes tört is: 13 / 3 = 4,3333… Ezért két tizedesjegyre kerekítjük a Math.Round() segítségével. Az első szám a kerekítendő érték, a második a tizedesjegyek száma.

Program.cs – 4. lépésC#
Console.WriteLine();Console.WriteLine($"Érvényes jegyek: {siker1}, {siker2}, {siker3}");Console.WriteLine($"{nev} átlaga: {Math.Round(atlag, 2)}");

Miért írjuk ki az „Érvényes jegyek” sort?

Ez egy ellenőrző sor: megmutatja, hogy mindhárom jegyet sikerült-e számmá alakítani. Egyelőre a program még nem tud a false értékre reagálni, de legalább látjuk, ha valami nincs rendben. A Math.Round() eredményét magyar beállításnál vesszővel írja ki: 4,33.

A teljes program
Program.cs – készC#
Console.WriteLine("=== Tanulmányi átlag kalkulátor ===");Console.Write("Add meg a neved: ");string nev = Console.ReadLine();Console.Write("Matematika jegy: ");string adat1 = Console.ReadLine();bool siker1 = int.TryParse(adat1, out int jegy1);Console.Write("Magyar jegy: ");string adat2 = Console.ReadLine();bool siker2 = int.TryParse(adat2, out int jegy2);Console.Write("Informatika jegy: ");string adat3 = Console.ReadLine();bool siker3 = int.TryParse(adat3, out int jegy3);double atlag = (jegy1 + jegy2 + jegy3) / 3.0;Console.WriteLine();Console.WriteLine($"Érvényes jegyek: {siker1}, {siker2}, {siker3}");Console.WriteLine($"{nev} átlaga: {Math.Round(atlag, 2)}");

Tesztelés: működik minden esetben?

Egy program akkor jó, ha nemcsak egy bemenetre működik. Futtasd le az alábbi esetekkel! Előbb írd a füzetedbe, mit vársz, csak utána nézd meg a valódi eredményt.

Tesztesetek
TesztJegyekVárt átlagMit vizsgál?
1.5, 4, 44,33tizedes átlag és kerekítés
2.5, 5, 55kerek átlag
3.1, 2, 21,67felfelé kerekítés
4.alma, 5, 5?hibás bemenet

Mit gondolsz? Mi történik a 4. tesztnél?

Tippeld meg, mit ír ki a program, ha az első jegy helyére azt írod: alma!

Megoldás

Az ellenőrző sor ezt mutatja: False, True, True. A jegy1 értéke 0 lett, így a program ezt számolja: (0 + 5 + 5) / 3,0 = 3,33. A program hibaüzenet nélkül, de rossz átlagot ír ki!

Ezt most még nem tudjuk megoldani – de hamarosan igen

A programunk látja, hogy baj van (False), de nem tud mit kezdeni vele: nem tudja kiírni, hogy „Hibás jegy!”, és nem tudja kihagyni a számolást. Ehhez döntésre van szükség. A következő leckében megtanuljuk az if utasítást, és ezt a programot fejlesztjük tovább. Hasonló gond a 7-es vagy a 0-s jegy is: számként érvényes, de jegyként nem.

Kihívások

Kész az alapprogram? Válassz a kihívások közül! Mindegyik megoldható azzal, amit eddig tanultál.

1. Még egy tantárgy

Bővítsd a programot egy negyedik tantárggyal! Mire kell figyelned az átlag számításánál?

Tipp

Négy jegy esetén 4.0-val kell osztani, nem 3.0-val.

2. Súlyozott átlag

Sok iskolában a témazáró dolgozat duplán számít. Kérj be két órai jegyet és egy témazáró jegyet, és számold ki a súlyozott átlagot!

Egy lehetséges megoldás
// két órai jegy + egy témazáró kétszeres súllyaldouble sulyozott = (ora1 + ora2 + 2 * temazaro) / 4.0;

A témazáró kétszer számít, ezért összesen négy „jeggyel” osztunk.

3. Szebb kimenet

Tedd olvashatóbbá a kiírást: legyen üres sor a kérdések és az eredmény között, az eredményt keretezd, és írd ki külön mindhárom jegyet is a tantárgy nevével!

Egy lehetséges megoldás

A jegyek bekérése és az átlag kiszámítása után a korábbi kiíró sorokat cseréld az alábbi részletre. A változónevek a lecke teljes programjával egyeznek meg.

Program.cs – formázott kiírásC#
Console.WriteLine();Console.WriteLine($"Sikeres átalakítás: {siker1}, {siker2}, {siker3}");Console.WriteLine("+----------------------------------+");Console.WriteLine($"Tanuló: {nev}");Console.WriteLine($"Matematika: {jegy1}");Console.WriteLine($"Magyar: {jegy2}");Console.WriteLine($"Informatika: {jegy3}");Console.WriteLine($"Átlag: {Math.Round(atlag, 2)}");Console.WriteLine("+----------------------------------+");

A paraméter nélküli Console.WriteLine() üres sort hagy. A felső és alsó vonal keretezi az eredményblokkot; a tantárgyak külön sorban jelennek meg.

A siker1, siker2 és siker3 az egész számmá alakítás sikerét jelzi. Az 1–5 közötti tartomány ellenőrzése a következő fejlesztési lépés.

Ellenőrizd a projektedet

A projekt akkor kész, ha…

  • a program hiba nélkül lefut;
  • az 5, 4, 4 jegyekre 4,33-at ír ki, nem 4-et;
  • a változóneveid beszédesek, és a típusuk illik az adathoz;
  • legalább három tesztesettel kipróbáltad;
  • a kimenet jól olvasható.

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Miért double típusú az atlag változó?

Mert az átlag tizedes szám is lehet, például 4,33.

2. Miért 3.0-val osztunk, és nem 3-mal?

Mert a jegyek összege int; ha 3-mal osztanánk, egész osztás történne, és a tört rész elveszne.

3. Mire való a Math.Round(atlag, 2)?

Két tizedesjegyre kerekíti az átlagot, hogy a kiírás olvasható legyen.

4. Miért lesz rossz az átlag, ha valaki „alma” jegyet ír be?

Mert a sikertelen TryParse() után a jegy értéke 0, és a program ezzel a 0-val számol tovább.

Mit tudsz már?

  • Egy feladatot bemenetre, feldolgozásra és kimenetre bontasz.
  • Megtervezed, milyen változókra és típusokra van szükség.
  • Lépésenként építed és teszteled a programot.
  • Elkerülöd az egész osztás csapdáját az átlagszámításnál.
  • Tesztesetekkel megkeresed a program gyenge pontjait.

Következő lecke: 3.1 Feltételek – if és else

Az átlagkalkulátor már számol, de még nem tud dönteni. A következő leckében megtanítjuk arra, hogy észrevegye a hibás jegyet, a 3.2-ben pedig azt is kiírja, hogy jeles vagy jó rendű lett-e a tanuló.