11 svar
469 visningar
Farbrorgul 408
Postad: 6 maj 2021 18:30

Omvandling mellan talbaser

Hej!

Uppgiften lyder:

Skriv ett program som tar in ett tal med en annan talbas än 10 (talbas ska vara mellan 2 och 9) från användaren och konverterar talet till talbasen 10. Du ska först fråga användare vilken talbas han vill skriva talet i och sedan fråga efter talet.
En talbas anger hur man ska tolka platsvärdet på en siffra i ett tal. I bas tio, som används i vårt vanliga decimala talsystem, används 10-potenser.

Ett exempel kan se ut så här:

Input:

Vilken talbas mellan 2 och 9 vill du skriva talet i?    4

Vilket tal? 1023

Output: 75 (1*4^3+ 0*4^2+2*4^1+3*4^0)

Obs! Du får kontrollera att talet skriven på ett korrekt sätt, t.ex. om talbas är 4 så är tillåtna siffror 0,1,2,3. Programmet ska annars skriva: ”Fel inmatning”.

Min lösning hittills (som ej fungerar):

static void Main(string[] args)
        {
            Console.WriteLine("Vilken talbas mellan 2 och 9 vill du skriva talet i?");
            int talbas = ReadInt();

            Console.WriteLine("Vilket tal?");
            string tal = Console.ReadLine();

            double output = 0;
            char[] nummerLista = tal.ToCharArray();

            for (int i = nummerLista.Length-1; i >= 0; i--)
            {
                output += (int)nummerLista[i] * Math.Pow(talbas, i);
            }

            Console.WriteLine($"Talet {tal} skriven i talbasen {talbas} är {output}");

            Console.ReadKey();
        }
        static int ReadInt()
        {
            int heltal;
            while (int.TryParse(Console.ReadLine(), out heltal) == false)
            {
                Console.WriteLine("Du skrev inte ett heltal. Skriv igen.");
            }
            return heltal;
        }
viktorzenk 190
Postad: 7 maj 2021 13:34

Hej!

Följande stycke ser fel ut:

Math.Pow(talbas, i)

Här är i indexet för siffran i talet. Den kommer alltså multiplicera första siffran i talet med talbas0, istället för sista. Är talbasen 4, och talet 123 kommer programmet alltså beräkna 1*40 + 2*41 + 3*42 istället för 1*42+ 2*41 + 3*40. Du skulle alltså kunna byta ut i mot nummerLista.Length - i.

Finns det något annat problem med programmet, eller ger det bara fel resultat?

Farbrorgul 408
Postad: 7 maj 2021 22:14
viktorzenk skrev:

Hej!

Följande stycke ser fel ut:

Math.Pow(talbas, i)

Här är i indexet för siffran i talet. Den kommer alltså multiplicera första siffran i talet med talbas0, istället för sista. Är talbasen 4, och talet 123 kommer programmet alltså beräkna 1*40 + 2*41 + 3*42 istället för 1*42+ 2*41 + 3*40. Du skulle alltså kunna byta ut i mot nummerLista.Length - i.

Finns det något annat problem med programmet, eller ger det bara fel resultat?

Hej! Tack för svar men det verkar tyvärr inte heller fungera korrekt. Misstänker att det kanske är något med 

double output = 0;

Kanske man ska ha en sträng där som tar varje enskild tal?

viktorzenk 190
Postad: 7 maj 2021 22:31

Nej det borde fungera tycker jag. Du skulle kunna göra den till int istället, du kommer ju bara ha heltal.

Får du något error av programmet, eller vad är det som inte fungerar korrekt?

Farbrorgul 408
Postad: 7 maj 2021 22:35
viktorzenk skrev:

Nej det borde fungera tycker jag. Du skulle kunna göra den till int istället, du kommer ju bara ha heltal.

Får du något error av programmet, eller vad är det som inte fungerar korrekt?

Inget error men det blir fel svar.

Ett korrekt exempel kan se ut så här:

Input:

Vilken talbas mellan 2 och 9 vill du skriva talet i?    4

Vilket tal? 1023

Output: 75 (1*4^3+ 0*4^2+2*4^1+3*4^0)

 

Mitt program:

Vilken talbas mellan 2 och 9 vill du skriva talet i?
4
Vilket tal?
1023
Talet 1023 skriven i talbasen 4 är 4305

Laguna Online 28443
Postad: 7 maj 2021 22:39

Innehåller inte nummerLista teckenkoderna för siffrorna snarare än heltalen 0-9? T. ex. 48 om siffran är 0. Och 97 för 'a', för du har ingenting som förbjuder andra tecken än siffror. 

Farbrorgul 408
Postad: 7 maj 2021 22:42
Laguna skrev:

Innehåller inte nummerLista teckenkoderna för siffrorna snarare än heltalen 0-9? T. ex. 48 om siffran är 0. Och 97 för 'a', för du har ingenting som förbjuder andra tecken än siffror. 

for (int i = nummerLista.Length - 1; i >= 0; i--)
{
output += (int)nummerLista[i] * (int)Math.Pow(talbas, i);
}

Denna rad gör typomvandling från char till int, så det borde väl stämma?

viktorzenk 190
Postad: 7 maj 2021 22:44

Att bara skriva (int) framför castar om variabeln till en int, men inte nödvändigtvis på det sätt man tänker sig. Här representeras tecknet av ett tal, troligen enligt ASCII, eller kanske Unicode. Du får alltså det tal som datorn använder för att lagra tecknet "1", och inte talet 1.

Istället borde du kunna använda int.Parse(nummerLista[i]). Testa det, jag är inte helt hundra på syntaxen i c#

Laguna Online 28443
Postad: 7 maj 2021 22:49

För att se vad som händer så skriv ut (int) nummerLista[i] varje gång i loopen. 

Farbrorgul 408
Postad: 8 maj 2021 14:04
viktorzenk skrev:

Att bara skriva (int) framför castar om variabeln till en int, men inte nödvändigtvis på det sätt man tänker sig. Här representeras tecknet av ett tal, troligen enligt ASCII, eller kanske Unicode. Du får alltså det tal som datorn använder för att lagra tecknet "1", och inte talet 1.

Istället borde du kunna använda int.Parse(nummerLista[i]). Testa det, jag är inte helt hundra på syntaxen i c#

Ja precis. Det visar sig vara Unicode som "symbolen" representerar.  int.Parse går tydligen inte att göra på denna rad

int.Parse(nummerLista[i])

viktorzenk 190
Postad: 8 maj 2021 15:17

Ok, en annan metod är att göra följande:

(int)(nummerLista[i]-'0')

Det fungerar eftersom siffrorna är i ordning i Unicode (och ASCII). Du tar alltså värdet för talet (exempelvis en '4' som blir 52), minus värdet för '0', som blir 48. 52-48 = 4

Farbrorgul 408
Postad: 8 maj 2021 16:52
viktorzenk skrev:

Ok, en annan metod är att göra följande:

(int)(nummerLista[i]-'0')

Det fungerar eftersom siffrorna är i ordning i Unicode (och ASCII). Du tar alltså värdet för talet (exempelvis en '4' som blir 52), minus värdet för '0', som blir 48. 52-48 = 4

Toppen. Löste det nu med denna kod:

static void Main(string[] args)
        {
            Console.WriteLine("Vilken talbas mellan 2 och 9 vill du skriva talet i?");
            int talbas = ReadInt();

            string tal;
            Console.WriteLine("Vilket tal?");
            tal = Console.ReadLine();

            double output = 0;
            char[] nummerLista = tal.ToCharArray();

            int upphöjd = 0;

            for (int i = nummerLista.Length - 1; i >= 0; i--)
            {
                output += ((int)nummerLista[i]-'0') * Math.Pow(talbas, upphöjd);
                upphöjd++;
                Console.WriteLine(((int)nummerLista[i] - '0'));
            }

            Console.WriteLine($"Talet {tal} skriven i talbasen {talbas} är {output}");

            Console.ReadKey();

Dock undrar jag hur jag ska göra följande:

Obs! Du får kontrollera att talet skriven på ett korrekt sätt, t.ex. om talbas är 4 så är tillåtna siffror 0,1,2,3. Programmet ska annars skriva: ”Fel inmatning”.

Eftersom det är med unicode så kan jag ju inte bara göra if (nummerLista[i] > talbas), utan jag behöver ju konvertera det till vanliga siffror på något sätt. Ska man köra (int)nummerLista[i]-'0' då med? Får det inte att fungera via den vägen...

Svara Avbryt
Close