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

C# MŰHELY

C# MŰHELY

Római számok képzése függvénnyel

2020. június 11. - Benkő Tiborné

 Írjunk programot, amely az arab számokat alakítja át római számokká függvénnyel.

 A római számokban felhasznált betűk az I V X L C D M  a  latin ábécéből származnak.

     Szám     Római szám
 ---------------------------------
         1            I
         4                   IV
         5           V
         9                   IX
        10          X 
        40                  XL  
        50          L
        90                 XC
      100         C
      400                 CD
      500         D
      900                 CM
    1000         M

 A legnagyobb római szám 3999 római számokkal: MMMCMXCIX.
A római számokat ma is használják:

  • Budapest kerületeinek jelzésére pl. XI. kerület.
  • régi épületek építési évének jelzésére.
  • fejezet sorszámozására,
  • uralkodók sorszámozására.

 A feladat megoldása:

// RómaiSzámok függvény
static void RómaiSzámok(int szám, out string római_szám)
{
    int ezer, száz, tizes, egyes, i;
    római_szám = "";
    if (szám <= 3999 && szám > 0)
    {
       ezer = szám / 1000;
       switch (ezer)
       {
          case 1: római_szám += "M"; break;
          case 2: római_szám += "MM"; break;
          case 3: római_szám += "MMM"; break;
       }
       szám %= 1000;
       if (szám <= 999 && szám > 0)
       {
           száz = szám / 100;
           if (száz == 9)
               római_szám += "CM";
           else if (száz >= 5)
           {
              római_szám += "D";
              száz -= 5;
           }
           if (száz == 4)
              római_szám += "CD";
           if (száz <= 3)
           { 
              for (i = 1; i <= száz; i++)
                 római_szám += "C";
           }
           szám %= 100;
           if (szám > 0 && szám <= 99)
           {
               tizes = szám / 10;
               if (tizes == 9)
                   római_szám += "XC";
               else if (tizes >= 5)
               {  
                   római_szám += "L";
                   tizes -= 5;
               }
               if (tizes == 4)
                   római_szám += "XL";
               if (tizes > 0 && tizes <= 3)
               {
                    for (i = 1; i <= tizes; i++)
                       római_szám += "X";
               }
               szám %= 10;
               if (szám > 0)
               {
                   egyes = szám;
                   switch (egyes)
                   {
                      case 1: római_szám += "I";
                              break;
                      case 2: római_szám += "II";
                              break;
                      case 3: római_szám += "III";
                              break;
                      case 4: római_szám += "IV";
                              break;
                      case 5: római_szám += "V";
                              break;
                      case 6: római_szám += "VI";
                              break;
                      case 7: római_szám += "VII";
                              break;
                      case 8: római_szám += "VIII";
                              break;
                      case 9: római_szám += "IX";
                              break;
                  }
               }
            }
         }
      }
  } 

  private void Konvertálás_Click(object sender, EventArgs e)
  {
     string római_szám;
     int szám;
     if (textBox1.Text != "")
     {
        szám = Int32.Parse(textBox1.Text);
        if (szám <= 0 || szám > 3999)
        {
            MessageBox.Show(
                       " A szám nincs a 1-3999 határ között!",
                       "Hibajelzés");
            textBox1.Text = "";
        }
        RómaiSzámok(szám, out római_szám);
        textBox2.Text = római_szám;
    }
  }

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

A program futási eredményei:

     

     

 

Római számok képzése

 Írjunk programot, amely az arab számokat alakítja át római számokká.

 A római számokban felhasznált betűk az I V X L C D M  a  latin ábécéből származnak.

     Szám     Római szám
 ---------------------------------
         1            I
         4                   IV
         5           V
         9                   IX
        10          X 
        40                  XL  
        50          L
        90                 XC
      100         C
      400                 CD
      500         D
      900                 CM
    1000         M

A legnagyobb római szám 3999 római számokkal: MMMCMXCIX.
A római számokat ma is használják:

  • Budapest kerületeinek jelzésére pl. XI. kerület.
  • régi épületek építési évének jelzésére.
  • fejezet sorszámozására,
  • uralkodók sorszámozására.

 A feladat megoldása:

private void Konvertálás_Click(object sender, EventArgs e)
{
     int szám, ezer, száz, tizes, egyes, i;
     string római_szám = "";
     if (textBox1.Text != "")
     {
        szám = Int32.Parse(textBox1.Text);
        if (szám <= 0 || szám > 3999)
        {
            MessageBox.Show(
                    " A szám nincs a 1-3999 határ között!",
                    "Hibajelzés");
            textBox1.Text = "";
        }
        else if (szám <= 3999 && szám > 0)
        {
            ezer = szám / 1000;
            switch (ezer)
            {
               case 1: római_szám += "M"; break;
               case 2: római_szám += "MM"; break;
               case 3: római_szám += "MMM"; break;
            }
            szám %= 1000;
            textBox2.Text = római_szám;
            if (szám <= 999 && szám > 0)
            {
                száz = szám / 100;
                if(száz == 9)
                    római_szám += "CM";
                else if (száz >= 5)
                {
                    római_szám += "D";
                    száz -= 5;
                }
                if (száz == 4)
                    római_szám += "CD";
                if(száz <= 3)
                {
                    for (i = 1; i <= száz; i++)
                        római_szám += "C";
                }
                szám %= 100;
                textBox2.Text = római_szám;
                if (szám > 0 && szám <= 99)
                {
                    tizes = szám / 10;
                    if (tizes == 9)
                        római_szám += "XC";
                    else if (tizes >= 5)
                    {
                        római_szám += "L";
                        tizes -= 5;
                    }
                    if (tizes == 4)
                        római_szám += "XL";
                    if (tizes > 0 && tizes <= 3)
                    {
                        for (i = 1; i <= tizes; i++)
                           római_szám += "X";
                    }
                    szám %= 10;
                    textBox2.Text = római_szám;
                    if (szám > 0)
                    {
                         egyes = szám;
                         switch (egyes)
                         {   
                             case 1: római_szám += "I";
                                     break;
                             case 2: római_szám += "II";
                                     break;
                             case 3: római_szám += "III";
                                     break;

                             case 4: római_szám += "IV";
                                     break;
                             case 5: római_szám += "V";
                                     break;
                             case 6: római_szám += "VI";
                                     break;
                             case 7: római_szám += "VII";
                                     break;
                             case 8: római_szám += "VIII";
                                     break;
                             case 9: római_szám += "IX";
                                     break;
                         }
                      }
                      textBox2.Text = római_szám;
                  }
              }
          }
       }
   }

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

A program futási eredményei:

    

    

   

Osztók keresése while ciklussal

Olvassunk be egy pozitív egész számot és írjuk ki az összes osztóját. A feladatot  while ciklussal oldjuk meg.

A feladat megoldásához három egész típusú változóra lesz szükségünk:

  • szám tartalmazza a vizsgálandó számot,
  • osztó tartalmazza az osztót.
  • osztódb az osztók darabszámát tartalmazza.

A feladat megoldása while ciklussal

 Az osztó vál­tozót a ciklus előtt a 2 kezdőértékre kell beállítanunk. A ciklusból a szám /2 elérése után fogunk kilépni.

                  // Osztók keresése while ciklussal
        private void button1_Click(object sender, EventArgs e)
        {
            int osztó, szám, osztódb = 0;
            listBox1.Items.Clear();
            if (textBox1.Text != "")
            {
                szám = Int32.Parse(textBox1.Text);
                if (szám > 0)
                {
                    osztó = 2;
                    while (osztó <= szám / 2)
                    {
                        if (szám % osztó == 0)
                        {
                            listBox1.Items.Add(osztó);
                            osztódb++;
                        }
                        osztó++;
                    } 
                    if (osztódb == 0)
                        textBox2.Text = "PRIMSZÁM";
                    else
                        textBox2.Text = "Osztók darabszáma: " +
                                        osztódb.ToString();
                }
                else
                    MessageBox.Show("Hibás adat!","Üzenet");
            }
        }

        // Ha az adat változik az eredmények törlődnek
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            textBox2.Text = "";
        } 

A program futási eredményei:

     

 

Osztók keresése do while ciklussal

Olvassunk be egy pozitív egész számot és írjuk ki az összes osztóját. A feladatot do while ciklussal oldjuk meg.

A feladat megoldásához három egész típusú változóra lesz szükségünk:

  • szám tartalmazza a vizsgálandó számot,
  • osztó tartalmazza az osztót.
  • osztódb tartalmazza az osztók számát

A feladat megoldása do-while ciklussal

  Az osztó vál­tozót a ciklus előtt a 2 kezdőértékre kell beállítanunk. A do-while ciklus addig működik, míg a feltétel igaz (nem egyelő 0), akkor befejezi be a működését, amikor a feltétel hamissá válik (0) válik. A do while ciklusnál az osztó<= szám / 2 feltétel oldja meg a fel­adatot.

         // Osztók keresése do-while ciklussal
        private void button1_Click(object sender, EventArgs e)
        {
            int osztó, szám, osztódb=0;
            listBox1.Items.Clear();
            if (textBox1.Text != "")
            {
                szám = Int32.Parse(textBox1.Text);
                if (szám > 0)
                {
                    osztó = 2;
                    do
                    {
                        if (szám % osztó == 0)
                        {
                            listBox1.Items.Add(osztó);
                            osztódb++;
                        }
                        osztó++;
                    } while (osztó <= szám / 2);
                    if (osztódb == 0)
                        textBox2.Text = "PRIMSZÁM";
                    else
                        textBox2.Text = "Osztók darabszáma: " +
                                        osztódb.ToString();
                }
                else
                    MessageBox.Show("Hibás adat!","Üzenet");
            }
        }
 
        // Ha az adat változik az eredmények törlődnek
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            textBox2.Text = "";
        }

 A program futási eredményei:

  

Osztók keresése for ciklussal

Olvassunk be egy pozitív egész számot és írjuk ki az összes osztóját. A feladatot for ciklussal oldjuk meg.

Hogyan fogjunk a megoldáshoz?

 A feladat azon számok kiválasztása, melyek a szám osztói 2-től szám/2-ig. Az osztót először a 2-nek választjuk és megnézzük, hogy osztója-e a számnak. Ha igen, megjegyezzük és a következő eggyel növelt osztóval próbálkozunk. Újra megvizsgáljuk, hogy ez osztója-e a számnak. A folyamatot addig végezzük, míg az osztó egyenlő nem lesz szám/2-vel.

 A feladat megoldásához három egész típusú változóra lesz szükségünk:

  • szám tartalmazza a vizsgálandó számot,
  • osztó tartalmazza az osztót.
  • osztódb tartalmazza az osztók számát.

 A feladat megoldása for ciklussal

 A feladatot for ciklussal oldjuk meg, ismert a ciklus kezdőértéke (a legkisebb osztó, 2), a lépésköz (1) és a ciklus végértéke (szám/2). A ciklusvál­tozó minden értékére megvizsgáljuk az oszthatóságot, ha a szám osztható a ciklusváltozóval, beírjuk a lista ablakba.

 Az oszthatóság vizsgálata nagyon egyszerű, hiszen egy szám akkor osztható egy másik számmal, ha maradék nélkül meg van benne. A  % művelet az osztás utáni maradékot adja vissza, ha  ezt feltételes utasítás­ban vizsgáljuk, akkor a nulla jelenti az oszthatóságot. 

       if (szám % osztó ==0)   // osztója     

       else                  // nem osztója

A feladat megoldása:

Mivel pozitív egész számnak keressük az osztóját, a program negatív szám esetén hibajelzést ad.

           // Osztók keresése for ciklussal
        private void button1_Click(object sender, EventArgs e)
        {
            int osztó, szám, osztódb=0;
            listBox1.Items.Clear();
            if (textBox1.Text != "")
            {
                szám = Int32.Parse(textBox1.Text);
                if (szám > 0)
                {
                    for (osztó = 2; osztó <= szám / 2; osztó++)
                    {
                        if (szám % osztó == 0)
                        {
                            listBox1.Items.Add(osztó);
                            osztódb++;
                        }
                    }
                    if (osztódb == 0)
                        textBox2.Text = "PRIMSZÁM";
                    else
                        textBox2.Text = "Osztók darabszáma: " +
                                        osztódb.ToString();
                }
                else
                    MessageBox.Show("Hibás adat!", "Üzenet");
            }
        }

        // Ha az adat változik az előző eredmények törlődnek
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            textBox2.Text = "";
        }

A program futási eredményei:

   

 

Tökéletes számok keresése

Olvassunk be egész számot és vizsgájuk meg, hogy a megadott korlátig mennyi tökéletes szám található. Egy szám akkor tökéletes, ha az osztóinak összege +1 megegyezik a számmal. A tökéletes szám mellett az osztóinak összegét is jelenítsük meg, amelynek 1-el kevesebbnek kell lennie a tökéletes számnál.

A feladat megoldása: 

                 private void Keresés_Click(object sender, EventArgs e)
        {
            int osztó, összeg, szám, vége;
            if (textBox1.Text != "")
            {
                vége = Int32.Parse(textBox1.Text);
                for (szám = 2; szám <= vége; szám++)
                {
                    összeg = 0;
                    for (osztó = 2; osztó <= szám / 2; osztó++)
                    {
                        if (szám % osztó == 0)
                            összeg += osztó;
                    }
                    if ((összeg + 1) == szám)
                    {
                        listBox1.Items.Add(szám);
                        listBox2.Items.Add(összeg);
                    }
                 } 
                 Keresés.Enabled = false;
             }
        }

        private void Törlés_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            listBox1.Items.Clear(); listBox2.Items.Clear();
            Keresés.Enabled = true;
        }

A program futási eredményei:

 

 

 

Tökéletes számok bizonyítása

Olvassunk be egész számot és vizsgájuk meg, hogy tökéletes szám-e. Egy szám akkor tökéletes, ha az osztóinak összege +1 megegyezik a számmal. A tökéletes szám keresésénél részeredményeket jelenítünk meg. 1000000 alatt összesen négy tökéletes szám van: 6, 28, 496, 8128.

A feladat megoldása:

            private void Vizsgálat_Click(object sender, EventArgs e)
        {
            int osztó, összeg = 0, szám;
            if (textBox1.Text != "")
            {
                szám = Int32.Parse(textBox1.Text);
                for (osztó = 2; osztó <= szám / 2; osztó++)
                {
                    if (szám % osztó == 0)
                    {
                        listBox1.Items.Add(osztó);
                        összeg += osztó;
                    }
                }
                textBox2.Text = összeg.ToString();
                textBox3.Text = (összeg+1).ToString();
                textBox4.Text =  szám.ToString();
                if ((összeg + 1) == szám)
                    textBox5.Text = "tökéletes szám ";
               else
                    textBox5.Text = "nem tökéletes szám ";
            }
            Vizsgálat.Enabled = false;
        }

        private void Törlés_Click(object sender, EventArgs e)
        {
            textBox1.Text = ""; textBox2.Text = "";
            textBox3.Text = ""; textBox4.Text = "";
            textBox5.Text = "";
            listBox1.Items.Clear();
            Vizsgálat.Enabled = true;
        }

A program futási eredményei:

   

 

Tökéletes szám

Olvassunk be egész számot és vizsgájuk meg, hogy tökéletes szám-e. Egy szám akkor tökéletes, ha az osztóinak összege +1 megegyezik a számmal. A feladatot oldjuk meg for, while és do-while ciklusutasításokkal.

A feladat megoldása:

         // A feladat megoldása for ciklussal
         private void button1_Click(object sender, EventArgs e)
         {
            int oszto, osszeg = 1, szam;
            if (textBox1.Text != "")
            {
                szam = Int32.Parse(textBox1.Text);
                for (oszto = 2; oszto <= szam / 2; oszto++)
                {
                    if (szam % oszto == 0)
                        osszeg += oszto;
                }
                if (osszeg == szam)
                    textBox2.Text = "tökéletes szám: " + osszeg;
                else
                    textBox2.Text = "nem tökéletes szám: " 
                                     + osszeg;
            }
        }

        // A feladat megoldása while ciklussal

        private void button2_Click(object sender, EventArgs e)
        {
            int oszto, osszeg = 1, szam;
            if (textBox1.Text != "")
            {
                szam = Int32.Parse(textBox1.Text);
                oszto = 2;
                while (oszto <= szam / 2)
                {
                    if (szam % oszto == 0)
                        osszeg += oszto;
                    oszto++;
                }
                if (osszeg == szam)

                    textBox3.Text = "tökéletes szám: " + osszeg;

                else

                    textBox3.Text = "nem tökéletes szám: "
                                     + osszeg;
             }
        }

        // A feladat megoldása do-while ciklussal
        private void button3_Click(object sender, EventArgs e)
        {
            int oszto, osszeg = 1, szam;
            if (textBox1.Text != "")
            {
                szam = Int32.Parse(textBox1.Text);
                oszto = 2;
                do
                {
                    if (szam % oszto == 0)
                        osszeg += oszto;
                    oszto++;
                } while (oszto <= szam / 2);
                if (osszeg == szam)
                    textBox4.Text = "tökéletes szám: " + osszeg;
                else
                    textBox4.Text = "nem tökéletes szám: "
                                     + osszeg;
            }
        }

        // Ha a textbox1.Text mezejében az adat változik
        // az eredményt tároló ablakok törlődnek
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
             textBox2.Text = ""; textBox3.Text = "";
             textBox4.Text = "";
        }

A program futási eredményei:

  

 

Pozitív egész szám vizsgálata

Írjunk programot, amely beolvas egy pozitív egész számot, majd megvizsgálja, hogy páros vagy páratlan, valamint osztható-e 3–mal!

A feladat megoldása:

        // Pozitív szám vizsgálata
        private void button1_Click(object sender, EventArgs e)
        {
            int szám;
            string eredmény;
            eredmény = "";
            if (textBox1.Text != "")
            {
                szám = Int32.Parse(textBox1.Text);
                if (szám > 0)
                {
                    if (szám % 2 == 1)
                        eredmény += szám.ToString() + " páratlan";
                    else
                        eredmény += szám.ToString() + " páros";
                    if (szám % 3 == 0)
                        eredmény += " és osztható 3-mal ";
                    else
                        eredmény += " és nem osztható 3-mal ";
                    textBox2.Text = eredmény;
                }
                else
                {
                    MessageBox.Show("A szám negatív!");
                    textBox1.Text = "";
                }
            }
        }

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

A program futási eredményei:

     

    

    

 

 

 

Prímszámok keresése adott határig

Jelenítsük meg a prímszámokat a megadott határig. A prímszámok csak az eggyel és önmagukkal osztható, pozitív egész számok.

A feladat megoldása:

                      // prímszámok keresése
        private void button1_Click(object sender, EventArgs e)
        {
            int max, szám, osztó, db = 0;
            bool prim;
            listBox1.Items.Clear();
            if (textBox1.Text != "")
            {
                max = Int32.Parse(textBox1.Text);
                for( szám = 2; szám <= max; szám++)
                {
                    prim = true;
                    for (osztó = 2; osztó <= szám/2; osztó++)
                        if (szám % osztó == 0)
                        {
                            prim = false;
                            break; // ha van osztója, kilépünk
                                   // a ciklusból
                        }
                    if ( prim)
                    {
                        listBox1.Items.Add (szám);
                        db++;  
                    }
                }
                textBox2.Text = db.ToString();
                        }
        }

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

A feladat futási eredménye:

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