was kann das prog: dezimalzahlen(10er-sytem) in beliebiges anderes system umwandeln(binär-hexadezimal)
funtionsweise: kern ist die standart "kopfrechenweise" zur umwandlung dezimalsystem -> beliebigses anderes zahlensystem (vorkomma: dezimalzahl / #system...ergebnis nur in nazürlichen zahlen....rest = ziffer im "beliebiges system" (von rechts nach links)......(ergebnis ohne rest) / system......naja und so weiter...rechnweise ist denke ich jedem bekannt)
wieso dieses programm: naja, man sieht schnell, dass man oft auch in anderen, als geläufiges dezimal, zahlensystemen arbeiten muss....daher die idee.
zur entstehung: ansporn war wie erwähnt das tutorial auf tutorials.at. nach durcharbeitung der ersten 3 kapitel wurde der erste spatenstich gesetzt, als erstes war nur ganzzahlen von dezimal -> binär, erweiterung auf dezimal -> sytem nach wahl, hinzufügen des rechengangs für nachkommastellen(6-stellen genauigkeit)
der code:
Code: Alles auswählen
#include <stdio.h>
#include <conio.h>
int main()
{
int sys, rund, rund2, rest, rdy = 2, k;
int x[40], y[5], i, j;
float dezi1, dezi2, ein, kom;
printf("%53s","Zahlensystem Umrechner\n\n");
printf("%72s","Aus dem Dezimal in Binaer bis Hexadezimal System umrechnen\n\n\n");
do
{
while(rdy == 2) /*systemwahl*/
{
printf("System waehlen(z.B. 2=binaer, 8=oktal, etc): ");
fflush(stdin);
scanf("%d", &sys);
if((sys > 16) || (sys < 2)) /*check gültiges zahlensystem*/
printf("Ungueltige Wahl. Waehlen sie eine Zahl von 2 bis 16.\n");
else rdy = 1;
}
printf("\nDezimalzahl eingeben: ");
fflush(stdin);
scanf("%f", &dezi1);
ein = dezi1;
rund2 = ein;
kom = (ein - ((float)rund2));
for(j = 0; j <= 5; j++) y[j] = 0; j = 0; /*elemente vom y-array auf 0 initialisieren, j den wert 0 geben*/
for(i = 0; i <= 40; i++) x[i] = 0; i = 0; /*elemente vom x-array auf 0 initialisieren, i den wert 0 geben*/
do /*rechengang vorkomma*/
{
dezi2 = (dezi1 / sys);
rund = dezi2;
if(dezi2 != rund) /*wenn rest*/
{
rest = (dezi1 - (rund * sys));
dezi1 = rund;
x[i] = rest;
i++;
}
else /*kein rest*/
{
dezi1 = rund;
x[i] = 0;
i++;
}
}
while(dezi1 > 0); /*ende des rechengangs, wenn bei der teilung wert < 1 rauskommt*/
if(rund2 != ein)
{
do /*rechengang nachkomma*/
{
kom = (kom * sys);
rund = kom;
y[j] = rund;
kom = (kom - rund);
j++;
}
while(j <= 5);
}
printf("\nDie Zahl %.3f entspricht im %d-er System:\n", ein, sys); /*ergebnisausgabe*/
for(i = 40, k= 0; i >= 0; i--) /*ergebnisausgabe(vorkomma)*/
{
if(x[i] == 0 && k != 1) /*überflüssige nullen am anfang des ergebnisses wegstreichen*/
{ /*erst wenn das nächst niedrigere feld(x[i-1]) des arrays einen*/
if(x[i-1] != 0) k = 1; /*wert != 0 hat, kommt bis ende der schleife nurnoch else(ergebnisausgabe)*/
}
else
{
if(x[i] < 10) printf("%d", x[i]); /*ausgabe ansich, festlegung der ziffern A-F*/
if(x[i] == 10) printf("A");
if(x[i] == 11) printf("B");
if(x[i] == 12) printf("C");
if(x[i] == 13) printf("D");
if(x[i] == 14) printf("E");
if(x[i] == 15) printf("F");
}
}
if(rund2 != ein) /*ergebnisausgabe(nachkomma)*/
{
printf(".");
for(j = 0; j <=5; j++)
{
if(y[j] < 10) printf("%d", y[j]);
if(y[j] == 10) printf("A");
if(y[j] == 11) printf("B");
if(y[j] == 12) printf("C");
if(y[j] == 13) printf("D");
if(y[j] == 14) printf("E");
if(y[j] == 15) printf("F");
}
}
printf("\n\nWeitere Berrechnung?\n(1) Ja\n(2) Ja, aber anderes System\n(3) Nein\t\t\tIhre Wahl: ");
fflush(stdin);
scanf("%d", &rdy);
for(;(rdy > 3) || (rdy < 1);)
{
printf("Ungueltige Wahl.\n");
printf("\nWeitere Berrechnung?\n(1) Ja\n(2) Ja, aber anderes System\n(3) Nein\t\t\tIhre Wahl: ");
fflush(stdin);
scanf("%d", &rdy);
}
}
while(rdy != 3); /* beenden durch benutzer(durch wahl)*/
return 0;
}
1. sagen wir, ich möchte zb die zahl 77777777 in beliebiges zahlensytem umwandeln....berechenet wird mir immer dir zahl 77777776(ist nur beispiel, bei >7stellige zahlen kommt das mit der "rundung" öftest vor). habe ich irgendwo falschen zahlentyp gewähl? "float" müsste doch eigentlich die erwünschte genauigkeit bringen, oder nich? erste überlegnung meinerseits war:weil ich für die (ab)gerundetet zahl (variablen rund, rund2) typ int benutzt habe kommt eine ungenauigkeit zusatande ( genauerer zahlentyp -> ungenauerer zahlentyp -> evtl genauigkeitsverlust(so wars doch oder?^^)). diese vermutung hab ich dann aber recht schnell wieder verworfen da mir in der ergebnisausgabe (die zahl "***" entspricht im #-system,....") ja eine nie benutze/geänderet float variable ausgegeben wird und diese trotz allem den "gerundeten" wert ausgibt.
2. was sagt ihr punkto übersichtlichkeit code? mal ausgenommen dass ich evtl ein paar überflüssige variablen initialisiert habe, sprich: man das selbe ergebnis mit weniger variablen bekommen hätte. ist wie gesagt mein erstes prog und durch erweiterungen (dez-binär -> dez-beliebig -> dez-beliebig-nachkomma) ist das ganze ein wenig auseinander geraten. ziel war es auch eigentlich erstmal nur erworbene kenntnisse anzuwenden(grundbefehle, scheifen, arrays(womit ich, 3.kapitel war ich wie gesagt, probleme hatte), syntax allgemein, ...) ....nicht ein "marktfähiges" programm zu schreiben.
3. iwelche sonstigen kritiken/ratschläge
gruß
kaputtnix
ps: urteilt nich zu hart, "ist mein erster tag"