程序设计基础(C语言)考试卷(本科样卷)
(理论部分)考试时间120分钟,答案请写在答题卡上
一、选择题 (每小题2分,共40分)
1.以下语句中不包含关键字的是( )。
A.x=sqrt(2);
B.while(x!=0)x--;
C.if(x<0)x=-x;
D.return x;
2.执行以下程序时,
#include
main()
{ int a; float b;
scanf("%3d%f",&a,&b);printf("%d\t%f",ab);
}
若要求变量a和b分别从键盘获得输入值45和678.0,则以下四种输入数据中(凵代表”空格”键,↙代表”回车”键),不能达到该要求的输入数据是( )。
A.45凵678↙ B.45↙678↙
C.45,678↙ D.045678↙
3.已知有声明int x=2:,以下表达式中值不等于8的是( )。
A.x+=2,x*2 B.x+=x*=X
C.(x+7)/2*((x+1)%2+1) D.x*7.2/x+1
4.已知有声明”int a=3, b=4, c;”,则执行语句”c=1/2*(a+b);”后,c的值是( )。
A.0 B.3 C.3.5 D.4
5.已知字母A的ASCII码是65,字母a的ASCII码是97,变量c中存储了一个大写字母的编码。若要求将c中大写字母编码转换成对应小写字母编码,则以下表达式中不能实现该功能的是( )。
A.c=tolower(c) B.c=c+32
C.c=c-’A’+’a’ D.c= (c +’A’)%26-’a’
6.已有声明”char *s1="China", s2[10], *s3="Nanjing"; *s4;”,以下字符串赋值语句在执行时可能出现错误的是( )。
A.strcpy(s3, s1); B.strcpy(s4, s1);
C.strcpy(s2, s1); D.strcpy(s2, s3);
7.执行以下程序后的结果是( )。
#include
void main()
{ int x=3;
Do
{
printf("%d\t", x=x-3);
}while(!x);
}
A.输出一个数:0 B.输出一个数:3
C.输出两个数:0和-3 D.无限循环,反复输出数
8.设有声明”int p[10]={1, 2}, i=0;”,以下语句中与”p[i]=p[i+1], i++;”等价的是( )。
A.p[i]=p[i+1]; B.p[++i]=p[i];
C.p[++i]=p[i+1]; D.i++, p[i-1]=p[i];
9.已知有声明”int m[]={5,4,3,2,1},i=0;”,下列对m数组元素的引用中,错误的是( )。
A.m[++i] B.m[5]
C.m[2*2]=0 D.m[m[4]]
10.若有函数fun的定义为
void fun(…)
{static int a=1;
…
}
则下列叙述中不正确的是( )。
A.在每次调用fun函数时,变量a的值是上次调用结束时a的值
B.在fun函数之外,可以用变量名a直接引用a的值
C.在其他函数中,可以出现声明double a=2.5;
D.fun函数的形式参数不能取名为a
11.若函数调用时的实参为变量,则以下关于函数形参和实参的叙述中正确的是( )。
A.实参和其对应的形参占用同一存储单元
B.形参不占用存储单元
C.同名的实参和形参占用同一存储单元
D.形参和实参占用不同的存储单元
12.已有声明”int a[5];”,以下表达式中不能正确取得a[1]指针的是( )。
A.&a[1] B.++a C.&a[0]+1 D.a+l
13.若有如下声明和语句:
int t[3][3], *pt[3], k;
for(k=0; k<3;k++) pt[k]=&t[k][0];
则表达式*(*(pt+1)+2)所引用的是( )。
A.t[2][0] B.&t[2][0] C.t[1][2] D.&t[1][2]
14.若有如下的类型定义和变量声明,则在给出的选项中值不为7的表达式是( )。
struct ss
{ int a;
struct ss *b;
}x[3]={{5, &x[1]}, {7, &x[2]}, {9, 0}}, *ptr=&x[0];
A.ptr->a B.(++ptr)->a
C.x[1].A D.x[0].b->a
15.下列叙述中正确的是( )。
A.main函数必须出现在其他函数之前
B.main函数中至少必须有一条语句
C.C程序总是从main函数的第一条语句开始执行
D.C程序总是在执行完main函数的最后一条语句后结束
16.已有定义“int a[2][3]={0}, *p=a[0];”,下面表达式中有语法错误的是 。
A.a[0]=1 B.p[0]=1
C.*p=1 D.a[0][0]=1
17.若有如下声明和语句:
int a[3][3], *p[3], k;
for(k=0; k<3;k++) p[k]=&a[k][0];
则表达式*(*(p+1)+2)所引用的是 。
A.a[2][0] B.&a[2][0]
C.a[1][2] D.&a[1][2]
18.设有声明语句“int b[3][3]={1,2,3,4,5,6,7,8,9};”,下面语句中不能输出数组元素b[1][2]的值6的是 _。
A.printf("%d ",*(*(b+1)+2))
B.printf("%d ",*(&b[2][0]-1));
C.printf("%d ",*(b[1]+2));
D.printf("%d ",*(b+1)[2]);
19.下面函数中,可以把整型数据以二进制形式写入文件中的函数是________。
A.fprintf() B.fwrite()
C.fread() D.fputc()
20.在缺省情况下,标准C的编译系统中预定义的标准输出流stdout直接连接的设备是 。
A.软盘 B.硬盘 C.键盘 D.显示器
二、填空题 (每空2分,共20分)
1.数学式所对应的C语言表达式为(1)。
2.在C语言中大部分执行语句都含关键字。例如,for语句含关键字for。除这些语句外不含关键字的非空操作语句是(2) 。
3.在以下程序的main函数中,语句”fun(x, 10);”内的实参x表示数组x的(3) 。
void fun(int a[10], int n)
{ int i; for(i=0; i<n; i++)a[i]++; }
main( )
{ int x[10]={0};fun(x, l0); }
4.已知有函数定义“int fun(){return (3, 4);}”,则调用fun后的函数返回值是(4)。
5.执行程序段 “int x=0x6c; printf(“x=%x\n”, x);”后的输出结果为(5) 。
6.已知有声明”char ch; int a;” 执行语句”scanf(“%c%d”, &ch, &a);”时如果从键盘输入的数据是”123”,则变量a得到的值是(6) 。
7.在C语言源程序中,不带任何修饰符的浮点数直接量(例如:3.14)都是按(7)类型数据存储的。
8.若有声明“char sl[10]= “ABCDE”, s2[10]= “A\\0”;”,则语句
“printf(“%d”, strlen(strcpy(sl, s2)));”的输出结果是(8) 。
9.设函数a的定义如下:
void a()
{ int x=12,y=345;FILE *fp=fopen(“my.dat”,”w”);
fprintf(fp, “%d %d”,x,y);
fclose(fp);
}
已知main函数中有声明int x,y;FILE *fp=fopen(“my.dat”,”r”);,若需要从文件my.dat中正确地读出由函数a写入的两个数据并分别保存到变量x和y中,则在main函数中使用的读数据语句应当是(9)(要求写出语句的完整格式)。
10.在一个C语言源程序中,必不可少的是(10) 。
三、阅读程序题 (每空2分,共20分)
1.以下程序运行时输出结果是 (1) 。
#include<stdio.h>
main()
{ char *p=“student”;
if(strcmp(p,“student”))
printf(“yes”);
else
printf(“no”);
}
2.以下程序运行后的输出结果为 (2) 。
#include <stdio.h>
int b;
int fun(int a)
{ static int c=3;
return ((++a)+(++b)+(++c));
}
void main ( )
{ int i, a=2;
for(i=0;i<2;i++) printf(“%5d”, fun(a));
}
3.以下程序输出结果为 (3) 。
void f(int a, int *b)
{ a++; b++; (*b)++;}
main()
{ int i, x[2] = {4,4};
f(x[0], &x[0]);
printf(“%d,%d”, x[0], x[1]);
}
4.以下程序运行时,输出结果是 (4) 。
#include <stdio.h>
fun(int x)
{ if(x/2>0) fun(x/2);
printf(“%d”, x%2);
}
main( )
{ fun(20); putchar(‘\n’);}
5.以下程序运行时输出到屏幕的结果是 (5) 。
#include <stdio.h>
#define MAX(A, B) A>B?2*A:2*B
void main()
{ int a=1, b=2, c=3, d=4, t;
t=MAX(a+b, c+d);
printf(“%d\n”, t);
}
6.以下程序运行时输出到屏幕的结果中第一行是 (6) ,第二行为 (7) 。
#include <stdio.h>
#include <ctype.h>
void compute(char *s)
{ int t, r;
char op;
for(r=0; isdigit(*s); s++) /* isdigit(*s)判断s指向的字符是否为数字字符*/
r=r*10+*s-’0’;
while(*s)
{ op=*s++;
for(t=0; isdigit(*s); s++)
t=t*10+*s-'0';
switch(op)
{ case '+':r=r+t; break;
case '-': r=r-t; break;
case '*':r=r*t; break;
case '/':if(t) r=r/t; else{puts(“devide error”); return;}
}
}
printf(“%d\n”, r);
}
void main( )
{ compute(“12+6-19+2”);
compute(“12/6*19/2”);
}
7.以下程序运行时输出结果的第一行是 (8) ,第二行是 (9) ,笫三行是 (10) 。
#include <stdio.h>
typedef struct s
{ int index;
int value;
}M;
main( )
{static int i, j, k, c[4][4];
M a[10]={{0, 1}, {3, 2}, {5, 3}, {6, 4}, {9, 5}, {15, 6}, {-1,0}}, *p=a,
b[10]={{1, 1}, {3, 2}, {4, 3}, {6, 4}, {10, 5}, {13, 6}, {-1, 0}}, *q=b;
while (p->index!=-1)
{ i=p->index/4;
j=P->index%4;
c[i][j]=p->value;
p++;
}
while(q->index !=-1)
{ i=q->index/4;
j=q->index%4;
c[i][j]+=q->value;
q++;
}
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf(“%d”, c[i][j]);
printf(“\n”);
}
}
四、完善程序题(每空1分,共5分)
1.以下程序的功能是对a数组a[0]~a[n-1] 中存储的n个整数从小到大排序。排序算法是:第一趟通过比较将n个整数中的最小值放在a[0]中,最大值放在a[n-1] 中;第二趟通过比较将n个整数中的次小值放在a[1]中,次大值放在a[n-2] 中;……,以此类推,直到待排序序列为递增序列。试完善程序以达到要求的功能。
#include <stdio.h>
#define N 7
void sort(int a[], int n)
{ int i, j, min, max, t;
for(i=0; i<(1); i++)
{(2);
for(j=i+1; j<n-i; j++)
if(a[j]<a[min])min=j;
else if(a[j]>a[max])max=j;
if(min!=i)
{ t=a[min]; a[min]=a[i]; a[i]=t; }
if(max!=n-i-1)
if(max==i)
{ t=a[min]; a[min]=a[n-i-1]; a[n-i-1]=t; }
else
{ t=a[max]; a[max]=a[n-i-1]; a[n-i-1]=t; }
}
}
void main()
{ int a[N]={8, 4, 9, 3, 2, 1}, i;
sort(a, N);
printf(“sorted:\n”);
for(i=0; i<N; i++) printf(“%d\t”,a[i]);
printf(“\n”);
}
2.程序中函数double mycos(double x)的功能是:根据下列公式计算cos(x)的近似值。
精度要求:当通项的绝对值小于等于10-6时为止。
#include <stdio.h>
#include <(3)>
double mycos(double x)
{ int n=1;
double sum=0, term=1.0;
while ((4)>=le-6)
{sum+=term;
term*=(5);
n=n+2;
}
return sum;
}
main( )
{ double x;
scanf(“%1f”, &x);
printf(“fx(%f)=%f,%f\n”, x, mycos(x), cos(x));
}
五、改错题(共9分,每错3分, 指出错误1分,改对2分)
题目:函数change从a数组存储的字符串中取出所有十六进制数字字符依次存入字符数组b中,然后再将b数组中的数字字符串转换成一个整数并返回。
提示:库函数isxdigit(ch)的功能是检查ch是否是十六进制数字字符,若是则返回1,否则返回0。(模拟题有6个错)
注意:不能增加、删除语句,但可以调换语句的位置。
(测试数据与运行结果)
测试数据:"xyz3F4tqk"
运行结果:输出1012
(含有错误的源程序)
#include
#include
#include
(1)long change(char a)
(2){
(3) int i, j = 0;long int k = 0;
(4) char b[10] = {0};
(5) for (i = 0;a[i]! = '0';i++)
(6) if (isxdigit(a[i]))
(7) b[i++] = a[i];
(8) b[j] = '0';
(9) i = 0;
(10) do
(11) {
(12) if (isdigit(b[i]))
(13) {k = k * 16 + b[i] - '0';i++; }
(14) else
(15) {
(16) b[i] = isupper(b[i]) ? b[i]:b[i] - 'a' + 'A';
(17) i++;
(18) k = k * 16 + b[i] - 'A';
(19) }
(20) }
(21) while (b[i] != '\0');
(22) return k;
(23)}
(24)void main()
(25){
(26) char c[80] = "xyz3F4tqk";
(27) long m;
(28) m = change(c);
(29) printf("%ld", m);
(30)}
六、编程题(共6分)
求下面数列的和,计算到第n项的值小于10-4为止。
式中,(本程序运行结果是:y=2.359646)。要求计算fn用函数过程实现。
答题卡
题号 | 一 | 二 | 三 | 四 | 五 | 六 | 七 | 总得分 | 阅卷人 |
一、选择题(每小题2分,共30分)
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
A | C | D | A | D | B | C | D | B | B |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
D | B | C | A | C | A | C | D | B | D |
二、填空题(每小题2分,共20分)
(1)__sqrt(x*x+y*y)/(a+b)__ (2)_表达式语句和函数调用语句_ (3)__第一个元素地址 或 起始地址_
(4)______4_________ (5)_____x=6c________ (6)_____23_______ (7)______double_______
(8)______3_________ (9)__fscanf(fp, “%d%d”, &x, &y);__ (10)_ __main函数定义_ _
三、写出程序结果题(每空2分,共20分)
(1)_____no_____ (2)_____8 10_____ (3)______4,5_ ____ (4)____10100______ (5)_______10______
(6)______1_____ (7)______19_______ (8)_____1104_______ (9)_____3380______ (10)_____0550_____
四、完善程序题(每空1分,共5分)
(1)___________n/2_______________ (2)____________min=max=i_____________ (3)________math.h ___________
(4)________fabs(term)____________ (5)____________-x*x/(n*(n+1))________
五、改错题(共9分) 六、编程题(共6分)
(1) 行有错,改为….
(5) 行有错,改为….
(7) 行有错,改为….
(8) 行有错,改为….
(17) 行位置有错,应该移到??行后
(18) 行有错,改为….
#include
main()
{ float a,y=0;
int i=1;
for( ; ; )
{ a = 1.0 / fib(i);
if (a <= 0.0001) break;
y = y + a;
i = i + 1
}
printf ("y=%f\n", y);
}
int fib(int i)
{ if (i == 1)
return 1;
else if (i == 2)
return 2;
else
return( fib(i - 1) + fib(i - 2));
}
本文来源:https://www.2haoxitong.net/k/doc/8e76a552b52acfc788ebc906.html
文档为doc格式