【引例】 输出一行10个“*”
#include<cstdio> int main(){ printf("********** "); return 0; }
思考:
(1)输出一行100个“*”
(2)输出一行1000个“*”
(3)输出……
引入for
#include<cstdio> int main(){ for (int i=1;i<=10;i++) printf("*"); return 0; }
要求:单步执行,观察循环控制变量i的变化。
【例1】输出1,2,3…,10,每个数字一行。
for的格式1:
for (控制变量初始化;条件表达式;增量表达式)
<一条语句>;
for的格式2:
for (控制变量初始化;条件表达式;增量表达式)
{
语句1;
语句2;
……
}
for语句执行过程:
(1)执行“控制变量初始化”语句,使控制变量获得一个初值。
(2)判断控制变量是否满足“条件表达式”,若满足条件则执行一遍循环体,否则跳到步骤5。
(3)根据增量表达式,计算出控制变量所得到的新值
(4)自动转到第(2)步。
(5)循环结束,执行for循环后面的语句。
【例2】键入一个自然数n,求s=1+2+...+n的值
如:
输入:
100
输出:
5050
#include<cstdio> int main(){ int s=0, n; scanf("%d",&n); for (int i=1;i<=n;i++) s=s+i; printf("%d ",s); return 0; }
【例2拓展】 键入一个自然数n(<10000),求这个自然数的所有约数之和S (n的约数不包含1和n)。
如:
输入:
6
输出:
5
#include<cstdio> int main(){ int s=0,n; scanf("%d",&n); for (int i=2; i<=n-1;i++) if (n%i==0) s=s+i; printf("%d ",s); return 0; }
【例3】输入正整数n(<1000000),判断它是否为素数。是素数输出”yes”,不是素数输出”no”.素数也称为质数。
程序1(例二的延伸)
#include<cstdio> int main(){ int s=0,n; scanf("%d",&n); for (int i=2; i<=n-1;i++) if (n%i==0) s=s+i; if (s==0) printf("yes"); else printf("no"); return 0; }
程序2(使用标志变量,添加break):
#include<cstdio> int main(){ int n,f=0; scanf("%d",&n); for (int i=2; i<=n-1;i++) if (n%i==0) { f=1; } if (f==0) printf("yes"); else printf("no"); return 0; }
尝试:n=1000000007
程序3(提高程序效率)
#include<cstdio> #include<cmath> int main(){ int n,m,f=0; scanf("%d",&n); m= floor(sqrt(n)+0.5); for (int i=2; i<=m;i++) if (n%i==0) { f=1; break; } if (f==0) printf("yes"); else printf("no"); return 0; }
知识补充:floor(x)返回不超过x的最大整数
思考:循环结束时变量i的值是多少,输出结果验证和你的猜测。
程序4(灵活利用for循环)
#include<cstdio> #include<cmath> int main(){ int i,n,m; scanf("%d",&n); m=floor(sqrt(n)+0.5); for (i=2; i<=m&&n%i!=0;i++); if (i==m+1) printf("yes"); else printf("no"); return 0; }
注意:
在for循环“控制变量初始化语句”中声明的变量,这些变量只在for循环结构中有效,离开了该for结构,变量就无效了。
练习1. 编一个程序,从键盘输入一个分数的分子a和分母b(a<b),输出它的小数形式,精确到小数点后n位。a,b,n<1000,不考虑四舍五入。
练习2.
数列的前两项分别是1、1,从第三项开始,每个数均为前面两项的和,即: 1,1,2,3,5,8,…。
输入:n
输出:数列第n项的值,n<=90
如:
输入:6
输出:8