6-5 atof函数的实现 (10分)

本题要求实现一个函数,将一组数字型字符串,转换成double型的浮点数。

函数接口定义:
函数接口如下:
double myatof(char s[]);
其中s[ ]是输入的数字型字符串,函数返回一个double类型的浮点数。

裁判测试程序样例:
主函数中通过键盘输入一组字符串,调用myatof函数进行转换并打印输出 。
#include “stdio.h”
#define N 20
double myatof(char s[]);

int main()
{
double num;
char s[N];
while(1)
{
scanf("%s",s);
if (s[0]==‘q’) break;
num=myatof(s);
printf("%f\n",num);

}
return 0;
}

/* 请在这里填写答案 */

输入样例:
输入多个数字型的字符串,每个字符串之间换行符隔开。字符串可能包括空格符、正负符号、小数点以及其它非数字字符。 对输入的字符串进行转换时,首先跳过行首的空格字符,直到遇上数字、小数点或正负符号才开始做转换,而再遇到其它非数字字符时或字符串结束时才结束转换,并将结果返回。 当输入字符’q’时,程序结束。 例如:
6.348
-2.98
.525
q
输出样例:
double型浮点数,显示小数点后六位。 当为正数时,浮点数第一位不显示’+’。 当为负数时,浮点数第一位显示’-’. 如:
6.348000
-2.980000
0.525000

程序1(多return):

double myatof(char s[])
{
    double small=1,sum=0,falg=1;
    int i=0;
    //去掉遇到数字前的其他字符
    while(!(s[i]>='0'&&s[i]<='9'||s[i]=='+'||s[i]=='-'||s[i]=='.')&&s[i]!='\0'){
        i++;
    }
    if(s[i]=='\0')          //无数字字符,返回0;
	    return 0;
    if(s[i]=='-'){          //如果读到负号用falg标记
        falg=-1;
        i++;
    }
    if(s[i]=='+'){          //读到正号则跳过
        i++;
    }
    //计算小数点前的数字
    while(s[i]>='0'&&s[i]<='9')  
        {
            sum=sum*10+(s[i]-'0');
            i++;
        }
   //计算小数点后数字,并统计位数,用small记录,最后除以small变小数
    if(s[i]=='.')
    {
    	i++;
    	while(s[i]>='0'&&s[i]<='9')
    	{
    		sum=sum*10+(s[i]-'0');
    		i++;
    		small*=10;
		}
	}
	//计算出sum=0,则直接返回0
    if(sum==0)
    	return 0;
    return falg*sum/small;
}

程序1改进:

double myatof(char s[])
{
    double small=1,sum=0,falg=1;
    int i=0;
    //去掉遇到数字前的其他字符
    while(!(s[i]>='0'&&s[i]<='9'||s[i]=='+'||s[i]=='-'||s[i]=='.')&&s[i]!='\0'){
        i++;
    }
    //无数字字符,sum为0;
    if(s[i]=='\0') 
	    sum=0;
	else{
	    if(s[i]=='-'){             //如果读到负号用falg标记
	        falg=-1;
	        i++;
	    }
	    if(s[i]=='+'){              //读到正号则跳过
	        i++;
	    }
	    //计算小数点前的数字
	    while(s[i]>='0'&&s[i]<='9')  
	        {
	            sum=sum*10+(s[i]-'0');
	            i++;
	        }
	    //计算小数点后数字,并统计位数,用small记录,最后除以small变小数
	    if(s[i]=='.')
	    {
	    	i++;
	    	while(s[i]>='0'&&s[i]<='9')
	    	{
	    		sum=sum*10+(s[i]-'0');
	    		i++;
	    		small*=10;
			}
		}
        if(sum==0){     //如果不进行sum=0时直接进行else操作sum也会等于0但无法过测试点无任何有效数字字符时输出0.000000
            sum=0;
        }
        else{           
		    sum=falg*sum/small;
        }
	}
    return sum;
}

最后的if-else也可用以下if代替:

if(sum!=0){
	sum=falg*sum/small;
 }

程序2:

double myatof(char s[])
{
    char *p=s;
    double small=1,sum=0,falg=1;
    while(!(*p>='0'&&*p<='9'||*p=='+'||*p=='-'||*p=='.')&&*p!='\0'){
    	p++;
    }
    if(*p=='\0') 
	    sum=0;
	else{
	    if(*p=='-'){
	        falg=-1;
            p++;
	    }
	    if(*p=='+'){
	        p++;
	    }
	    while(*p>='0'&&*p<='9')  
	        {
	            sum=sum*10+(*p-'0');
	            p++;
	        }
	    if(*p=='.')
	    {
	    	p++;
	    	while(*p>='0'&&*p<='9')
	    	{
	    		sum=sum*10+(*p-'0');
	    		p++;
	    		small*=10;
			}
		}
		if(sum!=0){
			sum=falg*sum/small;
		}
	}
    return sum;
}
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starbright.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值