一、选择题16. 有如下程序:
#include <stdio.h>
main()
{
int x=072;
printf("%d\n", x+1);
}
程序运行后的输出结果是______。
A B C D
A
[解析] 整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。十进制整常量没有前缀,输出格式控制符为%d;八进制整常量以0作为前缀,输出格式控制符为%o;十六进制整常量以0X或0x作为前缀,输出格式控制符为%x。八进制数072表示成十进制数为58,即x=072=58,以十进制格式输出x+1=59,故A选项正确。
17. 有如下程序:
#include <stdio.h>
main()
}
int a=0,b=1;
if (a++&&b++)
printf("T");
else
printf("F");
printf("a=%d,b=%d\n",a,b);
}
程序运行后的输出结果是______。
- A.Ta=1,b=2
- B.Fa=0,b=2
- C.Fa=1,b=1
- D.Ta=0,b=1
A B C D
C
[解析] 题目中判断if条件是否成立,a++先取值为0,则(a++&&b++)为0,且不计算b++,而后a自增得a=1,if条件不成立执行else函数体,输出F。最后执行语句rintf("a=%d,b=%d\n",a,b);按照格式输出a=1,b=1。故C选项正确。
18. 有如下程序:
#include <stdio.h>
main()
{
int i,data;
scanf("%d",&data);
for(i=0;i<5;i++)
{
if(i<data) continue;
printf("%d,",i);
}
printf("\n");
}
程序运行时,从键盘输入:3<回车>后,程序输出结果为______。
- A.3,4,
- B.1,2,3,4,
- C.0,1,2,3,4,5,
- D.0,1,2,
A B C D
A
[解析] continue语句只能用在循环结构中,其作用是结束本次循环,即不再执行循环体中continue语句之后的语句,而是立即转入对循环条件的判断与执行。本题执行过程为:输入3,则data=3;执行for循环,i=0,if条件成立,结束本次循环,不输出i值,执行下一次循环;直到i>=3,if条件不成立,依次输出i值3,4,直到i=5退出for循环。故A选项正确。
19. 有如下程序:
#include <stdio.h>
main()
{
int i,data;
scanf("%d",&data);
for(i=0;i<5; i++)
{
if(i>data)break;
printf("%d,",i);
}
printf("\n");
}
程序运行时,从键盘输入:3<回车>后,程序输出结果为______。
- A.3,4,
- B.0,1,
- C.3,4,5,
- D.0,1,2,3,
A B C D
D
[解析] break语句作用是结束整个循环过程,不再判断执行循环的条件是否成立,且在嵌套循环中,其只跳出最内层的一层循环。本题执行过程为:输入3,则data=3;执行for循环,在i<=3时,if条件不成立,执行语句printf("%d,",i);依次输出i值,0,1,2,3;直到i=4时,if条件成立,执行break退出for循环。故D选项正确。
20. 有如下程序:
#include <stdio.h>
main()
{
char a='3',b='A';
int i;
for(i=0;i<6;i++)
{
if(i%3)putchar(a+i);
else putchar(b+i);
}
printf("\n");
}
程序运行后的输出结果是______。
- A.A45D78
- B.ABC678
- C.34CD78
- D.34AB78
A B C D
A
[解析] putchar函数是向标准输出设备上输出一个字符。字符在内存中以AScII码方式存储,可以与整数进行加减运算,但是要保证计算结果在0~255之间。本题执行过程为:i=0,i%3=0,if条件不成立执行else函数体,输出字符A;i=1,i%3=1,if条件成立输出字符4;i=2,i%3=2,if条件成立输出字符5;i=3,if条件不成立,输出字符D;i=4和i=5时,分别输出字符7与8;i=6退出for循环。所以程序运行后输出结果为A45D78,故A选项正确。
21. 有如下程序:
#include <stdio.h>
main()
{
int i;
for(i=0;i<5;i++)
putchar('9'-i); printf("\n");
}
程序运行后的输出结果是______。
- A.54321
- B.98765
- C.'9''8''7''6''5'’
- D.'43210'
A B C D
B
[解析] putcbar函数是向标准输出设备上输出一个字符。字符在内存中以ASCII码方式存储,可以与整数进行加减运算,但是要保证计算结果在0~255之间。本题执行过程为:i=0,输出字符9,在i<5的情况下,依次输出字符8、7、6、5。在i=5时,退出for循环。最后显示在命令窗口结果为98765,故B选项正确。
22. 有如下程序:
#include <stdio.h>
main()
{
int x = 0x13;
if(x=0x18) printf("T");
printf("F");
printf("\n");
}
程序运行后的输出结果是______。
A B C D
A
[解析] x=0x18为赋值表达式,十六进制数0x18非0,即x非0,if条件成立输出T,之后再输出F与回车符。程序运行后的输出结果是TF,故A选项正确。
23. 有如下程序:
#include <stdio.h>
int sum(int a,int b)
{
return a+b-2;
}
main()
{
int i;
for(i=0; i<5; i++)
printf("%d",sum(i,3));
printf("\n");
}
程序运行后的输出结果是______。
- A.54321
- B.01234
- C.45678
- D.12345
A B C D
D
[解析] 函数调用的一般形式为:函数名(实际参数表)对无参函数调用时,则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。函数sum在main函数之前,所以在main函数中不需要声明。本题程序执行过程为:在i=0,1,2,3,4时依次输出sum(i,3),即调用sum函数后依次输出1、2、3、4、5,故D选项正确。
24. 有如下程序:
#include <stdio.h>
int change(int*data)
{
return(*data)++;
}
main()
{
int data=123;
change(&data);
printf("%d,",data);
data = change(&data);
printf("%d,",data); printf("\n");
}
程序运行后的输出结果是______。
- A.124,124,
- B.123,124,
- C.124,123,
- D.123,123,
A B C D
A
[解析] 本题程序执行过程为:调用change函数,将变量data地址传入函数,返回当前指针指向的变量值123,之后此变量加一,data=124。输出data=124。再次调用函数,返回当前指针指向的变量值124,然后此地址内存中变量加一,data=125,然后将返回值124赋给变量data=124,最后输出data=124。故A选项正确。
25. 有如下程序:
#include <stdio.h>
void change(int*array,int len)
{
for(len>=0;len--)
array[len]+=2;
}
main()
{
int i,array[5] = {1,2};
change(array,4);
for(i=0; i<4;i++)
printf("%d,",array[i]);
printf("\n");
}
程序运行后的输出结果是______。
- A.2,3,4,5,
- B.3,4,5,6,
- C.3,4,2,2,
- D.1,2,0,0,
A B C D
C
[解析] 在对一维数组初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值0。本题程序执行过程为:调用change函数,将数组array={1,2,0,0,0}首地址传入函数,函数实现将数组每个元素加2,arrray={3,4,2,2,2}。依次输出数组前4个元素为3,4,2,2。故C选项正确。
28. 设有如下程序段:
int a[8] = {0};
int b[] = {0};
char c[2] = {" A","B"};
char d="AB";
以下叙述正确的是______。
- A.只有a,b,c的定义是合法的
- B.a,b,c,d的定义都是合法的
- C.只有a,b的定义是合法的
- D.只有c的定义是合法的
A B C D
C
[解析] 在对数组进行初始化时应该注意,如果对数组的全部元素赋以初值,定义时可以不指定数组长度,如果被定义数组的长度与初值个数不同,则数组长度不能省略;如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值。定义整型数组a,长度为8,并且其每个元素赋初值0,a定义是合法的。定义整型数组b,没有指定长度,但为1个元素赋值0,所以自动指定数组长度为1,b定义是合法的。定义字符型数组c,长度为2,应对其元素赋值字符型常量,而“A”与“B”均为字符串,c定义不合法。定义字符d,赋初值字符串“A B”,这是不合法的定义,若要定义数组,必须要有“[]”,下标运算符。可知,ab定义合法,cd定义不合法,故C选项正确。
30. 有如下程序:
#include <stdio.h>
#include <string.h>
main()
{
printf("%d\n",strlen("0\n011\1"));
}
程序运行后的输出结果是______。
A B C D
A
[解析] 由一对双引号括起来的一串字符为字符串。字符常量是用一对单引号括起来的单个字符,还有一些特殊字符常量,即以“\”开头的转义字符。“\”后可以为某些单个字符也可以为八进制或十六进制数字。strlen函数统计字符串长度,遇到“\0”统计结束。‘0’‘\n’‘0’‘1’‘1’‘\1’共6个字符,故A选项正确。
31. 有如下程序:
#include <stdio.h>
void convert(char ch)
{
if(ch<'D') convert(ch+1);
printf("%c",ch);
}
main()
{
convert('A'); printf("\n");
}
程序运行后的输出结果是______。
- A.ABCDDCBA
- B.ABCD
- C.A
- D.DCBA
A B C D
D
[解析] 在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。本题程序的执行过程为:调用convert('A')函数,ch='A',if条件成立->convert('B')->converr('C')->convert('D'),if条件不成立,输出D->执行convert('C')中if语句后的输出语句,输出C->执行convert('B')中if语句后的输出语句,输出B->执行convert('A')中if语句后的输出语句,输出A,函数调用完成。程序运行后的输出结果是DCBA,故D选项正确。
32. 有如下程序:
#include <stdio.h>
#include <string.h>
main()
{
char a[]="THIS",*b="OK";
printf("%d,%d,%d,%d\n", strlen(a), sizeof(a), strlen(b), sizeof(b));
}
程序运行后的输出结果是______。
- A.4,5,2,4
- B.4,4,2,1
- C.5,5,3,3
- D.4,5,2,3
A B C D
A
[解析] 在对数组进行初始化时,如果对数组的全部元素赋以初值,定义时可以不指定数组长度,如char a[]="THIs"。将字符指针变量初始化为一个字符串可以定义一个字符指针变量,并且初始化为一个字符串的首地址,如char * b="OK"。strlen函数统计字符串长度,遇到“\0”统计结束。sizeof用来获取类型或数据对象的长度,也即是一个这种数据类型的变量在内存中所占字节数。a数组‘\0’之前有效字符有4个,由于字符串有效字符之后有一个‘\0’也会被放入数组,char类型占一个字节,所以数组a所占字节数为1*5=5。b为指向字符串的指针,字符串长度为2,指针类型变量所占字节数为4。故A选项正确。
33. 有如下程序:
#include <stdio.h>
void get_put()
{
char ch;
ch = getchar();
if(ch !='\n')get_put();
putchar(ch);
}
main()
{
get_put(); printf("\n");
}
程序运行时,输入1234<回车>,则输出结果是______。
A B C D
B
[解析] 在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。本题程序的执行过程为:在输入1234<回车>的情况下,调用get_put()函数,getchar()读入1,在这次调用中的局部变量ch='1',if条件成立->调用get_put()函数,读入2,局部变量ch='2'->调用get_put()函数,读入3,局部变量ch='3'->调用get_put()函数,读入4,局部变量ch='4'->调用get_put()函数,读入回车,if条件不成立,返回执行每次调用函数中if语句后的输出语句,即依次输出4321。故B选项正确。
34. 有如下程序:
#include <stdio.h>
int sum(int data)
{
static int int = 0;
return init += data;
}
main()
{
int i;
for(i=1;i<=5;i++)
printf("%d,", sum(i)); printf("\n");
}
程序运行后的输出结果是______。
- A.1,3,6,10,15,
- B.1,2,3,4,5,
- C.0,0,0,0,0,
- D.1,1,1,1,1,
A B C D
A
[解析] 程序执行过程为:for循环i=1,调用函数sum(1),init=0,data=1,返回init=0+1=1,输出1;i=2,调用函数sum(2),data=2,init=1,返回init=1+2=3,输出3;i=3,调用函数sum(3),data=3,init=3,返回init=3+3=6,输出6;i=4,调用函数sum(4),data=4,init=6,返回init=6+410,输出10;i=5,调用函数sum(5),data=5,init=10,返回init=10+5=15,输出15;i=6,退出for循环。本题运行后的输出结果是1,3,6,10,15,故A选项正确。
36. 设有以下程序段:
struct person
{
char name[10];
char sex;
float weight;
} zhangsan,*ptr;
ptr=&zhangsan;
若要从键盘读入姓名给结构体变量zhangsan的name成员,输入项错误的是______。
- A.scanf("%s",zhangsan->name);
- B.scanf("%s",zhangsan.name);
- C.scanf("%s",ptr->name);
- D.scanf("%s",(*ptr).name);
A B C D
A
[解析] 可用以下3种形式来引用结构体变量中的成员:结构体变量名.成员名;指针变量名->成员名;(*指针变量名).成员名。程序定义了一个结构体变量zhangsan,一个结构体指针ptr,并且使指针指向变量zhangsan。A选项zhangsan为结构体变量名,不能用->引用其成员,A选项错误故选择A选项。zhangsan.name、ptr->name、(*ptr).name均是正确的引用结构体变量成员的方式,故B、C、D选项正确。
37. 有如下程序:
#include <stdio.h>
struct person
{
char name[10];
int age;
}
main()
{
struct person room[4]={{"Zhang",19},{'Li',20},{"Wang",17},{"Zhao",18}};
printf("%s;%d\n",(room+2)->name,room->age);
}
程序运行后的输出结果是______。
- A.Wang:19
- B.Wang:17
- C.Li:20
- D.Li:19
A B C D
A
[解析] 可用以下3种形式来引用结构体变量中的成员:结构体变量名.成员名;指针变量名->成员名;(*指针变量名).成员名。数组名是指向数组首地址,也可以当做指向数组的指针来使用。room+2指向数组第三个元素,(room+2)->name为字符串Wang;r00m指向数组第一个元素,room->age=19。运行后的输出结果是Wang:19,故A选项正确。
38. 有如下程序:
#include <stdio.h>
struct pair
{
int first,second;
};
struct pair get_min_max(int* array,int len)
{
int i;
struct pair res;
res.first=array[0];
res.second=array[0];
for(i=1;i<len; i++)
{
if(array[i]<res.first)
res.first=array[i];
if(array[i]>res.second)
res.second=array[i];
}
return res;
main()
{
int array[5]={9,1,3,4};
struct pair min_max=get_min_max(array,5);
printf("min=%d,max=%d\n",min_max.first,min_max.second);
}
程序运行后的输出结果是______。
- A.min=1,max=9
- B.min=0,max=9
- C.min=1,max=4
- D.min=0,max=4
A B C D
B
[解析] 在对数组进行初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值0,则array[5]={9,1,3,4,0}。程序的执行过程为:调用函数get_min_max(array,5),将数组array首地址传入函数,定义结构体变量res,并为其成员赋值。for循环查找数组array数组的最小值0,将其赋值给res的成员first,查找数组最大值9,赋值给res的成员seconnd。最后返回结构体变量res,则min_max=res。输出min_max.first=0,min_max.second=9,故B选项正确。
39. 有如下程序:
#include <stdio.h>
main()
{
int a=8,b;
b = (a>>2)%2;
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是______。
A B C D
A
[解析] “>>”右移运算符,按位右移运算规则是将一个操作数先转换成二进制数,然后将二进制数各位右移若干位,移出的低位舍弃,并在高位补位。若为无符号数,右移时左边高位移入0。a=8=01000,执行a>>2后,a=00010=2,b=2%2=0,输出a,b为8,0,故A选项正确。
二、程序填空题1. 人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。
请在程序的下画线处填入正确的内容,使程序得出正确的结果。
注意:部分源程序给出如下。
不得增行或删行,也不得更改程序的结构!
试题程序:
#include <stdio.h>
#include <string.h>
#define N 8
typedef struct
{
char num[10];
int year,month,day;
} STU;
/**********found**********/
______fun(STU*std,char*num)
{
int i;
STU a={"",9999,99,99};
for(i=0;i<N;i++)
/**********fomad**********/
if(strcmp(______,num)==0)
/**********found**********/
return(______);
return a;
}
main()
{
STU std[N] = {{"111111",1984,2,15},{"222222",1983,9,21},{"333333",1984,9,1},{"444444",1983,7,15},{"555555",1984,9,28},{"666666",1983,11,15},{"777777",1983,6,22},{"888888",1984,8,19}};
STU p;
char n[10]="666666";
p=fun(std,n);
if(p.num[0]==0)
{
printf("\nNot found!\n");
}
else
{
printf("\nSucceed!\n");
printf("%s%d-%d-%d\n",p.num,p.year,p.month,p.day);
}
}
STU std[i].num std[i]
[考点] 本题考查:if条件表达式;比较字符串函数strcmp;指针变量的使用;函数定义及函数返回值。
strcmp函数用来比较两个字符数组的大小,其格式为:strcmp(字符数组1,字符数组2)。若字符数组1>字符数组2,函数值大于0(正数);若字符数组1=字符数组2,函数值等于0;若字符数组1<字符数组2,函数值小于0(负数)。
[解析] 填空1:根据函数fun的返回值类型可知,函数类型标识符应该是结构体类型的,所以填入STU。
填空2:根据题目说明,找出指定编号人员,并将其数据返回。通过strcmp函数比较编号,若相同则函数值为0,所以填入std[i].num。
填空3:由题目可知,假如编号对应,则返回其编号对应数据,所以填入数据std[i]。
三、程序修改题1. 下列给定程序中,函数fun的功能是:从s所指字符串中,找出t所指字符串的个数作为函数值返回。例如,当s所指字符串中的内容为“abcdabfab”,t所指字符串的内容为“ab”,则函数返回整数3。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
int fun (char*s, char *t)
{
int n;char *p,*r;
n=0;
while(*s)
{
p=s;
r=t;
while(* r)
/**********found**********/
if(*r==*p){r++;p++}
else break;
/**********found**********/
if(r=='\0')
n++;
s++;
}
return n;
}
void main()
{
char s[100],t[100];int m;
system("CLS");
printf("\nPlease enter strings;");
scanf("%s",s);
printf("\nPlease enter substringt;");
scanf("%s",t);
m=fun(s,t);
printf("\nThe result is:m=%d \n",m);
}
if(*r==*p) {r++;p++;}
if(*r=='\0')
[考点] 本题考查:if语句,考生需要根据题意确定if语句的判断条件;字符串结束标识,所有的字符串都要以‘\0’结尾,上机考试常考知识点,考生一定要牢记;复合赋值运算,常用于循环控制和变量的累加、累乘。
[解析] 从字符串s中找出子串t的方法是:从第1个字符开始,对字符串进行遍历,若s串的当前字符等于t串的第1个字符,两个字符串的指针自动加1,继续比较下一个字符;若比较至字符串t的结尾,则跳出循环;若s串的字符与t串的字符不对应相同,则继续对s串的下一个字符进行处理。
四、程序设计题1. 请编写函数fun,该函数的功能是:将s所指字符串中ASCII码值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为“ABCDEFG12345”,其中字符B的ASCII码值为偶数,字符2的ASCII码值为偶数,都应当删除,其他依此类推。最后t所指的数组中的内容应是“ACEG135”。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
试题程序:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
void fun(char*s,char t[])
{
}
void main()
{
char s[100],t[100];
system("CLS");
printf("\nPlease enter string S:");
scanf("%s",s);
fun(s,t);
printf("\nThe result is:%s\n",t);
}
void fun(char*s, char t[])
{
int i=0;
if(t==NULL)return;
for(;*s!='\0';s++) /*找出ASCII值为奇数的字符依次存入数组t中*/
if(*s%2==1)
t[i++]=*s;
t[i]='\0'; /*在字符串的末尾加上串结束符*/
}
[考点] 本题要求将s所指字符串中ASCII码值为偶数的字符删除,因此本题要求采用一个for循环来找出ASCII码值为奇数的字符依次存入数组t中,并使用if条件句来判断s所指字符串中ASCII码值是否为奇数。用‘\0’加在字符串的末尾来表示字符串的结束。
[解析] 要删除ASCII码值为偶数的字符,也就是要留下ASCII码值为奇数的字符。由于最终是要求出剩余字符(即ASCII码值为奇数)形成的新串,所以本题程序的算法是对原字符串从头到尾扫描,并找出ASCII码值为奇数的字符并将其依次存入数组t中。此外,还要注意数组t的下标变化和下标的初值(初值必须为0,即i=0),t[i++]的作用是先使用t[i],然后再使i自增1。