C語言程序設計課件第3章算法與控制語句_第1頁
C語言程序設計課件第3章算法與控制語句_第2頁
C語言程序設計課件第3章算法與控制語句_第3頁
C語言程序設計課件第3章算法與控制語句_第4頁
C語言程序設計課件第3章算法與控制語句_第5頁
已閱讀5頁,還剩120頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1教學目標初步理解算法的概念和特點掌握常用問題的算法掌握用流程圖表示算法了解結構化程序設計的方法掌握格式化輸入輸出函數(shù)的用法掌握分支結構的程序設計,理解分支語句的嵌套掌握循環(huán)結構的程序設計及其相互嵌套理解break和continue的控制能夠編寫較復雜的程序結合課程思政導引給定三個數(shù),判斷三角形的形狀學習委員的煩惱(考試成績統(tǒng)計-短信程序)確定小偷:甲、乙、丙、丁4人為偷竊嫌疑犯,只有一個是真正的小偷,在審訊過程,四人都有可能說真話或假話。甲:乙沒有偷、丁偷的;乙:我沒有偷,丙偷的;丙:甲沒有偷,乙偷的;?。何覜]有偷;請推斷誰是小偷。2計算思維導論的例子秦九韶算法計算多項式輾轉相除法求567與405的最大公約數(shù)343.1算法初步3.2C語言的標準輸入和輸出3.3條件語句3.4多分支語句3.5循環(huán)語句3.6轉移語句3.7綜合應用53.1算法初步三種基本結構算法的表示算法舉例6三種基本結構順序結構:根據(jù)操作的先后順序執(zhí)行7選擇(分支)結構:根據(jù)某個給定條件進行判斷,條件為真或假時分別執(zhí)行不同的操作8循環(huán)結構:根據(jù)條件的真或假反復執(zhí)行某些操作9三種基本結構的特點:只有一個入口和一個出口結構內的每一部分都有可能被執(zhí)行到結構內不存在“死循環(huán)”10算法的表示自然語言傳統(tǒng)流程圖N-S流程圖偽代碼計算機語言

11傳統(tǒng)流程圖12計算機語言#include<stdio.h>intmain(){ inti,n,s=0; scanf("%d",&n); i=1; while(i<=n) { s=s+i; i++; } printf("s=%d\n",s); return0;}13算法舉例例3.1輸入三個數(shù)表示三條邊,判斷三角形的形狀分析:都為正數(shù)兩邊之和大于第三邊三邊相等:正三角形有兩邊相等:等腰三角形其它三角形思考:如何從角來判斷是銳角三角形、直角三角形、鈍角三角形?14例3.2:求n!分析:n!=1*2*3*…*ni=1,p=1p=p*ii=i+1直到i>n15例3.3:判斷某一年是否為閏年。分析:年份能被4整除,如果是整百年還要被400整除16例3.4:輸入一個正整數(shù),將它反位輸出(如輸入12345,輸出54321)。分析:采用數(shù)位分離方法判斷輸入的數(shù)n是否為0不為0,除以10取余得到最低位數(shù)n整除10后,可減少數(shù)位,為取下一位數(shù)做準備思考:如何組成一個反位數(shù)、判斷是否為回文數(shù)?17例3.5:判斷一個整數(shù)n是否為素數(shù)分析:素數(shù):只能被1和本身整除只需判斷都不能被2~(n-1)整除就可改進:可以判斷都不能被2~(n/2)整除就可或2~18例3.6:對三個整數(shù)a、b、c按從小到大排序。分析:兩兩比較,將最小的賦給a,第二小的賦給b,最大賦給ca與b比較,小的給a,大給ba與c比較,小的給a,大給cb與c比較,小的給b,大給c補充算法問題判斷“回文數(shù)或回文字符串”分解質因子多個數(shù)據(jù)的排序元素左移或右移矩陣旋轉輸入n和a,求s=a+aa+aaa+…+a…a1920算法的特點有窮性確定性有零個或多個輸入有一個或多個輸出可行性課堂練習設計如下問題流程圖(1<=n<=1000)2122233.2C語言的標準輸入和輸出3.2.1格式化輸入輸出3.2.2其它輸入輸出3.2.3C語言語句3.2.4順序結構程序設計243.2.1格式化輸入輸出格式化輸出函數(shù)printf()

:把信息輸出到標準輸出設備顯示器上格式:printf("控制字符串",輸出項列表)#include<stdio.h>25輸出項常量、變量、表達式類型與個數(shù)必須與控制字符串中格式字符的類型、個數(shù)一致有多個輸出項時,各項之間用逗號分隔控制字符串必須用雙引號括起格式說明普通字符26格式說明符:%[<修飾符>]<格式字符>格式字符含義舉例結果c按字符輸出chara=65;printf(“%c”,a);Ad按十進制整數(shù)輸出inta=567;printf(“%d”,a);567u按十進制無符號整數(shù)輸出inta=-1;printf(“%u”,a);4294967295f按浮點數(shù)輸出,默認輸出6位小數(shù)floata=567.789;printf(“%f”,a);567.789000E或e按指數(shù)形式輸出doublea=567.789;printf(“%e”,a);5.677890e+002o按八進制輸出inta=65;printf(“%o”,a);101X或x按十六進制輸出inta=255;printf(“%x”,a);ffs按字符串輸出printf(“%s”,“ABC”);ABCg按e、f格式中較短的一種輸出floata=567.789;printf(“%g”,a);567.78927修飾符含義m輸出數(shù)據(jù)域寬,數(shù)據(jù)長度<m,左補空格;否則按實際輸出.n對實數(shù),指定小數(shù)點后位數(shù)(四舍五入)對字符串,指定實際輸出位數(shù)-輸出數(shù)據(jù)在域內左對齊(缺省右對齊)+指定在有符號數(shù)的正數(shù)前顯示正號(+)0輸出數(shù)值時指定左面不使用的空位置自動填0#在八進制和十六進制數(shù)前顯示前導0,0xl在d,o,x,u前,指定輸出精度為long型在e,f,g前,指定輸出精度為double型修飾符:確定數(shù)據(jù)輸出的寬度、精度、小數(shù)位數(shù)、對齊方式

28printf函數(shù)格式輸出舉例#include<stdio.h>intmain(){intx=1234,y=3,z=4;floatf=123.456;doublem=123.456;charch='a',a[]="Hello,world!";printf("%d%d\n",y,z);printf("y=%d,z=%d\n",y,z);printf("%8d,%2d\n",x,x);

printf("%f,%8f,%8.1f,%.2f,%.2e\n",f,f,f,f,f);

printf("%lf\n",m);printf("%3c\n",ch);printf("%s\n%15s\n%10.5s\n%2.5s\n%.3s\n",a,a,a,a,a);return0;}29程序運行結果:34y=3,z=41234,1234123.456001,123.456001,123.5,123.46,1.23e+002123.456000aHello,world!Hello,world!HelloHelloHel思考:為什么賦給相同的值,float和double類型的變量輸出的值卻有差別?30格式化輸入函數(shù)scanf()

:從標準輸入設備鍵盤上輸入信息一般形式:scanf("控制字符串",地址表列)#include<stdio.h>控制字符串:%[<修飾符>]<格式字>31l修飾符功能hm*用于d,o,x前,指定輸入為short型整數(shù)用于d,o,x前,指定輸入為long型整數(shù)用于e,f前,指定輸入為double型實數(shù)指定輸入數(shù)據(jù)寬度,遇空格或不可轉換字符則結束抑制符,指定輸入項讀入后不賦給變量例scanf(“%4d%2d%2d”,&yy,&mm,&dd);

輸入19991015

則1999yy,10mm,15dd32例scanf(“%3d%*4d%f”,&k,&f);

輸入12345678765.43

則123k,8765.43f例scanf(“%2d

%*3d

%2d”,&a,&b);

輸入12

345

67

則12a,67b例scanf(“%3c%2c”,&c1,&c2);

輸入abcde

則‘a(chǎn)’c1,‘d’c233輸入分隔符的指定C語言一般以空格、TAB或回車鍵作為默認分隔符其它字符做分隔符:格式串中兩個格式符間字符例scanf("%d%o%x",&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);

輸入123123123

輸出a=123,b=83,c=29134例scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);

輸入a=12,b=24,c=36例scanf(“%d:%d:%d”,&h,&m,&s);

輸入12:30:45則12h,30m,45s例scanf(“%d,%d”,&a,&b)

輸入3,4

則3a,4b普通字符作為分隔符或格式字串中包含普通字符scanf(“%d%c%f”,&a,&b,&c);

若輸入1234a123o.26

則1234a,‘a(chǎn)’b,123c35說明:“%c”格式符時,任何字符都作為有效字符輸入(包括默認分隔符)scanf("%c%c%c",&c1,&c2,&c3);

若輸入abc

則ac1,

c2,bc3輸入數(shù)據(jù)時,遇以下情況認為該數(shù)據(jù)結束:遇空格、TAB、或回車遇寬度結束遇非法輸入36輸入函數(shù)留下的“垃圾”(前面的回車符被后面的字符變量接收)例intx;charch;scanf("%d",&x);scanf("%c",&ch);printf("x=%d,ch=%d\n",x,ch);執(zhí)行:123

輸出:x=123,ch=10解決方法:(1)用getchar()清除(2)用函數(shù)fflush(stdin)清除全部剩余內容(3)用格式串中空格或“%*c”來“吃掉”37例intx;charch;scanf("%d",&x);ch=getchar();printf("x=%d,ch=%d\n",x,ch);執(zhí)行:123

輸出:x=123,ch=10例intx;charch;scanf("%d",&x);

scanf("%*c%c",&ch);

ACM程序設計大賽輸入一般在ACM程序設計大賽中,需要進行多組輸入,直到按ctrl-Z回車后才結束,一般可以利用帶返回值的scanf()函數(shù)來實現(xiàn)。具體用法scanf("%d",&a)!=0(表示沒有輸入任何數(shù))scanf(“%d”,&a)!=EOF(表示文件結束)作為循環(huán)條件,實現(xiàn)反復輸入(多組輸入)。while(scanf("%d",&a)!=0)或while(scanf("%d",&a)!=EOF)38393.2.2其它輸入輸出putchar()函數(shù):向標準輸出設備輸出一個字符格式:putchar(ch)ch為一個字符變量或常量#include<stdio.h>intmain(){

charc;

c='A';

putchar(c);

putchar('\x42');

putchar(67);

return0;}

ABC40getchar()函數(shù):從鍵盤輸入的一個字符格式:getchar()

#include<stdio.h>intmain(){charch;ch=getchar();putchar(ch);printf("%d\n",ch);return0;}gets()函數(shù):從鍵盤上輸入一個字符串puts()函數(shù):將一個字符串輸出到屏幕上并換行。41#include<stdio.h>intmain(){ chara[100];/*保存字符串的數(shù)組*/ gets(a); puts(a); return0;}423.2.3C語言語句控制語句:用來完成控制功能。if…elsefor()、while()、do…whilecontinuebreakswitchreturn函數(shù)調用語句:用來實現(xiàn)函數(shù)調用,由函數(shù)調用加一個分號構成表達式語句:由一個表達式加一個分號構成,最典型的是賦值表達式加一個分號構成賦值語句空語句:;復合語句:當一個語句不能完成某一功能,需要用多個語句才能實現(xiàn),這時用{}把這些語句括起來,構成復合語句433.2.4順序結構程序設計例3.12編寫一個程序,從鍵盤上輸入以秒為單位的時間,表示成小時分鐘秒的形式。#include<stdio.h>#include<stdlib.h>intmain(){ ints; scanf("%d",&s); printf("%d小時",s/3600); printf("%d分鐘",(s%3600)/60); printf("%d秒\n",(s%3600)%60); system("pause"); return0;}例3.13計算如圖所示的鐵環(huán)的重量44#include<stdio.h>#include<stdlib.h>#defineRUO7.86/*鐵的密度*/#definePI3.14159intmain(){ doubled1,d2,h,s1,s2,w; scanf("%lf%lf%lf",&d1,&d2,&h); s1=PI*(d1/2)*(d1/2); s2=PI*(d2/2)*(d2/2); w=(s1-s2)*h*RUO; printf("鐵環(huán)的重量為:%.2lf\n",w); system("pause"); return0;}453.3條件語句3.3.1if語句3.3.2ifelse語句3.3.3ifelseif語句3.3.4條件語句的嵌套3.3.5條件語句的應用463.3.1if語句格式:if(表達式){

語句序列}說明:表達式可以是任何類型的表達式,只要值是非0就是真,是0就是假。語句序列既可以為單條語句,也可以是多條語句if語句表達式必須書寫在小括號()內,如果省略編譯會出現(xiàn)語法出錯47例3.14:從鍵盤輸入一個整數(shù),如果該整數(shù)為奇數(shù)則將其乘3加1后輸出,如果為偶數(shù)則直接輸出#include<stdio.h>#include<stdlib.h>intmain(){ intn,b; scanf("%d",&n); b=n; if(n%2==1)/*也可以用if(n%2!=0)*/ b=n*3+1; printf("處理的結果是:%d\n",b); system("pause"); return0;}48例3.15:從鍵盤輸入三個整數(shù)a、b、c,對這三個數(shù)從小到大排序#include<stdio.h>intmain(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);

if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d,%d,%d\n",a,b,c);return0;}493.3.2ifelse語句格式:if(表達式)

{

語句序列1}else{

語句序列2}50例3.16:從鍵盤上輸入兩個整數(shù),求它們的最大值。#include<stdio.h>#include<stdlib.h>intmain(){ inta,b,max; scanf("%d%d",&a,&b);

if(a>b) max=a; else max=b; printf("最大值:%d\n",max); system("pause"); return0;}51例3.17:從鍵盤輸入一個整數(shù),如果該整數(shù)為奇數(shù)則將其乘3加1后輸出,如果為偶數(shù)則除以2輸出。#include<stdio.h>#include<stdlib.h>intmain(){ intn,b; scanf("%d",&n); if(n%2==1) b=3*n+1; else b=n/2; printf("變換后的數(shù)為:%d\n",b); system("pause"); return0;}523.3.3ifelseif語句格式:

if(表達式1)

{

語句序列1}elseif(表達式2)

{

語句序列2}

……else{

語句序列n}53說明:語句序列為單條語句,{}可以省略。if…elseif滿足完全排斥的特性,絕不會出現(xiàn)某次執(zhí)行了其中兩路分支以上的情況。if…elseif語句中的elseif可以有有限多個,取決于編程的實際需求54例3.18:從鍵盤上輸入字符,判斷輸入字符的種類。流程圖55程序和運行結果56#include<stdio.h>#include<stdlib.h>intmain(){charc;printf("輸入一個字符:");c=getchar();

if(c<32)printf("是控制字符\n");elseif(c>='0'&&c<='9')printf("是數(shù)字字符\n");elseif(c>='A'&&c<='Z'||c>='a'&&c<='z')printf("是字母\n");elseprintf("是其他字符\n");system("pause");return0;}輸入一個字符:ctrl回車,是控制字符輸入一個字符:A回車,是字母輸入一個字符:9回車,是數(shù)字字符輸入一個字符:/回車,是其它字符57例3.19:已知2021年7月1日為星期四,從鍵盤上輸入1~31之間的整數(shù),按下述格式輸出該日是星期幾的信息在對應欄下。2021年7月日歷SunMonTueWenTurFriSta----------------------------------------------158if(weekday==0) printf("%2d\n",date);elseif(weekday==1) printf("%7d\n",date);elseif(weekday==2) printf("%12d\n",date);elseif(weekday==3) printf("%17d\n",date);elseif(weekday==4) printf("%22d\n",date);elseif(weekday==5) printf("%27d\n",date);else printf("%32d\n",date);system("pause");return0;}#include<stdio.h>#include<stdlib.h>intmain(){intdate,weekday,original_date=4;scanf("%d",&date);if(date<1||date>31){ printf("數(shù)據(jù)輸入錯誤!\n");

exit(0);}weekday=(date+original_date-1)%7;printf("2021年7月日歷\n");printf("----------------------------------\n");printf("SunMonTueWenThrFriSta\n");printf("----------------------------------\n");59例3.20輸入學生的成績,輸出學生的等級:90~100(優(yōu))、80~89(良)、70~79(中)、60~69(及格)、60分以下(不及格)。程序60#include<stdio.h>#include<stdlib.h>intmain(){ intcj; scanf("%d",&cj);

if(cj<0||cj>100) { printf("數(shù)據(jù)輸入錯誤\n"); exit(0); } if(cj>=90&&cj<=100) printf("優(yōu)\n"); elseif(cj>=80&&cj<90) printf("良\n"); elseif(cj>=70&&cj<80) printf("中\(zhòng)n"); elseif(cj>=60&&cj<70) printf("及格\n"); else printf("不及格\n"); system("pause"); return0;}思考:成績的數(shù)據(jù)類型用浮點類型數(shù)據(jù),程序該做如何修改?613.3.4條件語句的嵌套嵌套具有else子句的if語句if(表達式1)if(表達式2)

語句序列1else

語句序列2嵌套不含else子句的if語句

if(表達式1)

語句序列1elseif(表達式2)

語句序列2一般形式if(表達式1)if(表達式2)

語句序列1else

語句序列2elseif(表達式3)

語句序列3else

語句序列462if~else配對原則:缺省{}時,else總是和它上面離它最近的未配對的if配對if(……)if(……)if(……)else…...else…...else…...63例:if(a==b)if(b==c)printf("a==b==c");elseprintf("a!=b");修改:if(a==b){if(b==c)printf("a==b==c");}elseprintf("a!=b");改變if~else配對可加{}64例3.21:判斷兩個數(shù)的大小關系#include<stdio.h>#include<stdlib.h>intmain(){intx,y;printf("輸入兩個整數(shù)x,y:");scanf("%d,%d",&x,&y);

if(x!=y)if(x>y)printf("x>y\n");else

printf("x<y\n");else

printf("x==y\n");system("pause");return0;}輸入兩個整數(shù)

x,y:12,23回車x<y輸入兩個整數(shù)

x,y:20,10回車x>y輸入兩個整數(shù)

x,y:12,12回車x==y例3.22判斷三角形的形狀:已知三個數(shù),判斷這三個數(shù)能否構成一個三角形的三條邊;如果能構成三角形,判斷所構成三角形的形狀。6566#include<stdio.h>#include<stdlib.h>intmain(){ doublea,b,c; scanf("%lf%lf%lf",&a,&b,&c);

if(a<=0||b<=0||c<=0) { printf("三角形的邊長不能為0或負,請重新!\n"); exit(0); }

if(a+b<=c||a+c<=b||b+c<=a) { printf("不能構成三角形,請重新!\n"); exit(0); } elseif(a==b&&b==c) printf("是等邊三角形\n"); elseif(a==b||b==c||a==c) printf("是等腰三角形\n"); else printf("是一般三角形\n"); system("pause"); return0; }673.3.5條件語句的應用例3.23:輸入年份,判斷是否為閏年。#include<stdio.h>#include<stdlib.h>intmain(){ intyear; scanf("%d",&year); if(year<=0) { printf("數(shù)據(jù)輸入錯誤!\n"); exit(0); }

if(year%4==0&&year%100!=0||year%400==0) printf("%d是閏年!\n",year); else printf("%d不是閏年!\n",year); system("pause"); return0;}例3.24:從鍵盤輸入一元二次方程的系數(shù)a、b、c,求它的根。686970#include<stdio.h>#include<math.h>#include<stdlib.h>intmain(){ doublea,b,c,delta,x1,x2,p,q; scanf("%lf%lf%lf",&a,&b,&c); if(a==0) printf("不是一元二次方程!\n"); else { delta=b*b-4*a*c; if(delta==0) { printf("方程有兩個相等的實數(shù)根!\n"); x1=-b/(2*a); x2=x1; printf("%.2lf,%.2lf\n",x1,x2); }71 elseif(delta>0) { printf("方程有兩個不相等的實數(shù)根!\n"); x1=-b/(2*a)+sqrt(delta)/(2*a); x2=-b/(2*a)-sqrt(delta)/(2*a); printf("%.2lf,%.2lf\n",x1,x2); } else { printf("方程有兩個不相等的復數(shù)根!\n"); p=-b/(2*a); q=sqrt(-delta)/(2*a); printf("%.2lf+%.2lfi\n",p,q); printf("%.2lf-%.2lfi\n",p,q); }

}system("pause"); return0;}723.4多分支語句3.4.1switch多分支語句3.4.2多分支語句的嵌套3.4.3多分支語句應用733.4.1switch多分支語句多分支語句switch的格式:switch(表達式){caseE1:

語句序列1;

caseE2:

語句序列2;

……caseEn:

語句序列n;

[default:

默認語句序列;]}74說明:switch后面表達式的值必須是整型或字符型。E1,E2,…En是常量表達式,且值必須互不相同。每個case語句的冒號后面可以是0條或多條語句,多條語句時,可以不加{}。各case的順序可以是任意的。允許多個case語句使用同一語句序列default語句不是必須的每個case后面語句序列里的break語句可有可無,但執(zhí)行效果不同75#include<stdio.h>#include<stdlib.h>intmain(){intscore;scanf("%d",&score);

if(score<0||score>100){ printf("輸入數(shù)據(jù)錯誤\n"); exit(0);}switch(score/10){ case10: case9:printf("優(yōu)秀\n");break; case8:printf("良好\n");break; case7:printf("中等\n");break; case6:printf("及格\n");break;default:printf("不及格\n");break;

}system("pause");return0;}例3.25用switch…case語句重新編寫例3.20的程序思考:如果成績的數(shù)據(jù)類型用浮點類型數(shù)據(jù),程序該做如何修改?763.4.2多分支語句的嵌套switch語句嵌套if語句switch(…){

…… if(…) {

…… } else {

…… }

語句序列}switch語句嵌套switch語句

switch(…){

……switch(…){

語句序列1}

語句序列2}if語句嵌套switch語句773.4.3多分支語句應用例3.26:已知銀行整存整取存款不同期限的年利率分別為:

2.25%期限1年

2.79%期限2年年息=

3.33%期限3年

3.60%期限5年

4.14%期限8年

0.30%活期要求輸入本金和期限,求到時候能從銀行得到的利息與本金的合計。78#include<stdio.h>#include<stdlib.h>intmain(){ intyear; doublemoney,rate,total; printf("輸入存款和存期:"); scanf("%lf%d",&money,&year); switch(year) { case1:rate=0.0225;break; case2:rate=0.0279;break; case3:rate=0.0333;break; case5:rate=0.0360;break; case8:rate=0.0414;break; default:rate=0.003;break; } total=money+money*rate*year; printf("從銀行獲得的總金額為:%.2lf\n",total); system("pause"); return0;}79例3.27:從鍵盤上輸入年份和月份,求該月有多少天?#include<stdio.h>#include<stdlib.h>intmain(){ intyear,month,day,leapyear; scanf("%d%d",&year,&month);

if(year<0||month<1||month>12) { printf("輸入的數(shù)據(jù)錯誤!\n"); exit(0); }80

leapyear=year%4==0&&year%100!=0||year%400==0;/*是否為閏年*/ switch(month) { case1: case3: case5: case7: case8: case10: case12:day=31;break; case4: case6: case9: case11:day=30;break; case2:day=28+leapyear;break; } printf("%d年%d月的天數(shù)為:%d\n",year,month,day);system("pause"); return0;}813.5循環(huán)語句3.5.1while循環(huán)語句3.5.2dowhile循環(huán)語句3.5.3for循環(huán)語句3.5.4循環(huán)語句的嵌套823.5.1while循環(huán)語句格式:while(表達式){

語句序列}語句序列稱為循環(huán)體,當為一條語句時,表示復合語句的{}可以省略。表達式可以為任何類型先判斷,后執(zhí)行,若條件不成立,有可能一次也不執(zhí)行。語句序列中必須有改變while后面括號的表達式值的語句,否則有可能死循環(huán)。83例3.28(簡單的成績短信程序):小王作為班上的學習委員,每門課程考試后,任課老師都會讓他統(tǒng)計成績。老師并不關心每個人的具體成績,而只關心參加考試的人數(shù)、平均分、最低分和最高分這四項指標,編寫程序來幫小王完成這項任務。84#include<stdio.h>#include<stdlib.h>intmain(){ intk=0,x,max,min,s=0; doubleavg=0; scanf("%d",&x);

max=x; min=x;

while(x>=0) { s=s+x;

k++; if(x>max)max=x; if(x<min)min=x;

scanf("%d",&x); }

if(k>0)

{ avg=(double)s/k; printf("學生人數(shù)=%d,平均分=%.2lf,最高分=%d,最低分=%d\n",k,avg,max,min); } system("pause"); return0;}85例3.29:輸入一個正整數(shù),將它反位組成一個新的數(shù)輸出(如輸入12345,組成54321輸出)

86#include<stdio.h>#include<stdlib.h>intmain(){ intn,m,t=0; scanf("%d",&n);

if(n<=0) { printf("數(shù)據(jù)輸入錯誤!\n"); exit(0); }

while(n!=0) { m=n%10;/*取出最低位數(shù)*/

t=t*10+m; n=n/10; } printf("反位數(shù)為:%d\n",t); system("pause"); return0;}課堂練習輸入一個正整數(shù),將它所有奇數(shù)數(shù)字組成一個新的數(shù)輸出,而且原來的高位仍然在高位,低位仍然在低位,如輸入12345678,輸出135787883.5.2dowhile循環(huán)語句格式:do{

語句序列}while(表達式);語句序列稱為循環(huán)體,當為一條語句時,表示復合語句的{}可以省略。表達式可以為任何類型。其特點是先執(zhí)行,后判斷,若條件不成立,就跳出循環(huán)。語句序列中必須有改變while后面括號的表達式值的語句,否則有可能死循環(huán)。while(表達式)后面的“;”不能少。89例30:用do…while語句重新編寫例3.28的問題#include<stdio.h>#include<stdlib.h>intmain(){ intk=0,x,max,min,s=0; doubleavg=0; max=0; min=100; do { scanf("%d",&x); if(x>=0) { s=s+x; k++; if(x>max)max=x; if(x<min)min=x; } }while(x>=0); if(k>0) { avg=(double)s/k; printf("學生人數(shù)=%d\n班級平均分=%.2lf\n最高分=%d\n最低分=%d\n",k,avg,max,min); } system("pause"); return0;}90例3.31:從鍵盤上輸入兩個整數(shù),求它們的最大公約數(shù)。#include<stdio.h>#include<stdlib.h>intmain(){ inta,b,r; scanf("%d%d",&a,&b); do { r=a%b; a=b; b=r; }while(r!=0); printf("最大公約數(shù)為:%d\n",a); system("pause"); return0;}

91while語句和do…while語句比較while語句是先判斷后執(zhí)行,只要不滿足條件,循環(huán)體語句根本不會執(zhí)行do…while語句是先執(zhí)行后判斷,不管條件是否滿足,循環(huán)體語句總會執(zhí)行一次#include<stdio.h>intmain(){inti,sum=0;scanf("%d",&i);while(i<=10){sum+=i; i++;}printf("%d",sum);return0;}#include<stdio.h>intmain(){inti,sum=0;scanf("%d",&i);do{sum+=i;i++;}while(i<=10);printf("%d",sum);return0;}923.5.3for循環(huán)語句格式:for(<表達式1>;<表達式2>;<表達式3>){

語句序列}語句序列稱為循環(huán)體。當語句序列只有單條語句,表示復合語句的{}可以省略。表達式1一般為賦值表達式,給控制變量賦初值;如果省略表達式1,這時for語句為如表達式2一般為關系表達式或邏輯表達式,稱為循環(huán)控制條件表達式3一般為賦值表達式,給控制變量增量或減量for(;;)。93#include<stdio.h>#include<stdlib.h>intmain(){inti,sum=1,p=1,n;/*sum=1是避免n為0*/scanf("%d",&n);if(n<0){

printf("負數(shù)沒有階乘!\n");

exit(0);}for(i=2;i<=n;i++){

p=p*i;

sum=sum+p;}printf("階乘的和為:%d\n",sum);system("pause");return0;}例3.32:輸入正整數(shù)n(n<13)計算94例3.33:從輸入一個正整數(shù),判斷該數(shù)是否為素數(shù)95#include<math.h>#include<stdlib.h>intmain(){ inti,m,n; scanf("%d",&n); if(n<=0) { printf("輸入數(shù)據(jù)錯誤!\n"); exit(0); } m=sqrt(1.0*n); for(i=2;i<=m;i++)

if(n%i==0)break;/*break跳出循環(huán)*/

if(i>m&&n!=1) printf("%d是素數(shù)\n",n); else printf("%d不是素數(shù)\n",n); system("pause"); return0;}思考:為什么要判斷i>m&&n!=1?96例3.34:求所有三位數(shù)的水仙花數(shù)#include<stdio.h>#include<stdio.h>#include<stdlib.h>intmain(){ inti,m,n,k; for(i=100;i<1000;i++) { m=i/100; /*求百位數(shù)*/ n=(i-100*m)/10;/*求十位數(shù)*/ k=i%10;/*求個位數(shù)*/ if(i==m*m*m+n*n*n+k*k*k) printf("%d",i); } system("pause"); return0;}思考:求十位數(shù)字還有哪些方法?973.5.4循環(huán)語句的嵌套循環(huán)語句的嵌套:一個循環(huán)語句的循環(huán)體中又包含循環(huán)語句while(){……while(){

……}

…...}do{……do{

……}while();

…...}while();while(){……do{

……

}while();

…….}for(;;){……do{

……}while();

……while(){

……}

…...}三種循環(huán)可互相嵌套,層數(shù)不限。外層循環(huán)可包含兩個以上內循環(huán),但不能相互交叉。嵌套循環(huán)的執(zhí)行流程:外層循環(huán)執(zhí)行一次,內層循環(huán)要執(zhí)行完。嵌套循環(huán)的跳轉:只能跳轉出本層循環(huán)。禁止從外層跳入內層、禁止跳入同層的另一循環(huán)和向上跳轉。98例3.35:編寫C語言程序,輸出乘法九九表。

乘法九九表-------------------------------------------------------123456789-------------------------------------------------------1123456789224681012141618336912151821242744812162024283236551015202530354045661218243036424854771421283542495663881624324048566472991827364554637281---------------------------------------------------------99流程圖100#include<stdio.h>#include<stdlib.h>intmain(){inti,j;printf("\n---------------------------------------\n"); printf("");/*保證后面的輸出對齊*/for(i=1;i<10;i++)printf("%4d",i);printf("\n---------------------------------------\n");for(i=1;i<10;i++){printf("%d",i);for(j=1;j<10;j++)printf("%4d",i*j);printf("\n");}printf("---------------------------------------\n");system("pause");return0;}思考-1101

乘法九九表----------------------------------------------123456789----------------------------------------------11224336944812165510152025661218243036771421283542498816243240485664991827364554637281--------------------------------------------思考-2102

乘法九九表-------------------------------------------------------123456789---------------------------------------------------------11234567892468101214161839121518212427416202428323652530354045636424854749566386472981---------------------------------------------------------例3.36:百錢買百雞:一百元錢買了一百只雞,其中母雞一只5元錢、公雞一只3元錢、小雞一只0.5元錢,問每一種雞都必須要買的情況下,計算所有的購買方法。103104#include<stdio.h>intmain(){inti,j,k;for(i=1;i<=19;i++)for(j=1;j<=31;j++) for(k=1;k<=98;k++) if(i+j+k==100&&5*i+3*j+0.5*k==100) printf("母雞數(shù):%d,公雞數(shù):%d,小雞數(shù):%d\n",i,j,k);return0;}思考:如果用二重循環(huán),程序該做如何修改?1053.6轉移語句goto語句形式:goto語句標號功能:無條件轉移到語句標號所在的位置執(zhí)行continue語句形式:continue;功能:結束本次循環(huán),開始下一次循環(huán)continue只能用在循環(huán)結構中,而不能用于其它控制結構106107例3.37:輸出100~200之間不能被3整除的數(shù)#include<stdio.h>#include<stdlib.h>intmain(){ intk; for(k=100;k<=200;k++) {

if(k%3==0) continue; printf("%d",k); } system("pause"); return0;}108break語句格式:break;功能:跳出switch結構或結束本層循環(huán)。說明:break語句只能用于switch或循環(huán)結構中109例3.38:輸出半徑為1到10的圓的面積,若面積超過100,則不輸出#include<stdio.h>#include<stdlib.h>#definePI3.1415926intmain(){ intr; doublearea; for(r=1;r<=10;r++) { area=PI*r*r; if(area>100.0) break;; printf("%.2lf",area); } system("pause"); return0;}1103.7綜合應用例3.39:驗證哥德巴赫猜想:任一充分大的偶數(shù),可以用兩個素數(shù)之和表示111#include<stdio.h>#include<math.h>#include<stdlib.h>intmain(){inti,p,q,n,p_flag,q_flag;scanf("%d",&n);if((n%2==1)||n<4){printf("數(shù)據(jù)輸入出錯\n");exit(0);}

p=1;do{

p=p+1;q=n-p;p_flag=1; for(i=2;i<=sqrt(p);i++) { if(p%i==0) { p_flag=0; break; } } q_flag=1; for(i=2;i<=sqrt(q);i++) { if(q%i==0) { q_flag=0; break; } }}while(p_flag*q_flag==0);printf("%d=%d+%d\n",n,p,q);system("pause");return0;}思考:該算法能否進一步改進?112例3.40:求斐波那契(Fibonacci)數(shù)列前40項。113#include<stdio.h>#include<stdlib.h>intmain(){ inti,f1=1,f2=1; for(i=1;i<=20;

溫馨提示

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

評論

0/150

提交評論