《教学PPT基本控制结构1.ppt》由会员分享,可在线阅读,更多相关《教学PPT基本控制结构1.ppt(45页珍藏版)》请在三一文库上搜索。
1、第三章 基本控制结构,if语句 switch语句 while语句 do-while语句 for语句 循环不变式,3.1 程序的基本控制结构 3.1.1 C+语言的简单语句,单语句:以分号“;”结束 int a; 变量定义语句 a=3*2; 表达式语句 function(“example”); 函数调用语句 空语句:只有一个分号“;” 复合语句(块语句) 用花括号 括起来的若干条语句(可以是单语句、空语句、其他块语句) 块语句在语法上等价于一个单语句,所以在单语句可用的地方我们也可以使用块语句。 块语句中每一个语句都以分号“;”结束,块语句本身则以右花括号“”结束,if(ab) int t=a;
2、 a=b; b=t; ,3.1.1 C+语言的简单语句,3.1.2单入口单出口控制结构,实现单入口单出口程序只需三种基本的控制结构 顺序结构 选择结构 当条件p(条件表达式)成立,则执行一个分支,否则执行另一个分支 多路分支 循环结构 实现反复执行某一部分的操作 循环结构三要素: 循环条件p 循环体A 循环变量:在每次循环中都必须有语句修改此变量的值,以使循环条件表达式的值可能改变,从而跳出循环,3.1.3 结构化程序设计工具,程序框图 结构化程序设计图形工具 N_S图 PAD图 Jackson结构图 Warnier图 PDL(Program Design Language),3.2 选择结构
3、,3.2.1 if 语句 if (条件表达式) 子语句; if语句的有效范围是单个语句,如果子语句有多个语句,则必须用括起来,成为一个复合语句 if (条件表达式) 子语句1; else 子语句2;,例3.2.1 输入24小时制的时间,转换并输出12小时制的时间并注明是上午还是下午(上午用A.M表示,下午用P.M表示),#include main() int hour; char noon = A; cout hour; if (hour 12) hour = hour - 12; noon = P; cout “The hour is “ hour noon “.M.n“; ,*如果去掉花括
4、号 if (hour 12) hour = hour - 12; noon = P; “noon = P;”不是if的子语句,而是主流程if语句的下一个顺序语句,程序2: 程序3:,#include void main() float x; coutx; if (x12) cout “ P.M: “; x=x-12; else cout “ A.M: “; coutxn; ,(改进) #include void main() float x; coutx; if(x=12) cout “ A.M: “; else cout “ P.M: “; x=x-12; coutxn; /注意书写层次结构
5、,例3.2.2 一个具有输入合法性检测的程序,要求用户输入的工龄在047之间,如果超出此范围则提示输入错误,否则才接受用户输入。用户输入错误时,程序用转义字符输出一声响铃,main() int standing; / 用户输入的工龄 float standing_salary;/ 根据用户输入工龄计算出来的工龄工资 cout standing; if (standing = 0) ,嵌套if语句,if (表达式1) if (表达式2) 子语句1; else 子语句2; else 子语句3; if (表达式1) 子语句1; else if (表达式2) 子语句2; else if (表达式n)
6、子语句n; else 子语句n1;,例3.2.3 从键盘上输入3个数A,B,C,求出三数中最大者并输出。,#include void main() int A,B,C,max; coutABC; max = A; if (Bmax) max = B; / 求出A、B中的较 /大值,记录在max中,然后再比较C与max if (Cmax) max = C; cout “ MAX(A,B,C): “ maxn; ,采用嵌套if语句来实现,if (A B) if (A C) cout C) cout“Maximum is “ B ; else cout“Maximum is “ C; ,垂悬else
7、问题,if (p1) if (p2) a=1; else a=2; 这样的语句会引起二义性,else子句不知道应该与哪个if语句配对。 C+语言中是就近配对: if (p1) 注意if与else的配 if (p2) a=1; 对关系,else总是 else a=2; 与它上面的最近的 if配对,注意问题,if语句中的表达式,一般为逻辑表达式或关系表达式 else子句不能单独使用,必须与if配套使用 if以及else语句后面都只含一个内嵌的操作语句,有效范围都只有一个语句,若需含多个操作,则须用 括起来。 例: if (a+bc) coutc”; c = a+b; else cout“a+b=c
8、”;,程序3.2.4,/程序:AVERAGE.CPP /功能:求数、理、化三科平均成绩的总评,演示if语句嵌套的缩进格式 #include void main() int math,phys,chem; int average; float scholarship; coutmathphyschem; average=(math+phys+chem)/3.0+0,5; /why? if(average=90) cout=80) cout“ Good.n“; scholarship=85.00;,程序3.2.4, else if (average=70) cout=60) cout“ Pass.
9、n“; scholarship=45.50; else cout“ Fail.n“; scholarship=0.00; cout“Your scholarship is scholarship“.n“; ,条件表达式短路求值,if(members!=0)&(income/members800.00) = if(members!=0) if (income/members800.00) expression1& expression2 / expression1为0, expression2不做 expression1| expression2 / expression1非0, express
10、ion2不做,3.2.2 switch语句,多分支选择语句 switch语句的一般形式如下: switch (表达式) case 常量表达式1: 语句序列1; break; case 常量表达式2: 语句序列2; break; case 常量表达式n: 语句序列n; break; default: 语句序列n + 1; break; ,说明,表达式可为任何类型。Switch在入口时判断表达式与哪个常量表达式匹配。若表达式的值与某个case后面的常量相等,则执行与该case后面相应的语句;若与所有列出的常量都不相等,则执行default后面的语句。 case后只能是常量表达式,不能是变量表达式,
11、其值只能是整型、字符型、枚举型,不能是其他类型。每个常量表达式的值都不相同。 case部分与default部分出现次序不影响执行结果。每部分不限单个语句,可写多个语句,不用加 。 break;语句用于执行完一个分支后跳出此switch语句,例3.2.6,#include main() int choice; / 用户输入的选择 cout choice; / 用户输入选择 switch (choice) / 对用户的选择分别作处理 case 1: cout “Your choice is apple.n“; case 2: cout “Your choice is pear.n“; case 3
12、: cout “Your choice is banana.n“; case 4: cout “Your choice is orange.n“; default: cout “You did not make a choice.n“; ,break; break; break; break; break;,例3.2.7,/程序:ORDERS.CPP /功能:旅行社订票折扣率计算 #include void main() int orders, fragment; float discount; coutorders; fragment=orders/10; switch(fragment)
13、case 0: discount=0.10; break; case 1: discount=0.15; break; case 2: discount=0.30; break; default: discount =0.45; break; cout“The discount is “discount*100“%.n“; ,3.3 循环结构 3.3.1 while语句,while (循环条件表达式) 循环体语句; 当表达式的值为T(非零)时,循环条件成立,执行循环体语句。 while语句的作用范围只到while后第一个分号(单语句)。若循环体有多个语句则需用 括起来。 在循环体中应有使循环趋
14、向于结束的语句 循环变量初始化需在while语句前完成,例3.3.1:给定一个正整数n,求出平方值不超过n的最大正整数并输出。,程序流程图如右:,源程序:,#include main() int n; / 用户给定的正整数 int max; / 所求的最大整数 cout n; / 判断用户输入是否合法 if (n = 0) cout “Input error!n“; else / 利用循环求出平方大于n的最小整数 max = 1; while (max * max = n) max = max + 1; / 输出结果 cout “The maximum integer is: “ max -
15、1 “n“; ,例3.3.2,#include Void main() int choice=1; / 用户输入的选择 while(choice!=0) cout choice; / 用户输入选择 switch (choice) / 对用户的选择分别作处理 case 0: break; case 1: cout “Your choice is apple.n“; break; case 2: cout “Your choice is pear.n“; break; case 3: cout “Your choice is banana.n“; break; case 4: cout “Your
16、 choice is orange.n“; break; default: cout “Your choice is invalid.n“; break; cout“ Thank you for your choice.n“; ,3.3.2 do-while语句,do 循环体语句; while (循环条件表达式p); 先执行一次循环体语句,然后判别表达式,当为T时,返回执行循环体语句,直到表达式为F,结束循环 while语句和do-while语句基本等价,只有当表达式一开始就为假时,两种语句结果不一样 i=20; sum=0; i=20; sum=0; while (i=10) do sum
17、+= i ; sum += i ; i+; i+; while (i=10); 结果 sum=0 结果 sum=20,3.3.2 do-while语句,/程序:SQRT.CPP /功能:利用牛顿法求一个正数的平方根 #include void main() const float EPS=1e-5; float num, root, pre; coutnum; if(numEPS)|(root-preEPS); cout“ The rootof “num“ is “rootendl; ,3.3.3 for语句,for (表达式1; 表达式2; 表达式3) 循环体语句; 执行过程: 求解表达式1
18、 求解表达式2, 若其值为T,执行循环体语句,跳到第3)步; 若为F,结束循环,跳到第4)步 求解表达式3,然后跳到第2)步 循环结束,执行for语句的下一条语句 适用于循环次数已知的循环 表达式1:循环变量赋初值 表达式2:循环条件 表达式3:循环变量增量(计数表达式),for语句中的三个表达式中任一个或全部均可省略,但分号必须保留,sum=0; for (i=1; i100) break; sum += i; sum=0; for (i=1; i=100; ) sum += i; i+; ,sum=0; i=1; for (; i100) break; sum += i; i+; for
19、(sum=0,i=1; i=100 ; i+) sum += i;, while (i=100), while (1),程序3.3.4,/程序:ALPHABET.CPP /功能:正反向打印字母表。 #include void main() char ch; for(ch=A; ch=A; ch-) coutch; coutendl; ,程序3.3.5,/程序: TEMPTAB.CPP /功能:打印摄氏温度与华氏温度对照表 #include void main() const int max=10; const int min=-5; int cel; float fah; / 输出对照表栏目
20、cout=min;cel-) fah=cel*1.8+32; coutcel“x09“fahendl; ,3.3.4 循环的嵌套,三种循环可以相互替代 一个循环体内又包含另一个完整的循环结构循环的嵌套 各种循环可以相互嵌套,3.3.4 循环的嵌套,/程序: MULTITAB.CPP /功能:打印乘法口诀表 #include void main() int i,j; for(i=1; i=9; i+) for(j=1; j=i; j+) couti*j=i*j ; coutendl; ,程序3.3.6 公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少
21、只?,cock公鸡的个数;hen母鸡的个数;chicken小鸡的个数;得方程: cock+hen+chicken = 100 5*cock + 3*hen + chicken/3 =100 #include void main() int cock, hen, chicken ; for (cock=0; cock=100/5; cock+) for (hen=0; hen=100/3; hen+) chicken = 100 - cock - hen ; if (chicken%3=0) ,运行结果: cock=0 hen=25 chicken=75 cock=4 hen=18 chicke
22、n=78 cock=8 hen=11 chicken=81 cock=12 hen=4 chicken=84,20,33,3.3.5 设计正确的循环,循环不变式 一个或者多个表达式 用于保证循环的正确性 在循环前成立 在每次执行循环体后仍成立 在循环结束后也成立,3.4 转向语句,例3.4.1(break的用法) 键盘输入m和n(10mn32000),求出mn间所有素数且按每行8个数形式输出,#include #include #include void main() int m,n,x,k,i,j; j=0; /j计算输出个数 do coutmn; while(m=n)|(n=32000)
23、; cout“n*n“;,for(x=m; x=k+1) /不是用break跳出的,找到一个素数 if (j%8=0) coutendl;/每行8个数 coutsetw(8)x; j=j+1; /以每行8个数的形式输出,每个数占8个字符的位置 cout“n*n“; ,例3.4.2(continue的用法) 在键盘上输入若干个正数,累加求和,最后输出累加和以及平均值。,问题分析: 事先不知道要输入多少个数,但知道输入数是正数,我们可边输入边统计其个数,若发现输入的是0或负数时,输入结束。当输入数是大于0时则累加并累计数的个数。,源程序如下: #include void main() double
24、 sum,num;int n; sum=0.0;n=0;num=1.0;/设置初值 while (num0) coutnum; if (num0是否成立。显然,当n=0时退出循环。,3.5 简单程序设计举例,3.5.1 问题 将1到100(也许更大)的数字相加的和使多少? 3.5.2 求解问题的精美算法 1 + 2 + 3+ 98 + 99 + 100 50*101=5050,3.5.2 求解问题的精美算法,/程序: GAUSS.CPP /功能:求1到MAX之间的数字相加之和的精美算法 #include void main() const int max=99; int sum; sum=(m
25、ax/2)*(1+max); cout“The summing result is “sumendl; ,3.5.2 求解问题的精美算法,问题: MAX为奇数? 精美算法寻找(设计)困难 精美算法通用性,3.5.3 求解问题的原始算法,/程序: GAUSS02.CPP /功能:求1到MAX之间的数字相加之和的原始算法 #include void main() int max, sum, cnt; coutmax; sum=0; for(cnt=1;cnt=max;cnt+) sum+=cnt; / 求12+22+102? cout“The summing result is “sumendl; ,习题与上机,习题 P.89 3-2,3-6,3-8,3-11,3-12* 补充:编程求解一元二次方程的根 ax2+bx+c=0 要求:设计完备的测试数据集,考虑a, b, c各种取值对根的影响 上机: 实验教程实验二 必做:(1)阅读下列程序,写出(由指定的输入)所产生的运行结果,并指出其功能:、 (2)编写程序实现下列问题的求解: 编程求解下列各计算式: 2)、4) ,
链接地址:https://www.31doc.com/p-3833637.html