C++程序设计课件 设计制作:徐龙琴 2
?顺序 语句
?选择 语句 ( if,switch )
?循环 语句( for,while,do—while)
?跳转 语句 ( break,continue, go to )
本章要点:
C++程序设计课件 设计制作:徐龙琴 3
§ 语句
?语句,是 组成 程序最基本的单位,语句是最小的可执行单元,一条语句由一
个分号结束。
?语句分类,
⒈ 根据复杂程度的不同分,
① 简单语句, 空语句是简单语句,仅由一个分号组成 。
② 复合语句, 由一对花括号,{}”和括号里的一系列简单语句组成,
⒉ 根据执行流程的不同分,
顺序控制语句,指按照语句在程序中先后次序一条一条的顺次执行的语句
选择控制语句,据一个条件或一个值从一组语句中选择一个执行。
循环控制语句,根据某个条件重复执行一组语句
C++程序设计课件 设计制作:徐龙琴 4
§ 顺序控制语句
?顺序控制语句,其 语句在执行过程中,程序的 流程不会发生
转移 。 常见的 顺序结构语句 有,声明语句、
赋值语句和输入输出语句。
例如,
double dval; // 声明语句
dval = 302.2948; // 赋值语句,给变量赋值
cout << "congratulation! "; // 输出语句
cin >> dval; // 输入语句
C++程序设计课件 设计制作:徐龙琴 5
§ 选择控制语句
?选择控制语句,又称为 分支 语句,它 通过 对 给定的条件进行判断,从
而 决定 执行两个或多个分支中的哪一支 。因此,在 编
写选择 语句之前,应该 首先 明确 判断条件是什么, 并
确定 当判断结果为,真,或,假,时应分别执行什么样的
操作。
?选择控制语句种类,if… else语句和 switch语句。
⒈ if语句有 三种格式:
C++程序设计课件 设计制作:徐龙琴 6
表达式
执行语句 2执行语句 1
成立 不成立
表达式
执行语句
成立
不成立① if (<表达式 >)
<语句 >
② if (<表达式 >)
<语句 1>
else <语句 2>
C++程序设计课件 设计制作:徐龙琴 7
表达式 1
表达式 2
表达式 3
表达式 4
语句 1 语句 2 语句 3 语句 4
假
假
假
语句 5
假
真
真
真
真
③ if (表达式 1) 语句 1
else if (表达式 2) 语句 2
else if (表达式 3) 语句 3
…
else 语句 n
C++程序设计课件 设计制作:徐龙琴 8
例:求 a和 b两数中较大的一个。
a>b?
max=bmax=a
成立 不成立
#include <iostream.h>
void main( )
{ int a,b,max;
cout<<"Input a and b:";
cin>>a>>b;
if ( a>b ) max=a;
else max=b;
cout<<“The max of a and b,”<< max;
}
C++程序设计课件 设计制作:徐龙琴 9
例,判断用户的输入, 如果输入的数值大于 0,则在屏幕上显示, 正
数, ;
否则在屏幕上显示, 不是正数, 。#include<iostream.h>
void main()
{
float a;
cin>>a;
if(a>0)
cout<<“正数” <<endl;
else
cout<<“不是正数, <<endl;
}
C++程序设计课件 设计制作:徐龙琴 10
例,输入两个整数, 比较两个数的大小 。
#include<iostream.h>
void main( )
{
int x,y;
cout<<"Enter x and y:";
cin>>x>>y;
if (x!=y)
if (x>y)
cout<<x<<“>“<<y<<endl;
else
cout<< x<<“<“<<y<< endl;
else
cout<< x<<“=“<<y<< endl;
}
C++程序设计课件 设计制作:徐龙琴 11
写条件语句时, 为了提高程序的可读性, 最好 采用 锯齿格式 。 C++规
定,由后向前 使每一个 else都 与其前面的最靠近它的 if配对 。 如果 一个 else
的 上面又有 一个 未经配对的 else,则先处理上面的 ( 内层的 ) else的配对 。
if ( x < 0 ) y = -1;
else if ( x == 0 ) y = 0;
else y = 1;
例:
我们可以把它修改为:
if ( x >= 0)
if ( x > 0 ) y = 1;
else y = 0;
else y = -1;
C++程序设计课件 设计制作:徐龙琴 12
例,判断 a,b,c三个数中的最大值并输出最大值。
#include <iostream.h>
void main( )
{ int a,b,c,max;
cin >> a >> b >> c;
if (a>b)
max=a;
else
max=b;
if (c>max)
max=c;
cout <<“The max is:”<<max ;
}
C++程序设计课件 设计制作:徐龙琴 13
例,从键盘输入一个三角形的三条边, 判断其为何种三角形 。
#include <iostream.h>
void main()
{ int a,b,c;
cin >> a >> b >> c;
if (a+b <= c || b+c <= a || c+a <= b)
cout << "不是三角形 ";
else if (a == b && b == c)
cout << "等边三角形 ";
else if (a == b || b == c || c == a)
cout << "等腰三角形 ";
else if (a*a+b*b == c*c || b*b+c*c == a*a || c*c+a*a == b*b)
cout << "直角三角形 ";
else
cout << "其它三角形 ";
}
C++程序设计课件 设计制作:徐龙琴 14
例,已知银行整存整取存款月息利率分别为,
一年期,0.63% 二年期,0.66%
三年期,0.69% 五年期,0.75%
八年期,0.84% 其他,0.90%
要求 输入存钱的本金和期限,求 到期
时利息与本金合计。 (银行到期 利息计算公
式,利息 =本金 × 月息利率 × 12× 存款年限 )
C++程序设计课件 设计制作:徐龙琴 15
#include <stdio.h>
void main( )
{ int year;
float money,rate,total; /* 本金,月利率,本利合计 */
printf("Input money and year,");
scanf("%f,%d",&money,&year); /* 输入本金和年限 */
if ( year== 1 ) rate=0.0063; /* 根据年限定利率 */
else if ( year == 2 ) rate=0.0066;
else if ( year == 3 ) rate=0.0069;
else if ( year == 5 ) rate=0.0075;
else if ( year == 8 ) rate=0.0084;
else rate=0.0090;
total = money + money * rate *12 * year;
printf(" Total = %.2f\n",total);
}
C++程序设计课件 设计制作:徐龙琴 16
上面的程序也可改写为:
#include <stdio.h>
main( )
{ int year;
float money,rate,total; /* 本金,月利率,本利合计 */
printf("Input money and year =?");
scanf("%f%d",&money,&year); /* 输入本金和年限 */
if ( year == 1 ) rate=0.0063; /* 根据年限定利率 */
else if ( year == 2 ) rate=0.0066;
else if ( year == 3 ) rate=0.0069;
else if ( year == 5 ) rate=0.0075;
else if ( year == 8 ) rate=0.0084;
else rate=0.0;
total = money + money * rate *12 * year;
printf(" Total = %.2f\n",total);
}
C++程序设计课件 设计制作:徐龙琴 17
◇ if语句 注意,
1 if后面的, 表达式,, 可为 关系 或 逻辑 表达式,也可为 任意类型的数
值2 if语句 允许嵌套 (所谓嵌套,就是指在 if—else语句中又 包含 if—else语
句,或 者 if语句 ),但嵌套的层数不宜太多。
3 else子句(可选)是 if语句的一部分,必须与 if配对 使用,不能单独使用。
4 else子句与 if的 匹配原则, 与在它上面、距它最近、且尚未匹配的 if配对 。
若内层还没配对,先使内存先配对。
5 部分 if语句 可用 条件运算符替代
6 写 if语句 时,为了提高程序的可读性,最好采用缩进格式
7 空语句也可做 if中的语句,if (条件表达式);
C++程序设计课件 设计制作:徐龙琴 18
例,要求据输入的性别和身高判断是否符合招生要求:男身高
大于 168cm,女身高大于 160cm 为合格。
分析,设用 sex表性别:为 1时表男,0时表女。 height表身高。
①首先判断性别
②再据不同的性格判断是否符合要求,若输入的性别不
是 0和 1,则给出提示错误。
据上可得程序 流程图 为:
C++程序设计课件 设计制作:徐龙琴 19
结束
开始
error
not
No
输入
sex= 0
height>= 168
sex= 1
height>= 160
Yes
No
pass
not pass
No
Yes
Yes
No
Yes
据 流程图得程序 为:
#include <stdio.h>
void main ( )
{
int sex;
float height;
printf(“\nPlease input sex and height:\n”)
scanf(“%d%f”,& sex,& height);
if(sex= =0)
If(height>=160) printf(“\npass”);
else printf(“\n not pass”)
else
if(sex= =1)
If(height>=168) printf(“\npass”);
else printf(“\n not pass”);
else printf(“\n error”);
}
C++程序设计课件 设计制作:徐龙琴 20
例, 求一元二次方程 ax2+bx+c=0的解
分析,有以下几种可能:
⒈ a等于 0,不是二次方程。
⒉ a不等于 0
① b× b–4ac=0,有两相等的实根。
② b× b–4ac> 0,有两不等的实根
③ b× b–4ac< 0,有两复根
据上可得程序 N- S图 为:
C++程序设计课件 设计制作:徐龙琴 21
a=0
b× b –4ac=0
不是
二次
方程
输出两相
等
的实根,
-b/(2a)
b× b –4ac> 0
输出两的
实根,
x1=
x2=
输出两复根:
实部,P=-b/(2a)
虚部:
q=sqrt(4ac- b*b)/(2a)
真
真
真
假
假
假
#include <stdio.h>
#include <math.h>
void main()
{float a,b,c,disc,x1,x2,p,q;
scanf(“%f,%f,%f”,&a,&b,&c);
{ disc=b*b-4*a*c;
if (disc==0)
printf(“x1=x2=%7.2f\n”,-b/(2*a));
else { if (disc>0)
{ x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("x1=%7.2f,x2=%7.2f\n",x1,x2);
}else
q=sqrt(fabs(disc))/(2*a);
{p=-b/(2*a);
printf(“x1=%7.2f + %7.2f i\n“,p,q);
printf(“x1=%7.2f — %7.2f i\n“,p,q);
}
if (a==0)
printf(“不是二次方程, );else
}}
}
C++程序设计课件 设计制作:徐龙琴 22
例, 求方程 ax2+bx+c=0的解
#include <stdio.h>
#include <math.h>
void main()
{float a,b,c,disc,x1,x2,p,q;
scanf("%f,%f,%f",&a,&b,&c);
if (a==0)
{if (b==0)
{ if(c==0) printf("该方程无穷解 \n");
else printf("该方程无解 \n");}
else printf("单根 x= %f\n",-b/a);}
else { disc=b*b-4*a*c;
if (disc==0) printf("x1=x2=%7.2f\n",-b/(2*a));
else { if (disc>0)
{ x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("x1=%7.2f,x2=%7.2f\n",x1,x2); }
else
{p=-b/(2*a);
q=sqrt(fabs(disc))/(2*a);
printf("x1=%7.2f + %7.2f i\n",p,q);
printf("x1=%7.2f — %7.2f i\n",p,q); } } }}
C++程序设计课件 设计制作:徐龙琴 23
⒉ switch 语句
多分支的选择语句 可用 if语句或 switch语句。但用 switch语句更加直观
① 格式,switch (整型 或 字符型 表达式 )
{ case <常量表达式 1>,<语句序列 1>
case <常量表达式 2>,<语句序列 2>
:
case <常量表达式 n>,<语句序列 n>
[default,<语句序列 n+1>]
}
② switch语句的 执行过程,
首先 计算表达式 得到一个常量结果,然后 从 上到下寻找与此结果相
匹配的常量表达式所在的 case语句, 以此作为入口,开始顺序 执行入
口处后面的各语句, 直到 遇到 break语句,才结束 switch语句,转而执
行 switch结构后的其他语句。 如果没有找到 与此结果相匹配的常量表
达式,则 从 default处开始执行 语句序列 n+1。
C++程序设计课件 设计制作:徐龙琴 24
③ switch的执行 流程图:
执行语句
序列 1
=常量 1?
计算 表达式 的值
相等
不相等
break
执行语句
序列 2
=常量 2? 相等
不相等
break
执行语句 序列 n+1有 default? 有
没有
C++程序设计课件 设计制作:徐龙琴 25
switch (number)
{
case 1,statement 1;
break;
case 2,statement 2;
break;
case 3,statement 3;
break;
default,statement 4;
}
statement 5;
当 number
的值为 2时
C++程序设计课件 设计制作:徐龙琴 26
例:
int m=2,sum=0 ;
switch (m)
{ case 1, sum+=m;
case 2, sum+=m;
case 3, sum+=m;
default,sum+=m;
}
cout<<sum<<endl;
运行结果,sum=6
int m=2,sum=0 ;
switch (m)
{ case 1,sum+=m; break;
case 2,sum+=m; break;
case 3,sum+=m; break;
default,sum+=m; break;
}
cout<<sum<<endl;
运行结果,sum=2
C++程序设计课件 设计制作:徐龙琴 27
例,用 switch改写 计算存款本利。
#include <stdio.h>
void main( )
{int year;
float money,rate,total; /* 本金,月利率,本利合计 */
printf("Input money and year,");
scanf("%f%d",&money,&year); /* 输入本金和年限 */
switch ( year ) /*根据年限定利率 */
{ case 1,rate=0.0063; break;
case 2,rate=0.0066; break;
case 3,rate=0.0069; break;
case 5,rate=0.0075; break;
case 8,rate=0.0084; break;
default,rate=0.0090;
}
total = money + money * rate *12 * year;
printf(" Total = %.2f\n",total);
}
C++程序设计课件 设计制作:徐龙琴 28
例,根据考试成绩的等级输出百分制分数段,
#include <iostream.h>
void main()
{char grade;
cin >> grade;
switch (grade)
{ case?A?,cout <<,85~100\n”;break;
case?B?,cout <<,70~84\n”;break;
case?C?,cout <<,60~69\n”;break;
case?D?,cout <<,<60\n”;break;
default,cout <<,error\n”;break;
}
若 grade的值为 ‘ A?,则程序的 输出结果为, 85~100
C++程序设计课件 设计制作:徐龙琴 29
例,从键盘输入一个星期的某一天( 0:星期天; 1:星期一;,..),然后
输出其对应的英语单词。
#include <iostream.h>
void main( )
{ int day;
cin >> day;
switch (day)
{ case 0,cout << "Sunday"; break;
case 1,cout << "Monday"; break;
case 2,cout << "Tuesday"; break;
case 3,cout << "Wednesday"; break;
case 4,cout << "Thursday"; break;
case 5,cout << "Friday"; break;
case 6,cout << "Saturday"; break;
default,cout << "Input error";
}
C++程序设计课件 设计制作:徐龙琴 30
◇ switch的 几点说明:
( 1) switch后面括号中的 表达式 只能是,整型, 字符型 或 枚举型
( 2) case后 常量表达式 的 值 必需 相异。 且 只能是常量,不能是变量
( 3)多个 case语句 可共用一组执行语句。且 各个 case(包括 default)
语句的出现次序可以任意 。 当 表达式的值 与 某一 case后 常量表达式
的值 相等 时,就依次 执行此 case后面的语句直至遇到 break
( 4)每个 case语句中不必用 { },而整体的 switch结构 一定要写 { }。
( 5) default,break语句是 可缺省 的。
( 6) switch结构 也可以嵌套 。
( 7) switch语句与 if语句不同,仅能判断一种关系:是否 恒等 。
C++程序设计课件 设计制作:徐龙琴 31
§ 循环控制语句
?循环控制语句,据某个条件重复执行一组语句 。 C++提供了 三种 循
环控制语句,while,do… while,for。
⒈ while语句:
① 格式,while ( 表达式 )
语句 ; 语句可以是简单语句,也可以是复合语句。
② 执行流程:
表达式?
执行 语句 成立
不成
立
执行 while循环之后的语句
循环控制条件
循环体
C++程序设计课件 设计制作:徐龙琴 32
例,求 1~ 10之和并输出其值。
#include <iostream.h>
void main()
{ int i=1,sum=0;
while (i <= 10)
{ sum += i;
i++;
}
cout << "sum=" << sum << endl;
}
while循环由 4个 部分组成,
循环 变量初始化
判断条件
循环体
改变循环变量的值
C++程序设计课件 设计制作:徐龙琴 33
◇ while使用 注意
1.while (0) {,..,} 循环体 永远 也 不 会 执行
while (1) {,..,}, 死循环,。
2.循环体包含 一个以上的语句,则应该用 { }
3.条件表达式 的计算总是 比循环体 的 执行多一次
4.可用空语句作为循环体,while (条件表达式) ;
5.循环体中,改变循环变量的值很重要 。如果循环变量的值恒定不变,或
者 当条件表达式为一常数时,将会导致无限循环(也即死循环)。若要
退出一个无限循环,必须在循环体内用 break等语句退出。
6.为了保证循环正常运行,应有:
◆ 循环 变量初始条件
◆ 循环控制条件
◆ 改变循环变量 值的语句
C++程序设计课件 设计制作:徐龙琴 34
⒉ do-while语句:
① 格式:
② 执行流程:
do
循环体语句
while ( 表达式 ) ;
表达式?
执行 语句
成立
不成立
执行 while子句 之后的语句
循环控制条件
循环体
C++程序设计课件 设计制作:徐龙琴 35
例,求 1~ 10之和并输出其值。
#include <iostream.h>
void main()
{ int i=1,sum=0;
do
{ sum += i;
i++;
}
while (i <= 10);
cout << "sum=" << sum << endl; }
C++程序设计课件 设计制作:徐龙琴 36
例,输入一个正整数,要求以相反的顺序输出该数。例如,输
入 12345,则 输出 为 54321。
#include <iostream.h>
void main( )
{ unsigned int number;
cout<<"Input the number:\n“;
cin>>number;
do {
cout<< number%10;
number/=10; /* number缩小 10倍 */
} while (number!=0);
}
C++程序设计课件 设计制作:徐龙琴 37
◇ do-while与 while 的区别:
① 先执行循环体 然后 再判断 循环 控制条件, 而 while却是 先判
再执行 循环体。
② do-while的 循环体部分至少要执行一次 ;而 while循环体部
分有可能一次也不会执行。
C++程序设计课件 设计制作:徐龙琴 38
⒊ for语句:
① 格式,for (表达式 1; 表达式 2; 表达式 3)
语句; for语句等价于下列语句,表达式 1;
while (表达式 2)
{ 语句;
表达式 3; }?表达式 1,称为 初始化 表达式,一般 用于 对循环变量进行初始化或
赋初值;
表达式 2,称为 条件 表达式,当它的判断条件为真时,就执行循环
体语句,否则终止循环,退出 for结构;
表达式 3,称为 修正 表达式,一般 用于 在每次循环体执行之后,对
循环变量进行修改操作;循环体是当表达式 2为真时执
行的一组语句序列。
C++程序设计课件 设计制作:徐龙琴 39
② 执行流程:
循环初始条件
循环控制条件表达式 2?
循环 语句
成立
不成立
执行 for循环之后的语句
执行 表达式 3
执行 表达式 1
循环体
sum=0;
for (i=1;i<=10;i++) //初始化,判断条件,修改方式
{
sum+=i; //循环体相对简洁
}
例:
C++程序设计课件 设计制作:徐龙琴 40
例,求 10的阶乘。
递推公式,n! = 1 当 n=1 时
n! = (n-1)! * n 当 n>1 时
#include <iostream.h>
void main ( )
{ long int n=1;
int i;
for ( i = 1; i <=10; i++ )
{ n = n * i;
cout<< i-1<<,!=“<< n;
}
}
运行的结果为:
10 !=3628800
C++程序设计课件 设计制作:徐龙琴 41
◇ for语句的形式
① 常用的形式,
for ( 初值 ; 循环条件 ; 增量 )
语句;
② 省略表达式 2(即不判断循环条件,认为表达式 2始终为真),
for(表达式 1; ;表达式 3)
③ 省略表达式 1和 表达式 3,则:
for(;表达式 2;) 就等同于,while( 表达式 )
④ 表达式 1,2,3全省略,但 分号不能省略,
for ( ; ; ) 就等同于,while (1)
C++程序设计课件 设计制作:徐龙琴 42
? 三种循环一般情况下可以互相代替:
1,for和 while先 判断 循环条件 后执行 循环体,do-
while语句 先 执行 循环体 后判断 循环条件。
2,while和 do-while语句的条件表达式只有一个,
for语句有三个。
3,while,do-while,for可以相互替换使用。
4,while多用于 循环次数不定的情况。
for多用于 要赋初值或循环次数固定的情况。
do-while多用于 至少要运行一次的循环控制。
◇ 几种循环的比较
C++程序设计课件 设计制作:徐龙琴 43
5、循环语句可以嵌套,循环可以并列,但不能交叉。
6,while,do-while,for循环可以用 break语句跳出
循环,用 continue语句结束本次循环。而对 goto
型循环不能用 break和 continue语句进行控制
? 为了保证循环体正常运行,应该特别注意:
◆ 循环控制条件
◆ 控制条件的初始状态(初始值)
◆ 循环体内部对控制条件的影响
C++程序设计课件 设计制作:徐龙琴 44
§ 跳转语句
?跳转语句,其 功能是 中断当前某段程序的执行,并跳转到程序的其他位
置继续执行。 常见的跳转语句 有三种,break语句、
continue语句与 goto语句。
一,break语句:
⒈ 格式, break;
⒉ 功能:
① 在 switch语句中,break用来使流程 跳出 switch语句,继续执行
switch后的语句。
②在循环语句中,是 跳出循环 语句之外的下一条语句处。
C++程序设计课件 设计制作:徐龙琴 45
⒊ break语句的执行流程
while语句 for语句 do-while语句
不成立表达式?
成立
执行后续语句
break
表达式 2?
成立
不成立
执行后续语句
执行表达式 3
执行表达式 1
break
表达式?
成立
不成立
执行后续语句
break
C++程序设计课件 设计制作:徐龙琴 46
例,求 555555的约数中最大的三位数是多少?
#include <stdio.h>
void main( )
{int j;
long n;
printf("Please input number:");
scanf("%ld",&n);
for (j=999; j>=100; j- -)
if ( n%j= =0 )
{ printf(”3 digits in %ld=%d\n”,n,j );
break;
}
}
C++程序设计课件 设计制作:徐龙琴 47
◇ break语句使用 注意,
1,break语句 仅能退出 一层 (当前 )循环 。
2、若在 循环语句中包含了 switch语句,那么
switch语句 中的 break语句 仅能 使控制 退出
switch语句。
3,break语句 不能用于循环语句和 switch语句
之外 的任何其他语句中。
C++程序设计课件 设计制作:徐龙琴 48
二,continue语句
⒈ 格式, continue;
⒉ 功能:
对于 while和 do-while语句,将控制转到 条件测试 部分
continue仅能用于循环语句,其作用是 结束本次循环,
开始下次循环,
?
?
对于 for语句,将控制转到 执行表达式 3和 条件测试 部分
例,while (...)
{,.....
if (...) continue; //结束本次循环
......
}
C++程序设计课件 设计制作:徐龙琴 49
⒊ continue语句的执行流程
不成立表达式?
continue
成立
执行后续语句
表达式?
continue
成立 不成立
执行后续语句
while语句
表达式 2?
continue
成立
不成立
执行后续语句
执行表达式 3
执行表达式 1
for语句 do-while语句
C++程序设计课件 设计制作:徐龙琴 50
例,输入 10个整数,求其中正数的个数及其平均值,精确
到小数点后两位。
#include <stdio.h>
void main ( )
{ int i,count=0,j,sum=0;
for ( i=1; i<=10; i++)
{ printf ("Input integer:");
scanf ("%d",&j);
if (j<=0)
continue; /* 结束本次循环,不进行后续操作 */
count ++; /* 计数器 */
sum += j; /* 求累加和 */
}
if ( count )
printf("Plus number:%d,average value:%.2f",
count,1.0*sum/count);
else printf("Plus number,0,average value,0");
}
改变 if语句的 条件
表达式,可以 不需
要使用 continue。
C++程序设计课件 设计制作:徐龙琴 51
三,goto语句
⒈ 格式, goto <语句标号 >;
⒉ 功能,程序转至带有 〈 语句标号 〉 的语句。
?<语句标号 >,为标识符,其 定义格式 为,<语句标号 >,<语句 >
例,int i=1,sum=0;
loop,if(i<=100)
{ sum=sum+i;
i++;
goto loop;}
… … … …
注意, 结构化程序设计方
法,主张限制使用 goto语句。
因为滥用 goto语句,将会导
致程序结构无规律、可读性
差。
C++程序设计课件 设计制作:徐龙琴 52
◇ goto语句使用 说明,
1,结构化程序设计方法,主张 限制使用 goto语句。因为滥用 goto语句,
将会导致 程序结构无规律, 可读性差 。
2,当 要从多重循环深处直接跳转到循环之外时,如果用 break语句,将
要用多次,而且可读性并不好,这时 goto可以发挥作用。
3,标号 的位置自由,可位于 goto语句的 前面,也可位于 goto语句的 后
面,但必须与 goto语句共处于同一函数中。
C++程序设计课件 设计制作:徐龙琴 53
§ 循环的嵌套
循环嵌套,一个 循环体内 又包含另一个 完整的 循环结
构。 若内嵌的循环中还嵌套循环,就形成
多层循环。 上面的三种循环可以相互嵌套
例 1:用 for语句实现打印乘法九九表。
1 2 3 4 5 6 7 8 9
————————————————————————1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
︰
C++程序设计课件 设计制作:徐龙琴 54
首先,我们把表分三部分:表头,隔线,表体。
于是我们的 程序也可分三部分,
S1:打印表头;
S2:打印隔线;
S3:打印表体;
( 1)打印表头
可看成打印一个变量 i的值,i的初值为 1,每次
加 1,直到 9为止。则写出 S1:
for(i=1;1<= 9;i++)
printf(“%4d”,i);
九九表算法分析,
C++程序设计课件 设计制作:徐龙琴 55
( 2)打印隔线
for(i=1;i<= 36;i++)
printf(“%c”,? ?—?);
( 3)打印表体
表体共 9行,所以先考虑打印 9行的算法
for(i=1;i<= 9;i++)
{ 打印第 i行 for(j=1;j<= 9;j++)打印第 j个数{
}
printf(“\n”);
C++程序设计课件 设计制作:徐龙琴 56
打印 九九表的程序 可写为:
#include <stdio.h>
void main ()
{ int i,j;
for(i=1;i<=9;i++)
printf(“%4d”,i);
for(i=1;i<=36;i++)
printf(“%c”,?—?);
for(i=1;i<= 9;i++)
{ for(j=1;j<= 9;j++)
printf(“%4d”,i*j);
printf(“\n”);}
}
C++程序设计课件 设计制作:徐龙琴 57
例 2:打印出下面图形。
*
* *
* * *
* * * *
* * * * *
* * * * * *
算法设计:
for(i=1;i<=6;i++)
{
打印第 i行 ;
} {
for(j=1;j<=6-i ;j++)
cout<<,”;
for(k=1;k<=i;k++)
cout<<,*,;
把它细化
其程序为,#include <iostream.h>
void main ( )
{ int i,j,k;
for(i=1;i<= 6;i++)
{ for(j=1;j<= 6-i;j++)
cout<<,”;
for(k=1;k<= i;k++)
cout<<,*,;
cout<<endl;}}
cout<<endl;
C++程序设计课件 设计制作:徐龙琴 58
§ 循环程序常用算法 — 穷举法
一 穷举循环控制 有 两种方法,
① 计数法 ② 标志法
二 穷举的基本格式:
for(循环变 x取所有可能的值)
if (x满足指定的条件)
输出 x;
{
}
?穷举法, 根据提出的问题,列举所有可能的情况,并用问题中提出的条
件检验哪些是需要的,哪些是不需要的。穷举法 常用于 解决
“是
否存在”或“有多少种可能”等问题。
C++程序设计课件 设计制作:徐龙琴 59
例 (P74):找出水仙花数。用穷举法求解。
分析, 设变量 a,b,c,分别表示一个三位数的百、十、个位,a*100+b*10+c
a的变化 1- 9,b的变化 0- 9,c的变化 0- 9组合成一个三位,有
9*10*10种可能,找出其中符合水仙花数条件的组合 a,b,c。
程序主体结构,
for (a=1;a<=9;a++)
for (b=0;b<=9;b++)
for (c=0;c<=9;c++){
s= a*100+b*10+c
if (s==a*a*a+b*b*b+c*c*c)
cout<<s<<endl;
}
C++程序设计课件 设计制作:徐龙琴 60
例 (P74):找出水仙花数。 另一种穷举法思路,
分析, 设变量 s,分拆为百、十、个位,再作判断:
程序主体结构,
for (s=100;s<=999;s++)
{ a=s/100; b=(s-a*100)/10; c=s%10;
if (a*a*a+b*b*b+c*c*c==s)
cout<<s<<endl;
}
C++程序设计课件 设计制作:徐龙琴 61
例 2,求两个正整数 m和 n的最小公倍数,最大公约数。
分析, ① 求最小公倍数的方法为:
Ⅰ ) 两数的最小公倍数定 是大数的倍数,我们可以
用穷举法 每次增加大数的一倍,去 测试能否被小数
整除,能整除,则其为最小公倍数,否则继续测试,
直到找到为止
② 最大公约数 方法,辗转相除法
t=n% m;
Ⅱ ) 最小公倍数 = 两数的积 除以 最大公约数,
n=m;
m=t;
while (m!=0)
{
}
C++程序设计课件 设计制作:徐龙琴 62
算法:
① 输入两正数 m,n
② 将大数存 n中,小数存 m中
③ p=m*n
④ 找出 m,n中的最大公约数
⑤ 找出 m,n中的最小公倍数数
把它细化 if(n<m)t=n;
n=m;
m=t;
把它细化 while (m!=0)
{t=n% m;
n=m;
m=t; }
{
{
C++程序设计课件 设计制作:徐龙琴 63
#include <stdio.h>
void main ( )
{unsigned int n,m,p,t;
scanf (” %u%u”,&m,&n);
if (n<m)
t=n;
n=m;
m=t;
{
}
p=m*n
while (m!=0)
{ t=n% m;
n=m;
m=t; }
printf (” %u%u”,n,p/n);
}
C++程序设计课件 设计制作:徐龙琴 64
例 3,有 36块砖,共 36人搬,成人男子一次搬 4块,成人
女子一次搬 3块,儿童两人抬一块,恰好一次搬完
编程求出成年男子,成人女子,儿童各有几人?
分析,成年男子可取值为, 0~ 9
成年 女子 可取值为, 0~ 12
儿童可取值为, 0~ 36
首先 考虑 men分别取 0~ 9时,找符合题意的 women,childen
下面 在进一步细化,找每一个 women下的 children
C++程序设计课件 设计制作:徐龙琴 65
men=0;
{ 找满足的 women,children;
while(men<=9)
men++;
}
细化
wommen=0;
while(wommen <=12)
{ 找满足的 children;
women++;}
{
算法分析,
C++程序设计课件 设计制作:徐龙琴 66
#include <stdio.h>
void main ( )
{int men=0,women,children;
while(men<=9)
{ wommen=0;
while(wommen <=12)
children=36—men — wommen;
If(4.0*men+3.0*women+children/2==36)
printf(“man=%d,womwn=%d,children=%d”,man,womwn,children);
wommen++;
}
{
men++;
}
}
C++程序设计课件 设计制作:徐龙琴 67
#include <stdio.h>
void main ( )
{ int men,women,children;
for(men=0;men<=9;men++)
for(women=0;women<=12;women++)
{ children=36-men-women;
If(4.0*men+3.0*women+children/2= =36)
printf(“man=%d,womwn=%d,children=%d”,man,womwn,children);
}
}
也可以 用 for语句来实现,
C++程序设计课件 设计制作:徐龙琴 68
§ 循环程序常用算法 — 递推法
?递推法, 依赖初始条件,逐次推出所要求的中间结果及最后结果,从第 n
项求解第 n+1项或反之。
例 (P76):求第 n年有多少头牛? 分析找出一般关系:
年 小牛 中牛 大牛 老牛 总数
1 1 0 0 0 1
2 0 1 0 0 1
3 0 0 1 0 1
4 1 0 0 1 2
5 1 1 0 1 3
6 1 1 1 1 4
7 2 1 1 2 6
8 3 2 1 3 9
9 4 3 2 4 13
10 6 4 3 6 19
f(n)
1
1
1
F(3)+f(1)
f(4)+f(2)
F(5)+f(3)
F(6)+f(4)
F(7)+f(5)
…
…
C++程序设计课件 设计制作:徐龙琴 69
分析找出一般关系:
f(n)=1 当 n<=3
f(n)=f(n-1)+f(n-3) 当 n>=4
程序主体结构,
for ( int i=4;i<=n;i++)
{ count=a+c; //a为 3年前的牛数,c为上一年的牛数
a=b;
b=c;
c=count;
}
C++程序设计课件 设计制作:徐龙琴 70
例 2,猴子吃桃:每天吃掉一半多一个,直到第 10
天只剩一个,问第一天共摘了多少个桃子?
分析,设第 n 天的桃子数为 xn, 则它与前一天(第
xn-1天)的桃子数的关系为:
xn = xn-1 / 2- 1
xn-1= (xn +1)?2
而,x10= 1
据此可以从第 10天的桃子数 递推出 第 1天的桃子数,
程序编写如下:
C++程序设计课件 设计制作:徐龙琴 71
#include<stdio.h>
void main()
{ int x,day;
x=1;
for ( day=10; day>1; day- -)
x=(x+1)*2;
printf(“The number of peaches is %d\n”,x);
}
C++程序设计课件 设计制作:徐龙琴 72
例 3( P74,4.1)
考查级数的规律:
t0=1
t1=x=(+1)*x1/1!
t2=(-1)*x2/2!=t1*(-1)*(x/2)
t3=(+1)*x3/3!=t2*(-1)*(x/3)
……
tn=tn-1*(-1)*(x/n)
收敛性:当 n->∞,x/n->0
求和形式 sum+=ti
把没有规律的项预先放入 sum,
调整 t1项,从有规律的项开始循环:
#include <iostream.h>
#include <math.h>
void main(){
t= t *(-1)*x/i;
sum+=t;
i++;
do{
}while(fabs(t)>1e-8);
cout <<"sum=" <<sum<<endl;
double sum=1,t=-1,x;
int i=1;
cin >>x;
}
C++程序设计课件 设计制作:徐龙琴 73
§ 循环程序常用算法 — 迭代法
?迭代法, 是一个不断用新值取代变量的旧值,或由旧值递推
出变量新值的过程。例如:人口的增长、兔子的繁殖、
高次方程的求解都 可以用迭代法来解。
?迭代法 与下列因素有关:
① 初值
②迭代公式
③迭代次数
C++程序设计课件 设计制作:徐龙琴 74
f1 = 1
f2 = 1
f3 = f2+f1= 2
f4 = f3+f2 = 3
f5 = f4+f3 = 5
……
利用变量 f1,f2写出 N-S算法图:
例 1,斐波那契数列:
f(n) = 1 (n<=2)
f(n)=f(n-1)+f(n-2) (n > 2)
要求输出数列的前 40项
问题分析与算法设计:
可以 递推出 数列中的各项值,即,f1=1,f2=1
for i=1 to 20
输出 f1,f2
f1=f1+f2
f2=f2+f1
C++程序设计课件 设计制作:徐龙琴 75
f1=1,f2=1
for i=1 to 20
输出 f1,f2
f1=f1+f2
f2=f2+f1
程序如下:
#include <stdio.h>
void main()
{long int f1,f2;
int i;
f1=1;f2=1;
for(i=1;i<=20;i++)
{ printf(“%12ld %12ld”,f1,f2);
if(i%2==0) printf(“\n”);
f1=f1+f2;
f2=f2+f1; }
}
C++程序设计课件 设计制作:徐龙琴 76
例 2(P74-7):
???
?
???
?
???
n
nn x
axx
2
1
1
ax ?
用迭代法
求
设 x1=a/2
则 据迭代式求得 x2
X2将比 x1逼近解
判断? fabs(x1-x2)< 10- 7
以新的 x1=x2 求下一个 x2
X2再比 x1逼近解 ……
#include <iostream.h>
#include <math.h>
void main()
{double x,a;
cout <<"please input a value:\n";
cin >>a;
x = a/2;
while(fabs((x - a/x )/2)>1e-7)
x=(x+a/x)/2;
cout <<a <<"的平方根是 " <<x<<endl;
}
C++程序设计课件 设计制作:徐龙琴 77
§ 程序举例
例 1,设计一个简单的计算器程序
要求,该程序能实现从键盘输入任意两数与算数运算符,
输出其运算的结果。
switch(op)
{ case ?+?,cout<<endl<<x<<“+”<<y<<“=“<<x+y; break;
case ?-’, cout <<endl <<x<<“-” <<y<<“=“<<x - y;break;
case ?*?,cout <<endl <<x<<“*”<<y<<“=“<<x * y;break;
case ?/?,cout <<endl <<x<<“÷,<<y<<“=“<<x / y; break;
case ?%?,cout <<endl <<x<<“%”<<y<<“=“<<x % y; break;
default,cout <<endl <<“Wrong”;
}
程序主体结构,
C++程序设计课件 设计制作:徐龙琴 78
例 2,从键盘上任意输入一个正整数,要求判断该正整
数是否是另一个整数的平方。
算法设计:
i == m*m ( m为整数 >0) 则 i 为整数的平方。
⑴ 设输入的数为 i
⑵ 判断 i>0 不
① 若 i<0,重输入直到大于 0
② 若 i>0, 若 i满足
C++程序设计课件 设计制作:徐龙琴 79
}
#include <stdio.h>
void main ( )
{ int i,m;
scanf (” %d”,&i);
if(i<=0)
{ printf(,Please input again\n”);
for ( m=1; m*m<=i; m++)
scanf (” %d”,&i);
if ( i= = m*m )
printf (,%d*%d=%d\n”,m,m,i);
goto L1; }
L1:
C++程序设计课件 设计制作:徐龙琴 80
用 while型循环处理
#include <stdio.h>
void main ( )
{int i,m=1;
label,scanf (” %d”,&i);
if(i<=0)
{ printf(“Please input again\n”);
goto label;}
while ( m*m<=i)
{ if ( i= = m*m )
printf (,%d*%d=%d\n”,m,m,i);
m++; }
}
C++程序设计课件 设计制作:徐龙琴 81
?ba dxxf )(例 3,用梯形法求定积分,
?ba dxxf )(分析,定积分 的 几何意义, 求曲线 y=f(x)
和直线 x=a,x=b 以及 x 轴围成的面积。见下图:
0 x1=a x2 x3 x4=b
y1
y2
y3
y4
x
y
h
f(x) a ~ b区间分成长度相
等 n 的个区间,则任意一
个梯形的高,h=(b- a)/n
第 i 个梯形的
上底为,f(a+(i-1)× h)
下底为,f(a+i× h)
第 i 个梯形的面积,
s= (f(a+(i-1)× h)+f(a+i× h)) × h / 2
C++程序设计课件 设计制作:徐龙琴 82
反映上述过程的 N-S流程图如下:
给定等分数 n及上下限 a和 b的值
h=(b-a)/n,s=0.0
当 i <= n
s=s+(f(a+(i-1)× h)+
f(a+i× h)) × h / 2
输出 s
如:用梯形法求定积分,?1
0 )s in ( dxx
在此,a=0,b=1,f(x)=sin(x),相应的程序如下:
C++程序设计课件 设计制作:徐龙琴 83
#include <stdio.h>
#include <math.h>
void main()
{ int n,i;
double a=0.0,b=1.0,s=0.0,h;
printf("input n:");
scanf("%d",&n);
h=(b-a)/n;
for(i=1;i<=n;i++)
s=s+(sin(a+(i-1)*h)+sin(a+i*h))*h/2;
printf("s=%11.7f\n",s);
}
C++程序设计课件 设计制作:徐龙琴 84
例 4,求第 n个费波那契 (Fibonacci)数。 Fibonacci数的定义如下:
0 (n=1)
fib(n) = 1 (n=2)
fib(n-2)+fib(n-1) (n≥3)
#include <iostream.h>
void main()
{ int i,fib1,fib2,fibn,n;
cin >> n;
fib2 = 1; fib1 = 0;
for (i=3; i<=n; i++)
{ fibn = fib2 + fib1;
fib1 = fib2;
fib2 = fibn; }
cout << "第 " << n << "个费波那契数是," << fibn << endl;
}
C++程序设计课件 设计制作:徐龙琴 85
例 5,输出 100以内的所有亲密数对,并输出所有完数之和
注,亲密数,若自然数 m的所有因子(包括 1但不包括自身)之
和为 n,而 n的所有因子之和为 m,则 m,n为一对亲密数。
完数,若自然数 m等于它的所有因子(包括 1但不包括自身)
之和,则 m为完数。
算法分析,
找出 m的所有因子并将其相加和为 n;
for(m=2; m<100; m++)
if(m= =n) sum=sum+m;
找出 n的所有因子并将其相加和为 p;
if(p= =m)
printf(“亲密数为,%d%d\n”,m,n);
{
} printf(“sum,%d”,sum);
C++程序设计课件 设计制作:徐龙琴 86
算法分析,
找出 m的所有因子并将其相加为 n;
for(m=2; m<100; m++)
if(m= =n) sum=sum+m;
找出 n的所有因子并将其相加和为 p;
if(p= =m)
printf(“%d%4d是一对亲密数,, m,n);
{
}
printf(“%d”,sum);
{ for(i=2; i<= m/2; i++)if(m%i= =0)n=n+i;n=1;
{ p=1;for(i=2; i<= n/2; i++)if(n%i= =0)
p=p+i;
C++程序设计课件 设计制作:徐龙琴 87
我们可将求一个数的所有因子之和定义为一个子函数:
int yzh(int a)
{ int n=1;
for(int i=2;i<=a/2;i++)
{if(a%i==0)
n=n+i;
}
return n;
}
C++程序设计课件 设计制作:徐龙琴 88
其程序为,
#include <stdio.h>
int yzh(int a);
void main( )
{int m,s1,s2,sum=0;
for(m=2;m<=100;m++)
{ s1=yzh(m);
if(m==s1)
sum+=m;
s2=yzh(s1);
if(m==s2)
printf("%d%4d是一对亲密数 \n",m,s1);
}
printf("所有完数的和为 %d\n",sum);
}
int yzh(int a)
{ int n=1;
for(int i=2;i<=a/2;i++)
{if(a%i==0)
n=n+i;
}
return n;
}
C++程序设计课件 设计制作:徐龙琴 89
例 6,编密码,将字母 A变成字母 E,a变成 e,即变成其后的第四
个字母,W?A,X?C,Z?D,循环转换, 非字母不变,
(?A?-?Z?,65-90,?a?-?z?,97-122)
要求,输入一行字符,以 ‘ #?表示结束,输出相应密码,
分析思路, 程序的一般模式:
输入 处理 输出
C++程序设计课件 设计制作:徐龙琴 90
char ch;
cin>>ch;
while (ch!=?#?)
{ 密码 处理 程序块 ;
cout<<ch;
cin>>ch;
}
输入, 输入一行字符,以‘ #?标记结束。本题可描述为:当
输入字符不是 ‘ #?时,连续输入,并进行处理和输出,
用循环结构,
{ if(ch>=?A?&&ch<=?Z?||ch>=?a?&&ch<=?z?)ch=ch+4;
if(ch>?Z?&&ch<=?Z?+4 || ch>?z?)
ch-=26;
C++程序设计课件 设计制作:徐龙琴 91
#include <iostream.h>
void main( ){
char ch;
cin>>ch;
while (ch!='#')
{ if (ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')
{ ch=ch+4;
if(ch>'Z'&&ch<='Z'+4 || ch>'z')
ch-=26; }
cout<<ch;
cin>>ch;
}
cout<<endl;
}
完整的程序为,
C++程序设计课件 设计制作:徐龙琴 92
例 7,输入 year年份和月 month,求该月天数。
#include <iostream.h>
void main( )
{ int year,month,days;
cin>>year>>month;
switch (month)
{ case 1,case 3,case 5,case 7:
case 8,case 10,case 12,/* 处理, 大, 月 */
days=31; break;
case 4,case 6,case 9,case 11,/* 处理, 小, 月 */
days=30; break;
case 2,/* 处理, 平, 月 */
if ( year%4==0 && year%100!=0 || year%400==0 )
days=29; /* 如果是闰年 */
else
days=28; /* 不是闰年 */
break;
default,/* 月份错误 */
cout<<“Input error!\n”;
days=0;
}
if (days!=0) cout<<year<<“年的, <<month<<“是, <<days<<“天 \n”;
}
多个 case可共用一组执行 语句