Avatar billede havmaage Juniormester
24. marts 2011 - 11:54 Der er 7 kommentarer og
2 løsninger

Hvor stort er tallet ( vil lave det rekursivt )

Hejsa
Jeg skal programmere en funktion der kan udskrive beløb som check
dvs.
at input 343 skal give TreHundredeOgFirTiTre ( eller noget i den retning )

jeg er interesseret i at anvende en rekursiv funktion, jeg tænker at jeg måske kan anvende modulus til at finde ud af om jeg er i 1000 100 10 eller 1 men jeg kan ikke rigtig gennemskue hvad modulus egenligt gør

public int taltilbogstav(int bel)
{
int a = 0;
if(bel > 10 )
{
  a = bel % 10;
  // a skal angive om jeg er i 1000, 100, 10 eller 1
}
  if(a = 1000 )
  {
    bla bla vla
  }
  return taltilbogstav(bel / 10 );
} // når den er rekursiv bliver jeg nød til at ændre lisr


Dette  er ikke kode der nødvendigvis kan kører bare for at illustrere hvordan jeg havde tænkt mig at gribe det an, men jeg mangler lidt det der med hvordan jeg kan afgøre med modulus eller på anden måde hvor stort tallet er og hvor i tællerne jeg er

håber i forstår mit spg.
Avatar billede alphabits Nybegynder
24. marts 2011 - 12:18 #1
Hvis du har et tal og vil finde ud af tallets størrelse, kan du bruge log-funktionen. Hvis f.eks.

x=4322

så vil

floor(log(x))==3

Dvs. hvis du har et ukendt tal y, og du så beregner at floor(log(y))==2, så ved du at y er mellem 100 og 999 (begge inklusive).

Du skal dog være opmærksom på om log-funktionen udregner med hensyn til den rigtige base. Jeg programmerer ikke i C#, så ved ikke hvad den rigtige funktion hedder. Men det er sikkert enten log eller log10 der udregner log mht. base-10. Du kan altid lave et hurtigt check. Hvis log(10)==1 har du fundet den rigtige funktion :)
Avatar billede mcb2001 Nybegynder
24. marts 2011 - 12:39 #2
static void Main(string[] args)
        {
            Console.WriteLine(TalTilTekst(1)); //Et
            Console.WriteLine(TalTilTekst(12)); //EtTiTo
            Console.WriteLine(TalTilTekst(123)); //EtHundredeToTiTre
            Console.WriteLine(TalTilTekst(1234)); //EtTusindeToHundredeTreTiFire
            Console.WriteLine(TalTilTekst(9876));
            Console.WriteLine(TalTilTekst(543));
            Console.WriteLine(TalTilTekst(21));
            Console.WriteLine(TalTilTekst(0));

            Console.Read();
        }

        public static string TalTilTekst(int i)
        {
            string output = ""; //tal der skal retur

            int tierPotens = 0; //Hvilken en tierpotens er vi nået til (enere, tiere, hundrede...)

            while (i > 0) //indtil i er brugt op
            {
                int førsteCiffer = i % 10; //første ciffer (hvad er der tilbage når vi dividerer med ti)

                string tekst = EnkeltTalTilTekst(førsteCiffer); //først størrelsen på tallet
                tekst += TierPotensTilTekst(tierPotens); //så om det er ti, hundrede osv.

                output = tekst + output; //sæt det før alt det der er skrevet

                i = i / 10; //fjern første ciffer
                ++tierPotens; //tæl tierpotens op da vi nu er ved næste (f.eks. enere --> tiere)
            }

            return output;
        }

        public static string TierPotensTilTekst(int i)
        {
            switch (i) //oversæt til tierpotens
            {
                case 0: return ""; //enere har intet navn
                case 1: return "Ti";
                case 2: return "Hundrede";
                case 3: return "Tusinde";
                default: throw new ArgumentException("For stort tal"); //understøtter kun op til tusinder
            }
        }

        public static string EnkeltTalTilTekst(int i)
        {
            switch (i) //oversæt til værdi
            {
                case 0: return "Nul";
                case 1: return "Et";
                case 2: return "To";
                case 3: return "Tre";
                case 4: return "Fire";
                case 5: return "Fem";
                case 6: return "Seks";
                case 7: return "Syv";
                case 8: return "Otte";
                case 9: return "Ni";
                default: throw new ArgumentException("Ikke korrekte tal"); //der er ikke andre muligheder, så hvis tallet er et andet, så smid en fejl
            }
        }
Avatar billede ulrikm Nybegynder
24. marts 2011 - 14:23 #3
Her en kættersk løsning, hvor tallet behandles som en string og det enkelte tegn omsættes til tallet ved at trække 48 fra:

string[] tipotensnavne = { "Ti", "HundredeOg", "Tusinde" };
string[] talnavne = { "Nul", "Et", "To", "Tre", "Fire", "Fem", "Seks", "Syv", "Otte", "Ni" };

string taltilbogstav(int bel)
{
    return taltilbogstav(bel.ToString(),new StringBuilder(), 0);
}

string taltilbogstav(string bel, StringBuilder str, int index)
{
    int tal = bel[index] - 48;

    if (index >= bel.Length-1)
        return str.Append( talnavne[tal] ).ToString();

    str.Append(talnavne[tal]);
    str.Append(tipotensnavne[bel.Length - 2 - index]);

    return taltilbogstav(bel, str, index + 1);
}

:-)
Avatar billede havmaage Juniormester
25. marts 2011 - 09:28 #4
Hej det ser rigtig spændende ud jeg glæder mig til at granske jeres input, desværre er min PC med Visual Studie brudt sammen så jeg har ikke haft mulighed for at kigge nærmere på det men det skulle være klar til i morgen.
Avatar billede mcb2001 Nybegynder
28. marts 2011 - 12:11 #5
noget nyt?
Avatar billede havmaage Juniormester
28. marts 2011 - 15:44 #6
Tusind tak for jeres indlæg det kunne jeg virkelig bruge til noget, det er nok dit indlæg mcb2001 jeg har haft mest gavn af så derfor for du point, men også interessant at se det andet "kætteriske" forslag
Avatar billede mcb2001 Nybegynder
28. marts 2011 - 15:48 #7
jeg lægger hermed et svar.

Du kan jo bede ulrikm om også at lægge et svar, og så fordele point 40/20 eller hvad du finder rimeligt.
Så længe at du selv synes det er fair :-)
Avatar billede havmaage Juniormester
28. marts 2011 - 16:09 #8
Synes helt sikkert også Ulrikm skal lægge et svar hans løsning var meget interessant. Jeg venter lige med at tildele til han har afgivet svaret :-)
Avatar billede ulrikm Nybegynder
28. marts 2011 - 17:03 #9
takker
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