一、选择题下列各题A、B、C、D四个选项中,只有一个选项是正确的。16. 有以下程序
#include <stdio.h>
main()
{ int a=1,b=0;
printf("%d,",b=a+b);
printf("%d\n",a=2*b);
}
程序运行后的输出结果是______。
A B C D
A
[解析] 首先打印“b=a+b=1+0=1”的值1,此时已给b赋值为1。然后打印“a=2*b=2*1=2”的值2。因此结果是“1,2”。
17. 有以下程序
#include <stdio.h>
main()
{ int a1,a2;char c1,c2;
scanf("%d%c%d%c",&a1,&c1,&a2,&c2);
printf("%d,%c,%d,%c",a1,c1,a2,c2);
}
若想通过键盘输入,使得a1的值为12,a2的值为34,c1的值为字符a,c2的值为字符b,程序输出结果是12,a,34,b则正确的输入格式是______(□代表空格字符)。
- A.12□a□34□b<CR>
- B.12a34b<CR>
- C.12,a,34,b<CR>
- D.12□a34□b<CR>
A B C D
B
[解析] 在输入多个数据时,如果格式控制串中没有非格式字符,则认为所有输入的字符均为有效字符。因此应按选项B的顺序输入数据。
19. 有以下程序段
#include <stdio.h>
main()
{
int a,b,c;
a=10; b=50; c=30;
if(a>b)a=b, b=c; c=a;
printf("a=%d b=%d c=%d\n",a,b,c);
}
程序的输出结果是______。
- A.a=10 b=50 c=10
- B.a=10 b=50 c=30
- C.a=10 b=30 c=10
- D.a=50 b=30 c=50
A B C D
A
[解析] 本题中a>b的条件不满足,因此不执行逗号表达式“a=b,b=c;”的操作,而是执行“c=a”的操作,即c的值为10。故本题答案为A。
22. 有以下程序
#include <stdio.h>
main()
{ int c=0,k;
for(k=1;k<3;k++)
switch(k)
{ default: c+=k;
case 2: c++;break;
case 4: c+=2;break;
}
printf("%d\n",c);
}
程序运行后的输出结果是______。
A B C D
A
[解析] 向switch语句块传送参数后,编译器会先寻找匹配的case语句块,找到后就执行该语句块,遇到break跳出;如果没有匹配的语句块,则执行default语句块。case与default没有顺序之分。因此第一次循环k的值为1,执行c+=k,c的值为1,再执行case 2后的语句c++,c的值为2,遇到break语句跳出循环;第二次循环k的值为2,执行case 2后面的语句c++,c的值为3,跳出循环。故本题答案为A。
23. 有以下程序
#include <stdio.h>
int f(int x,int y)
{ return((y-x)*x);}
main()
{ int a=3,b=4,c=5,d;
d=f(f(a,b),f(a,c));
printf("%d\n",d);
}
程序运行后的输出结果是______。
A B C D
C
[解析] 调用“f(a,b)”函数返回3,调用“f(a,c)”函数返回6,因此外层调用“f(f(a,b),f(a,c));”,即调用“f(3,6)”函数返回9,故本题答案为C。
25. 若有定义语句“double x,y,*px,*py;”,执行了“px=&x;py=&y;”之后,正确的输入语句是______。
- A.scanf("%lf%le",px,py);
- B.scanf("%f%f"&x,&y);
- C.scanf("%f%f",x,y);
- D.scanf("%lf%lf",x,y);
A B C D
A
[解析] 因为x、y都是double型数据,所以输入时的格式字符应为%lf,所以B与C错误。D选项中“scanf("%lf%%lf",x,y);”应为“scanf("%lf%lf",&x,&y);”。故本题答案为A。
26. 以下定义数组的语句中错误的是______。
- A.int num[]=(1,2,3,4,5,6};
- B.int num[][3]={{1,2),3,4,5,6};
- C.int num[2][4]={{1,2},{3,4},{5,6}};
- D.int num[][4]={1,2,3,4,5,6};
A B C D
C
[解析] C选项中定义的数组为2行4列,而赋值时赋成了3行,因此出错。
27. 有以下程序
#include <stdio.h>
void fun(int a,int b)
{ int t;
t=a; a=b; b=t;
}
main()
{ int c[10]={1,2,3,4,5,6,7,8,9,0},i;
for(i=0;i<10;i+=2) fun(c[i],c[i+1]);
for(i=0;i<10;i++) printf("%d,",c[i]);
printf("\n");
}
程序的运行结果是______。
- A.1,2,3,4,5,6,7,8,9,0,
- B.2,1,4,3,6,5,8,7,0,9,
- C.0,9,8,7,6,5,4,3,2,1,
- D.0,1,2,3,4,5,6,7,8,9,
A B C D
A
[解析] 函数调用中发生的数据传递是单向的,即只能把实参的值传递给形参,而不能把形参的值反向地传递给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化,所以数组c中的元素的值并没有变化,故选择A。
28. 有以下程序
#include <stdio.h>
main()
{ int x[3][2]={0},i;
for(i=0;i<3;i++) scanf("%d",x[i]);
printf("%3d%3d%3d\n",x[0][0],x[0][1],x[1][0]);
}
若运行时输入:2 4 6<回车>,则输出结果为______。
- A.2 0 0
- B.2 0 4
- C.2 4 0
- D.2 4 6
A B C D
B
[解析] 本题中输入的3个数据2、4、6分别赋给了x[0][0]、x[1][0]和x[2][0]。x[0][1]仍为初始时的0,因此打印输出时的结果为B选项。
31. 有以下函数
int fun(char *s)
{ char *t=s;
while(*t++);
return(t-s);
}
该函数的功能是______。
- A.计算s所指字符串占用内存字节的个数
- B.比较两个字符串的大小
- C.计算s所指字符串的长度
- D.将s所指字符串复制到字符串t中
A B C D
C
[解析] 首先“char *s”接受一个字符型数组的首地址并将这个首地址赋给另一个字符型指针“char*t,while(*t++)”不断循环,直到*t为'\0',再将t-1,这时字符指针t指向字符串的最后一个字符,又因为s指向字符数组的首地址即字符串的首地址,所以“return(t-s)”便是返回字符数组中字符串的长度。故本题答案为C。
32. 有以下程序(字符a的ASCII码值为97)
#include <stdio.h>
main()
{ char *s={"abc"};
do
{ printf("%d",*s%10);++s;}
while(*s);
}
程序运行后的输出结果是______。
A B C D
B
[解析] 因为小写字符a、b、c的ASCII码的值分别为97、98、99,而在“do...while”循环语句中,每次对字符的ASCII码的值取余数并输出,所以分别输出7、8、9,选项B正确。
33. 设有如下函数定义
#include <stdio.h>
int fun(int k]
{ if(k<1) return 0;
else if(k==1) return 1;
else return fun(k-1)+1;
}
若执行调用语句“n=fun(3);”,则函数fun总共被调用的次数是______。
A B C D
A
[解析] 首先调用“n=fun(3)”,3被当作参数传递进去,进行了第一次调用,3被当作参数传进去后,程序会执行语句“else return fun(k-1)+1;”进行第二次调用,参数是3-1也就是2,2被当作参数传进去后,程序会执行语句“else return fun(k-1)+1;”进行第三次调用,参数是2-1也就是1,1被当作参数传进去后,程序会执行语句“else if(k==1)return 1;”不再递归调用,因此最终结果为3次,选项A正确。
34. 有以下程序
#include <stdio.h>
int f(int n);
main()
{ int a=3,s;
s=f(A);s=s+f(A);printf("%d\n",s);
}
int f(int n)
{ static int a=1;
n+=a++;
return n;
}
程序运行后的输出结果是______。
A B C D
A
[解析] 题目中定义的静态局部变量a,在静态存储区内分配存储单元,在程序整个运行期间都不释放。因此第一次调用函数执行“n+=a++;”时,a先与n相加再进行自增运算。n的值为4,a的值为2,且a变量执行完后空间没有释放。再执行“s=s+f(A)”时,s的值为4,调用f(A)函数时,n的返回值为“n=3+2=5”,此时a的值为3,所以s的值为9,选项A正确。
36. 有以下程序
#include <stdio.h>
struct S{ int n; int a[20];);
void f(struct S*p)
{ int i,j,t;
for(i=0;i<p->n-1;i++)
for(j=i+1;j<p->n;j++)
if(p->a[i]>p->a[j]) {t=p->a[i];p->a[i]=p->a[j];p->a[j]=t;}
}
main()
{ int i; struct S s={10,{2,3,1,6,8,7,5,4,10,9}};
f(&s);
for(i=0;i<s.n;i++) printf("%d,",s.a[i]);
}
程序运行后的输出结果是______。
- A.10,9,8,7,6,5,4,3,2,1,
- B.1,2,3,4,5,6,7,8,9,10,
- C.2,3,1,6,8,7,5,4,10,9,
- D.10,9,8,7,6,1,2,3,4,5,
A B C D
B
[解析] 本题的子函数f的功能是对结构体变量s中第二个成员数组中所有的数据进行从小到大的冒泡排序,因此结果是B。
37. 有以下程序
#include <stdio.h>
#include <string.h>
typedef struct {char name[9]; char sex; int score[2];} STU;
STUf(STU A.
{ STU b={"Zhao",'m',85,90};
int i;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++) a.score[i]=b.score[i];
return a;
}
main()
{ STU c={"Qian",'f',95,92},d;
d=f(c);
printf("%s,%c,%d,%d,",d.name,d.sex,d.score[0],d.score[1]);
printf("%s,%c,%d,%d\n",c.name,c.sex,c.score[0],c.score[1]);
}
程序运行后的输出结果是______。
- A.Zhao,m,85,90,Qian,f,95,92
- B.Zhao,m,85,90,Zhao,m,85,90
- C.Qian,f,95,92,Qian,f,95,92
- D.Qian,f,95,92,Zhao,m,85,90
A B C D
A
[解析] 本题考查的是函数调用时的参数传递问题。程序在调用函数f时,传给函数f的参数只是结构变量c在栈中的一个拷贝,函数f做的所有操作只是针对这个数据拷贝进行的修改,这些都不会影响变量c的值。因此本题答案为A。
40. 有以下程序
#include <stdio.h>
main()
{ FILE *fp;int a[10]={1,2,3},i,n;
fp=fopen("d1.dat","w");
for(i=0;i<3;i++) fprintf(fp,"%d",a[i]);
fprintf(fp,"\n");
fclose(fp);
fp=fopen("d1.dat","r");
fscanf(fp,"%d,&n);
fclose(fp);
printf("%d\n",n);
}
程序的运行结果是______。
A B C D
A
[解析] 程序首先将数组a[10]中的元素1、2、3分别写入了文件d1.dat文件中,然后又将d1.dat文件中的数据123,整体写入了变量n的空间中,因此打印n时输出的数据为123,选项A正确。
二、程序填空题1. 给定程序中,函数fun的功能是:找出100~999之间(含100和999)所有整数中各位上数字之和为x(x为一正整数)的整数,然后输出;符合条件的整数个数作为函数值返回。
例如,当x值为5时,100~999之间各位上数字之和为5的整数有:104、113、122、131、140、203、212、221、230、302、311、320、401、410、500。共有15个。当x值为27时,各位数字之和为27的整数是999。只有1个。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在
考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
int fun(int x)
{ int n,s1,s2,s3,t;
n=0;
t=100;
/**********found**********/
while(t<
){
/**********found**********/
s1=t%10;s2=
%10;s3=t/100;
/**********found**********/
if(s1+s2+s3==
)
{ printf("%d",t);
n++;
}
t++;
}
return n;
}
main()
{ int x=-1;
while(x<0)
{ printf("Please input(x>0):");
scanf("%d",&x);}
printf("\nThe result is:%d\n",fun(x));
}
[解析] (1)题目要求找出100~999之间符合要求的数,所以while语句的循环条件是t<=999。
(2)变量s2存放三位数的十位,取出三位数十位数值的方法为s2=(t/10)%10。
(3)题目需要判断各位上数字之和是否为x,所以if语句条件表达式是s1+s2+s3==x。
三、程序改错题1. 给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为7654321时,t中的数为642。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
/************found************/
void fun(long s,long t)
{ long sl=10;
s/=10;
*t=s%10;
/************found************/
while(s<0)
{ s=s/100;
*t=s%10*sl+*t;
sl=sl*10;
}
}
main()
{ long s,t;
printf("\nPlease enter s:");scanf("%ld",&s);
fun(s,&t);
printf("The result is:%ld\n",t);
}
(1)void fun(long s,long *t)
(2)while(s>0)
[解析] 函数的形参类型应与实参类型相同,主函数中函数fun()的调用方式说明其参数应为指针类型,所以形参t应定义为long *t。
while循环的功能是,每循环一次就从s中的数上取出一位进行运算,直到取完为止,所以循环条件为s>0。
四、程序设计题1. 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:按分数的高低排列学生的记录,高分在前。
注意:部分源程序存在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
void fun(STREC a[])
{
STREC tmp;
inti,j;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
{ /*请按题目要求完成以下代码*/
}
}
main()
{ STREC s[N]={{"GA005",85},{"GA003",76),
{"GA002",69},{"GA004",85},{"GA001",91},
{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",91},{GA012",64},
{"GA014",91},{"GA011",66},{"GA017",64},
{"GA018",64},{"GA016",72}};
int i;FILE *out;
fun(s);
printf("The data after sorted:\n");
for(i=0;i<N;i++)
{ if((i)%4==0)printf("\n");
printf("%s%4d",s[i].num,s[i].s);
}
printf("\n");
out=fopen("c:\\test\\out.dat","w");
for(i=0;i<N;i++)
{ if((i)%4==0&&i)fprintf(out,"\n");
fprintf(out,"%4d",s[i].s);
}
fprintf(out,"\n");
fclose(out);
}
if(a[i].s>a[j].s)
{
tmp=a[j];a[j]=a[i];a[i]=tmp;
}
[解析] 对N个数进行排序的算法很多,其中最简单的排序算法是冒泡算法。利用双层for循环嵌套和一个if判断语句来实现,外层循环用来控制需比较的轮数,内层循环用来控制两两比较。