具有表达式求值功能的计算器软件设计

 
——————————头文件————————
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CALCULATOR_H__
#define __CALCULATOR_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<math.h>
typedef float DataType;
#define MaxSize 100

typedef struct
{
	float data[MaxSize];
	int top;
} ComStack;
typedef struct
{
	float data[MaxSize];
	int top;
}Stack;
void  InitStack(Stack *s);
int GetTop(Stack s, DataType *z);
int Push(Stack *s, DataType z);
int Pop(Stack *s, DataType *z);
void TransmitExpression(char a[], char b[]);
float EvaluateExpression(char b[]);
int quit();
int mune();
int  SimpleCalculator();
int ExpressionCalculator();
#endif
 
————————函数部分——————
#include"calculator.h"
void  InitStack(Stack *s)
{
 s->top = 0;
}
int GetTop(Stack s, DataType *z)
{
 if (s.top > 0)
 {
  *z = s.data[s.top - 1];
  return 1;
 }
 else
  return 0;
}
int Push(Stack *s, DataType z)
{
 if (s->top >= MaxSize)
 {
  printf("栈已满,不能进栈!\n");
  return 0;
 }
 else
 {
  s->data[s->top] = z;
  s->top++;
  return 1;
 }
}
int Pop(Stack *s, DataType *z)
{
 if (s->top == 0)
 {
  printf("栈已空,不能出栈!\n");
  return 0;
 }
 else
 {
  s->top--;
  *z = (char)s->data[s->top];
  return 1;
 }
}
void TransmitExpression(char a[], char b[])
{
 Stack s;
 char ch;
 DataType x;
 int i = 0, j = 0;
 InitStack(&s);
 ch = a[i];
 i++;
 while (ch != '\0')
 {
  switch (ch)
  {
  case '(':
   Push(&s, ch);
   break;
  case ')':
   while (GetTop(s, &x) && x != '(')
   {
    Pop(&s, &x);
    b[j] = x;
    j++;
   }
   Pop(&s, &x);
   break;
  case '+':
  case '-':
   while (GetTop(s, &x) && x != '(')
   {
    Pop(&s, &x);
    b[j] = x;
    j++;
   }
   Push(&s, ch);
   break;
  case '*':
  case '/':
  case '%':
   while (GetTop(s, &x) && x == '/' || x == '%' || x == '*')
   {
    Pop(&s, &x);
    b[j] = x;
    j++;
   }
   Push(&s, ch);
   break;
  case ' ':
   break;
  default:
   while (ch >= '0'&&ch <= '9')
   {
    b[j] = ch;
    j++;
    ch =  a[i];
    i++;
   }
   i--;
   b[j] = ' ';
   j++;
  }
  ch = a[i];
  i++;
 }
 while (s.top != 0)
 {
  Pop(&s, &x);
  b[j] = x;
  j++;
 }
 b[j] = '\0';
}
float EvaluateExpression(char b[])
{
 ComStack s;
 int i = 0;
 float A, B, C, D;
 int E, F;
 s.top = -1;
 while (b[i] != '\0')
 {
  if (b[i] != ' '&&b[i] >= '0'&&b[i] <= '9')
  {
   C = 0;
   while (b[i] != ' ')
   {
    C = 10 * C + b[i] - '0';
    i++;
   }
   s.top++;
   s.data[s.top] = C;
  }
  else
  {
   switch (b[i])
   {
   case '+':
    {
     A = s.data[s.top];
     s.top--;
     B = s.data[s.top];
     s.top--;
     D = A + B;
     s.top++;
     s.data[s.top] = D;
     break; }
   case '-':
    {
     A = s.data[s.top];
     s.top--;
     B = s.data[s.top];
     s.top--;
     D = B - A;
     s.top++;
     s.data[s.top] = D;
     break; }
   case '*':
    {
     A = s.data[s.top];
     s.top--;
     B = s.data[s.top];
     s.top--;
     D = A*B;
     s.top++;
     s.data[s.top] = D;
     break; }
   case '/':
    {
     A = s.data[s.top];
     s.top--;
     B = s.data[s.top];
     s.top--;
     D = B / A;
     s.top++;
     s.data[s.top] = D;
     break; }
   case'%':
    {
     E = s.data[s.top];
     s.top--;
     F = s.data[s.top];
     s.top--;
     D = F % E;
     s.top++;
     s.data[s.top] = D;
     break;
    }
   }
   i++;
  }
 }
 if (s.top != -1)
 {
  D = s.data[s.top];
  s.top--;
  return D;
 }
 else
 {
  printf("表达式错误,请输入正确的表达式\n");
  exit(0);
 }
}
int mune()
{
 int p;
 printf("                     calculator\n");
 printf("********************************************************************\n");
 printf("1.expression calculator    2.simple  calculator        3.quit\n");
 printf("********************************************************************\n");
 printf("请根据目录输入一个操作命令(1,2,3):\n");
 scanf_s("%d", &p);
 switch (p)
 {
 case 1:
  {
   ExpressionCalculator();
   break;
  }
 case 2:
  {
   SimpleCalculator(); break;
  }
 case 3:{
  quit();   break;
     }
 }
 return 0;
}
int  SimpleCalculator()
{
 int i;
 int A, B, R1; //加法
 int C, D, R2; //减法
 int E, F, R3; //乘法
 float  G, H, R4; //除法
 int    I, J, R5;  //求余
 float R6, L;        //开方
 printf("********************************************************************\n");
 printf("                    2.simple  calculator \n");
 printf("********************************************************************\n");
 printf(" 请输入对应序号启动计算程序(注意需要带上符号)\n");
 printf("1.********加法******");
 printf("            2.********减法******\n");
 printf("3.********乘法******");
 printf("            4.********除法******\n");
 printf("5.******求余********");
 printf("            6.******求余*******\n");
 printf("********************************************************************\n");
 printf(" 等待用户输入命令:");
 scanf_s("%d", &i);
 printf("\n");
 switch (i)
 {
 case 1:
  {
   printf("请输入需要相加的两个数字:\n");
   scanf_s("%d+%d", &A, &B);
   R1 = A + B;
   printf("\n");
   printf("两数之和是:%d+%d=%d\n", A, B, R1);
   printf(" \n");
   break;
  }
 case 2:
  {
   printf("请输入需要相减的两个数字:\n");
   scanf_s("%d-%d", &C, &D);
   R2 = C - D;
   printf("\n");
   printf("两数之差是:%d-%d=%d\n", C, D, R2);
   printf("\n");
   break;
  }
 case 3:
  {
   printf("请输入需要相乘的表达式:\n");
   scanf_s("%d*%d", &E, &F);
   R3 = E*F;
   printf("\n");
   printf("两数乘积是:%ld*%ld=%ld\n", E, F, R3);
   printf("\n");
   break;
  }
 case 4:
  {
   printf("请输入需要相除的表达式:\n");
   scanf_s("%f/%f", &G, &H);
   R4 = G / H;
   printf("\n");
   printf("结果是:%f/%f=%f\n", G, H, R4);
   printf("\n");
   break;
  }
 case 5:
  {
   printf("请输入需要求余的数(无法识别表达式):\n");
   scanf_s("%d %d", &I, &J);
   R5 = I % J;
   printf("\n");
   printf("结果是:%d\n", R5);
   printf("\n");
   break;
  }
 case 6:
  {
   printf("请输入你要开平方的数字:\n\n");
   scanf_s("%f", &L);
   R6 = sqrt(L);
   printf("\n");
   printf("结果是:%lf\n\n", R6);
   break;
  }
 }
 return 1;
}
int ExpressionCalculator()
{
 char a[MaxSize], b[MaxSize];
 float c;
 printf("              1.expression calculator\n");
 printf("********************************************************************\n");
 printf("请输入一个表达式(可以运算加,减,乘,除,求余):  \n");
 scanf("%c", &a);
 gets(a);
 printf("中缀表达式为:%s\n", a);
 TransmitExpression(a, b);
 printf("转换为后缀表达式为:%s\n", b);
 c = EvaluateExpression(b);
 printf("该表达式的计算结果为:%s=%f\n", a, c);
 return 0;
}
int quit()
{
 char y = 0;
 printf("********************************************************************\n");
 printf("                     3.quit\n");
 printf("********************************************************************\n");
 printf("输入q/Q退出\n");
 scanf("%s", &y);
 if (y == 'q' || y == 'Q')
  exit(0);
}
int  main()
{
 mune();
 system("pause");
 return 0;
}
 
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值