版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章
循环结构C程序设计及工程案例分析XX大学:XX一千多年前的中国有一本数学古书《孙子算经》,书中有这样一道算术题:《孙子算经》“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”一个数除以3余2,除以5余3,除以7余2,求符合条件的最小数。韩信点兵汉高祖刘邦手下大将韩信才智过人,从不直接清点自己军队人数。一日,带1500名兵士打仗,战死约四五百人,需统计准确士兵人数。传令士兵站好队形,发令:“每三人站成一排”。将士报告:“最后一排只有二人。”;又传令:“每五人站成一排。”将士报告:“最后一排只有四人。”再传令:“每七人站成一排。”将士报告:“最后一排只有六人。”韩信用了一个巧妙的算法马上说出了答案:1049。计算机擅长做重复计算的工作包含了循环概念的任务:将这个曲子反复练习20遍在游泳池里游10个来回统计全班88个学生的总成绩和平均成绩检查67个学生的C语言成绩是否及格计算机最强大的功能之一就是高速进行重复的计算。C语言提供的最为常用的实现循环程序设计的三种语句是:for语句、while语句和do-while语句学习目标
理解循环结构程序设计的基本概念,知道在什么情况下需要使用循环语句。
熟练掌握常见的三种循环控制语句for、while和do-while的使用方法,理解循环的嵌套。
掌握两种循环的流程控制语句break和continue的使用方法。此处添加题目描述此处添加选项内容此处添加选项内容此处添加选项内容此处添加选项内容ABCD提交单选题1分此题未设置答案,请点击右侧设置按钮目录4.1基于计数的循环-for语句4.2基于条件的循环-while语句和do-while语句4.3跳出循环-break语句和continue语句4.4综合应用实例——记账本小程序4.5工程案例分析——汽车发动机判断失火程序基于计数的循环-for语句4.14.1.1for语句for语句的一般形式for(初始化表达式;循环条件;循环表达式)
循环体语句【例4.1】求1+2+3+4+……+100的和#include<stdio.h>intmain(void){ inti,sum=0;
for(i=1;i<=100;i++) sum+=i; printf("%d\n",sum); return0;}第1步:首先计算初始化表达式。这个表达式通常设置一个将在循环中使用变量,通常是循环变量,赋予某个初始值,如0或1。第2步:评估循环条件。如果条件不满足(表达式值为“假”),循环立即终止,并继续执行紧跟着循环语句之后的其它语句。第3步:如果条件满足,执行构成循环体的程序语句。第4步:循环表达式求值。这个表达式通常用于更改循环变量的值,如加1或减1。第5步:返回步骤2循环执行。一些典型的的循环N次的语句从0递增到n–1: for(i=0;i<n;i++)…从1递增到n: for(i=1;i<=n;i++)…从n–1递减到0: for(i=n-1;i>=0;i--)…从n递减到1: for(i=n;i>0;i--)…循环结构四要素循环变量初始化循环条件循环体循环变量的修改即循环开始之前的状态何时循环循环执行哪些工作怎么控制循环结束【例4.2】求区间[1,100]上的奇数和。#include<stdio.h>intmain(void){ inti,sum=0;
for(i=1;i<=100;i++) if(i%2!=0) sum+=i; printf("%d\n",sum); return0;}【例4.3】打印由星号组成的图形#include<stdio.h>intmain(void){ inti;
for(i=1;i<=5;i++){ printf("*************"); printf("\n"); } return0;}*****************************************************************for语句小括号后加分号;与不加分号;有何区别?作答主观题10分4.1.2双重for循环关键是设置两层for循环即嵌套的for循环,意思是一个for循环的循环体包含另一个for循环。外层for循环控制行的输出,内层for循环控制列的输出。外层和内层的for循环必须要使用不同的循环变量。【例4.4】打印由星号组成的不同图形程序4.4A打印由星号组成的直角三角形(图4.2(a))#include<stdio.h>intmain(void){ inti,j;
for(i=1;i<=5;i++){
for(j=1;j<=2*i-1;j++) printf("*"); printf("\n"); } return0;}表4.1双重循环变量i和j的关系-图4.2(a)双重循环控制的关键:寻找外层循环变量和内层循环变量的关系表4.2双重循环变量i和j、i和k的关系-图4.2(c)ij11…121…331…541…751…9ijk141233325417509程序4.4B打印由星号组成的三角形(图4.2(c))#include<stdio.h>intmain(void){ inti,j,k;
for(i=1;i<=5;i++){
for(j=1;j<=5-i;j++) printf("");
for(k=1;k<=2*i-1;k++) printf("*"); printf("\n"); } return0;}4.1.3for循环的变形for循环语句的变形是指可以省略部分表达式或全部表达式。如果省略初始化表达式,可以把初始化的工作放到for语句之前执行。也可以把其它的初始化工作放入for语句初始化表达式部分,两个表达式需要用逗号而不能用分号分隔。如果省略第三个表达式,可以将循环变量自增的运算放入循环体中。也可以将循环体放入第三个表达式。如果省略第二个表达式,就等价于循环条件永远为真,除非遇到了其它能跳出循环的语句,否则循环体将一直执行。关于for(表达式1;表达式2;表达式3){语句}循环控制语句的说法正确的是___。表达式1、表达式2、表达式3都可以是空语句表达式1和表达式3可以是空语句,表达式2不能为空语句必须预先设定循环次数表达式3为空语句时,将会陷入无限循环ABCD提交单选题10分基于条件的循环-while语句和do-while语句4.24.2.1while语句先计算表达式的值,如果表达式为真,则执行循环体语句然后再计算表达式的值,如果为真,继续循环;如果为假,则接着执行while循环语句之后的下一条语句。【例4.5】求n的阶乘n!#include<stdio.h>intmain(void){ intn,i,fact=1; scanf("%d",&n); i=1;
while(i<=n){ fact*=i; i++; } printf("fact=%d\n",fact); return0;}for语句的一般形式for(初始化表达式;循环条件;循环表达式)
循环体语句while语句的一般形式初始化表达式;while(循环条件){
循环体语句
循环表达式;}while语句与for语句的相互转化【例4.6】反转一个整数的各位数字#include<stdio.h>intmain(void){ intnumber,digit; scanf("%d",&number);
while(number!=0){ digit=number%10; printf("%d",digit); number=number/10; } printf("\n"); return0;}以下程序段描述正确的是(
)。intx=12;while(x)
x--;循环体执行1次循环体执行12次不执行循环体此死循环ABCD提交单选题10分设有程序段intm=20;while(m=0)m=m++;则下面描述中正确的是(
)。while循环执行10次循环是无限循环循环体语句一次也不执行循环体语句执行一次ABCD提交单选题10分4.2.2do-while语句while语句和for语句两者都是在循环前先判断循环条件是否成立再执行循环体。do-while语句是先进入循环体执行循环体语句,然后才计算循环表达式的值,如果为真,就继续执行循环体语句;如果为假,就跳出循环,接着执行do-while语句之后的语句。do-while语句的一般形式do{
循环体语句}while(循环表达式);【例4.7】用do-while语句改写反转整数各位数字的问题。#include<stdio.h>intmain(void){ intnumber,right_digit; printf("Enteryournumber:\n"); scanf("%i",&number);
do{ right_digit=number%10; printf("%i",right_digit); number=number/10; }while(number!=0); printf("\n"); return0;}关于do-while循环,以下说法中正确的是(
)。循环体语句只能有一条基本语句在while(循环条件)后面不能写分号当while后面循环条件的值为false时结束循环根据情况可以省略whileABCD提交单选题10分当执行以下程序段时x=-1;do{x=x*x;}while(!x);循环体将执行一次循环体将执行两次循环体将执行无限次系统将提示有语法错误ABCD提交单选题10分用while语句计算1+2+…+10的结果【例4.8】分别用while语句和do-while语句计算1+2+…+10的结果。用do-while语句计算1+2+…+10的结果#include<stdio.h>intmain(void){ inti,sum=0; scanf("%d",&i);
do{ sum+=i; i++; }while(i<=10); printf("sum=%d\n",sum); return0;}#include<stdio.h>intmain(void){ inti,sum=0; scanf("%d",&i);
while(i<=10){ sum+=i; i++; } printf("sum=%d\n",sum); return0;}while语句先判断再执行do-while语句先执行再判断对比while语句和do-while语句C语言中while和do-while循环的主要区别是()。do-while的循环体至少无条件执行一次while的循环控制条件比do-while的循环控制条件严格do-while允许从外部转到循环体内do-while的循环体不能是复合语句ABCD提交单选题10分下面有关for循环的正确描述是()。for循环只能用于循环次数确定的情况for循环先执行循环体语句,后判断循环条件在for循环中,不能用break语句跳出循环体for循环的循环体可以包含多条语句,但多条语句必须构成复合语句ABCD提交单选题10分4.2.3循环的嵌套当在一个循环语句中嵌入另一个循环语句时,成为循环的嵌套,最常使用的是双重嵌套。三种不同的循环语句for、while、do-while语句可以相互嵌套。数字组成的三角形双重循环应用示例数字宝塔九九乘法表【例4.9】找出所有三位数中的水仙花数。水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数。是指一个三位数,它的每个位上的数字的3次幂之和等于它本身。例如:13+53+33=153#include<stdio.h>intmain(void){ intn,i,t,sum; for(n=100;n<1000;n++) { i=n;sum=0;
while(i) { t=i%10; sum+=t*t*t; i=i/10; } if(n==sum) printf("%d\n",n); } return0;}【例4.10】
输出从1*1到12*10的乘法表12345678910246810121416182036912151821242730481216202428323640510152025303540455061218243036424854607142128354249566370816243240485664728091827364554637281901020304050607080901001122334455667788991101224364860728496108120#include<stdio.h>#defineCOLMAX10#defineROWMAX12intmain(void){ introw,column,y; row=1; printf("乘法表\n"); printf("------------------------------------------\n");
do{ column=1;
do{ y=row*column; printf("%4d",y); column=column+1; }while(column<=COLMAX); printf("\n"); row=row+1; }while(row<=ROWMAX); printf("------------------------------------------\n"); return0;}若i,j已定义为int类型,则以下程序段中内循环体的总的执行次数是?for(i=5;i;i--)for(j=0;j<4;j++){......}//内循环体25202430ABCD提交单选题10分下面关于C语言循环语句的叙述中,正确的是()。在循环嵌套中,如果外层循环是for循环,则内层循环只能使用for循环,不能使用while或do...while循环while循环的执行效率比do…while循环高三个循环语句for、while、do...while之间可以互相替代如果使用双重循环,且内循环有break语句,则执行break语句时,程序流程将跳转到外层循环体之外ABCD提交单选题10分跳出循环-break语句和continue语句4.34.3.1break语句可以用来跳出switch语句,实现只执行switch语句中某个分支的目的。也可以用来中途跳出for、while和do-while循环。break语句的一般形式:
break;【例4.11】输入一个正整数m,判断它是否为素数。素数也称为质数,即除了1和自身,不能被其它数整除的大于1的自然数。通过循环条件num%i==0来依次测试该数是否能被2到num-1之间的整数整除。只要遇到一次能整除的情况,就判定该数不是素数,既然已经得到判定结果,后续的循环判断已经没有必要,于是通过break语句即刻退出循环,接着执行while循环之后的语句。#include<stdio.h>intmain(void){ intnum,i; printf("请输入一个整数:"); scanf("%d",&num); i=2; while(i<=num-1){ if(num%i==0){ printf("这不是一个素数\n"); break; } i++; } if(i==num) printf("这是一个素数\n"); return0;}注意break语句只能往外跳出一层循环如果有循环嵌套的情况,需要注意break语句只能往外跳出一层循环。while(…){ for(;;){ … break; … }}break语句只能跳出for循环,不能跳出while循环。【例4.12】简单的猜数游戏程序随机生成一个1-100之间的数,玩家来猜这是一个什么数,每次玩家猜数后程序告知这个数是大了还是小了,最多可以猜7次。游戏允许可以猜多次,但只要猜到,循环就应该被终止了,因此可以用break来结束循环。折半查找也称为“二分查找”。它的基本思想是:从0-100之间的中间元素mid开始猜,如果中间元素正好是要查找的元素,则运气不错已经找到,猜数过程结束;如果程序告诉我们“Toobig”,意思是要到数较小的区域去查找,下一步就可以猜0到mid-1之间的一个数;如果程序告诉我们“Toosmall”,意思是要到数较大的区域去查找,下一步就可以猜mid+1到100之间的一个数。每猜一次数,我们都可以从剩余的数里面排除掉一半的数据,因此7次就猜到的概率是很大的。#include<stdlib.h>#include<time.h>intmain(void){intcount=0,flag=0,mynumber,yournumber;srand(time(0));mynumber=rand()%100+1;while(count<7){printf("Enteryournumber:");scanf("%d",&yournumber);count++;if(yournumber==mynumber){ printf("Youwin!\n"); flag=1;break;}elseif(yournumber>mynumber)printf("Toobig\n");elseprintf("Toosmall\n");}if(flag==0)printf("GameOver!\n");return0;}break的用途是(
)。终止函数执行终止程序执行终止包含它的循环过程或switch结构终止包含它的选择结构ABCD提交单选题10分4.3.2continue语句如果只是需要在某些情况发生或某种条件满足的时候马上结束本次循环,接着继续下一次循环,就使用continue语句。continue语句的一般形式continue;continue语句执行的效果continue语句一般与循环语句结合使用,例如while语句中出现了continue语句,如果循环条件满足,执行while循环体,当执行到continue时,就会跳出这一次while循环,接着再次判断循环条件而决定是否继续执行循环体。而程序这样执行的效果就是越过了continue语句后面的循环语句段2。while(…){
循环语句段1;continue;
循环语句段2;}【例4.13】输入一个整数n,输出两个不相等的1到n的数的所有组合。例如:输入3,输出12,13,21,23,31,32。程序的要求其实是在遇到相等的两个数的时候不输出。#include<stdio.h>intmain(void){ inti,j,n; scanf("%d",&n); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i==j)
continue; printf("%d%d\n",i,j); } } return0;}【例4.14】输入10个非零的数,计算它们的和。如果输入值为0,则重新输入。#include<stdio.h>intmain(void){intn,sum,i; n=0; sum=0; while(n<10){ scanf("%d",&i); if(i==0)
continue; sum+=i; n++; /*continue语句跳到这里*/ } printf("sum=%d\n",sum);return0;}#include<stdio.h>intmain(void){intn,sum,i; n=0; sum=0; while(n<10){ scanf("%d",&i); if(i!=0){ sum+=i; n++; } } printf("sum=%d\n",sum);return0;}continue语句的作用是(
)。空操作引发异常处理退出循环结束本次循环ABCD提交单选题10分4.3.3break和continue的区别break语句用来跳出整个循环使循环终止,而continue语句用来跳出本次循环,接着继续下一次的循环。(a)break语句直接跳出循环
(b)continue语句跳出本次循环继续下一次循环【例4.15】输入一批考试分数,用-1作为结束标志,若输入大于100,则提示重新输入。然后计算最高分、最低分和平均值。#include<stdio.h>voidmain(void){intmark,n=0,sum=0,max=0,min=100;floataverage; for(;;){scanf("%d",&mark);if(mark>100){printf("分数不能大于100分,请重新输入:\n");continue;//结束本次循环,返回for循环}
if(mark==-1) break;//终止整个循环,跳出循环体n++;sum=sum+mark;if(mark>max)max=mark;if(mark<min)min=mark;} average=(float)sum/n;printf("最高分=%d,最低分=%d,平均分=%f\n",max,min,average);return0;}综合应用实例——记账本小程序4.4记账本小程序实现一个有交互功能的记账本小程序了,支持用户管理个人的财务信息,可以记录收入、支出信息,可以查询余额。每输入一个操作请求,就执行相应操作,直到用户选择退出为止。程序的核心部分是循环:for(;;){提示用户输入操作请求;接受用户的操作请求;switch(操作请求){ case操作编号:执行操作;break; case操作编号:执行操作;break;……case操作编号:执行操作;break;default:打印提示信息;break;}}程序4.16记账本小程序#include<stdio.h>intmain(void){intcmd;floatbalance=0.0f,credit,debit;printf("***************记账本小程序***************\n");printf("操作:0=清零,1=收入,2=支出,");printf("3=余额,4=退出\n\n");for(;;){printf("选择操作:");scanf("%d",&cmd);switch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国投资银行业务托管托管托管托管托管托管托管代理行业市场深度调研及投资前景与投资策略研究报告
- 2026中国智能家居前装市场渠道变革与全屋解决方案竞争格局
- 2026汽车零部件行业竞争格局分析及投资前景深度展望
- 2026中国玩具制造行业市场现状供需分析及产业评估规划发展方向研究报告
- 2026中职口腔面试题及答案
- 2026年中小学安全教育日专题课件(知识竞赛版)
- 2026年医德医风先进典型事迹宣讲课件
- 2026年造价工程师考试《土建》科目重点难点试卷
- 2026年城市规划类公务员《城乡规划法规》专项训练试卷
- 2026年事业单位《机械设计》考试冲刺押题试卷(附答案)
- 世界历史九年级上册新教材分析(2026新版) 课件
- 2026年智能网联汽车行业深度分析报告
- 2025年中石油(中国石油)校园招聘统一考试真题试卷(含答案解析)
- (2026年)手术患者转运交接课件
- 医疗器械使用安全评估制度
- (2025年)事业单位遴选考试真题及答案
- 孕产期抑郁症的识别与处理
- 2026中国铁路南宁局招聘笔试考生回忆版真题及官方参考答案
- 2026年国电南瑞行测笔试题库
- 高考政治时政热点与课本知识链接
- 房地产成本奖惩制度
评论
0/150
提交评论