第5章+循环控制+_第1页
第5章+循环控制+_第2页
第5章+循环控制+_第3页
第5章+循环控制+_第4页
第5章+循环控制+_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第5章循环控制

在很多实际问题中,经常需要计算若干个数的和。

例如:求1+2+3+4+5,这个问题对我们来说是非常简单的任务,如果编写程序让计算机来做也是比较简单的。#include<stdio.h>int

main(){

intsum; sum=1+2+3+4+5; printf(“sum=%d\n”,sum);

return0;}但如果要计算500个数或更多数的和,我们就无法写出一个表达式来计算500多个数的和,因此必须找到一个更好的方法来解决这个问题。#include<stdio.h>int

main(){

intsum; sum=0; //给变量sum赋初值0 sum=sum+1; //把1加到变量sum中,sum的值变为1 sum=sum+2; //把2加到变量sum中,sum的值变为3 sum=sum+3; //把3加到变量sum中,sum的值变为6 sum=sum+4; //把4加到变量sum中,sum的值变为10 sum=sum+5; //把5加到变量sum中,sum的值变为15 printf(“sum=%d\n”,sum);

return0;}sum=sum+i;i=i+1;主要内容5.1for语句5.2while语句5.3do语句5.4break和continue语句5.5循环的嵌套5.6典型算法5.1for语句for语句的一般格式:

for(init_expression;loop_expression;loop_increase)

statement;其中,init_expression,loop_expression,loop_increase是三个表达式,它们之间用分号分隔。statement是被重复执行的语句,称为循环体语句,如果循环体包含多个语句,则必须用大括号括起来构成复合语句。5.1for语句for语句的执行过程:5.1for语句例5.1计算1+2+3+…+500的和

#include<stdio.h>

intmain()

{

intsum=0,i;

for(i=1;i<=500;i++)

sum=sum+i;

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

return0;

}5.1for语句注1for语句中的三个表达式init_expression,loop_expression和loop_increase可以是任意类型的表达式。

如例5.1中,for语句可以改写为:

for(sum=0,i=1;i<=500;i++)其中第一个表达式是一个逗号表达式。注2for语句中的三个表达式init_expression,loop_expression和loop_increase中的任意一个均可省略,但分号不能省略。如果省略loop_expression的话,表示条件永真,也就是说是无限循环。5.1for语句例5.1可改写为:#include<stdio.h>intmain(){

intsum=0,i=1;

for(;i<=500;)

{ sum=sum+i;

i++;

} printf("sum=%d\n",sum);

return0;}5.1for语句例5.2从键盘输入一个正整数,输出其阶乘。#include<stdio.h>intmain(){

doublefac=1;

intn,i;printf("请输入一个正整数:");scanf("%d",&n);

for(i=1;i<=n;i++)fac=fac*i;printf("%d!=%.0lf\n",n,fac);

return0;}5.2while语句while语句的语法格式如下:

while(loop_expression)

statement;loop_expression是一个条件表达式,决定是否执行循环体,作用相当于for语句中的loop_expression。statement是循环体语句,如果循环体包含多个语句时,必须用复合语句。while语句的执行过程:init_expression;while(loop_expression){statement;loop_increase;}for语句控制的循环等价于下面用while语句控制的循环:5.2while语句5.2while语句例5.3用while语句实现例5.1

#include<stdio.h>

int

main()

{intsum=0,i;i=1;

while(i<=500)

{ sum=sum+i; i++;

}printf("sum=%d\n",sum);

return0;}5.2while语句例5.4计算两个非负整数的最大公约数。算法分析:两个整数的最大公约数是指两个整数共有约数中最大的一个。求最大公约数的算法有很多,如质因数分解法、短除法、辗转相除法和更相减损法。下面我们给出辗转相除法求最大公约数的基本步骤:先用小的一个数除大的一个数,得第一个余数;再用第一个余数除小的一个数,得第二个余数;又用第二个余数除第一个余数,得第三个余数;这样逐次用后一个数去除前一个余数,直到余数是0为止。那么,最后一个除数就是所求的最大公约数。5.2while语句源程序如下:#include<stdio.h>intmain(void){

int

m,n,u,v,remainder;printf("请输入两个非负整数:");scanf("%d%d",&m,&n);u=m,v=n;

while(v!=0)

{ remainder=u%v; u=v; v=remainder;

}printf("%d和%d的最大公约数是%d\n",m,n,u);

return

0;}if(m>=n){u=m;v=n;}else{u=n;v=m;}5.3do语句do语句的语法格式:

do

statement;

while(loop_expression);statement是循环体,如果循环体包含多个语句时,必须用复合语句loop_expression是条件表达式,决定是否循环。5.3do语句do语句的执行过程:statement;

while(loop_expression)statement;

DO语句控制的循环等价于下面用WHILE语句控制的循环:5.3do语句例5.5例5.4用do语句控制循环。#include<stdio.h>int

main(void){

intm,n,u,v,remainder;printf("请输入两个非负整数:");scanf("%d%d",&m,&n);u=m,v=n;

do

{ remainder=u%v; u=v; v=remainder;}while(v!=0);printf("%d和%d的最大公约数是%d\n",m,n,u);

return0;}例5.6输入一个整数,然后逆序输出其各位数字,如输入1234,输出4321。#include<stdio.h>intmain(void){

intnumber,right_digit;printf("输入一个整数:");scanf("%d",&number);

do{ right_digit=number%10; printf("%d",right_digit); number=number/10;}while(number!=0);printf("\n");

return0;}5.3do语句注1:从功能上看,当第一次进入循环时,条件表达式即为假,do语句与while语句的结果是不同的。也就是说,用do语句控制循环时循环体至少执行一次,而用while控制循环时,循环体有可能一次也不执行。注2:从语法上看,while后面的小括号外不能加分号,而do语句中,while后面的小括号外要加分号。5.3do语句5.4break和continue语句在执行循环语句时,有时需要提前退出或中止循环,C语言提供了break和continue两个语句,可以实现上述要求。5.4.1break语句语法格式:

break;break语句只能用于switch语句或循环语句中。在switch语句中的作用是退出switch语句。在循环体中的作用是中止循环。因此break语句必须与一个if语句一起使用,否则循环将无法实现。5.4.1break语句

5.4.1break语句#include<stdio.h>#include<math.h>intmain(){intm,i,isprime;printf("请输入一个正整数:");scanf("%d",&m);isprime=1;

for(i=2;i<=sqrt(m);i++)

if(m%i==0) { isprime=0;

break; }

if(isprime==1) printf("%d是一个素数\n",m);else printf("%d不是一个素数\n",m);}5.4.2continue语句语法格式:

continue;continue语句只能用于循环体中,它的作用是跳过循环体中continue后面的语句,直接进行下一轮循环的判断。它不能中止循环。continue语句使用的主要目的是为简化程序代码。5.5循环的嵌套

如果在一个循环体内还需要一个循环结构,我们称这种结构为循环的嵌套。例5.9输出200以内的所有素数。算法分析:在例5.7中,只是判断一个数是否是素数,现在要判断200以内的所有数是否是素数,我们用一个循环语句使m从2到200变化,然后把例5.7中判断m是否是素数的代码作为循环体即可。#include<stdio.h>#include<math.h>intmain(){

intm,i,isprime,k;

for(m=2;m<=200;m++){ k=sqrt(m);isprime=1;

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

if(m%i==0)

{ isprime=0;

break;

}

if(isprime==1) printf("%10d",m);}

return0;}5.5循环的嵌套5.6典型算法算法是程序设计的关键之一,是解题的方法与步骤。学习高级语言的重点,就是掌握分析问题、解决问题的方法,就是锻炼分析、分解,最终归纳整理出算法的能力。

所以在高级语言的学习中,一方面应熟练掌握该语言的语法,因为它是算法实现的基础,另一方面必须认识到算法的重要性,加强思维训练,以写出高质量的程序。5.6.1穷举法穷举法也叫枚举法或列举法。用计算机解决实际问题时,如果问题的解只有有限个,我们可以利用计算机的循环功能,在所有可能的解空间中进行搜索,找出符合条件的答案。例5.10中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?算法分析:设鸡翁、鸡母、鸡雏的个数分别为x,y,z,共100钱要买百鸡,由题意可得到下面的不定方程:

x+y+z=100 5x+3y+z/3=1005.6.1穷举法5.6.1穷举法#include<stdio.h>intmain(){

intx,y,z;

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

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

{ z=100-x-y;

if(15*x+9*y+z==300) printf("x=%d,y=%d,z=%d\n",x,y,z);

}

return0;}5.6.2迭代法迭代法也称辗转法,是一种从一个初始值开始,不断用变量的旧值递推出新值的过程。迭代法又分为精确迭代和近似迭代。迭代算法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。5.6.2迭代法

5.6.2迭代法#include<stdio.h>intmain(){intf1=1,f2=1,f3,i;printf("%10d%10d",f1,f2);for(i=3;i<=40;i++){ f3=f1+f2;

if(i%5==0)printf("%10d\n",f3);

elseprintf("%10d",f3); f1=f2; f2=f3;}return0;}

5.6.2迭代法

#include<stdio.h>#include

温馨提示

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

评论

0/150

提交评论