Naloga: LED lučke

Naloga: LED lučke

Avtor: Gregor Šoln

Navodilo naloge in ideja rešitve

LED zaslon

Napiši program, ki poljubno (največ 4 mestno) število predstavi grafično. Števke morajo izgledati kot števke na 7-segmentnem LCD zaslonu in jih je potrebno izrisati. (Uporaba posebnega fonta za izpis ni dovoljena.)

Ideja rešitve

Za prikaz števil bomo uporabili platno, na katerem bomo izrisali črte, ki bodo imitirale števila. Preko vnosnega polja bomo prebrali štirimestno število, ki ga bomo prebrali kot niz in razbrali števila iz njega. Nato jih bomo prikazali na platnu.


(1.png)


Na zgornji sliki vidimo kako si prikazana števila v levem delu okna. Na desni strani pa lahko vidimo vnosno polje in potrditveni gumb.

Grafični vmesnik

V okno, kjer bomo prikazovali štirimestno število, postavimo štiri platna, na katerih se bodo izrisovala števila.
Posamezno števko bomo izrisali s pomočjo črt, ki bodo ponazarjale število.

(2.png)

V levi del okna postavimo štiri gradnike Panel (platno). V desni del okna pa postavimo vnosno polje (TextBox)in potrditveni gumb (Button).

(3.png)

Prikazovanje števila na platnu

Če si predstavljamo obliko katerega koli enomestnega števila vidimo, da lahko število narišemo s pomočjo daljic. Na spodnji sliki vidimo kako je s črtami izrisano število šest.

(4.png)

Iz slike je razvidno, da smo število 6 sestavili iz šestih daljic. Tako bo na vsakem platnu definiranih 8 ogljišč, katere bomo z daljicami povezali tako, da bodo prikazovale ustrezno število.
Črni krogi prikazujejo ogljišča, med katera vpnemo daljico.

Na spodnjem primeru si oglejmo, kako definiramo osem ogljišč. Na vseh štirih platnih imajo ogljišča enake koordinate, kot si jih bomo ogledali na spodnjem primeru. Ogljišča so objekti tipa Point, ki imajo kot lastnost podano vertikalno in horizontalno koordinato.

(5.png)

Podrobnosti


namespace LEDlucke
{
    public partial class Form1 : Form
    {

        //ogljišča @ panel 1
        Point p1_t1 = new Point(15, 15); //zgornje levo
        Point p1_t2 = new Point(127, 15); //zgornje desno
        Point p1_t3 = new Point(127, 103); //srednje desno
        Point p1_t4 = new Point(127, 193); //spodnje desno
        Point p1_t5 = new Point(15, 193); //spodnje levo
        Point p1_t6 = new Point(15, 103); //srednje levo

        //ogljišča @ panel2
        Point p2_t1 = new Point(15, 15);
        Point p2_t2 = new Point(127, 15);
        Point p2_t3 = new Point(127, 103);
        Point p2_t4 = new Point(127, 193);
        Point p2_t5 = new Point(15, 193);
        Point p2_t6 = new Point(15, 103);

        //ogljišča @ panel3
        Point p3_t1 = new Point(15, 15);
        Point p3_t2 = new Point(127, 15);
        Point p3_t3 = new Point(127, 103);
        Point p3_t4 = new Point(127, 193);
        Point p3_t5 = new Point(15, 193);
        Point p3_t6 = new Point(15, 103);

        //ogljišča @ panel4
        Point p4_t1 = new Point(15, 15);
        Point p4_t2 = new Point(127, 15);
        Point p4_t3 = new Point(127, 103);
        Point p4_t4 = new Point(127, 193);
        Point p4_t5 = new Point(15, 193);
        Point p4_t6 = new Point(15, 103);

        //stanja številk na zaslonu
        bool vnos = true;
        int cifra_1 = 1;
        int cifra_2 = 2;
        int cifra_3 = 3;
        int cifra_4 = 4;
     }
}

Zapri

Prepoznavanje vnešenega števila

Število, ki ga želimo izrisati, vnesemo v vnosno polje. S klikom na potrditveni gumb pa poženemo metodo s katero preverimo za katero število gre.

(6.png)

Z ukazom String text = inputNumber.Text; preberemo niz, ki je bil vnešen v vnosno polje. Nato preverimo ali je niz res dolg samo štiri znake. Če ni, uporabnika obvestimo o vnapačnem vnosu.
Z try za vsako števko preverimo ali res predstavlja število. To preverimo z ukazom Int.Parse(); , ki podatkovni tip String pretvori v podatkovni tip Integer. Če se zgodi, da se v vnešenem nizu nahaja kakšen drug znak kot število, se ulovi izjema in izvede se ukaz MessageBox.Show("Napačen vnos"); , ki prikaže pojavno okno z obvestilom, da gre za napačen vnos.

(7.png)

Spremenljivke cifra_1, cifra_2, cifra_3, cifra_4 hranijo podatek o tem, za katero števko vnešenega števila gre. Vrednost spremenljivke cifra_1 se bo izrisala na prvem platnu. Vrednost spremenljivke cifra_2 se bo izrisala na drugem platnu, itd..



Če nad platnom uporabimo ukaz Invalidate(); ponovno sprožimo metodo za izris vsebine na platno.

(8.png)

Podrobnosti


private void b_izpisi_Click(object sender, EventArgs e)
        {
            String text = inputNumber.Text; //vnesen niz shranimo
            if (text.Length == 4) //preverimo ali so vnešeni 4 znaki
            {
                try
                {
                    vnos = true;
                    cifra_1 = int.Parse(text[0].ToString());
                    cifra_2 = int.Parse(text[1].ToString());
                    cifra_3 = int.Parse(text[2].ToString());
                    cifra_4 = int.Parse(text[3].ToString());
                }
                catch
                { MessageBox.Show("Napačen vnos."); }

                p1.Invalidate(); //klic metod za izris
                p2.Invalidate();
                p3.Invalidate();
                p4.Invalidate();
            }
            else
                MessageBox.Show("Napačen vnos.");
        }

Zapri

Izris števila

Na vsakem platnu je potrebno definirati metodo za izris. S pomočjo te metode, se bodo črte, ki jih bomo uporabili, avtomatsko izrisovale. Gre za metodo Paint. Metodo risanja definiramo tako, da v oknu Properties izberemo možnost Events. Na poiščemo metodo Paint, kateri dodamo objekt, na katerega bomo risali.

(91.png)

Na spodnji sliki lahko vidimo del kode metode za risanje na platno. Z ukazom if preverimo, katera števka je bila vnešena in nato izberemo ustrezen izris.
Z metodo DrawLine izrišemo črto med dvema ogljiščema.

(9.png)

Za vsako število od 1 - 9 je potrebno določiti unikaten izris s pomočjo črt. Izris je na vseh platnih enak. Zato je potrebno na vsakem platnu posebej definirati metodo za risanje (metoda Paint).

Podrobnosti


 private void p1_Paint(object sender, PaintEventArgs e)
        {
            if (cifra_1 == 0) //število nič
            {

                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t2, p1_t3); //b
                g.DrawLine(p, p1_t3, p1_t4); //c
                g.DrawLine(p, p1_t4, p1_t5); //d
                g.DrawLine(p, p1_t5, p1_t6); //e
                g.DrawLine(p, p1_t1, p1_t6); //f
            }
            if (cifra_1 == 1) //število ena
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                g.DrawLine(p, p1_t2, p1_t3); //b
                g.DrawLine(p, p1_t3, p1_t4); //c
            }


            if (cifra_1 == 2) // število dve
            {

                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t2, p1_t3); //b
                g.DrawLine(p, p1_t4, p1_t5); //d
                g.DrawLine(p, p1_t5, p1_t6); //e
                g.DrawLine(p, p1_t3, p1_t6); //g
            }
            if (cifra_1 == 3)
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t2, p1_t3); //b
                g.DrawLine(p, p1_t3, p1_t4); //c
                g.DrawLine(p, p1_t4, p1_t5); //d
                g.DrawLine(p, p1_t3, p1_t6); //g
            }
            if (cifra_1 == 4)
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t3, p1_t4); //c
                g.DrawLine(p, p1_t1, p1_t6); //f
                g.DrawLine(p, p1_t3, p1_t6); //g
            }
            if (cifra_1 == 5)
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t3, p1_t4); //c
                g.DrawLine(p, p1_t4, p1_t5); //d
                g.DrawLine(p, p1_t1, p1_t6); //f
                g.DrawLine(p, p1_t3, p1_t6); //g
            }
            if (cifra_1 == 6)
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t3, p1_t4); //c
                g.DrawLine(p, p1_t4, p1_t5); //d
                g.DrawLine(p, p1_t5, p1_t6); //e
                g.DrawLine(p, p1_t1, p1_t6); //f
                g.DrawLine(p, p1_t3, p1_t6); //g
            }
            if (cifra_1 == 7)
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t2, p1_t3); //b
                g.DrawLine(p, p1_t3, p1_t4); //c
            }
            if (cifra_1 == 8)
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t2, p1_t3); //b
                g.DrawLine(p, p1_t3, p1_t4); //c
                g.DrawLine(p, p1_t4, p1_t5); //d
                g.DrawLine(p, p1_t5, p1_t6); //e
                g.DrawLine(p, p1_t1, p1_t6); //f

                g.DrawLine(p, p1_t3, p1_t6); //g
            }
            if (cifra_1 == 9)
            {
                Graphics g = e.Graphics;
                Pen p = new Pen(Color.DarkRed, 10);
                //panel 1
                g.DrawLine(p, p1_t1, p1_t2); //a
                g.DrawLine(p, p1_t2, p1_t3); //b
                g.DrawLine(p, p1_t3, p1_t4); //c
                g.DrawLine(p, p1_t4, p1_t5); //d
                g.DrawLine(p, p1_t1, p1_t6); //f
                g.DrawLine(p, p1_t3, p1_t6); //g
            }

        }

Zapri

Testni primeri

Testiranje aplikacije bomo izvedli tako, da bomo vnašali različne nize. Vsebovali bodo števila, črke, znake in bodo različnih dolžin.

Vnos niza: 5432

(10.png)

Vnos niza: 342

(11.png)

Vnos niza: 34d1

(12.png)

Video: testni primeri

0%
0%