




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
循環(huán)結構的程序設計1第6章循環(huán)結構的程序設計本章要點循環(huán)語句的執(zhí)行流程不同形式的循環(huán)控制多重循環(huán)問題簡單算法設計2第6章循環(huán)結構的程序設計循環(huán)的基本概念while語句for語句do_while語句轉移語句循環(huán)應用36.1循環(huán)的基本概念 提出問題提問:從鍵盤上輸入10個整數并求和,怎么編程?回答:在程序中寫10個scanf語句,還可以寫%d%d…提問:從鍵盤上輸入500個整數并求和,怎么編程?回答:這個,嗯……???不會讓我寫500個……以上問題的實質是:將scanf函數重復執(zhí)行N遍。我們可以引出一個概念“循環(huán)”,簡單而言:循環(huán)就是不斷反復地執(zhí)行同一段程序。?46.1循環(huán)的基本概念
循環(huán)
反復執(zhí)行同一段程序,直到滿足一定的條件后才停止執(zhí)行該段程序。
C語言中控制循環(huán)的語句:
whilefordo_while5第6章循環(huán)結構的程序設計循環(huán)的基本概念while語句for語句do_while語句轉移語句循環(huán)應用66.2while語句while語句格式while(表達式)語句; 說明:語句可是簡單語句,也可是復合語句。while語句的執(zhí)行流程76.2while語句表達式?執(zhí)行語句成立不成立執(zhí)行while循環(huán)之后的語句循環(huán)控制條件循環(huán)體while(表達式) 語句;8例:從鍵盤輸入10個整數,求這10個整數之和程序主體:count<10?輸入num成立不成立輸出結果total計數器count=0累加器total=0total+=numcount++開始結束while(count<10){}count++;scanf("%d",&num);total+=num;89#include<stdio.h>intmain(){intcount,num,total;
/*count:計數器,num:輸入的整數*/count=0;total=0; /*total:存放累加和*/while(count<10)/*循環(huán)控制條件*/{printf("EntertheNo.%d=",count);/*循環(huán)體*/scanf("%d",&num);total+=num;/*計算累加和*/
count++;
} printf("Total=%d\n",total);}10例:求n的階乘n!(1<=n<=10)程序主體:
while(i<=n){ s*=i;i++;}i<=n?s*=i成立不成立輸出結果計數器i=1累積器s=1i++開始結束遞推公式:f(n)=1 當n=1時f(n)=f(n-1)*n當n>1時116.2while語句#include<stdio.h>intmain(){longs=1; /*s:存放累積結果*/inti=1; /*i:計數器,同時是累積的對象*/while(i<=10)/*循環(huán)控制條件*/{ /*循環(huán)體*/ s*=i; /*計算累積和*/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個數相加10個數相乘13例:分析程序運行結果#include<stdio.h>intmain(){ intn=0; while(n<3) printf(“nis%d\n”,n); n++;}結果:程序將不停的打印“nis0”,直至終止程序無法正常終止的程序,稱為“死循環(huán)”。結論:while語句循環(huán)體中,一定要有能夠對循環(huán)控制條件產生影響的語句,避免出現(xiàn)“死循環(huán)”現(xiàn)象。{}14例:求1413的最后三位數。問題分析:14的13次方已經超出了計算機所能表示的整數范圍乘法規(guī)律:乘積的最后三位的值只與乘數和被乘數的后三位有關C語言中最長的整數是:無符號長整型數:0~429496729510位1410=28925465497612位問題被簡化為求三位數乘法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語句如何一次輸入多個字符或數值例:將從鍵盤輸入的一行字符(回車結束)復制到標準輸出(顯示器)。
回顧字符輸入輸出函數: getchar():調用時,等待用戶按鍵,輸入的字符存入鍵盤緩沖區(qū),直到用戶按Enter為止(Enter即\n也在緩沖區(qū))。輸入Enter后,getchar從輸入流每次讀一個字符,作為其返回值。其它未讀的字符保留在緩沖區(qū),待下一個getchar調用。176.2while語句#include<stdio.h>intmain(){charch;ch=getchar();while(ch!=‘\n’){putchar(ch); ch=getchar();}}ch!=‘\n’?顯示ch成立不成立ch=讀入一個字符ch=讀入下一個字符開始結束ab13cdeab13cdeputchar(ch=getchar());putchar(getchar());186.2while語句#include<stdio.h>intmain(){charch;while((ch=getchar())!=‘\n’) putchar(ch);}一段更簡潔的程序196.2while語句例:輸入若干整數,豎排輸出,當輸入為0時程序結束。如:輸入13-63560輸出: 13 -6
356 scanf(…):調用時,等待用戶輸入,輸入的內容存入鍵盤緩沖區(qū),直到用戶按Enter為止。輸入Enter后,scanf從輸入流每次按格式讀一個單元,作為其返回值。其它未讀的內容保留在緩沖區(qū),待下一個scanf調用。206.2while語句#include<stdio.h>intmain(){intx;scanf(“%d”,&x);while(x){printf(“%d\n”,x); scanf(“%d”,&x);}}scanf()把緩沖區(qū)的內容全部讀完以后,才再次等待用戶從鍵盤輸入輸入:13-63560輸出:13-6356輸入:13-635607輸出:13-6356輸入:13-6216.2while語句循環(huán)嵌套
在循環(huán)體中,又包含有循環(huán)語句。
while { … while {
… }
… }22例:輸出下三角形乘法九九表。
123456789---------------------------------------------12436948121651015202561218243036714212835424981624324048566491827364554637281
假設:行號為i,列號為j
則第i行中一共要輸出i個乘積,每一項為i*j。(1<=i<=9)(1<=j<=i)i=6j=5i*j屏幕上的字符只能從上到下逐行顯示,同一行內,只能從左到右逐字顯示。2223顯示要求
屏幕上的字符只能從上到下逐行顯示,同一行內,只能從左到右逐字顯示。偽代碼(Pseudocode)while(控制顯示n行){while(控制顯示一行中的m個字符){輸出一個需要的字符;列計數器j++;}行數計數器i++;}24 #include<stdio.h>intmain(){inti=1,j;/*i:行計數器j:列計數器*/while(i<=9)/*控制打印表頭*/printf("%4d",i++);printf("\n--------------------------------------\n");i=1;while(i<=9){j=1;/*列計數器置1*/while(j<=i)/*嵌套的二重循環(huán),輸出第i行*/ {printf("%4d",i*j);j++;/*列計數器+1*/}printf("\n");/*一行輸出結束后,輸出\n*/i++;/*行計數器+1*/}}外層循環(huán)體執(zhí)行1次,內層循環(huán)要完整執(zhí)行1次25第6章循環(huán)結構的程序設計循環(huán)的基本概念while語句for語句do_while語句轉移語句循環(huán)應用266.3for語句for語句格式for(表達式1;表達式2;表達式3) 語句;說明:語句可是簡單語句,也可是復合語句。for語句的執(zhí)行流程27循環(huán)初始條件循環(huán)控制條件表達式2?執(zhí)行語句成立不成立執(zhí)行for循環(huán)之后的語句執(zhí)行表達式3執(zhí)行表達式1循環(huán)體
for(表達式1;表達式2;表達式3)語句;for語句等價于下列語句:表達式1;while(表達式2){語句;表達式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語句實現(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);}輸出函數printf中使用了“?”操作,含義相當于:if(j==i) printf("%4d\n",i*j);else printf("%4d",i*j);30for語句的變化形式
for語句中的三個表達式中的任意一個都是可以省略的,但是分號不能省略。省略表達式2,則:
for(表達式1;;表達式3)省略表達式1和表達式3,則:
for(;表達式2;)
據此可得結論:所有用while語句實現(xiàn)的循環(huán)都可以用for語句實現(xiàn)。表達式1、2、3全省略,則:
for(;;)等同于:while(表達式)構成一個死循環(huán)等同于:while(1)316.3for語句
草原上有一對小兔子,它們剛出生后的第1個月就會逐步長大,到了第2個月末就生出一對小兔子。第3個月大兔子會繼續(xù)生一對小兔子,而第2個月出生的小兔子會逐步長大。第4個月時,第1月出生的兔子繼續(xù)生育,第2月出生的小兔子也可以生育一對小兔子了,第3月出生的小兔子則逐步長大……
假設這些草原的兔子非常長壽,可以認為它們不會死亡。請建立數學模型,計算第N個月時,草原上將會有多少對兔子?326.3for語句例:數列1、1、2、3、5、8、13、21、…是著名的菲波那契數列,其遞推通項公式為:
F1=F2=1 Fn=Fn-1+Fn-2 (n>=3)
為求出第N項的值,請編寫程序。 根據遞推通項公式,可用遞推法編寫程序,計算第N項的值。336.3for語句遞推法
由初始的已知條件開始,先計算出第(N-1)步的結果,再利用已知的前(N-1)項結果,按遞推公式(或遵照遞推規(guī)則),推出第N步結果。 遞推法是程序設計中最常用的方法之一,使用遞推法必須有明確的遞推初始值和遞推規(guī)則(遞推公式)。34程序主體f=f2=1;for(i=3;i<=n;i++){f1=f2;f2=f;f=f1+f2;}i<=n?向前傳遞前兩項f1=f2f2=f成立不成立初始化:f=f2=1計算f=f1+f2遞推項:i=3i++數列對應關系:f1,f2,f遞推計算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;/*設置遞推初始值*/for(i=3;i<=n;i++)/*用遞推法計算第N項的值*/{f1=f2;f2=f;f=f1+f2;}printf("No.%dis%d\n",n,f);}36語句中的逗號(,)運算 逗號(,)運算常見的三種用途是:在變量說明表中用來分隔變量,起分隔符的作用,如:inti,j,k,m[3],*p;在函數的參數表中分隔參數。如:printf("n=%d,x=%d\n",n,x);在語句中使用。其形式是:表達式n1,表達式n2; 用逗號分隔開的表達式從左到右進行計算,結果的類型和值是最右邊表達式的類型和值。376.3for語句例:輸出下列字符串:azbycxdwevfugthsirjqkplomn分析:奇數位上的字符從'a'開始逐次遞增,偶數位上的字符從'z'開始逐次遞減。#include<stdio.h>intmain(){chari,j; /*i:奇位字符j:偶位字符*/for(i='a',j='z';i<j;i++,j--) printf("%c%c",i,j);/*輸出兩個字符*/printf("\n");}azbycxdwevfugthsirjqkplomn38第6章循環(huán)結構的程序設計循環(huán)的基本概念while語句for語句do_while語句轉移語句循環(huán)應用396.4do_while語句do_while語句格式
do{ 語句; }while(表達式);do_while語句的執(zhí)行流程406.4do_while語句表達式?執(zhí)行語句成立不成立執(zhí)行while子句之后的語句循環(huán)控制條件循環(huán)體后判斷do{ 語句;}while(表達式);416.4do_while語句do_while語句的特點 與while和for的區(qū)別:
do_while語句先執(zhí)行循環(huán)體然后再判斷循環(huán)控制條件;使用do_while構成的循環(huán),循環(huán)體部分至少要執(zhí)行一次,使用while和for構成的循環(huán),循環(huán)體部分有可能一次也不會執(zhí)行。 do_while語句條件表達式后面的分號不是空語句。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語句例:輸入一個>=0的整數,要求以相反的順序輸出。例如:輸入12345,則輸出為54321。思路:可以從個位開始,按位輸出整數的每一位
intmain(){unsignedintnum;printf("Inputthenumber:");scanf("%d",&num);do{printf("%d",num%10);num/=10; /*num縮小10倍*/}while(num!=0);}簡單轉變?yōu)閣hile或for語句,程序將不能處理數字0。446.4do_while語句例:從鍵盤輸入任意的字符,按下列規(guī)則進行分類計數。第一類‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’第二類‘+’,‘-’,‘*’,‘/’,‘%’,‘=’第三類其它字符當輸入字符‘\’時先計數然后停止接收輸入。45intmain(){intclass1=0,class2=0,class3=0;charch;do{putchar(ch=getch());/*函數的嵌套調用*/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計數*/case'+':case'-':case'*':case'/':case'%':case'=':class2++;break;/*對分類2計數*/default:class3++;break;/*對分類3計數*/}}while(ch!='\\');printf("class1=%d,class2=%d,class3=%d\n",class1,class2,class3);}46循環(huán)語句小結C語言提供三種循環(huán):for、while、do_whilefor和while先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件;while和do-while語句的條件表達式只有1個,for語句有3個表達式,表達式2是條件表達式;while、do-while、for可以相互替換使用;while語句多用于不需要賦初值的或循環(huán)次數不定的情況;
for語句多用于要賦初值或循環(huán)次數固定的情況;
do-while語句多用于至少要運行一次的循環(huán);循環(huán)語句可串可并可嵌套,但不能交叉。47循環(huán)語句小結為了保證循環(huán)正常運行,應該特別注意:循環(huán)控制條件控制條件的初始狀態(tài)(初始值)循環(huán)體內部對控制條件的影響以上三個方面相互配合,相互影響,共同完成循環(huán)控制48第6章循環(huán)結構的程序設計循環(huán)的基本概念while語句for語句do_while語句轉移語句循環(huán)應用496.5轉移語句轉移語句的作用 改變程序的運行流程C語言轉移語句breakcontinuegotoreturn506.5.1break語句格式 break;功能在switch語句中結束case子句,使控制轉到switch語句之外。在循環(huán)語句的循環(huán)體中使用,結束循環(huán)過程,使控制轉移到整個循環(huán)語句之外的下一條語句處。51break語句的執(zhí)行流程表達式?成立不成立后續(xù)語句break表達式2?成立不成立后續(xù)語句執(zhí)行表達式3執(zhí)行表達式1break表達式?成立不成立后續(xù)語句breakwhile語句for語句do-while語句52例:求555555的約數中最大的三位數intmain(){intj;longn;printf("Pleaseinputnumber:");scanf("%ld",&n);
/*所求的約數的可能取值是從999到100,j從大到小*/for(j=999;j>=100;j--)if(n%j==0)/*若能被j整除,則j是約數*/{printf("3digitsin%ld=%d\n",n,j); break;/*控制退出循環(huán)*/}return0;}536.5.1break語句break語句使用注意在嵌套循環(huán)中,break語句僅能退出一層(當前層)循環(huán);若在循環(huán)語句中包含了switch語句,那么switch語句中的break語句僅能使控制退出switch語句;break語句并不是程序設計中必不可少的語句,可以通過改變程序的結構去掉。546.5.2continue語句格式continue;功能
continue語句僅能在循環(huán)語句中使用:它的作用不是結束循環(huán),而是開始一次新的循環(huán)。對于for語句,將控制轉到執(zhí)行表達式3和條件測試部分;對于while和do-while語句,將控制轉到條件測試部分;從邏輯上講,適當改變程序的結構就可以不需要使用continue語句。55continue語句的執(zhí)行流程表達式?成立不成立后續(xù)語句continue表達式2?成立不成立后續(xù)語句執(zhí)行表達式3執(zhí)行表達式1continue表達式?成立不成立后續(xù)語句continuewhile語句for語句do-while語句56例:輸入10個整數,求其中正數的個數及平均值,精確到小數點后兩位。
intmain(){inti,count=0,j,sum=0;for(i=1;i<=10;i++){printf("Inputinteger:");scanf("%d",&j);
if(j<=0) continue;
/*結束本次循環(huán),不進行后續(xù)操作*/count++;/*計數器*/sum+=j;/*求累加和*/}if(count>0)printf("Plusnumber:%d,averagevalue:%.2f", count,1.0*sum/count);elseprintf("Plusnumber:0,averagevalue:0");}576.5.3goto語句格式 goto標號;功能
將程序控制轉移到標號所指定的語句處繼續(xù)執(zhí)行。標號的唯一功能就是作為goto語句的目標。標號的作用域是它所在的整個函數。注意:為了保證程序的結構化,不允許使用向上goto語句586.5.3goto語句例:已知一首項大于0的等差遞增數列的前四項和為26,前四項的積為880,求這數列。設數列的第一項為a(a>0),公差為d(d>0)。則該數列滿足條件:a+(a+d)+(a+2*d)+(a+3*d)=4*a+6*d=26a*(a+d)*(a+2*d)*(a+3*d)=880可以推出,首項a和公差d的取值范圍為:1<=a<=51<=d<=3可以使用窮舉的方法,在首項a和公差d的取值范圍內進行判斷。596.5.3goto語句intmain(){inta,x,y,d,i;for(a=1;a<=5;++a)
/*在a的范圍內窮舉*/for(d=1;d<=3;++d)/*在d的范圍內窮舉*/{x=a+(a+d)+(a+2*d)+(a+3*d);/*前四項的和*/ y=a*(a+d)*(a+2*d)*(a+3*d);/*前四項的積*/ if(x==26&&y==880)/*若滿足條件*/
goto
out;/*退出二重循環(huán)*/}out:
/*語句標號*/for(i=0;i<=20;++i)/*輸出運行結果*/printf("%d,",a+i*d);}606.5.3goto語句intmain(){inta,x,y,d,i,flag=1;/*flag:標志變量*/for(a=1;a<=5&&flag;++a)/*flag!=0是進行循環(huán)*/for(d=1;d<=3&&flag;++d){x=a+(a+d)+(a+2*d)+(a+3*d);/*前四項的和*/ y=a*(a+d)*(a+2*d)*(a+3*d);/*前四項的積*/ if(x==26&&y==880)/*若滿足條件*/ {for(i=0;i<=20;++i)/*輸出結果*/printf("%d,",a+i*d);
flag=0;
/*控制退出二重循環(huán)*/}}}通過增加標志變量可以有效地控制循環(huán)616.5.4return語句格式格式1:return;格式2:return(表達式);功能return語句使程序從被調用函數中返回到調用函數的調用處繼續(xù)運行;如果return后跟一表達式,則該表達式的值會從被調用函數中帶回到調用它的函數,稱為返回值。幾個程序片段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子函數power:計算x的y次方不要用標準庫函數pow處理整型intm=0;scanf("%d",&n);do{m=m*10+n%10;n/=10;}while(n!=0);64求反序數例:求最大最小數的算術運算結果用例輸入:15,1,11,2,0,3,+,=輸出:15+0=15如何用字符輸入形式讀入一個整數?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等也將不作為輸入結束標志。charch;while((ch=getchar())!='=')putchar(ch);67如何判斷“沒有任何一項匹配上”?6869第6章循環(huán)結構的程序設計循環(huán)的基本概念while語句for語句do_while語句轉移語句循環(huán)應用70程序設計的一般步驟分析題意,明確問題的性質數值問題/非數值問題建立問題的描述模型數學模型/過程模型設計/確定算法數學問題:數值分析非數學問題:數據結構/算法分析與設計一般方法:窮舉/遞推/遞歸/…...編程調試分析運行結果716.6循環(huán)應用窮舉法
72例:百錢百雞問題中國古代數學家張丘建在他的《算經》中提出了著名的“百錢百雞問題”:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,翁、母、雛各幾何?
問題分析與算法設計設:要買x只公雞,y只母雞,z只小雞,可得到方程:x+y+z=100① 5x+3y+z/3=100②取值范圍:0<=x,y,z<=100
可以采用窮舉法求解:將變量x、y、z的所有取值可能代入方程進行計算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);}運行結果: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開始結束74丟失重要條件:z應該能夠被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);}運行程序,正確的結果: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例:新娘和新郎問題:三對情侶參加婚禮,三個新郎為A、B、C,三個新娘為X、Y、Z。有人不知道誰和誰結婚,于是詢問了其中的三位,聽到的回答是這樣的:A說他將和X結婚;X說她的未婚夫是C;C說他將和Z結婚。這人聽后知道他們在開玩笑,全是假話。請編程找出誰將和誰結婚。問題分析與算法設計:設:A、B、C三人用1、2、3表示,將X和A結婚表示為x=1,將Y不與A結婚表示為y!=1。則:x!=1A不與X結婚x!=3X的未婚夫不是Cz!=3C不與Z結婚 題意還隱含: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例:設有一個正整數X,當X加上100后得到的數Y是一個正整數的平方,然后用Y再加上68,又是另外一個正整數的平方,你能算出X為多少嗎?問題分析與算法設計: 根據題目直接列方程:
y=x+100 y=m*m y+68=n*n 取值范圍:x>0;n>m>10的整數79intmain(){intx,y,m,flag; /*flag:標志變量*/for(x=0,flag=1;flag;x++)/*窮舉x*/{y=100+x;/*計算y*/for(m=10;m*m<y;m++);if(m*m==y)/*判斷y是否為一個數的平方*/{for(;m*m<y+68;m++);if(m*m==y+68)/*判斷y+68*/{printf("%d\n",x);flag=0;/*flag置0,結束循環(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:標志變量*/for(m=10,flag=1;flag;m++){/*通過窮舉m,直接構造平方數y*/for(n=10;n*n<m*m+68;n++);/*判斷m*m+68是否為平方數*/if(n*n==m*m+68){printf("%d\n",m*m-100);flag=0;/*flag置0,結束循環(huán)*/}}}窮舉m、n826.6循環(huán)應用窮舉法的關鍵判斷問題是否適合使用窮舉法明確窮舉的終止條件窮舉的對象(變量)的范圍注意效率——減少嘗試次數83求555555的約數中最大的三位數求不超過n的最大素數求首項大于0的等差數列:前四項和為26,前四項的積為880從鍵盤上任意輸入一個正整數,要求判斷該正整數是否是另一個整數的平方。百錢百雞新娘和新郎其它排列組合問題親密數、黑色星期五、求各位數字之和等于5且能被5整除的整數、馬戲團觀眾人數、求等于其各位數字的階乘之和的正整數、求滿足條件的等差數列、乒乓球比賽對陣方案…846.6循環(huán)應用圖形問題85例:在一行中輸出n個*號。
例如,輸入n=4,輸出的圖形如下:****基本語句: 輸出一個*號:printf(“*”); 或putchar(‘*’);基本算法: 1.輸入n 2.重復輸出n個*; 3.輸出一個\nscanf(“%d”,&n);while(n>0){printf(“*”);n--;}printf(“\n”);86例:輸出邊長為n的正方型 例如,輸入n=4,輸出如下圖形:****************算法分析與設計:
1.輸入n; 2.重復輸出n行,每行輸出n個*; 加細一: 1.輸入n; 2.for(i=1;i<=n;i++) 輸出一行中的n個*;87 加細二: 1. 輸入n; 2. for(i=1;i<=n;i++) { 輸出n個*
; 換新行; } 加細三: 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個*號*/ printf(“*”);printf(“\n”);}}分析方法——逐步求精法 對于比較復雜問題,不可能一下得到程序,可以先將簡單的部分明確出來,再逐步對復雜部分進行細化,一步一步推出完整程序。89例:輸出邊長為n的平行四邊形
例如,輸入n=4,輸出如下圖形:
****************算法分析與設計: 在正方型每行*號的前面先多輸出若干個空格。對于第i行,1<=i<=n,則應先輸出個空格。
n-i90intmain(){intn,i,j;scanf(“%d”,&n);for(i=1;i<=n;i++) /*控制輸出n行*/{for(j=1;j<=n-i;j++)/*控制輸出n-i個空格*/printf(“”);for(j=1;j<=n;j++)/*輸出一行中的n個*號*/ printf(“*”);printf(“\n”);}}關鍵在于找出每行要輸出的空格和*的個數91i=1n…j=ii=1n…i+j=n+1**************
***
**
*j控制輸出i個*j:i-1個
**********
*
**
******
*j:n-i+1個*j:n-i個
j:n-i+1個*j:i個*j=n-i+192例:輸出n行用*組成的等腰三角形 例如,輸入n=4,輸出如下圖形:
*
***
********
****j=1…n-i
j=1…2i-1*(“\n”)i=1…ni個*i-1個*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打印圖形小結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)控制打印圖形的行數,循環(huán)量即是行數循環(huán)體內是一行內打印的各種字符循環(huán)體內最后一條語句是回車換行,決定以上內容為一行一種連續(xù)字符用一個循環(huán),字符的個數用循環(huán)次數控制特殊情況特殊處理96
*
**
*********
*
**
*********97例:打印數字魔方。 例如,輸入n=5,輸出的圖形如下:
12345 23451 34512 45123 51234
基本算法:重復打印n行。第i
行的第一個數字為i,之后依次遞增,但以n為模:aij=(i+j-2)%n+1
輸出項aij與前一項的關系,或者與行i、列j的關系98intmain(){inti,j,n;printf("EnterN:");scanf("%d",&n);for(i=1;i<=n;i++)/*控制打印n行*/{for(j=1;j<=n;j++)/*打印行中的數字*/printf("%d",(i+j-2)%n+1);printf("\n");}}99例:輸出數字陣列:
1234 5678 9101112 13141516算法分析與設計: 設法找到數字的分布規(guī)律,用循環(huán)的方式自動生成。陣列中數字按行的順序依次是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)的基礎上加入一個自增變量k++101例:輸出數字陣列:
1234 1213145 1116156 10987算法分析與設計:
用二維數組a[n][n]更簡單一些。102例:打印數字菱形:
4 434 43234 4321234432344344算法分析與設計:
在實心菱形基礎上加入一個自變量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例:打印數字菱形:
1361015第1行 25914第2行 4813 712 11算法分析與設計:
判斷輸出項aij與行號i和列號j之間的關系。增1增2增3增4增3增4增5增2增4增5增3每行第一個數k加當前行的行號i等于下一行第一個數;當前數m加上該數所在行號i和列號j,等于下一個數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打印字符圖形小結先考慮形狀的輸出——用來控制循環(huán);然后考慮數字或字符的分布規(guī)律——按照從上到下、從左到右的打印順序,當前位置的輸出項與行號i和列號j以及前一個輸出項之間的關系。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
將圖形分為四個區(qū):11111 11111112221 12222112321 12332112221 12332111111 122221 111111上三角元素的行號小于列號,輸出與行號一致下三角元素的行號大于列號,輸出與列號一致1096.6循環(huán)應用圖形問題的關鍵沒有明確的數學模型,依靠對圖形的觀察屏幕上的字符只能從上到下逐行顯示,同一行內,只能從左到右逐字顯示多使用循環(huán),有時要用到數組算法的核心問題是確定循環(huán)控制變量i、j的范圍輸出項aij與行i、列j的關系,或與上一個輸出項的關系110編寫程序的實用步驟建立數學模型確定整體控制流程:用順序、分支還是循環(huán)循環(huán)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寵物飲食成分對健康的影響試題及答案
- 二手車市場調研與分析試題及答案
- 日常診療管理流程圖解
- 美容師考試與法律法規(guī)相關知識及試題答案
- 不同寵物的營養(yǎng)知識庫建設試題及答案
- 探討新藥研發(fā)中的挑戰(zhàn)與解決策略試題及答案
- 2024年國家食品政策調整分析試題及答案
- 深入研究2024計算機基礎考題試題及答案
- 2024年美容師考試對于創(chuàng)新能力的全面解讀試題及答案
- 浙江省杭州市重點學校2022-2023學年高一下學期期中考試生物學試題(含答案)
- 廠房電費收租合同范例
- 2024年南京市事業(yè)單位專項招聘退役大學生士兵筆試真題
- 增資擴股方案模板
- 鵝產業(yè)綠色循環(huán)發(fā)展-深度研究
- “三新”背景下高中文言文教學難點突破策略
- (完整版)Camtasia-Studio使用教程
- 監(jiān)理月報(水利工程)
- MOOC 計算機組成與CPU設計實驗-江蘇大學 中國大學慕課答案
- 第一次月考測試卷(試題)-2023-2024學年人教版六年級數學下冊
- 生產車間5S稽核評分表
- 商務禮儀培訓52873734(PPT143頁)
評論
0/150
提交評論