国家二级(C语言)机试历年真题试卷汇编19(题后含答案及解析)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

国家二级(C语言)机试历年真题试卷汇编19(题后含答案及解析) 题型有:1. 选择题 2. 程序填空题 3. 程序修改题 4. 程序设计题
选择题
1.下列数据结构中,属于非线性结构的是( )。

A.循环队列
B.带链队列
C.二叉树
D.带链栈
正确答案:C
解析:线性结构的特点:①有且只有一个根结点;②每一个结点最多有一个前驱,也最多有一个后继。

不满足线性结构条件的称为非线性结构,二叉树的非叶子结点最多可以用两个后继,属于非线性结构。

2.算法的空间复杂度是指( )。

A.算法在执行过程中所需要的计算机存储空间
B.算法所处理的数据量
C.算法程序中的语句或指令条数
D.算法在执行过程中所需要的临时工作单元数
正确答案:A
解析:算法的空间复杂度是指算法在执行过程中所需要的内存空间,因此本题答案为A。

3.下列数据结构中,能够按照“先进后出”原则存取数据的是( )。

A.循环队列
B.栈
C.队列
D.二叉树
正确答案:B
解析:栈是按“先进后出”的原则组织数据的;队列是按“先进先出”的原则组织数据的,因此本题答案为B。

4.某二叉树共有12个结点,其中叶子结点只有1个。

则该二叉树的深度为(根结点在第1层)( )。

A.3
B.6
C.8
D.12
正确答案:D
解析:二叉树中,度为0的结点数等于度为2的结点数加1,即n2=n0—1,叶子结点即度为0,n0=1,则n2=0,总结点数为12=n0+n1+n2=1+n1+0,则度为1的结点数n1=11,所以深度为12。

故D选项正确。

5.下面不能作为结构化方法软件需求分析工具的是( )。

A.系统结构图
B.数据字典(DD)
C.数据流程图(DFD图)
D.判定表
正确答案:A
解析:结构化方法软件需求分析工具主要有数据流图、数据字典、判定树和判定表。

6.下面不属于软件测试实施步骤的是( )。

A.集成测试
B.回归测试
C.确认测试
D.单元测试
正确答案:B
解析:软件测试主要包括单元测试、集成测试、确认测试和系统测试。

7.下面描述中不属于数据库系统特点的是( )。

A.数据共享
B.数据完整性
C.数据冗余度高
D.数据独立性高
正确答案:C
解析:数据库系统的特点为高共享、低冗余、独立性高、具有完整性等,故C选项错误。

8.负责数据库中查询操作的数据库语言是( )。

A.数据定义语言
B.数据管理语言
C.数据操纵语言
D.数据控制语言
正确答案:C
解析:数据定义语言:负责数据的模式定义与数据的物理存取构建;数据操纵语言:负责数据的操纵,包括查询及增、删、改等操作;数据控制语言:负责
数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。

9.设数据元素的集合D={1,2,3,4,5},则满足下列关系R的数据结构中为线性结构的是( )。

A.R={(1,2),(3,2),(5,1),(4,5)}
B.R={(1,3),(4,1),(3,2),(5,4)}
C.R={(1,2),(2,4),(4,5),(2,3)}
D.R={(1,3),(2,4),(3,5),(1,2)}
正确答案:B
解析:关系R中的每个结点由两个部分构成,分别是数据域和指针域。

选项B中可以看出,元素序列为5→4→1→3→2,符合线性结构的条件。

A选项2的前面有1和3两个数值,带有不确定性;C选项2的后面有4和3两个数值;D选项1的后面有3和2两个数值。

所以B选项正确。

10.一般情况下,当对关系R和S进行自然连接时,要求R和S含有一个或者多个共有的( )。

A.记录
B.行
C.属性
D.元组
正确答案:C
解析:自然连接是一种特殊的等值连接,它满足以下条件:①两关系间有公共域(属性);②通过公共域的等值进行连接,故C选项正确。

11.以下关于结构化程序设计的叙述中正确的是( )。

A.由三种基本结构构成的程序只能解决小规模的问题
B.结构化程序使用goto语句会很便捷
C.一个结构化程序必须同时由顺序、分支、循环三种结构组成
D.在C语言中,程序的模块化是利用函数实现的
正确答案:D
解析:D项正确,C语言允许对函数单独进行编译,从而可以实现模块化。

A项错误,使用三种基本结构组成的程序可以解决复杂的问题;B项错误,使用goto语句会使程序混乱,程序中应该尽量避免使用goto语句;C项错误,一个结构化程序没有必要同时由顺序、分支、循环三种结构组成。

12.以下叙述中正确的是( )。

A.书写源程序时,必须注意缩进格式,否则程序会有编译错误
B.程序的主函数名除main外,也可以使用Main或_main
C.程序可以包含多个主函数,但总是从第一个主函数处开始执行
D.在C程序中,模块化主要是通过函数来实现的
正确答案:D
解析:C语言的源程序中对缩进没有要求,所以A选项错误。

C语言中区分大小写,main函数不能写成Main或_main,所以B选项错误。

一个C程序有且只有一个主函数,所以C选项错误。

13.以下叙述中正确的是( )。

A.只能在函数体内定义变量,其他地方不允许定义变量
B.常量的类型不能从字面形式上区分,需要根据类型名来决定
C.预定义的标识符是C语言关键字的一种,不能另作它用
D.整型常量和实型常量都是数值型常量
正确答案:D
解析:变量可以定义在函数体外,也可以定义在函数体内,所以A错误。

常量的类型可以从字面形式上区分,比如1为整型常量,1.0为实型常量,a为字符型常量,所以B错误。

预定义的标识符不是C语言的关键字,所以C错误。

故D选项正确。

14.若有以下程序段:double x=5.1 6894:printf(“%f\n”,(int)(x*1000+0.5)/(double)1000);则程序段的输出结果是( )。

A.5.170000
B.5.175000
C.5.169000
D.5.168000
正确答案:C
解析:本题考查强制类型转换与输出格式。

%f的输出格式是以带小数点的数学形式输出浮点数。

首先计算x*1000,结果为5168.94,加0.5为5169.44,然后进行强制类型转换,转换成整型为5169,然后除以双精度数据1000,结果为双精度数据5.169,输出时按照%1的格式输出,所以输出结果为5.169000。

15.以下定义语句中正确的是( )。

A.int a=b=0;
B.char A=65+1,b=‘b’;
C.float a=1,*b=&a,*c=&b;
D.double a=0.0;b=1.1;
正确答案:B
解析:定义变量时不能连等,所以A错误;C选项中,b是指针,c定义为指向指针的指针才可以接受&b,所以C错误;D选项,b=1.1前没有类型名,所以错误。

16.若有以下程序:#include<stdio.h>main( ) { int a=一11,b=10;a%=b%=4;printf(“%d %d\n”,a,b);} 则程序的输出结果是( )。

A.1 2
B.一1 2
C.一1—2
D.1—2
正确答案:B
解析:先计算b%=4,即b=b%4,结果为2,然后计算a%=2,结果为一1,最后输出a的值为一1,b的值为2,故B选项正确。

17.下面选项中关于位运算的叙述正确的是( )。

A.位运算的对象只能是整型或字符型数据
B.位运算符都需要两个操作数
C.左移运算的结果总是原操作数据的2倍
D.右移运算时,高位总是补0
正确答案:A
解析:本题考查位运算。

按位取反只需要一个操作数,所以B选项错误;左移一位是原操作数的2倍,其他情况不是,比如左移两位就是原操作数的4倍,所以C选项错误;右移运算时,高位在某些情况下不是补0,所以D选项错误。

故A选项正确。

18.若有以下程序:#include<stdio.h>char fun(char x) {return x*x+’a’;} main( ) { char a,b=0;for(a=0;a<4;a+=1) {b=fun(a);putchar(b);} printf(“\n”);} 则程序的输出结果是( )。

A.abcd
B.ABEJ
C.abej
D.ABCD
正确答案:C
解析:该题首先初始化变量a和b,通过for循环语句使得a取值为0、1、2、3,fun函数的功能是将a*a+’a’的值返回给b,即b为a、b、e、j。

最后通过字符输出函数putchar( )将b输出。

故C选项正确。

19.有以下程序:#include<stdio.h>main( ) {int i,j;for(i=1;i<4;i++) {for(j=i;j<4;j++) printf(“%d*%d=%d”,i,j,i*j);printf(“\n”);} } 程序运行后的输出结果是( )。

A.1*1=1 1*2=2 1*3=3 2*1=2 2*2=4 3*1=3
B.1*1=1 1*2=2 1*3=3 2*2=4 2*3=6 3*3=9
C.1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9
D.1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9
正确答案:B
解析:考查for循环及其嵌套。

第一个for循环用来控制输出行数,第二个
for循环用来控制每行输出的表达式个数。

当i=1,j=1时,第一行输出3个表达式为:1*1=1 1*2=2 1*3=3;当i=2,j=2时,第二行输出2个表达式为:2*2=4 2*3=6:当i=3,j=3时,第三行输出1个表达式为:3*3=9:当i=4时,第一个for循环中判断条件不成立,循环结束,整个程序执行完毕。

因此答案选B。

20.设有定义语句:double a,b,c;若要求通过输入分别给a、b、C输入1、2、3,输入形式如下(注:此处口代表一个空格):口口1.0口口2.0口口3.0<回车>则能进行正确输入的语句是( )。

A.scanf(“%1f%1f%1f”,a,b,c);
B.scanf(“%1f%1f%1f”,&a,&b,&c);
C.scanf(“%f%f%f”,&a,&b,&c);
D.scanf(“%5.1lf%5.1lf%5.llf”,&a,&b,&c);
正确答案:B
解析:本题考查scanf函数的格式化输入。

scanf函数的一般形式为scanf(格式控制,变量1地址,变量2地址,…)。

其中,格式字符串要与数据类型保持一致,由于变量为double型,所以格式字符串中应为%1f,后面应该为变量地址,所以需要加上符号&,故B选项正确。

21.若有以下程序:#include<stdio.h>main( ) { int a=1,b=2,c=3,d=4;if((a=2)&&(b=1))c=2;if((c==3)||(d=一1))a=5;printf(“%d,%d,%d,%d\n”,a,b,c,d);} 则程序的输出结果是( )。

A.2,2,2,4
B.2,1,2,一1
C.5,1,2,一1
D.1,2,3,4
正确答案:C
解析:第一个if语句的判断条件是逻辑与表达式,只有运算对象均非零,结果才为真。

执行第一个if判断条件,均为赋值表达式,第一个运算对象a=2非零,判断第二个表达式b=1也非零,所以条件成立,执行c=2的赋值操作。

执行第二个if判断条件的逻辑或表达式,只要有一个对象非零,结果就是真。

本条件中c==3运算对象为假,所以需要判断第二个运算对象d=一1,结果为一1,非零,条件成立,执行a=5的操作,所以a值为5,b值为1,c值为2,d值为一1。

22.有以下程序:#include<stdio.h>main( ) {double x=2.0,y;if(x<0.0)y=0.0;else if((x<5.0)&&(!x)) y=1.0/(x+2.0);else if(x<10.0)y=1.0/x;else y=10.0;printf(“%f\n”,y);} 程序运行后的输出结果是( )。

A.0.000000
B.0.250000
C.0.500000
D.1.000000
正确答案:C
解析:本题重点考查if语句,变量x和y均为double类型,由于变量x赋值为2.0,因此执行if((x<5.0)&&(!x)),即条件为0,继续执行if(x<10.0),条件为真,即执行y=1.0/x;。

依据printf( )函数输出类型,f是以小数形式输出单/双精度实数。

故C选项正确。

23.有以下程序:#include<stdio.h>main( ) { int a=一2,b=0;while(a++&&++b);printf(“%d,%d\n”,a,b);} 程序运行后输出结果是( )
A.0,2
B.0,3
C.1,3
D.1,2
正确答案:D
解析:本题考查while语句。

while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。

a++即a先参与运算后,a的值再自增1。

++b 即b先自增1,然后再参与其他运算。

当表达式的值为0时,退出循环,最后输出a和b的值为1和2。

故D选项正确。

24.若有以下程序:#include<stdio.h>main( ) { int a=6,b=0,c=0;for(;a;){b+=a;a一=++c;) printf(“%d,%d,%d\n”,a,b,c);} 则程序的输出结果是( )。

A.1,14,3
B.0,14,3
C.0,18,3
D.0,14,6
正确答案:B
解析:for循环的判断条件是只要a为0就退出循环体。

初始a的值为6,满足条件,执行完循环体,b的值为6,a一=++c,即a=a一(++c),所以a的值为5,c的值为1。

第二次循环后b的值为11,a的值为3,c的值为2。

第三次也是最后一次循环后,a的值为0,b的值14,c的值为3。

故B选项正确。

25.以下叙述中正确的是( )。

A.一条语句只能定义一个数组
B.每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元
C.数组说明符的一对方括号中只能使用整型常量,而不能使用表达式
D.在引用数组元素时,下标表达式可以使用浮点数
正确答案:B
解析:A选项中,一条语句只能定义一个数组是不准确的,可以通过一条语句定义多个数组;C选项中,数组说明符的一对方括号中可以是整型常量,也可以是整型常量表达式;D选项中,在引用数组元素时,下标表达式必须是整型的。

故B选项正确。

26.有如下程序:#include<stdio.h>#include<string.h>main( ) { char a[]=“1234”,*b=“ABC”;printf(“%d %d %d %d\n”,strlen(a),sizeof(a),strlen(b),sizeof(b));} 程序运行后的输出结果是( )。

A.4 5 3 4
B.4 3 2 1
C.4 5 3 3
D.4 5 1 3
正确答案:A
解析:对于字符数组a,含有4个元素,所以strlen为4,而sizeof包括最后隐藏的\0(结束符),故sizeof有5个。

对于字符串b,strlen为3,关键是sizeof,这里的sizeof不再是指数组的长度,因为b是一个地址值,整型数据,所以占用了4个字节。

27.有如下程序:#include<stdio.h>main( ) { if(‘\0’==0)putchar(‘X’);if(‘0’==0) putchar(‘Y’);if(‘a’>’b’)putchar(‘Z’);printf(“\n”);} 程序运行后的输出结果是( )。

A.YZ
B.XYZ
C.X
D.Y
正确答案:C
解析:本题考查字符的ASCII码值。

其中字符’\0’的ASCII码值是0,字符’0’的ASCII码值是48,字符’a’和字符’b’的ASCII码值分别是97、98,所以程序当中的三个if判断语句,只有第一个判断条件成立,然后执行putchar函数,输出X。

故C选项正确。

28.以下叙述正确的是( )。

A.语句int a[4][3]={{1,2},{4,5}};是错误的初始化形式
B.语句int a[4][3]={1,2,4,5};是错误的初始化形式
C.语句int a[][3]={1,2,4,5};是错误的初始化形式
D.在逻辑上,可以把二维数组看成是一个具有行和列的表格或矩阵
正确答案:D
解析:二维数组在初始化时,可以省略第1维,但是不可以省略第2维,可以为部分数组元素初始化。

A选项、B选项和C选项内的初始化都没有错误。

故D选项正确。

29.设有某函数的说明为:int *func(int a[10],int n);则下列叙述中,正确的是( )。

A.形参a对应的实参只能是数组名
B.说明中的a[10]写成a[]或*a,效果完全一样
C.func的函数体中不能对a进行移动指针(如a++)的操作
D.只有指向10个整数内存单元的指针,才能作为实参传给a
正确答案:B
解析:考查数组名作为函数参数。

数组名作为函数参数时,只传递数组的首地址而不检查形参数组的长度,所以形参表中可以不给出形参数组的长度,形参数组和实参数组长度也可以不同,选项D错;a[10]、a[]、*a做形参都是接受实参数组首地址,效果一样,B正确。

传递给形参的实参可以是数组名,还可以是指向该数组的指针变量,选项A错。

数组名可以看做一个指针常量,对其进行自加自减运算相当于指针变量的自加自减,选项C错。

答案选B。

30.有以下程序:#include<stdio.h>int fun(int x,int y) { if(x!=y)return((x+y)/2);else return(x);} main( ) { int a=4,b=5,c=6;printf(“%d\n”,fun(2*a,fun(b,c)));} 程序运行后的输出结果是( )。

A.3
B.6
C.8
D.12
正确答案:B
解析:考查函数的调用。

输出结果为fun(2*a,fun(b,c))=fun(8,5)=6,答案选B。

31.要求定义一个具有6个元素的int型一维数组,以下选项中错误的是( )。

A.int N=6,a[N];
B.int a[2*3]={0};
C.#define N 3 int a[N+N];
D.int a[]={1,2,3,4,5,6};
正确答案:A
解析:数组定义中长度不能为变量。

32.以下叙述中正确的是( )。

A.字符串常量str1的类型是字符串数据类型
B.有定义语句:char str1[]=“str1”;,数组str1包含4个元素
C.下面的语句用赋初值的方式来定义字符串,其中,’\0’不可缺少char str1[]={‘s’,’t’,’r’,’1’,’\0’};
D.字符数组的每个元素可存放一个字符,并且最后一个元素必须是’\0’
字符
正确答案:C
解析:本题考查字符数组的相关操作。

A选项中strl的类型不是字符串类型;B选项中数组strl包含了5个元素,其中有结尾符;D选项中字符数组的最后一个元素可以不是’\0’字符。

故C选项正确。

33.以下叙述中错误的是( )。

A.当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL
B.函数可以返回地址值
C.改变函数形参的值,不会改变对应实参的值
D.可以给指针变量赋一个整数作为地址值
正确答案:D
解析:不可以把一个int型数据直接赋值给一个指针变量,只能用取地址运算符“&”把该整型变量的地址赋值给该指针变量,选项D错误;函数类型若为指针类型则可以返回地址值,选项B正确;函数传参过程中,是把实参的数据复制一份传给形参,所以改变形参的值不会对实参造成影响,选项C正确;NULL 的定义包含在头文件stdio.h中,所以选项A正确;所以答案选D。

34.设有定义语句:float a[10],x;则以下叙述中正确的是( )。

A.语句a=&x;是非法的
B.表达式a+1是非法的
C.三个表达式a[1]、*(a+1)、*&a[1]表示的意思完全不同
D.表达式*&a[1]是非法的,应该写成*(&(a[1]))
正确答案:A
解析:数组名表示该数组的首地址,是一个地址常量,不能对它重新赋值,A正确。

但是可以把数组名看做一个指针常量,则表达式a+1表示的是数组中第二个元素的地址,选项B错。

表达式a[1]、*(a+1)、*&a[1]都指的是数组a中第二个元素的值,选项C错。

[]运算符的优先级高于*、&,取值*和取址&运算符优先级相等,同一优先级的运算符,运算次序由结合方向所决定,*&a[1]在运算符优先级和结合性上没有问题,并且取值*和取址&运算符互逆,*&a[1]和a[1]等价,相当于求得数组a第二个元素的值,选项D错。

答案选A。

35.有以下程序:#include<stdio.h>int fun(int n) {int a;if(n==1)return 1;a=n+fun(n一1);return a;} main( ) {printf(“%d\n”,fun(5));} 程序的输出结果是( )。

A.9
B.14
C.10
D.15
正确答案:D
解析:考查函数的递归调用。

只需要一步一步递归调用函数即可,执行fun(5)=5+(4+(3+(2+fun(1))))=15,故D选项正确。

36.以下针对全局变量的叙述错误的是( )。

A.全局变量的作用域是从定义位置开始至源文件结束
B.全局变量是在函数外部任意位置上定义的变量
C.用extern说明符可以限制全局变量的作用域
D.全局变量的生存期贯穿整个程序的运行期间
正确答案:C
解析:在不同编译单位内用extern说明符来扩展全局变量的作用域,extern 可以将全局变量作用域扩展到其他文件,而不是限制全局变量的作用域。

37.以下叙述中正确的是( )。

A.如果p是指针变量,则&p是不合法的表达式
B.如果p是指针变量,则*p表示变量p的地址值
C.在对指针进行加、减算术运算时,数字1表示1个存储单元的长度
D.如果p是指针变量,则*p+1和*(p+1)的效果是一样的
正确答案:C
解析:A选项中,如果p是指针变量,则&p表示变量p的地址;B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。

故C选项正确。

38.有以下程序:#include<stdio.h>#define N 2 #define M N+1 #define NUM(M+1)*M/2 main( ) {printf(“%d\n”,NUM);} 程序运行后的输出结果是( )。

A.4
B.8
C.9
D.6
正确答案:B
解析:本题考查宏定义。

宏定义只是做个简单的替换,执行NUM=(N+1+1)*N+1/2=8,敌B选项正确。

39.有以下程序:#include<stdio.h>main( ) { int a=2,c=5;printf(“a=%%d b=%%d\n”,a,c);} 程序运行后的输出结果是( )。

A.a=%d b=%d
B.a=%2 b=%5
C.a=%%d b=%%d
D.a=2 b=5
正确答案:A
解析:%在C语言中有两个作用,一是用作取余数运算符,另一个用作转义符。

%%d相当于将第二个%转义了,所以输出为%d。

故总的输出为A选项。

40.设有如下语句:typedef struct Date{ int year;int month;int day;}DATE;则以下叙述中错误的是( )。

A.DATE是用户说明的新结构体类型名
B.struct Date是用户定义的结构体类型
C.DATE是用户定义的结构体变量
D.struct是结构体类型的关键字
正确答案:C
解析:该定义语句把结构体struct Date命名为一个新的类型名“DATE”,DATE相当于“struct Date”,是结构体类型名,选项C描述错误,答案选C。

程序填空题
41.下列给定程序中,函数fun的功能是:计算f(x)=1+x+<10一6。

若x=2.5,函数值为12.182494。

请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构。

试题程序:#include<stdio.h>#include<math.h>double fun(double x) { double f,t;int n;/******found******/f=1.0+【1】;t=x;n=1;do{ n++;/******found******/t*=x /【2】;/******found******/f+=【3】;}while(fabs(t)>=1e一6);return f;} main( ) { double x,y;x=2.5;y=fun(x);printf(“The result is:\n”); printf(“x=%一12.6f y=%一12.6f\n”,x,y);} 正确答案:(1)x (2)n (3)t
解析:本题考查:累加、累乘;算术运算;复合赋值运算;do…while循环条件。

填空1:通过下面的语句可以知道n是从2开始的,而根据题目的要求是从1+x开始的,因而此空应填写x。

填空2:由于本题用的是do…while,先循环后再判断,因此本空应该填写n。

填空3:根据题目要求和复合赋值运算可知此空应填t。

程序修改题
42.下列给定程序中,函数fun的功能是:将主函数中两个变量的值进行交换。

例如,若变量a中的值为8,b中的值为3,则程序运行后,a中的值为3,b中的值为8。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 试题程序:#include<stdio.h>/******found******/void fun(int x,int y) { int t;/******found******/t=x;x=y;y=t;} void main( ) { int a,b;a=8:b=3;fun(&a,&b);printf(“%d %d\n”,a,b);}
正确答案:(1)void fun(int *x,int *y) (2)t=*x;*x=*y;*y=t;
解析:(1)本题考查指针变量作函数参数。

一般变量作参数时,不能改变实参的值,采用指针变量作为参数则能够改变实参的值。

主函数中fun函数的调用方式表明fun函数的参数应当为指针类型。

(2)此处是一个变量交换操作错误,可知x、y是指针类型,变量类型不同,因而x、y不能与t进行值的交换。

程序设计题
43.请编写函数fun,其功能是:找出一维整型数组元素中最大的值及其所在的下标,并通过形参传回。

数组元素中的值已在主函数中赋予。

主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入编写的若干语句。

试题程序:#include<stdlib.h >#include<stdio.h>#included time.h>void fun(int a[],int n,int*max,int*d) { } void main( ) { FILE *wf;int i,x[20],max,index,n=10;int y[20]={4,2,6,8,11,5};srand((unsigned)time(NULL));for(i=0;i<n;i++) { x[i]=rand( )%50;printf(“%4d”,x[i]);/*输出一个随机数组*/} printf(“\n”);fun(x,n,&max,&index);printf(“Max=%5d,Index=%4d\n”,max,index);/************/wf=fopen(“out.dat”,”w”);fun(y,6,&max,&index);fprintf(wf,”Max=%5d,Index=%4d”,max,index);fclose(wf);/************/} 正确答案:void fun(int a[],int n,int *max,int *d) {int i;*max=a[0];*d=0;for(i=0;i<n;i++) /*将最大的元素放入指针max所指的单元,最大元素的下标放入指针d所指的单元*/if(*max<a[i]) { *max=a[i];*d=i;} }
解析:本题考查:查找一维数组中的最大值及其下标,使用循环判断结构实现;指针变量的应用。

要查找最大值及其下标需要定义两个变量,该程序直接使用形参max和d,由于它们都是指针变量,所以在引用它们所指向的变量时要对其进行指针运算。

循环语句用来遍历数组元素,条件语句用来判断该数组元素是否最大。

该程序考查求最大值,需要掌握以下语句:for(i=0;i<n;i++) /*将最大的元素放入指针max所指的单元,最大元素的下标放入指针d 所指的单元*/if(*max<a[i]) {*max=a[i];*d=i;}。

相关文档
最新文档