5.1 引例
【例5.1】假设今年我国的人口总数为13亿,若按每年2%增长,计算从现在开始10年内每年人口的数量。
例5.1:
#include<stdio.h>
#include<math.h>
int main()
{
int n = 13, year;
double number, rate = 0.02;
for (year = 1; year <= 10; year++)
{
number = n * pow((1 + rate), year);
printf("%2d年后,人数为:%.2f亿\n", year, number);
}
return 0;
}
运行结果:
1年后,人数为:13.26亿
2年后,人数为:13.53亿
3年后,人数为:13.80亿
4年后,人数为:14.07亿
5年后,人数为:14.35亿
6年后,人数为:14.64亿
7年后,人数为:14.93亿
8年后,人数为:15.23亿
9年后,人数为:15.54亿
10年后,人数为:15.85亿
说明:
(1)若初始人口用n表示,增长率用rate表示,年份用year表示,则计算某年的人口数量number的公式为
number=n(1+rate)^year
(2)程序中的for循环控制语句中,年份year的初始值为1,终值为10,增量用year++实现。
(3)程序中的语句
{
number = n * pow((1 + rate), year);
printf("%2d年后,人数为:%.2f亿\n", year, number);
}
是需要重复执行的语句,成为循环语句。在重复执行的过程中,使用了同一个计算公式,但年份year每次递增1,因此计算出的人口数量number会不同。
图5.1 例5.1的执行流程
【例5.2】编写程序,计算1-1/4+1/7-1/10+1/13-1/16+...的和,直到某一项的绝对值小于10^(-6)为止。
例5.2:
#include<stdio.h>
#include<math.h>
int main()
{
double sum,item,flag,denominator;
sum = 0;
item = 1;
flag = 1;
denominator = 1;
while (fabs(item) >= 1e-6) {
sum = sum + item;
flag = -flag;
denominator = denominator + 3;
item = flag / denominator;
}
printf("sum=%f\n", sum);
return 0;
}
运行结果:
sum=0.835648
5.2 使用for语句实现循环结构
for语句是C语言提供的功能强大、使用广泛的一种循环结构,不仅可以解决循环次数未知的循环问题,特别适合解决循环次数已知的循环问题。
<5.2.1> for语句的基本语法
for语句的一般形式为:
for(表达式1;表达式2;表达式3)
循环结构语句;
for语句的执行过程如下:
①首先计算表达式1.
②判断表达式2,若其值为真(非0),则执行循环体语句,然后执行第③步;若值为假(0),结束循环,转到第⑤步执行。
③计算表达式3。
④返回第②步继续执行。
⑤循环结束,继续执行for语句的下一条语句。
大部分情况下,循环体语句为一复合语句。
for语句的执行流程如图5.2所示。
图5.2 for语句执行流程
注意,表达式1只是再进入循环之前计算一次。表达式2、循环体语句和表达式3将重复执行。
根据for语句格式的特点,其实际应用可以有多种形式。
1.可以应用于计数型的循环
格式如下:
for(循环变量赋初值;循环条件;循环变量增量)
循环体语句
【例5.3】输入一个正整数n,求1+2+3+4+5+6...+n的值。
例5.3:
#include<stdio.h>
int main()
{
int i, n, sum;
scanf_s("%d", &n);
sum = 0;
for (i = 1; i <= n; i++) {
sum = sum + i;
}
printf("由1到%d的和是:%d\n",n, sum);
return 0;
}
运行结果:
100
由1到100的和是:5050
【例5.4】输入一个正整数n,求n!。
①循环变量赋初值:i=1。
②循环条件:i<=n。
③循环变量增量:i++。
④循环体语句:factorial=factorial*i。
例5.4:
#include<stdio.h>
int main(void)
{
int i, n;
double factorial;
printf("输入n的值:");
scanf_s("%d", &n);
factorial = 1;
for (i = 1; i <= n; i++)
factorial = factorial * i;
printf("%d!=%.0f\n", n, factorial);
return 0;
}
运行结果:
输入n的值:10
10!=3628800
2.for语句的一般形式中省略表达式1
格式如下:
for(;表达式2;表达式3)
循环体语句;
说明:省略表达式1时,可以将循环变量赋初值放在for之前。注意,此时不能省略第一个“;”。
例如,例5.3的循环语句:
for (i = 1; i <= n; i++) /*循环执行n次*/
sum = sum + i; /*累加器,反复累加i的值*/
等价于:
i=1;
for (; i <= n; i++) /*循环执行n次*/
sum = sum + i; /*累加器,反复累加i的值*/
3.for语句的一般形式中省略表达式2
格式如下:
for(表达式1;;表达式3)
循环体语句;
说明:省略表达式2时,表示不对循环进行控制。这时如果没有其他处理的话,会形成死循环。应避免这样使用for结构。
4.for语句的一般形式中省略表达式3
格式如下:
for(表达式1;表达式2;)
循环体语句;
说明:省略表达式3时,可以在循环体语句中加入修改循环变量的值的语句。
例如,例5.4的循环语句:
for (i = 1; i <= n; i++) /*循环执行n次,计算n!*/
factorial = factorial * i; /*累乘器n!*/
等价于:
for (i = 1; i <= n; ){ /*循环执行n次,计算n!*/
factorial = factorial * i; /*累乘器n!*/i++;} /*循环变量增量*/
5.for语句一般形式中表达式1和表达式3也