c#

C# ciklusok (iterációk)

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?

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!

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

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…

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!

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

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)

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

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:

  1. Ha a szám prím, akkor írd fel a prímtényezős felbontás listájába, és készen vagy.
  2. 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).
  3. 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!
  4. 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

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