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

C# MŰHELY

C# MŰHELY

Két 6 jegyű oktális szám összeadása

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

Írjunk függvényt  két 6 jegyű oktális szám összeadásra.
A függvény fejléce:

    static int oct_add(string s1, string s2, ref int[] eredm)

Bemenő paraméterek: s1, s2 típusú 6 karaktert tároló karaktertömb,

                                   ebben kapja meg a függvény az összeadandó oktális
                                   számokat karakter formában.

Kimenő paraméter:     eredm maximálisan 6 jegyet tartalmazó egész
                                   típusú tömb, amely a 0..7 tartományban tárolja az
                                   értékeket.

A függvény a két oktális szám összeadásakor keletkezett hetedik digitre történő átvi­telt (túlcsordulást) visszatérési értékként adja vissza. A túlcsordulás azt jelenti, hogy a két szám összege nem fér el a 6 digiten, melyet az eseménykezelő a ”túlcsordult” szöveg kiírásával jelez.

Az oct_add függvénynek szüksége van két lokális változóra:

carry      egész típusú változó, amely 0..1 értéket veheti fel, ez az átvitel, illetve a túlcsordulás
                       jelzésére szolgál
ered       egész típusú változó, amely két digit összegét tartalmazza

A carry alapállapota nulla. A legalacsonyabb helyi értéktől kezdjük az össze­adást. A beolvasásnál az utoljára beolvasott karakter az 5. pozícióba kerül, tehát a ciklust 5-tól kell lefelé számláltatni 0-ig. Az oktális számok az s1,s2 karak­tertömbben vannak. Számjeggyé alakíthatjuk, ha kivonjuk belőle a '0' karakter értékét:

     s1[i] - '0'

Az ered változóba tároljuk a két oktális szám i-edik digitjének a carry tartal­mával módosított összegét. Ha az ered értéke nagyobb 7-nél, ezt az átvitelt a carry tárolja, melyet a következő digit összeadásánál figyelembe kell venni. Az eredm egész típusú tömb i-edik eleme tartalmazza az i-edik digit összegét, melyről az átvitelt le kell választani:

      eredm[i] = ered & 7;

Például:   7 + 7 = 14

            14  kettes számrendszerben  1110:= 8 + 4 + 2 +0,

            az utolsó három digitre kell a 7 (111) maszkot használni, ez választja
            le az átvitelt:

             1110   14
             0111     7
            -------------
             0110 -> 6

 az ÉS  (&) utasítással:

             14 & 7 = 6

 Ha a legmagasabb helyi értéken történt az összeadásnál átvitel, akkor ez szá­munkra túlcsordulást jelent, ezt az értéket kell a függvény­nek visszaadnia.

        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)
                    {
                        hiba1 = i + 1;
                        return oct;
                    }
                }
            }
            else if (h < 6 || h > 6)
                hiba2 = h;
            return oct;
        }

        static int oct_add(string s1, string s2, ref int[] eredm)
        {
            int carry = 0;
            int i, ered;
            for (i = 5; i >= 0; i--)
            {
                ered = carry + (s1[i] - '0') + (s2[i] - '0');
                if (ered > 7) carry = 1; else carry = 0;
                eredm[i] = ered & 7;
            }
            return carry;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string okt1="", okt2="", okt1j="", okt2j="";
            int i = 1, v;
            int hiba1 = 0, hiba2 = 0;
            int[] összeg = new int[6] { 0, 0, 0, 0, 0, 0 };
            if (textBox1.Text != "" && textBox2.Text != "")
            {
                okt1 = textBox1.Text;
                okt1j = oct_read(okt1, out hiba1, out hiba2);
                if (hiba1 != 0)
                    MessageBox.Show("adat: " + okt1.ToString() + "\n"
                                    + hiba1.ToString() +
                                    ". digit hibás! ",
"Hibajelzés");
                if (hiba2 != 0)
                    MessageBox.Show("adat: " + okt1.ToString() + "\n"
                                     + "A szám hatjegyű lehet: ez " +
                                    hiba2.ToString(), "Hibajelzés");
                if (hiba1 != 0 || hiba2 != 0)
                {
                    textBox1.Text = ""; textBox3.Text = "";
                    okt1j = ""}

                else
                    textBox1.Text = okt1j;
                okt2 = textBox2.Text;
                okt2j = oct_read(okt2, out hiba1, out hiba2);
                if (hiba1 != 0)
                    MessageBox.Show("adat: " + okt2.ToString() +
                                    "\n"+ hiba1.ToString() +
                                    ". digit hibás
",Hibajelzés");
                if (hiba2 != 0)
                   MessageBox.Show("adat: " + okt2.ToString() + "\n" 
                                   + "A szám hatjegyű lehet: ez "
                                   hiba2.ToString(), "Hibajelzés");

                if (hiba1 != 0 || hiba2 != 0)
                {
                    textBox2.Text = ""; textBox3.Text = "";
                    okt2j = "";

                }
                else
                    textBox2.Text = okt2j;
            }
            textBox3.Text = "";
            if (okt1j != "" && okt2j != "")
            {
                v = oct_add(okt1j, okt2j, ref összeg);
                if (v == 1) MessageBox.Show("Túlcsordult");
                else
                {
                   for (i = 0; i <= 5; i++)
                      textBox3.Text += összeg[i].ToString();
                }
            }
        }

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

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

A program futási eredményei:

   

   

A bejegyzés trackback címe:

https://csharp-muhely.blog.hu/api/trackback/id/tr9815993942

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása