练习4-2 对atof函数进行扩充,使它可以处理形如123.456e-6的科学表示法,其中,浮点数后面可能会紧跟一个e或E以及一个指数(可能有正负号)

来源:互联网 发布:一句话木马 php 编辑:程序博客网 时间:2024/06/06 02:19
/*时间:2017/8/10地点:工程北629功能:科学表示法的显示思想:函数的设计{getline()、atof()、main()}*/#include <stdio.h>#include <ctype.h>#define MAXLINE 1000int getline(char s[],int lim);  //函数原型double atof(char s[]);/*主函数*/int main(void){    double val;    char line[MAXLINE];    while(getline(line,MAXLINE) > 0)  //科学记数法显示        val = atof(line);    printf("%f\n",val);return 0;}/*  getline函数版本2  */int getline(char s[], int lim){    int c,i;    i = 0;    while(--lim > 0 && (c = getchar()) !=EOF && c!='\n')          s[i++] = c;    if(c == '\n')        s[i++] = c;    s[i] = '\0';    return i;}/*  getline函数版本1  *//*int getline(char s[], int lim)  {int c, i;for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)s[i] = c;if(c == '\n'){s[i] = c;++i;}s[i] = '\0'; return i;       }*//*  扩展的atof函数  */double atof(char s[]){    double val, power;    int i, sign, n;    n = 0;    for(i = 0; isspace(s[i]); ++i)        ;    sign=(s[i] == '-') ? -1:1;    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')  //扩展atof部分,类似于atoi函数{        i++;        sign=(s[i] == '-') ? -1:1;        if(s[i] == '+' || s[i] == '-')            i++;        for( ; isdigit(s[i]); ++i){            n = 10*n + (s[i]-'0');        }        for( ; n>0; --n)  //对上面的val进行提高n个数量级,若n=3,则*1000;若n=-3,则*0.001{            if(sign > 0)                val = val*10.0;            else                val = val*0.1;        }    }    return val;}/*在Vc++6.0中的输出结果是:----------------------------1289987e4^Z12899870000.00000041.7888858e-4^Z0.004179-1234.589688e5^Z-123458968.800000----------------------------总结:函数实现方法很多,遇到不懂的函数先尝试试数,然后反复思考,即可。*/

阅读全文
0 0