国家二级(C语言)机试模拟试卷123(题后含答案及解析)

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

国家二级(C语言)机试模拟试卷123(题后含答案及解析)
题型有:1. 选择题 2. 程序填空题 3. 程序修改题 4. 程序设计题
选择题
1.在关系代数运算中,有5种基本运算,它们是( )。

A.并(∪)、差(-)、交(∩)、除(÷)和笛卡儿积(×)
B.并(∪)、差(-)、交(∩)、投影(π)和选择(σ)
C.并(∪)、交(∩)、投影(π)、选择(σ)和笛卡儿积(×)
D.并(∪)、差(-)、投影(π)、选择(σ)和笛卡儿积(×)
正确答案:D
解析:并、差、笛卡儿积、投影和选择是5种基本的运算,其他运算即交、连接和除,均可以通过5种基本的运算来表达。

2.在数据库系统的组织结构中,下列( )映射把用户数据库与概念数据库联系了起来。

A.外模式/模式
B.内模式/外模式
C.模式/内模式
D.内模式/模式
正确答案:A
解析:数据库有两层映像,即外模式/模式和模式/内模式映像。

模式/内模式映像定义数据库全局逻辑结构与存储结构之间的对应关系。

3.下列关于线性链表的描述中,正确的是( )。

Ⅰ、只含有一个指针域来存放下一个元素地址Ⅱ、指针域中的指针用于指向该结点的前一个或后一个结点(即前件或后件)Ⅲ、结点由两部分组成:数据域和指针域。

A.仅Ⅰ、Ⅱ
B.仅Ⅰ、Ⅲ
C.仅Ⅱ、Ⅲ
D.全部
正确答案:D
解析:在定义的链表中,若只含有一个指针域来存放下一个元素地址,称这样的链表为单链表或线性链表。

在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。

其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。

4.下面关于数据库三级模式结构的叙述中,正确的是( )。

A.内模式可以有多个,外模式和模式只有一个
B.外模式可以有多个,内模式和模式只有一个
C.内模式只有一个,模式和外模式可以有多个
D.模式只有一个,外模式和内模式可以有多个
正确答案:B
解析:数据库的三级模式结构是指数据库系统的外模式、模式和内模式。

一个数据库可以有多个外模式,但只有一个模式和一个内模式。

5.设有关键码序列(66,13,51,76,81,26,57,69,23),要按关键码值递增的次序排序,若采用快速排序法,并以第一个元素为划分的基准,那么第一趟划分后的结果为( )。

A.23,13,51,57,66,26,81,69,76
B.13,23,26,51,57,66,81,76,69
C.23,13,51,57,26,66,81,69,76
D.23,13,51,57,81,26,66,69,76
正确答案:A
解析:快速排序是起泡排序的改进。

在快速排序中,任取一个记录,以它为基准用交换的方法将所有的记录分成两部分,关键码值比它小的在一部分,关键码值比它大的在另一部分,再分别对两个部分实施上述过程,一直重复到排序完成。

6.下列哪一条不属于数据库设计的任务?( )
A.设计数据库应用结构
B.设计数据库概论结构
C.设计数据库逻辑结构
D.设计数据库物理结构
正确答案:A
解析:数据库设计工作量大而且过程复杂,既是一项数据库工程也是一项庞大的软件工程。

考虑数据库及其应用系统开发全过程,将数据库设计分为以下6个阶段:需求分析、概念结构设汁、逻辑结构设计、物理结构设计、数据库实施和数据库的运行和维护。

7.数据库技术的根本目标是( )。

A.数据存储
B.数据共享
C.数据查询
D.数据管理
正确答案:B
解析:数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合,它具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享,所以数据库技术的根本目标是解决数据共享问题。

8.需求分析阶段的任务是( )。

A.软件开发方法
B.软件开发工具
C.软件开发费用
D.软件系统功能
正确答案:D
解析:需求分析县软件定义时期的最后一个阶段,它的基本任务就是详细调查现实世界要处理的对象,充分了解原系统的工作概况,明确用户的各种需求,然后存这些基础上确定新系统的功能。

9.关系数据库管理系统能实现的专门关系运算包括( )。

A.排序、索引、统计
B.选择、投影、连接
C.关联、更新、排序
D.显示、打印、制表
正确答案:B
解析:关系数据库管理系统的专门关系运算包括选择运算、投影运算和连接运算。

10.数据管理技术发展的三个阶段中,( )没有专门的软件对数据进行管理。

Ⅰ.人工管理阶段Ⅱ.文件系统阶段Ⅲ.数据库阶段A.仅Ⅰ
B.仅Ⅲ
C.Ⅰ和Ⅱ
D.Ⅱ和Ⅲ
正确答案:A
解析:数据管理技术发展的三个阶段中,只有人工管理阶段,没有操作系统,没有管理数据的软件,数据处理方式是批处理。

在文件系统阶段,操作系统中已经有了专门数据管理软件,一般称为文件系统。

在数据库系统阶段,出现了统一管理数据的专门软件系统,即数据库管理系统。

11.下面说法正确的是( )。

A.一个C程序可以有多个主函数
B.一个C语言的函数中只允许有一对花括号
C.C程序的书写格式是自由的,一个语句可以写在一行上,也可以写在多行内
D.在对C程序进行编译时,可以发现注释行中的拼写错误
正确答案:C
解析:本题涉及C语言基本的3个知识点:①c语言规定一个程序只允许有
一个主函数,一个函数内可以允许有多个花括号;②C程序的注释部分仅仅是方便程序员阅读,提高程序的可读性和可移植性,它并不参与程序的编译,所以编译器也就不会发现注释中的错误。

12.下列不合法的用户标识符是( )。

A.j2_KEY
B.Double
C.4d
D._8_
正确答案:C
解析:在C语言程序中,合法标识符的命名规则是:标识符可以由字母、数字和下划线组成,并且第一个字符必须是字母或下划线。

13.以下4个选项,不能看作一条语句的是( )。

A.{;}
B.int x=0,y=1,z=0;
C.if(!a);
D.if(b==0)m=1;n=2;
正确答案:D
解析:if语句是用来判定所给的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。

在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句,此时用花括号“{}”将几个语句括起来成为一个复合语句。

选项D)中没有将两个操作语句括起来,不能看作一条语句。

14.设a和b均为int型变量,且a=6、b=11、c=3,则能使值为3的表达式是( )。

A.b%(c%4)
B.b%(c-a%5)
C.b%a-a%5
D.(b%a)-(a%4)
正确答案:D
解析:选项D)括号内的运算分别是b%a=11%6=5和a%c=6%4=2,最后得到5-2=3。

15.以下程序的输出结果是( )。

main( ) {int a=4,b=3,c=2,d=1;printf(“%d”,a>b?a:d>c?d:b);}
A.1
B.3
C.2
D.4
正确答案:D
解析:本题首先判断a>b,当a>b时结果等于a,否则等于“d>c?d:b”,因为a>b,所以直接输出a的值,注:这里“a:d>c?d:b”是用来干扰考生的。

16.阅读以下程序#include<stdio.h>main( ) { Int Case;float printF;printf(“请输入2个数:”):scanf(“%d%f”,&Case,&printF);printf(“%d%f\n”,Case,printF);}以下说法正确的是( )。

A.定义语句出错,Case是关键字,不能用作用户自定义标识符,printF不能用作用户自定义标识符
B.定义语句出错,Int无法被识别
C.定义语句无错,scanf不能作为输入函数使用
D.定义语句无错,printf不能输出Case的值
正确答案:B
解析:C语言是一种大小写敏感的语言,因此Int应为int,而Case printF则可以使用。

17.若有定义:float x=1.5;int a=1,b=3,c=2;则正确的switch语句是( )。

A.switch(x){case 1.0:printf(“*\n”);case 2.0:printf(“**\n”);}
B.switch((int)x);{case 1:print(“*\n”);case 2:printf(“**\n”);}
C.switch(a+b){case 1:print(“*\n”);case 2+1:print(“**\n”);}
D.switch(a+b){case 1:printf(“*\n”);case c:printf(“**\n”);}
正确答案:C
解析:在C语言中,switch( )后的一对圆括号中可以是整型表达式或字符表达式。

case语句后面的常量表达式的类型必须与switch后圆括号中的表达式类型相同,各case语句标号的值应该互不相同。

选项A)中case后面的常量表达式为实型,所以不正确;选项D)中case后面出现了变量表达式,所以选项D)错误。

18.有以下程序:main( ) { int k=33;printf(“%d,%o,%x”,k,k,k);}执行后的输出结果是( )。

A.33,033,0x21
B.33,033,21
C.33,041,021
D.33,41,21
正确答案:D
解析:本题考查不同进制间的转换。

printf输出函数中输出变量的格式,由输出格式符决定。

题中“%o”格式符表示以八进制的形式输出;“%x”格式符表示以十六进制的形式输出。

“33”的八进制和十六进制分别是41和21。

19.当输入为”Fool&Swalow”时,下面程序的执行结果是( )。

#include<stdio.h>main( ) { char c;while(c!=‘?’)
{ c=getchar( );putchar(c);}}
A.Swalow
B.Fool
C.Fool?
D.?Swalow
正确答案:C
解析:本程序是通过getch( )函数读入字符,并通过putchar( )函数将字符逐个输出,当用户输入“?”时停止输出。

20.下面程序段的输出结果是( )。

#include<stdio.h>main( ) { float x=1.236547;printf(“%f\n”,(int)(x*1000+0.5)/(float)1000);} A.1.237000
B.输出格式说明与输出项不匹,输出无定值
C.1.236000
D.1.24
正确答案:A
解析:本题中,(int)(x*1000+0.5)的结果为1237,(float)1000是将1000强制转换成float类型;整个表达式(int)(x*1000+0.5)/(float)1000的结果为1.237000,再以实数(6位小数)形式输出。

21.若变量都已正确说明,则以下程序段( )。

#include<stdio.h >main( ) {int a=8;int b=6:printf(a>b?”&&&a=%d”:”!!!b=%d”,a,b);}
A.输出为:&&&a=8
B.输出为:!!!b=8
C.输出为:&&&a=8 !!!b=6
D.全部错误
正确答案:A
解析:本题考查printf的输出格式和条件表达式“?:”的使用。

①printf函数输出时,“&&&%d\n”和“!!!%d\n”中的“&&&”和“!!!”都是直接输出。

②条件表达式的基本格式为:a?b:c。

其运算规则为:当a为非0时,整个表达式的值取b的值,当a为0时,整个表达式取c的值。

printf函数中如果在格式说明符之前插入任何字符都将原样输出。

本题中a>b为真,所以返回“&&&a=%d”。

22.语句“printf(“a\bhow\’are\’y\\\bou\n”);”的输出结果是( )。

A.a\bhow\’are\’y\\bou
B.a\bhow\’are\’y\bou
C.how’are’you
D.ahow’are’y\bou
正确答案:C
解析:“\b”格式符表示退格,功能是将它后面的字母把它前面的字母覆盖,导致“\b”格式符前面的字母不能输出:“\’”,格式符表示输出单引号字符;“\\”格式符表示输出反斜线字符。

23.下面程序的运行结果是( )。

#include<stdio.h>main( ) {int i;for(i=1;i<=5;i++) { if(i%2)printf(“*”);else printf(“#”);}}
A.*#*#*
B.#*#*#*
C.*#*#
D.#*#*
正确答案:A
解析:分析程序可知,程序循环5次,然后利用if语句决定每次循环时输出的字符。

当i为奇数时,i%2=i,if(i%2)为真,输出“*”;当i为偶数时,i%2=0,if(i%2)为假,执行elsc语句,输出“#”,所以当i取1、3、5值时输出“*”,当i取2、4值时输出“#”。

24.以下关于return语句的叙述中不正确的是( )。

A.一个自定义函数中必须有一条return语句
B.一个自定义函数中可以根据不同情况设置多条return语句
C.如果一个函数有多个return语句,那么不论运行到哪一个return语句,该函数将结束
D.没有return语句的自定义函数在执行完最后一条语句时返回到调用处
正确答案:A
解析:return语句主要用于返回函数的值。

在一个自定义函数中,可以根据小同的情况设置多条return语句返回函数的值,也可以不包含return语句。

25.有以下程序:main( ) {int n=0;do{n++;printf(“%d \n”,n);} while(n<=3);}程序的输出结果是( )。

A.12
B.123
C.1234
D.1
正确答案:C
解析:本题考查do…while循环。

在do…while构成的循环体中,总是先执行一次循环体,然后再求表达式的值。

当执行完第三次循环时,得到n=3,while 循环表达式仍然成立,接着执行直到n=4,表达式不成立,跳出循环,结束程序。

26.下面程序的运行结果是( )。

#include<stdio.h>void del(char*s) { int i,j;char*a;a=s;for(i=0,j=0;a[i]!=‘\
0’;i++) {if(a[i]>=‘0’&&a[i]<=‘9’){s[j]=a[i];j++;}s[j]=‘\0’;}} main( ) { char s[]=“aa89gggh”;del(s);printf(“\n%s”,s);} A.aa
B.89
C.gggh
D.aa89gggh
正确答案:B
解析:本题中del(char*s)函数实现的功能是:逐个读入s数组中的字符,如果遇到数字,则将其重新存在s中,遇到非数字字符则跳过。

所以最后输出的应该是字符串s中的所有数字。

27.下列说法不正确的是( )。

A.int*fun( ):----fun是一个返回int指针的函数
B.int(*fun)( );---fun是一个返回int指针的函数
C.int(*array[5])( );----array是一个有5个元素的数组,每一个元素都是一个函数指针,指向一个返回int的函数
D.int(*fun(int))(int);----fun是带有一个int参数的函数,返回值是一个函数指针,这个指针指向带有一个int参数并返回int的函数
正确答案:B
解析:该函数中fun是一个函数指针。

指向一个返回int的函数。

28.下列程序的输出结果是( )。

#include<stdio.h>main( ) void fun(int*a,int*b) { int a=1,b=2,*x=&a,*y=&b;{ int*k;fun(x,y);k=a;a=b;b=k;} printf(“%d%d”,a,b);} A.2 1
B.1 2
C.编译出错
D.0 0
正确答案:B
解析:本题考查函数调用时的参数传递。

分析题目可知fun函数的形参是指向实参的指针,但main( )函数中调用fun( )函数时,实参是指针变量x、y(分别为指向a和b的指针),a、b的值在函数调用前后未发生变化,因而a=1,b=2,即输出1 2。

29.下列二维数组初始化语句中,正确且与语句int a[][3]={1,2,3,4,5}等价的是( )。

A.int a[2][]={{1,2,3},{4,5}};
B.int a[][3]={1,2,3,4,5,0};
C.int a[][3]={{1,0),{2,0},{3,0});
D.int a[2][]={{1,2,3},{4,5,6}};
正确答案:B
解析:此题考查的是二维数组的初始化。

题干中数组a的第二个下标为3,由此可知数组a是一个2行3列的数组,初始化时未赋初值的元素的值自动为0,所以与选项B)是等价的,最后一个元素的值为0。

30.有以下字符串,说明表达式strlen(s)值的是( )。

char s[10]={‘a’,’\n’,’a’,’b’,’\t’,’c’};
A.10
B.1
C.6
D.7
正确答案:C
解析:strlen(s)返回s字符串中字符的个数,若s是一个数组,则返回数组元素的个数。

31.有以下程序:#include<stdio.h>main( ) void fun(char*c,int d) { char a=‘F’,b=‘f’;{ *c=*c+1:fun(&b,a);d+=1;printf(“%c,%c\n”,a,b);} printf(“%c,%c”,*c,d);}程序的输出结果为( )。

A.g,GF,g
B.g,FF,g
C.G,fF,G
D.f,gf,g
正确答案:A
解析:此题考查的是函数参数的传递。

main函数中首先凋用fun函数,fun 函数的功能是使字符c的ASCII码值加1并输出,使d加1并输出对应的字符;fun(&b,a)输出“g,G”,但是由于fun函数的第一个参数进行的是地址传递,而第二个参数进行的是值传递,所以main函数中的printf函数输出“F,g”。

32.若有以下定义,则对a数组元素地址的正确引用是( )。

int a[5],*p=a;
A.p+5
B.*a+1
C.&a+1
D.&a[0]
正确答案:D
解析:本题考查如何引用数组元素的地址。

选项A)中,p+5引用的是a[5]的地址,而数组a只有5个元素,即a[0]、a[1]、a[2]、a[3]、a[4],所以引用错误;选项B)中,*a+1指的是将数组a的第一个元素加1;选项C)中,这种引用方式错误;选项D)中,&a[0]引用的是数组的首地址。

33.判断字符串s1是否大于字符串s2,应该使用( )。

A.if(strcmp(s1,s2)<0)
B.if(s1>s2)
C.if(strcmp(s2,s1)<0)
D.if(strcmp(s1,s2))
正确答案:C
解析:本题考查字符串比较函数strcmp( ),调用形式:strcmp(str+1,str+2),其中str+1、str+2分别是字符串存储区的首地址,函数功能:比较字符串str1和str2,当str1<str2时,返回值为负数;当str1=str2时,返回0;当str1>str2,返回值为正数。

注意:不能使用关系运算符比较两个字符串的大小。

34.若输入bcdefgh、m、abcdefg,以下程序的输出结果为( )。

#include <stdio.h>#include<string.h>main( ) { int i;char string[20],str[3][20];for(i=O;i<3;i++)gets(str[i]);if(strcmp(str[0],str[1])>0)strcpy(string,str[0]);else strcpy(string,str[1]);if(strcmp(str[2],string)>0)strcpy(string,str[2]);printf(“%s”,string);} A.bcdefgh
B.m
C.abcdefg
D.bcdefgh或abcdefg
正确答案:B
解析:本题考查字符比较函数和字符复制函数:strcmp(s1,s2);函数功能:比较字符串str1和str2比较的是字符的ASCII码的值,当str1<str2时,返回值为负数;当str1=str2时,返回0;当str1>str2,返回值为正数。

35.请阅读以下程序:#include<stdio.h>#include<string.h>void fun(int b[]) main( ) { static int i=0;{ int k,a[5]={1,3,5,4,9};Do{ b[i]+=b[i+1];fun(a);}while(++i<2);}for(k=0;k<5;k++)printf(“%d”,a[k]);}上面程序的输出是( )。

A.13579
B.48579
C.48549
D.48999
正确答案:C
解析:本题考查的是for循环以及while循环。

fun函数中定义了静态变量i=0,fun(a)使得a[0]=a[0]+a[1]=4,a[1]=a[1]+a[2]=8,此时i的值变为1,++i<2不成立,所以do-while循环结束,输出数组a的各元素即得到48549。

36.在下述程序中,判断i>j共执行的次数是( )。

main( ) { int i=0,j=10,k=2,s=0;for(;;) { i+=k;if(i>j){printf(“%d”,s);break;}s+=i;}}
A.4
B.7
C.5
D.6
正确答案:D
解析:分析程序,i+=k;使得i的值每次增加2然后再和j进行比较看i>j 是否成立,i的变化过程为:i=2,i=4,i=6,i=8,i=10,i=12,此时i>j成立,所以判断i>j共执行的次数为6次。

37.下列程序的输出结果是( )。

#include<stdio.h>main( ) { struct st {int y,x,z;};union { long i;intj;char k;}un;printf(“%d,%d\n”,sizeof(struct st),sizeof(un));}
A.6,2
B.6,4
C.8,4
D.8,6
正确答案:B
解析:本题考查的是结构和数组元素所占的字节数。

题目中定义的结构st 因为包含x、y、z这3个元素,所以size(scmctst)=2+2+2=6;而联合体所占的字节数,由于最后存入的元素会把前面存入的元素覆盖掉,所以联合体所占的字节数就是占据最多存储单元的元素所占的字节数,sizeof(un)=sizeof(long)=4。

38.以下对联合类型叙述正确的是( )。

A.可以对联合变量名直接赋值
B.使用联合变量的目的是为了节省内存
C.任何一个联合变量可以同时引用联合中的不同成员
D.联合类型定义中不能同时出现结构类型的成员
正确答案:B
解析:由于联合体是同一存储区域由不同类型的变量共享,所以不可以直接对联合体变量名进行赋值,且联合体中的空间在某一时刻只能保持某一成员的数据;另外合体中可以出现结构类型的成员。

39.以下程序中C的二进制值是( )。

char a=2,b=4,c;c=a ^b>>2
A.00000011
B.00010100
C.00011100
D.00011000
正确答案:A
解析:本题主要考查按位异或和右移运算。

b=4的二进制为00000100,b>
>2后为00000001,a=2的二进制为00000010,两者异或为00000011。

40.有以下程序#include<stdio.h>main( ) { FILE*fp;int i=20,j=30,k,n;fp=fopen(“d1.dat”,”w”);fprintf(fp,”%d\n”,i);fprintf(fp,”%d\n”,j);fclose(fp);fp=fopen(“d1.dat”,”r”);fscanf(fp,”%d%d”,&k,&n);printf(“%d%d\n”,k,n);fclose(fp);}程序运行后的输出结果是( )。

A.20 30
B.20 50
C.30 50
D.30 20
正确答案:A
解析:分析程序段,首先以只写方式打开文件,利用fprintf函数将i和j的值写入到文件d1.dat中,然后关闭文件;再以只读方式打开文件,利用格式化输入函数fscanf将文件中的数据赋值给k和n,最后输出k和n的值,分别是20和30。

程序填空题
41.给定程序中,函数fun的功能是:在形参ss所指字符串数组中查找与形参t所指字符串相同的串,找到后返回该串在字符串数组中的位置(下标值),未找到则返回-1。

ss所指字符串数组中共有N个内容不同的字符串,且串长小于M。

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

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构! #include<stdio.h>#include<string.h>#define N 5 #define M 8 int fun(char(*ss)[M],char*t) {int i;/**********found**********/for(i=0;i<___________(1);i++) /*********found**********/if(strcmp(ss[i],t)==0)return___________(2);return-1;} main( ) { char ch[N][M]={“if”,”while”,”switch”,”int”,”for”},t[M];int n,i;printf(“\nThe original string\n\n”);for(i=0;i<N;i++)puts(ch[i]);printf(“\n”);printf(“\nEnter a string for search:”);gets(t);n=fun(ch,t);/*********found**********/if(n==__________(3)printf(“\nDon′t found!\n”);else printf(“\nThe position is %d.\n”,n);}
正确答案:(1)N(2)i(3)-1
解析:本题中函数fun的功能是在形参ss所指字符串数组中查找与形参t 所指字符串相同的串,找到后返回该字符串数组中的位置,未找到则返回-1。

第一空:“for(=0;i<________1:i++)”部充循环的结束条件,fun的参数(*ss)[M]是指向N行M列的字符串数组,循环是逐行查找是否存在t所指的字符串,因此循环次数是N次,故第一空处应为“N”。

第二空:“if(strcmp(ss[i],t)==0)return_________2;”说明两个字符串相同,按照题干要求,应返回该串在
字符串数组中的位置i,故第二空处为“i”。

第三空:“if(n==__________3)printf(“\nDon’t found!\n”):”,fun函数未找到则返回-1,因此这里是判断n是否等于-1,如果n等于-1标识没有找到,在屏幕上输出“Don’t found!”,因此第三空处为“一1”。

程序修改题
42.给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量S中奇数位上的数,依次构成一个新数放在t中。

高位仍在高位,低位仍在低位。

例如,当s中的数为:7654321时,t中的数为:7531。

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

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! #include<stdio.h>/************found************/void fun(long s,long t) { long s1=10;*t=s%10;while(s>0) {s=s/100;*t=s%10*s1+*t;/************found************/s1=s1*100;}} main( ) { long s,t;printf(“\nPlease enter s:”);scanf(“%ld”,&s);fun(s,&t);printf(“The result is:%ld\n”,t);}
正确答案:(1)void fun (long s,long *t)(2)s1=s1*10;
解析:本题中函数的功能是依次取出奇数位上的数。

该题的解题思路主要是找出数字中的奇数位上的数。

(1)根据“*t=s%10”判断,t应该是个指针变量,所以“void fun(long s,long t)”语句中的t只需改为“void fun(long s,long *t)”。

(2)分析函数内的循环过程可知s1的用途是每次将*t扩大,记录每次得到的奇数位的数字的权值,s1的权值每次增加1位,因此第二个标识下应该是“s1=s1*10;”。

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

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

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

注意:部分源程序存在文件PROG1.C文件中。

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

#include<stdlib.h>#include<stdio.h>void fun(int a[],int n,int*max,int*d) { } main( ) { int i,x[20],max,index,n=10;void NONO( );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);NONO( );} voidNONO( ) {/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。

*/FILE*fp,*wf;int i,x[20],max,index,n=10,j;fp=fopen(“in.dat”,”r”);wf=fopen(“out.dat”,”w”);for(i=0;i<10;i++){ for(j=0;j<n;j++)fscanf(fp,”%d,”,&x[j]);fun(x,n,&max,&index);fprintf(wf,”Max=%d,Index=%d\n”,max,index);} fclose(fp);fclose(wf);}
正确答案:int j;*max=a[0];*d=0;/*把数组的第1个元素值赋值给最大值变量*max*/for(i=1;i<n;i++)if(*max<a[i]){ /*判断*max是否小于当前值*/*max=a[i];/*重新把最大值赋值给*max*/*d=i;/*记住下标*/} 解析:该程序功能是求一维整型数组元素中最大的值和它所在的下标。

其中,求最大元素的方法:用最大值变量max标记第一个待找数据,逐个把所有待找数据和max进行比较,并用max标记其当前最大值及其所在位置,从而找出最大值。

进入fun函数,根据前而的分析:*max指针变量首先指向数组a的第一个数据,同时将标志位*d初始值赋为0。

然后利用for循环对每一个当前数组数据与max标记的数据进行比较。

循环中将求得的最大数据a[i]赋值给*max,许将该数据项数组标志位赋给标志位*d。

相关文档
最新文档