版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 循环结构的程序设计,本 章 要 点,循环语句 break 和 continue 语句 循环嵌套,转移语句,转移语句的作用 改变程序的运行流程。 C语言转移语句 break continue goto,break语句,格式 break; break语句的功能 1.在switch语句中结束case子句,使控制转到switch语句之外。 2.在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。,结束循环 while(exp) 语句1 if (expb) break; 语句2 ,break语句的执行流程,while语句,for语句,do-while语句,例 判断
2、m是否素数,#include #include main() int m,i,k; scanf(%d, ,结束循环,即转到for循环的下一个语句,通常作为if的内嵌语句,break语句使用注意: 1、在嵌套循环中,break语句仅能退出一层(当前)循环。 2、若在循环语句中包含了switch语句,那么switch语句中的 break 语句仅能使控制退出switch语句。 3、break 语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。,break 与循环 for ( ) . while( ) . break; . . ,例:求555555的约数中最大的三位数是多少? main(
3、 ) int j; long n; printf(Please input number:); scanf(%ld, /* 控制退出循环 */ ,例 在3位数中找一个满足下列要求的正整数n:其各位数字的立方和恰好等于它本身,例如:371=33+73+13,int main() int n,i,j,k; for(n=100;n1000;n+) i=n/100; j=n/10%10; k=n%10; if(n=i*i*i+j*j*j+k*k*k) printf(%d=%d*%d*%d+%d*%d*%d+%d*%d*%dn,n,i,i,i,j,j,j,k,k,k); break; return 0;
4、 ,continue语句格式 continue; continue语句的功能 continue语句仅能在循环语句中使用. 它的作用不是结束循环,而是开始一次新的循环。 对于for语句,将控制转到执行表达式3和循环控制条件部分; 对于while和do-while语句,将控制转到循环控制条件部分;,跳过continue后面的语句,继续下一次循环 while(exp) 语句1 if (expc) continue; 语句2 ,continue语句,continue语句的执行流程,例:输入10个整数,求其中正数的个数及平均 值,精确到小数点后两位。 main ( ) int i, count=0, j
5、, sum=0; for ( i=1; i=10; i+) printf (Input integer:); scanf (%d, ,break 和 continue,#include stdio.h void main( ) char c; int i=0; for (i=0; i10;i+) c=getchar(); if (c=n) break; putchar(c); ,#include stdio.h void main( ) char c; int i=0; for (i=0; i10;i+) c=getchar(); if (c=n) continue; putchar(c);
6、,输入:abc efgh 123 ,输出:abcefgh1,输出:abc,goto语句格式 goto 标号; goto语句的功能 1、将控制转移到标号所指定的语句处继续执行。 2、标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数。 goto语句的使用说明 在C语言中,goto 语句并不是必不可少的,使用 goto 语句的地方都可以用C的其它控制流程语句改写。,见书P81,结构化程序设计方法主张限制使用goto语句,因为goto语句将使程序流程变得混乱,降低程序的可读性。 一般来说,goto语句可以有两种用途: 1 与if语句一起构成循环结构 2 从循环体内跳转到循环体外
7、。虽然C语言提供的break和continue也具有同样的功能,但是它们只能跳出一层循环,而使用goto语句则可以跳转出多重循环。,循环嵌套,循环嵌套 在一个循环体中,又包含有另一个完整循环语句,构成循环嵌套。,while (表达式) 语句;,do 语句 while ( 表达式 ) ;,for (表达式1;表达式2;表达式3) 语句;,内嵌的循环中又可以嵌套循环,从而构成多重循环,三种循环可以互相嵌套,循环嵌套均是大循环嵌小循环 绝对不允许循环体交叉! for ( ) . do . while(.),for ( ) . do while( ) ,外循环,内循环,交叉循环,外循环 入口,内循环出
8、口,内循环出口,外循环出口,外循环出口,内循环入口,嵌套的循环控制变量不能相同,内循环变化快,外循环变化慢,如:for (i=1;i=9;i+) for (j=1;j10;j+) printf(“%d*%d=%d”,i,j,i*j); printf(“n”); ,正确确定循环体,例 循环嵌套,输出九九表,#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+) fo
9、r(j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j);,例:输出下三角形乘法九九表。 1 2 3 4 5 6 7 8 9 - 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 假设:行号为i ,列号为j,i=6 j=5 i*j,(1=i=9),(1=j=i),则:第 i 行中一共要输出 i 个乘积,#include main ( ) int i=1, j; /* i:行计数器
10、j:列计数器 */ while ( i = 9 ) /* 控制打印表头 */ printf ( %4d, i+ ); printf (n-n); i=1; while ( i= 9 ) j = 1; /* 列计数器置1 */ while ( j = i ) /* 嵌套的二重循环。输出第i行 */ printf (%4d, i*j ); j +; /* 列计数器+1 */ printf (n); /* 一行输出结束后,输出n */ i +; /* 行计数器+1 */ ,外层循环体执行1次,内层循环要完整执行1次,内循环终值与外循环变量有关,例 求1+2+3+4+ n,算法: i =1 to n
11、s=s+t t+ i+,程序段: s=0; for(i=1; i=n; i+) s=s+i;,算法: i =1 to n s=s+i i+,例T1-2 求1+1/2+1/3+ 1/n,算法: i =1 to n s=s+t t=1.0/i i+,程序段: s=0; for(i=1; i=n; i+) s=s+1.0/i;,算法: i =1 to n s=s+t t+ i+,例 求1-1/2+1/3-1/4+ 1/n,i =1 to n s=s+t t=1.0/i i+,程序段: s=0; flag=1; for(i=1; i=n; i+) s=s+1.0/i*flag; flag=-flag;
12、 ,算法: i =1 to n t=1.0/i*flag s=s+t flag=-flag i+,例 求1-1/3+1/5- 前n项和,算法: i =1 to n s=s+t t=1.0/i*flag flag=-flag i+,程序段: s=0;flag=1;tt=1; for(i=1; i=n; i+) s=s+1.0/tt*flag; tt+=2; flag=-flag; ,算法: i =1 to n t=1.0/tt*flag s=s+t flag=-flag tt=tt+2 i+,例 求1-1/3+1/5-直到最后1项的绝对值10-5,程序段: s=0; flag=1; tt=1;
13、t=1; while(fabs(t) = 1E-5) s = s+t; flag = -flag; tt += 2; t = 1.0/tt*flag; ,i =1 to n s=s+t t=1.0/tt*flag flag=-flag tt=tt+2 i+,算法: while |t|=1E-5 s=s+t flag=-flag tt=tt+2 t=1.0/tt*flag,例 求n!,算法: i =1 to n f=f*t t+ i+,程序段: f=1; for(i=1; i=n; i+) f=f*i;,算法: i =1 to n f=f*i i+,例 1!+2!+n!,s=0; for(k=1
14、; k=n; k+) s=s+f; ,f=1; /* n! */ for(i=1; i=n; i+) f=f*i;,f=1; for(i=1; i=k; i+) f=f*i;,算法: k=1 to n s = s + f f = k! k+,例 输出Fibonacci序列前20个数,1, 1, 2, 3, 5, 8, x1 x2 t x1 x2 t,程序段: x1=x2=1; printf(%d %d, x1, x2); for(i=1; i=18; i+) t=x1+x2; printf(%d , t); x1=x2; x2=t; ,x1=x2=1; t=x1+x2; x1=x2; x2=t
15、;,例1:在一行中输出 m 个 * 号。 要求:从键盘输入m值,输出一行 m 个*号。 例:输入 m=4,输出的图形如下: * * * *,基本语句: 输出一个 * 号:ptintf(”*”); 基本算法: 1.输入 m , 2.重复输出 m 个 *;,scanf (”%d”, ,#include main ( ) int m; scanf (”%d”, ,#include main ( ) int m; scanf (”%d”, ,C语言中的一行都是以 n 为标志的,例2:输出边长为 m 的正方型 要求:从键盘输入 m 值,输出 m 行每行 m 个*号。 例:输入 m=4,输出的图形如下:
16、* * * * * * * * * * * * * * * * 算法分析与设计: 1. 输入 m , 2. 重复输出 m 行,每行输出 m 个 *; 加细1: 1. 输入 m ; 2. for ( k=1; k=m; k+) 输出一行中的 m 个 * ;,加细2: 1. 输入m; 2. for ( k=1; k=m; k+) 输出 m 个 * ; 换新行; 加细3: 1.输入m; 2. for ( k=1; k=m; k+) for ( j=1; j=m; j+ ) printf (”*”); printf(”n”) ; ,整理,得到程序如下: #include main ( ) int k,
17、 m, j; scanf ( ”%d”, j+ ) /* 输出一行中的m个*号 */ printf (”*”); printf(”n”); 分析方法逐步求精法 对于比较复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出完整程序。,例3:输出边长为 m 的菱型 例:输入 m=4,输出的图形如下: * * * * * * * * * * * * * * * *,算法分析与设计: 在正方型每行 * 号的前面先多输出若干个空格。 对于第 k 行,0km,则应先输出 个空格。,* * * * * * * * * * * * * * * *,m-k,输出正方型
18、程序: #include main ( ) int k, m, j; scanf ( ”%d”, j+ ) /* 输出一行中的m个*号 */ printf (”*”); printf(”n”); ,for ( i=1; i=m-k; i+) printf (” ”);,int i;,输出菱型程序: #include main ( ) int k, m, j, i; scanf ( ”%d”, j+ ) /* 输出一行中的m个*号 */ printf (”*”); printf(”n”); ,例3:从键盘输入h值,输出h行用*号组成等腰三角形。例:输入 h=4,输出的图形如下: * * * *
19、* * * * * * * * * * * *,1 * 2 * * * 3 * * * * * 4 * * * * * * *,要输出 个 空格 和 个 *,分析: 1、按行输出。输出 h 行。 2、程序的关键是:找出每一行中要输出 空格 的数量和 * 的数量 3、对于图形中的第 k 行(1=k=h):,h-k,2k-1,分析: 要输出 h-k 个 空格 和 2k-1 个 * 算法设计 1.输入 h; 2.重复打印h行。对于第 k 行,每行 h-k 个空格和 2k-1 个* 对第2步进行加细: 2.0 for ( k=1; k=h; k+ ) /* h行 */ 重复打印 h-k 个空格; 重复
20、打印 2k-1 个 *; 换行; ,程序: #include main ( ) int h, k, j; scanf (”%d”, ,例4:从键盘输入 h 值,输出用 * 号组成的正菱形。例:输入 h=4 ,输出的图形如下: * * * * * * * * * * * * * * * * * * * * * * * * *,分析: 1. h为上三角形的高度,总行数为 。 2. 对于第 j 行,若要输出 m 个空格和 n 个*号。 3. 当 j=h 时,为上三角,则:m= , n= 4. 当 时,为下三角,则: m = n =,1 2 3 4 5 6 7,空格数量 3 *号数量 1 2 3 1
21、5 0 7 1 5 2 3 3 1,2h-1 h-j 2j-1 hj=2h-1 j-h 总宽度 - 空格 = 2h-1 - 2(j-h) = 4h-1-2j,算法设计 for (j=1; j=2*h-1; j+) 控制打印行 若 为上三角 j=h 则: m = h-j; n = 2j-1 否则:m = j-h; n = 4h-1-2j 重复打印 m 个 空格 重复打印 n 个 *; 换行; 加细循环体 if ( j=h ) m=h-j; n=2*j-1; else m=j-h; n=4*h-1-2*j; for ( k=1; k=m; k+ ) printf ( ); for ( k=1; k=n; k+ ) printf (*); printf(n); ,程序: #include main ( ) int h, k, j, m, n ; printf (Enter H:); scanf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 飞机搜救知识培训课件
- 农村开园活动策划方案(3篇)
- 庆阳美食活动策划方案(3篇)
- 2026广东佛山顺德区杏坛镇林文恩中学招聘临聘教师4人备考考试题库及答案解析
- 2026年上半年黑龙江事业单位联考省卫生健康委员会招聘125人备考考试试题及答案解析
- 飞机介绍科普
- 2026广西北海市银海区福成镇人民政府招录公益性岗位人员12人参考考试题库及答案解析
- 2026湖北武汉大型电池制造型企业招聘备考考试题库及答案解析
- 2026年福建莆田市城厢区霞林学校小学部自主招聘编外教师2人备考考试题库及答案解析
- 2026山东菏泽国花中等职业学校机电学科教师招聘备考考试试题及答案解析
- 2025年度住院部病区护理部主任述职报告
- 2026新疆阿合奇县公益性岗位(乡村振兴专干)招聘44人笔试备考试题及答案解析
- 单元主题写作素材与运用“劳动光荣”2025-2026学年统编版高一语文必修上册
- 湖南省娄底市期末真题重组卷-2025-2026学年四年级语文上册(统编版)
- 2025年华侨生联考试题试卷及答案
- 土石方测量施工方案
- 2025年司法协理员年度考核表
- 风电项目质量管理
- 静脉输液操作规范与并发症预防指南
- 建筑施工人员三级安全教育
- 石泉县安沟钛磁铁矿矿山地质环境保护与土地复垦方案
评论
0/150
提交评论