第六章 循环结构程序设计本章内容
1.循环结构概述
2.go to语句及用 go to语句构成的循环
3.While语句的使用
4.Do While语句的使用
5.For 语句的使用
6.循环的嵌套
7.Break语句和 Continue语句的使用
8.程序举例概 述循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某一程序段,直到条件不成立为止。
给定的条件称为循环条件,反复执行的程序段称为循环体。
C语言提供多种循环语句,组成各种不同形式的循环结构。
( 1)用 goto语句和 if语句构成循环
( 2)用 while语句
( 3)用 do--while语句
( 4)用 for语句表达式语句 表达式语句
a) 当型循环 b) 直到循环
Y
N
N
Y
循环结构类型无条件转移语句 ——goto语句一般格式,goto 语句标号;
语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号 (,)。
语句标号起标识语句的作用,与 goto语句配合使用 。
goto语句及用 goto语句构成的循环
C语言不限制程序中使用标号的次数,但各标号不得重名。
goto语句的语义是改变程序流向,转去执行语句标号所标识的语句。
如,label1,i++;
goto label1;
用 goto语句与 if语句实现循环形式 1:
loop1:
语句;
if ( 表达式 ) goto loop1;
形式 2:
loop1:
if ( 表达式 ) goto loop2;
语句;
goto loop1;
loop2,
注意:在结构化程序设计中一般不主张使用 goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难 。
例 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);
}
#include"stdio.h"
void main()
{ int n=0;
printf("input a string\n");
loop,if(getchar()!='\n')
{ n++;
goto loop;
}
printf("%d",n);
}
例 2:统计从键盘输入一行字符的个数。
while 语句执行过程是:计算表达式的值,当值为真 (非 0)时,
执行循环体语句 。 如右上图 。
while语句的一般形式为:
while(表达式 )
语句;
其中表达式是循环条件,语句为循环体,若是多个语句则必须用 { }组成复合语句。
表达式语句
Y
N
例 1,编程序求,s=1+2+3+……+100
void main()
{ int s=0,n=1;
while (n<=100)
{ s=s+n;
n++;
}
printf("S=%d",s);
}
do-while语句的一般形式为:
do
语句;
while (表达式 );
其中:语句是循环体,
表达式是循环条件 。
表达式语句
N
Y
执行过程是:先执行循环体语句一次,再判别表达式的值,若为真 (非 0)则继续循环,否则终止循环 。
Do—while语句例 1,编程序求,s=1+2+3+……+100
void main()
{ int s=0,n=1;
do
{ s=s+n;
n++;
} while (n<=100);
printf(“s=%d",s);
}
void main()
{ int s=0,n=1;
while (n<=100)
{ s=s+n;
n++;
}
printf("S=%d",s);
}
1.在 if语句,while语句中,表达式后面都不能加分号,而在
do-while语句的表达式后面则必须加分号 。
2.do-while语句也可以组成多重循环,而且也可以和 while语句相互嵌套 。
3.当循环体由多个语句组成时,也必须用 { }括起来组成一个复合语句 。
4.如果循环至少要执行一次,while和 do-while语句可以相互替换 。
使用 while和 do-while语句应注意以下几点:
for语句
for语句是C语言所提供的功能更强,使用更广泛的一种循环语句 。
使用一般形式为:
for (表达式 1;表达式 2;表达 3) 语句;
表达式 1通常用来给循环变量赋初值,一般是赋值表达式 。
也允许在 for语句外给循环变量赋初值,此时可以省略该表达式 。
表达式 2通常是循环条件,一般为关系或逻辑表达式 。
表达式 3通常可用来修改循环变量的值,一般是赋值语句 。
1.首先计算表达式 1的值 。
2.再计算表达式 2的值,若值为真 (非 0)则执行循环体一次,否则跳出循环 。
3.然后再计算表达式 3的值,转回第 2步重复执行 。
表达式 2
语句
Y
N
语句求解表达式 1
求解表达式 3
for 语句的执行过程
for语句的执行过程:
在整个 for循环过程中,表达式
1只计算一次,表达式 2和表达式 3
则可能计算多次。循环体可能多次执行,也可能一次都不执行。
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,以改变循环变量的值。
例:用 for语句计算 s=1+2+3+...+99+100
1.for语句中的各表达式都可省略,但分号间隔符不能少 。
如,for(;表达式 2;表达式 3) 省去了表达式 1。
for(表达式 1;;表达式 3) 省去了表达式 2。
for(表达式 1;表达式 2; ) 省去了表达式 3。
for(;; ) 省去了全部表达式 。
2.在循环变量已赋初值时,可省去表达式 1。
3.省去表达式 2或表达式 3则相当于 while语句,并且造成无限循环,这时应在循环体内设法结束循环 。
在使用 for语句中要注意以下几点:
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:
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)
4,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; s+=n,n++);
printf("s=%d\n",s);
}
这里为什么要加;
#include"stdio.h"
void main()
{ int n=0;
printf("input a string:\n");
for(;getchar()!='\n';n++) ;
printf("%d",n);
}
例:统计从键盘输入一行字符的个数。
getchar()是使用输入缓冲区的(按了回车之后才会真正输入),可以用 getche()函数,这个函数不使用缓冲区,直接输入直接处理,需要的头文件是,conio.h”。
本例中,省去了 for语句的表达式 1,表达式 3也不是用来修改循环变量,而是用作输入字符的计数。这样就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。
注意的是,空语句后的分号不可少,如缺少此分号,则把后面的 printf 语句当成循环体来执行。反过来说,如循环体不为空语句时,决不能在表达式的括号后加分号,这样又会认为循环体是空语句而不能执行循环体。
说 明:
循环的嵌套
for语句也可与 while,do-while语句相互嵌套,构成多重循环 。 以下形式都合法的嵌套 。
(4) while( )
{

for( )
{…}

}
(1) while( )
{…
while( )
{…}

}
(2) do{

do
{
…} while( )…
}while();
(3) for( )
{
………
for( )
{ …… }
……
}
(7) while( )
{

do
{ …
}while( );

}
(5) for( )
{…
while( )
{…}

}
(6) do{

for( )
{…}

}while( );
(8) for( )
{
………
do
{ ……
} while( );
……
}
例:打印如下形式的九九乘法表
void 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"); }
}
break语句和 continue语句
break语句
break语句只能用在 switch 语句或循环语句中,其作用是跳出 switch语句或跳出本层循环,转去执行后面的程序 。
break语句的一般形式为,break;
break语句用于循环体中,一般与 if 语句联合使用 。
#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;
}
}
功能是,检查输入的一行中有无相邻两字符相同 。
分析下面程序的功能
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语句程序举例例 6.6 利用公式 π/4 ~ 1-1/3+1/5-1/7+…… 求 π,直到最后一项小于 1E-6。
#include <math.h>
void 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.6f\n",pi);
}
#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=0
i=2
YN
i=i+1
当 i>k YN
打印 Yes
break
打印 No
程序流程图算法,判断一个整数 m是否是素数 。
#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");}
}
}
例 6.9 打印输出 100——200之间的素数。
算法,字符的加密、解密加密的思想是:
将每个字母 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
#include "stdio.h"
main()
{ char c;
while((c=getchar())!='\n')
{ if((c>='a' && c<='z') || (c>='A' && c<='Z'))
{ c=c+4;
if (c>'Z' && c<='Z'+4 || c>'z')
c=c-26;
}
printf("%c",c);
}
}
加密程序如下:
#include "stdio.h"
main()
{ char c;
while((c=getchar())!='\n')
{ if((c>='a' && c<='z') || (c>='A' && c<='Z'))
{ c=c-4;
if (c<'A' || c<'a' && c>='a'-4)
c=c+26;
}
printf("%c",c);
}
}
解密程序如下:
求最大公约数的算法思想 (辗转相除法 ):
(1) 对于已知两数 m,n,使得 m>n;
(2) M 除以 n 得余数 r;
(3) 若 r=0,则 n 为求得的最大公约数,算法结束;
否则执行 (4);
(4) m←n,n←r,再重复执行 (2)。
例如,求 m=14,n=6 的最大公约数,
m n r
14 6 2
6 2 0
最小公倍数 =两个整数之积 /最大公约数算法:求两个整数的最大公约数、最小公倍数
void main()
{ int nm,r,n,m,t;
scanf("%d,%d",&m,&n);
nm=n*m;
if (m<n)
{ t=n; n=m; m=t; }
r=m%n;
while (r!=0)
{ m=n; n=r; r=m%n; }
printf("最大公约数,%d\n",n);
printf("最小公倍数,%d\n",nm/n);
}
求两个整数的最大公约数、最小公倍数课本 Pg.120 6.4 6.6 6.8
作 业:
实验内容:
实验指导书上机实验之实验三实验要求:
调试第一题将第 2,3,4,5题编制程序上机调试出正确结果其中第 3题源代码文件上传