哈工大c语言教学6循环控制结构省公开课金奖全国赛课一等奖微课获奖课件_第1页
哈工大c语言教学6循环控制结构省公开课金奖全国赛课一等奖微课获奖课件_第2页
哈工大c语言教学6循环控制结构省公开课金奖全国赛课一等奖微课获奖课件_第3页
哈工大c语言教学6循环控制结构省公开课金奖全国赛课一等奖微课获奖课件_第4页
哈工大c语言教学6循环控制结构省公开课金奖全国赛课一等奖微课获奖课件_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章循环控制结构1/75本章学习内容

计数控制循环

条件控制循环

for语句,while语句,do-while语句

continue语句,break语句

嵌套循环

程序调试与排错2/75Example:怎样确定程序输入和输出呢?Drawaflowchartforthefollowingproblem:读入5个整数,计算并显示它们和.Input:

5个整数n1,n2,n3,n4,n5Output:

n1,n2,n3,n4,n5和Inputexample:2 3456Outputexample:20问题提出3/75Inputn1Inputn2Inputn3inputn4inputn5outputsumsum←n1+n2+n3+n4+n52n1Assumeinputexample:

234563n24n35n46n520sumend使用了6个不一样变量start问题提出读入1000个整数,计算并显示它们和.?4/756.1循环控制结构与循环语句怎样对循环进行控制呢?5/75counter←1,sum←0counter<6sum←sum+nfalsetruecounter++outputsuminput

n1countersum01<6 true2n0+2222<6 true32+3533<6 true45+4944<6 true59+51455<6 true614+62066<6 falsecounter-controlled

计数器每次增1使用了3个变量Assumeinputexample:

234566.2计数控制循环startend6/756.2计数控制循环counter←initialValuetestcounterStepnStepxfalsetrueUpdatecounter循环体(BodyofLoop)7/75当型循环——Conditionistested

first

计数控制——Loopiscontrolledbya

counterSyntaxfor

(initialvalue;condition;updatecounter) statement;Or

for(initialvalue;condition;updatecounter){ statement; statement; }for循环语句循环起始条件循环结束条件循环变量增值复合语句compoundstatement被看成一条语句对待循环变量控制循环次数,不要在循环体内改变这个变量值8/75i←0,sum←0i<5sum←sum+nfalsetruei++outputsuminputninti,sum,n;sum=0;for(i=0;i<5;i++){ scanf(“%d”,&n); sum=sum+n;}printf(“%d”,sum);for循环语句startend9/75A条件P直到型循环假真6.3条件控制循环A当型循环真假假条件P10/75

当型循环——Conditionistestedfirst

条件或计数控制——Loopiscontrolledbyconditionoracounter

语法

while(condition) statement;Or

while(condition){ statement; statement; }Nosemicolon!!while循环语句11/75直到型循环——Statementsintheloopareexecutedfirst(atleastonce),andconditionistestedlast条件或计数控制——

Loopiscontrolledbyconditionoracounter

语法do{ statement; statement;}while(condition);statement;Don’tforgetthesemicolon!!do-while循环语句12/75【例6.1】计算并输出1+2+3+…+n值循环次数已知,计数控制循环13/75循环次数已知,计数控制循环【例6.1】计算并输出1+2+3+…+n值sum=0作用?

14/75循环次数已知,计数控制循环【例6.1】计算并输出1+2+3+…+n值15/75循环条件第一次就为假(如输入-1)时会怎样?

【例6.1】计算并输出1+2+3……+n值16/75A当型循环真假假条件P假条件P

TestingConditionFirst【例6.1】计算并输出1+2+3+…+n值17/75条件P直到型循环A假真条件PA假Testingconditionlast

【例6.1】计算并输出1+2+3+…+n值18/75注意在for和while语句之后普通没有分号有分号表示循环体就是分号之前内容空语句——表示循环体内什么都不做while(i<100);

i++;死循环for(i=0;i<100;i++);

printf("%d",i);用于延时注意!19/75怎样降低循环次数?【例6.1】计算并输出1+2+3+…+n值20/75【例6.1】计算并输出1+2+3+…+n值21/75逗号运算符(CommaOperator)多数情况下,并不使用整个逗号表示式值,更常见情况是要分别得到各表示式值主要用在循环语句中,同时对多个变量赋初值等

for(i=1,j=100;i<j;i++,j--)表示式1,表示式2,…,表示式n循环起始条件循环变量增值循环结束条件22/75【例6.3】计算并输出

n!=1×2×3×…×n

23/75【例6.4】计算并输出

1!,2!,3!,…,n!

24/75若用户不慎输入了非法字符,那么先去除输入缓冲区中内容,然后提醒用户重新输入数据直到输入正确为止【例6.5】输入两个整型数,计算并输出两个整数最大值

scanf()返回值为正确读入数据项数去除输入缓冲区中错误数据

25/75循环次数未知,标识控制循环标识值(SentinelValue)【例6.2】输入数据,显示每次累加结果,直到输入0时为止

26/75循环次数未知,标识控制循环【例6.2】输入数据,显示每次累加结果,直到输入0时为止

27/75选择三种循环普通标准假如循环次数已知,计数控制循环用for假如循环次数未知,条件控制循环用while假如循环体最少要执行一次用do-while这只是“普通”标准,不是“标准”28/75转移控制语句——goto语句、break和continue语句break语句作用:循环体中使用break语句能够提前结束整个循环。Continue语句作用:循环体中使用continue语句能够提前结束此次循环。return语句标准库函数exit()6.5流程转移控制

29/75break语句和continue语句对for、while、do-while循环进行内部手术Break?退出一层循环或switchContinue?中止此次循环,开始下一次6.5流程转移控制

30/75n???10Pleaseentern:10↙n=10Pleaseentern:-10↙Programisover!【例6.14】演示break与continue

-10#include<stdio.h>main(){

inti,n;

for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n);

if(n<0)

break; printf("n=%d\n",n); } printf("Programisover!\n");}31/75n???10Pleaseentern:10↙n=10Pleaseentern:-10↙Pleaseentern:20↙n=20Pleaseentern:-20↙Pleaseentern:30↙n=30Programisover!【例6.14】演示break与continue

-1020-2030#include<stdio.h>main(){

inti,n;

for(i=1;i<=5;i++) { printf("Pleaseentern:"); scanf("%d",&n);

if(n<0)

continue; printf("n=%d\n",n); } printf("Programisover!\n");}32/75语句标号(Label)举例error:goto语句举例gotoerror;普通形式goto语句与语句标号33/75用if—goto组成循环结构形式:

语句标号:if(表示式){语句/语句组

goto语句标号;}kk:if(a>b){a=a-2;gotokk;}此结构组成是“当型”循环。

功效:无条件转去执行语句标号所指语句行。34/75Exit()

函数exit(0)作用是终止整个程序执行,强制返回操作系统

调用该函数需要嵌入头文件<stdlib.h>35/75【例6.9】输入n值,计算并输出1!+2!+3!+…+n!

利用前项计算后项36/75【例6.9】输入n值,计算并输出1!+2!+3!+…+n!

每次单独计算累加项37/75使用嵌套循环注意事项使用复合语句,以确保逻辑上正确性即用一对花括号将各层循环体语句括起来内层和外层循环控制变量不能同名,以免造成混乱采取右缩进格式书写,以确保层次清楚性

注意!38/75例:输出图形1.编程实现输出四行“*”号,每行输出5个“*”号main(){inti,j;for(i=1;i<=4;i++){ for(j=1;j<=5;j++) printf(“*”);printf(“\n”);}}********************39/752.怎样修改程序使其输出直角三角形?***************#include<stdio.h>main(){ inti,j,m; scanf("%d",&m); for(i=1;i<=m;i++) {

for(j=1;j<=i;j++) printf("*");printf("\n"); }}40/75#include<stdio.h>main(){ inti,j,k,m;scanf("%d",&m); for(i=1;i<m;i++) { for(k=1;k<=2*i-2;k++) printf(""); for(j=i;j<m;j++) printf(“*"); printf("\n"); }}3.怎样修改程序使其输出正三角形?***************41/75马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?

解方程组穷举法42/75方法1:穷举x,y,z全部组合#include<stdio.h>main(){

intx,y,z;

printf("Man\tWomen\tChildern\n");

for(x=0;x<=30;x++)

for(y=0;y<=30;y++)

for(z=0;z<=30;z++)

if(x+y+z==30&&3*x+2*y+z==50)

printf("%3d\t%5d\t%8d\n",x,y,z);}

43/75方法2:改进算法#include<stdio.h>

main(){

intx,y,z;

printf("Man\tWomen\tChildern\n");

for(x=0;x<=16;x++)

for(y=0;y<=25;y++){z=30–x-y;

if(3*x+2*y+z==50)

printf("%3d\t%5d\t%8d\n",x,y,z);}}

44/75水仙花数

打印出全部“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数字本身。比如:153=13+53+3345/75水仙花数解法1----程序#include<stdio.h>main(){intl1,l2,l3,l4;for(l1=1;l1<=9;l1++)for(l2=0;l2<=9;l2++)for(l3=0;l3<=9;l3++){l4=l1*100+l2*10+l3;if(l4==l1*l1*l1+l2*l2*l2+l3*l3*l3)printf("Daffodil’snumberis%d\n",l4);}}46/75

水仙花数程序实例(解法2)#include<stdio.h>main(){intl1,l2,l3,l4;for(l4=100;l4<=999;l4++){l1=l4/100;l2=(l4%100)/10;l3=I4%10;if(l4==l1*l1*l1+l2*l2*l2+l3*l3*l3)printf("Daffodil'snumberis%d\n",l4);}}47/75从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”;不然,输出“No!”问题分析:概念:素数是指除了能被1和它本身整除外,不能被其它任何整数整除数;判断素数方法:把m作为被除数,把i=2~(m-1)依次做为除数,若余数都不为0,则说明是素数。简单判断方法:只需用2~数去除m,即可得到正确判定结果。负数、

0和1不是素数。48/75#include<math.h>main(){

intm,i,k,flag=1;/*标志变量flag初值置为1*/

printf("Pleaseenteranumber:");

scanf("%d",&m);

if(x<=1)/*负数、0和1都不是素数*/{ printf("No!\n"); gotoEND;}for(i=2;i<=m-1&&flag;i++) {

if(m%i==0)

flag=0;

}

if(flag)

printf("Yes!\n");

else

printf("No!\n");

END:

printf("Programisover!\n");}采取设置标志变量方法49/75#include<math.h>main(){

intm,i,k,flag=1;/*标志变量flag初值置为1*/

printf("Pleaseenteranumber:");

scanf("%d",&m);

if(x<=1)/*负数、0和1都不是素数*/{flag=0;/*标志变量flag初值置为0*/}

k=sqrt(m);//

for(i=2;i<=k&&flag;i++) {

if(m%i==0)

flag=0;

}

if(flag)

printf("Yes!\n");

else

printf("No!\n");

printf("Programisover!\n");}采取设置标志变量方法50/75#include<math.h>main(){

intm,i,k;

printf("Pleaseenteranumber:");

scanf("%d",&m);

if(x<=1)/*负数、0和1都不是素数*/{printf("No!\n"); printf("Programisover!\n");return0;/*return方法*/} k=sqrt(m);//

for(i=2;i<=k;i++) {

if(m%i==0)

break;

}

if(i>k)

printf("Yes!\n");

else

printf("No!\n");

printf("Programisover!\n");}break方法51/75#include<math.h>#include<stdlib.h>main(){intm,i,k;

printf("Pleaseenteranumber:");

scanf("%d",&m);

if(x<=1)/*负数、0和1都不是素数*/{printf("No!\n"); printf(“Programisover!\n”);

exit(0);/*exit()方法*/} k=sqrt(m);

for(i=2;i<=k;i++) {

if(m%i==0)gotoMID;

}MID:

if(i>k)

printf("Yes!\n");

else

printf("No!\n");

printf("Programisover!\n");}goto方法52/75韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从1至5报数,最末一个士兵报数为1;按从1至6报数,最末一个士兵报数为5;按从1至7报数,最末一个士兵报数为4;最终再按从1至11报数,最末一个士兵报数为10。你知道韩信最少有多少兵吗?设兵数为x,则x应满足:x%5==1&&x%6==5&&x%7==4&&x%11==10穷举法,对x从1开始试验【例6.15】韩信点兵

53/75#include<stdio.h>main(){

intx;

for(x=1;x<5000;x++) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); } } }

【例6.15】韩信点兵

“瞎猫碰死耗子”54/75#include<stdio.h>main(){

intx;

for(x=1;;x++) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); } } }【例6.15】韩信点兵

“死循环”55/75#include<stdio.h>main(){

intx;

for(x=1;;x++) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

gotoEND;

} }END:;

}【例6.15】韩信点兵——goto

56/75#include<stdio.h>main(){

intx;

for(x=1;;x++) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

break;

} } }【例6.15】韩信点兵——break

57/75#include<stdio.h>#include<stdlib.h>main(){

intx;

for(x=1;;x++) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

exit(0);

} } }【例6.15】韩信点兵——break

标准库函数,作用是终止整个程序执行,强制返回操作系统

58/75#include<stdio.h>main(){

intx;

intfind=0;/*置找到标志为假*/

for(x=1;!find;x++) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

find=1;/*置找到标志为真*/

} } }【例6.15】韩信点兵——标志变量

结构清楚程序59/75#include<stdio.h>main(){

intx;

intfind=0;/*置找到标志为假*/

while(!find) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

find=1;/*置找到标志为真*/

} } }【例6.15】韩信点兵——while

“错在哪儿?”60/75#include<stdio.h>main(){

int

x=1;

intfind=0;/*置找到标志为假*/

while(!find) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

find=1;/*置找到标志为真*/x++; } } }【例6.15】韩信点兵——while

“错在哪儿?”61/75#include<stdio.h>main(){

int

x=1;

intfind=0;/*置找到标志为假*/

while(!find) {

if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);

find=1;/*置找到标志为真*/}

x++; } }【例6.15】韩信点兵——while

“你答对了吗?”62/75本章学习内容

计数控制循环

条件控制循环

for语句,while语句,do-while语句

continue语句,break语句

嵌套循环

程序调试与排错63/75循序渐进式编程

——例6.6:猜数游戏想一个1~100之间数猜对:right!猜错:wrong!并提醒大小64/75只猜1次直到猜对为止最多猜10次猜多个数10次猜不对就猜下一个数循序渐进式编程:猜数游戏

——例5.4,例6.6,例6.7,例6.1265/75猜数游戏用到库函数怎样模拟计算机“想”一个数呢?随机函数rand()产生[0,RAND_MAX]之间随机数magic=rand();#include<stdlib.h>#defineRAND_MAX0x7FFF

RAND_MAX在stdlib.h中定义,小于双字节整数最大值32767产生[0,b-1]之间随机数magic=rand()%b;产生[a,a+b-1]之间随机数magic=rand()%b+a;66/75#include<stdlib.h>#include<stdio.h>

main(){

intmagic;/*计算机"想"数*/

intguess;/*人猜数*/

magic=rand()%100+1;/*“想”一个[1,100]之间数magic*/ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);

if(guess>magic) {printf("Wrong!Toohigh!\n"); }

elseif(guess<magic) {printf("Wrong!Toolow!\n"); }

else

{ printf("Right!\n"); printf("Thenumberis:%d\n",magic); }}例5.4只猜1次67/75#include<stdlib.h>#include<stdio.h>main(){

intmagic;

intguess;

int

counter;/*统计人猜次数计数器变量*/ magic=rand()%100+1;

counter=0;/*计数器变量count初始化为0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess);

counter++;/*计数器变量count加1*/

if(guess>magic) printf("Wrong!Toohigh!\n");

elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while

(guess!=magic);

printf("counter=%d\n",counter);}直到猜对为止例6.668/75猜数游戏用到库函数每次运行程序时计算机所“想”数都是一样,这是什么原因呢?函数rand()产生只是伪随机数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生伪随机数“随机化”经过输入随机数种子,产生[0,100]之间随机数scanf("%u",&seed);srand(seed);magic=rand()%100+1;69/75#include<stdlib.h>#include<stdio.h>main(){

intmagic;

intguess;

int

counter;/*统计人猜次数计数器变量*/unsignedint

seed;

printf("Pleaseenterseed:"); scanf("%u",&seed); srand(seed); magic=rand()%100+1; counter=0;/*计数器变量count初始化为0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*计数器变量count加1*/

if(guess>magic) printf("Wrong!Toohigh!\n");

elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while

(guess!=magic); printf("counter=%d\n",counter);}直到猜对为止例6.670/75猜数游戏用到库函数使用计算机读取其时钟值并把该值自动设置为随机数种子,产生[0,100]之间随机数函数time()返回以秒计算当前时间值,该值被转换为无符号整数并用作随机数发生器种子

#include<time.h>srand(time(NULL));magic=rand()%100+1;函数time()能为程序员提供代表时间字符串,使用NULL作为函数参数,使其不具备此功效71/75#include<stdlib.h>#include<stdio.h>#include<time.h>main(){

intmagic;

intguess;

int

counter;/*统计人猜次数计数器变量*/

srand(time(NULL)); magic=rand()%100+1; counter=0;/*计数器变量count初始化为0*/

do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;/*计数器变量count加1*/

if(guess>magic) printf("Wrong!Toohigh!\n");

elseif(guess<magic) printf("Wrong!Toolow!\n");elseprintf("Right!\n");

}while

(guess!=magic); printf("counter=%d\n",counter);}直到猜对为止例6.672/75#include<stdlib.h>#include<stdio.h>#include<time.h>main(){

intmagic;

intguess;

int

counter;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论