第八课 for 循环控制语句

在程序设计中,经常会遇到某个或某些语句需要反复执行多次的情况。如输出下列由 5
行由"*"号构成的图形(每行 10 个"*"):
**********
**********
**********
**********
********** 我们可以这样来写程序:
#include<iostream>
using namespace std;
int main(){
cout<”**********”;
cout<”**********”;
cout<”**********”;
cout<”**********”;
cout<”**********”;
return 0;
}
这个程序很简单,但如果这个图形的行数不止 5 行,而是 50、500 行甚至更多行,间
或是根据程序执行时具体的输入来确定有多少行,那末我们还是这样来编程的话,显然是
不太方便的甚至是行不通的。
像这样的问题,用循环控制语句来解决就非常的方便:
#include<iostream>
using namespace std;
int main(){
int i,n;
cin>>n;
for(i=1;i<=n;i++)
cout<"**********"<<endl;
return 0;
}
这里使用了 for 循环控制语句。C++中除 for 循环控制语句外,还有 while、do…while
循环控制语句等。本课开始分别介绍。
一、for 语句的格式与功能
for 循环在一般的程序设计语言(如 Pascal)中,称为计数型循环控制语句,通过循环
控制变量从初值到终值按指定变化量变化,控制其它语句被反复执行。在 C/C++中使用了
灵活的条件控制方式,除可以实现一般程序设计语言计数型循环控制功能外,语句的形式
更加灵活,功能更加强大。可以这样说,在 C/C++中只要有 for 循环控制语句就足够了。下
面介绍它的格式和功能。
1、for 语句格式
for(表达式 1;表达式 2;表达式 3)
{
循环体(若干语句组成);
}
注:
1)表达式 1 用于循环初始化,做些循环前的准备工作,如循环控制变量赋初始等;
2)表达式 2 是循环条件,当其值为真(非零)时,执行循环体。
3)表达式 3 为进入下一轮循环作准备,如改变循环控制变量的值等。大括号中包含若
干条语句,称为循环体。若大括号中只有一个语句时,大括号可以省略。
如,语句:
for(i=1;i<=100;i++) cout<<i<<” “;
中,表达式 1“i=1”是一个赋值表达式,表达式 2“i<=100”是一个关系表达式,表达式 3 “i++”也是一个赋值表达式;循环体为“cout<<i<<” “;”,只有一个语句,所以省略了大
括号{}。
再看两例:
1)for( s=0, j=20; j>0; j-=2) s+=j;
该循环句实现求和(20 以内偶自然数之和)。其中表达式 1 是一个逗号表达式,实现
变量 s 和变量 j 的初始化。
2)for( int x=1; x<1000; x<<1) p*=x;
该循环句中,表达式 1 定义了一个整型变量 x,并将它的值初始化为 1。注意,这里定
义的 x 只在本 for 循环语句中有效。
2、for 语句的功能
我们用流程图来描述 for 语句的功能:
二、应用举例
下面我们通过几个例子,来说明 for 循环的用法。
【例题 1】分别写出下列三个程序的运行结果。
1)程序 1
#include<iostream>
using namespace std;
int main(){
int i;
for(i=1;i<10;i++)
cout<<i<<" ";
return 0;
}
解:循环控制变量 i 初值为 1,循环条件为 i<10,i 每次增 1 变化。该程序运行结果为:
1 2 3 4 5 6 7 8 9
2)程序 2
#include<iostream>
using namespace std;
int main(){
不成立
表达式 2 非零?
(条件成立?)
循环体
求表达式 3 的值
成立
求表达式 1 的值
int i,j;
for(i=1,j=10;i<j;i++,j--)
cout<<i<<’ ‘<<j<<endl;
return 0;
}
解:变量 i,j 的初值分别为 1 和 10,循环条件是 i<j,i 每次增 1,j 每次减 1 变化。知
道了这些,该程序的运行结果不难写出:
1 10
2 9
3 8
4 7
5 6
程序 3
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<10;i+=2)//在这里定义变量 i 是允许的,i 的作用范围是本 for 循环
cout<<i<<’ ‘<<i*i<<endl;
return 0;
}
解:本程序运行结果为:
1 1
3 9
5 25
7 49
9 81
【例题 2】求 1~1000 之间(包括 1 和 1000)所有自然数的和。
解:从上面的例子 1 中我们已经学会如何控制让变量从初值按一定规律变化到终值,
如本例中,加数要从初值 1 变化到 1000(逐步增 1):
for(x=1;x<=1000;x++)
那么如何把变化中的各 x 的值加在一起来?其实很简单,只要设置一个变量(如 s),x
每取一个值就把 x 加到 s 中去:s=s+x,非常方便。
我们把这种“积累”和的变量称为累加器。注意的是,累加器的初始值应为 0。
参考程序如下:
#include<iostream>
using namespace std;
int main(){
int i,s=0;
for(i=1;i<=1000;i++)
s=s+i;//可写为:s+=x;使用复合赋值运算。
cout<<s;
return 0;
}
思考:
1)如果求 1~1000 之间 7 的倍数之和如何修改程序?
2)如果分别求 1~1000 之间所有奇数、所有偶数之和如何办?
3)如果求 1~12 之间所有自然数的积如何办?
【例题 3】已知 n 个人的身高,求其中的最高身高值。
解:我们前面已经知道如何从 3 个数中找出最大数的方法。什么方法最简单?对,“打
擂台”算法。要从 n 个数中找出最大数也一样:利用循环控制,每次输入一个人的身高后,
就把该身高与擂台上的当前最大身高相比,把较大者留在“擂台”上。
参考程序如下:
#include<iostream>
using namespace std;
int main(){
int n;
float h,maxh=0; //maxh 为“擂台”,初值取 0 是合适的,因为人的身高一定是大于
0
cin>>n;
for(int i=1;i<=n;i++){
cin>>h;
if(h>maxh)maxh=h;//打擂台
}
cout<<maxh<<endl;
return 0;
}
思考:
1)将初始擂台(maxh)值初始化为第一个人的身高,行吗?如何修改程序?
2)如果要同时求最小身高值,如何修改程序?
【例题 4】Fibonacci 数列是一个特殊的数列:数列的第一项和第二项都是 1,从第三项
开始,每一项是其前面两项之和。即:
1,1,2,3,5,8,13,21,……
编程,输出该数列的前 n 项(n<=100)。要求每 10 项占一行(最后一行除外),两两之
间用一个空格相隔。
解:设用 c 表示数列的当前待求项,a,b 分别是其前相邻的两项,c=a+b(题意)。当
我们把当前项 c 求出并输出之后,新的待求项即下一项应该是目前 b、c 之和,如果我们求
下一项前先做这样的操作:a=b,b=c,则新的待求项(仍用 c 存放)就是 a、b 之和(c=a+b)。
这样看来,除第一项和第二项外,从第三项开始就是反复执行下面的语句:
c=a+b;
a=b;
b=c
为了让第一项和第二项也有其后各项的变化规律,我们可以在它们的前面增添两项,
分别为 1 和 0(为什么?)。
至于 10 项一行,只要设置一个计数器(这里利用循环控制变量),每输出一项后就判
断是否已输出 10 项了,若已输出 10 项,就输出一个换行符。
参考程序如下:
#include<iostream>
using namespace std;
int main(){
int n,i,a=1,b=0,c;
cin>>n;
for(i=1;i<=n;i++) {
c=a+b;
cout<<c<<" ";
if(i%10==0)cout<<endl;
a=b, b=c;
}
return 0;
}
思考:
1)这里 a,b,c 均被定义为 int 类型,上机试一下,这个程序能正确输出数列前面的多少
项?如果要正确输出更多的项,应该如何修改程序?
2)这里用 a,b,c 三个变量实现问题的求解,你能用两个变量实现问题求解吗?
习题八
1、用 for 循环输出 1~100 之间的自然数,每行 10 个。
2、用 for 循环求下式的值:
s  1 2
1  2
2  2
3  2
63
3、圆周率π可以根据下式近似计算得到:     
2
21

2
2
1

5
4
3
4
3
2
1
2
2

n
n
n
n
n 越大,π的值越精确。
编程根据给定的 n,求近似的π值。
输入
一行一个自然数 n。
输出
一行一个实数,保留 6 位小数,为π的近似值。
输入样例
1
输出样例
2.666667
4、自然数因子的和
描述
每个自然数都有若干因子(约数)。如 10 有 1、2、5、10 四个因子。编程求自然数 n
的除本身外其它所有因子的和。
输入
一行一个自然数 n。
输出
一行一个自然数,为所求 n 的因子和。
输入样例
10
输出样例
8
5、字符输出
描述
a,b 是两个 32~127 之间的自然数(a<=b),编程顺序输出 ASCII 在[a,b]之间的所有字
符。
输入
一行,两个自然数 a 和 b。
输出
ASCII 值在[a,b]之间的所有字符。
输入样例
65 90
输出样例
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6、水仙花数
描述
水仙花数指的是满足这样条件的三位自然数:它的各位数字三次方的和等于该三位数
本身。如 153 就是一个水仙花数:153  1
3  5
3  3
3。试求所有的水仙花数。
输入

输出
一行,所有的水仙花数,两数间用一个空格相隔。
7、平均年龄
描述
班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保
留到小数点后两位。
输入
输入包括若干行,第一行有一个整数 n(1≤n≤100),表示学生的人数。其后 n 行每
行有一个整数,表示各学生的年龄,取值为 15 到 25。
输出
输出班级平均年龄,答案保留两位小数。
样例输入
2
18
17
样例输出
1750
8、最大跨度
题目描述
给定一个长度为 n 的非负整数序列,请计算序列的最大跨度值(最大跨度值=最大值减
去最小值)。
输入
输入一共两行,第 1 行为序列的个数 n(1≤n≤1000),第 2 行为序列的 n 个不超过 1000
的非负整数,整数之间以一个空格分隔。
输出
输出最大跨度值。
样例输入
6
3 0 8 7 5 9
样例输出
9
9、因子个数
描述
对于任意给定的一个正整数,计算其因数个数。
输入
输入正整数 N。
输出
输出 N 的因子个数。
样例输入
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值