C程序设计复习资料(共21页).doc
精选优质文档-倾情为你奉上C程序设计复习要点第一章概述1. C程序的构成与结构特点2. C程序上机调试过程与流程第二章数据类型、运算量与表达式1. 数据类型的种类(基本数据类型和构造数据类型)2. 常量的数据类型及其表示(表示方法、存储字节数与表数范围)整、实、字符、字符串和转义字符3. 变量的命名、定义方法与赋初值4. 各种表达式及其运算规则优先级、结合性、类型自动转换与强制转换l 算术运算符、表达式及其构造(注意“/”和“%”特殊性)l 自增、自减运算符及其简单表达式运算l 赋值运算符及其表达式(注意复合赋值运算符的运算方法)l 逗号运算符及其表达式第三章流程控制1. 赋值语句的一般形式、赋值过程及赋值规则(注意左右数据类型的一致或兼容)2. 输入和输出函数的格式、功能及用法(只要求常用的格式控制符d, f, c, s),提醒注意:l 格式输出中域宽和小数位数的控制l 格式输入与输出中普通字符的原样输入和输出问题l 熟悉并区别以下函数:putchar()、printf()、puts();getchar()、scanf()、gets()3. 关系运算符及其表达式、逻辑运算符及其表达式和条件运算符及其表达式的运算规则(优先级、结合性)4. 关系表达式与逻辑表达式的构造(根据已知条件写表达式)5. if语句的三种形式:if 语句、if else 语句、if 语句的嵌套l if 语句的格式与用法:简单if、嵌套if、并列ifl 逻辑关系与执行过程l 嵌套规则(重点掌握if else if else if else)6. switch语句的格式与用法7. *熟练使用if和switch语句阅读和编写较为简单的选择结构程序8. 三种循环语句:while() 、do while()、for()的格式、执行过程及其用法l 循环变量初始化、循环条件构造、循环体所要实现的任务和控制变量修改l 注意循环期间与结束时循环控制变量的取值问题9. 结合例题理解和区别break与continue语句的作用及其用法10. 本章涉及的主要算法:累加(计数)、累乘、递推、穷举、判素数、求最大公约与最小公倍等11. *熟练使用三种循环语句并结合以上算法阅读和编写较为简单的循环结构及其嵌套程序第四章复杂数据类型1. 一维、二维数组的定义、初始化及其引用方法(数据输入、输出、存储与处理)2. 字符数组的定义、初始化及其引用(字符串输入、输出、存储与处理)3. 常用字符串处理函数:gets()、puts()、strlen()、strcmp()、strcpy()4. 数组涉及的主要算法:排序、极值、逆序、回文和字符串的连接、复制、求长度等5. *熟练使用数组并结合以上算法阅读和编写较为简单的程序6. 指针的概念:指针、指针变量、指针运算(、&、+、-、+、-)7. 变量、数组和字符串指针的定义、指向与引用(仅限于一维数组)8. 了解指针数组与二级指针的概念和定义9. *能够阅读并理解使用指针进行数据处理的相关程序(极值、逆序、回文和字符串的连接、复制、求长度等)10. 结构体与共用体的概念、定义与引用(仅限概念)第五章 结构化程序设计与应用1. 熟悉程序的三种基本结构:顺序、选择和循环2. *通过其中部分例题掌握选择、循环语句的使用以及循环和数组涉及的主要算法第六章 函数与编译预处理1. 掌握函数的定义、声明和调用方法及参数传递方式2. *结合相关例题掌握一般函数和递归函数的定义与使用3. 熟悉局部变量与全局变量的定义及作用范围,了解各种静态与动态变量的定义、作用范围与生存期4. 了解内部函数与外部函数的定义及调用规则5. 掌握宏定义与宏展开(重点掌握带参数宏的定义与展开)6. 了解文件包含的作用及其使用场合第七章 文件1. 了解文件的概念2. 熟悉文件打开、关闭及各种与文件读写有关函数的格式与用法 特别提醒:以上带*部分主要涉及程序阅读、程序填空和编写程序,其余部分主要以选择和概念填空题出现C语言程序设计参考题型说明:本题仅反映考试的题型,作为考前复习参考。要通过这些典型题目,掌握复习要点中所列内容。所给题目不可死记硬背,而是通过题目掌握其涉及要点和重要算法。一、单项选择题1. C程序的基本构成单位是【 C 】A)文件B)命令C)函数D)语句2. 下列叙述中错误的是【 C 】A)C程序中main( )函数的位置可以任意B)C程序可以由多个程序文件组成, 而一个程序文件又可以由一个或多个函数组成C)每个程序文件都有一个main( )函数D)C程序总是从main( )开始执行,也是由它结束3. 将C源程序转换为目标程序的过程称为【 B 】A)编辑B)编译C)连接D)运行4. C语言中最基本的数据类型包括【 B 】A)整型、实型、逻辑型B)整型、实型、字符型C)整型、逻辑型、字符型D)整型、实型、字符串型5. 以下不合法的用户标识符是【C 】A)j2_KEY B)Double C)4d D)_8_6. C源程序中不能表示的数制是【A 】A)二进制 B)八进制 C)十进制 D)十六进制7. 以下合法的字符常量的是【A 】A)'x13' B)'081'C)'65' D)"n "8. 以下选项中,能用作数据常量的是【 D 】A)o115 B)0118C)1.5e1.5 D)115L9. C语言中,要求运算对象必须是整型数据的运算符是【A 】A)%B)/C)D)&&10. 表示数学关系“xyz”的C语言表达式是【C 】A)x>=y>=zB)x>=y | y>=zC)x>=y&&y>=zD)xyz11. 若变量均已正确定义并赋值,以下合法的C语言赋值语句是【A 】A)x=y=5; B)x=n%2.5; C)x+n=j; D)x=5=4+1;12. 设有定义:int k=0; 以下选项的四个表达式中与其他三个表达式的值不相同的是【 A 】A)k+ B)k+=1 C)+k D)k+113. 若有代数式:以下错误的C语言表达式是【 C 】A)a/b/c*e*3B)3*a*e/b/cC)3*a*e/b*cD)a*e/c/b*314. 设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的数据类型为【C 】A)intB)floatC)doubleD)不确定15. 若p和x已经正确定义,x已赋值,并且p=&x,则下列关系表达式之值为1的是【 B】A)p=xB)*p=xC)&p=xD)*x=p16. 当用户要求输入的字符串中含有空格时,应使用的输入函数是【 C 】A)scanf() B)getchar() C)gets() D)getc()17. 下列能输出字符数组str中字符串的语句是 【 B 】A)printf("%c",str0);B)printf("%s",str);C)printf("%s",str);D)putchar(str);18. 有输入语句:scanf("B%d,%d",&a,&b);为使变量a、b分别为5和3,从键盘输入数据的正确形式为【 B 】A)5 3<回车>B)5,3<回车>C)a=5 b=3<回车>D)a=5,b=3<回车>19. 定义如下变量和数组:int j;int x33=1,2,3,4,5,6,7,8,9;则下面语句的输出结果是【 C 】for(j=2; j>=0; j-)printf("%2d",xj2-j);A)1 5 9B)1 4 7C)7 5 3D)3 6 920. 执行下面程序后,a的值是【 B 】#define SQR(x) x*xvoid main( )int a=10,k=2,m=1;a=SQR(k+m);printf("%dn",a);A)10B)5C)2D)121. 简单if语句的基本形式:if(表达式)语句【D 】其中“表达式”A)必须是逻辑表达式B)必须是关系表达式C)必须是逻辑表达式或关系表达式D)可以是任意合法的表达式22. 在嵌套使用if语句时,C语言规定else总是【 C 】A)和之前与其具有相同缩进位置的if配对B)和之前与其最近的if配对C)和之前与其最近的且不带else的if配对 D)和之前的第一个if配对23. 下列叙述中正确的是【D 】A)break语句只能用于switch语句B)在switch语句中必须使用defaultC)break语句必须与switch语句中的case配对使用D)在switch语句中,不一定使用break语句24. 有以下程序段:x=-1;do x=x*x;while(!x);执行时,循环体执行的次数为【B 】A)0B)1C)2D)不确定25. 以下不正确的if语句形式是【C 】A)if(x>y&&x!=y);B)if(x=y) x+=y;C)if(x!=y) scanf("%d",&x) else scanf("%d",&y);D)if(x<y) x+;y+;26. 以下程序的输出结果是【 C 】void main( )int x=2,y=-1,z=2;if(x<y)if(y<0)z=0;elsez+=1;printf("%dn",z);A)0B)1C)2D)327. 以下能正确计算1×2×3××10的程序段是【 A 】A)i=1,s=1;B)s=1;i=1;dowhile(i<=10)s=s*i;i+; s=s*(+i);while(i<11);C)for(i=1,s=0;i<=10;i+)D)for(i=1,s=1;i+) s=s*i;s=s*i;28. 若j为整型变量,则以下循环执行次数是【 C 】for(j=0;j=0;)printf("%d",j-);A)无限次B)0次C)1次D)2次29. 若有说明:int a10;则对a数组元素的正确引用是【 C 】A)a3.5B)a(8)C)a6-5D)a1030. 若有定义语句:double x5=1.0,2.0,3.0,4.0,5.0, *p=x;则错误引用x 数组元素的是【B 】A)*p B)x5 C)*(p+1) D)*x31. C中,一个char类型的数据在内存中占用的字节数是【A 】A)1 B)2 C)4 D)832. 设有程序段:int k=5;while (k<=0) k-;则下列描述中正确的是【 C 】A)while循环执行5次B)循环是无限循环 C)循环语句一次也不执行D)循环体语句执行一次33. 下面程序段的运行结果是【 B 】char c5= 'a', 'b', '0', 'c', '0' ; printf(“%s”, c);A)'a''b' B)ab C)Abc D)"abc"34. 以下不正确的字符串赋值语句是【C 】A)char *s; s="abcde"B)char s ="abcde"C)char s10; s="abcde"D)char *s="abcde"35. 设p1、p2是指向int型一维数组的指针变量,k为int型变量,以下错误的语句是【 B 】A)k=*p1+*p2;B)p2=k;C)p1=p2;D)k=p2-p1;36. 下面程序的输出结果是【 A 】void main( ) char s = "ABCD" char *p; for (p=s;p<s+4;p+) printf(“%sn”, p);A)ABCDB)AC) DD)ABCDBCDBCABCCDCBABDDAA37. 以下关于C函数的定义和调用描述正确的是【B 】A)函数的定义可以嵌套,但函数的调用不可嵌套B)函数的调用可以嵌套,但函数的定义不可嵌套C)函数的定义和调用均可以嵌套D)函数的定义和调用均不可嵌套38. 以下关于变量的存储类型和作用域说法错误的是【 C 】A)函数内定义的变量默认存储类型为auto,函数调用结束时释放其值B)静态局部变量的生存期虽然被延长,但作用范围依然只限于所在函数内有效C)寄存器变量主要用于使用频度较高的变量,其资源依然使用计算机内存D)外部变量可以跨文件使用,但静态外部变量不允许跨文件使用39. 以下关于变量的作用域叙述不正确的是【D 】A)在函数内部定义的变量是局部变量B)函数中的形式参数是局部变量C)局部变量的作用范围仅限于其所在函数或复合语句D)全局变量的作用范围仅限于其所在的文件40. 以下关于C函数参数说法不正确的是【 B 】A)实参可以是常量、变量和表达式B)形参可以是常量、变量和表达式C)实参和形参可以为任意数据类型D)实参与对应的形参类型一致41. 以下关于C函数返回值的叙述正确的是【 D 】A)被调函数中只有使用return语句才能返回主调函数B)使用一个return语句可以返回多个函数值C)函数返回值类型取决于return语句中的表达式类型D)函数返回值类型取决于定义该函数时所指定的类型42. 以下数组定义中错误的是【 B 】A)int x3=0;B)int x23=1,2,3,4,5,6;C)int x3=1,2,3,4,5,6;D)int x23=1,2,3,4,5,6;43. 若有定义语句:char s10="00"则strlen(s)的值是【A】A)7 B)8 C)9 D)1044. 给定以下程序段:int n=10;while (n>6)n-; printf(“%3d”,n);以上程序段输出结果是【D】A)10 9 8B)9 8 7C)10 9 8 7D)9 8 7 645. 若i,j已定义为int型,则以下程序段中内循环总的执行次数是【C】for (i=5; i>0; i-) for (j=1; j<6; j+) A)30B)24C)25D)2046. 若已定义:float *p, m=3.14159; 则使p指向m正确的赋值语句是【B】A)p=m;B)p=&m;C)*p=m;D)*p=&m;47. 若已定义:char s10; 则下面表达式中不能作为s1地址的是【A】A)s+B)s+1C)&s0+1D)&s148. 已知:int a=3, b=5, t; 要将a和b中的数值进行交换,错误的程序段是【C 】A)a=a+b; b=a-b; a=a-b;B)t=a; a=b; b=t;C)t=a; b=a; a=t;D)t=b; b=a; a=t;49. 关于C程序中的#include <math.h>,错误的描述是【 D 】A)它是C语言的预编译命令B)在程序中该行尾部不需要分号C)用于将math.h包含进来D)math.h是一个函数50. 下列C程序段的输出结果是【C 】int a=0;switch(a)case 0: printf(“a=0”);case 1: printf(“a=1”);default: printf(“default”);A)a=0B)a=0defaultC)a=0a=1defaultD)default51. 已知:int a, x, y; 有语法错误的C语句是【 B 】A)while(x) y+;B)while(x+y=0) a+;C)while(x<y);D)while(y=5) +x;52. 对于do while( )语句,错误的说法是【C 】A)用条件控制循环体的重复执行B)循环体至少要执行一次C)循环体有可能一次也不执行 D)循环体中可以包含若干条语句53. 已知:int a, x, y; 有语法错误的C语句是【 B 】A)while(x) y+;B)while(x+y=0) a+;C)while(x<y);D)while(y=5) +x;54. 已知:int a5, *p=a; 利用p为数组元素a4赋值的正确C语句是【 B】A)scanf(“%d”, p+3);B)scanf(“%d”, p+4);C)scanf(“%d”, *(p+3);D)scanf(“%d”, *(p+4);55. 对于C语句:char *a2=“abcd”, “ABCD”; 叙述正确的是【B 】A)a是指针变量B)a是指针数组C)a是数组指针 D)a是字符串56. 设有如下说明语句:struct ex int x; float y; char z; example;则下面叙述中不正确的是【 B 】A)struct是结构体类型的关键字B)example是结构体类型名C)x, y, z都是结构体成员名D)struct ex是结构体类型名57. 有以下程序#include <stdio.h>struct ord int x,y; dt2=1,2,3,4;void main() struct ord *p=dt; printf(“%d,”,+p->x); printf(“%dn”,+p->y);程序的运行结果是【B 】A)1,2 B)2,3 C)3,4 D)4,158. 设有以下定义【D 】union data short int d1; char d2; demo;则下面叙述中错误的是_。A)变量demo与成员d1所占的内存字节数相同B)变量demo中各成员的地址相同C)变量demo和各成员的地址相同D)若给demo.d1赋256后, demo.d2中的值是25659. 设fp为指向某二进制文件的指针,且已读到此文件末尾,则函数feof(fp)的返回值为【 B 】A)EOF B)非0值 C)0 D)NULL60. 读取二进制文件的函数调用形式为:fread(buffer,size,count,fp); 其中buffer代表的是【C 】A)一个文件指针,指向待读取的文件B)一个整型变量,代表待读取的数据的字节数C)一个内存块的首地址,即读入数据存放的地址D)一个内存块的字节数二、填空题1. 赋值表达式x*=y+5的另一种书写形式为_ x=x*(y+5)_。2. 已知a=10,b=20,c=3,则表达式!a>b | c的值为_1_。3. 表达式(int)(double)(5/2)+2.5)的值是_4_。4. 若j=3,则表达式(+j)+(j+)的值为_8_。5. 若a的原值为4,则表达式“a*=a-=3”运算后,a的值是_1_。6. 若a=5、b=3、c=1,则表达式“a>b>c”的值为_0_。7. 若有定义:int a=7;float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值为_2.5_。8. 整数m既能被3整除又能被4整除的逻辑表达式为_(m%3= =0)&&(m%4= =0) _。9. 写出代数式0<x<1的C逻辑表达式为_(0<x)&&(x<1)_。10. 写出判断字符变量c所存字符是否为字母的逻辑表达式为 c>=a&&c<=z|c>=A&&c<Z 。11. 实现变量a和b交换的语句或语句序列是 a=a+b; b=a-b; a=a-b; 。12. 若整型变量a 和b 中的值分别为7 和9,要求按以下格式输出a和b的值:a=7b=9请完成输出语句:printf("a=%dnb=%d", a, b);13. 若有定义:double a105; 则数组a中行下标最大值为_9_,列下标最大值为_4_。14. 若有定义:int a 1,4,6,5,8,9; 则 *(a+5) 的值为_9_。15. 设有如下定义int a56,*p; 使p指向数组元素a42的语句为_ p=&a42; _。16. 若有定义:int a10,*p=a; 则元素a5的值用p表示的形式是_ *(p+5)_。17. 若有定义:int *p4; 则标识符p表示_长度为4的一维指针数组_。18. 凡是函数中未指定存储类型的局部变量,其默认的存储类型为_ auto _。19. 函数有内部函数和外部函数,函数定义时用来说明该函数仅限本文件调用的关键字是_static_。20. 未加特别说明(说明为静态)的全局变量是外部变量,能被其它文件使用,而在引用它的文件中,需要用关键字_extern_说明。三、程序填空1. 下面程序的功能是:从键盘输入一个字符,若是大写字母,则转换为小写字母并输出,若为小写字母则直接输出,请在_处填上合适内容,使程序完整。include <stdio.h>void main( ) char ch; ch=getchar( ); if (ch>='A'&&ch<='Z ) ch+=32; printf(“%c”, ch);2. 下面程序的功能是:求1100间的偶数和,请在_处填上合适内容,使程序完整。#include <stdio.h>void main( )int num, sum=0; for (num=2; num<=100; num=num+2) _ sum=sum+num ; printf("1-100间的偶数和是:%dn", sum);3. 下面程序段是求n!的递归函数,请将函数补充完整。double fac(int n)double result;if (n= =1)result=1;elseresult= n*fac(n-1);return(result);4. 以下程序的功能是:输入一整数n,判断是否为素数。#include <stdio.h>void main( )int i, n;scanf(“%d”,&n);for (i=2; _i<n_; i+)if (n%i=0)break;if (i>=n)printf(“%d is a prime number.n”, n);elseprintf(“%d is not a prime number.n”, n);5. 如下程序实现字符串逆序,请在_处填上合适内容,使程序完整。#include <stdio.h>#include <string.h>void main()char *p1, *p2, c, s50;scanf(“%s”, s);p1=s;p2=s+strlen(s)-1;for(; p1<p2 ; p1+, p2-) c=*p1;*p1=*p2;*p2=c ;printf(“The new string is %sn”, s);6. 如下程序判断字符串是否回文,请在_处填上合适内容,使程序完整。#include <stdio.h>#include <string.h>void main()char *p1, *p2, c, s50;gets(s);p1=s;p2= s+strlen(s)-1;for(; p1<p2; p1+, p2-)if( *p1!=*p2 ) break;if( p1<p2 )printf(“该字串不回文n”);elseprintf(“该字串回文n”);7. 下列程序用来求任意两整数的最大公约数,请在_处填上合适内容,使程序完整。#include <stdio.h>void main( )int temp, m, n, x;printf("Enter two numbers:n");scanf("%d,%d", &m, &n);if (m<n) temp=m, m=n, n=temp;for(x=n; ; x-)if (m%x=0&&n%x=0) _break_;printf("n最大公约数为:%dn",x);8. 下列程序用“起泡法”对输入的字符串降序排序,请在_处填上合适内容,使程序完整。#include <stdio.h>#include <string.h>void main( )void sort(char *s);char str20;printf("请输入字符串:n");scanf("%s", str);sort(str);printf("排序结果:n");puts(str );void sort(char *s)int i, j, n;char c;n=strlen(s);for(i=0; i<n-1; i+)for(j=i; j<n-i-1; j+)if(sj<sj+1)c=sj, sj=sj+1, sj+1=c;四、阅读程序1. include <stdio.h>void main( )char ch;int cnt1=0,cnt2=0;while (ch=getchar( )!='n')if (ch>='a'&&ch<='z') cnt1+;else cnt2+;printf("COUNT=%dn",cnt1);若输入“This is a C program.”,运行结果:_ COUNT=13_2. #include <stdio.h>void main( )int i, j, temp;int a=0,1,2,3,4,5,6,7,8,9;for(i=0, j=9; i<j; i+, j-)temp=ai; ai=aj; aj=temp;for(j=0; j<10; j+)printf("%2d", aj);运行结果:_9 8 7 6 5 4 3 2 1 0_3. #include <string.h>#include <stdio.h>void main( )char str180="good",str2="morning"int i, j;for(i=strlen(str1),j=0;str2j!='0' i+, j+)str1i=str2j;str1i='0'printf("string1=%s",str1);运行结果:_ string1=goodmorning 4. #include <stdio.h>void main( )int i, j, pos;float val, a10;for(i=0; i<10 ;i+)scanf("%f", &ai);val=a0;for(j=0; j<10; j+)if (aj>val)val=aj; pos=j;printf("Max=%f,position:%d", val, pos);本程序的功能是:从键盘输入10个数存到数组a中,求10个数的最大值及其位置当程序运行时,从键盘输入“1 0 2 9 3 8 4 7 5 6”,运行结果:Max=9.,position:35. #include <stdio.h>float average(int x, int n)int i;float sum=0;for(i=0;i<n;i+)sum+=xi;return(sum/n);void main( )int a5=2,4,6,8,10;float rst;rst=average(a,5);printf("result=%fn",rst);运行结果:result=6._6. 给定如下程序:#include <stdio.h>void main( )char grade;scanf(“%c”, &grade);switch (grade)case 'A': printf("85100n"); break;case 'B': printf("7084n"); break;case 'C': printf("6069n"); break;case 'D': printf("<60n"); break;default: printf("errorn");当程序运行时,从键盘输入“b”,输出的结果是:_error_。7. 给定如下程序:#include <stdio.h>void main( ) int a5=2,5,3,7,6, i, j, t; for (i=0; i<4; i+) for (j=i+1; j<5; j+) if (ai>aj) t=ai; ai=aj; aj=t; for (i=0; i<5; i+)printf(“%3d”, ai);该程序的功能是:将a数组中的元素从小到大排序;输出的结果为:2 3 5 6 7。8. 给定如下程序:#include <stdio.h>void fun( )auto int b=0;static int c=4;b+; c+;printf("b=%d c=%dn", b, c);void main( )int i;for (i=0; i<3; i+)fun( );运行结果是:b=1 c=5b=1 c=6b=1 c=79. 给定如下程序:#include <stdio.h>#include <string.h>void main()char *p1, *p2, c, s50;gets(s);p1=s; p2=s+strlen(s)-1;for(; p1<p2; p1+, p2-)c=*p1; *p1=*p2; *p2=c;printf(“The new string is %sn”, s);此程序的功能是:从键盘输入一字符串存放到数组s中,将此字符串逆序输出。当程序运行时,从键盘输入“abc we #y”,输出的结果是:The new string is y# ew cba10. 给定如下程序:#include <stdio.h>void main()int fun(char *p);char str80;gets(str);printf(“LEN=%dn”, fun(str);int fun(char *p)int n=0;while(*p+)n+;return(n);