语言教学相关第06讲循环结构_第1页
语言教学相关第06讲循环结构_第2页
语言教学相关第06讲循环结构_第3页
语言教学相关第06讲循环结构_第4页
语言教学相关第06讲循环结构_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

第06讲循环结构设计2计数器控制的循环计数器控制的循环循环体重复执行,直到计数器达到一个特定的值。确定循环,即循环体执行的次数是确定的。举例问题1个班有10个学生,参加了一次考试,成绩(0~100内的整数)已知。计算这次考试的班级平均成绩。分析与设计输入每个学生的成绩,统计总成绩,计算平均分,显示结果。可以通过把下面的操作重复执行10次来统计总成绩:

1.输入一个学生的成绩。2.立即进行累加。循环结构3计数器控制的循环结构化程序设计方法:自上而下,逐步求精算法的顶部(描述程序的整体功能)输入一次考试的成绩,并计算班级平均分划分成一系列较小的任务1.初始化(变量)2.输入考试的10个分数,求分数总和3.计算出班级平均分,并输出数据结构

输入变量:成绩score,总分total,计数变量counter

均为int型

输出变量:

平均成绩average;float型循环结构4计数器控制的循环进一步细化算法初始化输入考试的10个分数,求分数总和计算出班级平均分,并输出循环结构1.1设置总分(total)为0;1.2设置分数计数器(counter)为0;for(conter=0;counter<10;couter++){2.1输入一个分数(score);

2.2把该分数(score)加到总分(total)

;}3.1班级平均分(average)为总分除以10;3.2显示班级平均分;5计数器控制的循环源代码分析(cw0701.c)循环结构#include<stdio.h>void

main(){

intcounter,score,total;floataverage;total=0;

for(counter=0;counter<10;counter++){printf(“Inputscore:");

scanf("%d",&score);total=total+score;}average=total/10.0;

printf(“Classaverageis%f\n",average);}初始化(initialization)执行循环(executeloop)输入累加结束(termination)最后的计算输出结果6标记控制的循环举例问题:编写一个班级平均分计算程序,每次执行该程序,都能够处理任意数量的学生分数。思考:学生人数未知,何时结束输入?标记控制的循环使用标记(flag)标识“数据输入的结束”当用户输入标记值时,循环结束其他名称:信号值(signalvalue),哨兵(sentinel)标记值也是合法的输入,但不应与正常的用户输入混淆本例可以采用-1不确定的循环,即循环次数未知。事先无法确定标记出现的时刻循环结构7标记控制的循环算法设计算法的顶部输入一次考试的分数,并计算班级平均分细化初始化输入考试的分数,求分数总和,同时计数(统计分数个数)计算班级平均分,并输出循环结构8标记控制的循环进一步细化初始化输入考试的分数,求分数总和,同时计数(计算分数个数)循环结构设置总分(total)为0设置计数器(counter)(分数的个数)为0输入第一个分数(score)(可能是标记)While(输入的分数不是标记){把当前分数加到总分中计数器加1

输入下一个分数(可能是标记)}保证在判断之前读到分数9标记控制的循环进一步细化(续)计算并显示班级平均分循环结构被0除“致命”错误会导致程序“崩溃”If计数器不等于0

总分除以计数器的结果就是班级平均分显示班级平均分Else

显示“没有输入成绩”10标记控制的循环--while源代码分析(cw0702.c)循环结构#include<stdio.h>voidmain(){

floataverage;

intcounter,score,total;total=0;counter=0;printf(“Inputscore,-1toend:");scanf("%d",&score);while(score!=-1){

total+=score;counter++;

printf(“Inputscore,-1toend:");

scanf("%d",&score);}初始化处理结束判断11标记控制的循环---while源代码分析(续)循环结构

if(counter!=0){average=(float)total/counter;

printf("Classaverageis%.2f\n",average);}

else{printf("Noscoreswereinputed\n");}}Inputscore,-1toend:70Inputscore,-1toend:60Inputscore,-1toend:65Inputscore,-1toend:-1Classaverageis65.00结束Inputscore,-1toend:-1Noscoreswereinputed12标记控制的循环---do--while源代码分析(cw0702.c)循环结构#include<stdio.h>voidmain(){

floataverage;

intcounter,score,total;total=0;counter=0;do{printf(“Inputscore,-1toend:");

scanf("%d",&score);

if(score!=-1){

total+=score;counter++;}}while(score!=-1);初始化

处理结束判断13标记控制的循环---while(true)—if--break源代码分析(cw0702.c)循环结构#include<stdio.h>voidmain(){

floataverage;

intcounter,score,total;total=0;counter=0;while(true){printf(“Inputscore,-1toend:");

scanf("%d",&score);

if(score==-1)break;

total+=score;counter++;}

初始化

处理结束判断累加与累乘循环

用公式

的近似值,直到发现某一项的绝对值小于10-6

为止(该项不累计加)。每项的分子都是1后一项的分母是前一项的分母加2第1项的符号为正,从第2项起,每一项的符号与前一项的符号相反解题思路:15结构化程序设计方法:自上而下,逐步求精划分成一系列较小的任务1.0初始化:term=1;pi=0;n=1;sign=1;1.While(通项term>1e-6){2.1累加pi=pi+通项term;2.2通项变为下一项

2.2.1

更新步长n=n+2;

2.2.2

符号变号:sign=-sign;

2.2.3下一通项term=sign/n;}2计算Pi=pi*4;3输出pi数据结构

doublepi,n,term;intsign;循环结构累加与累乘循环sign=1,pi=0,n=1,term=1当term≥10-6pi=pi+termn=n+2sing=-signterm=sign/npi=pi*4输出pi累加与累乘循环数据结构

输入变量:求和Pi,(double)通项term(double)符号sign,(int)分母n,(double)

输出变量:

Pi,(double)#include<stdio.h>#include<math.h>voidmain(){

intsign=1;

doublepi=0,n=1,term=1;//初始化

while(fabs(term)>=1e-6)//判断条件

{pi=pi+term;//累计求和通项

n=n+2;//循环步长更新

sign=-sign;term=sign/n;//计算下一项

}pi=pi*4;printf("pi=%10.8f\n",pi);}不能少不能丢,否则无限循环累加与累乘循环

的近似值,直到发现某一项的绝对值小于10-6

为止(该项不累计加)。第1项的符号为正,从第2项起,每一项的符号与前一项的符号相反后一项是前一项的倍解题思路:19结构化程序设计方法:自上而下,逐步求精划分成一系列较小的任务1.输入数x2.0初始化:term=x;sinx=0;n=1;2.While(通项term>1e-6){2.1累加sinx=sinx+通项term;2.2通项变为下一项2.2.1下一通项term=term*(-x*x/ ((2*n)*(2*n+1)));

2.2.2

更新步长n=n+1;}3.输出x数据结构

doublesinx,x,term;intn;循环结构累加与累乘循环#include<stdio.h>#include<math.h>voidmain(){

doublesinx=0,n=1,term,x;//初始化

printf(“inputx:”);

Scanf(“%lf”,&x);term=x;

while(fabs(term)>=1e-6)//判断条件

{sinx=sinx+term;//累计求和通项

term=term*(-x*x/((2*n)*(2*n+1)));n=n+1;//循环步长更新

}printf(“sinx=%10.8f\n",sinx);}不能少不能丢,否则无限循环马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?

解方程组穷举法枚举与循环#include<stdio.h>voidmain(){

intx,y,z;

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

for(x=0;x<=30;x++)//穷举x可能的值

for(y=0;y<=30;y++)//穷举y可能的值

for(z=0;z<=30;z++)//穷举z可能的值

if(x+y+z==30&&3*x+2*y+z==50)//如果满足条件,则输出

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

}}}}}

方法1:穷举x,y,z的所有组合枚举与循环方法2:改进算法#include<stdio.h>

voidmain(){

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);}}}

枚举与循环韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从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开始试验韩信点兵

枚举与循环#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); } } }

“瞎猫碰死耗子”枚举与循环韩信点兵

#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); } } }“死循环”韩信点兵

枚举与循环#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:;

}韩信点兵

枚举与循环#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; //找到了跳出

} } }枚举与循环韩信点兵

#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;/*置找到标志为真*/

} } }韩信点兵——标志变量

结构清晰的程序枚举与循环—标志循环#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;/*置找到标志为真*/

} } }韩信点兵——while

“错在哪儿?”枚举与循环—标志循环#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++; } } }“错在哪儿?”韩信点兵——while

枚举与循环—标志循环#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++; } }“你答对了吗?”韩信点兵——while

枚举与循环—标志循环从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”;否则,输出“No!”问题分析:概念:素数是指除了能被1和它本身整除外,不能被其他任何整数整除的数;判断素数的方法:把m作为被除数,把i=2~(m-1)依次做为除数,若余数都不为0,则说明是素数。简单判断方法:只需用2~的数去除m,即可得到正确的判定结果。负数、

0和1不是素数。枚举与循环34结构化程序设计方法:自上而下,逐步求精划分成一系列较小的任务1.0输入数m2.for(i从2到sqrt(m),让x整除i){2.1if(x%i==0)//不是素

跳出循环;//跳出时i<=sqrt(m)}3.If(i>sqrt(m))

打印yes

否则打印no数据结构intx,i,k;循环结构枚举与循环#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方法如果break被执行了,则该数不是素数,那么i<=k36结构化程序设计方法:自上而下,逐步求精划分成一系列较小的任务1.0输入数m1.1置素数标志变量flag=1;2.for(i从2到sqrt(m),让x整除i){2.1if(x%i==0)//不是素

置素数标志变量flag为0;}3.If(素数标志变量为1)

打印yes

否则打印no数据结构intm,i,k,flag;循环结构枚举与循环#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");}采用设置标志变量的方法例4-22编一程序验证哥德巴赫猜想图4-24验证哥德巴赫猜想的N-S流程图

编程分析:设n为大于等于6的任一偶数,将其分解为n1和n2两个数,使用n1+n2=n,分别判断n1和n2是否为素数,若都是,则为一组解。若n1不是素数,就不必再检查n2是否素数。先从n1=3开始,直到n1=n/2为止。算法流程图如图4-24所示。枚举与循环39结构化程序设计方法:自上而下,逐步求精划分成一系列较小的任务

1.0输入数2.for(n1从3到n/2枚举){2.1if(n1是素数){n2=n–n1;if(n2是素数){

输出n;}}elsecontinue;

}}循环结构枚举与循环void

main(){

intn,n1,n2,j,k,flag2,flag2;printf("Enteranumbern=?\n");scanf("%d",&n);

for(n1=3;n1<=n/2;n1=n1+2){/*此处省略判断n1为素数的代码,具体见后页*/

if(flag1) {n2=n-n1;/*此处省略判断n2为素数的代码,具体见后页*/

if(flag2)printf("%d=%d+%d\n",n,n1,n2);}}}k=sqrt(n1);flag1=1;for(j=2;j<=k&&flag1;j++){

if(n1%j==0)flag1=0;}k=sqrt(n2);flag2=1;for(j=2;j<=k&&flag2;j++){if(n2%j==0)flag2=0;}循序渐进式编程

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

——猜数游戏用到的库函数怎样模拟计算机“想”一个数呢?随机函数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;#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); }}只猜1次#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);}直到猜对为止猜数游戏用到的库函数每次运行程序时计算机所“想”的数都是一样的,这是什么原因呢?函数rand()产生的只是伪随机数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”通过输入随机数种子,产生[0,100]之间的随机数scanf("%u",&seed);srand(seed);magic=rand()%100+1;#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);}直到猜对为止猜数游戏用到的库函数使用计算机读取其时钟值并把该值自动设置为随机数种子,产生[0,100]之间的随机数函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子

#include<time.h>srand(time(NULL));magic=rand()%100+1;函数time()能为程序员提供代表时间的字符串,使用NULL作为函数参数,使其不具备此功能#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);}直到猜对为止#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&&counter<10); printf("counter=%d\n",counter);}最多猜10次……do{ magic=rand()%100+1; counter=0;

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

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

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

else printf("Right!\n"); }while(guess!=magic&&counter<10);

printf("counter=%d\n",counter);

printf("Doyouwanttocontinue(Y/Nory/n)?"); scanf("%c",&reply);

}while((reply=='Y')||(reply=='y'));猜多个数10次猜不对就猜下一个数直到用户选择结束为止嵌套循环查询循环……do{ magic=rand()%100+1; counter=0;

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

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

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

else printf("Right!\n"); }while(guess!=magic&&counter<10);

printf("counter=%d\n",counter); printf("Doyouwanttocontinue(Y/Nory/n)?"); scanf("%c",&reply); }while((reply=='Y')||(reply=='y'));嵌套循环防止非法字符输入例4-23用迭代法求某个数的平方根。已知求平方根的迭代公式为:

编程分析:设平方根的解为x,可假定一个初值x0=a/2(估计值),根据迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1→x0,重新按原来的方法求x1,重复这一过程直到|x1-x0|<ε(某一给定的精度)。此时可将x1作为问题的解。循环与迭代55结构化程序设计方法:自上而下,逐步求精划分成一系列较小的任务

1.0输入一个正数数a2.if(a等于0)

x=0;else{x0的初始值赋值为a/2;

代入公式计算x1=0.5*(x0+a/x0)while(x1-x0的绝对值未达到精度要求){

将x1当作新的x0;

代入公式重新计算x1=0.5*(x0+a/x0)}x=x1;

}打印x循环结构循环与迭代#include<math.h>void

main(){

floatx,x0,x1,a;

do{

printf("Enteranumbera=?\n");

scanf("%f",&a);}while(a<0);if(fabs(a)<0.000001)x=0;

else{x0=a/2;/*取迭代初值*/x1=0.5*(x0+a/x0);

while(fabs(x1-x0)>0.00001)

温馨提示

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

评论

0/150

提交评论