循环结构1

for循环

引子:输入一个正整数n,求n的累加和

#include<stdio.h>
int main(void){
int n, sum;
printf("please enter n:\n");
scanf("%d", &n);
sum = 0;
for(int i=0; i<=n; i++){
sum = sum + i;
}
printf("n!=%d\n", sum);
return 0;
}

其中使用了for循环语句,
for循环一般包含四个部分

初始化
指定循环起点,指定循环变量的初始值。
例如int i=1, sum = 0

r

初始化只执行一次,其他步骤则循环执行

条件控制:
判断循环是否继续执行,要有判断条件。
对于for循环而言,是其括号中的i<=n

改变循环变量:
在每次循环中都要改变循环变量的值,
以进行循环条件的判断。
这里循环变量是i,改变它的语句是i++;

r

如果不改变循环变量,就会导致死循环

循环体:
指其中重复执行的语句(循环体),
例如 sum=sum+1

在for循环中的语句整体缩进,可以明确地标识循环体的范围,这与if语句一致

for循环语句的执行流程

例子程序的执行流程

例2

#include<stdio.h>
int main(){
int denominator=1; //代表每一项的分母
int flag=1; //flag代表符号位
double item; //代表每一项的值
double sum = 0; //代表最终计算和
int n; //循环次数

printf("enter n:\n");
scanf("%d", &n); //输入n,初始化完毕

for(int i=1; i<=n; i++){
item = (double)flag/denominator; //计算item值,强制类型转换
printf("item=%f\n", item);
sum = sum + item; //计算sum值
flag = - flag; //改变符号位,为下一次计算做准备
denominator = denominator +2; //改变分母,为下一次计算做准备
}
printf("sum=%f\n", sum); //输出结果

return 0;
}

例3:输出一张华氏度和摄氏度之间的转换表,每次增加1华氏度。华氏度的取值范围是[lower, upper], 这两个整型数值依赖用户的输入。

#include<stdio.h>
/*printFormula是专门负责数值转换的函数*/
double printFormula(int f){
return (5.0/9.0)*(f-32); //温度转换,兼强制类型转换
}

int main(){
int fahr, lower, upper;
double celsius;
printf("enter lower and upper:\n");
scanf("%d%d", &lower, &upper);

if(lower < upper){ //判断lower和upper是否合法
for(fahr=lower; fahr<=upper; fahr ++){ //循环
printf("%4d%6.1f\n", fahr, printFormula(fahr));
}
} else{
printf("your lower and upper invalid\n");
}
return 0;
}

while循环

例1

分析:这道题跟之前的求格里高利公式前n项和的题目类似,但是不容易事先估计n的个数。因此,这里需要使用while循环。

#include<stdio.h>
#include<math.h>
int main(void){
int denominator, flag;
double item, sum;
/*初始化*/
flag=1;
denominator=1;
item=1.0;
sum=0;
/*while循环*/
while(fabs(item)>=0.0001){ //当型循环,先判断再执行
item = flag*1.0/denominator;
sum = sum + item;
flag = - flag;
denominator = denominator +2;
}
printf("π值为%.4f\n", sum*4);

return 0;
}

其中包含while型循环语句,
相对于for循环,while具有以下特点

while语句的条件控制表达式只能是一条语句,而for循环的条件控制表达式中包含三个部分(循环变量初始化,判断条件,循环变量修改)

while语句的结构更简单,只有条件控制表达式和循环体。
因此使用时要另加初始化部分,并在循环体中包含能最终改变循环条件真假性的操作。

while循环语句是典型的当型循环结构。只有当判断条件为真时才进入循环。

相对于for循环,while循环适用于不容易推算循环次数的循环结构

while型循环的控制结构

把for循环改写成while循环

分支主題

#include<stdio.h>
#include<math.h>
int main(void){
int denominator, flag;
double item, sum;
/*初始化*/
flag=1;
item=1.0;
sum=0;

for(denominator=1; fabs(item)>=0.0001; denominator = denominator +2){
item = flag*1.0/denominator;
sum = sum + item;
flag = - flag;
}
printf("π值为%.4f\n", sum*4);
return 0;

}

例2:从键盘输入一批学生的成绩,计算平均分。

分析:这还是一个求累加和的问题。

但是不知道输入数据的个数,无法事先确定循环次数。因此适合用while循环,用一个特殊数据作为结束输入的标志。

例如选用一个不合法数据(小于0或大于100的数)做结束标志。同时在每次循环输入时,统计总分和输入次数。

#include <stdio.h>
int main(void)
{ int num;
double grade, total;
num = 0; total = 0;
printf("Enter grades: \n");
scanf("%lf", &grade); /* 先输入第1个数*/
while (grade >= 0 && grade <=100) {
total = total + grade;
num++;
scanf ("%lf", &grade);
}
if(num != 0)
printf("Grade average is %.2f\n", total/num);
else
printf("Grade average is 0\n");
return 0;
}

do-while循环

例:从键盘读入一个整数,求该数的位数

分析:一个数字由多个位数组成。
统计过程需要逐个地数,而循环的次数由位数决定,无法事先确定

#include<stdio.h>
int main(void){
int count=0, number;
printf("please enter a number:\n");
scanf("%d", &number);

do{
number = number /10;
count ++;
//printf("%d\n", number);
}while(number!=0);

printf("number:%d\n", count);
return 0;
}

其中包含do-while循环语句
相对于wihle循环,其具有以下特点

do-while循环使用方法与while类似,唯一的不同在于,循环条件的判断时机

因为是先执行后判断,所以do-while循环需要在循环体中包含最终改变循环条件真假性的操作

do while循环结构是典型的直到型循环结构

分支主題

例2:将前一个例子中的do-while循环直接改成while循环,程序还会对吗?

#include<stdio.h>
int main(void){
int count=0, number;
printf("please enter a number:\n");
scanf("%d", &number);


while(number!=0){
number = number /10;
count ++;
}

printf("number:%d\n", count);
return 0;
}

输入0时会出错,因为直接不满足循环条件,不会进入循环体。

为此种情况补充一个判断语句,即可不出错

例3,用do-while循环解决同一问题

#include<math.h>
int main(void){
int denominator, flag;
double item, sum;
/*初始化*/
flag=1;
denominator=1;
item=1.0;
sum=0;

/*while循环*/
do{
item = flag*1.0/denominator;
sum = sum + item;
flag = - flag;
denominator = denominator +2;
}while(fabs(item)>=0.0001); //当型循环,先判断再执行

printf("π值为%.4f\n", sum*4);
return 0;
}

在这一题中,while和do while两种循环结构都不会丢失可能的情况。因此可以直接套用。

总结