Professional Documents
Culture Documents
programozási segédlet
szegsz.Text = "
05
csoki.Checked
CSl = false;
tea.Checked = false;
kave.Checked = false;
capu.Checked = false;
I tej.Checked = false;
cukor.Checked = false; ouble a = o, b = o, c = o;
citrom.Checked = false; if (asz.Text ± = "") asz.Text = "o";
if (bsz.Text = = "") bsz.Text = "o";
a = Convert.ToDouble(asz.Text);
b = Convert.ToDouble(bsz.Text);
if (jel.Text = = "+") c = a + b;
if (jel.Text = = c = a - b;
if (jel.Text = = "*") c = a * b;
l if (jel.Text = = ”/ ”) c = a / b;
:sz.Text = Convert.ToString(c);
Műszaki Könyvkiadó
Láposi Zoltán-Kiss Tibor
C# programozási segédlet
és munkafüzet
5. kiadás
Műszaki Könyvkiadó
A kiadvány tankönyvi engedélyét meghosszabbította a Nemzeti Fejlesztési Minisztérium.
Határozati szám: IGF/19256/2018-NFM
Kapcsolódó kerettantervek:
Szcs. Szakképesítés M odul Tantárgy, tém akör
száma az. száma m egnevezése sz. neve m egnevezése
Infokommunikációs hálózatépítő és
Programozás és adatbázis
6 54 481 03
üzem eltető
54 481 01 CAD-CAM informatikus Programozás
és Programozás
11625-16
kezelés
54 481 02 Gazdasági informatikus gyakorlat tantárgy,
54 213 05 Szoftverfejlesztő a Java vagy C# nyelv
7 alapjai, programozási
54 481 05 Műszaki informatikus
típusfeladatok
54 481 06 Informatikai rendszerüzemeltető
54 482 01 IT mentor
lm agyár
nyomdatermék
NYOMD*- ÉS PAPÍRIPARI SZÖVETSÉS
BEVEZETÉS................................................................................................................ 5
1. A MICROSOFT.NET FRAMEWORK..................................................................6
1.1. A programozás szintjei és a C# nyelv.......................................................... 6
1.2. A C# beszerzése.............................................................................................. 7
2. PROGRAMOZÁSI ALAPOK.................................................................................8
2.1. A C# indítása.................................................................................................11
2.2. Kiíró utasítások............................................................................................. 15
2.3. Változó értékének kiíratása......................................................................... 18
2.4. Kifejezések és műveletek............................................................................ 22
2.4.1. A kifejezések kiértékelése.................................................................23
2.5. Beolvasás billentyűről................................................................................. 24
2.6. Konvertálás................................................................................................... 24
2.7. Matematikai függvények............................................................................. 25
2.8. Elágazás.........................................................................................................28
2.9. Logikai műveletek........................................................................................32
2.10. Véletlen számok előállítása......................................................................... 33
2.11. Ciklusok.........................................................................................................35
2.11.1. Elöltesztelő ciklus............................................................................ 36
2.11.2. Hátultesztelő ciklus......................................................................... 38
2.11.3. Előírt lépésszámú ciklus..................................................................40
2.12. Többirányú elágazás.....................................................................................43
2.13. A töm b...........................................................................................................46
2.14. A goto utasítás.............................................................................................. 52
2.15. Hibakeresés, tesztelés...................................................................................54
3. PROGRAMOZÁSI TÉTELEK............................................................................ 57
3.1. Összegzés......................................................................................................57
3.2. Megszámolás................................................................................................ 58
3.3. Eldöntés.........................................................................................................59
3.4. Kiválasztás.................................................................................................... 60
3.5. Maximum- (minimum) kiválasztás............................................................ 61
3.6. Kiválogatás................................ 66
3.7. Szétválogatás................................................................................................ 67
3.8. Lineáris keresés............................................................................................ 68
3.9. Rendezés....................................................................................................... 69
3.9.1. Minimum (maximum) kiválasztásos módszer................................ 70
3.9.2. Szomszédos elemek cseréjén alapuló módszer............................... 73
4. ALPROGRAMOK ÉS FÁJLKEZELÉS............................................................. 76
4.1. Eljárások........................................................................................................76
4.2. Függvények.................................................................................................. 84
4.3. Fájlkezelés.................................................................................................... 88
4.3.1. Hibakezelés..................................................................................... 89
5. ÖSSZETETT ADATSZERKEZETEK.................................................................98
5.1. Stringek..........................................................................................................98
5.2. A felsorolt típus.......................................................................................... 104
5.3. Struktúra (rekord)....................................................................................... 105
5.4. Lista............................................................................................................. 107
5.5. Szótár........................................................................................................... 110
5.6. Halmaz......................................................................................................... 112
6. ÖSSZETETT FELADATOK...............................................................................114
6.1. Kéktúra (Ágazati érettségi mintafeladat: 2017)......................................114
6.2. Helsinki 1952 (Ágazati érettségi feladat: 2017 május)........................... 120
7. WINDOWS FORM APPLICATION ................................................................129
7.1. A Windows Formok használata................................................................ 129
7.2. ALabel .......................................................................................................130
7.3. A B u tto n ......................................................................................................131
7.4. A TextBox...................................................................................................133
8. WINDOWS PRESENTATION FOUNDATION.............................................. 155
8.1. A WPF használata ..................................................................................... 155
8.2. A B utton.....................................................................................................157
8.3. A TextBox...................................................................................................158
8.4. Az Image ....................................................................................................161
8.8. A T im er......................................................................................................169
Felhasznált irodalom ................................................................................................175
Új szakkifejezések....................................................................................................176
5
1. A MICROSOFT.NET FRAMEWORK
1.2. A C# beszerzése
2. PROGRAMOZÁSI ALAPOK
b) Tervezés
A specifikáció alapján meg lehet tervezni a programot, elkészülhet a megoldás
algoritmusa és az algoritmus által használt adatok leírása. Az algoritmusok le
írása megvalósítható folyamatábrával, struktogrammal, Jackson-diagrammal,
mondatszerű elemekkel, vagy mondatokkal leírva is. Az első három rajzos
megvalósítás nyelvfuggetlen, ezért sokszor ezt használják. A konkrét feladat
folyamatábrája:
a: egész
b: egész
K: egész
ó-
Be: a
igaz
< >
hamis
6-
Be: b
igaz
K = 2 • (a + b)
P rogramozási alapok
10
c) Kódolás
Az előzőleg megtervezett algoritmus megvalósítása a megbeszélt nyelven. A meg
valósításhoz a konkrét programozási nyelv alapos ismerete szükséges. A prog
ramkód C# nyelven:
s ta tic v o i d M a i n ( s t r i n g [] args)
int a, b, K;
C onsole.W riteL in e("T ég lalap k e rü le té n e k k is z á m itá s a " ) ;
do
{
C o n s o l e . W r i t e L i n e ("Kérem a d j a meg az első o ld al
hosszúságot egész m éterben");
a = C o n v ert. T oInt32(C onsole.R eadL ine());
} w hile ( a <= 0 ) ;
do
{
C o n s o l e . W r i t e L i n e ( " K é r e m a d j a meg a z m á s o d i k o l d a l
hosszúságot egész m éterben");
b = C o n v ert.T oInt32(C onsole.R eadL ine());
} w hile (b <= 0 ) ;
K = 2 * (a + b) ;
C o n so le.W riteL in e("A szükséges k eritésd ró t {0} m é t e r
", K);
C o n so le . ReadKey();
}
d) Tesztelés
A program kipróbálása, esetleges hibák feltárása, a hibalista elkészítése. A tesz
telés során a programunkat kipróbáljuk, lefuttatjuk különböző tesztadatokkal.
A megfelelő tesztelés minden program fontos része, és napjainkban külön szoft-
vertesztelőket alkalmaznak a programozó cégek. A példánkban ilyen teszteset
lehet a (5, 6 ; 5, -6; -6, -8; -7, 8 ) számpárok alkalmazása. Ilyen teszt lehet az is,
hogy mi történik akkor, ha az oldalhosszúságnál törtszámot (PL: 3.5) adunk meg.
A C# INDÍTÁSA
11
e) Hibakeresés
A hiba pontos helyének meghatározása. Hol és mit rontottunk el. Gondoljuk
végig mit akartunk csinálni és mit csináltunk valójában. Ha sikerült a hibát
(hibákat) pontosan beazonosítani, kezdhetjük a következő lépést.
f) Hibajavítás
Hogyan lesz jó a program a hiba kijavítása után. A javítás után ismételt tesztelés
szükséges, hiszen a kijavított kódban is lehetnek hibák! A teszteléssel, hibake
reséssel, hibajavítással a későbbiekben részletesebben foglalkozunk. sshp469
g) Minőségvizsgálat, hatékonyság
Jobbá tehető-e a program, megvalósítható-e a gyorsabb programlefutás? Ennek
elvégzése a programozási nyelv és algoritmusok nagyfokú ismeretét igényli,
ezért nem tárgyaljuk részletesen.
h) Dokumentálás
A program készítéséről, felhasználásáról, telepítéséről megfelelő dokumentáci
ót kell készíteni. A felhasználói dokumentáció a felhasználónak szól, így ábrák
kal magyarázatokkal kell bemutatni a program használatát. A fejlesztői doku
mentáció a program felépítését, a megvalósított gondolatmenetet (algoritmus és
kód) az elvégzett teszteseteket, esetlegesen előforduló hibákat és azok javítása
it tartalmazza. A telepítési dokumentáció a program telepítésének lépéseit írja
le a szükséges hardver és szoftver követelményekkel együtt.
i) Használat, karbantartás
A nagyobb programokat időnként módosítani kell. Ilyen karbantartást igényel
nek pl. a könyvelőprogramok (adókulcsváltozás, törvényváltozás), a számlázó
programok stb. A szükséges módosításokat mindig el kell végezni, és a módo
sításokat ismételten tesztelni kell.
2.1. A C# indítása
Mielőtt bármilyen nyelven hozzákezdenénk egy program írásához, meg kell ismer
kedni néhány fontos fogalommal. A nyelvek többségében - így C#-ban is - beépí
P rogramozási alapok
12
kapcsos zárójelei közé fogunk írni. Ezt a nagyon fontos szabályt tartsuk be
mindaddig, amíg nem ismerjük a using, a namespace és class részek jelentőségét.
A jobb oldalon a Solution Explorer-ben a nevet láthatjuk, alatta a Properties a
References és a Program.es található. Számunkra egyelőre csak a Program.es lesz
a fontos. Ha a Solution Explorer nem látszik, akkor a menüsor View részében kap
K iíró utasítások
15
1. feladat:
írjuk ki a képernyőre az „Első C# programom” szöveget!
A neve legyen: Első
Ehhez meg kell ismerkednünk a C# kiíró utasításaival, amely a ConsoleWrite() és
a Console.WriteLine() utasítás. A Console most egy kimeneti konzolt, a monitort
jelenti, a Write írást, a Line pedig sort jelent. Lefordítva magyarra: írj egy sorba a
képernyőre! Hogy mit írjon a gép, azt a zárójelek közötti idéző jelek közé kell
begépelni, így:
using System ;
using S y ste m .C o lle ctio n s.G enerik
us ing S y stem .L inq;
using S ystem .T ext;
{
eláss Program
{
static void M a i n ( s t r i n g [] args)
{
C o n s o l e . W r i t e L i n e ( "Az e l s ő C# p r o g r a m o m " ) ;
}
}
2. feladat:
írjuk ki a képernyőre az „Első C# programom” szöveget, alatta hagyjunk ki egy
üres sort, és ez alá írjuk ki a „Már üres sort is tudok” szöveget!
Név: Második
Megoldás:
1,
2,
3,
A változó definiálása:
típus változónév;
• int a; //az a nevű változó int típusú egész adatokat fogadhat,
• float c , x , y ; //egyszerre több változót is deklarálhatunk, ha vesszővel eh
választva felsoroljuk őket
• string kiírás;
• char választás;
• bool ismétlés;
A változó deklarációja:
3. feladat:
írjuk ki a képernyőre az a változó értékét! Először adjunk 0 kezdőértéket a válto
zónak, majd a programban legyen egy értékadás, a változó értéke legyen 5 és
utána írjuk ki a változó értékét!
Név: Változókiírási
Megoldás:
C o n s o le .ReadKey();
}
Most a képernyőn csupán egy 5-ös jelenik meg, és alatta villog a kurzor várva egy
billentyű leütését. Nézzük meg, hogyan lehet szövegkonstanst és változó értékét
egy sorba kiíratni: Legyen a = 4 és b = 6, típusuk pedig egész.
Ekkor a
C o n so le .W rite L in e("A z 1. szám = {0}, a m ásodik szám =
{ 1 } ff , a , b ) ;
utasítás miatt a képernyőre kiíródik az idézőjelek között lévő szövegkonstans, ki
véve a kapcsos zárójelek közötti 0 és 1. A 0 és az 1 helyén az a és a b változó ér
téke jelenik meg. Az idézőjel után vesszővel elválasztva meg kell adni a kiírandó
változók (kifejezések) listáját, amely listában sorszámozva vannak a változók (ki
fejezések) 0-tól kezdve.
Esetünkben tehát a 0. változó az a, az 1. pedig a b.
Ha a kiírandó változó nem egész típusú, akkor a változó sorszáma után kettős pon
tot kell tenni és meg kell adni az egészek, majd a pont után a tizedesjegyek számá
nak megfelelően nullákat.
PL:
C o n s o l e . W r i t e L i n e ( "Az 1. szám={ 0 :0 .0 0 } , a 2.
szám={1 : 0 . 0 0 0 } " , a , b ) ;
Hasonlóan írhatjuk ki egy kifejezés értékét is:
C o n s o l e . W r i t e L i n e ( " A z 1. s zá m = {0 : 0 . 0 0 } , a m ásodik
szám={1 :0 .0 0 0 } " , a / b , b * b );
A kiírandó változó természetesen nem csak szám típusú lehet, hanem akár szöveg
vagy karakter típus is.
4. feladat:
írjuk ki a képernyőre az x*y, majd alá 4 tizedes pontossággal az x/y értékét, ha x = 2,
y = -11! Az sz változó string típusú legyen és értéke: ” művelet eredménye:" szöveg
Név: Változókiírás2
Megoldási:
static void M a i n ( s t r i n g [] args)
K ifejezések és műveletek
21
i n t x = 2, y = -1 1 ;
s t r i n g s z ö v e g = 11 m ű v e l e t e r e d m é n y e :
C o n s o l e . W r i t e L i n e (" x * y { 0 } {1} % sz ,x * y ) ;
C o n s o l e . W r i t e L i n e (" x / y { 0 } { 1 : 0 . 0 0 0 0 } ",sz, x / y ) ;
C o n so le .ReadKey();
}
A monitoron ez jelenik meg:
x*y művelet eredménye: -22
x/y művelet eredménye: 0,0000
Az x/y esetén sajnos rossz eredményt látunk, amelynek oka a helytelen típusvá
lasztás az x és az y esetén. Ha a változók egész típusúak, akkor két egész szám
szorzata szintén egész lesz. Ezzel nincs is gond, de ha osztani kell, akkor már lehet
nem egész is a végeredmény. Esetünkben biztos nem lesz egész az x/y, ezért látunk
rossz értéket a számítás után. Ha x/y is egész lenne (pl: x = 9, y = 3), akkor ismét
helyes eredményt kapnánk. Egy jó program azonban minden lehetőségre fel van
készítve, ezért ilyenkor érdemes valós típust választani. (pl.:double vagy float)
Megoldás2:
static void M a i n ( s t r i n g [] args)
{
f l o a t x = 2, y = -1 1 ;
s t r i n g s z ö v e g = 11 m ű v e l e t e r e d m é n y e : " ;
C o n s o l e . W r i t e L i n e (" x * y { 0 } { 1 } ", s z ö v e g ,x * y ) ;
C o n s o l e . W r i t e L i n e (" x / y { 0 } { 1 : 0 . 0 0 0 0 } " , szöveg, x / y ) ;
C o n so le .ReadKey();
}
A monitoron most már helyesen ez jelenik meg:
x*y művelet eredménye: -22
x/y művelet eredménye: -0,1818
Megjegyzés: A kiíratásnál mindkét sorban a 0. változó a szöveges szöveg nevű változó volt.
Itt térünk vissza arra, hogy a változó nevének, az azonosítónak a megválasztását
milyen szempontok alapján célszerű elvégezni, a tiszta kód érdekében. Az első
megoldásnál a számok elnevezése x és y. Ez érthető is, mivel a matematikában
gyakran jelölünk így számokat helyettesítő értékeket. Az sz változó már nem igazán
„sokatmondó” egy külső szemlélő számára, de a második megoldásban a szöveg
név már egyértelművé teszi, hogy a szöveg változó szöveg (string) típusú lesz.
Programozási alapok
22
Ha az operátor a változó után áll akkor postfix formáról beszélünk. Pl: a = b++
ennek jelentése a = b majd b = b + 1. (utólag növel)
1. inta = 6 , b = 1 8 , c = 2 3 , x , y , z ;
x = a + b; //először megtörténik az összeadás, majd az eredmény az x változóba
kerül. Értéke: 24
x = x + 1; //először megnézi az x értékét ( 24 ) hozzáad egyet, és az így kapott
eredmény lesz az x változó új értéke
b - = a; //jelentése b = b - a ez viszont már egyértelmű b új értéke: 12
2. int a = 6, b = 18 , c = 23 , x , y , z ;
y = b / a ; Ily változó értéke 3 lesz
z = c % a ; H z változó értéke 5 lesz a % jel az osztás maradékát adja!!!
x=(c+b-a)%a; //először a zárójelen belüli rész értékelődik ki, majd elvégződik
a maradékos osztás x értéke 5 lesz
Mi lesz az alábbi kifejezések értéke?
2. Ha int a = 5, b= - 2 és c = 3 ,
(a + b) * c = ............... , 3 * a - (c / b) = ............. , ( - a - c) / b =
3. Ha int a = 10, b= - 1 és c = 6 ,
(a % c) * (- c) = ......., a - (c / b) = ............, - (b % c) + (a / 2) * 7 =
4. Ha int a = 8, b= - 3 és c = 9 ,
(a % b) * c * 2 = ....... , - b / a + (c * c) = ........, a * c - 4 * (a % b) =
2.6. Konvertálás
C#-ban csak szöveg típusú adatot lehet beolvasni. Ezért ha számot szeretnénk be
kérni, akkor célszerű azonnal átváltani, konvertálni a megfelelő számtípusra a be
kért szöveget. Pl.:
egesz=Convert.ToInt32(Console.ReadLine()); vagy:
valos= Convert.ToDouble(Console.ReadLine());
Az első esetben egesz egész szám, valós pedig double típusú valós szám lesz a
konvertálás után. Most már el lehet végezni a számokra jellemző matematikai mű
veleteket.
M atematikai függvények
25
5. feladat:
írjunk programot, amely bekér két egész számot a billentyűről és kiírja az össze
güket!
Név: Adatbekérés 1
Megoldás:
6. feladat:
írjunk programot, amely bekér két egész számot, az alapot és a kitevőt a billentyű
ről és kiírja a hatványt, majd ennek a számnak a gyökét 2 tizedes pontossággal!
írjuk ki a képernyőre, hogy az alap csak pozitív lehet!
Név: Matekl
Megoldás:
static void M ain (strin g [] args)
{
i n t a = 0, x = 0;
d o u b l e h a t v á n y = 0, g y o k = 0 ;
C o n s o l e . W r i t e L i n e (" H a t v á n y é s g y ö k k i s z á m í t á s a " ) ;
C o n so le .W rite L in e ();
C o n s o l e . W r i t e L i n e (" Az a l a p p o z i t í v l e g y e n ! " ) ;
C o n s o l e . W r i t e (" K é r e m a z a l a p o t : " ) ;
a= C onvert. T oIn t3 2 (C o n so le.R eadL ine());
C o n s o l e . W r i t e (" K é r e m a k i t e v ő t : " ) ;
x = C o n v ert. T o In t3 2 (C o n so le.R eadL ine());
h a tv án y = M ath. P o w (a ,x );
C o n s o le .W r ite L in e ( " A h a tv á n y : {0}", h a tv á n y ) ;
gyök = M ath. S q rt ( y ) ;
C o n s o le .W rite L in e (" A h a tv á n y gyöke: { 0 :0 .0 0 } " , gyök);
C o n so le .ReadKey();
}
7. feladat:
írjunk programot, amely bekér egy szöget fokban, és kiírja a szög szinuszát 4 tize
des pontossággal! Ne felejtsük el, hogy a szöget át kell váltani radiánba. Mivel
180° = 7C, ezért a n értékét meg kell szorozni a számítandó szög 180-ad részével.
Név: Matek2
Megoldás:
C o n s o l e . R e a d K e y () ;
}
8. feladat:
Kérjük be egy kör sugarát, és írjuk ki a kerületét és a területét 2 tizedes pontossággal!
Név: Matek3
Megoldás:
2.8. Elágazás
A program bizonyos részein szükség lehet arra, hogy egy adott feltételtől függően
kell végrehajtani valamit. Gyakori probléma, ha a számítások során negatív szám
van a gyök alatt, vagy egy tört esetén 0 van a nevezőben. Ilyenkor feltételhez kell
kötni a matematikai művelet elvégzését, és csak akkor végezni el, ha az lehetséges.
Magyarul a feltételes mondatot HA-val kezdjük. Ennek megfelelően C#-ban az
angol if utasítás szükséges, majd zárójelben a logikai kifejezés, amely egy relációs
művelet. A kifejezés értéke igaz, vagy hamis lehet.
E lágazás
29
Az összehasonlító művelet eredménye tehát bool típus lehet, amelyet eddig még
nem említettünk. Ez a C# logikai típusa, amelynek értéke TRUE (igaz), vagy
FALSE (hamis) lehet.
Relációs műveletek:
a>b a nagyobb, mint b,
a >= b a nagyobb vagy egyenlő, mint b,
a<b a kisebb, mint b,
a <= b a kisebb vagy egyenlő, mint b,
a==b a egyenlő b-vel,
a != b a nem egyenlő b-vel.
Az a és b változó, vagy kifejezés lehet.
2. Ha a feltétel igaz, akkor csináljunk valamit, ha hamis, akkor valami mást. A fo
lyamatábra részletből megállapítható, hogy a feltétel igaz és hamis ágán is van
utasítás igy azt egyértelműen meg kell adni a programozási nyelven is.
i f ( a > b )
{
C o n s o le .W rite L in e ( ' ' a nagyobb m int b ' ');
else
C onsole.W riteL ine ( ' ' a k iseb b , vagy e g y e n lő m int b ' ' ) ;
9. feladat:
Kérjünk be egy egész számot a billentyűzetről, és ha a szám nagyobb mint 0, akkor
írjuk ki a képernyőre, hogy "A szám pozitív"!
Név: Feltételes 1
Megoldás:
static void M a in (strin g [] args)
{
i n t a = 0;
C o n s o l e . W r i t e (" K érek egy szám ot: ");
L ogikai műveletek
31
10. feladat:
Kérjünk be a másodfokú egyenlet együtthatóit és számítsuk ki a gyököket 2 tizedes
pontossággal! Ha a diszkrimináns negatív, írjuk ki a képernyőre: "Nincs megoldás"!
Név: Másodfokú
Megoldás:
static void M a in (strin g [] args)
{
d o u b l e a = 0 , b = 0 , c = 0 , d = 0 , x l = 0 , x2 = 0 ;
C o n s o l e . W r i t e L i n e (" M á s o d f o k ú e g y e n l e t g y ö k e i n e k
szám ítása:");
C o n so le .W rite L in e ();
C o n s o l e . W r i t e (" a= " ) ;
a = C o n v e rt. T oD ouble(C onsole.R ead L in e());
C o n s o l e . W r i t e (" b = " ) ;
b = C o n v e rt. T oD ouble(C onsole.R ead L in e());
C o n s o l e . W r i t e (" c = " ) ;
c = C o n v e r t . T o D o u b le ( C o n s o le . R e a d L i n e ()) ;
d = b * b - 4 * a * c ;
C o n so le .W riteL ine ();
i f ( d < 0)
{
C o n s o l e . W r i t e L i n e (" N incs m egoldás");
}
else
{
xl = (-b + M ath. S q rt(d ) ) / (2 * a);
P rogramozási alapok
32
x2 = ( - b - M a t h . S q r t ( d ) ) / (2 * a ) ;
C o n s o l e . W r i t e L i n e (" x l = { 0 : 0 . 0 0 }
x2={ 1 :0 .0 0 } " ,x l , x2 );
}
C o n s o le . ReadKey();
}
A program nem tökéletes, ami kiderül, ha a = 0. Most azonban nincs is értelme
ezzel foglalkozni, mivel ha a = 0, akkor az egyenlet nem másodfokú, márpedig mi
most kizárólag a másodfokú egyenletek gyökeit akartuk kiszámolni.
Módosíthatnánk a programot úgy, hogy ekkor is kiszámolja az x tengellyel való
metszéspontot, de az xl és az x2 kiszámítása előtt az else ágba egy új if-ben meg
kellene vizsgálni a értékét, és ha az 0, akkor x = - c / b-vel számoljuk a gyököt,
így az xl és x2 kiszámítása és kiíratása egy újabb else ágba kerülne. A későbbiek
ben majd látjuk, hogy lesz ennél szebb megoldás is, amelyben nem engedjük az
a = 0 lehetőséget, tehát csak másodfokú egyenletek esetén működik a program.
A logikai műveletek az életben is gyakran előfordulnak, amikor a nem, az és, ill. a vagy
szót használjuk. A programozásban is hasonlóan használhatjuk ezeket a „műveleteket”.
• A tagadás vagy negáció jele: !
Pl.: ! kifejezés Az ellenkezőjére változtatja a kifejezés értékét.
• Az ÉS, vagy konjukció jele: &&
Pl.: A && B. Csak akkor lesz igaz, ha mindkét állítás igaz.
• A VAGY, vagy diszjunkció jele: | | (Alt Gr+W)
PL: A | | B. Akkor lesz igaz, ha bármelyik kifejezés igaz.
Gyakorló feladatok:
1. Kérjünk be 2 számot. írjuk a képernyőre a nagyobbat!
2. írjuk ki 2 tetszőleges szám hányadosát. (!!¡Nullával nem lehet osztani!!!)
3. Három tetszőleges számról döntsük el, hogy lehetnek-e egy háromszög oldalai!
(háromszög szerkeszthetősége szabály)
4. Adott egy tetszőleges pont koordinátáival. Határozza meg, melyik síknegyedben van!
5. A középszintű érettségin maximum 150 pont szerezhető. Kérje be egy tanuló
elért pontszámát és írja ki, milyen érdemjegyet kapott (betűvel és számmal) ha
a százalékos értékelés a következő:
VÉLETLEN SZÁMOK ELŐÁLLÍTÁSA
33
Százalékérték Érdemjegy
0-19% Elégtelen (1)
20-39% Elégséges (2)
40-59% Közepes (3)
60-79% Jó (4)
80-100% Jeles (5)
6. Egy tetszőleges számról mondjuk meg, hogy osztható-e maradék nélkül 3-mal!
7. Ha ismerjük a víz hőmérsékletét, adjuk meg milyen halmazállapotú (szilárd,
folyékony, gáz)!
8. Kérjen be 2 számot és a nagyobbat ossza el a kisebbel! Az eredményt
2 tizedesjegy pontossággal írja ki! (!!! Nullával nem lehet osztani!!!)
11. feladat:
Állítsunk elő véletlenszerűen két egész számot a [0,10] tartományból, és írjuk ki a
számokat a képernyőre, majd azt, hogy melyik szám a nagyobb! Ha egyenlők, írjuk
ki: ”A két szám egyenlő” !
Név: Véletlen 1
Megoldás:
static void Main(string[] args)
{
int a = 0, b = 0;
Random vsz = new RandomO;
Console.WriteLine(" Két szám vizsgálata");
a = vsz.Next(11);
b = vsz.Next(11);
Console.WriteLine(" a= {0}",a);
Console.WriteLine(" b= {0}",b);
if (a > b) Console.WriteLine(" A(z) {0} nagyobb,
mint {1}", a, b) ;
else
if (a < b) Console .WriteLine (" A(z) {0} nagyobb,
mint {1}", b, a);
else Console.WriteLine (" A két szám egyenlő");
Console.ReadKey();
}
Megfigyelhető, hogy az if és az else után is csak 1 utasítás van, ezért a {}-ek elhagyhatók.
12. feladat:
Állítsunk elő véletlenszerűen egy egész számot az [l,10]-ból, és írjuk ki, hogy a
szám páros-e vagy páratlan!
Név: Véletlen2
Megoldás:
static void Main(string[] args)
{
int szám = 0;
Random vsz = new RandomO;
szám = vsz.Next(lO) + 1;
C iklusok
35
i f ( s z á m % 2 == 0) C o n s o l e . W r i t e L i n e ( 11 {0} : A
szám p á r o s " , s z á m ) ;
e l s e C o n s o l e . W r i t e L i n e (" { 0 } : A s z á m p á r a t l a n " ,
szám);
C o n s o le . ReadKey();
}
Egészítsük ki a következői programsorokat a példához hasonlóan!
2.11. Ciklusok
utasítás(ok);
Igaz (nem 0)
utasítás(ok)
13. feladat:
Kérjünk be egy számot és írjuk ki, hogy az prímszám-e vagy sem!
Név: Elöltesztelő
Megoldás:
static void M a i n ( s t r i n g [] args)
long s z á m = 0;
double fele = 0, oszto=0;
C iklusok
37
Igaz (nem 0)
Üres ciklus nem lehet, mert mindenképpen belépünk a ciklusba, így legalább egy
szer lefutnak a benne lévő utasítások. Végtelen ciklus viszont lehet, így erre ügyel
ni kell, hogy ilyen ne forduljon elő. A magban gondoskodni kell a ciklusban való
bentmaradás feltételének hamissá válásáról.
Gyakori feladat, hogy az adatbekérést hátultesztelő ciklussal szabályozzuk, azaz
csak akkor fut tovább a program, ha számunkra megfelelő adat kerül bevitelre.
Ezzel tudjuk védeni a programot a felhasználó által elkövetett véletlen, vagy szán
dékos hibáktól.
14. feladat:
Kérjünk be egy mobil telefonszámot, és csak akkor fogadjuk el, ha az valóban
mobilszám! írjuk ki, hogy a szám melyik szolgáltatóhoz tartozik!
Név: Mobilszámvizsgáló
Megoldás:
static void M a i n ( s t r i n g [] args)
{
VI ff .
strin g szám =
C iklusok
39
C o n s o l e . W r i t e L i n e ( 11 Mobilszámellenőrző
p ro g ram ");
C o n so le .W rite L in e ();
do {
C o n s o l e . W r i t e (" Kérem a telefonszám ot (a 06
u t á n i r é s z t ) : ") ;
s z á m = C o n s o l e . R e a d L i n e () ;
} w h i l e ( s z a m . L e n g t h != 9 | | ( s z á m [ 0 ] . T o S t r i n g ()
!= " 2 " ) && ( s z a m [ 0 ] . T o S t r i n g () != " 3 " ) &&
(szam[0] . T o S t r i n g O !="7") ) ;
i f (sz ám [ 0 ] . T o S t r i n g ()= ="2" ) Console.
W r i t e L i n e ("T e le n o r" ) ;
i f ( s z a m [ 0 ] . T o S t r i n g () = = "3") Console.
W r i t e L i n e ("Telekom ");
i f ( s z a m [ 0 ] . T o S t r i n g () = = "7") Console.
W r i t e L i n e ("V odafone") ;
C o n s o l e . R e a d K e y () ;
}
Itt a string típus tulajdonságai közül használtunk ki kettőt, v
1. A szam.Length megadja a szám nevű, string típusú változó hosszát.
Eredménye egy int típusú egész szám lesz. Esetünkben a hossznak 9-nek
kell lenni, hiszen ennyi jegyből áll egy mobilszám.
2. Egy szövegnek - mint karakterláncnak - bármely elemére (karakterére) hi
vatkozhatunk egy szögletes zárójelben megadott sorszámmal, melynek érté
ke 0-tól a szöveg hossza-1-ig terjedhet.
Megjegyzés: A ToString()-re azért van szükség, mert a C# az 1 hosszúságú szöveget
karakternek tekinti. Mivel a szám nevű változónk nem 1 hosszúságú, ezért át kell
váltani, hogy a program szövegként kezelje.
A program egy hátultesztelő ciklusban megvizsgálja a szám hosszát és az első
karaktert. Ha a szám hossza nem 9, akkor bent marad a ciklusban és újból bekéri a
telefonszámot.
De nem csak a szám hossza fontos, hanem az első karakter értéke is. Ha ez rossz,
akkor sem léphetünk ki a ciklusból. A két állítás között VAGY kapcsolat van, így
bármelyik állítás hamis, kiléphetünk a ciklusból.
Nézzük ezt a programrészt szövegesen leírva:
A ciklusban való maradás feltétele, hogy a While utáni két állítás igaz legyen,
vagyis A VAGY B igaz legyen. VAGY esetén elég, ha az egyik állítás igaz.
P rogramozási alapok
40
15. feladat:
Állítsunk elő véletlenszerűen öt egész számot az [0,50]-ból, és írjuk ki a képernyő
re egymás mellé 5 karakternyi helyet lefoglalva a számoknak!
Név: Előírtciklus 1
Megoldás:
static void Main(string[] args)
{
int szám = 0, i = 0;
Random vsz = new Random();
fór (i = 1 ; i < = 5 ; i + + )
{
szam=vsz.N e x t (51);
Console.Write("{0,5}", szám);
}
Console.ReadKey();
}
Megjegyzés: A ciklusfejben az i<=5 helyett értelemszerűen az i<6 is használható.
A ”{0,5} ” részben a 0. sorszámú változó (szám) értékét írja ki a program öt helyet
lefoglalva számára és jobbra igazítva.
Ez különösen akkor előnyös, ha több számot szeretnénk táblázatos formában egy
más alá írni és a számokat helyiérték szerint akarjuk rendezni.
16. feladat:
Állítsunk elő véletlenszerűen 40 egész számot a [-100,100]-ból, és írjuk ki a kép
ernyőre egymás mellé 6 karakternyi helyet lefoglalva, de egy sorban csak 8 szám
legyen! A kiírás végén adjuk meg hány darab pozitív szám van!
Név: Eőírtciklus2
Megoldás:
static void Main(string[] args)
{
int szám = 0 , i = 0, pozdb=0;
Random vsz = new Random();
fór (i = 1; i <= 40; i++)
{
szám = vsz.Next(-100,101);
if (szám > 0) pozdb++;
if (i % 8 = = 0) Console .WriteLine (" {0, 6}11,szám) ;
else
P rogramozási alapok
42
C o n s o le .W r i t e ("{0,6}" , szám);
}
C o n s o le .W r i t e L i n e ();
C o n s o l e . W r i t e L i n e ("{0} db p o z i t í v szám
van." ,pozdb);
C o n s o le .ReadKey();
}
A kiírásnál kihasználtuk a következő lehetőséget: ha az i ciklusváltozót elosztjuk
nyolccal és a maradék 0 lesz, akkor WriteLine utasítással írjuk ki a számot, és ezért
a következő sor elején folytatjuk a kiírást. Egyébként Write utasítással egymás
mellé írjuk a számokat.
Mi az oka ennek?............................................................................................................
T öbbirányú elágazás
43
Ezt a 3 if-es sor helyett kell beírni, és így is lefut a program. Az eddig látott, hasz
nált típusok nagy hátránya, hogy nagyobb adathalmaz létrehozása, kezelése (ren
dezés, kiválasztás) nehezen megoldható.
17. feladat:
írjunk oktatóprogramot, amely az összeadást és a kivonást gyakoroltatja! Az egész
számokat véletlenszerűen állítsuk elő! A felhasználó csak -5 és +15 között képes
a műveleteket elvégezni. Adjunk 10 feladatot, és a felhasználó minden helyes meg
oldása 1 pontot érjen! Osztályozzuk le a feladatsort, és az osztályzatot írjuk ki a
képernyőre úgy, hogy 0-2-ig elégtelen, 3-4-ig elégséges, 5-6-ig közepes, 7-8-ig jó,
e fölött pedig jeles legyen!
Név: Oktatóprogram
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t a = 0, b = 0, e r e d m e n y = 0, i = 0 , v a l a s z =
0, p o n t = 0;
Random v s z = new R a n d o m O ;
C o n s o l e . W r i t e L i n e ( 11 O k t a t ó p r o g r a m " ) ;
C o n s o le .W r ite L in e ();
f ó r ( i = 1; i <= 1 0 ; i + +)
{
a = v s z . N e x t (20) ;
do
{
b = v s z .N e x t(20)-10;
eredmeny = a + b;
}while (eredmeny>15 || e r e d m e n y < - 5 ) ;
C o n s o l e . W r i t e (" {0} {l}",i,a);
i f (b >= 0) C o n s o l e . W r i t e ( " + " ) ;
C o n s o l e . W r i t e (" { 0 } = " ,b) ;
v á l á s z = C o n v e r t . T o I n t 3 2 ( C o n s o l e . R e a d L i n e ()) ;
i f ( v a l a s z = = eredmeny) pont++;
}
C o n s o le .W r ite L in e ();
s w itc h (pont)
{
case 0
case 1
case 2
T öbbirányú elágazás
45
C o n s o le .W r i t e L i n e (" E l é g t e l e n ” );
break;
case 3 :
case 4 :
Console.W riteL ine("E légséges");
break;
c a s e 5:
c a s e 6:
C onsole.W riteL ine("Közepes");
break;
case 7 :
case 8 :
C o n s o le .W r i t e L i n e (" J ó " );
break;
c a s e 9:
c a s e 10:
C o n s o le .W r i te L i n e (" J e l e s " );
break;
}
C o n s o le . ReadKey();
}
A for ciklusban előállítjuk az a értékét a megadott határokon belül. Majd egy
hátultesztelő ciklusban előállítjuk a b-t is, de a ciklusból mindaddig nem léphetünk
ki, amíg az eredmény rossz, azaz 15-nél nagyobb, vagy -5-nél kisebb. Ekkor b-t
addig fogjuk újra és újra előállítani, amíg megfelelő eredményt kapunk. Ekkor el
hagyhatjuk a ciklust.
Ezt követően kiírjuk a feladat sorszámát ( i ) és az a -t. A b kiírása előtt meg kell
vizsgálni, hogy negatív-e, mert ha nem, akkor egy + jelet elé kell írni, mivel elője
let csak akkor ír ki a számítógép ha negatív.
Jó válasz esetén növeljük a pont értékét, majd switch case segítségével kiírjuk a
megfelelő érdemjegyet.
Gyakorló feladatok:
1. Készítsen programot, ami számokat kér be mindaddig, amíg 0-át nem adunk meg!
2. Készítsen programot, ami számokat kér be addig, amíg az utolsó két szám meg
nem egyezik!
3. Készítsen számkitalálós programot! A gép véletlenszerűen találjon ki egy szá
mot 1 és 100 között! A felhasználótól kérjen be tippeket, és mondja meg, hogy
Programozási alapok
46
a gondolt szám a tipptől nagyobb-e vagy kisebb! A tippelés addig megy, amíg
a felhasználó el nem találta a megadott számot.
4. Bővítse az előző feladatot úgy, hogy a szám eltalálásakor írja ki hány tippelés-
ből sikerült eltalálni a számot!
5. Készítsünk programot, amely 15 darab *-ot ír ki a képernyőre!
6. Készítsünk programot amely az első sorba kiír 15 *-ot, a másodikba 14 *-ot,...,
a tizennegyedik sorba 2 *-ot, a tizenötödik sorba pedig 1 *-ot! A csillagok ki
írása a sor elején kezdődjön!
7. Készítse el az előző feladatot úgy, hogy a 2. sortól kezdődően a *-ok jobbra
legyenek igazítva, az első sor utolsó csillagához!
8. írassa ki a számokat 1-től 20-ig és mellé a négyzetüket is!
9. írassa ki 99-től csökkenő sorrendben az összes pozitív, 3-al osztható egész
számot!
10. Számítsa ki a gép 10 véletlen szám összegét, szorzatát, átlagát és írjuk ki a
képernyőre!
11. Szimuláljon egy felhasználótól bekért számú kockadobást! A gép véletlensze
rűen meghatározza a dobás értékét (1 ...6) és kiírja a dobás eredményét. A meg
felelő szám elérése után a program készítsen statisztikát a dobások gyakorisá
gáról! írjuk ki, melyik szám hányszor fordult elő!
12. Készítsen programot, amely addig kér be számokat, amíg -30 és 40 közé nem
esik egy szám!
13. Készítsen programot, amely bekér egy szöveget és kiírja:
a. A szöveg minden második karakterét!
b. Minden 5. karakterét!
c. Hátulról az utolsó 5 karaktert!
d. A beírt szöveget fordított sorrendben!
e. A szavak betűit fordított sorrendben!
f. Határozza meg van-e a szövegben t betű!
g. Határozza meg található-e a szövegben „fa” szóösszetétel!
h. Adja meg hány magánhangzó van a szövegben!
2.13. A tömb
értékül, így mindig „elfelejti” az előzőt. Ezt a problémát egy új adattípussal lehet
megoldani. A tömb olyan adatszerkezet, amelynek elemei azonos típusúak lehet
nek. A tömb elemeire a tömb nevével és sorszámával hivatkozhatunk. A program
nyelvek többségében, így a C#-ban is a szögletes zárójelek közé kell írni az elem
sorszámát: tomb[2] , ahol tömb a tömb neve, a 2 pedig a sorszáma.
VIGYÁZAT!
A tömbök C#-ban mindig 0-tól kezdik az elemek sorszámozását, így az utolsó
sorszám az elemek száma - 1 lesz.
0. elem 1. elem 2. elem 3. elem 4. elem
A tömb deklarációja:
típus [ ] tömbnév = new típus [elemszám];
Például:
int [ ] a = new int [6]
18. feladat:
Állítsunk elő 20 egész számot a [-50,20] intervallumból és írjuk ki a képernyőre
2 sorba! írjuk ki a pozitív páros számokat! Ha ilyen nincs, akkor írjuk ki, hogy
„A számok között nincs pozitív páros szám”!
Név: Tömbl
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t [ ] t ömb = new i n t [ 2 0 ] ;
i n t i=0;
b o o l van = f a l s e ;
Random v s z = new R a n d o m O ;
C o n s o l e . W r i t e L i n e (" A 20 s z á m : 11) ;
C o n so le .W rite L in e ();
f ó r ( i = 0 ; i <= 1 9 ; i + +)
{
tomb[i] = vsz.Next (-50,21);
Programozási alapok
48
i f ( i % 10 = = 9) C o n s o l e .
W r i t e L i n e ( " { 0 , 6 } " , t ö m b [i ] ) ;
else
C o n s o l e . W r i t e ( " { 0 , 6 } " , t ö m b [ i ] );
}
C o n so le .W r ite L in e ();
fór (i = 0; i <= 1 9 ; i++)
{
if (tomb[i] % 2 = = 0 && t o m b [ i ] > 0 )
{
i f ( v a n = = f a l s e ) C o n s o l e . W r i t e L i n e (" A pozitiv
p á r o s számok: ");
C o n s o l e . W r i t e (" { 0 ,4 } ", tö m b [i ] ) ;
van=true;
19. feladat:
Töltsünk fel egy kétdimenziós tömböt véletlenszerűen a [-1 , 1 ] intervallumból 2
tizedes pontosságú számokkal! A tömbnek 4 sora és 7 oszlopa legyen! A sorok és
oszlopok végére írjuk ki az adott sor, ill. az oszlop összegét!
Név: Tömb2d
Megoldás:
static void M a i n ( s t r i n g [] args)
{
d o u b l e [ , ] tomb=new d o u b l e [ 4 , 7 ] ;
i n t i = 0, j = 0;
d o u b l e s o r O s s z e g = 0, o s z l o p o s s z e g = 0;
Random v s z = new R a n d o m ( ) ;
C o n s o l e . W r i t e L i n e ("1 2 3 4 5 6 7
s o r ö s s z e g " );
f ó r ( i = 0 ; i <= 3 ; i + + )
{
fór (j = 0; j <= 6 ; j++)
{
tömb [ i , j ] = v s z . N e x t ( - 1 0 0 , 1 0 1 ) ;
tömb [ i , j ] = tömb [ i , j ] / 100;
i f ( t ö m b [ i , j ] < 0 ) C o n s o l e . W r i t e (" { 0 : 0 . 0 0 }
", tömb [i , j ] ) ;
e l s e C o n s o l e . W r i t e (" {0:0.00} " , t ömb [ i , j ] ) ;
sorOsszeg + = t [ i , j l ;
}
if (sorOsszeg < 0) C o n s o l e . W r i t e L i n e
(" {0:0.00} ", s o r O s s z e g ) ;
P rogramozási alapok
50
else
C o n s o l e . W r i t e L i n e (" {0:0.00}”, sorO sszeg);
s o r O s s z e g = 0;
}
C o n s o l e . W r i t e L i n e () ;
f ó r ( j = 0 ; j <= 6; j + + )
{
fór (i = 0; i <= 3 ; i++)
{
oszlopOsszeg += t ö m b [i,j];
}
i f ( o s z l o p O s s z e g < 0) C o n s o l e . W r i t e
(” {0:0.00} ”, oszlopOsszeg);
else
C o n s o le .W rite (” {0:0.00} ” , oszlopOsszeg);
o s z l o p O s s z e g = 0;
}
C o n s o le . ReadKey();
}
A tömb feltöltése az egymásba ágyazott ciklusban történik. Figyelni kell a ciklusvál
tozók kezdő és végértékére, mert a tömbök esetében az indexelés 0-tól kezdődik.
Ha nem egész számot szeretnénk előállítani véletlenszerűen, akkor azt két lépésben
tehetjük meg. Először előállítjuk az egész számot a megfelelő intervallumban, de
double típusúként, majd osztjuk a megfelelő számmal.
Az osztás után azért van szükség az if-re, mert a kiíratásnál a számok csak akkor
kerülnek egymás alá a helyi érték szerint, ha figyelembe vesszük az előjelet is.
A sorOsszeg+=t[i,j]; ugyanazt jelenti, mint a sorOsszeg = sorOsszeg + t [ i , j ];
A C# a + = jelekkel egyszerűbben írja le a kifejezést.
Az oszlopösszeg kiszámításánál nem sor, hanem oszlopfolytonosan kell bejárni a
tömböt, ezért lett a j ciklus a külső, az i pedig a belső.
20. feladat:
Állítsunk elő ötös lottószámokat véletlenszerűen mindaddig, amíg azt a felhaszná
ló szeretné!
Név: Lottó
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t [] lsz = new i n t [ 5 ] ;
A GOTO UTASÍTÁS
51
i n t i = 0 , j=0;
char karakter=' ' ;
bool v o lt = true;
Random v s z = new R a n d o m O ;
C o n s o l e . W r i t e L i n e ( ,f A l o t t ó s z á m o k : 11) ;
do
{
f ó r ( i = 0 ; i <= 4 ; i + + )
{
if (i > 0)
{
do
l s z [ i ] = v s z . N e x t ( 9 0 ) + 1;
volt = false;
f ó r (j = 0; j < i ; j + +) i f (lsz[i] = =
lsz [j]) volt = true;
} while (volt = = t r u e ) ;
}
e l s e l s z [ i ] = v s z . N e x t ( 9 0 ) + 1;
C o n s o l e . W r i t e ( 11 { 0 , 5 } " , l s z [ i ] ) ;
}
k arak ter= 'n ';
C o n s o le .W r ite L in e ();
C o n s o l e . W r i t e ( " L e g y e n ú j s o r s o l á s ? ( i ) Más
b ille n ty ű re kilép! ");
karak ter= C o n v ert. ToChar(Console.ReadLine());
} w h i l e ( k a r a k t e r = = ' i ' );
}
A feladat megoldása során figyelembe kellett venni, hogy nem lehetnek azonos
számok a kihúzottak között. Ezért egy hátultesztelő ciklusban figyelni kellett az
esetleges ismétlődést, és ha volt, (volt = true) akkor újból elő kell állítani a számot.
A fór ciklusnak pedig mindig az aktuális számig kell végezni az összehasonlítást,
pl.: a 3. számot a 2-kal és az 1-vel kell összehasonlítani. Az if (i > 0) azért szüksé
ges, mert az 1. számot csak elő kell állítani, de összehasonlítani még nem kell.
A program a „lottószámok” szöveg kiírása után azonnal egy do ciklusba lép és
mindaddig ott is marad, amíg a k karakter típusú változó értéke T nem lesz. Ha
bármely más billentyűt kap értékül, akkor kilép a ciklusból és programból is.
A karakter típusú változót a char típus után kell megadni, az értékét pedig a ’ ’jelek
közé kell tenni.
P rogramozási alapok
52
A programot többször is le kell futtatni, tesztelni, hogy lássuk: valóban nincs is
métlődő szám. Erre viszont van egy olyan módszer, amely egyetlen futtatás során
is bizonyítja, hogy nem lehet 2 azonos szám a kihúzottak között. Ehhez csupán két
helyen kell megváltoztatni a programot.
Melyik az a két sör és mit kell változtatni?
21. feladat:
Kérjük be a másodfokú egyenlet együtthatóit, és számítsuk ki a gyököket 2 tizedes
pontossággal! Ha a diszkrimináns negatív, írjuk ki a képernyőre: ” Nincs megol
dás” ! Ha az a értéke 0, figyelmeztessük a felhasználót, és kérjük be újra az adatot!
Ha a felhasználó 3-nál többször hibázik lépjünk ki a programból!
Név: Másodfokú
Megoldás:
static void M a in (strin g [] args)
{
d o u b l e a = 0, b = 0, c = 0, d = 0, xl = 0, x2 = 0;
int hiba = 0;
C o n s o l e . W r i t e L i n e (" Másodfokú egyenlet gyökeinek
s z á m í t á s a : 11) ;
H ibakeresés, tesztelés
53
C o n s o le .W r i t e L i n e ();
do
} while ( a == 0 );
Console.Write(" b= ”);
b = Convert. ToDouble (Console. ReadLineQ)
Console.Write(" e= ”); <7 ?23msdőp5ed
c * Convert.ToDouble(Console.ReadLine())
Console.WriteLine();
if (d < 0 )
A fenti ábrán a 21. feladat megoldásának részlete látható, futás közbeni állapotában.
C#-ben utasításonként futtathatjuk a programunkat az F 11 billentyű segítségével,
ami nagy segítség lehet a tesztelés, hibakeresés során. A hibakeresés során még két
nagyon hasznos lehetőség áll rendelkezésünkre, amelyek igazán megkönnyítik a
munkánkat. Az egyik a töréspont elhelyezése, a másik pedig a nyomkövetés, a vál
tozók aktuális értékeinek megtekintése. Mindez az alábbiak szerint valósulhat meg:
A program kódjának tetszőleges sorában a sor elejére kattintva töréspontot hozunk
létre és megjelenik egy kis piros kör, ahol a program futása megáll. A töréspontok
ból igény szerint több is elhelyezhető a programban.
Ha tehát a programot futtatjuk a start gombra kattintva vagy az F5 billentyűvel,
akkor a program lefut a szokásos módon addig a sorig, amelyben a kis piros kör van.
H ibakeresés, tesztelés
55
Ezt követően a hibakeresés, vagy tesztelés során célszerű az FI 1-el áttérni az utasí
tásonként futtatásra és ezzel egy időben a bal alsó részen a Locals ablakban láthat
juk a programban használt eszközeink - többnyire a változók - aktuális értékét.
A futtatás során további segítség, hogy az éppen aktuális sor sárga háttérrel jelenik
meg és sor elején egy sárga, jobbra mutató nyíl látható.
Mindeközben láthatjuk a programunk futásának aktuális állapotát is.
Ezen lehetőségekkel nagyon könnyű az esetleges hibát, hibákat megkeresni és javí
tani, ill. a programot tesztelni
Gyakorló feladatok:
1. Készítsen programot, amely egy 10-es számrendszerbeli számot átvált 2-es
számrendszerbe!
2. Készítsen programot, amely egy 2-es számrendszerbeli számot átvált 10-es
számrendszerbe!
3. Egy tanuló 10 kérdésből álló tesztlapot tölt ki. Minden kérdésre a választ az abc
első 4 betűje (a, b, c, d) jelöli. Ismerjük a 10 kérdés helyes megoldását a
betűjelekkel megadva. Készítsünk programot, amely bekéri a tanulótól a felada
tonként! megoldásokat, majd meghatározza hány helyes válasza(pontja) volt a
tanulónak! Minden helyes válasz 1 pontot ér.
4. Bővítse az előző programot azzal, hogy csak a lehetséges tippeket fogadja el a
program a tanulótól.! (A válaszok csak a, b ,c, d lehet.).
5. Bővítse úgy a 3. feladatot, hogy több tanuló tölti ki a tesztet! A program kérdez
ze meg a tanulók számát és utána kérje be egyesével a tanulók válaszait!
6. A 3. feladatot bővítse tovább úgy, hogy az eredményt osztályozza is le a prog
ram! Az osztályozáshoz szükséges százalékok:
Százalékérték Érdemjegy
0-19% Elégtelen (1)
20-39% Elégséges (2)
40-59% Közepes(3)
60-79% Jó(4)
80-100% Jeles(5)
7. A 3. feladatot oldja meg úgy is, hogy a feladatok különböző pontszámot érje
nek! Számítsa ki az összpontszámot, a maximális összpontszámot, és a 6. fel
adat táblázata alapján végezze el az osztályozást!
P rogramozási alapok
56
using System;
using S y ste m .C o lle ctio n s.Generic;
using System.Linq;
using System Text;
namespace Radian
{
Program
{
static void Main ( s t r i n g a r g s )
{
d o u b le fok=0 r a d i a n = 0;
C o n s o le .W r it e L in e ();
C o n s o l e . W r i t e ( " K é r e m a r a d i á n t ")
ra d ia n = C o n v e rt. ToD ouble(C onsole. R ead L in e();
i f ( r a d i a n < 0) f o k = M a t h . A s i n ( - r a d i a n ) *
180 / M ath.Pl;
fok = Math.Asin (radian) * 180 / Pl;
C o n s o le .W r ite L in e ();
C o n s o l e . W r i t e L i n e ( "A r a d i á n s i n { 0 : 0 . 0 0 } f o k
és,fok);
C o n s o l e . W r i t e L i n e (" s i n {1:0.00} fok", 1 8 0 - f o k ) ;
C o n s o le .W r ite L in e ();
C o n s o le .W r i te L i n e ("V alam int cos {0:0.00} fok
é s", 90-fok);
C o n s o l e . W r i t e L i n e (" cos {0:0.00} fok",
360 - f o k ) ;
C o n s o l e . R e a d K e y () ;
57
3. PROGRAMOZÁSI TÉTELEK
3.1. Ö sszegzés
22. feladat:
Állítsunk elő véletlenszerűen 8 egész számot a [0 , 100]-ból, és írjuk ki a képer
nyőre 1 sorba! Számoljuk és írjuk ki a számok átlagát 3 tizedes pontossággal!
P rogramozási tételek
58
Név: Összegzés
Megoldás:
static void M a i n ( s t r i n g [] args)
{
int[] a = new i n t [ 8 ] ;
int összeg = 0, i = 0;
double atlag = 0;
Random v s z = new R a n d o m O ;
for (i = 0; i < 8; i++)
{
a[i] = v sz .N e x t (101);
ö s s z e g += a [ i ] ;
C o n s o l e . W r i t e ( w { 0 , 5 } ,f, a [ i ] ) ;
}
atlag = C o n v e rt. ToDouble(összeg) / 8;
C o n s o le .W r it e L in e ();
C o n s o l e . W r i t e L i n e (" A s z á m o k átlaga: {0:0.000}",
atlag);
C o n s o le .ReadKey();
}
Az összegzést az összeg += a[i]; -vei végeztük, amely teljes mértékben megegye
zik az osszeg=osszeg+a[i]; -vei.
Megszámoljuk, hogy hány adott tulajdonságú elem van a tömbben. Itt ajánlatos az
összegzésnél tanult módszerrel növelni a számláló értékét, vagy még egyszerűbben
a ++ jelet használni, mivel a számláló értéke egyesével nőhet csak.
23. feladat:
Állítsunk elő véletlenszerűen 12 egész számot a [ - 5 0 ,50]-ból, és írjuk ki a képer
nyőre 1 sorba! Számoljuk meg és írjuk ki, hogy hány negatív és hány pozitív szám
van köztük!
Név: Megszámolás
E ldöntés
59
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t [ ] a = new i n t [ 1 2 ] ;
i n t d b p o s = 0 , d b n e g = 0, i = 0;
Random v s z = new R a n d o m O ;
f ó r ( i = 0; i < 1 2 ; i + + )
{
a [ i ] = v s z . N e x t ( - 5 0 , 51) ;
i f ( a [ i ] > 0) d b p o s + + ;
i f (a [ i ] < 0) d b n e g + + ;
C o n s o l e . W r i t e ( " { 0 , 5 } " , a [i ] );
}
C o n s o le .W r i t e L i n e ();
C o n s o l e . W r i t e L i n e (" {0} db p o z i t í v szám v a n . " ,
dbpos);
C o n s o l e . W r i t e L i n e (" {0} db negatív s z á m v a n . 11,
dbneg);
C o n s o le .ReadKey();
}
A megszámolás a két if-es sorban történik a ++ jel felhasználásával, amelynek
eredménye: ha igaz a logikai kifejezés, akkor növeljük dbpo,s ill. dbneg értékét
eggyel.
3.3. Eldöntés
Az algoritmus eldönti, hogy van-e a tömbben adott tulajdonságú elem. Amint talál
egyet, a ciklus leáll. Feltételezve, hogy a megoldáshoz ciklusra van szükség.
A 15-ös feladatban pontosan ez történt, hiszen egy adott számról kellett eldönteni,
hogy az prímszám-e vagy sem. A döntés eredményét pedig kiírtuk a képernyőre.
24. feladat:
Állítsunk elő véletlenszerűen 6 egész számot a [ 0 , 50]-ból, és írjuk ki a képernyő
re 1 sorba! írjuk ki, hogy van-e 3-mal osztható szám!
Név: Eldöntés
P rogramozási tételek
60
Megoldás:
static void M a in (s trin g [] args)
{
i n t [ ] a = new i n t [ 6 ] ;
i n t i = 0;
b o o l van = f a l s e ;
Random v s z = new Random ( ) ;
f o r ( i = 0 ; i < 6; i + + )
{
a [i ] = v s z . N e x t (51);
C o n s o l e . W r i t e ( 11 { 0 , 5 } 11, a [i ] ) ;
i = 0;
do
i f ( a [ i ] % 3 = = 0) v a n = t r u e ;
i++;
} w h i l e ( v a n = = f a l s e && i < 6 ) ;
C o n s o le .W r i t e L i n e ();
i f ( v a n ) C o n s o l e . W r i t e L i n e (" Va n 3 - m a l osztható
s z á m . 11) ;
C o n s o le .ReadKey();
3.4. Kiválasztás
25. feladat:
Állítsunk elő véletlenszerűen 10 egész számot a [ - 5 0 ,50]-ból, és írjuk ki a képer
nyőre 1 sorba! írjuk ki az 1. pozitív szám értékét és indexét, ha van ilyen! Ha nincs,
írjuk ki, hogy „Nincs pozitív szám” !
Név: Kiválasztás
Megoldás:
M aximum - ( minimum ) kiválasztás
61
26. feladat:
Állítsunk elő véletlenszerűen 5 egész számot a [0 , 500]-ból, és írjuk ki a képer
nyőre 1 sorba! írjuk ki a legnagyobb számot a képernyőre!
Név: Maximumkiválasztás
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t [ ] a = new i n t [ 5 ] ;
i n t i = 0, max =0 ;
Random v s z = new R a n d o m O ;
f ó r ( i = 0; i < 5; i + + )
{
a [i ] = v s z . N e x t (501) ;
C o n s o l e . W r i t e ( 11 { 0 , 5 } " , a [i] ) ;
}
ma x = a [ 0 ] ;
f ó r ( i = 1; i < 5; i++)
{
if (a[i]>max) max=a[i];
}
C o n s o le .W r i t e L i n e ();
C o n s o l e . W r i t e L i n e (" A l e g n a g y o b b s z á m : {0}",max);
C o n so le .ReadKey();
}
írjuk át a programot úgy, hogy a legkisebb számot válasszuk és írjuk ki!
Mely sorokat kell átírni és hogyan?
M aximum - ( minimum ) kiválasztás
63
27. feladat:
Kérjünk be 5 karaktert és írjuk ki az angol ABC szerinti elsőt!
Név: Minimumkiválasztás
Megoldás:
Gyakorló feladatok:
1. Egy futóversenyre egyesületenként jelentkeztek a versenyzők. Az egyesületek
megadják hány versenyzőt neveznek. Határozzuk meg az egyesületek számá
nak ismeretében hány induló lesz a versenyen!
2. 12 hónapon keresztül spóroltunk. Minden hónapban változó összeget félretet
tünk. Az összegek ismeretében adja meg, mennyi pénzünk van! Mekkora
összegünk lesz, ha a megtakarításunkat 3 hónapra lekötjük, évi 10,5%-os ka
mat mellett?
3. Adott egy tekéző sorozata (melyik fordulóban hány fát ütött). írjunk progra
mot, amely meghatározza a versenyző összesített eredményét!
4. Egy horgászverseny adatait egy táblázatban tároljuk. A horgászok száma 6, a
fogható halfajok száma 8. A táblázat 1 cellája M(i,j) azt jelenti, hogy az i hor
gász a j halfajból mennyit fogott.
a. írjunk programot, amely kiszámítja, hogy a horgászok összesen hány halat
fogtak az egyes halfajokból!
b. írjunk programot, amely meghatározza, hogy az egyes horgászok hány
halat fogtak összesen!
5. 12 napig megmértük a napi csapadék mennyiséget. Határozzuk meg mennyi
eső esett összesen!
6. Egy labdarúgó bajnokságban tudjuk minden csapatról hogy hányszor győzött
és hányszor játszott döntetlent. Adjuk meg, melyik csapatnak hány pontja van
(győzelem 3 pont, döntetlen 1 p o n t)!
7. Ismerjük 9 autó fogyasztását. Döntsük el, hogy minden autó 10 liter alatt fo-
gyasztott-e?
8. Egy halgazdaság próbafogást végez. Minden hal súlyát és hosszát tárolják.
A vizsgát halak száma 14. Készítsen programot amely:
a. Megadja a halak összsúlyát, és az átlagos hosszúságot!
b. Megadja azon halak számát, amelyek 70 dkg-nál nagyobbak!
c. Megadja azon halak számát, amelyek 50 dkg-nál nagyobbak és 28 cm-nél
hosszabbak!
d. Van-e 2 kg-nál nagyobb hal?
e. Van-e a kifogott halak között olyan, amelyik 40 dkg alatti?
f. Mekkora a mérete a legkisebb súlyú halnak?
g. Mekkora a súlya a legnagyobb méretű halnak?
Az adatokat beírhatja a programba (legegyszerűbb módszer), bekérheti billen
tyűről (időigényes az adatbeírás), vagy előállíthatja véletlenszerűen (érdekes
eredmények lehetnek pl. nagy súly, kis hossz vagy fordítva).
M aximum - ( minimum ) kiválasztás
65
3.6. Kiválogatás
Kiválogatásról beszélünk, ha egy tömb elemi közül kiválogatunk egy vagy több
feltételnek megfelelő elemeket. Ezeket az elemeket kiírhatjuk a képernyőre, vagy
elhelyezhetjük egy másik tömbben.
28. feladat:
Állítsunk elő véletlenszerűen 15 egész számot a [0-100]-ban, és írjuk ki a képer
nyőre 1 sorba! írjuk ki és tegyük egy másik tömbbe az 5-el osztható számokat!
Név: Kiválogatás
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t [ ] a = new i n t [15];
i n t [ ] b = new i n t [15];
int i = 0 , j = 0 , d b =0 ;
Random v s z = new RandomO;
f ó r ( i = 0; i < 15; i++)
{
a [i ] = v s z . N e x t (101);
C onsole.W r ite ("{0,5}", a [i ] ) ;
i f (a [ i ] % 5 = = 0)
{
b [db] = a [i ] ;
db++;
S zétválogatás
67
}
}
Console.WriteLine() ;
Console.WriteLine(" Az öttel osztható számok: ");
fór (j = 0; j < db; j++) Console.Write ("{0,5 }",
b[j] );
Console.ReadKey() ;
}
A b tömböt azért kell ugyanolyan méretűre deklarálni, mert elvileg előfordulhat olyan
eset is, amikor mind a 15 szám öttel osztható lesz. Bármilyen kicsi is ennek a valószí
nűsége, a programot úgy kell megírni, hogy minden esetben működőképes legyen.
3.7. Szétválogatás
29. feladat:
Állítsunk elő véletlenszerűen 15 egész számot a [0-100]-ban, és írjuk ki a képer
nyőre 1 sorba! Válogassuk szét 3 különböző tömbbe a kettővel osztható, a kettővel
nem, de hárommal osztható és az egyéb számokat, majd írjuk ki a tömbök tartalmát
egymás alá!
Név: Szétválogatás
Megoldás:
static void Main(string[] args)
{
int[] a = new int[15];
int[] kettő = new int[15];
int[] három = new int[15];
int[] egyeb = new int[15];
int i = 0 ,j = 0 , dbketto = 0 , dbharom = 0 ,
dbegyeb =0 ;
Random vsz = new Random();
fór (i = 0; i < 15; i++)
P rogramozási tételek
68
30. feladat:
Legyen adott egy 8 elemű tömb, amelyben lineáris kereséssel állapítsuk meg a
keresett szám indexét és írjuk ki a képernyőre! Ha a keresett szám nincs a tömbben,
írjuk ki, hogy nincs benne!
Név: Lineáris keresés
Megoldás:
static void Main()
{
i n t [ ] t ö m b = { 4 , 5 , 1 5 , 9, 4 , 2 , 11 , 2 };
i n t n = tomb.Length;
i n t k e r e s e t t S z a m = 9; / / K e r e s e t t é r t é k
i n t i = 0;
w h i l e ( i < n && t o m b [ i ] != k e r e s e t t S z a m )
i++;
i f ( i < n)
C o n s o l e . W r i t e L i n e ( "A k e r e s e t t s z á m i n d e x e :
{0}", i ) ;
else
C o n s o l e . W r i t e L i n e ( " A k e r e s e t t szám n i n c s b en n e
a töm bben” );
C o n s o le .ReadKey();
}
Az elöltesztelő ciklus mindaddig növeli az i változó értékét, míg az kisebb, mint a
tömb elemszáma és a keresett szám nem egyezik meg a tömb aktuális elemének
értékével. Ha megegyezik a szám a keresett értékkel, akkor a ciklus nem fut le, az
i értéke nem nő és mivel nyilvánvalóan igaz, hogy az i kisebb, mint az elemszám,
ezért kiírja az indexet.
Ha viszont a ciklus azért fejeződik be, mert az i értéke elérte az elemszámot, akkor
az elágazás else ága fut le.
3.9. Rendezés
Két egymásba ágyazott fór ciklus segítségével rendezzük az elemeket. A külső ciklus
2-től az utolsó előtti elemig, a belső az aktuális elem+1 indexétől az utolsóig megy.
A ciklusban összehasonlítja az elemeket, és ha a sorrend rossz, akkor megcseréli őket.
Ciklus i= 1-től n-l-ig
Ciklus j=i+1-től n-ig
Ha a[i]>a[j] akkor csere
Látható, hogy a j ciklus lefutásakor mindig az első helyre kerül a legkisebb szám.
Az i=3 esetén a 45-öt hasonlítjuk a 63-mal, (itt jó a sorrend) majd a 44-el, ahol
viszont rossz a sorrend, ezért cserélünk.
Az új sorrend: 12, 23, 44, 63, 45.
Az i=4 esetén j=5 lesz, vagyis az utolsó előtti elemet hasonlítjuk az utolsóval.
Mivel a sorrend rossz, ezért cserélni kell a[4]=45 és a[5]=63.
A végső sorrend: 12, 23, 44, 45, 63. Ez már valóban növekvő sorrend.
Csökkenő sorrendet a „ha a[i]<a[j] akkor csere” módon állíthatunk elő maximum
kiválasztásos módszerrel.
Az algoritmus működése most már egyértelmű, de maradt még egy kérdés mielőtt
a programot megírnánk: hogy lehet 2 elemet megcserélni?
Úgy, ahogy 2 pohár tartalmát megcserélnénk a valóságban. Kell egy 3. üres pohár
ideiglenesen.
A kávét átöntjük az üres pohárba (1), a helyére a teát töltjük (2), majd a tea helyé
re az ideiglenes pohárból a kávét öntjük (3). A csere tehát megtörtént.
Programozásban ez így néz ki:
s=a[j];
aLj]=a[i];
a[i]=s;
P rogramozási tételek
72
31. feladat:
Állítsunk elő véletlenszerűen 5 egész számot a [0 , 100]-ból, és írjuk ki a képer
nyőre 1 sorba! Rendezzük növekvő sorrendbe a számokat, és írjuk ki a képernyőre!
Név: Rendezési
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t [] a = n e w i n t [ 5 ] ;
int i = 0 , j = 0 ;
Random v s z = new R a n d o m ( ) ;
C o n s o l e . W r i t e L i n e (" A számok
fór ( i = 0; i < 5; i++)
{
a [i ] = v s z .N e x t (101);
Console.W rite ("{0,5}", a [i ] ) ;
}
fór ( i = 0; i < 4; i++)
f ó r (j = i + 1 ; j < 5; j + + ) if (a[i] > a [ j ])
{
i n t s= a [i ];
a [i ] = a [j ] ;
a [j ] = s ;
}
C o n so le .W rite L in e ();
C o n s o l e . W r i t e L i n e (" A számok r e n d e z v e : " ) ;
fór ( i = 0; i < 5; i++) C o n so le.W rite ("{0,5}",
a[i] ) ;
C onsole.R eadK ey();
}
A programban kihasználtuk azt a C# által biztosított lehetőséget, hogy egy változót
csak akkor deklarálunk, amikor azt a programban először használjuk. De az eddig
megszokott módon, a program elején is deklarálhattuk volna az s-t.
A rendezési algoritmus azonban nem minden típus esetén működik a C#-ban. Egyes
programnyelvekben a karakter típusnál látható ASCII kód alapján a szöveg típusú
változókat is sorbarendezhetjük az eddig tanult módon. C#-ban ez nem működik,
mivel a < és > relációs jel szöveg típusú változókra nem értelmezhető (mint később
látni fogjuk: van mód szöveg típusú változók összehasonlítására a CompareTo-val).
A C# viszont egy tömbökre alkalmazható rendezési utasítást épített be az Array.
Short(tömb) néven. Alkalmazását a következő feladat mutatja be.
R endezés
73
32. feladat:
Kérjünk be 5 nevet és rendezzük ABC szerint sorrendbe!
Név: Rendezés2
Megoldás:
static void M a i n ( s t r i n g [] args)
s t r i n g [ ] n é v = new s t r i n g [ 5 ] ;
i n t i = 0;
C o n s o l e . W r i t e L i n e ( 11 K é r e m a n e v e k e t : 11) ;
f ó r ( i = 0 ; i < 5; i + + ) n é v [ i ] = C o n s o l e . R e a d L i n e ( ) ;
Array.Sort(név);
C o n s o le .W r ite L in e ();
C o n s o l e . W r i t e L i n e (" A nevek re n d e z v e :" );
f ó r ( i = 0; i < 5; i + + ) C o n s o l e . W r i t e L i n e ( " { 0 , 5 ]
n é v [ i ] );
C o n so le . ReadKey();
33. feladat:
Állítsunk elő véletlenszerűen 5 egész számot a [0 , 100]-ból, és írjuk ki a képer
nyőre 1 sorba! Rendezzük növekvő sorrendbe a számokat és írjuk ki a képernyőre!
Név: Rendezés3
P rogramozási tételek
74
Megoldás:
static void M a i n ( s t r i n g [] args)
{
i n t [] a = n e w i n t [ 5 ] ;
i n t i = 0;
bool v o ltcsere = false;
Random v s z = new R a n d o m ( ) ;
C o n s o l e . W r i t e L i n e (" A számok :");
f ó r ( i = 0; i < 5; i + + )
{
a [i ] = v s z . N e x t (1 0 1 );
C o n so le .W rite("{0,5}", a [i ] );
}
do {
voltcsere = false;
f ó r ( i = 0 ; i < 4; i++) if (a [ i ] > a[i+l])
{
i n t s = a [i] ;
a [ i ] = a [i + 1 ];
a [ i + l ] = s;
voltcsere=true;
}
}while ( v o l t c s e r e ) ;
C o n so le .W rite L in e ();
C o n s o l e . W r i t e L i n e ( 11 A számok r e n d e z v e : " ) ;
fór ( i = 0; i < 5 ; i + + ) C o n s o l e . W r i t e ( " { 0 , 5 }" ,
a [i ] ) ;
C o n s o le .ReadKey();
Gyakorló feladatok:
1. Adott egy 10 elemű számsorozat. Rendezzük a számokat növekvő sorrendbe,
majd kérjünk be egyenként további számokat, és döntsük el róluk megtalálha-
. tóak-e az eredeti 10 szám között! Amennyiben van ilyen szám, mondja meg
hogy hányadik, különben írja ki, hogy nincs. Az új számokat addig kérje be,
míg egymás után kétszer 0-át adunk meg.
2. Az iskolában egyéni és összetett versenyt tartottak. A versenyben összesen
20 tanuló vett részt. A versenyek száma 8. Ismerjük versenyenként a diák nevét
és pontszámát. Összetett versenybe csak az indulhat, aki az összes egyéni ver
senyben indult, és elérte a versenyenként megadott minimális pontszámot.
a. Adjuk meg az egyéni versenyek rangsorát!
b. Adjuk meg az összetett versenyben értékelendő tanulók számát!
R endezés
75
4. ALPROGRAMOK ÉS FÁJLKEZELÉS
Az első program megírása előtt egy fontos szabály betartására hívtuk fel a figyel
met: Mindig csak a
static void M ain(string[] args)
4.1. Eljárások
Ha hosszú programot kell írnunk, érdemes a programot részekre tagolni, így átte
kinthetőbb lesz a munkánk, nem kell mindent a main után bezsúfolni. A program
több pontjáról is hivatkozhatunk egy eljárásra, így azt elég egyszer megírni.
Amikor pl. számokat állítunk elő véletlenszerűen, majd kiíratjuk a képernyőre
később rendezve is szeretnénk kiírni, akkor a kiíratást célszerű eljárásban megírni,
és hivatkozni rá mindkét esetben. Az eljárások részfeladatokat láthatnak el: kiírást,
rendezést, keresést stb. Az eljárásra a programban a nevével hivatkozhatunk, amely
után () -eket kell tenni. A zárójelek között lehetnek paraméterek.
E ljárások
77
Az eljárásnak van
• neve (ez egy azonosító),
• visszatérési értéke, amely csak void lehet,
• törzse, amely tartalmazza az utasításokat,
• és lehetnek paraméterei.
Az eljárást a static void Main(string[] args) elé vagy után is tehetjük.
Például:
static void eljarasNev()
{
U tasitások
}
eláss Program
{
static i n t a=0;
static v o i d M a i n ( s t r i n g [] args)
{
U tasitások
E l j á r á s ();
}
A lprogramok és fájlkezelés
78
static void E l j á r á s ()
{
a=10;
34. feladat:
Kérjük be a legközelebbi születésnap dátumát (év, hó, nap), majd írjuk ki, hogy
hány nap van még a születésnapig és az év végéig! Használjunk eljárásokat az
adatbekéréshez és a kiíratáshoz!
Név: napok
Megoldás:
namespace napok
{
class Program
{
static DateTime evVege, szulN ap;
static i n t ev, ho, nap;
static v o i d a d a t b e k e r e s ()
{
C o n s o l e . W r i t e (" é v
ev = C o n v e r t . T o I n t 3 2 (C o n so le . R e a d L in e ( ) ) ;
C o n s o l e . W r i t e (" h ó n a p : " ) ;
ho = C o n v e r t . T o I n t 3 2 ( C o n s o l e . R e a d L i n e ( ) ) ;
C o n s o l e . W r i t e (" n a p : " ) ;
nap = C o n v e r t . T o I n t 3 2 ( C o n s o l e . R e a d L i n e ( ) ) ;
}
static void kiiratas()
{
D a t e T i m e m a i D a t u m = D a t e T i m e . Now;
e v V e g e = new D a t e T i m e ( 2 0 1 7 , 12, 3 1 ) ;
C o n s o l e . W r i t e L i n e (" A m a i d á t u m é s i d ő :
{0 }" , m a i D a t u m ) ;
C o n s o l e . W r i t e L i n e (" Év v é g é i g {0} n a p v a n
m ég", e v V eg e. S u b t r a c t (m aiDatum). Days);
C o n s o l e . W r i t e L i n e (" A s z ü l i n a p i g {0} n a p v a n
még", szu lN a p . S u b t r a c t (maiDatum). D ays);
E ljárások
79
}
static void M a i n ( s t r i n g [] args)
{
C o n s o l e . W r i t e L i n e (" K é r e m a l e g k ö z e l e b b i szüli-
nap dátumát ");
a d a t b e k e r e s ();
s z u l n a p = new D a t e T i m e ( e v , h o , n a p ) ;
k i i r a t a s ();
C o n s o le .ReadKey();
}
}
}
Azokat a változókat, amelyeket az eljárásokban is szeretnénk használni, már köz
vetlenül a eláss után deklaráltuk. Az evVege és a szulNap két dátum típusú válto
zó, amelyet a programban bárhol használhatunk.
A szulnap = new DateTime(ev, ho, nap); segítségével létrehoztuk a változó egy
konkrét példányát.
A maiDatum változót csak a kiiratas eljárásban használjuk, ezért itt deklaráltuk, de
megtehettük volna program elején is. A DateTime maiDatum = DateTime.Now; dek
larálja a maiDatum nevű változót, és kezdőértékként beállítja a mai nap dátumát a
now-val. Az év végének konkrét értéket adunk meg (ha már nem 2017-et írunk, ak
kor azt értelemszerűen lehet változtatni), majd az ewege.Subtract(maiDatum).Days
kifejezéssel megadja a maiDatum és az evVege közti különbséget napokban. Két
dátum között eltelt időt számolhatunk órákban (Hours), percekben (Minutes), má
sodpercekben (Seconds), sőt akár ezredmásodpercekben (Milliseconds) is, ha a
Days helyett a zárójelben lévő utasítások valamelyikét írjuk.
35. feladat:
Kérjünk születési dátumot (órára pontosan) majd számoljuk és írjuk ki, hogy hány
napos és hány órás az illető! A kiírásnál használjuk a könnyebb olvashatóság miatt
a hármas tagolást (ezres csoportosítást)!
Név: szülinap
Megoldás:
namespace szülinap
{
eláss Program
{
static int i 0;
A lprogramok és fájlkezelés
80
static void v i s s z a F o r d i t K i i r ()
{
f o r (i = s l . Length - 1; i >= 0 ; i— ) Console.
W rite(sl [ i ] ) ;
}
static void M a i n ( s t r i n g [] args)
{
D a t e T i m e s z u l N a p = new D a t e T i m e ( ) ;
i n t e v , h o , n a p , o r a , p e r c , mp, o r a s z a m ;
C o n s o l e . W r i t e (" K é r e m a s z ü l e t é s i é v e t : " ) ;
ev = C o n v e r t . ToI n t 3 2 ( C o n s o l e . R e a d L i n e ( ) ) ;
C o n s o l e . W r i t e (" K é r e m a h ó n a p o t : " ) ;
ho = C o n v e r t . T o I n t 3 2 ( C o n s o l e . R e a d L i n e ( ) ) ;
C o n s o l e . W r i t e ( 11 K é r e m a n a p o t : " ) ;
nap = C o n v e r t . T o I n t3 2 ( C o n s o le .R e a d L in e ( ) ) ;
C o n s o l e . W r i t e (" K é r e m a z ó r á t : " ) ;
ora = C onvert.ToInt32(C onsole.ReadLine());
p e r c = 0;
mp = 0 ;
s z u l N a p = ne w D a t e T i m e ( e v , h o , n a p , o r a , p e r c , mp);
s z ö v e g = C o n v e r t . T o S t r i n g ( D a t e T i m e . Now.
Subtract(szulN ap).D ays);
f o r d i t ();
s z o k o z ();
E ljárások
81
C o n s o l e . W r i t e (" E n n y i n a p o s v a g y : " ) ;
v i s s z a F o r d i t K i i r () ;
C o n s o l e . W r i t e L i n e () ;
oraSzam = C o n v e r t . T o I n t 3 2 (M ath.Round(DateTime.
N o w .S u b tr a c t( s z u l n a p ) . T o ta lH o u rs ));
szöveg = C o n v ert.T oS tring(oraszam );
f o r d i t ();
szokoz ();
C o n s o l e . W r i t e (" E n n y i ó r á s v a g y : " ) ;
v i s s z a F o r d i t K i i r ();
C o n so le.ReadKey();
}
A főprogramban elvégeztük az adatbekérést, de a percet és másodpercet 0-nak
vesszük, mivel nem valószínű, hogy valaki tudja ilyen pontossággal a születési
idejét. Dátum típust viszont vagy napra, vagy másodpercre pontosan lehet csak
használni a C#-ban, tehát ha az órákat is tudni akarjuk pontosan, akkor fel kell
venni a perceket és másodperceket is.
Az szöveg = Convert.ToString(DateTime.Now.Subtract(szulNap) sorban
szöveggé alakítjuk a jelenlegi időpont (DaíeTime.Now) és a születés (szulNap)
között eltelt időt napokban számolva.
A program nehezebb része azonban a kiíratás tagolásában rejlik. Több módszer
közül választhatunk. Az egyik a programban látható: először megfordítjuk az s
sztringet és hátulról, azaz jobbról balra haladva egy ciklusban minden 3. karakter
után beillesztünk egy szóközt. A fordit eljárásban az szovegl-be kerül a szöveg
szöveg fordítottja, a szokoz eljárásban pedig beillesztjük a megfelelő helyekre a
szóközöket. A visszaForditKiir eljárásban pedig az szovegl-et írjuk ki fordítva,
most már szóközökkel a megfelelő helyeken.
A 3 eljárást kétszer is meg kell hívni, mivel a napok és az órák esetén is ugyanazt
a problémát kell megoldani a kiírásnál.
Eddig csak olyan eljárásokkal foglalkoztunk, amelyeknek nem voltak paraméterei,
ha viszont az eljárás kimenő adatokat is előállít, akkor szüksége van bemenő ada
tokra, paraméterekre is. Vannak tehát olyan esetek, amikor szükség van az eljárás
és a főprogram, vagy az eljárások között paraméterek, adatok átadására. Ilyenkor
a főprogramban az eljárás neve után zárójelben meg kell adni azoknak a változók
nak a nevét vesszővel elválasztva, amelyeket paraméterként akarunk átadni. Az
eljárásban pedig az eljárás neve után, az eljárás „fejrészében” zárójelben megadjuk
a változók típusát és nevét.
A lprogramok és fájlkezelés
82
36. feladat:
Jók-e az alábbi paraméterlisták:
Aktuális paraméterlista Formális paraméterlista Jó Nem jó
int a = 0, f = 0; (a, f) (int d, int b)
int x = 0; double y = 0; (x, y) (int x, int y)
string a = ” ” ; int y = 0; (a, y) (string név, int y)
char k = ’ ’ ; bool v = true; (k, v) (string k, bool v)
double x = 0; byte y = 0; (x, y) (int x, byte y)
string x = ” double y = 0; (x, y) (char x, double y)
int x = 0; string szó = 0; (x, szó) (int a, string szöveg)
bool x = 0; double y = 0; (x, y) (bool x, double z)
E ljárások
83
Paraméterátadás:
C#-ban a paraméter átadása kétféle módon történhet.
1. Referencia szerint
2. Érték szerint
A kulcsszó dönti el, hogy melyik alapján történik a paraméterátadás.
Érték szerinti paraméter átadás:
Érték szerinti átadásnál valójában csak az eredeti változó egy másolatát adjuk át.
Ilyenkor mindent érték szerint adunk át, ezért nincs kulcsszó.
Pl.: eljaras(a,b);
Referencia szerinti paraméter átadás:
Referencia szerinti átadásnál a ref vagy az out kulcsszót kell használnunk.
Ekkor a ref kulcsszót kell a változó neve előtt megadni, ill. az alprogram fejrészé
ben a változó típusa és neve előtt.
Ebben az esetben változókat átadhatunk úgy is az alprogramnak, hogy később az
itt kiszámolt (előállított) értékeket a főprogramban is tudjuk majd használni.
37. feladat:
Számolja ki egy henger felszínét és térfogatát, majd írja ki a képernyőre 3 tizedes
pontossággal! A kör területét és kerületét eljárásban számítsa ki, majd adja vissza
a kiszámolt értékeket a főprogramnak!
Név: Henger
Megoldás:
namespace Henger
{
eláss Program
{
s t a t i c void kor(double r, r e f double t, ref double
k) / / ( o u t d o u b l e t , o u t d o u b l e k)
{
II k = 0;
// t = 0;
t=r*r*M ath.P l;
k =2 * r *M a t h . P I ;
}
static void M a i n ( s t r i n g [] args)
A lprogramok és fájlkezelés
84
d o u b l e r = 0, m = 0 , V = 0, A = 0 , t = 0 , k
= 0; IIt , k ;
C o n s o le .W r i te ( " K é r e m az a l a p s u g a r á t : " ) ;
r= C onvert.ToDouble(Console.R eadLine());
C o n s o l e . W r i t e ("Kérem a m a g a s s á g o t : " ) ;
m = C o n v e r t . T o D o u b l e ( C o n s o l e . R e a d L i n e ()) ;
kor(r, ref t, ref k ); / / kor(r, out t, out k );
V = t * m;
A= 2 * t + k * m ;
C o n s o l e . W r i t e L i n e (" A h e n g e r t é r f o g a t a :
{0:0.000}",V);
C o n s o l e . W r i t e L i n e (" A h e n g e r f e l s z í n e :
{0:0.000}", A );
C o n s o le .ReadKey();
4.2. Függvények
38. feladat:
Állítson elő 8 egész számot a [0 ; 100]-ban, és írja ki őket egy sorba! Egy függvény
segítségével számolja ki a számok átlagát és írja ki 2 tizedes pontossággal!
Név: Átlag
Megoldás:
namespace Átlag
{
eláss Program
{
static i n t i = 0;
static d o u b l e a t l a g F u g g v e n y ( i n t [] a)
{
d o u b l e ö s s z e g = 0 , a t l a g = 0;
f ó r ( i = 0; i < 8; i + +) ö s s z e g = ö s s z e g + a[i];
a tla g = C o n v ert. ToDouble(összeg / i ) ;
return atlag;
}
s ta tic v o id M a i n ( s t r i n g [] args)
{
i n t [] a = n e w i n t [ 8 ] ;
Random s z a m o k = new R a n d o m ( ) ;
A lprogramok és fájlkezelés
39. feladat:
Kérje be egy másodfokú egyenlet együtthatóit, és számolja ki a [-6 , 6]-bán az
egész x értékekhez tartozó függvényértékeket és írja ki a képernyőre egy sorba az
x értékeit és alá a megfelelő y értékeket!
Az együtthatók értéke a [-5 , 5]-bán legyen! Használjon függvényeket az adatbe
kéréshez és a függvényérték számításához!
Név: Függvényérték
Megoldás:
namespace Függvényérték
{
eláss Program
{
static double függvény (double a, double b, double c,
double x)
{
double y = 0;
y = a * x * x + b * x + c;
return y;
}
sta tic void M ain (strin g[] args)
{
double a = 0, b = 0, c = 0;
F üggvények
87
int x=0;
Console.Write (" Kérem az a értékét: ");
a = b e k e r ();
Console .Write (11 Kérem az b értékét: ");
b = b e k e r ();
Console.Write (" Kérem az c értékét: ");
c = b e k e r ();
for (x = -6; x < 7; x++) Console.W r i t e ("{0,5}",x ) ;
Console.WriteLine();
for (x = -6; x < 7; x++) Console .Write ("{ 0,5 }",
függvény(a, b, c, x ) );
Console.ReadKey();
}
static double b e k e r ()
double adat = 0;
do {
adat = Convert.ToDouble(Console.ReadLine()) ;
} while (adat>5 || adat<-5);
return adat;
Gyakorló feladatok:
1. írjunk olyan függvényt, amely egy gömb térfogatát számolja ki!
2. Készítsünk függvényeket, amelyek téglalap területét és kerületét számítják ki!
3. Készítsünk olyan függvényt, amely egy szám négyzetét, köbét, és negyedik
hatványát adja vissza!
4. Készítsünk függvényt, amely eldönti, hogy a paramétere páros vagy páratlan
természetes szám!
A lprogramok és fájlkezelés
88
5. írjunk olyan programot, amely bekér egy mondatot, és kiírja úgy, hogy minden
szavának kezdőbetűjét nagybetűvé alakítja!
6. írjunk olyan programot, amely bekér egy mondatot, és kiírja minden második
karakterét!
7. Készítsünk olyan programot, amely bekér egy karaktersorozatot, és minden
karakterét megduplázza!
8. írjunk olyan programot, amely bekér egy karaktersorozatot, és ha a hossza
páratlan, akkor írja ki a középső karakterét, ha páros, akkor írja ki a karakter-
sorozatunk első felét!
9. Kérjünk be egy karaktersorozatot a billentyűzetről és írjunk olyan függvényt,
amely megszámolja és kiírja a előforduló ‘e’ és ‘i’ betűk számát!
10. Kérjünk be egy karaktersorozatot a billentyűzetről, és írassuk ki magánhang
zók nélkül egy függvény segítségével!
11. írjunk olyan programot, amely bekér egy karaktersorozatot, és írassuk ki any-
nyiszor, ahány ‘a’ betű van benne!
12. írjunk olyan programot, amely bekér egy karaktersorozatot, és kiíratja az első
előforduló ”sz” karaktersorozattól kezdődően!
4.3. Fájlkezelés
4.3.1. Hibakezelés
40. feladat:
Állítsunk elő véletlenszerűen 5 egész számot a [0,100]-ból, majd írjuk ki a számo
kat a képernyőre és a háttértárolóra a program BIN/DEBUG könyvtárába!
Név: Fájlbaír
Megoldás:
u s i n g System;
using S y ste m .C o lle c tio n s.Generic;
using System.Linq;
u s i n g S y s t e m . 10;
using System.Text;
namespace F á j l b a i r
{
class Program
A lprogramok és fájlkezelés
90
Láthatjuk, hogy a usingok között most már felsoroltuk a I/O műveletekhez szüksé
ges using System.IO-t is.
A string fajlNev = ’’szamok.txt”; sor megadja a háttértárolón megjelenő fájl nevét
és elérési útvonalát. Ha elérési út nincs megadva, akkor a BIN/DEBUG könyvtár
ban jön létre a fájl. Ez lesz a fizikai fájl neve.
A StreamWriter ir = null; sorban megadjuk a logikai fájl nevét és egyben beállít
juk a kezdőértékét, amely egy üres fájl lesz.
Az ir = new StreamWriter(fajlNev); sorban egymáshoz rendeljük a fizikai és lo
gikai fájlokat. Az alatta lévő sorban pedig egy fór ciklussal az ir.Write(”{0,4}”,
a[i]); segítségével kiírjuk a szamok.txt-be a számokat egy sorb
lalva egy számnak.
Az ir.Close(); pedig bezárja az ir logikai fájlt.
Fájlkezelés
91
Mivel a háttértárra írás a try blokkban van, ezért ha a kiírás során hiba lépne fel,
akkor a catch (IOException) segítségével a hibát kezeljük és kiírjuk a képernyőre
a hiba jellegét.
Mint láthatjuk a fájlba írás ugyanúgy történik, mint a képernyőre írás, de itt a
Console helyett a logikai fájl nevét adjuk meg.
A fájlba írás után nézzük meg a fájlból olvasást. Szinte mindent úgy kell csinálni,
mint az írás során, de értelemszerűen a Write vagy WriteLine helyett a Read vagy
ReadLine utasítást használjuk, ill. a StreamWriter helyett a StreamReader segítsé
gével hozzuk létre a logikai fájlunkat.
41. feladat:
Hozzunk létre egy szövegfájlt az alábbi adatokkal, és mentsük a programunk BIN/
DEBUG könyvtárába fajl.txt néven!
Barna Barbara
Kiss István
Nagy Róbert
Pót Csaba
Nagy Evelin
Kovács Virág
i n t i = 0;
C o n s o l e . W r i t e L i n e (" Név");
try
{
f ó r ( i = 0 ; i < 6; i++)
{
n e v [ i] = o l v a s . ReadLine ();
C o n s o le .W r i te L i n e ( n é v [ i ] );
}
o l v a s . C l o s e ();
}
catch (IO E xception)
{
C o n s o l e . W r i t e L i n e (" I/O hiba");
}
C o n s o le . ReadKey();
42. feladat:
Kérjünk be 6 nevet és a hozzátartozó átlagot, majd írjuk ki a háttértárolóra a prog
ramunk BIN/DEBUG könyvtárába nevatlag.txt néven! A nevek két részből állja
nak, az átlagok 2 tizedes pontossággal legyenek megadva! A név és a hozzátartozó
átlag egy sorban legyen! A sorokat tömbben tároljuk!
Név: Névátlag
Megoldás:
u s in g System;
using S y ste m .C o lle c tio n s.Generic;
using System.Linq;
u s i n g S y s t e m . 10;
using System.Text;
namespace N ev atlag
{
eláss Program
{
Fájlkezelés
93
}
Az adatbekérés során az aktuális nevet és átlagot egy szóközzel választottuk el, ki
használva a szöveg típusú változóknál alkalmazható + operátort. Ezt követően már
csak ki kellett írni az a[i]-t, mint szöveget egy fór ciklussal a már ismert módon.
43. feladat:
Másoljuk az előző feladatban létrehozott nevatlag.txt fájlt a programunk BIN/
DEBUG könyvtárába! Olvassuk be az adatokat, és írjuk ki a képernyőre!
Számoljuk ki az átlagok átlagát és írjuk ki a képernyőre a következő szöveg után:
„A csoport átlaga:”
A lprogramok és fájlkezelés
94
Név: Nevatlagbeolvas
Megoldás:
using System;
using System .C o l le c t i o n s .Generic;
using S ystem .Linq;
using S y s t e m . 10;
using System .Text;
namespace N évétlagbeolvas
{
class Program
{
static void M a i n ( s t r i n g [] args)
{
StreamReader olvas = new S t r e a m R e a d e r ( " n e v a t l a g .
t x t M) ;
s t r i n g [] nev = new s t r i n g [ 6 ] ;
string a t l a g S t r i n g = " ", szoveg=" " ;
int i = 0 , j = 0 , d b = 0;
double atlag = 0, összeg = 0;
C o n s o l e . W r i t e L i n e ( fl Név átlag") ;
try
{
for (i = 0; i < 6; i++)
{
nev[i] = o l v a s .R e a d L in e ();
C o n s o le .W r i te L i n e ( n e v [ i ] );
}
o l v a s . C l o s e ();
}
catch (I O E x c e p tio n )
{
C o n s o l e . W r i t e L i n e (" I/O hiba");
}
for (i = 0; i < 6; i++)
{
szöveg = nev[i];
Fájlkezelés
95
44. feladat:
Másoljuk a 41-es feladatban létrehozott nevatlag.txt fájlt a programunk BIN/
DEBUG könyvtárába! A meglévő adatokhoz írjunk még újabbakat! Az adatbevitel
ENTER végjeiig tartson!
A lprogramok és fájlkezelés
96
Név: Hozzáfűz
Megoldás:
using System;
using System.10;
namespace Hozzáfűz
{
class Program
{
static public void Main()
{
FileStream adatok = new FileStream("nevatlag.
txt", FileMode.Append);
StreamWriter iras = new StreamWriter(adatok) ;
string név = " 11;
string[] a = new string[100];
double atlag = 0;
int i = 0;
try
{
while (név != "")
{
Console.Write(" Kérem a nevet :”);
név = Console.ReadLine();
if (név != "")
{
Console.W r i t e (” Kérem az átlagot :");
atlag = Convert.ToDouble(Console.ReadLine());
a[i] = név + " " + atlag;
iras.WriteLine(a[i]);
}
}
iras.Close ();
Fájlkezelés
97
catch (IOException)
{
Console.WriteLine(" I/O hiba");
}
iras.Close();
adatok.Close();
Console.WriteLine("Az adatokat kiírtam
a háttértárolóra!");
Console.ReadKey();
}
}
Fontos megemlíteni, hogy a névváltozó deklarációjánál az
nem a „semmit” adtuk meg kezdőértéknek, hanem egy szóközt. Erre azért volt
szükség, mert az előltesztelő ciklusba csak akkor tudunk belépni, ha a név értéke
nem „semmi”. Amíg a név valamilyen értéket kap, addig a ciklusban marad a ve
zérlés és bekérjük a nevet és az átlagot. Ha az adatbevitelkor a név megadásánál
csak entert ütünk, akkor a név értéke nullérték lesz, tehát befejeztük az adatbevitelt,
akkor az átlagot már nem kell bekérni, a ciklust elhagyhatjuk.
98
5. ÖSSZETETT ADATSZERKEZETEK
5.1. Stringek
Szöveghossz meghatározása
A szam.Lengthmegadta a szám string hosszát a pedig a szöveg
1. karakterért.
Összeadás
Fontos megemlíteni, hogy az összeadás művelet értelmezhető stringeken, de ered
ménye nem azonos a számtípusoknál megismerttel. Itt a szövegeket egymás után
fűzi a + operátor.
Pl.: ” objektum”+” orientált”= ” objektumorientált” , ami talán nem meglepő, de
számokból álló stringek esetén már érdekesebb, mert:” 77” +” 23”= ” 7723” lesz.
Összehasonlítás
A stringek 1 karakterére értelmezhető a < és a > jel ebben a formában:
szoveg[4]>szoveg[ 1]
A teljes stringre viszont csak az = = , vagy != relációs jelek értelmezhetők.
Természetesen a C# nem lenne magasszintű programozási nyelv, ha ilyen hiányos
ságban szenvedne.
Mint a 32. feladat előtt utaltunk rá a CompareTo segítségével a teljes stringre is
tudjuk alkalmazni a < > relációs jeleket. A következő feladat ezt mutatja be.
S tringek
99
45. feladat:
Kérjünk be két szöveget és írassuk ki a képernyőre az ABC-ben előbb lévőt, majd
alá az ABC-ben hátrébb levőt!
Név: Szövegrendezés
Megoldás:
static void Main(string[] args)
{
string szovegl, szoveg2;
Consolé.WriteLine(" Kérem az 1. szöveget");
szovegl=Console.ReadLine() ;
Consolé.WriteLine(" Kérem az 2. szöveget");
szoveg2 = Consolé.ReadLine();
Consolé.WriteLine(" ABC sorrendben:");
if (szovegl.CompareTo(szoveg2) > 0)
{
Consolé.WriteLine("1. {0}",szoveg2);
Consolé.WriteLine("2. {0}",szovegl);
else
{
C o n s o l é . W r i t e L i n e ("1, {0}", szovegl);
C o n s o l é . W r i t e L i n e ("2 , {0}", szoveg2);
}
C o n s o l é . R e a d K e y () ;
További műveletek:
Levágás
A levágás a Trim(), a TrimStart() és a TrimEnd() segítségével jön létre. Ha a
zárójelek közé nem írunk paramétereket, akkor a Trim() levágja a szöveg elejé
ről és végéről, a TrimStart() csak az elejéről, a TrimEnd() csak a végéről a
szóközöket.
Ö sszetett adatszerkezetek
100
Ha szöveg egy string típusú változó, akkor a szöveg. Trim(’b’); levágja a szöveg
elejéről és végéről az összes ’b’ karaktert. A TrimStart(’b’) csak az elejéről, a
TrimEnd(’b’) csak a végéről vágja le az összes ’b’-t.
Másolás
Egy szövegből tetszőleges részt másolhatunk a Substring(kezd,db) segítségével,
ahol a kezd és a db egész típusú változók és a sztringből a kezd karaktertől db
darab karaktert másolhatunk ki. Ha a zárójelek között csak egy paraméter van,
akkor a kezd értéktől egészen a szöveg végéig másolhatunk ki részsztringet.
Ha sz = ” Paróka” , akkor sz.Substring(2) = ’’róka” . Ne felejtsük el, hogy itt is
0-tól kezdjük a sztring karaktereinek számozását, mint a tömböknél.
Keresés
Az IndexOff) függvénnyel megtudhatjuk, hogy az adott karakter vagy karakterso
rozat szerepel-e a sztringben, és ha igen, hol. Ha benne van, akkor a függvény ér
téke 0 vagy pozitív, ha nincs benne, akkor -1 lesz. Ha a függvény értéke nem -1,
akkor a kapott érték azt mutatja meg, hogy hányadik karaktertől találjuk meg a az
adott karaktersorozatot a szövegben.
Pl.: Ha a szoveg.IndexOf(szo)=3, akkor a szöveg szövegben a szó szó a 4. pozíció
tól található meg. (PL: szoveg=” M á t é s z a 1 k a” és szo=” é s z ” )
46. feladat:
Kérjünk be egy szöveget és egy karaktert majd írjuk ki, hogy a szövegben hányszor
fordul elő a megadott karakter!
Név: Karakterszamlalas
Megoldás:
static void M a in (strin g [] args)
{
string szöveg ;
char karakter='
int db = 0 , i = 0 ;
Console.W rite("Kérem a szöveget: " );
S tringek
101
47. feladat:
Kérjünk be egy szöveget és egy szót majd írjuk ki, hogy a szövegben hányszor
fordul elő a megadott szó!
Név: Szoszamlalas
Megoldás:
static void M a i n ( s t r i n g [] args)
{
s tr in g szöveg,szó;
i n t db = 0 , i=0 ;
C o n s o l e . W r i t e ("Kérem a s z ö v e g e t : " );
szöveg = C o n s o le .R e a d L in e ();
Console.W rite("Kérem a szó t: ");
szó = (C onsole. R ead L in e());
f ó r ( i = 0; i < = s z o v e g . L e n g t h - s z o . L e n g t h ; i + + )
i f ( s z ö v e g . S u b s t r i n g ( i , s z ó . L e n g t h ) = = szó) db++;
C o n s o le .W r i te L i n e ();
C o n s o l e . W r i t e L i n e (" A ( z ) {0} s z ó b ó l {1} d b v a n
a szövegben " ,s z o ,d b );
C o n s o le .ReadKey();
}
A fór ciklus a szót a szövegben a 0. karaktertől kezdve keresi a szöveg hossza-szó
hossza értékig. Ha tehát a szöveg 10 hosszú, a szó pedig 3, akkor 10-3=7 lesz az i
végértéke, tehát 0-tól 7-ig 8-szor fut le a ciklusmag. Utoljára az szoveg.Substring(7,3)
értékét hasonlítjuk össze a szóval, vagyis a szöveg 7., 8., 9. karakterét hasonlítjuk a
3 hosszúságú szóval és ha megegyezik, akkor növeljük db értékét.
Ö sszetett adatszerkezetek
102
48. feladat:
Kérjünk be egy szöveget, és írjuk ki visszafelé! A fordított szöveg csak nagybetű
ből álljon!
Név: Szovegmegfordito
Megoldás:
static void M a i n ( s t r i n g [] args)
{
s t r i n g s z o v e g = " 11, f o r d i t o t t S z o v e g = " 11;
i n t i = 0;
C o n s o l e . W r i t e ("Kérem a s z ö v e g e t : " ) ;
szöveg = C o n s o le .R ead L in e();
f ó r ( i = s z ö v e g . L e n g t h - 1 ; i >= 0 ; i — )
forditottSzoveg = forditottSzoveg + sz [i];
C o n s o l e . W r i t e L i n e (" A s z ö v e g m e g f o r d í t v a : " ) ;
C onsole.W riteLine(forditottSzoveg.ToU pper());
C o n s o le .ReadKey();
}
A fór ciklust most a szöveg vége-1-től 0-ig visszafelé kell léptetni és az új, meg
fordított szöveghez egyesével kell hozzáfűzni az aktuális, 1 hosszúságú szöveget.
49. feladat:
Kérjük be egy személy nevét, amely vagy 2 vagy 3 részből áll! írjuk ki a vezeték
nevet, majd alá a keresztnevet és ez alá a második keresztnevet, ha van!
Név: Nevkiiras
Megoldás:
static void Main(string[] args)
{
s t r i n g n ev= "", vNev="", kNev="", k2Nev="";
i n t i = -1;
C o n s o l e . W r i t e L i n e (" K é r e m a n e v e t : " ) ;
n é v = C o n s o l e . R e a d L i n e () ;
do
{
i++;
vnev= vnev+ C onvert. T o S t r i n g ( n é v [ i ] );
}while ( n e v [ i] ! = ' ');
C o n s o l e . W r i t e L i n e (" A v e z e t é k n é v : { 0 } " , v N e v ) ;
do
S tringek
103
{
i++;
kNev = kNev + Convert.ToString(név[i]);
} while (nev[i] != ' ' && i + l ! = n e v . L e n g t h ) ;
C o n s o l e . W r i t e L i n e (" A k e r e s z t n é v : { 0 } " , k N e v ) ;
i f ( n é v [i ] = = ' ')
{
do
i++;
k2Nev = k2Nev + C o n v e r t . T o S t r i n g ( n é v [ i ]) ;
} w hile (i < n é v . L e n g th -1 ) ;
C o n s o l e . W r i t e L i n e (" A 2 . k e r e s z t n é v : {0}n,
k2Nev);
}
C o n s o le .ReadKey();
}
A program megírásánál abból indulunk ki, hogy a neveket szóköz választja el egy
mástól. Ha egy szóköz van a szövegben, akkor csak vezeték és keresztnév van, ha
két szóköz, akkor második keresztnév is van. Ezért a név bekérése után egy hátul
tesztelő ciklusban addig tesszük a szöveg karaktereit a vnev változóba, amíg az 1.
szóközig elérünk. Ekkor már a vezetéknevet ki is írjuk a képernyőre.
A szövegben továbbhaladva a keresztnevet kapjuk meg. Addig kell a ciklusban
maradni, amíg két feltétel egyszerre teljesül:
1. nev[i] != 4 4 vagyis a szöveg aktuális karaktere nem egyenlő szóközzel és
2. i+l!=nev.Length tehát a következő karakter sorszáma nem az utolsó a szövegben.
Nézzük fordítva: Kiléphetünk a ciklusból, ha szóközhöz érünk - ekkor nem teljesül
az első feltétel - vagy ha a szöveg utolsó karakteréhez értünk. Ha szóköz volt a
szövegben, akkor egy újabb ciklusban előállítjuk a 2. keresztnevet és kiírjuk, ha
nem, befejezzük a programot.
Az előző fejezetben láthattuk, hogy nem csak a stat ic void Main (string []
args) { }részbeírhatunkaprogramkészítéssorán,ígymostmármegismerkedhetünk
a felsorolt típussal.
A felsorolt típus olyan adatszerkezet, amely névvel ellátott, megadott értékekből áll.
A felsorolt típust az enum kulcsszó után adjuk meg. Először megadjuk a nevet,
majd { } jelek között felsoroljuk az új típus elemeit. Ha nem adunk értéket az
elemeknek, akkor azok értéke nullától kezdve egyesével fog nőni. Ha egy
tetszőleges elem értéket kap, de az utána következő nem, akkor ennek az elemnek
az értéke az előzőhöz képest eggyel nagyobb lesz.
A felsorolt típust az enum kulcsszóval deklaráljuk:
PL: enum
Enum típust csak metóduson kívül (tehát jelen esetben a static void Main(string[]
args) részen kívül, de osztályon belül, vagy “önálló” típusként) deklarálhatunk.
50. feladat:
írjuk ki felsorolás típusban megadott sportágakat és az indexüket (sorszámukat)!
Név: Felsorolás
Megoldás:
namespace felsorolt
eláss Program
{
enum s p o r t A g a k { l a b d a r ú g á s , t e n i s z , formai,
a tle tik a = 5 , jégkorong , v íz ila b d a }
S truktúra ( rekord )
105
51. feladat:
Hozzunk létre egy adattáblát, amelynek maximum 500 sora lehet, az oszlopok
neve pedig név, osztály és átlag legyen! Kérjük be az adatsorok számát és ennek
megfelelően az adatokat, majd írjuk ki a háttértárolóra a programunk BIN/DEBUG
könyvtárába adatok.txt néven!
Név: Rekord
Megoldás:
using System;
using System.Collections.Generic;
Ö sszetett adatszerkezetek
106
}
try
{
kiirtxt = new S t r e a m W r i t e r ( f a j I N e v ) ;
for (i = 0; i < n; i++)
{
i f ( i = = 0) k i i r t x t . W r i t e L i n e ( " { 0 , 1 1 }
{1,12} { 2 : 0 .0 0 } " , "Név", " O s z t á l y " ,
"Á tlag");
k i i r t x t .W r ite L in e ("{0,15} {1,8}
{2:0.00}", t a n u l o k [ i ] . név, t a n u l o k [ i ] .
osztály, ta n u lo k [i].a tla g );
}
k i i r t x t .C l o s e ();
}
catch (IOException)
{
C o n s o l e . W r i t e L i n e (" I/O hiba");
}
C o n s o l e . R e a d K e y () ;
}
A Struct után megadtuk a rekord szerkezetét, azaz az oszlopok nevét és típusát.
Ezzel egy úgynevezett „saját típust” hoztunk létre, amelyet a tanulok nevű tömb
deklarációjánál használunk, ahol az adattábla sorainak számát adtuk meg. Az adat
sorok értékét az n változó veszi fel, majd egy fór ciklusban bekérjük az adatokat
egy másikban pedig kiírjuk ’’Tanulók adatai” néven a háttértárolóra.
5.4 Lista
A lista gyakorlatilag egy változó elemszámú tömb. Mint korábban láthattuk a tömb
deklarációjánál meg kell adni az elemek számát, amelynél a helyet le kell foglalni
akkor is, ha nem töltjük fel valós adatokkal.
Ö sszetett adatszerkezetek
108
Név: lista
Megoldás:
namespace lista
{
class Program
static void M a i n ()
{
Random v s z = n e w R a n d o m () ;
L ista
109
}
Ö sszetett adatszerkezetek
110
5.5 Szótár
Műveletek szótárelemekkel:
• érték hozzáadása kulccsal: szotamev.Add( kulcs, érték),
• megadj a, hogy szerepel-e egy kulcs a szótárban: szotamev. ContainsKey (kulcs),
• megadja,hogy szerepel-eegy értékaszótárban: szotamev.ContainsValue(ertek),
• eltávolít egy elemet a szótárból: szotamev.Remove(kulcs),
• a szótár elemeinek törlése: szotamev.Clear().
A szótárat foreach ciklussal lehet bejárni és a szótárból KeyValuePair (kulcs-érték
pár) típusú elemeket kapunk. Ezek Key és Value mezői adják a megfelelő kulcs és
érték párokat.
53. feladat:
Hozzunk létre [0-9]-ból véletlenszerűen egész számokat és helyezzük el egy 15
elemű tömbben!
Hozzunk létre egy szótárt, amelyben a véletlenszerűen előállított szám lesz a kulcs,
a számok darabszáma pedig az érték! írjuk ki a 15 számot egymás mellé, majd alá
a szótár elemeinek kulcsát és az értékeket, azaz a számokat és a darabszámokat!
Név: szótár
Megoldás:
namespace szótár
{
eláss Program
{
S zótár
111
5.6 Halmaz
54. feladat:
írjunk programot, amely halmaz segítségével állítja elő a hatoslottó nyerőszámait
és kiírja a képernyőre egymás mellé, majd a halmazt tömbbé alakítja és növekvő
sorrendben kiírja a számokat egymás mellé!
Név: halmaz
Megoldás:
namespace halmaz
{
eláss Program
{
static void M a i n ( s t r i n g [] args)
{
HashSet<int> lottoő = new H a s h S e t < i n t > ( ) ;
Random v s z = new R a n d o m O ;
w h ile ( l o t t o 6 . Count < 6) l o t t o 6 .A dd(vsz.
N e x t(45)+1);
foreach (int szám i n lotto6) Console.
H almaz
113
}
114 ------------------------------------------------------------------------
6. ÖSSZETETT FELADATOK
A feladat leírása:
Az Országos Kéktúra Magyarország északi részén végighaladó folyamatos, jelzett
turistaút. A Kéktúrának a Balaton-felvidéken is több, rövidebb idő alatt bejárható
túrája van. Egy ilyen túra adatait kell feldolgoznia ebben a feladatban.
A megoldás során vegye figyelembe a következőket:
• A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt
írja a képernyőre a feladat sorszámát (például:3. feladat:^/
• Az egyes feladatokban a kiírásokat a minta szerint készítse el!
• Az ékezetmentes kiírás is elfogadott!
• A program megírásakor a fájlban lévő adatok helyes szerkezetét nem kell
ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak
megfelelnek!
• A megoldását úgy készítse el, hogy az azonos szerkezetű, de tetszőleges input
adatok mellet is helyes eredményt adjon!
A kektura.csv állomány első sorában a túra kezdetének tengerszint feletti magassá
ga található méterben megadva. A további sorok a túra egy-egy szakaszához tarto
zó adatokat tárolják. Az adatokat pontosvessző választja el egymástól. Például:
Hidegkúti major;Leteres a Sztupahoz;3,903;153;53;n
A sorokban lévő adatok rendre a következők:
• A túraszakasz kiindulópontjának a neve. Például: „Hidegkúti major”
K éktúra (Á gazati érettségi mintafeladat : 2017)
115
Minta:
3. feladat: Szakaszok száma: 16 db
4. feladat: A túra teljes hossza: 44,624 km
5. feladat: A legrövidebb szakasz adatai:
Kezdete: Sümeg, vasutallomas
Vége: Sümeg, buszpályaudvar
Távolság: 1,208 km
7. feladat: Hiányos állomásnevek:
Zalaszanto, romai katolikus templom
Gyöngyösi csarda
Heviz, leteres az autobuszallomashoz
Keszthely, leteres a vasutallomashoz
8. feladat: A túra legmagasabban fekvő végpontja:
A végpont neve: Kék rom jelzes kezdete Tatika várához
A végpont tengerszint feletti magassága: 398 m
Megoldás:
using System;
using System .C o lle c tio n s .Generic;
using S ystem .Linq;
using System.Text;
using System .Threading.Tasks;
using S y s t e m . 10;
namespace érettségi2017
{
class Program
maxMagasság = aktMagasság;
maxMagasságvégpont = sor[i].vég;
}
C onsole.W riteL ine("\tA végpont neve: {0}",
maxMagassagVegPont) ;
C o n s o le .W r i t e L i n e (" \tA végpont tengerszint fe
l e t t i magassága::
{0} m", maxMagasság );
// 9. feladat
fór (i = 1; i < a d a to k . Length; i++)
i f (függvény(sor[i].vég, so r[i].p h ) == t r u e )
s o r [i ] . vég+=" p e c s é t e l ő h e l y " ;
// Az ö s s z e s adat elhelyezése listába
List<string> sorok = new L i s t < s t r i n g > ( ) ;
sorok.A dd("192");
fór (i = 1; i < adatok.Length; i++)
{
so ro k .A d d (so r[i]. kezdet + + sor[i].vég +
!»r. If 'I
s o r [ i] . h o s s z . T o S tr in g ()+"; " + sor[i].em el.
T o S trin g ()+";" +
s o r [ i ] . l e j t .T o S trin g ()+";" + sor[i].
p h .T oS tring());
}
try
{
F i i é .W r i t e A l l L i n e s (" k e k t u r a 2 . c s v " , sorok);
}
catch (IOException)
{
C o n s o l e . W r i t e L i n e (" I/O hiba");
}
C o n s o le .ReadKey();
Ö sszetett feladatok
120
A feladat leírása:
Az 1952-ben Helsinkiben rendezett nyári olimpián nagyon szépen szerepeltek a
magyar színekben induló olimpikonok. Ebben a feladatban az általuk elért helye
zésekkel kapcsolatos számításokat kell elvégeznie.
A megoldás során vegye figyelembe a következőket:
• A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt
írja a képernyőre a feladat sorszámát (például: 3 . f e l a d a t :) /
H elsinki 1952 (Á gazati érettségi feladat : 2017 május )
121
Minta a feladathoz:
3. feladat:
Pontszerző helyezések száma: 64
4. feladat:
Arany: 16
Ezüst: 10
Bronz: 16
Összesen: 42
5. feladat:
Olimpiai pontok száma: 269
6. feladat:
Torna sportágban szereztek több érmet
8. feladat:
Helyezés: 1
Sportág: labdarúgás
Versenyszám: ferfi_csapat
Sportolók száma: 15
H elsinki 1952 (Á gazati érettségi feladat : 2017 május)
123
Minta a h e l s i n k i 2 . t x t állományhoz:
2 1 5 kajak-kenu kenu_egyes_10000m
2 1 5 kajak-kenu kajak_egyes_1000m
2 1 5 birkózás kotott_fogas_pehelysuly
2 8 5 torna noi_osszetett_csapat
3 1 4 sportlövészét sportpisztoly
3 1 4 vivas kardvivas_egyeni
Források:
https://hu.wikipedia. org/wiki/Magyarország_az_l952._évi_nyári_olimpiaiJátékokon
(utolsó megtekintés: 2017.01.30.)
Megoldás:
using System;
using System .C o l le c t i o n s .Generic;
using S ystem .Linq;
using System .Text;
using S y s t e m . 10;
namespace helsinki
{
class Program
{
s tru c t egyadat /^Adatszerkezetnek m egfelelő
struktúra elkészítése*/
{
public int helyezes;
public int hányán;
public string sportág;
public string vszam;
};
//hasznát változók
Ö ssz e t e t t feladatok
124
s t a t i c e g y a d a t [] a d a t o k = new e g y a d a t [ 2 0 0 ] ; //adatok
nevű de s t u k t u r a szerin ti felépitésű
static int i, darab = 0; //beolvas és 3 feladat
static bool hiba=false;
static int arany = 0; //4 feladat
static int bronz = 0;
static int ezüst = 0;
static int osszErem = 0;
static int osszPont = 0; //5 feladat
static int úszás = 0; //6 feladat
static int torna = 0;
static int legtobb=0; //8 feladat
static int legTobbSorszam=0;
F e l a d a t 3 () ;
F e l a d a t 4 () ;
F e l a d a t 5 () ;
F e l a d a t 6 () ;
F e l a d a t 7 () ;
F e l a d a t 8 () ;
}
static void BeolvasO
{
try
{
S t r e a m R e a d e r o l v a s = new
S tr e a m R e a d e r(" h e l s i n k i . t x t "
H elsinki 1952 (Á gazati érettségi feladat : 2017 május)
125
/ / ---------------------------------------
static void Feladat3()
{
C o n s o l e . W r i t e L i n e ("3. f e la d a t:");
C o n s o le .W rite L in e (" P o n tsze rző helyezések száma:
{0}", d a r a b ) ;
}
//
Ö ssz etett fela d ato k
126
/ / ---------------------------------------------------------------------------------
static void F e l a d a t é () //!!!csak érmesek!!!
{
C o n s o le .W r i t e L i n e ("6. f e la d a t:");
fór (i = 0; i < darab; i++)
{
H e l s in k i 1952 ( Á g a z a t i érettségi fe l a d a t : 2017 m á ju s)
127
if (adatok[i].helyezes < 4)
{
if (adatok[i] . sportág == "úszás") uszas++;
if ( a d a t o k [i ] . s p o r t á g == "torna") torna++;
}
i f (úszás > to rn a ) C o n s o l e . W r i t e L i n e ("Úszás
sportágban s z e re z te k több é r m e t" ) ;
i f (úszás < torna) C onsole.W riteL ine("T orna
sportágban s z e re z te k több é r m e t" ) ;
if ( ú s z á s == t o r n a ) C o n s o le .W r i t e L i n e ("Egyenlő
v o l t az érmek s zá m a ");
i r .W r i t e ( a d a t o k [i ] . hanyan+" ");
i r .W r i t e ( a l a p P o n t [ a d a t o k [i ] . h e l y e z e s ]+" ");
if (a d a to k [i]. sportag=="kajakkenu")
{i r . W r i t e ( " k a j a k - k e n u ") ; }
else {i r . W r i t e ( a d a t o k [ i ] . s p o r t a g + " "); }
ir.W riteLine (adatok[i].vszam );
}
i r . C l o s e ();
catch
Ö ssz e t e t t fela d ato k
128
{
II... nem sikerült a fileművelet
Console.WriteLine("Hiba a fájlirásakor") ;
}
/ / -----------------------------------------------
static void Feladat8()
{
Console.WriteLine("8. feladat:");
fór (i=0;i<darab;i++)
{
if (legtobb<adatok[i].hányán)
{
legtobb=adatok[i].hányán;
legtobbsorszam=i;
}
Console.WriteLine("Helyezes: {0 }",
adatok[legTobbSorszam].helyezes);
Console.WriteLine("Sportág: {0 }",
adatok[legTobbSorszam].sportág);
Console.WriteLine("Versenyszám: {0}",
adatok[legTobbSorszam].vszam);
Console.WriteLine("Sportolók száma: {0}",
adatok[legTobbSorszam].hányán);
Console.ReadKey();
}
}
}
Eddig csak olyan programokat írtunk, amelyek a futáskor egy egyszerű, szöveges
képernyőn, fekete háttérben fehér betűkkel jelenítette meg az eredményt. A prog
ramírás kezdetén a Console Application-t választottuk minden esetben. Most azon
ban áttérünk a grafikai, a Form jellegű programok írására. Mindazt, amit eddig
megismertünk továbbra is használni fogjuk. Az összes eddig megírt programunk
Form-os környezetben is elkészíthető, így színek és ablakok használatával szebb
formában tarthatjuk a kapcsolatot a felhasználóval.
Ehhez meg kell ismerkedni a Windows Form-ok nyújtotta lehetőségekkel. Mivel
ezen lehetőségek száma nagyon nagy, ezért mi csak a lehetőségek töredékét kíván
juk bemutatni.
7.2. A Label
A Label olyan elem, amelyben szöveget jeleníthetünk meg. Az eddig tanultak kö
zül a Console. Write-hoz hasonlítható leginkább. A felhasználó nem tud a Label-be
írni. A címkének sok tulajdonsága van, amelyet beállíthatunk. Erre a Properties
ablakban van lehetőség.
Nézzünk néhány fontosabb tulajdonságot:
A legfontosabb a Label neve. Ezt a (Name) sorban adhatjuk meg és minden esetben
van egy default, alapértelmezett neve. Később ezzel a névvel hivatkozhatunk a
programban a címkére.
Az AutoSize tulajdonsággal a címke átméretezhetősége állítható be. Az alapérték
a True. Ekkor a címke ablaka nem méretezhető át.
• A BackColorral a háttérszínt állíthatjuk be.
• A BorderStyle segítségével a megjelenés formáját választjuk ki.
• A Cursorral a kurzor formája adható meg.
• A Font a betűtípust, stílust és méretet állítja be.
A B utton
131
7.3. A Button
A Button olyan elem, amelyre a program futása során kattintva valamilyen ese
mény következik be. A Button tulajdonságai hasonlóak a címkéhez. Csak néhány
eltérés van, amelyet itt nem részletezünk. Fontos viszont, hogy a Button-hoz ese
ményt tudjunk rendelni.
Ezt úgy tehetjük meg, ha a gombra kettőt kattintunk. (Ha csak egyet kattintunk,
akkor a tulajdonságait módosítjuk.)
Ekkor a C# automatikusan átlép a Forrni.cs[Design]-ból a Forml.cs-be és az
eddig megszokott szöveges módban láthatjuk a programunkat. A C# a program
azon részébe lép, ahova nekünk írnunk kell ahhoz, hogy a Button-hoz eseményt
rendeljünk. Ha megnézzük a program szerkezetét láthatjuk, hogy a különböző
elemekhez egy-egy eljárás tartozik. Az eljárások törzsébe írva eseményt rendelhe
tünk a Buttonhoz.
Egy fontos esemény az ablak bezárása, vagyis a program befejezése. Ezt úgy ér
hetjük el, ha a Buttonra kattintva a hozzátartozó eljárásba beírjuk az ablakbezáró
utasítást: this.Close();
A másik fontos esemény, ha egy címkének adunk értéket. Ekkor a megfelelő
Button-ra kattintva beírjuk a következő utasítást:
cimkeNev.Text = ’’Tetszőleges szöveg”;
Ezek után megírhatjuk első Form-os programunkat.
55. feladat:
Hozzunk létre két címkét és gombot egy ablakban! A címkék kezdetben üresek
legyenek a gombok felirata pedig OK és KILÉP! Az OK-ra kattintva a címkékben
W in d o w s f o r m a p p l ic a t io n
132
7.4. A TextBox
56. feladat:
Hozzunk létre egy szövegdobozt, egy címkét és két gombot egy ablakban! írjuk ki
a szövegdobozban megadott szám kétszeresét!
Név: Formfeladat2
Megoldás:
Húzzunk a Forrni ablakba egy TextBox-ot fehér, egy Label-t piros háttérrel és 2
Button-t az alábbi ábra szerint!
d o u b l e szá m = 0;
szám = C o n v e r t . T o D o u b l e ( s z a m S t r i n g . T e x t ) ;
s z ö v e g . T e x t = (2 * s z á m ) . T o S t r i n g ( ) ;
}
vagy egyszerűbben:
p riv ate void b u tto n l_ C lick (o b ject sender, E ventA rgs e)
{
s z ö v e g . T e x t = (2 * C o n v e r t . T o D o u b l e
( s z a m S t r i n g . T e x t ) ) . T o S t r i n g () ;
}
Ne felejtsük el, hogy minden bekért és kiírt adat szöveges típusú, ezért a szamString
nevű TextBox értékét konvertálni kell Double típussá, majd a szám kétszeresét a
ToStringgel szöveggé kell alakítani.
57. feladat:
Kérjük be a másodfokú egyenlet együtthatóit három szövegdobozban és írjuk ki
az egyenlet gyökeit két tizedes pontossággal! Ha nincs gyök, akkor írjuk ki:
„Nincs gyök”.
Név: Formfeladat3
Megoldás:
Hozzuk létre az alábbi formának megfelelő ablakot!
as Project Debug Data Format
Forrni Sytfem.VWnttow.Forntt.Form
ShowlnTaskbar True
Másodfokú egyer
False
□....... i
The text associated withthe control.
A T extB ox
135
58. feladat:
írjunk programot, amely gondol egy számot 0 és 100 között, majd vár egy tippet
és ennek értékétől függően tájékoztatja a felhasználót, hogy a tipp nagyobb-e, ki-
sebb-e, mint a gondolt szám vagy egyenlő azzal! írjuk ki a tippek számát is!
W in d o w s f o r m a p p l ic a t io n
136
Név: Formfeladat4
Megoldás:
-JULflL&aüb
in t t i p p S z a m = 0 , g o n d o l = 0;
p riv a te void b u tto n l_ C lic k (object sender, E v e n t A r g s e)
{
i n t szám = 0;
t a l a l S t r i n g . Text = "";
i f ( t i p p S z a m = = 0)
Random v s z = new R a n d o m O ;
g o n d o l = v s z . N e x t (101) ;
}
szam = C o n v e r t .T o Int1 6 (szamString.T e x t ) ;
if (szám = = gondol) talalString. Text = "Eltaláltad” ;
if (szám > gondol) talalString.Text = "Ennél kisebb";
A T extB ox
137
Megjegyzés:
A tippSzam és gondol egész típusú változókat a priváté void buttonljOlick rész
előtt kell deklarálni különböző okokból.
Ha a tippSzam változónak az eljáráson belül adnánk 0 kezdőértéket, akkor a
tippSzam+ + utasítás mindig 1 lenne, mivel a „Jó a tipp?” gombra kattintva állan
dóan nulláznánk az tippSzam értékét.
A gondol változó értékét csak egyszer szabad előállítani véletlenszerűen a
buttonl_Click-ben, ezért nem lehet az alprogramban deklarálni és 0 kezdőértéket
adni neki. Ezt az egyszeri előállítást az if (tippSzam = = 0) részben valósítjuk
meg, vagyis csak akkor kap értéket a gondol, amikor először kattintunk a „Jó a
tipp?” gombra.
59. feladat:
írjunk programot, amely egy italautomata által felajánlott italok és hozzávalók
kiválasztását teszi lehetővé! Az italok: mogyorós csoki, tea, kávé, capuccino. A le
hetséges hozzávalók: tej, cukor, citrom. A mogyorós csokihoz ne lehessen hozzá
valót választani, a teánál a tejet, a kávénál, és a capuccinónál pedig a citromot
tiltsuk le! Az ár gombra kattintva írjuk ki a kiválasztott termékek árát, a törlés
gombra pedig töröljük az árat! Az árak: mogyorós csoki és kávé 60 Ft, tea és
capuccino 50 Ft. A tej 15, a cukor 10 a citrom pedig 5 Ft legyen!
Név: Formfeladat5
Megoldás:
Hozzuk létre az alábbi formának megfelelő ablakot!
W in d o w s f o r m a p p l ic a t io n
138
A program:
nam espace Form feladat5
{
p ublic p artia l class Form l : Form
{
p u b lic F o r m l ()
{
I n itia liz e C o m p o n e n t();
}
{
t e j . Checked = f a l s e ;
c u k o r . Checked = f a l s e ;
c i t r o m . Checked = f a l s e ;
t e j .A utoCheck = f a l s e ;
c u k o r .A utoCheck = f a l s e ;
c i t r o m . A utoC heck = f a l s e ;
}
else
{
t e j .A utoC heck = t r u e ;
c u k o r .A utoC heck = t r u e ;
c i t r o m . A utoC heck = t r u e ;
}
p riv ate void cukor_C heckedC hanged(object sender,
E v e n t A r g s e)
{
}
p riv ate void citrom _C heckedC hanged(object sender,
E v e n t A r g s e)
{
c i t r o m . Checked = false;
}
}
60. feladat:
Készítsünk egy egyszerű számológépet, amely két szám között megjelenít egy
alapműveletet ( a / egyikét) és ennek megfelelően számítja ki az eredményt!
A műveleti jeleket egy legördülő listából (ComboBox) lehessen kiválasztani! Ha a
számokhoz nem írunk semmit, azt tekintse a program nullának! A ComboBoxban
alapesetben a „+” legyen látható!
Név: Formfeladató
Megoldás:
Hozzuk létre az alábbi formának megfelelő ablakot!
B8 Debug Daba Format Took window Help
m
IU Cemboßox
Forml.Desig
U Forml.resx
Program.es
?$j ContextMenuStríp
p OataGridView
igg DataSet
H DateTimePfcter
J 30 OrectoryEntry
5 OrectorySearcher
Propertfes - * X
\ LS OomahUpOown
Forml System.Windows.Forms.Form $\
0 ErrorProvider
g§ Eventtog HRffll
Jp FüeSystemWatcher RightToteft
'•* FlowUyoutPanel RightTourftlayout False
1
Q0 FontOîalog
Showlcon True
A program:
nam espace F orm feladat6
{
p u b lic p artia l class Form l : Form
{
p u b lic F o r m l ()
{
I n i t i a l i z e C o m p o n e n t () ;
}
61. feladat:
Készítsünk egy egyszerű számológépet, amely az alapműveletek mellett számol
gyököt és köbgyököt! A számológépekhez hasonlóan egy C jelű gomb segítségével
töröljük szükség esetén a textbox tartalmát! A számológép működjön egérrel és
billentyűvel egyaránt! (kivéve a gyök és köbgyök esetén, itt csak egérrel)
Név: Formfeladat7
Megoldás:
Ü
Toofcox Forml.cs [Design]
I* Pointer
w
® Button
0 ChedSox
0 0 0 0 GO
me
p DataGridVtew
3 DataSet 0 0 0 0 0
Ü DateTimePictter
{JQ DirectoryEntry
DiectorySearcher □ 0 0 □ E
C.I DomaMJpDown
ÜI ErrorProvider
iU Eventtog
0 00 0 0 RightToleft No
M FfeSystemWatcher RightToleftley» False
Showlcon True
m*
.^FontDiabg
wDiateg ShowInTaskbar True
3 Sse 443; 369
Qs StartPosfeon WndowsDefault
m Imagetist
A Label
à LinHabel
S j ..
W in d o w s f o r m a p p l ic a t io n
146
A program:
using System ;
using S y stem .C o l le c t i o n s .G eneric;
using S y s te m . Com ponentM odel;
using S ystem .D ata;
using S y s te m .D raw ing;
using S y ste m .Linq;
using S y stem .T e x t;
using S y ste m .W in d o w s. Form s;
{
szám = C o n v e r t . T o D o u b l e ( s z a m S t r i n g . T e x t ) ;
ered m en y -= szam;
}
if (jel == "*")
{
szam = C o n v e r t . T o D o u b l e ( s z a m S t r i n g . T e x t ) ;
e r e d m e n y *= s z a m ;
}
if (jel == "/")
{
if ( s z a m S t r i n g . T e x t == " 0 M | | s z a m S t r i n g . T e x t == " " )
{
s z a m S t r i n g . T e x t = " N u l l á v a l nem l e h e t o s z t a n i ! " ;
}
else
{
szam = C o n v e r t . T o D o u b l e ( s z a m S t r i n g . T e x t ) ;
ered m en y /= szam;
u = s z ö v e g . L e n g t h - 1;
if (szoveg[u == i | szöveg[u] == V' 11
\ _ r
szöveg[u] == '+ ' 11 szöveg[u] == 11
s z ö v e g [ u ] == ' c ' )
;i
sza m S trin g . Text =
}
else
y r
if ( s z ö v e g ! [u] ! = && s z o v e g [ u ] != r &&
'1 ' &&
O
szöveg[u] szoveg[u] !=
II &&
'3 '
CM
szöveg[u] szoveg[u] !=
ta
II
ScSc
&
szöveg[u] szoveg[u] != '5 '
II
b u tto n 2 .E nabled = f a ls e ;
b u t t o n 3 . E nabled = f a l s e ;
b u tto n 4 .E nabled = f a ls e ;
b u t t o n l 7 .E nabled = f a ls e ;
b u tto n 2 0 .E nabled = f a ls e ;
}
p r iv a te void b u tto n l6 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 0 " ;
s z a m S t r i n g . F o c u s () ;
s z a m S trin g . S e le c t( s z a m S tr in g . T e x t. L ength, 1 );// az
u to ls ó k a ra k te r után á l l a kurzor
}
p r iv a te void b u tto n l3 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 1 " ;
s z a m S t r i n g . F o c u s () ;
s z a m S tr in g .S e le c t( s z a m S tr in g . T e x t. L ength, 1);
}
p r iv a te void b u tto n l4 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 2 " ;
s z a m S t r i n g . F o c u s () ;
s z a m S tr in g .S e le c t( s z a m S tr in g .T e x t. L ength, 1);
}
p r iv a te void b u tto n l5 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 3 " ;
s z a m S t r i n g . F o c u s () ;
s z a m S trin g . S e l e c t ( s z a m S tr in g . T e x t. L ength, 1);
}
p r iv a te void b u tto n lO _ C lick (o b je ct sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 4 " ;
s z a m S t r i n g . F o c u s () ;
s z a m S tr in g .S e le c t( s z a m S tr in g . T e x t. L ength, 1);
}
p riv a te void b u tto n ll_ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 5 " ;
s z a m S t r i n g . F o c u s () ;
A T extB ox
151
s z a m S t r i n g . S e l e c t (s z a m S t r i n g . T e x t . L e n g th , 1);
}
p r iv a te void b u tto n l2 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 6 " ;
sz a m S trin g . F o c u s();
sza m S trin g .S ele ct(sza m S trin g .T e x t.L en g th , 1);
}
private void b u tto n 7 _ C lick (o b ject sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 7 " ;
s z a m S t r i n g . F o c u s () ;
s z a m S trin g . S e l e c t ( s z a m S t r i n g . T e x t . L ength, 1);
}
private void b u tto n 8 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 8 " ;
sz a m S trin g . F o c u s();
s z a m S trin g . S e l e c t ( s z a m S tr in g . T e x t . Length, 1);
}
private void b u tto n 9 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t += " 9 " ;
s z a m S t r i n g . F o c u s () ;
s z a m S trin g . S e l e c t ( s z a m S tr in g . T e x t . Length, 1);
}
p r iv a te void b u tto n l8 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S t r i n g . T e x t +=
sz a m S trin g . F o c u s();
s z a m S t r i n g .S e l e c t ( s z a m S t r i n g .T e x t . L ength, 1);
vesszo++;
i f ( v e s s z o > 1) s z a m S t r i n g . T e x t = " n e m s z a m " ;
}
p riv ate void szam S tring_K eyP ress(object sender,
K e y P r e s s E v e n t A r g s e)
{
if ( e . K e y C h a r == 1 3 ) b u t t o n 5 . P e r f o r m C l i c k ( ) ; / /
enter
i f ( e . K e y C h a r == 4 3 ) b u t t o n l . P e r f o r m C l i c k () ; / / +
i f ( e . K e y C h a r == 4 5 ) b u t t o n 2 . P e r f o r m C l i c k () ; / / -
W in d o w s f o r m a p p l ic a t io n
152
i f ( e . K e y C h a r == 4 2 ) b u t t o n 3 . P e r f o r m C l i c k ( ) ; / / *
if ( e . K e y C h a r == 4 7 ) b u t t o n 4 _ C l i c k ( n u l l , n u l l ) ;
// per
if ( e . K e y C h a r == 99) b u t t o n 6 _ C l i c k ( n u l l , n u l l ) ;
// c
i f ( e . K e y C h a r == 4 4 ) v e s s z o + + ;
i f ( e . K e y C h a r == 44 && v e s s z ő > 1) s z a m S t r i n g .
T e x t = "nem s z á m " ;
}
p r iv a te void b u tto n l9 _ C lic k (o b je c t sender, E v e n t A r g s e)
{
s z a m S tr in g . Focus ();
szam = C o n v e r t . T o D o u b l e ( s z a m S t r i n g . T e x t ) ;
s z a m S t r i n g . T e x t = S t r i n g . F o r m a t ( C o n v e r t . T o S t r i n g (-
szam ));
s z a m S trin g . S e le c t( s z a m S tr in g . T e x t . Length, 1);
v e s s z ő = 0;
}
p riv a te void bu tto n 2 0 _ C lick (o b ject sender, E v e n t A r g s e)
{
b u tto n 5 .E nabled = f a ls e ;
s z a m S t r i n g . F o c u s () ;
szam = C o n v e r t . T o D o u b l e ( s z a m S t r i n g . T e x t ) ;
e r e d m e n y = M a t h . S i g n (szam) * M a t h . P o w ( M a th .
A bs(szam ), (1 /3 .0 ));
sza m S trin g .T e x t = S t r i n g . F o rm at(C o n v ert.
T o S trin g (e re d m e n y ));
s z a m S tr in g .S e le c t( s z a m S tr in g . T e x t . L ength, 1);
e r e d m e n y = 0;
v e s s z ő = 0;
A priváté void Forrni _Shown részben a program indulása után azonnal a TextBoxba
állítjuk a kurzort és inaktívvá tesszük a műveletek és az egyenlőség gombjait.
A Forrni Shown részbe viszont csak akkor tudunk írni, ha előtte a Forml-hez tar
tozó Properties ablakban a sárga villám jelre kattintunk, és ott megkeressük a Shown
sort. Erre kettőt kattintva bemásolódik a megfelelő rész a program szövegébe.
Hasonlóképpen érhetjük el a szamString TextChanged és KeyPress eseményeit is,
ahol az előbbi a szövegdoboz tartalmának változásakor aktivizálódik, az utóbbi pedig
a szövegdobozban történő billentyűleütéskor fut le. A két esemény nem ugyanaz, mert
a szövegdoboz tartalma változhat billentyűleütéssel, vagy a számgombra kattintva is.
A szamString TextChanged-bzn aktívvá tesszük a műveletek gombjait, majd ha a
szamString. Text - azaz a szövegdoboz - már nem üres, akkor ebből konvertálunk
egy szöveg nevű sztringet, amelynek mindig az utolsó karakterét vizsgáljuk meg.
Ha ez az utolsó karakter egy műveletijei vagy a C billentyű, akkor a szövegdoboz
tartalmát töröljük.
Ha viszont a szövegdoboz még üres, akkor megvizsgáljuk, hogy milyen billentyű
vagy gomb került leütésre, ill. lenyomásra és csak a decimális számjegyeket, a
vesszőt és a negatív előjelet fogadjuk el.
Ha nem jó értéket kapunk kiírjuk, hogy a beírt érték nem szám. A ’’nincs valós
megoldás” csak gyökvonás esetén léphet fel, ha negatív számból próbálunk négy
zetgyököt vonni. A vessző változó értékét pedig lenullázzuk, ha elhagyjuk a szö
vegdobozt. Ezt azért kell elvégezni, mert egy szám beírásakor csak egy vesszőt
használhatunk, ha viszont újabb számot írunk a szövegdobozba, akkor újból hasz
nálhatunk egy vesszőt, de többet nem.
Az operátor gomboknál meghívjuk a sajat nevű függvényt, amely a button5, vagy
is az egyenlő gombot teszi aktívvá (inaktívvá pedig a gyök és köbgyök műveletek
során válhat, mivel ekkor az egyenlő gombra értelemszerűen nem kattinthatunk).
Továbbá itt fókuszáljuk a kurzort a szövegdobozba, előállítjuk a szamString.Text-
ből az eredményt, mint számot, és beállítjuk a je l értékét.
A button5-ben az egyenlő gomb eseményvezérlőjében a műveleti jelektől függően
kiszámoljuk az eredményt, és a String.Form at segítségével megjelenítjük a
TextBox-bm.
A buttonl8-bdL\\ a vesszőt, mint karaktert adjuk hozzá a szöveghez és számoljuk is,
hogy hány vessző van a szövegdobozban. Ha egynél több, akkor az már nem szám
és ezt ki is íratjuk.
A button79-ben a szám változó értékét szorozzuk —1-el, és ki is írjuk a szamString.
Text segítségével.
A négyzetgyökvonás a buttonl 7-ben történik. Ha a szám negatív, akkor nincs meg
oldás a valós számok halmazán, egyébként viszont kiszámoljuk és kiíratjuk a gyököt.
W in d o w s f o r m a p p l ic a t io n
154
Köbgyök estén egyszerűbb a dolog, itt nem kell figyelni a negatív értékre, mivel
köbgyöke negatív számnak is van. Fontos azonban a köbgyök kiszámítási módja:
a Math.Sign(szam) a szám előjelétől függően 1 vagy -1 (signum függvény) a
Math.Pow hatványoz.
Itt kell egy alap és egy kitevő. Az alapot vehetjük pozitívnak, mert a végeredmény
helyes előjeléről a signum függvény gondoskodik. A kitevő tört lesz, és nem vélet
lenül van 1/3.0 írva. Ha csak 1/3 lenne, akkor egész osztásnak venné a C# és 1/3
egész része az nulla lenne, ami esetünkben helytelen. Az 1/3.0 viszont valóban egy
tizedestört formát ad, így már az alap a megfelelő kitevőre lesz emelve.
A szamString.KeyPress-ben az adott billentyűkódhoz van hozzárendelve a megfe
lelő gomb, amelyet két módon is elérhetünk. A PerformClick-kel, vagy a Click-kel,
de utóbbinál kötelező két paramétert megadni a függvényhívás miatt.
A C# nyelv széleskörű alkalmazásának csupán a töredéke az, amit eddig sikerült
bemutatni. Kezdő lépésként azonban ez a segédlet megfelelő alapot nyújt minden
ki számára, hogy ezzel a programozási nyelvvel megismerkedjen, és a továbbiak
ban bátran használja informatikai problémák megoldásában. A mai modem, tech
nikailag rohamosan fejlődő világunkban természetes, hogy ez nyelv is változik, és
változni is fog, de nagy valószínűséggel még - informatikai téren sokáig - évekig
használható a C# nyelv.
155
8. WINDOWS PRESENTATION
FOUNDATION
8.1. A W PF használata
Ha WPF-t szeretnénk használni, akkor a New Project után a WPF App (.NET
Framework) segítségével megadjuk a Project nevét és kiválasztjuk a helyet. Ekkor
az előttünk megjelenő képernyő úgy, vagy ahhoz nagyon hasonlóan néz ki, mint a
következő ábrán.
A Windows Form és WPF ablak része nem igazán tér el első ránézésre. Ami újdon
ság, az a középen alul megjelenő rész, amely a HTML-re emlékezteti azokat, akik
már foglalkoztak weblapkészítéssel.
Mint láthatjuk, itt a felül megjelenő ablak tulajdonságai, többek között a mérete
jelenik meg. Ezek a tulajdonságok a Formnál is megtalálhatók, de itt azonnal lát
ható. A ToolBox, a Solution Explorer és az Error List sem tér el jelentősen a
Windows Formnál megszokottól. A Properties viszont már csak „nyomokban”
W in d o w s P r e s e n t a t io n F o u n d a t io n
156
□ Rectangle
Il StackPand
—- TabControl
(U TextBlock
►
All WPFControls
Arrangefay:Category ’
E3Window • p i Window
1 E <Window x :C la ss = "W p fA p p l.M a in W in d o w " li
this group. Drag an 2 x m ln s= “h t t p : / / s c h e m a s .m i c r o s o f t . c o m /w in f x /2 0 0 6 / x a m l/p r e s e n t a tio n " -f
itemonto this text
to add it to the 3 x m ln s:x = ”h t t p : / / s c h e m a s .m i c r o s o f t . com /w in fx /2 0 0 6 /x a m l"
4 x m ln s:d = “h t t p : / / s c h e m a s . m ic r o s o ft .c o m / e x p r e s s io n / b le n d / 2 0 0 8 “
5 x m ln s :mc=”h t t p : / /s c h e m a s . o p e n x m lfo r m a ts.o r g / m a r k u p - c o m p a t i b i li t y / 2006“ |
6 x m ln s : l o c a l = “c lr -n a m e s p a c e :W p fA p p l"
7 m c :Ig n o r a b le = “d"
8 T i t l e = “MainW indow ” H e ig h t = “2 8 6 .6 5 9 ” W id t h s "4 7 8 .7 1 2 “>
9 ¡0 3; < G rid >
18
11 < /G r id >
12 </Window>
....
ü l .... v1 3 ....... . ........ .... . .... . ... ..... .. . .
Ő.2. A Button
A Button használata itt is egyszerű. Nézzük meg egy konkrét példán keresztül.
62. feladat:
Készítsünk alkalmazást, amely gombra kattintva kiírja: Első WPF-es programom.
Egy másikgombra kattintva pedig kilép!
Név: WPF1
A Windows Formhoz hasonlóan itt is az adott gombra kettőt kattintva megjelenik a
gomb click eseménye esetén lefutó alprogam kódja, ahová be kell írni, az alábbi kódot:
label.Content = "Első WPF-es programom";
W in d o w s P r e s e n t a t io n F o u n d a t io n
158
Ez viszont csak akkor fog működni, ha előtte létrhoztunk egy lábéit, amelynek a
hátterét ugyanolyanra állítjuk, mint az ablakét, így nem látszik a helye és a tartal
ma. Utóbbi csak akkor, ha az OK gombra kattintunk.
AKilép-re kattintva kettőt, írjükbe a F ormoknál már megismert t h i s . C l o s e () ;
utasítást.
Láthatjuk, hogy ami a Formnál a label.Text az a WPF-ben a label.Content.
Természetesen módosíthatjuk tetszés szerint a MainWindow.xaml alatti Window
részben az ablak, vagy a vezérlőelemek méreteit. A Margin, a Width, a Height,
vagy a FontSize utáni értékek módosítása után megfigyelhetjük a változásokat.
< B u tto n x :N am e= "button" Content="O K "
H o r i z o n t a l A l i g n m e n t =,,L e f t " M a r g i n = " 1 1 8 , 2 0 3 , 0 , 0 "
V e r t i c a l A l i g n m e n t = " T o p " W i d t h = " 104" H e i g h t = " 39"
F o n t S i z e = " 18" C l i c k = " b u t t o n C l i c k " / >
8.3. A TextBox
A TextBox használata sem fog sok újdonsággal szolgálni. Fontos lesz azonban az
elnevezésekre odafigyelni, amit a Properties Name részben tehetünk meg, mivel a
program során ezeket használni fogjuk.
A T extB ox
159
63. feladat:
Készítsünk alkalmazást, amely az alábbi forma szerint épül fel és kiszámolja egy
alap és kitevő megadása esetén a hatványt!
Név: WPF2
64. feladat:
Készítsünk alkalmazást, amely alábbi forma szerint épül fel és kiszámolja, majd
kiírja a másodfokú egyenlet együtthatóinak ismeretében a gyököket!
Név: WPF3
W in d o w s P r e s e n t a t io n F o u n d a t io n
160
A Formnál már látott kódsort változtatás nélkül be lehet másolni és már működik
is a WPF-es program.
De hogy mégse legyen ugyanaz a megoldás, itt a gyökök nem létezése esetén a
nincsGyokString labelünknek nem az értékét változtatjuk meg, mint a Formnál,
hanem a láthatóságát.
A z Im age
161
8.4. Az Im age
Az Image használata lehet egyszerű, de bonyolult is, attól függően, hogy mit szeret
nénk megvalósítani a program futása során. Képet több módon is elhelyezhetünk az
ablakba, vagy akár gomb, esetleg más vezérlőelem háttereként. Ha gomb hátterébe
helyezzük el, akkor a Solution Explorer részben célszerű egy pl.: image könyvtárt
létrehozni és az abban elhelyezett képeket erőforrásként hozzáadni a programhoz,
így a kép megjelenik a gomb hátterében, de ha az egeret fölé visszük, akkor sajnos
a kép eltűnik. Ez kezdő programozóknak problémát jelent, mivel az alapbeállítást
kell megváltoztatni a gomb viselkedését illetően, ami nem egyszerű feladat.
Nézzünk most egy egyszerű, de közismert játék megvalósítását WPF-ben.
65. feladat:
Készítsünk alkalmazást, amellyel a kő, papír, olló játékot lehet játszani a számító
gép ellen!
Tegyük fel,hogy többen is szeretik ezt a játékot egy családban és mindig annak a
képe jelenik meg, aki éppen játszik.
Az egyszerűség kedvéért legyen két felhasználó, de természetesen a program köny-
nyen bővíthető, több felhasználó is használja a programot.
A képek alatti gombra kattintva eltűnik az éppen nem játszó felhasználók képe és
megjelennek a játékhoz szükséges vezérlőelemek. Ehhez az alábbi elrendezést
célszerű kialakítani.
W in d o w s P r e s e n t a t io n F o u n d a t io n
162
Név: WPF4
A XAML rész:
<Wi ndow X : N a me = ,fw i n d o w lf x : C l a s s = " W P F 4 . M a i n W i n d o w "
x m l n s = ,fh t t p : / / s c h e m a s . m i c r o s o f t . c o m / w i n f x / 2 0 0 6 / x a m l /
presentation"
x m ln s:x="h t t p : / /s c h e m a s .m ic r o s o f t. com /w infx/2006/
x a m l 11
x m ln s:d="h t t p : / / s c h e m a s .m ic r o s o f t. co m /ex p ressio n /
blend/2008"
xm lns:m c="h t t p : / / s c h e m a s . o p e n x m lfo rm a ts . o rg /m a rk u p -
co m patibility/2006"
x m l n s : l o c a l = " c l r - n a m e s p a c e : WPF4"
me : I g n o r a b l e = " d "
T itle = " K ő P a p ir O lló " H eig h t= "8 0 0 " W idth="1200"
MaxW i d t h = " 1 2 0 0"
M a x H e i g h t = " 8 0 0 " M i n W i d t h = " 1 2 0 0 " M i n H e i g h t = "8 0 " >
<Grid>
< B u tto n x :Name="m anolButton" C o n te n t= "M a n ó l"
H o riz o n ta lA lig n m en t= "L eft" M argin= "259,3 6 7 ,0 ,0 "
V e rtic a lA lig n m e n t= " T o p " W idth="100" C lic k = " B u tto n _
C lick" R enderT ransform O rigin= "2.5 6 5 ,3 .9 7 9 "
H e i g h t = " 30" F o n t S i z e = " 1 6 " />
< B u tto n x :Name="mano2Button" C o n te n t= "M a n o 2 "
H o riz o n ta lA lig n m en t= "L eft" M argin= "516,3 6 7 ,0 ,0 "
V e rtic a lA lig n m e n t= " T o p " W idth="100"
C lick="m ano2B utton_C lick" R enderT ransform O rig
i n = " l .3 4 4 ,2 .8 4 4 " H eight="30" F o n tS ize = "1 6 "/>
<Image x :Name="manol" H o r i z o n t a l A l i g n m e n t = " C e n t e r "
M arg in = "7 9 ,67,654,388" S ource= "m anol. jpg"
S t r e t c h = " F i l l " M in W id th = "192" M i n H e i g h t = " 192"
V e r t i c a l A l i g n m e n t = " C e n t e r " M axW idth="192"
M axHeight="192" S c r o l l V i e w e r . V e r t i c a l S c r o l l B a r V i s i b i
lity = " A u to " S tretchD irection= "D ow nO nly"
S crollV iew er.H orizo n talS cro llB arV isib ility = "A u to ">
<Im age. R enderTransform >
<Transform Group>
< S caleT ransform />
<SkewTransform/>
< R otateT ransform A ngle="0"/>
< T ranslateT ransform />
</Transform G roup>
< /Im a g e . R enderTransform >
A z Im a g e
163
</Im age>
< Image x:Name="mano2" M a r g i n = " 3 5 5 , 6 7 , 4 3 9 , 3 7 5 "
Source="m ano2. j p g ” S t r e t c h = " F i l l ”
H o r i z o n t a l A l i g n m e n t = " C e n t e r ” M axW idth="124"
M axH eight="205” V e r tic a lA lig n m e n t= " C e n te r "
S crollV iew er.H o rizontalS crollB arV isibility= "A uto"
S cro llV iew e r.V ertica lS cro llB arV isib ility = "A u tó "
M in W id th = "124" M i n H e i g h t = " 2 0 5 " / >
< L ab el x:Name="j a t e k " C o n t e n t = " J á t é k "
H orizo n talA lig n m en t= "L eft" M argin= "844,174 ,0 ,0 "
V erticalA lig n m en t= "T o p " F ontS ize= "20" R e n d erT ran sfo r
m O rigin= "2.253,2.589"/>
< L ab el x:Name="gep" C o n te n t= " "
H o riz o n ta lA lig n m en t= "L eft" M argin= "823,2 5 0 ,0 ,0 "
V erticalA lignm ent= "T op" R enderT ransform O rig
i n = " 0 .0 2 8 ,0 . 1 9 4 " Background="#FFFlE6CD"
FontS ize= "20"/>
< B u tto n x :Name="buttonKo" C o n ten t= "K ő "
H o riz o n ta lA lig n m en t= "L eft" M argin= "663,3 3 3 ,0 ,0 "
V e r t i c a l A l i g n m e n t = " T o p " W i d t h = " 75" F o n t S i z e = " 20"
C lick = "b u tto n K o _ C lick " R enderT ransform O rig
in = "2 .1 5 5 ,3 .4 2 8 "/>
<B utton x :N a m e= "b u tto n P ap ir" C o n te n t= " P a p ir"
H o riz o n ta lA lig n m en t= "L eft" M argin= "823,3 3 3 ,0 ,0 "
V e rtic a lA lig n m e n t= "T o p " W idth="75" F o n tS ize = "2 0 "
C lick = "b u tto n P ap ir_ C lick "/>
< B u tto n x :N am e="button011o" C o n ten t= "0 1 1 ó "
H orizo n talA lig n m en t= "L eft" M argin= "984,33 3 ,0 ,0 "
V e rtic a lA lig n m e n t= "T o p " W idth="75" F o n tS ize = "2 0 "
C lick= "button011o_C lick"/>
< B u t t o n x : Name="ok" C o n t e n t = " O K "
H orizo n talA lig n m en t= "L eft" M argin= "823,40 6 ,0 ,0 "
V e rtic a lA lig n m e n t= "T o p " W idth="75" FontW eight="B old"
F ontS ize="20" C lic k = "o k _ C lic k " />
CLabel x :Name="gepPontLabel" C ontent="G ép p o n t s z á
ma: " H o r i z o n t a l A l i g n m e n t = " L e f t " M a r g i n = " 3 3 5 , 4 6 2 , 0 , 0 "
V e rtic a lA lig n m e n t= "T o p " F ontW eight="B old"
F ontS ize= "22"/>
<Label x :N a m e = "ja te k o so n tla b e l" C o n te n t= "Já té k o s
p o n t s z á m a :" H o r i z o n t a l A l i g n m e n t = " L e f t "
M argin= "299,5 3 6 ,0 ,0 " V erticalA lignm ent= "T op"
FontW eight="B old" F o n tS iz e = " 2 2 " />
< L a b e l x : N a m e = " g e p P o n t " C o n t e n t = " 0"
W in d o w s P r e s e n t a t io n F o u n d a t io n
164
< / G rid>
</Window>
Természetesen nem kell a fenti értékeket (szélesség, magasság, margók, stb.) pon
tosan így beállítani, mivel a program ettől eltérő értékek esetén is helyesen fog
működni. A képek helyére is tetszőleges figurák, arcok tehetők be, csupán a mére
tekre kell odafigyelni. Az elrendezés és a színek is módosíthatók, a lényeg, hogy
jól láthatók legyenek az elemek a program futása során.
j* Properties
■■ References
Ö App.config
ű App.xaml
MainWíndowjcaml
@ mano1.jpg
@ mano2.jpg
A r r a n g e b y : C a t e g o iy ~
* la y o u t
W id th 11200 jS S «
H e ig h t ' ¡8 0 0 {» »
M in W id th 11200 !■ !
M in H e ig h t |« > N
H o r á o n t a iA li.. f=7
i »1
H o riz o n ta le © ... | § r ] 3 ? ^ |= j 1] a
V e r tic e iC o n te — f f f | t t : i l 1 H a
V ertica lA S g n ... n iïT ¥ I Î Î D | í a
L eft 1 A u to _____ k
H a l-fo S
«r?zi«iEZ¡
T op j A u to 1°
♦ I ® Window (window)
A
Lass="WPF4.MainWindow" M a x W id th 11200 !•
as.microsoft.com/winfx/2006/xaml/presentation" M a x H e ig h t 800 11
amas.microsoft.com/winfx/2006/xaml" S cro tIV Iew er« - [D is a b le d
S cro iiV iew er.V ... | V isib le • N
R o w D ir e c tio n f L eftT o R ig h t "N
G rtd J sS h a red « . □ Q
A program kódja:
using System ;
using S y stem .C o llectio n s.G en eric;
using S ystem .L inq;
using S y stem .T ex t;
using S ystem .T h read in g .T ask s;
using S y s te m . Windows;
using S ystem .W indow s.C ontrols;
using S ystem .W indow s. D ata;
using S y ste m .W in d o w s. Documents;
using S ystem .W indow s. I n p u t;
using S ystem .W indow s.M edia;
using S ystem .W indow s.M edia. Im aging;
using S ystem .W indow s.N avigation;
using S ystem .W indow s. S hapes;
n a m e s p a c e WPF4
{
I I I <summary>
I I I I n t e r a c t i o n l o g i c f o r MainWindow.xaml
I I I </summary>
p u b l i c p a r t i a l c l a s s M a i n W i n d o w : Wi ndow
{
public M a i n W i n d o w ()
{
In itia liz e C o m p o n e n t();
ja te k .V is ib ility = V isib ility .H id d e n ;
g e p .V is ib ility = V isib ility .H id d e n ;
b u t t o n K o . V i s i b i l i t y = V i s i b i l i t y . Hidden;
b u tto n P a p ir.V is ib ility = V isib ility .H id d e n ;
b u tto n O llo .V is ib ility = V isib ility .H id d e n ;
o k . V i s i b i l i t y = V i s i b i l i t y . Hidden;
g e p P o n tL a b e l.V i s i b i l i t y = V i s i b i l i t y . Hidden;
j atek o so n tlab e l.V isib ility = V isib ility .H id d e n ;
g e p P o n t . V i s i b i l i t y = V i s i b i l i t y . Hidden;
j a t e k o s P o n t .V is i b i l it y = V i s i b i l i t y . H idden;
u j J a t e k . V i s i b i l i t y = V i s i b i l i t y . Hidden;
}
g e p p o n t = 0;
e m b e r p o n t = 0;
g ep P o n t. C ontent = C o n v e rt. T o S trin g (g e p p o n t);
j a t e k o s P o n t . C ontent = C o n v e rt. T o S trin g (e m b e rp o n t);
8.5. A Timer
WPF-ben is lehetőség van arra, hogy a program futása során eltelt időt figyeljük,
lekérdezzük és az értéket szükség szerint felhasználjuk. Mindezt a következő példa
megoldása során láthatjuk a gyakorlatban is.
66. feladat:
Készítsünk alkalmazást, amelyben egy mozgó labdát kell visszaütni egy vízszinte
sen mozgó ütő segítségével! Minden visszaütés 1 pontot ér,a játékban és az ütőt
egérmozgatással vezéreljük! A labda pattanjon vissza a játéktér határairól, kivéve
alul! Az elért pontszámot írjuk ki a képernyőre!
A visszaütés után a labda sebessége növekedjen, vagy ugyanannyi maradjon és az
iránya is változzon kis mértékben! A játék végén jelenjen meg az újrakezdéshez és
a kilépéshez szükséges információ! A játékból az Escape billentyűvel bármikor ki
tudjon lépni a felhasználó!
Név: WPF5
A XAML rész:
<Window x : C lass= "W P F 5 . MainWindow"
x m ln s= "h t t p : / / s c h e m a s . m i c r o s o f t . c o m /w in f x /2 0 0 6 /x a m l/
p re s e n ta tio n ”
x m ln s :x = ”h t t p : / / s c h e m a s . m i c r o s o f t . c o m /w in fx /2 0 0 6 /
x a m l”
x m ln s : d = ”h t t p : / / s c h e m a s . m i c r o s o f t . c o m /e x p r e s s io n /
b l e n d /2 0 0 8 ”
x m ln s:m c= ”h t t p : / / s c h e m a s . o p e n x m lf o r m a ts . o r g /m a r k u p -
c o m p a tib ility /2 0 0 6 "
x m ln s : l o c a l = ” c l r - n a m e s p a c e : WPF5”
m c :I g n o r a b le = ”d"
T i t l e = ”T e n i s z ” KeyDown=”Window_KeyDown" W id th = "1 0 0 0 ff
W in d o w s P r e s e n t a t io n F o u n d a t io n
170
</C anvas>
</G rid>
</Window>
p r i v a t e Random v s z = new R a n d o m ( ) ;
p r i v a t e i n t sebessegX = 1 , sebessegY=2 , p o n t = 0 ,
x=200 , y=200;
p r i v a t e v o i d W indow _K eyD ow n(object s e n d e r ,
K e y E v e n t A r g s e)
{
if (e.K ey == K e y . E s c a p e ) t h i s . C lo s e ();
if (e.K ey == K e y . F I )
{
s e b e s s e g X = 1;
s e b e s s e g Y = 1;
p o n t = 0;
x = 200;
y = 200;
veg e.V is ib ility = V i s i b i l i t y . H idden;
}
}
}
FELHASZNÁLT IRODALOM
UJ SZAKKIFEJEZESEK
TM-11205
ISBN 978-963-275-124-5
789632"751245"
ni«