北京工業大學C語言課件3-循環結構_第1頁
北京工業大學C語言課件3-循環結構_第2頁
北京工業大學C語言課件3-循環結構_第3頁
北京工業大學C語言課件3-循環結構_第4頁
北京工業大學C語言課件3-循環結構_第5頁
已閱讀5頁,還剩66頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計第2章循環結構2.1求解100以內所有偶數的和(for語句)2.2求解n!(for語句、while語句)2.3求解兩個數的最大公約數(while語句)2.4用格里高利公式求π的近似值(do-while語句)2.5統計一個整數的位數(do-while語句)2.6判斷素數(break和continue語句)2.7求1!+2!+….+100!(嵌套循環)2.8說謊族和誠實族(綜合案例)本章要點使用for、while和do-while語句實現循環結構?while和do-while語句有什么不同?如何使用break語句處理多循環條件?如何實現多重循環?2.1求偶數和求解100以內所有偶數的和。sum=2+4+6+…2.1.1問題分析2.1.2for語句2.1.1問題分析

求在一定范圍內(1~100)、滿足一定條件(偶數)的若干整數的和,求累加和。思路:設置一個變量(sum),其初值為0,然后在1~100的數中(i)尋找偶數,將它們一個一個累加到sum中。一步累加:sum=sum+i;重復累加,用循環語句實現,在循環過程中:(1)判別i是不是偶數:用分支控制語句來實現。(2)對循環次數進行控制:通過i值的變化sum=0i=1i<=100i是偶數?sum=sum+ii=i+1輸出sum真真假假#include<stdio.h>intmain(void){ inti,sum=0;

for(i=1;i<=100;i++)

if(i%2==0)sum=sum+i;printf(“%d\n",sum);return0;}

程序實現for(表達式1;表達式2;表達式3)

循環體語句實現C語句的重復執行2.1.2for語句3個表達式、循環體語句!書寫順序和執行順序不同!表達式1只執行一次循環(控制)變量:for語句中,通過改變或判斷某個變量的值來控制循環的執行for(i=1;i<=100;i++)

{if(i%2==0)sum=sum+i;}for語句中的循環變量賦初值判斷其值改變其值for(i

=1;

i

<=100;

i

++){if(i%2==0)sum=sum+i;}表達式1:給循環變量賦初值,指定循環的起點。i=1表達式2:給出循環的條件,判斷循環是否達到終點?

i<=100表達式3:設置循環的步長,改變循環變量的值,從而可改變表達式2的真假性。i++循環體語句:被反復執行的語句,一條語句。for語句的說明課堂練習一1.求200以內奇數的累加和;求200以內奇數的累加和#include<stdio.h>intmain(void){ inti,sum=0;

for(i=1;i<=200;i++)

if(i%2!=0)sum=sum+i;printf(“%d\n",sum);return0;}

2.2求解n!n!=1×2×3×4×…×n2.2.1問題分析2.2.2for語句、while語句2.2.1問題分析

求在一定范圍內(1~n)、若干整數的乘積,求累乘。思路:設置一個變量(fact),其初值為1,然后在1~n的數中依次將它們累乘到fact中。乘積操作:fact=fact*i;重復累乘,用循環語句實現,在循環過程中通過i值的變化對循環次數進行控制;分別使用for語句和while語句實現循環結構;求解n!#include<stdio.h>main(){inti,n,fact;printf("inputn:");scanf("%d",&n);fact=1;for(i=1;i<=n;i++)fact=fact*i;printf(“%d!=%d\n",n,fact);return0;

}課堂練習二鍵盤輸入5個整數,統計其中能被3整除的數的個數。統計能被3整除的數的個數#include<stdio.h>intmain(void){ inti,number,count=0;

for(i=1;i<=5;i++){scanf(“%d”,&number);if(number%3==0)count=count+1;

}printf(“%d\n",count);return0;}

求1+2+3+……+n#include<stdio.h>intmain(void){inti,sum;printf(“Entern:");scanf("%d",&n);sum=0;for(i=1;i<=n;i++)

sum=sum+i;printf(“sum=%d”,sum);return0;}求1+1/2+1/3+……+1/n#include<stdio.h>intmain(void){inti;doublesum;

printf(“Entern:");scanf("%d",&n);sum=0;for(i=1;i<=n;i++)

sum=sum+1.0/i;printf(“sum=%f”,sum);return0;}求前n項和,即循環n次,每次累加1項。for(i=1;i<=n;i++)sum=sum+item

(第i項)

item=1.0/(2*i-1)求1+1/3+1/5+…的前n項和#include<stdio.h>intmain(void){inti,n; doubleitem,sum;printf(“Entern:"); scanf("%d",&n); sum=0; for(i=1;i<=n;i++){ item=1.0/(2*i-1);/*計算第i項的值*/ sum=sum+item;/*累加第i項的值*/ } printf("sum=%f\n",sum);return0;}源程序求1+1/3+1/5+…求前n項和,即循環n次,每次累加1項。for(i=1;i<=n;i++)sum=sum+item

(第i項)item=flag*1.0/denominatordenominator=denominator+2flag=-flag求1-1/3+1/5-…的前n項和item=flag*1.0/(2*i-1)flag=-flag#include<stdio.h>intmain(void){intdenominator,flag,i,n;doubleitem,sum;printf(“Entern:");scanf("%d",&n); flag=1;denominator=1; sum=0;for(i=1;i<=n;i++){

item=flag*1.0/denominator;/*計算第i項的值*/ sum=sum+item;/*累加第i項的值*/flag=-flag;/*準備下一次循環*/denominator=denominator+2;

} printf("sum=%f\n",sum);return0;}編寫程序,輸入一個正整數n,計算1-2/3+3/5-4/7+5/9-6/11+...的前n項之和。輸入10個字符,統計其中英文字母、數字字符和其他字符的個數。課堂練習三#include<stdio.h>intmain(void){intdigit,i,letter,other;

charch;

digit=letter=other=0;printf(“Enter10characters:");

for(i=1;i<=10;i++){

ch=getchar();/*從鍵盤輸入一個字符,賦值給變量ch*/

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

letter++;

elseif(ch>='0'&&ch<='9')/*如果ch是數字字符*/

digit++;

else

other++;}printf("letter=%d,digit=%d,other=%d\n",letter,digit,other);return0;}統計其中英文字母、數字字符和其他字符的個數#include<stdio.h>main(){inti,n,fact;printf("inputn:");scanf("%d",&n);fact=1;for(i=1;i<=n;i++)fact=fact*i;printf(“%d!=%d\n",n,fact);return0;

}#include<stdio.h>main(){inti,n,fact;printf("inputn:");scanf("%d",&n);fact=1;i=1;while(i<=n){fact=fact*i;i++;}printf(“%d!=%d\n",n,fact);return0;

}for語句實現while語句實現While語句--求解n!2.2.2while語句while(條件)

循環體語句;真假while下一條語句表達式循環體語句循環條件循環體一條語句while語句和for語句都是在循環前先判斷條件while語句說明表達式1;while(表達式2){

for的循環體語句;

表達式3;}把for語句改寫成while語句for(表達式1;表達式2;表達式3)

循環體語句while和for的比較for(i=1;i<=n;i++)

sum=sum+i;i=1;

循環變量賦初值while(i<=n)循環條件

{

sum=sum+i;

i++;循環變量的改變

}循環體課堂練習四輸入一個正整數n,再輸入n個學生的成績,計算平均分,并統計不及格學生的人數。計算平均分,并統計不及格學生的人數#include<stdio.h>intmain(void){inti,n;

doublegrade,total;

num=0;total=0; scanf("%d",&n);i=1;while(i<=n){scanf(“%lf”,&grade);

total=total+grade;

if(grade<60)count++;i++; }

if(n!=0){printf(“Gradeaverageis%.2f\n",total/n);printf("Numberoffailuresis%d\n",count);} elseprintf("Gradeaverageis0\n");return0;}思考:如果學生個數n事先不確定,當輸入的成績小于等于0時,表示輸入結束,如何改?2.3求解最大公約數輸入兩個整數,求解這兩個數的最大公約數。最大公約數:是能夠同時整除這兩個整數的最大的正整數。2.3.1問題分析2.3.1問題分析

采取輾轉相除法求兩個數的最大公約數,輾轉相除法基于如下原理:兩個整數的最大公約數等于其中較小的數和兩數相除余數的最大公約數。思路:將num1和num2賦值給變量a和b。判斷條件b!=0是否滿足,如果滿足,重復執行操作:temp=a%b,a=b,b=temp。如果不滿足,即b=0,則輸出a的值,即為num1和num2的最大公約數;#include<stdio.h>main(){intnum1,num2;inta,b,temp;printf("Inputnum1&num2:");scanf("%d%d",&num1,&num2);a=num1;b=num2;while(b!=0){temp=a%b;a=b;b=temp;}if(num1!=0&&num2!=0)printf("%d\n",a);}2.4用格里高利公式求π的近似值使用格里高利公式求π的近似值,要求精確到最后一項的絕對值小于10–4。2.4.1問題分析2.4.2do-while語句2.4.1問題分析

這是一個數列求和的問題,即求累加和。關鍵點1:數列的通項如何表示?item=flag*1.0/i;flag=-flag;i=i+2;關鍵點2:循環繼續的條件?精確到最后一項的絕對值小于10–4

,循環次數不確定#include<stdio.h>#include<math.h>main(){doubleitem,sum,pi;intflag,i;i=1;flag=1;sum=0;do{item=flag*1.0/i;sum=sum+item;flag=-flag;i=i+2;}while(fabs(item)>=0.0001);pi=sum*4;printf("pi=%lf\n",pi);}2.4.2do-while語句do{

循環體語句}

while(表達式)先循環后判斷真假表達式循環體語句do-while的下一條語句while是先判別條件,再決定是否循環;do-while是先至少循環一次,然后再根據循環的結果決定是否繼續循環。while和do-while的比較真假表達式循環體語句do-while的下一條語句真假while的下一條語句表達式循環體語句循環結構程序設計循環程序的實現要點:歸納出哪些操作需要反復執行?

循環體這些操作在什么情況下重復執行?循環條件選用合適的循環語句forwhiledo-while循環具體實現時考慮(循環條件):事先給定循環次數,首選for通過其他條件控制循環,考慮while或do-while課堂練習五2.輸入一批正整數(以零或負數做結束標記),求其中偶數的累加和。1.2.5統計一個整數的位數從鍵盤讀入一個整數,統計該數的位數。2.5.1問題分析2.5.2do-while語句intmain(void){intcount,number;count=0;printf("Enteranumber:");scanf("%d",&number);if(number<0)number=-number;do{

number=number/10;

count++; }while(number!=0);printf("Itcontains%ddigits.\n",count);return0;}程序實現Enteranumber:12534Itcontains5digits.Enteranumber:-99Itcontains2digits.Enteranumber:0Itcontains1digits.while(number!=0){

number=number/10;

count++;}逆序輸出將一個正整數逆序輸出,例如鍵盤輸入一個正整數12356,屏幕輸出65321,逆序輸出各個位數上的數字。逆序問題:將一個正整數逆序輸出確定:循環條件和循環體(循環不變式)

123455432112345%10=512345/

10=

1234

1234%

10=4

1234

/

10=

123

123

%

10=3

123

/

10=

12

12

%

10=2

12

/

10=

1

1

%

10

=

1

1

/

10

=

0結束循環不變式x%10x=x/10循環結束條件x==0scanf(“%d”,&x);while(x!=0){digit=x%10;x=x/10;printf("%d",digit);}用do-while實現?2.6判斷素數輸入一個正整數m,判斷它是否為素數。2.6.1問題分析2.6.2break語句和continue語句2.6.1問題分析算法:除了1和m,不能被其它數整除。設i取值[2,m-1]如果m不能被該區間上的任何一個數整除,即對每個i,m%i都不為0,則m是素數只要找到一個i,使m%i為0,則m肯定不是素數m%2%3%4%5%(m-1)不是素數||=0=0是素數&&!=0!=0m不可能被大于m/2的數整除

i取值[2,m-1]、[2,m/2]、[2,]for(i=2;i<=m/2;i++)

if(m%i==0)break;/*如果m能被某個i整數,則m不是素數,提前結束循環*/if(i>m/2)printf(“yes\n”)/*如果循環正常退出,說明m不能被任何一個i整除,則m是素數*/elseprintf("no\n”);intmain(void){inti,m; printf(“Enteranumber:");

scanf("%d",&m); for(i=2;i<=m/2;i++)

if(m%i==0)break;

if(i>m/2&&m!=1)

printf("%disaprimenumber!",m); elseprintf("No!\n"); }Enteranumber:9NoEnteranumber:1111isaprimenumber!for(i=2;i<=m/2;i++)

if(m%i==0)printf("No!\n");elseprintf("%disaprimenumber!\n",m);循環條件?循環的結束條件?2.6.2break語句while(exp){

語句1

if(expb)break;

語句2}真假

exp語句1假

expb

語句2循環體真for(i=2;i<=m/2;i++)

if(m%i==0)break;if(i>m/2)

printf("Yes");elseprintf("No!\n");當循環有多個出口時:表示循環條件區分結束條件continue語句while(exp){語句1

if(expb)continue;

語句2}真假

exp語句1假expb

語句2循環體真跳過continue后面的語句,繼續下一次循環break和continue#include"stdio.h"intmain(void){charc;inti;for(i=0;i<10;i++){c=getchar();if(c=='\n')break;putchar(c);}}abc↙efgh↙123↙abcabcefgh1continue;break和continue以下程序段輸出100~200之間所有能被3整除的數。for(i=100;i<=200;i++){ if(i%3!=0) continue; printf(“%d”,i);}for(i=100;i<=200;i++)if(i%3==0)printf(“%d”,i);課堂練習五求100以內的全部素數,每行輸出10個。求100以內的全部素數,每行輸出10個for(m=2;m<=100;m++)if(m是素數)printf("%d",m);n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n)printf("yes\n")elseprintf("no\n”);for(m=2;m<=100;m++){n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n)printf("%d",m)}#include<stdio.h>#include<math.h>intmain(void){intcount,i,m,n;count=0;

for(m=2;m<=100;m++){n=sqrt(m);

for(i=2;i<=n;i++)

if(m%i==0)break;if(i>n){ /*如果m是素數*/

printf("%6d",m);count++;/*每行10個的處理*/

if(count%10==0)printf(“\n”);}}}

23571113171923293137414347535961677173798389972.7求1!+2!+….+100!for(i=1;i<=100;i++){

item=i!sum=sum+item;}2.7.1嵌套循環用循環計算i的階乘2.7.1嵌套循環for(i=1;i<=100;i++){

item=i!sum=sum+item;}for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}#include<stdio.h>intmain(void){ inti,j; doubleitem,sum;

sum=0;

for(i=1;i<=100;i++){item=1;

for(j=1;j<=i;j++) item=item*j; sum=sum+item; }

printf("1!+2!+3!+…+100!=%e\n",sum);}分析嵌套循環的執行過程for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}外層循環變量i的每個值內層循環變量j

變化一個輪次;內外層循環變量不能相同分別用i

和jfor(i=1;i<=100;i++)for(j=1;j<=i;j++) printf("%d%d\n",i,j);2.8誠實族和說謊族誠實族和說謊族是來自兩個荒島的不同民族,誠實族的人永遠說真話,而說謊族的人永遠說假話。

有一天小明遇到來自這兩個民族的三個人,為了調查這三個人都是什么族的,小明問了他們一個問題,以下是他們的對話:問:“你們是什么族?”,第一個人答:“我們之中有兩個來自誠實族。”第二個人說:“不要胡說,我們三個人中只有一個是誠實族的。”第三個人聽了第二個人的話后說:“對,就是只有一個誠實族的。”請根據他們的回答判斷他們分別是哪個族的1.問題分析

三個人分別是誠實族還是說謊族?2.解題思路

枚舉法:將三個人可能出現的組合枚舉一遍,找出滿足條件的解。

解題思路定義變量a,b,c分別表示3個人;確定每個人的取值范圍:0或1(1代表誠實族,0代表說謊族);對三個人的所有組合方式進行遍歷,找出滿足條件的解;三重嵌套循環,遍歷a,b,c的所有組合for(a=0;a<=1;a++)for(b=0;b<=1;b++)for(c=0;c<=1;c++)循環體:檢查是否滿足條件(a&&a+b+c==2||!a&&a+b+c!=2)&&(b&&a+b+c==1||!b&&a+b+c!=1)&&(c&&a+b+c==1||!c&&a+b+c!=1)#include<stdio.h>main(){inta,b,c;for(a=0;a<=1;a++)/*窮舉各種可能性*/for(b=0;b<=1;b++)for(c=0;c<=1;c++)if((a&&a+b+c==2||!a&&a+b+c!=2)&&(b&&a+b+c==1||!b&&a+b+c!=1)&&(c&&a+b+c==1||!c&&a+b+c!=1)){printf("Aisa%s.\n",a?"honest":"liar");printf("Bisa%s.\n",b?"honest":"liar");printf("Cisa%s.\n",c?"honest":"liar");}}課堂練習六輸入一批學生成績,求最高分和平均分(當輸入的成績為負數時,輸入結束)。某地需要搬運磚塊,已知男人一人搬3塊,女人一人搬2塊,小孩兩人搬一塊。問用45人正好搬45塊磚,有多少種搬法?輸入一批學生成績,求最高分和平均分#include<stdio.h>intmain(void){intmark,max;printf(“Entermarks:");scanf("%d",&mark);/*讀入第一個成績*/

max=mark;

溫馨提示

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

評論

0/150

提交評論