c语言程序循环结构出现的问题,C语言程序设计循环结构程序设计.ppt

第5章 循环结构程序设计,C 语言程序设计,北京航空航天大学 交通科学与工程学院 徐国艳,2019/7/12,2,循环的基本概念 不同形式的循环控制 多重循环问题,2019/7/12,3,什么是循环? 为什么要使用循环?,?,5.1 循环的基本概念,循环是有规律的重复操作。将复杂问题分解为简单的操作过程,程序只对简单过程描述,这些过程的多次重复就可完成对问题的求解。重复的频繁性决定了循环在程序设计中必不可少!,一、循环问题,问题1:,问题2:求学生平均成绩 分数相加后除以课程数,做99次加法,问题3:找出数集x中能同时被3和7整除的数 找数,问题分解 循环控制,2019/7/12,4,5.1 循环的基本概念,while循环(5.2节) do while循环(5.3节) for循环(5.4节) if--goto 循环(一般不用),难点:,循环嵌套,C提供四种循环控制语句:,2019/7/12,5,5.1循环的基本概念(续),二、循环结构,循环结构有两种形式: 当型循环结构 直到型循环结构,当型循环,直到型循环,先判断后循环,先循环后判断,,,,,入口,出口,区别?,循环体中是一 个过程,该过 程的复杂程度 取决于问题及 对问题的分解,2019/7/12,6,5.1 循环的基本概念(续),,,当型循环,条件 循环 次数,,Y,,,,?,Y 执行 1,Y 执行 3,Y 执行 2,N 结束,Y,,Y,,N,,3次,在循环入口处判断 当条件为真时执行循环,,2019/7/12,7,5.1循环的基本概念(完),,直到型循环,在循环出口处判断,当条件为真时继续执行循环,直到条件为假时为止。,,条件 循环 次数,执行 1,Y 执行 3,Y 执行 2,N 结束,,Y,,Y,,Y,,Y 执行 4,N,,循环至少执行一次,2019/7/12,8,5.2 while循环控制,语句一般格式 while (表达式) {语句组},,称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句 是循环重复执行的部分,当条件为真时执行循环体,2019/7/12,9,语句一般格式 while (表达式) {语句组},功能:计算“表达式”的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。,,,2019/7/12,10,循环控制条件,循环体,,,,,,,语句一般格式 while (表达式) {语句组},,,2019/7/12,11,例如:,【例5.1】编写程序,求100个自然数的和 即: s=1+2+3+ … +100,思路:寻找加数与求和的规律,加数i——从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。 求和——设变量 sum 存放和,循环求sum=sum+i,直至i超过100。,2019/7/12,12,算法和程序:,#include “stdio.h“ void main( ) { int i,sum; i=1; sum=0; while (i=100) { sum=sum+i; i++; } printf(“sum=%d\n“,sum); },程序输出结果: sum=5050,i: 循环控制变量 sum: 累加器,2019/7/12,13,注意:,如果while的 (表达式) 值为0,则循环体一次也不执行 (例如当i的初值=101) 。 在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。,思考程序段的输出? …… i=1; sum=0; while (i=100) { i++; sum=sum+i; },运行后,输出: sum=5150 原因是什么?,2019/7/12,14,注意(续):,总结:为了保证循环正常运行,应该特别注意: 循环控制条件的描述 控制条件的初始状态(初始值) 循环体内部对控制条件的影响,2019/7/12,15,5.3 do-while语句,语句一般格式 do {语句组} while (表达式); 功能: 先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。,,直到条件为假时结束循环,2019/7/12,16,do-while循环的算法,N-S结构图,#include “stdio.h“ void main( ) { int i=1,sum=0; do { sum=sum+i; i++; } while (i=100); printf(“%d\n“,sum); },用do-while语句 求100个自然数的和,2019/7/12,17,void main() { int n=1,s=0,x; scanf(“%d“, },求:,流程图,,,,,,do {s=s+n; n++;} while (n=x);,do while,N,2019/7/12,18,/*ex1-1.C*/ void main() {int s=0,x; scanf(“%d“, },/*ex1.C*/ void main() {int s=0,x; scanf(“%d“, },例,循环至少 执行一次,循环没有 被执行,三、 while与do while的比较,输出:s=12,输出:s=0,如输入为1和12,两程序各输出情况,?,输入12时:,2019/7/12,19,5.4 for语句,语句一般格式 for (表达式1;表达式2;表达式3) 语句,,循环初始条件,循环控制条件,循环体,1.求解表达式1; 2.求解表达式2,值为真(非0)执行循环体,然后 执行第3步;值为假(0)则结束循环,转到第5步, 3.求解表达式3; 4.转回第2步。 5.循环结束,执行for语句下面的语句。,2019/7/12,20,for(e1;e2;e3) 语句的算法,例如: void main( ) { int i,sum; sum=0; for ( i=1; i=100; i++) sum=sum+i; printf(“sum=%d\n“,sum); },2019/7/12,21,for循环控制语句,for(e1;e2;e3) e1、e2、e3均可缺少,for (;n100;n++) 缺少e1,n应在循环之前赋初值 for (n=0;;n++) 缺少e2,造成死循环 for (n=0;n100;) 缺少e3,n增量应在循环体内进行 for (; ;) 缺少e1,e2,e3 ,死循环! for (;n100;) 缺少e1,e3,分号始终不能缺少!,讨论,2019/7/12,22,for循环控制语句,for(初值;判断;增量) 语句; for(初值;判断;增量) {复合语句;} for(初值;判断;增量);,2.e1和e3可是与初值、增量无关的逗号表达式,for (s=0,n=1;n=100;s=s+n, printf(“ %d” ,s)) n++; for (s=0;n100;s=s+n,n++) {printf(“ %d” ,s);},求累加和,n的初值在 for之前完成,增量在for 之外完成,for语句的形式:,2019/7/12,23,for循环控制语句,void main() { int n=1,s=0,x; scanf(“%d“, },while(n=x) {s=s+n; n++; },,void main() { int n,s,x; scanf(“%d“, },例,缺少e1,赋初值,2019/7/12,24,,,for循环控制语句,void main() { int n,s; for(n=1;n=10;n+=2) printf(“n=%d\n“,n); },void main() { int n,s; for(n=1;n=10;n+=2); printf(“n=%d\n“,n); },以下程序的输出结果,输出结果: n=11,输出结果: n=1 n=3 n=5 n=7 n=9,?,;,2019/7/12,25,5.5 循环结构中的跳转语句,有如下三种语句实现跳转: continue语句 break语句 goto语句 功能:在循环语句的循环体中使用,可以进行循环的流程控制,2019/7/12,26,,5.5.1 continue语句及应用,功能: 中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。,,,,while语句,,,,,do-while语句,,,,,for语句,2019/7/12,27,例如:,⑴ int x,n=0,s=0; while (n10) { scanf(“%d“,,⑵ int x,n=0,s=0; do { scanf(“%d“,,⑶ for (n=0,s=0; n10; n++) { scanf(“%d“, },2019/7/12,28,应用举例,【例5.4】把100~200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。,for (n=100; n=200; n++) n能被7整除 F T 终止本 输出n 次循环 输出了10个数 T F 换行,,,,,,,,,,,,2019/7/12,29,算法和程序,#include “ stdio.h“ void main( ) { int n,j=0; for(n=100;n=200;n++) { if (n%7!=0) continue; printf(“%6d“,n); j++; if (j%10==0) printf(“\n“); } printf(“ \n j=%d\n“,j); },2019/7/12,30,,5.5.2 循环中break的应用,功能: 利用break语句能够强迫终止本层循环,转到后续语句执行。,,,while语句,,,,,do-while语句,,,,for语句,,,2019/7/12,31,例如:,⑴ int x,n=0,s=0; while (n10) { scanf(“%d“,,⑵ int x,n=0,s=0; do { scanf(“%d“,,⑶ for (n=0,s=0; n10; n++ ) { scanf(“%d“, },2019/7/12,32,5.6 循环的嵌套,如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套 例如: #include void main( ) { int i, j; for ( i=1; i10; i++ ) for ( j=1; j=i; j++ ) printf ((j==i)?“%4d\n“:“%4d“,i*j); },外循环语句,内循环语句,2019/7/12,33,注意:,while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。 多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。 例如:,for(a=1;a=10;a++) { for (b=0;b=5;b++) …… },外循环执行了10次,每次外循环中内循环执行6次 循环正常结束时,内循环执行了10×6=60次,2019/7/12,34,5.7 循环结构程序设计,【例5.5】按每行输出5个数的形式输出Fibonacci数列的前20项 。,Fibonacci数列的前几项是:1、1、2、3、5、8、13、21、34、…。此数列的变化规律是:,思路: 设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项; 将f1←f2, f2←f3,再求f3=f1+f2得到第4项; 依此类推求第5项、第6项…,这是一种递推算法 应采用循环实现,2019/7/12,35,算法和程序,#include “ stdio.h“ #define N 20 void main( ) { int i,f1,f2,f3; f1=f2=1; printf(“\n%8d%8d“,f1,f2); for (i=3; i=N; i++) { f3=f1+f2; f1=f2; f2=f3; printf(“%8d“,f3); if (i%5==0) printf(“\n“); } },2019/7/12,36,举例,【例5.6】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。,思路:素数是指只能被1和它本身整除的数,如5、7、11、17、…等。,分别用2、3、…,m-1尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。,这是一种穷举算法 设除数为j,从2循环到m-1,2019/7/12,37,算法和程序:,#include “math.h“ void main( ) { int j,m,k; printf(“Enter an integer number: “); scanf(“%d“, },2019/7/12,38,举例,【例5.7】编程序求2~10000以内的完全数。,完全数:一个数的因子(除了这个数本身)之和等于该数本身。,思路: 设定i从2变到10000,对每个i找到其因子和s; 判定 i==s?若相等,则i为完全数,否则不是。,例如:6的因子是1、2、3,因子和 1+2+3=6 因此 6 是完全数,使用穷举算法 用双层循环实现,2019/7/12,39,算法和程序:,#include “stdio.h“ void main( ) { int i,j,s; for (i=2; i=10000; i++) { s=0; for (j=1; ji; j++) if (i%j==0) s+=j; if (i==s) printf(“%6d\n“,s); } },2019/7/12,40,举例,【例5.9】编程序,输出以下图形。,******* ***** *** *,一共有4 行,每行由空格和星号组成:空格数按行增加,星号按行减少 变量 i 控制输出行数, 从1变化到4 变量 j 控制输出每行的空格和星号: j 从1变化到 i,每次输出一个空格 j 从1变化到 8-2*i+1,每次输出一个星号,使用双重循环实现,思路:,2019/7/12,41,算法和程序:,#include “stdio.h“ void main( ) { int i,j; for (i=1; i=4; i++) { for (j=1; j=i; j++) printf(“ “); for (j=1;j=8-(2*i-1);j++) printf(“*“); printf(“\n“); } },延伸思考: 如何输出10行图形? 输出图形向右平移20个字符位置,应如何修改程序?,2019/7/12,42,作业,P 140页 6、8、11、17.,

展开阅读全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值