#include "stdafx.h"
#include <stdlib.h>
float umwandler(char *zahl, int basis);
static int basedig( char dig, int basis) ;
void conv_to_base(double x, unsigned int base, char *buf, int ucase);;
//basedig=funktion, die eine ziffer (char 0-9, a-z) als int (dezimal) zurĂĽckgibt. wobei mir gerade auffallt, daĂź der "base" parameter hier nicht verwendet wird.
void main(void)
{
char buf[64];
float x;
char *zahl;
int basis,base;
printf("Geben Sie bitte Ihre Anfangsbasis ein:\n");
scanf("%i",&basis);
printf("Geben Sie bitte Ihre Zahl ein:\n");
scanf("%s",*zahl);
x = umwandler(*zahl, basis); //anfangsbasis
printf("%f \n", x);
printf("Geben Sie bitte Ihre Zielbasis ein:\n");
scanf("%d",&base);
conv_to_base(x, base, buf, 0); //zielbasis
printf("%s\n", buf);
}
static int basedig( char dig, int basis)
{
if (dig >= '0' && dig <= '9')
return dig - '0';
else if (dig >= 'A' && dig <= 'Z')
return dig - 'A' + 10;
return -1;
}
float umwandler(char *zahl, int basis)
{
// zahl: string in form von zb "32fac2" //
// base: 2 .. 36 //
int ret, dig; //dig=wert (0-35) der aktuell bearbeiteten ziffer
float nc, fact, exp; //nc=Nachkommateil der Zahl,fact=Vorzeichen,exp=exponent wird zum durchdividieren der einzelnen stellen des nachkommateils gebraucht
char *cp; //char pointer, damit wird der string von anfang bis ende zeichen fĂĽr zeichen durchgehatscht
if (!zahl || basis < 2 || basis > 36)
return -1;
ret = 0;
nc = 0;
fact = 1; // Variable fĂĽr das Vorzeichen
cp =(char*)zahl;
// fĂĽhrende spaces ĂĽberspringen //
while (*cp == ' ')
cp++;
if (*cp == '-')
{
fact = -1;
cp++;
}
while (*cp)
{
dig = basedig(*cp, basis);
if (dig == -1)
break; // konvertierung stoppt beim ersten ungĂĽltigen zeichen //
if (dig >= basis)
break; // konvertierung stoppt beim ersten ungĂĽltigen zeichen//
ret=ret*basis;
ret=ret+dig;
cp++;
}
if (*cp == '.')
{
cp++;
exp = basis;
while (*cp)
{
dig = basedig(*cp, basis);
if (dig == -1)
break;
if (dig >= basis)
break;
nc += dig / exp;
exp =exp*basis;
cp++;
}
}
return fact * (nc + ret); //gibt das endergebnis zurĂĽck, bestehend aus vorzeichen (fact), ganzzahliger anteil (ret) und nachkommateil (nc)
}
static char digitvalue(unsigned int digit, unsigned int base, int ucase) {
if (digit > base)
return '?';
if (digit <= 9)
return '0' + digit;
return (ucase ? 'A' : 'a') + digit - 10;
}
void conv_to_base(double x, unsigned int base, char *buf, int ucase) {
double exp;
if (x < 0) {
*buf++ = '-';
x *= -1;
}
if (x == 0) {
*buf = '0';
return;
}
exp = base;
while ((exp * base) < x)
exp *= base;
while (exp >= 1 || x != 0) {
*buf++ = digitvalue(x / exp, base, ucase);
x -= ((unsigned int) (x / exp)) * exp;
if (exp == 1 && x != 0)
*buf++ = '.';
exp /= base;
}
*buf = '\0';
//ucase = uppercase ja oder nein (also "A" vs "a")
//buf = nachdem der rĂĽckgabewert ja ein string ist, muĂź es wo einen buffer geben, wo der string reingeschrieben wird. der muĂź groĂź genug sein um den ganzen string zu halten, sonst -> buffer overflow
}
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste