2020. március 10., kedd

2020.03.10. /1. Részösszefoglalás - Többágú szelekció, struktúra


Részösszefoglalás

Számítógép/Nyomtatók feladatsorok részletei

1. Mi a lehetséges hiba?

Válasz: Az ar és a kedvezmeny osztást is tartalmazó kifejezésben fog szerepelni, ezért legyen double típusú.      

        public struct szamitogep
        {
            public string gyarto;
            public string fantazianev;
            public string kod;
            public int ar;
            public int kedvezmeny;
        }      

2. Mi a hiba?

Válasz: A struktúra definícióját ne akarjuk adattárolásra használni!

        //Figyelem! Ez nagyon rossz megoldás!
        public struct szamitogep
        {
        //Figyelem! Ez nagyon rossz megoldás!
             public string megnevezes1;
             public int ar1;
             public int akcio1;
        //Figyelem! Ez nagyon rossz megoldás!
             public string megnevezes2;
             public int ar2;
             public int akcio2;
        //Figyelem! Ez nagyon rossz megoldás!
             public string megnevezes3;
             public int ar3;
             public int akcio3;
        }
        //Figyelem! Ez nagyon rossz megoldás!

3. Melyik a jó megoldás?

Válasz: Mindkét megoldás jó és teljes értékű.

            //1. verzió:
            Console.WriteLine("A számítógép akciós ára: {0} ft", orion.ar - (orion.ar / 100) * orion.kedvezmeny);
            Console.Write("Válasszon a lehetőségekből: regisztrált / nem regisztrált");
            string szavazas2 = Console.ReadLine();
            switch (szavazas2)
            {
                case "regisztrált":
                    if (orion.ar > 150000)
                        Console.WriteLine("A regisztráltság miatt 1000 ft bónuszt fog kapni!");
                    else
                        Console.WriteLine("A nettó érték nincs 150k felett, ezért nem jár az 1000 ft bónusz");
                    break;
                case "nem regisztrált":
                    Console.WriteLine("Ha regiszrált volna, kapna 1000 ft bónuszt 150 ezer fölött.");
                    break;
                default:
                    Console.WriteLine("Ilyen lehetoseg nincs, a fent lathato lehetosegekbol valasszon");
                    break;
            }

            //2. verzió:
            Console.WriteLine("A számítógép akciós ára: {0} ft", orion.ar - (orion.ar / 100) * orion.kedvezmeny);
            Console.Write("Válasszon a lehetőségekből: regisztrált / nem regisztrált");
            szavazas2 = Console.ReadLine();
            if (szavazas2 == "regisztrált")
            {
                if (orion.ar > 150000)
                    Console.WriteLine("A regisztráltság miatt 1000 ft bónuszt fog kapni!");
                else
                    Console.WriteLine("A nettó érték nincs 150k felett, ezért nem jár az 1000 ft bónusz");
            }
            else
            {
                if (szavazas2 == "nem regisztrált")
                {
                    Console.WriteLine("Ha regisztrált volna, kapna 1000 ft bónuszt 150 ezer fölött.");
                }
                else
                    Console.WriteLine("Ilyen lehetoseg nincs, a fent lathato lehetosegekbol valasszon");
            }

4. Mi ebben a „csúnya”?

Válasz: Redundáns, tehát fölöslegesen sok kódot írtunk. Megoldás: az első szelekció ágaiban tároljuk le az árat, és utána legyen egy újabb szelekció, ahol azt felhasználjuk.

            Console.Write("Melyik gépet választja (1,2,3): ");
            int szavazas = Console.ReadLine();
            switch (szavazas)
            {
                case 1:
                    Console.WriteLine("A számítógép akciós ára: {0} ft", orion.ar - (orion.ar / 100) * orion.kedvezmeny);
                    Console.Write("Válasszon a lehetőségekből: regisztrált / nem regisztrált");
                    string szavazas2 = Console.ReadLine();
                    switch (szavazas2)
                    {
                        case "regisztrált":
                            if (orion.ar > 150000)
                                Console.WriteLine("A regisztráltság miatt 1000 ft bónuszt fog kapni!");
                            else
                                Console.WriteLine("A nettó érték nincs 150k felett, ezért nem jár az 1000 ft bónusz");
                            break;
                        case "nem regisztrált":
                            Console.WriteLine("Ha regiszrált volna, kapna 1000 ft bónuszt 150 ezer fölött.");
                            break;
                        default:
                            Console.WriteLine("Ilyen lehetoseg nincs, a fent lathato lehetosegekbol valasszon");
                            break;
                    }
                    break;
                case 2:
                    Console.WriteLine("A számítógép akciós ára: {0} ft", predator.ar - (predator.ar / 100) * predator.kedvezmeny);
                    Console.Write("Válasszon a lehetőségekből: regisztrált / nem regisztrált");
                    string szavazas3 = Console.ReadLine();
                    switch (szavazas3)
                    {
                        case "regisztrált":
                            if (predator.ar > 150000)
                                Console.WriteLine("A regisztráltság miatt 1000 ft bónuszt fog kapni!");
                            else
                                Console.WriteLine("A nettó érték nincs 150k felett, ezért nem jár az 1000 ft bónusz");
                            break;
                        case "nem regisztrált":
                            Console.WriteLine("Ha regiszrált volna, kapna 1000 ft bónuszt 150 ezer fölött.");
                            break;
                        default:
                            Console.WriteLine("Ilyen lehetoseg nincs, a fent lathato lehetosegekbol valasszon");
                            break;
                    }
                    break;
                case 3:
                    Console.WriteLine("A számítógép akciós ára: {0} ft", asus.ar - (asus.ar / 100) * asus.kedvezmeny);
                    Console.Write("Válasszon a lehetőségekből: regisztrált / nem regisztrált");
                    string szavazas4 = Console.ReadLine();
                    switch (szavazas4)
                    {
                        case "regisztrált":
                            if (asus.ar > 150000)
                                Console.WriteLine("A regisztráltság miatt 1000 ft bónuszt fog kapni!");
                            else
                                Console.WriteLine("A nettó érték nincs 150k felett, ezért nem jár az 1000 ft bónusz");
                            break;
                        case "nem regisztrált":
                            Console.WriteLine("Ha regiszrált volna, kapna 1000 ft bónuszt 150 ezer fölött.");
                            break;
                        default:
                            Console.WriteLine("Ilyen lehetoseg nincs, a fent lathato lehetosegekbol valasszon");
                            break;
                    }
                    break;
                default:
                    Console.WriteLine("Ilyen lehetoseg nem szerepel a listan.");
                    break;
            }

5. Mi a hiba?

Válasz: Nem ez volt a feladat. A 15-öt kellett volna tárolni.

//Tárold struktúrákban a 3 nyomtató gyártóját (ezek legyenek: HP, CANON, SAMSUNG);
//számát (pl. 500); típusát (lézer, vagy tintasugaras);
//árát;
//és a rá vonatkozó akció értékét (pl. 15, ami 15%-ot jelent).

...
            elsonyomtato.ara = 19000;
            elsonyomtato.akcioertek = 19000 * 15 / 100;
...
vagy:
...
            szamitogep1.kedvezmeny = 0.15;
...

6. Mi a hiba?

Válasz: nem írta ki a gyártót, a nyomtató számát, és nem számolta ki és nem is írta ki az akciós árat.

//Írd ki a választásától függően a képernyőre a nyomtató gyártóját,
//számát, ezen kívül az akciós árát.
       Console.WriteLine("Ez az akció mértéke: {0}", ASUS.akcio);

7. Mi a szokatlan? Ez hiba?

Válasz: Az 5.0 értékmegadás. Nem szükséges törtként megadni a double típusú változóba kerülő egész számot, ugyanakkor nem hiba.

       public struct nyomtato
       {
             public string gyarto;
             public int szam;
             public string tipus;
             public int ar;
             public double akcio;
       }
. . .
       nyomtato nyomtato1 = new nyomtato();
       nyomtato1.gyarto = "HP";
       nyomtato1.szam = 650;
       nyomtato1.tipus = "lézer";
       nyomtato1.ar = 80500;
       nyomtato1.akcio = 5.0;

8. Ez hibás?

Válasz: Nem! Zseniális! Felhasználta az előző többágú szelekció szelektorát (van egy kis redundancia ugyan az első megoldásnál).

Console.WriteLine("Festéket vagy papírt szeretne ajándékba kapni? (festék | papír): ");
string ajandek = Console.ReadLine();
ajandek = ajandek.ToLower();

switch (ajandek)
{
    case "festék":
        switch (valasztas)
        {
            case "h": //ez egy fajta nyomtató
                Console.WriteLine("Ön ajándékba festéktonert kap.");
                break;
            case "c":
                Console.WriteLine("Ön ajándékba festékpatront kap.");
                break;
            case "s":
                Console.WriteLine("Ön ajándékba festéktonert kap.");
                break;
        }

        break;
    case "papír":
        Console.WriteLine("Ön ajándékba egy csomag nyomtatópapírt kap.");
        break;
    default:
        Console.WriteLine("Helytelen válasz.");
        break;
}

Ugyanez kétágú szelekciókkal:
if (ajandek == "festék")
{
    if (valaszt == "s")
    {
        Console.WriteLine("Akkor kapni fog egy festéktonert.");
    }
    else
    {
        if (valaszt == "h" || valaszt == "c")
        {
            Console.WriteLine("Akkor kapni fog egy festékpatront.");
        }
    }
}
else
{
    if (ajandek == "papír")
    {
        Console.WriteLine("Akkor egy csomag nyomtatópapírt fog kapni.");
    }
}

9. Ez a módszer jó lesz hosszú távon?

Válasz: Nem. Ha háromnál jóval több nyomtatónk van, nagyon mély egymásba ágyazás lesz, holott látjuk, hogy csak kétfelé kellett volna bontani az egészet (lézeres, tintasugaras). Legjobb lett volna megjegyezni az előző szelekcióban a típust egy változóban.

. . .
            switch (ajandek)
            {
                case "festéket":
                    if (HP.tipusa == "Lézeres")
                    {
                        Console.WriteLine("Kap egy festéktonert");
                    }
                    else
                    {
                        if (Canon.tipusa == "Tintasugaras")
                        {
                            Console.WriteLine("Oké akkor festéket kap");
                        }
                        else
                        {
                            if (Samsung.tipusa == "Lézeres")
                            {
                                Console.WriteLine("Kap egy festéktonert");
                            }
                        }
                    }
                break;
. . .

10. Ezt hogyan lehetne továbbfejleszteni?

Válasz: Egyetlen akciosar változó kell, és a switch után egyetlen kiírás.

switch (valaszt)
 {
     case '1':
         double akciosar1 = gep1.ar - (gep1.ar * gep1.akcio) / 100;
         Console.WriteLine("Ennek a gépnek az akciós ára: {0}", akciosar1);
         ar = gep1.ar;
         break;
     case '2':
         double akciosar2 = gep2.ar - (gep2.ar * gep2.akcio) / 100;
         Console.WriteLine("Ennek a gépnek az akciós ára: {0}", akciosar2);
         ar = gep2.ar;
         break;
     case '3':
         double akciosar3 = gep3.ar - (gep3.ar * gep3.akcio) / 100;
         Console.WriteLine("Ennek a gépnek az akciós ára: {0}", akciosar3);
         ar = gep3.ar;
         break;
     default:
         Console.WriteLine("Rossz számot írt be!!");
         break;
 }

11. Ez pedig mi fán terem?

Válasz: Ez egy ciklus. Addig nem enged tovább, amíg jó számot nem ütünk be. Zseniális! Bárki megpróbálhatja...
            Console.Write("Válasszon egy számítógépet (1 ; 2 ; 3): ");
            int valasztas = Convert.ToInt32(Console.ReadLine());
            while (!(valasztas == 1 || valasztas == 2 || valasztas == 3))
            {
                Console.WriteLine("Rossz érték. Adja meg újra: ");
                valasztas = Convert.ToInt32(Console.ReadLine());


Nincsenek megjegyzések:

Megjegyzés küldése