《C語言程序設(shè)計教程》_第1頁
《C語言程序設(shè)計教程》_第2頁
《C語言程序設(shè)計教程》_第3頁
《C語言程序設(shè)計教程》_第4頁
《C語言程序設(shè)計教程》_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《C語言程序設(shè)計教程》HuanghuaiUniversity

DepartmentofComputerScience主講:傅豐黃淮學院計算機科學系高等教育出版社譚浩強張基溫等編著第三章

C程序的流程設(shè)計§1算法§2C語句概述§3選擇結(jié)構(gòu)程序設(shè)計§3.1雙分支結(jié)構(gòu)(if-else)§3.1~3.2多分支結(jié)構(gòu)(elseif、switch)§4

循環(huán)結(jié)構(gòu)程序設(shè)計2學時2學時本節(jié)4學時§4循環(huán)結(jié)構(gòu)程序一、while和do-while語句while(條件)

循環(huán)體;do

循環(huán)體;while(條件);1、若循環(huán)體為多條語句,應用{}括起來構(gòu)成復合語句。

2、循環(huán)體中應有使循環(huán)結(jié)束的語句,否則會出現(xiàn)死循環(huán)。

明循環(huán)結(jié)構(gòu)while()…語句

do…while()語句

for()…語句當(條件)成立時循環(huán)體當(條件)成立時循環(huán)體條件為真(非0即真)時,執(zhí)行循環(huán)體;然后再判斷條件,為真時再執(zhí)行循環(huán)體,直到條件為假時結(jié)束循環(huán)語句,執(zhí)行后續(xù)語句。先執(zhí)行循環(huán)體,再判斷條件。為真則執(zhí)行循環(huán)體,然后再判斷條件,為真時再執(zhí)行循環(huán)體,直到條件為假時結(jié)束循環(huán),執(zhí)行后續(xù)語句。先判斷后執(zhí)行先執(zhí)行后判斷條件循環(huán)體NY條件循環(huán)體NYP98習題10:main(){intn=0;

while(n++<=1)

printf(“%d\t”,n);

printf(“%d\n”,n);}n=0+1n=1+12<=1不成立輸出n的值輸出n的值輸出n的值n1230<=1成立n=2+11<=1成立n=00123循環(huán)體為多個語句時要用{}括起來應在條件表達式或循環(huán)體中改變條件表達式的值,否則會出現(xiàn)死循環(huán)。2次輸出n的值P98習題10用do-while實現(xiàn)的對比:main(){intn=0;

do

printf(“%d\t”,n);

while(n++<=1);

printf(“%d\n”,n);}n=0+1n=1+12<=1不成立輸出n的值輸出n的值輸出n的值n0130<=1成立n=2+11<=1成立n=0012323次P83例14~16:main()

{intnumber=0;

while(number<=1)

{number++;

printf(“%d\n”,number);

}

}main(){intnumber=0;while(number++<=1)printf(“*%d\n”,number);printf(“**%d\n”,number);}#include“stdio.h”

main()

{intc;

while((c=getchar())!=EOF)

putchar(c);

}main()

{intc;

c=getchar();

while(c!=EOF);

{putchar(c);

c=getchar();

}

}e

e

h

h

^z*1

*2

**31

2EOF為符號常數(shù),在stdio.h中定義:#defineEOF–1(當鍵盤輸入^Z或遇到文件結(jié)束標志時,其值為-1)141516類似P98習題10(1)1+3+5+…+99

(2)2+4+6+…+100

(3)1-2+3-4+…+99-100(4)

(5)#include“stdio.h”

voidwait_a_char(charc)

{charch;

while((ch=getchar())!=c);

return();

}P83例17:口令檢查函數(shù)將循環(huán)體合并到了條件表達式中P12例6:求1+2+3+…+10main()

{ints=0,i=1;

while(i<=10)

{s=s+i;

i=i+1;}

printf(“s=%d\n”,s);

}課后練習main()

{ints=0,i=1;

do

{s=s+i;

i=i+1;

}while(i<=10);

printf(“s=%d\n”,s);

}P85例18:搬磚問題。main()

{intx=0,y,z;

while(x<=8)

{y=0;

while(y<=11)

{z=36-x-y;

if(4*x+3*y+z/2==36)

{printf(“men:%d”,x);

printf(“women:%d”,y);

printf(“children:%d\n”,z);

}

y++;

}

x++;

}

}36塊磚,36人搬;男搬4,女搬3,兩個小孩抬一磚。要求一次搬完,問男、女、小孩各若干?窮

法設(shè)男、女、小孩各為x、y、z人,則:

4x+3y+z/2=36x+y+z=36可得:

0≤x<90≤y<122≤z≤36算法分析:在某一范圍內(nèi)逐個驗證是否滿足要求的方法稱為窮舉法P99習題7:百馬百擔問題P99習題6:換零錢問題P99習題8:客票問題P99習題9:驗證歐拉公式類似問題:若問有幾種解決方法,則應如何修改程序?用變量k作為計數(shù)器,在if語句中增加“k++;”語句P87例19:愛因斯坦階梯問題。設(shè)有一階梯,每步跨2階,最后余1階;每步跨3階,最后余2階;每步跨5階,最后余4階;每步跨6階,最后余5階;每步跨7階,正好到階梯頂。問共有多少階梯?窮舉法設(shè)共有x個臺階,則:

①x%2=

=1②x%3=

=2③x%5=

=4④x%6=

=5⑤x%7=

=0算法分析:X是奇數(shù)X是7的倍數(shù)X:7,7+7,7+7+7,7+7+7+7,7+7+7+7+7…X:7,7+14,7+14+14…哪個X滿足②③④?

要逐個驗證當②③④中有一者不滿足時,便驗證X的下一個值是否滿足main(){intx=7;

while(x%3==2&&x%5==4&&x%6==5)x+=14;

printf(“flightofstairs=%d\n”,x);}當②③④中有一者不滿足時,便驗證X的下一個值是否滿足運行結(jié)果:flightofstairs=119(x%3!=2||x%5!=4||x%6!=5)X取第一個值7當②③④中有一者不滿足時X取下一個值X+14輸出X的值P87例19(續(xù)):程序中有無錯誤?

P87例20:歐幾里德算法求非負整數(shù)u和v的最大公因數(shù)迭

法不斷由舊值遞推出新值的方法輾轉(zhuǎn)相除(設(shè)u=24,v=15):

1152415

9intgcd(intu,intv)

{intr;

r=u%v;

while(r!=0)

{u=v;

v=r;

r=u%v;

}

return(v);

}u=24

v=15r=u%v=9u=v=15

v=r=9r=u%v=6u=v=9

v=r=6r=u%v=3u=v=6

v=r=3r=u%v=0

1915

9

61696323660u=v=3

v=r=0r=0時,v為所求v=0時,u為所求intgcd(intu,intv)

{intr;

while(v!=0)

{r=u%v;

u=v;

v=r;

}

return(u);

}①②③④①②③④r=u%v當(r!=0)時v為所求u=vv=rr=u%vP80例11:人口增長問題。main(){floatm=12;intn=1;while(n<=10){m=m*(1+0.02);n=n+1;}

printf(“%f\n”,m);}按年2%的增長速度,現(xiàn)有12億人,則10年后將有多少人?算法分析:迭代法設(shè)現(xiàn)有人口為m=12億,則:

1年后人口:m(1+2%)

m2年后人口:m(1+2%)

m3年后人口:m(1+2%)

m

……10年后人口:

m(1+2%)

m因此:

初值:m=12

迭代公式:m=m(1+2%)

終止條件:10年課后作業(yè)及上機任務

教材P98習題:

11、13(4)(6)~(9)、2(3)(5)

上機調(diào)試P98習題10、12

編寫并調(diào)試本節(jié)例題(1)1+3+5+…+99

(2)2+4+6+…+100

(3)1-2+3-4+…+99-100(4)

(5)課后練習for(初始表達式;條件表達式;修正表達式)

循環(huán)體;

二、for語句①③②⑤④Y條件表達式修正表達式NY初始表達式循環(huán)體Ns=0;

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

s=s+i;s=0;i=1;

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

s=s+i;初始表達式;

while(條件表達式)

{循環(huán)體;

修正表達式;

}執(zhí)行過程for(s=0,i=1;i<=10;)

{s=s+i;i++}s=0;i=1;

while(i<=10)

{s=s+i;

i++;

}1、省略初始表達式時,分號不能省。

2、省略修正表達式時,循環(huán)體內(nèi)應有改變條件表達式的值的語句。說明:

形狀

形狀main()

{inti,j;

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

printf(“%4d”,i);

printf(“\n”);

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

printf(“%c”,‘-’);

printf(“\n”);

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

{for(j=1;j<=9;j++)

printf(“%4d”,i*j);

printf(“\n”);

}

}P91例22:打印九九乘法表

形狀123456789

12

3456789

246

81012141618

36912

…打印表頭

9個數(shù)字打印虛線打印表體……

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

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

printf(“%4d”,i*j);

printf(“\n”);

}打印表體for(i=1;i<=9;i++)

{for(j=0;j<=i-1;j++)

printf(“%4c”,‘’);

for(j=i;j<=9;j++)

printf(“%4d”,i*j);

printf(“\n”);

}打印表體打印空格判斷一個正整數(shù)n>3是否為素數(shù)main(){intn,m,yes=1;scanf(“%d”,&n);

for(m=2;m<n-1;m++)

if(n%m==0){yes=0;

break;}if(yes==1)printf(“yes\n”);elseprintf(“no\n”);

}P93例23:驗證素數(shù)素數(shù)是除了1和它自身外,再也找不到能被它整除的數(shù)。即:若n不能被2到n-1中所有整數(shù)整除,則n為素數(shù)。已證明只要從2判斷到n/2或即可。算法分析:也可用m>=n-1求100~200間的全部素數(shù)課后練習:也可用n/2或sqrt(n)P80例12:兔子繁殖問題(Fibonacci提出的)

P94例24:打印Fibonacci數(shù)列前n項main()

{intn,m;longf1=1,f2=1,f3;

scanf(“%d”,&n);printf(“%ld%ld”,f1,f2);for(m=3;m<=n;m++){f3=f1+f2;f1=f2;f2=f3;printf(“%d”,f3);}printf(“\n”);

}設(shè)有一對新生兔子,從第3個月開始,每個月都生一對兔子。按此規(guī)律,若所有兔子都不死,問一年后共有多少對兔子?迭代法算法分析:月:12345678

1--1—1—1—1—1—1--1

1

1--1

1—1--1

1

1—1—1--1

1

1--1

1—1—1—1—11

1--1

1—1—1

1兔:1123581321f1f21

1

f3=f1+f2

2f1f2

f3=f1+f2

3

f1f2

f3=f1+f2

5

f1f2f3=…初始條件終止條件迭代公式思考:f1=f2和f2=f3能否對換位置?不main()

{intx,y,z;

for(x=0;x<20;x++)

for(y=0;y<33;y++)

{z=100-x-y;

if(5*x+3*y+z/3==100)

{printf(“x=%d”,x);

printf(“y=%d”,y);

printf(“z=%d\n”,z);}

}

}補充例題:百錢百雞問題P85例18:搬磚問題P99習題7:百馬百擔問題P99習題6:換零錢問題P99習題8:準備客票問題P99習題9:驗證歐拉公式窮舉法類似問題:每只公雞5元,每只母雞3元,三只小雞1元。用100元錢買100只雞,問公、母、小雞各買多少只?設(shè)公、母、小雞各為x、y、z只,則:

5x+3y+z/3=100x+y+z=100可得:

0≤x<200≤y<333≤z≤100算法分析:補充舉例:打印圖形。1234567891011*************************算法分析:第1行:1個空格,5個*號,換行第2行:2個空格,5個*號,換行第3行:3個空格,5個*號,換行第4行:4個空格,5個*號,換行第5行:5個空格,5個*號,換行第i(1~5)行:i個空格,5個*號,換行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=i;j++)printf(“”);for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}i個空格5個*號換行循環(huán)語句嵌套時,當外層循環(huán)變量取1個值時,內(nèi)層循環(huán)變量要取遍所有值補充舉例(續(xù)):打印圖形。12345678901***************1234567890112233344445555512345678901***************算法分析:第1行:5個空格,1個*_,換行第2行:4個空格,2個*_,換行第3行:3個空格,3個*_,換行第4行:2個空格,4個*_,換行第5行:1個空格,5個*_,換行第i(1~5)行:6-i個空格,i個*_,換行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=6-i;j++)printf(“”);for(j=1;j<=i;j++)printf(“*_”);printf(“\n”);}}6-i個空格i個*_換行算法分析:第1行:5個空格,1個1_,換行第2行:4個空格,2個2_,換行第3行:3個空格,3個3_,換行第4行:2個空格,4個4_,換行第5行:1個空格,5個5_,換行第i(1~5)行:6-i個空格,i個i_,換行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=6-i;j++)printf(“”);for(j=1;j<=i;j++)printf(“%d_”,i);printf(“\n”);}}6-i個空格i個i_換行算法分析:第1行:1個空格,5個*_,換行第2行:2個空格,4個*_,換行第3行:3個空格,3個*_,換行第4行:4個空格,2個*_,換行第5行:5個空格,1個*_,換行第i(1~5)行:i個空格,6-i個*_,換行main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=i;j++)printf(“”);for(j=1;j<=6-i;j++)printf(“%d_”,i);printf(“\n”);}}i個空格6-i個*_換行小結(jié)

循環(huán)控制有兩種方法:計數(shù)法和標志法。

能確定循環(huán)次數(shù)時,采用計數(shù)法,用for語句比較清晰;

不能確定循環(huán)次數(shù)時,采用標志法,設(shè)法找出循環(huán)終止條件,用while或do-while語句來實現(xiàn)。

用while與do-while語句能實現(xiàn)的程序,用for語句未必可以實現(xiàn)。

while語句是先判斷后執(zhí)行,do-while語句是先執(zhí)行后判斷。在循環(huán)體至少執(zhí)行一次的情況下兩者等價。課后作業(yè)及上機任務

教材P97習題:

11、13(2)(3)(5)~(9)

編寫并調(diào)試例22、例23

編程求100~200間的全部素數(shù)(1)1+3+5+…+99

(2)2+4+6+…+100

(3)1-2+3-4+…+99-100(4)

(5)課后練習習題課main(){intvalue1,value2;value1=50;value2=25;sum=value1+value2;printf(“%d+%d=%d\n”,value1,value2,sum);}P96習題1:用N-S圖描述算法value1=50value2=25sum=value1+value2輸出summain(){inta;scanf(“%d”,&a);if(a>=0)printf(“plus\n”);elseprintf(“minus\n”);}輸入a值

a>=0

否輸出plus輸出minusmain(){intx,max,i;scanf(“%d”,&x);max=x;for(i=2;i<=10;i++){scanf(“%d”,&x);if(x>max)max=x;}printf(“max=%d\n”,max);}P97習題2:設(shè)計算法(2)依次輸入不10個數(shù),找出最大數(shù)。輸入1個數(shù)xmax=xfor(i=2;i<=10;i++)輸出max輸入1個數(shù)x

x>max

否max=xmain(){intn;scanf(“%d”,&n);if(n%3==0)printf(“3:yes\n”);elseprintf(“3:no\n”);if(n%5==0)printf(“5:yes\n”);elseprintf(“5:no\n”);}P97習題2:設(shè)計算法(4)判斷一個整數(shù)n能否被3和5整除。輸入整數(shù)n

n%3==0

否輸出3:yes輸出3:no

n%5==0

否輸出5:yes輸出5:nomain(){inty;scanf(“%d”,&y);if(y%4==0&&y%100!=0||y%400==0)printf(“%disleep\n”,y);elseprintf(“%disnotleep\n”,y);}P98習題7:設(shè)計一個判斷輸入年份是否為閏年的程序:(1)能被4整除但不能被100整除的年份;(2)能被4整除且能被400整除的年份。main(){floats,a,b,c;scanf(“%f%f%f”,&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){s=(a+b+c)/2.0;s=sqrt(s*(s-a)*(s-b)*(s-c));printf(“areais%f\n”,s);}elseprintf(“Itisnottriangle\n”);}P98習題8:計算以輸入的三個數(shù)為邊長的三角形面積若S=(a+b+c)/2,則面積為main(){intyes;

/*設(shè)1表示float,否則為int*/charc;c=getchar();while(c!=‘\n’){if(c==‘.’)yes=1;c=getchar();}if(yes==1)printf(“float\n”);elseprintf(“int\n”);}P98習題9:輸入的必須是數(shù)字將程序段改寫得更合理while(A){if(B)cotinue;C;}while(A)if(!B)C;do{if(!A)continue;elseB;C;}while(A);do{if(A)B;C;}while(A);輸入一個數(shù),打印其類型標識符P98習題11:P98習題12:輸入“qwert?”時,程序的執(zhí)行結(jié)果。#include“stdio.h”main(){charc;c=getchar();while(c!=‘?’){putchar(c);c=getchar();}}/*不是?時原樣輸出*/#include“stdio.h”main(){charc;while((c=getchar())!=‘?’)putchar(++c);}/*不是?時輸出其后的字符*/#include“stdio.h”main(){while(putchar(getchar())!=‘?’);}/*立即原樣輸出輸入字符,

當輸入的是?時退出*/qwertrxfsuqwert?main(){intn;for(n=33;n<=255;n++){if(n%8==0)printf(“\n”);printf(“%4d%2c”,n,n);}}P99習題(2):打印碼值為33~255的ASCII碼值-字符對照表每8個換行main(){inti=1;doublee=1.0,y,x,d;scanf(“%lf),&d);x=1;y=1/x;while(y>=d){x=x*i;y=1/x;e=e+y;i=i+1;}printf(“%12.10lf\n”,e);}P99習題(4):計算e=,使誤差小于給定值d?!磇!main(){inti;longf(intn);doublee=0.0,y=1.0,d;scanf(“%lf),&d);while(y>=d){e=e+y;i=i+1;y=1/f(i);}printf(“%12.10lf\n”,e)}longf(intn){longx=1;inti;for(i=1;i<=n;i++)x=x*i;return(x);}f()為求n!的函數(shù)不能用for,因不能確定n值迭代法自定義函數(shù)法P99習題(5):遞增的牛群若有一頭母牛,從第4年開始,每年生一頭母牛。按此規(guī)律,第n年時有多少頭母牛?main()

{intn,y;longf1,f2,f3,f;

scanf(“%d”,&n);for(y=1;y<=n;y++){if(y<=3)f=f1=f2=f3=1;else{f=f1+f3;f1=f2;f2=f3;f3=f;}printf(“year:%ld,n:%ld\n”,y,f);}

}算法分析:1112346913192841f1f2f3f=f1+f3f1f2f3f=f1+f3f1f2f3f=f1+f3f1f2f3f=f1+f3

…迭代法P99習題(6):換零錢把一元錢兌換成硬幣(1、2、5分),有幾種兌換方法?設(shè)5、2、1分錢各為x、y、z:

5x+2y+z=100可得:

0≤x≤200≤y≤500≤z≤100算法分析:main()

{intx,y,z,k=0;

for(x=0;x<=20;x++)

for(y=0;y<=50;y++)

{z=100-5*x-2*y;

printf(“x=%d”,x);

printf(“y=%d”,y);

printf(“z=%d\n”,z);

k++;

}

printf(“%d\n”,k);

}P85例8:搬磚問題補充舉例:百錢百雞問題問題對比:窮舉法541種P99習題(7):百馬百擔有100匹馬,馱100擔貨,大馬馱3擔,中馬馱2擔,兩匹小馬馱1擔。問有大、中、小馬各多少?算法分析:main()

{intx,y,z,k=0;

for(x=0;x<33;x++)

for(y=0;y<50;y++)

{z=100-x-y;

if(3*x+2*y+z/2==100)

{printf(“x=%d”,x);

printf(“y=%d”,y);

printf(“z=%d\n”,z);

k++;}

}

printf(“%d\n”,k);

}設(shè)大、中、小馬各為x、y、z,則:

3x+2y+z/2=100x+y+z=100可得:

0≤x<330≤y<502≤z≤100窮舉法7種P99習題(8):準備客票某鐵路線上共10個車站,問需要準備幾種車票?窮舉法算法分析:兩個站點往返,需要設(shè)2種車票(往返票)。設(shè)兩站點分別為x和y,則從x站到y(tǒng)站:

1≤x<10x+1≤y≤10x:12345678910y:12345678910

main(){intx,y,k=0;for(x=1;x<10;x++)

for(y=x+1;y<=10;y++)k=k+2;printf(“%d\n”,k);}內(nèi)層循環(huán)的for語句能否改為:f

溫馨提示

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

評論

0/150

提交評論