While ciklus (elöltesztelő ciklus)
![ciklus](https://viktortaylor.files.wordpress.com/2020/03/ciklus.jpg)
Mondhatnám, hogy először lő, aztán kérdez… de igazából először vizsgál aztán végez. A ciklus megvizsgálja a feltételt, majd utána végzi el az utasításokat. Ezt addig ismétli, míg igaz a feltétel. Mindig kell lennie egy kilépési feltételnek, mert különben végtelen ciklust írunk, az meg nem jó senkinek.
Break: a ciklusból való kilépést, és a ciklus futásának felfüggesztését eredményezi.
Continue: a ciklusfutását úgy változtatja meg, hogy ha elér a continuig a ciklusmag az utána következő ciklusutasításokat nem fogja figyelembe venni, hanem visszatér a ciklus elejére és folytatja azt, átugorja az adott ciklusmagot és a következőnél folytatja.
A break és a continue használata nem ajánlott, mert nem része a strukturált programozásnak!
Példa: írassunk ki egy szöveget (stringet) betűnként! A szöveg hosszát a Length függvénnyel tudjuk lekérdezni. Plusz feladat: hány karakter hosszú? Mi az első karaktere?
1 2 3 4 5 6 7 8 9 10 11 12 |
string szöveg="Teszt szöveg!"; int i=0; int db=0; string elso=szöveg[0].ToString(); while(i<szöveg.Length) // a string végéig { Console.WriteLine(szöveg[i]); i++; db++; } Console.WriteLine(db); Console.WriteLine(elso); |
Hátultesztelő ciklus, do-while
![ciklus2](https://viktortaylor.files.wordpress.com/2020/03/ciklus2.jpg)
A hátultesztelő ciklus a nevéből adódóan
először a ciklusmagban lévő utasítást hajtja végre, majd utána vizsgálja meg a feltételt, ha a feltétel igaz, akkor újra
végrehajtja az utasítást…
Legalább 1-szer lefut a ciklusmag.
Példa: készítsük el az ötös szorzótáblát!
1 2 3 4 5 6 7 |
int i = 1, n = 5, szorzat; do { szorzat= n * i; Console.WriteLine("{0} * {1} = {2}", n, i, szorzat); i++; } while (i <= 10); |
Számláló ciklus, for
Úgy működik, mint egy while azzal a különbséggel, hogy itt létrehoztunk egy számlálót (i) és ennek változtatásával tudjuk a feltételt folyton vizsgálni. az első része int i = 0;
létrehozzuk a segédváltozót a második része a feltétel, és végül az i++ az i értékét növeli 1-el. For-nál mindig az i++ formát használjuk!
Példa: Állítsunk elő véletlenszerűen 6egész számot 0-60 között, írassuk ki őket egymás mellé!
1 2 3 4 5 6 7 8 |
int szam=0, i=0; Random vsz = new Random(); for (i=1; i<=6; i++) { szam=vsz.Next(61); Console.Write("{0,6}",szam); } Console.ReadLine(); |
Példa: Állítsunk elő 42db egész számot -100 és 100 között, egy sorban csak 6 szám legyen! Számoljuk meg, hány db pozitív számot sorsolt! Ha az i -t elosztjuk 6-tal, és a maradék 0, akkor WriteLine utasítással írjuk ki, ezért új sorban folytatja 6db szám után…
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int szam=0, i=0; db=0; Random vsz = new Random(); for (i=1; i<=42; i++) { szam=vsz.Next(-100,101); if (szam>0) db++; if (i%6==0) Console.WriteLine("{0,6}",szam); else Console.Write("{0,6}", szam); } Console.WriteLine(); Console.WriteLine("{0} db pozitív számot sorsolt.",db); Console.ReadLine(); |
Példa: fej vagy írás játék szimulálása. Dobjunk fel egy pénzt megadott alkalommal, és véletlenszerűen döntse el a program, hogy fej vagy írás lesz. Számoljuk meg, melyikből mennyi lett!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Console.Write("Hanyszor dobjuk fel az érmét?"); int db=int.Parse(Console.ReadLine()); int fej=0; int iras=0; for (int i=0; i<db; i++) { Random veletlen = new Random(); int dobas = veletlen.Next(0,100); //Console.Write("{0},", dobas); Ha szeretnénk látni mit sorsol if (dobas%2==0) { fej ++; } else { iras ++; } } Console.WriteLine("{0} db fej, {1} db iras. " , fej, iras); Console.ReadLine(); |
A véletlen számok
A c# a Random utasítást (osztályt) használja a véletlen számok előállítására.
Példa: Random veletlen = new Random(); Ekkor a véletlen számunk egész szám lehet. A konkrét változónk neve legyen veletlenSzam
veletlenSzam = veletlen.Next(100); //a szám értéke 0-99 közötti egész szám lesz
Ha szeretnénk negatív számokat is:
veletlenSzam = veletlen.Next(101)-50; vagy veletlenSzam = veletlen.Next(-50;51); Mindkét módszerrel -50 és 50 közötti számokat fogunk előállítani.
Példa: állítsunk elő 2db egész számot 1-6 között, és döntsük el, melyik a nagyobb. (Hasonló, mint a JavaScriptes dobókockás feladat…)
1 2 3 4 5 6 7 8 9 10 11 12 |
int a=0, b=0; Random vsz=new Random(); Console.WriteLine("Két szám vizsgálata"); a=vsz.Next(7); b=vsz.Next(7); 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.ReadLine(); |
A házi feladat megoldása:
Készítsen konzolos alkalmazást, amely mezőgazdasági jóslást végez.
A program kérje be az rozs mennyiségét tonnában. Ez alapján számolja ki egy véletlenszerűen generált szorzóval (3-20) a várható hozamot, és írja ki a mennyiségét.
A szorzó alapján elemezze és írja ki, hogy milyen év várható: átlag alatti (3-8), átlagos év (9-15), átlag feletti (15-20)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Random rnd = new Random(); int mag; int szorzo; int hozam; Console.Write("Búza mennyisége tonnában: "); mag = int.Parse(Console.ReadLine()); szorzo=rnd.Next(3,20); hozam = mag*szorzo; Console.WriteLine("A várható mennyiség {0}.",hozam); if (szorzo>=3 && szorzo <= 8) Console.WriteLine("Átlag alatti év várható."); else if(szorzo>=9 && szorzo <= 15) Console.WriteLine("Átlagos év várható."); else if (szorzo>=15 && szorzo<=20) Console.WriteLine("Átlag feletti év várható."); Console.ReadLine(); |
További FOR ciklus gyakorló feladatok:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
using System; namespace gyakorlas { class Program { static void Main(string[] args) { Console.WriteLine("5db véletlenszám:"); int i = 0, szam = 0; Random vsz = new Random(); for (i = 1; i <= 5; i++) { szam = vsz.Next(51); Console.WriteLine("{0} szám: {1}",i,szam); } //számok 1-100 között minden szám for (i = 1; i <= 100; i++) { Console.Write("{0} ", i); if (i % 10 == 0) Console.WriteLine(); } /*40db véletlenszám, -100 és 100 közötti egy sorban 8 szám! Hány db pozitív, negatív, páros, páratlan szám van közöttük?*/ szam = 0; int pozdb = 0; //pozitív számok száma int negdb = 0; //negatív számok száma int parosdb = 0; //páros számok száma int paratlandb = 0; //páratlan számok száma int pozparosdb = 0; //pozitív páros számok darabszáma for (i = 1; i <= 40; i++) { szam = vsz.Next(-100,101); if (szam > 0) pozdb++; if (szam < 0) negdb++; if (szam % 2 != 0) paratlandb++; if (szam % 2 == 0) parosdb++; if (szam % 2 == 0 && szam > 0) pozparosdb++; if (i % 8 == 0) Console.WriteLine("{0,4}",szam); else Console.Write("{0,4}", szam); } Console.WriteLine(); Console.WriteLine("{0} db pozitív szám van.", pozdb); Console.WriteLine("{0} db negatív szám van.", negdb); Console.WriteLine("{0} db páros szám van.", parosdb); Console.WriteLine("{0} db páratlan szám van.", paratlandb); Console.WriteLine("{0} db + páros szám van.", pozparosdb); // 15db * karakter egy sorban for (i = 1; i <= 15; i++) { Console.Write("*"); } Console.WriteLine(); // Számok 1-től 20-ig, négyzetük, négyzetgyökük for (i = 1; i <= 20; i++) { Console.WriteLine("Szám: {0, 0000} Négyzete: {1, 0000}, Négyzetgyöke: {2, 0000}", i, Math.Pow(i,2), Math.Sqrt(i)); } /* Írassuk ki 99-től 0 -ig csökkenő sorrendben a hárommal osztható számokat */ for (i=99; i>=0; i--) { if (i % 3 == 0) Console.Write("{0,000} ",i); } } } } |
Számoljuk meg, hogy 100x dobás során egy szimulált dobókockánál hányszor szerepelnek az egyes számok!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; namespace dobokockas { class Program { static void Main(string[] args) { Random veletlen = new Random(); int ertek1 = 0; int ertek2 = 0; int ertek3 = 0; int ertek4 = 0; int ertek5 = 0; int ertek6 = 0; int kocka1 = 0; for (int i = 0; i < 100; i++) { kocka1 = veletlen.Next(1,7); switch (kocka1) { case 1: ertek1++; break; case 2: ertek2++; break; case 3: ertek3++; break; case 4: ertek4++; break; case 5: ertek5++; break; case 6: ertek6++; break; } } Console.WriteLine("{0}db,{1}db,{2}db,{3}db,{4}db,{5}db" ,ertek1, ertek2, ertek3, ertek4, ertek5, ertek6); } } } |
Feladat: Jancsi és Juliska 2db dobókockával játszik. 10 körből áll a játék, az nyer, aki a körökben többször nyer. Írassuk ki végső játékállást, és a nyertest! (döntetlent is)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int jancsi=0; int kocka1 = 0; int juliska=0; int kocka2 = 0; Random vsz = new Random(); //jancsi és juliska a nyertes körök számát tárolja for (int i = 1; i <= 10; i++) { kocka1 = vsz.Next(1, 7); //1-6 közötti véletlen szám kocka2 = vsz.Next(1, 7); if (kocka1 > kocka2) jancsi++; else if (kocka2 > kocka1) juliska++; } Console.WriteLine("Állás: Jancsi {0} - Juliska {1}",jancsi, juliska); if (juliska > jancsi) Console.WriteLine("Juliska nyert!"); else if (jancsi > juliska) Console.WriteLine("Jancsi nyert!"); else Console.WriteLine("Döntetlen!"); |
Feladat: Dobjunk 3db dobókockával, és számoljuk meg, melyik értéket (3..18) hányszor sikerült dobni!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int[] db = new int[19]; // Az 1-től 18-ig terjedő számok száma, 0 kezdőérték for (int k = 3; k <= 18; k++) { db[k] = 0; } Random rnd = new Random(); for (int i = 1; i <= 10000; i++) { int kocka1 = rnd.Next(1, 7); // Véletlenszerű dobások int kocka2 = rnd.Next(1, 7); int kocka3 = rnd.Next(1, 7); int osszeg = kocka1 + kocka2 + kocka3; // Összeszámolja a dobásokat db[osszeg]++; // Dobások összegének tárolása a tömbben } for (int k = 3; k <= 18; k++) { Console.WriteLine("{0}:{1}", k, db[k]); // Kiírja a db[xs] értékét az adott dobásszámhoz } Console.ReadKey(); |
Feladat: Egy szám prímtényezős felbontása
Egy szám prímtényezős felbontását az alábbi módon lehet megkapni:
- Ha a szám prím, akkor írd fel a prímtényezős felbontás listájába, és készen vagy.
- Ha a szám nem prím, keresd meg a legkisebb prímet, amivel maradék nélkül osztható (ehhez egymás után meg kell próbálni elosztani az egyes prímszámokkal).
- A 2. pontban kapott prím lesz a prímtényezős felbontás egyik eleme, írd fel a listába, majd oszd el vele a számot!
- Ugorj az első pontra, és ismételd meg az eljárást a 3. pontban végzett osztás eredményét használva.
Forrás: https://lexiq.hu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace primtenyezos { class Program { static void Main(string[] args) { Console.Write("Kérem, adjon meg egy pozitív egész számot: "); if (int.TryParse(Console.ReadLine(), out int szam) && szam > 0) { Console.WriteLine($"A(z) {szam} prímtényezős felbontása:"); Console.Write(Convert.ToString(szam).PadLeft(8)); int oszto = 2; while (szam > 1) { if (szam % oszto == 0) { Console.WriteLine(Convert.ToString(oszto).PadLeft(8)); szam /= oszto; Console.Write(Convert.ToString(szam).PadLeft(8)); } else { oszto++; } } } else { Console.WriteLine("Hibás bemenet. Kérem, adjon meg egy pozitív egész számot."); } Console.ReadKey(); } } } |