科学计算器——大一数据结构课设
来源:互联网 发布:安卓手游辅助软件 编辑:程序博客网 时间:2024/06/07 07:25
苦逼信息学院大学狗一枚
读大二ing。。。
单纯找个地方记录一下自己的代码
这是大一时候写的数据结构课设
C语言的科学计算器
当时查了很多资料
算是自己写的第一个比较有意思的小程序
时间原因没有做成MFC
第一次发博客
请多指教
估计也不会被人看到【哀怨脸】
#include "stdlib.h"#include "stdio.h"typedef int Status;typedef char OPTRType;typedef int OPNDType;#define MAXSIZE 100#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef struct _OPTRSTACK_ //字符结点{ OPTRType Data; //结点数据 _OPTRSTACK_* Next; //结点链指针}OPTRStack;typedef struct _OPNDSTACK_ //整数结点{ OPNDType Data; //结点数据 _OPNDSTACK_* Next; //结点链指针}OPNDStack;OPTRStack* OPTRInitStack(void);Status OPTRPush (OPTRStack** ppTop, OPTRType x);Status OPTRStackEmpty(OPTRStack* pTop);Status OPTRPop(OPTRStack** ppTop, OPTRType* x);OPTRType OPTRGetTop (OPTRStack* pTop);//运算数栈操作OPNDStack* OPNDInitStack(void);Status OPNDPush(OPNDStack** ppTop, OPNDType x);Status OPNDStackEmpty(OPNDStack* pTop);Status OPNDPop(OPNDStack** pTop, OPNDType* x);OPNDType OPNDGetTop(OPNDStack *pTop);//运算符栈操作Status ReBuild(char* ch, char** p_szFomula);Status Calculate(char* szFomula, int* p_iAnswer);//计算操作Status main(){ char* ch = (char*)malloc(MAXSIZE * sizeof(char));//分配输入字符的存储空间 char* szFomula = (char*)malloc(MAXSIZE * sizeof(char)); int iAnswer; printf("使用须知:输入法必须为英文,且光标必须移动到算式最后!\n"); while(1) { printf("请输入算式:\n"); scanf("%s", ch); ReBuild(ch, &szFomula); Calculate(szFomula, &iAnswer); if (Calculate(szFomula, &iAnswer) && ReBuild(ch, &szFomula)) { //printf("%s\n", szFomula); printf("%s = %d\n", ch, iAnswer); } else { printf("算式有误!\n"); } } return OK;}OPTRStack* OPTRInitStack(void){ OPTRStack* pTop;//新建结构体型指针pTop pTop = NULL;//置空 return pTop;//返回栈的地址}Status OPTRPush (OPTRStack** ppTop, OPTRType x)//此处二维指针用来传参(因为pTop本身是个指针所以再套一个指针){ OPTRStack* p = (OPTRStack*)malloc(sizeof(OPTRStack));//动态分配一个栈大小的空间,返回首地址给p if (ppTop == NULL)//如果栈空 { *ppTop = p;//pTop等于所输入的p p->Data = x;//p的数据域等于输入的x p->Next = NULL;//p的next指针指向空 } else//如果指向pTop的指针不为空 { p->Data = x;//p的数据域等于x p->Next = *ppTop;//p的next指针指向栈顶 *ppTop = p;//栈顶指向p } return OK;}Status OPTRStackEmpty(OPTRStack* pTop){ if (pTop == NULL) { return TRUE; } else { return FALSE; }//如果pTop等于NULL,返回真,不然返回false}Status OPTRPop(OPTRStack** ppTop, OPTRType* x){ if (OPTRStackEmpty(*ppTop)) { return ERROR; } else//如果栈不空 { OPTRStack* p = *ppTop;//定义一个p指向栈顶 *ppTop = p->Next;//栈顶指针指向p的下一个 (*x) = p->Data;//x等于p的数据域 free(p); return OK; }}OPTRType OPTRGetTop (OPTRStack* pTop){ OPTRType x; if(OPTRStackEmpty(pTop)) { return 0; } x = pTop->Data; return x;}OPNDStack* OPNDInitStack(void) { OPNDStack* pTop; pTop = NULL; return(pTop);}Status OPNDPush(OPNDStack** ppTop, OPNDType x) { OPNDStack* p = (OPNDStack*)malloc(sizeof(OPNDStack)); if(ppTop == NULL) { *ppTop = p; p->Data = x; p->Next = NULL; } else { p->Data = x; p->Next = *ppTop; *ppTop = p; } return OK;}Status OPNDStackEmpty(OPNDStack* pTop){ if (pTop == NULL) { return TRUE; } else { return FALSE; }}Status OPNDPop(OPNDStack** pTop, OPNDType* x) { if (OPNDStackEmpty(*pTop)) { return ERROR; } OPNDStack * p = (*pTop); *pTop = p->Next; (*x) = p->Data; free (p); return OK;}OPNDType OPNDGetTop(OPNDStack *pTop) { OPNDType x; if (OPNDStackEmpty(pTop)) { return 0; } x = pTop->Data; return x;}Status ReBuild(char* ch, char** p_szFomula)//把所有的数字和加减乘除输入到pTmp里面,数字间用空格隔开{ OPTRType x;//定义运算符变量 OPTRStack* pTop;//定义运算符栈 pTop = OPTRInitStack();//运算符栈初始化 char* pTmp = (char*)malloc(MAXSIZE * sizeof(char)); *p_szFomula = pTmp; while(*ch != '\0') { if (*ch >= '0' && *ch <= '9')//如果是数字 { while (*ch >= '0' && *ch <= '9')//如果是多位数字,就会连在一起 { *pTmp = *ch;//把数字赋值给pTmp pTmp++; ch++;//指针向下走 } *pTmp = ' '; pTmp++; } else if (*ch == '(') { OPTRPush(&pTop, *ch);//左括号,进运算符栈 ch++;//继续向下读 } else//如果读到的不是左括号 { if (OPTRStackEmpty(pTop) && *ch == ')') { return ERROR; } else if (OPTRStackEmpty(pTop))//如果运算符栈空 { OPTRPush(&pTop, *ch);//入栈 ch++;//继续向下读 } else if (*ch == ')') { OPTRPop(&pTop, &x);//出栈 if (x != '(')//如果弹出的不是左括号 { *pTmp = x;//进入pTmp pTmp++;//指针向下 }//注意此处没有ch++,因为要下一次循环然后把()内的东西弹完 else { ch++;//如果弹出的是左括号,继续向下读取 } } else//如果不是右括号 { while (OPTRGetTop(pTop) == '*' || OPTRGetTop(pTop) == '/' || ((OPTRGetTop(pTop) == '+' || OPTRGetTop(pTop) == '-') && (*ch == '+' || *ch == '-'))) { OPTRPop(&pTop, &x);//运算符出栈 *pTmp = x;//运算符进入pTmp pTmp++; *pTmp = ' '; pTmp++; } OPTRPush(&pTop, *ch); ch++; } } } while (!OPTRStackEmpty(pTop))//当运算符栈不空 { OPTRPop(&pTop, &x); *pTmp = x; pTmp++; } *pTmp = '\0';//以换行符结束}Status Calculate(char* szFomula, int* p_iAnswer){ OPNDType v1 = 0; OPNDType v2 = 0; OPNDType v3 = 0; OPNDStack* pTop;//创建运算数栈 pTop = OPNDInitStack(); while (*szFomula != '\0') { if (*szFomula >= '0' && *szFomula <= '9')//如果是数字 { v1 = v1 * 10 + (*szFomula - '0');//转换多位数 szFomula++; if (*szFomula == ' ') { OPNDPush(&pTop, v1); v1 = 0; szFomula++; } } else if (*szFomula == ' ')//如果读到不是数字 { szFomula++;//如果读到空格则继续 } else//如果不是空格 { switch(*szFomula) { case('+'): { OPNDPop(&pTop, &v3); OPNDPop(&pTop, &v2); v2 = v2 + v3; OPNDPush(&pTop, v2); break; } case('-'): { OPNDPop(&pTop, &v3); OPNDPop(&pTop, &v2); v2 = v2 - v3; OPNDPush(&pTop, v2); break; } case('*'): { OPNDPop(&pTop, &v3); OPNDPop(&pTop, &v2); v2 = v2 * v3; OPNDPush(&pTop, v2); break; } case('/'): { OPNDPop(&pTop, &v3); OPNDPop(&pTop, &v2); v2 = v2 / v3; OPNDPush(&pTop, v2); break; } default: { return ERROR; } } szFomula++; } } OPNDPop(&pTop, &v1); *p_iAnswer = v1; return OK;}
0 0
- 科学计算器——大一数据结构课设
- 通讯录——数据结构课设
- 数据结构课设——目录的管理与设计
- ATM取款机模拟——数据结构课设
- c#实现科学计算器 —— 总体分析篇
- c#实现科学计算器 —— 总体分析篇
- Android 基于源码的科学计算器——Calculator浅析
- 数据结构课设
- 数据结构课设
- 大一课设---C语言--通讯录管理系统
- 大一C语言结课设计之《简单计算器》
- 本人的数据结构课设
- 数据结构课设和数电课设
- 数据结构课设 符号配对
- 数据结构课设 词频统计
- 数据结构课设题目——求第K短的最短路径
- c#实现科学计算器 —— 设计篇之词法分析模块设计
- c#实现科学计算器 —— 设计篇之词法分析模块设计
- View Frame、bounds、clipsToBounds、masksToBounds
- iOS - 知识库
- 自定义View画圆(观察者模式)
- 熟悉以下预处理标识符__LINE__ __FILE__ __DATE__ __TIME__ # ##
- CopyOnWriteArrayList详解
- 科学计算器——大一数据结构课设
- c#调用带参数或返回值的存储过程
- Android 打造形形色色的进度条 实现可以如此简单
- Angular 2 组件之间如何通信?
- 状态机FSM的描述方法
- Spring中监听器的详解
- js设计模式-观察者模式
- Android EditText 设置键盘 搜索,回车
- YII2 代码布置准备工作