C语言课程设计报告
题 目 计算器程序设计
2008年 7月10日
摘 要
当今社会是信息社会,科技经济高速发展的社会,为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活中的必备品。
随着科技的发展计算器的种类变得更多,功能变得更强大,体积变得更小,电脑的出现改变人们的生活习惯,很多事情都可以电脑来完成。电脑的更大一个优点就是可以通过软件的应用无限的延伸电脑功能的外延,下面将用我们学习的C语言编写一个简易的计算器程序,实现简单的初步的计算功能。
本程序的编写基础是Tubro C2.0汉化版,它在tubro c的原有基础上实现了多汉字的支持方便了我们的使用。生成的程序可移植性强兼容性好稳定。现在只实现了加、减、乘、除、求幂、求模,求平方根,求正余弦、反正余弦,求阶乘,取余,取对数,取倒数,用科学计数法计数等。这个系统是基于软件发展的生命周期来研制的,它可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。但是,每次只能运算一个表达式。不能运算多个表达式。本论文主要介绍了本课题的开发背景,开发的过程和所要完成的功能。重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。
关键词: C语言 Tubro c 2.0 计算器
目 录
第一章 综述………………………………………………………………4
1.1 课题的现实意义……………………………………………………4
1.2 软件环境……………………………………………………………4
1.3 硬件环境……………………………………………………………4
第二章 系统设计流程图…………………………………………………5
2.1 系统流程图…………………………………………………………5
2.2 主要功能表…………………………………………………………5
第三章 系统分析和设计…………………………………………………6
3.1 图形的绘制和输出…………………………………………………7
3.2 文本的输出显示……………………………………………………9
3.3 计算函数的调用……………………………………………………10
3.4 程序的运行和退出…………………………………………………11
第四章 系统测试…………………………………………………………12
4.1 系统测试……………………………………………………………12
4.2 调试…………………………………………………………………13
4.3 错误原因分析一……………………………………………………14
4.4 错误原因分析二……………………………………………………14
第五章 使用说明………………………………………………………15
5.1 运行Turbo C程序进入计算器界面………………………………15
5.2 计算器的使用………………………………………………………16
5.3 退出程序……………………………………………………………16
第六章 设计总结…………………………………………………………17
参考文献……………………………………………………………………19
附录:源程序………………………………………………………………20
第一章 综述
1.1 课题的现实意义
现实学习生活中,常会遇到一些数目较大数据繁杂的数值运算,徒手运算起来很困难,这时候我们就必须用到计算器,所以便着手开发了这个计算器程序,以便用于自己的学习工作。人们对计算的要求不断提高,普通的功能简单的仅能进行四则运算的计算工具已经不能满足需要,需要一种能进行多种计算。现在已经有一些功能较为强大、涵盖面较广的计算软件,而且各种平台的小工具仍不断出现。这些大大方便了我们的生活给我们更多的选择和实现方式。
这个程序可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。并且操作简单、界面清晰、灵活、实用、方便等要求出发,它所能完成的主要计算功能有以下几个方面:加法,减法,乘法,除法,求幂,求平方根,求对数,求阶乘,求正余弦,取余,取倒数,用科学计数法计数等等。计算器的设计使我们所学到的C语言知识在现实中得到检验。
1.2硬件环境
一台完整的电脑,包括键盘、鼠标,最小硬盘空间1GHz
<1> 386,486,586及兼容机.640K基本内存;
1.3 软件环境
本程序用turbc2.0开发
Windows 2000以后版本的操作系统
Turbo C 2.0版
第二章 程序设计流程图
|
绘制界面 |
获得鼠标信息 坐标x,y和key |
结 束 |
key=quit?
|
Y |
绘制鼠标 |
处 理 |
显示数据 |
N |
关闭界面 |
开 始 |
2.1系统流程图: |
序号 |
文件名 |
主要功能 |
备注 |
1 |
+ |
加法 |
两个操作数 |
2 |
- |
减法 |
两个操作数 |
3 |
* |
乘法 |
两个操作数 |
4 |
/ |
除法 |
两个操作数 |
5 |
% |
取余 |
两个操作数 |
6 |
^ |
求x的y次幂 |
两个操作数 |
7 |
S |
求平方根 |
一个操作数 |
8 |
Exp |
科学计数 |
一个操作数 |
9 |
1/x |
取倒数 |
一个操作数 |
10 |
MC |
存储器清零 |
—— |
11 |
MS |
写入存储器 |
一个操作数 |
12 |
MR |
读存储器 |
—— |
13 |
M+ |
加到存储器 |
一个操作数 |
表 1
|
第三章 系统分析和设计
3.1 图形的绘制和输出
在Turbo C环境下,绘制程序中的计算器的图形,计算器的输入输出和显示结果的显示屏,绘制计算器的按键,绘制边框。
Turbo C为用户提供了一个功能很强的画图软件库,它又称为BorLand图形接口,它包括图形库文件(graphics.lib),图形头文件(graphics.h)和许多图形显示器(图形终端)的驱动程序(如CGA.BGI、EGAVGA.BGI等)。还有一些字符集的字体驱坳程序(如goth.chr黑体字符集等)。编写图形程序时用到的一些图形库函数均在graphics.lib 中,执行这些函数时,所需的有关信息(如宏定义等)则包含在graphics.h头文件中。因此用户在自已的画图源程序中必须包括graphics.h头文件,在进行目标程序连接时,要将graphics.lib连接到自己的目标程序中去。
在编制图形程序时,进入图形方式前,首先要在程序中对使用的图形系统初始化,即要用什么类型的图形显示适配器的驱动程序,采用什么模式的图形方式(也就是相应程序的入口地址),以及该适配器驱动程序的寻找路径名。所用系统的显示适配器一定要支持所选用的显示模式,否则将出错。Turbo.C提供了一个图形系统初始化函数initgraph可完成这些功能。
当我们使用的存储模式为tiny(微型)、 small(小型)或medium(中型)时,不需要远指针,因而可以将初始化函数调用格式写成如下形式(该说明适用于后面所述的任一函数): intitgrapg(&graphdriver, &graphmode,,””); 其中驱动程序目录路径为空字符“”时,表示就在当前目录下,参数graphmode用所示的模式号或标示符来定义,参数graphdriver是一个枚举变量{DETECT,CGA,VGA,…},一般: graphdriver=DETECT一旦执行了初始化,显示器即被设置成相应模式的图形方式。
上面初始化过程中,将由DETECT检测所用适配器类型,并将当前目录下相应的驱动程序装入,并采用最高分辩率显示模式作为graphmode的值。如检测到为CGA适配器时,则graphmode等于4或为CGAHI,若检测到VGA适配器,则graphmode等于2或为VGAHI。
由于图形程序运行并显示图象直接与显示器有关,而如何控制驱动显示器进行显示,Turbo C并没有向用户提供这种技术,而这也是不必要的,因它与显示器硬件结构息息相关,编程者并不需要知道这些东西,否则太复杂了!但用户的图形程序要能运行并显示,则必须要包含有驱动显示器的这种程序。不同种类的显示器因硬件结构不同,因而驱动程序也不同,这些驱动程序已经在Tubro C系统盘上提供。在用户的图形程序中,进行图形系统初始化时,即执行函数。initgraph(&graphdriver,&graphmode,char path-for-driver)时,程序就按照path-for-driver所指的路径将图形驱动程序装入内存。这样,以后的图形功能才能被支持。若在所指路径下找不到相应显示器的驱动程序,或没有对驱动程序进行装入操作,则运行图形程序时,就会在屏幕上显示出错信息:
BGI Error: Graphics not initialized(use”initgraph”)必须在工作盘上复制上这些文件,否则图形程序就无法运行,而出现上述的错误信息。
3.2 文本的输出显示
Turbo C2.0的字符屏幕函数主要包括文本窗口大小的设定、窗口颜色的设置、窗口文本的清除和输入输出等函数。
在Turbo C2.0环境下,用ottextxy定位输出文本,如计算器上的数据显示,程序名称等。
Turbo C2.0默认定义的文本窗口为整个屏幕, 共有80列(或40列)25行的文本单元, 每个单元包括一个字符和一个属性, 字符即ASCII 码字符, 属性规定该字符的颜色和强度。Turbo C2.0可以定义屏幕上的一个矩形域作为窗口, 使用window()函数定义。
窗口定义之后, 用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。
window()函数的调用格式为:
void window(int left, int top, int right, int bottom);
函数中形式参数(int left, int top)是窗口左上角的坐标, (int right, int bottom)是窗口的右下角坐标, 其中(left, top)和(right, bottom) 是相对于整个屏幕而言的。
Turbo C 2.0规定整个屏幕的左上角坐标为(1, 1), 右下角坐标为(80, 25)。并规定沿水平方向为 X轴, 方向朝右; 沿垂直方向为 Y轴, 方向朝下。若window()函数中的坐标超过了屏幕坐标的界限, 则窗口的定义就失去了意义, 也就是说定义将不起作用, 但程序编译链接时并不出错。另外, 一个屏幕可以定义多个窗口, 但现行窗口只能有一个(因为DOS为单任务操作系统), 当需要用另一窗口时, 可将定义该窗口的window()函数再调用一次, 此时该窗口便成为现行窗口了。还需要用void button()函数来绘制按键,基本形式为 void button(int x,int y,int c1,int c2,int c3,char *bt),它被windows()调用,输出数据用void scr()函数,原型为void scr(char scr_main[MAX_SCR],int error)
3.3 鼠标的引入和使用
由于屏幕已经初始化成图形模式,所以只需要用中断调用功能获得鼠标信息函数读鼠标位置及状态然后用画鼠标函数画出即可。
1).定义一个鼠标消息的主函数 int mouse_message()
2).定义获得鼠标信息函数 ,具体如下:
void getmouse(int *x,int *y,int *key)
{
union REGS inregs,outregs;
inregs.x.ax=3; /*获取鼠标位置和状态也可以用3*/
int86(0x33,&inregs,&outregs); /*中断调用*/
*x=outregs.x.cx; /*cx寄存器中存的是横坐标*/
*y=outregs.x.dx; /*dx寄存器中存的是列坐标*/
*key=outregs.x.bx; /*bx寄存器是按键状态*/
}
3).定义画鼠标函数 void drawmouse(int *x,int *y,int *z)
此外还需要调用鼠标可视化函数:
void visbilemouse()
{
union REGS inregs,outregs;
inregs.x.ax=0x01; /*显示鼠标*/
int86(0x33,&inregs,&outregs); /*通用软中断库函数*/
}
基于以上的函数,计算器的所有文本输入都可以用鼠标来代替,通信变量为jd1,它由函数焦点函数jd()引入,其中当鼠标移动到某个按键上时,jd1便对应相应的编号,按鼠标键后反回编号变量给message,然后再传递到cauculator函数中完成整个计算过程。焦点函数如下:
void jd(int x,int y)
{
int i;
jd1=(y-95)/(BHEIGHT+10)+(x-20)/(BWIDTH+10)*5; /*确定鼠标具体在哪个键上,得到编号来对应键*/
if (jd0==jd1) return; /*编号未变即鼠标未移位,返回*/
if (!((x>20&&x<380) && (y>95&&y<295))) jd1=-1; /*超出边界,编号为-1*/
if (jd0!=-1)
{setcolor(WHITE);
setlinestyle(0,0,3);
rectangle(jd0/5*(BWIDTH+10)+20,jd0%5*(BHEIGHT+10)+95,jd0/5*(BWIDTH+10)+30+BWIDTH,jd0%5*(BHEIGHT+10)+105+BHEIGHT);
} /*将上次突出显示的黄色擦除*/
if (jd1!=-1)
{setcolor(YELLOW);
setlinestyle(0,0,3);
rectangle((x-20)/(BWIDTH+10)*(BWIDTH+10)+20,(y-95)/(BHEIGHT+10)*(BHEIGHT+10)+95,(x-20)/(BWIDTH+10)*(BWIDTH+10)+30+BWIDTH,(y-95)/(BHEIGHT+10)*(BHEIGHT+10)+105+BHEIGHT);
} /*突出显示鼠标所在键为黄色*/
jd0=jd1; /*将上次的鼠标位置赋予jd0,以用于鼠标位置变化的判断和突出显示黄色的擦除*/
}
3.4计算函数
1. 定义函数void calculator(int fun_code),实现基本的计算功能
2.调用C库函数中的函数,数学函数#inchude <math.h> 如:sin,cos,sqrt,log10来实现高级计算功能。
3.定义一些函数,如清空寄存器函数,计算阶乘的函数等
3.5 Tubro C的运行和退出
1.运行
通过Tubro C安装路径找到TC2.0文件夹中的tc.exe文件,双击该文件,即可进入TC2.0环境。
2.退出
退出TC可以按F10键进入主菜单,选择File菜单下的Quit命令,再按回车键即可退出TC环境。(也可以在TC环境下直接按Alt+X键退出程序。这是TC环境下的热键)
第四章 系统测试
程序调试是指对程序的查错和排错。为了便于查错、阅读,在设计该程序的过程中采用了结构化程序方法编辑,添加了尽可能多的注释,这就为接下来的调试过程带来了很多方便。
经过仔细检查之后进行上机调试。进行编译,如果在编译和连接过程中发现错误,屏幕上显示了出错信息,根据提示找到出错的位置,加以改正,再进行编译……如此反复,直到顺利通过编译和连接为止。在本次实习过程中碰到的编译、连接的错误主要有:缺少变量定义,定义位置不正确、语法错误、转义字符漏用、逻辑错误等。
4.1系统测试
系统测试结果如下:
输出:
错误C:/jsq.txt 58: 未定义的符号'message'在 main函数中
错误C:/jsq.txt 143:未定义的Mx,My在windows函数中,原来是在定义全局变量注释时把*/丢了
错误:C:/jsq.txt 54:’main’的宣告;
编译文件
将所有错误都改正后,开始编译文件: C:jsq.TXT
4.2 调试
根据电脑所给的提示出现语法错误,缺少变量的定义大多的语法错误在通过书本参考下能够修改。主要是平时看书不仔细、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。这些语法错误有信息框的提示一般是能够排除的。另外还有部分注释的位置也错了,最重要的是逻辑上的错误,一般电脑不容易发现。所以更要对程序仔细的检查。经认真修改之后重新保存文件。
4.3 错误原因分析一
1.缺少变量定义,定义位置不正确
由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。
例如: 未声明void window(); /*窗口函数*/所以输出void window()中就有错误,因为缺少声明。
2.语法错误
大多的语法错误在通过书本参考下能够修改。主要是平时缺乏锻炼、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式
4.4 错误原因分析二
1.注释的位置
程序设计中在注释的时候不能同我们平常写字一样随心所欲,我们应该注意注释的格式。注释中不能含有C语言可执行的语句。
2.逻辑错误
编译、连接的成功并不意味着程序的最终成功。逻辑上的错误机器不易检查出来,这时需要对数据结果进行分析。这种错误的查找是最难的,需要有相当的耐心和细心去把问题找出来。这也是本次程序编辑过程中碰到的最大的难题。往往运行之后得不到另人满意的结果,此时解决的方法一则用“分段检查”的方法,在程序的不同位置设几个printf函数语句,输出有关变量的值,逐段往下检查,对检查出的错误进行修改,当调试完毕将设置的printf都删去。若在程序中找不到问题,则再来考虑算法是否逻辑严谨,再进行修改。如此循环往复,直到最后程序运行成功。在本次程序编辑过程中,我就是常遇到编译能通过,能够运行程序,但是总在输入、删除等操作完之后再想去看数据文件中存在的数据记录的时候,却一条记录也显示不出来,可能是对n变量的定义或使用出错了,于是在每个主要函数的操作过程中添加了printf语句用来显示n的变化,在执行某个函数前添加插入语句显示n的起始值,在执行完该个函数后再添加插入语句显示此时n的结果值,观察n的变化是否正确,如果错误了,也就说明该函数编写过程有错。诸如这样的调试方法,不断缩小检查范围,最后将错误找到,进行修改。所以到最后我找到了错误,及时改正,终于把程序完成了,一切功能显示正常。
第五章 程序使用说明
5.1 运行Turbo C程序进入计算器界面
1.通过Tubroc 的路径找到TC文件夹
找到TC文件夹中的tc.exe文件,并用鼠标双击该文件名
2.进入TC环境。
打开jsq.txt文件
Ctrl+F9,运行程序,得到以下画面
3.运算数据
5.2 计算器的使用
基本使用:用鼠标控制光标移动,当移动到相应得按钮时按左或右键输入当前数字或执行对应的运算。
加法:输入一个被加数数,按“+”,输入被加数,按“=”,输出结果。
减法:输入被减数数,按“-”,输入减数,按“=”,输出结果。
乘法: 输入一个数,按“*”,输入另个数,按“=”,输出结果。
除法: 输入一个被除数,按“+”,输入另个除数,按“=”,输出结果。
求x的y次方: 输入数x,按“^”,输入数y,按“=”,输出结果。
求x/y的模: 输入数x,按“%”,输入数y,按“=”,输出结果。
求倒数:输入x,按1/x,按=,输出结果。
取余:输入x,按%,输入y,按=,输出结果。
退格:输入x,按箭头。
MC:清空内存储。
MR:读取内存储。
MS:将数据存入内存储。
M+:将数据加到内存储。
C键:把寄存器清零。
Adv:高级功能,表达式运算
Quit键:退出计算器界面。
5.3 退出程序
退出TC可以按F10键进入主菜单,选择File菜单下的Quit命令,再按回车键即可退出TC环境。(也可以在TC环境下直接按Alt+X键退出程序。这是TC环境下的热键)
第六章 设计总结
经过了两个星期的C语言程序设计终于在老师的细心指导和同学的热情帮助下基本完成了计算器课题的设计修改任务,虽然有些地方不尽如人意但是初步达到了对自己的要求。信息时代是科技和经济发展的产物,软件产业是信息时代的产物,它在我们的生活工作中发挥着越来越大的作用,计算器的设计对我们知识的掌握有很大的作用,更能方便他人,可行性很强。刚开始设计的时候找不到头绪,不知道该从哪里下手,通过向同学询问和向老师寻求帮助找走进了设计的门槛。在设计这个程序时,刚开始是根据网上的资料,用画图以及循环将框架设计出来,但是接下去便无从下手了,鼠标应用是个关键和难点,也查了相应的资料,一般是用得是坐标来做的,所以为了方便设计程序,我也改为坐标来做的,这样鼠标问题解决了。接下去就是按键问题,我的资料是用鼠标去按键因而省略了键盘输入的控制,所以关于按键这个函数就只能自己设计,还好手头有类似的资料,经过自己的反复尝试以及与与同学的讨论,这也不难,最好还是被我搞定了。最后就是闪烁,这个设计的方法很死板,都一个类型,就是算坐标比较烦琐,要确定好它的位置,但是这些只要你自己愿意去尝试,问题都可以迎刃而解的。
通过网上查找到很多成功的计算器程序,通过对那些已经成功地程序进行分析找到自己的设计思路,制定设计流程。并通过比较各种程序了解各个程序的利弊,从而明确自己计算器的设计方向和如何通过技术手段达到自己的目的。万事开头难,可是对于并不是很熟悉的C语言在下面的工作中困难处处能遇见。通过查找C语言教材去图书馆查找相关的资料和同学一起讨论终于把一个个棘手的陌生的问题解决。测试阶段中发现了几处错误导致程序不能编译,通过耐心的分析源代码终于编好了一个完整无误的程序。
在这次的C语言程序设计实习中遇到了现实编程中必然见到的问题通过这些问题的解决积累了编程的实践经验。在实际的编程操作中发现自己C语言知识的不足,加深了对C语言的理解。在学习之余体验到收获的感觉。同时认识到程序员的工作并不是我们想象的那么简单轻松的,在现在的编程中要有足够的耐心和热情。
参考文献
[1]《C语言程序设计(第二版)》杨路明北京邮电大学出版社,2005
[2]《C语言程序设计》黄明大连理工大学出版社,2005
[3]《C语言程序设计(第二版)》谭浩强高等教育出版社,2002
[4]《C语言程序设计教程[M]》张毅坤 西安交通大学出版社,2003
[5]《 C语言实用教程》薛刚吉林科学技术出版社,1997
[6]《汇编语言程序设计》高福祥 东北大学出版社,1995