C语言40
第 6章循环控制课堂教学 4学时上机操作2学时教学累计1 6学时上机累计4学时
C语言40
循环结构是重复执行某段程序,直到某个条件满足为止的一种程序结构。
很多问题的解决需要用到循环控制。
循环结构、顺序结构、选择结构是构成复杂程序的基本单元。
C语言40
C提供四种循环
1,goto ~ if
2,while
3,do ~ while
4,for
C语言40
goto语句以及用 goto语句构成循环
无条件转向语句一般形式:
goto 语句标号;
两种用途
1,与 if语句构成循环
2,从多层循环的最内层跳出例 6.1求 ∑n
求,1+2+3+4……+100
100
n=1
C语言40
main( )
{ int i,sum=0; 注意:初值的设置
i=1;
loop:if(i<=100)
{sum=sum+i;
i++;
goto loop;}
printf("%d",sum);
} 运行结果,5050
C语言40while语句
while语句可以实现当型循环
格式,while(表达式 )
语句;
执行过程:计算表达式值,为真 (非 0)则执行语句;反复执行上述操作,直到表达式值为假时止
思考:变!什么在改变!
循环体语句
N-S结构流程图当表达式为真
C语言40
例 6.2求 ∑n
main( )
{int i,sum=0;
i=1;
while(i<=100)
{ sum=sum+i;
i++;}
printf("%d",sum);}
问,sum和 i都在变,谁的变化使循环结束?
100
n=1 N-S结构流程图
i=1
sum=sum+i
i=i+1
当 i≤100
C语言40
例求 7!
main( )
{int t=1,i=2;
while (i<=7)
{t=t* i;
i++;}
printf(“7!=%d\n”,t);}
运行结果,5040 (1x2x3x4x5x6x7)
C语言40
思考
修改程序使运算顺序为 7x6x5x4x3x2x1
main( )
{int t=7,i=6 ;
while (i>0)
{t=t* i;
i- -;}
printf(“7!=%d\n”,t);}
C语言40
课堂练习
读程序写出运行结果
main( )
{long x;
int n=0;
scanf(“%ld”,&x); 运行时输入,-10203040
x=x>0?x:-x; 运行结果,
while(x!=0)
{n++;
x=x/10;}
printf("%d\n",n);}
运行结果,8
C语言40
问:
循环体内增加 printf("%d\n",x);
运行结果是:
1020304
102030
10203
1020
102
10
1
0
8
C语言40
do-while语句
do-while语句可以实现直到型循环
格式,do 语句;
while(表达式 );
执行过程:先执行语句,后计算表达式值,
为 0(假 )则退出循环 ;否则返回 do处,继续循环循环体语句
N-S结构流程图当表达式为真
C语言40
例 6.3 用 do- while语句求 ∑n
main( )
{int sum=0,i=1;
do
{sum=sum+i;
i++;
} while(i<=100);
printf("%d",sum);
}
100
n=1
C语言40for语句
使用最为灵活,可代替 while
格式,for(表达式 1;表达式 2;表达式 3)
语句;
应用形式:
for(循环变量初值 ;循环条件 ;循环变量增值 )
求解表达式1
循环体语句表达式 2
求解表达式 3
for语句后的语句真假
C语言40
一条语句完成求和
for(i=1;i<=100;i++) sum=sum+i;
for语句改为 while循环的形式:
表达式1 ;
while(表达式 2)
{ 语句表达式3 ;
}
C语言40for语句的任何一个表达式都可以省略但不能省略分号“;”
1,for( ;i<=100;i++) sum=sum+i;
2,for(i=1; ;i++) sum=sum+i;
3,for(i=1;i<=100; ) sum=sum+i;
4,for( ;i<=100; ) sum=sum+i;
5,for( ; ; ) 相当于 while(1)
6,for(sum=0,i=1;i<=100;i++) sum=sum+i;
7,for(i=0,j=100;i<=100;i++,j--) sum=j+i;
C语言40
讨论 *****
1,for(i=0;(c=getchar( ))!=?\n?;i+=c); 作用?
2,for(;(c=getchar( ))!=?\n?;)
printf(“%c”,c);
结果?
输入,computer
输出,computer
输入输出:
ccoommppuutteerr
C语言40
读程序写出运行结果
1,main( )
2,{int number,digit;
3,scanf(“%d”,&number); 运行时输入 8962
4,do
5,{digit=number%10;
6,printf("%d",digit);
7,number/=10;
8,}while(number!=0);
9,printf("\n");}
10.结果,2698
C语言40
读程序写出运行结果
main( )
{int i,j,k;
j=1;
k=0;
for(i=1;i<=10;i+=2)
{j=j*i;
k=k+j;}
printf("first k=%d\n",k);
j=1; /*注意不同点 */
k=0;
for(i=1;i<=10;i+=2)
j=j*i;
k=k+j;
printf("second k=%d\n",k);}
C语言40习题
结果:
first k=1069
1+1*3+1*3*5+1*3*5*7+1*3*5*7*9
second k=945
1*3*5*7*9
编程序:输入两个正整数 m和 n,求最大公约数和最小公倍数
用展转相除法:
如果,m%n==0则 n为最大公约数 (%,求余 )
否则:除数变为被除数,余数变为除数继续进行 m%n的运算
C语言40
1,main( )
2,{int a,b,numb1,numb2,temp;
3,scanf("%d,%d",&numb1,&numb2);
4,a=numb1,b=numb2;
5,while(b!=0)
6,{temp=a%b;
7,a=b;
8,b=temp;
9,}
10.printf("它们的最大公约数为,%d\n",a);
11.printf("它们的最小公倍数为
%d\n",numb1*numb2/a);
12.}
C语言40*****
打印输出所有的“水仙花数”。 153=13+33+53
一个三位数,其各位数字的立方和等于该数本身
main( )
{int i,j,k,n;
for(n=100;n<1000;n++)
{i=n/100;
j=n/10-i*10;
k=n%10;
if(n==i*i*i+j*j*j+k*k*k)
printf(“水仙花数,%d,",n);}
printf("\n");
}
运行结果:水仙花数,153,370,371,407,
C语言40循环的嵌套
循环的嵌套也称为多重循环,是指某个循环语句的循环体中含有另一个循环语句
设计多重循环结构时,要注意内层循环语句必须完整的包含在外层循环的循环体中
不允许出现内外层循环体交叉现象,但允许在外层循环体中包含多个并列的循环语句
三种循环语句都可以组成多重循环
C语言40
1,while( ) 2,for( ; ;)
{… {…
while( ) do
{… {…
} while( )
} {…
3,do for( )
{… {…
do }
{… }
}while( ); }while( );
}while( ); }
C语言40
讨论
1,for(i=0;i<3;i++) printf(“Hello”);
2,for(j=0;j<2;j++)
for(i=0;i<3;i++)
printf(“Hello”);
3,for(j=0;j<2;j++)
{ for(i=0;i<3;i++)
printf(“Hello”);
printf(“\n”);}
C语言40
结果
1,Hello Hello Hello
2,Hello Hello Hello Hello Hello Hello
3,Hello Hello Hello
Hello Hello Hello
C语言40
举例
1,计算并输出九九乘法表
#include "stdio.h"
main( )
{ int i,j,a;
for(i=1;i<=9;i++)
{ for(j=1;j<=i;j++)
{ a=i*j;
printf("%d*%d=%d",i,j,a);}
printf("\n");}
}
C语言40
运行结果:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4 28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
C语言40
2.输出图形
main( )
{int k=1,j;
while(k<=7)
{j=1;
while(j<=k)
{printf("*");
j++;}
printf("\n");
k++;
}
}
*
**
***
****
*****
******
*******
C语言40
3,输出图形
main()
{int i,j,k;
for(i=1;i<=4;i++)
{for(j=1;j<=9-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
for(i=1;i<=3;i++)
{for(j=1;j<=i+5;j++)
printf(" ");
for(k=1;k<=7-2*i;k++)
printf("*");
printf("\n");}}
*
***
*****
*******
*****
***
*
C语言40
main( )
{int i,j,k;
for(i=4;i>=1;i-- )
{for(j=1;j<=9-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
for(i=2;i>=0;i--)
{for(j=1;j<=i+5;j++)
printf(" ");
for(k=1;k<=7-2*i;k++)
printf("*");
printf("\n");}}
*******
*****
***
*
***
*****
*******
C语言40
4,输入两个正整数,m和 n求最小公倍数
1,main( ) /* 3,5 4,3检验 */
2,{int m,n,temp;
3,scanf("%d,%d",&m,&n);
4,if(m<n) {temp=m;m=n;n=temp;}
5,temp=m;
6,while(temp%n!=0)
7,tem+=m;
8,printf(“最小公倍数,%d\n",temp);}
C语言40
break语句和 continue语句
break语句用于 switch语句,还可以用来从循环体内跳到循环体外,即提前结束循环
格式,break;
如,for(r=1;r<=10;r++)
{area=PI*r*r; 注:计算圆面积
if(area>100)break;
printf(“%f”,area);}
continue语句专门用于循环,其作用是结束本次循环,即跳过循环体中下面尚未执行的语句
C语言40
格式,continue;
例 6.5把 100~200之间的不能被3整除的数输出
main( )
{int n;
for(n=100;n<=200;n++)
{if(n%3==0)
continue;
printf(“%d”,n);}
}
C语言40continue 与 break的区别
continue只结束本次循环,而不终止整个循环,break则结束整个循环
1.while(表达式 1) 2,while(表达式 1)
{… {…
if(表达式 2) break; if(表达式 2) continue;
… …
} }
C语言40
例:统计 50~100之间不能被2或3或7除尽的整数
main( )
{int n;
for(n=50;n<100;n++)
if(n%2==0)continue;
else if(n%3==0) continue;
else if(n%7==0) continue;
else printf("%5d",n);
}
运行结果,53 55 59 61 65 67 71 73 79
83 85 95 97
C语言40
如果不用 continue语句,则可改写成
main( )
{int n;
for(n=50;n<100;n++)
if(n%2!=0)
if(n%3!=0)
if(n%7!=0) printf("%5d",n);}
还可以更简单:
if(n%2 && n%3 && n%7) printf("%5d",n);
C语言40
流程图为:
表达式 1 表达式 1
表达式2表达式2
While的下一个语句While的下一个语句
break continue
真 真假假假假真真
C语言40课堂练习
main( )
{char ch_old,ch_new;
ch_old='.';
do
{scanf("%c",&ch_new);
if(ch_new==ch_old) continue;
ch_old=ch_new; printf("%1c",ch_old);
}while(ch_new!='.');
printf("\n");}
运行时输入,ssstuuddennttt.
C语言40
运行结果,student
题意为:将输入的字符复制输出,但如果一个相同的字符连续输入几次,则只复制输出一次,当读到‘,?就结束
C语言40程序举例
例 6.6用 π/4≈1-1/3+1/5-1/7+… 公式求 π的近似值,直到最后一项的绝对值小于 10-6为止
#include <math.h>
main( )
{int s; float n,t,pi;
t=1,pi=0;n=1.0;s=1;
while(fabs(t)>le-6)
{pi=pi+t;
n=n+2;
s=-s;
t=s/n; }
pi=pi*4;
printf("pi=%10.6f\n",pi);}
运行结果,3.141594
t=1,pi=0,n=1,s=1
当 |t| ≥10-6
pi=pi+t
n=n+2
s=-s
t=s/n
输出 pi
pi=pi*4
C语言40
例 6.7 求 Fibonacci数列前 40个数
这个数列的特点,1,2两个数为 1,1。从第 3个数开始,
该数是其前面两个数之和
main( )
{long int f1,f2;
int i;
f1=1;f2=1;
for(i=1;i<=20;i++)
{printf("%12ld %12ld",f1,f2);
if(i%2==0)printf("\n");
f1=f1+f2;
f2=f2+f1; }}
if语句的作用是输出四个数后换行
f1=1,f2=1
for i=1 to 20
输出 f1,f2
f1=f1+f2
f2=f2+f1
C语言40
例 6.8判断 m是否素数读入 m
k=
i=2
真 m被 i整除 假用 break结束循环
i= i+1
真 i≥k+1 假输出,m不是素数输出,m是素数当 i≤k
m
C语言40
#include <math.h>
main( )
{
int m,i,k;
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1)printf("%d is a prime number\n",m);
else printf("%d is not a prime number\n",m);
}
运行时输入,17
运行结果,17 is a prime number
C语言40
例 6.9求 100~200间的全部素数
#include <math.h>
main( )
{
int m,k,i,n=0;
for(m=101;m<=200;m=m+2)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>=k+1){printf(%d",m);n=n+1;}
if(n%10==0)printf(“\n”); /*控制每行输出 10个数据 */
}
printf("\n");
}
C语言40
例 6.10译密码。为使电文保密,
往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。如,按以下规律将电文变成密码:
C语言40
将字母 A变成字母 E,a变成 e,即变成其后的第四个字母,W变成 A,
X变成 B,Y变成 C,Z变成 D,循环
B C
D
ZY
W E
F
A
X
China!
转变为:
Glmre!
非字母字符不变
C语言40
#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);
}
}
C语言40讨论
if(c>'Z'&&c<='Z'+4||c>'z')c=c-26;
if(c>?Z?||c>?z?) c=c-26; 不能这样!!
C语言40
上机题
p120 ① 6.2 ② 6.4 ③ 6.6 ④ 6.14