zoukankan      html  css  js  c++  java
  • 简单四则运算

    问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

    注: 1、表达式只含 +, -, *, / 四则运算符,不含括号

    2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况

    3、要考虑加减乘除按通常四则运算规定的计算优先级

    4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生

    5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

    要求实现函数: int calculate(int len,char *expStr)

    代码1:有漏洞:运算结果的中间值最大只能为79(79+48(‘0’)=127为最大的ASCII值)

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 int calculate(int len,char *expStr)
     5 {
     6     int i,j;
     7     char temp;
     8 
     9     for(i=0;i<len;)
    10     {
    11         if((expStr[i] == '*')||(expStr[i] == '/'))
    12         {
    13             if(expStr[i] == '*')
    14             {
    15                 temp = (expStr[i-1]-'0') * (expStr[i+1]-'0') + '0';
    16             }
    17             else if(expStr[i] == '/')
    18             {
    19                 temp = (expStr[i-1]-'0') / (expStr[i+1]-'0') + '0';
    20             }
    21             expStr[i-1] = temp;
    22             for(j=i+2;j<=len;j++)
    23             {
    24                 expStr[j-2] = expStr[j];
    25             }
    26             len -= 2;
    27         }
    28         else
    29         {
    30             i++;
    31         }
    32     }
    33 
    34     for(i=0;i<len;)
    35     {
    36         if((expStr[i] == '+')||(expStr[i] == '-'))
    37         {
    38             if(expStr[i] == '+')
    39             {
    40                 temp = (expStr[i-1]-'0') + (expStr[i+1]-'0') + '0';
    41             }
    42             else if(expStr[i] == '-')
    43             {
    44                 temp = (expStr[i-1]-'0') - (expStr[i+1]-'0') + '0';
    45             }
    46             expStr[i-1] = temp;
    47             for(j=i+2;j<=len;j++)
    48             {
    49                 expStr[j-2] = expStr[j];
    50             }
    51             len -= 2;
    52         }
    53         else
    54         {
    55             i++;
    56         }
    57     }
    58 
    59     return expStr[0] - '0';
    60 }
    61 
    62 int main()
    63 {
    64     char expStr[255];
    65     int length;
    66     int result;
    67 
    68     gets(expStr);
    69     length = strlen(expStr);
    70 
    71     result = calculate(length,expStr);
    72     printf("%d",result);
    73     return 0;
    74 }

    代码2:

    将字符串中的数据转入到整型数组中,其中+,-,*,/分别用-1,-2,-3,-4代替。这样,每个位置就可以放两位以上数字了。

    不转入整型数组的话,在字符串中每个位置只能放一个字符,即一位数。

    进行转换后,虽然运算符(-1,-2,-3,-4)与运算数混在一块儿,但并不会影响最后的结果。

      1 //问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
      2 //注: 1、表达式只含 +, -, *, / 四则运算符,不含括号
      3 //2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
      4 //3、要考虑加减乘除按通常四则运算规定的计算优先级
      5 //4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
      6 //5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
      7 //要求实现函数: int calculate(int len,char *expStr)
      8 
      9 #include<stdio.h>
     10 #include<string.h>
     11 #include<malloc.h>
     12 
     13 int calculate(int len,char *expStr)
     14 {
     15     int i,j;
     16     int temp;
     17     int *data;
     18 
     19     data = (int *)malloc(sizeof(int) * len);
     20 
     21     //将所有的字符串存储到整型数组中,其中+,-,*,/分别用-1,-2,-3,-4代替。
     22     for(i=0;i<len;i++)
     23     {
     24         if(expStr[i] == '+')
     25             data[i] = -1;
     26         else if(expStr[i] == '-')
     27             data[i] = -2;
     28         else if(expStr[i] == '*')
     29             data[i] = -3;
     30         else if(expStr[i] == '/')
     31             data[i] = -4;
     32         else
     33             data[i] = expStr[i] - '0';
     34     }
     35 
     36     //先进行所有的乘除运算。
     37     for(i=0;i<len;)
     38     {
     39         //在进行乘除运算时,i只会指向-1,-2,-3,-4和个位整数0-9.
     40         if((data[i] == -3)||(data[i] == -4))
     41         {
     42             if(data[i] == -3)
     43             {
     44                 temp = data[i-1] * data[i+1];
     45             }
     46             else if(data[i] == -4)
     47             {
     48                 temp = data[i-1] / data[i+1];
     49             }
     50             data[i-1] = temp;
     51             for(j=i+2;j<len;j++)
     52             {
     53                 data[j-2] = data[j];
     54             }
     55             len -= 2;
     56         }
     57         else
     58         {
     59             i++;
     60         }
     61     }
     62 
     63     //再进行所有的加减运算
     64     for(i=0;i<len;)
     65     {
     66         //在进行加减运算时,中间过程中,运算数可能会包含-1或-2。与运算符-1,-2混在一块儿。
     67         //如果data[0]不为-1或-2的话,在i指向data[1](肯定为-1或-2)后,i会始终只指向代表运算符的-1和-2。(算法决定的)
     68         //即使运算数中包含-1或-2,因为i不会指向它,所以不会将运算数(-1,-2)误判为运算符(-1,-2).
     69         //由于题目的输入情况,在进行乘除运算后,data[0]绝对不会为-1或-2。所以没有如果"如果data[0]不为-1或-2的话"。
     70         if((data[i] == -1)||(data[i] == -2))
     71         {
     72             if(data[i] == -1)
     73             {
     74                 temp = data[i-1] + data[i+1];
     75             }
     76             else if(data[i] == -2)
     77             {
     78                 temp = data[i-1] - data[i+1];
     79             }
     80             data[i-1] = temp;
     81             for(j=i+2;j<len;j++)
     82             {
     83                 data[j-2] = data[j];
     84             }
     85             len -= 2;
     86         }
     87         else
     88         {
     89             i++;
     90         }
     91     }
     92 
     93     return data[0];
     94 }
     95 
     96 int main()
     97 {
     98     char expStr[255];
     99     int length;
    100     int result;
    101 
    102     gets(expStr);
    103     length = strlen(expStr);
    104 
    105     result = calculate(length,expStr);
    106     printf("%d",result);
    107     return 0;
    108 }

    代码3:(最简单),先进行乘除,将之后表达式中的所有数(包括数前的±号)存入数组num中。然后对num数组求和即可。

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <stdio.h>
     3 #include <string.h>
     4  
     5 int main()
     6 {
     7     char str[255];
     8     int num[255];   //用于存放经过乘除运算后剩下的所有加数(将加减运算符当作加数的正负号进行处理)。
     9     int length;
    10     int i,j = 1;
    11     int result = 0;
    12  
    13     gets(str);
    14     length = strlen(str);
    15  
    16     num[0] = str[0] - '0';//先将第一个字符纳入num[0]中
    17  
    18     for (i = 1; i < length; i++)
    19     {
    20         switch (str[i])
    21         {
    22         case '+'://将'+'后的一个数字纳入num[]中。
    23             num[j++] = str[i + 1] - '0';
    24             break;
    25  
    26         case '-'://将'-'后的一个数字的相反数纳入num[]中。
    27             num[j++] = -(str[i + 1] - '0');
    28             break;
    29  
    30         case '*'://先进行乘法运算,将运算结果纳入num[]中。
    31             j--;
    32             num[j++] = num[j] * (str[i + 1] - '0');
    33             break;
    34  
    35         case '/'://先进行除法运算,将运算结果纳入num[]中。
    36             j--;
    37             num[j++] = num[j] / (str[i + 1] - '0');
    38             break;
    39         }
    40     }
    41  
    42     for (i = 0; i < j; i++)
    43     {
    44         result += num[i];
    45     }
    46     printf("%d", result);
    47     return 0;
    48 }
  • 相关阅读:
    MySQL 修改数据
    Scala 简介
    tensorflow mnist read_data_sets fails
    Mac安装Homebrew
    MySQL 创建数据表
    MySQL 数据类型
    wc--Linux
    xxx is not in the sudoers file.This incident will be reported.的解决方法
    linux centos下安装dokuwiki
    CentOS修改系统时间
  • 原文地址:https://www.cnblogs.com/Camilo/p/3838520.html
Copyright © 2011-2022 走看看