• C语言参考程序—无符号一位整数的四则运算


    题目:输入一个无符号的一位整数的四则运算表达式,输出其结果。例如输入:1+3*6-2,则输出:17

    分析:因为不涉及到括号,只是简单的四则运算,我的想法是如果有乘除法先计算,没有的话就按照加减法从左到右的顺序进行计算。在开始的时候,首先检查是否有乘除法运算符,有的话就取出前后两个操作数进行计算,将结果保存起来。没有的话就将加减运算符先存起来。

    主要过程:

    1、输入的是一个四则运算的表达式,在计算机中按照字符串的形式存储。数据和运算符需要分开处理。

    2、引入一个整型的数组,其大小为字符串长度加一,加一是为了方便整型数组判断结束。

    3、对表达式字符串循环进行字符判断,如果是数字,则将数组存入引入的整型数组,如果不是则分两种情况:(1)是乘法或者是除法运算符,那就将整型数组中当前的最新数据取出,将表达式字符串当前位置的下一个位置的数字取出,进行乘法计算,将计算所得的存放到整型数组当前位置。(即覆盖掉第一个操作数的位置)。(2)是加法或者是减法,分数组和运算符分别存入到整型数组中。

    4、第3步完成以后,整型数组中存放的只是关于加减法运算的表达式。此时就可以从到右进行运算。取出操作符,通过操作符的位置取出两个操作数,保证每次计算后的结果存放到整型数组的第一个位置处。整个计算结果后,整型数组第一个位置是最终的计算结果。

    完整的C语言程序如下所示:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 #define LEN 100  //假设表达式的最大长度为100
     5 //计算表达式的函数声明
     6 int caculate(char* exp);
     7 int main()
     8 {
     9  //表达式字符串
    10  char *expression = (char*)malloc(sizeof(char)*LEN);
    11  while(1)
    12  {
    13   printf("Enter an expression: ");
    14   scanf("%s",expression);
    15   printf("The result is: %d\n",caculate(expression));
    16  }
    17  //释放内存空间
    18  free(expression);
    19  return 0;
    20 }
    21 int caculate(char* exp)
    22 {
    23  char* p = exp;
    24  int result = 0;
    25  //动态分配,引入一个数组
    26  int* datas = (int*)malloc(sizeof(int)*(strlen(exp)+1));
    27  int* pNext = datas;
    28  int* pCur = NULL;
    29  int* pTemp = NULL;
    30  int m,n;
    31  //先计算乘除法
    32  while(*p!='\0')
    33  {
    34   if(*p == '*' || *p == '/')
    35   {
    36    //在datas中取第一个操作数
    37    m = *pCur;
    38    //在字符串中取第二个操作数
    39    n = *(p+1) ^ 0x30;
    40    if(*p == '*')
    41     //进行乘法运算,结果覆盖当前的值
    42     *pCur = m*n;
    43    else
    44     //进行除法运算,结果覆盖当前的值
    45     *pCur = m/n;
    46    p++;
    47   }
    48   else
    49   {
    50    //如果是数字,将字符转换为数字
    51    *pNext = (*p>='0' && *p <='9') ?  *p ^ 0x30 : *p ;
    52    pCur = pNext;  //指向当前
    53    pNext++;  //指向下一个
    54   }
    55   p++;
    56  }
    57  //此时只做加减法,每次将计算的结果保存在datas的第一个位置处
    58  for( pTemp=datas;pTemp!=pNext;++pTemp)
    59     {
    60   if(*pTemp =='+' || *pTemp == '-')  
    61   {
    62    //第一个操作数始终放在datas的第一个位置
    63    m = *datas; 
    64    //取第二个操作数
    65    n = *(pTemp+1);
    66    if(*pTemp == '+')
    67     *datas = m+n;
    68    else
    69     *datas = m-n;
    70    pTemp++;
    71   }
    72  }
    73  //最终的计算结果保存在datas的第一个位置
    74  result = *datas;
    75  //释放内存空间
    76  free(datas);
    77  return result;
    78 }

    程序测试结果如下:

  • 相关阅读:
    解决:微信小程序富文本识别不了空白p标签的方法
    微信小程序
    fastadmin
    微信小程序
    fastadmin使用笔记
    fastadmin使用笔记
    您有新的订单,请注意查收 提示音
    js获取视频第一帧生成图片
    解决JQ WeUI 的 Picker无法动态传值的问题
    微擎 人人商城小程序获取不到用户信息
  • 原文地址:https://www.cnblogs.com/Anker/p/3073963.html
Copyright © 2020-2023  润新知