版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、全国计算机等级考试二级教程二级教程CC语言程序设计(语言程序设计(20132013版)版)第11章 对函数的进一步讨论 11.1 传给main函数的参数 11.2 通过实参向函数传递函数名或指向函数 的指针变量 11.3 函数的递归调用11.1 传给main函数的参数#include main(int argc,char *argv)int i; printf(argc=%dn,argc); for(i=1;iargc;i+) printf(%s,argvi); printf(n);在主函数main中也可以含有参数,我们通过一个程序来介绍一下它的使用。若在命令行中输入:myc A COMMAN
2、D LINK如上的输入中,空格表示间隔符,所以是4个字符串,argc的值就为4,则argv0就指向”myc”, argv1就指向”A”, argv2就指向”COMMAND”, argv3就指向”LINK”。argc=4A COMMAND LINK11.2 通过实参向函数传递函数名或指向函数的指针变量在C语言中函数名代表该函数的入口地址,因此可以定义一种指向函数的指针来存放这种地址。例如:#include double fun (int a, int *p) : :main()double (*fp)(int, int *); double y; int n; fp=fun; : : y=(*f
3、p)(56,&n); : :主函数被调用函数/*定义了一个指针变量fp,该指针变量只能指向返回值为实型的函数*/*把函数fun的入口地址赋值给指针变量fp,即fp指向了该函数*/y=fun(56,&n);11.3 函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。直接递归调用int f ( int x )int y,z; . z=f(y);间接递归调用int f1 ( int x )int y,z; . z=f2(y);int f2 ( int t )int u,v; . v=f1(u);11.3 函数的递归调用递归调用程序举例:#inc
4、lude int fac(int n)int t; if(n=1 | n=0) return 1; else t=n*fac(n-1); return t; main()int m,y; scanf(%d,&m); if(m0) printf(Input data error); else y=fac(m); printf(%d!=%dn,m,y); 程序执行时,比如输入4。t=4 * fac(3)t=3 * fac(2)t=2 * fac(1)1退出函数,将t的值作为该函数的返回值,所以该函数的值为24。当退出用户自定义函数时,该函数中的变量全部释放。4!=24习题 函数递归调用的程
5、序填空例1:请补充函数,fun函数是求n的介乘。#include long fun(int n)if (_1_) return (n*fun(_2_);return _3_;main()printf(10!=%ldn, fun(10);例2:请在函数fun的横线上填写若干表达式,使从键盘上输入一个整数n,输出斐波数列,如:0 1 1 2 3 5 8 13#include int fun(int n);main() int i, n = 0;scanf(%d, &n);for (i=0; i1 n-1 1 或 1L答案:例2:n=0 n=1 fun(n-1)+fun(n-2)第12章 C
6、语言中用户标识符的作用域和存储类对变量的进一步讨论 12.1 局部变量、全局变量和存储分类 12.2 局部变量及其作用域和生存期 12.3 全局变量及其作用域和生存期 12.4 函数的存储分类按类型整形变量实型变量字符变量按有效范围局部变量全局变量按生存期auto变量static变量局部变量1。在一个函数内部定义的变量。#include float f1(int n)int i,j; .char f2(float x,float y)float z; .main()int a,b,c; .i,j的有效范围z的有效范围a,b,c的有效范围2。函数的形式参数。3。在某个复合语句中定义的变量n的有效
7、范围x,y的有效范围#include main()int a,b,c; . int c; . c=a+b; . c的有效范围复合语句中的变量复合语句中的变量c和函数体中的和函数体中的c互不影响,在符互不影响,在符合语句中的变量都有自己的存储单元合语句中的变量都有自己的存储单元。全局变量#include int p=1,q=5;float f1(int a)int b; .int f2(int a)int b; .main()int m,n; .全局变量全局变量就是指在函数体之外定义的变量。就是指在函数体之外定义的变量。全局变量的有效范围是:从定义变量的位置开始到原文件结束。p,q的有效范围au
8、to变量当在函数内部或复合语句内定义变量时,也可以使用当在函数内部或复合语句内定义变量时,也可以使用auto说明符进行说明。说明符进行说明。用用auto说明的变量,当该变量退出它的有效范围时,系统将自动释放该变量说明的变量,当该变量退出它的有效范围时,系统将自动释放该变量所占的存储单元。所占的存储单元。例如:#include double add(double a,double b)auto double s; s=a+b; return s; main()double y,p,q; scanf(“%lf%lf”,&p,&q); y=add(p,q); printf(“%f”,
9、y);退出该函数时,局部变量退出该函数时,局部变量a,b和和s都自动释放,在这里,我们说明都自动释放,在这里,我们说明了变量了变量s为为auto型,所以也会自动型,所以也会自动释放。再此,我们也可以把释放。再此,我们也可以把auto省略。省略。register变量寄存器变量与寄存器变量与auto变量基本上相同,它们之间还是存在一些区别的:变量基本上相同,它们之间还是存在一些区别的:用用register说明的变量建议编译程序将变量的值保留在说明的变量建议编译程序将变量的值保留在CPU的寄存器中,而不是像一般变量的寄存器中,而不是像一般变量那样,占内存空间。那样,占内存空间。例如:#include
10、 int power(int,register int);main()int s; s=power(5,3); printf(%dn,s);int power(int x,register int n)register int p; for(p=1;n;n-) p=p*x; return p;特点 使用寄存器变量,程序运行时,访问存储器内的值要比访问存于内存中的值快得多。 CPU中的寄存器的数目是有限的,因此只能说明少量的寄存器变量。 register变量无地址。 尽量少用register变量。static变量例如:#include float fac(int n)static float f
11、=1; f=f*n; return f;main()int j; for(j=1;j=5;j+) printf(%d!=%.0fn,j,fac(j);此条语句是在此条语句是在编译编译时进行的并赋初值,此时进行的并赋初值,此条语句程序不会执行它;如果定义局部静条语句程序不会执行它;如果定义局部静态变量时没有赋初值,编译时会自动赋初态变量时没有赋初值,编译时会自动赋初值。用值。用static说明的变量,在退出整个说明的变量,在退出整个程程序序时,才释放内存空间。时,才释放内存空间。1!=12!=23!=64!=245!=120如有以下程序如有以下程序 int a=2; int f(int n) s
12、tatic int a=3; int t=0; if(n%2) static int a=4; t += a+; else static int a=5; t += a+; return t+a+; main() int s=a, i; for( i=0; i3; i+) s+=f(i); printf(%dn, s); 程序运行后的输出结果是程序运行后的输出结果是 A)26 B)28 C)29 D)24 extern说明符的作用当在同一个文件中时使用#include int p;void f1(int n)int s=1; .main()int a,b,c; .的有效范围p#include
13、void f1(int n)int p=1; .int p;main()int a,b,c; .的有效范围p局部变量p的有效范围#include void f1(int n)extern int p=1; .int p;main()int a,b,c; .全局变量 的有效范围pextern说明符的作用不同文件中的使用f1.c原程序文件f2.c原程序文件#include int x,y; /*定义全局变量*/void fun1();void fun2();void fun3();main()fun1(); fun2(); fun3();void fun1()x=111; .#include ex
14、tern int x;void fun2()printf(%dn,x); .void fun3()x+; printf(%dn,x); .在此用在此用extern说明说明x为全局变量,则意为全局变量,则意味着在此文件中将味着在此文件中将会引用会引用f1.c文件中原文件中原来变量来变量x中的值。中的值。111112静态全局变量不同文件中的使用f1.c原程序文件f2.c原程序文件#include static int n;void func();main()n=5; printf(file1:%dn,n); func();#include extern int n;void func() prin
15、tf(file2:%dn,n); .虽然在此文件中用虽然在此文件中用extern说明了变量说明了变量n,想来引用,想来引用f1.c中中的全局变量的全局变量n。但。但是,在是,在f1.c文件中文件中的的全局变量被说的的全局变量被说明了明了static变量,变量,则意味着,该变量则意味着,该变量只能在只能在f1.c中被使中被使用。不能被其它文用。不能被其它文件所使用。件所使用。第13章 编译预处理和动态存储分配 13.1 编译预处理 13.2 动态存储分配13.1 编译预处理宏替换-不带参数#define 宏名 替换文本例如: #define SIZE 100此命令为编译预处理命令,只要在原程此命
16、令为编译预处理命令,只要在原程序中名有序中名有SIZE的标识符都用的标识符都用100来替换,来替换,SIZE就相当于就相当于100是替身。是替身。请分析如下程序:#include #define SIZE 100main()int a=10,b=20,c; c=a+b+SIZE; printf(“%d”,c); c=a+b+100;#include #define N 2#define M N+1#define NUM 2*M+1main()int i; printf(%dn,NUM);2+12*2+1+113.1 编译预处理宏替换-带参数例如:#define MU(X , Y) ( (X)
17、* (Y) ) : :a= MU(5, 2);b=6/ MU(a+3, a);( (5) * (2) )( (a+3) * (a) )改写:#define MU(X , Y) X * Y : :a= MU(5, 2);b=6/ MU(a+3, a);a=5*2;b=6/a+3*a;终止宏定义:#define PI 3.14main() : :#undef PI : :以上以上PI的作用域从的作用域从#define PI 3.14命令行开始,到命令行开始,到#undef PI命令行命令行结束。从结束。从#undef以后以后的的PI变成无定义,不再变成无定义,不再代表代表3.14了。了。13.2
18、动态存储分配知识点回顾知识点回顾在前面我们学过,在对变量和数组进行定义实质上就是给它们在前面我们学过,在对变量和数组进行定义实质上就是给它们开辟相应大小的内存单元。我们除了可以用定义的方式来开辟开辟相应大小的内存单元。我们除了可以用定义的方式来开辟内存单元,还可以用一些函数来动态的分配和释放内存空间。内存单元,还可以用一些函数来动态的分配和释放内存空间。1。动态分配内存的函数: malloc(size)size必须是无符号整型,用来表示开辟几个字节的内存空间。函数返回值的类型为void *例如:float *pf; pf=(float *)malloc(4)/*分配了4个字节的存储空间,再将它
19、强制类型转换成所需的类型,让pf指向该存储单元*/pf若有语句段:if( pf != NULL ) *pf=3.83.8如上语句也可以使用sizeof()函数来求得字节数:pf=( float * ) malloc ( sizeof( float ) )3。动态释放空间的函数:free(pf) 、 free(ps) /*此函数没有返回值*/2。动态分配内存的函数(连续的内存): calloc(n,size)/*该函数为分配n个连续的存储空间*/例如:char *ps; ps=(char *)calloc(10,sizeof(char);开辟了开辟了10个连续的个连续的char类型类型的存储单元
20、,由的存储单元,由ps指向存储指向存储单元的首地址。单元的首地址。习题13.1 有以下程序#include #define MIN(x,y) (x)(y)?(x):(y)main()int i,j,k; i=10;j=15;k=10*MIN(i,j);printf(%dn,k);13.2 有以下程序#include #define N 2#define M N+1#define NUM (M+1)*M/2main()int i; for(i=1;isex(*ps).sex请问如何引用结构体数组arr的第0个元素arr0中的sex成员?如何引用结构体变量std中的数组成员sc中的元素sc2?ar
21、r0.sexstd.sc2ps-sc2(*ps). sc2题目若有以下说明和语句,则对结构体变量st中成员i的引用方式不正确的是struct stuint i; int name;st,*p;p=&st;A st.i B *p.i C (*p).i D p-iB14.3 共用体共用体共用体(union)的类型说明和变量的定义方式与结构体的类型说明和变量的的类型说明和变量的定义方式与结构体的类型说明和变量的定义方式完全相同定义方式完全相同,不同的是不同的是,结构体变量中的成员各自占有自己的存储空间结构体变量中的成员各自占有自己的存储空间,而共用体变量中的所有的成员占有同一个存储空间而共用
22、体变量中的所有的成员占有同一个存储空间.例如例如:struct dataint i; char ch; float f;a;结构体变量a在内存中的形式如下:占4个字节 占1个字节 占4个字节i ch f9union dataint i; char ch; float f;a;共用体变量a在内存中的形式如下:占4个字节i占1个字节占4个字节chf共用体变量所占内存字节与其成员中占字节数最多的那个成员相等.即是4个字节.注意若给:a.i=1; 此时只有a.i占用内存,a.ch和a.f都不起作用.若给:a.ch=a; 此时只有a.ch占用内存,a.i和a.f都不起作用.若给:a.f=1.5; 此时只
23、有a.f占用内存,a.i和a.ch都不起作用.第15章 位运算1.”按位取反按位取反”运算符运算符: 例如:01001101=101100102.”左移左移”运算符运算符: 例如:00000110 (分为两种情况分为两种情况)000001102=00000001 右端移出的二进制位舍弃,左边为0的话,补0.110001102=11110001 右端移出的二进制位舍弃,左边为1的话,补1.4.”按位与按位与”运算符运算符: & 运算规则运算规则:当两个相应的位都为当两个相应的位都为1时时,该位的结果为该位的结果为1,否则为否则为0. 0 0 0 0 1 1 0 0& 0 0 0
24、0 1 0 1 00 0 0 0 1 0 0 0第15章 位运算5.”按位异或按位异或”运算符运算符: 运算规则运算规则:当两个相应的位相同当两个相应的位相同,该位的结果为该位的结果为0,否则为否则为1. 0 0 1 1 0 0 1 1 1 1 0 0 0 0 1 11 1 1 1 0 0 0 06.”按位或按位或”运算符运算符: | 运算规则运算规则:只要当两个相应的位中有一个为只要当两个相应的位中有一个为1,该位的结果即为该位的结果即为1, 否则为否则为0. 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 00 1 0 1 1 1 1 17.位数不同的运算数之间的运算规则位数不
25、同的运算数之间的运算规则: 一一.先将两个运算数右端对齐先将两个运算数右端对齐. 二二.再将位数短的一个运算数往高位再将位数短的一个运算数往高位(左边左边)扩展扩展,即即:左边要是左边要是0的话的话,左边补左边补0;如果如果 左边为左边为1的话的话,左边就补左边就补1.第16章 文件考点考点1: 文件指针文件指针什么是文件指针?文件指针实际上是指向一个结构体类型的指针。也就是说,该指针中只能存放结构体类型类型变量的地址。文件类型指针变量的定义形式: FILE *指针变量名; 例如:FILE *fp1,*fp2;考点考点2: 文件的打开与关闭文件的打开与关闭文件的打开(fopen)fopen函数
26、的一般调用形式为:fopen( 文件名,文件使用方式 );函数的功能是:返回一个地址值。一个指向FILE类型的指针。也就是说,该函数的 结果只能被赋予文件类型指针变量。 例如:FILE *fp; fp=fopen( “file_a”, “r” ); 若以上函数调用成功,则文件类型指针变量fp就会指向file_a。 否则,fopen函数将返回NULL。 函数中的第二个参数代表我们的fp指针与file_a联系起来之后要对它进行什么样的操作。对文件的操作常用的有两种。一种是“读”-“r”,还有一种就是“写”-“w”。文件的关闭(fclose)fclose函数的一般调用形式为:fclose( 文件指针
27、 ); 当成功地执行了关闭操作,函数返回0,否则返回非0.程序文件输入(读)输出(写)考点考点3: 调用调用putc(或或fputc)函数输出一个字符函数输出一个字符 putc的调用形式: putc( ch, fp ); putc()函数的功能: 将字符ch写到文件指针fp所指的文件中去.如果输出成功,putc函数将返回所输出的字符;如果失败,则返回一个EOF值. putc函数的调用形式和功能与fputc函数完全相同某个字符常量或字符变量文件指针考点考点4: 调用调用getc(或或fgetc)函数输入一个字符函数输入一个字符 getc的调用形式: ch=getc( pf ); putc()函数
28、的功能: 从pf指定的文件中读入一个字符,并把它作为函数返回值. putc函数的调用形式和功能与fputc函数完全相同考点考点5: fscanf和和fprintf函数的应用函数的应用这两个函数和我们前面所学的scanf和printf函数相似.只是这边的两个函数所针对的对象是磁盘上的文本文件.fscanf函数的调用形式为: fscanf( 文件指针,格式控制字符串,输入项表 ); 例如: fscanf( fp, “%d%d”, &a,&b );例子的功能是: 若文件指针fp已指向一个已打开的文本文件, a,b分别为整型变量,上面语句将从fp所指的文件中读入两个整数放入变量a,b中
29、.fprintf函数的调用形式为: fprintf( 文件指针,格式控制字符串,输出项表 ); 例如: fprintf( fp, “%d%d”, x,y );例子的功能是: 若文件指针fp已指向一个已打开的文本文件, x,y分别为整型变量,则上面的语句将把x和y两个整型变量中的整型按%d格式输出到fp所指的文件中.考点考点6: fgets和和fputs函数的应用函数的应用fgets函数的调用形式为: fgets( str, n, fp );fgets函数的功能是: 从fp所指向的文件中读取长度不超过n-1个字符的字符串,并 将该字符串放到数组str中;读入字符串后会自动在字符串末尾 加入(0)结束符,表示字符串结束.fputs函数的调用形式为: fputf( str, fp );fputs函数的功能是: 把字符串输出到fp所指向的文件中.注意: 此函数输出时,字符串中最后的0并不输出,也不自动加0.输出成功函数值为正整数,否则为-1(EOF).文件指针整型变量存放字符串的起始地址文件指针带输出的字符串,可以是字符串常量,字符数组考点考点7: fread和和fwrite函数的应用函数的应用两个函数fread和fwrite的调用形式完全相同.如: fread( buffer, size, count, fp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度注册核安全工程师考试综合练习【各地真题】附答案详解
- 2024-2025学年临床执业医师复习提分资料及答案详解(有一套)
- 2024-2025学年度贵州建设职业技术学院单招数学常考点试卷(综合卷)附答案详解
- 2024-2025学年度执法资格考前冲刺试卷附答案详解(A卷)
- 2024-2025学年医师定期考核真题【历年真题】附答案详解
- 市场推广活动及预算确认函7篇范文
- 2024-2025学年医学检验(士)试题预测试卷附答案详解(巩固)
- 2024-2025学年度护士资格证通关题库附参考答案详解【基础题】
- 2024-2025学年农村信用社招聘考试检测卷附参考答案详解【A卷】
- 汽车维修店汽车发动机保养流程标准手册
- GJB9001C-2017国军标标准培训讲义
- 人教版数学一年级下册第一单元《十几减9》真题同步测试3(含解析)
- 校园网网络工程分析需求报告
- 《杀死一只知更鸟》读书分享PPT
- 级自制书119本13黑今天穿什么
- Premiere 认证题库(整理版)
- 01厨房组织人员管理篇
- 考研考博-英语-华东理工大学考试押题卷含答案详解1
- 胆囊切除术 胆总管切开取石术
- 灭火器消防栓检查维护记录表
- 儿童炎症性肠病
评论
0/150
提交评论