加减运算--华为笔试

通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:
1、操作数为正整数,不需要考虑计算结果溢出的情况。
2、若输入算式格式错误,输出结果为“0”。

要求实现函数:
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

思路:这其实还是一个比较简单的逻辑问题,只是考虑的细节比较多,错误输出的情况不能落,先列条出几种类型的错误:

(1)空格数不等于2;   (2)输入的不是0-9之间的数字;   (3)中间操作符不是一个位,不是+或-;

程序如下:

void arithmetic(const char* pInputStr , long lInputLen , char* pOutputStr)
{
        int i , j , num1 , num2 , result , num_space;
        char buffer[4];
        bool add , sub;
        add = sub = false;
        for(i = 0 , num_space = 0 ; i < lInputLen ; ++i)
        {
                if(pInputStr[i] == ' ')
                        ++num_space;
        }
        if(2 != num_space)     //空格数非法
        {
                pOutputStr[0] = '0';
                pOutputStr[1] = '\0';
                return ;
        }
        num1 = num2 = 0;
        for(i = 0 ; pInputStr[i] != ' ' ; ++i)               //存第一个数
        {
                if(pInputStr[i] >= '0' && pInputStr[i] <= '9')
                        num1 = num1 * 10 + pInputStr[i] - '0';
                else                 //第一个操作数中有非法字符
                {
                        pOutputStr[0] = '0';
                        pOutputStr[1] = '\0';
                        return ;
                }
        }
        for(j = i + 1 ; pInputStr[j] != ' ' ; ++j);
        if(1 != j - i - 1)     //运算符长度不合法
        {
                pOutputStr[0] = '0';
                pOutputStr[1] = '\0';
                return ;
        }
        else    //操作符的长度为1
        {
                if('+' != pInputStr[i+1] && '-' != pInputStr[i+1])    //操作符号非法
                {
                        pOutputStr[0] = '0';
                        pOutputStr[1] = '\0';
                        return ;
                }
                else
                {
                        if('+' == pInputStr[i+1])
                                add = true;
                        if('-' == pInputStr[i+1])
                                sub = true;
                        for(i = j + 1 ; i < lInputLen ; ++i)
                        {
                                if(pInputStr[i] >= '0' && pInputStr[i] <= '9')
                                        num2 = num2 * 10 + pInputStr[i] - '0';
                                else          //第二个操作数中有非法字符
                                {
                                        pOutputStr[0] = '0';
                                        pOutputStr[1] = '\0';
                                        return ;
                                }
                        }
                        if(add)
                                result = num1 + num2;
                        else if(sub)
                                result = num1 - num2;
                        memset(buffer , 0 , sizeof(buffer));
                        itoa(result , buffer , 10);      //将整数按10进制转换为字符串
                        strcpy(pOutputStr , buffer);
                }
        }
}

 

void *memset(void *s, int ch, size_t n);      意思是将s中的前n个字符用ch来替换;
char *itoa( int value, char *string,int radix);    意思是将value值利用radix进制转换为字符串

 

posted on 2015-04-01 20:46  Snail-feng  阅读(172)  评论(0)    收藏  举报

导航