Upload
leanna
View
139
Download
7
Embed Size (px)
DESCRIPTION
本章内容 1. 循环结构概述 2.go to 语句及用 go to 语句构成的循环 3.While 语句的使用 4.Do While 语句的使用 5.For 语句的使用 6. 循环的嵌套 7.Break 语句和 Continue 语句的使用 8. 程序举例. 第六章 循环结构程序设计. 例 求 s=1+2+3+ … +100. 例:打印如下形式的九九乘法表. 输入 10 个整数,求它们的平均值,并输出大于平均值的个数。. main() { int a,b,c,d,e,f,g,h,i,j,n=0; float average; - PowerPoint PPT Presentation
Citation preview
1
第六章 循环结构程序设计本章内容1. 循环结构概述2.go to 语句及用 go to 语句构成的循环3.While 语句的使用4.Do While 语句的使用5.For 语句的使用6. 循环的嵌套7.Break 语句和 Continue 语句的使用8. 程序举例
2
C 语言程序设计 第六章 循环结构程序设计
例 求 s=1+2+3+ …+100
3
C 语言程序设计 第六章 循环结构程序设计例:打印如下形式的九九乘法表 .
4
C 语言程序设计 第六章 循环结构程序设计输入 10 个整数,求它们的平均值,并输出大于平均值的个数。
main()
{ int a,b,c,d,e,f,g,h,i,j,n=0;
float average; scanf(“%d”, &a); scanf(“%d”, &b);
scanf(“%d”, &c); scanf(“%d”, &d;
scanf(“%d”, &e); scanf(“%d”, &f);
scanf(“%d”, &g); scanf(“%d”, &f);
scanf(“%d”, &i); scanf(“%d”, &j);
5
C 语言程序设计 第六章 循环结构程序设计average=(a+b+c+d+e+f+g+h+i+j)/10;
if( a>average ) n=n+1;
if( b>average ) n=n+1;
if( c>average ) n=n+1;
if( d>average ) n=n+1;
if( e>average ) n=n+1;
if( f>average ) n=n+1;
if( g>average ) n=n+1;
if( h>average ) n=n+1;
if( i>average ) n=n+1;
if( j>average ) n=n+1;
printf(“n=%d",n);
}
6
C 语言程序设计 第六章 循环结构程序设计
6.1 概 述 循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。 ( 1 )用 goto 语句和 if 语句构成循环 ( 2 )用 while 语句 ( 3 )用 do----while 语句 ( 4 ) 用 for 语句
7
C 语言程序设计 第六章 循环结构程序设计
表达式
语句 表达式语句
a) 当型循环 b) 直到循环
非 0
0
非 0
0
8
C 语言程序设计 第六章 循环结构程序设计6.2 goto 语句及用 goto 语句构成的循环
一、无条件转移语句—— goto 语句 一般格式: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号 ( : ) 。语句标号起标识语句的作用,与 goto 语句配合使用。 如: label: i++; goto label1; C语言不限制程序中使用标号的次数,但各标号不得重名。 goto 语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
9
C 语言程序设计 第六章 循环结构程序设计二、用 goto 语句与 if 语句实现循环用 goto 语句与 if 语句实现循环的形式:形式 1 :loop1 : 语句; if (表达式) goto loop1;
形式 2 :loop1 : if (表达式) goto loop2;
语句; goto loop1;
loop2 : 注意:在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
10
C 语言程序设计 第六章 循环结构程序设计例 1 : 编程序求: s=1+2+3+……+100
main()
{ int s=0,n=1;
loop:
s=s+n;
n++;
if (n<=100) goto loop;
printf("S=%d",s);
}
main() { int s=0,n=1;loop1: if (n>100) goto loop2; s=s+n; n++; goto loop1; loop2: printf("S=%d",s); }
11
C 语言程序设计 第六章 循环结构程序设计例 2 :统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string\n"); loop: if(getchar()!='\n') { n++;
goto loop; } printf("%d",n); }
12
C 语言程序设计 第六章 循环结构程序设计6.3 while 语句
执行过程是:计算表达式的值,当值为真 ( 非0) 时, 执行循环体语句。如右上图。
while 语句的一般形式为: while( 表达式 )
语句; 其中表达式是循环条件,语句为循环体,若是多个语句则必须用 { 和 } 组成复合语句。
表达式
语句非 0
0
13
C 语言程序设计 第六章 循环结构程序设计例 1 : 编程序求: s=1+2+3+……+100
main()
{ int s=0,n=1;
while (n<=100)
{ s=s+n;
n++;
}
printf("S=%d",s);
}
14
C 语言程序设计 第六章 循环结构程序设计
6.4 Do—while 语句 do-while 语句的一般形式为: do
{ 语句; }while ( 表达式 ) ; 其中:语句是循环体, 表达式是循环条件。
表达式语句
非 0
0
执行过程:先执行循环体语句一次, 再判别表达式的值,若为真 ( 非 0) 则继续循环,否则终止循环。
15
C 语言程序设计 第六章 循环结构程序设计例 1 : 编程序求: s=1+2+3+……+100
main()
{ int s=0,n=1;
do
{ s=s+n;
n++;
} while (n<=100);
printf("S=%d",s);
}
16
C 语言程序设计 第六章 循环结构程序设计使用 while 和 do-while 语句应注意以下几点: 1. 在 if 语句, while 语句中, 表达式后面都不能加分号, 而在 do-while 语句的表达式后面则必须加分号。 2.do-while 语句也可以组成多重循环,而且也可以和 while 语句相互嵌套。 3. 当循环体由多个语句组成时,也必须用 {} 括起来组成一个复合语句。 4. 如果循环至少要执行一次, while 和 do-while 语句可以相互替换。
17
C 语言程序设计 第六章 循环结构程序设计6.5 for 语句
for 语句是C语言所提供的功能更强,使用更广泛的一种循环语句。一、使用一般形式为: for( 表达式 1 ;表达式 2 ;表达式 3)
语句; 其中:表达式 1 通常用来给循环变量赋初值,一般是赋值表达式。也允许在 for 语句外给循环变量赋初值,此时可以省略该表达式。 表达式 2 通常是循环条件,一般为关系表达式或逻辑表达式。 表达式 3 通常可用来修改循环变量的值,一般是赋值语句。
18
C 语言程序设计 第六章 循环结构程序设计for 语句的执行过程: 1. 首先计算表达式 1 的值。 2. 再计算表达式 2 的值,若值为真 ( 非 0) 则执行循环体一次, 否则跳出循环。 3. 然后再计算表达式 3 的值,转回第 2 步重复执行。 在整个 for 循环过程中,表达式 1 只计算一次,表达式 2 和表达式 3 则可能计算多次。循环体可能多次执行,也可能一次都不执行。
表达式 2
语句非 0
0
语句
求解表达式1
求解表达式3
for 语句的执行过程
19
C 语言程序设计 第六章 循环结构程序设计例:用 for 语句计算 s=1+2+3+...+99+100 main()
{ int n,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
}
本例 for 语句中的表达式 3 为 n++ ,实际上也是一种赋值语句,相当于 n=n+1 ,以改变循环变量的值。
20
C 语言程序设计 第六章 循环结构程序设计二、在使用 for 语句中要注意以下几点: 1.for 语句中的各表达式都可省略,但分号间隔符不能少 如: for( ;表达式 2 ;表达式 3) 省去了表达式 1 。 for( 表达式 1 ;;表达式 3) 省去了表达式 2 。 for( 表达式 1 ;表达式 2 ; ) 省去了表达式 3 。 for( ;; ) 省去了全部表达式。 2. 在循环变量已赋初值时,可省去表达式 1 。如省去表达式 2 或表达式 3 则将造成无限循环,这时应在循环体内设法结束循环。 例:
21
C 语言程序设计 第六章 循环结构程序设计main() { int n=1,s=0; for(;n<=100;n++)
s=s+n; printf("s=%d\n",s); }
main() { int n=1,s=0; for(;n<=100;)
{ s=s+n; n++;} printf("s=%d\n",s); }
省略表达式 1 和 3 ;
省略表达式 1 :
22
C 语言程序设计 第六章 循环结构程序设计main() { int n=1,s=0; for(; ;)
{ s=s+n; n++;} printf("s=%d\n",s); }
省略全部表达式: —— 程序为死循环
main() { int n=1,s=0; for(; ;)
{ s=s+n; n++; if (n>=100) break; } printf("s=%d\n",s); }
for( ; ; )等效于 while( 1)
23
C 语言程序设计 第六章 循环结构程序设计 3. for 语句中的 三个表达式都可以是逗号表达式, 即每个表达式都可由多个表达式组成。 例: main()
{ int n,s; for(n=1,s=0;n<=100;n++)
s=s+n; printf("s=%d\n",s); }
main() { int n,s; for(n=1,s=0;n<=100;n++,s+=n); printf("s=%d\n",s); }
这里为什么要加;
24
C 语言程序设计 第六章 循环结构程序设计例:统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string:\n"); for(;getchar()!='\n';n++); printf("%d",n); } 说明:本例中,省去了 for 语句的表达式 1 ,表达式 3 也不是用来修改循环变量,而是用作输入字符的计数。这样, 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的 printf 语句当成循环体来执行。 反过来说,如循环体不为空语句时, 决不能在表达式的括号后加分号, 这样又会认为循环体是空语句而不能执行循环体。
25
C 语言程序设计 第六章 循环结构程序设计6.6 循环的嵌套
for 语句也可与 while,do-while 语句相互嵌套,构成多重循环。以下形式都合法的嵌套。
(4) while() { … for() {…} … }
(1) while( ) {… while( )
{…}…
}
( 2 ) do {
… do
{ …} while() … }while();
(3) for() { ……… for() { …… } …… }
26
C 语言程序设计 第六章 循环结构程序设计
(7) while() { … do { … }while(); … }
(5) for( ) {… while( )
{…}…
}
(6) do{…for( ){…}…
}while();
(8) for() { ……… do { …… } while(); …… }
27
C 语言程序设计 第六章 循环结构程序设计例:打印如下形式的九九乘法表 .
main() { int x,y; for(x=1;x<=9;x++) { for(y=1;y<=9;y++) printf("%d*%d=%2d ",x,y,x*y); printf("\n"); } }
28
C 语言程序设计 第六章 循环结构程序设计6.7 几种循环语句的比较
for ( ) while ( ) { …}
do { ...
}while();
循环类型 当型循环 当型循环 直到循环
循环控制条件 表达式 2值非 0 表达式值非 0 表达式值非 0
循环变量初值 在 for语句行中 在 while之前 在 do之前
使循环结束 表达式 3 循环体中使用专门语句
循环体中使用专门语句
29
C 语言程序设计 第六章 循环结构程序设计6.8 break 语句和 continue 语句
一、 break 语句 break 语句只能用在 switch 语句或循环语句中, 其作用是跳出 switch 语句或跳出本层循环,转去执行后面的程序。由于 break 语句的转移方向是明确的,所以不需要语句标号与之配合。 break 语句的一般形式为: break; 注意:break 语句用于循环体中,一般与 if 语句联合使用。
30
C 语言程序设计 第六章 循环结构程序设计例:计算 s=1+2+3+...+99+100 main()
{ int n=1,s=0;
while(1)
{ if(n>100) break;
s=s+n;
n++;
}
printf("s=%d\n",s);
}
31
C 语言程序设计 第六章 循环结构程序设计 分析下面程序的功能#include"stdio.h"void main() { char a,b; printf("input a string:\n"); b=getchar(); while((a=getchar())!='\n') { if(a==b) { printf("same character\n");
break; } b=a;
} }
功能是: 检查输入的一行中有无相邻两字符相同。
32
C 语言程序设计 第六章 循环结构程序设计 done=0; for( … ) { for ( … ) { while ( … ) { if ( … ) { done=1; break; } … } if (done) break; … } if (done) break; } 多层嵌套循环: 可用 goto 退出 goto stop;
而 break; 只能退出本层循环。
33
C 语言程序设计 第六章 循环结构程序设计
main(){ int n; for(n=7;n<=100;n++) { if (n%7!=0) continue; printf("%d ",n); } }
main(){ int n; for(n=7;n<=100;n++) { if (n%7==0) printf("%d ",n); } }
二、 continue 语句 continue 语句只能用在循环体中其一般格式是: continue; 其语义是:结束本次循环,即不再执行循环体中 continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是, 本语句只结束本层本次的循环,并不跳出循环。
34
C 语言程序设计 第六章 循环结构程序设计6.9 程序举例
例 6.6 教材 Pg.116
(略) fabs()
例 6.7 教材 Pg.116
(略) if( i%2==0) printf(“\n”)
例 6.8 判断一个整数 m 是否是素数。教材 Pg.118
素数是只能被 1 和本身整除的数。
35
C 语言程序设计 第六章 循环结构程序设计#include "math.h"void main() { int m,i,k; printf("Enter m=\n"); scanf("%d",&m); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>k) printf("Yes\n"); else printf("No\n"); }
输入 m
当 i<=k
k=sqrt(m)
m%i=0i=2
YN
i=i+1
当 i>k YN
打印 Yes
break
打印 No
程序流程图
36
C 语言程序设计 第六章 循环结构程序设计例 6.9 打印输出 100——200 之间的素数。 #include "math.h"void main() { int n=0,i,k,m; for (m=101;m<=199;m++) { k=sqrt(m); for(i=2;i<k;i++) if(m%i==0) break; if(i>=k) { n++; printf("%d ",m); if (n% 10==0) printf("\n");} } }
37
C 语言程序设计 第六章 循环结构程序设计例 6.10 字符加密、解密 教材 Pg.119
加密的思想是: 将每个字母 C 加(或减)一序数 k ,即用它后的第 k个字母代替,变换式公式: c=c+k 例如序数 k 为 5 ,这时 “ A”“F” , “ a”“f” ,“ B”“G”… 当加序数后的字母超过“ Z” 或“ z” 则 c=c+k -26 例如: You are good Dtz fwj ltti 解密为加密的逆过程 将每个字母 C 减(或加)一序数 k ,即 c=c-k, 例如序数 k 为 5 ,这时 “ Z”“U” , “ z”“u” ,“ Y”“T”… 当减序数后的字母小于“ A” 或“ a” 则 c=c-k +26
38
C 语言程序设计 第六章 循环结构程序设计加密程序如下:#include "stdio.h"main() { char c; while((c=getchar())!='\n') { if((c>='a' && c<='z') || (c>='A' && c<='Z')) { c=c+5; if (c>'Z' && c<'Z'+5 || c>'z') c=c-26; } printf("%c",c); } }
39
C 语言程序设计 第六章 循环结构程序设计解密程序如下:#include "stdio.h"main() { char c; while((c=getchar())!='\n') { if((c>='a' && c<='z') || (c>='A' && c<='Z')) { c=c-5; if (c<'A' || c<'a' && c>'a'-5) c=c+26; } printf("%c",c); } }
作业: (6.1) 6.3 6.6 6.11
40
C 语言程序设计 第六章 循环结构程序设计例 3-16 求一元二次方程 ax2+bx+c=0 的根源程序如下#include "stdio.h" main() { float a,b,c,x1,x2,d; scanf("%f,%f,%f",&a,&b,&c); d=b*b-4*a*c; if(d==0) {x1=-b/(2*a); printf("x1=x2=%f\n",x1); }
41
C 语言程序设计 第六章 循环结构程序设计
else if(d>0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("x1=%f,x2=%f\n",x1,x2); } else { x1=-b/(2*a);x2=sqrt(-d)/(2*a); printf("real part=%f,imag part=%f",x1,x2); } }
42
C 语言程序设计 第六章 循环结构程序设计例 3-18 数列 1,1, 2,3, 5,8, 13 的前 40 个数这是一个递推问题 . 该数列可以用下面的通式来表示f1=1 (n=1) f2=1 (n=2) fn=fn-1+fn-2 (n>=3) 程序如下
main() {long f1,f2; int k; f1=1;f2=1; for(k=1;k<=20;k++) { printf("%12ld %12ld",f1,f2); if(k%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; } }