您的位置:首页 > 职场人生

面试题1:把一个字符串转换成数字

2014-06-14 14:30 405 查看
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;
}


总结越简单的问题越要考虑全面,保证所有可能的输入,程序都能正常的处理!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐