1南京邮电大学通达学院程序设计(上机)报告题目:R009MR024M专业软件工程学生姓名xxx班级学号xxx指导教师韦剑日期2016年6月6日2评分细则评分项优秀良好中等及格不及格平时成绩软件验收设计报告评分等级教师签名:年月日备注注:评分等级分为五种:优秀、良好、中等、及格、不及格3题目一:1、问题描述:题目编号内容要求难度R009M200个学生不按身高任意排成10行﹑20列的长方形队列。在每一列中选出一个最矮者(如这样人有几个,可任选其中一个)。然后在所选的20个矮人中挑出最高者一人,叫做“矮人中的高个子”。然后,令这20个矮人各回原位。再在每一行中选出一个最高者,又从这10个高人中挑出最矮者一人,叫“高个子中的矮子”。请问“矮人中的高个子”和“高个子中的矮子”这二人中哪个高?Middle2、课题分析:根据题目要求,可知这题需要运用数组和比较大小。先建立一个10行20列的数组,然后通过置换比较求得每一列的最小值和每一行的最大值,分别存入min[j]和max[i]中。再比较min[j]中的数,求得其中最大数minmax;比较max[i]中数,求得其中的最小数maxmin.最后比较minmax和maxmin,并输出结果。3、算法描述:算法流程图如下图1-1所示:开始输入并显示数据比较min[j]的值,找出矮人中的高个子minmax比较minmax和maxmin并输出结束求每列最小值min[j]比较max[i]的值,找出高个子中的矮子maxmin求每行最大值max[i]图1.1:算法流程图4、源代码:#includestdio.hvoidmain(){inti,j,maxmin,minmax;inta[10][20];intmin[20],max[10];printf(输入10行﹑20列学生身高:\n);for(i=0;i10;i++)for(j=0;j20;j++){scanf(%d,&a[i][j]);//输入数组的值}4for(j=0;j20;j++){min[j]=a[0][j];//先把第一个值设为最小值,然后与后面的数逐一比较for(i=0;i10;i++){if(a[i][j]min[j])min[j]=a[i][j];//从第一行开始比较,若有a[i][j]小于min[j]的值,则置换min[j].就是求每列的最小值min[j]}//把20列的最小值都找出来,存放在min[20]里面}minmax=min[0];//把min[0]的值赋给maxmin,让maxmin和min数组里的其它数比较,若有比maxmin大的则置换maxmin.就是求maxmin的值for(j=0;j20;j++){if(minmaxmin[j])minmax=min[j];}printf(矮人中的高个子的身高为:%d\n,minmax);//输出min数组里最大的数minmaxfor(i=0;i10;i++){max[i]=a[i][0];for(j=0;j20;j++){if(a[i][j]max[i])max[i]=a[i][j];//找到每行中的最大值,存放到max[i]数组里面}}maxmin=max[0];for(i=0;i10;i++){if(maxminmax[i])maxmin=max[i];}printf(高个子中的矮子的身高为:%d\n,maxmin);//找到max[i]数组中的最小值,放到maxmin中,输出maxmin的值if(maxminminmax)printf(高个子中的矮子比矮人中的高个子高!%d\n,maxmin);if(maxminminmax)printf(矮人中的高个子比高个子中的矮子高!%d\n,minmax);//比较maxmin和minmax的大小,输出大的值if(maxmin==minmax)printf(矮人中的高个子与高个子中的矮子一样高!%d\n,minmax);}5、实验结果分析讨论:5根据输入的数值,可知数组min[j]中存放的数按顺序为:157、154、158、159、157、157、159、159、158、158、158、159、158、154、157、159、157、158、158、154,minmax为159,即矮人中的高个子身高为159cm.max[i]中存放的数按顺序为:185、190、190、196、186、197、187、191、187、196,maxmin为185,即高个子中的矮子的身高为185cm.最后比较minmax和maxmin,maxmin大于minmax,所以高个子中的矮子比矮人中的高个子高。程序输出的结果与实际相符。题目二:1、问题描述:题目编号内容要求难度R024M设有n个人围坐在圆桌周围,从某个位置开始用自然数进行编号为1,2,…,n。然后从编号为k的人从1开始报数,数到m的人便出列;下一个人(第m十1个)又从1开始报数,数到m的人便是第二个出列的人。如此继续下去,直到最后一个人出列为止。要求输出这个出列的顺序。这个问题称为雅瑟夫(Josephu)问题。具体要求如下:(1)n、m、k由键盘输入,输入前要有提示。(2)在输入n后,动态建立方法说明中所需要建立的数组空间;程序运行结束时释放该存储空间。(3)分别用n=8,m=4,k=1以及n=10,m=12,k=4调试运行你的程序。Middle2、课题分析:根据题目要求,可知这题需要运用数组和删除数组元素的知识,关键在于把握删除的数组下标,可以通过循环结构顺序删除。61)建立一个长度为n的整型数组a[],顺序存储1到n,表示n个人。2)从第k个人开始报数。3)用i=k-1表示数组元素下标,从i指向的数组元素开始数,数到m,相当于i值增加m-1.如果在数的过程中遇到数组最后一个元素,则要从数组第一个元素继续数,即将数组看成一个环,需要用到求余运算。综合起来可求得,被删除元素的下表计算公式为:i=(i+m-1)%n。4)重复执行步骤3,直到n等于1。3、算法描述:算法流程图如下图2-1所示:开始输入n,m,k建立数组,顺序存储1至n从k开始报数n0数到m的人出列,即数组元素输出后删除n--结束否是图2.1:算法流程图74、源代码:#includeiostream.h#includestdlib.hintmain(){inti,j,m,n,k,*a;cout输入人数n和数到该数便出列mendl;cinnm;cout输入从该编号开始报数kendl;do{cink;}while(kn-1);//保证k符合要求a=newint[n];if(a==NULL){cout输入错误;exit(1);}for(i=0;in;i++)a[i]=i+1;i=k-1;cout出列顺序为:endl;while(n0){i=(i+m-1)%n;couta[i];for(j=i+1;jn;j++)a[j-1]=a[j];n--;if(i==n)i=0;}coutendl;delete[]a;return0;}5、实验结果分析讨论:n=8,m=4,k=18n=10,m=12,k=4