循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(圖形打印題)_第1頁
循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(圖形打印題)_第2頁
循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(圖形打印題)_第3頁
循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(圖形打印題)_第4頁
循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)(圖形打印題)_第5頁
已閱讀5頁,還剩114頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)1第6章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)本章要點(diǎn)循環(huán)語句的執(zhí)行流程不同形式的循環(huán)控制多重循環(huán)問題簡單算法設(shè)計(jì)2第6章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)的基本概念while語句for語句do_while語句轉(zhuǎn)移語句循環(huán)應(yīng)用36.1循環(huán)的基本概念 提出問題提問:從鍵盤上輸入10個(gè)整數(shù)并求和,怎么編程?回答:在程序中寫10個(gè)scanf語句,還可以寫%d%d…提問:從鍵盤上輸入500個(gè)整數(shù)并求和,怎么編程?回答:這個(gè),嗯……???不會(huì)讓我寫500個(gè)……以上問題的實(shí)質(zhì)是:將scanf函數(shù)重復(fù)執(zhí)行N遍。我們可以引出一個(gè)概念“循環(huán)”,簡單而言:循環(huán)就是不斷反復(fù)地執(zhí)行同一段程序。?46.1循環(huán)的基本概念

循環(huán)

反復(fù)執(zhí)行同一段程序,直到滿足一定的條件后才停止執(zhí)行該段程序。

C語言中控制循環(huán)的語句:

whilefordo_while5第6章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)的基本概念while語句for語句do_while語句轉(zhuǎn)移語句循環(huán)應(yīng)用66.2while語句while語句格式while(表達(dá)式)語句; 說明:語句可是簡單語句,也可是復(fù)合語句。while語句的執(zhí)行流程76.2while語句表達(dá)式?執(zhí)行語句成立不成立執(zhí)行while循環(huán)之后的語句循環(huán)控制條件循環(huán)體while(表達(dá)式) 語句;8例:從鍵盤輸入10個(gè)整數(shù),求這10個(gè)整數(shù)之和程序主體:count<10?輸入num成立不成立輸出結(jié)果total計(jì)數(shù)器count=0累加器total=0total+=numcount++開始結(jié)束while(count<10){}count++;scanf("%d",&num);total+=num;89#include<stdio.h>intmain(){intcount,num,total;

/*count:計(jì)數(shù)器,num:輸入的整數(shù)*/count=0;total=0; /*total:存放累加和*/while(count<10)/*循環(huán)控制條件*/{printf("EntertheNo.%d=",count);/*循環(huán)體*/scanf("%d",&num);total+=num;/*計(jì)算累加和*/

count++;

} printf("Total=%d\n",total);}10例:求n的階乘n!(1<=n<=10)程序主體:

while(i<=n){ s*=i;i++;}i<=n?s*=i成立不成立輸出結(jié)果計(jì)數(shù)器i=1累積器s=1i++開始結(jié)束遞推公式:f(n)=1 當(dāng)n=1時(shí)f(n)=f(n-1)*n當(dāng)n>1時(shí)116.2while語句#include<stdio.h>intmain(){longs=1; /*s:存放累積結(jié)果*/inti=1; /*i:計(jì)數(shù)器,同時(shí)是累積的對象*/while(i<=10)/*循環(huán)控制條件*/{ /*循環(huán)體*/ s*=i; /*計(jì)算累積和*/i++;} printf(“10!=%d\n",s);}以求10!為例126.2while語句比較total=0;count=0;while(count<10){…total+=num;count++;}s=1;i=1;while(i<=10){…s*=i;i++;}10個(gè)數(shù)相加10個(gè)數(shù)相乘13例:分析程序運(yùn)行結(jié)果#include<stdio.h>intmain(){ intn=0; while(n<3) printf(“nis%d\n”,n); n++;}結(jié)果:程序?qū)⒉煌5拇蛴 皀is0”,直至終止程序無法正常終止的程序,稱為“死循環(huán)”。結(jié)論:while語句循環(huán)體中,一定要有能夠?qū)ρh(huán)控制條件產(chǎn)生影響的語句,避免出現(xiàn)“死循環(huán)”現(xiàn)象。{}14例:求1413的最后三位數(shù)。問題分析:14的13次方已經(jīng)超出了計(jì)算機(jī)所能表示的整數(shù)范圍乘法規(guī)律:乘積的最后三位的值只與乘數(shù)和被乘數(shù)的后三位有關(guān)C語言中最長的整數(shù)是:無符號(hào)長整型數(shù):0~429496729510位1410=28925465497612位問題被簡化為求三位數(shù)乘法156.2while語句intmain(){inti=1,x,y,a=1;printf("InputXandY:");scanf("%d**%d",&x,&y);

while(i<=y){a=a*x%1000;i++;}printf("3digitsis:");printf("%d\n",a%1000);}InputXandY:14**133digitsis:144InputXandY:15**123digitsis:625166.2while語句如何一次輸入多個(gè)字符或數(shù)值例:將從鍵盤輸入的一行字符(回車結(jié)束)復(fù)制到標(biāo)準(zhǔn)輸出(顯示器)。

回顧字符輸入輸出函數(shù): getchar():調(diào)用時(shí),等待用戶按鍵,輸入的字符存入鍵盤緩沖區(qū),直到用戶按Enter為止(Enter即\n也在緩沖區(qū))。輸入Enter后,getchar從輸入流每次讀一個(gè)字符,作為其返回值。其它未讀的字符保留在緩沖區(qū),待下一個(gè)getchar調(diào)用。176.2while語句#include<stdio.h>intmain(){charch;ch=getchar();while(ch!=‘\n’){putchar(ch); ch=getchar();}}ch!=‘\n’?顯示ch成立不成立ch=讀入一個(gè)字符ch=讀入下一個(gè)字符開始結(jié)束ab13cdeab13cdeputchar(ch=getchar());putchar(getchar());186.2while語句#include<stdio.h>intmain(){charch;while((ch=getchar())!=‘\n’) putchar(ch);}一段更簡潔的程序196.2while語句例:輸入若干整數(shù),豎排輸出,當(dāng)輸入為0時(shí)程序結(jié)束。如:輸入13-63560輸出: 13 -6

356 scanf(…):調(diào)用時(shí),等待用戶輸入,輸入的內(nèi)容存入鍵盤緩沖區(qū),直到用戶按Enter為止。輸入Enter后,scanf從輸入流每次按格式讀一個(gè)單元,作為其返回值。其它未讀的內(nèi)容保留在緩沖區(qū),待下一個(gè)scanf調(diào)用。206.2while語句#include<stdio.h>intmain(){intx;scanf(“%d”,&x);while(x){printf(“%d\n”,x); scanf(“%d”,&x);}}scanf()把緩沖區(qū)的內(nèi)容全部讀完以后,才再次等待用戶從鍵盤輸入輸入:13-63560輸出:13-6356輸入:13-635607輸出:13-6356輸入:13-6216.2while語句循環(huán)嵌套

在循環(huán)體中,又包含有循環(huán)語句。

while { … while {

… }

… }22例:輸出下三角形乘法九九表。

123456789---------------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281

假設(shè):行號(hào)為i,列號(hào)為j

則第i行中一共要輸出i個(gè)乘積,每一項(xiàng)為i*j。(1<=i<=9)(1<=j<=i)i=6j=5i*j屏幕上的字符只能從上到下逐行顯示,同一行內(nèi),只能從左到右逐字顯示。2223顯示要求

屏幕上的字符只能從上到下逐行顯示,同一行內(nèi),只能從左到右逐字顯示。偽代碼(Pseudocode)while(控制顯示n行){while(控制顯示一行中的m個(gè)字符){輸出一個(gè)需要的字符;列計(jì)數(shù)器j++;}行數(shù)計(jì)數(shù)器i++;}24 #include<stdio.h>intmain(){inti=1,j;/*i:行計(jì)數(shù)器j:列計(jì)數(shù)器*/while(i<=9)/*控制打印表頭*/printf("%4d",i++);printf("\n--------------------------------------\n");i=1;while(i<=9){j=1;/*列計(jì)數(shù)器置1*/while(j<=i)/*嵌套的二重循環(huán),輸出第i行*/ {printf("%4d",i*j);j++;/*列計(jì)數(shù)器+1*/}printf("\n");/*一行輸出結(jié)束后,輸出\n*/i++;/*行計(jì)數(shù)器+1*/}}外層循環(huán)體執(zhí)行1次,內(nèi)層循環(huán)要完整執(zhí)行1次25第6章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)的基本概念while語句for語句do_while語句轉(zhuǎn)移語句循環(huán)應(yīng)用266.3for語句for語句格式for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語句;說明:語句可是簡單語句,也可是復(fù)合語句。for語句的執(zhí)行流程27循環(huán)初始條件循環(huán)控制條件表達(dá)式2?執(zhí)行語句成立不成立執(zhí)行for循環(huán)之后的語句執(zhí)行表達(dá)式3執(zhí)行表達(dá)式1循環(huán)體

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句;for語句等價(jià)于下列語句:表達(dá)式1;while(表達(dá)式2){語句;表達(dá)式3;}286.3for語句#include<stdio.h>intmain(){longn=1;inti; i=1;while(i<=10){n*=i; i++;} printf(“10!=%d\n",n);}for(i=1;i<=10;i++) n*=i; for語句最常用的形式:for(初值;控制條件;增量)語句;29例:用for語句實(shí)現(xiàn)打印乘法九九表#include<stdio.h>intmain(){inti,j;for(i=1;i<=9;i++)printf("%4d",i);printf("\n--------------------------------------\n");for(i=1;i<=9;i++)for(j=1;j<=i;j++) printf(j==i?"%4d\n":"%4d",i*j);}輸出函數(shù)printf中使用了“?”操作,含義相當(dāng)于:if(j==i) printf("%4d\n",i*j);else printf("%4d",i*j);30for語句的變化形式

for語句中的三個(gè)表達(dá)式中的任意一個(gè)都是可以省略的,但是分號(hào)不能省略。省略表達(dá)式2,則:

for(表達(dá)式1;;表達(dá)式3)省略表達(dá)式1和表達(dá)式3,則:

for(;表達(dá)式2;)

據(jù)此可得結(jié)論:所有用while語句實(shí)現(xiàn)的循環(huán)都可以用for語句實(shí)現(xiàn)。表達(dá)式1、2、3全省略,則:

for(;;)等同于:while(表達(dá)式)構(gòu)成一個(gè)死循環(huán)等同于:while(1)316.3for語句

草原上有一對小兔子,它們剛出生后的第1個(gè)月就會(huì)逐步長大,到了第2個(gè)月末就生出一對小兔子。第3個(gè)月大兔子會(huì)繼續(xù)生一對小兔子,而第2個(gè)月出生的小兔子會(huì)逐步長大。第4個(gè)月時(shí),第1月出生的兔子繼續(xù)生育,第2月出生的小兔子也可以生育一對小兔子了,第3月出生的小兔子則逐步長大……

假設(shè)這些草原的兔子非常長壽,可以認(rèn)為它們不會(huì)死亡。請建立數(shù)學(xué)模型,計(jì)算第N個(gè)月時(shí),草原上將會(huì)有多少對兔子?326.3for語句例:數(shù)列1、1、2、3、5、8、13、21、…是著名的菲波那契數(shù)列,其遞推通項(xiàng)公式為:

F1=F2=1 Fn=Fn-1+Fn-2 (n>=3)

為求出第N項(xiàng)的值,請編寫程序。 根據(jù)遞推通項(xiàng)公式,可用遞推法編寫程序,計(jì)算第N項(xiàng)的值。336.3for語句遞推法

由初始的已知條件開始,先計(jì)算出第(N-1)步的結(jié)果,再利用已知的前(N-1)項(xiàng)結(jié)果,按遞推公式(或遵照遞推規(guī)則),推出第N步結(jié)果。 遞推法是程序設(shè)計(jì)中最常用的方法之一,使用遞推法必須有明確的遞推初始值和遞推規(guī)則(遞推公式)。34程序主體f=f2=1;for(i=3;i<=n;i++){f1=f2;f2=f;f=f1+f2;}i<=n?向前傳遞前兩項(xiàng)f1=f2f2=f成立不成立初始化:f=f2=1計(jì)算f=f1+f2遞推項(xiàng):i=3i++數(shù)列對應(yīng)關(guān)系:f1,f2,f遞推計(jì)算f1=f2=1;for(i=3;i<=n;i++){f=f1+f2;f1=f2;f2=f;}35#include<stdio.h>intmain(){longf1,f2,f;inti;for(;;){printf("Inputn=?");scanf("%d",&n);if(n>=3)break; /*退出for循環(huán)*/elseprintf("\nInputniserror!\n");} /*控制輸入正確的N值*/f=f2=1;/*設(shè)置遞推初始值*/for(i=3;i<=n;i++)/*用遞推法計(jì)算第N項(xiàng)的值*/{f1=f2;f2=f;f=f1+f2;}printf("No.%dis%d\n",n,f);}36語句中的逗號(hào)(,)運(yùn)算 逗號(hào)(,)運(yùn)算常見的三種用途是:在變量說明表中用來分隔變量,起分隔符的作用,如:inti,j,k,m[3],*p;在函數(shù)的參數(shù)表中分隔參數(shù)。如:printf("n=%d,x=%d\n",n,x);在語句中使用。其形式是:表達(dá)式n1,表達(dá)式n2; 用逗號(hào)分隔開的表達(dá)式從左到右進(jìn)行計(jì)算,結(jié)果的類型和值是最右邊表達(dá)式的類型和值。376.3for語句例:輸出下列字符串:azbycxdwevfugthsirjqkplomn分析:奇數(shù)位上的字符從'a'開始逐次遞增,偶數(shù)位上的字符從'z'開始逐次遞減。#include<stdio.h>intmain(){chari,j; /*i:奇位字符j:偶位字符*/for(i='a',j='z';i<j;i++,j--) printf("%c%c",i,j);/*輸出兩個(gè)字符*/printf("\n");}azbycxdwevfugthsirjqkplomn38第6章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)的基本概念while語句for語句do_while語句轉(zhuǎn)移語句循環(huán)應(yīng)用396.4do_while語句do_while語句格式

do{ 語句; }while(表達(dá)式);do_while語句的執(zhí)行流程406.4do_while語句表達(dá)式?執(zhí)行語句成立不成立執(zhí)行while子句之后的語句循環(huán)控制條件循環(huán)體后判斷do{ 語句;}while(表達(dá)式);416.4do_while語句do_while語句的特點(diǎn) 與while和for的區(qū)別:

do_while語句先執(zhí)行循環(huán)體然后再判斷循環(huán)控制條件;使用do_while構(gòu)成的循環(huán),循環(huán)體部分至少要執(zhí)行一次,使用while和for構(gòu)成的循環(huán),循環(huán)體部分有可能一次也不會(huì)執(zhí)行。 do_while語句條件表達(dá)式后面的分號(hào)不是空語句。426.4do_while語句#include<stdio.h>intmain(){longn=1;inti; i=1;while(i<=10){n*=i; i++;} printf(“10!=%d\n",n);}for(i=1;i<=10;i++) n*=i; i=1;do{n*=i; i++;}while(i<=10);436.4do_while語句例:輸入一個(gè)>=0的整數(shù),要求以相反的順序輸出。例如:輸入12345,則輸出為54321。思路:可以從個(gè)位開始,按位輸出整數(shù)的每一位

intmain(){unsignedintnum;printf("Inputthenumber:");scanf("%d",&num);do{printf("%d",num%10);num/=10; /*num縮小10倍*/}while(num!=0);}簡單轉(zhuǎn)變?yōu)閣hile或for語句,程序?qū)⒉荒芴幚頂?shù)字0。446.4do_while語句例:從鍵盤輸入任意的字符,按下列規(guī)則進(jìn)行分類計(jì)數(shù)。第一類‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’第二類‘+’,‘-’,‘*’,‘/’,‘%’,‘=’第三類其它字符當(dāng)輸入字符‘\’時(shí)先計(jì)數(shù)然后停止接收輸入。45intmain(){intclass1=0,class2=0,class3=0;charch;do{putchar(ch=getch());/*函數(shù)的嵌套調(diào)用*/switch(ch){case'0':case'1':case'2':case'3':case'4':case'5’:case'6':case'7':case'8':case'9':class1++;break;/*對分類1計(jì)數(shù)*/case'+':case'-':case'*':case'/':case'%':case'=':class2++;break;/*對分類2計(jì)數(shù)*/default:class3++;break;/*對分類3計(jì)數(shù)*/}}while(ch!='\\');printf("class1=%d,class2=%d,class3=%d\n",class1,class2,class3);}46循環(huán)語句小結(jié)C語言提供三種循環(huán):for、while、do_whilefor和while先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件;while和do-while語句的條件表達(dá)式只有1個(gè),for語句有3個(gè)表達(dá)式,表達(dá)式2是條件表達(dá)式;while、do-while、for可以相互替換使用;while語句多用于不需要賦初值的或循環(huán)次數(shù)不定的情況;

for語句多用于要賦初值或循環(huán)次數(shù)固定的情況;

do-while語句多用于至少要運(yùn)行一次的循環(huán);循環(huán)語句可串可并可嵌套,但不能交叉。47循環(huán)語句小結(jié)為了保證循環(huán)正常運(yùn)行,應(yīng)該特別注意:循環(huán)控制條件控制條件的初始狀態(tài)(初始值)循環(huán)體內(nèi)部對控制條件的影響以上三個(gè)方面相互配合,相互影響,共同完成循環(huán)控制48第6章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)的基本概念while語句for語句do_while語句轉(zhuǎn)移語句循環(huán)應(yīng)用496.5轉(zhuǎn)移語句轉(zhuǎn)移語句的作用 改變程序的運(yùn)行流程C語言轉(zhuǎn)移語句breakcontinuegotoreturn506.5.1break語句格式 break;功能在switch語句中結(jié)束case子句,使控制轉(zhuǎn)到switch語句之外。在循環(huán)語句的循環(huán)體中使用,結(jié)束循環(huán)過程,使控制轉(zhuǎn)移到整個(gè)循環(huán)語句之外的下一條語句處。51break語句的執(zhí)行流程表達(dá)式?成立不成立后續(xù)語句break表達(dá)式2?成立不成立后續(xù)語句執(zhí)行表達(dá)式3執(zhí)行表達(dá)式1break表達(dá)式?成立不成立后續(xù)語句breakwhile語句for語句do-while語句52例:求555555的約數(shù)中最大的三位數(shù)intmain(){intj;longn;printf("Pleaseinputnumber:");scanf("%ld",&n);

/*所求的約數(shù)的可能取值是從999到100,j從大到小*/for(j=999;j>=100;j--)if(n%j==0)/*若能被j整除,則j是約數(shù)*/{printf("3digitsin%ld=%d\n",n,j); break;/*控制退出循環(huán)*/}return0;}536.5.1break語句break語句使用注意在嵌套循環(huán)中,break語句僅能退出一層(當(dāng)前層)循環(huán);若在循環(huán)語句中包含了switch語句,那么switch語句中的break語句僅能使控制退出switch語句;break語句并不是程序設(shè)計(jì)中必不可少的語句,可以通過改變程序的結(jié)構(gòu)去掉。546.5.2continue語句格式continue;功能

continue語句僅能在循環(huán)語句中使用:它的作用不是結(jié)束循環(huán),而是開始一次新的循環(huán)。對于for語句,將控制轉(zhuǎn)到執(zhí)行表達(dá)式3和條件測試部分;對于while和do-while語句,將控制轉(zhuǎn)到條件測試部分;從邏輯上講,適當(dāng)改變程序的結(jié)構(gòu)就可以不需要使用continue語句。55continue語句的執(zhí)行流程表達(dá)式?成立不成立后續(xù)語句continue表達(dá)式2?成立不成立后續(xù)語句執(zhí)行表達(dá)式3執(zhí)行表達(dá)式1continue表達(dá)式?成立不成立后續(xù)語句continuewhile語句for語句do-while語句56例:輸入10個(gè)整數(shù),求其中正數(shù)的個(gè)數(shù)及平均值,精確到小數(shù)點(diǎn)后兩位。

intmain(){inti,count=0,j,sum=0;for(i=1;i<=10;i++){printf("Inputinteger:");scanf("%d",&j);

if(j<=0) continue;

/*結(jié)束本次循環(huán),不進(jìn)行后續(xù)操作*/count++;/*計(jì)數(shù)器*/sum+=j;/*求累加和*/}if(count>0)printf("Plusnumber:%d,averagevalue:%.2f", count,1.0*sum/count);elseprintf("Plusnumber:0,averagevalue:0");}576.5.3goto語句格式 goto標(biāo)號(hào);功能

將程序控制轉(zhuǎn)移到標(biāo)號(hào)所指定的語句處繼續(xù)執(zhí)行。標(biāo)號(hào)的唯一功能就是作為goto語句的目標(biāo)。標(biāo)號(hào)的作用域是它所在的整個(gè)函數(shù)。注意:為了保證程序的結(jié)構(gòu)化,不允許使用向上goto語句586.5.3goto語句例:已知一首項(xiàng)大于0的等差遞增數(shù)列的前四項(xiàng)和為26,前四項(xiàng)的積為880,求這數(shù)列。設(shè)數(shù)列的第一項(xiàng)為a(a>0),公差為d(d>0)。則該數(shù)列滿足條件:a+(a+d)+(a+2*d)+(a+3*d)=4*a+6*d=26a*(a+d)*(a+2*d)*(a+3*d)=880可以推出,首項(xiàng)a和公差d的取值范圍為:1<=a<=51<=d<=3可以使用窮舉的方法,在首項(xiàng)a和公差d的取值范圍內(nèi)進(jìn)行判斷。596.5.3goto語句intmain(){inta,x,y,d,i;for(a=1;a<=5;++a)

/*在a的范圍內(nèi)窮舉*/for(d=1;d<=3;++d)/*在d的范圍內(nèi)窮舉*/{x=a+(a+d)+(a+2*d)+(a+3*d);/*前四項(xiàng)的和*/ y=a*(a+d)*(a+2*d)*(a+3*d);/*前四項(xiàng)的積*/ if(x==26&&y==880)/*若滿足條件*/

goto

out;/*退出二重循環(huán)*/}out:

/*語句標(biāo)號(hào)*/for(i=0;i<=20;++i)/*輸出運(yùn)行結(jié)果*/printf("%d,",a+i*d);}606.5.3goto語句intmain(){inta,x,y,d,i,flag=1;/*flag:標(biāo)志變量*/for(a=1;a<=5&&flag;++a)/*flag!=0是進(jìn)行循環(huán)*/for(d=1;d<=3&&flag;++d){x=a+(a+d)+(a+2*d)+(a+3*d);/*前四項(xiàng)的和*/ y=a*(a+d)*(a+2*d)*(a+3*d);/*前四項(xiàng)的積*/ if(x==26&&y==880)/*若滿足條件*/ {for(i=0;i<=20;++i)/*輸出結(jié)果*/printf("%d,",a+i*d);

flag=0;

/*控制退出二重循環(huán)*/}}}通過增加標(biāo)志變量可以有效地控制循環(huán)616.5.4return語句格式格式1:return;格式2:return(表達(dá)式);功能return語句使程序從被調(diào)用函數(shù)中返回到調(diào)用函數(shù)的調(diào)用處繼續(xù)運(yùn)行;如果return后跟一表達(dá)式,則該表達(dá)式的值會(huì)從被調(diào)用函數(shù)中帶回到調(diào)用它的函數(shù),稱為返回值。幾個(gè)程序片段ints=1,i=1;scanf(“%d”,&n);while(i<=n)s*=i++;62求階乘intpower(intx,inty){intpro=1;while(y-->0)pro*=x;returnpro;}63子函數(shù)power:計(jì)算x的y次方不要用標(biāo)準(zhǔn)庫函數(shù)pow處理整型intm=0;scanf("%d",&n);do{m=m*10+n%10;n/=10;}while(n!=0);64求反序數(shù)例:求最大最小數(shù)的算術(shù)運(yùn)算結(jié)果用例輸入:15,1,11,2,0,3,+,=輸出:15+0=15如何用字符輸入形式讀入一個(gè)整數(shù)?ints=0;charch;while((ch=getchar())!=‘=’){if(ch>='0'&&ch<='9')s=s*10+ch-'0';else…}65inta,b;charch;scanf(“%d%c%d”,&a,&ch,&b);scanf(“%c”,&ch);輸入35后,a為3,b為5,ch為'\n'66“字符”對“%d”來講是非法輸入,但對%c是合法的,空格和\n等也將不作為輸入結(jié)束標(biāo)志。charch;while((ch=getchar())!='=')putchar(ch);67如何判斷“沒有任何一項(xiàng)匹配上”?6869第6章循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)循環(huán)的基本概念while語句for語句do_while語句轉(zhuǎn)移語句循環(huán)應(yīng)用70程序設(shè)計(jì)的一般步驟分析題意,明確問題的性質(zhì)數(shù)值問題/非數(shù)值問題建立問題的描述模型數(shù)學(xué)模型/過程模型設(shè)計(jì)/確定算法數(shù)學(xué)問題:數(shù)值分析非數(shù)學(xué)問題:數(shù)據(jù)結(jié)構(gòu)/算法分析與設(shè)計(jì)一般方法:窮舉/遞推/遞歸/…...編程調(diào)試分析運(yùn)行結(jié)果716.6循環(huán)應(yīng)用窮舉法

72例:百錢百雞問題中國古代數(shù)學(xué)家張丘建在他的《算經(jīng)》中提出了著名的“百錢百雞問題”:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,翁、母、雛各幾何?

問題分析與算法設(shè)計(jì)設(shè):要買x只公雞,y只母雞,z只小雞,可得到方程:x+y+z=100① 5x+3y+z/3=100②取值范圍:0<=x,y,z<=100

可以采用窮舉法求解:將變量x、y、z的所有取值可能代入方程進(jìn)行計(jì)算73intmain(){intx,y,z,j=0;for(x=0;x<=100;x++)for(y=0;y<=100;y++)for(z=0;z<=100;z++)if(x+y+z==100&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}運(yùn)行結(jié)果:1:cock=0hen=25chicken=752:cock=3hen=20chicken=77………………7:cock=12hen=4chicken=84z<=100滿足方程?YN輸出z++z=0y<=100y++y=0x<=100x++x=0開始結(jié)束74丟失重要條件:z應(yīng)該能夠被3整除。intmain(){intx,y,z,j=0;for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}運(yùn)行程序,正確的結(jié)果:1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=84z+=3)75優(yōu)化程序:for(x=0;x<=20;x++)for(y=0;y<=33;y++)for(z=0;z<=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);再優(yōu)化:for(x=0;x<=20;x++)for(y=0;y<=(100-5*x)/3;y++){z=100-x-y;if(z%3==0&&5*x+3*y+z/3==100)printf("%2d:cock=%2dhen=%2dchicken=%2d\n",++j,x,y,z);}76例:新娘和新郎問題:三對情侶參加婚禮,三個(gè)新郎為A、B、C,三個(gè)新娘為X、Y、Z。有人不知道誰和誰結(jié)婚,于是詢問了其中的三位,聽到的回答是這樣的:A說他將和X結(jié)婚;X說她的未婚夫是C;C說他將和Z結(jié)婚。這人聽后知道他們在開玩笑,全是假話。請編程找出誰將和誰結(jié)婚。問題分析與算法設(shè)計(jì):設(shè):A、B、C三人用1、2、3表示,將X和A結(jié)婚表示為x=1,將Y不與A結(jié)婚表示為y!=1。則:x!=1A不與X結(jié)婚x!=3X的未婚夫不是Cz!=3C不與Z結(jié)婚 題意還隱含:x!=y且x!=z且y!=z77intmain(){intx,y,z;for

(x=1;x<=3;x++)/*窮舉X的全部可能配偶*/for

(y=1;y<=3;y++)/*窮舉Y的全部可能配偶*/

for(z=1;z<=3;z++)/*窮舉Z的全部可能配偶*/if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z){printf("Xwillmarryto%c.\n",'A'+x-1); printf("Ywillmarryto%c.\n",'A'+y-1);printf("Zwillmarryto%c.\n",'A'+z-1);}}78例:設(shè)有一個(gè)正整數(shù)X,當(dāng)X加上100后得到的數(shù)Y是一個(gè)正整數(shù)的平方,然后用Y再加上68,又是另外一個(gè)正整數(shù)的平方,你能算出X為多少嗎?問題分析與算法設(shè)計(jì): 根據(jù)題目直接列方程:

y=x+100 y=m*m y+68=n*n 取值范圍:x>0;n>m>10的整數(shù)79intmain(){intx,y,m,flag; /*flag:標(biāo)志變量*/for(x=0,flag=1;flag;x++)/*窮舉x*/{y=100+x;/*計(jì)算y*/for(m=10;m*m<y;m++);if(m*m==y)/*判斷y是否為一個(gè)數(shù)的平方*/{for(;m*m<y+68;m++);if(m*m==y+68)/*判斷y+68*/{printf("%d\n",x);flag=0;/*flag置0,結(jié)束循環(huán)*/}}}}窮舉x、m、n80intmain(){inty,m,flag; for(y=101,flag=1;flag;y++)/*窮舉y*/{for(m=10;m*m<y;m++);if(m*m==y){for(;m*m<y+68;m++);if(m*m==y+68){printf("%d\n",y-100);flag=0;}}}}窮舉y、m、n81intmain(){intm,n,flag;/*flag:標(biāo)志變量*/for(m=10,flag=1;flag;m++){/*通過窮舉m,直接構(gòu)造平方數(shù)y*/for(n=10;n*n<m*m+68;n++);/*判斷m*m+68是否為平方數(shù)*/if(n*n==m*m+68){printf("%d\n",m*m-100);flag=0;/*flag置0,結(jié)束循環(huán)*/}}}窮舉m、n826.6循環(huán)應(yīng)用窮舉法的關(guān)鍵判斷問題是否適合使用窮舉法明確窮舉的終止條件窮舉的對象(變量)的范圍注意效率——減少嘗試次數(shù)83求555555的約數(shù)中最大的三位數(shù)求不超過n的最大素?cái)?shù)求首項(xiàng)大于0的等差數(shù)列:前四項(xiàng)和為26,前四項(xiàng)的積為880從鍵盤上任意輸入一個(gè)正整數(shù),要求判斷該正整數(shù)是否是另一個(gè)整數(shù)的平方。百錢百雞新娘和新郎其它排列組合問題親密數(shù)、黑色星期五、求各位數(shù)字之和等于5且能被5整除的整數(shù)、馬戲團(tuán)觀眾人數(shù)、求等于其各位數(shù)字的階乘之和的正整數(shù)、求滿足條件的等差數(shù)列、乒乓球比賽對陣方案…846.6循環(huán)應(yīng)用圖形問題85例:在一行中輸出n個(gè)*號(hào)。

例如,輸入n=4,輸出的圖形如下:****基本語句: 輸出一個(gè)*號(hào):printf(“*”); 或putchar(‘*’);基本算法: 1.輸入n 2.重復(fù)輸出n個(gè)*; 3.輸出一個(gè)\nscanf(“%d”,&n);while(n>0){printf(“*”);n--;}printf(“\n”);86例:輸出邊長為n的正方型 例如,輸入n=4,輸出如下圖形:****************算法分析與設(shè)計(jì):

1.輸入n; 2.重復(fù)輸出n行,每行輸出n個(gè)*; 加細(xì)一: 1.輸入n; 2.for(i=1;i<=n;i++) 輸出一行中的n個(gè)*;87 加細(xì)二: 1. 輸入n; 2. for(i=1;i<=n;i++) { 輸出n個(gè)*

; 換新行; } 加細(xì)三: 1. 輸入n; 2. for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf(“*”); printf(“\n”); }88整理,得到程序如下:intmain(){intm,i,j;scanf(“%d”,&n);for(i=1;i<=n;i++) /*控制輸出n行*/{for(j=1;j<=n;j++)/*輸出一行中的n個(gè)*號(hào)*/ printf(“*”);printf(“\n”);}}分析方法——逐步求精法 對于比較復(fù)雜問題,不可能一下得到程序,可以先將簡單的部分明確出來,再逐步對復(fù)雜部分進(jìn)行細(xì)化,一步一步推出完整程序。89例:輸出邊長為n的平行四邊形

例如,輸入n=4,輸出如下圖形:

****************算法分析與設(shè)計(jì): 在正方型每行*號(hào)的前面先多輸出若干個(gè)空格。對于第i行,1<=i<=n,則應(yīng)先輸出個(gè)空格。

n-i90intmain(){intn,i,j;scanf(“%d”,&n);for(i=1;i<=n;i++) /*控制輸出n行*/{for(j=1;j<=n-i;j++)/*控制輸出n-i個(gè)空格*/printf(“”);for(j=1;j<=n;j++)/*輸出一行中的n個(gè)*號(hào)*/ printf(“*”);printf(“\n”);}}關(guān)鍵在于找出每行要輸出的空格和*的個(gè)數(shù)91i=1n…j=ii=1n…i+j=n+1**************

***

**

*j控制輸出i個(gè)*j:i-1個(gè)

**********

*

**

******

*j:n-i+1個(gè)*j:n-i個(gè)

j:n-i+1個(gè)*j:i個(gè)*j=n-i+192例:輸出n行用*組成的等腰三角形 例如,輸入n=4,輸出如下圖形:

*

***

********

****j=1…n-i

j=1…2i-1*(“\n”)i=1…ni個(gè)*i-1個(gè)*93例:輸出邊長為n的菱形 例如,輸入n=4,輸出如下圖形:

*

***

********

*************j=1…n-i

j=1…2i-1*i=1…nj=1…n-i

j=1…2i-1*i=n-1…1i=123432194例:輸出邊長為n的空心菱形 例如,輸入n=4,輸出如下圖形:

*

**

*********j=1…n-i

j=1…2i-1如果j=1或2i-1*其它i=1…n同左i=n-1…195打印圖形小結(jié)intmain(){

intn,i,j;

scanf(“%d”,&n);for(i=1;i<=n;i++)

{for(j=1;j<=n-i;j++)printf(“”);for(j=1;j<=2*i-1;j++)

printf(“*”);

printf(“\n”);}}*

***

********

****外層循環(huán)控制打印圖形的行數(shù),循環(huán)量即是行數(shù)循環(huán)體內(nèi)是一行內(nèi)打印的各種字符循環(huán)體內(nèi)最后一條語句是回車換行,決定以上內(nèi)容為一行一種連續(xù)字符用一個(gè)循環(huán),字符的個(gè)數(shù)用循環(huán)次數(shù)控制特殊情況特殊處理96

*

**

*********

*

**

*********97例:打印數(shù)字魔方。 例如,輸入n=5,輸出的圖形如下:

12345 23451 34512 45123 51234

基本算法:重復(fù)打印n行。第i

行的第一個(gè)數(shù)字為i,之后依次遞增,但以n為模:aij=(i+j-2)%n+1

輸出項(xiàng)aij與前一項(xiàng)的關(guān)系,或者與行i、列j的關(guān)系98intmain(){inti,j,n;printf("EnterN:");scanf("%d",&n);for(i=1;i<=n;i++)/*控制打印n行*/{for(j=1;j<=n;j++)/*打印行中的數(shù)字*/printf("%d",(i+j-2)%n+1);printf("\n");}}99例:輸出數(shù)字陣列:

1234 5678 9101112 13141516算法分析與設(shè)計(jì): 設(shè)法找到數(shù)字的分布規(guī)律,用循環(huán)的方式自動(dòng)生成。陣列中數(shù)字按行的順序依次是1,2,…16。100#defineN4intmain(){inti,j,k=1;for(i=1;i<=N;i++){for(j=1;j<=N;j++)printf(“%4d”,);printf(“\n”);}}在行、列輸出循環(huán)的基礎(chǔ)上加入一個(gè)自增變量k++101例:輸出數(shù)字陣列:

1234 1213145 1116156 10987算法分析與設(shè)計(jì):

用二維數(shù)組a[n][n]更簡單一些。102例:打印數(shù)字菱形:

4 434 43234 4321234432344344算法分析與設(shè)計(jì):

在實(shí)心菱形基礎(chǔ)上加入一個(gè)自變量k103voidtri(intn,intq){intj,k=n;for(j=1;j<=n-q;j++)printf("");for(j=1;j<=q;j++)printf("%-2d",k--);k++;for(j=q-1;j>=1;j--)printf("%-2d",++k);printf("\n");}intmain(){intm,i;scanf("%d",&m);for(i=1;i<=m;i++)tri(m,i);for(i=m-1;i>=1;i--)tri(m,i);}104例:打印數(shù)字菱形:

1361015第1行 25914第2行 4813 712 11算法分析與設(shè)計(jì):

判斷輸出項(xiàng)aij與行號(hào)i和列號(hào)j之間的關(guān)系。增1增2增3增4增3增4增5增2增4增5增3每行第一個(gè)數(shù)k加當(dāng)前行的行號(hào)i等于下一行第一個(gè)數(shù);當(dāng)前數(shù)m加上該數(shù)所在行號(hào)i和列號(hào)j,等于下一個(gè)數(shù)105intmain(){inti,j,n,m,k=1;scanf(“%d”,&n);for(i=1;i<=n;i++){m=k;for(j=1;j<=n-i+1;j++){printf(“%4d”,m);

m=m+i+j;}printf(“\n”);

k=k+i;}}106打印字符圖形小結(jié)先考慮形狀的輸出——用來控制循環(huán);然后考慮數(shù)字或字符的分布規(guī)律——按照從上到下、從左到右的打印順序,當(dāng)前位置的輸出項(xiàng)與行號(hào)i和列號(hào)j以及前一個(gè)輸出項(xiàng)之間的關(guān)系。107思考:打印回形方陣: 要求:從鍵盤輸入邊長n,輸出回形方陣。例如,輸入n=5,n=6,輸出的圖形如下:

11111 111111 12221 122221 12321n=5 123321n=6 12221 123321 11111 122221 111111108D.i>(n+1)/2j>(n+1)/2C.i>(n+1)/2j<=(n+1)/2B.i<=(n+1)/2j>(n+1)/2A.i<=(n+1)/2j<=(n+1)/2

將圖形分為四個(gè)區(qū):11111 11111112221 12222112321 12332112221 12332111111 122221 111111上三角元素的行號(hào)小于列號(hào),輸出與行號(hào)一致下三角元素的行號(hào)大于列號(hào),輸出與列號(hào)一致1096.6循環(huán)應(yīng)用圖形問題的關(guān)鍵沒有明確的數(shù)學(xué)模型,依靠對圖形的觀察屏幕上的字符只能從上到下逐行顯示,同一行內(nèi),只能從左到右逐字顯示多使用循環(huán),有時(shí)要用到數(shù)組算法的核心問題是確定循環(huán)控制變量i、j的范圍輸出項(xiàng)aij與行i、列j的關(guān)系,或與上一個(gè)輸出項(xiàng)的關(guān)系110編寫程序的實(shí)用步驟建立數(shù)學(xué)模型確定整體控制流程:用順序、分支還是循環(huán)循環(huán)

溫馨提示

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

最新文檔

評論

0/150

提交評論