Konvertierungsprogramm in C

Das Forum fĂĽr Programmierer und Systemadmins. Von Shell-, Perl- und PHP-Scripts bis zur objektorientierten Programmierung mit C++.

Beitragvon moonangel » Mi 11 Okt, 2006 14:28

hach. ist das jetzt deine lösung für mein kovertierungsding oder das GANZE programm ?
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon superracer » Mi 11 Okt, 2006 14:30

selber schaun und bissl lesen wirst ja wohl noch können, oder? :/
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Mi 11 Okt, 2006 14:42

naja ... du kennst mich nicht :P
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon moonangel » Mi 11 Okt, 2006 14:48

was ucase und buf?

"conv_to_base(-355623.9921875(zahl?), 16(?), buf(?), 0(?));
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon superracer » Mi 11 Okt, 2006 14:52

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
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Mi 11 Okt, 2006 15:47

aha nur verwende ich nur groĂźbuchstaben und keine kleinen.
wär ja noch schöner wenn ich das auch bräucht.

und:

conv_to_base(-355623.9921875(zahl?), 16(?), buf(?), 0(?));
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon moonangel » Fr 13 Okt, 2006 11:23

conv_to_base(-355623.9921875(zahl?), 16(?), buf(?), 0(?));


wofĂĽr steht die 16 und die 0 ?
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon superracer » Fr 13 Okt, 2006 11:27

guckst du dir den header der funktion an:

void conv_to_base(double x, unsigned int base, char *buf, int ucase) {

und dann darfst du 3mal raten...
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Fr 13 Okt, 2006 11:32

jaja aber ich hab nicht ganz gechekt wofĂĽr das ucase steht. ist das auch ne basis oder nicht. 16 ist die anfangs oder ziel basis ? :(
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon moonangel » Fr 13 Okt, 2006 11:33

weil kleine buchstaben brauch ich ja nicht sondern nur groĂźe.
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon superracer » Fr 13 Okt, 2006 11:39

mann... das ist die ZIELbasis, da diese funktion von einem double ausgeht und es somit keine anfangsbasis gibt.
und wenn du keine kleinbuchstaben brauchst, dann nimm den parameter raus und schreib die funktion entsprechend um.
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Fr 13 Okt, 2006 11:42

d.h. das programm wandelt ne dezimal in die zielbasis umund as erste was du gemacht hast von beliebig in 10. d.h. das ist die funktion fĂĽrs andre pr?
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon superracer » Fr 13 Okt, 2006 11:48

100 punkte.
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Fr 13 Okt, 2006 11:54

jop habs endlich gechekt ^^
hat lang gedauert ich weiĂź und
deswegen danke ich dir fĂĽr deine
groĂźe geduld.
DANKE ^^

Hoffe mir fällt nicht nochwas ein was ich nicht chek
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon moonangel » Fr 13 Okt, 2006 12:48

EINE letzte frage noch:

ich habe bei JEDEN scanf ein:
"warning C4996: 'scanf' was declared deprecated"

was mach ich den falsch?


#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
}
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

VorherigeNächste

ZurĂĽck zu PROGRAMMIER FORUM

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste