Avatar billede mulemule Nybegynder
25. august 2005 - 11:53 Der er 15 kommentarer

Switch Case spm.

Hej

Jeg synes ikke at switch case er så god.

Hvad hvis jeg har et tal e mellem 0 og 1000;

Og så vil jeg på den baggrund beregne et andet tal x på følgende måde.

Hvis e tilhører [0;20] så x = 1;
Hvis e tilhører ]20;200] så x = 2;
Hvis e tilhører ]200;500] så x = 3;
Hvis e tilhører ]500;1000] så x = 4;

Det kan jeg da ikke gøre med en Switch case konstruktion ?

Som jeg ser der kan jeg kun gøre det med en masse if sætninger og en goto og en label ?

Er der ikke en smatere og pænere måde ?
Avatar billede mulemule Nybegynder
25. august 2005 - 11:54 #1
]20;200] betyder intervallet imellem 20 og 200 hvor 20 ikke er med og 200 er med.
Avatar billede mulemule Nybegynder
25. august 2005 - 12:01 #2
Kan selvfølgelig godt gøre det uden en goto, ved bare at retunere talet det samme. Men det kan jeg ikke i mit konkrette tilfælde.
Avatar billede nielle Nybegynder
25. august 2005 - 12:07 #3
Ingen grund til at blande goto og labels ind i det:

if (0<=e && e<=20)
    x = 1;
else if (e<=200)
    x = 2;
else if (e<=500
    x = 3;
else if (e<=100)
    x = 4;
Avatar billede nielle Nybegynder
25. august 2005 - 12:09 #4
Dette er nok mere korrekt:

if (0<e)
{
    if (e<=20)
        x = 1;
    else if (e<=200)
        x = 2;
    else if (e<=500)
        x = 3;
    else if (e<=100)
        x = 4;
}
Avatar billede arne_v Ekspert
25. august 2005 - 12:18 #5
måske putte limits og resultat ind i arrays og så finde i en for løkke ?
Avatar billede -xyz- Nybegynder
25. august 2005 - 13:00 #6
if (0<e)
{
    if (e<=20)
        x = 1;
    else if (e > 20 && e<=200)
        x = 2;
    else if (e > 200 && e<=500)
        x = 3;
    else if (e > 500 && e<=1000)
        x = 4;
}
Det må have været sådan den skulle se ud, ellers checker den ikke intervallet men bar om e er mindre end tallet
Avatar billede arne_v Ekspert
25. august 2005 - 13:03 #7
det er også godt nok med else if fordi man aldrig kommer derind hvis e er
mindre end lower limit
Avatar billede mulemule Nybegynder
25. august 2005 - 19:22 #8
Tak, jo klart nok. Det var lidt noget vrøvl det med goto.

Men det kan da ikke lade sig gøre at gøre det med switch case vel ?

Det er fordi at jeg skal bruge det ret meget, så jeg synes også at det bliver grimt med if else. Men det ser ud somom det er den eneste løsning.

Men kan selvfølgelig godt se at det hjælper når man undlader at lave dybere og dybere tabulator indrykning :)
Avatar billede nielle Nybegynder
25. august 2005 - 20:14 #9
Det er ikke muligt at lave det med switch-case - jo, men så skulle man angive samtlige værdier, og så ville det hurtig blive en meget stooooor switch-case! ;^)
Avatar billede arne_v Ekspert
25. august 2005 - 20:46 #10
lidt kode til inspiration:

using System;

namespace E
{
    public class Grouping
    {
        public static int Grouping1(int v)
        {
            if(v < 0 || v > 1000)
            {
                throw new ArgumentOutOfRangeException("Invalid number " + v);
            }
            if (v <= 20)
            {
                return 1;
            }
            else if (v <= 200)
            {
                return 2;
            }
            else if (v <= 500)
            {
                return 3;
            }
            else if (v <= 1000)
            {
                return 4;
            }
            throw new Exception("Something impossible happended");
        }
        private static int[] LIMITS = { 20, 200, 500, 1000 };
        public static int Grouping2(int v)
        {
            if(v < 0 || v > 1000)
            {
                throw new ArgumentOutOfRangeException("Invalid number " + v);
            }
            for(int i = 0; i < LIMITS.Length; i++)
            {
                if(v <= LIMITS[i])
                {
                    return (i + 1);
                }
            }
            throw new Exception("Something impossible happended");
        }
        public static int Grouping3(int v)
        {
            if(v < 0 || v > 1000)
            {
                throw new ArgumentOutOfRangeException("Invalid number " + v);
            }
            return 1 + (v > 20 ? 1 : 0) + (v > 200 ? 1 : 0) + (v > 500 ? 1 : 0);
        }
    }
    public class TestClass
    {
        public static void Main(string[] args)
        {
            Random rng = new Random();
            for(int i = 0; i < 20; i++)
            {
                int rn = rng.Next(1000);
                Console.WriteLine(Grouping.Grouping1(rn) + " " +
                                  Grouping.Grouping2(rn) + " " +
                                  Grouping.Grouping3(rn));
            }
        }
    }
}
Avatar billede mulemule Nybegynder
26. august 2005 - 00:10 #11
Tak for svar inklusive den flotte kode.

Generelt synes jeg kode arbejdet ville være lettere hvis der var indbygget mængde funktioner i c#.
Avatar billede nielle Nybegynder
26. august 2005 - 07:52 #12
Du kan jo selv lave en Set-type (Set=Mængde) hvis du vil, men ellers vile jeg da give dig ret. Jeg startede selv med Turbo Pascal (altså efter ID Comal) og der har man faktisk en Set-variabeltype og den var da rar at have somme tider. Men det var nu ikke særligt tit at man brugte den.

Men C# har det altså ikke på forhånd.
Avatar billede nielle Nybegynder
05. september 2005 - 19:11 #13
Lukketid?
Avatar billede nielle Nybegynder
15. september 2005 - 18:09 #14
?
Avatar billede arne_v Ekspert
29. september 2005 - 20:45 #15
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester