当前位置:首页 >> 其它课程 >>

03第三章 基本控制结构


第三章
?

基本控制结构

if语句 ? switch语句 ? while语句 ? do-while语句 ? for语句 ? 循环不变式

合肥工业大学 计算机与信息学院

1

§3.1 程序的基本控制结构
3.1.1 C++语言的简单语句

r />? 单语句:以分号“;”结束
? int a; 变量定义语句 ? a=3*2; 表达式语句 ? function(“example”);函数调用语句

? 空语句:只有一个分号“;” ? 复合语句(块语句)
? 用花括号{ }括起来的若干条语句(可以是单语句、 空语句、其他块语句) ? 块语句在语法上等价于一个单语句,所以在单语句 可用的地方我们也可以使用块语句。 ? 块语句中每一个语句都以分号“;”结束,块语句本 身则以右花括号“}”结束
合肥工业大学 计算机与信息学院
2

3.1.1 C++语言的简单语句

if(a>b){ int t=a; a=b; b=t; }

合肥工业大学 计算机与信息学院

3

3.1.2单入口/单出口控制结构
实现单入口/单出口程序只需三种基本的控制结构 ? 顺序结构 ? 选择结构
? 当条件p(条件表达式)成立,则执行一个分支,否则执行 另一个分支 ? 多路分支 ? 循环结构 A ? 实现反复执行某一部分的操作 p Y ? 循环结构三要素: ? 循环条件p N

? 循环体A ? 循环变量:在每次循环中都必须有语句修改此变量的值,以使循 环条件表达式的值可能改变,从而跳出循环
合肥工业大学 计算机与信息学院
4

3.1.3 结构化程序设计工具
? 程序框图 ? 结构化程序设计图形工具
? ? ? ? N_S图 PAD图 Jackson结构图 Warnier图

? PDL(Program Design Language)

合肥工业大学 计算机与信息学院

5

§3.2 选择结构

3.2.1 if 语句
?
if (条件表达式) 子语句;

? if语句的有效范围是单个语句,如果子语句有多 个语句,则必须用{}括起来,成为一个复合语句 ? if (条件表达式) else 子语句1; 子语句2;

合肥工业大学 计算机与信息学院

6

[例3.2.1] 输入24小时制的时间,转换并输出12小时制的时间并注 明是上午还是下午(上午用A.M表示,下午用P.M表示)

#include <iostream.h> main() { int hour; char noon = 'A'; cout << "Enter the hour please: "; cin >> hour; if (hour > 12) { *如果去掉花括号 hour = hour - 12; if (hour > 12) noon = 'P'; hour = hour - 12; } noon = 'P'; cout << "The hour is " << hour << noon << ".M.\n"; “noon = ?P?;”不是if的子 } 语句,而是主流程if语句的
下一个顺序语句 合肥工业大学 计算机与信息学院
7

程序2:
#include<iostream.h> void main() { float x; cout<<"Enter the hour please: "; cin>>x; if (x>12) { cout<< " P.M: "; x=x-12; } else cout<< " A.M: "; cout<<x<<?\n?; }

程序3: (改进) #include<iostream.h> void main() { float x; cout<< " Enter the hour please: "; cin>>x; if(x<=12) cout<< " A.M: "; else { cout<< " P.M: "; x=x-12; } cout<<x<<?\n?; } //注意书写层次结构
8

合肥工业大学 计算机与信息学院

[例3.2.2] 一个具有输入合法性检测的程序,要求用户输入的工龄 在0~47之间,如果超出此范围则提示输入错误,否则才接受用户 输入。用户输入错误时,程序用转义字符输出一声响铃

main() { int standing; // 用户输入的工龄 float standing_salary;// 根据用户输入工龄计算出来的工龄工资
cout << "Your standing in the factory: "; cin >> standing; if ((standing >= 0) && (standing <= 47)) { standing_salary = standing * 1.5; cout << "Input accepted. Your standing salary is " << standing_salary << "\n"; } else { standing_salary = 0; cout << "Invalid input.\x07\n"; }

}
合肥工业大学 计算机与信息学院
9

嵌套if语句
1) if (表达式1) if (表达式2) else else

子语句1; 子语句2; 子语句3; 子语句1; 子语句2; 子语句n; 子语句n+1;
10

2) if (表达式1) else if (表达式2) …… else if (表达式n) else

合肥工业大学 计算机与信息学院

[例3.2.3] 从键盘上输入3个数A,B,C,求出三数中最大者并输出 。

#include<iostream.h> void main() { int A,B,C,max; cout<< " Enter A,B,C,Please: "; cin>>A>>B>>C; max = A; if (B>max) max = B; // 求出A、B中的较 //大值,记录在max中,然后再比较C与max if (C>max) max = C; cout<< " MAX(A,B,C): " <<max<<?\n?; }
合肥工业大学 计算机与信息学院
11

采用嵌套if语句来实现
if (A > B) { if (A > C) else } else { if (B > C) else }

cout<<"Maximum is "<< A ; cout<<"Maximum is "<< C;

cout<<"Maximum is "<< B ; cout<<"Maximum is "<< C;

合肥工业大学 计算机与信息学院

12

?垂悬else问题
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配对

合肥工业大学 计算机与信息学院

13

注意问题
? if语句中的表达式,一般为逻辑表达式或关系表达式 ? else子句不能单独使用,必须与if配套使用 ? if以及else语句后面都只含一个内嵌的操作语句,有效范围都 只有一个语句,若需含多个操作,则须用{ }括起来。 例: if (a+b>c) { cout<<“a+b>c”; c = a+b; } else cout<<“a+b<=c”;
合肥工业大学 计算机与信息学院
14

程序3.2.4
//程序:AVERAGE.CPP //功能:求数、理、化三科平均成绩的总评,演示if语句嵌套的缩进格式 #include <iostream.h>

void main() { int math,phys,chem; int average; float scholarship; cout<<"Enter scores of math., phys., and chem.: "; cin>>math>>phys>>chem; average=(math+phys+chem)/3.0+0,5; //why? if(average>=90) { cout<<" Excellent.\n"; scholarship=120.00; } else if (average>=80) { cout<<" Good.\n"; scholarship=85.00;
合肥工业大学 计算机与信息学院
15

程序3.2.4
} else if (average>=70) { cout<<" Average.\n"; scholarship=55.00; } else if (average>=60) { cout<<" Pass.\n"; scholarship=45.50; } else { cout<<" Fail.\n"; scholarship=0.00; } cout<<"Your scholarship is <<scholarship<<".\n"; }

合肥工业大学 计算机与信息学院

16

条件表达式短路求值

if((members!=0)&&(income/members>800.00))… => if(members!=0) { if (income/members>800.00))… }

expression1&& expression2 // expression1为0, expression2不做
expression1|| expression2 // expression1非0, expression2不做

合肥工业大学 计算机与信息学院

17

3.2.2 switch语句
? 多分支选择语句 ? switch语句的一般形式如下:
switch (表达式) { case 常量表达式1: case 常量表达式2:

语句序列1; break; 语句序列2; break;

… case 常量表达式n:
default: }

语句序列n; break; 语句序列n + 1; break;
18

合肥工业大学 计算机与信息学院

说明
? 表达式可为任何类型。Switch在入口时判断表达式与哪 个常量表达式匹配。若表达式的值与某个case后面的常 量相等,则执行与该case后面相应的语句;若与所有列 出的常量都不相等,则执行default后面的语句。 ? case后只能是常量表达式,不能是变量表达式,其值只 能是整型、字符型、枚举型,不能是其他类型。每个常 量表达式的值都不相同。 ? case部分与default部分出现次序不影响执行结果。每部 分不限单个语句,可写多个语句,不用加{ }。 ? break;语句用于执行完一个分支后跳出此switch语句
合肥工业大学 计算机与信息学院
19

例3.2.6

#include <iostream.h> main()
{ int choice; // 用户输入的选择 cout << "1.Apple\n"; // 给出选择菜单 cout << "2.Pear\n"; cout << "3.Banana\n"; cout << "4.Orange\n"; cout << "Enter your choice (1 - 4): "; cin >> choice; // 用户输入选择

switch (choice) { // 对用户的选择分别作处理 case 1: cout << "Your choice is apple.\n";

break; break; break;

case 2: cout << "Your choice is pear.\n";

case 3: cout << "Your choice is banana.\n";
case 4: cout << "Your choice is orange.\n";

break;
default: cout << "You did not make a choice.\n";

break;
} }

合肥工业大学 计算机与信息学院

20

例3.2.7

//程序:ORDERS.CPP //功能:旅行社订票折扣率计算 #include <iostream.h> void main() { int orders, fragment; float discount; cout<<"Input ticket orders please: "; cin>>orders; fragment=orders/10; switch(fragment) { 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"; }
合肥工业大学 计算机与信息学院
21

§3.3 循环结构
3.3.1 while语句
? while (循环条件表达式) 循环体语句; ? 当表达式的值为T(非零)时,循环条件成立,执行循 环体语句。 ? while语句的作用范围只到while后第一个分号(单语 句)。若循环体有多个语句则需用{ }括起来。 ? 在循环体中应有使循环趋向于结束的语句 ? 循环变量初始化需在while语句前完成

合肥工业大学 计算机与信息学院

22

例3.3.1:给定一个正整数n,求出平方值不超过n的最大正整

数并输出。

程序流 程图如 右:

合肥工业大学 计算机与信息学院

23

源程序:
#include <iostream.h> main() { int n; // 用户给定的正整数 int max; // 所求的最大整数 cout << "Enter a number: "; // 用户给定一个自然数 cin >> 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 - 1 << "\n"; } }
合肥工业大学 计算机与信息学院
24

例3.3.2
#include <iostream.h> Void main() { int choice=1; // 用户输入的选择 while(choice!=0) { cout << "1.Apple\n"; // 给出选择菜单 cout << "2.Pear\n"; cout << "3.Banana\n"; cout << "4.Orange\n"; cout << "0.Exit\n"; cout << "Enter your choice (0 - 4): "; cin >> 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 choice is orange.\n"; break; default: cout << "Your choice is invalid.\n"; break; } } cout<<" Thank you for your choice.\n"; }
合肥工业大学 计算机与信息学院
25

3.3.2 do-while语句
? do
循环体语句; while (循环条件表达式p); ? 先执行一次循环体语句,然后判别表达式,当为T时, 返回执行循环体语句,直到表达式为F,结束循环 ? while语句和do-while语句基本等价,只有当表达式一开 始就为假时,两种语句结果不一样
i=20; sum=0; while (i<=10){ sum += i ; i++; } 结果 sum=0 i=20; sum=0; do { sum += i ; i++; } while (i<=10); 结果 sum=20
合肥工业大学 计算机与信息学院
26

3.3.2 do-while语句
//程序:SQRT.CPP //功能:利用牛顿法求一个正数的平方根
#include <iostream.h> void main() { const float EPS=1e-5; float num, root, pre; cout<<" Enter a number: "; cin>>num; if(num<0) cout<<"Input eroor!\n"; else { root=1; do { pre=root; root=(num/root+root)/2; } while ((pre-root>EPS)||(root-pre>EPS)); cout<<" The rootof "<<num<<" is "<<root<<endl; } }

合肥工业大学 计算机与信息学院

27

3.3.3 for语句
? for (表达式1; 表达式2; 表达式3) 循环体语句;

? 执行过程:
1) 求解表达式1 2) 求解表达式2, 若其值为T,执行循环体语句,跳到第3)步; 若为F,结束循环,跳到第4)步 3) 求解表达式3,然后跳到第2)步 4) 循环结束,执行for语句的下一条语句

? 适用于循环次数已知的循环
? ? ? 表达式1:循环变量赋初值 表达式2:循环条件 表达式3:循环变量增量(计数表达式)
合肥工业大学 计算机与信息学院
28

for语句中的三个表达式中任一个或全部均可省略,但分号必须保留
1)

2)

3)

sum=0; for (i=1; i<=100; i++) sum += i; sum=0; i=1; for (; i<=100; i++) sum += i; sum=0; for (i=1; ; i++){ if (i>100) break; sum += i; } sum=0; for (i=1; i<=100; ){ sum += i; i++; }

5)

6)

4)

7)

sum=0; i=1; for (; i<=100;) ? while (i<=100) { sum += i; i++; } sum=0; i=1; for ( ; ; ) ? while (1) { if (i>100) break; sum += i; i++; } for (sum=0,i=1; i<=100 ; i++) sum += i;

合肥工业大学 计算机与信息学院

29

程序3.3.4
//程序:ALPHABET.CPP //功能:正反向打印字母表。 #include <iostream.h> void main() { char ch; for(ch='A'; ch<='Z'; ch++) cout<<ch; cout<<endl; for(ch='Z'; ch>='A'; ch--) cout<<ch; cout<<endl; }
合肥工业大学 计算机与信息学院
30

程序3.3.5
//程序: TEMPTAB.CPP //功能:打印摄氏温度与华氏温度对照表 #include <iostream.h> void main() { const int max=10; const int min=-5; int cel; float fah; // 输出对照表栏目 cout<<"Celsius"<<"\x09"<<"Fahrenheit"<<endl; for(cel=max; cel>=min;cel--) { fah=cel*1.8+32; cout<<cel<<"\x09"<<fah<<endl; } }
合肥工业大学 计算机与信息学院
31

3.3.4 循环的嵌套
? 三种循环可以相互替代 ? 一个循环体内又包含另一个完整的循环结构 --循环的嵌套 ? 各种循环可以相互嵌套

合肥工业大学 计算机与信息学院

32

3.3.4 循环的嵌套
//程序: MULTITAB.CPP //功能:打印乘法口诀表 #include <iostream.h> void main() { int i,j; for(i=1; i<=9; i++) { for(j=1; j<=i; j++) cout<<i<<'*'<<j<<'='<<i*j<<' '; cout<<endl; } }
合肥工业大学 计算机与信息学院
33

程序3.3.6 公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱 买100只鸡,问公鸡、母鸡、小鸡各多少只?
cock公鸡的个数;hen母鸡的个数;chicken小鸡的个数;得方程: 运行结果: cock+hen+chicken = 100 5*cock + 3*hen + chicken/3 =100 cock=0 hen=25 chicken=75 #include <iostream.h> cock=4 hen=18 chicken=78 void main() cock=8 hen=11 chicken=81 { int cock, hen, chicken ; for (cock=0; cock<=100/5; cock++) cock=12 hen=4 20 chicken=84 for (hen=0; hen<=100/3; hen++) { 33 chicken = 100 - cock - hen ; if ((chicken%3==0)&& ((5*cock+3*hen+chicken/3)==100)) cout<<“cock=”<<cock<< “\then=”<<hen<< “\tchicken=”<<chicken<<endl; } } 合肥工业大学 计算机与信息学院
34

3.3.5 设计正确的循环
循环不变式 ? 一个或者多个表达式 ? 用于保证循环的正确性 ? 在循环前成立 在每次执行循环体后仍成立 在循环结束后也成立

合肥工业大学 计算机与信息学院

35

3.4 转向语句
转向语句 一般形式 break语句 break; 功能描述
1.用于switch语句,使流程 跳出switch结构,继续执行 下一个语句 2.用于循环语句(while, dowhile, for) 3.除此之外,不能用于其他 任何语句 结束本次循环,即跳过循 环体中下面尚未执行的语句 ,而接着进行下一次循环的 判断。

例子
for (…) {… if (…) break; … } a=1;

continue语 continue; 句

for (…) {… if (…) continue; … } a=1;

return语句 return 表达式;

结束被调用函数,转向主 调函数原处的下一条语句, 将表达式结果送回主调函数
36

合肥工业大学 计算机与信息学院

[例3.4.1](break的用法)
键盘输入m和n(10<m<n≤32000),求出m~n间所有素数且按每行8个 数形式输出 #include<iomanip.h> #include<iostream.h> #include<math.h> void main() { int m,n,x,k,i,j; j=0;//j计算输出个数 do { cout<<"\nEnter m,n(10<m<n<320000):"; cin>>m>>n; } while((m<=10)||(m>=n)||(n>=32000)) ; cout<<"\n*******************\n";
合肥工业大学 计算机与信息学院
37

for(x=m; x<=n; x++) { //对m~n的数判别 k=sqrt(x); for (i=2; i<=k; i++) if (x%i==0) break; //余下不必再做 if (i>=k+1) { //不是用break跳出的,找到一个素数 if (j%8==0) cout<<endl;//每行8个数 cout<<setw(8)<<x; j=j+1; } //以每行8个数的形式输出,每个数占8个字符的位 置 } cout<<"\n**********************\n"; }
合肥工业大学 计算机与信息学院
38

[例3.4.2](continue的用法)
在键盘上输入若干个正数,累加求和,最后输出累加和以及平均值。

? 问题分析:

? 事先不知道要输入多少个数,但知道输 入数是正数,我们可边输入边统计其个 数,若发现输入的是0或负数时,输入 结束。当输入数是大于0时则累加并累 计数的个数。

合肥工业大学 计算机与信息学院

39

源程序如下: #include<iostream.h> void main() { double sum,num;int n; sum=0.0;n=0;num=1.0;//设置初值 while (num>0) { cout<<"\nEnter num(Negative or zero to end):"; cin>>num; if (num<=0) continue; sum=sum+num; n=n+1; } cout<<"\nThe total is:"<<sum<<endl; cout<<"\nThe average is:"<<(sum/n)<<endl; } 例中的continue的作用是跳过sum=sum+num;n=n+1;不执行,直接去 判别num>0是否成立。显然,当n<=0时退出循环。
合肥工业大学 计算机与信息学院
40

§3.5 简单程序设计举例
3.5.1 问题
将1到100(也许更大)的数字相加的和使多少?

3.5.2 求解问题的精美算法

1 + 2 + 3……+ 98 + 99 + 100 50*101=5050
合肥工业大学 计算机与信息学院
41

3.5.2 求解问题的精美算法
//程序: GAUSS.CPP //功能:求1到MAX之间的数字相加之和的精美算法 #include <iostream.h> void main() { const int max=99; int sum; sum=(max/2)*(1+max); cout<<"The summing result is "<<sum<<endl; }
合肥工业大学 计算机与信息学院
42

3.5.2 求解问题的精美算法
问题: MAX为奇数?
? 精美算法寻找(设计)困难 ? 精美算法通用性

合肥工业大学 计算机与信息学院

43

3.5.3 求解问题的原始算法
//程序: GAUSS02.CPP //功能:求1到MAX之间的数字相加之和的原始算法 #include <iostream.h> void main() { int max, sum, cnt; cout<<"input MAX number: "; cin>>max; sum=0; for(cnt=1;cnt<=max;cnt++) sum+=cnt; // 求12+22+…+102? cout<<"The summing result is "<<sum<<endl; }
合肥工业大学 计算机与信息学院
44

习题与上机 习题
P.89 3-2,3-6,3-8,3-11,3-12* 补充:编程求解一元二次方程的根 ax2+bx+c=0 要求:设计完备的测试数据集,考虑a, b, c各种取值对根的影响

上机:

实验教程——实验二

必做:(1)阅读下列程序,写出(由指定的输入)所产生的运行结果,
并指出其功能:<1>、<2>、<3>、<4> (2)编写程序实现下列问题的求解: <2> 编程求解下列各计算式: 2)、4) <3>
合肥工业大学 计算机与信息学院
45


相关文章:
c第三章 基本控制结构
第三章 C语言的基本语句和... 44页 免费 第3章 C语言的基本控制结构... 38页 免费 第3章新 C程序的基本控制结... 暂无评价 103页 2财富值 3第3章 ...
实验三 基本控制结构
实验三 基本控制结构_计算机软件及应用_IT/计算机_专业资料。第三章代码基础一...(n - 500) * 0.03 Else m = 200 * 0.02 + (n - 500) * 0.04 ...
03第三章 顺序结构
03-顺序结构 暂无评价 23页 7下载券 03-第三章-C语言的基本语... 暂无评价...printf(“a=%d,b=%d\n”,a,b); 函数名: 函数名 固定 输出格式控制: ...
C++第三章 基本控制结构程序设计习题解答
C++第三章 基本控制结构程序设计习题解答C++第三章 基本控制结构程序设计习题解答隐藏>> 第三章 基本控制结构程序设计习题 1 第三章 基本控制结构程序设计习题一....
04第三章细胞的基本结构(一)
2010 级生物必修一 15 分钟回头练 04 03:1-12DCB...(5)B 第三章 细胞的基本结构 1、与分泌蛋白的...细胞核是控制细胞代谢的中心 D.细胞质是控制细胞...
第3章 流程控制结构
举报文档 xxjw01贡献于2012-03-03 0.0分 (0人评价)暂无用户评价 我要评价...第6章 流程控制结构 17页 2财富值 第三章 C语言的基本语句和... 44页 免费...
03第三章 门电路
03第三章 门电路 隐藏>> 教案3.1 简单门电路(3.1...门电路的基本概念及电路分析方法的讨论 理解三极管(...(1)控制端高电平有效的电路结构: (以与非门为例)...
03第三章 控制系统的时域分析法
第三章 控制系统的时域分析法 第三章 控制系统的时域分析法一.基本内容 1. ...K f s 图 3-8 控制系统结构 图 3-3 已知某二阶控制系统的单位阶跃响应...
03第三章关系数据库(答案)
03第三章关系数据库(答案)_计算机软件及应用_IT/计算机_专业资料。第三章一、...由基本数据导出 20、 如何构造出一个合适的数据逻辑结构是( C )主要解决的...
第三章细胞的基本结构练案
第三章细胞的基本结构练案_理化生_高中教育_教育专区...4 第三节细胞核——系统的控制中心制作人:王艳芳 ...文档贡献者 shamohai2791 贡献于2014-12-03 专题...
更多相关标签:
第三章细胞的基本结构 | 程序三种基本控制结构 | 三种基本控制结构 | 程序控制的基本结构 | 模糊控制器的基本结构 | 程序基本控制结构 | 微控制器的基本结构 | 马克思基本原理第三章 |