6. 流程控制
流程控制,就是研究程序的走向。
6.1. 流程控制概述
6.1.1. 三大流程結(jié)構(gòu):
順序結(jié)構(gòu):
程序運(yùn)行的自然狀態(tài),就是從前往后(從上到下)運(yùn)行程序。
分支結(jié)構(gòu):
程序運(yùn)行過(guò)程中,根據(jù)判斷條件的不同結(jié)果(true或false),執(zhí)行不同的分支(其他分支不再執(zhí)行)。
循環(huán)結(jié)構(gòu):
程序運(yùn)行過(guò)程中,根據(jù)判斷條件的不同結(jié)果(true或false),決定是再次執(zhí)行還是不再執(zhí)行。
6.1.2. 流程圖常用圖形符號(hào):
6.2. if語(yǔ)句
有如下幾種常見(jiàn)的if語(yǔ)句(不同的分支數(shù)量):
6.2.1. 形式1:?jiǎn)畏种?/strong>
形式:
if ( 條件判斷 ){
//如果條件滿足,就執(zhí)行這里
}
流程圖:

6.2.2. 形式2:雙分支
形式:
if ( 條件判斷 ){
//如果條件滿足,就執(zhí)行這里
}
else{
//如果條件不滿足,就執(zhí)行這里
}
流程圖:


6.2.3. 形式3:多分枝
形式:
if ( 條件判斷1 ){
//分支1;
}
elseif( 條件判斷2 ){
//分支2;
}
elseif( 條件判斷3 ){
//分支3;
}
。。。。。。。前面的elseif分支,可以若干個(gè)(0個(gè)以上)
else{
//最后的else分支,可以沒(méi)有!
}
流程圖:


<u>綜合案例:</u>
在一個(gè)form表單中輸入一個(gè)分?jǐn)?shù)(0-100之間),程序可以給該分?jǐn)?shù)進(jìn)行“評(píng)語(yǔ)”,評(píng)語(yǔ)包括:
優(yōu)秀,良好,中等,及格,不及格。
6.3. 分支結(jié)構(gòu)之switch分支語(yǔ)句(重點(diǎn))
語(yǔ)法:
switch( 一個(gè)變量數(shù)據(jù)或表達(dá)式結(jié)果$v1 ){
case 值1: //如果$v1 等于 這個(gè)“值1”,就執(zhí)行本分支
分支語(yǔ)句1;
break; //表示跳出該分支,也就是跳出switch語(yǔ)句。
case 值2: //如果$v1 等于 這個(gè)“值2”,就執(zhí)行本分支
分支語(yǔ)句2;
break;
。。。。。。 //可以更多的分支
default:
默認(rèn)分支; //前面都不滿足的時(shí)候,就執(zhí)行這里
}
說(shuō)明:
1,上述“值1,值2,。。。”可以是各種標(biāo)量類(lèi)型,也可以是表達(dá)式——因?yàn)樽罱K它也是一個(gè)值。
2,用于進(jìn)行測(cè)試的數(shù)據(jù)變量$v1跟后續(xù)的各個(gè)值,只能進(jìn)行“相等比較”(==)。
3,從上述第2條角度來(lái)說(shuō),其實(shí)際上不如if靈活。
注意:
當(dāng)某個(gè)分支滿足條件并執(zhí)行該分支后,如果該分支中沒(méi)有break語(yǔ)句,此時(shí),程序的流程會(huì)“直接進(jìn)入”后一個(gè)分支繼續(xù)執(zhí)行,直到碰到break才會(huì)結(jié)束switch。
流程圖:

<u>示例:</u>

無(wú)break終止時(shí):

案例1:
使用switch實(shí)現(xiàn)
把成績(jī)進(jìn)行分檔:60分以下:不及格;60-69:及格; 70-79:中等;80-89:良好;90-99:優(yōu)秀;100:滿分

案例2:
輸入任意的年份和月份,輸出該月的天數(shù),例如:輸入year:2019 month:7,輸出該月的天數(shù)是31天
思路:天數(shù)是根據(jù)月份來(lái)決定,正常的是:1,3,5,7,8,10,12都是31天,4,6,9,11都是30天,唯一不同的是:
2月,如果是閏年是29天,非閏年則為28天。
<?php
/*
輸入任意的年份和月份,輸出該月的天數(shù),例如:輸入year:2019 month:7,輸出該月的天數(shù)是31天
思路:天數(shù)是根據(jù)月份來(lái)決定,正常的是:1,3,5,7,8,10,12都是31天,4,6,9,11都是30天,唯一不同的是:
2月,如果是閏年是29天,非閏年則為28天。
*/
$year=2000;
$month=2;
switch ($month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
echo "31天";
break;
case 4:
case 6:
case 9:
case 11:
echo "30天";
break;
case 2:
if($year%4==0&&$year%100!=0 || $year%400==0){
echo "29天";
}else{
echo "28天";
}
break;
default:
echo "非法的月份";
break;
}
6.4. 循環(huán)結(jié)構(gòu)之while循環(huán)語(yǔ)句
循環(huán)的含義:就是通過(guò)某種語(yǔ)法結(jié)構(gòu),對(duì)某段代碼可以“反復(fù)執(zhí)行”。
while循環(huán)語(yǔ)法:
**初始化數(shù)據(jù)**
while(條件判斷){
。。。。循環(huán)體語(yǔ)句;
循環(huán)控制;
}
說(shuō)明:
循環(huán)一開(kāi)始就進(jìn)行條件判斷:
如果成立:則執(zhí)行循環(huán)體,而后會(huì)自動(dòng)回到循環(huán)開(kāi)始位置繼續(xù)進(jìn)行條件判斷,如此反復(fù);
如果不成立:則退出循環(huán),執(zhí)行后續(xù)語(yǔ)句。
流程圖:

<u>案例1:</u>
1)輸出1-10;

2)求1-10的和;

<u>案例2:</u>
求7到17的和。

<u>案例3:</u>
1、輸出1-100之間既能被3整除,也能被6整除的數(shù)

2、一張紙的厚度是2mm,問(wèn):折疊多少次后能夠達(dá)到珠峰的高度(8848米)

6.5. 循環(huán)結(jié)構(gòu)之do while循環(huán)語(yǔ)句
**do while循環(huán)語(yǔ)法:**
** 初始化數(shù)據(jù)**
do {
。。。。循環(huán)體語(yǔ)句;
循環(huán)控制;
}while(條件判斷);
說(shuō)明:
先執(zhí)行一次循環(huán)體,然后進(jìn)行條件判斷:
如果成立:則繼續(xù)回去執(zhí)行循環(huán)體,而后再次進(jìn)行條件判斷,如此反復(fù);
如果不成立:則退出循環(huán),執(zhí)行后續(xù)語(yǔ)句。
流程圖:


<u>案例:</u>
求7到177之間能被7整除的數(shù)的和。

6.6. 循環(huán)結(jié)構(gòu)之for循環(huán)語(yǔ)句(重點(diǎn)/難點(diǎn))
for循環(huán)語(yǔ)法:
for(循環(huán)變量初始化1; 循環(huán)條件判斷2; 循環(huán)變量的改變3){
。。。。。。。。循環(huán)體語(yǔ)句塊4;
//這里可以有多條語(yǔ)句
//是可以反復(fù)執(zhí)行的部分
}
說(shuō)明:
1,執(zhí)行流程如下圖所示

2,此語(yǔ)句結(jié)構(gòu)是將循環(huán)的3個(gè)要素都集中在一起寫(xiě)的形式,比較緊湊,容易控制,最常用。
3,循環(huán)變量初始化語(yǔ)句1只執(zhí)行一次,所以真正的正常循環(huán),是在“2->4->3”之間進(jìn)行。
典型流程圖:

<u>案例1:</u>
求1-100之間能被7整除的數(shù)的和。

<u>案例</u>****<u>2:</u>
輸出1-100之間能被3整除但不能被5整除的偶數(shù)。

<u>案例3:</u>
輸出1-100之間的數(shù),并且要求:
能被3整除的使用“三”代替,能被5整除的使用“五”代替,能同時(shí)被兩者整除的用“三五”代替。

6.7. 循環(huán)的中斷
循環(huán)是按給定的條件,只要條件滿足就會(huì)繼續(xù)執(zhí)行循環(huán)體的一種語(yǔ)法形式。
但,我們也可以在循環(huán)過(guò)程中(循環(huán)體內(nèi)),人為將循環(huán)中斷。
有兩種中斷循環(huán)的方式:
continue中斷:
含義:中斷當(dāng)前正在進(jìn)行的循環(huán)體(即后續(xù)語(yǔ)句不再執(zhí)行),繼續(xù)下一次循環(huán)要執(zhí)行的語(yǔ)句。
語(yǔ)法形式:
continue [$n]; //表示是要中斷第幾層的循環(huán),繼續(xù)該層循環(huán)的下一次。
//其中$n可以省略,如果省略,表示1,就是中斷當(dāng)前層的循環(huán)。
break中斷:
含義:停止(跳出)當(dāng)前正在進(jìn)行的循環(huán)(即完全終止循環(huán)),去執(zhí)行該循環(huán)之后的語(yǔ)句。
語(yǔ)法形式:
break [$n]; //表示是要中斷幾層循環(huán)。
//其中$n可以省略,如果省略,表示1,就是中斷當(dāng)前循環(huán)
他們都適用于3種循環(huán)。
<u>案例演示:</u>
1、輸出1-10的數(shù),除了5不輸出,其他都輸出出來(lái)。


2、從1-10(含1和10)進(jìn)行循環(huán)并輸出該數(shù)字,并要求能被3整除就不輸出,能被9整除就終止循環(huán)。
最后再輸出循環(huán)變量的值。

while和for的區(qū)別:
1、能用for解決的,while基本能解決;
2、for一般用于知道循環(huán)次數(shù)的場(chǎng)景,while循環(huán)一般用于不知道循環(huán)次數(shù)的場(chǎng)景
6.8. 多重循環(huán)及案例
概念:
多重循環(huán)就是循環(huán)里面由出現(xiàn)循環(huán)的代碼。
其基本執(zhí)行流程,其實(shí)仍然是循環(huán)的基本邏輯,只是循環(huán)的時(shí)候要注意:外層循環(huán)執(zhí)行每一次,里層循環(huán)就會(huì)完整執(zhí)行循環(huán)的“所有次”(一個(gè)完整循環(huán)的過(guò)程)。
<u>案例</u>****<u>1:</u>

輸出如下形式的數(shù)字到頁(yè)面上:
1 2 3 4 5 6 7 8
2 2 3 4 5 6 7 8
3 2 3 4 5 6 7 8
4 2 3 4 5 6 7 8

| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 3 | 4 | 5 |


<u>案例</u>****<u>2:</u>
輸出如下表格:
| 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|
| 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 |
方法一:

方法二:
| 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|
| 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 |

<u>案例3:</u>
實(shí)現(xiàn)如下所示99乘法口訣表。


<u>案例4:</u>
有紅、白、黑三種球若干個(gè),其中紅、白球共25個(gè),白、黑球共31個(gè),紅、黑球共28個(gè),求這三種球各多少個(gè)?
課間案例:
公雞5元一只,母雞3元一只,小雞1元3只,100元買(mǎi)了100只雞,問(wèn)各多少?
