国家二级C语言(函数和数组)机试模拟试卷16
选择题
1.有以下程序
#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+l]);
for (i=0; i<10; i++)
printf(\\(C)
A. 2,1,4,3,6,5,8,7,0,9,
B. 0,9,8,7,6,5,4,3,2,1,
C. 1,2,3,4,5,6,7,8,9,0,
D. 0,1,2,3,4,5,6,7,8,9,
解析:C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。由此可知,在本题中,函数fun(int a,int b)的功能是实现形参整形变量a和b值的互换。当在主函数中调用fun(c[i],c[i+1])时,把实参变量c[i]和c[i+1]的值赋给形参变量a和b,执行完函数fun(c[i],c[i+1])时,形参变量a和b的值发生了互换,实参变量c[i]和c[i+1]的值并没有发生互换,所以输出的值为1,2,3,4,5,6,7,8,9,0。
2.有下列程序:
main( )
{ int i,s=0,t[ ]={l,2,3,4,5,6,7,8,9};
for(i=0;i<9;i+ =2) s+ =*(t+i);
printf(\\(D)
A. 20
B. 45
C. 36
D. 25
解析:本题在主函数中定义了一维整型数组t[ ]={1,2,3,4,5,6,7,8,9};然后在for循环语句中自变量i从0开始,每次自加2,执行s+=*(t+i)语句,因为C语言规定数组名代表数组的首地址,也就是第一个元素的地址。因此*(t+i)代表数组的第i+1个元素。所以程序运行的结果是1+3+5+7+9=25,即变量s的值等于25。
3.下列选项中,能正确定义数组的语句是(D)
A. int num[];
B. int N=2008; int num[N];
C. int num[0..2008];
D. #define N 2008 int num[N];
解析:在定义一维数组时,数组的下标应该是一个确定的整数值。要注意的是在定义二维数组时,其第一维下标可以省略,但第二维下标不能省略。
4.若要求定义具有10个int型元素的一维数组a,则以下定义语句中错误的是(D)
A. #define n 5 int a [2*n];
B. int a[5+5];
C. #define N 10 int a[N];
D. int n=10,a[n];
解析:在C语言中,定义一维数组的语句形式为:类型名 数组名[整型常量表达式]。在选项D中,n是一个整型的变量。
5.下列程序中函数f的功能是:当flag为1时,进行由小到大排序;当flag为0时,进行由大到小排序。
void f(int b[ ],int n,int flag)
{ int i,j,t;
for(i=0;i<n-1;i+ +)
for(j=i+1;j<n;j+ +)
if(flag? b[i]>b[j]:b[i]<b[j])
{t=b[i];b[i]=b[j];b[j]=t;}
}
main( )
{ int a[10]={5,4,3,2,1,6,7,8,9,10},i;
f(&a[2],5,0);
f(a,5,1);
for(i=0;i<10;i+ +)
printf(\\(B)
A. 1,2,3,4,5,6,7,8,9,10,
B. 3,4,5,6,7,2,1,8,9,10,
C. 5,4,3,2,1,6,7,8,9,10,
D. 10,9,8,7,6,5,4,3,2,1,
解析:主函数中进行了两次f函数的调用。第一次传递给形参数组b的地址为元素a[2]的地址,n接收数据位5,因此数组b中元素为3,2,1,6,7,此时flag的值为0,进行由大到小排序,而数组b和实参数组a共用一段存储空间,第一次调用结束以后,数组a的值为5,4,7,6,3,2,1,8,9,10。第二次调用f函数,形参数组接收实参数组a的首地址,取5个元素,由小到大排序,调用结束以后,数组a的值为3,4,5,6,7,2,1,8,9,10。
6.有以下程序
#include <stdio.h>
main()
{
int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i;
for(i=0;i<12;i++)c[s[i]]++;
for(i=1;i<5;i++)printf(\\(A)
A. 4 3 3 2
B. 2 3 4 4
C. 1 2 3 4
D. 1 1 2 3
解析:本题考查for语句的循环控制,首先定义了两个数组并赋予了初始值,第一个for循环语句循环12次遍历s数组的各个元素,将s[]中的原素值作为c[]数组中的下标,使相应的值自加。例如当i=0,c[s[0]]++为c[1]++,其值变为1,当执行i=1,2,…11后,c[1]、c[2]、c[3]、c[4]分别为4、3、3、2,故选项A为正确的运行结果。
7.有下列程序:
#include <stdio.h>
void fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/
{ int t,i,j;
for(i=0;i<n-1;j+ +)
for(j=i+1;j<n;j+ +)
if(a[i]<a[j]) { t=a[i];a[i]=a[j];a[j]=t;}
}
main( )
{ int c[10]={1,2,3,4,5,6,7,8,9,0},i;
fun(c+4,6);
for(i=0;i<10;i+ +) printf(\\(A)
A. 1,2,3,4,9,8,7,6,5,0,
B. 0,9,8,7,6,5,1,2,3,4,
C. 0,9,8,7,6,5,4,3,2,1,
D. 1,2,3,4,5,6,7,8,9,0,
解析:fun()函数的功能是对数组a[ ]的元素从大到小进行排序。所以在主函数执行fun(c+4,6)语句时,将从数组c的第5个元素开始的后6个元素进行从大到小排序。排序之后,数组c的内容变为{1,2,3,4,9,8,7,6,5,0}。
8.有以下程序
#include <stdio.h>
main() {
int c[6]={10,20,30,40,50,60}, *p,*s;
p = c;
s = &c[5];
printf(\\(C
本文档预览:3600字符,共10028字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载