C# programok ismertetése érdeklődőknek kezdőktől haladókig

C# MŰHELY

C# MŰHELY

Oktális szám olvasása

2020. július 10. - Benkő Tiborné

Írjunk függvényt 6 jegyű oktális szám beolvasására. A függvény ellenőrizze, hogy az oktális szám pontosan 6 jegyű legyen, digitjei csak 0..7 közé eshetnek.

A feladat megoldása

A függvény ellenőrzi a beolvasást, hiba esetén a pozícióval együtt kiírja a hibás számjegyet és nem fogad el 6 jegynél nagyobb számot:

        static string oct_read(string oct, out int hiba1,
                                           out int hiba2)
        {
            int i, h, k;
            hiba1 = hiba2 = 0;
            h = oct.Length;
            if (h == 6)
            {
                for (i = 0; i < h; i++)
                {
                    k = oct[i] - '0';
                    if (k > 7)   // bit vizsgálat
                    {
                        hiba1 = i + 1;
                        return oct;
                    }
                }
            }
            else
            if (h < 6 || h > 6)
                hiba2 = h;       
            return oct;
        }

        // Ellenőrzött olvasás
        private void button1_Click(object sender, EventArgs e)
        {
            string oct1, oct1_jó = "";
            int hiba1 = 0, hiba2 = 0;
            textBox2.Text = "";
            if (textBox1.Text != "")
            {
                oct1 = textBox1.Text;
                oct1_jó = oct_read(oct1, out hiba1, out hiba2);
                if( hiba2 != 0)
                {
                    MessageBox.Show("A szám hatjegyű lehet:  ez " +
                                    hiba2.ToString(),"Hibajelzés");
                    textBox1.Text = "";
                }
                if (hiba1 != 0)
                {

                    MessageBox.Show("adat: " +oct1.ToString()+"\n"+
                                    hiba1.ToString()+
". digit hibás! ",
                                    "Hibajelzés");
                    textBox1.Text = "";
                }
                if(hiba1 == 0 && hiba2 == 0)
                {
                    textBox1.Text = oct1_jó;
                    textBox2.Text = oct1_jó;
                }
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox2.Text = "";
        }

A program futási eredményei:

 

    

     

Műveletek

Írjunk programot, amely beolvas két valós adatot és kiszámítja az összegüket, különbségüket, szorzatukat, hányadosukat, számtani közepüket, mértani közepüket, és a nagyobbik adat négyzetét.

A feladat megoldása

        double a, b, ered;
        private void Adatmegadása_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "" && textBox2.Text != "")
            {
                a = Double.Parse(textBox1.Text);
                b = Double.Parse(textBox2.Text);
            }
        }

        private void Összeadás_Click(object sender, EventArgs e)
        {
            ered = a + b;
            textBox3.Text = ered.ToString();
            label3.Text = "Összadás";
        }

        private void Kivonás_Click(object sender, EventArgs e)
        {
            ered = a - b;
            textBox3.Text = ered.ToString();
            label3.Text = "Kivonás";  
        }

        private void Szorzás_Click(object sender, EventArgs e)
        {
            ered = a * b;
            textBox3.Text = ered.ToString();
            label3.Text = "Szorzás";  
        }

        private void Osztás_Click(object sender, EventArgs e)
        {
            if (b != 0)
            {
                ered = a / b;
                label3.Text = "Osztás";
                textBox3.Text = ered.ToString();
            }
            else
                textBox3.Text = "Az osztandó zérus!";
        }

        private void Számtani_közép_Click(object sender, EventArgs e)
        {
            ered = (a + b)/2;
            textBox3.Text = ered.ToString();
            label3.Text = "Számtani közép";
        }

        private void Mértani_közép_Click(object sender, EventArgs e)
        {
            label3.Text = "Mértani közép";
            if (a * b > 0)
            {
                ered = Math.Sqrt(a * b);
                textBox3.Text = ered.ToString();
            }
            else
            {
                MessageBox.Show("A szorzat negatív!", "Üzenet");
                textBox3.Text = "Nem pozitív";
            }
        } 

        private void Négyzet_Click(object sender, EventArgs e)
        {
            double max;
            max = b;
            if (a > b) max = a;
            ered = Math.Pow(max, 2);
            textBox3.Text = ered.ToString();
            label3.Text = "Nagyobb adat négyzete";
        }

        private void Kilépés_Click(object sender, EventArgs e)
        {
             Application.Exit();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox3.Text = ""; a = 0; b = 0;
            label3.Text = "Művelet eredménye";
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            textBox3.Text = ""; a = 0; b = 0;
            label3.Text = "Művelet eredménye";
        }

A program futási eredményei:

    

   

Permutáció

Írjunk programot, amely a megadott szó permutációját végzi el.

 Vizsgálat történik arra, hogy a szó hossza 2-8 között lehet.

 A feladat megoldása

            const int maxnum = 8;
        StringBuilder szo;
        int nbetu, nperm;

        private void button1_Click(object sender, EventArgs e)
        {
            if(textBox1.Text != "")
            {
                szo = new StringBuilder(textBox1.Text);
                listBox1.Items.Clear();
                nbetu = szo.Length;
                nperm = 1;
                if (nbetu >= 2 && nbetu < maxnum + 1)
                {
                    permut(nbetu - 1);
                }
                else
                {
                     MessageBox.Show("Hibás adat: 2-8 között lehet!",
                                     "Figyelmeztetés");
                     textBox1.Text = "";
                     listBox1.Items.Clear();
                }
            }
        }

        private void swapnm(int n, int m)
        {
            char z = szo[n];
            szo[n] = szo[m];
            szo[m] = z;
        }

        private void permut(int k)
        {
            for (int i = 0; i <= k; i++)
            {
                swapnm(i, k);
                if (k != 0)
                {
                     permut(k - 1);
                }
                else
                {
                    listBox1.Items.Add(nperm.ToString("00000") +
                                       " - " + szo);
                    nperm++;
                }
                swapnm(k, i);
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }

A program futási eredményei:

    

Válogatás

Írjunk programot, amely egy adott számsorozatból kiválogatja a páros és páratlan számokat, megszámlálja és kiszámítja az összegüket. Valamint megkeresi a 3-mal oszthatókat is. Az adatokat véletlenszám-generátorral állítjuk elő, ahol megadjuk az adatok számát és a generált érték maximumát.

A feladat megoldása 

        int db, adat;
        private void Generálás_Click(object sender, EventArgs e)
        {
            int max;
            Random m = new Random();
            listBox1.Items.Clear();
            if (textBox1.Text != "" && textBox2.Text != "")
            {
                db = Int32.Parse(textBox1.Text);
                max = Int32.Parse(textBox2.Text);
                for (int i = 0; i < db; i++)
                {
                    adat = m.Next(max) + 1;
                    listBox1.Items.Add(adat);
                }
                Generálás.Enabled = false;
            }
        }

        private void Válogatás_Click(object sender, EventArgs e)
        {
            int i, pt_db, p_db, oszt3_db;
            int páros_össz, pt_össz, összes_adat;
            pt_db = 0; p_db = 0; oszt3_db = 0;
            páros_össz = 0; pt_össz = 0; összes_adat = 0;
            for (i = 0; i < db; i++)
            {
                adat = (int)listBox1.Items[i];
                összes_adat += adat;
                if (adat % 2 == 0)
                {
                    listBox2.Items.Add(adat);
                    páros_össz += adat;
                    p_db++;
                }
                else
                {
                    listBox3.Items.Add(adat);
                    pt_össz += adat;
                    pt_db++;
                }
                if (adat % 3 == 0)
                {
                     oszt3_db++;
                }
                textBox3.Text = összes_adat.ToString();
                textBox4.Text = páros_össz.ToString(); 
                textBox5.Text = pt_össz.ToString();
                textBox6.Text = p_db.ToString();
                textBox7.Text = pt_db.ToString();
                textBox8.Text = oszt3_db.ToString();
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            textBox3.Text = ""; textBox4.Text = "";
            textBox5.Text = ""; textBox6.Text = "";
            textBox7.Text = ""; textBox8.Text = "";
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            listBox3.Items.Clear();
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            textBox3.Text = ""; textBox4.Text = "";
            textBox5.Text = ""; textBox6.Text = "";
            textBox7.Text = ""; textBox8.Text = "";
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            listBox3.Items.Clear();
        }

        private void Törlés_Click(object sender, EventArgs e)
        {
            textBox3.Text = ""; textBox4.Text = "";
            textBox5.Text = ""; textBox6.Text = "";
            textBox7.Text = ""; textBox8.Text = "";
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            listBox3.Items.Clear();
            Generálás.Enabled = true;
       }

A program futási eredményei:

Fibonacci-sorozat elemeinek megjelenítése

Írjunk programot, amely megjeleníti a Fibonacci-sorozatot az n-edik elemig.

Fibonacci-számok  az egyik legismertebb másodrendben rekurzív sorozat elemei. A nulladik eleme 0, az első eleme 1. A számsor lényege, hogy minden szám az azt megelőző két szám összege, azaz a további elemeket az előző kettő összegeként kapjuk.

A Fibonacci-számok végtelen, növekvő sorozatot alkotnak; ennek első néhány eleme a nulladiktól kezdve   0, 1, 2, 3, 5, 8, 13, 21, 34.  

A feladat megoldása

         static long fibonacci(long n)
        {
            if (n < 2) return n;
            else
               return fibonacci(n - 1) + fibonacci(n - 2);
        }

        private void Számol_Click(object sender, EventArgs e)
        {
            long n, elem;
            if (textBox1.Text != "")
            {
                n = Int64.Parse(textBox1.Text);
                elem = fibonacci(n);
                textBox2.Text = elem.ToString();
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
             textBox2.Text = ""; listBox1.Items.Clear();
        }

        private void Sorozat_Click(object sender, EventArgs e)
        {

            long n, i, elem;
            string s;
            listBox1.Items.Clear();
            s = " n      elem";
            listBox1.Items.Add(s);
            if (textBox1.Text != "")
            {
                n = Int64.Parse(textBox1.Text);
                for (i = 0; i <= n; i++)
                {
                    elem = fibonacci(i);
                    s = i.ToString() + "        " + elem.ToString();
                    listBox1.Items.Add(s);
                }
             }
          }

A program futási eredményei:

 

Fibonacci-sorozat n-edik tagjának meghatározása

Írjunk programot, amely meghatározza a Fibonacci-sorozat n-edik tagját.

Fibonacci-számok  az egyik legismertebb másodrendben rekurzív sorozat elemei. A nulladik eleme 0, az első eleme 1. A számsor lényege, hogy minden szám az azt megelőző két szám összege, azaz a további elemeket az előző kettő összegeként kapjuk.

A Fibonacci-számok végtelen, növekvő sorozatot alkotnak; ennek első néhány eleme a nulladiktól kezdve   0, 1, 2, 3, 5, 8, 13, 21, 34.  

A feladat megoldása

        static long fibonacci(long n)
        {
            if (n < 2) return n;  
            else
               return fibonacci(n - 1) + fibonacci(n - 2);
        }

        private void Számol_Click(object sender, EventArgs e)
        {
            long n, elem;
            if(textBox1.Text !=  "")
            {
                 n = Int64.Parse(textBox1.Text);
                 elem = fibonacci(n);
                 textBox2.Text = elem.ToString();        
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
             textBox2.Text = "";
        }

A program futási eredményei:

   

 

Számjegyek megfordítása

Írjunk programot, amely egy pozitív egész szám jegyeit megfordítva írja vissza. Oldjuk meg a feladatot rekurzív függvénnyel is.

A feladat megoldása

        static string Számfordít(int sz, string s)
        {
            s = (sz % 10).ToString();  
            sz /= 10;
            if (sz != 0)
                return s + Számfordít(sz,s);  
            else
                return s;
        }

         private void Számfordítás_Click(object sender, EventArgs e)
         {
            int szám;
            string s1 = "", s2= "";
            if (textBox1.Text != "")
            {
                szám = Int32.Parse(textBox1.Text);
                if (szám > 0)
                {
                    s1 = Számfordít(szám, s1);
                    textBox3.Text = s1;
                    while (szám != 0)
                    {
                        s2 += szám % 10;
                        szám /= 10;
                    }
                    textBox2.Text = s2;
                }
                else
                {
                    MessageBox.Show("Hibás adat!", "Üzenet");
                    textBox1.Text = "";
                }
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
              textBox2.Text = ""; textBox3.Text = "";
        }

A program futási eredményei:

 

Számtani sor

Írjunk programot, amely a megadott első tag és a differencia ismeretében kiszámítja a számtani sorozat n-edik tagját rekurzív függvénnyel.

A feladat megoldása

        static int Számtanisor(int a, int d, int n)
        {
            if (n == 1)
                return a;
            else
                return d + Számtanisor(a, d, n - 1);
        }
        int első, diff, szám;

        private void Végrehajtás_Click(object sender, EventArgs e)
        {
            int n_edik;
            if (textBox1.Text != "" && textBox2.Text != "" &&
                textBox3.Text != "")
            {
                első = Int32.Parse(textBox1.Text);
                diff = Int32.Parse(textBox2.Text);
                szám = Int32.Parse(textBox3.Text);
                n_edik = Számtanisor(első,diff,szám);
                textBox4.Text = "A sorozat " + szám + ". tagja: "
                                + n_edik;
            }
        }

        private void Kiírás_Click(object sender, EventArgs e)
        {
            string s;
            s = "";
            listBox1.Items.Clear();
            listBox1.Items.Add("1.elem: " + első);
            s = 1 + ".elem: " + első;
            s = "";
            for (int i = 2; i <= szám; i++)
            {
                első += diff;
                s = i + ".elem: " + első;
                listBox1.Items.Add(s);
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
             textBox4.Text = ""; listBox1.Items.Clear();
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
             textBox4.Text = ""; listBox1.Items.Clear();
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
              textBox4.Text = ""; listBox1.Items.Clear();
        }

A program futási eredményei:

 

 

 

Mértani sor

Írjunk programot, amely a megadott első tag és a hányados ismeretében kiszámítja a mértani sorozat n-edik tagját rekurzív függvénnyel.

A feladat megoldása:

          static int Mértanisor(int a, int h, int n)
        {
            if (n == 1)
                return a;
            else
                return h * Mértanisor(a, h, n - 1);
        }
        int első, hányad, szám;
        private void Végrehajtás_Click(object sender, EventArgs e)
        {
            int n_edik;
            if (textBox1.Text != "" && textBox2.Text != "" &&
                textBox3.Text != "")
            {
                első = Int32.Parse(textBox1.Text);
                hányad = Int32.Parse(textBox2.Text);
                szám = Int32.Parse(textBox3.Text);
                n_edik = Mértanisor(első, hányad, szám);
                textBox4.Text = "A sorozat " + szám + ". tagja: "
                                + n_edik;
            }
        }

        private void Kiírás_Click(object sender, EventArgs e)
        {
            string s;
            s = "";
            listBox1.Items.Clear();
            listBox1.Items.Add("1.elem: " + első);
            s = 1 + ".elem: " + első;
            s = "";
            for (int i = 2; i <= szám; i++)
            {
                első *= hányad;
                s = i + ".elem: " + első;
                listBox1.Items.Add(s);
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
             textBox4.Text = ""; listBox1.Items.Clear();
        }

                  private void textBox2_TextChanged(object sender, EventArgs e)
        {
             textBox4.Text = ""; listBox1.Items.Clear();
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
             textBox4.Text = ""; listBox1.Items.Clear();
        }

A program futási megoldásai:

 

 

Pascal-háromszög

 Írjunk programot, amely a megadott sorig megjeleníti a Pascal-háromszög sorait.

 A Pascal-háromszög első hat sorát jelenítjük meg.
Ha az elemek soron belüli indexe
      
akkor p(n,k) jelölje az n-edik sor, k. elemét. 
Például a 4-edik sor 3-adik eleme: p(4,3) = 6.

 Az elemek meghatározásának rekurzív algoritmusa:

ha k= 0 vagy k=n, akkor p(n,k) = 1, egyébként pedig p(n,k) = p(n-1,k-1) + p(n-1,k)

Például 5. sor 2. eleme:   p(5,2) = p(4,1) + p(4,2)

                                        p(5,2) =   1  +  4 =  5

 A nem rekurzív algoritmus valójában a binomiális együtthatók képlete:

A feladat megoldása:

            private void Létrehoz_Click(object sender, EventArgs e)
        {
            if (textBox2.Text != "")
            {
                int sorokSzáma = Convert.ToInt32(textBox2.Text);
                int mezőSzélesség = (int)(6 * Math.Log(sorokSzáma));
                long binomEgyüttható = 0;
                string szövegsor;
                textBox1.Text = "";
                // soronként állítjuk elő a Pascal háromszöget
                for (int sor = 1; sor <= sorokSzáma; sor++)
                {
                    // bevezető szóközök
                    szövegsor = new string(' ', mezőSzélesség *
                                           sorokSzáma - sor) / 2);
                    // az aktuális sorban a binomiális
                    // együtthatók számítása
                    binomEgyüttható = 1;
                    for (int oszlop = 0; oszlop < sor; oszlop++)
                    {
                        if (oszlop > 0)
                        {
                             binomEgyüttható = binomEgyüttható *
                                         (sor - oszlop) /
oszlop;
                        }
                        szövegsor += string.Format("{0," +
                                           mezőSzélesség + "}",

                                           binomEgyüttható);
                    }
                    textBox1.Text += szövegsor + "\r\n";
                }
             }
         }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            textBox1.Text = "";
        }

A program futási eredményei:

süti beállítások módosítása