計算機程序設計員程序設計實例_第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

提交評論