版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
国家二级(C语言)机试模拟试卷3(共9套)(共303题)国家二级(C语言)机试模拟试卷第1套一、选择题(本题共39题,每题1.0分,共39分。)1、在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。A、逻辑设计B、需求分析C、详细设计D、物理设计标准答案:B知识点解析:软件开发阶段包括需求分析、总体设计、详细设计、编码和测试五个阶段。其中,需求分析阶段常用的工具是数据流图和数据字典。2、对序线性表(23,29,34,55,60,70,78)用二分法查找值为60的元素时,需要比较次数为()。A、1B、2C、3D、4标准答案:C知识点解析:根据二分法查找法需要两次:①首先将60与表中间的元素55进行比较,由于60大于55,所以在线性表的后半部分查找。②第二次比较的元素是后半部分的中间元素,将60与表中间的元素70进行比较,由于60小于70,所以在线性表的前半部分查找。③第三次比较的元素是前半部分的中间元素,即60,这时两者相等,即查找成功。3、下列描述中,正确的是()。A、线性链表是线性表的链式存储结构B、栈与队列是非线性结构C、双向链表是非线性结构D、只有根结点的二叉树是线性结构标准答案:A知识点解析:根据数据结构中各数据元素之间前后关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。如果一个非空的数据结构满足下列两个条件:①有且只有一个根结点;②每个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构,又称线性表。所以线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。4、开发大型软件时,产生困难的根本原因是()。A、大型系统的复杂性B、人员知识不足C、客观世界干变万化D、时间紧、任务重标准答案:A知识点解析:随着计算机软件规模的扩大,软件本身的复杂性不断增加,研制周期显著变长,正确性难以保证,软件开发费用上涨,生产效率急剧下降,从而出现了人们难以控制软件发展的局面,即所谓的“软件危机”。5、两个或两个以上的模块之间关联的紧密程度称为()。A、耦合度B、内聚度C、复杂度D、连接度标准答案:A知识点解析:耦合度是模块间互相连接的紧密程度的度量;内聚度是一个模块内部各个元素间彼此结合的紧密程度的度量。6、下列关于线性表的叙述中,不正确的是()。A、线性表可以是空表B、线性表是一种线性结构C、线性表的所有结点有且仅有一个前件和后件D、线性表是由n个元素组成的一个有限序列标准答案:C知识点解析:线性表是一种线性结构,由n(ni>0)个元素组成,所以线性表可以是空表。但是在线性表中,第一个结点没有前件,最后一个结点没有后件,其他结点有且只有一个前件和后件,所以选项C)是错误的。7、设有如下关系表:则下列操作正确的是()。A、T=I∪SB、T=R×SC、T=R∩SD、T=R∪S标准答案:C知识点解析:T就是关系R中有的,同时S中也有的有序组(4、5、6),即交运算(∩)。8、以下描述中,不是线性表顺序存储结构特征的是()。A、可随机访问B、需要连续的存储空间C、不便于插入和删除D、逻辑相邻的数据物理位置上不相邻标准答案:D知识点解析:线性表的顺序存储是用一片连续的空间来存放数据元素,其特点是逻辑上相邻的元素在物理位置上也相邻。数据元素之间逻辑上的先后关系自动隐含在物理位置的相邻元素之中,因此不需要另外开辟空间来保存元素之间的关系。9、在三级模式之间引入两层映像,其主要功能之一是()。A、使数据与程序具有较高的独立性B、使系统具有较高的通道能力C、保持数据与程序的一致性D、提高存储空间的利用率标准答案:A知识点解析:数据库管理系统在数据库的三级模式之间提供了两层映像,保证了数据库中数据的较高的逻辑独立性和物理独立性。10、下列方法中,属于白盒法设计测试用例的方法的是()。A、错误推测B、因果图C、基本路径测试D、边界值分析标准答案:C知识点解析:白盒测试方法也称为结构测试或逻辑测试,主要方法有逻辑覆盖测试、基本路径测试等。11、在C语言中,以下说法不正确的是()。A、在C程序中,整数和实数都能被准确无误地表示出来B、在C程序中,任何一个变量名都代表存储器中的一个位置C、静态变量的生存期与整个程序的运行期相同D、C语言中,任何变量都必须先声明才能进行引用标准答案:A知识点解析:此题考查C语言的基本概念。变量的实质就是在内存中占据一定的存储单元,存储单元里存放的是该变量的值,变量的值可以根据需要进行修改;整数在允许的范围内可以准确的表示出来,但不可能表示无限度的实数。12、以下关于C语言数据类型的叙述中正确的是()。A、C基本数据类型包括:分为整型、实型、浮点型、字符型四种B、实型常量的表达方式包括十进制形式、十六进制形式、二进制形式、八进制形式、指数形式C、若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型D、若只处理“真”和“假”两种逻辑值,应使用逻辑类型标准答案:C知识点解析:C基本数据类型包括:分为整型、实型、枚举型、字符型四种,实型就是浮点型,实型数据只有十进制,没有2、8、16进制表达,在C语言中没有定义逻辑类型,而是一般用0代表假,用非零代表真。13、以下标识符不是关键字的是()。A、breakB、char。C、SwitchD、return标准答案:C知识点解析:此题考查标识符和关键字的概念。需要注意的是C语言是区分大小写的,“switch”是关键字,但“Switch”不是关键字。14、下列选项中,不能作为合法常量的是()。A、1.234e04B、1.234e0.4C、1.234e+4D、1.234e0标准答案:B知识点解析:用指数形式表示的实型常量需注意两点:①e或E后面的指数必须是整数;②指数必须是不超过数据表示范围的正负整数,并且在e或E前必须有数字。15、有以下程序:#include<stdio.h>main(){┋while(getchar()!=’\n’);┋}以下叙述中正确的是()。A、此while语句将无限循环B、getchar()不可以出现在while语句的条件表达式中C、当执行此while语句时,只有按回车键程序才能继续执行D、当执行此while语句时,按任意键程序就能继续执行标准答案:C知识点解析:根据程序顺序执行的次序,当程序执行到while这条语句,根据while语句中的结束循环的条件是“输入回车键时,结束循环”,所以当按回车键后,程序才执行while语句的下一条语句。16、下列叙述中正确的是()。A、调用printf()函数时,必须要有输出项B、使用putchar()函数时,必须在之前包含头文件stdio.hC、在C语言中,整数可以以二进制、八进制或十六进制的形式输出D、调用getchar()函数读入字符时,可以从键盘上输入字符所对应的ASCII码标准答案:B知识点解析:选项A),若printf函数没有输出项,且格式字符串中不含格式信息,则输出的是格式字符串本身,若格式字符串含有格式信息,运行时则出现错误提示;选项C),在C语言中,整数可以以十进制、八进制或十六进制的形式输出;选项D),getchar函数是从标准输入设备读取一个字符。17、执行以下程序段后,w的值为()。intw=’A’,x=14,y=15;w=((x‖y)&&(w<’a’));A、-1B、NULLC、1D、0标准答案:C知识点解析:字符变量w的初值为字符“’A’”,其ASCII码值为65,字符“’A’”的ASCII码值为97,所以关系表达式“W<’a’”的值为1;变量x=14,变量y=15,“x‖y”为或,x、y均为真,所以x‖y的结果1。因而逻辑表达式“(x‖y)&&(w<’a’)”的值为1。18、设有定义:“longx=123450L;”,则以下能够正确输出变量x的是()。A、printf("x=%d\n",x);B、printf("x=%id\n",x);C、printf("x=%d\n",x);D、printf("x=%ld\n",x);标准答案:D知识点解析:C语言规定,输出long型数值的格式符为%ld。19、已有定义“inta=3:”和输出语句“printf("%8x".a);”,a);”以下正确的叙述是()。A、整型变量的输出格式符只有%d一种B、%x是格式符的一种,它可以适用于任何一种类型的数据C、%x是格式符的一种,其变量的值按十六进制数输出,但%8x是错误的D、%8x是正确的格式符,其中数字8规定了输出字段的宽度标准答案:D知识点解析:本题考查printf函数的格式。“%8x”表示以十六进制无符号形式输出整型数据。“8”表示指定输出数据的宽度为8位。20、若有定义“intx,y;”并已正确给变量赋值,则下列选项中与表达式“(x-y)?(x++):(y++)”中的条件表达式“(x-y)”等价的是()。A、(x-y>0)B、(x-y<0)C、(x=y<0‖x-y>0)D、(x-y==0)标准答案:C知识点解析:条件表达式的形式如下:“表达式1?表达式2:表达式3”。其含义为当“表达式1”的值为非零时,求出“表达式2”的值,此时“表达式2”的值就是整个条件表达式的值;当“表达式1”的值为零时,则求“表达式3”的值,这时“表达式3”的值就是整个表达式的值。本题条件表达式的执行顺序是先求解表达式“x-y”的值,若其值为非0(可以是正数,也可以是负数),则再求表达式“x++”的值,其值就是条件表达式的值;若表达式“x-y”的值为0,则再求表达式“y++”的值,其值就是条件表达式的值。因此,本题的答案为选项C)。21、若a、b、c、d都是int型变量且都已经正确赋初值,则以下不正确的赋值语句是()。A、a+d:B、a++;C、a=b=c=d=100;D、a=(b=3)+(d=5);标准答案:A知识点解析:C语言规定,赋值号的右边可以是一个赋值表达式,因此选项C)、选项D)正确;在选项B)中,a++是一个自加1的表达式,a被重新赋值,因此它是一个合法的赋值表达式;选项A)中,a+d是一个算术表达式,虽然最后有一个分号,但这个表达式中没有赋值操作,因此它不是一条赋值语句。22、有以下程序#defineF(X,Y)(X)*(Y)main(){inta=3,b=4;printf("%d\n",F(a++,b++));}程序运行后的输出结果是()。A、12B、15C、16D、20标准答案:A知识点解析:此题考查的是编译预处理命令以及自加运算符。“F(a++,b++)”先取a和b的值,参加运算,再把a和b的值分别加1,所以“F(a++,b++)-F(3,4)=3*4=12”。23、以下是while语句的基本形式:while(表达式){语句;>其中“表达式”()。A、必须是逻辑表达式B、必须是关系表达式C、必须是逻辑表达式或关系表达式D、可以是任意合法的表达式标准答案:D知识点解析:本题考查while表达式。while(表达式)中的表达式可以为任何合法的表达式,一般情况下为逻辑、条件表达式,需要注意的是,当等号(==)误写为赋值号(=)时不会报错的,但是其值恒为1。24、有以下程序:#include<stdio.h>main(){inta=6,b=7,m=1;switch(a%2){case0:m++;break;case1:m++;switch(b%2){defaut:m++;case0:m++;break;}}pfintf("%d\n",m);}程序运行后的输出结果是()。A、1B、2C、3D、4标准答案:B知识点解析:本题考查switch语句。因为“a=6”,所以“a%2=0”,因此第一个switch语句,执行“case0”,将m加1,遇到break语句跳出switch语句,输出m值为2。25、有以下程序#include<stdio.h>intfun(inta,intb){if(b=0)returna;elsereturn(fun(--a,--b));}main(){printf("%d\n",fun(4,2));}程序的运行结果是()。A、1B、2C、3D、4标准答案:B知识点解析:由程序可知,函数fun(inta,intb)是一个递归函数。所以当主函数中调用“fun(4,2)”时,其执行过程如下“fun(4,2)->fun(3,1)->fun(2,0)”,其返回值为2。所以正确答案为选项B)。26、关于字符常量,以下叙述正确的是()。A、空格不是一个字符常量B、字符常量能包含大于一个的字符C、单引号中的大写字母和小写字母代表的是相同的字符常量D、所有的字符常量都可以作为整型量来处理标准答案:D知识点解析:本题考查字符常量的4个知识点:①空格是一个字符常量,而且单引号中的空格不可以省略:②字符常量只能包含一个字符;③单引号中的大写字母和小写字母代表的是不相同的字符常量;④所有的字符常量都作为整型量来处理,在计算机内部,其对应的整数值就是ASCH码值。27、下面函数调用语句含有实参的个数为()。func((exp1,exp2),(exp3,exp4,exp5));A、1B、2C、3D、5标准答案:B知识点解析:本题考查函数调用时的实参形式。这里有一个逗号运算的考查,(a,b)的运算结果为b,因而只有一个值,结合func的调用形式,可以知道实参的个数只有2个。28、有以下程序#include<stdio.h>voidmain(){intn=2,k=1;while(!(k>0‖n++));printf("%d%d\n",k,n);}程序运行后的输出结果是()。A、02B、13C、57D、12标准答案:D知识点解析:在程序中整型变量n的初始值等于2,整型变量k的初始值等于1,在执行while语句时,由于表达式k的值大于0为真,所以不再需要判断“n++”是否为真,“(k>0‖n++)”表达式的值为真。“!(k>0‖n++)”表达式的值为假,所以while语句中的条件不满足,循环语句不会执行,变量n的值也不会加1,所在输出变量k和n的值是1和2。29、以下不正确的定义语句是()。A、doublex[5]={1.0,2.0,3.0,4.0,5.0};B、inty[5]={0,1,2,3,4,5};C、charc1[]={’1’,’2’,’3’,’4’,’5’};D、charc2[]={’a’,’b’,’c’};标准答案:B知识点解析:本题考查对一维数组的赋值。选项B)中,y[5]说明数组中有5个元素,但却给它赋了6个值,数组溢出所以是错误的。30、若有以下定义,则对数组元素的正确引用是()。inta[5],*p=a;A、*&a[5]B、(*a)+2C、*p+4D、*(a+2)标准答案:D知识点解析:本题考查通过指针引用数组元素。选项A)、C)没有这种引用形式:选项B),(*a)+2与*a+2相同,表示第一个元素的值加2;选项D),*(a+2)引用数组的第3个元素。31、下列字符数组初始化语句中,不正确的是()。A、charc[]=’goodmoming’;B、charc[20]="goodmorning";C、charc[]={’a’,’b’,’c’,’d’};D、charc[]={"tgoodmoming"};标准答案:A知识点解析:本题考查两个概念。①用单引号括起来的一个字符常量只能存放一个字符:②C语言中没有字符串变量,只能用字符数组来存储字符串。选项A)中一个单引号内存放了若干个字符,是错误的;选项B)和选项D)中将一个字符串赋值给一个字符数组是允许的。32、下列程序的运行结果为()。#include<stdio.h>voidabe(char*str){inta,b,j;for(i=j=0;str[i]l=’\0’;i++)if(str[i]!=’a’)str[j++]=str[i];str[j]=’\0’;}voidmain(){charstr[]="abcdef";abc(str);printf(“str[]=%s",str);}A、str[]=bcdefB、str[]=abcdefC、str[]=aD、str[]=ab标准答案:A知识点解析:本题考查函数调用的参数传递。通过函数abc的执行,将字符串中的字母a去掉,保留剩下的,由于是通过指针调用,所以改变了字符串的结果。33、阅读下面程序,程序执行后的结果为()。#include"stdio.h"main(){char*str="abcdefghijklmnopq";while(*str++!=’e’);printf("%c\n".*str);}A、fB、aC、eD、q标准答案:A知识点解析:本题考查的是取内容运算符“*”和自加运算符“++”的优先级问题。由于“++”的优先级高于“*”,所以题干中“*str++!=’e’”,即“*(str++)!=’e’”,当str指向字符“’e’”时,while循环的条件不成立,但“str”已经进行了自加指向了字符“’f’”,所以“*str”输出字符“’f’”。34、设有如下的程序段:charstr[]="HelloWorld";char*ptr;ptr=str;执行上面的程序段后,“*(ptr+10)”的值为()。A、’\0’B、’0’C、不确定的值D、’0’的地址标准答案:A知识点解析:本题涉及字符数组和指针两个知识点:①在C语言中,字符数组在存放字符串时会自动在末尾加上“’\0’”,所以题中数组str有11个元素:②ptr指向数组str的首地址,“ptr+10”是指向“str[10]”,“*(ptr+10)”是引用str[10]的值(即结束符“’\0’”)。35、下述语句中,在字符串s1和s2相等时显示“theyareEqual”的是()。A、if(*s1==*s2)puts("theyareEqual");B、if(!strcmp(s1,s2))puts("theyareEqual");C、if(s1==s2)Puts("theyareEqual");D、if(strcmp(s1,s2))puts("theyareEqual");标准答案:B知识点解析:字符串比较不能用两个等号(==)来进行比较,应使用“strcmp(s1,s2)”函数来比较。“strcmp(s1,s2)”函数的功能是:当字符串s1和s2相等时,返回值为0,因此,当表达式“!strcmp(s1,s2)==1”时,条件成立,执行后面的语句,输出“theyareEqual”。36、设有定义:structcomplex{intreal,unreal;}data1={1,8},data2;则以下赋值语句中错误的是()。A、data2={data1.real,data1.unreal};B、data2=(2,6);C、data2.real=data1.real;D、data2->real=data1.unreal;标准答案:B知识点解析:本题主要考查结构体变量的定义与初始化。题目中定义了complex类型的结构体变量data1和data2,并对datal进行了初始化。可以用一个结构体变量的成员对另一个结构体变量的成员赋值。37、以下程序的输出结果是()。#include<stdio.h>voidprt(int*x,int*y,int*z){printf("%d,%d,%d\n",++*x,++*y,*(z++));}main(){inta=10,b=40,c=20;prt(&a,&b,&c);prt(&a,&b,&c);}A、11,42,3112,22,41B、11,41,2012,42,20C、11,21,4011,21,21D、11,41,2112,42,22标准答案:B知识点解析:本题考查的是函数参数的传递及自加运算符。主函数中第一次调用函数“prt(&a,&b,&c);”,此函数中的输出语句“printf("%d,%d,%d\n”,++*x,++*y,*(z++));”使得a和b的值均加1,而“*(z++)”由于先执行“z++”,所以c的值不变;第二次调用函数“ptr(&a,&b,&c);”使得a和b在上一次的基础上再各自加1(因为形参和实参进行的是地址传递),而c的值仍不变。38、设有以下说明,则不正确的叙述是()。unionun{inta;charb:floatc;}arr;A、arr所占的内存长度等于成员c的长度B、arr的地址和它的各成员的地址都是同一地址C、arr可以作为函数参数D、不能在定义air时对它初始化标准答案:C知识点解析:本题主要考查联合体的内存使用:联合体所占用的内存空间为最长的成员所占用的空间,int占2个字节,char占1个字节,float占4个字节,所以arr所占的内存长度等于成员c的长度;arr的地址和它的各成员的地址都是同一地址;不能直接对arr赋值,即不能在定义arr时对它初始化:art也不可以作为函数参数。39、若x=4,y=5,则x&y的结果是()。A、0B、4C、3D、5标准答案:B知识点解析:本题主要考查按位与运算的知识点。按位与是对两个运算量相应的位进行逻辑与,“&”的规则和逻辑与“&&”相同。x=4的二进制为00000100,y=5的二进制为00000101,x&y=00000100,转化为十进制即为4。二、程序填空题(本题共1题,每题1.0分,共1分。)40、给定程序中,函数fun的功能是:在形参ss所指字符串数组中,删除所有串长超过k的字符串,函数返回所剩字符串的个数。ss所指字符串数组中共有N个字符串,且串长小于M。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!#include<stdio.h>#include<string.h>#defineN5#defineM10intfun(char(*ss)[M],intk)(inti,j=0,len;/**********found**********/for(i=0;i<___1___;i++){len=strlen(ss[i]);/**********found**********/if(len<=___2___)/**********found**********/strcpy(ss[j++],___3___);}returnj;}main(){charx[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"};inti,f;printf("\nTheoriginalstring\n\n");for(i=0;i<N;i++)puts(x[i]);printf("\n");f=fun(x,7);printf("Thestringwitchlengthislessthanorequalto7:\n");for(i=0;i<f;i++)puts(x[i]);printf("\n");}标准答案:(1)N(2)k(3)ss[i]知识点解析:本题中函数fun的功能是在形参ss所指字符串数组中,删除所有串长超过k的字符串,然后函数返回所剩字符串的个数。根据题意,在fun函数中,利用for循环比较字符串长度是否小于k,然后利用sWcpy函数组成新的可用字符串数组,将可用的字符串数组的长度值进行返回,即为字符串的个数。第一空:“for(i=0;i<___1___;i++)”,这一空部分出现在fun函数中的for循环条件中,在定义了i之后i的条件。根据for后面的语句我们可以看出,这里是要进行比较,比较对象是ss所指字符串数组的所有字符串,所以这里循环要进行整改字符串数组的长度,相应的,这里for循环的循环条件就要是i小于字符串长度,而字符串长度开始就有定义,为N,所以这里应该是i<N,这一空应该填N。第二空:“if(len<=___2___)”,这一空部分出现在fun函数中,是for循环中if条件语句的条件,这根据if条件语句后面的语句我们可以知道,这里的条件语句是后面strcpy的执行条件,而strcpy要执行,根据题目给出的条件我们可以知道是要字符串长度小于等于k才能保留,所以这里的if条件语句中的条件应该是字符串长度小于k,所以这一空应该填k。第三空:“strcpy(ss[j++]___3___);”这一空部分出现在strcpy函数中,此函数为字符串复制函数,是将后面的一个字符串复制到前面一个字符数组中去,根据题意和前面的条件语句,这一行语句是要将符合条件的字符串重新组成一个新的字符串数组,然后返回新数组的长度,这样的话就能知道ss啪为新字符串数组,而这里要复制的就是原字符串数组中符合条件的字符串,所以这里要填就是前面符合条件的i所对应的字符串,所以这一空应该填ss[i]。三、程序修改题(本题共1题,每题1.0分,共1分。)41、给定程序MODI1.C中函数fun的功能是:统计字符串中各元音字母(即:A、E、I、O、U)的个数。注意:字母不分大、小写。例如:若输入:THIsisaboot,则输出应该是:1、0、2、2、0。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!#include<stdio.h>voidfun(char*s,intnum[5]){intk,i=5;for(k=0;k<i;k++)/**********found**********/num[i]=0;for(;*s;s++){i=-1;/**********found**********/switch(s)(case’a’:case’A’:{i=0;break;}case’e’:case’E’:{i=1;break;}case’i’:case’I’:{i=2;break;}case’o’:case’O’:{i=3;break;}case’u’:case’U’:{i=4;break;}}if(i>=0)num[i]++;}}main(){chars1[81];intnum1[5],i;printf("\nPleaseenterastring:");gets(s1);fun(s1,num1);for(i=0;i<5;i++)printf("%d",num1[i]);printf("\n");}标准答案:(1)num[k]=0;(2)switch(*s)知识点解析:本题中函数的功能是统计字符串中各元音字母(即A、E、I、O、U)的个数。其中,本题在while循环中采用switch-case条件判断字符串中的每一个字符并进行统计。(1)第一个标识下的for循环过程是将num数组中的变量初始值设置为0,用来统计每一个元音字母出现的个数,for循环中的循环条件表达式中的变量是k,所以第二个标识下“aura[i]=0;”改为“num[k]=0;”。(2)第二个标识下的switch-case条件选择的功能应该是对s指针指向的字符串中的每一个字符进行判断,不应该是s的数组名,所以第三个标识下“switch(s)”改为“switch(*s)”。四、程序设计题(本题共1题,每题1.0分,共1分。)42、请编写函数fun,其功能是分别统计形参t所指二维数组中字母A和C的个数。注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。#inlclude<stdio.h>#include<stdlib.h>#defineM14voidNONO();voidfun(char(*t)[M],int*a,int*c){}voidget(char(*s)[M]){inti,j;for(i:0;i<M;i++){for(j=0;j<M;j++){s[i][j]=65+rand()%12;printf("%c",s[i][j]);}printf("\n");}}main(){chara[M][M];intx,y;get(a);fun(a,&x,&y);printf("A=%dc=%d\n",x,y);NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*fp,*wf;inti,j,x,y;chara[M][M];fp=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<M;i++){for(j=0;j<M;j++){fscanf(fp,%c",&a[i][j]);)}Fun(a,&x,&y);fprintf(wf,"A=%d\n",x);fprintf(wf,"c=%d\n",y);fclose(fp);fclose(wf);}标准答案:voidfun(char(*t)[M],int*a,int*c){inti,j;*a=0;*c=0;for(i=0;i<M;i++)for(j=0;j<M;j++)if(t[i][j]==’A’)*a=*a+1;elseif(t[i][j]==’C’)*c=*c+1;}知识点解析:本题中fun函数实现的功能的主要功能是找出二维数组中A和C的个数,最先就能想到用条件语句进行判断和统计。解题步骤主要为:第一步,要得到所需要的二维数组,第二步,二维数组进入fun函数中进行数据处理,fun函数中需要if条件语句来进行判断,判断数组中的字母是否为A或者C,数组中的每个数据都需要进行判断,要注意A和C是分开统计的,所以这里需要同时统计A和C,然后分别得到结果;第三步,输出得到的结果:字母A和字母C的个数。国家二级(C语言)机试模拟试卷第2套一、选择题(本题共40题,每题1.0分,共40分。)1、数据结构主要研究的是数据的逻辑结构、数据的运算和()。A、数据的方法B、数据的存储结构C、数据的对象D、数据的逻辑存储标准答案:B知识点解析:数据结构是研究数据元素及其之间的相互关系和数据运算的一门学科,它包含3个方面的内容,即数据的逻辑结构、存储结构和数据的运算。2、一棵二叉树的前序遍历结果是ABCEDF,中序遍历结果是CBAEDF,则其后序遍历的结果是()。A、DBACEFB、CBEFDAC、FDAEBCD、DFABEC标准答案:B知识点解析:由于该二叉树的前序遍历结果是ABCEDF,显然A结点为根结点,所以后序遍历时A结点是最后遍历的,其后序遍历的结果为CBEFDA。3、在数据处理中,其处理的最小单位是()。A、数据B、数据项C、数据结构D、数据元素标准答案:B知识点解析:数据元素是由多个数据项组成,数据是能够被计算机识别、存储和加工处理的信息载体,数据处理的最小单位是数据项。4、在数据库系统的内都结构体系中,索引属于()。A、模式B、内模式C、外模式D、概念模式标准答案:B知识点解析:内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法,如数据存储的文件结构、索引、集簇及hash等存取方式与存取路径,内模式的物理性主要体现在操作系统及文件级上,它还未深入到设备级上(如磁盘及磁盘操作)。5、以下()不属于对象的基本特征。A、继承性B、封装性C、分类性D、多态性标准答案:A知识点解析:对象具有特征:标识惟一性,指对象是可区分的;分类性,指可以将具有相同属性和操作的对象抽象成类;多态性,指同一个操作可以是不同对象的行为;封装性,从外面看只能看到对象的外部特征,而不知道也无需知道数据的具体结构以及实现操作的算法;模块独立性好,对象是面向对象的软件的基本模块,对象内部各种元素彼此结合得很紧密,内聚性强。6、数据库系统的核心是()。A、数据模型B、软件开发C、数据库设计D、数据库管理系统标准答案:D知识点解析:数据库管理系统DBMS是数据库系统的核心。DBMS是负责数据库的建立、使用和维护的软件。DBMS建立在操作系统之上,实施对数据库的统一管理和控制。用户使用的各种数据库命令以及应用程序的执行,最终都必须通过DBMS。另外,DBMS还承担着数据库的安全保护工作,按照DBA所规定的要求,保证数据库的完整性和安全性。7、开发软件所需高成本和产品的低质量之间有着尖锐的矛盾,这种现象称作()。A、软件矛盾B、软件危机C、软件耦合D、软件产生标准答案:B知识点解析:随着计算机软件规模的扩大,软件本身的复杂性不断增加,研制周期显著变长,正确性难以保证,‘软件开发费用上涨,生产效率急剧下降,从而出现了入门难以控制软件发展的局面,即所谓的“软件危机”。8、关系模型允许定义3类数据约束,下列不属于数据约束的是()。A、实体完整性约束B、参照完整性约束C、属性完整性约束D、用户自定义的完整性约束标准答案:C知识点解析:关系模型允许3类数据约束,它们是:实体完整性约束该约束要求关系的主键中属性值不能为空值,这是数据库完整性的最基本要求。参照完整性约束:该约束是关系之间相关联的基本约束,它不允许关系引用不存在的元组:即在关系中的外键要么是所关联关系中实际存在的元组,要么就为空值。用户定义的完整性约束:用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。9、关系表中的每一行记录称为一个()。A、字段B、元组C、属性D、关键码标准答案:B知识点解析:在关系表中,每一列称为一个属性,对应表中的一个字段;每一行称为一个元组,对应表中的一条记录。10、在数据库管理技术的发展中,数据独立性最高的是()。A、人工管理B、文件系统C、数据库系统D、数据模型标准答案:C知识点解析:在人工管理阶段,数据无法共享,冗余度大,不独立,完全依赖程序;在文件系统阶段,数据共享性差;在数据库系统阶段,共享性好,独立性高。11、以下叙述错误的是()。A、C语言区分大小写B、C程序中的一个变量,代表内存中一个相应的存储单元,变量的值可以根据需要随时修改C、整数和实数都能用C语言准确无误地表示出来D、在C程序中,正整数可以用十进制、八进制和十六进制的形式来表示标准答案:C知识点解析:本题涉及C语言最基本的3个概念:①C语言是区分大小写的,q和Q是两个不同的变量;②变量的实质就是在内存中占据一定的存储单元,存储单元里存放的是该变量的值,变量的值可以根据需要进行修改:③整数在允许的范围内可以准确的表示出来,但不可能表示无限度的实数。正整数可用二进制、十越制、八进制和十六进制表示。12、有以下程序段:inti,n;for(i=0;i<8;i++){n=rand()%5;switch(n){case1:case3:printf("%d\n",n);break;case2:case4:printf("%d\n");continue;case0:exit(0);}printf("%d\n",n);}以下关于程序段执行情况的叙述,正确的是()A、for循环语句固定执行8次B、当产生的随机数n为4时结束循环操作C、当产生的随机数n为1和2时不做任何操作D、当产生的随机数n为0时结束程序运行标准答案:D知识点解析:当产生的随机数n为0时,执行“case0:exit(0)”这条语句,结束程序的运行。13、可在C程序中用作用户标识符的一组标识符是()。A、voiddefineWORDB、as_b3_123IfC、For--abccaseD、2cDOSIG标准答案:B知识点解析:C语言规定,标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或下划线,关键字不能用作用户标识符。14、若变量己正确定义并赋值,则以下符合C语言语法的表达式是()。A、a=a+7;B、a=7+b+c,a++C、int(12.3%4)D、a=a+7=c+b标准答案:B知识点解析:选项A)是一个C语句,不是表达式;选项B)是利用一个逗号表达式给a赋值;选项C)中的“%”求余运算符,要求两个运算对象都必须是整型;选项D)中,不能用表达式给表达式赋值,但是变量可以给自身赋值,例如:a=a-H。15、有以下程序段charch;intk;ch=’a’;k=12;printf("%c,%d,",ch,ch,k);printf("k=%d\n",k);已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是()。A、因变量类型与格式描述符的类型不匹配输出无定值B、输出项与格式描述符个数不符,输出为零值或不定值C、a,97,12k=12D、a,97,k=12标准答案:D知识点解析:在用基本输出函数printf时,格式说明与输出项的个数应该相同。如果格式说明的个数少于输出项的个数,多余的输出项不予输出;如果格式说明个数多于输出项个数,则对于多余的格式项输出不定值或0。16、下列叙述中错误的是()。A、计算机不能直接执行用C语言编写的源程序B、C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件C、后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件D、后缀为.obf和.exe的二进制文件都可以直接运行标准答案:D知识点解析:C源程序经过程序编译之后生成一个后缀为“.obj”的二进制文件(称为目标文件),然后由称为“连接程序”的软件包文件与C语言提供的各种库函数连接起来生成一个后缀为“.exe”的可运行文件。17、有以下程序#include<stdio.h>voidmain(){inta=1,b:=0;printf("%d,",b=(a++)+(a++));printf("%d>n",a+b);}程序运行后的输出结果是()。A、4,6B、2,5C、3.5D、2,6标准答案:B知识点解析:在主函数中定义了两个整型变量a和b,并把它们的初值分别设置为1和0;在第二条语句中,首先计算b=a+a,然后a自增两次,因此第二句结束时,b=2,a=3,然后第三句,a+b=5。18、若有代数式,(其中e仅代表自然对数的底数,1不是变量),则下列能够正确表示该代数式的C语言表达式是()。A、sqrt(abs(n^x+e^x))B、sqrt(fabs(pow(n,x)+pow(x,e)))C、sqrt(fabs(pow(n,x)+exp(x)))D、sqrt(fabs(pow(x,n)+exp(x)))标准答案:C知识点解析:n和e的x幂次方,要分别调用C语言的数学库函数“doublepow(n,x)”和“doubleexp(x)”,因为这两个函数的返回值都为double型,对两者的和计算绝对值,调用库函数“doublefabs(pow(n,x)+exp(x))”,求出和的绝对值,再调用开平方函数“doublesqrc(fabs(pow(n,x)+exp(x)))”,这样计算出的结果就是题干中表达式的值。19、设有定义:intk=0;,下列选项的4个表达式中与其他3个表达式的值不相同的是()。A、k++B、k+=1C、++kD、k+1标准答案:A知识点解析:因为题中有语句“intk=0;”,所以选项B)、C)、D)都是对k的值加1,选项A)的语句k++表示先利用k的值后进行运算,然后k的值才加1。20、有下列程序,其中‰表示按无符号整数输出。main(){unsignedintx=0xFFFF;/*x的初值为十六进制数*/printf("%u\n",x);}程序运行后的输出结果是()。A、-1B、65535C、32767D、0xFFFF标准答案:B知识点解析:“%u”格式符表示以十进制形式输出无符号整形变量。本题中无符号整形变量x=0xFFFF表示的是十六进制无符号整型变量的最大值65535,所以最后输出的结果为65535。21、下面程序的运行结果是()。for(i=3;i<7;i++)printf((i%2)?("**%d\n"):("##%d\n"),i);A、**3##4**5**6B、##3**4##5**6C、##3**4##5##6D、**3##4**5##6标准答案:D知识点解析:本题考查printf函数的输出格式和条件表达式“?:”的使用。①printf函数输出时“**%d\n”和“##%d\n”中的“##”和“**”都是直接输出。②条件表达式的基本格式为:“a?b:c”。它的运算规则为:当a为非0时,整个表达式的值取b的值,当a为0时,整个表达式取c的值。22、设有语句:if(a==1)b=2;c=3;,以下语句中与之等价的是()。A、if(a==1){b=2;c=3;}B、if(a!=1){;}else{b=2;c=3;}C、if(a==1)c=3;b=2;D、(a==1)?b=2:a=a;c=3;标准答案:D知识点解析:在C语言中,用分号表示一条语句的结束,用{}把几条语句放在一块表示一个语句块,其整体表示一个功能。因而在题目给出的四个选项中,选项A)、B)、C)均与题中所给不同,而选项D)相同。23、运行下列程序时,若输入数据为“321”,则输出结果是()。main(){intnum,i,j,k,s;scanf("%d",&num);if(num>99)s=3;elseif(num>9)s=2:elses=1;i=num/100;j=(num-i*100)/10;k=(num-i*100-j*10);switch(s){case3:printf("%d%d%d\n",k,i);break;case2:printf("%d%d\n",k,j);case1:printf("%d\n",k);}}A、123B、1,2,3C、321D、3,2,1标准答案:A知识点解析:本题考查if…else语句和switch语句。scanf函数通过键盘读入。num的值。因为“num=321>99”,所以“s=3,i=3,i=2,k=1”。因为s=3,所以执行case3,输出k,j,i的值,然后通过break结束程序。24、有以下程序#include<stdio.h>#include<string.h>structA{inta;charb[10];doublec;};structAf(structAt);main(){structAa={1001,"ZhangDa",1098.0};a=f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}structAf(structAt){t.a=1002;strcpy(t.b,"WangPeng");t.c=1220.0;returnt;}程序运行后的输出结果是()。A、1001,ZhangDa,1098.0B、1002,ZhangDa,1220.0C、1001,WangPeng,1098.0D、1002,WangPeng,1220.0标准答案:D知识点解析:在主函数中定义结构体A的变量a,并对其赋初值,再调用函数f(a),在函数f(a)中对结构体变量a的各个成员重新进行了赋值操作,并把其值返回在屏幕上输出。25、判断char型变量c1是否为小写字母的正确表达式为()。A、’a’<=c1<=’z’,B、(c1>=a)&&(c1<=z)C、(’a’>=c1‖(’z’<=c1)D、(c1>=’a’)&&(c1<=’z’)标准答案:D知识点解析:C语言规定,字符常量在程序中要用单引号括起来。首先判断c1是否为小写字母的主要条件“c1>=’a’”和“c1<=’z’”是逻辑与关系,其次选项A)的这种形式C语言中没有,所以选项D)正确。26、设有定义:chars[10];inti=0;,以下不能将一行(不超过100个字符)带有空格的字符串正确读入的语句或语句组是()。A、gets(s);B、scanf("%s",s);C、while((s[i++]=getchar())!=’\n’);s[i]=’\0’;D、do{scanf("%c",&s[i]);}while(s[i++]!=’\n’);s[i]=’\0’;标准答案:B知识点解析:本题考查标准输入输出函数和循环语句。gets(s)函数的作用是将输入的字符读入字符串s,直到遇到回车。而scand()函数接收字符串时的结束标志为回车或者空格。因此选项B)不能,选项C)和选项D)中按字符逐个读入字符串s中,直到读入的字符是换行符为止,因此正确。27、下面4个关于C语言的结论中错误的是()。A、可以用do…while语句实现的循环一定可以用while语句实现B、可以用for语句实现的循环一定可以用while语句实现C、可以用while语句实现的循环一定可以用for语句实现D、do…while语句与while语句的区别仅是关键字“while”出现的位置不同标准答案:D知识点解析:本题考查几个循环语句的关系。①do…while语句、while语句、for语句所实现的循环可以相互替代:②do…while语句和while语句的区别是do…while语句至少执行一次,再判断循环条件,while语句是先判断条件再执行。28、若有以下程序段:structst{intn;int*m;};inta=2,b=3,c=5;structsts[3]=({101,&a},{102,&c},{103,&b}};main(){structst*p;p=s;…}则以下表达式中值为5的是()。A、(p++)->mB、*(p++)->mC、(*p).mD、*(++p)->m标准答案:D知识点解析:本题考查如何通过指针引用数组元素。首先定义了一个结构体,然后定义了一个结构体变量s[3],并赋了初值。在主程序中,定义了一个指向结构体变量s的指针p,要使表达式的值为5,就应该引用s[1].m的值,使指针p指向s[1],++p可以实现将p指针加1,指向s[1]。29、下列程序的运行结果是()。#include<stdio.h>voidsub(int*s,int*y){staticintm=4;*y=s[0];m++;}voidmain(){inta[]={1,2,3,4,5},k;intx;printf("\n");for(k=0;k<=4;k++){sub(a,&x);printf("%d,",X);}}A、1,1,1,1,1,B、1,2,3,4,5,C、0,0,0,0,0,D、4,4,4,4,4,标准答案:A知识点解析:本题中sub(int*s,int*y)函数的参数是两个指针型变量,在函数体内将数组s的第一个元素赋给y。主程序内,首先定义了一维数组并赋初值,然后通过for循环,5次调用sub(a,&x)函数,每一次调用都是将数组a的第一个元素1赋给x,并输出。30、有以下程序:#include<stdio.h>intfun(intx,inty){if(x!=y)return(y);elseretum((x+y)/2);}main(){inta=4,b=5,c=6;printf("%d\n",fun(2*a,fun(b,c)));}程序运行后的输出结果是()。A、3B、6C、8D、12标准答案:B知识点解析:fun(b,c)即fun(5,6),5!=6,所以返回6;fun(2*a,6)即fun(8,6),8!=6,所以返回6。31、C语言中规定,程序中各函数之间()。A、既允许直接递归调用也允许间接递归调用B、不允许直接递归调用也不允许间接递归调用C、允许直接递归调用不允许间接递归调用D、不允许直接递归调用允许间接递归调用标准答案:A知识点解析:本题考查函数调用的基本概念。在函数调用时,只要符合函数的使用,程序中的各个函数间既可以直接调用其他函数,也可以递归调用其自身。32、以下程序的输出结果是()。#include<stdio.h>main(){inta[3][3]={0,1,2,0,1,2,0,1,2},i,j,s=1;for(i=0;i<3.i++)for(j=i,j<=i0++)s+=a[i][a[j][j];printf("%d\n",s);}A、3B、4C、1D、9标准答案:B知识点解析:当外层循环为i时,内层循环j只能取j=i,所以s+=a[i][a[j][j]],其实就是s+=a[i][a[i][i]],当i=0时,s=s+a[0][a[0][0]]=s+a[0][0]=1,当i=1时S=S+a[1][a[1][1]]=s+a[1][1]=1+1=2,当i=2时,s=s+a[2][a[2][2]]=s+a[2][2]=2+2=4。33、有以下程序:#include<stdio.h>#define5+6main(){inta=2,c;C=x*2:printf("%d",c);}程序运行后的输出结果是()。A、17B、22C、16D、11标准答案:A知识点解析:define语句仅进行简单替换,因此c=5+6*2=17。34、当用“#defineF37.5f”定义后,下列叙述正确的是()。A、F是float型数B、F是char型数C、F无类型D、F是字符串标准答案:D知识点解析:字符替换定义格式为:#deflne标识符(形参表)形参表达式。题中F是代表形参表达式的标识符(字符串)。35、若有定义语句:inta=3,b=2,c=1;,以下选项中错误的赋值表达式是()。A、a=(b=4)=3;B、a=b=c+1;C、a=(b=4)+c;D、a=1+(b=c=4);标准答案:A知识点解析:这道题目主要考察赋值表达式,对于赋值表达式来说,赋值号“=”的左边一定为变量名,右边为一个C语言合法的表达式。36、以下说法正确的是()。A、宏定义是C语句,要在行末加分号B、可以使用≠≠undefine提前结束宏名的使用C、在进行宏定义时,宏定义不能嵌套D、双引号中出现的宏名也要进行替换标准答案:B知识点解析:本题考查宏的使用规则:①字符替换格式:#define标识符字符串,行末不加分号;②双引号中出现的宏名不替换;③如果提前结束宏名的使用,程序中可以使用#undefine;④在进行宏定义时,宏定义能层层置换,能够嵌套。37、下面程序的输出结果是()。typedefunion{longx[1];inty[4];charz[10];}M;Mt;main(){printf("%d\n",sizeof(t));}A、32B、16C、10D、4标准答案:C知识点解析:“联合体”所占用的内存空间为最长的成员所占用的空间。题中联合体的z[10]成员是联合体中占空间最长的成员。38、以下程序中函数sort的功能是对a数组中的数据进行由大到小的排序voidsort(inta[],intn){inti,j,t;for(i=0;i<n-1;i++)for{j=i+1;j<n;j++)if(a[i]<a[j]){t=a[i];a[i]=a[j];a[j]=t;}}main(){intaa[10]={1,2,3,4,5,6,7,8,9,10},i;sort(&aa,[3],5);for(i=0;i<10;i++)printf("%d,",aa[i]);printf("\n");}程序运行后的输出结果是()。A、1,2,3,4,5,6,7,8,9,10,B、10,9,8,7,6,5,4,3,2,1,C、1,2,3,8,7,6,5,4,9,10,D、1,2,10,9,8,7,6,5,4,3,标准答案:C知识点解析:程序中sort函数的功能是对数组中的数据进行从大到小的排序。主函数main中调用函数“sort(&aa[3],5);”,使得数组aa中从第4个元素开始的5个元素进行从大到小的排序,数组aa中的元素变为:1,2,3,8,7,6,5,4,9,10。并输出这些元素。39、设x=061,y=016,则z=x|y的值是()。A、00001111B、11111111C、00111111D、11000000标准答案:C知识点解析:本题主要考查按位或运算,x=061(二进制为00110001),y=016(二进制为00001110),进行或运算后结果为00111111。40、函数rewind(fp)的作用是()。A、使fp指定的文件的位置指针重新定位到文件的开始位置B、将fp指定的文件的位置指针指向文件中所要求的特定位置C、使fp指定的文件的位置指针向文件的末尾D、使fp指定的文件的位置指针自动移至下一个字符位置标准答案:A知识点解析:位置指针重返文件头函数rewindq()的调用形式为:rewind(fp)。其中,“fp”是指向文件的文件型指针。rewind(fp)的功能是:使fp指定的文件的位置指针重新定位到文件的开始位置。二、程序填空题(本题共1题,每题1.0分,共1分。)41、给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用fun函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!#include<stdio.h>#iniclude<stdlib.h>#defineN8typedefStruct1ist{intdata;structlist;*next;}SLIST;voidfun(SLIST*p)(SLIST*t,*s;t=p->next;s=p;while(t->next!=NULL){s=t;/**********found**********/t=t->___1___;}/**********found**********/printf("%d",___2___);s->rlext=NULL;/**********found**********/free(___3___);}SLIST*creatlist(int*a){SLIST*h,*p,*q;inti;h=p=(SLIST*)malloc(sizeof(SLIST));for(i=0;i<N;i++){q=(SLIST*)malloc(sizeof(SLIST));q->data=a[i];p->next=q;p=q;}p->next=0;returnh;}voidoutlist(SLIST*h){SLIST*p;p=h->next;if(p==NULL)printf("\nThelistisNULL!\n");else{printf("\nHead");do{printf("->%d",p->data);p=p->next;}while(p!=NULL);printf("->End\n");}}main(){SLIST*head;inta[N]={11,12,15,18,19,22,25,29};head=crearliSt(a);printf("\nOutputfromhead:\n");outlist(head);printf("\nOutputfromtail:\n");while(head->next!=NULL){fun(head);printf("\n\n");printf("\nOutputfromheadagain:\n");outlist;(head);}}标准答案:(1)next(2)t->data(3)t知识点解析:fun函数的功能是输出链表尾部结点中的数据,并释放该结点,使链表缩短。由于链表是单向的,找到链表尾部结点需要利用循环从头结点开始查找,直至找到最后一个,找到之后输出尾部结点的数据,然后删除尾结点。第一空:fun函数中的循环目的是找到尾结点“while(t->next!=NULL)”,利用结点变量s和t,s指向当前节点,t不断指向下一个结点,因此,第一空处应该是“t=t->next;”。第二空:这里是输出尾结点中的数据,已经利用循环找到了尾结点t,t的数据是t->data,因此,第二空处应该为“printf”("%d",t->data);”。第三空:输出尾结点数据之后删除尾结点,使用free,又因为尾结点是t,因此,第三空处应该为“free(t);”。三、程序修改题(本题共1题,每题1.0分,共1分。)42、给定程序MODI1.C中,函数fun的功能是判断整数n是否是“完数”。当一个数的因子之和恰好等于这个数本身时,就称这个数为“完数”。例如:6的因子包括1、2、3,而6=1+2+3,所以6是完数。如果是完数,函数返回值为1,否则函数返回值为0。数组a中存放的是找到的因子,变量k中存放的是因子的个数。请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。#include<stdio.h>intfun(intn,inta[],int*k){intm=0,i,t;t=n;/**********found**********/for(i=0;i<n;i++)if(n%i==0){a[m]=i;m++;t=t-i;}/**********found**********/k=m;/**********found**********/if(t=0)return1;elsereturn0;}main(){intn,a[10],flag,i,k;printf("请输入一个整数:");scanf("%d",&n);flag=fun(n,a,&k),if(flag){printf("%d是完数,其因子是:",n);for(i=0,i<k,i++)printf("%d",a[i]);printf("\n");}elseprintf("%d不是完数.\n",n);}标准答案:(1)for(i=0;i<n;i++)改为for(i=1;i<n;i++)(2)k=m;改为*k=m;(3)if(t=0)改为if(t==0)知识点解析:本题的fun函数主要功能是:是判断整数n是否是“完数”。当一个数的因子之和恰好等于这个数本身时,就称这个数为“完数”。(例如:6的因子包括1、2、3,而6=1+2+3,所以6是完数)如果是完数,函数返回值为1,否则函数返回值为0。数组a中存放的是找到的因子,变量k中存放的是因子的个数。这里是一个条件判断问题,原理上利用条件if条件语句和for循环得到结果,结果则是用数组输出完数的因子,用k变量输出因子的个数。这里fun()函数为了判定这个数字是否为完数,一定要使用正确的循环,这个判断条件还是需要一定的步骤的。最重要的就是注意细节(1)第一个错误在fun()函数的for循环中,这里的循环的就是输入数字n的因式,很明显的一个问题就是循环的起始值有问题,这从i=0开始就违反了最基本的四则运算,0不可能是其他整数的因式,也没有意义。所以这里应该将“i=0”改为“i=1”。(2)第二个错误在fun()函数中数字经过for循环过后,这里“k=m”,是为了得到“k”的值,也就是因子的个数。但是要注意的细节是在fun()函数中的参数是“*k”,也就是说k只是一个指针变量,而不是我们所需要的因子个数的变量,所以这里我们应该使用的是“*k”,即将“k=m”改为“*k=m”。(3)第三个错误在fun函数第二个if条件语句中,这里“f(t=0)return1;”的t是数字减掉因子和的值,也就是说只要是t等于0就代表输入的数字是一个完数,这里原本的意图就是在得到因子的和之后判断数字是否为完数。但是又有一个细节没有注意到的就是在if条件语句中,等于号应该是“==”,而不是普通的“=”,所以这里应该将“if(t=0)”改为“if(t==0”。)四、程序设计题(本题共1题,每题1.0分,共1分。)43、请编写函数fun,功能是:判断形参n中的正整数是几位数(输入数据的位数不超过4位),并将结果通过函数值返回。例如:若输入的数据为123,则输出结果为:输入的数字是3位。注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。#include<stdio.h>voidNONO();intfun(intn){}main(){intn,place;do{printf("请输入一个4位以内的正整数:");scarlf("%d”,&n);}while(n<0||n>9999);place=fun(n);printf("输入的数字是%d位\n",place);NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*fp,*wf;inti,n,place;fp=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(fp,"%d",&n);place=fun(n);fprintf(wf,"%d\n",place);}fclose(fp);fclose(wf);}标准答案:intfun(intn){intk=0;if(n>999)k=4;elseif(n>99)k=3;。elseif(n>9)k=2;elsek=1;returnk;}知识点解析:本题fun函数的主要功能是判断形参n中的正整数是几位数(输入数据的位数不超过4位),并将结果通过函数值返回。首先我们能想到这一题主要在于判断,因为题目已经限制了条件,就是数字的大小要不超过四位数的数字,而且要求只要输出这个数字的位数,这样我们就能想到,只要判断这个数字的大小就能知道位数了,小于10位1位,大于等于10小于100为2位,大于等于100小于1000位3位,大于等于1000小于等于9999为4位。所以只需要很简单的几个判断语句就能实现函数的功能,然后输出结果。主函数中首先要定义数据,然后需要手动输入一个用来进行判断的数字,注意数字要不超过4位,见程序代码第14~16行,而且这里为了防止输入时不小心的错误或者是有人故意错误输入而引发的不好的后果,在数据进入fun函数处理之前还要一个while函数来进行判断数据是否合理在进行处理,见程序代码第17行。然后数字进入fun函数,这里很明显会出现四种情况,数字的位数为1位,2位,3位或4位,所以我们用if…elseif来区别这四种情况见程序第6~9行,在判断完之后我们就可以返回数字位数k的值然后再到主函数main函数中进行输出处理。国家二级(C语言)机试模拟试卷第3套一、选择题(本题共40题,每题1.0分,共40分。)1、下面程序的运行结果是()。#includemain(){inti;for(i=1;i<=5;i++){if(i%2)printf("*");elseprintf("#");}}A、*#*#*B、#*#*#*C、*#*#D、#*#*标准答案:A知识点解析:分析程序可知,程序循环5次,然后利用if语句决定每次循环时输出的字符。当i为奇数时,i%2=1,if(i%2)为真,输出“*”:当i为偶数时,i%2=0,if(i%2)为假,执行else语句,输出“#”,所以当i取1、3、5值时输出“*”,当i取2、4值时输出“#”。2、下列叙述中正确的是()。A、在栈中,栈中元素随栈底指针与栈顶指针的变化而变化B、在栈中,栈顶指针不变,栈中元素随栈底指针的变化而变化C、在栈中,栈底指针不变,栈中元素随栈顶指针的变化而变化D、以上说法均不对标准答
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度山地农业用地承包协议一
- 2024年度金融衍生品交易合同
- 2024年新型建筑施工总承包合同样本版B版
- 语言启蒙小班阅读与表达计划
- 2024年专业经理人雇佣协议标准版3篇
- 2024版房屋租赁合同及附属设施3篇
- 建筑拆除清理施工合同模板
- 工厂热水锅炉维护合同
- 舞厅装饰施工合同
- 2024年度建筑工程泥工分包合同8篇
- 九下初中语文24《十五从军征》公开课一等奖创新教学设计
- NBT 31021-2012 风力发电企业科技文件归档与整理规范
- 牛结核病诊断技术(γ-干扰素体外ELISA法)
- 2023年山东青岛幼儿师范高等专科学校招聘考试真题及答案
- 引水闸施工技术方案样本
- 移动电子商务基础与实务第3版全套教学课件
- 应急技术与管理职业生涯规划
- 胡桃夹综合征医学课件
- 学生宿舍安全隐患排查整治台账
- 设备维护人员的技能要求
- 药学生职业规划
评论
0/150
提交评论