1、国家二级(C 语言)机试模拟试卷 117 及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.算法的时间复杂度是指( )。(分数:2.00)A.算法的长度B.执行算法所需要的时间C.算法中的指令条数D.算法执行过程中所需要的基本运算次数2.以下数据结构中,属于非线性数据结构的是( )。(分数:2.00)A.栈B.线性表C.队列D.二叉树3.数据结构中,与所使用的计算机无关的是数据的( )。(分数:2.00)A.存储结构B.物理结构C.逻辑结构D.线性结构4.内聚性是对模块功能强度的衡量,下列选项中,内聚性较弱的是( )。(分数:2.00)A.顺序
2、内聚B.偶然内聚C.时间内聚D.逻辑内聚5.在关系中凡能惟一标识元组的最小属性集称为该表的键或码。二维表中可能有若干个键,它们称为该表的( )。(分数:2.00)A.连接码B.关系码C.外码D.候选码6.检查软件产品是否符合需求定义的过程称为( )。(分数:2.00)A.确认测试B.需求测试C.验证测试D.路径测试7.数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是( )。(分数:2.00)A.控制流B.加工C.存储文件D.源和潭8.待排序的关键码序列为(15,20,9,30,67,65,45,90),要按关键码值递增的顺序排
3、序,采取简单选择排序法,第一趟排序后关键码 15 被放到第( )个位置。(分数:2.00)A.2B.3C.4D.59.对关系 S 和关系 R 进行集合运算,结果中既包含关系 S 中的所有元组也包含关系 R 中的所有元组,这样的集合运算称为( )。(分数:2.00)A.并运算B.交运算C.差运算D.除运算10.下列选项中,不属于数据管理员(DBA)职责的是( )。(分数:2.00)A.数据库维护B.数据库设计C.改善系统性能,提高系统效率D.数据类型转换11.C 语言规定,在一个 C 程序中,main()函数的位置( )。(分数:2.00)A.必须在系统调用的库函数之后B.必须在程序的开始C.必
4、须在程序的最后D.可以在任意位置12.以下叙述中正确的是( )。(分数:2.00)A.C 语言比其他语言高级B.C 语言可以不用编译就能被计算机识别执行C.C 语言以接近英语国家的自然语言和数学语言作为语言的表达形式D.C 语言出现的最晚,具有其他语言的一切优点13.已知“int a=6;”则执行“a+=a=a*a;”语句后,a 的值为( )。(分数:2.00)A.36B.0C.24D.6014.下列叙述中错误的是( )。(分数:2.00)A.C 语句必须以分号结束B.复合语句在语法上被看作一条语句C.空语句出现在任何位置都不会影响程序运行D.赋值表达式末尾加分号就构成赋值语句15.若有定义:
5、int a=7;float x=25,y=47;则表达式“x+a3*(int)(x+y)2/4”的值是( )。(分数:2.00)A.2.5B.2.75C.3.5D.016.若下列选项中的各变量均为整型且已有值,其中不正确的赋值语句是( )。(分数:2.00)A.+i:B.nl=(n2/(n3=2);C.k=i=j:D.a=b+c=2;17.下列关于逻辑运算符两侧运算对象的叙述中正确的是( )。(分数:2.00)A.只能是整数 0 或 1B.只能是整数 0 或非 0 整数C.可以是结构体类型的数据D.可以是任意合法的表达式18.若有说明 int a34;则 a 数组元素的非法引用是( )。(分数
6、:2.00)A.a02*1B.a13C.a420D.a0419.下列说法不正确的是( )。(分数:2.00)A.int *ptr;指针指向整形数据B.char *ptr;指针的类型是字符型指针C.int *ptr,指针的类型是双重指针D.int(*ptr)3;是一个指针数组,数组共有三个元素,而三个元素是 int 型指针20.有以下程序 #inc1ude void main() char s=“01aXy“;int i,n=0; for(i=0;si!=0;i+) if(si=z)n+; printf(“d/n“,n); 程序运行后的输出结果是( )。(分数:2.00)A.0B.2C.3D.5
7、21.有以下程序: #inc1ude main() int a=1,2,3,4,y,*p=&a3; p; y=*p; printf(“y=d/n“,y); 程序的运行结果是( )。(分数:2.00)A.y=0B.y=1C.y=2D.y=322.下面的 for 语句的循环次数为( )。 for(x=1,y=0;(y!=1 9)&(x0|+b0) +c; printf(“d,d,d“,a,b,c); (分数:2.00)A.0,1,2B.1,2,3C.1,1,3D.1,2,224.有以下程序: #inc1ude main() int c; while(c=getchar()!=u) switch(c
8、3) case 0: case 1:putchar(c+4); case 2:putchar(c+4); break; case 3:putchar(c+3); case 4:putchar(c+3); break; printf(“/n“); 从第一列开始输入数据(代表一个回车符): 3 845,则程序输出结果为( )。(分数:2.00)A.77889B.77868C.776810D.7.78866e+00725.C 语言规定,函数返回值的类型是( )。(分数:2.00)A.由调用该函数时的主调函数类型所决定B.由 retum 语句中的表达式类型所决定C.由调用该函数时系统临时决定D.由定义
9、该函数时所指定的数值类型决定26.执行下列程序时输入“456789123”,输出结果是( )。 #inc1ude main() char m80; int c,i; scanf(“c”,c); scanf(“d“,i); scanf(“s“,&m); printf(“c,d,sn“,c,i,m);)(分数:2.00)A.456, 789, 123B.4,789, 123C.4,56, 789, 123D.4,56, 78927.已知下列函数定义: fun(int *b,int c,int d) int k; for(k=0;kA.fun(*a,6,14);B.fun(&a,6,8);C.fun
10、(a,8,4);D.fun(int)a,8,6);28.设 Y 为整型变量,A=1,A 的地址为 EF01; B=2,B 的地址为 EF02;执行语句 B=&A:Y=&B;后 Y 的值 ( )。(分数:2.00)A.1B.2C.EF01D.EF0229.有以下程序: #inc1ude int f(int t,int n); main() int a4=1,2,3,4),s; s=f(a,2);printf(“dn“,s); int f(int t,int n) if(n0)&(nA.4B.7C.10D.630.以下语句定义正确的是( )。(分数:2.00)A.int a14=1,2,3,4,5
11、;B.noat a3=1,2,2,3,3,1;C.long a23=1,1,2,1,2,3,0,0;D.double a3=8;31.下列一维数组说明中,不正确的是( )。(分数:2.00)A.int N; scanf(“d“,&N); int bN;B.floata=1,6,6,0,2;C.#define S 10 int aS;D.#define S 10 int aS+5;32.下面函数的功能是( )。 sss(s,t) char*S,*t; while(*s)&(*t)&(*t+=*s+); return(*s*t);)(分数:2.00)A.将字符串 s 复制到字符串 t 中B.比较两
12、个字符串的大小C.求字符串的长度D.将字符串 s 接续到字符串 t 中33.有以下程序: #inc1ude #inc1ude “stringh“ void fun(char *s,int n) char *t,int i,j, for(i=0;istrlen(sj) t=si;si=sj;sj=t; main() char *ss=“bcc“,“bbcc“,“xy“,“aaaacc“,“aabcc“; fun(ss,5);printf(“s,s/n“,ss0,ss4); 程序的运行结果是( )。(分数:2.00)A.xy,aaaaccB.aaaacc,xyC.bcc,aabccD.aabcc,
13、bcc34.若已定义: int a=0,1,2,3,4,5,6,7,8,9,*p=a,i; 其中 019,则对 a 数组元素不正确的引用是( )。(分数:2.00)A.apaB.(&ai)C.piD.a1035.以下选项中可用作 C 程序合法实数的是( )。(分数:2.00)A.0.1B.30e02C.E9D.912E36.以下叙述中不正确的是( )。(分数:2.00)A.预处理命令行都必须以#号开始,结尾不加分号B.在程序中凡是以#号开始的语句行都是预处理命令行C.C 程序在执行过程中对预处理命令进行处理D.预处理命令可以放在程序中的任何位置37.以下程序的输出结果是( )。 #inc1ud
14、e #define F(x) 284+x #define w(y) printf(“d“,(int)(y) #define P(y) w(y) main() int x=2; P(F(5)*x); (分数:2.00)A.12B.13C.14D.1638.设有下面的定义: struct st mt a; floatb: d; int *p, 要使 p 指向结构变量 d 中的 a 成员,正确的 赋值语句是( )。(分数:2.00)A.*p=da;B.p=&a;C.p=da;D.p=&da;39.交换两个变量的值,不允许用临时变量,应该使用下列( )位运算符。(分数:2.00)A.&B. c)|C.
15、40.如果需要打开一个已经存在的非空文件“FILE”并进行修改,正确的语句是( )。(分数:2.00)A.fp=fopen(“FILE“,“r“);B.fp=fopen(“FILE“,“a+“);C.fp=fopen(“FILE“,“w+“);D.fp=fopen(“FILE“,“r+“);二、程序填空题(总题数:1,分数:2.00)41.函数 fun 的功能是:根据所给的年、月、日,计算出该日是这一年的第几天,并作为函数值返回。其中函数 isleap 用来判别某一年是否为闰年。 例如,若输入:2008 5 1,则程序输出:2008 年 5 月 1 日是该年的第 122 天。 请在程序的下划线
16、处填入正确的内容,并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1C 中。 不得增行或删行,也不得更改程序的结构! #include int isleap (int year) int leap; leap= (yearo04=0 & yearool00!=0 | yearo0400=0) ; return_ (1)_; int fun (int year,int monthr int day) int table 13 = 0,31,28,31,30,31, 30,31,31,30,31,30,31; int days=0,i; for(i=1; i2)
17、 days=days+_ (3)_; return days; main() int year,monthf day,days; printf(“请输入年、月、日:“); scanf(“ddd“,&year,&month,&day); days=fun(year,month,day); printf(“d 年d 月d 日是该年的第d 天 /n“,year,month,day,days); (分数:2.00)_三、程序修改题(总题数:1,分数:2.00)42.给定程序 modi1c 的主函数中,将 a、b、c 三个结点链成一个单向链表,并给各结点的数据域赋值,函数 fun()的作用是:累加链表结
18、点数据域中的数据作为函数值返回。 请改正函数 fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动 maln 函数,不得增行或删行,也不得更改程序的结构。 #include typedef struct list int data; struct list *next; LIST; int fun (LIST *h) LIST *p; int t; p=h; while ( *p) t=t+p data; return t; main () LIST a,b,c,*h; adata=34 ; bdata=51; cdata=87; cnext=/0; h=&a; anext=&b;
19、 bnext=&c; (分数:2.00)_四、程序设计题(总题数:1,分数:2.00)43.请编写一个函数 fun,它的功能是:比较两个字符串的长度,(不得调用 C 语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。 例如,输入beijing shanghai(为回车键),函数将返回 shanghai。 注意:部分源程序存在文件 PROG1C 中。 请勿改动主函数 maln 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 #include char *fun (char *s,char *t) main() char a
20、20,b20; void NONO (); printf (“Input 1th string:“); gets (a); printf (“Input 2th string:“); gets (b); printf (“s/n“,fun (a, b); NONO (); void NONO () /*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *fp,*wf ; int i ; char a20,b20 ; fp= fopen(“indat“,“r“); wf= fopen (“outdat“f “w“); for(i = 0 ; i =z)n+; prin
21、tf(“d/n“,n); 程序运行后的输出结果是( )。(分数:2.00)A.0 B.2C.3D.5解析:解析:这段程序的功能求出字符串 s 中字符的 ASCII 码小于小写字符 a 并且大于小写字符 z 的字符的个数。因为小写字符 z 的 ASCII 码大于小写字符 a 的 ASCII 码,所以满足 a 的 ASCII 码并且大于 z 的ASCII 码的字符是不存在的,所以输出 O。21.有以下程序: #inc1ude main() int a=1,2,3,4,y,*p=&a3; p; y=*p; printf(“y=d/n“,y); 程序的运行结果是( )。(分数:2.00)A.y=0B.
22、y=1C.y=2D.y=3 解析:解析:程序首先定义了一个一维数组和指针,接着将数组第 4 个元素的地址赋给“*p”,进行p使指针 p 指向了数组的第 3 个元素;通过“y=*p”,将数组第 3 个元素的值 3 赋给了 y,所以选项 D)正确。22.下面的 for 语句的循环次数为( )。 for(x=1,y=0;(y!=1 9)&(x0|+b0) +c; printf(“d,d,d“,a,b,c); (分数:2.00)A.0,1,2B.1,2,3C.1,1,3 D.1,2,2解析:解析:本题考查 if 语句。先判断 if 语句的条件是否成立,因为“+a=10”,所以条件成立,又因为是进行逻辑
23、或运算,在已知其中一个运算对象为真的情况下,不必判断另外一个运算对象的真假,即不进行+b 操作,就可以直接得出整个表达式的值为逻辑 1,执行下面的+c。24.有以下程序: #inc1ude main() int c; while(c=getchar()!=u) switch(c3) case 0: case 1:putchar(c+4); case 2:putchar(c+4); break; case 3:putchar(c+3); case 4:putchar(c+3); break; printf(“/n“); 从第一列开始输入数据(代表一个回车符): 3 845,则程序输出结果为( )
24、。(分数:2.00)A.77889 B.77868C.776810D.7.78866e+007解析:解析:题中 while 循环的条件是:当从键盘读入的字符不是“/n”时,执行 while 循环。输入第一个字符 3 时:执行 case 0,什么也不输出:case 1,输出 7;case2,输出 7;遇到 break 语句,跳出switch 语句。输入第二个字符 8 时“c3=5”,不执行任何浯句。输入第三个字符 4 时“c3=1”,执行 case l 输出 8:case2,输出 8:遇到 break 语句,跳出 switch 语句。输入第四个字符 5 时“c 一3=2”,执行 case 2,输
25、出 9;遇到 break 语句,跳出 switch 语句。25.C 语言规定,函数返回值的类型是( )。(分数:2.00)A.由调用该函数时的主调函数类型所决定B.由 retum 语句中的表达式类型所决定C.由调用该函数时系统临时决定D.由定义该函数时所指定的数值类型决定 解析:解析:本题考查函数调用时的数值类型。函数调用时,函数返回值的类型既不由主调函数类型所决定,也不由 return 语句中的表达式类型所决定,更不是由系统临时决定,而是由定义该函数时所指定的数值类型所决定。26.执行下列程序时输入“456789123”,输出结果是( )。 #inc1ude main() char m80;
26、 int c,i; scanf(“c”,c); scanf(“d“,i); scanf(“s“,&m); printf(“c,d,sn“,c,i,m);)(分数:2.00)A.456, 789, 123B.4,789, 123C.4,56, 789, 123D.4,56, 789 解析:解析:scanf 函数中的“c”表示通过键盘只读入一个字符型的数据, “&c”表示将该数据赋值给 c,所以 c=4。另外,以“d”格式读入数据时,只有遇到空格或者换行等间隔时符才停止读入,所以i=56,m=789。27.已知下列函数定义: fun(int *b,int c,int d) int k; for(k
27、=0;kA.fun(*a,6,14);B.fun(&a,6,8);C.fun(a,8,4); D.fun(int)a,8,6);解析:解析:本题考查函数调用时的参数传递。fun 函数的调用形式为 fun(int*b,int cint d)。调用数组时,用数组名表示一个指向数组的第一个元素的指针,因此调用时的形式为“fun(a,8,4)”。28.设 Y 为整型变量,A=1,A 的地址为 EF01; B=2,B 的地址为 EF02;执行语句 B=&A:Y=&B;后 Y 的值 ( )。(分数:2.00)A.1B.2C.EF01D.EF02 解析:解析:&是取地址运算符,“Y=&B”是将 B 的地址赋
28、给 Y,因此 Y 值为 EF02。29.有以下程序: #inc1ude int f(int t,int n); main() int a4=1,2,3,4),s; s=f(a,2);printf(“dn“,s); int f(int t,int n) if(n0)&(nA.4B.7 C.10D.6解析:解析:本题主要考查的是函数的递归调用,子函数 f 是一个递归函数,所以主函数中执行“f(a,2)”时,其执行过程是“a3l+f(a,1)=a3+a2+f(a,0)=7”。30.以下语句定义正确的是( )。(分数:2.00)A.int a14=1,2,3,4,5;B.noat a3=1,2,2,3
29、,3,1;C.long a23=1,1,2,1,2,3,0,0;D.double a3=8; 解析:解析:本题考查如何对。二维数组的元素赋值。选项 A),数组第二维的大小是 4,但是却赋值了5 个元素,数组溢出;选项 B),C 语言规定,对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式:选项 C),数组第一维的大小是 2,但是赋值超过了 2;选项D),在对二维数组元素赋初值时,可以只对部分元素赋初值,未赋初值的元素自动取 0。31.下列一维数组说明中,不正确的是( )。(分数:2.00)A.int N; scanf(“d“,&N); int bN; B.
30、floata=1,6,6,0,2;C.#define S 10 int aS;D.#define S 10 int aS+5;解析:解析:本题考查一维数组的赋值。一维数组的一般定义格式为:类型说明符数组名常量表达式。其中,“”中的内容可以是整型常量,也可以是整型表达式。选项 A)中的 N 是一个变量,所以错误。32.下面函数的功能是( )。 sss(s,t) char*S,*t; while(*s)&(*t)&(*t+=*s+); return(*s*t);)(分数:2.00)A.将字符串 s 复制到字符串 t 中B.比较两个字符串的大小 C.求字符串的长度D.将字符串 s 接续到字符串 t
31、中解析:解析:“*s*t”的输出实际是比较两个字符的 ASCII 码值,比较两个字符串的大小。33.有以下程序: #inc1ude #inc1ude “stringh“ void fun(char *s,int n) char *t,int i,j, for(i=0;istrlen(sj) t=si;si=sj;sj=t; main() char *ss=“bcc“,“bbcc“,“xy“,“aaaacc“,“aabcc“; fun(ss,5);printf(“s,s/n“,ss0,ss4); 程序的运行结果是( )。(分数:2.00)A.xy,aaaacc B.aaaacc,xyC.bcc,
32、aabccD.aabcc,bcc解析:解析:从 main 函数入手,定义了一个一维数组并赋初值,接着调用函数 fun(),函数的功能是:比较数组中各元素的长度,按元素长度从小到大的顺序排列元素, 所 以执行 “ fun(ss,5) ” 函数后 ,“*ss=“xy“,“bcc“,“bbcc“,“aabcc“,“aaaacc“”,所以调用 printf 函数输出 ss0,ss4的值分别为 xy,aaaacc。34.若已定义: int a=0,1,2,3,4,5,6,7,8,9,*p=a,i; 其中 019,则对 a 数组元素不正确的引用是( )。(分数:2.00)A.apaB.(&ai)C.piD
33、.a10 解析:解析:此题考查对一维数组的引用。对于已定义的数组 aM,数组元素的正确引用必须满足下标小于 M 且为正整数。选项 D)中下标值出现溢出。35.以下选项中可用作 C 程序合法实数的是( )。(分数:2.00)A.0.1 B.30e02C.E9D.912E解析:解析:C 程序的合法实数有两种表示形式,一种是小数形式,另一种是指数形式,对于用指数形式表示的实数来说,需要注意的是字母 e 或 E 之前必须要有数字,且字母 e 或 E 后面的指数必须为整数,所以选项 A)为正确答案。36.以下叙述中不正确的是( )。(分数:2.00)A.预处理命令行都必须以#号开始,结尾不加分号B.在程
34、序中凡是以#号开始的语句行都是预处理命令行C.C 程序在执行过程中对预处理命令进行处理 D.预处理命令可以放在程序中的任何位置解析:解析:本题考查预处理命令的特点。编译预处理命令的特点有: 为了区分一般的语句,预处理命令行都必须以#开始,结尾不加分号; 预处理命令可以放在程序中的任意位置; 在程序中凡是以#开始的语句都是预处理命令行。37.以下程序的输出结果是( )。 #inc1ude #define F(x) 284+x #define w(y) printf(“d“,(int)(y) #define P(y) w(y) main() int x=2; P(F(5)*x); (分数:2.00
35、)A.12 B.13C.14D.16解析:解析:本题考查带参数的宏定义及相关运算。“P(F(5)*x)=P(284+5*2)=P(1284)”,调用“w(1284)”,输出“(int)(1284)=12”。38.设有下面的定义: struct st mt a; floatb: d; int *p, 要使 p 指向结构变量 d 中的 a 成员,正确的 赋值语句是( )。(分数:2.00)A.*p=da;B.p=&a;C.p=da;D.p=&da; 解析:解析:本题主要考查按结构数组元素方式引用结构成员。结构体变量的成员引用方法有 3 种:结构体变量名成员名;指针变量名成员名;(*指针变量名)成员
36、名。因为 p 是指针变量,所以应该将地址值赋给 p。39.交换两个变量的值,不允许用临时变量,应该使用下列( )位运算符。(分数:2.00)A.&B. c)| C.解析:解析:按逻辑位运算的特定作用主要有 3 点:用按位与运算将特定位清 0 或保留特定位;用按位或运算将特定的位置设置为 1;用按位异或运算将某个变量的特定位翻转或交换两个变量的值。40.如果需要打开一个已经存在的非空文件“FILE”并进行修改,正确的语句是( )。(分数:2.00)A.fp=fopen(“FILE“,“r“);B.fp=fopen(“FILE“,“a+“);C.fp=fopen(“FILE“,“w+“);D.fp
37、=fopen(“FILE“,“r+“); 解析:解析:本题考查打开文件函数 fopen(),打开文件函数 fopen()的调用形式为:fp=fopen(文件名,文件使用方式)。“文件使用方式”说明:方式“r”为以输入方式打开一个文本文件;方式“a+”为以读/写方式打开一个文本文件,保留文件中原有的数据;方式“W+”为以读/写方式建立一个新的文本文件;方式“r+”为以读/写方式打开一个文本文件。二、程序填空题(总题数:1,分数:2.00)41.函数 fun 的功能是:根据所给的年、月、日,计算出该日是这一年的第几天,并作为函数值返回。其中函数 isleap 用来判别某一年是否为闰年。 例如,若输
38、入:2008 5 1,则程序输出:2008 年 5 月 1 日是该年的第 122 天。 请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1C 中。 不得增行或删行,也不得更改程序的结构! #include int isleap (int year) int leap; leap= (yearo04=0 & yearool00!=0 | yearo0400=0) ; return_ (1)_; int fun (int year,int monthr int day) int table 13 = 0,31,28,31,30,
39、31, 30,31,31,30,31,30,31; int days=0,i; for(i=1; i2) days=days+_ (3)_; return days; main() int year,monthf day,days; printf(“请输入年、月、日:“); scanf(“ddd“,&year,&month,&day); days=fun(year,month,day); printf(“d 年d 月d 日是该年的第d 天 /n“,year,month,day,days); (分数:2.00)_正确答案:(正确答案:(1) leap (2) day (3)1)解析:解析:本题中
40、函数 fun 的功能是根据所给的年、月、日,计算出该日是这一年的第几天,并作为函数值返回,其中要考虑是否为闰年。这道问题其实很简单,唯一要考虑的变化因素也只有闰年这个变化,而且这个变化导致的程序变化也很简单。首先设置常规的月份天数,这需要一个数组(注意这个数组应该有 13 个数据,而不是 12 个,因为月份是从 1 月份开始的,而数组是从位置 0 开始的,所以这里应该将数组的第一个数据定义为 0,后面 12 个数据按照常规月份来然后给出我们需要的月份和日数后进行常规统计),这是一般情况,如果是闰年的话且月份超过二月的话就加上 l 即可,应该这种情况特别给出一个判断函数就行了。 第一空:“ret
41、urn_(1)_; p”这一空出现在 isleap 函数中,是为了判断我们给出的年份是否为闰年的函数,这里要填的为此函数的返回值。很明显地,这里的数据为 leap,判断是否为闰年后,我们还需要返回 leap 是否是闰年。所以这一空应该填 lea。 第二空:“days=days+_(2)_; p”这一空出现在 fun 函数中,所填的是 days 的数据结果算式,days 即为我们需要统计的天数。这里根据条件和函数的下一步,我们可以看出来这里的 days 统计是当年份不为闰年时的天数统计,而当年份不为闰年时,只要将给出的月份前面几个月份天数相加,再加上这个月的日期即为这个给出年月日在这一年中的天数
42、,再根据上一步我们知道算式右边的 days 代表的即为本月前面月份的天数总和,所以这里只需要加上本月的日期就可以得到我们需要的一年中的第几天。所以这一空应该填的是给出的日期day。 第三空:“days=days+_(3)_; p”这一空出现在 fun 函数中,这里所填也是 days 的数据,但是我们可以看到这里的 days 是在判断完为闰年且月份大于 2 时进行的计算,所以这里的 days 算法不同于上一步 days 的算法。根据常识我们都可以知道,闰年大于 2 的月份是要比普通的年份多一个 2 月 29 号的,所以要比普通的日期天数多一天,所以这里应该加上 1,所以这一空应该填的是 1。三、
43、程序修改题(总题数:1,分数:2.00)42.给定程序 modi1c 的主函数中,将 a、b、c 三个结点链成一个单向链表,并给各结点的数据域赋值,函数 fun()的作用是:累加链表结点数据域中的数据作为函数值返回。 请改正函数 fun 中指定部位的错误,使它能得出正确的结果。 注意:不要改动 maln 函数,不得增行或删行,也不得更改程序的结构。 #include typedef struct list int data; struct list *next; LIST; int fun (LIST *h) LIST *p; int t; p=h; while ( *p) t=t+p dat
44、a; return t; main () LIST a,b,c,*h; adata=34 ; bdata=51; cdata=87; cnext=/0; h=&a; anext=&b; bnext=&c; (分数:2.00)_正确答案:(正确答案:(1) int t 改为 int t=0; (2) while (*p)改为 while(p) (3)t=t+pdata; 改为 t=t+(*p) data)解析:解析:本题中函数 fun()的作用是:累加链表结点数据域中的数据作为函数值返回。这里数据是主函数中定义的 a,b,c,但是要是链表结点的方式将其相加,其实也类似于普通的数据加减,只不过这里
45、用到链表和结构体的话就要注意很多的细节问题,因为指针一直是 C 语言最难理解的一部分,很容易搞错它的使用方法。 (1)第一个错误在定义 t 时,t 是数据结果,但是在一开始定义时,t 应该定义为 0 的,这样才不会影响后面的数据结果,以免程序出现不必要的错误所以这里应该讲 int t 改为“int t=0”。 (2)第二个错误在 fun 函数中执行 while 条件时 while 的条件语句。这里用“*p”,我们都知道这是指针的形式,而“*p”的意义是指针变量 p 所指向的变量的值,所以这里“*p”是一个具体的变量,而while(*p)的意义是“*p”不为空时就一直执行,但是这里根据题意我们需
46、要的链表的地址来进行题目需要的链表的计算,而单向链表的结束的标志就是链尾,链尾的特征则是指向为空,这里指向为空指的是地址比阿娘,所以这里的终止条件不应该是 p 所指向的值为 O,而是 p 的地址为空,所以“while(*p)”应该改为“while (p)”。 (3)第三个错误在 fun()函数中的计算。我们都知道,链表与结构体是紧密相连的,这一题同样用到了,而且我们进行的也是链表结点的运算,自然要用到结构体成员变量的运算。但是在“t=t+pdata”这个运算时,“pdata”的意义是“pdata”这个指针变量,也就是说这是指针变量的运算,指针变量是跟结点变量不同的,我们需要的是结点的数据,而不是指向它的指针的数据,所以这里的运算是完全错误的,为了符合题意,我们应该要使用结点的结构体变量。即“=t+pdata”应该改为“t=t+(*p)data”。四、程序设计题(总题数:1,分数:2.00)43.请编写一个函数 fun,它的功能是:比较两个字符串的长度,(不得调用 C 语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1