最新C语言练习题(带详解答案)97704.doc
精品资料C语言练习题(带详解答案)97704.一单项选择题1( A )是构成C语言程序的基本单位。A、函数 B、过程 C、子程序 D、子例程2C语言程序从 C 开始执行。 A) 程序中第一条可执行语句 B) 程序中第一个函数 C) 程序中的main函数 D) 包含文件中的第一个函数3、以下说法中正确的是( C )。 A、C语言程序总是从第一个定义的函数开始执行 B、在C语言程序中,要调用的函数必须在main( )函数中定义 C、C语言程序总是从main( )函数开始执行 D、C语言程序中的main( )函数必须放在程序的开始部分4.下列关于C语言的说法错误的是( B ) 。A) C程序的工作过程是编辑、编译、连接、运行 B) C语言不区分大小写。C) C程序的三种基本结构是顺序、选择、循环 D) C程序从main函数开始执行5.下列正确的标识符是(C)。A.-a1 B.ai C.a2_i D.int t58题为相同类型题考点:标识符的命名规则(1) 只能由字母、数字、下划线构成(2) 数字不能作为标识符的开头(3) 关键字不能作为标识符选项A中的“-” ,选项B中“”与“”不满足(1);选项D中的int为关键字,不满足(3)6下列C语言用户标识符中合法的是( B )。 A)3ax B)x C)case D)-e2 E)union选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D中的“-”不满足(1);7下列四组选项中,正确的C语言标识符是( C )。A) %x B) a+b C) a123 D) 123选项A中的“%” ,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2)8、下列四组字符串中都可以用作C语言程序中的标识符的是( A )。 A、print _3d db8 aBc B、Iam one_half start$it 3pai C、str_1 Cpp pow while D、Pxq My->book line# His.age 选项B中的“”,”$” ,选项D中“>”,”#”,”.”,”-”不满足(1);选项C中的while为关键字,不满足(3)9.C语言中的简单数据类型包括(D )。 A、整型、实型、逻辑型 B、整型、实型、逻辑型、字符型 C、整型、字符型、逻辑型 D、整型、实型、字符型10.在C语言程序中,表达式5%2的结果是 C 。 A)2.5 B)2 C)1 D)3详见教材P5253.%为求余运算符,该运算符只能对整型数据进行运算。且符号与被模数相同。5%2=1; 5%(-2)=1;(-5)%2=-1;(-5)%(-2)=-1;/为求商运算符,该运算符能够对整型、字符、浮点等类型的数据进行运算,5/2=211如果int a=3,b=4;则条件表达式"a<b? a:b"的值是_A_。A) 3 B) 4 C) 0 D) 1详见教材P97.表达式1?表达式2:表达式3先计算表达式1,若表达式1成立, 则选择计算表达式2,并表达式2的值作为整个大表达式的值;若表达式1不成立,则选择计算表达式3,并将表达式3的值作为整个大表达式的值此题中的a<b相当于表达式1,a相当于表达式2,b相当于表达式3.a为3,b为4。a<b表达式1成立,因此计算表达式2,并将表达式2的值即a中的值,并作为整个表达式的值,因此整个表达式的值为312若int x=2,y=3,z=4 则表达式x<z?y:z的结果是( B ). A)4 B)3 C)2 D)0 E)113C语言中,关系表达式和逻辑表达式的值是( B ) 。A) 0 B) 0或1 C) 1 D) T或F14. 下面( D )表达式的值为4. A) 11/3 B) 11.0/3 C) (float)11/3 D) (int)(11.0/3+0.5)1416题为同一类型详见教材P5456.(1)相同数据类型的元素进行数学运算(+、-、*、/)得到结果还保持原数据类型。(2)不同数据类型的元素进行数学运算,先要统一数据类型,统一的标准是低精度类型转换为高精度的数据类型。选项A,11与3为两个整数,11/3结果的数据类型也应为整数,因此将3.666666的小数部分全部舍掉,仅保留整数,因此11/3=3.选项B,11.0为实数,3为整数,因此首先要统一数据类型,将整型数据3转换为3.0,转换后数据类型统一为实型数据,选项B变为11.0/3.0,结果的数据类型也应为实型数据,因此选项B 11.0 /3=3.666666选项C,先将整数11强制类型转换,转换为实型11.0,因此选项C变为11.0/3,其后计算过程、结果与选项B同选项D,首先计算11.0/3,其计算过程、结果与选项B同,得到3.666666;再计算3.666666+0.5=4.166666,最后将4.166666强制类型转换为整型,即将其小数部分全部舍掉,结果为415.设整型变量 a=2,则执行下列语句后,浮点型变量b的值不为0.5的是( B)A.b=1.0/a B.b=(float)(1/a) C.b=1/(float)a D.b=1/(a*1.0)16. 若“int n; float f=13.8;”,则执行“n=(int)f%3”后,n的值是(A)A.1 B.4 C.4.333333 D.4.6“(int)f“表示将f中的值强制类型转换为整型,即将13.8的小数部分舍掉,转换为13;然后计算13%3,结果为1,再将结果赋给变量n,因此n的值为117. 以下对一维数组a的正确说明是: D A) char a(10); B) int a; C)int k5,ak; D)char a3=a,b,c;详见教材P143144,一维数组的定义、初始化类型符 数组名 常量表达式类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;常量表达式是指数组的长度(数组中包含元素的个数),其值只能是整数,不可以是变量,而且从1开始计数。选项A,常量表达式只能放在中括号 中选项B,只有在对数组初始化(即赋值)的时候才可以省略数组的长度,B中并未对a进行初始化。选项C,常量表达式不能为变量。18.以下能对一维数组a进行初始化的语句是: ( C ) A. int a5=(0,1,2,3,4,) B. int a(5)= C. int a3=0,1,2 D. int a5=10*1详见教材P145,一维数组的定义、初始化选项B,D,常量表达式只能放在中括号 中选项A,数组可以看做是若干个相同数据类型元素的有序集合,因此以集合的形式对其初始化,使用 对其初始化,选项A用了().19.在C语言中对一维整型数组的正确定义为 D 。 A)int a(10); B)int n=10,an; C)int n;an; D)#define N 10 int aN; 20、已知:int a10; 则对a数组元素的正确引用是( D )。 A、a10 B、a3.5 C、a(5) D、a0详见教材P144,数组元素的引用数组名下标引用数组元素时, 中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数int a10表示定义了一个包含10个整型数据的数组a,数组元素的逻辑地址下标范围为09,即a0 表示组中第1个元素; a1 表示组中第2个元素; a2 表示组中第3个元素; .;a9 表示组中第10个元素.选项A,超过了数组a的逻辑地址下标范围;选项B,逻辑地址下标只能为整数选项C,逻辑地址下标只能放在 中21.若有以下数组说明,则i=10;aai元素数值是(C)。int a12=1,4,7,10,2,5,8,11,3,6,9,12;A.10 B.9 C.6 D.5先算aai内层的ai,由于i=10,因此ai即a10. a10对应下面数组中的元素为9. 因此aai即为a9a9对应下面数组中的元素为6. 因此a9即为622.若有说明:int a3=1,2,3,4,5,6,7; 则数组a的第一维的大小为: ( B ) A. 2 B. 3 C. 4 D.无确定值5 7 D) 3 6 9二维数组的一维大小,即指二维数组的行数,在本题中,按行对二维数组赋值,因此内层有几个大括号,数组就有几行23.对二维数组的正确定义是( C)详见教材P149152,二维数组的定义、初始化类型符 数组名 常量表达式常量表达式二维数组可以看做是矩阵类型符是指数组中数组元素的类型;数组名要符合标识符命名规则;第一个常量表达式是指数组的行数;第二个常量表达式是指数组的列数;常量表达式的值只能是整数,不可以是变量,而且从1开始计数。一维数组初始化时可以省略数组长度二维数组初始化时可以省略行数,但不能省略列数选项A,B,都省略了列数选项D,不符合二维数组定义的一般形式,行、列常量表达式应该放在不同的中 A.int a =1,2,3,4,5,6; B.int a2 =1,2,3,4,5,6;C.int a 3=1,2,3,4,5,6; D.int a2,3=1,2,3,4,5,6;24已知int a34;则对数组元素引用正确的是_C_ A)a24 B)a1,3 C)a20 D)a(2)(1) 详见教材P150,数组元素的引用数组名下标 下标引用数组元素时, 中的下标为逻辑地址下标,只能为整数,可以为变量,且从0开始计数第一个下标表示行逻辑地址下标,第二个下标表示列逻辑地址下标。本题图示详见P149图6.7因此a的行逻辑地址范围02;a的列逻辑地址范围03;选项A,列逻辑地址下标超过范围选项B,D,的引用形式不正确。25.C语言中函数返回值的类型是由 A 决定的. A)函数定义时指定的类型 B) return语句中的表达式类型 C) 调用该函数时的实参的数据类型 D) 形参的数据类型26. 在C语言中,函数的数据类型是指( A )A 函数返回值的数据类型 B. 函数形参的数据类型C 调用该函数时的实参的数据类型 D.任意指定的数据类型27. 在函数调用时,以下说法正确的是( B)A.函数调用后必须带回返回值B.实际参数和形式参数可以同名C.函数间的数据传递不可以使用全局变量D.主调函数和被调函数总是在同一个文件里28. 在C语言中,表示静态存储类别的关键字是: ( C )A) auto B) register C) static D) extern29未指定存储类别的变量,其隐含的存储类别为( A )。 A)auto B)static C)extern D)register 30. 若有以下说明语句: struct student int num; char name ; float score; stu; 则下面的叙述不正确的是: ( D )A. struct是结构体类型的关键字 B. struct student 是用户定义的结构体类型C. num, score都是结构体成员名 D. stu是用户定义的结构体类型名31.若有以下说明语句: struct date int year; int month; int day; brithday; 则下面的叙述不正确的是_C_.A) struct是声明结构体类型时用的关键字 B) struct date 是用户定义的结构体类型名C) brithday是用户定义的结构体类型名 D) year,day 都是结构体成员名32. 以下对结构变量stul中成员age的非法引用是 B struct student int age;int num;stu1,*p;p=&stu1;A) stu1.age B) student.age C) p->age D) (*p).age33.设有如下定义:struck sk int a;float b;data;int *p;若要使P指向data中的a域,正确的赋值语句是 C A) p=&a;B) p=data.a;C) p=&data.a;D)*p=data.a;34.设有以下说明语句: typedef struct stu int a; float b; stutype; 则下面叙述中错误的是( D )。 A、struct是结构类型的关键字 B、struct stu是用户定义的结构类型 C、a和b都是结构成员名D、stutype是用户定义的结构体变量名41. 在C语言中,以 D 作为字符串结束标志A)n B) C) 0 D)0 42.下列数据中属于“字符串常量”的是(A )。A.“a” B.ABC C.abc0 D.a若干个字符构成字符串在C语言中,用单引号标识字符;用双引号标识字符串选项B,C,分别用和标识字符串选项D,标识字符。43.已知char x="hello", y='h','e','a','b','e', 则关于两个数组长度的正确描述是 B .A)相同 B)x大于y C)x小于y D)以上答案都不对C语言中,字符串后面需要一个结束标志位'0',通常系统会自动添加。对一维数组初始化时可采用字符串的形式(例如本题数组x),也可采用字符集合的形式(例如本题数组y)。在以字符串形式初始化时,数组x不尽要存储字符串中的字符,还要存储字符串后的结束标志位,因此数组x的长度为6;在以字符集合形式初始化时,数组y,仅存储集合中的元素,因此数组y长度为54编程计算13599的值main() int i, sum = 0;i=1;while ( i<100 )sum = sum + i; I=i+2 ; printf("sum=%dn", sum);5从键盘输入一个字符,判断它是否是英文字母。#include <stdio.h> void main()char c; printf("input a character:"); c=getchar();if(c>= A &&c<= Z | c>=a &&c<= z) printf("Yesn"); else printf("No");6. 下面程序的功能是在a数组中查找与x值相同的元素所在位置,请填空。 #include <stdio.h> void main() int a10,i,x; printf(“input 10 integers:”); for(i=0;i<10;i+) scanf(“%d”,&ai); printf(“input the number you want to find x:”);scanf(“%d”, &x ); for(i=0;i<10;i+)if( x=ai )break; if( i<10 ) printf(“the pos of x is:%dn”,i); else printf(“can not find x!n”); 7程序读入20个整数,统计非负数个数,并计算非负数之和。 #include <stdio.h> main( ) int i, a20, s, count; s=count=0; for(i=0; i<20; i+) scanf(“%d”, &ai ); for(i=0; i<20; i+) if( ai<0 ) continue ; s+=ai ; count+; printf(“s=%dt count=%dn”, s, count”); 8. 输入一个正整数n (1<n10),再输入n个整数,用选择法将它们从小到大排序后输出。 #include <stdio.h>int main(void) int i, index, k, n, temp; /* 定义1个数组a,它有10个整型元素*/ printf(“Enter n: "); printf(“Enter %d integers: ", n); for(i = 0; i < n; i+) scanf("%d", &ai); for(k = 0; k < n-1; k+) /* 对n个数排序 */ index = k; for( ) if( ) index = i; printf("After sorted: "); for(i = 0; i < n; i+) /* 输出n个数组元素的值 */ return 0; 一、 程序改错一、 下面每个程序的划线处有语法或逻辑错误,请找出并改正,使其得到符合题意的执行结果。求1234nmain() long int sum; / /若定义变量的语句有错误,常见考点有两个:(1)变量的类型,(2)在定义用于存放运算结果的变量时,一定要赋初值。一般赋值0或者循环初值。int n,i=1;scanf("%d",n); /若scanf语句有错误,常见考点有两个:(1)格式声明符号要与后面欲赋值的变量的类型一致,此题%d与n的类型int一致(详见p69-78);(2)变量的前面要有地址符号&printf(“n”);while(i<n) / 循环条件用于控制循环的次数,若以i<n 为循环条件,则意味着i的终值为n-1, 由于且i初值为1,因此一共能够循环n-1次。比要求少了1次,因此应改为i<=n 或者i<n+1 sum=sum*i; / 若不为sum赋初值,则此处无法计算sum*i。i+;printf("sum=%d",sum); /若printf语句有错误,常见考点有1个:格式声明符号要与后面欲输出的变量的类型一致,此题%d与sum的类型long int不一致,应改为%ld(详见p69-78);sum应初始化 即加入sum=1 第四行改为:scanf(“%d”,&n);第六行改为:while(i<=n)或者 while(i<n+1)第十行改为:printf("sum=%ld",sum); 2求一个数组中最大值及其下标。main( ) int max,j,m; int a5; for(j=1;j<=5;j+) / j=1为循环变量j赋初值为1,同时用j作为数字元素的逻辑地址下标。因此输出的时候只能从a1开始输出,无法输出a0.因此应将j赋初值0,相应的循环条件改为j<5或者j<=4用于控制循环执行5次 scanf(“%d”,a); /若scanf语句有错误,常见考点有两个:(1)格式声明符号要与后面欲赋值的变量的类型一致,此题%d与a的类型int一致(详见p69-78);(2)变量的前面要有地址符号& max=a0; for(j=1;j<=5;j+) /修改思路与上一个for语句同 if(ma 下标存 在了m里 第四行改为:for(j=0;j<5;j+)第五行改为:scanf(“%d”,&aj);第七行改为:for(j=1;j<5;j+)第八行改为:if(max<aj)第十三行改为:printf(“下标:%dn最大值:%d”, m,max) 3用一个函数求两个数之和。sum(x,y) /函数定义的一般形式p173-174 float z;z=x+y;return; /return语句后面可以返回0、常量、变量和表达式的值。main() float a,b;int c; / /若定义变量的语句有错误,常见考点有两个:(1)变量的类型,(2)在定义用于存放运算结果的变量时,一定要赋初值。一般赋值0或者循环初值。scanf("%f,%f",&a,&b);c=sum(a,b);printf("nSum is %f",sum); 第一行改为:float sum(float x, float y ); 第四行改为:return(z);或者return z; 第八行:float c; 第十一行:printf("nSum is %f",c);4 程序读入20个整数,统计非负数个数,并计算非负数之和.#include “stdio.h”main() int i, s , count ,n=20;int an; /数组定义的一般形式,详见p143, 其中的常量表达式不能为变量 s=count=1; for( i=1, i<20, i- -) / for语句的格式,三个表达式之间用分号,且分号不可省略 scanf(“%d”, ai ); /若scanf语句有错误,常见考点有两个:(1)格式声明符号要与后面欲赋值的变量的类型一致,此题%d与n的类型int一致(详见p69-78);(2)变量的前面要有地址符号& for(i=0;i<20;i+) if(ai<0) break; / break与continue的区别 p128. 在改错题中若错误出现在break语句,则通常是将break换为continue;反之,若错误出现在continue,通常是将其换为break s +=ai;count+; printf(“s=%f count=%fn”, s, count); /若printf语句有错误,常见考点有1个:格式声明符号要与后面欲输出的变量的类型一致答案:int a20s=count=0;for(i=0;i<20;i-)scanf(“%d”,&ai);continue;printf(“s=%d count=%dn”,s,count);5. 从键盘输入整数x的值,并输出y的值. main() float x,y; scanf(“%d”,&x); y=3.5+x; printf(“y=%d”); 正确的: int x; float y; printf(“y=%f”,y); 6 编程计算下面分段函数, 输入x, 输出ymain() int x,y; printf(“n Input x:n”); scanf(“%d”, x); / 错误同上题scanfif(x<0) y=x-1;else if(x>=0|x<=10) / |表示逻辑或,当左边表达式成立或者右边表达式成立时,整个表达式成立。 &&表示逻辑与,当左边表达式和右边表达式同时成立时,整个表达式成立。此处用逻辑表达式来表示x的区间0,10, 因此应改用逻辑与符号 y=2x-1; / C语言中乘号不能省略,且用*表示乘法运算else y=3x-1; / C语言中乘号不能省略,且用*表示乘法运算printf(“y=%d”,&y); /printf与scanf不用,printf后面给出的是变量名列表或表达式列表,无需地址符号第一处改为:scanf(“%d”,& x);第二处改为:x>=0&&x<=10第三处改为:y=2*x-1;第四处改为:y=3*x-1;第五处改为:printf(“y=%d”,y);7. 求100300间能被3整除的数的和。 main() int n;long sum; / /若定义变量的语句有错误,常见考点有两个:(1)变量的类型,(2)在定义用于存放运算结果的变量时,一定要赋初值, 一般赋值0或者循环初值。 for(n=100,n<=300,n+) / for语句的格式,三个表达式之间用分号,且分号不可省略 if(n%3=0) / = 是赋值符号,用于将右边的值赋给左边的变量;= 是关系符号,用来判断两个值是否相等 。改错中if后面表达式中的赋值符号是常见的考点。 sum=sum*n; printf(“%ld ”,sum); 第一处改为:long sum=0;第二处改为:for(n=100;n<=300;n+)第三处改为:if(n%3=0)第四处改为:sum=sum+n;8. 求表达式的值#include <stdio.h>#include <math.h>int fun(int x, int y);main()int a,b; float f;scanf(“%d,%d”,a,b); /与改错第1题中的scanf错误相同if(ab>0) / C语言中乘号不能省略,且用*表示乘法运算fun(a,b); / 调用带有返回值的函数,应将函数的返回值保存在变量里printf("The result is:%dn", &f) /与第6题中printf错误相同 else printf(“error!”);fun(x, y) / 定义函数的一般形式p173-174 float result; result = sqrt(a+b); return; /return语句后面可以返回0、常量、变量和表达式的值。第一处改为:if(a*b>0)第二处改为:f= fun(a,b); 第三处改为:printf("The result is:%dn",f);第四处改为:float fun(int x, int y)第五处改为:f= fun(a,b); 第六处改为:result = sqrt(a*b);第七处改为:return result;二、 编程题 1.输入2个整数,求两数的平方和并输出。 #include <stdio.h> int main(void) intt a ,b,s; printf("please input a,b:n"); scanf("%d%d”,&a,&b); s=a*a+b*b;printf("the result is %dn",s);return 0; 2. 输入一个圆半径r,当r>0时,计算并输出圆的面积和周长,否则,输出提示信息。#include <stdio.h> #define PI 3.14 int main(void) double r ,area , girth; printf("please input r:n"); scanf("%lf",&r); if (r>=0) area =PI*r*r; girth =2*PI*r ; printf("the area is %.2fn", area);printf("the girth is %.2fn", girth);else printf("Input error!n"); return 0; 3、已知函数y=f(x),编程实现输入一个x值,输出y值。 2x+1 (x<0) y= 0 (x=0) 2x-1 (x>0) #include <stdio.h>void main() int x,y;scanf(“%d”,&x);if(x<0) y=2*x+1;else if(x>0) y=2*x-1;else y=0;printf(“%d”,y);4.从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80score<90,等级为B;70score<80,等级为C;60score<70,等级为D;score<60,等级为E。 #include <stdio.h>void main()int data; char grade; printf("Please enter the score:");scanf("%d”, &data); switch(data/10) case 10: case 9 : grade=A; break; case 8: grade=B; break;case 7: grade=C; break; case 6: grade=D; break; default: grade=E; printf("the grade is %c”,grade);5.