一、选择题 16. 有如下程序:
#include <stdio.h>
main()
{
int x=0x13;
printf("%d\n",x+1);
}
程序运行后的输出结果是______。
A B C D
C
[解析] 整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。十进制整常量没有前缀,输出格式控制符为%d;八进制整常量以0作为前缀,输出格式控制符为%o;十六进制整常量以0X或0x作为前缀,输出格式控制符为%x。十六进制数0x13表示成十进制数为19,以十进制格式输出x+1=19+1=20,故C选项正确。
20. 有以下程序:
#include <stdio.h>
main()
{
int x=0,y=6;
do
{while(--y)x++;}
while(y--);
printf("%d,%din",x,y);
}
程序的运行结果是______。
A B C D
C
[解析] 程序执行过程为:执行do...while的循环体:y=5,判断y为真,x=1;y=4,x=2;y=3,x=3;y=2,x=4;y=1,x=5;y=0,判断y为假,退出循环体。判断do...while条件y=0为假,y=-1,退出循环。输出x,y为5,-1,故C选项正确。
21. 有以下程序:
#include <stdio.h>
main()
{ char*s="120119110";
int n0,n1,n2,nn,i;
n0=n1=n2=nn=i=0;
do{
switch(s[i++])
{ default: nn++;
case'0': n0++;
case'1': n1++;
case'2': n2++;
}
} while(s[i]);
printf("n0=%d,n1=%d,n2=%d,nn=%d\n",n0,n1,n2,nn);
}
程序的运行结果是______。
A.n0=3,n1=8,n2=9,nn=1 B.n0=2,n1=5,n2=1,nn=1 C.n0=2,n1=7,n2=10,nn=1 D.n0=4,n1=8,n2=9,nn=1
A B C D
A
[解析] 本题执行过程为:s[0]='1',匹配case'1',n1=1,n2=1;s[1]='2',匹配case'2',n2=2;s[2]='0',匹配case'0',n0=1,n1=2,n2=3;s[3]='1',匹配case'1',n1=3,n2=4;s[4]='1',匹配case'1',n1=4,n2=5;s[5]='9',匹配default,nn=1,n0=2,n1=5,n2=6;s[6]='1',匹配case'1',n1=6,n2=7;s[7]='1',匹配case'1',n1=7,n2=8;s[8]='0',匹配case'0',n0=3,n1=8,n2=9;s[9]='\0',退出循环。输出n0,n1,n2,nn为3,8,9,1,故A选项正确。
22. 有以下程序:
#include <stdio.h>
int m1(int x, int y)
{ return x<=y?x:y;}
int m2(int x,int y)
{ return x<=y?y:x;}
int fun(int a,int b)
{ return a+b; }
main()
{ int x=2,y=3,z=1;
printf("%d\n",fun(m1(x,y),m2(y,z)));
}
程序的运行结果是______。
A B C D
B
[解析] 条件运算符“?”是C语言中唯一的一个三目运算符,语法形式为:exp1? exp2:exp3。执行规则为:计算表达式exp1的值,测试其是否为0;如果exp1的值非0,则对exp2求值,并把这个值作为条件表达式的结果输出,不计算exp3;如果exp1的值为0,则对exp3求值,并把这个值作为条件表达式的结果输出,不计算exp2。函数m1实现返回传入两个参数中的最小值。函数m2实现返回传入两个参数中的最大值。函数fun实现返回传入两个参数之和。程序执行过程为:调用m1(2,3)返回2,调用m2(3,1)返回3,调用fun(2,3)返回5,输出结果5,故B选项正确。
23. 有如下程序:
#include <stdio.h>
int sub(double a,double b)
{
return(int)(a-b);
}
main()
{
printf("%d\n",sub(3.8,2.1));
}
程序运行后的输出结果是______。
A B C D
D
[解析] 在类型转换过程中,如果较高类型转换成较低类型,直接忽略多余位数。在程序执行过程为:调用函数sub(3.8,2.1),3.8-2.1=1.7(double类型),(int)强制转换将1.7转换成int类型1,然后返回1并输出,故D选项正确。
24. 有如下程序:
#include <stdio.h>
main()
{
char*p1=0;
int*p2=0;
double*p3=0;
printf("%d,%d,%d\n",sizeof(p1),sizeof(p2),sizeof(p3));
}
程序运行后的输出结果是______。
A.4,4,4 B.1,4,8 C.0,0,0 D.1,2,4
A B C D
A
[解析] sizeof函数用来获取类型或数据对象的长度,也即是一个这种数据类型的变量在内存中所占字节数。由于一个变量的地址也是一个值,因此就可以把这个地址值存放到另一个变量里保存。这种专门用来存放变量地址的变量,称为“指针变量”。所有类型的指针变量都是地址,所占字节数均为4,故A选项正确。
25. 有如下程序:
#include <stdio.h>
main()
{
int a = 0,*ptr;
ptr = &a;
*ptr = 3;
a = (*ptr)++;
printf("%d,%d\n",a,*ptr);
}
程序运行后的输出结果是______。
A B C D
A
[解析] 程序执行过程为:定义整型变量a=0与指针ptr,使指针指向变量a。对指针指向的变量进行赋值a=3,将指针所指向变量加1,并赋值给a=4,此时指针依然指向变量a,输出a与指针指向的变量值:4,4,故A选项正确。
26. 有如下程序:
#include <stdio.h>
main()
{
int i,k;
int array[4][2] = {{1,2},{4,9},{6}};
for(i=0;i<2;i++)
for(k=0;k<4;k++)
{
printf("%d,",array[k][i]);
}
printf("\n");
}
程序运行后的输出结果是______。
A.1,2,4,9,6, B.1,4,6,0,2,9,0,0, C.2,9,0,0,1,4,6,0, D.2,9,6,1,4,
A B C D
B
[解析] 二维数组的初始化有两种方式,其中一种是分行初始化,方式为:数据类型数组名[行下标表达式][列下标表达式]={{第0行初值},{第1行初值表},…{最后1行初值表}};,如果初值表只对部分元素赋初值,没有被赋初值的元素将被自动赋值为0,故相当于array[4][2]={{1,2},{4,9},{6,0},{0,0}}。执行两次for语句,实现按列依次输出数组中元素值为1,4,6,0,2,9,0,0,故B选项正确。
27. 有如下程序:
#include <stdio.h>
main()
{
int i,*ptr;
int array[3] = {8,2,4};
for(ptr=array,i=0; i<2; i++)
printf("%d,",*ptr++);
printf("\n");
}
程序运行后的输出结果是______。
A B C D
A
[解析] 本题考查*与++的优先级,知*的优先级低于++,即先运算ptr++再运算*ptr。程序执行过程为:定义指针ptr与数组array,执行for循环,使指针指向数组,i=0,输出指针指向的元素array[0]=8,然后指针加1,指向数组下一个元素;i=1,输出array[1]=2,指针指向数组下一个元素;i=2退出for循环。程序依次输出8,2,故A选项正确。
28. 有如下程序:
#include <stdio.h>
main()
{
int i,*ptr;
int array[5] = {5,3,1};
for(ptr=array, i=0; i<5; i++, ptr++)
{
if (*ptr == 0)
putchar('X');
else
putchar('A'+*ptr);
}
printf("\n");
}
程序运行后的输出结果是______。
A.FDBXX B.FFFXX C.FDBBB D.ABCDE
A B C D
A
[解析] 在对数组进行初始化时,如果对数组的全部元素赋以初值,定义时可以不指定数组长度,如果被定义数组的长度与初值个数不同,则数组长度不能省略;如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值,则array={5,3,1,0,0}。程序执行过程为:执行for循环,将数组首地址赋给指针ptr,依次遍历每一个元素,如果数组元素为0则输出‘X’,如果不为0则按照字母表输出字符‘A’后第array[i]个字符。程序运行后的输出结果为:FDBXX,故A选项正确。
29. 有如下程序:
#include <stdio.h>
#include <string.h>
main()
{
char name[10]= "c-book";
char*str = name;
printf("%d,%d,%d,%d\n", sizeof(name), strlen(name), sized(str), strlen(str));
}
程序运行后的输出结果是______。
A.10,6,4,6 B.11,6,11,6 C.11,6,1,6 D.10,7,1,7
A B C D
A
[解析] 由一维数组初始化的知识可知,name[10]="c-book",即name[10]="c-book\0\0\0\0”。sizeof函数用来获取类型或数据对象的长度,也即是一个这种数据类型的变量在内存中所占字节数。strlen函数统计字符串长度,遇到“\0”统计结束。字符指针变量和字符数组在内存中的存储情形不同,数组指的是按照数组长度分配的若干存储空间,在内存中字符类型变量占1个字节;而指针只是一个存储字符串首地址的存储空间,指针占4个字节。所以sizeof(name)=1×10=10,strlen(name)=6,sizeof(str)=4,strlen(str)=6。故A选项正确。
30. 有如下程序:
#include <stdio.h>
main()
{
char name[10]={'S','T','R','I','N','G,};
name[3]='E';name[5] = 0;
printf("%s\n",name);
}
程序运行后的输出结果是______。
A.STRENG B.STRIEG C.STREN D.STRENO
A B C D
C
[解析] printf函数按照格式符说明输出对应的数据。%s控制符用于输出字符串,输出时从给定地址开始依次输出字符,直到遇到‘\0’结束。给字符变量赋值0,相当于赋值‘\0’。初始化时name="STRING",改动数组第4个和第6个元素之后字符串变为"STREN"。调用printf输出字符串为STREN,故C选项正确。
31. 有如下程序:
#include <stdio.h>
int disp(char*str)
{
while(*str)putchar(*str++);
return*str;
}
main()
{
printf("%d\n", disp("NAME"));
}
程序运行后的输出结果是______。
A.NAME0 B.NAMEE C.NAME D.NAME\0
A B C D
A
[解析] 程序执行过程为:调用函数disp,将字符串“NAME”首地址传给指针str,在while循环中,依次判断字符串中字符是否为‘\0’,不是'\0'则输出字符,否则结束循环。当(* str)='\0'时,结束循环,返回字符‘\0’的ASCII码0,并输出。程序运行后的输出结果是:NAME0,故A选项正确。
32. 有如下程序:
#include <stdio.h>
main()
{
char*p,old_str[10]="wind";
int password;
scanf("%d",&password);
p = old_str;
while(*p)
{
printf("%c",*p + password);
p++;
}
printf("\n");
}
程序运行时,从键盘输入2<回车>,输出结果是______。
A B C D
A
[解析] 程序执行过程为:定义字符数组str并且初始化为:“wind”,定义password并通过scanf函数从键盘为其赋值2。定义指针p并使其指向字符串。通过while循环,将字符数组中每一个字符的ASCII码加2,并且按字符格式输出每一个字符。程序运行后输出结果是:ykpf,故A选项正确。
33. 有如下程序:
#include <stdio.h>
int sum(int*array,int len)
{
if(len == 0)
return array[0];
else
return array[0]+sum(array+1, len-1);
}
main()
{
int array[5] = {1,2,3,4,5};
int res = sum(array,4);
printf("%d\n",res);
}
程序运行后的输出结果是______。
A B C D
A
[解析] 程序执行过程为:定义字符数组array,调用函数sum将数组首地址与4传入函数len=4;len>0递归调用sum(array+1,3)传入地址为数组第二个元素地址;len>0递归调用sum(array+1,2)传入地址为数组第三个元素地址;len>0递归调用sum(array+1,1)传入地址为数组第四个元素地址;len>0递归调用sum(array+1,0)传入地址为数组第五个元素地址,此时len=0,返回5;执行sum(array+1,1)余下语句,返回9;执行sum(array+1,2)余下语句,返回12;执行sum(array+1,3)余下语句,返回14;执行sum(array+1,4)余下语句,返回15,并输出。故A选项正确。
34. 有如下程序:
#include <stdio.h>
int*sum(int data)
{
static int init = 0;
init += data;
return &init;
}
main()
{
int i,*p;
for(i=1; i<=4; i++) sum(i);
p = sum(0);
printf("%d\n",*p);
}
程序运行后的输出结果是______。
A B C D
D
[解析] static变量又称为静态变量,编译时,将其分配在内存的静态存储区中,在整个程序运行期间都不释放这些存储单元,即使退出函数,下次再进入该函数时,静态局部变量仍使用原来的存储单元,值是上一次函数调用结束时的值。若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值。程序执行过程为:执行for循环,i=1,调用函数sum(1),data=1,init=0,init=init+data=1;i=2,调用函数sum(2),data=2,init=1,init=init+data=3;i=3,调用函数sum(3),data=3,init=3,init=init+data=6;i=4,调用函数sum(4),data=4,init=6,init=init+data=10;i=5退出for循环。调用函数sum(0),data=0,init=10,ini=init+data=10,返回指向init的指针,输出init=10。故D选项正确。
35. 有如下程序:
#include <stdio.h>
#define D(x)4*x+1
main()
{
int i = 2,j = 4;
printf("%d\n", D(i+j));
}
程序运行后的输出结果是______。
A B C D
B
[解析] 带参数的宏定义不是进行简单的字符串替换,而是要进行参数替换。替换过程是:用宏调用提供的实参字符串,直接置换宏定义命令行中相应形参字符串,非形参字符保持不变。调用函数D(i+j),进行替换为4*i+j+1=13,输出13,故B选项正确。
36. 有如下程序:
#include <stdio.h>
struct S
{
int x,y;
};
main()
{
struct S data[2] = {4,3,1,9};
int i;
for(i=0; i<2; i++)
printf("%d,%d;",data[i].x,data[i].y>>1);
printf("\n");
}
程序运行后的输出结果是______。
A.4,1;1,4; B.4,1;2,4; C.4,3;1,9; D.4,3;2,3;
A B C D
A
[解析] “>>”右移运算符。程序执行过程为:定义结构体数组data,并且初始化,则data[0].x=4,data[0].y=3,data[1].x=1,data[1].y=9。For循环依次输出结构体变量的成员与经过位运算之后的结果。3=11B,9=1001B,data[0].y>>1=1,data[1].y>>1=4。程序运行后输出结果为:4,1,1,4,故A选项正确。
37. 有如下程序:
#include <stdio.h>
#include <string.h>
struct S
{
char name[10];
};
void change(struct S *data, int value)
{
strcpy(data->name,"****");
value = 13;
}
main()
{
struct S input;
int num = 4;
strcpy(input.name,"THIS");
change(&input,num);
printf("%s,%d\n",input.name,num);
}
程序运行后的输出结果是______。
A.****,4 B.****,13 C.THIS,4 D.THIS,13
A B C D
A
[解析] 程序执行过程为:定义结构体变量input,调用strcpy(input.name,"THIS"),使input.name="THIS",调用函数change(&input,4),将结构体地址传入函数,执行函数体,调用strcpy(data->name,"****")使input.name="****",而4是值传递,并没有改变num的值。输出结构体成员为:****,4,故A选项正确。
38. 有如下程序:
#include <stdio.h>
#include <string.h>
struct S
{
char name[10];
};
main()
{
struct S s1,s2;
strcpy(s1.name,"12345");
strcpy(s2.name,"ABC");
s1 = s2;
printf("%s\n",s1.name);
}
程序运行后的输出结果是______。
A.ABC12 B.ABC45 C.12345 D.ABC
A B C D
D
[解析] 程序执行过程为:定义结构体变量s1与s2,调用strcpy函数为结构体成员赋值,s1.name="12345",s2.name="ABC",将s2赋值给s1则s1.name="ABC",最后输出结果为ABC,故D选项正确。
39. 有如下程序:
#include <stdio.h>
main()
{
int i, array[5] = {3,5,10,4};
fbr(i=0; i<5; i++)
printf("%d,",array[i]&3);
printf("\n");
}
程序运行后的输出结果是______。
A.3,1,2,0,0, B.3,5,10,4,0, C.3,3,3,3,0, D.3,2,2,2,0,
A B C D
A
[解析] 在对数组进行初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值0,则array={3,5,10,4,0}。按位与运算“&”,当参加运算的两个二进制数的对应位都为1,则该位的结果为1,否则为0。将数组元素与3=11B按位与,即3&3=3,5&3=1,10&3=2,4&3=0,0&3=0。For循环输出与运算结果:3,1,2,0,0,故A选项正确。
40. 有如下程序:
#include <stdio.h>
main()
{
int i;
FILE* fp;
for(i=0; i<5; i++)
{
fp = fopen("output.txt","w");
fputc('A'+i,fp);
fclose(fp);
}
}
程序运行后,在当前目录下会生成一个output.txt文件,其内容是______。
A B C D
A
[解析] 程序执行过程为:i=0时,以只写方式打开一个文本文件output.txt,调用函数fputc向文件输入A,关闭文件;i=1时,再次以只写方式打开output.txt,调用函数fputc向文件输入B覆盖原本的A,关闭文件;之后文件内的值依次为C、D、E,当i=4时,文件内为E,然后关闭文件;i=5退出循环。output.txt文件中内容为E,故A选项正确。
二、程序填空题 1. 程序通过定义学生结构体数组,存储若干名学生的学号、姓名和三门课的成绩。函数fun的功能是:将存放学生数据的结构体数组,按姓名的字典序(从小到大)排序。
请在程序的下画线处填入正确的内容,使程序得出正确的结果。
注意:部分源程序给出如下。
不得增行或删行,也不得更改程序的结构!
试题程序:
#include <stdio.h>
#include <string.h>
struct student {
long sno;
char name[10];
float score[3];
};
void fun(struct student a[], int n)
{
/**********found**********/
______t;
int i, j;
/**********found**********/
for(i=0; i<______; i++)
for(j=i+1; j<n; j++)
/**********found**********/
if(strcmp(______)>0)
{ t = a[i]; a[i] = a[j];
a[j] = t;
}
}
main()
{ struct student s[4]={{10001,"ZhangSan",95,80,88},{10002,"LiSi",85,70,78},{10003,"CaoKai",75,60,88},{10004,"FangFang",90,82,87}};
int i,j;
printf("\n\nThe original data:\n\n");
for(j=0; j<4; j++)
{ printf("\nNo:%ld Name:%-8s Scores: ",s[j].sno,s[j].name);
for(i=0; i<3; i++)
printf("%6.2f",s[j].score[i]);
printf("\n");
}
fun(s,4);
printf("\n\nThe data after soring:\n\n");
for(j=0; j<4; j++)
{ printf("\nNo:%td Name:%-8s Scores:",s[j].sno,s[j].name);
for(i=0; i<3; i++)
printf("%6.2f",s[j].score[i]);
printf("\n");
}
}
struct student n-1 a[i].name,a[j].name
[考点] 本题考查:变量定义;for循环语句;strcmp函数;结构体变量的表示方法。 [解析] 填空1:变量t是中间变量,用来存放结构体数组中的元素,因此应定义为结构体类型。 填空2:for循环语句用来遍历结构体数组,n是数组的长度,因此循环变量的取值范围是0~n-1。 填空3:字符串比较函数strcmp的一般格式为“strcmp(字符串1,字符串2)”。 功能:按照ASCII码顺序比较两个字符数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串1>字符串2,返回值>0; 字符串1<字符串2,返回值<0。
三、程序修改题 1. 下列给定程序中,函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
例如,调用fun函数之前给字符串输入“ABCDeFGH”,调用后字符串中的内容应为“eABCDFGH”。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include <stdio.h>
void fun(char*p)
{
char max,*q;int i=0;
max=p[i];
while(p[i]!=0)
{
if(max<p[i])
{ max=p[i];
/**********found**********/
q=p+i
}
i++;
}
/**********found**********/
while(q<p)
{
*q=*(q-1);q--;
}
p[0]=max;
}
void main()
{
char str[80];
printf("Enter a string:");gets(str);
printf("\nThe original string:");
puts(str);
fun(str);
printf("\nThe string after moving:");
puts(str);printf("\n\n");
}
q=p+i; while(q>p)
[考点] 本题考查:变量赋值操作;while循环语句。 [解析] 解答本题需要三个步骤,首先找到字符串中ASCII码值最大的字符并保存;然后将该字符复制,并将该字符前面的字符串顺次后移;最后将ASCII码值最大的字符赋给字符串的第一个字符。要找到ASCII码值最大的字符可以通过定义一个字符变量max,该字符变量初始时等于字符串的第一个字符,若字符串的下一个字符大于max,则将下一个字符赋给max,如此循环到字符尾,即可得到ASCII码值最大的字符,同时令指针q指向最大字符。此后对最大字符前面的子串顺次后移,可采用while语句实现。
四、程序设计题 1. 学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中。请编写函数fun,其功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。
例如,输入的分数是60、69,则应当把分数在60~69的学生数据输出,包含60分和69分的学生数据。主函数中把60放在low中,把69放在heigh中。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
试题程序:
#include <stdio.h>
#define N 16
typedef struct
{
char num[10];
int s;
}STREC;
int fun(STREC*a,STREC*b, int 1, int h)
{
}
void main()
{
STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},{"GA001",96},{"GA007",72},{"GA008",64},{"GA006",87},{"GA015",85},{"GA013",94},{"GA012",64},{"GA014",91},{"GA011",90},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N];
int i,n,low,heigh,t;
printf("Enter 2 integer number low & heigh:");
scanf("%d%d",&low,&heigh);
if(heigh<low)
{t=heigh;heigh=low;low=t;}
n=fun(s,h,low,heigh);
printf("The student's data between%d--%d:\n",low,heigh);
for(i=0;i<n;i++)
printf("%s%4d\n",h[i].num,h[i].s);
printf("\n");
}
int fun(STREC *a,STREC *b, int l, int h) { int i,j=0; for(i=0;i<N;i++) if(a[i].s>=1&&a[i].s<=h) /*将分数高于1,低于h的学生记录存入结构体数组b中*/ b[j++]=a[i]; return j; /*返回分数范围内的学生人数*/ }
[考点] 本题考查:结构体数组操作;循环判断结构。 [解析] 本题使用循环判断结构实现程序操作,循环语句用于遍历结构体数组,条件语句用于判断当前元素是否符合条件,若符合条件则将其存入结构体数组b中。