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 0 Gäste