一、选择题14. 有以下程序:
#include <stdio.h>
#include <math.h>
main()
{
int a=1, b=4, c=2;
double x=10.5, y=4.0, z;
z = (a+b)/c + sqrt(y) * 1.2/c + x;
printf("%f\n", z);
}
程序运行后的输出结果是______。
- A.13.700000
- B.14.000000
- C.15.400000
- D.14.900000
A B C D
A
[解析] 如果一个运算符两边的运算数类型不同,要先将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算。程序执行过程为:a+b=5,5/2=2(int类型),sqrt(y)=2.0(double类型),2.0*1.2/2=1.2(double类型),z=2.0(由int类型自动转换成double类型)+1.2+10.5=13.7。故A选项正确。
15. 有以下程序(字母A的ASCII代码为65):
#include <stdio.h>
main()
{
char c1 = 'A'. c2 = 'Y';
printf("%d,%d\n",c1,c2);
}
程序运行后的输出结果是______。
- A.输出格式不合法,输出出错信息
- B.A,Y
- C.65,90
- D.65,89
A B C D
D
[解析] 一个整数,只要它的值在0~255范围之内,也可以用字符形式输出。输出之前,系统会将该整数转化为相应的ASCII码字符。字符也可以用整型来输出,输出的是对应的ASCII值。'A'的ASCII值为65,'Y'的AScII值为89,故D选项正确。
19. 有以下程序:
#include <stdio.h>
main()
{
int a,b,C=241;
a = c/100%9;
b = (-1)&&(-1);
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是______。
A B C D
A
[解析] 程序前面表达式等同于a=(c/100)%9,程序执行过程为:c=241,c/100=2,2%9=2,得a=2;“=”优先级低于“&&”,非0值为真,0值为假,即(-1)为真,逻辑与表达式(-1)&&(-1)为真,得b=1。A选项正确。
20. 有以下程序:
#include <stdio.h>
main()
{
int i;
for(i=1; i<= 5; i++)
{ if(i%2 ) printf("*");
else continue;
printf("#");
}
printf("

\n");
}
程序运行后的输出结果是______。
A.*#*#*#
B.*#*#*
C.*#*#
D.*#*#*#*

A B C D
A
[解析] continue语句只能用在循环结构中,其作用是结束本次循环,即不再执行循环体中continue语句之后的语句,而是立即转入对循环条件的判断与执行。本题执行过程为:i=1,1%2=1,if条件成立,输出*与#;i=2,2%2=0,if条件不成立,执行continue结束本次循环,执行下一次循环;i=3,3%2=1,输出*与#;i=4,4%2=0,执行continue,开始下一次循环;i=5,5%2=1,输出*与#;i=6退出循环。最后输出

。故A选项正确。
22. 有以下程序:
#include <stdio.h>
main()
{
printf("%d\n", NULL);
}
程序运行后的输出结果是______。
A B C D
A
[解析] NULL是在stdio.h头文件中定义的预定义符,NULL的代码值为0,如果以整型格式输出,则输出0。故A选项正确。
25. 有以下程序:
#include <stdio.h>
main()
{
int a[10]={11,12,13,14,15,16,17,18,19,20},* p=a,i=9 ;
printf("%d,%d,%d\n",a[p-a],p[i],*( &a[i]));
}
程序运行后的输出结果是______。
- A.11,19,19
- B.12,20,20
- C.11,20,20
- D.12,19,20
A B C D
C
[解析] *p=a,将数组a的首地址赋给指针p。p-a=0,待输出变量为a[0]。p[i]表示p后i个地址的元素,待输出变量为a[9]。&a[i]取a[i]地址,*(&a[i])取这个地址内的元素,待输出变量为a[9]。最后输出为11,20,20,故C选项正确。
26. 有以下程序:
#include <stdio.h>
void fun( int*s, int, int*k)
{ int p;
for(p=0, * k=p; p<t; p++)
if(s[p]>s[*k] ) *k=p;
}
main()
{
int a[10] = {11,12,13,14,15,16,20,18,19,10},k;
fun(a,10,&k);
printf("%d,%d\n",k,a[k]);
}
程序运行后的输出结果是______。
- A.6,20
- B.10,9
- C.7,20
- D.10,10
A B C D
A
[解析] 调用函数fun,将数组的地址、数组长度、变量k的地址传入函数。for函数实现查找数组中最大值,将其下标值存入变量k标志的内存单元。输出k=6,a[6]=20,故A选项正确。
28. 有以下程序:
#include <stdio.h>
#include <string.h>
main()
{
char str[12]={'s','t','r','I','n','g'};
printf("%d\n", strlen(str));
}
程序运行后的输出结果是______。
A B C D
A
[解析] 数组初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值,如果为字符数组,自动赋值“\0”,即str[12]={'s','t','r','i','n','g','\0',‘\0','\0','\0','\0','\0'}。strlen函数求字符串长度,统计长度时以“\0”结束,即统计到长度为6时结束,strlen函数返回值为6,故A选项正确。
29. 有以下程序:
#include <stdio.h>
main()
{
char *s [6]={"ABCD","EFGH","IJKL","MNOP","QRST","UVWX"}**p;
int i;
p=s;
for( i=0; i<4; i++ ) printf("%s",p[i]);
printf("\n");
}
程序运行后的输出结果是______。
- A.ABCDEFGHIJKLMNOP
- B.ABCDEFGHIJKL
- C.ABCD
- D.AEIM
A B C D
A
[解析] 题目中定义了一个指针数组,并对其初始化,6个指针分别指向6个字符串。定义指向指针的指针,并使其指向这个指针数组。调用printf函数打印前4个字符串,结果为“ABCDEFGHIJKLMNOP”,故A选项正确。
30. 有以下程序:
#include <stdio.h>
main()
{
int i=1,j=3;
printf("%d," ,i++);
{ int i=0;
i+=j*2;
printf("%d,%d," ,i,j);
}
printf("%d,%d\n" ,i,j);
}
程序运行后的输出结果是______。
- A.1,6,3,1,3
- B.1,6,3,2,3
- C.1,6,3,6,3
- D.1,7,3,2,3
A B C D
B
[解析] 程序执行过程为:输出i=1,之后i自增,得i=2;赋值i=0,j=3,执行语句i+=j*2;得i=6;输出i=6,j=3;花括号内的i与花括号外i作用域不同,属于不同的变量。之后再输出i=2,j=3。故B选项正确。
31. 有以下程序:
#include <stdio.h>
int fun(int a,int b)
{
static int m=0, i=2;
i+=m+1; m=i+a+b;
return m;
}
main()
{
int k=4, m=1, p;
p = fun(k,m); printf("%d," .p);
p = fun(k,in); printf("%d\n" ,p);
}
程序运行后的输出结果是______。
A B C D
A
[解析] static(变量又称为静态变量,编译时,将其分配在内存的静态存储区中,在整个程序运行期间都不释放这些存储单元,即使退出函数,下次再进入该函数时,静态局部变量仍使用原来的存储单元,值是上一次函数调用结束时的值。若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值。程序执行过程为:调用函数,m=0,i=2,i=i+m+1=3,m=8,返回p=8,再次调用函数,m=8,i=3,i=i+m+1=12,m=12+4+1=17,返回p=17,故A选项正确。
33. 有以下程序:
#include <stdio.h>
#define F(x) 2.84+x
#define PR(a) printf("%d" ,(int)(a))
#define PRINT(a) PR(a);putehar('\n')
main()
{
PRINT(F(5)*2);
}
程序运行后的输出结果是______。
A B C D
A
[解析] 带参数的宏的调用格式:宏名(实参表),替换过程是,用宏调用提供的实参字符串,直接置换宏定义命令行中相应形参字符串,非形参字符保持不变。将PRINT(F(5)* 2)用PR(F(5)*2);putchar('\n')替换,将PR(F(5)*2)用printf(“%d”,(int)(F(5)*2))替换,再将F(5)用2.84+5替换,最后替换结果为printf(“%d”,(int)(2.84+5*2));putchar('\n'),运行结果为:12<回车>。故A选项正确。
37. 有以下程序:
#include <stdio.h>
main()
{ char c='A';
int x=36,b;
b=(x>>2)&&(c<'a');
printf("%d\n",b);
}
程序运行后的输出结果是______。
A B C D
A
[解析] “>>”右移运算符每次右移一位等价于除2,x=36,执行x>>2后,x=9;“&&”逻辑与运算,先计算左表达式真假,若为假,不计算右表达式,整个逻辑表达式为假,若左表达式为真,再计算右表达式,之后做逻辑与运算;x>>2为真,A的ASCII码为65,a的ASCII码为97,c<'a'为真,整个逻辑表达式(x>>2)&&(c<'a')为真,得b=1。故A选项正确。
38. 有以下程序:
#include <stdio.h>
typedef struct{
char name[10];
int age;
} ST;
main()
{ ST stud[10]={"Adum", 15,
"Muty", 16,
"Paul", 17,
"Johu", 14,
};
┋ }
程序运行后不能输出字符u的语句是______。
- A.printf("%c\n", stud[1].name[1]);
- B.printf("%c\n", stud[3].name[3]);
- C.printf("%c\n", stud[2].name[2]);
- D.printf("%c\n", stud[0].name[3]);
A B C D
D
[解析] stud[0].name[3]为数组stud第一个元素的成员name字符数组的第四个元素m。stud[3].name[3]为数组stud第四个元素的成员name字符数组的第四个元素u。stud[2].name[2]为数组stud第三个元素的成员name字符数组的第三个元素u。stud[1].name[1]为数组stud第二个元素的成员name字符数组的第二个元素u。故D选项正确。
40. 有以下程序:
#include <stdio.h>
main()
{ FILE *fp;
int i,a[6]={1,2,3,4,5,6},k;
fp = fopen("data.dat","w+");
fprintf(fp, "%d\n", a[0]);
for (i=1; i<6; i++)
{ fseek(fp, 0L, 0);
fscanf(fp, "%d", &k);
fseek(fp, 0L, 0);
fprintf(fp, "%din", a[i]+k);
}
rewind(fp);
fseanf(fp, "%d", &k);
fclose(fp);
printf("%d\n", k);
}
程序的运行结果是______。
A B C D
A
[解析] fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针。如果不能实现打开指定文件的操作,则返回一个空指针NULL。fscanf函数从文本文件中按格式输入。fprintf函数按照格式向文本文件中输出数据。文件定位函数fseek,将指针由文件开头0、当前位置1、末尾2移动指定字节。rewind函数功能使文件的位置指针返回到文件头。本例中,循环实现的功能是求数组的和。程序执行过程为:以读/写方式建立一个新的文本文件data.dat,将1写入文件;执行for循环,将文件指针移到文件开头,将文件第一个数值1赋给k,再将指针移动到开头,向文件内输入a[i]+k=3。for循环实现将a数组中元素累加,结果21存放在文件中。调用rewind将文件指针移动到开头,调用fscanf函数从文件中读出数值赋予k=21,调用fclose函数关闭文件,打印k值,故A选项正确。
二、程序填空题1. 给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a。
请在程序的下画线处填入正确的内容,使程序得出正确的结果。
注意:部分源程序给出如下。
不得增行或删行,也不得更改程序的结构!
试题程序:
#include <stdico.h>
typedef struct
{ int hum;
char name [9];
float score[3];
} STU;
void show(STU tt)
{ int i;
printf("%d%s;",tt.num,tt.name);
for(i=0; i<3; i++)
printf("%5.1f",tt.score[i]);
printf("\n");
}
/**********found**********/
void modify(______ *ss,float a)
{ int i;
for(i=0; i<3; i++)
/**********found**********/
ss->______ *=a;
}
main( )
{ STU std={1,"Zhanghua",76.5,78.0,82.0};
float a;
printf("\nThe original number and name and scores:\n");
show(std);
printf("\nInput a number:");
scanf("%f",&a);
/**********found**********/
modify(______,a);
printf("\nA result of modifying:\n");
show(std);
}
STU score[i] &std
[考点] 本题考查:数组变量赋值;函数实参定义。
[解析] 本题是利用结构体存储学生记录,对记录进行修改并由实参ss返回。
填空1:实参ss是一个结构型指针变量,所以应填STU。
填空2:该学生的各科成绩都乘以一个系数a,所以应填score[i]。
填空3:函数的调用,由于函数定义时使用的指针结构型变量,所以应填&std。
三、程序修改题1. 下列给定程序中,函数fun的功能是:求k!(k<13),所求阶乘的值作为函数值返回。例如,若k=10,则应输出3628800。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include <conio.h>
#include <stdio.h>
long fun(int k)
{
/**********found**********/
if k>1
return (k*fun(k-1));
return 1;
}
main( )
{
int k=10;
printf("%d!=%1d\n",k,fun(k));
}
if(k>1)
[考点] 本题考查:if语句,考生需要根据题意来确定if语句是否是正确的,if条件语句经常考,考生需掌握。
[解析] 语法错误,if条件表达式应写在小括号内。
四、程序设计题1. 程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],int n),该函数的功能是:使数组左下半三角元素中的值乘以n。 例如,若n的值为3,a数组中的值为:
则返回主程序后a数组中的值应为:
注意:部分源程序给出如下。
请勿改动函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
试题程序:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 5
void fun(int a[][N],int n)
{
}
main()
{
int a[N][N],n,i,j;
printf(“*****The array*****\n”);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
a[i][j]=rand( )%10;
printf("%4d",a[i] [j]);
}
printf("\n");
}
n=rand( )%4;
printf("n=%4d\n",n);
funf (a,n);
printf("*****THE RESULT*****\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
void fun(int a[][N],int n)
{
int i,j;
if(a==NULL)return;
for(i=0;i<N;i++)
for(i=0;j<=i;j++)
/*矩形的下三角时,积相乘*/
a[i][j]=a[i][j]*n;
}
[考点] 本题的fun的功能是使数组的左下半三角元素中的值乘以n,因此本题需要使用双重for循环,for循环需要注意的是:
循环初值,根据题意要求控制循环变量的取值范围;
循环条件,确定循环结束的条件,即当不满足条件时,结束循环。
[解析] 首先从数组中找出要被乘以n的那部分元素,这一过程其实就是找出将被挑出的元素在原数组中的分布规律的过程。通过观察得出,要被处理的元素下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。找到这个规律后,依次从数组中取得符合要求的元素,然后乘以n。