高级语言课程设计指导书王海燕.docx

上传人:b****8 文档编号:10199371 上传时间:2023-02-09 格式:DOCX 页数:53 大小:144.46KB
下载 相关 举报
高级语言课程设计指导书王海燕.docx_第1页
第1页 / 共53页
高级语言课程设计指导书王海燕.docx_第2页
第2页 / 共53页
高级语言课程设计指导书王海燕.docx_第3页
第3页 / 共53页
高级语言课程设计指导书王海燕.docx_第4页
第4页 / 共53页
高级语言课程设计指导书王海燕.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

高级语言课程设计指导书王海燕.docx

《高级语言课程设计指导书王海燕.docx》由会员分享,可在线阅读,更多相关《高级语言课程设计指导书王海燕.docx(53页珍藏版)》请在冰豆网上搜索。

高级语言课程设计指导书王海燕.docx

高级语言课程设计指导书王海燕

高级语言课程设计指导书

第一章课程设计开发

第一节程序设计风格

开发一个大型程序需要有良好的程序风格。

程序的风格具体地表现为如下3个方面:

●程序逻辑风格

●程序正文书写的风格

●程序输入输出风格

一、逻辑风格

1.程序的局部化和模块化

随着问题的复杂化,程序的规模不断扩大,程序行明显增加,使用的变量数量也将增加,程序的流程将更复杂。

这将大大增加程序设计和阅读的困难程度。

解决这一问题的方法之一是使程序的一部分不过多地、过远的影响程序的其他部分。

这就是程序设计的局部化准则。

程序的局部化包括了数据的局部化和处理的局部化。

数据的局部化主要是指变量只使用在程序的局部,即在一个程序的一部分可以自由地命名变量,而不影响其他部分。

程序的局部化的最好实现方法是模块化的程序设计。

C语言用函数支持模块化程序设计。

一个模块与其他模块只用参数和返回值进行通信,并且只在调用和返回时才起作用。

随着程序的模块化,每一个模块的规模缩小,但随着模块的增加,模块间的通信复杂化起来,如何组织模块的问题又突出起来。

实践证明,系统部门间最有效的组织形式是层次结构。

层次结构要求与之适应的自顶向下、逐步细化的程序设计方法。

这样不断向下层延伸、细化,直到把问题求解过程准确描述为止。

层次结构要求与之适应的自顶向下,逐步细化的程序设计方法。

自顶向下要求设计者首先纵观全局,进行总的决策,确定最上层的模块(即主函数)。

一般说来,上层模块不涉及问题的细节,只说明“做什么”,在C语言程序中用调用语句实现;细节由下层,解决“怎么做”。

当然,“怎么做”中也包含相对于再下层的“做什么”。

这样不断向下层延伸、细化,直到对问题求解过程准确描述为止。

2.数据风格

1)数据类型和数据结构的使用要清晰,如要有限制地使用指针等;

2)采用必要的符号常量;

3.算法风格

1)算法要简洁,明了,少使用技巧;如a=a+b;b=a–b;a=a–b;完全可以用temp=a;a=b;b=temp;表示

2)尽量避免使用多重循环嵌套或条件嵌套结构;

3)充分利用库函数;

4)要注意浮点运算的误差;

二、正文风格

正文书写风格的核心是提高程序书面的可读性。

一般说来包括如下几个主要方面:

v使用足够的注释

为了帮助阅读者理解程序,应当使用足够的注释。

特别要注意在下列地方使用注释:

•一个文件文件名;

•程序或函数的功能;

•变量的用途;

•特殊数据结构的特点和实现方法;

•特殊技巧;

•任何容易误解或别人不容易看得懂的地方。

v语句括号风格

使用缩进书写格式,选择统一的语句括号(花括号)风格,可以突出结构的层次关系。

v标识符风格

•按“见名知义”的原则和较长的描述性名字命名对象(变量、函数、……)名,同时采用驼峰式命名法或加下划线命名法,如:

PrintEmployeePaychecks;

•最好能在名字中指出变量的类型,如:

intnValue;

•函数的命名,最好采用动宾结构,如:

voidResetCounter();

•当程序中变量很多时,毫无规则地命名变量名,会造成程序中混乱。

因此初学者从一开始就要注意培养自己的变量命名习惯.

v语句和表达式风格

•使用冗余的圆括号使表达式易读;

•在条件或循环结构中尽量避免采用“非”条件测试;

•尽量避免复杂条件测试;

•语句和表达式要清晰、易读,如表达式.

三、输入输出风格

•提高输入操作的坚固性,以适当方式对输入数据进行检验,以确认每个输入数据的有效性;对无效数据,也能给出必要的提示,而不导致死机。

•输入格式简单、单一、统一,容易核对。

•输入格式与用户水平相适应。

•输入时能给用户以提示,指明可使用的选择和边值。

•输出格式应满足用户要求,符合使用意图。

•对输出操作有必要的提示。

简化用户操作,减少用户出错处理。

第二节多文件的程序

当一个程序较大时,可将一个程序分成几个部分,每个部分可单独成为一个源文件,这些文件通过全局变量或函数相联系。

它们可进行单独编译,形成.OBJ文件。

可以采用两种方法将这些文件组合成一个完整的应用程序。

∙一、include方法

假设一个程序分成了A1.c和A2.c两个源文件

A2.c文件中定义了函数A2():

#include

voidA2()

{

...

}

A1.c中的main()函数调用A2()函数,则A1.c写成:

#include

#include“A2.c”/*include预处理命令*/

main()

{

...

A2();

...

}

这样,编译器会根据include预处理命令,将A1.c文件中该预处理命令出现的行用A2.c文件的内容进行改写,得到一个合并的源文件再进行编译,最终产生可执行的程序。

∙二、Project方法

假设一个程序分成了A1.c和A2.c两个源文件,project工程文件法生成可执行程序的步骤如下:

(1)用TC编辑器建立一个文本文件,内容为:

A1.c

A2.c

保存于文件AA.prj中。

(2)在TC环境中,按ALT+P,选择Project菜单中的Projectname项,填入文件名AA.prj后,按F9键,即可生成AA.exe的可执行文件。

另外,当多个源文件之间用头文件来进行接口时,在project文件中应该用圆括号将这些头文件括起来(多个头文件之间可用逗号、空格或分号分隔)。

这样一旦头文件改变时,这些源文件将被重新编译。

例如,有一主程序名为mymain.c,它包含头文件myfuncs.h,而另一文件是myfuncs.c,它也包含头文件myfuncs.h,此时project文件的内容应写成如下形式:

mymain.c(myfuncs.h)

myfuncs.c(myfuncs.h)

这样,一旦myfuncs.h被修改,则对该project文件进行编译时,mymain.c及myfuncs.c将被重新编译。

这里需要指出的是,在多个文件中一定要注意全局变量,静态全局变量以及函数的使用,以免产生错误。

第三节C语言的高级编程技术的实现

●操作手段

一、键盘

1.原理

在键盘内有一个微处理器,用来扫描和检测每个键的按下和抬起状态,然后以程序中断(INT9H)的方式与主机通信,向主机传送一个字节的按键扫描码。

接着ROM中BIOS内的键盘中断处理程序,将按键扫描码翻译成对应的ASCII码或扩充的ASCII码,存放在AX寄存器中。

由于ASCII码不能将PC键盘上的键全部包括,因此有些控制键如Ctrl、Alt、End、Home等用扩充的ASCII码表示,扩充码用两个字节的数表示。

第一个字节是0,第二个字节是0~255的数。

因此,如果按下的是普通键,键盘中断处理在AL中存放该键的ASCII码;如果是特殊功能键,则AH中存放扩充码,AL的值为0。

扫描码:

它不是ASCII码;其0~6位标识了每个键在键盘上的位置,最高位为0对应该键是被按下;1对应松开;它并不能区别大小写字母,而且一些特殊键不产生扫描码直接引起中断调用

2.方法

方法一:

直接使用声明在bios.h中的库函数bioskey();

intbioskey(intcmd);/*参数cmd用来确定函数如何操作*/

cmd=0

bioskey()返回按健的键值,该值是2个字节的整型数。

若没有键按下,则该函数一直等待,直到有键按下。

当按下时,若返回值的低8位为非零,则表示为普通键,其值代表该键的ASCII码。

若返回值的低8位为0,则高8位表示为扩展的ASCII码,表示按下的是特殊功能键

cmd=1

bioskey()查询是否有键按下。

若返回非0值,则表示有键按下,若为0表示没键按下。

cmd=2

bioskey()将返回一些控制键是否被按过,按过的状态由该函数返回的低8位的各位值来表示:

字节位对应的16进制数含义

00x01右边的shift键被按下

10x02左边的shift键被按下

20x04Ctrl键被按下

30x08Alt键被按下

40x10ScrollLock已打开

50x20NumLock已打开

60x40CapsLock已打开

70x80Insert已打开

如选参数cmd为2,若key值为)0x09,则表示右边的shift键被按下,同时Alt键也被按下。

方法二:

通过库函数int86(),调用BIOS的INT16H、功能号为0的中断。

它将按键的扫描码存放在AH寄存器中;

/*读键函数,返回扫描码*/

intgetKeySCode()

{

unionREGSrg;

rg.h.ah=0;

int86(0x16,&rg,&rg);

returnrg.h.ah;

}

方法三:

简单地利用声明在conio.h中的库函数kbhit()。

intkbhit(void);

若按了键盘,该函数返回值1,否则返回值0。

二、鼠标

1.原理

DOS操作系统和TurboC2.0并不支持鼠标器的操作。

要操纵鼠标器,首先必须安装相应的鼠标驱动程序。

鼠标驱动程序由生产鼠标的厂家提供,它提供了许多鼠标操作的功能。

这些功能可以通过INT33H鼠标中断调用来使用。

2.常用功能

/*显示鼠标器光标*/

voidcursorOn()

{

unionREGSr;

structSREGSs;

r.x.ax=1;/*1号鼠标器功能:

显示鼠标光标*/

msvisible=TRUE;

int86x(0x33,&r,&r,&s);

}

/*关闭鼠标器光标*/

voidcursorOff()

{

unionREGSr;

structSREGSs;

r.x.ax=2;/*2号鼠标器功能:

不显示鼠标光标*/

msvisible=FALSE;

int86x(0x33,&r,&r,&s);

}

/*设定鼠标光标的初始位置*/

voidcursorXY(unsignedintx,unsignedinty)

{

unionREGSr;

structSREGs;

r.x.ax=4;/*4号鼠标器功能:

设置鼠标光标位置*/

r.x.cx=x;/*设定光标x坐标*/

r.x.dx=y;/*设定光标y坐标*/

int86x(0x33,&r,&r,&s);

mousex=x;

mousey=y;

}

/*报告鼠标器当前光标位置和当前按键状态*/

voidmouseRead()

{

unionREGSrl,r2;

structSREGSs;

r1.x.ax=3;/*3号鼠标器功能:

取按钮状态和鼠标位置*/

int86x(0x33,&r1,&r2,&s);

mousex=r2.x.cx;/*鼠标器光标x方向坐标*/

mousey=r2.x.dx;/*鼠标器光标y方向坐标*/

mousekey=r2.x.bx;/*鼠标器按健状态*/

}

/*等待鼠标器的某种状态*/

voidwait(inti)

{

do{

mouseread();

}while(mousekey==i);

}

●显示方式

一、显示系统

显卡在计算机主机和显示器之间起到了信息转换和视频发送作用,必须与显示器配套。

不同种类的显卡支持的显示模式种类不同,而且同一显卡一般可以支持多种显示模式。

一种显示模式指定了相应显示器的工作方式、分辨率和颜色数目。

1.常见显卡及其模式

2.显示器工作方式

显示器有两种工作方式,即文本显示方式和图形显示方式,它们的主要差别是显示存储器(VRAM)中存的信息不同。

文本方式时,VRAM存放要显示字符的ASCII码,用它作为地址,取出字符发生器ROM中存放的相应字符的图像变成视频信号在显示器屏幕上进行显示。

图形方式时,则要显示的图形的图像直接存在VRAM中,VRAM中某地址单元存放的数就表示了相应屏幕上某行和列上的像素及颜色。

二、文本方式

也称作字符显示方式,是TurboC确省的显示方式。

文本方式屏幕的最大分辨单位是单个字符,字符显示的位置用行和列坐标来表示。

1.方式设定

TurboC支持的几种文本显示方式可以用下面的函数来设置:

voidtextmode(intnewmode);

2.颜色设置

voidtextbackground(intcolor);/*设置字符背景颜色*/

voidtextcolor(intcolor);/*设置字符颜色*/

voidtextattr(intattr);/*可同时设置文本的字符和背景颜色*/

3.窗口设置

TurboC确省定义的文本窗口为整个屏幕。

用户可以通过函数:

voidwindow(intleft,inttop,intright,intbottom);

定义屏幕上的一个矩形域作为窗口。

参数(left,top)是窗口左上角所在的屏幕坐标,(right,bottom)是窗口的右下角所在的屏幕坐标。

窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。

另外,一个屏幕可以定义多个窗口,但现行窗口只能有一个。

1)窗口操作

窗口内文本输出函数:

intcprintf(char*format,表达式表);

intcputs(char*str);

intputch(intch);

/*这三个函数受窗口的控制,窗口内显示光标的位置就是它们开始输出的位置。

当输出行超过窗口右边界或输出到窗口底部边界时,会自动转到窗口内的下一行输出或自动上卷窗口内的内容继续输出*/

光标操作函数:

voidgotoxy(intx,inty);/*把光标移到窗口(x,y)处*/

2)屏幕操作

清屏函数:

voidclrscr(void);/*清除窗口文本,光标移到(1,1)*/

voidclreol(void);/*清除窗口从光标位置开始到本行结尾的所有字符,但光标不变*/

voiddelline(void);/*删除当前窗口的当前行*/

屏幕文本移动函数:

voidmovetext(intx1,inty1,intx2,inty2,intx3,inty3);

屏幕文本存取函数

voidgettext(intx1,inty1,intx2,inty2,void*buffer);

voidputtext(intx1,inty1,intx2,inty2,void*buffer);

3)应用实例

编制一个程序,将屏幕垂直平分成两个窗口,左边窗口为蓝色背景,白色前景,右边窗口为绿色背景,红色前景。

两个窗口都设计为文本输入,即在窗口中可以输入文字,在窗口屏幕中显示出来。

使用tab键在左右两个窗口中切换,每个窗口都有光标,活动窗口光标进行闪烁。

设计思想:

首先用文本窗口函数window(intx1,inty1,intx2,inty2)画出两个窗口,用textcolor(intcolor),textbackground(intcolor),clrscr(void)等进行窗口属性的设置。

用tab键进行两个窗口间的循环切换,在每次切换前先调用gettext(intleft,inttop,intright,intbottom,void*buf)函数把当前矩形窗口上的字符拷贝到由buf所指向的内存中,在切换到另一个窗口后调用puttext(intleft,inttop,intright,intbottom,void*buf)把先前存储在该窗口buf所指向的内存中的字符拷贝到当前窗口中,并用gotoxy(intx,inty)把光标移到原先所在位置,因此可以接着先前的文本继续编辑。

程序源代码:

#include

#include

#include

/*切换时保存左窗口文本*/

charleftbuf[40*25*2];

/*切换时保存右窗口文本*/

charrightbuf[40*25*2];

/*切换时保存左窗口当前坐标*/

intleftx,lefty;

/*切换时保存右窗口当前坐标*/

intrightx,righty;

/*重绘左边窗口*/

voiddraw_left_win();

/*重绘右边窗口*/

voiddraw_right_win();

intmain()

{

intkey;

intturn;

textmode(C80);

textbackground(0);

textcolor(WHITE);

clrscr();

gotoxy(60,1);

cprintf("PressEsctoQuit");

window(41,2,79,24);/*右边窗口为绿色背景,红色前景*/

textbackground

(2);

textcolor(4);

clrscr();

gettext(41,2,79,24,rightbuf);

window(2,2,40,24);/*左边窗口为蓝色背景,白色前景*/

textbackground

(1);

textcolor(15);

clrscr();

gettext(2,2,40,24,leftbuf);

turn=0;/*初始激活左窗口*/

for(;;)

{

key=bioskey(0);

if(key==0x11b)

exit(0);

key=key&0xff;/*获取窗口输入的文本的ASCII码值*/

if(key=='\t')

{

if(turn==0)/*切换到左窗口*/

{

gettext(2,2,40,24,leftbuf);

leftx=wherex();

lefty=wherey();

draw_right_win();

turn=1;

}

elseif(turn==1)/*切换到右窗口*/

{

gettext(41,2,79,24,rightbuf);

rightx=wherex();

righty=wherey();

draw_left_win();

turn=0;

}

}

else

putch(key);/*当前光标处显示新输入的文本字符*/

}

}

/*重绘右边窗口*/

voiddraw_right_win()

{

window(41,2,79,24);

textbackground

(2);

textcolor(4);

clrscr();

puttext(41,2,79,24,rightbuf);

gotoxy(rightx,righty);

}

/*重绘左边窗口*/

voiddraw_left_win()

{

window(2,2,40,24);

textbackground

(1);

textcolor(15);

clrscr();

puttext(2,2,40,24,leftbuf);

gotoxy(leftx,lefty);

}

程序运行截图

三、图形方式

图形显示方式可以满足在屏幕上作图的要求。

在此方式下,屏幕显示的单位是像素。

屏幕显示的像素大小(分辨率)可以通过设置不同的显示方式来改变。

像素在屏幕上的位置可由其所在的x,y坐标来决定。

此时,屏幕的坐标系统就象一个倒置的直角坐标系。

1.方式设定

图形系统的初始化:

Ø用什么类型的显卡的驱动程序

Ø采用什么模式的图形方式

Ø适配器驱动程序的寻找路径名。

注意:

所用系统的卡一定要支持所选用的显示模式,否则将出错。

1)图形系统的初始化函数:

voidfarinitgraph(intfar*pdriver,intfar*pmode,charfar*ppath_for_driver);

2)图形系统检测函数:

voidfardetectgraph(intfar*pdriver,intfar*pmode);

完成对适配器的检查并得到显示器类型号和相应的最高分辨率模式

将graphdriver设成DETECT,initgraph()将调用detectgraph()自动检测所用显卡类型,并将相应的驱动程序装入,并将其最高的显示模式作为当前显示模式。

intgraphdriver=DETECT,graphmode;

initgraph(&graphdriver,&graphmode,"");

3)清屏函数:

画图前一般需清除屏幕,使得屏幕如同一张白纸,以画最新最美的图画。

voidfarcleardevice(void);

4)图形系统的关闭:

当画图结束时可以通过调用关闭图形系统的函数:

voidfarclosegraph(void);

使显示器恢复到调用initgraph()函数之前的文本方式。

2.颜色设置

前景色设置函数:

voidfarsetcolor(intcolor);

背景色设置函数:

voidfarsetbkcolor(intcolor);

CGA前景色的取值:

CGA背景色的取值:

EGA/VGA标准色:

3.图视口

设置函数:

voidfarsetviewport(intxl,inty1,intx2,inty2,clipflag);

其中(x1,y1)为图视口的左上角所在的原屏幕物理坐标,(x2,y2)为右下角所在的原屏幕物理坐标。

clipflag参数clipflag若为0,则超出图视口的图形部分仍将显示出来;否则,超出图视口的部分将被切除而不显示。

清除函数:

voidfarclearviewport(void)

4.文本输出

当前位置文本输出函数:

voidfarouttext(charfar*textstring);

定位文本输出函数:

voidfarouttextxy(intx,inty,charfar*textstring);

文本输出字符串函数

intsprintf(char*string,char*format[,argument,…]);

文本输出位置函数:

voidfarsettextjustify(inthoriz,intvert);

定义文本字型函数:

voidfarsettextstyle(intfont,intdirection,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1