




免费预览已结束,剩余122页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
控制结构与语句,张建海 ,控制结构与语句,1 算法与程序 2 结构化程序设计 3 顺 序 结 构 4 选 择 结 构 5 循 环 结 构 6 多重循环结构 7 实际应用举例 小结,1 算法与程序,一、 算法的概念 算法+数据结构=程序 算法:进行操作的方法和操作步骤 二、 算法的特点 有穷性 确定性 输入和输出 三、算法的组成要素 操作:高级语言中提供的运算符 控制结构,对大部分程序来讲,都不外于3个大步骤: 输入 根据输入进行处理 输出处理结果,2 结构化程序设计,2.1 程序的三种基本结构 结构化程序设计 基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto) 结构化程序:由三种基本结构反复嵌套构成的程序叫 优点:结构清晰,易读,提高程序设计质量和效率 三种基本结构 顺序结构:由若干块组成,按各块的排列顺序依次执行。 选择结构:又称分支结构,根据给定的条件,从两条或者多条路径中选择下一步要执行的操作路径。 循环结构:根据一定的条件,重复执行给定的一组操作。,算法的描述 用自然语言表示 用流程图表示 传统流程图描述算法,处理框,起止框,判断框,输入输出框,连接点,流程线,a,b,顺序结构,条件,a,b,选择结构,y,n,条件,a,y,n,循环结构,例:求10000之内偶数之和,开始,0 sum ,1 t,t被2整除,sum+t sum,y,t+1 t,n,t10000,y,n,输出sum,结束,例:求ax2+bx+c=0 的根,开始,输入a,b,c,a为0,y,n,b2-4ac d,d0,n,y,n,解为-c/b,d为0,实根-b/2a,两不同实根,无解,结束,y,n,用n-s流程图描述算法 顺序结构:先执行a操作,再执行b操作 选择结构:根据条件,选择所要执行的语句 循环结构: 当型循环:先判别循环条件,再执行语句 直到型循环:先执行语句,再判别循环条件,当p为真,a,当p为真,a,例:求10000之内偶数之和,开始,0 sum ,1 t,t被2整除,sum+t sum,y,t+1 t,n,t10000,y,n,输出sum,结束,0 sum ,1 t,t10000,t被2整除,真,假,sum+t sum,t+1 t,输出sum,例:判别m是否素数,读入m,k=m的平方根,i=2,当i=k,m被i整除,真,假,用break 结束循环,i=i+1,ik,真,假,输出:m是素数,m不是素数,开始,m不是素数,k=m的平方根,i=2,ik,m被i整除,i=i+1,ik,y,n,y,n,y,n,m是素数,输入m,判别闰年,输入年份 y,y被4整除,y,n,输出y 非闰年,y被100整除,n,y,输出y 是闰年,y被400整除,y,n,输出y 是闰年,输出y 非闰年,用伪代码表示算法 例:求1000之内的完数(因子之和等于该数本身) 开始 置t的初值为1 当t1000,执行下面操作 置a的初值为1,置sum的初值为0 当at,执行下面操作 如果t能被a整除,则sum=sum+a a=a+1 (循环到此结束) 如果sum与t相同,输出t的因子 t=t+1 (循环到此结束) 结束,用计算机语言表示算法 例:求1000之内的完数(因子之和等于该数本身) main() int t,sum,a; for(t=1;t=1000;t+) a=1; sum=0; while(at) if(t%a=0)sum=sum+a; a=a+1; if(sum=t) printf(“%d 是完数,因子为:”); for(a=1;at;a+) if(t%a=0) printf(“%d,”); printf(“bn”); ,2.2 程序设计过程 程序设计的过程:分析问题、设计算法、实现程序。 自顶向下,逐步细化,模块化设计,结构化编程。 例:三数中取大数 (1)基本解题思路 s1:输入三数a,b,c s2:从a,b,c中找出最大数赋给max s3:输出max (2)算法细化 s1:调用scanf()函数 s2:设计一个函数max3()求三数中的最大数 s3:调用printf()函数 (3)设计主函数,main() float a,b,c,max; float max3(float,float,float); scanf(“%f%f%f”, (4)设计max3的算法 设3个参数为x,y,z s2.1:从x与y中取大数送m中 s2.2:从m与z中取大数送m中 s2.3:返回m给主调函数 用c语言写出max3,float max3(float x,float y,float z) float m; if(xy) m=x; else m=y; if(mz) m=z; return m; ,例:百钱买百鸡 (1)基本解题思路 cocks:公鸡数,hens:母鸡数,chicks:小鸡数 根据题意,有公式 cocks+ hens+ chicks=100 cocks*5+ hens*3+ chicks/3=100 得到三个变量的取值范围 cocks:119, hens:133, chicks:199 解题思路:依次取cocks值域中的一个值,然后求其余两数,合乎题意者为解。 s1: cocks=1 s2: 当cocks=19,则进行如下操作 s2.1:找满足题意的hens、 chicks,找到后输出 s2.2: cocks加1,(2)对s2.1细化 思路:在每个给定的cocks下,面对hens的取值范围内的各个值依次测试,以找出满足公式的hens 及chicks s2.1.1: hens =1 s2.1.2:当hens=33,则执行下列操作 s:找满足题意的chicks s: hens加1 (3)对s细化 因此时cocks及hens已确定,根据公式,可得出 chicks=100- cocks- hens,如此三数满足公式,则为解,将其打印出来 s.1 :chicks=100- cocks- hens s.2 :如果cocks*5+ hens*3+ chicks/3为100 输出cocks、 hens、 chicks,(4)c语言程序 #include main() int cocks,hens,chicks; cocks=1; printf(“ cockst hens t chicksn”); while(cocks=19) hens=1; while(hens=33) chicks=100-cocks-hens; if(cocks*5+hen*3+chicks/3=100) if(chicks%3=0) printf(“%dt%dt%dn”,cocks,hens,chicks); hens=hens+1; cocks=cocks+1; ,例 从键盘重输入100个整数,对其中的正整数和负整数分别进行累加,最后输出两种累加结果。 算法: 自然语言描述 (1)输入一个数; (2)如果该数0,将它加到正累加和中,否则将它加到负累加和中; (3)如果还没有输完100个数,转步骤(1); (4)输入完100个数后,输出累加和。,伪代码(类程序设计语言)描述 开始 置0 sp,0 sn 置1 count 当count=100,执行下面操作: 读入一个数 x if x 为正 使 sp+x sp else 使 sn+x sn 使 count+1 count 输出 sp 和 sn 的值 结束,重复100次,程序流程图:,n-s流程图:,用c语言程序实现:,#include void main() int x; int count; int sp,sn; count=sp=sn=0; do count+; scanf(“%d”, ,程序准备工作,工作变量定义,工作变量定义初始化,每输入一个数,记一下数,输入一个数,判断输入数0否,x0,累加到正累加和中,否则,累加到负累加和中,未输完100个数,则重复,输出结果,3 顺 序 结 构,c语句:以“;”作分隔符,编译后产生机器指令. 表达式语句:表达式加分号构成。 如 total=total+limit; a=3; func( ); printf(“hello,world!n”); 复合语句:用 括起来的一组语句 一般形式: 数据说明部分; 执行语句部分; 说明: “”后不加分号 语法上和单一语句相同 复合语句可嵌套,例 输入华氏温度,将其转换成摄氏温度输出。转换公式为: #include void main() float f,c; printf(“输入一个华氏温度n“); scanf(“%f“, ,例 计算如下多项式: y=5x3+4x2-3x+21 分析:为了便于程序的实现,把多项式改写为: y=(5x+4)x-3)x+21 #include void main() int x,y; scanf(“%d“, ,例 输入两个变量的值,交换它们的值。,#include main() int x,y,temp; scanf(“%d%d”, ,例 输入三角形的三个边长,计算并输出三角形的面积。 根据三条边的边长,计算三角形面积的公式如下: #include #include void main() float x,y,z,s,dime; scanf(“%f%f%f“, ,3 选择结构,if语句(条件选择语句) if语句的三种形式 形式一: 格式:if (表达式) 语句 执行过程:,例:if (xy) printf(“%d”,x);,形式二: 格式:if (表达式) 语句1 else 语句2 执行过程:,例:if (xy) max=x; else max=y;,形式三: 格式:,if ( 表达式1 ) 语句1 else if (表达式2 ) 语句2 else if (表达式3 ) 语句3 . else 语句n ,执行过程:,例:if (salary1000) index=0.4; else if (salary800) index=0.3; else if (salary600) index=0.2; else if (salary400) index=0.1; else index=0;,例 输入一个学生的成绩,根据成绩输出“pass”或“fail”。 #include void main() int score; printf(“请输入成绩n“); scanf(“%d“, ,程序运行: 请输入成绩 98 成绩 98: pass,例 输入被除数和除数x,y,计算x除以y的商。 #include void main() float x,y,z; printf(“please input x、y:n“); scanf(“%f%f“, ,例 编程,输入一个x值,求f(x)的值。 #include void main() float x,y; printf(“请输入数据n“); scanf(“%f“, ,例 输入三个数,按大小顺序输出 main() float a,b,c,t; scanf(“%f%f%f”, ,/*例d2*/ #include main() int x=4,y=5,i=1; if(x+=5) 5 5 1,程序运行: x=5,y=5,i=1,例d3 判断输入字符的种类,即区分英文字母、数字字符、空格、回车和其它字符。 #include void main() char c; printf(“please input a character:n”); c=getchar(); if(c= |c=n) printf(“this is a blank or enter.”); else if(c=0 ,程序运行: please input a character: 3 this is a digit.,如:if(a=b,说明: if后面的表达式类型任意,语句可以是复合语句 if(x) if(x!=0) if(!x) if(x=0),例 考虑下面程序的输出结果: #include main() int x,y; scanf(“%d,%d”, ,compile error!,if 结构的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套,注意:因else部分可选,要注意else与if的配对关系,从最内层开始,else与前面最接近的无else匹配的if 相匹配。,例 有一函数,编程序,输入x,输出y -1 (x0) 以下几个程序是否正确?,main() int x,y; scanf(“%d”, ,将if语句改为 if(x=0) if(x0) y=1; else y=0; else y=-1;,将if语句改为 y=-1; if(x!=0) if(x0) y=1; else y=0;,将if语句改为 y=0; if(x=0) if(x0) y=1; else y=-1;,例 编程,输入a、b,然后按值的大小次序从小到大输出。 #include void main() float a,b,temp; scanf(“%f%f“, ,例 根据输入的成绩,将其转换成“excellent”、“good”、“pass”、“fail”输出。转换规则:100-90:“excellent”;89-70:“good” 69-60:“pass”;59-0:“fail” #include void main() int score; printf(“please input score:n“); scanf(“%d“, ,程序运行: please input score:81 good,例 编程序,输入x,y计算下面的函数值。 #include void main() float x,y,z; printf(“please input x,y :n“); scanf(“%f%f“, ,例: #include main() int ok1=1,ok2=2,ok3=3,x=15; if(!ok1) x-; else if(ok2) if(ok3) x=3; else x=4; printf(“x=%dn”,x); ,程序运行: x=3,例 下列三个程序是否能够输出变量x、y、z中的最大值。,程序 #include void main() float x,y,z,max; scanf(“%f%f%f“, ,程序 #include void main() float x,y,z,max; scanf(“%f%f%f“, ,程序 #include void main() float x,y,z,max; scanf(“%f%f%f“, ,递缩格式不能决定if的嵌套问题,例 求一元二次方程 ax2+bx+c=0 的根,开始,输入a,b,c,a为0,y,n,b2-4ac d,d0,n,y,n,解为-c/b,d为0,实根-b/2a,两不同实根,虚根,结束,y,n,#include #include void main() float a,b,c,x1,x2,dalt; printf(“请输入方程系数a、b、cn“); scanf(“%f%f%f“, else /* else与if(a=0) 配对 */, dalt=b*b-4*a*c; if(dalt=0) printf(“x1=%fn“,(-b+sqrt(dalt)/(2*a); printf(“x2=%fn“,(-b-sqrt(dalt)/(2*a); else printf(“x1=%f%+fin“,-b/2/a,sqrt(-dalt)/(2*a); printf(“x2=%f%+fin“,-b/2/a,-sqrt(-dalt)/(2*a); ,程序运行: 请输入方程系数a、b、c 1 5 4 x1=1.0 x2=4.0,程序运行: 请输入方程系数a、b、c 1 4 5 x1=2.0+1.0i x2=2.01.0i,例判别闰年,输入年份 y,y被4整除,y,n,输出y 非闰年,y被100整除,n,y,输出y 是闰年,y被400整除,y,n,输出y 是闰年,输出y 非闰年,#include main() int y,leap; scanf(“%d”, ,例 考虑下面程序输出结果: #include main() int x=100,a=10,b=20; int v1=5,v2=0; if(ab) if(b!=15) if(!v1) x=1; else if(v2) x=10; x=-1; printf(“%d”,x); ,程序运行: -1,2.2 switch,switch为多分支选择语句,一般形式: switch( 表达式) case 常量表达式1: 语句组 1; break; case 常量表达式2: 语句组 2; break; . case 常量表达式n: 语句组 n; break; default: 语句组 n+1 ; break; ,执行过程:,说明: 常量表达式,指表达式中不含变量,且值必须互不相同 语句标号作用,必须用break跳出 case后可包含多个可执行语句,且不必加 switch可嵌套 多个case可共用一组执行语句,如: case a: case b: case c: printf(“score60n”); break; ,注意:switch中的case或default子句只相当于语句 标号,本身并不改变控制流程,满足前面条件的语 句被执行后,不离开switch语句,此后将不再与随 后的情况常量进行比较,而是按顺序执行随后的 各个语句,若要想在执行的中途离开switch语句, 可使用break或return语句,例 switch(score) case 5: printf(“very good!”); case 4: printf(“good!”); case 3: printf(“pass!”); case 2: printf(“fail!”); default : printf(“data error!”); ,运行结果:score为5时,输出: very good! good! pass! fail! data error!,例:求程序输出结果 main() int i=1; char c=b; switch(c+1-a) case 1:i+=1; case 2:i+=2; case 3:i+=3; default:i+=4; printf(“i=%dn“,i); ,程序运行: i=10,例 输入一个n,计算1+2+3+.+n的值,n6。如果n超过6,值7*n23。 #include void main() int n,y=0; printf(“请输入n:n“); scanf(“%d“, ,程序运行: 请输入n: 4 y=10,程序运行: 请输入n: 7 y=340,例 设计一个简易的计算器程序,可进行两个实数的+、*、/运算。如:8*5。 #include/exit(0)函数的头文件 #include void main() float a,b,d; char p; printf(“输入计算式:n“); scanf(“%f%c%f“, ,程序运行: 请输入计算式 7*4 =28.00,程序运行: 请输入计算式 7%4 the operator or the data is error,例成绩转换,也可用switch实现 4.12d1。 #include #include void main() float score; printf(“please input score:n“); scanf(“%f“, ,例 编程,输入年份、月份后,输出该年该月的天数。 #include main() int year,month,day; printf(“请输入年份、月份:n“); scanf(“%d%d“, ,/*例:求从1月1日到某月某日的天数*/ #include “stdio.h“ main() int year,month,day,d; printf(“enter year/month/day:“); scanf(“%d/%d/%d“, ,例: main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0:a+;break; case 1:b+;break; case 2: a+;b+;break; case 3:a+;b+; printf(“a=%d,b=%dn“,a,b); ,运行结果:a=2,b=1,例:运费计算 f=p*w*s*(1-d) f总运费,p每吨货物基本运费,w货物重量,s距离,d折扣率,标准如下: s250km 没有折扣 250s500km 2%折扣 500s1000km 5%折扣 1000s2000km 8%折扣 2000s3000km 10%折扣 s3000km 15%折扣,main() int c,s; float p,w,d,f; printf(“input p w s:”); scanf(“%f%f%d”, ,5 循环结构,概述 c语言可实现循环的语句: 用goto 和 if 构成循环 while 语句 do while 语句 for 语句 4.5.1 goto语句 goto语句一般格式:,goto 语句标号; . 标号:语句;,功能:无条件转移语句 说明: 不能用整数作标号 只能出现在goto所在函数内,且唯一 只能加在可执行语句前面 限制使用goto语句,/*例4.13*/ #include main() int i,sum=0; i=1; loop: if(i=100) sum+=i; i+; goto loop; printf(“%d“,sum); ,sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 sum=4950+100=5050,例 计算1+2+3+100的值。,5.2 while语句,一般形式:,while(表达式) 循环体语句;,执行流程:,特点:先判断表达式,后执行循环体 说明: 循环体有可能一次也不执行 循环体可为任意类型语句 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇break,return,goto 无限循环: while(1) 循环体;,例:循环的运用。 i=0; while(i3) printf(“%d “,i+);,执行过程,例:计算1+2+3+100的值。,/*例4.13d1*/ #include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d“,sum); ,例编程序,输入100个数,求它们的和并输出。 #include void main() float x,sum=0; int i=0; printf(“please input data:n“); while(i100) / while循环体是复合语句,必须用花括号括起 scanf(“%f“, ,例 使从终端输入的正整数各位都颠倒一下 #include main() int numb, right_digit; printf(“please input a number:n”); scanf(“%d”, ,程序运行: please input a number: 1234 4321,正整数各位都颠倒一下的循环过程,例 译密码.输入一行字符,输出其相应的密码(变成其后的第四个字母) #include main() char c; while(c=getchar()!=n) if(c=a ,例如 hello,world! 译成密码:lipps,asvph!,while结构使用说明: while结构是先判别、后执行的循环结构 数据输入可放入while语句中 例:while(scanf(“%d”, 后x与i 的值,结果x=0,i=-1,5.3 do-while语句,一般形式:,do 循环体语句; while(表达式);,执行流程:,特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 dowhile可转化成while结构,例:计算1+2+3+100的值。,/*例4.13 */ #include main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(“%d“,sum); ,用do-while语句同样可以完成例4.13中的程序4.13d3。 #include void main() float x,sum=0; int i=0; printf(“please input data:n“); do / do循环体是复合语句 scanf(“%f“, ,例 输入一个正整数,计算它是一个几位数。 #include #include void main() long x; int n=0; printf(“please input x:n“); scanf(“%ld“, ,程序运行: 2346543 x的位数是:7,程序运行: 0 x的位数是:1,对例,为了得到一个正确的x,修改程序如下4.15d1 #include void main() long x; int n=0; do printf(“please input x:n“); scanf(“%ld“, ,例 译密码.输入一行字符,输出其相应的密码(变成其后的第四个字母) #include main() char c; do c=getchar(); if(c=a ,例如 hello,world! 译成密码:lipps,asvph!,5.4 for 语句,一般形式:,for(表达式1 ;表达式2 ;表达式3) 循环体语句;,执行流程:,for语句一般应用形式:,for(循环变量赋初值;循环条件;循环变量增值) 循环体语句; ,说明: for语句中表达式1,表达式2 ,表达式3 类型任意,都可省略,但分号;不可省 无限循环: for(;) for语句可以转换成while结构,表达式1; while(表达式2) 循环体语句; 表达式3; ,用for循环完成例4.14的例子,“输入100个数,求它们的和并输出”,4.14d3。 #include void main() float x,sum=0; int i; printf(“please input x:n“); for(i=0; i100; i+) scanf(“%f“, ,for结构使用说明 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的表达式 例:for(sum=0,i=1;i=100;i+) 例:for(pro();t=readnum();pro() 表达式2一般是关系表达式或逻辑表达式,可以是其它类型的表达式,只要其值非0,就执行循环体 例:for(i=0;(c=getchar()!=n;i+=c) 条件检验总是在头部进行的,当开始时条件即为 假,则循环体可能一次也不执行 例:for(x=10;x10;-x) printf(%4d,x); 表达式1、表达式2、表达式3或循环体可以缺省,例:#include main( ) int i; for(i=0;i10;i+) putchar(a+i); ,运行结果: abcdefghij,例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); ,例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); ,例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; ,例输入一串以回车键结束的字符,累加这些字符的ascii码值,比较以下三种程序的结果。,#include main() int sum=0;char ch; while(ch=getchar()!=n) sum+=ch; printf(“%dn”,sum); ,#include main() int sum=0;char ch; do ch=getchar(); sum+=ch; while(ch!=n); printf(“%dn”,sum); ,#include main() int sum=0; char ch; for(;(ch=getchar()!=n;sum+=ch); printf(“%dn”,sum); ,例 输入10个数,输出其中的最大值。 #include void main() float x,max; int i; printf(“请输入第一个数:n“); scanf(“%f “, ,例4.16d3 从输入的若干正数中选出最小值。 分析:具体实现方法 (1)先输入数据个数n,然后陆续输入n个数据,用n来控制循环次数。 (2)以特殊数据来作为正常输入的结束,如本题可输入一个负数作结束标志。 以上两种方法相比较,方法(2)更具灵活性。,循环程序实现要点: (1)找出什么要反复执行 循环体 (2)重复到何时结束 循环控制条件,因循环次数未知,可考虑用while语句 #include main() float x,min; scanf(“%f”, ,循环前x必须先输入一个确定值,输入新数据,用do-while语句实现 #include main() float x,min; scanf(“%f”, ,用for语句实现 #include main() float x,min; scanf(“%f”, ,5.5 单重循环程序举例,例4.17 输入一串以回车键结束的字符,分别统计字母个数、数字字符个数和其他字符个数。 #include void main() char ch; int digit,others, alph; digit=others=alph=0; /计数器初始化 ch=getchar(); while(ch!=n) if (ch=0 ,例 编程,输入一个自然数,判断该数是否为素数,如果是素数,输出“yes”,否则输出“no”。 素数:是除1以外的只能被1或其自身整除的自然数。如2、3、5、7、11、13都是素数。即自然数n,如果n不能被2n1中的任何数整除,则n是素数。 #include void main() long n; int i, flag=1; printf(“please input n:n“); scanf(“%ld“, ,例 编程,按下面的幂级数展开式计算e的值。要求误差小于10-5。 e=1+1/1!+1/2!+1/3!+.+1/n!+.,#include void main() float t=1,e=1; int i=0; while(t=1e-5) i+; t*=1.0/i; e+=t; printf(“%fn“,e); ,例 用pi/4=1-1/3.+1/5.-1/7.+.公式求pi的近似值,直到最后一项的绝对值小于1e-6为止 #include “math.h” #include “stdio.h” main() int s; float n,t,pi; t=1;pi=0;n=1.0;s=1; while(fabs(t)=1e-6) pi=pi+t; n=n+2; s= -s; t=s/n; pi=pi*4; printf(pi=%10.6fn,pi); ,t=1,pi=0,n=1,s=1,当|t|=1e-6,pi=pi+t,n=n+2,s= -s,t=s/n,pi=pi*4,输出pi,初值,循环变化,循环维持条件,每项符号,*例 编程序,由序列 2x | x=1、 3y |y=1组成一个新序列2x,3y | x=1,y=1。要求按从小到大的排列次序输出新序列的前30项,按每行8个数输出(如:2,3,4,8,9,16,27,32 )。 #include void main() long m2,m3; int i=0; m2=2; m3=3; while(i30) if (m2=m3) printf(“%-8ld“,m2); m2*=2; /将m2修改为原序列的后续项 else printf(“%-8ld“,m3); m3*=3; /将m3修改为原序列的后续项 i+; if (i%8=0) putchar(n); ,5.6 break语句与continue语句,break语句的格式、功能 格式:break; break语句可以使流程跳出switch语句,也可以用来从循环体内跳出循环体,例: for(r=1;r100) break; printf(%f,area); ,语句s1 break; 语句s2,非0,表达式,0,while结构,语句s1 break; 语句s2,表达式,非0,0(假),do-while结构,求解表达式3,求解表达式1,表达式2,假,for语句的 下一语句,语句s1 break; 语句s2,真,for 结构,break 语句在循环语句中的执行流程,例 编程序,求1+2+3+n之和500的最小n及总和。 #include void main() int n,s=0; for(n=1 ; ; n+) /省略“表达式2”,即循环条件为永真 s+=n; if (s=500) break; /当s=500时,跳出循环。转循环后续语句 printf(“s=%d,n=%dn“, s,n); ,对例输入一个自然数,判断该数是否为素数。若在程序的循环体中使用break语句,可以减少循环执行次数4.18d1 #include #include void main() long n; int i; scanf(“%ld“, ,continue语句的格式、功能 一般形式: continue; 结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定,例4.22d1 把100200之间的不能被3整除的数输出 main() int n; for(n=100;n=200;n+) if(n%3=0) continue; printf(%d,n); ,语句s1 continue; 语句s2,非0,表达式,0,while结构,语句s1 continue; 语句s2,表达式,非0,0(假),do-while结构,求解表达式3,求解表达式1,表达式2,假,for语句的 下一语句,语句s1 continue; 语句s2,真,for 结构,continue 语句在循环语句中的执行流程,例 输入10个数,将这10个数中非0数相乘,计算其乘积,并统计非0数据个数。 #include void main() int i,n=0; float x,y=1; for(i=1; i=10; i+) scanf(“%f “, ,6 多重循环结构,一个循环体内又包含另一个完整的循环结构 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉,(1) while() while() . ,(2) do do while( ); . while( );,(3) while() do while( ); . ,(4) for( ; ;) do while(); while() . ,嵌套循环的执行流程 嵌套循环的跳转 禁止: 从外层跳入内层 跳入同层的另一循环 向上跳转,main() int i=0,j; while(i=5) j=0; while(j=i) printf(“*”); j+; i+; printf(“n”); ,main() int i=0,j; for(i=0;i=5;i+) for(j=0;j=i;j+) printf(“*”); printf(“n”); ,main() int i=0,j; do j=0; while(j=i) printf(“*”); j+; i+; printf(“n”); while(i=5); ,例:嵌套循环,程序运行: * * * * * *,程序执行情况,例g4-33x 打印九九表,/ /4.23d1 #include main() int i,j; for(i=1;i10;i+) printf(“%4d“,i); printf(“n-n“); for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?“%4dn“:“%4d“,i*j); ,for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?“%4dn“:“%4d“,i*j);,6.1 多重循环程序举例,例4.23 编程,每行10个,输出1500中所有的素数。 #include #include void main() int n, i, flag,count=0; for(n=2; n=500; n+) flag=1; for(i=2; i=sqrt(n); i+) if (n%i=0) flag=0; break; if (flag=1) /根据flag判断n是否素数 printf(“%5d“,n);/输出素数 count+;/统计输出素数个数 if (count%10=0) printf(“n”); /输出换行 ,for(n=2; n=500; n+) 判断n是否是素数 若n是素数,输出n ,例 百钱买百鸡问题。公鸡5元1只,母鸡3元1只,小鸡1元买3只,问100元钱买100只,有几种买法? 分析:这是组合问题,公鸡、母鸡、小鸡的取值范围均为0100,各种鸡的取值与其它鸡无关,对每一种鸡的取值要反复地试,将百钱买百鸡的组合取出来。,#include void main() int cock,hen,chick; for(cock=0;cock=100;cock+) for(hen=0;hen=100;hen+) for(chick=0;chick=100;chick+) if(cock*5+hen*3+chick/3=100 ,程序执行情况,上述程序是个三重循环,做了大量的无用功,因公鸡数不会超过20只,母鸡数不会超过33只;另外,确定了公鸡、母鸡的数目后,小鸡的只数应该是: 100-公鸡数-母鸡数,程序修改如下:,#include void main() int cock,hen,chick; for(cock=0;cock=20;cock+) for(hen=0;hen=33;hen+) chick=100-cock-hen; if(cock*5+hen*3+chick/3=100 ,程序执行情况,例 计算1!+2!+3!+10!。 #include void main() int i,n; float s=0,y;/阶乘值较大,所以用float 型 for(n=1; n=10; n+) y=1;/保证每次进入内循环累乘的初值从1开始 for(i=1; i=n; i+) /计算n! y*=i; /累乘 s+=y; /将y值即n!累加到s上 printf(“1!+2!+3!+10!=%e“,s); ,for(n=1; n=10; n+) 求出n! s+=n! ,例 编程序,输出n层用字符“*”构成的“*”符塔(n10)。下图是5层“*”符塔。 #include void main() int n,i,j; scanf(“%d“,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025公务员今日考试题及答案
- 2025大学金融工程面试题及答案
- 2025成考公务员面试题库及答案
- ZnGa₂O₄发光粉与薄膜材料的制备工艺及光电子能谱特性研究
- 2025年小升初必考试题及答案
- 2025年化验员通关题库及答案详解【典优】
- 2025戏曲曲艺知识竞赛题库及参考答案
- 2024年义务教育科学课程标准必考题库与答案
- 2025年政府采购评审专家考试试题及参考答案
- 2025年贵金属首饰与宝玉石检测员(珠宝鉴定与检测技师中级)考试试卷及答案
- 食品用纸包装容器等制品生产许可实施细则
- 质量保证体系和质量保证措施方案
- 2025年零碳园区规划设计方案-方案设计
- 光伏电站施工质量控制与安全措施
- 2025至2031年中国影视广告片行业投资前景及策略咨询研究报告
- 无人机应急处置预案
- 2025年北京市房屋买卖合同书
- 2025重庆双江航运发展有限公司招聘12人笔试历年参考题库附带答案详解
- 财务报销费用培训
- 2024年甘肃省卓尼县邮政公开招聘工作人员试题带答案详解
- 要素式民事起诉状(房屋租赁合同纠纷)
评论
0/150
提交评论