第三章 系统分析和设计
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()函数再调用一次, 此时该窗口便成为现行窗口了。
如要定义一个窗口左上角在屏幕(20, 5)处, 大小为30列15行的窗口可写成:window(20, 5, 50, 25); 窗口内文本的输出函数 int cprintf(\格式化字符串>\变量表>); int cputs(char *string); int putch(int ch);
cprintf()函数输出一个格式化的字符串或数值到窗口中。它与printf() 函数的用法完全一样, 区别在于cprintf()函数的输出受窗口限制, 而printf() 函数的输出为整个屏幕。
cputs()函数输出一个字符串到屏幕上, 它与puts()函数用法完全一样, 只是受窗口大小的限制。
putch()函数输出一个字符到窗口内。 int getche(void);
该函数在前面已经讲过, 需要说明的是, getche()函数从键盘上获得一个字符, 在屏幕上显示的时候, 如果字符超过了窗口右边界, 则会被自动转移到下一行的开始位置。 void clrscr(void); 清除当前窗口中的文本内容, 并把光标定位在窗口的左上角(1, 1)处。 void clreol(void); 清除当前窗口中从光标位置到行尾的所有字符, 光标位置不变。 void gotoxy(x, y); 该函数很有用, 它用来定位光标在当前窗口中的位置。这里x, y是指光标要定位处的坐标(相对于窗口而言), 当x, y超出了窗口的大小时, 该函数就不起作用了。
3.3 计算函数的调用
1.调用 C库函数中的函数,数学函数#inchude
3.4 程序的运行和退出
1.运行
通过Tubro C安装路径找到TC2.0文件夹中的tc.exe文件,双击该文件,即可进入TC2.0环境。
2.退出
退出TC可以按F10键进入主菜单,选择File菜单下的Quit命令,再按回车键即可退出TC环境。(也可以在TC环境下直接按Alt+X键退出程序。这是TC环境下的热键)
第四章 系统测试
程序调试是指对程序的查错和排错。为了便于查错、阅读,在设计该程序的过程中我们采用了结构化程序方法编辑,添加了尽可能多的注释,这就为接下来的调试过程带来了很多方便。
经过仔细检查之后进行上机调试。进行编译,如果在编译和连接过程中发现错误,屏幕上显示了出错信息,根据提示找到出错的位置,加以改正,再进行编译??如此反复,直到顺利通过编译和连接为止。在本次实习过程中碰到的编译、连接的错误主要有:缺少变量定义,定义位置不正确、语法错误、转义字符漏用、逻辑错误等。
.1 系统测试
系统测试结果如下:
输出:
错误C:\\jisuanqibyjzj.TXT 183: 未定义的符号'LEFT'在 Run 函数中 错误 C:\\jisuanqibyjzj.TXT 183: 需要用常量表达式在 Run 函数中 错误: C:\\jisuanqibyjzj.TXT 393:’main’的宣告;
开始编译文件: C:jisuanqibyjzj.TXT
4.2 调试
根据电脑所给的提示出现语法错误,缺少变量的定义大多的语法错误在通过书本参考下能够修改。主要是平时看书不仔细、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式与使用的情况不太注意而造成不匹配;还有漏掉形参的定义是值不能传递等等。这些语法错误有信息框的提示一般是能够排除的。另外还有部分注释的位置也错了,最重要的是逻辑上的错误,一般电脑不容易发现。所以更要对程序仔细的检查。经认真修改之后重新保存文件。
4.3 错误原因分析一
缺少变量定义,定义位置不正确
由于该程序相对来讲稍有些长,前后有些变量不容易联系起来,但是在错误信息的提示下一般还是很容易找到。不过需要注意的是在定义的时候有些函数使用同样的变量名而表示不同的作用,因而使用要很小心,定义及定义的位置要特别留意。为减少这样的错误我后来还是用不同的变量名来表示,结果引起的那些错误解决了。
例如: 未定义void mwindow(char *header); /*窗口函数*/ 或mwindow( \ /* 显示主窗口 */,所以输出void mwindow( char *header )中就有错误,因为缺少定义。
语法错误
大多的语法错误在通过书本参考下能够修改。主要是平时缺乏锻炼、不太注意而产生的。如没有注意具体数据使用是有一定的范围限定;过分重视分号的重要性而在for、if、while语句中画蛇添足加分号;在使用文件的时候忘记将文件先打开,对打开的方式
4.4 错误原因分析二 注释的位置
程序设计中在注释的时候不能同我们平常写字一样随心所欲,我们应该注意注释的格式。注释中不能含有c语言可执行的语句!
逻辑错误
编译、连接的成功并不意味着程序的最终成功。逻辑上的错误机器不易检查出来,这时需要对数据结果进行分析。这种错误的查找是最难的,需要有相当的耐心和细心去把问题找出来。这也是本次程序编辑过程中碰到的最大的难题。往往运行之后得不到另人满意的结果,此时解决的方法一则用“分段检查”的方法,在程序的不同位置设几个printf函数语句,输出有关变量的值,逐段往下检查,对检查出的错误进行修改,当调试完毕将设置的printf都删去。若在程序中找不到问题,则再来考虑算法是否逻辑严谨,再进行修改。如此循环往复,直到最后程序运行成功。在本次程序编辑过程中,我就是常遇到编译能通过,能够运行程序,但是总在输入、删除等操作完之后再想去看数据文件中存在的数据记录的时候,却一条记录也显示不出来,可能是对n变量的定义或使用出错了,于是在每个主要函数的操作过程中添加了printf语句用来显示n的变化,在执行某个函数前添加插入语句显示n的起始值,在执行完该个函数后再添加插入语句显示此时n的结果值,观察n的变化是否正确,如果错误了,也就说明该函数编写过程有错。诸如这样的调试方法,不断缩小检查范围,最后将错误找到,进行修改。所以到最后我找到了错误,及时改正,终于把程序完成了,一切功能显示正常