4.3循环结构4.3.1for语句4.3.2while语句4.3.3do-while语句4.3.1for语句例4-9:输入2个整数lower和upper,输出一张华氏-摄氏温度转换表,华氏温度的取值范围是[lower,upper],每次增加1°F。例如输出:fahrcelsius30-1.131-0.6320.0330.6341.1351.7输入:3035一、程序解析-温度转换表#includestdio.hintmain(void){intfahr,lower,upper;doublecelsius;printf(“输入最低值:);scanf(%d,&lower);printf(“输入最高值:);scanf(%d,&upper);printf(fahrcelsius\n);//温度重复转换:华氏温度从lower开始,到upper结束,每次增加1°Ffor(fahr=lower;fahr=upper;fahr++){celsius=(5.0/9.0)*(fahr-32);printf(%d%6.1f\n,fahr,celsius);}return0;}fahr=fahr+1Enterlower:30Enterupper:35fahrcelsius30-1.131-0.6320.0330.6341.1351.7例4-9中for语句的流程for(fahr=lower;fahr=upper;fahr++){celsius=(5.0/9.0)*(fahr-32);printf(%d%6.1f\n,fahr,celsius);}Enterlower:30Enterupper:35fahrcelsius30-1.131-0.6320.0330.6341.1351.7到VC中看看执行过程for(表达式1;表达式2;表达式3)循环体语句实现C语句的重复执行二、for语句-循环语句3个表达式、循环体语句!书写顺序和执行顺序不同!表达式1只执行一次循环(控制)变量:for语句中,通过改变或判断某个变量的值来控制循环的执行for(fahr=lower;fahr=upper;fahr++){celsius=(5.0/9.0)*(fahr-32.0);printf(%d%6.1f\n,fahr,celsius);}for语句中的循环变量赋初值判断其值改变其值for(fahr=lower;fahr=upper;fahr++){celsius=(5.0/9.0)*(fahr-32.0);printf(%d%6.1f\n,fahr,celsius);}表达式1:给循环变量赋初值,指定循环的起点。fahr=lower表达式2:给出循环的条件,决定循环的继续或结束。fahr=upper表达式3:设置循环的步长,改变循环变量的值,从而可改变表达式2的真假性。fahr++语句:被反复执行的语句,一条语句。for语句的说明for(fahr=lower;fahr=upper;fahr++){celsius=(5.0/9.0)*(fahr-32.0);printf(%d%6.1f\n,fahr,celsius);}for(fahr=lower;fahr=upper;fahr=fahr+1)celsius=(5.0/9.0)*(fahr-32.0);printf(%d%6.1f\n,fahr,celsius);注意复合语句{}和空语句;for(fahr=lower;fahr=upper;fahr=fahr+1);celsius=(5.0/9.0)*(fahr-32.0);printf(%d%6.1f\n,fahr,celsius);!不要在for语句中随意加分号例4-10求1+2+……+100抽取具有共性的算式:sum=sum+isum初值为0,该算式重复100次,i从1变到100设i为循环变量,则:指定循环起点的表达式1:i=1给出循环条件的表达式2:i=100设置循环步长的表达式3:i++循环体语句:sum=sum+i;for(i=1;i=100;i++)sum=sum+i;三、指定次数的循环程序设计/*计算1+2+3+……+100*/#includestdio.hintmain(){inti,sum;sum=0;/*置累加和sum的初值为0*/for(i=1;i=100;i++)/*循环重复100次*/sum=sum+i;/*反复累加*/printf(“sum=%d\n”,sum);/*输出累加和*/return0;}源程序-求1+2+……+100for(i=1;i=100;i++){sum=0;sum=sum+i;}结果如何?sum=5050/*计算1+2+3+……+100*/#includestdio.hintmain(){inti,sum;sum=0;for(i=1;i=100;i++)sum=sum+i;printf(“sum=%d\n”,sum);return0;}模仿练习:求1+1/2+1/3+……+1/100for(i=1;i=100;i++)sum=sum+1.0/i;inti;doublesum;printf(“sum=%f\n”,sum);在上例基础上改写:一般包含四个部分:初始化:指定循环起点给循环变量赋初值,如i=1;进入循环之前,设置相关变量的初值,如sum=0。条件控制:只要i=100,循环就继续工作:指重复执行的语句(循环体)。一条语句,可以是复合语句或空语句。如sum=sum+i。改变循环变量:在每次循环中改变循环变量的值如i++,以改变循环条件的真假。一旦i100,循环结束。指定次数的循环程序设计输入一个正整数n,求前n项和,即循环n次/*计算1+2+3+……+100*/#includestdio.hintmain(void){inti,sum;sum=0;for(i=1;i=100;i++)sum=sum+i;printf(“sum=%d\n”,sum);return0;}例4-11求1+2+3+……+nfor(i=1;i=n;i++)sum=sum+i;printf(“Entern:);scanf(%d,&n);Entern:100Sum=5050/*计算1+2+3+……+n*/#includestdio.hintmain(){inti,sum;printf(“Entern:);scanf(%d,&n);sum=0;for(i=1;i=n;i++)sum=sum+i;printf(“sum=%d\n”,sum);return0;}模仿练习:求1+1/2+1/3+……+1/n/*求1+1/2+1/3+……+1/n*/#includestdio.hintmain(){inti,n;doublesum;printf(“Entern:);scanf(%d,&n);sum=0;for(i=1;i=n;i++)sum=sum+1.0/i;printf(“sum=%f\n”,sum);return0;}求前n项和,即循环n次,每次累加1项。for(i=1;i=n;i++)sum=sum+item(第i项)问题是第i项item如何计算(考虑与i的关系):item=1.0/(2*i-1)例4-12求1+1/3+1/5+…的前n项和for(i=1;i=n;i++){item=1.0/(2*i-1);/*计算第i项的值*/sum=sum+item;/*累加第i项的值*/}——思路一:求前n项和,即循环n次,每次累加1项。for(i=1;i=n;i++)sum=sum+item(第i项)问题是第i项item如何计算:分母总是比前一项大2求1+1/3+1/5+…的前n项和—思路二deno=1;for(i=1;i=n;i++){item=1.0/deno;/*计算第i项的值*/sum=sum+item;/*累加第i项的值*/deno=deno+2;/*计算下一项的分母*/}#includestdio.hintmain(void){inti,n;doubleitem,sum;printf(“Entern:);scanf(%d,&n);sum=0;for(i=1;i=n;i++){item=1.0/(2*i-1);/*计算第i项的值*/sum=sum+item;/*累加第i项的值*/}printf(sum=%f\n,sum);return0;}源程序-求1+1/3+1/5+…的前n项和模仿练习:1、求的前n项和,结果保留3位小数2、求的前n项和,结果保留3位小数3、求的前n项和,结果保留3位小数.......116957453321.......16113110171411.......111917151311求前n项和,即循环n次,每次累加1项。for(i=1;i=n;i++)sum=sum+item(第i项)关键是第i项item的计算:符号和前一项相反,分母比前一项大2deno=deno+2flag=-flagitem=flag*1.0/deno求1-1/3+1/5-…的前n项和方法1:deno=1;flag=1;for(i=1;i=n;i++){item=flag*1.0/deno;/*计算第i项的值*/sum=sum+item;/*累加第i项的值*/deno=deno+2;/*计算下一项的分母*/flag=-flag;//计算下一项的符号}方法2:flag=1;for(i=1;i=n;i++){item=flag*1.0/(2*i-1);/*计算第i项的值*/sum=sum+item;/*累加第i项的值*/flag=-flag;//计算下一项的符号}#includestdio.hintmain(){intdeno,flag,i,n;doubleitem,sum;printf(“Entern:);scanf(%d,&n);flag=1;deno=1;sum=0;for(i=1;i=n;i++){item=flag*1.0/deno;/*计算第i项的值*/sum=sum+item;/*累加第i项的值*/flag=-flag;/*准备下一次循环*/deno=deno+2;}printf(sum=%f\n,sum);return0;}模仿练习源程序例4-13阶乘表product=1;for(i=1;i=n;i++){计算i的阶乘;(前一项结果*i)输出结果}输入一个整数n,输出1-n的阶乘表:112236424…….product=product*i;printf(“%d%d\n”,product);#includestdio.hintmain(void){inti,n,product;printf(inputn:\n);scanf(%d,&n);product=1;/*置阶乘product的初值为1*/for(i=1;i=n;i++)/*循环重复n次*/{product=product*i;//递推计算i的阶乘printf(%d%d\n,i,product);}return0;}例4-13源程序1:结果用int型13以前的能正确计算,从14开始结果出错!超出int型的表达范围!#includestdio.hintmain(void){inti,n;doubleproduct;printf(inputn:\n);scanf(%d,&n);product=1;/*置阶乘product的初值为1*/for(i=1;i=n;i++)/*循环重复n次,计算n!*/{product=product*i;//递推计算i的阶乘printf(%d%.0f\n,i,product);}return0;}例4-13源程序2:结果用double型21以前的可以正确计算,22以后都是近似结果!double型也不是万能的,只有16位有效数字!例4-14n个数求和从键盘输入一个整数n和n个整数,输出这n个整数的和思路