C语言期中考试题目及答案
一、选择题:
【1】在C语言中,用户能使用的正确标识符是。
A) 5f B) _for C) struct D) _f.5
答案:B
分析:标识符只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线;大小写敏感;不能使用关键字;最长32个字符。
【2】以下是正确的C语言常量。
A) 0678 B) '\0101' C) 1.2E3.5 D) 123L
答案:D
【3】以下对C语言源程序有关常识正确的描述是。
A)main函数必须位于文件的开头
B)每个语句必须单独一行
C)标识符中大小写字母没有区别
D)宏定义#define部分不一定要放在程序的最开头位置
答案:D
【4】以下for循环的执行次数是。
for(x=0,y=0;(y=123)&&(x<4);x++)
A)是无限循环B)循环次数不定C)执行4次D)执行3次
答案:C
分析:若要判断(y=123)&&(x<4)假,因为y=123永远为真,所以只需要判断x<4为假即可。【5】对for(表达式1;;表达式3)可理解为。
A)for(表达式1;0;表达式3)
B)for(表达式1;1;表达式3)
C)for(表达式1; 表达式1;表达式3)
D)for(表达式1; 表达式3;表达式3)
答案:B
【6】设有程序段
int k=10;
while(k=0) k=k-1;
则下面描述中正确的是。
A)while循环执行10次B)循环是无限循环
C)循环体语句一次也不执行D)循环体语句执行一次
答案:C
分析:因为k=0为假,所以程序不执行其后的语句。
【7】C语言中while和do-while循环的主要区别是。
A) do-while的循环体至少无条件执行一次
B) while的循环控制条件比do-while的循环控制条件严格
C) do-while允许从外部转到循环体内
D) do-while的循环体不能是复合语句
答案:A
【8】设有:int a=1,b=2,c=3,d=4,m=2,n=2;执行(m=a>b)&&(n=c>d)后n的值为。
A)1 B)2 C)3 D)4
答案:B
分析:对于&&运算,只要第一个操作数为假,就不判定第二个操作数。对于||运算,只要第一个操作数为真,就不判定第二个操作数。上题中m=a>b为假,则n=c>d没有被判定,所以n的值仍为2。
【9】以下程序运行后,a和b的值分别为:
#include
main()
{int a,b;
a=10%3,b=5;
printf(“%%%d,%%%%d”, a , b);
}
A)%%1,%%%5 B)%1,%%d C)%%3,%%5 D)1,5
答案:B
分析:如果两个%连在一起,则输出一个%
【10】在以下运算符中,优先级最高的运算符是()
(A) <= (B) /(C) != (D) &&
答案:B
【11】下列对一维数组a的正确说明语句为。
A) int a(10); B) int n=10, a[n];
C) int n; D) #define SIZE 10
scanf("%d", &n); int a[SIZE];
int a[n];
答案:D
分析:数组名后面的[]是数组的标志,不能用圆括号或其它符号代替;数组元素的个数必须是一个固定的值,可以是整型常量、符号常量或整型常量表达式,不能是变量。
【12】下面程序段的输出结果是
int i;
int x[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++) printf("%d",x[i][2-i]);
A)1 5 9 B)1 4 7 C)3 5 7 D) 3 6 9
答案:C
分析:
数组x[3][3]的元素分别为:x[0][0] x[0][1] x[0][2]
x[1][0] x[1][1] x[1][2]
x[2][0] x[2][1] x[2][2]
对数组初始化后对应的值为: 1 2 3
4 5 6
7 8 9
当i=0时,x[i][2-i]= x[0][2]=3
当i=1时,x[i][2-i]= x[1][1]=5
当i=2时,x[i][2-i]= x[2][0]=7
当i=3时,条件不成立,程序退出。
二、填空题:
【1】main()
{ int a=5;float x=5.3,y=6.6;
printf("%.2f",x+a%3*(int)(x+y)%2/4);}
答案:5.30
分析:算术运算符结合方向为自左向右,并注意格式控制。
【2】main()
{ int a=1,b=2,m=2,n=2;
(m=a>b)&&++n;
printf(“%d\n”,n++);}
答案:2
分析:对于&&运算,只要第一个操作数为假,就不判定第二个操作数。所以n的值为2,表达式n++的值也为2。
【3】main()
{ int x=1,y=0;
y=(x-->(y+x)?10:12.5>y++?20:30);
printf("%d",y);}
答案:10
分析:关系运算符的优先级高于条件运算符,条件运算符的结合方向为自右向左。--x>(y+x)或x-->(y+x)之类结构中,右边的x应为自减后的值。如表达式x>(y+x)?10:12.5>y++?20:30; 的值为20;表达式--x>(y+x)?10:12.5>y++?20:30; 的值为20。
【4】main()
{ int n=0;
while (n<=2)
{ n++;
printf(“%d”,n);
}
}
答案:123
分析:{ n++; printf(“%d”,n);}为while语句的循环体部分,当n=0时条件成立,执行n++后n 的值变为1,并输出1;当n=1时条件成立,执行n++后n的值变为2,并输出2;当n=2时条件成立,执行n++后n的值变为3,并输出3;n=3时条件不成立,程序退出。
【5】main()
{ int i=0;
do
{ printf(“*”);
i++;
if (i>3) break;
} while (1);
printf(“\n”);
}
答案:****
分析:此题中的while (1)永远为真,程序结束依靠break来控制,循环体语句为{ printf(“*”); i++;if (i>3) break; },当i的值分别为0,1,2,3时,程序循环四次,输出****;当i的值
为4时,i>4为真,退出整个程序。
【6】main()
{ int a,i;
for ( a=1,i=-1; -1<=i<1;i++)
{ a++;printf(“%d”,a);}
printf(“%d”,i);
}
答案:-1
分析:此题中for的循环体语句为{ a++;printf(“%d”,a);}。当i=-1时,-1<=i<1为0(为假),则不执行{ a++;printf(“%d”,a);},也就不输出a的值,所以只输出i的值为-1。
【7】main()
{ int i,x;
for ( i=1,x=1;i<=50;i++)
{ if (x>=10) break;
if (x%2==1)
{ x+=5; continue;}
x-=3;
}
printf(“x=%d,i=%d\n”,x,i);
}
答案:x=10,i=6
分析:break的功能是退出整个循环,结束程序的执行;而continue的功能是退出本次循环,进入下次循环。此题可用变量跟踪法来求解:i x x%2 x+=5 x-=3
1 1 1 6
2 6 0 3
3 3 1 8
4 8 0 5
5 5 1 10
6 10 则if (x>=10) break;条件成立,退出整个循环。
【8】以下程序的运行结果是。
main()
{ int i, v1=0, v2=1, v3=2;
for(i=1; i<10; i++)
{ switch ( i% 4)
{ case 1: v1++;
case 2: v2++; break;
default: v3++;
}
}
printf("%d,%d,%d\n ",v1,v2,v3);
}
答案:3,6,6
分析:用变量分析法如下:
i i% 4 v1 v2 v3
1 1 1 2
2 2 3
3 3 3
4 0 4
5 1 2 4
6 2 5
7 3 5
8 0 6
9 1 3 6
【9】执行以下程序后,输出结果是多少?
main()
{int j,k,s;
for(k=2;k<6;k++,k++)
{s=1;
for(j=k;j<6;j++) s+=j;
}
printf("%d",s);
}
答案:10
分析:此题要注意每循环一次,s的值就变为1,要得到s的值只需要看最后一次循环后s 的值即可。当k=4时,j分别等于4和5,当j=4时,s+=j的值为5;当j=5时,s+=j的值为10。
【10】以下程序的运行结果是。
main()
{int i=0;
do { + + i;
if (i % 2!=0) printf("%d,",i);
}while (i<=15)
答案:1,3,5,7,9,11,13,15
分析:用变量跟踪法进行分析:
i + + i i % 2!=0 是否执行printf("%d,",i)
0 1 真是
1 2 假否
2 3 真是
3 4 假否
4 5 真是
5 6 假否
6 7 真是
7 8 假否
8 9 真是
9 10 假否
10 11 真是
11 12 假否
12 13 真是
13 14 假否
14 15 真是
15 16 条件不成立,退出程序。
三、程序填空
输入一个正整数,求该数各位之和,如输入3256, 求得3+2+5+6=16。
main()
{ int i,t= 【1】;
scanf(“%d”,&i);
while( 【2】){t+= 【3】; i/=10;}
printf(“%d\n”,t);
}
答案:【1】0 【2】i>0 【3】i%10
分析:本题定义i为输入的整数,t为各位数字之和。
四、编程题:
编程求“卖西瓜”问题。
问题:有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?
参考答案一:(其中d为天数,s为西瓜数量)
main()
{int d,s=1020;
for(d=0;s>=0;d++)
s=s/2-2;
printf("%d",d);
}
参考答案二:(其中day为天数,sum为西瓜数量)
main()
{int day,sum;
day=0,sum=0;
while(sum<=1020)
{sum=sum*2+4;day++;}
printf("%d",day);
}
指针 一、单项选择题 1. 已知:int a, *y=&a;则下列函数调用中错误的是。 A) scanf("%d", &a);B) scanf("%d", y); C) printf("%d", a);D) printf("%d", y); 2. 说明语句"int (*p)( );"的含义是。 A) p是一个指向一维数组的指针变量 B) p是指针变量,指向一个整型数据 C) p是一个指向函数的指针,该函数的返回值是一个整型 D) 以上都不对 3. 设有说明int (*p)[4];其中的标识符p是。 A) 4个指向整型变量的指针变量 B) 指向4个整型变量的函数指针 C) 一个指向具有4个整型元素的一维数组的指针 D) 具有4个指向整型变量的指针元素的一维指针数组 4. 已知:char s[10], *p=s,则在下列语句中,错误的语句是。 A) p=s+5;B) s=p+s;C) s[2]=p[4];D) *p=s[0]; 5. 已知:char s[100];int i;则引用数组元素的错误的形式是。
A) s[i+10] B) *(s+i) C) *(i+s) D) *((s++)+i) 6. 已知:char s[6], *ps=s;则正确的赋值语句是。 A) s="12345";B) *s="12345";C) ps="12345";D) *ps="12345"; 7. 已知:char a[3][10]={"BeiJing","ShangHai","TianJin"}, *pa=a;不能正确显示字符串"ShangHai"的语句是。 A) printf("%s",a+1);B) printf("%s",*(a+1)); C) printf("%s",*a+1);D) printf("%s",&a[1][0]); 8. 已知:int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*ptr)[3]=a,*p=a[0]; 则以下能够正确表示数组元素a[1][2]的表达式是。 A) *(*(a+1)+2) B) *(*(p+5)) C) (*ptr+1)+2 D) *((ptr+1)[2]) 9. 已知:int a[ ]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a;则值为3的表达式是。 A) p+=2,*(p++) B) p+=2,*++p C) p+=2,*p++ D) p+=2,++*p 10. 已知:int a[]={1,2,3,4}, y, *p=a;则执行语句y = (*++p)--;之后, 数组a各元素的值变为。 A) 0,1,3,4 B) 1,1,3,4 C) 1,2,2,4 D) 1,2,3,3 变量y的值是。 A) 1 B) 2 C) 3 D) 4
C语言试题1 一填空题(15分) 1.设x的值为15,n的值为2,则表达式x%=(n+=3)运算后,x的值为()。 2.设int a=7,b=9,t;执行完表达式t=(a>b)?a:b后,t的值是()。 3.下面程序段的输出结果是()。 int a=1234; a=a&0377; printf(“%d %o\n”,a,a); 4.a数组定义如下,按照内存排列顺序,a数组中的所有元素是()。 char a[3]; 5.设有以下宏定义,则执行赋值语句a=PP*20;(a为int型变量)后,a的值是()。 #define PR 80 #define PP PR+403 6.在C程序中,可以通过三种运算方式为指针变量赋地址值,它们是:()、()和()。7.在C文件中,数据存在的两种代码形式是()和()。 8.C语言中调用()函数打开文件,调用()函数关闭文件,调用()函数可实现文件的随机读写。 9.若有int a[3]={10,12,30};则a+1是()的地址,*(a+2)=()。 二判断对错(5分,对的划“√”,错的划“×” 1.在Turbo C中,整型数据在内存中占2个字节。() 2.表达式1/4+2.75的值是3。() 3.结构体类型只有一种。() 4.函数若无返回值,则它一定无形参。() 5.C语言只能处理文本文件和二进制文件。() 三选择题(20分) 1.设int a=12; 表达式a+=a-=a*=a的值是()。 A 12 B 144 C 0 D 132 2.以下程序的输出结果是()。 main( ) { int a=011; printf(“%d\n”,++a); } A 12 B 11 C 10 D 9 3.以下程序的输出结果是()。 #define ADD(x) (x)+(x) main() { int a=4,b=6,c=7,d=ADD(a+b)*c; printf(“d=%d”,d); } A d=70 B d=140 C d=280 D d=80 4.下面的选项中正确的赋值语句是(char a[5],*p=a;)()。 A p=“abcd”; B a=“abcd”; C *p=“abcd”; D *a=“abcd”; 5.若k为整形,则while循环执行()次。 k=2; while(k==0) printf(“%d”,k); k--; printf(“\n”); A 10 B 9 C 0 D 1
1、以下正确的说法是( B ) (A) 用户若需要调用标准库函数,调用前必须重新定义 (B) 用户可以重新定义标准库函数,若如此,该函数将失去原有含义 (C) 系统根本不允许用户重新定义标准库函数 (D) 用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调 2、以下正确的函数声明形式是( A ) (A) double fun(int x, int y) (B) double fun(int x; int y) (C) double fun(int x, int y); (D) double fun(int x,y); 3、以下正确的函数形式是( D ) (A) double fun(int x, int y) { z=x+y; return z;} (B) fun(int x,y) { int z; return z;} (C) fun(x,y) { int x,y; double z; z=x+y; return z;} (D) double fun(int x, int y) { double z; z=x+y; return z;} 4、以下正确的说法是( A ) 在C语言中 (A) 实参和与其对应的形参各占用独立的存储单元 (B) 实参和与其对应的形参共占用一个存储单元 (C) 只有当实参和与其对应的形参同名时才共占用存储单元 (D) 形参是虚拟的,不占用存储单元 5、若调用一个函数,且此函数中没有return语句,则正确的说法是( A ) 该函数 (A) 没有返回值 (B) 返回若干个系统默认值 (C) 能返回一个用户所希望的函数值 (D) 返回一个不确定的值 6、以下不正确的说法是( B ) C语言规定 (A) 实参可以是常量、变量和表达式 (B) 形参可以是常量、变量和表达式 (C) 实参可以为任意类型 (D) 形参应与其对应的实参类型一致 7、以下正确的说法是( C ) (A) 定义函数时,形参的类型说明可以放在函数体内 (B) return后边的值不能为表达式 (C) 如果函数值的类型与返回值类型不一致,以函数值类型为准 (D) 如果形参与实参的类型不一致,以实参类型为准 8、C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是( B ) (A) 地址传递 (B) 单向值传递 (C) 由实参传给形参,再由形参传回给实参 (D) 由用户指定传递方式