Вы находитесь на странице: 1из 44

C







第六讲 循环控

1 .循 环语 句类型
if 语句 和 goto 语句 构成 循环
whil e 语句
do-w hile 语句
for 语句




C


程 1.1 goto 语句及用 goto 构成循环

设 goto 语句一般格式:

goto 语句标号;
….…..
标号:语句;

功能:无条件转移语句
说明:
不能用整数作标号
标号只能出现在 goto 所在函数内 , 且


唯一
讲 标号只能加在可执行语句前面
限制使用 goto 语句

C
语 100
言例

用 if 和 goto 语句构成循环,求 ∑n
n =1 ch6_1.c



/*ch6_1.c*/
#include"stdio.h" 循环条件
main() sum=0+1
{ int i,sum=0; sum==1+2=3
循环初值 i=1; sum=3+3=6
sum=6+4
loop: if(i<=100) ……
{ sum+=i; sum=4950+100=5050
循环变量增值 i++; 循环终值
goto loop;
第 }
六 循环体
讲 printf("%d",sum);

}
C



例 从键盘输入一组数据,以 0 结束输入,求数据和
ch6_2.c



/*ch6_2.c*/
#include"stdio.h"
main()
{ int number,sum=0; number==0

read_loop: scanf("%d",&number);
if(!number) goto print_sum;
sum+=number;
goto read_loop;
第 print_sum: printf("The total sum is %d\n",sum);


}


C


1.2 while 语句
程 一般形式:
序 while( 表达式 )


循环体语句;

执行流程:

while

假 (0)
expr
真(非
0)
循环体




C




设 特点:先判断表达式,后执行循环体
计 说明:
循环体有可能一次也不执行
循环体可为任意类型语句
下列情况,退出 while 循环
条件表达式不成立(为零)
循环体内遇 break,return,goto
无限循环 : while(1)
循环体 ;




C

言 100


∑n
例 用 while 循环求
n =1 ch6_3.c


/*ch6_3.c*/
#include"stdio.h" 循环条件
main()
{ int i,sum=0;
循环初值 i=1;
while(i<=100)
{ sum=sum+i;
循环变量增值 i++; 循环终值
第 }


printf("%d",sum);
循环体
}

C


程 例 显示 1~10 的平方
序 ch6_4.c


/*ch6_4.c*/ 运行结果:
#include"stdio.h" 1*1=1
2*2=4
main() 3*3=9
{ int i=1; 4*4=16
while(i<=10) 5*5=25
{ printf("%d*%d=%d\n",i,i,i*i); 6*6=36
i++; 7*7=49
} 8*8=64
9*9=81
第 } 10*10=100


C


1.3 do~while 语句
程 一般形式:

do
设 循环体语句;
计 while( 表达式 );
执行流程:

do

循环体
while
真 ( 非 0)
expr

假 (0)


C



特点:先执行循环体,后判断表达式
序 说明:
设 至少执行一次循环体

do~while 可转化成 while 结构

循环体
While 循环
假 (0)
expr
真(非
0)
循环体



C

100

∑n

程 例 用 do~while 循环求
序 n =1 ch6_5.c

计 /*ch6_5.c*/
#include"stdio.h"
main()
{ int i,sum=0;
i=1;
do
{ sum+=i;
i++;
}while(i<=100);


printf("%d",sum);
讲 }

C


例 while 和 do~while 比较

ch6_6.c


计 /*ch6_6.c*/ main()
#include"stdio.h" { int i,sum=0;
main() scanf("%d",&i);
{ int i,sum=0; while(i<=10)
scanf("%d",&i); { sum+=i;
do i++;
{ sum+=i; }
i++; printf("%d",sum);
}while(i<=10); }

六 printf("%d",sum);
讲 }

C


1.4 for 语句
程 一般形式: for([expr1] ;[ expr2] ;[ expr3])

设 循环体语句;

执行流程: for

expr1

假 (0)
expr2
真(非
0)
循环体


六 expr3


C
语 for 语句一般应用形式:

程 for( 循环变量赋初值;循环条件;循环变量增值 )
序 {

循环体语句;

}
说明: 100

例 用for ∑
循环求expr1,
for语句中
n =1
n
expr2 ,expr3 类型任意,都可省略,
但分号;不可省
#include"stdio.h"
无限循环 : for(;;)
for 语句可以转换成 while 结构
main()
{ int i,sum=0; expr1;
for(i=1;i<=100;i++) while(expr2)
第 sum+=i; {
六 printf("%d",sum); 循环体语句;
讲 expr3;
}

}
C
语 例: #include"stdio.h"
言 main( ) 例: #include"stdio.h"

{ int i; main( )


for(i=0;i<10;i++) { int i=0;

putchar(‘a’+i); for(;i<10;i++)
} putchar(‘a’+i);
}
结果: abcdefghij
例: #include"stdio.h"
例: #include"stdio.h"
main( main(
) )
{ int {i=0;int i=0;

ch6_7.c for(;i<10;)
for(;i<10;putchar(‘a’+i),i++)
六 ; putchar(‘a’+(i++));

} }

C


main()
程 { int i,j,k; ch6_8.c

设 for(i=0,j=100;i<=j;i++,j--)
计 { k=i+j;
printf("%d+%d=%d\n",i,j,k);
}
}

#include"stdio.h" #include"stdio.h"
main() main()
{ char c; { int i,c;
for(;(c=getchar())!='\n';) for(i=0;(c=getchar())!='\n';i+=3)

六 printf("%c",c); printf("%c",c+i);
讲 } }

ch6_9.c ch6_10.c
C
语 例 ( for )梯形法求数值积分
言 b−a
程 h=
序 n
设 h
si = ( f (a + ih) + f (a + (i + 1)h))
计 2
n −1
h
S = ∑ ( f (a + ih) + f (a + (i + 1)h))
i=0 2
n −1
h
= ( f (a) + f (b)) + h∑ f (a + ih) y b
2 i =1 f ( x) = ∫ 4 − x 2 dx
a
迭代:s = 0.5 * h * ( f (a) + f (b))
s = s + h * f ( a + i * h) (i = 1; i <= n − 1; i + + ) f(x)




0 a a+h a+ih a+(i+1)h b x

C
语 #include”stdio.h”

程 #include”math.h”
ch6_11.c

设 main()

{
float a,b;
double s,h;
double f(double x);
int n,i;
printf("Input integral area a,b:");
第 scanf("%f,%f",&a,&b);

讲 printf("Input n:");
循 scanf("%d",&n);
C

言 h=(b-a)/n;

序 s=0.5*h*(f(a)+f(b));

计 for(i=1;i<=n-1;i++)
s=s+h*f(a+i*h);
printf("\nThe value is:%lf ",s);
}
double f(double x)
{double y;
y=sqrt(4.0-x*x);

六 return(y);

}

C


1.5 循环的嵌套
程 三种循环可互相嵌套 , 层数不限
序 外层循环可包含两个以上内循环 , 但不能相互交叉


嵌套循环的执行流程
嵌套循环的跳转 外循环
(1) while() (4) for( ; ;)
禁止: { …… { ……
从外层跳入内层 (3) while() do
while() 内循环
{ …… { ……
跳入同层的另一循环
{ ……
do }while();
}
{ …… ……
…...
}while( ); while()
} 内循环
……. { ……
(2) do } }
{ ……
…...
do
第 }
{ ……
六 }while( );
讲 …...
}while( );

C

言例 循环嵌套,输出九九表
ch6_12.c



计 /*ch6_12.c*/
j
#include"stdio.h"
1 2 3 4 5 6 7 8 9
i main()
1 2 3 4 5 6 7 8 9
{ int i,j;
2 4 6 8 10 12 14 16 18
for(i=1;i<10;i++)
3 6 9 12 15 18 21 24 27
printf("%4d",i);
…………
printf("\n---------------------------------------\n");
…..
for(i=1;i<10;i++)
9 18 27 36 45 54 63 72 81
for(j=1;j<10;j++)

六 printf((j==9)?"%4d\n":"%4d",i*j);

}

C
语 for(i=1;i<10;i++)
i=1
言 for(j=1;j<10;j++)
程 printf((j==9)?"%4d\n":"%4d",i*j);
序 假 (0)
i<10
设 真(非
计 0)
外循环 j=1

j<10 假 (0)
真(非
内循环 0)
printf

j++



讲 i++


C




2. 辅助控制语句
设 2.1 break 语句

功能:在循环语句和 switch 语句中 , 终止并跳
出循环体或开关体
说明:
break 只能终止并跳出最近一层的结构
break 不能用于循环语句和 switch 语句之外
的任何其它语句之中




C





计 while do

假 (0)
expr ……
真(非
0) break;
…… …...
break; while
真 ( 非 0)
…… expr
假 (0)




C

言 for



expr1
计 switch
假 (0)
expr2
真(非 expr
0)
case
……
const 1 const 2 const n default
break;
语句组 1 语句组 2 …... 语句组 n 语句组
…...
break; break; break; break;

expr3



C

言 例 break 举例: 输出圆面积 ,面积大于 100 时停止



#include”stdio.h”
计 #define PI 3.14159
main()
{
ch6_13.c
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);
讲 }
循 }
C

言 例 break 举例: 小写字母转 换成大写字 母 , 直至输 入非小写字 母字符

序 #include “stdio.h”


main()
{
char c;
ch6_14.c while(1)
{ c=getchar();
if(c>='a' && c<='z')
putchar(c-'a'+'A');
else
break;


}
讲 }

C
语 2.2 continue 语句


 功能:结束本次循环,跳过循环体中尚未执行的
序 for 语句,进行下一次是否执行循环体的判断
设  仅用于循环语句中

expr1 while
假 (0) do
expr2 假 (0)
expr
真 ( 非 0) 真(非
……
…… 0)
continue; ……
continue;
…... continue;
…...
while ……
真 ( 非 0)
expr

expr3 假 (0)


C
语例 求 输入的十个 整数中正数 的个数及其 平均值

程 /*ch6_15.c*/

设 ch6_15.c
#include “stdio.h”
计 main()
{ int i,num=0,a;
float sum=0;
for(i=0;i<10;i++)
{ scanf("%d",&a);
if(a<=0) continue;
num++;
sum+=a;
}

六 printf("%d plus integer's sum :%6.0f\n",num,sum);
讲 printf("Mean value:%6.2f\n",sum/num);
循 }
C

言 3. 程序举例

π 1 1 1
序 例用 ≈ 1 − + − + 公式求π的近似值,直到
设 4 3 5 7
计 最后一项的绝对值小于10 −6 为止

t=1,pi=0,n=1.0,s=1
当 |t|≥1e-6 分子: 1 , -1 , 1 , -1…
分母: 1 , 3 , 5 , 7 , ...
pi=pi+t
n=n+2
s=-s
t=s/n
pi=pi*4

六 输出 pi


C




设 周期为 2π 的函数 f(x) 在 [−π, π) 上的表达式为
π

−
1 −≤x<
0
f ( x) = ,

1 0≤
x<π
将 f(x) 展开成傅里叶级数是:
f (x) =4 [sin x +1 sin 3x +⋅⋅⋅+ 1 sin(2k −1)x +⋅⋅⋅] .
π 3 2k −1

函数图形




C #include"stdio.h"

言 #include"math.h"

序 main()
ch6_16.c
设 { int s;

double n,t,pi;
t=1; pi=0; n=1; s=1;
while((fabs(t))>=1e-6)
{ pi=pi+t;
n=n+2;
s=-s;
t=s/n;

第 }

pi=pi*4;

printf("pi=%10.8f\n",pi);

}
C

言例 求 Fibonacci 数列: 1 , 1 , 2 , 3 , 5 , 8 ,……的前 40 个数

序 F1 = 1 (n = 1)
设 F2 =1 ( n = 2)

Fn = Fn −1 + Fn − 2 (n ≥ 3)

1 1 2 3
f1=1,f2=1 5 8 13 21
34 55 89 144
for i=1 to 20 233 377 610 987
1597 2584 4181 6765
输出 f1,f2 10946 17711 28657 46368
75025 121393 196418 317811
f1=f1+f2 514229 832040 1346269 2178309
f2=f2+f1 3524578 5702887 9227465 14930352
第 24157817 39088169 63245986 102334155


C


程 #include"stdio.h"

设 main()
计 ch6_17.c
{ 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;

六 }

}

C

言 例:百钱买百鸡:鸡翁一值钱五,鸡母一

序 值钱 3 ,鸡雏三值钱一。百钱买百鸡,问


鸡翁、鸡母、鸡雏各几何?
cocks+hens+chicks=100;
5*cocks+3*hens+chicks/3=100;
cocks: 0-------19;
由题意可知 hens: 0-------33;
chicks: 0------100;

cocks 从 0 到 19 ,每取一个值,对 hens 的取


第 值范围内的每个值依次测试,而对 hens 的每一个取

讲 值又依次测试 chicks 的每一个值,看能找到哪些

hens 及 chicks 满足题意。
C
#include"stdio.h"

言 main()

序 {int i,j,k,m=0;
设 Ch6_18.c
for(i=0;i<=19;i++)

for(j=0;j<=33;j++)
for(k=0;k<=100;k++)
if(i+j+k==100&&5*i+3*j+k/3.0==100)
{printf("cocks:%-3d\thens:%-3d\tchicks:%-3d\n",i,j,k);
m++;
}
if(m==0)
第 printf("No Answer!\n");

讲 else
printf("Total %d answers!\n",m);

C




设 例 译密码

为了使电文保密
,可以按一定规律转
换成密码,收报人再
按约定规律将其译回
原文。如图所示,把
每个字母都转变成其
后的第四个字母,非
字母字符不变。




C

言 /*ch6_19.c*/

序 #include"stdio.h"
设 ch6_19.c
main()

{ char c;
while((c=getchar())!='\n')
{ if((c>='a'&&c<='z'-4)||(c>='A'&&c<='Z'-4))
c=c+4;
else if(c>'z'-4&&c<='z'||c>'Z'-4&&c<='Z')
c=c+4-26;
printf("%c",c); 运行结果如下
} :


printf("\n");
Hello,world!

Lipps,asvph!
}

C

言 /*ch6_20.c*/
程 ch6_20.c
序 #include"stdio.h"

main()

{ char c; 输入: M pszi csy!

while((c=getchar())!='\n') 解密: I love you!


{ if((c>='a'+4&&c<='z')||(c>='A'+4&&c<='Z'))
c=c-4;
else if(c>='a'&&c<'a'+4||c>='A'&&c<'A'+4)
c=c-4+26;
printf("%c",c);
第 }

讲 printf("\n");
}

C



例 : 猜数游戏的最简化版。
序 #incluce”stdio.h”

#define GOAL 39

main()
{
int i;
printf(" 请输入一个整数 \n");
do
{
scanf("%d",&i);
if(i>GOAL)
printf("%d 太大了 , 请再试一试。 \n",i);
else if(i<GOAL)
printf("%d 太小了,请再试一试。 \n",i);
第 else
六 printf(" 你猜中了。 \n");
讲 } while(i!=GOAL);
}

C


程 #include"stdio.h"
序 #include"stdlib.h"
设 main()
计 {
int i,GOAL,num=0;
randomize(); /* 初始化随机数发生器 */
printf("Please input a number from 0 to 99,or -1 to exit:\n");
GOAL=random(100);/* 产生 0 到 99 的随机数 */
do
{
scanf("%d",&i);
if(i==-1)
{
printf("\nExit game!");
break;
第 }
六 num++;


C





计 if(i>GOAL)
printf("%d is too big, input again \n",i);
else if(i<GOAL)
printf("%d is too samll, input again\n",i);
else
{ printf("OK!\n");
printf("You take %d times to pass!",num);
}
} while(i!=GOAL);
}



ch6_21.c

C
语 作业与 上机



• 求 100 以内的奇数和、偶数和。

计 • 输入全班 N 个人的分数,求出最高分、均分。
• 找出所有的水仙花数,所谓水仙花数是指一个三位
数,其各位数字的立方和正好等于这个数。例如:
153=13+53+33 。
• 一位卡车司机违反交通规则,肇事逃逸。当时有三
位目击者,都没有看清卡车的牌照号码,只记住了
牌照的某些特征:甲记住前两个数字是相同的,乙

记住牌照的后两位数字是相同的,丙是一位数学家
六 ,他说:“牌照号码肯定是一个四位数,并且这个

四位数恰好是一个整数的平方。”根据这些,你能
循 否正确判断出牌照号码?
C
语 5. 指出下列程序的运行结果:

程 #include”stdio.h” #include”stdio.h”

设 main() main()
计 {int x=1,i=1;
{int m=7,n=5,i=1;
for ( ;x<50;i++)
do
{if(x>=10) break;
{if(i%m==0)
if(x%2!=0)
{x+=3; if(i%n==0)
continue;} {printf(“%d\n”,i);
x-=1; break;}
} i++;}while (i!=0);
printf(“%d\n”,x); }
第 printf(“%d\n”,i);}

Вам также может понравиться