C语言课程设计简单计算器程序

  • 格式:docx
  • 大小:23.34 KB
  • 文档页数:37

下载文档原格式

  / 37
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计名称:C语言课程设计课程设计题目:简单计算器程序

目录

第1章需求分析 0

1.1设计要求 0

1.2任务 0

第2章总体设计 (2)

2.1设计简介及设计方案论述 (2)

2.2功能模块层次图 (2)

第3章详细设计 (3)

3.3由(后缀)逆波兰表达式计算中缀表达式原理 (12)

.................................................. 错误!未定义书签。第4章调试分析. (14)

4.1程序设计中所遇到的错误及犯错的原因 (14)

4.2错误的解决方法 (14)

第5章用户手册 (16)

总结 (18)

参考文献 (18)

附录(程序清单) (19)

第1章需求分析

1.1 设计要求

(1)用 C 语言数据结构实现程序设计;

(2)利用结构体、栈、进行相关信息处理;

(2)系统的各个功能模块要求用函数的形式实现;

(4)界面简单,可操作性高。

1.2 任务

(1)定义一个结构体类型数组,输入 0~9 及+、--、*等符号的信息,将其信息存储起来;

(2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果;

(3)编写代码;

(4)程序分析与调试。

说明:

本课程设计将实现一个简单计算器。在功能上尽量模仿 windows 的计算器。系统界面不做牵制要求。该程序能实现标准型中+、-、*、/、(、)、.、的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

第2章总体设计

2.1设计简介及设计方案论述

逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置于其运算对象之后,故称为后缀表达式。

后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。

2.2功能模块层次图

第3章详细设计

3.1 栈的定义与使用

首先定义两个栈,一个字符型,一个双精度型,程序代码如下:

Struct

{

char data[MaxSize]; // 存放表达式的字符数组

int top; //栈顶指针

}Sym; /*符号*/ //作为存放运算表达式的栈使用

struct

{

double data[MaxSize]; //存放运算结果的数组

int top; //栈顶指针

}Num; /*数*/ 存储逆波兰表达式(后缀式)计算器的运算数 //作为存放运算结果的栈使用

void InitStack()

{ Sym.top=Num.top=-1; } //栈的初始化

void SymPush() //压栈

{

if(Sym.top

{ Sym.data[++Sym.top]=calc[i++]; }

else

{ printf("Sym 栈满\n"); return; }

}

void SymPop() //出栈

{

if(Sym.top>=0)

{ expr[++t]=Sym.data[Sym.top--];}

else

{ printf("Sym 栈空\n"); return; }

}

void NumPush() //压栈

{

If(Num.top

{

Num.data[++Num.top]=ston(expr,&i);

}

else

{

printf("Num 栈满\n"); return;

}

}

定义逆波兰(后缀式)表达式的计算函数(出栈) void NumPop()

{

if(Num.top>=0)

{

if(expr[i]!=' ')

{

switch(expr[i])

{

case'+':Num.data[Num.top-1]=Num.data[Num.top-1]+Num.data[Num.top]; break;

case

'-':Num.data[Num.top-1]=Num.data[Num.top-1]-Num.data[Num.top];break;

case

'*':Num.data[Num.top-1]=Num.data[Num.top-1]*Num.data[Num.top];break;

case

'/':Num.data[Num.top-1]=Num.data[Num.top-1]/Num.data[Num.top];break;

}

Num.top--;

}