版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
程序設(shè)計(jì)基礎(chǔ)諶衛(wèi)軍清華大學(xué)軟件學(xué)院2006年秋季第五章1第五章
循環(huán)控制2西緒福斯的故事西緒福斯是希臘神話中的人物,他因?yàn)橛|犯了宙斯,死后被打入地獄受懲罰。每天清晨,他都必須將一塊沉重的巨石從平地搬到山頂上去。每當(dāng)他自以為已經(jīng)搬到山頂時(shí),石頭就突然順著山坡滾下去,于是西緒福斯只好重新回頭去搬石頭,而石頭再滾下山,……,如此循環(huán)往復(fù),沒有窮盡。3在程序設(shè)計(jì)中,當(dāng)我們需要重復(fù)地去執(zhí)行某一段代碼時(shí),可使用循環(huán)(loop)的方法。一個(gè)循環(huán)就是一組重復(fù)執(zhí)行的語句?!瓁=x+1;
sum=sum+x;
scanf(…);……循環(huán)體4
for語句
while語句
do-while語句
break語句和continue語句程序舉例本章的組織結(jié)構(gòu)55.1for語句如圖所示,顯示前100個(gè)整數(shù)的平方和立方。問題描述:111248392741664525125………6問題分析: 笨方法:對(duì)這100個(gè)整數(shù)分別進(jìn)行計(jì)算。printf(“%d%d%d\n”,1,1*1,1*1*1);printf(“%d%d%d\n”,2,2*2,2*2*2);printf(“%d%d%d\n”,3,3*3,3*3*3);printf(“%d%d%d\n”,4,4*4,4*4*4);……共需要100條語句。7問題分析: 需要對(duì)這個(gè)問題進(jìn)行抽象,歸納為一種統(tǒng)一的形式,然后采用循環(huán)語句來重復(fù)地執(zhí)行一定的次數(shù)。 對(duì)于1-100當(dāng)中的每一個(gè)整數(shù)x,其平方為:x*x,其立方為:x*x*x,可以采用for語句來重復(fù)地執(zhí)行100次,每一次處理一個(gè)整數(shù)。8
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{
語句塊;}一般形式:(1)先求解表達(dá)式1(循環(huán)變量賦初值);
(2)求解表達(dá)式2(循環(huán)條件測試),若其值為非0(真),則
執(zhí)行內(nèi)嵌的語句塊,然后轉(zhuǎn)(3);若其值為0(假),則
結(jié)束循環(huán),執(zhí)行for語句后面的一個(gè)語句;
(3)求解表達(dá)式3(循環(huán)變量增值);
(4)轉(zhuǎn)(2),繼續(xù)執(zhí)行;執(zhí)行過程:真假結(jié)束循環(huán)各部分最少被執(zhí)行幾次?9
//顯示前100個(gè)整數(shù)的平方和立方
#include<stdio.h>voidmain()
{
inti;for(i=1;i<=100;i++)
{printf(“%d%d%d\n”,i,i*i,i*i*i);}
}循環(huán)變量10111248392741664525125636216749343864512981729101001000111211331運(yùn)行結(jié)果:11
//顯示前100個(gè)整數(shù)的平方和立方
#include<stdio.h>voidmain()
{
inti;for(i=1;i<=100;i++)
{printf(“%3d%5d%7d\n”,i,i*i,i*i*i);}
}12
111248392741664525125636216749343864512981729101001000111211331新的結(jié)果:13(一)對(duì)于for語句的一般形式中的“表達(dá)式1”,(1) 它可以被省略,此時(shí)應(yīng)在for語句之前給循環(huán)變量賦初值。當(dāng)它被省略時(shí),其后的分號(hào)不能省略;
例如:for(;i<=100;i++)sum=sum+i;(2) 它可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。
例如:for(sum=0;i<=100;i++)sum=sum+i;(3) 它可以是一個(gè)簡單的表達(dá)式,也可以是逗號(hào)表達(dá)式,即包含多個(gè)簡單表達(dá)式,中間用逗號(hào)隔開。
如:for(sum=0,i=1;i<=100;i++)sum=sum+i;幾點(diǎn)說明14(二)對(duì)于for語句的一般形式中的“表達(dá)式2”,(1) 它可以被省略,即不判斷循環(huán)條件,循環(huán)無終止地進(jìn)行下去。也就是認(rèn)為表達(dá)式2的值始終為真。此時(shí)程序設(shè)計(jì)者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束;
例如:for(i=1;;i++)sum=sum+i;(2) 它一般是關(guān)系表達(dá)式(如i<=100)或邏輯表達(dá)式(如(a<b)&&(x<y)),但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非零,就執(zhí)行循環(huán)體。
例如:for(i=0;(c=getchar())!=‘\n’;i+=c);15(三)對(duì)于for語句的一般形式中的“表達(dá)式3”,(1) 它也可以被省略,即沒有循環(huán)變量增值,此時(shí)程序設(shè)計(jì)者也應(yīng)能保證循環(huán)能正常結(jié)束;
例如:for(i=1;i<=100;){sum=sum+i;i++;}(2) 與表達(dá)式1一樣,它可以是一個(gè)簡單的表達(dá)式,也可以是逗號(hào)表達(dá)式。
例如:for(i=0,j=100;i<=j;i++,j--)k=i+j;(3) 它一般是作為循環(huán)變量增值,但也可以是對(duì)循環(huán)變量進(jìn)行減值,而且每一步不一定非要加1或減1,也可以是其他的常量。16高斯的難題德國數(shù)學(xué)家高斯,在上小學(xué)的時(shí)候,老師出了一道難題,計(jì)算1+2+3+……+100,高斯很快就在自己的小石板上寫出了答案5050,老師非常驚訝,高斯怎么算得這么快呢?原來,高斯不是一個(gè)數(shù)一個(gè)數(shù)按部就班地加起出來的,而是發(fā)現(xiàn)這些數(shù)字有一個(gè)規(guī)律,一頭一尾依次兩個(gè)數(shù)相加,它們的和都是一樣的:1+100=101,2+99=101,一直到50+51=101,一共是50個(gè)101,所以,他很快就把答案算出來了。17基本思路: 把問題抽象為一種統(tǒng)一的形式,然后采用循環(huán)語句來重復(fù)地計(jì)算。 用一個(gè)變量sum來保存總和,對(duì)于1、2、3、…、100中的每一個(gè)整數(shù)i,依次把它加入到sum當(dāng)中,即sum=sum+i。18#include<stdio.h>
voidmain()
{
inti,sum;
sum=0;
for(i=1;i<=100;i++)
{
sum=sum+i;
}
printf(“sum=%d”,sum);
}sum0i=11i=235050i=100……19將原來的for(i=1;i<=100;i++)
修改為for(i=1;i<=100;i=i+2)
問:這是在計(jì)算哪些整數(shù)的和,答案是多少?
將原來的for(i=1;i<=100;i++)
修改為for(i=1;i<=100000;i++)
問:程序執(zhí)行后能夠得出正確結(jié)果嗎?如果
不能,自己想辦法解決。思考題:在程序中做如下的修改205.2while語句問題描述:顯示前若干個(gè)整數(shù)的平方和立方,只要其立方值
小于10000。111248392741664525125………21問題分析: 與for語句的例子有些類似,但不完全相同。前者指定了需要處理的整數(shù)個(gè)數(shù),而這里是要求最大的那個(gè)整數(shù),其立方必須小于某個(gè)固定的值。 循環(huán)體內(nèi)的語句無須變化,完成的是相同的功能。區(qū)別在于循環(huán)結(jié)束條件的判定??梢杂脀hile語句來完成。22
while(表達(dá)式){
語句塊;}一般形式:先判斷表達(dá)式,如果表達(dá)式的值為非0
(真),那么執(zhí)行while語句中的內(nèi)嵌語句
塊,然后又回到表達(dá)式的判斷;如果表達(dá)式
的值為0(假),那么結(jié)束循環(huán)。執(zhí)行過程:假結(jié)束循環(huán)真各部分最少被執(zhí)行幾次?23
//顯示前若干個(gè)整數(shù)的平方和立方,只要其立方值
//小于10000。
#include<stdio.h>voidmain()
{
inti;
while(i*i*i<10000)
{
printf(“%3d%5d%7d\n”,i,i*i,i*i*i);
}
}i=1;i++;24
//顯示前若干個(gè)整數(shù)的平方和立方,只要其立方值
//小于10000。
#include<stdio.h>voidmain()
{
inti;for(i=1;i*i*i<10000;i++)
{
printf(“%3d%5d%7d\n”,i,i*i,i*i*i);
}
}25脆弱的輸入方式charchoice;
printf("你是否想借書?(y/n)");scanf("%c",&choice);
……如果用戶輸入的是y/n以外的字符呢?26健壯的輸入方式charchoice;printf("你是否想借書?(y/n)");
scanf("%c",&choice);
while(choice!='y'&&choice!='n')
{
printf("你是否想借書?(y/n)");
scanf("%c",&choice);
}
……275.3do-while語句do
{
語句塊;}
while(表達(dá)式)一般形式:先執(zhí)行一次循環(huán)體語句,然后判別表達(dá)式,如果
表達(dá)式的值為非0(真),那么返回去重新執(zhí)行循環(huán)
體語句;如果表達(dá)式的值為0(假),那么結(jié)束循環(huán)。執(zhí)行過程:真假結(jié)束循環(huán)28健壯的輸入方式(do-while)charchoice;do
{printf("你是否想借書?(y/n)");
scanf("%c",&choice);}while(choice!='y'&&choice!='n');
……295.4break和continue語句break語句的功能:用來跳出switch結(jié)構(gòu);用來從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)下面的語句。一般形式為:break;30健壯的輸入方式(whileagain)charchoice;while(1)
{
printf("你是否想借書?(y/n)");
scanf("%c",&choice);
if(
choice=='y'||choice=='n')break;
}
……31輸入一組整數(shù),當(dāng)輸入–1時(shí)表示輸入結(jié)束,
然后計(jì)算這組整數(shù)的平均值;問題描述:12425125–1計(jì)算輸入數(shù)據(jù)的平均值討論32voidmain()
{
intValue,TotalValue,Num;printf(“本程序用于計(jì)算一組整數(shù)的平均值\n”);
printf(“輸入-1表示數(shù)據(jù)的結(jié)束。\n”);
TotalValue=0;
Num=0;
while(1)
{
scanf(“%d”,&Value);
if(Value==-1)break;
TotalValue+=Value;
Num++;
}
if(Num>0)
printf(“平均值是:%.1f”,(double)TotalValue/Num);
}累加模式33while(…)
{….while(…)
{……
break;}……
}
…...跳出最近的循環(huán)。34while(…)
{
….
while(…)
{
……
continue;
……
}
……
}結(jié)束本次循環(huán),即跳過循環(huán)體中尚未執(zhí)行的語句,直接
回到循環(huán)條件的判別。continue語句355.5程序舉例5.5.1計(jì)算7!問題描述: 計(jì)算7!。在數(shù)學(xué)當(dāng)中,N!的定義為:
N?。絅×(N–1)×(N–2)×…×2×1,因此,我們可以把7!展開為:
7?。?×6×5×4×3×2×1,我們的目標(biāo)即計(jì)算這7個(gè)整數(shù)之積。36思路分析:從程序的擴(kuò)展性和通用性來看,不宜采用算術(shù)表達(dá)式的方法;本題涉及到多個(gè)連續(xù)的整數(shù)的相乘(具有明顯的規(guī)律性和一致性),因此可以考慮采用循環(huán)語句的方法;循環(huán)語句的關(guān)鍵在于循環(huán)控制條件和循環(huán)體語句的設(shè)計(jì);循環(huán)控制條件的設(shè)計(jì):可令整型變量i去表示7、6、5、…、1,初始值為7或1,然后依次遞減或遞增,直到遍歷所有整數(shù);37思路分析(續(xù)):循環(huán)體語句的設(shè)計(jì):讓整型變量sum來表示乘積,其初值為1。對(duì)于每一個(gè)當(dāng)前的整數(shù)i,將其乘以sum,再將乘積保存在sum中,即
sum=sum*i
當(dāng)循環(huán)結(jié)束后,sum中的值即為所求;在設(shè)計(jì)好循環(huán)控制條件和循環(huán)體語句之后,可以根據(jù)方便與否和個(gè)人的喜好,采用任意一種循環(huán)語句(for語句、while語句或do-while語句)來編程,因?yàn)樗鼈冊(cè)诠δ苌鲜?/p>
等價(jià)的。38
初始時(shí)sum=1,i=1
…
7×6×5×4×3×2×1sum=1*1=1isum=sum*isum=1*2=2sum=2*3=6sum=720*7=504039//計(jì)算7!
#include<stdio.h>voidmain()
{
inti=1,sum=1;for(i=1;i<=7;i++)
{
sum=sum*i;
}
printf(“7!=%d”,sum);
}用for語句來實(shí)現(xiàn)//計(jì)算7!
#include<stdio.h>voidmain()
{
inti=1,sum=1;
while(i<=7)
{
sum=sum*i;
i++;
}
printf(“7!=%d”,sum);
}用while語句來實(shí)現(xiàn)累積405.5.2求π的近似值例.求π的近似值
用變量pi表示π的值。
令 表示括號(hào)中的每個(gè)項(xiàng)當(dāng)最后一項(xiàng)的絕對(duì)值小于等于時(shí),忽略掉以后的項(xiàng)思考2分鐘41思路分析:顯然不是一個(gè)簡單的算術(shù)表達(dá)式,而必須采用循環(huán)語句的方法;循環(huán)控制條件的設(shè)計(jì):題目已指明,當(dāng)最后一項(xiàng)的絕對(duì)值小于等于10-6時(shí),循環(huán)結(jié)束;循環(huán)體語句的設(shè)計(jì):需要計(jì)算每一項(xiàng)的值,并把它們累加起來,難點(diǎn)在于如何來確定
a和b的值,其中a為1、3、5、7、…,它是一個(gè)公差為2的等差數(shù)列,即ak+1=ak+2,初始值為1;b為一個(gè)符號(hào)位,其值在+1和-1之間來回變化,即bk+1=–1*bk,初值為1。42voidmain()
{
intnum=0; //總項(xiàng)數(shù)
doublepi=0,a=1.0,b=1.0,c=1.0;//a為分母,b為分子
while(fabs(c)>1e-6)
{
pi=pi+c; //累加每一項(xiàng)
num=num+1; //總項(xiàng)數(shù)加1
a=a+2.0; //計(jì)算下一項(xiàng)的分母
b=-b; //分子變正負(fù)號(hào)
c=b/a; //計(jì)算下一項(xiàng)
}pi=4.0*pi;
printf("pi=%.6f\n",pi);
printf("num=%d\n",num);
}43運(yùn)行結(jié)果:
pi=3.141591,num=500000循環(huán)控制條件不同,則得到的精度不同:將1e-6變?yōu)?e-7:pi=3.141592,num=5000000將1e-6變?yōu)?e-5:pi=3.141573,num=50000將1e-6變?yōu)?e-4:pi=3.141393,num=5000445.5.3求兩個(gè)整數(shù)的最小公倍數(shù)問題分析:假設(shè)這兩個(gè)整數(shù)為x,y,且x>y,令它們的最小公倍數(shù)為z。z一定會(huì)大于或等于x;z=kx,k=1,2,…;z一定會(huì)被y整除。45基本思路:令k=1,2,3,4,…,則kx=x,2x,3x,4x,…,即以x為公差的等差數(shù)列,那么z即為該數(shù)列當(dāng)中能被y整除的最小整數(shù)。因此,我們可以用循環(huán)語句來尋找該數(shù)。46第一步z=x=5 5%3!=0不能整除第二步z=2x=10 10%3!=0不能整除第三步z=3x=15 15%3==0 能整除找到了z,15就是5和3的最小公倍數(shù)舉例來說:
x=5,y=3.47
intx,y,z,temp,k;printf("請(qǐng)輸入兩個(gè)整數(shù),用空格隔開:");
scanf("%d%d",&x,&y);
if(x<y)
{
temp=x;x=y;y=temp;//x=y;y=x;?
}
for(k=1;;k++)
{
z=k*x;
if(z%y==0)break;
}
printf("最小公倍數(shù)為:%d\n",z);實(shí)現(xiàn)方法之一48
intx,y,z,temp;printf("請(qǐng)輸入兩個(gè)整數(shù),用空格隔開:");
scanf("%d%d",&x,&y);
if(x<y) //讓x表示兩者中的大數(shù)
{
temp=x;x=y;y=temp;
}
z=x;
while(z%y!=0) //當(dāng)z不能被y整除時(shí),就讓z累加x
{
z=z+x;
}
printf("最小公倍數(shù)為:%d\n",z);實(shí)現(xiàn)方法之二49思考題:在程序當(dāng)中為什么先要把x設(shè)定為兩者之中的大數(shù),若不這么做,程序是否正確?如果不正確,為什么?如果正確,那么這兩種做法有何區(qū)別?505.5.4顯示二維圖形問題描述: 在屏幕上顯示下列二維圖形。******************51******************問題分析:假設(shè)有m行n列,對(duì)于每一行來說,都需要連續(xù)畫n個(gè)*,似乎用一重循環(huán)已經(jīng)無法滿足題目要求,需要在循環(huán)里面再嵌套一層循環(huán),即多重循環(huán)。52重復(fù)m遍做以下的事情{
重復(fù)n遍做以下的事情
{
打印一個(gè)*號(hào)
}
換到下一行;}基本思路:53intm=3,n=6,i,j; for(i=1;i<=m;i++) //外循環(huán),打印3行{for(j=1;j<=n;j++) //內(nèi)循環(huán),打印1行
{
printf(“*”);}printf(“\n”); //換行}嵌套的循環(huán)54問題描述: 在屏幕上顯示下列二維圖形。***************另一個(gè)二維圖形有何規(guī)律?55introw=5,i,j; for(i=1;i<=row;i++) //外循環(huán),打印5行{for(j=1;j<=i;j++) //內(nèi)循環(huán),每行i個(gè)*
{
printf(“*”);}printf(“\n”); //換行}56問題描述: 在屏幕上顯示下列二維圖形。***************再一個(gè)二維圖形對(duì)于第i行,先打印(i–1)個(gè)空格;再打印(5–i+1)個(gè)星號(hào)。57introw=5,i,j; for(i=1;i<=row;i++) //外循環(huán),打印5行{for(j=1;j<=i–1;j++)//打印i-1個(gè)空格
{
printf(“”);}
for(j=i;j<=row;j++)//打印row–i+1個(gè)*
{printf(“*”);}printf(“\n”); //換行}58for(j=1;j<=i–1;j++)printf(“”);//打印i-1個(gè)空格for(j=i;j<=row;j++)printf(“*”);//打印row–i+1個(gè)*i=1(第一行):for(j=1;j<=0;j++)printf(“”);//0個(gè)空格for(j=1;j<=row;j++)printf(“*”);//5個(gè)星號(hào)i=2(第二行):for(j=1;j<=1;j++)printf(“”);//1個(gè)空格for(j=2;j<=row;j++)printf(“*”);//4個(gè)星號(hào)i=5(第五行):for(j=1;j<=4;j++)printf(“”);//4個(gè)空格for(j=5;j<=row;j++)printf(“*”);//1個(gè)星號(hào)……595.5.5誰做的好事?清華附中有四位同學(xué)中的一位做了好事,不留名,表揚(yáng)信來了之后,校長問這四位是誰做的好事。
A說:不是我。
B說:是C。
C說:是D。
D說:他胡說。已知三個(gè)人說的是真話,一個(gè)人說的是假話?,F(xiàn)在要根據(jù)這些信息,找出做了好事的人。問題描述:注:這個(gè)例子和本課程的其他一些例子,來自于吳文虎老師的講義,在此表示感謝。60下面,我們把四個(gè)人說的四句話寫成關(guān)系表達(dá)
式。在聲明變量時(shí),讓thisman表示要找的人,
定義他為字符型變量。charthisman;讓“==”的含義為“是”讓“!=”的含義為“不是”61A說:不是我。寫成關(guān)系表達(dá)式為(thisman!=‘A’)B說:是C。寫成關(guān)系表達(dá)式為(thisman=
=‘C’)C說:是D。寫成關(guān)系表達(dá)式為(thisman=
=‘D’)D說:他胡說。寫成關(guān)系表達(dá)式為(thisman!=‘D’)相應(yīng)字符的ASCII碼值為:字符 ‘A’ ‘B’‘C’‘D’ASCII碼值6566 676862顯然,不是'A'做的好事(四個(gè)關(guān)系表達(dá)式值的和為1)思路分析(1):如何找到該人,一定是“先假設(shè)某人是做好事者,
然后到每句話中去測試看有幾句是真話”?!坝腥?/p>
是真話就確定是該人,否則換下一人再試”。比如,
先假定是A同學(xué),讓thisman=‘A’,代入到四句話中:A說:thisman!='A'; 'A'!='A' 假,值為0。
B說:thisman=='C'; 'A'=='C' 假,值為0。
C說:thisman=='D'; 'A'=='D' 假,值為0。
D說:thisman!='D'; 'A'!='D' 真,值為1。63思路分析(2):顯然,不是‘B’所為(四個(gè)關(guān)系表達(dá)式值的和為2)再試B同學(xué),讓thisman=‘B’;代入到四句話中A說:thisman!=‘A’; ‘B’!=‘A’ 真,值為1。
B說:thisman==‘C’; ‘B’==‘C’ 假,值為0。
C說:thisman==‘D’; ‘B’==‘D’ 假,值為0。
D說:thisman!=‘D’;‘B’!=‘D’真,值為1。64再試C同學(xué),讓thisman=‘C’;代入到四句話中A說:thisman!=‘A’; ‘C’!=‘A’ 真,值為1。
B說:thisman==‘C’; ‘C’==‘C’ 真,值為1。
C說:thisman==‘D’; ‘C’==‘D’ 假,值為0。
D說:thisman!=‘D’;‘C’!=‘D’真,值為1。顯然,就是‘C’做了好事(四個(gè)關(guān)系表達(dá)式值的和
為3),這時(shí),我們可以理出頭緒,要用所謂的枚
舉法,一個(gè)人一個(gè)人地去試,四句話中有三句為
真,該人即為所求。思路分析(3):65//thisman分別賦值為'A','B','C','D'for(thisman='A';thisman<='D';thisman++)
{
sum=(thisman!='A') //A的話是否為真
+(thisman=='C') //B的話是否為真
+(thisman=='D') //C的話是否為真
+(thisman!='D'); //D的話是否為真
if(sum==3)
{
printf(“Thismanis%c\n”,thisman);
break;
}
}從編寫程序的角度看,實(shí)現(xiàn)枚舉最好用循環(huán)結(jié)構(gòu)。665.5.6案件分析問題描述:某地刑偵大隊(duì)涉及六個(gè)嫌疑人的一樁疑案進(jìn)行分析:
A、B至少有一人參與該案件;
A、D不可能是同案犯;
A、E、F三人中有兩人參與該案件;
B、C或同時(shí)參與,或與本案無關(guān);
C、D中有且僅有一人參與該案件;如果D沒有參與該案件,則E也不可能參與。試編寫一程序,將犯罪嫌疑人找出來。67思路分析(1):顯然這是或的關(guān)系,因此有
CC1=(A||B)將案情的每一條線索寫成邏輯表達(dá)式,第一條用
CC1表示,第二條用CC2表示,……A B CC10 0 0
1 0 1
0 1 1
1 1 1CC1:
A、B至少有一人參與該案件令變量A表示A是否參與該案件,A={0,1};
變量B表示B是否參與該案件,B={0,1};68思路分析(2):A D CC20 0 1
1 0 1
0 1 1
1 1 0CC2:
A、D不可能是同案犯
A是案犯,D不是案犯,寫成A&&(!D)D是案犯,A不是案犯,寫成D&&(!A)A、D都不是案犯,寫成(!A)&&(!D)這三者是或的關(guān)系,因此有:
CC2=(A&&(!D))||(D&&(!A))
||((!A)&&(!D))
等價(jià)于:CC2=!(A&&D)=(!A||!D)69思路分析(3):CC3:
A、E、F三人中有兩人參與該案件。分析有三
種可能:第一種,A和E參與,F(xiàn)不參與,寫成A&&E&&(!F)
第二種,A和F參與,E不參與,寫成A&&F&&(!E)
第三種,E和F參與,A不參與,寫成E&&F&&(!A)這三者是或的關(guān)系,因此有:CC3=(A&&E&&(!F))
||(A&&F&&(!E))
||(E&&F&&(!A))70AEFA&&E&&(!F)A&&F&&(!E)E&&F&&(!A)CC311100001101001101010101100110010000010000010000000000000CC3的真值表71思路分析(4):CC4:
B、C或同時(shí)參與,或與本案無關(guān),分析有兩種
可能:第一種,同時(shí)參與,寫成B&&C
第二種,都與本案無關(guān),寫成!B&&!C這兩者是或的關(guān)系,因此有:
CC4=(B&&C)||(!B&&!C)CC5:
C、D中有且僅有一人參與該案件,可分析為;CC5=(C&&!D)||(D&&!C)72思路分析(5):CC6:如果D沒有參與該案件,則E也不可能參與。這是一種蘊(yùn)涵關(guān)系,可寫成:
!D!E蘊(yùn)涵關(guān)系的規(guī)律是PQ等價(jià)于!P||Q,因此上式等價(jià)于:
CC6=D||!E以上是案情分析,已經(jīng)化成了計(jì)算機(jī)可解的邏輯
表達(dá)式。73枚舉組合!6個(gè)人每個(gè)人都有作案或不作案兩種可能,因此有26種組合,從這些組合中挑出符合6條分析的作案者。
定義6個(gè)整數(shù)變量,A,B,C,D,E,F(xiàn),分別表示6個(gè)人。枚舉每個(gè)人的可能性{0,1}
讓0表示不是罪犯;讓1表示就是罪犯。采取枚舉方法,枚舉什么呢?74for(A=0;A<=1;A++)
for(B=0;B<=1;B++)
for(C=0;C<=1;C++)
for(D=0;D<=1;D++)
for(E=0;E<=1;E++)
for(F=0;F<=1;F++)
{
CC1=A||B;
CC2=!A||!D;
CC3=(A&&E&&!F)||(A&&F&&!E)
||(E&&F&&!A);
CC4=(B&&C)||(!B&&!C);
CC5=(C&&!D)||(D&&!C);
CC6=D||!E;
if(CC1+CC2+CC3+CC4+CC5+CC6==6)
{
printf("犯罪嫌疑人是:%c%c%c%c%c%c\n",
A?'A':'',B?'B':'',C?'C':'',
D?'D':'',E?'E':'',F?'F':'');
}
}75犯罪嫌疑人是:ABCF
A、B至少有一人參與該案件;
A、D不可能是同案犯;
A、E、F三人中有兩人參與該案件;
B、C或同時(shí)參與,或與本案無關(guān);
C、D中有且僅有一人參與該案件;如果D沒有參與該案件,則E也不可能參與。765.5.7求質(zhì)數(shù)問題描述:求100以內(nèi)的所有質(zhì)數(shù)。問題分析:(1)對(duì)100以內(nèi)的每一個(gè)整數(shù),判斷其是否為質(zhì)數(shù);(2)判斷整數(shù)m是否為質(zhì)數(shù)的方法:讓m被2到除,如果m能被其中的任何一個(gè)整數(shù)整除,則說明它不是一個(gè)質(zhì)數(shù);否則的話,說明它是一個(gè)質(zhì)數(shù)。77inti,j,sq,num;num=0;
for(i=2;i<=100;i++)
{
sq=(int)sqrt(i);
for(j=2;j<=sq;j++)
{
if(i%j==0)break;
}
if(j>sq)
{
printf("%2d",i);
num++;
if(num%10==0)printf("\n");
}
}78
2357111317192329313741434753596167717379838997795.5.8猜數(shù)游戲問題描述:猜數(shù)游戲。計(jì)算機(jī)隨機(jī)地選擇一個(gè)在0-999之間的整數(shù),然后讓人來猜。如果猜測的數(shù)字大于實(shí)際的數(shù)字,就提示說太大了;否則就提示說太小了。總共只給10次機(jī)會(huì)。80
隨機(jī)數(shù)說明:1、要產(chǎn)生隨機(jī)數(shù)需要在程序開頭加入頭文件
#include<s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版酒店紅酒供貨合同
- 2025年度新能源汽車充電樁運(yùn)營管理合同重點(diǎn)條款探討3篇
- 2024政府機(jī)關(guān)綠化工程采購合同范本二零二四2篇
- 二零二五版合同能源服務(wù)與節(jié)能產(chǎn)品推廣協(xié)議模板3篇
- 2025年度智能場館場地租賃合同范本3篇
- 2024自建房施工合同包工包料合同
- 二零二四年度35kv架空線路施工工程設(shè)計(jì)與施工協(xié)調(diào)合同
- 2025年度金融機(jī)構(gòu)外匯借款合同模板12篇
- 勞動(dòng)合同編號(hào):XX-2025年度-001
- 2025年智能燃?xì)獗硗茝V與應(yīng)用居民供氣合同3篇
- 城市軌道交通的網(wǎng)絡(luò)安全與數(shù)據(jù)保護(hù)
- 英國足球文化課件
- 《行政職業(yè)能力測驗(yàn)》2023年公務(wù)員考試新疆維吾爾新疆生產(chǎn)建設(shè)兵團(tuán)可克達(dá)拉市預(yù)測試題含解析
- 醫(yī)院投訴案例分析及處理要點(diǎn)
- 燙傷的安全知識(shí)講座
- 工程變更、工程量簽證、結(jié)算以及零星項(xiàng)目預(yù)算程序?qū)嵤┘?xì)則(試行)
- 練習(xí)20連加連減
- 五四制青島版數(shù)學(xué)五年級(jí)上冊(cè)期末測試題及答案(共3套)
- 員工內(nèi)部崗位調(diào)換申請(qǐng)表
- 商法題庫(含答案)
- 鋼結(jié)構(gòu)用高強(qiáng)度大六角頭螺栓連接副 編制說明
評(píng)論
0/150
提交評(píng)論