6.1.流程控制概述
6.1.1.三大流程结构:
- 顺序结构:
程序运行的自然状态,就是从前往后(从上到下)运行程序。 - 分支结构:
程序运行过程中,根据判断条件的不同结果(true或false),执行不同的分支(其他分支不再执行)。 - 循环结构:
程序运行过程中,根据判断条件的不同结果(true或false),决定是再次执行还是不再执行。
###6.1.2.流程图常用图形符号:
6.2.if语句
有如下几种常见的if语句(不同的分支数量):
6.2.1.形式1:单分支
形式:
if ( 条件判断 )
{
//如果条件满足,就执行这里
}
流程图:
6.2.2.形式2:双分支
形式:
if ( 条件判断 )
{
//如果条件满足,就执行这里
}
else
{
//如果条件不满足,就执行这里
}
流程图:
6.2.3.形式3:多分枝
形式:
if ( 条件判断1 ){
//分支1;
}
elseif( 条件判断2 ){
//分支2;
}
elseif( 条件判断3 ){
//分支3;
}
。。。。。。。前面的elseif分支,可以若干个(0个以上)
流程图:
示例:
如果我有钱,那么我的规划是:
有10万以上,买一个汽车
有2万以上,买一个摩托车
有5000以上,买一个电动单车
有1000以上,买自行车
$money = 999;
if( $money >= 100000)
{
echo "买汽车";
}
elseif($money >= 20000)
{
echo "买摩托";
}
elseif($money >= 5000)
{
echo "买电动单车";
}
elseif($money >= 1000)
{
echo "自行车";
}
else
{
echo "搬砖去吧";
}
6.2.4.if语句综合形式
if( 条件1)
{
分支1
}
elseif(条件2)
{
分支2:;
}
elseif( 条件3)
{
分支3;
}
。。。。。。
else
{
//前面没有一个条件满足的时候,就执行本分支
}
综合案例:
在一个form表单中输入一个分数(0-100之间),程序可以给该分数进行“评语”,评语包括:
优秀,良好,中等,及格,不及格。
<form action="" method="post">
输入分数:<input type="text" name="score">(0-100之间)
<br><input type="submit" value="做评语">
</form>
if(!empty( $_POST['score'] ))//如果不为空
{
$sc = $_POST['score'];
if( $sc >= 90 )
{
echo "优秀";
}
elseif($sc >= 80)
{
echo "良好";
}
//。。。更多elseif分支,以及else情况
//注意:
//还要考虑分数不在这个范围的情况
//还要考虑不是分数(比如字母)的情况
}
elseif(isset($_POST['score']) && $_POST['score'] == "0")
{
echo "不及格";
}
else{
echo "请输入分数";
}
6.3.分支结构之switch分支语句(重点)
switch( 一个变量数据或表达式结果$v1 )
{
case 值1: //如果$v1 等于 这个“值1”,就执行本分支
分支语句1;
break; //表示跳出该分支,也就是跳出switch语句。
case 值2: //如果$v1 等于 这个“值2”,就执行本分支
分支语句2;
break;
。。。。。。 //可以更多的分支
default:
默认分支; //前面都不满足的时候,就执行这里,default分支也可以不写
}
1,上述“值1,值2,。。。”可以是各种标量类型,也可以是表达式——因为最终它也是一个值。
2,用于进行测试的数据变量$v1跟后续的各个值,只能进行“相等比较”(==)。
3,从上述第2条角度来说,其实际上不如if灵活。
当某个分支满足条件并执行该分支后,如果该分支中没有break语句,此时,程序的流程会“直接进入”后一个分支继续执行,直到碰到break才会结束switch。
示例:
给出任意年份和月份,输出该月的天数。
//给出任意年份和月份,输出该月的天数。
$year = 2008;
$month = 22;
switch( $month )
{
case 1:
echo "{$year}年{$month}月的天数为31天";
break;
case 3:
echo "{$year}年{$month}月的天数为31天";
break;
case 5:
echo "{$year}年{$month}月的天数为31天";
break;
case 7:
echo "{$year}年{$month}月的天数为31天";
break;
case 8:
echo "{$year}年{$month}月的天数为31天";
break;
case 10:
echo "{$year}年{$month}月的天数为31天";
break;
case 12:
echo "{$year}年{$month}月的天数为31天";
break;
case 4:
echo "{$year}年{$month}月的天数为30天";
break;
case 6:
echo "{$year}年{$month}月的天数为30天";
break;
case 9:
echo "{$year}年{$month}月的天数为30天";
break;
case 11:
echo "{$year}年{$month}月的天数为30天";
break;
case 2:
//如果是闰年
if( $year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)
{
echo "{$year}年{$month}月的天数为29天";
}
else
{
echo "{$year}年{$month}月的天数为28天";
}
break;
default:
echo "没有该月份";
}
//给出任意年份和月份,输出该月的天数。
$year = 2008;
$month = 22;
switch( $month )
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
echo "{$year}年{$month}月的天数为31天";
break;
case 4:
case 6:
case 9:
case 11:
echo "{$year}年{$month}月的天数为30天";
break;
case 2:
//如果是闰年
if( $year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)
{
echo "{$year}年{$month}月的天数为29天";
}
else
{
echo "{$year}年{$month}月的天数为28天";
}
break;
default:
echo "没有该月份";
}
6.4.循环结构之while循环语句
循环的含义:就是通过某种语法结构,对某段代码可以“反复执行”。
while(条件判断)
{
。。。。循环体语句;
}
说明:
循环一开始就进行条件判断:
如果成立:则执行循环体,而后会自动回到循环开始位置继续进行条件判断,如此反复;
如果不成立:则退出循环,执行后续语句。
案例:求7到17的和。
//求7到17的和。
$n = 7;
$sum = 0;
while ( $n <= 17)
{
//$sum = $sum + $n; //好low
$sum += $n;
$n++;
}
echo "和为$sum";
案例:求1-100之间能被3整除的数的和!
求1-100之间能被3整除的数的和!
//输出1-100之间能被3整除但不能被5整除的偶数。
for($i = 1; $i <= 100; $i++)
{
if($i % 3 == 0 && $i % 5 != 0 && $i % 2 == 0)
{
echo "$i, ";
}
}
6.5.循环结构之do while循环语句
do while循环语法:
do
{
。。。。循环体语句;
}while(条件判断);
说明:
先执行一次循环体,然后进行条件判断:
如果成立:则继续回去执行循环体,而后再次进行条件判断,如此反复;
如果不成立:则退出循环,执行后续语句。
案例:求7到177之间能被7整除的数的平均值。
求7到177之间能被7整除的数的平均值。
//求7到177之间能被7整除的数的平均值。
$n = 7;
$sum = 0; //总和
$count = 0; //个数
do
{
//.......做点什么。。。。
if($n % 7 == 0)
{
$sum += $n; //累加器
$count++; //计数器
}
$n++;
}while( $n <= 177 );
$avg = $sum / $count; //平均值
echo $avg;
1,不管是while,还是dowhile,都请先写出一个良好的可运行的循环结构!
2,通常,循环体内的最后位置写循环变量的改变语句;
6.6.循环结构之for循环语句(重点/难点)
for(循环变量初始化; 循环条件判断;循环变量的改变){
。。。。。。。。循环体语句块
}
//这里可以有多条语句
//是可以反复执行的部分
此语句结构是将循环的3个要素都集中在一起写的形式,比较紧凑,容易控制,最常用。
案例1:求1-100之间能被7整除的数的和
求1-100之间能被7整除的数的和。
$sum = 0; //总和
for( $i = 1; $i <= 100; $i++)
{
if( $i % 7 == 0)
{
$sum += $i; //累加
}
}
echo $sum;
案例2:输出1-100之间能被3整除但不能被5整除的偶数
输出1-100之间能被3整除但不能被5整除的偶数。
//输出1-100之间能被3整除但不能被5整除的偶数。
for($i = 1; $i <= 100; $i++)
{
if($i % 3 == 0 && $i % 5 != 0 && $i % 2 == 0)
{
echo "$i, ";
}
}
案例3:输出1-100之间的数
输出1-100之间的数,并且要求:
能被3整除的使用“三”代替,能被5整除的使用“五”代替,能同时被两者整除的用“三五”代替。
for($i = 1; $i <= 100; ++$i)
{
if($i % 3 == 0 && $i % 5 == 0)
{
echo '三五,';
}
elseif($i % 5 == 0)
{
echo "五,";
}
elseif($i % 3 == 0)
{
echo "三,";
}
else
{
echo "$i, ";
}
}
6.7.多重循环及案例
概念:
多重循环就是循环里面由出现循环的代码。
其基本执行流程,其实仍然是循环的基本逻辑,只是循环的时候要注意:外层循环执行每一次,里层循环就会完整执行循环的“所有次”(一个完整循环的过程)。
案例1:输出如下形式的数字
输出如下形式的数字到页面上:
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;
for($n1 = 1; $n1 <= 4; $n1++)
{
echo "<br>$n1 ";
for($n2 = 2; $n2<=7; $n2++)
{
echo "$n2 ";
}
echo "8;";
}
案例2:输出如下表格
输出如下表格:
<?php
echo "<table border='1' width=400 height=100>";
$n = 0;//计数器 记录循环次数
for($i = 1; $i <= 4; $i++)
{
echo "<tr>";//输出行的开始标签
for($k = 1; $k <= 6; $k++)
{
$n++;
echo "<td>$n</td>";
}
echo "</tr>";//输出行的结束标签
}
?>
</table>
<?php
echo $n;
?>
案例3:99乘法口诀表
实现如下所示99乘法口诀表。
<table border="1" width="700" height="200">
<?php
for($i = 1; $i <= 9; $i++)
{
echo "<tr>";//输出行的开始标签
for($k = 1; $k <= $i; $k++)
{
$s = $k*$i;
//echo "<td>{$k}X$i=$s</td>";
//上一行还有一种写法如下:
echo "<td>{$k}X$i=" . $k*$i . "</td>";
}
echo "</tr>";//输出行的结束标签
}
?>
</table>
案例4:公鸡5元一只,母鸡3元一只,小鸡1元3只,100元买了100只鸡,问各多少只?
<?php
//公鸡5元一只,母鸡3元一只,小鸡1元3只,100元买了100只鸡,问各多少只?
/*
如果公鸡1只,母鸡1只,小鸡1只,则总价为:...... 不对。
如果公鸡1只,母鸡1只,小鸡2只,则总价为:...... 不对。
如果公鸡1只,母鸡1只,小鸡3只,则总价为:...... 不对。
......
如果公鸡1只,母鸡2只,小鸡1只,则总价为:...... 不对。
如果公鸡1只,母鸡2只,小鸡2只,则总价为:...... 不对。
如果公鸡1只,母鸡2只,小鸡3只,则总价为:...... 不对。
...... ......... .........
如果公鸡100只,母鸡100只,小鸡100只,则总价为:...... 不对。
这种编程思想,叫做“穷举”,就是将所有可能的答案都罗列出来,然后挨个去“验证”
*/
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100; $gongji++)
{
for($muji = 0; $muji <= 100; $muji++)
{
for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
{
if($gongji + $muji + $xiaoji == 100 && $gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
}
}
}
echo "<br>运行次数:$count";
echo "<h3>改进1:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
for($muji = 0; $muji <= 100/3; $muji++)
{
for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
{
if($gongji + $muji + $xiaoji == 100 && $gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
}
}
}
echo "<br>运行次数:$count";
echo "<h3>改进2:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
for($muji = 0; $muji <= 100/3; $muji++)
{
//在公鸡母鸡数量确定了之后,小鸡的数量也可以确定了,所以,不用去循环了!!!
//for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
//{
$xiaoji = 100 - $gongji - $muji;
//既然小鸡数据根据条件算出,则无需再进行验证总数量了!
if($gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
//}
}
}
echo "<br>运行次数:$count";
echo "<h3>改进3:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
//考虑公鸡在给定数量情况下,所划掉的钱,剩余的钱(100-$gongji*5)才可能去买母鸡
for($muji = 0; $muji <= (100-$gongji*5)/3; $muji++)
{
//在公鸡母鸡数量确定了之后,小鸡的数量也可以确定了,所以,不用去循环了!!!
//for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
//{
$xiaoji = 100 - $gongji - $muji;
//既然小鸡数据根据条件算出,则无需再进行验证总数量了!
if($gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
//}
}
}
echo "<br>运行次数:$count";
echo "<h3>改进4:</h3>";
$count = 0; //用于记录运行(计算)的次数!
for($gongji = 0; $gongji <= 100/5; $gongji++)
{
//考虑公鸡在给定数量情况下,所划掉的钱,剩余的钱(100-$gongji*5)才可能去买母鸡
for($muji = 0; $muji <= (100-$gongji*5)/3; $muji++)
{
//在公鸡母鸡数量确定了之后,小鸡的数量也可以确定了,所以,不用去循环了!!!
//for($xiaoji = 0; $xiaoji <= 100; $xiaoji++)
//{
$xiaoji = 100 - $gongji - $muji;
if($xiaoji % 3 != 0){//小数数量必须是3的倍数,否则不应该继续计算(判断)了
continue; //中断本次计算(判断)
}
//既然小鸡数据根据条件算出,则无需再进行验证总数量了!
if($gongji*5 + $muji*3 + $xiaoji/3 == 100)
{
echo "<br>公鸡:$gongji, 母鸡:$muji, 小鸡:$xiaoji";
}
$count++;
//}
}
}
echo "<br>运行次数:$count";
?>
6.8.循环的中断
循环是按给定的条件,只要条件满足就会继续执行循环体的一种语法形式。
但,我们也可以在循环过程中(循环体内),人为将循环中断。
有两种中断循环的方式:
continue中断:
含义:中断当前正在进行的循环体(即后续语句不再执行),继续下一次循环要执行的语句。
语法形式:
continue [$n]; //表示是要中断第几层的循环,继续该层循环的下一次。
//其中$n可以省略,如果省略,表示1,就是中断当前层的循环。
break中断:
含义:停止(跳出)当前正在进行的循环(即完全终止循环),去执行该循环之后的语句。
语法形式:
break [$n]; //表示是要中断几层循环。
//其中$n可以省略,如果省略,表示1,就是中断当前循环
他们都适用于3种循环。
循环中断的层数的含义
for(....) //循环1
{
for(...) //循环2
{
for(...) //循环3
{
break ; //中断循环3
break 1; //中断循环3
break 2; //中断循环2
break 3; //中断循环1
//continue道理一样!
}
break 1; //中断循环2
break 2; //中断循环1
}
break 1; //中断循环1
}
//.......
案例演示:
从1-10(含1和10)进行循环并输出该数字,并要求能被3整除就不输出,能被9整除就终止循环。
最后再输出循环循环变量的值。
情形1:
情形2: