C# ciklusok (iterációk)

10. osztály 10évf_c# C# programozás Programozás

While ciklus (elöltesztelő ciklus)

ciklus

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?

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

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!

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é!

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…

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!

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…)

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)

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:

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!

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)

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!

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();