przekształcenie ciągu cyfr na double

0

Jak mam przekształcić ciąg cyfr na wartość zmiennopozycyją podwójnej precyzji??

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

double atof(s) /* przeksztalc tekst na wartosc zmiennopozycyjna */
char s[100];
{
double val, power; /* znormalizowana liczba*/
int i, sign;
int exp; /* wykladnik potegi */

 for(i=0; isspace(s[i]);i++) /*pomin znaki biale */
  ;
 sign= (s[i]=='-')?-1:1; /* znak liczby*/
  if(s[i]=='+' || s[i]=='-')
   i++;
 for(val=0.0;isdigit(s[i]);i++)
  val=10.0*val+(s[i]-'0');
  if(s[i]=='.')
  i++;
 for(power=1.0;isdigit(s[i]);i++){
  val=10.0*val+(s[i]-'0');
  power*=10.0;}
  val=sign*val/power;
  if(s[i]=='e' || s[i]=='E'){
 sign=(s[++i]=='-')?-1:1;
  if(s[i]=='+' || s[i]=='-')
  i++;
 for(exp=0;isdigit(s[i]);i++)
  exp=10*exp+(s[i]-'0');
  if(sign==1)
  while(exp-->0) /* wykladnik dodatni */
  val*=10;
  else
  while(exp-->0) /* wykladnik ujemny */
  val/=10;
}
return val;
}
main()
{
char d[100];
double n;
clrscr();
 printf(" dopoki nie nacisniesz Enter, beda wprowadzane znaki");
 printf("\nwprowadz znak z klawiatury : ");
 gets(d);
 n=atof(d);
 printf("\n wartosc double=%.2f",n);
return 0;
}

to jest caly moj kod,jest w nim pare bledow (program.c error: argument "s" doesn't match prototype
/usr/include/stdlib.h error: prototype declaration) ale nie wiem jak je zmienic
program na odczytywac z klawiatury ciag znakow pomijac biale itp a w momencie odczytu cyfr i E i + - zamienic je cos w stylu 123.4E-1 ma byc potem 12.34.
prosze o pomoc

0

c czy c++?

0

jezyk c

0
/*ta funkcja Ci zycie uprosci znacznie wewnatrz atof*/
void killspace(char* s, int length)
{
    int dst = 0, src = 0;
    while( src < length)
        if( isspace(s[src]) )
            ++src;
        else
            s[dst++] = s[src++];
    s[dst] = 0;
}

double atof(char s[100]) /* przeksztalc tekst na wartosc zmiennopozycyjna */
{
    double value;
    int sign;
    int i = 0;

    sign= (s[i]=='-')?-1:1; /* znak liczby*/

    if( s[i]=='+' || s[i]=='-' ) ++i;

    value = 0;
    while(isdigit(s[i]))
        value = 10.0*value + (s[i++]-'0');

    /* po kropce, podobna petla do przed-kropka
     * tyle ze teraz jedziemy dzielac przez dziesiec
     * i wsumowujac coraz mniejsze skladniki
     */
    if(s[i]=='.')
    {  double multiplier = 1;
        ++i;      /*pomin kropke*/

        while(isdigit(s[i]))
            value += (multiplier/=10.0)*(s[i++]-'0');
    }

    value *= sign;

    /* a tutaj kopiuj-wklej z przed-kropka!
     * bo jest ta sama sytuacja: znak+ciag cyfr
     */
    if(s[i]=='e' || s[i]=='E')
    {   double evalue = 0;
        int esign = 1;
        ++i;      /*pomin E*/

        sign= (s[i]=='-')?-1:1; /* znak wykladnika*/

        if( s[i]=='+' || s[i]=='-' ) ++i;

        while(isdigit(s[i]))
            evalue = 10.0*value + (s[i++]-'0');

        value *= pow(10, evalue);
    }

    return value;
}

int main()
{
    char d[100];
    double n;
    clrscr();
    printf(" dopoki nie nacisniesz Enter, beda wprowadzane znaki");
    printf("\nwprowadz znak z klawiatury : ");

    gets(d);

    killspace(d);  /*  <-- ! */

    n=atof(d);

    printf("\n wartosc double=%.2f",n);
    return 0;
}

disclaimer: pisane z glowy, moga byc literowki i inne drobne bledy z tego wynikajaca

0

w tym co napisales jest tylko jeden blad.
killspace(d);
pisze ze w tej linijce jest za malo argumentow, no i jak patrzec w deklaracji tej funkcji uzyles:
void killspace(char* s, int length) gdzie sa 2 argumenty.
to jaki argument brakuje w tym powyzej, co powinnam wpisac???

0

jejku, no dlugosc tablicy, 100 oczywiscie, dlatego wlasnie dislaimery pisze ;)

0

i mam jeszcze jeden problemik, juz mi kiedys tego typu error wyskakiwal ale nie wiem co z nim zrobic:
program4.c error: conflicting types for 'atof'
/usr/include/stdlib.h error: previous declaration of 'atof' was here
i do tego wiersz 15 to jest tylko klamerka {

z gory dziekuje za pomoc dla poczatkujacej jak ja</quote>

0

funkcja ATOF juz istnieje w bibliotece standardowej - stad wskazanie na stdlib.h:146 albo wywal #include stdlib albo zmien nazwe funkcji, innej rady nie ma

0

Rozumiem.Tyle ze jak usuwam biblioteke lub zmieniam nazwe w moim programie powiedzmy atof na atoff to nie wykrywa mi 'pow' i 'clrscr'.jak to jest?

Aha i jeszcze jedno odnosnie twojej ostatniej wypowiedzi. to jezeli zachodzi konflikt miedzy funkcja ATOF w bibliotece a tym co mam w programie to mam rozumiec ze moj program nie uzupelnia funkcji ATOF z biblioteki o te wlasnosci zamiany ciagu cyfr z E, kropka + i - na double tylko jedynie moj program ma podobna nazwe i te wlasnosci zamiany ciagu znakow na double.
a mialo to byc wlasnie uzupelnienie funkcji atof z biblioteki stdlib.h :(

0
merneith napisał(a)

Rozumiem.Tyle ze jak usuwam biblioteke lub zmieniam nazwe w moim programie powiedzmy atof na atoff to nie wykrywa mi 'pow' i 'clrscr'.jak to jest?

moze msz kompilator/libstd ktore nie ma clrscr -- to jest czysto borlandowy dodatek. natomiast pow jest w <math.h>

merneith napisał(a)

Aha i jeszcze jedno odnosnie twojej ostatniej wypowiedzi. to jezeli zachodzi konflikt miedzy funkcja ATOF w bibliotece a tym co mam w programie to mam rozumiec ze moj program nie uzupelnia funkcji ATOF z biblioteki o te wlasnosci zamiany ciagu cyfr z E, kropka + i - na double tylko jedynie moj program ma podobna nazwe i te wlasnosci zamiany ciagu znakow na double.

tak, dokladnie tak. nie istnieje nic takiego jak 'uzupelnianie funkcji' w sensie doslownym. tak napisany program jak powyzej po prostu probuje stworzyc calkowicie wlasna funkcje o tej samej nazwie i potem okazuje sie ze jest konflikt nazw, bo taka funkcja juz istnieje (i by nie wiadomo bylo ktora funkcje probuej sie wywolac w main - te 'nasza'? czy z te stdlib?)

merneith napisał(a)

a mialo to byc wlasnie uzupelnienie funkcji atof z biblioteki stdlib.h :(

jaaa... to czemu nie napisalas tak od razu.. to by znaczylo ze w 'naszej, poprawionej' mozna uzywac oryginalnej funkcji atof() i by gdzies ze 3/4 kodu mniej bylo.. ale to jutrom teraz prawie zasypiam, za cieplo jest juz jak na mnie:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1