Oktal in Dezimal umrechnen in C Programmierung
Ich würde gerne in einem Programm eine Oktalzahl in eine Dezimalzahl umrechnen jedoch funktioniert das noch nicht ganz.
So sieht das ganze bis jetzt bei mir aus:
temp = zahl % 10;
zw1 = temp;
zahl = zahl - temp;
temp = zahl % 100;
zw2 = temp / 10;
zahl = zahl - temp;
temp = zahl % 1000;
zw3 = temp / 100;
zahl = zahl - temp;
temp = zahl % 10000;
zw4 = temp / 1000;
zahl = zahl - temp;
temp = zahl % 100000;
zw5 = temp / 10000;
r1 = zw1 * 1;
r2 = zw2 * 8;
r3 = zw3 * 64;
r4 = zw4 * 512;
r5 = zw5 * 4096;
dezimalzahl = r1 + r2 + r3 + r4 + r5;
printf("Die Dezimalzahl ist %.0o\n", dezimalzahl);
3 Antworten
Du musst dir erst einmal klar machen, was dein Programm macht.
Beim ersten Durchlesen deines Programms hatte ich den Eindruck, dein Programm wandelt eine Zahl "zahl" in eine Zahl "dezimalzahl" so um, dass die Zahl "zahl" in der Dezimalschreibweise die selbe Darstellung hat wie die Zahl "dezimalzahl" in der Oktalschreibweise.
Das bedeutet, dass die Zahl 12345 (Dezimal) in die Zahl 012345 (Oktal) umgewandet wird.
Es wird die Oktalzahl ausgegeben ("%.0o" in printf). Bitte beachte, dass "%.0o" eigentlich nicht korrekt ist, da "o" als Integer keine Hinterkommastellen haben kann. Korrekt wäre "%o" ohne ".0".
Wenn du die Dezimaldarstellung der Variable "dezimalzahl" haben willst, musst du "%u" anstatt "%o" verwenden.
Wenn du eine Zahl aus dem x-System in das Dezimalsystem (also z.B. Oktal nach Dezimal) umwandeln willst, emfehle ich dir, die Zahl direkt aus dem String zu bilden und nicht eine Codierung zu verwenden, bei der in einer Zahl im Dezimalsystem eine Ziffer einer Ziffer im x-System entspricht.
Bekommst du eine Fehlermeldung oder stimmt das Ergebnis nicht? Wie sind die Variablen definiert?
Hast du mal probiert, testweise die Zwischenergebnisse auszugeben?
Die Variablen sind alle Integer, jedoch soll er nur Oktalzahlen einlesen können, deswegen hab ich definiert:
printf("Oktal -> Dezimal\n"); printf("Geben Sie eine Zahl zur Umrechnung ein.\n"); if (1 == scanf("%o", &zahl)) {
Jedoch können immer noch 8er und 9er eingegeben werden ohne dass eine Fehlermedlung über "else" kommt.
Ich würde vermuten, dass du da einen Konversionsfehler bei den Datentypen hast. Du benutzt in der Ausgabe ja Octalzahlen (daher das "o"), rechnest aber so, als ob du Integer hast.
Zumindest müsste in der Ausgabe ja %.0d\n oder %.0ld\n stehen. Denn dezimalzahl ist ja nicht als octalzahl defniert.
Das wäre meine ganzes Programm.
includemain() {
int wahl, zw1, zw2, zw3, zw4, zw5, r1, r2, r3, r4, r5, temp, zahl, dezimalzahl;
Start:
printf("Das Folgende Programm dient zur Umrechnung zwischen Oktal- und Dezimalzahlen.\n");
printf("Waehlen Sie einen Vorgang durch Bestaetigung der Zahl aus.\n");
printf("1. Dezimalzahl in Oktalzahl umrechnen\n");
printf("2. Oktalzahl in Dezimalzahl umrechnen\n");
printf("3. Abbruch\n");
scanf("%d", &wahl);
Start1:
if (wahl == 1)
{
printf("Dezimal -> Oktal\n");
printf("Geben Sie eine Zahl zur Umrechnung ein.\n");
if (1 == scanf("%d", &zahl))
{
zw1 = zahl / 8;
zw2 = zw1 / 8;
zw3 = zw2 / 8;
zw4 = zw3 / 8;
zw5 = zw4 / 8;
r1 = zahl - zw1 * 8;
r2 = zw1 - zw2 * 8;
r3 = zw2 - zw3 * 8;
r4 = zw3 - zw4 * 8;
r5 = zw4 - zw5 * 8;
printf("Die Oktalzahl ist %.0d%.0d%.0d%.0d%.0d\n", r5, r4, r3, r2, r1);
getchar();
printf("Druecken Sie Enter um zum Menue zurueckzukehren.\n");
getchar();
fflush(stdin);
goto Start;
}
else
{
printf("Fehler: Bitte geben Sie nur Zahlen ein!\n");
fflush(stdin);
goto Start1;
}
}
Start2:
if (wahl == 2)
{
printf("Oktal -> Dezimal\n");
printf("Geben Sie eine Zahl zur Umrechnung ein.\n");
if (1 == scanf("%o", &zahl))
{
temp = zahl % 10;
zw1 = temp;
zahl = zahl - temp;
temp = zahl % 100;
zw2 = temp / 10;
zahl = zahl - temp;
temp = zahl % 1000;
zw3 = temp / 100;
zahl = zahl - temp;
temp = zahl % 10000;
zw4 = temp / 1000;
zahl = zahl - temp;
temp = zahl % 100000;
zw5 = temp / 10000;
r1 = zw1 * 1;
r2 = zw2 * 8;
r3 = zw3 * 64;
r4 = zw4 * 512;
r5 = zw5 * 4096;
dezimalzahl = r1 + r2 + r3 + r4 + r5;
printf("Die Dezimalzahl ist %u\n", dezimalzahl);
getchar();
printf("Druecken Sie Enter um zum Menue zurueckzukehren.\n");
getchar();
fflush(stdin);
goto Start;
}
else
{
printf("Fehler: Bitte geben Sie nur Oktalzahlen ein!\n");
fflush(stdin);
goto Start2;
}
}
getchar();
if (wahl == 3)
{
}
}
Ich will dass man nur Oktalzahlen eingeben kann, ansonsten soll ja eine Fehlermedlung kommen. Wie stell ich das dann an damit es funktioniert? Bei der Ausgabe der Dezimalzahl hatte ich ja vorher %d trotzdem sind nicht die richtigen Werte rausgekommen. Außerdem kommt die Fehlermeldung nur bei Zahlen die mit 8 und 9 anfangen, aber wenn ich 6298 eingebe rechnet er das trotzdem aus.
Also wenn ich das %o zu %d ändere passt die Rechnung, jedoch hätt ich gerne noch dass keine 9er und 8er eingegebn werden können. Hat da jemand ne Lösung für das Problem??
In Wirklichkeit arbeitest du ausschließlich mit Integern. Also musst du auch entsprechend bei der Ausgabe %d benutzen. Warum %o? Du benutzt die interne Repräsentation von Oktalzahlen doch überhaupt nicht.