C5循环续
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
讨论
1. 输入m; 输入 ; 2. for ( k=1; k<=m; k++) { 打印 k 个 * ; 细化: 细化: 换新行; 换新行 1. 输入 ; 输入m; }
* * * * * * * * * *
2. for ( k=1; k<=m; k++) { for ( j=1; j<=k; j++) j<=k printf (“*”); (“*”); printf(“\ printf(“\n”) ; } 说明:1. 循环变量可以控制循环次数; 2. 外循环变量可作为内循环次数的控制变量
确定循环体
循环条件 改变循环变量值
5.3 for语句
一般形式:
for([expr1] ;[ expr2] ;[ expr3]) 循环体语句;
for expr1 假(0) expr2 真(非0) 循环体 expr3
执行流程:
for语句一般应用形式: for(循环变量赋初值;循环条件;循环变量增值) { 循环体语句; } 说明: for语句中expr1, expr2 ,expr3 类型任意,都可省略,但分 例 用for循环求 号;不可省 无限循环: for(;;) main() for语句可以转换成while结构 { int i,sum=0;
while do
假(0)
输出100-200之间不能被 整除的数 之间不能被3整除的数 例:输出 之间不能被 main( ) {int n; for(n=100;n<=200;n++) { if(n%3==0) continue; printf(“%d ”,n); } }
5.7 逗号运算符与for语句变式
打印边长为m的正方型
要求:从键盘输入m值,输出m行每行m个*号。 要求: 例:输入m=4,输出的图形如下: 例:
算法分析与设计:
1. 输入 , 输入m, 2. 重复打印 行,每行打印 个*; 重复打印 打印m行 每行打印m个
行控制
1. 输入m; 2. for ( k=1; k<=m; k++) 打印一行中的 m 个 * ;
do
…… break; …... while expr
假(0)
for expr1 switch 假(0) expr2 真(非0) …… break; …... const 1 语句组1 break; expr case const 2 语句组2 break; …... const n 语句组n break; default 语句组 break;
整理,得到程序如下: 整理,得到程序如下:
#include <stdio.h> main ( ) { int k, m, j; scanf ( “%d”, &m); for ( k=1; k<=m; k++) /* 控制打印m行 */ { for ( j=1; j<=m; j++) /* 打印一行中的m个*号 */ printf (“*”); * ; printf(“\n”) ; } }
expr3
例 break举例:输出圆面积,面积大于100时停止
#define PI 3.14159 main() { int r; float area; for(r=1;r<=10;r++) { area=PI*r*r; if(area>100) break; } printf("r=%d,area=%.2f\n",r,area); }
continue语句
for expr1 假(0) expr2 真(非0) ( 0) …… continue; …... expr 真(非0) …… continue; …… expr3 真(非0) 假(0) …… continue; …... while expr
功能:结束本次循环,跳过循环体中尚未执行的 语句,进行下一次是否执行循环体的判断 仅用于循环语句中
5.7 逗号运算符与for语句变式
形式:表达式1,表达式2,……表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中
main() { int x,y=7; float z=4; x=(y=y+6,y/z); printf("x=%d\n",x); }
5.4 do~while语句
一般形式: do 循环体语句; while(表达式); 执行流程:
do
循环体 真(非0) while expr 假(0)
特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 do~while可转化成while结构
do 循环体 While循环 循环体 真(非0) while expr 假(0) 假(0) expr 真(非0) 循环体
形式:表达式1,表达式2,……表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中
例 a=3*5,a*4 //a=15,表达式值60 //a=15,表达式值20 a=3*5,a*4,a+5 例 x=(a=3,6*3) //赋值表达式,表达式值18,x=18 x=a=3,6*a //逗号表达式,表达式值18,x=3 例 a=1;b=2;c=3; printf(“%d,%d,%d”,a,b,c); //1,2,3 printf(“%d,%d,%d”,(a,b,c),b,c); //3,2,3
例. 输出教材所示九九乘法表。 思路:行号为i,列号为j,每个位置应打印 各行打印? 每个位置应打印?各行打印 思路:行号为 ,列号为 每个位置应打印 各行打印 <=j<=i) (1<=i<=9) (1<=j<=i) <=i<=9 i<= 则:第 i 行中一共要输出 i 个乘积 main() { int i,j; for(i=1;i<=9;i++) {for(j=1;j<=i;j++) for(j=1;j<=i;j++) printf("%d*%d=%d\t",j,i,i*j); printf("\n"); } }
* * * *
* * * *
* * * *
* * * *
细化:
1. 输入 ; 输入m; 2. for ( k=1; k<=m; k++) 列控制 { 打印 m 个 * ; 行控制 换新行; 换新行 细化: 细化: }
1. 输入 ; 输入m; 2. for ( k=1; k<=m; k++) { for ( j=1; j<=m; j++) printf (“*”); (“*”); printf(“\ printf(“\n”) ; }
运行结果: x=3
for语句中expr1, expr2 ,expr3 省略的讨论:
main( ) { int i; for(i=0;i<10;i++) printf(“*”); } main( ) {int i; for(i=0;i<10; ) {printf(“*”); i++; } }
跳入同层的另一循环
例 . 编写程序,求1!、3!、5!、…、19!。 分析 :求一个数字的阶乘——求多个数字的阶乘 f=1; for(i=1;i<=3;i++) f=f*i; printf("f=%f\n",f); main( ) { int n,i; float f; for(n=1;n<=19;n+=2) {f=1; /*该语句必须位于外循环体内*/ for(i=1;i<=n;i++) f=f*i; printf("f=%f\n",f); } }
三种循环的比较
种循环可相互代替,不提倡用goto goto语句 1、3种循环可相互代替,不提倡用goto语句 循环变量初始化: while,do~while之前初始化 之前初始化; 2、循环变量初始化:在while,do~while之前初始化; for语句表达式 中初始化。 语句表达式1 for语句表达式1中初始化。 3、循环控制条件和循环变量值的改变的语句
例 循环嵌套,双层for循环打印图形 ***** ***** ***** ***** *****
main() { int i,j,k; for(i=1;i<=5;i++) {for(k=1;k<=i;k++) printf(" "); for(j=1;j<=5;j++) printf("*"); printf("\n"); } }
内循环 外循环
输出如下图形: 输出如下图形: ****** * ****** *** ****** ***** ****** *******
1 222 33333 4444444
a bbb ccccc ddddddd
分析方法
逐步求精法。对于复杂问题, 逐步求精法。对于复杂问题,不可能直接得到 程序,可以先将简单的部分明确出来, 程序,可以先将简单的部分明确出来,再逐步 对复杂部分进行细化,一步一步推出程序。 对复杂部分进行细化,一步一步推出程序。
例 用do~while循环求
main() { int i,sum=0; i=1; do { sum+=i; i++; }while(i<=100); printf("%d",sum); }
例 while和do~while比较
main() { int i,sum=0; scanf("%d",&i); while(i<=10) { sum+=i; i++; } printf("%d",sum); }
for(i=1;i<=100;i++) sum+=i; printf("%d",sum); }
expr1; while(expr2) { 循环体语句; expr3; }
例. 编程序求出所有的水仙花数。所谓水仙花数,是一个3 位正整数,其各位数字的立方之和等于该数本身。例如, 153是一个水仙花数,因为153=13+53+33。 #include <stdio.h> main() {int x,a,b,c; for(x=100;x<=999;x++) { a=x/100; /*分离出 的百位数 分离出x的百位数 分离出 的百位数*/ b=x%100/10; /*分离出 的十位数 分离出x的十位数 分离出 的十位数*/ c=x%10; /*分离出 的个位数 分离出x的个位数 分离出 的个位数*/ if(a*a*a+b*b*b+c*c*c==x) printf("%d是水仙花数 是水仙花数\n",x); 是水仙花数 } }
5.6 辅助控制语句
break语句
功能:在循环语句和switch语句中,终止并跳出循 环体或开关体 说明: break只能终止并跳出最近一层的结构 break不能用于循环语句和switch语句之外的 任何其它语句之中
while 假(0) expr 真(非0) …… break; …… 真(非0)
5.5 循环的嵌套
三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程
(1) while() (4) for( ; ;) (3) while() (2) do { …… { …… { …… { …… while() do do do 内循环 { …… { …… { …… { …… } }while(); }while( ); }while( ); …... …… ……. …... } while() } }while( ); 内循环 { …… 嵌套循环的跳转 } …... 禁止: } 从外层跳入内层 外循环
例. 从键盘输入一名学生若干门课程的百分制成绩,求出这些 课程的平均成绩。要求以-1作为输入结束标记。 main() {float g,sum=0,ave; int n=0; while(1) /*循环条件总为真,用有条件的break语句结束循环*/ {scanf("%d",&g); if(g==-1) break; sum=sum+g; n++; } ave=sum/n; printf("平均成绩=%f\n",ave); }
循环结构设计思路: 控制表达式 第一次 是否值 为真
main() { int i,sum=0; scanf("%d",&i); do { sum+=i; i++; }while(i<=10); printf("%d",sum); }
初值 终值 值的改变