循環(huán)結(jié)構(gòu)訓(xùn)練ppt課件.ppt_第1頁
循環(huán)結(jié)構(gòu)訓(xùn)練ppt課件.ppt_第2頁
循環(huán)結(jié)構(gòu)訓(xùn)練ppt課件.ppt_第3頁
循環(huán)結(jié)構(gòu)訓(xùn)練ppt課件.ppt_第4頁
循環(huán)結(jié)構(gòu)訓(xùn)練ppt課件.ppt_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

綜合訓(xùn)練一循環(huán)結(jié)構(gòu)程序,項目一:圖形編程項目二:學(xué)生成績的分組匯總項目三:其他問題項目四:舉一反三,1,項目一圖形輸出,項目要求給定圖形,按照要求格式輸出項目分析:分析圖形的特點,包括行、列上字符的個數(shù),通過多重循環(huán)控制圖形的輸出,2,*,使用雙重循環(huán)實現(xiàn),思路:,一共有4行,每行由星號組成:變量i控制輸出行數(shù),從1變化到4變量j控制輸出每行的星號:j從1變化到4,每次輸出一個星號,例1:編程序,輸出以下圖形,3,參考代碼:,#includestdio.hmain()inti,j;for(i=1;i=4;i+)for(j=1;j=4;j+)printf(*);printf(n);,4,改寫例1:,編程序,輸出以下圖形。,*,思路:,一共有4行,每行由星號組成:變量i控制輸出行數(shù),從1變化到4變量j控制輸出每行的星號:j從1變化到i,每次輸出一個星號,5,參考代碼:,main()inti,j;for(i=1;i=4;i+)for(j=1;j=i;j+)printf(*);printf(n);,6,再次改寫例1:,編程序,輸出以下圖形。,*,思路:,一共有4行,每行由空格和星號組成:空格數(shù)按行增加,星號按行減少變量i控制輸出行數(shù),從1變化到4變量j控制輸出每行的空格和星號:j從1變化到i,每次輸出一個空格j從1變化到8-2*i1,每次輸出一個星號,7,參考算法和程序:,main()inti,j;for(i=1;i=4;i+)for(j=1;j=i;j+)printf();for(j=1;j=8-(2*i-1);j+)printf(*);printf(n);,思考:如何輸出10行圖形?輸出圖形向右平移20個字符位置,應(yīng)如何修改程序?,8,【反復(fù)訓(xùn)練】編程顯示如下所示的圖形,*,分析:題目要求的三角形由5行組成,因此程序中循環(huán)結(jié)構(gòu)的循環(huán)次數(shù)應(yīng)為5次,每一次輸出一行。而“輸出一行”又進(jìn)一步分為三項工作。(1)輸出若干個空格;(2)輸出若干個星號;(3)回車換行,為新的一行的輸出做準(zhǔn)備。現(xiàn)在的問題是,如何確定每一行應(yīng)輸出的空格數(shù)和字符”*”的數(shù)目,以便分別通過循環(huán)來輸出這兩種字符。,#includemain()inti,j;for(i=1;i=5;i+)/一共輸出5行for(j=1;j=6-i;j+)printf();/輸出空格數(shù)for(j=1;j=2*i-1;j+)printf(*);/輸出”*”的數(shù)目printf(“n”);/換行,9,項目二學(xué)生成績的分組匯總,項目要求一個班中有四個小組,求本學(xué)期期中考試中每個小組數(shù)學(xué)成績的總分及平均分。,項目分析在一個小組中對學(xué)生數(shù)學(xué)成績的平均分與總分進(jìn)行計算;然后就是重復(fù)進(jìn)行4次。所以,將這一項目可分成二個任務(wù):任務(wù)一:求一個小組學(xué)生成績的總分及平均分;任務(wù)二:求四個小組學(xué)生成績的總分及平均分。,10,分析:如果本小組一共有十個同學(xué),顯然不可能定義十個變量x1,x2,x10,然后在程序中表示成sum=x1+x2+x3+x10。求一個小組的學(xué)生總成績的步驟就是:先輸入第一個學(xué)生的成績,然后將這個成績加到總分中,接下來,輸入第二個學(xué)生的成績,再將第二個學(xué)生的成績加入到總分中,不斷重復(fù),直到小組中最后一個同學(xué)的成績輸入并加入到總分為止。重復(fù)執(zhí)行就是循環(huán)。重復(fù)工作是計算機特別擅長的工作之一。,任務(wù)1求一個小組學(xué)生成績的總分及平均分,一、問題情景一個班進(jìn)行了一次考試,現(xiàn)要輸入第一小組學(xué)生的成績,計算這一小組的總分與平均分,并按要求輸出。,二、具體實現(xiàn)#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(請輸入本小組10個學(xué)生的成績:);while(i=10)scanf(%d,while(i=10)scanf(“%d”,11,任務(wù)情景中的程序及流程圖,#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(請輸入本小組10個學(xué)生的成績:);while(i=10)scanf(%d,12,While實例練習(xí),【例2】本學(xué)期期末考試進(jìn)行了三門課程的測試。成績單下來后,8個室友兄弟要一比高低,這就要得到每個人三門課程的總分和平均分,用C語言實現(xiàn)之。,分析:(1)定義五個實型變量x,y,z,s和avg,依次放每一名學(xué)生的三門課程成績、這三門課程的總成績和平均分;(2)每次取出一名學(xué)生的三門課程成績,依次給x,y,z,然后再一起放到s中,就可以得到該同學(xué)的三門課的總分和平均分。(3)以上步驟重復(fù)執(zhí)行8次。,#includestdio.hmain()inti;floatx,y,z,sum,avg;i=1;while(i=8)printf(請輸入第%d個同學(xué)三門課的成績,i);scanf(%f%f%f,13,求一個小組學(xué)生成績的總分及平均分的程序可改寫為:,#includestdio.hmain()intscore,i,sum=0;floatavg;i=1;printf(請輸入本小組10個學(xué)生的成績:);doscanf(%d,14,將例2用dowhile語句來改進(jìn)實現(xiàn)。,求8個室友兄弟每個人三門課程的總分和平均分#includestdio.hmain()inti;floatx,y,z,sum,avg;i=1;doprintf(請輸入第%d個同學(xué)三門課的成績,i);scanf(%f%f%f,15,求一個小組學(xué)生成績的總分及平均分的程序可改寫為:,#includestdio.hmain()intscore,i,sum=0;floatavg;printf(請輸入本小組10個學(xué)生的成績:);for(i=1;i=10;i+)scanf(%d,16,for的進(jìn)一步練習(xí),用for語句來改進(jìn)實現(xiàn)例2。(求八位室友每個人三門課的總分及平均分)#includestdio.hmain()inti;floatx,y,z,sum,avg;for(i=1;i=8;i+)printf(請輸入第%d個同學(xué)三門課的成績,i);scanf(%f%f%f,17,任務(wù)2求每個小組學(xué)生成績的總分及平均分,一、問題情景一個班進(jìn)行了一次考試,現(xiàn)要輸入全班四個小組的學(xué)生成績,計算每一小組的總分與平均分,并按要求輸出。,分析,在任務(wù)1中,所解決的問題是:一個小組學(xué)生成績的總分及平均分。若現(xiàn)在一個班中有四個小組,現(xiàn)求每個小組的學(xué)生成績的總分及平均分。也就是將任務(wù)1重復(fù)進(jìn)行四次,顯然寫四段程序是不科學(xué)的,科學(xué)的方法是再嵌套一個循環(huán)。,具體實現(xiàn):#includestdio.hmain()intscore,i,j=1,sum;floatavg;while(j=4)sum=0;i=1;printf(請輸入第%d小組學(xué)生成績:,j);while(i=10)scanf(%d,/下一個小組,程序運行結(jié)果,一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)體,稱為循環(huán)的嵌套,與if的嵌套相同,內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。內(nèi)層的優(yōu)先級比外層的高,只有內(nèi)層的執(zhí)行完才能執(zhí)行外層的,循環(huán)嵌套的要領(lǐng)對各種語言都是一樣的。三種循環(huán)(while循環(huán)、dowhile循環(huán)、for循環(huán))可以互相嵌套。,18,本任務(wù)用dowhile循環(huán)嵌套dowhile循環(huán)的程序解決:,#includestdio.hmain()intscore,i,sum;floatavg;intj=1;dosum=0;i=1;printf(請輸入第%d小組學(xué)生成績:,j);doscanf(%d,黃色的循環(huán)包含在玫瑰色的循環(huán)中,19,本任務(wù)用for循環(huán)嵌套for循環(huán):,#includestdio.hmain()intscore,i,sum;floatavg;intj=1;for(;j=4;j+)sum=0;printf(請輸入第%d小組學(xué)生成績:,j);for(i=1;i=10;i+)scanf(%d,黃色的循環(huán)包含在玫瑰色的循環(huán)中,20,本任務(wù)while循環(huán)嵌套dowhile循環(huán),#includestdio.hmain()intscore,i,sum;floatavg;intj=1;while(j100。,#includemain()inti;i=1;while(i=100)if(i%3!=0)printf(“%3d”,i);i+;,程序如下,23,將【例3】用for語句來改進(jìn)實現(xiàn),將1100之間不能被3整除的數(shù)輸出。#includemain()inti;for(i=1;i=100;i+)if(i%3!=0)printf(“%3d”,i);,24,將【例3】用dowhile語句來改進(jìn)實現(xiàn)。,將1100之間不能被3整除的數(shù)輸出。#includemain()inti;i=1;doif(i%3!=0)printf(“%3d”,i);i+;while(i=100);,25,【例4】編程實現(xiàn)百錢買百雞,有一老大爺去集貿(mào)市場買雞,他想用100元錢買100只雞,而且要求所買的雞有公雞、母雞、小雞。已知公雞2元一只,母雞3元一只,小雞0.5元一只。問老大爺要買多少只公雞、母雞、小雞恰好花去100元錢,并且買到100只雞?,分析,x+y+z=100 x+3y+0.5z=100,y=1.5z-100 x=200-2.5z,假設(shè)公雞買x只,母雞買y只,小雞買z只,則由題意可得:,(1)當(dāng)z=2時,計算y與x的值(2)當(dāng)z=4時,計算y與x的值(3)當(dāng)z=8時,計算y與x的值(4)一直計算到z=98時,計算y與x的值顯然,如果x,y的值都大于零,則輸出x,y,z。所以用for循環(huán)的程序如左:,#includemain()intx,y,z;for(z=2;z0,26,用雙循環(huán)實現(xiàn)【例4】的百錢買百雞。,分析:假設(shè)公雞買x只,母雞買y只,小雞買z只,則:(1)y可以是1、2、333的一個值。(2)x可以是1、2、350的一個值。(3)然后由y及x,顯然可解得z=100-x-y。(4)如果所花的錢剛好是100,則輸出x,y,z。,程序如下:#includemain()intx,y,z;for(x=1;x=50;x+)for(y=1;y=33;y+)z=100-x-y;if(2*x+3*y+0.5*z=100)printf(“公雞數(shù)為%d,母雞數(shù)為%d,小雞數(shù)為%dn,x,y,z);,27,【例5】輸入二個正整數(shù),求它們的最大公約數(shù),分析,(1)若輸入二個正整數(shù)分別為a,b,它的最大公約數(shù)為k,k的值應(yīng)小于等于a,b中的一個相對小數(shù);(2)然后進(jìn)行a%k及b%k的運算,若它們的余數(shù)為零,則k就是最大公約數(shù)。(3)若a%k及b%k中至少有一個的余數(shù)不為零,則k=k-1,然后再執(zhí)行(2)。,#includemain()inta,b,k;printf(請輸入二個正整數(shù));scanf(%d%d,程序的運行結(jié)果為:請輸入二個正整數(shù)56最大公約數(shù)為1,28,【例6】判斷素數(shù),【例5】在數(shù)學(xué)課上,李老師要同學(xué)們對給定的任意正整數(shù)進(jìn)行判斷,看是否為素數(shù),這個數(shù)學(xué)問題,用C語言該如何解決?,分析:因為素數(shù)只能被1及本身整除,所以判斷一個大于2的正整數(shù)x是否為素數(shù),就讓x按順序除以i=2、3、x-1,若x能被它們中的任一個除盡,就可跳出循環(huán)。因為此數(shù)一定不是素數(shù)。所以判斷x是不是素數(shù),就可以用i的值來衡量,若i=x,則x一定是素數(shù),否則就不是素數(shù)。,#includemain()inti,x;printf(請輸入一個正整數(shù));scanf(%d,29,【例7】顯示如下的下三角九九乘法表,12436948121651015202561218243036714212835424981624324048566491827364554637281,分析:該乘法表要列出11,21,22,31,32,33,99的值,乘數(shù)的范圍是19,針對每一個乘數(shù),被乘數(shù)的范圍是1到它本身,因此可以用兩重循環(huán)解決問題。按乘數(shù)組織外層循環(huán),i表示從19;按被乘數(shù)組織內(nèi)層循環(huán),j表示從1i,從而確定每一行輸出的內(nèi)容。,#includemain()inti,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%-5d,i*j);printf(n);,30,相關(guān)知識,(一)常見的循環(huán)嵌套1.while循環(huán)嵌套while循環(huán)while()while()2.dowhile循環(huán)嵌套dowhile循環(huán)dodowhile();while();3.for循環(huán)嵌套for循環(huán)for(;)for(;),4.while循環(huán)嵌套dowhile循環(huán)while()dowhile();5.for循環(huán)嵌套while循環(huán)for(;)while()6.dowhile循環(huán)嵌套for循環(huán)dofor(;)while();,31,項目四舉一反三,【例8】程序功能:運行時輸入10個數(shù),然后分別輸出其中的最大值、最小值。,分析:(1)輸入第一個數(shù)x,并假定第一個數(shù)既是十個數(shù)中的最大值max,也是十個數(shù)中的最小值min;(2)然后輸入下一個數(shù)x,將最大值max及最小數(shù)min與x分別相比,若max小于x,則max=x;若min大于x,則min=x;(3)不斷重復(fù)步驟(2),直到第10個數(shù)比完為止;類似10個壯士打擂臺,第一個壯士先上場,認(rèn)為自已是“老大”,然后第二個壯士再上場,與前面的“老大”比武,贏者才是真的“老大”,一直到第十個壯士比完為止。,#includevoidmain()floatx,max,min;inti;printf(請輸入十個同學(xué)的成績:);for(i=1;imax)max=x;if(xmin)min=x;printf(最高分為%.1f,最低分為%.1fn,max,min);,在if語句中比較兩個數(shù)相等是“=”符號,而不是數(shù)學(xué)中的“=”符號,在C語言中“=”是賦值號。,32,【例9】程序功能:運行時輸入整數(shù)n,輸出n各位數(shù)字之和。(例如:n=1234,則輸出10,n=-123,則輸出6。,分析:若n的值為2345,則(1)個位數(shù)的取法是:(2)十位數(shù)的數(shù)字取法是:(3)百位數(shù)的數(shù)字的取法:(4)同理,要取得千位數(shù)的數(shù)字:,通過n%10就能獲取個位數(shù)字“5”,如果能將2345化為234,則就能輕松地取到4,所以執(zhí)行n=2345/10,再執(zhí)行n=n%10就行,執(zhí)行234/10,即n=n/10,新的n的值將成為23,然后再執(zhí)行n%10就可獲取數(shù)字“3”;,同理,要取得千位數(shù)的數(shù)字,只要執(zhí)行23/10,即n=n/10,新的n的值將成為2,然后再執(zhí)行n%10就可獲取“2”;,總結(jié)以上各步驟,可以發(fā)現(xiàn),對任意的一個數(shù)n,執(zhí)行n%10,再執(zhí)行n=n/10,然后不斷的重復(fù),就可以一個一個獲取個位數(shù)字、十位數(shù)字、百位數(shù)字,所以可以用循環(huán)去執(zhí)行以上的步驟,但是循環(huán)幾次呢?仔細(xì)分析不難發(fā)現(xiàn),經(jīng)過若干次的執(zhí)行n=n/10,則新的n的值肯定會成為0,所以可以得出結(jié)論:循環(huán)條件是n!=0。,程序的流程圖為:,#include#includevoidmain()intn,s=0;printf(請輸入一個數(shù):);scanf(%d,33,【例10】編程求:s=3+33+333+3333+33333+333333+3333333+33333333,分析:可以將本題化為:s=3(1+11+111+1111+11111+111111+1111111+11111111),所以只要求出了s=1+11+111+1111+11111+111111+1111111+11111111,然后再執(zhí)行s=s*3,就能達(dá)到題目的要求。而s=1+11+111+1111+11111+111111+1111111+11111111是一道累加題,只要執(zhí)行8次的s=s+t即可,只不過第一次循環(huán)中的t是1,第二次是11,第三次是111,分析后項與前項的關(guān)系是:前項的10倍加1等于后項,即t=10*t+1,t=0;for(i=1;i=8;i+)t=10*t+1;s=s+t;,#includevoidmain()inti,t=0;longs=0;for(i=1;i=8;i+)t=t*10+1;s=s+t;s=s*3;printf(3+33+333+3333+33333+333333+3333333+33333333=%ldn,s);,34,分析:(1)首先認(rèn)為最大值是當(dāng)x=1時的函數(shù)值,即max=1*1-5*1+sin(1);(2)然后計算出x=2時的f(x)與前面的max相比,如果maxf(x),則max=f(x)(3)將x=3,4,.10不斷重復(fù)步驟(2);(4)輸出max。,【例10】對x=1,2,3,10,求f(x)=x*x-5*x+sin(x)的最大值,#include#includevoidmain()intx;floatmax;max=1*1-5*1+sin(1);for(x=2;x=10;x+)if(maxx*x-5*x+sin(x)max=x*x-5*x+sin(x);printf(%fn,max);,35,【例11】編程找出100999之間所有的水仙花數(shù),分析:本題的編程思路是用枚舉法:即對100999之間的每一個數(shù),取出它的百位數(shù)a,十位數(shù)b,個位數(shù)c,如果a*a*a+b*b*b+c*c*c的值等于它自身,則輸出這個數(shù)。顯然a=i/100,b=(i-a*100)/10;c=i-a*100-b*10;,#include#includevoidmain()inti,a,b,c;for(i=100;i=999;i+)a=i/100;b=(i-a*100)/10;c=i-a*100-b*10;if(i=a*a*a+b*b*b+c*c*c)printf(%disaArmstrongnumber!n,i);,36,分析:因為要計算前30項之和,可以用一個循環(huán):(1)將a累加到s中,然后新的a變?yōu)閟qrt(a);(2)重復(fù)多次(1)即可;當(dāng)前30項的和算完后,則輸出。,【例12】數(shù)列第一項為81,此后各項均為它前1項的正平方根,統(tǒng)計該數(shù)列前30項之和。,#include#includevoidmain()floats=0,a=81,i;for(i=1;i=30;i+)s=s+a;a=sqrt(a);printf(“%fn”,s);,運行結(jié)果:121.33585

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論