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


    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!='')//整数部分
    	{
    		if (*p1>'9'||*p1<'0')
    		{
    			return 0;
    		}
    		num1=num1*10+*(p1++)-'0';
    	}
    	if (*p1=='')
    	{
    		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;
    }
    


    总结越简单的问题越要考虑全面,保证所有可能的输入,程序都能正常的处理!

  • 相关阅读:
    SAP字符串处理
    ABAP更换请求
    Odoo安装教程12-创建新的插件模块之设置视图层第二讲
    Odoo安装教程12-创建新的插件模块之设置视图层第一讲
    Odoo安装教程11-创建新的插件模块之设置访问权限
    SAP是什么?-SAP 各模块概览
    SAP是什么?-SAP 各产品释义
    SAP版本演进及区别-S/4 HANA 与R3(ECC)
    Odoo安装教程12-创建新的插件模块之设置视图层第二讲
    Odoo安装教程12-创建新的插件模块之设置视图层第一讲
  • 原文地址:https://www.cnblogs.com/chhuach2005/p/3961698.html
Copyright © 2020-2023  润新知