C语言word精品文档16页.doc
如有侵权,请联系网站删除,仅供学习与交流C语言【精品文档】第 16 页C语言程序设计复习提纲一、单项选择题和填空题的知识点1、函数是C程序的主要组成部分,函数是C程序的基本单位。一个C语言程序是由一个或多个函数组成的,其中必须包含一个main函数(且只能有一个main函数)。2、程序总是从main函数开始执行的。C语言本身不提供输入输出语句。3、识别不同的常量。(1)整型常量,如100,0,-12(2)实型常量,有两种表示形式。第一,十进制小数形式,如12.45、-56.79。第二,指数形式,即科学计数法。如12.34e -4,其中,字母e前面的部分称为尾数,可以用实型数据表示,后面的部分称为指数,只能用整型数据表示,而字母e既可以是小写的e,也可以是大写的E。(3)字符常量,有两种形式:普通字符和转义字符。普通字符如a,注意字符常量中只能包含一个字符。转义字符是以字符开头,如n,注意它表示的是一个字符。(4)字符串常量,如”Nanjing”。(5)符号常量,是用#define指令定义的。如#define PI 3.1416。一旦定义以后,凡是使用PI的地方,实际上使用的3.1416。4、合法标识符和非法标识符的识别。5、数据类型占用的内存字节数int(基本整型)4unsigned int(无符号基本整型)4short(短整型)2unsigned short(无符号短整型)2long(长整型)4unsigned long(无符号长整型)4signed char(有符号字符型)1unsigned char(无符号字符型)1float4double8long double166、%运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。如8%3的结果为2。7、除%以外的运算符的操作数都可以是任何算术类型。8、自增、自减运算符的使用。参见P53的内容和例子。(单选)9、不同类型数据间的混合运算。参见P54的内容和例子。10、赋值过程中的类型转换。参见P62的内容和例子。(单选)11、o格式符的使用:以八进制整数形式输出数据。x符的使用:以十六进制整数形式输出数据。具体内容参见P73的内容和例子。12、在程序中实现两个变量的值交换的算法。13、a&&b&&c和a|b|c的运算过程。参见P95的具体内容和例子。14、(m=a>b)&&(n=c>d),该式中n的值为多少。参见P95的具体内容和例子。15、判断大写字母的表达式:(ch>=A&&ch<=Z)16、判断小写字母的表达式:(ch>=a&&ch<=z)15、判断数字字符的表达式:(ch>=0&&ch<=9)17、大写字母转换为小写字母:+3218、小写字母转换为大写字母:-3219、P111习题3:求逻辑表达式的值。20、除了可以用数组元素作为函数参数外,还可以用数组名作为函数参数(包括实参和形参)。如果用数组元素作为实参,则向形参变量传递的是数组元素的值;如果用数组名作为实参,则向形参变量传递的是数组首元素的地址。21、三种局部变量的存储位置是不同的:自动变量存储在动态存储区中,静态局部变量存储在静态存储区中,寄存器变量存储在CPU的寄存器中。22、我们将地址形象化地称为“指针”。23、指针变量的值是地址(即指针)。24、如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是p2-p1的值(两个地址之差)除以数组元素的长度。而两个地址不能相加,即p2+p1是无实际意义的。25、可以引用结构体变量中成员的值,具体的引用方式为:结构体变量名.成员名。如:student1.name=”wang”;26、结构体变量所占内存长度是各成员所占内存长度之和,而共用体变量所占的内存长度等于最长的成员的长度。27、根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。28、用fopen函数打开数据文件。29、使用文件的方式:见P335的表10.1。三、名词解释1、程序:程序就是一组计算机能识别和执行的指令,每一条指令使计算机执行特定的操作。2、高级语言:高级语言是接近于人类习惯使用的自然语言和数学语言,又能够被计算机识别和运行的计算机语言。高级语言不依赖于具体的机器,但其不能被计算机直接识别,而必须已经“翻译”。3、常量:常量是指在程序的运行过程中其值不能被改变的量。4、标识符:在计算机高级语言中,用来对变量、符号常量、函数、数组、类型等命名的有效字符序列统称为标识符。5、C算术表达式:用算术运算符和括号将运算对象(即操作数)连接起来,符合C语言语法规则的式子称为C算术表达式。6、输出:输出是指从计算机向输出设备输出数据。7、输入:输入是指从输入设备向计算机输入数据。8、关系运算:所谓关系运算就是比较运算,将两个数值进行比较,判断其比较的结果是否符合给定的条件。9、关系表达式:用关系运算符将两个数值或数值表达式连接起来的式子称为关系表达式。10、逻辑表达式:用逻辑运算符将关系表达式或其他逻辑表达式连接起来的式子称为逻辑表达式。11、数组:数组是一组有序数据的集合。在数组中,各个数据的排列是有一定规律的,下标代表了数据在数组中的序号。12、函数:函数就是功能,每一个函数用来实现一个特定的功能,函数的名字应反映其代表的功能。13、形式参数:在定义函数时函数名后面括号中的变量称为形式参数,也称为虚拟参数。14、实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数称为实际参数,简称实参。实际参数可以是常量、变量或表达式。15、值传递:值传递是单向传递,数据只能由实参传给形参,而不能由形参传给实参。16、局部变量:在一个函数内部定义的变量只在该函数范围内有效,在复合语句中定义的变量也只在该复合语句范围内有效,这些只能在局部范围内有效,超出其所在范围就无效的变量称为局部变量。17、全局变量:在函数之外定义的变量称为外部变量,外部变量是全局变量。全局变量可以为文件中的其他函数所共用,其有效范围为从定义该变量的位置开始到源文件结束。18、数据的存储类别:数据的存储类别是指数据在内存中存储的方式,有静态存储和动态存储之分。19、自动变量:对于在函数中定义的动态局部变量,当该函数被调用时,系统会给它们分配存储空间,在函数调用结束时就自动释放存储空间,这样的局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。20、静态局部变量:对于函数中定义的静态局部变量,当该函数的调用结束后,系统并不释放它们的存储空间,在下一次调用该函数时,这些变量中已经有值了,就是上一次函数调用结束时的值。静态局部变量用关键字static进行声明。21、寄存器变量:为了提高代码的执行效率,C语言允许将局部变量的值存放在CPU中的寄存器中,需要使用时直接从寄存器中取出,而不必再到内存中存取。这种变量称为寄存器变量。寄存器变量用关键字register进行声明。22、变量的作用域:如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域。23、指针:一个变量的地址称为该变量的“指针”。24、指针变量:如果一个变量专门用于存放另一个变量的地址(即指针),则该变量就是“指针变量”。24、结构体类型:在C语言中允许用户自己建立由若干个不同类型数据组成的组合型的数据结构称为结构体。用户使用结构体自定义的数据类型称为结构体类型。25、数据流:输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流。四、简答题1、高级语言经历了哪些发展阶段?答:高级语言经历了非结构化语言、结构化语言和面向对象语言三个不同的发展阶段。非结构化语言没有严格的规范要求,程序中可以随意的跳转。在结构化语言中,程序必须由顺序结构、分支结构和循环结构的基本结构构成,在程序中不能随意的跳转。面向对象语言支持面向对象程序设计方法,适合于处理规模较大的复杂问题。2、一个函数包括哪几个部分?试分别简述之。答:一个函数包括函数首部和函数体两个部分。函数首部包括函数名、函数类型、函数属性、函数参数名和参数类型。函数体包括声明部分和执行部分,其中声明部分包括函数内部局部变量的声明和所调用的函数的声明,执行部分为若干个语句组成的语句组。3、简述标识符的组成规则。答:C语言规定标识符只能由字母、数字和下划线三类字符组成,且第一个字符必须是字母或下划线。4、C语言中基本数据类型有哪些?答:C语言中的基本数据类型包括整型类型和实型类型两大类。其中,整型类型又分为基本整型(int)、短整型(short)、长整型(long)和字符型(char);实型类型又分为单精度实型(float)和双精度实型(double)5、什么是顺序结构?答:在顺序结构中,程序中的各个语句是按照自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必作任何判断。6、简述关系运算符及其优先次序。答:C语言提供了六种关系运算符,分别为<、<=、>、>=、=、!=。其中,前四种运算符的优先级相同且为高优先级,后两种运算符的优先级相同且为低优先级。7、C语言中逻辑值的表示方法。答:C语言编译系统在表示逻辑运算结果时,以数值1代表“真”,以数值0代表“假”;但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。8、什么是逻辑运算符的短路问题?答:在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的值时,该运算符才被执行。9、while循环和do-while循环的区别?答:while循环是先判断循环条件,后执行循环体;而do-while循环是先执行循环体,后判断循环条件。因此,while循环的循环体有可能不执行,即while循环的循环体最少被执行0次,而do-while循环的循环体至少被执行一次。10、for语句的执行过程?答:for语句的一般形式为:for(表达式1;表达式2;表达式3),for语句的具体执行过程为:(1)求解表达式1;(2)求解表达式2,如果表达式2的值为真,则执行循环体;如果为假,则结束循环的执行,转(5)执行。(3)执行循环体;(4)求解表达式3,转(2)继续执行。(5)循环结束,执行for语句的后一个语句。11、break语句和continue语句的区别?答:continue语句是结束本次循环的执行,直接进入下一次循环的执行,而不是终止整个循环的执行。而break语句是结束整个循环的执行,不在判断执行循环的条件是否成立,即直接从循环体内跳转到循环体外。12、定义一个函数应包括哪些内容?答:定义函数应包括以下内容:(1)指定函数的名字,以便通过该函数名调用该函数。(2)指定函数的类型,即函数返回值的类型。(3)指定函数的参数名和类型,以便在调用函数时通过它们传递数据。对无参函数不需要这项。(4)指定函数应当完成的操作。13、函数嵌套调用和递归调用的区别?答:函数的嵌套调用是指一个函数A在其执行过程,调用了另一个函数B,依次类推,在函数B的执行过程中,又调用了另一个函数C。而函数的递归调用其实是一种特殊的嵌套调用,即在函数的嵌套调用的过程中,出现了函数A直接或间接地调用其本身(即函数A)。14、静态存储方式和动态存储方式的区别?答:静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式,而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。在静态存储方式中,数据存储在静态存储区中,在整个程序的执行过程中均有效;而在动态存储方式中,数据存储在动态存储区中,只在整个程序的执行过程中的某一个时间段有效。15、C语言中有哪些存储类别?答:C语言中有四种不同的存储类别,分别为自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。16、什么是共用体类型?答:所谓共用体类型就是将多个变量的内存空间组合在一起,通过使用覆盖技术,使后一个数据的存储覆盖前一个数据的存储,从而实现多个变量共享同一段内存空间,这种逻辑结构类型称为共用体类型。17、什么是枚举类型?答:所谓枚举类型就是指把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。18、什么是文件?答:所谓文件一般指存储在外部存储介质上的数据的集合。19、文件关闭的含义是什么?答:“关闭”文件就是撤消文件信息区和文件缓冲区,使文件指针变量不再指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。五、程序填空题1、求多项式1-1/2+1/3-1/4+1/99-1/100的值。程序:#include <stdio.h>int main()int sign=1,deno=2;double sum=1.0,term;while(deno<=100)sign=-sign;term=1.0*sign/deno;sum=sum+term;deno=deno+1;printf(“%fn”,sum);return 0;2、用数组处理求Fibonacci数列问题。P146 的例6.2#include <stdio.h>int main()int f20=1,1;int i;for(i=2;i<20;i+)fi=fi-1+fi-2;for(i=0;i<20;i+)if(i%5=0)printf("n");printf("%12d",fi);printf("n");return 0;3、有10个数,要求将它们按从小到大的顺序进行排序。P147 的例6.3#include <stdio.h>int main()int a10;int i,j,t;printf("input 10 numbers:n");for(i=0;i<10;i+)scanf("%d",&ai);printf("n");for(j=0;j<9;j+)for(i=0;i<9-j;i+)if(ai>ai+1)t=ai;ai=ai+1;ai+1=t;printf("the sorted numbers:n");for(i=0;i<10;i+)printf("%d ",ai);printf("n");return 0;4、求矩阵的转秩。即将一个矩阵的行和列互换。P152 的例6.4#include <stdio.h>int main()int a23=1,2,3,4,5,6;int b32,i,j;printf("array a:n");for(i=0;i<=1;i+)for(j=0;j<=2;j+)printf("%5d",aij);bji=aij;printf("n");printf("array b:n");for(i=0;i<=2;i+)for(j=0;j<=1;j+)printf("%5d",bij);printf("n");return 0;5、有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。P153的例6.5#include <stdio.h>int main()int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;int i,j,max,row,colum;max=a00;row=0;colum=0;for(i=0;i<=2;i+)for(j=0;j<=3;j+)if(aij>max)max=aij;row=i;colum=j;printf("max=%dnrow=%dncolum=%dn",max,row,colum);return 0;6、有一个3×4的矩阵,要求编程序求出其中值最小的那个元素的值,以及其所在的行号和列号。#include <stdio.h>int main()int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;int i,j,min,row,colum,m,n;min=a00;row=0;colum=0;m=3;n=4;for(i=0;i<m;i+)for(j=0;j<n;j+)if(aij<min)min=aij;row=i;colum=j;printf("min=%dnrow=%dncolum=%dn",min,row,colum);return 0;7、有一个3×4的矩阵,要求编程序求出其各个元素的平均值。#include <stdio.h>int main()int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;int i,j,sum,m,n;double avg=0.0;sum=0;m=3;n=4;for(i=0;i<m;i+)for(j=0;j<n;j+)sum=sum+aij;avg=1.0*sum/(m*n);printf("sum=%dn",sum);printf("avg=%fn",avg);return 0;8、输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。#include <stdio.h>int main()char string81;int i,num=0,word=0;char c;gets(string);for(i=0;(c=stringi)!='0'i+)if(c=' ')word=0;else if(word=0)word=1;num+;printf("There are %d words in this line.n",num);return 0;或者#include <stdio.h>int main()char string81;int i,num=0;char c;gets(string);for(i=0;(c=stringi)!='0'i+)if(c!=' '&&i=0)|(c!=' '&&stringi-1=' ')num+;printf("There are %d words in this line.n",num);return 0;9、用递归方法求n!。#include <stdio.h>int main()int fac(int n);int n,y;printf("input an integer number:");scanf("%d",&n);y=fac(n);printf("%d!=%dn",n,y);return 0;int fac(int n)int f;if(n<0)printf("n<0,data error!");else if(n=0|n=1)f=1;elsef=fac(n-1)*n;return f;10、有一个一维数组,内放10个学生的成绩,写一个函数,当主函数调用该函数后,能求出平均分、最高分和最低分。P201的例7.14。#include <stdio.h>float Max=0,Min=0;int main()float average(float array,int n);float ave,score10;int i;printf("Please enter 10 scores:");for(i=0;i<10;i+)scanf("%f",&scorei);ave=average(score,10);printf("max=%6.2fnmin=%6.2fnaverage=%6.2fn",Max,Min,ave);return 0;float average(float array,int n)int i;float aver,sum=array0;Max=Min=array0;for(i=1;i<n;i+)if(arrayi>Max)Max=arrayi;else if(arrayi<Min)Min=arrayi;sum=sum+arrayi;aver=sum/n;return aver;六、编程题1、输入两个正整数m和n,求其最大公约数和最小公倍数。#include <stdio.h>int main()int m,n,max,min,r,m0,n0;printf("请输入两个正整数m和n:");scanf("%d,%d",&m,&n);m0=m;n0=n;if(m<n)int temp;temp=m;m=n;n=temp;dor=m%n;m=n;n=r;while(r!=0);max=m;min=m0*n0/max;printf("最大公约数为:%dn",max);printf("最小公倍数为:%dn",min);return 0;2、输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。#include <stdio.h>int main()char str20;int alp=0,space=0,dig=0,other=0;int i;printf("请输入一行字符:");gets(str);i=0;while(stri!='0')if(stri>='A'&&stri<='Z')|(stri>='a'&&stri<='z')alp+;else if(stri=' ')space+;else if(stri>='0'&&stri<='9')dig+;elseother+;i+;printf("英文字母的个数为:%dn",alp);printf("空格的个数为:%dn",space);printf("数字的个数为:%dn",dig);printf("其他字符的个数为:%dn",other);return 0;3、输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。#include <stdio.h>int main()int gewei,shiwei,baiwei,temp;for(int i=100;i<1000;i+)temp=i;gewei=temp%10;temp=temp/10;shiwei=temp%10;baiwei=temp/10;if(gewei*gewei*gewei+shiwei*shiwei*shiwei+baiwei*baiwei*baiwei=i)printf("%dt",i);printf("n");return 0;4、写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。#include <stdio.h>float Max=0,Min=0;int main()int length(char string);char string30;int len;printf("Please enter a string:");gets(string);len=length(string);printf("the length of string is %d.n",len);return 0;int length(char string)int len=0;while(stringlen!='0')len+;return len;补充:1、求100之内的所有素数。用函数实现判断一个数是否是素数。#include <stdio.h>#include <math.h>int main()int isSuShu(int number);int i;printf("100之内的素数有:");printf("%dt",2);for(i=3;i<100;i=i+2)if(isSuShu(i)printf("%dt",i);return 0;int isSuShu(int number)int i=2,end;end=(int)sqrt(number);while(i<=end && number%i!=0)i+;return number%i;2、编程实现一维数组的逆序存放。(1)编程实现将一维数组A中所有的元素逆序,注意不能使用另一个数组,只能直接在数组A中完成。#include <stdio.h>int main()const len=10;int arrayAlen=1,2,3,4,5,6,7,8,9,10;int i,j,temp;printf("数组A中原来的值:n");for(i=0;i< len;i+)printf("%d ",arrayAi);printf("n");for(i=0,j= len-1;i<j;i+,j-)temp=arrayAi;arrayAi=arrayAj;arrayAj=temp;printf("数组A中新的值:n");for(i=0;i< len;i+)printf("%d ",arrayAi);printf("n");return 0;(2)编程实现将一维数组A中所有的元素逆序存放到数组B中。#include <stdio.h>int main()const len=10;int arrayAlen=1,2,3,4,5,6,7,8,9,10;int arrayBlen;int i;printf("数组A中的值:n");for(i=0;i<len;i+)printf("%d ",arrayAi);printf("n");for(i=0;i<len;i+)arrayBlen-1-i=arrayAi;printf("数组B中的值:n");for(i=0;i<len;i+)printf("%d ",arrayBi);printf("n");return 0;3、顺序查找,输入下标的位置。求x在数组array中的下标位置。#include <stdio.h>int main()const len=10;int arraylen=1,2,3,4,5,6,7,8,9,10;int i,x;printf("请输入要查找的数据x:");scanf("%d",&x);i=0;while(i<len && x!=arrayi)i+;if(i<len)printf("%d在数组中的下标位置为%d。n",x,i);elseprintf("在数组中不存在%d。n",x);return 0;4、编程实现a、b、c三个数的排序。#include <stdio.h>int main()int a,b,c,temp;printf("请输入要排序的三个数a、b和c:");scanf("%d %d %d",&a,&b,&c);printf("n排序前的三个数为%d,%d,%dn",a,b,c);if(a<b)temp=a;a=b;b=temp;if(a<c)temp=a;a=c;c=temp;if(b<c)temp=b;b=c;c=temp;printf("排序后的三个数为%d,%d,%dn",a,b,c);return 0;5、实现一个字符串中的大小写字母的转换,其余字符不变。(1)将一个字符串中的所有大写字母转换为小写字母,其余字符不变。#include <stdio.h>int main()const len=30;char arraylen;int i,c;printf("请输入一个字符串:");gets(array);i=0;while(c=arrayi)!='0')if(c>='A' && c<='Z')arrayi=arrayi+32;i+;printf("处理后的字符串为:%sn",array);return 0;(2)将一个字符串中的所有小写字母转换为大写字母,其余字符不变。#include <stdio.h>int main()const len=30;char arraylen;int i,c;printf("请输入一个字符串:");gets(array);i=0;while(c=arrayi)!='0')if(c>='a' && c<='z')arrayi=arrayi-32;i+;printf("处理后的字符串为:%sn",array);return 0;(3)将一个字符串中的所有小写字母转换为大写字母,同时将所有的大写字母转换成小写字母,其余字符不变。#include <stdio.h>int main()const len=30;char arraylen;int i,c;printf("请输入一个字符串:");gets(array);i=0;while(c=arrayi)!='0')if(c>='a' && c<='z')arrayi=arrayi-32;else if(c>='A' && c<='Z')arrayi=arrayi+32;i+;printf("处理后的字符串为:%sn",array);return 0;6、字符串的循环加密。P169的习题中的第12题。#include <stdio.h>int main()const len=30;char arraylen;int i,c,temp;printf("请输入一行电文:");gets(array);printf("密码为:%sn",array);i=0;while(c=arrayi)!='0')if(c>='a' && c<='z')arrayi='a'+(26-(arrayi-'a'+1);else if(c>='A' && c<='Z')arrayi='A'+(26-(arrayi-'A'+1);i+;printf("原文为:%sn",array);return 0;7、字符串的复制,不能用函数。P169的习题中的第15题。#include <stdio.h>int main()const len=30;char s1len,s2len;int i,c,temp;printf("请输入一个字符串:");gets(s2);i=0;while(c=s2i)!='0')s1i=s2i;/复制s2中的字符到s1中i+;s1i=s2i;/复制s2中的字符串结束标志0到s1中printf("字符串s2中的内容为:%sn",s2);printf("字符串s1中的内容为:%sn",s1);return 0;