? 第一章 C语言概述
? 第二章 数据类型、运算符与表达式
? 第三章 最简单的 C程序设计
? 第四章 逻辑运算和判断选取控制
? 第五章 循环控制
? 第六章 数组
? 第八章 编译预处理
? 第九章 指针
? 第十章 结构体与共用体
? 第十二章 文件的基本操作
? 第十三章 位运算
§ 4.4 switch 语句 –––开关语句
问题, 当某一表达式有 n个取值,每一取值执行一
语句,则如果用内嵌 if十分繁锁,而用 switch简单,
一般形式, switch(表达式 )
{ case 常量表达式 1,语句 1
case 常量表达式 2,语句 2
?
case 常量表达式 n,语句 n
default, 语句 n+1
}
例, 根据成绩等级打印百分数段,
switch (grade)
{ case 'A',printf ("85~100\n");
case 'B',printf ("70~84\n");
case 'C',printf ("60~69\n");
case 'D',printf ("<60\n");
default,printf ("error\n");
}
? 根据表达式的取值,判断其与哪一个
常量表达式相等。如 =表达式 i,则自语
句 i开始执行,直到语句 n+1止。
? 若与所有常量表达式值不相等,则从
default后的语句开始执行。
功能,
例如, /*exp55.c*/
#include <stdio.h>
main()
{ char grade;
scanf("%c",&grade);
switch (grade)
{ case 'A':printf("85-100\n");
case 'B':printf("70-84\n");
case 'C':printf("60-69\n");
case 'D':printf("<60\n");
default:printf("Error\n");
}
}
运行结果,
A?
程序运行结果不在预料之中!
产生错误的原因, 没有完全起到分支作用。
85-100
70-84
60-69
<60
Error
switch (表达式 )
{ case 常表 1,语句 1;
break;
case 常表 2, 语句 2;
break;
… …
case 常表 n, 语句 n;
break;
default,语句 n+1;
}
一般形式为,
解决办法, 增加 break语句,使之跳出 switch结构。
修改程序为, /*exp56.c*/
#include <stdio.h>
main()
{ char grade;
scanf("%c",&grade);
switch (grade)
{ case 'A':printf("85-100\n");break;
case 'B':printf("70-84\n"); break;
case 'C':printf("60-69\n"); break;
case 'D':printf("<60\n"); break;
default:printf("Error\n");
}
}
1,常量表达式的值必须互不相等,否则会有
二异性。
2,case顺序无关紧要。
3,不一定非用 break不可,有时几种情况合并
执行一组语句。
注意
switch (grade)
{case 'A',
case 'B',
case 'C',printf(">60\n");
break;
case 'D',printf("<60\n");
break;
}
例如,
§ 4.5 程序举例
例 1,写一程序,输入年号,判断是否为闰年。
1,算法, 根据闰年的判断条件为下列条件之一,
? 当年号能被 4整除但不能被 100整除时,它为闰年。
? 当年号能被 400整除时,它为闰年。
设用变量 year表示年号,leap为待置值变量,当 year
为闰年,leap?1,否则 leap?0,
输入 year
year%4=0
year%100=0
leap?0
leap?1
yes A
No
No
yes
2,流程图
year%400=0
leap?1
leap=0
打印非闰年 打印是闰年
结束
leap?0
yes
No yes
No
A
3,程序, #include <stdio.h>
main ( )
{ int year,leap;
scanf("%d",&year);
if (year%4= =0)
{ if (year%100= =0)
{ if (year%400= =0)
leap=1;
else
leap=0; }
else
leap=1;}
else
leap=0;
if (leap)
printf("%d is",year);
else
printf("%d is not",year);
printf ("a leap year\n");
}
运行情况如下,
第二次,2000 ?
2000 is a leap year
第一次,1989 ?
1989 is not a leap year
if ( ( year%4=0)&& year%100!=0) |
(year%400= =0))
leap=1;
else leap=0;
注,上述条件也可用一个逻辑表达式表示为
§ 5.1 概述
前面已介绍了顺序结构,选择结构,本章
介绍循环结构。
如, sum=1+2+3+…+100;,i100
1i
?
?
实际问题, 一组重复执行的语句。
可用循环结构解决。
C语言一般采用三种形式循环
1,while 语句
2,do …while 语句
3,for语句
另, 用 if语句与 goto语句的结合也可构成循环,
§ 5.2 goto语句及与 if语句构成循环
1,goto语句
2,与 if构成循环,
例, 求
10021
1 0 0
1
?????
?
?
i
i
#include <stdio.h>
main ( )
{ int i,sum=0;
形式, goto标号 ;
功能, 无条件转向标号处。
标号,用标识符命名。
i=1;
loop:if (i<=100)
{sum=sum+i;
i++;
goto loop;}
printf(”sum=%d",sum);
}
运行结果如下,
sum=5050
#include <stdio.h>
main ( )
{ int sum=0,i=0;
loop,sum=sum+i;
i + +;
if (i<=100) goto loop;
printf ("sum=%d",sum);
}
上面的程序相当于当型循环,可改为直到型,
建议,尽可能的不用 goto语句,以免破坏程
序的结构化。
§ 5.3 while语句
1,形式, while (表达式 )
语句
2,执行过程, 先判断表达式的值。若 ?0.则执行其后
面的语句,否则 while执行完毕。
专门的 当型 循环语句 ––while语句
3,流程图,
表达式
语句
?0
=0
下一语句
将上述例子用 while语句写出
while (i<=100)
{ sum+ =i;
i++;
}
? 语句中应有使表达式 =0的语句。
否则会出现无限循环 –––"死 "循环。
注, ?若 while后面的语句 为复合语句,必须加 { }
? 语句有可能一次也不执行
§ 5.4 do … while语句
一种专门的,直到型” 循环语句。
2,执行过程, 先执行语句,再判表达式的值,若 ?0,再
执行语句,否则结束循环
3,流程,
语句
表达式
?0
=0
1,形式, do语句 while(表达式 );
#include <stdio.h>
main ( )
{ int i,sum=0;
i=1;
do
{sum=sum+i;
i++;
}
while (i<=100);
printf("%d",sum);
}
程序如下,
注, 1,do····while结构的作用与 while基本
相同。
2、语句至少要执行一次。
§ 5.5 for语句
1,形式
?、计算初始表达式的值。
?、判断条件表达式,若条件表达式的值 ?0,则执行语句。
若 条件表达式的值 =0,则跳出循环体。
?、计算循环表达式。
?、转到第 ?步。
一种形式更为灵活的循环语句。
2.执行过程
for(初始 表达式 ;条件表达式 ; 循环表达式 )
语句
3,流程, 计算表达式 1
求表达式 2值
语句
计算表达式 3
结束 for语句
=0(假 )
?0(真 )
用 for语句重写上述例子,
for用 while代替的流程,
表达式 1;
while(表达式 2)
{ 语句
表达式 3;
}
for ( i=1; i<=100; i++)
sum+=i;
for语句完全可以用 while代替,
但 for直观、简单、方便。
4,for语句的几种特例
例, 任意输入两个整数 a,b,求 ??
?
bi
ai
i
#include <stdio.h>
main ( )
{ int i,j,a,b,sum;
printf ("please input two number!\n");
scanf ("a=%d,b=%d",&a,&b);
i=a; j=b; if (a>b) {i=b; j=a;}
for (; i<=j; i++)
sum=sum+i;
printf (" \n sum=%d",sum);
}
? 可以省略初始表达式,但须保留分号 ;且在 for之前必须给
循环变量赋值 ;
? 条件表达式一般不可省略,否则为无限循环
相当于, while (1)
{ sum=sum+i;
i++;
}
例, for (i=1; ; i++) sum=sum+i;
相当于条件永真、永不为 0,若用 while表示
? 循环表达式亦可省略,但在循环体中必须有语句
来修改循环变量,以使条件表达式在某一时刻
为 0而正常结束循环。
例, for (sum=0,i=1;i<=100;) /* 没有循环表达式 */
{ sum=sum+i;
i++;
}
? 若同时省略 初始表达式,和 循环表达式,则相当
于 while语句。
相当于 while (i<=100)
{sum+= i;
i++;
}
例, for (; i<=100;) {sum+=i; i++;}
? 三个表达式均省略 即 for(;;)语句则相当于 while(1)
语句,为无限循环。
?初始表达式, 循环表达式 可以是逗号表达式,以
使循环变量值在修改时可以对其它变量赋值。
如, for (sum=0,i=1; i<=100; i++,i++)
相当于,sum=0;
for (i=1; i<=100; i=i+2)
? 条件表达式可以是关系表达式,也可以是数值表
达式或字符表达式。只要值 ?0.即执行循环体,
例, for (i=0; (c=getchar( ))!='\n'; i+=c);
条件表达式
§ 5.6 循环的嵌套
与其它语言一样,当循环体中又包含了另一个完
整的循环语句时 –––嵌套。
C语言 有三种循环语句,均可以相互嵌套,
例 1,while ( )
{…
while ( )
{…
}
}
例 2,for (; <条件表达式 >;)
{…
while ( ) { }
do
{ } while ( );

}
均为正确的嵌套
但,
while ( )
{ …
while ( )
{
}…
}
for (; ; )
{ for (; ; )
{…
}
}
不能理解为正确的形式。但要注意语句的
包含关系。
§ 5.7 几种循环的比较
1,对于同一问题,三种循环可相互替代。但不
要用 goto语句。
2,for循环功能强于 while和 do…while 。 但若不
是明显地给出循环变量初终值 (或修改条件 ),
则应用 while 或 do …while 。 以增强程序的结
构化和可读性。
3,要防止无限循环 ––死循环。
4,循环过程中,为了结束本次循环或跳出整个
循环。分别要用到 continue和 break语句。
§ 5.8 break语句和 contiune语句
问题, 计算圆的面积 ?r2,半径取 1,2,3,4…,
当面积 >100时结束。
5.8.1 break语句 (作用,从 循环体中退出 )
pi =3.14159;
for( r=1; r<=10; r++)
{ area=pi?r?r;
if (area>100) break;
}
printf ("%f",area);
}
注意, break只能用于 循环语句 和 switch语句。
程序段,
5.8.2 continuce语句
程序一:不用 continue语句,
#include <stdio.h>
main( )
{ int n;
for (n=100; n<200; n++)
if (n%3!=0) /*n不能被 3整除 */
printf("%d",n);
}
例, 编写程序,打印 100~200中不能被 3整除的数。
作用:结束 循环。
程序二:使用 continue语句,
main ( )
{ int n;
for (n=100; n<=200; n++)
{ if (n%3= =0) /*n能被 3整除 */
continue;
printf ("%d",n);
}
}
§ 5.9 程序举例
例 1,求 Fibonacci数例, 1,1,2,3,5,8,… 前 40个数。
规律, F1=1,F2=1
Fn=Fn – 1 + Fn – 2 (n>2)
程序要点,
? 每输出 4个数时换行。
? f1=f1+f2;
f2=f1+f2; 交替的结果正好为一序列
程序如下,
/*exp61.c*/
#include <stdio.h>
main ( )
{ long int f1,f2;
int i;
f1=1; f2=1;
for (i=1; i<=40; i++)
{ printf(%12ld %12ld ",f1,f2);
if (i%2= =0)
printf("\n ");
f1=f1+f2;
f2=f2+f1;
}
}
f1=1,f2=1
for i=1 to 40
输出 f1,f2
f1=f1+f2
f2=f2+f1
运行结果为,
1
5
34
233
1597
10946
75025
514229
3524578
24157817
1
8
55
377
2584
17711
1211393
832040
5702887
39088169
2
13
89
610
4181
28657
196418
1346269
9227465
63245986
3
21
144
987
6765
46368
317811
2178309
14930352
102334155
? 判一个数 m是否为素数的方法,
? 每打印 10个数,换一次行。
m当用 2,3,… 的整数去除它时均不能除
尽,则为素数。
例 2,求 100~200的素数,
int m,k,i,n=0;
for (m=101; m<=200; m=m+2)
{if ( n%10= =0)
printf("\n");
k=sqrt(m);
for (i=2; i<=k;i++)
if (m%i= =0) break;
if (i>=k+1)
{ printf("%d ",m);
n=n+1;
}
}
}
/*exp62.c*/
#include <math.h>
#include <stdio.h>
main ( )
{
程序如下,
101 103 107 109 113 127 131 137 139 149
151 157 163 167 173 179 181 191 193 197
199
运行结果如下,