语言第五章循环结构程序设计_第1页
语言第五章循环结构程序设计_第2页
语言第五章循环结构程序设计_第3页
语言第五章循环结构程序设计_第4页
语言第五章循环结构程序设计_第5页
免费预览已结束,剩余34页可下载查看

下载本文档

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

文档简介

2问题1:

如何求取一个学生5门课的平均成绩?方法:用scanf函数输入5门课的成绩,然后计算.问题2:

如何求取50个学生5门课的平均成绩?方法1:

用50个scanf函数输入50个学生5门课的成绩,然后计算.方法2:用一个循环,循环体中只用一个scanf函数来输入50个学生的5门课成绩,然后计算.2020/11/15构成有效的循环,需指定两个关键点:循环体:即重复执行的操作循环结束条件:在何种情况下终止重复执行的操作3本章主要内容用while实现循环用do-while实现循环用for语句循环控制循环的嵌套循环结构中的跳转语句循环结构程序设计举例2020/11/1545.1

用while语句实现循环一般格式while

(表达式)语句一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式用来控制循环体是否执行,为循环条件。称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是循环重复执行的部分,即循环体2020/11/155功能:计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0

时结束循环,转去执行

while后面的语句。流程图N表达式非0?Y语句循环体2020/11/156例1

用while循环语句,求100个自然数的和即:sum=1+2+3+

…+100main(

){

int

i,sum;

i=1;

sum=0;while

(i<=100){

sum=sum+i;i++;}2020/11/15printf("sum=%d\n",sum);}程序输出结果:sum=50507注意:如果while语句的条件表达式值为0,则循环体一次也不执行(例如当i的初值=101)。在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。思考程序段的输出?i=1;sum=0;while

(i<=100){

i++;sum=sum+i;}运行后,输出:sum=5149原因是什么?2020/11/158注意(续):为了保证循环正常运行,应该特别注意:

循环控制条件的描述

循环变量的初始状态(初始值)

循环体

对控制条件的影响2020/11/159#include

<stdio.h>main(){ int

i=1;while(i<=10){

printf("%d*%d=%d\n",i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100例2

用while循环语句,显示1-10的平方。i=1i<=10输出i*ii=i+12020/11/15105.2

用do-while实现循环语句一般格式do

语句while

(表达式);功能:先执行内嵌语句(循环体),之后计算表达式的值,非0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为0结束循环,转去执行while下面的语句。2020/11/1511do-while循环的算法NY循环体表达式非0?void

main(

){

int

i=1,sum=0;do{

sum=sum+i;i++;}

while

(i<=100);printf("%d\n",sum);}例3用do-while语句求100个自然数的和流程图2020/11/1512while和do-while的比较:区别:do-while

语句先执行循环体再判断条件,循环体至少执行一次;while

语句先判断条件再执行循环体,循环体有可能一次也不执行Y循环体表达式非0?NNwhile和do-while都能实现循环控制,do

while结构程序通常都可以转换成while结构while流程图do while

结构表达式非0?Y语句2020/11/1513do-while语句的简单应用例4使用格里公式求π的近似值,要求精确到最后一项的绝对值小于10–4。

1

1

1

1

4

3

5

7分析:1.定义变量t为式中某一项的值,n为t的分母,s为t的符号,pi为右侧的累加和;各变量赋初值:

s=1,n=1,t=s/n=1,pi=0;循环条件:|t|<1e-4循环体:先将t加入pi,再改变s,n2020/11/151514程序如下:

#include<math.h>#include

<stdio.h>int

main(void){pi

=

0;int

n,

s;double

t,

pi;s

=

1;

n=

1;

t

=

1.0;do{t

=

s

*

1.0

/

n;pi

=

pi

+

t;s=-s;n=n

+2;}while(fabs

(item)

>=

1e-4)pi

=

pi

*

4;printf

(

“pi

=%f\n”,

pi);return

0;}155.3

用for语句实现循环语句一般格式for(表达式1;表达式2;表达式3)语句功能:–计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。循环变量赋初值循环控制条件循环体2020/11/1516for语句的算法N流程图计算表达式1语句计算表达式3表达式2为真?Y例如:main(

){

int

i,sum;sum=0;for

(

i=1;

i<=100;i++)sum=sum+i;printf("sum=%d\n",sum);}可部分或全部省略,但“;”不可省略2020/11/1517三种循环语句比较:for(表达式1;表达式2;表达式3)语句;等价于:表达式1;while

(表达式2){

语句while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于要赋初值或循环次数固定的情况2020/11/1518省略for语句的表达式<=>

while

(1)语句⑴

表达式1、2、3全省略,即:for(

;

;

)语句此时会造成无限循环(死循环)⑵

省略表达式1、3,

即:for(;

表达式2

;)

<=>

while(表达式2)语句

语句⑶

省略表达式2,即:for(表达式1;;表达式3)

<=>表达式1;语句while(1){语句;表达式3;}2020/11/15注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行19例:⑴

i=1;for

( ;

i<=100;

i++)

sum+=i;⑵

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

if(i>100)

break;sum+=i;}⑶

for

(i=1;i<=100;

){

sum+=i;i++;}break;⑷

i=1;for

(

;

;

){

if(i>100)sum+=i;i++;}2020/11/1520for语句的简单应用例5 求n!

,即计算p=1×2×3×…×n的值。设置:乘数i,初值为1,终值为n(n是循环控制终值,需要从键盘输入)累乘器p=1,每次循环令p=p*i2020/11/1521程序:main(

){

int

i,

n;long

p;p=1;

/*存放阶乘结果*/printf("Enter

n:");scanf("%d",&n);for

(i=1;

i<=n;

i++)p

=

p

*

i;printf("p

=

%ld

\n",p);}思考:如何输出1!, 2!,

…,n!?如何求s=1!+2!+…+n!?2020/11/1522读循环语句,写功能while(!x)x++;当x=0

时,执行循环体x++;只执行一次while((c=getchar())!='\n') n=n+1;/*n初始值为0*/n

为计数器,统计输入字符的个数,输入回车时停止计数。while(num++<=2);printf(“%d\n”,num);

/*num初始值为

1*/循环体是空语句,退出循环后输出num的值4for

(n=0;n<26;

n++)

printf("%c ",

n+'A');作用是输出26个大写字母for

(sum=0,

i=1;

i<=100;

sum=sum+i,

i+=2)

;作用是计算100以内的奇数和2020/11/15例6 从键盘输入一批学生的成绩,计算平均分,并求最高成绩。23#include

<stdio.h>void

main(void){ int

num=0; double

total=0,max,grade;printf(“Enter

grades:

\n");/*

输入第1个数,double型数输入格式%lf*/scanf(“%lf”,

&grade);max=grade;while

(grade

>=

0)/*

输入负数,循环结束*/{

total =

total

+

grade;num++;scanf

(“%lf”,

&grade);if(max<grade)max=grade;}if(num

!=

0)printf(“Average

is

%.2f\n, Max

is

%f\n",

total/num,max);elseprintf("

Average

is

0

and

Max

is

0\n");}245.4

循环结构中的跳转语句有如下两种语句实现跳转:continue语句break语句在循环语句的循环体中使用,可以进行循环的流程控制2020/11/1525后续语句…continue;…N表达式?Y后续语句…continue;…表达式?YN5.4.1

continue语句及应用后续语句计算表达式3continue;…表达式2?Y

…N功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。while语句

do-while语句

for语句计算表达式12020/11/1526例:从键盘输入10个非负数,并求和(输入负数时重新输入)。⑴

int

x,n=0,s=0;while

(n<10){scanf("%d",&x);if

(x<0)continue;s+=x;

n++;};⑵

int

x,n=0,s=0;do{

scanf("%d",&x);if

(x<0)continue;s+=x;

n++;}

while

(n<10);⑶

for

(n=0,s=0;

n<10;

n++){scanf("%d",&x);if

(x<0)continue;s+=x;}改正:将n++放入if语句之后2020/11/1527后续语句…break;…N表达式?Y后续语句…break;…表达式?YN5.4.2

循环中break的应用功能:利用break语句能够强迫终止本层循环,转到后续语句执行。while语句do-while语句后续语句计算表达式3计算表达式1break;…表达式2?Y

…Nfor语句2020/11/1528例:从键盘输入10个非负数,并求和(输入负数时停止输入)。⑴

int

x,n=0,s=0;while

(n<10){scanf("%d",&x);⑵

int

x,n=0,s=0;do{

scanf("%d",&x);if

(x<0)break;s+=x;

n++;}

while

(n<10);if

(x<0)break;s+=x;

n++;};⑶

for

(n=0,s=0;

n<10;

n++){

scanf("%d",&x);if

(x<0)

break;s+=x;}2020/11/1529main(

){

int

i,

j;5.5

循环的嵌套如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套例如:(输出9X9乘法表)#include

<stdio.h>外循环语句循环语句for

(

i=1;

i<10;

i++

)ffoorr

((

jj==11;;

jj<<==ii;;

jj++++

))外层循环循环体printf

((j==i)?"%4d\n":"%4d",i*j);}内层循环循环体2020/11/1530注意:三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程(1)

while(){

……while(){

……}…...}(2)

do{

……do{

……}while(

);…...}while(

);(3)

while(){

……do{

……}while(

);…….}(4)

for(

;

;){

……do{

……}while();……while(){

……}…...}内循环外循环内循环2020/11/152020/11/15315.6

循环结构程序设计举例例7

把100~200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。main(

){

int

n,j=0;for(n=100;n<=200;n++){

if(n%7==0){printf("%6d",n);j++;if(j%10==0)printf("\n");}}printf("\n

j=%d\n",j);}32例8 按每行输出5个数的形式输出Fibonacci数列的前20项。fn-1+fn-2(n>2)思路:Fibonacci数列的前几项是:1、1、2、3、5、8、13、21、34、…。此数列的变化规律是:1

(n=1)fn=

1

(n=2)设变量f1、f2

和f3,并为f1

和f2

赋初值1

,令f3=f1+f2得到第3项;将f1←f2,f2←f3,再求f3=f1+f2得到第4项;依此类推求第5项、第6项…2020/11/1533算法和程序#define

N

20main(

){

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");}}f1=1,f2=1并输出for

(i=3;

i<=20;

i++)f3=f2+f1f1=f2,f2=f3输出f3输出5个数T

F换行2020/11/1534例9判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。思路:素数是指只能被1和它本身整除的数,如5、7、11、17、…等。分别用2、3、…,m-1尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。2020/11/1535算法和程序:#include

"math.h"main(

){

intj,m,k;printf("Enter

an

integer

number:

");scanf("%d",&m);for(j=2;

j<=m-1;

j++)if

(m%j==0)

break;if

(j==m)printf("YES\n");elseprintf("NO\n");}2020/11/1536程序的优化对于穷举法来说,为了提高程序的效率,就要减少尝试次数。#include

"math.h"main(

){

int

j,m,k;printf("Enter

an

integer

number:

");scanf("%

温馨提示

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

评论

0/150

提交评论