1题目分析:
构思过程:
分析方法:写代码前想好测试用例,考虑所有可能的输入,并做相应的处理。这样的程序才有健壮性!
测试用例:char *p[8]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5",NULL};//测试用例
保证所有异常输入是返回0,正常输入时,转换为数字。
基本思路:
1.用Char*实现
空指针判断--变量定义--符号判断--整数部分--是否包含小数部分-小数部分--符号判断--返回值。(注意全程关于异常的判断)
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//-------------------------------------------------------------------char str_to_num
double str_to_num(char *p1)
{
double num1=0,num2=0;//变量定义
char flag='+';
if (p1==NULL)//空指针判断及符号判断
{
return 0;
}
else if (*p1=='-')
{
flag='-';
++p1;
}
else if (*p1=='+')
{
++p1;
}
else if (*p1>'9'||*p1<'0')
{
return 0;
}
char *p2=p1+strlen(p1)-1;//尾指针
while(*p1!='.'&&*p1!='\0')//整数部分
{
if (*p1>'9'||*p1<'0')
{
return 0;
}
num1=num1*10+*(p1++)-'0';
}
if (*p1=='\0')
{
return num1;
}
while(*p2!='.') //小数部分
{
if (*p2>'9'||*p2<'0')
{
return 0;
}
num2=num2/10+*(p2--)-'0';
}
num2/=10;
if (flag=='-')
{
return -(num1+num2);
}
else
return num1+num2;
}
int main()
{
char *p[8]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5",NULL};//测试用例
double result[8]={0};
double *p1=&result[0];
double *p2=p1,*p3=p1;
for (int i=0;i<8;++i)
{
result[i]=str_to_num(p[i]);
if (p[i]==NULL)
{
cout<<result[i]<<endl;
}
else
cout<<p[i]<<" : "<<result[i]<<endl;
}
system("pause");
return 0;
}
2.用string实现
double str_to_num(string str)
{
double num1=0,num2=0;
char flag='+';
int int_index=0;
if (str.empty())
{
return 0;
}
else if (str[int_index]=='-')
{
flag='-';
int_index++;
}
else if (str[int_index]!='+'&&(str[int_index]>'9'&&str[int_index]<'0'))
{
return 0;
}
else if (str[int_index]=='+')
int_index++;
while(int_index!=str.size()&&str[int_index]!='.' )//容易溢出
{
if (str[int_index]>'9'||str[int_index]<'0')
{
return 0;
}
num1=num1*10+str[int_index++]-'0';
}
if (int_index==str.size())
{
return num1;
}
int j=str.size()-1;
while(str[j]!='.')
{
if (str[j]>'9'||str[j]<'0')
{
return 0;
}
num2=num2/10+str[j--]-'0';
}
num2/=10;
if (flag=='-')
{
return -(num1+num2);
}
else
return num1+num2;
}
int main()
{
string a[7]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5"};//测试用例
double result[7];
for (int i=0;i<7;++i)
{
result[i]=str_to_num(a[i]);
cout<<a[i]<<" : "<<result[i]<<endl;
}
system("pause");
return 0;
}