版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章循环结构4.1用格里高利公式求π的近似值(while语句)4.2统计一个整数的位数(do-while语句)4.3判断素数
(break和continue语句)4.4求1!+2!+...+100!(循环嵌套)4.5循环结构程序设计4.1用格里高利公式求π的近似值【例4-1】使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4。分析:求累加和的问题sum=sum+第i项当item>=10-4时,循环执行sum=sum+item.while#include<stdio.h>#include<math.h>intmain(void){intdenominator,flag;doubleitem,pi;
flag=1;denominator=1;item=1.0;
pi=0;
while(fabs(item)>=0.0001){ item=flag*1.0/denominator;pi=pi+item;flag=-flag;denominator=denominator+2;}
pi=pi*4;printf(“pi=%f\n”,pi);return0;}4.1.1程序解析-求π的近似值item=0.0?fabs(item)<0.0001循环结束条件
|itemi|<10-44.1.2while语句while(表达式)
循环体语句
循环条件循环体一条语句while语句和for语句都是在循环前先判断条件while语句和for语句的比较表达式1;while(表达式2){for的循环体语句;
表达式3;}把for语句改写成while语句for(表达式1;表达式2;
表达式3)
循环体语句for(i=1;i<=10;i++)sum=sum+i;i=1;/*循环变量赋初值*/while(i<=10){/*循环条件*/
sum=sum+i;
i++;/*循环变量的改变*/}while语句和for语句的比较循环体while语句和for语句的比较for(;exp;){...}while(exp){...}while((c=getchar())==''||c=='\n'||c=='\t');/*skipwhitespacecharacters*/4.1.3统计输入的一批学生的平均成绩例4-2从键盘输入一批学生的成绩,计算平均分。分析判定这是一个求累加和的问题,通过循环结构计算累加和之后求平均值。需要:首先确定循环条件不知道输入数据的个数,无法事先确定循环次数,用while结构。需要设计循环条件:用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。循环条件就是当输入学生的成绩grade>=0
然后确定循环变量的初始化和循环体语句。#include<stdio.h>intmain(void){intnum; doublegrade,total; num=0;total=0; printf("Entergrades:\n"); scanf("%lf",&grade);/*输入第1个数*/while(grade>=0){/*输入负数,循环结束*/
total=total+grade; num++;scanf("%lf",&grade); } if(num!=0)printf("Gradeaverageis%.2f\n",total/num); elseprintf("Gradeaverageis0\n");return0;}三种常见的循环控制方式
计数控制的循环
如for中的循环变量条件控制的循环如while的直接条件
while(fabs(item)>=0.0001)
标记控制的循环设计一个循环结束标记
如输入grade<0循环结束4.2统计一个整数的位数从键盘读入一个整数,统计该数的位数。分析:一个整数由多位数字组成,统计过程需要一位一位地数,因此,这是一个循环过程。首先需要判定如何确定循环条件:循环过程由输入的整数决定,有待输入,循环次数不明确。一般不选择for结构。若用while结构,需要先判定循环条件。位数统计的结束条件是要先计算整数的每一位的存在性,然后才能知道是否还有位数需要统计,因此,我们引入
do-while
循环结构。intmain(void){intcount,number;count=0;printf("Enteranumber:");scanf("%d",&number);if(number<0)number=-number;do{count++;number=number/10; }while(number!=0);printf("Itcontains%ddigits.\n",count);return0;}4.2.1程序解析-统计一个整数的位数while(number!=0){count++;number=number/10;}一个整数至少有一位,循环至少做一遍4.2.2do-while语句do{
循环体语句}while(表达式);先循环后判断
while
是先判别条件,再决定是否循环;do-while
是先执行循环体一次,根据循环的结果决定是否继续循环。因此循环体至少执行一次。while和do-while的比较若循环次数已知,使用for语句否则考虑: /*循环次数未知*/
循环条件在进入循环时是否明确?
Yes:使用while语句
No:使用do-while语句
(循环的结果决定是否继续循环)4.2.3循环语句的选择4.3判断素数(P64)输入一个正整数m,判断它是否为素数。分析:素数是除了1和数字m本身,不能被其它数整除的数。实际上只要判定m是否能够被2~m-1之间的整数整除.或者判定区间可以缩小到[2,m/2].求余运算%能够判定整除。a%b==0表示a能被b整除。算法:以m对[2,m/2]中的任何一个数
i求%,只要有一个计算结果不为0,就不是素数,否则是素数。这是一个循环次数已知的运算过程,用for循环结构intmain(void){inti,m; printf("Enteranumber:"); scanf("%d",&m); for(i=2;i<=m/2;i++) if(m%i==0)break; if(i>m/2)printf("%disaprimenumber!\n",m); elseprintf("No!\n"); }例4-4判断素数—源程序循环的结束条件?1)循环变量
i>m/22)m%i==0,非素数break语句的作用?break语句当要强制跳出当前循环时:使用breakfor(i=2;i<=m/2;i++)if(m%i==0){printf("No!\n");break;
}printf("Yes");
do{...if(...)break;...}while(表达式);while(表达式){…if(…)break;…}continue
语句while(exp){
语句1if(expb)continue;
语句2}跳过continue后面的语句,继续下一次循环continue语句的功能break和continue#include"stdio.h"intmain(void){charc;inti;for(i=0;i<5;i++){c=getchar();if(c==‘*')break;putchar(c);}}continue;4.4求1!+2!+….+100!for(i=1;i<=100;i++){item=i!sum=sum+item;}分析:累计求和的问题,循环次数100.#include<stdio.h>doublefact(intn);intmain(void){ inti;doublesum; sum=0;for(i=1;i<=100;i++) sum=sum+fact(i);printf("1!+2!+3!+…+100!=%e\n",sum);return0;}doublefact(intn){inti; doubleresult=1;for(i=1;i<=n;i++) result=result*i;returnresult;}4.4.1程序解析
求1!+2!+….+100!如果不使用函数调用,而是直接在main中计算i!调用函数fact(i)计算i的阶乘循环内再使用循环,即使用嵌套循环4.4.2嵌套循环for(i=1;i<=100;i++){
item=i!sum=sum+item;}for(i=1;i<=100;i++){item=1; for(j=1;j<=i;j++) item=item*j;sum=sum+item;}i=1时,i=1i=2时,2*1;i=i时,i*(i-1)*(i-2)…*1设置一个新的循环变量j∈[1,i]#include<stdio.h>intmain(void){ inti,j; doubleitem,sum;/*item存放阶乘*/ sum=0;
for(i=1;i<=100;i++){item=1;/*每次求阶乘都从1开始*/ for(j=1;j<=i;j++)/*内层循环算出item=i!*/ item=item*j; sum=sum+item; } printf("1!+2!+3!+…+100!=%e\n",sum);}例4-6源程序内层循环的初始化for(i=1;i<=100;i++){item=1;
for(j=1;j<=i;j++) item=item*j;sum=sum+item;}求1!+2!+….+100!item=1;for(i=1;i<=100;i++){for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求1!+1!*2!+……+1!*2!*……*100!分析嵌套循环的执行过程for(i=1;i<=100;i++){item=1; for(j=1;j<=i;j++) item=item*j;sum=sum+item;}外层循环变量i的每个值内层循环变量j变化一个轮次;内层循环变量与外层循环变量不能相同n=0;for(i=1;i<=100;i++)for(j=1;j<=i;j++){ printf("%d%d\n",i,j);n++;}分析嵌套循环的执行过程4.5循环程序设计
循环程序的实现要点:
①循环体:归纳出哪些操作需要反复执行?②循环条件:循环体在什么情况下重复执行?选用合适的循环语句
forwhiledo-while
给定循环次数,首选for
其它条件控制循环,考虑while或do-while例4-7输入一批学生的成绩,求最高分分析:求最高分的过程,实际上是不断比较输入的分数,判定哪个分数最大的过程。因此是一个循环比较的过程。
循环体:读入成绩+比较循环条件:没有明确,需要设置(1)先输入一个学生的人数n,再输入n个分数,求其最高分;循环次数由n确定,可用for或者:(2)设定一个输入结束标志,如输入分数为负数时,学生成绩输入结束;用while#include<stdio.h>intmain(void){inti,mark,max,n;
printf("Entern:");scanf("%d",&n);printf("Enter%dmarks:",n);scanf("%d",&mark); /*读入第一个成绩*/max=mark;/*假设第一个成绩是最高分*/for(i=1;i<n;i++){scanf("%d",&mark);if(max<mark)max=mark;}printf("Max=%d\n",max);return0;}例4-7输入一批学生的成绩,求最高分(for)不输入n,循环次数未知,输入负值结束#include<stdio.h>intmain(void){intmark,max;printf("Entermarks:");scanf("%d",&mark);/*读入第一个成绩*/max=mark;/*假设第一个成绩最高分*/while(mark>=0){if(max<mark)max=mark;scanf("%d",&mark);};printf("Max=%d\n",max);return0;}例4-7输入一批学生的成绩,求最高分(while)Entermarks:-1Max=-1#include<stdio.h>intmain(void){intmark,max;
max=-1;/*给max赋一个小初值*/printf("Entermarks:");do{scanf("%d",&mark);if(max<mark)max=mark;}while(mark>=0);printf("Max=%d\n",max);}例4-7输入一批学生的成绩,求最高分(do-while)Entermarks:-10Max=-112345%10=5
1234%
10=4
123
%
10=3
12
%
10=2
1
%
10
=
1例4-8将一个正整数逆序输出循环体(循环不变式)
x%10x=x/10循环结束条件x==0scanf(“%d”,&x);while(x!=0){digit=x%10;x=x/10;printf("%d",digit);}12345/
10=
12341234
/
10=
123123
/
10=
1212
/
10=
11
/
10
=
01234554321结束#include<stdio.h>intmain(void){intx;printf("Enterx:");scanf("%d",&x);while(x!=0){printf("%d",x%10);x=x/10;}return0;}例4-8将一个正整数逆序输出—源代码用do-while实现?do{printf("%d",x%10);x=x/10;}while(x!=0);例4-9求100以内的全部素数,每行输出10个for(m=2;m<=100;m++)if(m是素数)printf("%d",m);n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;If(i>n)printf("yes\n")elseprintf("no\n”);for(m=2;m<=100;m++){n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n)printf("%d",m)}判断素数for(i=2;i<=m/2;i++)if(m%i==0)break;[2,m/2]->[2,m]1)求出100以内的全部素数;2)每行输出10个素数#include<stdio.h>#include<math.h>/*调用求平方根函数,需要包含数学库*/intmain(void){intcount,i,m,n;count=0;/*count记录素数的个数,用于控制输出格式*/for(m=2;m<=100;m++){n=(int)sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n){ /*如果m是素数*/printf("%6d",m);/*输出m*/count++;/*累加已经输出的素数个数*/if(count%10==0)/*如果count是10的倍数,换行*/printf("\n");}}printf("\n");return0;}例4-9求100以内的全部素数,
每行输出10个例4-10求Fibonacci序列的前10项1,1,2,3,5,8,13,……x1x2xx1x2xx1=x2=1;x=x1+x2;x1=x2;x2=x;x=x1+x2;x1=1;x2=1;printf("%6d%6d",x1,x2);/*输出头两项*/for(i=1;i<=8;i++){/*循环输出后8项*/x=x1+x2;/*计算新项*/printf("%6d",x);x1=x2;/*更新x1和x2*/x2=x;}例4-11古典算术问题—搬砖头某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。问用45人正好搬45块砖,有多少种搬法?分析:对于三类人员都要完全测试。用循环检测。每类人员的检测可能型性范围[0,45],三类人员的计数变量分别设为men,w
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026山东临沂市鲁南技师学院第二学期临时代课教师招聘1人备考题库(二)【基础题】附答案详解
- 2026浙江温州市公证协会招聘1人备考题库含答案详解(达标题)
- 2026浙江嘉兴大学人才招聘117人备考题库及参考答案详解(预热题)
- 2026中共常州市委党校招聘教师2人备考题库(长期)(研优卷)附答案详解
- 2026合肥印象滨湖旅游投资发展有限公司招聘4人备考题库【培优b卷】附答案详解
- 2026陕西西安市高新第一学校招聘备考题库及一套完整答案详解
- 2026山东青岛市澳柯玛股份有限公司招聘4人备考题库(考点提分)附答案详解
- 南昌南昌大学第一附属医院(江西省呼吸医学中心)2025年高层次人才招聘144人笔试历年参考题库附带答案详解(5卷)
- 2026西安大雁塔假日酒店多岗位人才招聘4人笔试历年参考题库附带答案详解
- 2026浙江台州市黄岩全域资源开发管理有限公司招聘笔试及笔试历年参考题库附带答案详解
- 2024四川天府环境管理股份有限公司招聘笔试参考题库附带答案详解
- 体质养生王琦教授
- 上海市大学生安全教育(2021级)学习通超星课后章节答案期末考试题库2023年
- 周三多《管理学(第五版)》全套PPT课件(完整版)
- 物业项目会所公约
- 2023名校版人教版六年级下册语文 5.14文言文二则含答案
- 译林(小学)英语五年级(上下册)各单元教学反思
- 最全司机礼仪培训
- 供应商资格审查表工程施工类
- GA/T 2000.93-2015公安信息代码第93部分:诈骗手段代码
- 110-220kV变电站扩建工程施工方案
评论
0/150
提交评论