C语言高级编程技术[纪钢][] .pdf
《C语言高级编程技术[纪钢][] .pdf》由会员分享,可在线阅读,更多相关《C语言高级编程技术[纪钢][] .pdf(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言高级编程技术8.1 递归程序设计C语言支持函数的递归调用。递归就是函数直接或间接地自己调用自己。常见的递归算法有两种,即算术递归与操作递归。递归的基本思想是,将问题P求解的运算规模或操作步骤进行分解,使求解问题P 的运算规模或操作步骤可以由求解一个简单问题以及在更小规模或更小步骤上求解相同的问题P 来组成。当运算规模或操作步骤减少到一定程度时,如果问题P 的求解算法可简单实现,就可以采用递归算法来实现问题P的求解。比如,求 n!与求(n-1)!的运算方法是一样的;当n=0 时,0!=1。8.1.1 算术递归算术递归是指一切形式的递归算式都可以用递归方法求解。例 81:用递归方法求n!。#
2、include long fact(int n)if(n=0)return 1;return n*fact(n-1);void main()int n;scanf(%d,&n);printf(%d!=%ldn,n,fact(n);例 8.2:用递归函数计算两个正整数的最大公约数。#include int gcd(int m,int n)if(!n)return m;return gcd(n,m%n);void main()int a,b,gcd1;scanf(%d%d,&a,&b);gcd1=gcd(a,b);printf(%dn,gcd1);8.1.2 操作递归操作递归是指实现某种操作的递归
3、。例 8.3:用递归算法实现一维整型数组元素由小到大冒泡排序。#include void sort(int a,int n)int i,temp;if(n=0)return;for(i=0;iai+1)名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 45 页 -temp=ai;ai=ai+1;ai+1=temp;sort(a,n-1);void main()int array10,i;for(i=0;i10;i+)scanf(%d,&arrayi);sort(array,9);for(i=0;i10;i+)printf(%d,arrayi);例 8.4:用递归算法求一正长整型数的
4、各位数字之和。#include int sum(long i)if(i=0)return 0;return i%10+sum(i/10);void main()long i;scanf(%ld,&i);printf(%dn,sum(i);8.1.3 递归算法的优缺点递归函数的主要优点是可以把算法写的比使用非递归函数时更清晰更简洁,而且某些问题,特别是与人工智能有关的问题,更适宜用递归方法。递归算法的缺点,一是需要额外的内存开销,特别是当递归层次较大时,递归函数需要占用的堆栈内存空间相当大。二是函数的频繁调用会降低程序的执行效率。总之,递归算法要比解决同样问题的非递归算法效率低一些。内存空间需求
5、更多一些。大多数用递归算法解决的问题,都可以找到相应的非递归算法,只有少数问题的求解只有递归算法。由于递归算法具有效率低、内存消耗大等缺点,在设计程序时,若有比较好的非递归算法,应尽量采用非递归算法。82 文本的屏幕输出和键盘输入8.2.1 文本的屏幕输出显示器的屏幕显示方式有两种:文本方式和图形方式。文本方式就是显示文本的模式,它的显示单位是字符而不是图形方式下的象素,因而在屏幕上显示字符的位置坐标就用行和列表示。Turbo C 的字符屏幕函数主要包括文本窗口大小的设定、窗口颜色的设置、窗口文本的清除和输入输出等函数。这些函数的有关信息(如宏定义等)均包含在 conio.h 头文件中,因此在
6、用户程序中使用这些函数时,必须用include 将 conio.h 包含进程序。1 文本窗口的定义Turbo C 默认定义的文本窗口为整个屏幕,共有80 列25 行的文本单元。如图 8-1 所示,规定整个屏幕的左上角坐标为(1,1),右下角坐标为(80,25),并规定沿水平方向为X轴,方向朝右;沿垂直方向为Y 轴,方向朝下。每个单元包括一个字符和一个属性,字符即 ASCII 码字符,属性规定该字符的颜色和强度。除了这种默认的80 列25 行的文本显示方式外,还可由用户通过函数:void textmode(int newmode);来显式地设置 Turbo C 支持的 5种文本显示方式。该函数将
7、清除屏幕,以整个屏幕为当前窗口,并移光标到屏幕左上角。newmode 参数的取值见表8-1,既可以用表中指出的方式代码,又可以名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 45 页 -用符号常量。LASTMODE 方式指上一次设置的文本显示方式,它常用于在图形方式到文本方式的切换。图8-1 表8-1 方式符号常量显示列行数和颜色0 BW40 4025黑白显示1 C40 4025彩色显示2 BW80 8025黑白显示3 C80 8025彩色显示7 MONO 8025单色显示-1 LASTMODE 上一次的显示方式Turbo C 也可以让用户根据自己的需要重新设定显示窗口,也就是说
8、,通过使用窗口设置函数 window()定义屏幕上的一个矩形域作为窗口。window()函数的函数原型为:void window(int left,int top,int right,int bottom);函数中形参(int left,int top)是窗口左上角的坐标,(int right,int bottom)是窗口的右下角坐标,其中(left,top)和(right,bottom)是相对于整个屏幕而言的。例如,要定义一个窗口左上角在屏幕(20,5)处,大小为 30 列15 行的窗口可写成:window(20,5,50,25);若window()函数中的坐标超过了屏幕坐标的界限,则窗口的
9、定义就失去了意义,也就是说定义将不起作用,但程序编译链接时并不出错。窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。一个屏幕可以定义多个窗口,但现行窗口只能有一个(因为DOS 为单任务操作系统)。当需要用另一窗口时,可将定义该窗口的window()函数再调用一次,此时该窗口便成为现行窗口了。2 文本窗口颜色和其它属性的设置文本窗口颜色的设置包括背景颜色的设置和字符颜色(既前景色)的设置,使用的函数及其原型为:设置背景颜色函数:void textbackground(int color);设置字符颜色函数:void textcolor(int color);有
10、关颜色的定义见表 8-2。表中的符号常数与相应的数值等价,二者可以互换。例如设定蓝色背景可以使用textbackground(1),也可以使用 textbackground(BLUE),两者没有任何区别,只不过后者比较容易记忆,一看就知道是蓝色。表8-2 颜色表名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 45 页 -符号常数数值含义背景或背景BLACK 0 黑前景、背景色BLUE 1 蓝前景、背景色GREEN 2 绿前景、背景色CYAN 3 青前景、背景色RED 4 红前景、背景色MAGENTA 5 洋红前景、背景色BROWN 6 棕前景、背景色LIGHTGRAY 7 淡灰前
11、景、背景色DARKGRAY 8 深灰用于前景色LIGHTBLUE 9 淡蓝用于前景色LIGHTGREEN 10 淡绿用于前景色LIGHTCYAN 11 淡青用于前景色LIGHTRED 12 淡红用于前景色LIGHTMAGENTA 13 淡洋红用于前景色YELLOW 14 黄用于前景色WHITE 15 白用于前景色BLINK 128 闪烁用于前景色Turbo C 另外还提供了一个函数,可以同时设置文本的字符和背景颜色,这个函数是文本属性设置函数:void textattr(int attr);参数 attr 的值表示颜色形式编码的信息,每一位代表的含义如下:位7 6 5 4 3 2 1 0 B
12、b b b c c c c 闪烁背景颜色字符颜色字节低四位 cccc 设置字符颜色,46 三位 bbb 设置背景颜色,第7位 B 设置字符是否闪烁。假如要设置一个蓝底黄字,定义方法如下:textattr(YELLOW+(BLUE4);若再要求字符闪烁,定义变为:textattr(128+YELLOW+(BLUE4);注意:(1)对于背景只有 0到7共八种颜色,取大于 7小于 15 的数,则代表的颜色与减7 后的值对应的颜色相同;(2)用textbackground()和textcolor()函数设置了窗口的背景与字符颜色后,在没有用clrscr()函数清除窗口之前,颜色不会改变,直到使用了函数
13、clrscr(),整个窗口和随后输出到窗口中的文本字符才会变成新颜色。(3)用textattr()函数时背景颜色应左移4 位,才能使 3 位背景颜色移到正确位置;3 窗口内文本的输入输出函数.窗口内文本的输出函数前面介绍过的printf(),putc(),puts(),putchar()等输出函数以整个屏幕为窗口的,它们不受由 window 设置的窗口限制,也无法用函数控制它们输出的位置,但Turbo C 提供了三个文本输出函数,它们受窗口的控制,窗口内显示光标的位置,就是它开始输出的位置。当输出行右边超过窗口右边界时,自动移到窗口内的下一行开始输出,当输出到窗口底部边界时,窗口内的内容将自动
14、产生上卷,直到完全输出完为止,这三个函数均受当前光标的控制,每输出一个字符光标后移一个字符位置。这三个输出函数原型为:int cprintf(char*format,表达式表);名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 45 页 -int cputs(char*str);int putch(int ch);它们的使用格式同printf(),puts()和putc(),其中 cprintf()是将按格式化串定义的字符串或数据输出到定义的窗口中,其输出格式串同printf 函数,不过它的输出受当前光标控制,且输出特点如上所述,cputs 同puts,是在定义的窗口中输出一个字符
15、串,而putch()则是输出一个字符到窗口,它实际上是函数putc 的一个宏定义,即将输出定向到屏幕。.窗口内文本的输入函数可直接使用 stdio.h 中的 getch()或getche()函数。需要说明的是,getche()函数从键盘上获得一个字,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的开始位置。4 有关屏幕操作的函数void clrscr(void);该函数将清除窗口中的文本,并将光标移到当前窗口的左上角,即(1,1)处。void clreol(void);该函数将清除当前窗口中从光标位置开始到本行结尾的所有字符,但不改变光标原来的位置。void dellin
16、e(void);该函数将删除一行字符,该行是光标所在行。void gotoxy(int x,int y);该函数很有用,用来定位光标在当前窗口中的位置。这里x,y 是指光标要定位处的坐标(相对于窗口而言)。当x,y 超出了窗口的大小时,该函数就不起作用了。int movetext(int x1,int y1,int x2,int y2,int x3,int y3);该函数将把屏幕上左上角为(xl,y1),右下角为(x2,y2)的矩形内文本拷贝到左上角为(x3,y3)的一个新矩形区内。这里x,y 坐标是以整个屏幕为窗口坐标系,即屏幕左上角为(1,1)。该函数与开设的窗口无关,且原矩形区文本不变。
17、int gettext(int xl,int yl,int x2,int y2,void*buffer);该函数将把左上角为(xl,y1),右下角为(x2,y2)的屏幕矩形区内的文本存到由指针buffer指向的一个内存缓冲区内,当操作成功,返回1;否则,返回 0。因一个在屏幕上显示的字符需占显示存储器VRAM 的两个字节,即第一个字节是该字符的ASCII 码,第二个字节为属性字节,即表示其显示的前景、背景色及是否闪烁,所以buffer 指向的内存缓冲区的字节总数的计算为:字节总数=矩形内行数每行列数2 其中:矩形内行数=y2-y1+l,每行列数=x2-xl+1(每行列数是指矩形内每行的列数)。
18、矩形内文本字符在缓冲区内存放的次序是从左到右,从上到下,每个字符占连续两个字节并依次存放。int puttext(int x1,int y1,int x2,int y2,void*buffer);该函数则是将gettext()函数存入内存buffer 中的文字内容拷贝到屏幕上指定的位置。注意:(1)gettext()函数和 puttext()函数中的坐标是对整个屏幕而言的,即是屏幕的绝对坐标,而不是相对窗口的坐标;(2)movetext()函数是拷贝而不是移动窗口区域内容,即使用该函数后,原位置区域的文本内容仍然存在。例8.5:下面的程序首先定义了一个字符数组,下标为64,表示用来存四行八列的
19、文本。由于没有用 window 函数设置窗口,因而用缺省值,即全屏幕为一个窗口,程序开始设置80列 25 行文本显示方式(C80),背景色为蓝色,前景色为红色,经clrscr 函数清屏后,设置的背景色才使屏幕背景变蓝。gotoxy(10,10)使光标移到第 10 行10 列,然后在(10,10)开始位置显示 L:load,接着在下面三行相同的列位置显示另外三条信息,13 行10 列显示的 E:exit 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 45 页 -后面带有回车换行符,为的是将光标移到下一行开始处,好显示press any key to continue。当按任一键后
20、,gettext 函数将(10,l0,18,13)矩形区的内容存到ch 缓存区内。ch 即上述的四行八列信息,接着设置一个窗口,并纵向写上1,2,3,4,然后用 movetext(),将此窗口内容复制到另一区域,由于此区域包括背景色和显示的字符,所以被复制到另一区域的内容也是相同的背景色和文本。当按任一键后,又出现提示信息,再按键,则存在ch缓冲区内的文本由puttext()又复制到开设的窗口内了,注意上述的函数movetext(),gettext(),puttext()均与开设的窗口内坐标无关,而是以整个屏幕为参考系的。#include#include void main()int i;ch
21、ar ch4*8*2;/*定义 ch 字符串数组作为缓存区*/textmode(C80);textbackground(BLUE);textcolor(RED);clrscr();gotoxy(10,10);cprintf(L:load);gotoxy(10,11);cprintf(S:save);gotoxy(10,12);cprintf(D:delete);gotoxy(10,13);cprintf(E:exitrn);cprintf(Press any key to continue);getch();gettext(10,10,18,13,ch);/*存矩形区文存到ch 缓存区*/cl
22、rscr();textbackground(1);textcolor(3);window(20,9,34,14);/*开一个窗口*/clrscr();cprintf(1.rn2.rn3.rn4.rn);/*纵向写 1,2,3,4*/movetext(20,9,34,14,40,10);/*将矩形区文本复制到另一区域*/puts(hit any key);getch();clrscr();cprintf(press any key to put text);getch();clrscr();puttext(23,10,31,13,ch);/*将ch 缓存区所存文本在屏上显示*/getch();5
23、 状态查询函数有时需要知道当前屏幕的显示方式,当前窗口的坐标、当前光标的位置,文本的显示属性等,Turbo C 提供了一些函数得到屏幕文本显示有关信息的函数:void gettextinfo(struct text_info*f);这里的 text_info 是在 conio.h 头文件中定义的一个结构,该结构的定义是struct text_info 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 45 页 -unsigned char winleft;/*窗口左上角 x 坐标*/unsigned char wintop;/*窗口左上角 y 坐标*/unsigned char w
24、inright;/*窗口右下角 x 坐标*/unsigned char winbottom;/*窗口右下角 y 坐标*/unsigned char attributes;/*文本属性*/unsigned char normattr;/*通常属性*/unsigned char currmode;/*当前文本方式*/unsigned char screenheight;/*屏高*/unsigned char screenwidth;/*屏宽*/unsigned char curx;/*当前光标的 x 值*/unsigned char cury;/*当前光标的 y 值*/;例8.6:下面的程序将屏幕
25、设置成80列彩色文本方式,并开了一个window(1,5,70,20)的窗口,在窗口中显示了current information of window,然后用 gettextinfo 函数得到当前窗口的信息,后面的 cprintf()函数将分别显示出结构text_info 各分量的数值来。#include#include void main()struct text_info current;textmode(C80);textbackground(1);textcolor(13);window(1,5,70,20);clrscr();cputs(Current information of
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 纪钢 C语言高级编程技术纪钢 2022 语言 高级 编程 技术
限制150内