Konvertierungsprogramm in C

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

Beitragvon moonangel » Mo 25 Sep, 2006 20:43

wie man was gern hätte ? is ja klar das ich buchstaben brauche um eine zahl in einen system größer als 10 darzustellen.

hornerschema ist einfacher als divisionsrestverffahren aber schwerer zu programmieren da zwischenschritte.

am ascii-code bin ich trotzdem gescheitert ...
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon hellbringer » Mo 25 Sep, 2006 20:43

hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon moonangel » Mo 25 Sep, 2006 21:30

heee vielen dank fĂĽr die links. ist das aber wirklich c ?
sieht mir nicht so aus. zumindest nicht aufn ersten blick
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon hellbringer » Mo 25 Sep, 2006 21:50

ist C++

sollte sich aber problemlos auf C umschreiben lassen.
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon moonangel » Mo 25 Sep, 2006 22:12

wenn man die befehle kennen wĂĽrde schon :(
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon hellbringer » Mo 25 Sep, 2006 22:31

hier is noch ein anderer code, der etwas einfacher geschrieben ist. den teil mit den grafiken kannst rausnehmen:

http://mycplus.com/out.asp?CID=1&SCID=138
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon superracer » Di 26 Sep, 2006 06:30

ist eh so einfach.
Code: Alles auswählen
unsigned int my_strtol(char *zahl, unsigned int base) {
        /* zahl: string in form von zb "32fac2" */
        /* base: 2 .. 36 */

        unsigned int ret, dig;
        unsigned char *cp;

        if (!zahl || base < 2 || base > 36)
                return -1;

        ret = 0;
        cp = (unsigned char *) zahl;

        /* fĂĽhrende spaces ĂĽberspringen */
        while (*cp == ' ')
                cp++;

        while (*cp) {
                if (*cp >= '0' && *cp <= '9')
                        dig = *cp - '0';
                else if (*cp >= 'a' && *cp <= 'z')
                        dig = *cp - 'a' + 10;
                else if (*cp >= 'A' && *cp <= 'Z')
                        dig = *cp - 'A' + 10;
                else
                        break;  /* konvertierung stoppt beim ersten ungĂĽltigen zeichen */

                if (dig >= base)
                        break;   /* ditto */
                ret *= base;
                ret += dig;
                cp++;
        }

        return ret;
}
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Di 26 Sep, 2006 18:07

hmm das sieht schon fĂĽr mich leserlicher aus. danke :)
mal schaun obs auch funkt bei mir.
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon moonangel » Di 03 Okt, 2006 20:14

he hat lange gedauert. aber hab beide programme ausprobiert und die funktionieren nicht. das in c++ nicht und das in c auch nicht wobei dass das einzige ist was ich verstehe :(
wieso geh das nicht und is da nachkommateil auch berĂĽcksichtigt?
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon superracer » Mi 04 Okt, 2006 05:11

vielleicht kannst du dich etwas präziser als "geht nicht" ausdrücken??? meine version geht nämlich schon, wenn ich ein prog mit folgender main() mach:

Code: Alles auswählen
int main() {
        unsigned int x;

        x = my_strtol("352da", 16);
        printf("%u\n", x);

        return 0;
}


dann printet es mir "217818" raus.

und nachkommastellen bei nicht-base-10 zahlen sind etwas exotisch ^^
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Mi 04 Okt, 2006 11:04

ja wenn ich diese programm das du da hast eingebe kommt:

1. "error C3861: 'my_strtol': identifier not found"
2. "error C2365: 'my_strtol' : redefinition; previous definition was 'formerly unknown identifier'"

und ich weiĂź das die nachkommastellen bei nicht 10er basis zahlen etwas seltsam sind nur
LEIDER brauch ich die. das ist mein problem ;)
moonangel
Junior Board-Mitglied
Junior Board-Mitglied
 
Beiträge: 49
Registriert: Sa 04 Mär, 2006 16:14

Beitragvon superracer » Mi 04 Okt, 2006 11:27

dann solltest du dein C handbuch nochmal lesen, denn funktionen müssen definiert oder zumindest deklariert werden, bevor sie verwendet werden können. d.h. entweder die funktion weiter nach oben schieben, oder ganz oben nen prototypen hinklatschen. gilt übrigens auch für variablen und andere benamste dinge.

bzgl nachkommastellen: dann gib doch mal ein beispiel, wie sowas umzurechnen ist? zb wieviel ist "0.f" (hex) in dezimal? wäre übrigens schön gewesen, das von anfang an zu wissen.
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon hellbringer » Mi 04 Okt, 2006 11:47

0.f hex wären dezimal 0,9375

zumindest wurde mir das damals so beigebracht :)
hellbringer
Profi-User
Profi-User
 
Beiträge: 1619
Registriert: Di 04 Mai, 2004 19:35

Beitragvon superracer » Mi 04 Okt, 2006 12:08

in dem fall wĂĽrde die funktion so ausschaun:

Code: Alles auswählen
static unsigned int basedig(unsigned char dig, unsigned int base) {
   if (dig >= '0' && dig <= '9')
      return dig - '0';
   else if (dig >= 'a' && dig <= 'z')
      return dig - 'a' + 10;
   else if (dig >= 'A' && dig <= 'Z')
      return dig - 'A' + 10;
   return -1;
}

double my_strtol(char *zahl, unsigned int base) {
   unsigned int ret, dig;
   double nc, fact, exp;
   unsigned char *cp;

   if (!zahl || base < 2 || base > 36)
      return -1;

   ret = 0;
   nc = 0;
   fact = 1;
   cp = (unsigned char *) zahl;

   while (*cp == ' ')
      cp++;

   if (*cp == '-') {
      fact = -1;
      cp++;
   }

   while (*cp) {
      dig = basedig(*cp, base);
      if (dig == -1)
         break;
      if (dig >= base)
         break;
      ret *= base;
      ret += dig;
      cp++;
   }

   if (*cp == '.') {
      cp++;
      exp = base;

      while (*cp) {
         dig = basedig(*cp, base);
         if (dig == -1)
            break;
         if (dig >= base)
            break;
         nc += dig / exp;
         exp *= base;
         cp++;
      }
   }

   return fact * (nc + ret);
}


nicht mehr ganz schön, aber sollte hinhauen, und berücksichtigt sogar "-" als vorzeichen.

testlauf:

Code: Alles auswählen
        printf("%f\n", my_strtol("53ad", 16));
        printf("%f\n", my_strtol("0.f", 16));
        printf("%f\n", my_strtol("0.0f", 16));
        printf("%f\n", my_strtol("0.ad4f", 16));


gibt aus:

Code: Alles auswählen
21421.000000
0.937500
0.058594
0.676987


krieg ich jetzt ein plus?
superracer
Board-User Level 3
Board-User Level 3
 
Beiträge: 1073
Registriert: So 04 Jul, 2004 11:18

Beitragvon moonangel » Sa 07 Okt, 2006 17:59

gut okay funkt jetzt super aber wie schreib ich so um
das der benutzer die zahl die anfangsbasis und die zeilbasis
eingeben kann ?


/*
#include "stdafx.h"
#include<stdlib.h>
double my_strtol(char *zahl, unsigned int base) ;

int main()
{
unsigned int x;

x = my_strtol("2da", 16); //was das? wie geb ich ein ?
printf("%u\n", x);

return 0;
}
static unsigned int basedig(unsigned char dig, unsigned int base) {
if (dig >= '0' && dig <= '9')
return dig - '0'; // was is dig?
else if (dig >= 'a' && dig <= 'z') //was is else if?
return dig - 'a' + 10;
else if (dig >= 'A' && dig <= 'Z')
return dig - 'A' + 10;
return -1;
}

double my_strtol(char *zahl, unsigned int base)
{
unsigned int ret, dig;
double nc, fact, exp;
unsigned char *cp;

if (!zahl || base < 2 || base > 36)
return -1;

ret = 0;
nc = 0;
fact = 1; // fact = variable?
cp = (unsigned char *) zahl;

while (*cp == ' ')
cp++;

if (*cp == '-') {
fact = -1;
cp++;
}

while (*cp) {
dig = basedig(*cp, base); // was is basedig?
if (dig == -1)
break;
if (dig >= base)
break;
ret *= base;
ret += dig;
cp++;
}

if (*cp == '.') {
cp++;
exp = base;

while (*cp) {
dig = basedig(*cp, base);
if (dig == -1)
break;
if (dig >= base)
break;
nc += dig / exp;
exp *= base;
cp++;
}
}

return fact * (nc + ret); // was hat man mir eigentlich beigebracht ??
}

*/
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 66 Gäste