




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件水平考试(初级)程序员下午(应用技术)模拟试卷1(共9套)(共76题)软件水平考试(初级)程序员下午(应用技术)模拟试卷第1套一、流程图题(本题共2题,每题1.0分,共2分。)阅读以下应用程序说明和C程序,将C程序段中(1)~(6)空缺处的语句填写完整。【说明】某大学征询学生意见,从各学院预选的n(n≤60)位优秀大学生中,评选出“十佳大学生”。以下【C程序】对各位学生选票进行相关的统计、排序等处理。(1)各学院预选的优秀大学生按1,2,…顺序连续编号,每个编号用两个字符表示,即01,02,…。(2)所回收的选票按以下格式存于文件source中,每行字符串对应一张选票。其中,姓名占10个字符,学院名称占30个字符,大学生编号占20个字符。(3)对应名次的大学生编号可以有空缺,但必须用00表示。(4)若编号超出规定范围,或编号重复出现,按照废票处理。(5)按选票中所列“十佳大学生”顺序给出各名大学生的得分。评分标准如下:一二三四五六七八九十151297654321(6)按各位大学生得分数由高到低顺序排队,并按以下格式列出“十佳大学生”排行表。名次大学生编号合计得分合计得票数若得分相同,则得票数多的在前;若得分和得票数都相同,则编号小的在前。以下【C程序】中所应用到的函数fopen、fclose和fgets都是I/O程序库中的函数。【C程序】#include<stdio.h>#definen60longinttn[n],td[n],score[n+1][10],order[n];chars[80];intmark[]=(15,12,9,7,6,5,4,3,2,1);FILE*fp,*fopen();Main(){intc,g,k,I,j,b[10];longinte,d,t,tt,dd;char*p;for(i=0;i<=n;i++)for(j=0;j<10;j++)score[i][j]=0;fP=fopen("source","r");/*以读方式打开文件source*/p=fgets(s,80,fp);/*读fp所指文件的下一行字符串于s*/while(*p){g=l;k=0;p+=40;while(k<10){c=((*p++)-'0')*10+((*p++)-'0');b[k++]=c)if(c<=n){if(c){i=0;While((1));If((2)){g=0;break;}}else{g=0;break;}}If(g)For(i=0;i<k;i++)If(b[i])(3);p=fgets(s,80,fP);}Fclose(fp);/*关闭fp所指文件*/For(i=1;i<n;i++){For(t=0,d=0,j=0;j<10;j++){t+=(e=score[i][j]);d+=e*mark[j];}tn[i-1]=t;td[i-1]=d;order[i-1]=i;}For(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if((t=td[order[j]-1])>(d=td[order[k]-1]))k=j;elseif(t==d){tt=(4);dd=(5);for(c=0;c<10;c++)if((e=(6))>0){k=j;break;}elseif(e<0)break;}If(k!=i){t=order[k];order[k]=order[i];order[i]=t;}}For(i=0;i<10;i++)Printf("%2d%2d%d%d\n",i+1,order[i],td[order[i]-1],tn[order[i]-1]));}}1、请将以上C程序段中,(1)~(6)空缺处的语句填写完整。标准答案:(1)c!=b[i++],或其他等价形式(2)i<k,或其他等价形式(3)score[b[i]][i]++,或其他等价形式(4)order[j](5)ordcr[k](6)score[tt][c]-score[dd][c]知识点解析:仔细阅读本试题的程序说明和【C程序】后,可得出评选“十佳大学生”的数据格式和算法。该C程序先读入一行字符,进行合法性检查后再进行选票统计;读入所有选票后,再计算每个大学生的得分和选票数,最后进行排序输出。通常,阅读一个C程序时,应先明白程序中所用变量的含义,这对解题是很有帮助的。程序中所用变量的含义,除了可在程序说明中了解之外,还可以通过程序中的输入/输出语句来获知。对照程序说明中给出的输出次序可以了解到,数组order是用来存放第i名大学生的编号,数组td用来存放大学生的总分,数组tn用来存放大学生得到的选票总数。程序中用while(*p){...}语句所包含的程序段进行合法性检查并进行统计。合法性检查即排除非法的选票。指针p用于表示每次读入的一行80个字符的首地址,语句“p+=40”使p指向每张选票的第40个字符,把每张选票上的大学生编号转换成十进制数c,并存入数组b中。由于每张选票最多可选十名,因此需用k<10来进行循环控制。由于(1)、(2)空缺处位于while(*p){...}的内循环中,且由语句“g=0;break;”(即变量g为0时跳出该循环)和语句“if(g)”可知,譬为合法性标记,因此(1)、(2)空缺处所填写的语句完成选票的合法性检查。由于非法选票有“编号超出规定范围”和“编号重复出现”两种,因此应当把当前编号c和已处理过的编号b[i](i=0...k-1)进行比较,从而来判断是否满足“编号超出规定范围”,即(1)空缺处应填入“c!=b[i++]”。另外,当前编号c已存放在第k个字符中,当i小于k时,即表示有编号重复,因此(2)空缺处应填入“i<k”。(3)在空缺处的“for(i=0;i<k;i++)”循环程序段中,数组b[i]表示编号为b[i]的大学生,在该张选票上被评为i+1名;数组score[b[i]][i]表示编号为b[i]的大学生,被评为i+1名的选票有score[b[i]][i]张。当一张选票上的10个编号都合法时,则应把该选票上的数据存入数组score中,即对编号为b[i]的大学生所得的第i+1名选票加1,因此(3)空缺处应填入“score[b[i]][i]++”。“fclose(fp);”之后的语句是对大学生的得分进行统计工作,其结果分别存放在大学生编号数组Order、选票总数变量tn和总分变量td中,然后进行排序。由语句的结构可知,用变量k标记得分最高的位置,即编号为order[k]的大学生得分为本次排序中最高,然后在外层for循环中进行条件交换,由此可知,该排序采用的是选择排序算法。在排序过程中如果得分相同,即程序中条件“if(t==d)”成立,则必须根据两名大学生的得票情况进行排序,得分名次在前、票数多者排在前面。(6)空缺处所填写的语句是对得票数相同的情况进行排序处理,e为控制变量,用来存放编号为Order[j]和Order[k]的相同名次的得票数的比较结果,并根据该比较结果确定是否进行位置交换。因此(4)空缺处所填写的内容是“order[j]”;(5)空缺处所填写的内容是“order[k]”;(6)空缺处所填写的内容是“score[tt][c]—score[dd][c]”,即编号为j的大学生与编号为k的大学生的得票数之差。2、以上C程序段中,采用了哪种算法对大学生得分进行排序?标准答案:选择排序算法知识点解析:由【问题1】要点解析可知,该C程序段采用选择排序算法对大学生得分进行排序处理。二、C语言题(本题共3题,每题1.0分,共3分。)3、阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。【说明】以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。【C程序】#include<stdio.h>#defineM30#defineNLEN10typedefstructnode{intcur_s;/*最近输入成绩的科目*/Charno[NLEN];intscore;structnode*next;}NODE;ints[M],sp,ss,i,mark,order,C;FILE*fp;NODE*h,*U,*V,*p;Charfname[80],no[NLEN],ans;main(){for(h=NULL,sp=0;;){printf("输入科目成绩文件名(输入aaaa表示强行结束)。\n");while(1){scanf("%s",fname);if(strcmp(fname,"aaaa")==0)break;if((fp=fopen(fname,"r"))==NULL)printf("不能打开文件%s,请重新输入科目文件名。\n",fname);elsebreak;}if(strcmp(fname,"aaaa")==0)break;fscanf(fp,"%d",&ss);/*输入科目号*/s[sp]=s;for(i=0;s[i]!=ss;1++);if((1)){printf("该科目的成绩已输入,请输入别的科目成绩文件。\n");continue;}sp++;while(fscanf(fp,"%s%d",no,&mark)==2){/*在链表中寻找最近输入的学号*/for(v=h;v!=NULL&&strcmp(v->no,no)<0;u=v,v=v->next);if(v!=NULL&&strcmp(v->no,nb)==0){/*该生已有成绩*/if(V->cur_s!=ss){/*该生的当前科目成绩是第一次输入*/v->score+=mark;/*累计总成绩*/v->cur_s=ss;}/*同一科目成绩重复输入,后输入成绩被忽略*/}else{p=(NODE*)malloc(sizeof(NODE));/*一位新的学生*/strcpy(p->no,no);p->score=mark;p->cur_s=ss;p->next=v;if(v==h)(2);else(3);}}fclose(fp);printf("还有科目成绩文件要输入吗?(Y/N)");scanf("%c",&ans);if(ans==’N’||ans==’n’)break;}/*以下按总成绩和学号对链表排序*/v=(NODE*)malloc(sizeof(NODE));v->next=h;h=v;while(v->next!=NULL){/*在余下的部分链表中找总成绩高学号小的表元*/for(p=v,u=v->next;u->next!=NULL;u=u->next)if(u->next->score>p->next->score||u->next->score==p->next->score&&strcmp(u->next->no,p->next->no)<0)p=u;if(p!=v){u=p->next;p->next=(4);(5)=v->next;v->next=u;}v=v->next;}v=h;h=h->next;free(v);printf("名次总成绩人数学号\n");/*以下按格式要求输出*/v=h;order=1;while(v!=NULL){for(c=1,u=v->next;u!=NULL&&u->score==v->score;(6);printf("%4d%7d%8d",order,v->score,c);for(order+=c,i=1;(7);v=v->next,i++){if(i>1&&i%5==1)printf("\n%23c",’’);printf("%s",v->no);}printf("\n");}}标准答案:(1)i<sp或i!=sp或其他等价的形式(2)h=p(3)u->next=p(4)u->next(5)u->next(6)C++,u=u->next(7)i<=c,或c-!=0,或u!=v,或c->0,或c-或其他等价的形式知识点解析:通读题干说明和C程序之后可知,该C程序首先从指定的文件中输入某个科目的学生学号和成绩,并进行合法性检查,全部输入完成后,按总成绩进行排序。程序采用链表结构进行存储,最后按指定的格式输出。该应用程序首先输入数据,(1)空缺处所在的for循环语句是对输入的数据进行检查,数组s的作用是记录已经输入的科目。当输入一个科目之后,就在数组s中进行检查处理。如果已有该科目,就提示“该科目的成绩已输入,请输入别的科目成绩文件”信息,要求用户重新输入。其中,if语句用于判断是否有该科目,因此(1)空缺处所填写的内容是“i<sp”或“i!=sp”。接着在链表中寻找最近输入的学号,循环语句“for(v=h;v!=NULL&&strcmp(v->no,no)<0;u=v,v=v->next);”结束之后,通过if...else语句对循环的出口进行判断,(2)、(3)空缺处是对应没有该学生的成绩(即是一位新学生)的情况,此时需要申请存储空间,然后进行赋值并把它插入到链表中。由于链表是排序的,因此需要判断插入点是否是第1个节点。如果是第1个节点,就需要修改表头节点的指针,因此(2)空缺处所填写的内容是“h=p”,(3)空缺处所填写的内容为“u->next=p”。接下来程序通过while循环对链表按总成绩的高低和学号从小到大的顺序进行排序。通读C程序可知,指针p所指向的节点应在指针u所指向的节点之前(或等于),指针v所指向的节点为当前节点。在内循环结束之后,若p!=v,则表示找到一个满足排序条件的节点,此时就需要移动指针。因此(4)、(5)空缺处所填写的内容均为“u->next”。应用程序的最后一个while循环语句,其功能是对排序后的链表按指定的格式进行输出。变量c的功能是计数器,用来记录总成绩相等的人数,因此(6)空缺处所填写的内容的作用是使指针u下移,计数器加1,即该空缺处应填入“c++,u=u->next”。变量Order的作用是记录名次,而(7)空缺处所在的for循环语句的功能是,输出成绩相同的学生的学号。由于计数器c的初值为1,因此该for循环的结束条件为c=O或i=c。由此进一步推知,(7)空缺处所填写的内容是“c--!=0”或“i<=c”或其他等价的形式。4、请阅读以下技术说明和C代码,将程序段中(1)~(5)空缺处的语句填写完整。【说明】著名的四色定理指出任何平面区域图均可用4种颜色着色,使相邻区域着不同的颜色。以下C程序对给定的区域图找出所有可能的不超过4种颜色的着色方案。该程序中用1~4分别表示4种颜色。要着色的N个区域用0~-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域了相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i,所着颜色。【C程序】#include<stdio.h>#defineN10voidoutput(intcolor[]){/*输出一种着色方案*/inti;for(i=0;i<N;i++)printf("%4d",color[i]);printf("\n");}intback(int*ip,intcolor[]){/*回溯*/intc=4;while(c==4){if(*ip<=0)return0;--(*ip);c=(1);color[*ip]=-1;}returnc;}/*检查区域i,对c种颜色的可用性*/intcolorOk(inti,intc,int[][N],intcolor[]){intj;for(j=0;j<i;j++)if((2))return0;return1;}/*为区域i选一种可着色的颜色*/intselect(inti,intc,intadj[][N],intcolor[]){intk;for(k=c;k<=4;k++)if(colorOK((3)))returnk;return0;}intcoloring(intadj[][N]){/*寻找各种着色方案*/intcolor[N],i,c,cnt;for(i=0;i<N;i++)color[i]=-1;i=c=0;cnt=0;while(1){if((c=(4))==0{c=back(&i,color);if(c==0)returncnt;}else{(5);i++;ifi==N){output(color);++cnt;c=back(&i,color);}elsec=0;}}}voidmain()(intadj[N][N]={{0,1,0,1,1,1,1,1,1,1},{1,0,1,1,0,1,1,1,1,0},{0,1,0,1,0,1,1,0,1,1},{1,1,1,0,1,1,0,0,1,1},{1,0,0,1,0,1,0,0,0,0},{1,1,1,1,1,0,1,0,0,1},{1,1,1,0,0,1,0,0,1,0},{1,1,0,0,0,0,0,0,1,1},{1,1,1,1,0,0,1,1,0,1},{1,0,1,1,0,1,0,1,1,0},};printf("共有%d组解.\n",coloring(adj));}标准答案:(1)color[*ip](2)adj[i][j]!=0&&color[j]==c(3)I,k,adj,color(4)select(I,c+1,adj,color)(5)color[i]=c知识点解析:这是一道要求考生用C语言解决着色问题的编程题。本题的解答思路如下。认真阅读程序说明部分和所给出的C程序段可知,该C程序由6个函数组成,即主函数main()、输出一种着色方案函数voidoutput(intcolor[])、回溯操作函数intback(int*ip,intcolor[])、检查区域i对c种颜色的可用性函数intcolorok(intI,intc,int[][N],intcolor[]、为区域i选一种可着的颜色函数intselect(intI,intc,intadj[][N],intcolor[])和寻找各种着色方案函数intcoloring(intadj[][N])。1)空缺处在回溯操作子函数back()中,其中形参用指针指向记录当前考查区域号的变量。整个回溯过程是一个循环过程,当循环条件成立时,进行回溯。如果当前区域*ip已是0号区域,则不再回溯,函数返回0值,表示已穷尽了所有可能方案。否则,当前区域*ip减1,取出*ip区域的着色方案color[*ip]存放在c中,并置*ip区域为未着色。如果*ip区域的着色方案不是最后一种颜色,则回溯结束,函数返回该区域原来的着色方案。因此(1)空缺处所填写的内容是“color[*ip]”。2)空缺处在检查区域i对c种颜色的可用性子函数colorok()中,根据程序的意义可以看出,(2)空缺处应填入的是判断该颜色不可取的条件,根据题干说明,相邻区域不能着相同的颜色,即和区域i相邻的区域不能着c种颜色。而当adj[i][j]为1时,表示区域j和区域i相邻。如果区域j着c种颜色,则颜色不可取。所以(2)空缺处所填写的内容是“adj[i][j]!=0&&color[j]==c”。3)空缺处在为区域i选一种可着的颜色子函数select()中,依次选定一种颜色,调用colorok()函数,测试该颜色是否可以着在i区域上。(3)空缺处应为该函数colorok()填上实参“I,k,adj,color”,即(3)空缺处所填写的内容是“I,k,adj,color”。4)(5)空缺处在寻找各种着色方案子函数coloring()中,该程序中定义了用于存放一种着色方案的数组color[],并对数组进行了初始化。该函数执行部分的程序结构是由一个while循环完成,循环的主体是一个if...else语句。该if...else体的else部分又包含一个if...else语句。在嵌套的内层if...else语句中,当if(i==N)中条件成立时,表示为每一区域都找到了合适的颜色,则该方案是成功的,之后输出一种着色方案,再进行回溯。如果有一个区域找不到合适的颜色,则该方案就是失败的,这时也需要进行回溯操作。由以上分析可知,寻找全部着色方案在while循环中进行,每次循环首先是为i号区域寻找一种方案。因为select()函数的功能就是为i区域选一种可能的颜色,同时可选的初始颜色是c+1号颜色,邻接矩阵是adj[][],选定的颜色存于数组color[]中,所以(4)空缺处所填写的内容是“select(I,c+1,adj,color)”。根据if(c=select(I,c+1,adj,color))==0)能够证实对函数back()的第一次调用肯定是在一种方案失败的情况下,而紧接着的else后面的语句则显然表示为区域i找到了一种可用的颜色c,所以应将颜色c存储在数组color[]中,即(5)空缺处所填写的内容是“color[i]=c”。5、阅读以下函数说明和C代码,将C程序中(1)~(5)空缺处的内容补充完整。【说明】对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图6-15所示的最优二叉树,以及相应的结构数组Ht(如表6-14所示,其中数组元素Ht[0]不用)。结构数组Ht的类型定义如下:#defineMAXLEAFNUM20structnode{charch;/*扫当前节点表示的字符,对于非叶子节点,此域不用*/Intweight;/*当前节点的权值*/intparent;/*当前节点的父节点的下标,为0时表示无父节点*/intlchild,rchild;/*当前节点的左、右孩子节点的下标,为0时表示无对应的孩子节点*/)Ht[2*MAXLEAFNUM];用“0”或“广标识最优二叉树中分支的规则是:从一个节点进入其左(右)孩子节点,就用“0”(或“1”)标识该分支,如图6-15所示。若用上述规则标识最优二叉树的每条分支后,从根节点开始到叶子节点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子节点的前缀编码。例如,图6-15所示的叶子节点a、b、c、d的前缀编码分别是110、0、111、10。函数voidLeafCode(introot,intn)的功能是:采用非递归方法,遍历最优二叉树的全部叶子节点,为所有的叶子节点构造前缀编码。其中,形参root为最优二叉树的根节点下标;形参n为叶子节点个数。在函数voidLeafCode(introot,intn)构造过程中,将Ht[p].weight域用做被遍历节点的遍历状态标志。函数voidDecode(char*buff,introot)的功能是:将前缀编码序列翻译成叶子节点的字符序列,并输出。其中,形参root为最优二叉树的根节点下标;形参buff指向前缀编码序列。【函数4.1】char**HC;voidLeafCode(introot,intn){/*为最优二叉树中的n个叶子节点构造前缀编码,root是树的根节点下标*/intI,p=root,cdlen=0;charcode[20];Hc=(char**)malloc((n+1)*sizeof(char*));/*申请字符指针数组*/For(i=1;i<=p;++I)Ht[i].weight=0;/*遍历最优二叉树时用做被遍历节点的状态标志*/While(p){/*以非递归方法遍历最优二叉树,求树中每个叶子节点的编码*/If(Ht[p].weight==0){/*向左*/Ht[p].weight=1;If(Ht[p].lchild!=0){p=Ht[p].lchild;code[cdlen++]=’0’;}elseif(Ht[p].rchild==0){/*若是叶子节点,则保存其前缀编码*/Hc[p]=(char*)malloc((cdlen+1)*sizeof(char));(1);strcpy(Hc[p],code);}}elseif(Ht[p].weight==1){/*向右*/Ht[p].weight=2;If(Ht[p].rchild!=0){p=Ht[p].rchild;code[cdlen++]=’1’;}}else{/*Ht[p].weight==2,回退/Ht[p].weight=0;p=(2);(3);/*退回父节点*/}}/*while.结束*/}【函数4.2】voidDecode(char*buff,introot){intpre=root,p;while(*buff!=’\0’){p=root;while(p!=0){/*存在下标为p的节点*/pre=p;if((4))p=Ht[p].lchild;/*进入左子树*/elsep=Ht[p].rchild;/*进入右子树*/elsebuff++;/*指向前缀编码序列的下一个字符*/}(5);printf("%c",Hr[pre].ch);}}标准答案:(1)code[cdlen]=’\0’或code[cdlen]=0(2)Ht[p].parent(3)—cdlen或其等价形式(4)*buff=’0’或其等价形式(5)buff—或其等价形式知识点解析:这是一道要求读者在用哈夫曼算法构造的最优二叉树上进行编码和译码的程序设计题。本题的解答思路如下。哈夫曼算法构造最优二叉树的过程如下。1)根据给定的n个权值{W1,W2,W3,...Wn)构成n棵二叉树的集合F=(T1,T2,T3,...Tn),其中每棵二叉树引中只有一个带权为Wi的根节点,其左、右子树均为空。2)在F中选取两棵根节点权值最小的树作为左、右子树构造一棵新的二叉树,且设置新的二叉树的根节点的权值为其左、右子树根节点的权值之和。3)在F中删除这两棵二叉树,同时将新得到的二叉树加入F中。4)重复步骤2)和3),直到F只含一棵树为止。这棵树便是最优二叉树。综上所述,最优二叉树是从叶子到根构造起来的,每次都是先确定一棵二叉树的左、右子树,然后再构造出树根节点,因此最优二叉树中只有叶子节点和分支数为2的内部节点。若已知叶子的数目为n,则内部节点数比叶子少1,因此整棵树所需的存储空间规模是确定的,可以采用数组空间来存储最优二叉树。例如,给定字符集合{a,b,c,d)及其权值2、7、4、5,构造最优二叉树的过程如图6-19所示。由于算法中对构成左、右子树的二叉树不进行限定,因此用哈夫曼算法构造出的最优二叉树的形态不是唯一的。另外,题干中已给出了存放最优二叉树的结构数组Ht的类型定义,以及存储图6-19所构造出的最优二叉树的结构数组Ht(见表6-14)。由于二叉树中的节点最多只有两个分支,若用“0”和“1”分别标识最优二叉树中的左子树分支和右子树分支,那么从根节点开始到叶子节点为止,按经过分支的次序将相应标识依次排列,可得到由“0”和“1”组成的一个序列,称此序列为该叶子节点的前缀编码。例如,如图6-15所示的最优二叉树叶子节点a、b、c、d的前缀编码分别是110、0、111、10。当最优二叉树的构造完成后,每个节点的weight域就可挪做他用,在构造哈夫曼编码的过程中,weight域用做被遍历节点的遍历状态标志。从树根出发,以非递归方式遍历最优二叉树的方法是:先沿着树根的左分支向叶子方向搜索,并用code[]记下所经过的分支的标识,同时用cdlen记录节点的路径长度,一直到叶子节点为止,即可得到当前正在访问的叶子的编码。然后,从该叶子节点回退到其父节点F。若刚才是从F的左子树回到F,则下一次应进入F的右子树进行遍历;若是从F的右子树回到F节点,则下一步应继续向F的父节点回退。由以上分析可知,对于节点F,遍历过程中最多可能以3种不同的情况经过该节点,因此要为F节点的weight域赋予不同的值进行标识。初始时weight=0,当沿遍历路径到达该节点时其weight域值等于0,则进入其左子树分支进行遍历,并将weight置为1:若沿遍历路径到达该节点时其weight域值等于1,则说明刚从其左子树返回,下面应进入其右子树进行遍历并将weight置为2;若沿遍历路径到达该节点时其weight域值等于2,则说明刚从其右子树返回,下面应继续向该节点的父节点回退,并将weight置为0。遍历路线如图6-20中箭头方向所示。函数voidLeafCode(introot,intn)的功能是:采用非递归方法,遍历最优二叉树的全部叶子节点,为所有的叶子节点构造前缀编码。由于在该函数(1)空缺处之后的语句“strcpy(Hc[p1,code);”,是进行字符串的复制运算,则需要对源串中的串结束标志进行设置,因此(1)空缺处所填写的语句是“code[cdlen]=’\0’”或“code[cdlen]=0”。(2)空缺处是从右子树向父节点回退的处理,因此该空缺处所填入的内容是“Ht[p].parent”。由于每向上层回退一次,节点的路径长度就会减1,因此(3)空缺处所填写的语句是“—cdlen”或其等价形式。函数voidDecode(char*buff,introot)的功能是:将前缀编码序列翻译成叶子节点的字符序列,并输出。译码的过程是:从根出发,若编码序列的当前字符是“0”,则进入左子树分支,否则进入右子树分支,直到到达一个叶子节点时为止,此时叶子所表示的字符就是翻译出的字符。若编码序列还没有结束,则重新从树根出发,重复上述过程,直到将编码序列结束。所以(4)空缺处所填写的语句是“*buff==’0’”或其等价形式。由于到达一个叶子节点时,超前读入了一个编码序列中的字符,因此(5)空缺处所填写的语句是“buff—”或其等价形式。三、VB题(本题共2题,每题1.0分,共2分。)6、以下是与VisualBasic开发应用有关的5个问题。对每一个问题,请将解答填入对应栏内。1.在VisualBasic中,工程文件、窗体文件和标准模块文件的扩展名是什么?请从下列选项中选择:prg、prj、exe、vbp、form、frm、win、fra、std、bas、vbs、vbm2.设某窗体上有一个命令按钮,其名称为CmdSave,运行时该按钮上显示有“保存(S(下划线))”字样的信息。为使热键Alt+S与该命令按钮相关联,应该对按钮CmdSave的Caption属性设置什么样的属性值?3.设某窗口内有一个图像框Imagel,以及两个命令按钮“放大”和“缩小”。单击“放大”按钮就会使该图像框的长和宽都放大10%;单击“缩小”按钮就会使该图像框的长和宽都缩小10%(该图像框的左上角不动)。请分别写出这两个命令按钮的单击事件过程中的程序代码。4.为使某个单选按钮初始时默认被选中,在开发时应怎样做?5.若有语句Tmpval=MsgBox(“非法操作!”,vbOKCancel+vbCritical,“提示”),请简要描述程序运行时弹出的消息框的主要特征。标准答案:(1)工程文件的扩展名是vbp,窗体文件的扩展名是frm,标准模块文件的扩展名是bas。(2)按钮的Caption属性设置为“保存(&S)”。(3)“放大”按钮单击事件过程中的程序代码:Imagel.Width=Imagel.Width*1.1Imagel.Height=Imagel.Height*1.1“缩小”按钮单击事件过程中的程序代码:Imagel.Width=Imagel.Width*0.9Imagel.Height=Imagel.Height*0.9(4)将该单选按钮的Value属性值设置成True(5)消息框的标题栏显示“提示”;消息框中有一个出错标记以及两个命令按钮,分别显示“确定”和“取消”;消息框中显示的信息为“非法操作!”。知识点解析:暂无解析7、阅读以下应用说明及VisualBasic部分程序代码,将应填入(n)处的字句写在对应栏内。【说明】本应用程序是一个小写数字转换成大写格式的转换器,其运行窗口如图5所示。窗口中有两个标签(lblNumber和lblChinese)、两个文本框(txtNnmber和txtChinese)和一个命令按钮(cmdChange)。当单击按钮cmdChange时,将文本框txtNumber中数字转换成中文大写,并显示在文本框txtChinese中。例如,在文本框txtNumber输入0076845,单击cmdChange按钮,将在文本框txtChinese中显示“柒万陆仟捌佰肆拾伍”。程序中调用的函数CChinse(StrdigitAsString)的功能是先删除字符串的所有前导0,再调用函数Change(StrdigitAsString),将数字字符串Strdigit转换成中文大写格式。为了防止用户在文本框txtNumber输入非数字形式的字符,程序将以空字符代替所输入的非数字有形字符。【程序】PrivateFunctionTransfer(StrdigitAsString)AsString′完成小写向大写的转换,这段代码省略EndFunctionPrivateFunctionCChinese(StrdigitAsString)AsStringDimintLen,intCounterAsIntegerintLen=Len(Strdigit)IfintLen>0Thenintcounter=0Do’过滤数字串Strdigit的前导0intcounter=intcounter+1LoopUntilMid(Strdigit,(1))intLen=(2)Strdigit=(3)(Strdigit,intLen)CChinese=Transfer(Strdigit)EndIfEndFunctionPrivateSubcmdChange_Click()txtChinese.Text=CChinese((4))’调用Cchinese函数EndSubPrivateSubtxtNumber_KeyPress(KeyAsciiAsInteger)SelectCaseKeyAscii’根据输入字符的ASCII码的值进行判断CaseKeyAscii<32’保留输入的控制字符Case48To57’保留输入的数字字符CaseElse’其他情况以空字符代替(5)=0EndSelectEndSub标准答案:(1)intcounter,1(2)intLen-intCounter+1或Len(Strdigit)-intCounter+1(3)Right或Right$(4)txtNumber.Text(5)KeyAscii知识点解析:(1)~(3)空所在语句块的功能是删除过滤数字串Strdigit的前导0。(1)空所在Do……Loop循环是找到第一个非0的位置,循环变量为intcounter,即要判断第intcounter个字符是不是0,因此(1)空处应填写“intcounter,1”。从(3)空所在语句可以判断(2)空所在语句是求出过滤数字串Strdigit的前导0后的数字长度,因此(2)空处应当填写“intLen-intCounter+1”或“Len(Strdigit)-intCounter+1”。(3)空所在语句是取出过滤数字串Strdigit的前导。后的数字,需要填写这一操作的函数,因此(3)空处应当填写“Right”或“Right$”。(4)空处需要填写调用Cchinese函数的参数,程序要对小写数字进行转换,其内容存放在文本框txtNumber中,因此(4)空处应当填写“txtNumber.Text”。(5)空所在语句是处理当前输入若不是数字或控制字符时,则将具ASCII码值设置为0。因此(5)空处应当填写“KeyAscII”。四、C++题(本题共1题,每题1.0分,共1分。)8、阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。【说明】以下程序的功能是计算正方体、球体和圆柱体的表面积和体积并输出。程序由4个类组成:类cube、sphere和cylinder分别表示正方体、球体和圆柱体;抽象类container为抽象类,提供了两个纯虚拟函数surface_area()和volum(),作为通用接口。【C++程序】#include<iostream.h>#definepi3.1416classcontainer{protected:doubleradius;public:container(doubleradius){container::radius=radius;}virtualdoublesurface_area()=0;virtualdoublevelum()=0;};classcube:(1){//定义正方体类public:cube(doubleradius):container(radius){};doublesurface_area(){return6*radius*radius;}doublevolum(){returnradius*radius*radius;}};classsphere:(2){//定义球体类public:sphere(doubleradius):container(radius){};doublesurface_area(){return(3);}doublevolum(){returnpi*radius*radius*radius*4/3;}};classcylinder:(4){//定义圆柱体类doubleheight;public:cylinder(doubleradius,doubleheight):container(radius){container::height=height;}doublesurface_area(){return2*pi*radius*(height+radius);}doublevolum(){return(5);}};voidmain(){container*p;cubeobj1(5);sphereobj2(5);cylinderobj3(5,5);p=&obj1;cout<<“正方体表面积”(<<p->surface_area()<<end1;cont<<“正方体体积”<<p->volume()<<end1;p=&obj2;cout<<“球体表面积”<<p->surface_area()<<end1;cout<<“球体体积”<<p->volume()<<end1;p=&obj3;cout<<“球体表面积”<<p->surface_area()<<end1;cout<<“球体体积”<<p->volume()<<end1;}标准答案:(1)publiccontainer(2)publiccontainer(3)4*pi*radius*radius(4)publiccontainer(5)pi*radius*radius*height知识点解析:类cube、sphere和cylinder分别表示正方体、球体和圆柱体,它们都需要求各自的表面积和体积,而抽象类container提供纯虚拟函数surface_area()和velum(),所以类cube、sphere和cylinder都以类contain为基类,公有继承,所以(1)、(2)和(4)空应填入“publiccontainer”。(3)空处为类sphere中求表面积函数的返回值,所以根据球体表面积公式应填入“4*pi*radius*radius”。(5)空处为类cylinder中求圆柱体体积函数的返回值,所以根据圆柱体体积公式应填入“pi*radius*radius*height”。五、JAVA题(本题共1题,每题1.0分,共1分。)9、阅读以下说明和Java代码,将解答写入对应栏内。【说明】下面程序的功能是找出所有三位数中,个、十、百位数字的立方和等于该数本身的三位数并显示。在程序的每条横线处填写一个适当的词或语句,使程序的功能完整。public(1)classcube_Root{publicstaticvoid(2)main(Stringargs[]){System.out.println("个、十、百位数字的立方和等于该数本身的三位数有:");for(intn=100;n<1000;n++){inta,b,c;(3)b=n/10%10;(4)if((5))System.out.println(n);}}}标准答案:(1)class(2)main(3)a=n%l0(4)c=n/l00%10(5)a*a*a+b*b*b+c*c*c==n知识点解析:此处应填类声明的关键字class。此处应填Java程序的函数人口名main。取得整数n的个位数字。取得整数n的百位数字。当个、十、百位数字的立方和等于该数本身时输出。软件水平考试(初级)程序员下午(应用技术)模拟试卷第2套一、流程图题(本题共1题,每题1.0分,共1分。)1、下面的流程图,用来完成求字符串t在s中最右边出现的位置。其思路是:做一个循环,以s的每一位作为字符串的开头和t比较,如果两字符串的首字母是相同的,则继续比下去,如果一直到t的最后一个字符也相同,则说明在s中找到了一个字符串t;如果还没比较到t的最后一个字符,就已经出现字符串不等的情况,则放弃此次比较,开始新一轮的比较。当在s中找到一个字符串t时,不应停止寻找(因为要求的是求t在s中最右边出现位置),应先记录这个位置pos,然后开始新一轮的寻找,若还存在相同的字符串,则更新位置的记录,直到循环结束,输出最近一次保存的位置。如果s为空或不包含t,则返回-1。注:返回值用pos表示。[问题]将流程图的(1)~(5)处补充完整。标准答案:(1)pos=-1(2)s[i]!=’\0’(3)s[j]=t[k](4)k>0(5)pos=i;知识点解析:暂无解析二、C语言题(本题共3题,每题1.0分,共3分。)2、[说明1]函数voidconvelt(chal*a,intn)是用递归方法将一个正整数n按逆序存放到一个字符数组a中,例如,n=123,在a中的存放为’3’、’2’、’1’。[C函数1]voidconvert(char*a,intn){inti;if((i=n/10)!=0;convert((1),i);*a=(2);}[说明2]函数intindex(char*s,char*t)检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则返回-1。[C函数2]intindex(char*s,char*t){inti,j=0;k=0;for(i=0;s[i]!:’\0’;i++)(for((3);(t[k]!=’\0’)&&(s[j]!=’\0’)&&((4));j++,k++);if((5))return(i);}return(-1);}标准答案:(1)A+1(2)n%10+’\0’(3)j=i,k=0(4)t[k]==s[j](5)t[k]==’\0’或!t[k]知识点解析:函数1采用递归方法将一个正整数n按逆序存放到一个字符数组a中,递归调用为convert(a+1,i),所以(1)“a+1”。按逆序输出字符保存在数组a中为*a=n%10+’\0’,即(2)填“n%10+’\0’”。函数2检查字符串s中是否含有字符串t是在for循环中实现的。空(3)应填“j=i,k=0”。如果两个字符串中含有相同的字符,则字符串s和字符串t都指向下一个字符,循环继续,直到字符串t结束。所以空(4)应填“t[k]=s[j]”,空(5)应填“t[k]=’\0’”或“!t[k]”。3、函数Node*difference(A,B)用于求两个集合之差C=A-B,即当且仅当e是A中的一个元素,但不是B中的元素时,e是C中的元素。集合用有序链表实现,用一个空链表表示一个空集合,表示非空集合的链表根据元素之间按递增排列。执行C=A-B之后,表示集合A和B的链表不变,若结果集合C非空,则表示其链表根据元素之值按递增排列。函数append()用于在链表中添加节点。[C函数]typedefstructnode{intelement;structnode*link;}Node;Node*A,*B,*C;Node*append(last,e)Node*last;inte;{last->link=(Node*)malloc(sizeof(Node));last->link->element=e;return(last->link);}Node*difference(A,B)Node*A,*B;{Node*c,*last;C=last=(Node*)malloc(sizeof(Node));while((1))if(A->element<B->element){last=append(last,A->element);A=A->link:}elseif((2)){A:A->link;B:B->link;}elSe(3);while((4)){last=append(last,A->element);A=A->link:}(5);last=c;c=c->link;free(last);return(c);}标准答案:(1)B->link(2)A->element==B->element(3)B=B->link(4)A>link!=NULL(5)last->link=NULL知识点解析:本题用链表表示集合,通过比较链表的元素值判断集合的元素之间的关系。第一个while循环的条件是链表B指针不指向空,即空(1)应填“B->link”。由于A,B两集合都是按递增排列的,则如果A中的元素小于B中的元素,A中元素直接放入集合C中,集合A指向其下一个元素;如果A中的元素等于B中的元素,集合A,B分别指向下一个元素,即空(21填“A->element==B->element”;如果A中的元素大于B中的元素,集合B指向其下一个元素,即空(3)填“B=B->link”。第二个循环的条件是链表A指针不指向空时,将A中元素直接加入到C中,即空(4)填“A->link!=NULL”。将链表C最后节点指针指向空,即空(51填“last->link=NULL”。4、为参加网球比赛的选手安排比赛日程。设有n(n=2k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选手每天赛一场,不轮空。试按此要求为比赛安排日程。设n位选手被顺序编号为1,2,…,n。比赛的日程表是一个n行n-1列的表,i行j列的内容是第i号选手第j天的比赛对手。用分治法设计日程表,就是从其中一半选手(2m-1位)的比赛曰程,导出全体(2m位)选手的比赛日程。从只有2位选手的比赛日程出发,反复这个过程,直到为n位选手安排好比赛日程为止。[C函数]#include<stdio.h>#defineMAXN64inta[MAxN+1][MAXN];voidmain(){inttwoml,twom,il,j,m,k;printf("指定n(n=2的k次幂)位选手,清输入k。\n");scanf("%d",&k);a[1][1]=2;/*预设2位选手的比赛日程*/a[2][1]=1;m=1;twoml=1;while(m<k){(1);twoml+=twoml;/*为2m位选手安排比赛日程*/(2);/*填日程表的左下角*/for(il=twoml+l;il<=twom;i1++)for(j=1;j<=twoml-1;j++)a[i1][J]=a[i1-twoml][j]+twoml;(3);for(i1=2;i1<=twom;i1++)a[i1][twoml]=a[i1-1][twom1]+l;for(j=twoml+1;j<twom;j++){for(i1=1;i1<twoml;i1++)a[i1][j]=a[i1+1][j-1];(4);}/*填日程表的右下角*/for(j=twoml;j<twom;j++)for(ii=i;i1<=twoml;i1++)(5);for(i1=1;i1<=twom;i1++){for(j=1;J<twom;j++)printf("%4d",a[i1][J]);printf("\n");}printf("\n");}}标准答案:(1)m++(2)twom+=2*twom1(3)A[1][twoml]=twom1+1(4)A[twom1][j]=a[1][j-1](5)A[a[i1][j][j]=i1知识点解析:分别有2位、4位、8位选手参加比赛时的日程表。若1~4号选手之间的比赛日程填在日程表的左上角(4行3列),5~8号选手之间的比赛日程可填在日程表的左下角(4行3列),而左下角的内容可由左上角对应项加上数4得到。至此剩下的右上角(4行4列)是为编号小的1~4号选手与编号大的5~8号选手之间的比赛安排日程。程序的思路是:由2位选手的比赛日程得到4位选手的比赛日程;依次得到8位选手的比赛日程。三、C++题(本题共1题,每题1.0分,共1分。)5、下而程序实现十进制向其他进制的转换。[C++程序]#include"ioStream.h"#include"math.h"#include<conio.h>typedefstructnode{intdata;node*next;}Node;classTransform{public:voidTrans(intd,inti);//d为数字;i为进制voidprint();private:Node*top;};voidTransform::Trans(intd,inti){intm,n=0;Node*P;while(d>0){(1);d=d/i;p=newNode;if(!n){P->data=m;(2)j(3);n++;}else{p->data=m;(4);(5);}}}voidTransform::print(){Node*P;while(top!=NULL){p=top;if(P->data>9)cout<<data+55:elsecout<<data;top=p->next;deleteP;}}标准答案:(1)m=d%i(2)top=p(3)top->next=NULL(4)p->next=top(5)top=p知识点解析:本题考查C++编程,主要考查了链表的使用。所有的问题只出在函数Trans中,它的功能是完成将十进制数d转换为任意进制i的数,并存在数组中。函数中首先定义了一个指向链表节点的指针,然后开始进行转换,进制转换应该是一个很常见的问题,就是不断地求模运算,所以(1)处应填入“m=d%i”。然后,我们要把求模的结果保存到链表节点中,并使链表首指针指向该节点,节点中指向下一个节点的指针设为空,所以(2)处应填入top=p,(3)处应填入top->next=NULL。由于求模运算是从低位到高位逐位求出的,所以在进行完第二次求模运算后,应该将第二次运算的结果放到链表首位,所以(4)处应填入p->next=top,(5)处应填入top=p。四、JAVA题(本题共1题,每题1.0分,共1分。)6、下面程序实现十进制向其他进制的转换。[Java程序]C1assNode{intdata;Nodenext;}classTransform{privateNodetop;publiCvoidprint(){NodeP;while(top!=null){P=top;if(P.data>9)System.out.print((char)(p.data+55));elseSystem.out.print(p.data);top=P.next;}}publicvoidTrans(intd,inti)(//d为数字;i为进制intm;(1)n=false;NodeP;while(d>0){(2);d=d/i;P=flewNode();if((3)){P.data=m;(4);top=P;n=true;}else{p.data=m;(5);toP=P;}}}}标准答案:(1)boolean(2)m=d%i(3)ln(4)top->next=null(5)p->next=top知识点解析:本题考查Java编程,主要考查了链表的使用。所有的问题只出在函数Trans中,它的功能是完成将十进制数d转换为任意进制i的数,并存在数组中。变量n被赋值为false,说明n是布尔型变量,Java中布尔型变量关键字为boolean。故(1)应填“boolean”。函数中首先定义了一个指向链表节点的指针(实为链栈),然后开始进行转换,进制转换应该是一个很常见的问题,就是不断地求模运算,所以(2)处应填入“m=d%i”。然后,我们要把求模的结果保存到链栈中。对于链栈,第一个节点比较特殊,需要特殊处理,从if块中的语句“n=tme”可知,此处正是处理第一个节点的特殊情况,故(3)应填“!n”,(4)处应填入“top->next=null”。这里采用的链栈,所以(5)处应填入“p->next=top”。软件水平考试(初级)程序员下午(应用技术)模拟试卷第3套一、流程图题(本题共1题,每题1.0分,共1分。)1、阅读以下说明和流程图,回答问题。[说明]从键盘输入一个高精度正整数n,去掉其中s个数字后按原左右次序再组成一个新的正整数。对给定的n,要寻找一种方案,使得余下的数字组成的新数最小。算法分析:每次删除一个数字,选择一个使余下的数最小的数字作为删除对象。当s=1时,在n中删除哪一个数字能达到最小的目的?从左到右每相邻的两个数字比较:若出现减,郎左边大于右边,则删除左边的大数字;若不出现减,即所有数字全部升序,则删除最右边的大数字。当s>l(当然小于n的位数),按上述操作一个一个删除,删除一个达到最小后,再从头即从串首开始,删除第2个,依此分解为s次完成。若删除不到s个后已无左边大于右边的减序,则停止删除操作,打印余下串的左边L-s个数字即可。(x为统计删除数字的个数,m=1表示脱离循环,L为n的长度)。[流程图][问题]将流程图中的(1)~(5)处补充完整。标准答案:(1)s>x&&m=0(2)1-x-L(3)a(i)=a(k+1)(4)m=1(5)for(i=li<1-s;i++)知识点解析:暂无解析二、C语言题(本题共3题,每题1.0分,共3分。)2、阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。[说明]函数Printprime(intUpBound)的功能是输出1到UpBound以内的全体素数。[函数2.1]voidPrintPrime(intUpBound)printf("2,");for(i=3;i<UpBound;i+=2){intk=sqrt(i);for(j=3;j<=k;(1))/*检查i是否有3到k以入的奇因数*/if((2))break;fi((3))printf("%d",i);[函数2.2说明]递归函数invert(inta[],intk),intk)的功能是将数组a中的前k个元素逆置。[函数2.2]voidinvert(inta[],intk){intt;if((4)){invert((5));t=a[0];a[0]=a[k-1];a[k-l]=t;}}标准答案:(1)j+=2(2)i%j==0(3)j>k(4)k>1(5)a+1,k-2知识点解析:(1)~(3)由于(1)处循环只检查i是否能被3到k以内的奇数所整除,因此循环增量应该是2。并且一旦i被某个3到k以内的奇数整除,那么内层for应当立即终止,此时j<=k。相反的,若内层for循环结束后j>k,则表明i没有3到k以内的奇因数,即i是一素数,应该输出;(4)由于函数递归的终止条件是k不大于1,于是仅在k>1时需要继续进行递归;(5)为了将数组a的前k个元素a[0]、……、a[k-1]置逆,只需先将a[1]、……、a[k-2]这k-2个元素置逆,即调用invert(a+1,k-2),再交换a[0]和a[k-1]的值即可。3、阅读下列程序说明和C程序,已知其输出为“12345678910”。将应填入(n)处的字句写在对应栏内。[说明]本程序包含的函数及其功能说明如下:(1)函数first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元;(2)函数reverse_copy()的功能是按已知链表复制出一个新链表,但新链表的表元链接顺序与已知链表的表元链接顺序相反;(3)函数Print_link()用来输出链表中各表元的值;(4)函数free_link()用来释放链表全部表元空间。[程序]#include<stdio.h>#include<malloe.h>typodefstructnode{intval;structnode*next;}NODE;voidfirst_insert(NODE**p,intv){NODE*q=(NODE*)malloe(sizeof(NODE));q->val=v;q->next=*p;/*为新表元赋值*/*p=(1);}NODE*reverse_copy(NODE*p){NODE*u;for(u=NULL;p!=NULL;p=p->next)first_insert((2));returnu;}voidprintlink(NODE*p){for(;(3))prinff("%d\t",p->val);printf("\n");}voidfree_link(NODE*p){NODE*u;while(p!=NULL){u=p->next;free(p);(4);}voidmain(){NODE*link1,*link2;inti;link1=NULL;for(i=1;i<=10;i++)first_insert(&linkl,i);link2=reverse_copy(link1);(5);free_link(linkl);free_link(link2);}标准答案:(1)q(2)&u,p->val(3)p!=NULL;P=p->next(4)P=u(5)print_link(link2)知识点解析:(1)定义新表元并且给予赋值后需要更新链首指针,使其指向新表元;(2)为了由空链表生成原来链表的逆序链,可以自链首表元P起遍历其每一个表元,调用first_insert函数将这个表元的值插入到新链表u中;(3)此处的循环是自链首表元p起循环遣历链表,循环结束条件是p!=NULL,每循环一次,将p指向下一个表元,即P=P->next;(4)释放链表全部表元空间是自链首表元起,循环释放每一个表元空间;(5)此处定义了程序的输出。由于main函数中链表link1、link2分别为:“10987654321”及“12345678910”,因而此处应该是调用print_link函数输出link2。4、阅读下列程序说明和C代码,回答问题1~2。[说明]本程序用古典的Eratosthenes的筛法求从2起到指定范围内的素数。如果要找出2至10中的素数,开始时筛中有2到10的数,然后取走筛中的最小的数2,宜布它是素数,并把该素数的倍数都取走。这样,第一步以后,筛子中还留下奇数3、5、7、9:重复上述步骤,再取走最小数3,宣布它为素数,井取走3的倍数,于是留下5、7。反复重复上述步骤,直至筛中为空时,工作结束,求得2至10中的全部素数。程序中用数组sieve表示筛子,数组元素sieve[i]的值为1时,表示数i在筛子中,值为-1时表示数i已被取走。[
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 63522-49:2025 EN-FR Electrical relays - Tests and measurements - Part 49: Long term stability of sealing
- 2025年营养与食品卫生考试题及答案
- 2025年资源环境管理与评估考试试卷及答案
- 2025年网络舆情监测与应对策略考试题及答案
- 2025年统计与数据分析师资格考试试题及答案
- 2025年科学决策与领导能力综合评估试题及答案
- 2025年PCB制板项目建议书
- 骨科专科护理规范与实务
- 骨科循证护理体系构建与实践路径
- 2025年连续波测距仪合作协议书
- 纸塑工艺知识介绍
- 医务人员行风 遵守18项核心制度
- 顶管定向钻施工方案
- 肺脏移植患者生活质量研究
- 水沟抹灰施工方案
- 人教版八年级物理下册 实验题03 浮力的实验(含答案详解)
- 计算机教室(微机室)学生上机使用记录
- 第二章残疾康复
- 【骆驼祥子思想艺术特色中的悲剧色彩(论文)】
- 火电机组运行优化指导意见
- 英语简单句专项练习题含参考答案
评论
0/150
提交评论