循环结构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
条件控制: 
判断循环是否继续执行,要有判断条件。
对于for循环而言,是其括号中的i<=n
改变循环变量: 
在每次循环中都要改变循环变量的值,
以进行循环条件的判断。
这里循环变量是i,改变它的语句是i++;
循环体: 
指其中重复执行的语句(循环体),
例如 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两种循环结构都不会丢失可能的情况。因此可以直接套用。
