计算机程序设计员程序设计实例_第1页
计算机程序设计员程序设计实例_第2页
计算机程序设计员程序设计实例_第3页
计算机程序设计员程序设计实例_第4页
计算机程序设计员程序设计实例_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序设计实例    本章介绍了循环程序设计方法,讲述了两种循环程序,三种循环语句。包括前两章讲述的顺序程序结构、分支程序结构在内,这些控制结构内的语句部分都允许任意形式的语句。这些控制结构之间可以互相嵌套,而且这种嵌套没有层次限制。比如,if语句内可以包含循环语句,循环语句内又可以继续包含if 语句,等等。 又比如,一个循环语句内可以含有循环语句,内层循环语句内还可以再包含循环语句,形成所谓的多重循环,等等。    【例4.12】编程序,输出如下序列的前 50 项。该序列的第一项为 0 ; 第二项为 1 ; 以后的

2、奇数项为其前两项之和;偶数项为其前两项之差。    解1:该问题应该一项一项的生成,生成一项输出一项。在生成一项时要考虑该项是偶数项还是奇数项;生成并输出一项后,为生成下一项做准备,应该把后边的项向前串。得如下图4.30的PAD图。程序如下。        #include "stdio.h"    void main( )       int u,v,w,

3、k ;      u=0 ;      v=1 ;      printf ( "%5dn%5dn",u,v);      k=3 ;      do         if ( k%2 = 0 )&#

4、160;         w=v-u;        else          w=v+u;        printf ( "%12dn",w);      

5、0; u=v ;        v=w ;        k=k+1 ;      while ( k<=50 ) ;         解2:该问题生成一项时,可以不用分支判断,而采用标志单元的方法,这种方法在程序设计中是经常使用的。用这种方法PAD图如图4.31。程序如下。 

6、60;       #include "stdio.h"    void main( )       int u,v,w,k ;      int flag;      u=0 ;      v=1 ;  &#

7、160;   printf ( "%5dn%5dn",u,v);      k=3 ;      flag = -1 ;      do         w = v + flag*u;        flag

8、= -flag ;        printf ( "%5dn",w);      u=v ;      v=w ;      k=k+1 ;      while ( k<=50 ) ;      &#

9、160;  【例4.13】编程序,输入两个正整数u 、v ,采用欧几里德辗转相除算法求它们的最大公因数并输出。    解:欧几里德辗转相除算法求u 、v最大公因数的计算过程是:        u % v R1        v % R1 R2        R1 % R2 R3  

10、;      R2 % R3 R4                          Rn-1 % Rn Rn+1=0到此余数Rn+1为"0",计算过程结束。Rn 为正整数u 、v的最大公因数。此计算过程用PAD描述成图4.32。编出程序如下。   

11、     #include "stdio.h"    void main( )       int u,v,r ;      printf("pleace input u 、v:");      scanf("%d%d",&u,%v);  &

12、#160;   r=v ;      while ( r!=0 )         r = u%v ;        u = v ;        v = r ;         

13、   printf ( "gcd(u,v) = %5dn"u );         【例4.14】编程序,输入正整数N,计算r1!+r2!+.+rn! 并输出。其中,N=r1r2.rn 。    解:该程序是一个计算若干数据项之和的程序。本章已经编写过多个求和的程序,现在总结一下求和程序模式。所有计算和的程序都使用一个和单元,有类似图4.33的模式。这里用后判断条件的循环,当然也可以采用先判断条件的循环。其中: &#

14、160;  S是和单元;    开始进入循环之前和单元S必须清"0";    在循环体内,每循环一次给和单元加上一项;    最后循环结束,和单元中的值即为所求之和。具体落实到本题,求和算法如图4.34的PAD所示。        下边求精图4.32中的计算r!。阶乘是一个连乘积。      

15、60; r! = 1 * 2 * 3 * * r    所有计算连乘积的程序都使用一个积单元,有类似图4.35的程序模式。这里用后判断条件的循环,当然也可以采用先判断条件的循环。其中:    P是积单元;    开始进入循环之前积单元P必须置"1";    在循环体内,每循环一次向积单元乘入一项;    最后循环结束,积单元中的值即为所求之积。具体落实到本问题计算r!

16、,得如图4.36的PAD。    综合图4.34和图4.36得图4.37的最终算法PAD。程序如下:        #include "stdio.h"    void main( )       int N,S,P,u,r ;      printf("pleace input N:&q

17、uot;);      scanf("%d",&N);      S=0 ;      while ( N!=0 )         r = N%10 ;        N = N/10 ;   

18、60;    P=1;        u=1;          while ( u<=r )           P=P*u ;          u=u+1 ; 

19、;               S=S+P;            printf ( "r1!+r2!+.+rn! = %5dn"S );         【例4.15】我国古代有一道著名难题 "百钱百鸡"问题

20、: "鸡翁一, 值钱五; 鸡母一,值钱三;鸡雏三, 值钱一。百钱买百鸡, 问鸡翁、母、雏各几何。" 编程序, 解该题。    解:这是一个著名的问题,也是一类典型的问题。设买x只公鸡,买y只母鸡,买z只鸡雏,根据条件可以列出方程如下:    5x + 3y + z/3 = 100 /* 百钱 */    x + y + z = 100 /* 百鸡 */只能列出这两个方程,原题目变成求该方程组的整数解问题。三个未知数,两个方程,这是一个不定方程组。解该类问题

21、的思路是枚举x 、y 、z的所有可能,选出满足条件的哪些x 、y 、z组合。按这种思想,得到PAD如图4.38。程序如下:        #include "stdio.h"    int x , y , z ;    void main( )     for ( x = 1 ; x <= 20 ; x+ )    for ( y

22、= 1 ; y <= 33 ; y+ )    for ( z = 3 ; z <= 99 ; z=z+3 )    if ( x+y+z = 100 && 5*x+3*y+z/3 = 100 )    printf("result = %5d %5d %5dn" , x , y ,z ) ;    这是一个三重循环程序。可以省掉最内层第三重循环,用x,y直接计算z。程序如下:  

23、;   #include "stdio.h"    int x , y , z ;    void main( )       for ( x = 1 ; x <= 20 ; x+ )      for ( y = 1 ; y<= 33 ; y+ )       &#

24、160;z = 100-x-y ; / 求鸡雏数z,百鸡        if ( 5*x+3*y+z/3 = 100 && z%3=0 ) / 百钱        printf("result = %5d %5d %5dn" , x , y ,z ) ;             &#

25、160; 【例4.16】编程序,用循环语句控制打印图4.39的字符图形。        解:在本题目以下的分析中,以白方块""表示空格字符。    分析该图形一共11行,上下相对于第6行对称。应该先打印上半部分第一到第六行,它们的规律是一样的;再打印下半部分第七到第十一行,它们的规律也是一样的。得图4.40的PAD。    打印前六行,应该一行行的打印,用一个循环控制,得图4.41的PAD。 &#

26、160;  打印第x行,每行都分三段,应该一段段的打印,得图4.42的PAD。        打印第x行前段。首先打印字母从x到'I',然后再打印字母从'A'到x-1。每个字母的形式是:一个空格,加字母本身。得图4.43的PAD。    打印第x行中段。分析这段特性,应该首先打印(5-(x-'A'))*2个空格;再打印2*(x-'A')+1 组"x";再打印(5-(x-&#

27、39;A'))*2个空格。得图4.44的PAD。在图4.44的PAD中,每个框都是一个循环,不再求精。    打印第x行后段。首先打印字母从x+1到'I',然后再打印字母从'A'到x,最后换行。每个字母的形式是:一个空格, 加字母本身。得图4.45的PAD。            至此,找到了打印前六行的算法。下边求精打印后五行。    打印后五行,也应该一

28、行行的打印,用一个循环控制,得图4.46的PAD。    打印后五行的第x行与打印前六行的第x行的算法是一样的,可以完全使用上述算法。        至此,找到了打印图4.39字符图形的全部算法,综合上述图4.40到4.46得图4.47。编出程序如下。        #include "stdio.h"    char x , y ;&#

29、160;   int i ;    void main( )     for ( x='A'x<='F'x+) / 前六行    for ( y=x; y<='I'y+) printf ( "%c", y); / 打印第x行前段    for ( y='A' y<x; y+) printf ( "

30、%c", y);    for( i=1;i<=(5-(x-'A'))*2); i+) printf ( ""); / 打印第x行中段    for( i=1;i<=2*(x-'A')+1;i+) printf ( "%c", x);    for( i=1;i<=(5-(x-'A'))*2); i+) printf ( "");    for ( y=x+1; y<='I'y+) printf ( "%c", y); / 打印第x行后段    for ( y='A' y<=x;y+) printf ( "%c", y);    printf ( &quo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论