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;
}
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 , istället för sista. Är talbasen 4, och talet 123 kommer programmet alltså beräkna istället för . 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?
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 , istället för sista. Är talbasen 4, och talet 123 kommer programmet alltså beräkna istället för . 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?
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?
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
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.
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?
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#
För att se vad som händer så skriv ut (int) nummerLista[i] varje gång i loopen.
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])
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
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...