程序设计中的技巧

上传人:桔**** 文档编号:458322453 上传时间:2023-11-10 格式:DOCX 页数:13 大小:34.52KB
返回 下载 相关 举报
程序设计中的技巧_第1页
第1页 / 共13页
程序设计中的技巧_第2页
第2页 / 共13页
程序设计中的技巧_第3页
第3页 / 共13页
程序设计中的技巧_第4页
第4页 / 共13页
程序设计中的技巧_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《程序设计中的技巧》由会员分享,可在线阅读,更多相关《程序设计中的技巧(13页珍藏版)》请在金锄头文库上搜索。

1、程序设计中的技巧一、算术运算的妙用1、减化或避免条件判断【例1】一次考试,共考了五门课。统计五十个学生中至少有三门课成绩高于90分的 人数。分析:1) 对每个同学,先计算其成绩高于90分的课程数目,若超过3,则累加满足条件的 人数中。2) 用二重循环实现以上过程,外层循环模拟50个同学,内层循环模拟五门课程。 程序如下:main()int a5,ijj,s,num=0;for ( i=1;i=50;i+) s=0;for( j=0;j=90)s=s+1; if(s=3) num=num+1; printf(“The number of =90 is“d”,num); 【例2】开灯问题:有从1到

2、n依次编号的n个同学和n盏灯。1号同学将所有的灯 都关掉;2号同学将编号为2的倍数的灯都打开;3号同学则将编号为3的倍数的灯 作相反处理(该号灯如打开的,则关掉;如关闭的,则打开);以后的同学都将自己 编号的倍数的灯,作相反处理。问经n个同学操作后,哪些灯是打开的? 分析:1) 定义有n个元素的a数组,它的每个下标变量2团视为一灯,i表示其编号。ai=1 表示灯处于打开状态,ai=0表示灯处于关闭状态。2) 当ai为1时,ai被重新赋为0;当ai为0时,ai被重新赋为1。但通过以下算 术运算:ai=1-ai就很好地模拟“开关”灯的操作。我们把这种形式的赋值语句形象地称为“乒乓开关乙 程序如下:

3、 main( ) int n,a1000,i,k;printf(input a number); scanf(%d,&n);for( i=1;i=n;i+)ai=0;for( i=2;i=n;i+) k=1while ( i*k=n)ai*k=1-ai*k;k=k+1;for( i=1;i=n;i+)printf(%dw, ai);注:程序中第二个for循环i枚举的不是灯的编号,而是编号为i的同学,其内层循环 中,就将包含i因素的灯的编号为“i*k,的灯,改变其状态。程序中还用计算省去了用 if语句判断编号能被哪些数整除的过程。【例3】右图中所示的圆圈中,我们把相隔一个数据的两个数(如1和10

4、,3和5, 3 和6)称作是“一对数”,试编写程序求出乘积最大的一对数和乘积最小的一对数。输 出格式如下:max: ?*?=?min: ?*?=?其中?表示:找到的满足条件的数和乘积。117168 101216519 93158126实现要点1) 数据有前后位置”关系,必须用数组来存储。数组定义为anum,则有a0anum-1共 num 个元素。2) 用i代表下标,题目就是顺序将ai-1 与ai+1相乘,求出乘积的最大值和最小值即 可。3) 关键是i=num-1时,保证i+1的值”是0;当i=0时,保证i-1的“值”是num-1,把数组当成圆圈操作通过求余运算很容易实现:当i=num-1时,(

5、i+1)%num等于0; 当 i=0 时(num+i1)%num 等于 num-1。4) 用变量Max记录当前最大的乘积,m、n为对应的两个乘数;变量min记录当前 最小的乘积,s、t为对应的两个乘数。程序如下:main( )intmax=1,min=32767, a100,num,i,k,m,n,s,t;printf(input a number); scanf(“d,&num);for( i=0;inum;i+)scanf(%d,&ai);for( i=0;imax) max=k; m=ap; n=aq; if (kmin) min=k; s=ap; t=aq; printf(max=%d

6、*%d=%d,m,n,max);printf(wmin=%d*%d=%dw,s,t,min);2、构造下标【例】请编写程序统计100人的身高分布,分布等级:180以上、175180、170175、 165170、160165、155-160、155 以下。分析:此类问题表面看不太适合用switch语句来完成。因为即使身高是整数若不借助数学 运算至少也有20多种情况,需要20多个case子句。但若注意到每个等级基本是5 分一段,通过除法运算将成绩(变量$甘)除以5后,分支最多也就只有6个了。 程序如下:main()int sg,k,s7,t;printf(Input %d height:”,10

7、0);for(k=1;k=100;k+)scanf(“d,&sg);if ( sg300)通过计算t=sg/5-30使七类统计区间与数组下标对应,提高了程序效率。 printf(Input error!,Input again”); k-; continue;t=sg/5-30;if(t=6) s6=s6+1;t=6;else st=st+1;for(t=0;k=6;t+)switch(t )case0 :printf(180:%d”,s6”); break;二、标志量的妙用【例】冒泡排序算法的改冒泡排序算法的基本思想就是:相邻数据比较若逆序则交换,逐渐将小数据冒到 数组的前面,大的数据则沉到

8、数组的后面,从而完成排序工作。分析:假设原有的数据本来就是从小到大有序的,则原有算法仍要做n-1趟比较操作, 事实上一趟比较下来,若发现没有进行过交换,就已经说明数据已全部有序,无 需进行其后的比较操作了。数据原本有序的概率并不高,但经过少于n-1趟操作后,数据已经有序的概率却非常高。为提高效率,可以对冒泡排序算法进行改进,当发现某趟没有交换后就停 止下一趟的比较操作。用标志量来记录每趟交换数据的情况,如flag=0表示没有进行过交换,一但有 数据进行交换则置flag为1,表示已进行过交换。当一趟比较交换完成后,lag 仍为0时,则无需进行下一趟操作,否则若flag为1时,只能继续进行下一趟操

9、 作。改进后的程序如下:main() int i,j,t,n,a100,flag;printf(input data number(100):);scanf(“d,&n);printf(input %d data:”,n);for(i=0;in;i+)scanf(“d,&ai);flag=1;for(i=1;i=i;j-)if(ajaj-1) t=aj; aj=aj-1; aj-1=t; flag=1;for(i=0;in;i+) printf(%d ,ai);程序说明:1)排序前“for(i=1;iv=n-1 & flag=1;i+)之前”的 flag=1;是为了保证循环的 开始。2) 内层

10、循环外的Hag=0;是假设这趟比较中没有交换,一但发生交换操作在 内层循环中就置flag=1;,以保证继续下一趟操作。2、表示复杂情况【例1】编写程序判定从键盘输入n个数据互不相等。程序如下:main( )int a100 ,i,j,t,n;scanf(“d,&n);fOr (i=1;i=n;i+)scanf(“d”,&ai);t=1;for (i=1;i=b+c II b=a+c II c=a+b)printf(dont form a triangle”);elseflag=0; if (a*a=b*b+c*c| b*b=a*a+c*c |c*c=a*a+b*b)(printf(form a

11、 right-angle triangle”); flag=1;if(a=b & b=c)(printf(form a equilateral triangle”); flag=1; else if(a=b | b=c | c=a)( printf(form a equal haunch triangle”); flag=1; if(flag=0) printf(form a triangle”); 【例3】编写程序,求任意三个数的最小公倍数。 程序如下:#include max(int x, int y, int z ) if(xy&xz) return(x);else if (yx & yz)return(y); else return(z);main( ) int x1,x2,x3,t=1,i,flag,x0;printf(Input 3 number:”);scanf(%d%d%d,&x1,&x2,&x3);for (i=2;i=x0;i+)flag=1;while(flag)x1=x1/i;x2=x2/i;x3=x3/i;flag=1;flag=1;flag=1; flag=0;i

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号