




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計(jì)第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)5.1循環(huán)結(jié)構(gòu)程序的引入5.2當(dāng)型循環(huán)5.3直到型循環(huán)5.4計(jì)數(shù)型循環(huán)5.5循環(huán)嵌套與輔助控制5.6循環(huán)結(jié)構(gòu)程序設(shè)計(jì)及實(shí)例【引例】某班級35個(gè)學(xué)生的C語言程序設(shè)計(jì)課程的考試成績,求該課程的平均成績,并輸出不及格學(xué)生的信息(含學(xué)號和成績)。5.1循環(huán)結(jié)構(gòu)程序的引入
5.1.1問題與引例局部程序代碼如下:#include<stdio.h>voidmain(){intnum,score,sum,aver,n;sum=0;//總分變量置為0n=0;//學(xué)生人數(shù)變量置為0printf("請輸入學(xué)生的學(xué)號和成績:");scanf("%d,%d",&num,&score);//輸入學(xué)生的學(xué)號和成績//成績小于60時(shí)輸出if(score<60)printf("%d,%d\n",num,score);sum=sum+score;//成績求和n=n+1;//人數(shù)加1
printf("請輸入學(xué)生的學(xué)號和成績:");scanf("%d,%d",&num,&score);if(score<60)printf("%d,%d\n",num,score);sum=sum+score;n=n+1;……//上述程序段還要重復(fù)33次aver=sum/n;printf("平均成績?yōu)?%d\n",aver);}5.1.1問題與引例循環(huán):程序中某一程序段反復(fù)屢次執(zhí)行的過程。循環(huán)結(jié)構(gòu):實(shí)現(xiàn)程序循環(huán)操作時(shí)所使用的結(jié)構(gòu)。結(jié)構(gòu)化程序設(shè)計(jì)三種的根本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu),共同作為各種復(fù)雜程序的根本構(gòu)造單元。循環(huán)結(jié)構(gòu)的特點(diǎn):當(dāng)條件成立時(shí),反復(fù)執(zhí)行某個(gè)程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,控制循環(huán)執(zhí)行的變量稱為循環(huán)變量,反復(fù)執(zhí)行的程序段稱為循環(huán)體。5.1.2循環(huán)的根本概念C語言中的三種根本循環(huán):當(dāng)型循環(huán)(while循環(huán))直到型循環(huán)(do-while循環(huán))計(jì)數(shù)型(for循環(huán))5.1.2循環(huán)的根本概念5.2當(dāng)型循環(huán)
5.2.1當(dāng)型循環(huán)的一般形式
while(表達(dá)式)
{
語句;}循環(huán)條件循環(huán)體首先計(jì)算表達(dá)式的值,然后判斷表達(dá)式的值是否為真?當(dāng)值為真(非0)時(shí),執(zhí)行循環(huán)體中的語句,當(dāng)值為假(0)時(shí),執(zhí)行循環(huán)的后繼語句。5.2.2當(dāng)型循環(huán)的執(zhí)行
【例5.1】用while循環(huán)求sum=算法分析:(1)用sum存放累加和,初值為0;i形成被加的自然數(shù),初值為1;(2)累加用sum=sum+i,形成下一個(gè)自然數(shù)用i=i+1;(3)如果i<=100,那么重復(fù)(2),否那么轉(zhuǎn)(4);(4)輸出sum中的值。5.2.3當(dāng)型循環(huán)的使用舉例
#include<stdio.h>voidmain(){inti=1,sum=0;//i表示被加的數(shù),sum表示和
while(i<=100)//i小于或等于100時(shí)進(jìn)行循環(huán)
{sum=sum+i;//將i加到sum中
i++;//i加1形成下一個(gè)數(shù)
}printf("sum=%d\n",sum);}初始化不能少復(fù)合語句,用花括號括起來5.2.3當(dāng)型循環(huán)的使用舉例
#include<stdio.h>voidmain(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf("sum=%d\n",sum);}不能丟,否那么循環(huán)永不結(jié)束如何求6!5.2.3當(dāng)型循環(huán)的使用舉例
【例5.2】從鍵盤輸入一行字符,并統(tǒng)計(jì)其中的字符個(gè)數(shù)。算法分析:利用getchar()函數(shù)從鍵盤輸入字符。當(dāng)getchar()中的字符不是回車〔即為'\n'〕時(shí)就進(jìn)行循環(huán),在循環(huán)體中通過n++完成對輸入字符個(gè)數(shù)統(tǒng)計(jì);當(dāng)getchar()中的字符是回車時(shí),就結(jié)束循環(huán)。5.2.3當(dāng)型循環(huán)的使用舉例
#include<stdio.h>voidmain(){intn=0;//n表示字符個(gè)數(shù),初值置為0printf("請輸入一行字符:");while(getchar()!='\n')//當(dāng)輸入的字符不為回車n++;printf("輸入的字符個(gè)數(shù)為:%d\n",n);}5.2.3當(dāng)型循環(huán)的使用舉例
1.while語句中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,只要表達(dá)式的值為真(非0)就繼續(xù)循環(huán)。例如:#include<stdio.h>voidmain(){inta=0,n;printf("請輸入n:");scanf("%d",&n);
while(n--)printf("%d",a++*2);printf("\n");}5.2.4使用當(dāng)型循環(huán)注意點(diǎn)程序?qū)?zhí)行n次循環(huán),每執(zhí)行一次,n值減1,循環(huán)體輸出表達(dá)式a++*2的值,該表達(dá)式等效于(a*2;a++)2.如果循環(huán)體包括多條語句,那么必須用“{、}〞括起來組成復(fù)合語句。5.3直到型循環(huán)
5.3.1直到型循環(huán)的一般形式
do
語句;while(表達(dá)式);首先執(zhí)行循環(huán)體中的語句,然后再判斷表達(dá)式是否為真,如果為真,那么繼續(xù)循環(huán);否那么為假,那么終止循環(huán)。5.3.2直到型循環(huán)的執(zhí)行
【例5.3】用dowhile型循環(huán)求i=1;sum=0;
do{sum=sum+i;i++;}while(i<=100);
5.3.3直到型循環(huán)的使用舉例
#include<stdio.h>voidmain(){inti=1,sum=0;
do
{sum=sum+i;i++;}while(i<=100);printf("sum=%d\n",sum);}思考:假設(shè)將此句去掉,結(jié)果怎樣?5.3.3直到型循環(huán)的使用舉例
5.3.4當(dāng)型和直到型循環(huán)的比較inti,sum=0;printf("i=?");scanf("%d",&i);while(i<=10){sum=sum+i;i++;}printf("sum=%d\n",sum);inti,sum=0;printf("i=?");scanf("%d",&i);do{sum=sum+i;i++;}while(i<=10);printf("sum=%d\n",sum);當(dāng)while后面的表達(dá)式的第一次的值為“真〞時(shí),兩種循環(huán)得到的結(jié)果相同;否那么不相同。結(jié)論:當(dāng)型循環(huán)是先判斷條件后執(zhí)行循環(huán)體,循環(huán)體可能一次也不被執(zhí)行,而直到型循環(huán)是先執(zhí)行循環(huán)體后判斷條件,循環(huán)體至少被執(zhí)行一次。思考與引申(1)求1+3+5+…+49的和(2)求10+20+30+…+90的和(3)求1+1/2+1/3+…+1/80的和(4)1-1/3+1/5-1/7+…+最后一項(xiàng)絕對值小于10-6(5)求1*2*3*4*5的積(6)求10*9*8*7*6的積
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
語句;5.4計(jì)數(shù)型循環(huán)
5.4.1計(jì)數(shù)型循環(huán)的一般形式(1)先求解表達(dá)式1(2)求解表達(dá)式2,假設(shè)其值為真,執(zhí)行循環(huán)體,然后執(zhí)行下面第(3)步。假設(shè)為假,那么結(jié)束循環(huán),轉(zhuǎn)到第(5)步(3)求解表達(dá)式3(4)轉(zhuǎn)回上面步驟(2)繼續(xù)執(zhí)行(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句5.4.2計(jì)數(shù)型循環(huán)的執(zhí)行分析求1~100之和程序的執(zhí)行過程:#include<stdio.h>voidmain(){inti,sum;sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("1+2+3+……+100=%d\n",sum);}5.4.2計(jì)數(shù)型循環(huán)的執(zhí)行1.for循環(huán)中的“表達(dá)式1〞、“表達(dá)式2〞和“表達(dá)式3〞都是選擇項(xiàng),即可以缺省,但“;〞不能缺省。(1)省略“表達(dá)式1〔循環(huán)變量賦初值〕〞,表示不對循環(huán)控制變量賦初值,但可以在循環(huán)開始之前賦值。5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)#include<stdio.h>voidmain(){inti,sum;sum=0;i=1;for(;i<=100;i++)//此語句中省略了表達(dá)式1sum=sum+i;printf("1+2+3+……+100=%d\n",sum);}5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)(2)省略“表達(dá)式2(循環(huán)條件)〞,那么表示不做循環(huán)判斷,因此就成了“死循環(huán)〞。例如:for(i=1;;i++)sum=sum+i;相當(dāng)于:i=1;while(1){sum=sum+i;i++;}5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)(3)省略“表達(dá)式3(循環(huán)變量增量)〞,那么表示不對循環(huán)控制變量進(jìn)行操作,這時(shí)可在語句體中參加修改循環(huán)控制變量的語句。例如,前述例5.1省略了“表達(dá)式3〞,用for循環(huán)實(shí)現(xiàn)如下:#include<stdio.h>voidmain(){inti,sum;sum=0;for(i=1;i<=100;)//此語句中省略了表達(dá)式3{sum=sum+i;i++;}printf("1+2+3+……+100=%d\n",sum);}5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)(4)省略“表達(dá)式1〔循環(huán)變量賦初值〕〞和“表達(dá)式3(循環(huán)變量增量)〞,那么表示既不對循環(huán)控制變量賦初值,也不對循環(huán)控制變量進(jìn)行操作。例如:for(;i<=100;){sum=sum+i;i++;}相當(dāng)于:while(i<=100){sum=sum+i;i++;}5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)(5)表達(dá)式1、表達(dá)式2、表達(dá)式3三個(gè)表達(dá)式都可以省略,那么表示既不對循環(huán)控制變量賦初值,也不對循環(huán)條件進(jìn)行判斷,也不對循環(huán)控制變量進(jìn)行操作。例如:for(;;)語句;相當(dāng)于:while(1)語句;//永遠(yuǎn)滿足條件5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)2.表達(dá)式1可以是設(shè)置循環(huán)變量的初值的賦值表達(dá)式,也可以是與循環(huán)變量初值無關(guān)的其它表達(dá)式。例如:for(sum=0;i<=100;i++)sum=sum+i;//表達(dá)式1與循環(huán)變量初值無關(guān)5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)3.表達(dá)式1和表達(dá)式3可以是一個(gè)簡單表達(dá)式也可以是逗號表達(dá)式。for(sum=0,i=1;i<=100;i++)sum=sum+i;//表達(dá)式1是逗號表達(dá)式或:for(i=0,j=100;i<=100;i++,j--)k=i+j;//表達(dá)式1、表達(dá)式3是逗號表達(dá)式5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)4.表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零,就執(zhí)行循環(huán)體。例如:for(i=0;(c=getchar())!='\n';i+=c);//表達(dá)式2是一個(gè)關(guān)系表達(dá)式for(a=1;b+c;c++);//表達(dá)式2是一個(gè)算術(shù)表達(dá)式5.4.3計(jì)數(shù)型循環(huán)使用注意點(diǎn)執(zhí)行步驟:〔1〕計(jì)算初始表達(dá)式E1;〔2〕計(jì)算判別表達(dá)式E2;〔3〕假設(shè)E2為真,那么執(zhí)行一次循環(huán)體;假設(shè)E2值為假,那么終止循環(huán)?!?〕計(jì)算后置表達(dá)式E3;然后轉(zhuǎn)步驟〔2〕繼續(xù)執(zhí)行。語法格式:for(E1;
E2;
E3)
語句S;初始表達(dá)式E1語句S后置表達(dá)式E3判別表達(dá)式E2假真循環(huán)體,通常是復(fù)合語句關(guān)鍵字用分號隔開的三個(gè)任意表達(dá)式n=1;sum=sum+1.0/n;n<=100開始結(jié)束輸出sum真假sum=0;n=n+1;初始表達(dá)式E1判別表達(dá)式E2循環(huán)體后置表達(dá)式E3例:編程求1到100之間所有整數(shù)倒數(shù)之和for語句與while語句“互譯〞for(E1;E2;E3)語句S;翻譯成whileE1;while(E2){語句S;
E3;
}E1,E3皆為空,但分號不能少while(E)語句S;翻譯成forfor(;E;)語句S;5.5循環(huán)嵌套與輔助控制
一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套外面的嵌套稱外嵌套,里面的嵌套稱為內(nèi)嵌套,內(nèi)嵌套必須被完整的包含在外嵌套中。
內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)3種循環(huán)(while循環(huán)、do…while循環(huán)和for循環(huán))可以互相嵌套5.5.1循環(huán)嵌套【例5.4】計(jì)算1!+2!+3!+……+n!。#include<stdio.h>voidmain(){inti,j,n;floatt,s;//提高階乘以及求和的范圍printf("請輸入n:");scanf("%d",&n);
s=0;for(i=1;i<=n;i++)//外循環(huán),i形成1、2、3、…、n
{t=1;//存放階乘的變量t置初值為1for(j=1;j<=i;j++)//內(nèi)循環(huán),j形成1、2、3、…、it=t*j;//求乘積s=s+t;
//將i的階乘加到s中
}printf("1!+2!+3!+……+%d!=%.0f\n",n,s);}①將賦值語句:s=0;放到語句:for(i=1;i<n;i++)之后#include<stdio.h>voidmain(){inti,j,n;floatt,s;printf("輸入n:");scanf("%d",&n);for(i=1;i<=n;i++)
{s=0;//注意此語句的位置t=1;for(j=1;j<=i;j++)t=t*j;s=s+t;}printf("1!+2!+3!+……+%d!=%.0f",n,s);}②將賦值語句:t=1;放到語句:for(j=1;j<i;j++)之后#include<stdio.h>voidmain(){inti,j,n;floatt,s;printf("請輸入n:");scanf("%d",&n);
s=0;for(i=1;i<=n;i++){for(j=1;j<=i;j++){t=1;//注意此語句的位置t=t*j;}s=s+t;}printf("1!+2!+3!+……+%d!=%.0f",n,s);}使用循環(huán)嵌套結(jié)構(gòu)時(shí),應(yīng)注意以下幾方面:(1)在多層循環(huán)的嵌套結(jié)構(gòu)中,層次必須清楚,每層循環(huán)的功能應(yīng)該明確。(2)嵌套結(jié)構(gòu)中,內(nèi)外層循環(huán)的控制變量不能是同一個(gè)變量。(3)有關(guān)變量賦初值的位置必須在對應(yīng)循環(huán)的前面或for語句的表達(dá)式1中。前面的例5.4已經(jīng)說明了這種情況。5.5.1循環(huán)的嵌套5.5.2循環(huán)的輔助控制
1.Break語句
break語句可以用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語句。例如,break語句在while循環(huán)中的使用形式如下:while(表達(dá)式1){……if(表達(dá)式2)break;……}break語句在使用時(shí)應(yīng)注意:(1)break語句只能用在三種循環(huán)結(jié)構(gòu)和由開關(guān)語句構(gòu)成的多分支結(jié)構(gòu)中,對條件語句不起作用。(2)在多層循環(huán)中,一個(gè)break語句只向外跳一層,即退出本層循環(huán)。
【例5.5】從鍵盤上輸入多行字符并按行顯示內(nèi)容,在每行前顯示字符串是“第幾行字符,遇到Esc鍵結(jié)束。5.5.2循環(huán)的輔助控制
#include<stdio.h>#include<conio.h>voidmain(){inti=0;charc;//i表示第幾行,初值為0;c存放字符while(1)//設(shè)置循環(huán){c='\0';//變量賦初值i++;printf("第%d行字符是:",i);while(c!=13&&c!=27)//鍵盤接收字符直到按回車鍵{c=getch();//從鍵盤輸入一個(gè)字符,且不回顯if(c!=27)printf("%c",c);}printf("\n");if(c==27)break;//判斷假設(shè)按Esc鍵那么退出循環(huán)}printf("結(jié)束\n");}2.繼續(xù)語句continue繼續(xù)語句continue的作用是跳過本次循環(huán)中剩余的語句而去執(zhí)行下一次循環(huán)。continue語句只能用在for循環(huán)體中,常與if條件語句一起使用,用來加速循環(huán)。例如:continue語句在for循環(huán)中的使用形式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3){……if(表達(dá)式)continue;……}5.5.2循環(huán)的輔助控制
算法分析:如何判斷一個(gè)數(shù)是否為素?cái)?shù)?素?cái)?shù)(prime,又稱質(zhì)數(shù))是指只能被1和本身整除的數(shù))。從定義出發(fā),將1和本身之外的數(shù),依次與原數(shù)相除,看能否被整除,假設(shè)能被整除,說明不是素?cái)?shù),提前結(jié)束比較。假設(shè)不能被整除,繼續(xù)比較下一個(gè)數(shù),直到不滿足循環(huán)條件。
【例5.6】求100以內(nèi)的所有素?cái)?shù)及其個(gè)數(shù)。scanf("%d",&n);for(;;)//多種方法if()break;if(i>n-1)//循環(huán)正常結(jié)束printf("%d是素?cái)?shù)",n);解題思路:如果n能被2~(n-1)之中任何一個(gè)整數(shù)整除,那么表示n肯定不是素?cái)?shù),不必再繼續(xù)被后面的整數(shù)除,因此,可以提前結(jié)束循環(huán)。注意:此時(shí)i的值必然小于n。#include<stdio.h>voidmain(){inti,j,n;scanf("%d",&n);
for(i=2;i<=n-1;i++)//多種方法
if(n%i==0)break;if(i>n-1)//循環(huán)正常結(jié)束
printf("%d是素?cái)?shù)\n",n);}n/2n/2#include<math.h>kk=sqrt(n);intk;k將100以內(nèi)的素?cái)?shù)依次判斷,假設(shè)是素?cái)?shù)那么輸出。#include<stdio.h>#include<math.h>voidmain(){intm,i,k,f,n;printf("2");//2是特殊的素?cái)?shù),單獨(dú)輸出n=1;//置素?cái)?shù)的個(gè)數(shù)初值為1for(m=3;m<=100;m=m+2){f=1;//置素?cái)?shù)的標(biāo)志為真k=(int)sqrt(m);5.5.2循環(huán)的輔助控制
for(i=2;i<=k;i++)if(m%i==0){f=0;//置素?cái)?shù)的標(biāo)志為假break;//退出內(nèi)循環(huán)
}if(f==0)continue;printf("%d",m);n=n+1;if(n%5==0)printf("\n");//每輸出5個(gè)數(shù)就換行}printf("100以內(nèi)的素?cái)?shù)個(gè)數(shù)共有%d個(gè)\n",n);}5.5.2循環(huán)的輔助控制
5.6循環(huán)結(jié)構(gòu)程序設(shè)計(jì)及實(shí)例循環(huán)結(jié)構(gòu)程序設(shè)計(jì)1.問題分析此類問題的解決總是用循環(huán)結(jié)構(gòu)完成程序段的屢次重復(fù)執(zhí)行。2.算法分析此類問題的算法一般較復(fù)雜,主要是恰中選擇循環(huán)語句對循環(huán)體的重復(fù)執(zhí)行,特別累加和累乘的算法實(shí)現(xiàn)。常見的典型算法:求各種數(shù)、求解表達(dá)式的近似值、方程求根、求定積分的值、數(shù)據(jù)加密等。5.6.1循環(huán)結(jié)構(gòu)程序設(shè)計(jì)3.代碼設(shè)計(jì)(1)輸入原始數(shù)據(jù);(2)恰中選用當(dāng)型循環(huán)、直到型循環(huán)或計(jì)數(shù)型循環(huán)實(shí)現(xiàn)循環(huán)體的重復(fù)執(zhí)行。特別注意:有關(guān)循環(huán)變量初值語句及其位置確實(shí)定、循環(huán)體中累加或累乘的形式的表示。(3)輸出計(jì)算或處理結(jié)果。4.運(yùn)行調(diào)試用初始數(shù)據(jù)的不同情況分別測試程序的運(yùn)行結(jié)果。5.6.2循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)例【例5.7】求兩個(gè)正整數(shù)m和n的最大公約數(shù)和最小公倍數(shù)。算法分析:最小公倍數(shù)為兩個(gè)正整數(shù)m和n的乘積除以最大公約數(shù),所以只要求兩個(gè)正整數(shù)m和n的最大公約數(shù)即可。求兩個(gè)正整數(shù)m和n的最大公約數(shù)采用的是歐幾里德算法。#include<stdio.h>voidmain(){intm,n,t,p,r;printf("輸入兩個(gè)正整數(shù):");scanf("%d,%d",&m,&n)
;//輸入兩個(gè)正整數(shù)if(m<n){t=m;m=n;n=t;}//將m、n中的較大數(shù)放入m中,較數(shù)放入n中
p=m*n;//將m、n的乘積放入p中do//歐幾理德算法求最大公約數(shù){r=m%n;m=n;n=r;}while(r!=0);printf("最大公約數(shù)是:%d\n",m);printf("最小公倍數(shù)是:%d\n",p/m);}
p=m*n;r=m%n;
while(r!=0)
{
m=n;n=r;r=m%n;}printf("最大公約數(shù)是:%d\n",n);printf("最小公倍數(shù)是:%d\n",p/n);
【例5.8】用
公式求
的近似值,直到發(fā)現(xiàn)某一項(xiàng)的絕對值小于10-6
為止(該項(xiàng)不累計(jì)加)。5.6.2循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)例解題思路:求近似值的方法很多,此題是一種。其他方法:5.6.2循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)例每項(xiàng)的分子都是1后一項(xiàng)的分母是前一項(xiàng)的分母加2第1項(xiàng)的符號為正,從第2項(xiàng)起,每一項(xiàng)的符號與前一項(xiàng)的符號相反5.6.2循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)例5.6.2循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)例#include<stdio.h>#include<math.h>voidmain(){ints=1;doublepi=0,n=1,t=1;
while(fabs(t)>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf("pi=%10.8f\n",pi);}//求浮點(diǎn)數(shù)絕對值的函數(shù)只保證前5位小數(shù)是準(zhǔn)確的#include<stdio.h>#include<math.h>voidmain(){intsign=1;doublepi=0,n=1,term=1;while(fabs(term)>=1e-6){pi=pi+term;n=n+2;sign=-sign;term=sign/n;}pi=pi*4;printf("pi=%10.8f\n",pi);}//改為1e-8【例5.9】用牛頓迭代法求方程在0.5附近的根,要求精確到10-6。算法分析:牛頓迭代法是逐次使用迭代公式:進(jìn)行迭代:由x0求出x1,由x1求出x2,由x2求出x3,……,直到連續(xù)兩次差的絕對值小于給定的精度即可。
#include<stdio.h>#include<math.h>voidmain(){floatx1,x0,f,f1;scanf("%f",&x1);do{
x0=x1;f=(x0*exp(x0))-1;f1=(1+x0)*exp(x0);x1=x0-f/f1;
}while(fabs(x1-x0)>=0.000001);printf("root=%f\n",x1);}root=0.567143【例5.10】求1---1000之間的完數(shù)。一個(gè)數(shù)恰好等于它的因子和,那么稱它為完數(shù):如,6=1+2+3。輸出格式為:6的因子是:1,2,3。輸出m及其因子m==s真假求m的因子和s(條件累加)輸入整數(shù)m算法分析:一個(gè)整數(shù)是否是完數(shù)?#include<stdio.h>voidmain(){intm,s,i;for(m=1;m<=1000;m++){s=0;//求因子和開始
for(i=1;i<m;i++)if(m%i==0)s=s+i;//求因子和結(jié)束
if(m==s){printf("%d的因子是:1",m);for(i=2;i<m;i++)if(m%i==0)printf(",%d",i);printf("\n");}}}
【例5.11】
譯密碼。為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密碼,收報(bào)人再按約定的規(guī)律將其譯回原文。ABCDEFG……WXYZ非字母字符保持原狀不變輸入一行字符,要求輸出其相應(yīng)的密碼解題思路:(1)決定哪些字符不需要改變,哪些字符需要改變,如果需要改變,應(yīng)改為哪個(gè)字符?處理的方法是:輸入一個(gè)字符給字符變量c,先判定它是否字母(包括大小寫),假設(shè)不是字母,不改變c的值;假設(shè)是字母,那么還要檢查它是否’W’到’Z’的范圍內(nèi)(包括大小寫字母)。如不在此范圍內(nèi),那么使變量c的值改變?yōu)槠浜蟮?個(gè)字母。如果在’W’到’Z’的范圍內(nèi),那么應(yīng)將它轉(zhuǎn)換為A~D(或a~d)之一的字母。c=getchar();
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
if(c>='W'&&c<='Z'||c>='w'&&c<='z')c=c+4-26;elsec=c+4;(2)怎樣使c改變?yōu)樗付ǖ淖帜福糠椒ㄊ歉淖兯腁SCII值例如,字符變量c的原值是大寫字母'A',想使c的值改變?yōu)?E',只需執(zhí)行“c=c+4〞即可,因?yàn)?A'的ASCII值為65,而'E'的ASCII值為69,二者相差4。5.6.2循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)例charc;c=getchar();while(c!='\n'){if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if(c>='W'&&c<='Z'||c>='w'&&c<='z')c=c-22;elsec=c+4; }printf("%c",c);c=getchar();}可以改進(jìn)程序!charc;while((c=getchar())!='\n'){if((c>='A'&&c<='Z')||(c>='a'&&c<='z')){c=c+4; if(c>='Z'&&c<='Z'+4||c>='z'&&c<='z'+4)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人保險(xiǎn)理賠授權(quán)委托書
- 單次包車合同范本
- 口罩委托采購合同范本
- 獸藥代理合同范本
- 世界水日活動策劃方案
- 下學(xué)期幼兒教師的個(gè)人總結(jié)
- 推拿治療學(xué)模擬題+答案
- 別墅建設(shè)合同范本
- 勞務(wù)合同補(bǔ)充合同范本
- 發(fā)光字安裝合同范本
- 初中語文新人教部編版七年級下冊第一單元核心素養(yǎng)教案(2025春詳細(xì)版)
- 婦產(chǎn)科學(xué)(甲)知到智慧樹章節(jié)測試課后答案2024年秋浙江大學(xué)
- 《小學(xué)數(shù)學(xué)“對分課堂”教學(xué)模式的實(shí)踐探索》3900字(論文)
- 初中數(shù)學(xué)幾何《旋轉(zhuǎn)模型費(fèi)馬點(diǎn)》壓軸題含答案解析
- 2025年中國中信集團(tuán)招聘筆試參考題庫含答案解析
- 江西省宜春市豐城市第九中學(xué)2024-2025學(xué)年九年級上學(xué)期第二次段考化學(xué)試卷(日新班)(無答案)
- 燃?xì)夤景踩a(chǎn)實(shí)施方案
- 【MOOC】涂附磨具-河南工業(yè)大學(xué) 中國大學(xué)慕課MOOC答案
- 2024解析:第十四章內(nèi)能的利用-基礎(chǔ)練(解析版)
- 2024年湖南省初中學(xué)業(yè)水平考試·數(shù)學(xué)
- 機(jī)電設(shè)備安裝與調(diào)試技術(shù)教案
評論
0/150
提交評論