c语言高级教程第四章.ppt
《c语言高级教程第四章.ppt》由会员分享,可在线阅读,更多相关《c语言高级教程第四章.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、李堂秋 厦门大学计算机科学编写C与C+程序设计 第四章 函数和程序结构前言 使用函数,可以把大的计算任务分解,换句使用函数,可以把大的计算任务分解,换句话说,可以使用许多函数的组合来完成复杂的任话说,可以使用许多函数的组合来完成复杂的任务。而且在务。而且在C C中,并非所有的函数都要自己定义,中,并非所有的函数都要自己定义,可以使用别人已做好的程序模块。在设计主函数可以使用别人已做好的程序模块。在设计主函数的时候,可以将不必要的细节蕴藏起来,以便更的时候,可以将不必要的细节蕴藏起来,以便更容易把握主线和全局。如果程序太大,还可以将容易把握主线和全局。如果程序太大,还可以将C C语言写的程序分放
2、多个文件,分别编译,最后语言写的程序分放多个文件,分别编译,最后再联接起来成为整体。再联接起来成为整体。4.1 函数的基础 看看我们如何编一个程序,看看我们如何编一个程序,首先要明确我们要做什首先要明确我们要做什么事请,比如要读一个文件,找出所有包含某一字么事请,比如要读一个文件,找出所有包含某一字符串的行并把它打印出来。符串的行并把它打印出来。思路:思路:while(while(读入一个新行读入一个新行)if(if(如果如果这个新行包含指定的字符串这个新行包含指定的字符串)打印这个新行打印这个新行读入一个新行打印这一行判断这一行是否指定的字符串函数的基础(续)()除了除了 和()、和()、其
3、他都可以省略,如:其他都可以省略,如:dummy();dummy();数据传入数据通过return;传回给调用函数#include#include#define MAXLINE 1000#define MAXLINE 1000int getline(char line,int max);int getline(char line,int max);int strindex(char source,char searchfor);int strindex(char source,char searchfor);char pattern =“ould”;/*pattern to search fo
4、r*/char pattern =“ould”;/*pattern to search for*/*find all lines matching pattern*/*find all lines matching pattern*/main()main()char lineMAXLINE;char lineMAXLINE;int found=0;int found=0;while(getline(line,MAXLINE)0)while(getline(line,MAXLINE)0)if(strindex(line,pattern)=0)if(strindex(line,pattern)=0
5、)printf(“%s”,line);printf(“%s”,line);found+;found+;return found;return found;主函数/*getline:get line into s,return length*/*getline:get line into s,return length*/int getlineint getline(char s,int lim)(char s,int lim)int c,i;int c,i;i=0;i=0;while(-lim 0&(c=getchar()!=EOF&c!=n)while(-lim 0&(c=getchar()
6、!=EOF&c!=n)si+=c;si+=c;if(c=n)if(c=n)si+=c;si+=c;si=0;si=0;return i;return i;/*strindex:return index of t in s,-1 if none*/*strindex:return index of t in s,-1 if none*/int strindex(char s,char t)int strindex(char s,char t)int i,j,k;int i,j,k;for(i=0;si!=0;i+)for(i=0;si!=0;i+)for(j=i,k=0;tk!=0&sj=tk;
7、j+,k+);for(j=i,k=0;tk!=0&sj=tk;j+,k+);if(k 0&tk=0)if(k 0&tk=0)return i;return i;return-1;return-1;子函数4.2 返回非整数的函数 在使用返回值不是整数的函数时,正确地进行函数的定义和在使用返回值不是整数的函数时,正确地进行函数的定义和函数说明十分重要。函数说明十分重要。函数定义函数定义时一定要说明返回值类型,否则缺省为整数。时一定要说明返回值类型,否则缺省为整数。为了使调用函数知道被调用函数的类型,函数调用为了使调用函数知道被调用函数的类型,函数调用前一定要前一定要进行原形说明,否则,如果函数定义
8、的类型与调用类型出现进行原形说明,否则,如果函数定义的类型与调用类型出现不一致:不一致:如果调用和被调用函数在同一个文件中定义,编译器会提出警如果调用和被调用函数在同一个文件中定义,编译器会提出警告,这是实行原型说明的好处。告,这是实行原型说明的好处。如果不在一个文件中定义,编译器不会发现问题,即:如果不在一个文件中定义,编译器不会发现问题,即:在调用前在调用前没有原型说明的函数没有原型说明的函数,被理解为返回整数,而对它被理解为返回整数,而对它的变元毫无假定的变元毫无假定。函数原型说明中函数原型说明中没有给出变量说明的没有给出变量说明的,编译器对变元不做任,编译器对变元不做任何检查。何检查。
9、子函数把字符串转换成浮点数#include#include/*atof:convert string s to double*/*atof:convert string s to double*/doubledouble atof(char s)atof(char s)double val,power;double val,power;int i,sign;int i,sign;for(i=0;isspace(si);i+)/*skip leading spaces*/for(i=0;isspace(si);i+)/*skip leading spaces*/;sign=(si=-)?-1:1
10、;sign=(si=-)?-1:1;if(si=+|si=-)if(si=+|si=-)i+;i+;for(val=0.0;isdigit(si);i+)for(val=0.0;isdigit(si);i+)val=10*val+(si-0);val=10*val+(si-0);if(si=.)if(si=.)i+;i+;for(power=1.0;isdigit(si);i+)for(power=1.0;isdigit(si);i+)val=10*val+(si-0);val=10*val+(si-0);power*=10.0;power*=10.0;returnreturn sign*va
11、l/power;sign*val/power;主函数读入数字并把它们累加起来#include#include#define MAXLINE 100#define MAXLINE 100/*a rudimentary calculator*/*a rudimentary calculator*/main()main()double sum,atof(char);double sum,atof(char);char lineMAXLINE;char lineMAXLINE;int getline(char line,int max);int getline(char line,int max);s
12、um=0;sum=0;while(getline(line,MAXLINE)0)while(getline(line,MAXLINE)0)printf(“t%gn”,sum+=atof(line);printf(“t%gn”,sum+=atof(line);return 0;return 0;4.3 外部变量-全局变量 全局变量是在所有函数外部定义的变量,它有如下的特性:全局变量是在所有函数外部定义的变量,它有如下的特性:全程可见性:对程序中全局变量,通过适当说明,所有函授全程可见性:对程序中全局变量,通过适当说明,所有函授都可以通过它的唯一的都可以通过它的唯一的“名字名字”对它存取,即使这些
13、函数是对它存取,即使这些函数是在不同文件并且是分别编译的。在不同文件并且是分别编译的。可见性可控:当然,也可以通过适当的说明,使某些全局变可见性可控:当然,也可以通过适当的说明,使某些全局变量只在一个文件中有效。量只在一个文件中有效。全程生命周期:全局变量从程序执行时就存在,并且一直存全程生命周期:全局变量从程序执行时就存在,并且一直存在直到程序结束。在直到程序结束。可增加效率:可以用来保留中间结果,如果许多函数使用大可增加效率:可以用来保留中间结果,如果许多函数使用大量的共同数据,适度的使用外部变量,可以避免大量数据的量的共同数据,适度的使用外部变量,可以避免大量数据的传递,对于简化程序是有
14、益的。传递,对于简化程序是有益的。函数是全局的:函数是全局的:C C程序是由一系列外部变量和函数组成的,程序是由一系列外部变量和函数组成的,C C中所有的函数都是全局的,不能在函数中定义函数。中所有的函数都是全局的,不能在函数中定义函数。局部变量或内部变量(2)全局变量又叫外部变量,它与内部变量相对应,函数的参数全局变量又叫外部变量,它与内部变量相对应,函数的参数变量和函数内部定义的变量叫内部变量。变量和函数内部定义的变量叫内部变量。内部变量的可见性是局部的:内部变量又称局部变量,只在内部变量的可见性是局部的:内部变量又称局部变量,只在函数内可见,当局部变量与某全局变量同名时,全局变量受函数内
15、可见,当局部变量与某全局变量同名时,全局变量受到屏蔽。其好处是,不同的函数的局部变量可以同名,他们到屏蔽。其好处是,不同的函数的局部变量可以同名,他们之间不会产生混淆。之间不会产生混淆。局部变量的生命周期短:从函数被调用的时刻起存在,到函局部变量的生命周期短:从函数被调用的时刻起存在,到函数调用结束时消亡。数调用结束时消亡。函数的局部动态变量在两次调用之间没有关系,更不会相互函数的局部动态变量在两次调用之间没有关系,更不会相互影响。影响。使用局部变量,可以保证程序的模块化使用局部变量,可以保证程序的模块化 但在特定的情况下使用全局变量会简化参数的传递。但在特定的情况下使用全局变量会简化参数的传
16、递。权衡权衡例子:说明外部变量的正确使用 设计一个可以做加减乘除的计算器,输入采用反序波兰表达式:设计一个可以做加减乘除的计算器,输入采用反序波兰表达式:1 2 -4 5 +*1 2 -4 5 +*表示:(表示:(1-21-2)*(4+54+5)处理的算法如下处理的算法如下:while(while(下一个字符是操作数或操作符并且不是文件结束下一个字符是操作数或操作符并且不是文件结束)if(if(是是数字数字)压入栈中压入栈中else if(else if(是是操作符操作符)弹弹出操作数出操作数 实行操作实行操作 压入栈中压入栈中else if(else if(是是新行新行)弹弹出操作数并打印结
17、果出操作数并打印结果else else 出出错错这里的主要问题是决策:公共存取的变量放在何处?这里的主要问题是决策:公共存取的变量放在何处?-外部还是局外部还是局部?部?主程序#include include#include#include#define MAXOP 100#define MAXOP 100#define NUMBER 0#define NUMBER 0int getop(char );/*int getop(char );/*原型说明原型说明*/*/void push(double);void push(double);double pop(void):double pop(
18、void):/*reverse polish calculator*/*reverse polish calculator*/main()main()int type;int type;double op2;double op2;char sMAXOP;char sMAXOP;while(type=getop(s)!=EOF)while(type=getop(s)!=EOF)switch(type)switch(type)case NUMBER:push(atof(s);break;case NUMBER:push(atof(s);break;case+:push(pop()+pop();br
19、eak;case+:push(pop()+pop();break;case*:push(pop()*pop();break;case*:push(pop()*pop();break;case-:op2=pop();push(pop()-op2);break;case-:op2=pop();push(pop()-op2);break;case/:op2=pop();case/:op2=pop();if(op2!=0.0)push(pop()/op2);if(op2!=0.0)push(pop()/op2);else printf(“error:zero divisorn”);else print
20、f(“error:zero divisorn”);break;break;case n:printf(“t%.8gn”,pop();break;case n:printf(“t%.8gn”,pop();break;default:printf(“error:unknown command%sn”,s);break;default:printf(“error:unknown command%sn”,s);break;return 0;return 0;子程序1 /*/*解决堆栈和出栈的数据存储和操作解决堆栈和出栈的数据存储和操作*/#define MAXVAL 100 /#define MAXV
21、AL 100int sp=0;int sp=0;double valMAXVAL;/*value stack*/double valMAXVAL;/*value stack*/*push:push f onto value stack*/*push:push f onto value stack*/void push(double f)void push(double f)if(sp MAXVAL)if(sp 0)if(sp 0)return val-sp;return val-sp;else else printf(“error:stack emptyn”):printf(“error:st
22、ack emptyn”):return 0.0;return 0.0;子程序2#include#include int getch(void);int getch(void);void ungetch(int);void ungetch(int);/*getch:get next operator or numeric operand/*getch:get next operator or numeric operand 解决数据和操作符的输入解决数据和操作符的输入*/*/int getop(char s)int getop(char s)int i,c;int i,c;while(s0=c=
23、getch()=|c=t)while(s0=c=getch()=|c=t);s1=0;s1=0;if(!isdigit(c)&c!=.)if(!isdigit(c)&c!=.)return c;/*not a number*/return c;/*not a number*/i=0;i=0;if(isdigit(c)if(isdigit(c)while(isdigit(s+i=c=getch()while(isdigit(s+i=c=getch();/*collect interger part*/;/*collect interger part*/if(c=.)if(c=.)while(is
24、digit(s+i=c=getch()while(isdigit(s+i=c=getch();/*collect fraction part*/;/*collect fraction part*/si=0;si=0;if(c!=EOF)if(c!=EOF)ungetch(c);ungetch(c);return NUMBER;return NUMBER;valsp+=f;valsp+=f;else else printf(“error:stack full,cant push%gn”,f);printf(“error:stack full,cant push%gn”,f);/*pop:pop
25、and return top value from stack*/*pop:pop and return top value from stack*/double pop(void)double pop(void)if(sp 0)if(sp 0)return val-sp;return val-sp;else else printf(“error:stack emptyn”):printf(“error:stack emptyn”):return 0.0;return 0.0;子程序3 /*/*缓冲式的字符输入缓冲式的字符输入*/*/#define BUFSIZE 100#define BUF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 高级 教程 第四
限制150内