内容正文:
《C语言程序设计》
(清华大学出版)
同步教学
第 5 章
C语言的控制结构
……
版权所有:KOPPT WWW.KOPPT.CN
第5章 C语言的控制结构
版权所有:KOPPT WWW.KOPPT.CN
3
C语言的控制结构用来控制语句的执行顺序。
在程序执行过程中,程序语句大多是按照其书写顺序依次执行的,这称为顺序结构。但是,为了能处理某些复杂的问题,程序也需要根据不同条件选择执行不同的程序段,或者重复执行某些特定的程序段,其前者称为分支结构,后者称为循环结构。
1.顺序结构
在顺序结构中,程序是按照语句的书写顺序依次执行的。
2.分支结构
在分支结构中,程序根据判断条件是否成立,来选择执行不同的程序段。
3.循环结构
在循环结构中,程序根据判断条件是否成立,来决定是否重复执行某个程序段。
5.1 算法与程序
5.2 顺序结构
5.3 选择结构
5.4 循环结构
5.4 循环结构
5.4.1 while语句
while ( 表达式 ) 语句
说明:
循环体有可能一次也不执行
循环体可为任意类型语句:
复合语句、简单语句、空语句
下列情况,退出while循环
判断条件不成立(为零)
循环体内遇break
无限循环: while(非0值)
版权所有:KOPPT WWW.KOPPT.CN
4
While语句的一般形式
【例5.9】求1到100之和,即1+2+3+…+100
#include <stdio.h>
int main()
{
int i,sum;
i=1; sum=0;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("%d",sum);
return 0;
}
变量初值
循环变量值改变,使循环条件向”假”变化.
循环条件
循环体
版权所有:KOPPT WWW.KOPPT.CN
以此例延伸,讲解1+3+5+……
2+4+……
……
5
i=10,sum=9
i=9,sum=9
i=2,sum=1
运行出现错误
A
B
C
D
提交
程序的运行结果是( ).
main()
{ int i=1,sum=0;
while(i<10)
{
sum=sum+1;
i++;
}
printf("i=%d,sum=%d",i,sum);
}
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
程序的运行结果是().
main()
{ int i=1,sum=0;
while(i<10)
sum=sum+1;
i++;
printf("i=%d,sum=%d",i,sum);
}
i=10,sum=9
i=9,sum=9
i=2,sum=1
运行出现错误
A
B
C
D
提交
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
7
在C语言中,为了结束由while语句构成的循环,while后一对圆括号中表达式的值应该为( ).
0
1
True
非0
A
B
C
D
提交
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
8
5.4.2 do-while语句
do 语句 while ( 表达式 ) ;
特点:先执行循环体,后判断表达式
说明:循环体语句至少执行一次
表达式
语句
假
真
版权所有:KOPPT WWW.KOPPT.CN
do-While语句的一般形式
使用do-while求1到100之和,即1+2+3+…+100
#include <stdio.h>
int main()
{
int i,sum;
i=1; sum=0;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("%d",sum);
return 0;
}
#include <stdio.h>
int main()
{
int i,sum;
i=1; sum=0;
do
{
sum=sum+i;
i++;
} while(i<=100);
printf("%d",sum);
return 0;
}
版权所有:KOPPT WWW.KOPPT.CN
以下叙述正确的是().
do-while语句构成的循环不能用其它语句构成的循环来代替.
do-while语句构成的循环只能用break语句退出.
用do-while语句构成的循环,在while后的表达式为非零时结束循环.
用do-while语句构成的循环,在while后的表达式为零时结束循环
A
B
C
D
提交
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
【例5.10】输入一个整数,计算它是几位数。如输入32564,输出5。
#include<stdio.h>
int main()
{ long x;
int n=0;
printf("input x=");
scanf("%ld",&x);
do
{ n++;
x/=10;
} while( );
printf("output n=%d
",n);
return 0;
}
分析:
设 x=32564
若x=x/10, 则 x=3256
若x=x/10, 则 x=325
若x=x/10, 则 x=32
若x=x/10, 则 x=3
若x=x/10, 则 x=0
x!=0
版权所有:KOPPT WWW.KOPPT.CN
5.4.3 for语句
for(表达式1;表达式2;表达式3) 语句
后续语句
0
非0
版权所有:KOPPT WWW.KOPPT.CN
for 语句的一般形式
若i和sum为整型变量,则以下程序的运行结果是( ).
sum=0 ;
for(i=2;i<10;i=i+2)
sum=sum+i;
printf("%d",sum);
20
22
18
19
A
B
C
D
提交
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
对 for(表达式1; ;表达式3) 可理解为( ).
for(表达式1;0;表达式3)
for(表达式1;1;表达式3)
for(表达式1;表达式1;表达式3)
for(表达式1;表达式3;表达式3)
A
B
C
D
提交
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
若i为整型变量,则以下循环执行次数是(). for(i=2;i==0;) printf("%d",i--);
无限次
0次
1次
2次
A
B
C
D
提交
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
【例5.11】输入10个数,输出其中的最大值。
#include <stdio.h>
int main()
{ float x,max;
int i;
printf("input first number:
");
scanf("%f",&x);
max=x;
for(i=1;i<=9;i++)
{ scanf("%f",&x);
if(x>max) max=x;
}
printf("max=%f
",max);
return 0;
}
版权所有:KOPPT WWW.KOPPT.CN
5.4.6 break语句
提前结束循环
#include<stdio.h>
int main()
{ int i;
for(i=100;i<=300;i++)
if(i%17==0) break;
printf("i=%d
",i);
return 0;
}
【例5.12】找出100~300之间第一个能被17整除的数。
运行结果:
i=102
版权所有:KOPPT WWW.KOPPT.CN
while()
{
…
for()
{
…
break;
}
…
}
注意:
1.break语句只能用于switch语句或循环语句。当用于循环语句时,break语句通常与if语句配合使用。
2.当用于嵌套的循环结构时,break语句只能跳出(或终止)包含这条break语句本身的最内层循环。例如
版权所有:KOPPT WWW.KOPPT.CN
5.4.5 continue语句
结束本次循环,开始下一次循环
#include <stdio.h>
int main()
{ int i , n=0;
float x,y=1;
for(i=1;i<=10;i++)
{ scanf("%f",&x);
if(x==0) continue;
y*=x; n++;
}
printf("y=%.2f, n=%d
",y,n);
return 0;
}
【例5.13】输入10个数,计算并输出这10个数中非0数据的乘积,并统计和输出非0数据的个数。
版权所有:KOPPT WWW.KOPPT.CN
以下程序的运行结果是().
main()
{
int n;
for(n=1;n<=10;n++)
{
if(n%3==0) continue;
printf("%d",n);
}
}
12457810
369
12
1234567890
A
B
C
D
提交
单选题
1分
版权所有:KOPPT WWW.KOPPT.CN
5.4.6单重循环程序举例
#include<stdio.h>
int main()
{ long f1=1,f2=1;
int i;
for(i=1;i<=10;i++)
{ printf("%10ld%10ld",f1,f2);
if(i%2==0)printf("
");
f1=f1+f2;
f2=f2+f1;
}
return 0;
}
【例5.14】求Fibonacci数列前20项。该数列如下:
1,1,2,3,5,8,13,21,…
版权所有:KOPPT WWW.KOPPT.CN
【例5.15】输入一个大于1的自然数,判断该数是否为素数,如果是素数,输出“yes”,否则输出“no”。
#include <stdio.h>
int main()
{ long n;
int i;
printf("input n:");
scanf("%ld",&n);
for(i=2;i<=n-1;i++)
if(n%i==0) break;
if(i==n) printf("yes
");
else printf("no
");
return 0;
}
分析:
设n为大于1的自然数
如果n不能被2,3,…,n-1整除,则n是素数。
版权所有:KOPPT WWW.KOPPT.CN
#include <stdio.h>
#include <math.h>
int main()
{ long n,k;
int i;
printf("input n:");
scanf("%ld",&n);
k=(int)sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0) break;
if(i>k) printf("yes
");
else printf("no
");
return 0;
}
若能被整除
则存在使:
若为和中的较小者,则
则:
版权所有:KOPPT WWW.KOPPT.CN
【例5.16】按下面的幂级数展开式计算e的值。要求误差小于10-5。
#include <stdio.h>
int main()
{ float t=1,e=1;
int i=0;
while(t>=1e-5)
{
i++;
t=t*1.0/i;
e=e+t;
}
printf("e=%.5f
",e);
return 0;
}
分析:
设t表示一般项,
e表示和
t=1, e=1
t=t/1 ,e=e+t,
t=t/2 ,e=e+t
t=t/3 ,e=e+t,
t=t/4 ,e=e+t
……
直到 t<10-5
s=1!+2!+3!+……+n!
s=0;
t=1;
for(i=1;i<=n;i++)
{
t=t*i;
s=s+t;
}
版权所有:KOPPT WWW.KOPPT.CN
25
5.4.7 多重循环结构
#include <stdio.h>
int main()
{int i , j;
for(i=0;i<3;i++) /* 外循环 */
{ printf("i=%d: ",i);
for(j=0;j<4;j++) /* 内循环 */
printf("j=%-3d",j); /* 内循环的循环体 */
printf("
");
}
return 0;
}
例 5.17 该程序用于演示嵌套循环的执行过程。
运行结果如下:
i=0:
i=1:
i=2:
j=0 j=1 j=2 j=3
j=0 j=1 j=2 j=3
j=0 j=1 j=2 j=3
版权所有:KOPPT WWW.KOPPT.CN
26
【例5.18】输出1~100中所有的素数。
#include <stdio.h>
#include <math.h>
int main()
{ int n, i, k;
for(n=2; n<=100; n++)
{ k=sqrt(n);
for(i=2; i<=k; i++)
if(n%i==0) break;
if (i>k) printf("%5d",n);
}
return 0;
}
分析:
for(n=2; n<=100; n++)
{ 判断n是否为素数
若n是素数,则输出n
}
版权所有:KOPPT WWW.KOPPT.CN
【例5.18】每行10个,输出1~100中所有的素数。
#include <stdio.h>
#include <math.h>
int main()
{ int n, i, k, count=0;
for(n=2; n<=100; n++)
{
k=sqrt(n);
for(i=2; i<=k; i++)
if(n%i==0)
break;
if (i>k)
{
printf("%5d",n);
count++;
if(count%10==0)
printf("
");
}
}
return 0;
}
分析:
for(n=2; n<=100; n++)
{ 判断n是否为素数
若n是素数,则输出n
}
版权所有:KOPPT WWW.KOPPT.CN
【例5.19】编写程序输出如下图形:
*
***
*****
*******
*********
#include <stdio.h>
int main()
{ int i,j;
for(i=1;i<=5;i++)
{
for(j=1; j<=5-i; j++)
putchar(' ');
for(j=1; j<=2*i-1; j++)
putchar('*');
putchar('
');
}
return 0;
}
空格个数:
第1行:4
第2行:3
第3行:2
第4行:1
第5行:0
第1行:1
星号个数:
第2行:3
第3行:5
第4行:7
第5行:9
第 i 行:5-i
第 i 行:2i-1
版权所有:KOPPT WWW.KOPPT.CN
#include <stdio.h>
#include <conio.h>
main()
{
int i,n,sum;
sum=0;
/**********FILL**********/
_____
/**********FILL**********/
for(i=1; _____ ;i++)
/**********FILL**********/
if(_____)
if(i%2==0)
{
sum=sum+i;
n++;
printf("%6d",i);
/**********FILL**********/
if(_____)
printf("
");
}
printf("
total=%d",sum);
}
功能:以每行5个数来输出300
以内能被7或17整除的偶数,并
求出其和。
版权所有:KOPPT WWW.KOPPT.CN
(4)程序填空:程序的功能是计算2+22+222+2222+…+22…2(共n项)的和。
提示:2+22+222+2222+…+22…2=2*(1+11+111+1111+…+11…1)。
程序如下:
31
#include <stdio.h>
int main()
{ long s=1,t=1;
int n,i;
scanf("%d",&n);
for( i=1;i<n;i++)
{ t=t*10+1;
【1】
}
【2】
printf("sum=%ld
",s);
return 0;
}
版权所有:KOPPT WWW.KOPPT.CN
#include <stdio.h>
main()
{
long int f,s;
int i,j,n;
/**********FILL**********/
_____
scanf("%d",&n);
/**********FILL**********/
for(i=1;i<=n; _____ )
{
f=1;
/**********FILL**********/
for(j=1; _____;j++)
/**********FILL**********/
_____
s=s+f;
}
printf("n=%d,s=%ld
",n,s);
}
功能:下面的程序是求1!+3!+5!+……+n!的和。
版权所有:KOPPT WWW.KOPPT.CN
(3)程序填空:程序的功能是输出6至10000之间的亲密数对,填空将程序补充完整。若a、b是亲密数对,则a的因子和等于b、b的因子和等于a且a不等于b。例如:
220: 1+2+4+5+10+11+20+22+44+55+110=284
284: 1+2+4+71+142=220
程序如下:
#include <stdio.h>
int main()
{ int a,b,c,i;
for(a=6;a<=10000;a++)
{ b=1;
for(i=2;i<=a/2;i++) if(【1】) b+=i;
【2】
for(i=2;i<=b/2;i++) if(b%i==0) c+=i;
if(【3】&&a!=b) printf("%d %d
",a,b);
}
return 0;
}
版权所有:KOPPT WWW.KOPPT.CN
谢谢观看
34
$$