zoukankan      html  css  js  c++  java
  • 结对项目2.0版

     

    更新内容:

    1.在之前基础上实现四个数的四则运算。

    2.实现了带有括号的运算。

    存在问题:

    运算过程中偶尔会有-nan(ind)的结果,还在找原因。

    部分代码如下:


     1 //运算符栈的长度  
      2 #define OPSTACK_LENGTH 5  
      3 //操作数栈的长度  
      4 #define NUMSTACK_LENGTH 100  
      5 //输入串的最大长度  
      6 #define MAX_STRING_LENGTH 100 
      7 #pragma warning(disable:4996)
      8 //表达式结构体
      9 struct biaodashi
     10 {
     11     char word;
     12 };
     13 //运算符结构体  
     14 struct operatorStruct
     15 {
     16     //运算符名称  
     17     char name;
     18     //优先级  
     19     int priority;
     20     //目数,即操作数个数,例如单目运算符为1,双目运算符2  
     21     int opnum;
     22 };
     23 
     24 typedef struct operatorStruct OPERATOR;
     25 
     26 //运算符栈  
     27 OPERATOR opStack[OPSTACK_LENGTH];
     28 //运算符栈顶指针  
     29 
     30 //操作数栈  
     31 double numStack[NUMSTACK_LENGTH];
     32 //操作数栈顶指针  
     33 int opStackTop = -1;
     34 int numStackTop = -1;
     35 
     36 //获取一个字符所代表的运算符的优先级  
     37 int getPriority(char name)
     38 {
     39     if (name == '(' || name == ')')
     40     {
     41         return 0;
     42     }
     43     if (name == '!')
     44     {
     45         return 3;
     46     }
     47     if (name == '*' || name == '/')
     48     {
     49         return 2;
     50     }
     51     if (name == '+' || name == '-')
     52     {
     53         return 1;
     54     }
     55     
     56 }
     57 //获取一个字符所代表的运算符的目数  
     58 int getOpNum(char name)
     59 {
     60     if (name == '*' || name == '/' || name == '+' || name == '-')
     61     {
     62         return 2;
     63     }
     64     if (name == '!')
     65     {
     66         return 1;
     67     }
     68     if (name == '(' || name == ')')
     69     {
     70         return 0;
     71     }
     72 
     73 }
     74 
     75 //运算符压栈  
     76 void pushOperator(OPERATOR op)
     77 {
     78     if (opStackTop < OPSTACK_LENGTH - 1)
     79     {
     80         opStack[++opStackTop] = op;
     81     }
     82 }
     83 //运算符出栈  
     84 OPERATOR popOperator()
     85 {
     86     if (opStackTop >= 0)
     87     {
     88         return opStack[opStackTop--];
     89     }
     90 }
     91 //操作数压栈  
     92 void pushNumber(double num)
     93 {
     94     if (numStackTop < NUMSTACK_LENGTH - 1)
     95     {
     96         numStack[++numStackTop] = num;
     97     }
     98 }
     99 //操作数出栈  
    100 double popNumber()
    101 {
    102     if (numStackTop >= 0)
    103     {
    104         return numStack[numStackTop--];
    105     }
    106 }
    107 
    108 //从操作数栈中弹出两个操作数,完成一次双目运算  
    109 double opertate2Num(OPERATOR op)
    110 {
    111     double num2 = popNumber();
    112     double num1 = popNumber();
    113     if (op.name == '+')
    114     {
    115         return num1 + num2;
    116     }
    117     if (op.name == '-')
    118     {
    119         return num1 - num2;
    120     }
    121     if (op.name == '*')
    122     {
    123         return num1 * num2;
    124     }
    125     if (op.name == '/')
    126     {
    127         return num1 / num2;
    128     }
    129 }
    130 //从操作数栈中弹出一个操作数,完成一次单目运算  
    131 double opertate1Num(OPERATOR op)
    132 {
    133     double num = popNumber();
    134     if (op.name == '!')
    135     {
    136         double result = 1;
    137         while (num > 1)
    138         {
    139             result *= num;
    140             num--;
    141         }
    142         return result;
    143     }
    144 
    145 }
    146 //完成一次运算  
    147 double operate(OPERATOR op)
    148 {
    149     if (op.opnum == 1)
    150     {
    151         return opertate1Num(op);
    152     }
    153     else if (op.opnum == 2)
    154     {
    155         return opertate2Num(op);
    156     }
    157 
    158 }
    159 //四则运算计算器
    160 double Calculate(struct biaodashi *string)
    161 {
    162     
    163     int i;
    164     OPERATOR op, topOp;//op为从当前输入串中提取的一个运算符,topOp为运算符栈栈顶的运算符  
    165 
    166     topOp.name = '#';
    167     topOp.priority = 0;
    168     topOp.opnum = 0;
    169     pushOperator(topOp);//压入#作为初始运算符  
    170 
    171     for (i = 0; string[i].word != '=';i++)
    172     {
    173         //从输入串中取出一个字符作为开始,进行处理,直到表达式结束  
    174         if (string[i].word!='+' && string[i].word != '-'&& string[i].word != '*'&& string[i].word != '/'&& string[i].word != '('&& string[i].word != ')')
    175         {
    176             //如果是操作数,将整个操作数提取出来,压入操作数栈 
    177             pushNumber((double)(string[i].word));
    178         }
    179         else
    180         {
    181             op.name = string[i].word;
    182             op.priority = getPriority(string[i].word);
    183             op.opnum = getOpNum(string[i].word);
    184             topOp = popOperator();
    185             if (op.name == '(')
    186             {
    187                 //如果是'(',将从栈顶弹出的运算符压回栈内,并将当前运算符则压栈  
    188                 pushOperator(topOp);
    189                 pushOperator(op);
    190             }
    191             else if (op.name == ')')
    192             {
    193                 //如果是')',则进行运算,每次运算结果作为一个操作数压入操作数栈,直到将'('弹出运算符栈  
    194                 while (topOp.name != '(')
    195                 {
    196                     pushNumber(operate(topOp));
    197                     topOp = popOperator();
    198                 }
    199             }
    200             else
    201             {
    202                 //如果是普通运算符  
    203                 if (topOp.name != '#' && op.priority <= topOp.priority)
    204                 {
    205                     //如果运算符栈非空,且当前运算符的优先级大于栈顶运算符,则进行一次运算,将结果压入操作数栈  
    206                     pushNumber(operate(topOp));
    207                 }
    208                 else
    209                 {
    210                     //否则将从栈顶弹出的运算符压回  
    211                     pushOperator(topOp);
    212                 }
    213                 //将当前运算符压栈  
    214                 pushOperator(op);
    215             }
    216         }
    217 
    218     }
    219     //完成栈内剩余的运算  
    220     while ((topOp = popOperator()).name != '#')
    221     {
    222         pushNumber(operate(topOp));
    223     }
    224     //操作数栈中剩下的最后一个数即为结果  
    225     return popNumber();    
            }

     部分主函数代码。

    复制代码
     1     for (i = 0; i < N; i++)
     2     {
     3         num1 = rand() % 100 + 1;                       //生成随机数
     4         num2 = rand() % 100 + 1;
     5         num3 = rand() % 100 + 1;
     6         num4 = rand() % 100 + 1;
     7         optr1 = rand() % 4;
     8         optr2 = rand() % 4;
     9         optr3 = rand() % 4;
    10         kuohao = rand() % 8;
    11         if (num1 > 40)
    12         {
    13             printf("题号:%d
    ", i + 1);
    14             printf("%d %c %d %c %d %c %d=?
    ", num1, str[optr1], num2, str[optr2], num3, str[optr3], num4);
    15             string[0].word = num1;
    16             string[1].word = str[optr1];
    17             string[2].word = num2;
    18             string[3].word = str[optr2];
    19             string[4].word = num3;
    20             string[5].word = str[optr3];
    21             string[6].word = num4;
    22             string[7].word = '=';
    23             answer1 = Calculate(string);
    24             scanf("%lf", &answer2);
    25             ch = getchar();
    26             if ((fabs(answer2-answer1))<0.01)
    27                 printf("正确
    ");
    28             else printf("错误 正确答案是:%-10.2lf
    ", answer1);
    29         }
    复制代码

    输出结果:

    结果:可以看到第6题出现了-nan(ind)的问题,百度一下意思是not a number,应该是计算过程中出了问题,但是还没找到。

     
     
     
  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/brilliant2016/p/5954972.html
Copyright © 2011-2022 走看看