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

/*
	时间:2017/8/10
	地点:工程北629
	功能:科学表示法的显示
	思想:函数的设计{getline()、atof()、main()}

*/

#include 
#include 
#define MAXLINE 1000

int 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
^Z
12899870000.000000

41.7888858e-4
^Z
0.004179

-1234.589688e5
^Z
-123458968.800000
----------------------------
	总结:函数实现方法很多,遇到不懂的函数先尝试试数,然后反复思考,即可。
*/

你可能感兴趣的:(《C程序设计语言R&H》)