




已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 四 章 循环结构,4.1 用格里高利公式求的近似值 (while语句) 4.2 统计一个整数的位数 (do-while语句) 4.3 判断素数 (break 和 continue 语句) 4.4 求1!+2!+.+100! (循环嵌套) 4.5 循环结构程序设计,本章要点,什么是循环? 为什么要使用循环? 如何实现循环? 实现循环时,如何确定循环条件和循环体? 怎样使用while 和do-while语句实现次数不确定的循环? while 和do-while语句有什么不同? 如何使用break语句处理多循环条件? 如何实现多重循环?,for语句一般应用形式:,for( 循环变量赋初值; 循环条件; 循环变量增值) 循环体语句 ,#include void main() int i,sum=0; for( i=1; i=100; i+ ) sum+=i; printf(“%d“,sum); ,for (表达式1;表达式2;表达式3),循环结构回顾,确定循环次数,4.1 用格里高利公式求的近似值,使用格里高利公式求的近似值,要求精确到最后一项的绝对值小于104。 4.1.1 程序解析 4.1.2 while语句 4.1.3 输入一批学生的成绩,统计平均分,4.1.1 程序解析求的近似值,#include #include void main( ) int denominator, flag; double item, 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 = %fn”, pi); ,不确定循环次数,for( i=1; i=100; i+ ),4.1.2 while 语句,while (条件) 循环体语句;,循环条件,循环体,一般形式:,while (表达式) 循环体语句;,执行流程:当表达式为真(非0值)时,执行循环体语句;直到表达式为假,循环终止,4.1.2 while语句,特点:先判断表达式,后执行循环体(当型),求1+2+100的和 sum=0; i=1; while(i=100) sum=sum+i; i+; ,此处无分号 ;,一般形式:,while(表达式) 循环体语句,4.1.2 while语句,说明: 循环体有可能一次也不执行(一开始条件就不成立) 当表达式为真(非0值)时,即可继续执行循环 循环体包括一个以上语句的用 组成复合语句 有使循环趋向结束的语句,如 i+ 无限循环: 也即无循环结束条件 while(1) 循环体; 下列情况,退出while循环: 条件表达式不成立(为零) 循环体内遇 break,特点:先判断表达式,后执行循环体(当型),sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d”,sum);,用一对大括号 将若干语句顺序组合在一起就是一个复合语句,例 用while循环求1+2+100的累加和,#include void main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d“,sum); ,循环结构的五要素: 循环初值,循环条件,循环终值,循环变量增值,循环体,例 用while循环求1+2+n的累加和,#include void main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d“,sum); ,求前n项的和 可用scanf读入n,#include void main() int i,sum=0,n; i=1; printf(“Enter n: ”); scanf(“%d”, ,while 语句和for语句 都是在循环前先判断条件 while 和 for 的比较,while 语句说明,表达式1; while (表达式2) 循环体语句; 表达式3; ,for(表达式1; 表达式2; 表达式3) 循环体语句,for (i = 1; i = 10; i+) sum = sum + i;,i = 1; while (i = 10) sum = sum + i; i+; ,求110的累加和,程序解析求的近似值,例4-1 #include #include void main( ) int denominator, flag; double item, 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 = %fn”, pi); ,精确到最后一项的绝对值小于104 ,即|item| 104, 达到精度要求,循环结束,fabs(item) 0.0001 精度要求给出了循环结束条件,程序解析求的近似值,#include #include void main( ) int denominator, flag; double item, 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 = %fn”, pi); ,item=0.0 ?,#include #include void main() int s; float n,t,pi; t=1; s=0; n=1.0; m=1; while(fabs(t)=1e-6) s=s+t; n=n+2; m=-m; t=m/n; pi=s*4; printf(“pi=%fn“,pi); ,例4-2 从键盘输入一批学生的成绩,计算平均分 分析: 求累加和 确定循环条件 不知道输入数据的个数,无法事先确定循环次数 用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。,4.1.3 统计输入的一批学生的平均成绩,例4-2 从键盘输入一批学生的成绩,计算平均分 #include void main() int num; double grade, total; num = 0; total = 0; printf(“Enter grades: n“); scanf(“%lf”, ,4.2 统计一个整数的位数,从键盘读入一个整数,统计该数的位数。 4.2.1 程序解析 4.2.2 do - while语句 4.2.3 循环语句的选择,例4-3 #include void main ( ) int count, number; count = 0; printf(“Enter a number: “); scanf (“%d“, ,4.2.1 程序解析统计一个整数的位数,while (number != 0) number = number / 10; count +; ,4.2.2 do - while 语句,do 循环体语句 while (表达式);,先循环,后判断,真,假,表达式,循环体语句,do-while的下一条语句,while 是先判别条件,再决定是否循环; do-while 是先至少循环一次,然后再根据循环的结果决定是否继续循环。,while 和 do-while 的比较,while (number != 0) number = number / 10; count +; ,do number = number / 10; count +; while (number != 0);,例 while和dowhile比较,#include void main() int i,sum=0; scanf(“%d“, ,#include void main() int i,sum=0; scanf(“%d“, ,结论:当 while后的表达式第一次的值为“真”时,两种结果相同,否则不同,输入:10,输出:sum=10 输出:sum=10,输入:11,输出:sum=11 输出:sum=0,三种循环结构:求1100的和,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d“,sum);,sum=0; i=1; do sum+=i; i+; while(i=100); printf(“%d“,sum);,sum=0; for(i=1; i=100; i+) sum+=i; printf(“%d“,sum);,几种循环的比较,1、三种循环语句在处理循环问题时,一般可以相互替代,2、对于循环次数不确定的问题,可以用while或do-while语句来实现。 while语句为先判断后执行,do-while语句则先执行后判断。,3、对于循环次数确定的问题,用for语句更方便。for语句也为先判断后执行。,4.2.3 循环语句的选择,if(循环次数已知) 使用for语句 else /* 循环次数未知 */ if (循环条件在进入循环时明确) 使用while语句 else /* 循环条件需要在循环体中明确 */ 使用do-while语句,4.3 判断素数,输入一个正整数m,判断它是否为素数。 4.3.1 程序解析 4.3.2 break语句 和continue语句,4.3.1 程序解析判断素数,算法:一个正整数m,除了能被1和它本身(m)整除外,不能被其它数整除,该数就是素数。 设 i 取值 2, m-1 如果m不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数 只要找到一个i,使m%i为0,则m肯定不是素数 m不可能被大于 m/2 的数整除 i 取值 2, m-1 、 2, m/2 、 2, ,for(i = 2; i m/2) printf(“yesn“) else printf(“non”);,int main(void) int i, m; printf(“Enter a number: “); scanf (“%d“, ,例4-4源程序判断素数,for (i = 2; i = m/2; i+) if (m % i = 0) printf(“No!n“); else printf(“%d is a prime number! n“, m);,根据素数定义,在for循环中,只要有一个i能满足m%i=0,则m就不是素数,不用在检查m是否能被其他数整除,可提前结束循环,一般形式:break; 功能:放在循环语句和switch语句中,用于终止并跳出循环体或switch语句,接着执行循环语句或switch语句后面的语句。 说明: break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环 break只能终止并跳出最近一层的循环(嵌套循环时)。如果要跳出多层循环,用goto语句 break只能用于循环语句和switch语句,break语句,求前50项和 for(i=1; i50) break; sum+=i; printf(“%d“,sum);,循环体,例lt-area: break举例:按不同的半径,输出圆面积,面积大于100时停止,#include #define PI 3.14159 void main() int r; float area; for(r=1;r100) break; printf(“r=%d,area=%.2fn“,r,area); ,通常break语句总是和if语句连在一起,if(area=100) printf(“r=%d,area=%.2fn“,r,area); else break;,例lt-char break举例: 小写字母转换成大写字母,直至输入非小写字母字符。,#include void main() char c; while(1) c=getchar(); if(c=a ,#include void main() char c; while(1) c=getchar(); if(c=a ,只将小写字母转成大写字母输出,将小写字母转成大写字母输出 如果是大写字母,则直接输出,一般形式:continue; 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断,如果条件成立,继续执行循环。 说明: 仅用于循环语句中 continue 语句仅结束本次循环,但break语句则是结束整个循环过程。,例 输出1到100之间能被9整除的数 #include void main() int i; for(i=1; i=100; i+) if(i%9!=0) continue; printf(“%dn“,i); ,continue 语句,分析:i为循环变量,从110 十个整数n, 用scanf读入 正数的个数放入num中 正数的和放入sum中 正数的平均值为aver= sum/num,例li-count 求输入的十个整数中正整数的个数及其和与平均值,#include void main() int i, n, num=0; float sum=0,aver; printf(“请输入10个数:”); for(i=0;i10;i+) scanf(“%d“, ,if(n0) num+; sum+=n; else continue;,if(n0) num+; sum+=n; 行不?,注意:scanf的输入格式是用12 45 69还是用12,45,69,for循环中scanf的输入格式要用空格或回车,4.4 求1! + 2! + . + 100!,累乘求阶乘,累加求和(循环100次) item = i ! sum = sum + item; 4.4.1 程序解析 计算 i 的阶乘 4.4.2 嵌套循环 用循环计算 i 的阶乘以及阶乘的和,#include double fact (int n); int main(void) int i; double sum; sum = 0; for(i = 1; i = 100; i+ ) sum = sum + fact (i); printf(“1! + 2! + 3! + + 100! = %en“, sum); return 0; double fact (int n) int i; double result = 1; for (i = 1; i = n; i+) result = result * i ; return result ; ,4.4.1 程序解析 求1! + 2! + . + 100!,4.4.2 嵌套循环,求6!阶乘 item = 1; for (j = 1; j = 6; j+) item = item * j;,累加和 for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; ,求阶乘 1!=1 2!=1*2 =1!*2 3!=1*2*3=2!*3 j! = 1*2*.* j=(j-1)!*j,求阶乘的和 1! + 2! + . + 100!,例4-6 源程序,#include void main() int i, j; double item, 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! = %en“, sum); ,求阶乘 1!=1 2!=1*2 =1!*2 3!=1*2*3=2!*3 j! = 1*2*.* j=(j-1)!*j,内层循环的初始化,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!,例lt4-star :根据输入的边长,输出正方形,#include void main() int i,j,n; printf(“input n: “); scanf(“%d“, ,例lt4-99 循环嵌套,输出九九表,#include void main() int i,j; for(i=1;i10;i+) printf(“%4d“,i); printf(“n-n“); for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?“%4dn“:“%4d“,i*j); ,变量 i 控制行,变量 j 控制列 i=1, j 从19循环,输出 i*j i=2, j 从19循环, 输出 i*j,for(i=1;i10;i+) for(j=1;j10;j+) printf(“%4d“,i*j); printf(“n”); ,例lt4-99a 循环嵌套,输出九九表,#include void main() int i,j; for(i=1;i10;i+) printf(“%4d“,i); printf(“n-n“); for(i=1;i10;i+) for(j=1;j=i;j+) printf(j=i)?“%4dn“:“%4d“,i*j); ,变量 i 控制行,变量 j 控制列 i=1, j 从 1i 循环,输出 i*j i=2, j 从 1i 循环, 输出 i*j,for(i=1;i10;i+) for(j=1;ji;j+) printf(“%4d“,i*j); printf(“n”); ,for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?“%4dn“:“%4d“,i*j);,分析嵌套循环的执行过程,for(i = 1; i = 100; i+) item = 1; for (j = 1; j = i; j+) item = item * j; sum = sum + item; ,外层循环变量 i 的每个值 内层循环变量 j 变化一个轮次; 内外层循环变量不能相同 分别用 i 和 j,for (i = 1; i = 100; i+) for (j = 1; j = i; j+) printf (“%d %dn“, i, j );,4.5 循环程序设计,循环程序的实现要点: 归纳出哪些操作需要反复执行? 循环体 这些操作在什么情况下重复执行? 循环条件 选用合适的循环语句 for while do-while 循环具体实现时考虑(循环条件): 事先给定循环次数,首选for 通过其他条件控制循环,考虑while或do-while,#include int main(void) int i, mark, max, n; printf(“Enter n: “) ; scanf (“%d“, ,例4-7 输入一批学生的成绩,求最高分(for),max,mark,Enter n: 5 Enter 5 maks:67 88 73 54 82 Max = 88,Enter n: 0,#include void main() int mark, max; printf(“Enter marks:“); scanf (“%d“, ,例4-7 输入一批学生的成绩,求最高分(while),#include int main(void) int mark, max; max = -1; /* 给max赋一个小初值 */ printf(“Enter marks: “); do scanf (“%d“, ,例4-7 输入一批学生的成绩,求最高分(do-while),Enter marks: 67 88 73 54 82 -1 Max = 88,Enter marks: -1,例lt4-chicken: 现有100元,要求买100只鸡,假定母鸡每只3元,公鸡每只2元,小鸡每只5角。列出所有可能的买鸡方案。设母鸡个数为m,公鸡个数为g, 小鸡个数为x。 根据题意,有以下公式成立:0.5*x+2*g+m*2=100,#include void main() int x,g,m,n=0; for(m=0;m=100;m+) for(g=0;g=100;g+) x=100-m-g; if(0.5*x+2*g+m*3=100) n+; printf(“n第%d种方案是:” ,n); printf(“x=%d, g=%d, m=%dn”,x,g,m); ,#include void main() int x,g,m,n=0; for(x=0;x=100;x+) for(g=0;g=100;g+) m=100-x-g; if(0.5*x+2*g+m*3=100) n+; printf(“n第%d种方案是:”,n); printf(“x=%d, g=%d, m=%dn”,x,g,m); ,优化程序 1、各种鸡至少买一只 2、各种鸡最多能买几只,例4-10 求Fibonacci序列:1,1,2,3,5,8,13,的前10项,1, 1, 2, 3, 5, 8, 13, x1 x2 x x1 x2 x,x1 = x2 = 1; x = x1 + x2; x1 = x2; x2 = x;,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; ,求Fibonacci序列:1,1,2,3,5,8,13,的前n项,例4-11 古典算术问题搬砖头,某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。 问用45人正好搬45块砖,有多少种搬法?,for (men = 0; men = 45; men+) for (women = 0; women = 45; women+) for (child = 0; child = 45; child+) if (men+women+child=45) ,例4-11 源程序(2),for (men = 0; men = 15; men+) for (women = 0; women = 22; women+) child = 45 women men; if (men *
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省深圳南山区五校联考2026届数学八年级第一学期期末综合测试试题含解析
- 安徽省合肥市中学科大附中2026届数学九年级第一学期期末质量跟踪监视模拟试题含解析
- 新型储能技术压缩空气储能的研究与发展
- 2025股份转让合同范本
- 安徽省阜阳颍东区四校联考2026届数学八年级第一学期期末联考试题含解析
- 中国银行金华市东阳市2025秋招英文面试20问及高分答案
- 工商银行赤峰市红山区2025秋招笔试英语阅读理解题专练30题及答案
- 邮储银行绥化市海伦市2025秋招笔试金融学专练及答案
- 中国银行惠州市博罗县2025秋招半英文面试题库及高分答案
- 邮储银行崇左市江州区2025秋招笔试金融学专练及答案
- 工会经审业务网络知识竞赛题库
- 宁夏易制毒管理办法
- 学堂在线 新闻摄影 期末考试答案
- 脑瘫个案护理
- 2025年全国新高考英语II卷试题解析及复习备考策略(课件)
- 课本剧《霸王别姬》剧本【3篇】
- 2025至2030年中国乙肝疫苗行业市场发展模式及未来前景分析报告
- 作文写作(解析版)-2025年中考语文一模试题分类汇编(贵州专用)
- 人工智能技术研发股东出资合作框架协议
- 《资源环境信息技术》课件 - 探索数字化时代的环境保护与可持续资源管理
- 异麦芽糖酐铁注射液-药品临床应用解读
评论
0/150
提交评论