nullnull第3章 C语言程序的控制结构 3.1 结构化程序设计
3.2 顺序结构
3.3 分支结构
3.4 循环结构
3.5 辅助语句
3.6 应用举例
习题3 null3.1 结构化程序设计 3.1.1 结构化程序设计的三种基本结构
结构化程序设计的基本思想,是用顺序结构、分支结构和循环结构等三种基本结构来构造程序;限制使用无条件转移语句(goto语句)。在结构化程序设计中,可采用N-S结构化
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图。 null 1. 顺序结构
如图3-1所示。先执行A操作,再执行B操作,两者之间是顺序执行的关系。 null图 3-1 顺序结构
(a) 流程图; (b) N-S图 null 2. 选择结构
如图3-2所示。 p代表一个判断条件, 当判断条件成立(或为“真”)时, 执行A操作; 判断条件不成立(或为“假”)时, 执行B操作。 每次执行只能选择A或B之一。 null图 3-2 选择结构
(a) 流程图; (b) N-S图 null 3. 循环结构
C语言提供了两种循环结构。
(1) 当型循环结构:如图3-3所示。 当判断条件p为“真”时, 重复执行A操作, 直到判断条件p为“假”时, 跳出循环。 null图 3-3 当型循环结构
(a) 流程图; (b) N-S图 null (2) 直到型循环结构:如图3-4所示。 先执行A操作,再判断p是否为“真”,如果p为“真”,则重复执行A操作,直到p为“假”时跳出循环。 null图 3-4 直到型循环结构
(a) 流程图; (b) N-S图 null3.1.2 C语言的函数结构
结构化程序设计采用模块化程序结构,使用自顶向下, 逐步细化的设计方法。 C语言的程序结构是模块化结构,C语言的模块化结构是由函数组合而成的。例1.1和例1.2已经介绍了这一点。
C语言中,函数分为系统提供的库函数和用户构造的自定义函数。系统提供的库函数,用户可以直接引用。用户的自定义函数又分为带参数的函数和不带参数的函数,本章主要讨论不带参数的函数。 null1. 不带参数的函数结构的一般形式
函数名()
{数据说明部分;
执行语句部分;
} null 2. 函数结构的说明
(1) 函数名的构成应符合标识符的规定。
(2) 大括号中的内容称为函数体,函数体由 1 条或多条数据说明语句、可执行语句组成。 null3.2 顺序结构 3.2.1 赋值语句
赋值语句是由赋值表达式加上一个分号构成的。 其一般形式如下:
赋值表达式;
例如:
a+=b;
a=10*b+c;
均为正确的赋值语句。 null 在使用中,要注意区分赋值表达式与赋值语句的不同, 赋值表达式可以被包含在其它表达式中,而赋值语句则不允许。 例如:
(a=b)*100
表示先将b的值赋给a, 再计算a*100的值。 而:
(a=b;)*100
则是错误的, 因为表达式中不能包含赋值语句。 null 3.2.2 复合语句
1. 复合语句的一般形式
复合语句是由大括号括起的多个语句构成的, 其一般形式如下:
{
执行语句组;
} null 2. 复合语句的使用说明
(1) 复合语句在语法上和一个单一语句相同。 因此, 在C语言程序中, 凡是单一语句
可以存在的位置都可以使用复合语句。
(2) 复合语句可以嵌套。 即: 在复合语句内部可以有其它复合语句。
(3) 函数体本身也可以看作是一个复合语句。
在程序中, 复合语句一般用来表示一种基本结构, 如选择结构的两个分支一般是两个复合语句;循环结构的循环体一般也是一个复合语句。 null3.2.3 空语句
在C语言程序中只有一个分号的语句, 称为空语句, 其一般形式如下:
;
空语句在语法上占据一个语句的位置,但是它不具备任何操作功能。 空语句在程序中经常出现在循环体中,用以实现延时功能。 null3.2.4 注释行
注释行的一般形式如下:
/*注释内容*/
其中,注释内容是对程序段或程序行的注释说明。注释行可以作为单独的一行出现在程序中, 也可以出现在某个语句之后。 null 例3.1 已知鸡兔总头数为h,总脚数为f,求鸡兔各有多少只。
(1) 列出方程:设有x只鸡、y只兔,则 x+y=h
2x+4y=f (2) 求解公式: 用消元法求得: null(3) 编写程序如下:
main()
{int h,f,x,y;
h=16;
f=40;
x=(4*h-f)/2;
y=(f-2*h)/2;
printf("head=%d feet=%d\n",h,f);
printf("cock=%d rabbit=%d\n",x,y);
}
程序的运行结果如下:
head=16 feet=40
cock=12 rabbit=4 null 例 3.2 编写程序,计算圆锥体的体积。
设r为底面半径,h为锥高,v为圆锥体体积,则计算公式为
v=3.14×r×r×h/3
程序如下:
main()
{ float v,r,h;
printf("y,h=");
scantf("%f%f",&r,&h);
v=3.14*r*r*h/3;
printf("v=%f\n",v);
} null3.3 分支结构 3.3.1 关系运算符和关系表达式
所谓关系运算实际上是比较运算。关系运算将两个数值进行比较,并判断比较的结果是否符合规定的条件。 null表 3-1 关系运算符 null 1. 关系运算符
表3-1列出了C语言的所有关系运算符。
关系运算符的优先级:
(1) 表3-1中前四种运算的优先级相同, 后两种也相同, 但前四种高于后两种。
(2) 关系运算符的优先级低于算术运算符。
(3) 关系运算符的优先级高于赋值运算符。
(4) 关系运算符采用“从左至右”的结合方向。 null 2. 关系表达式
关系运算完成的是对两个量的比较与判断。 例如:
a*b
a 为真, 表达式的值为1; null (b>a)==c 为真, 表达式的值为1, 因为b>a的值为1(真),等于c的值;
a>b+c 为假,表达式的值为0。
如果有以下赋值表达式,则
d=a>b d的值为0;
e=abb的值为0, 而0小于c。null 关系表达式常常作为判断条件应用于条件语句中。
虽然关系表达式在形式上与
数学
数学高考答题卡模板高考数学答题卡模板三年级数学混合运算测试卷数学作业设计案例新人教版八年级上数学教学计划
中的不等式、 等式相同, 但含义并不一样。 例如,a<0,在数学中表示a<0,是确定的; 但在C语言中,只是判断a是否小于0,是不确定的。 null 3.3.2 逻辑运算符和逻辑表达式
关系表达式所表示的是一些简单的判断条件,而对于:
a3&&2‖8<4-! 0
↑↑ ↑↑↑ ↑
① ⑤ ⑥④③ ②
该表达式的值为1。 运算顺序为圆圈内数字标明的优先顺序。 null 实际上,逻辑运算符两侧的不等式,不但可以是0和1, 或者是0和非0的整数,也可以是任何类型的数据。例如,可以是字符型、 实型或指针型等。系统最终以0或非0来判断它们属于“真”或“假”。 例如:
′a′&&′b′
该逻辑表达式的值为1。 因为′a′和′b′的ASCII码均不为0。 null图 3-5 if语句的执行过程
(a) 流程图; (b) N-S图 null3.3.3 条件分支结构if-else
条件分支结构是选择结构的一种形式。它的流程控制方式是:首先测试判断条件,根据判定的结果(真或假)决定执行给定的两种操作之一。
1. if语句的一般形式
C语言的条件分支结构主要有三种基本形式。
(1) if结构的一般形式:
if(表达式)
语句;
其执行过程如图3-5所示。 举例如下。 null例如:
if(xb && a>c && a>d)
printf(″a=%d\n″,a);
else if(b>c &&b>a && b>d)
printf(″b=%d\n″,b);
else if(c>a && c>b && c>d)
printf(″c=%d\n″,c);
else
printf(″d=%d\n″,d); null图 3-6 if-else if结构的执行过程 null图 3-6 if-else if结构的执行过程 (b) N-S图 null其执行过程如图3-7所示。 图 3-7 if-else if结构的示例 null 2. 条件分支结构的使用说明
(1) 圆括号中的表达式一般为关系表达式或逻辑表达式, 也可以是常量或变量。 例如:
if(x)
printf(″%d\n″,x);
是正确的,它相当于
if(x! =0)
printf(″%d\n″,x); null(2) 语句部分既可以是单个语句, 也可以是复合语句。
例 3.3 计算整数i的立方值。
main()
{ int i;
printf(″Enter integer i:″);
scanf(″%d″,&i);
if(i) /*当i的值非0时计算i3*/
{ i=i*i*i;
printf(″i*i*i=%d\n″,i);
}
else /*当i的值为0时输出0*/
printf(″i*i*i=0\n″); null程序的运行结果如下:
Enter integer i:10
i*i*i=1000
} null 例3.3程序
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
输入一个整数i,当i不为0时, 执行if下的复合语句,显示i的立方值;否则,执行else下的单语句, 显示i的立方值为0。 null 3. if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套。 一般形式如下:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
else
if(表达式3)
语句3;
else
语句4;
其执行过程如图3-8所示。 null图 3-8 if语句的二重嵌套
(a) 流程图; (b) N-S图 null图 3-8 if语句的二重嵌套
(a) 流程图; (b) N-S图 null例3.4 求符号函数: 编写程序, 输入一个x值,输出相应的y值。 nullmain()
{ float x;
int y;
printf(″x=″);
scanf(″%f″,&x)
if(x>0)
y=1; /*当x大于0时, y赋值为1*/
else if(x<0)
y=-1; /*当x小于0时, y赋值为-1*/
else
y=0; /*否则(当x等于0时),y赋值为0*/
printf(″y=%d\n″,y);
} null程序的运行结果如下:
x=15.8
y=1 在if语句嵌套使用时,包含的else和if的个数可以相同, 也可以不同。个数相同时,else和if一一对应;个数不同时, else总是和它上面离它最近的、 并且还没有配对的if配对。 例如,例3.4中,第一个else(外层)与第一个if(外层)配对,第二个else(内层)与第二个if(内层)配对,这是正确的。 如果将例3.4的执行部分改写成如下形式: nully=-1;
if(x! =0)
if(x>0)
y=1;
else
y=0; null 编程者把else写在与第一个if(外层if)同一列上, 希望与第一个if对应。但实际上, else与第二个if(内层)配对, 因为它们相距最近。
为实现编程者的设计意图,可以适当使用大括号,以确定其对应关系。上面的程序可改写为 y=-1;
if(x! =0)
{ if(x>0)
y=1;
}
else
y=0;
也是正确的。 null 初学者在不熟练的情况下, 可以在if和else中都使用大括号,以便于区分配对。即
if(表达式1)
{ if(表达式2)
语句1;
else
语句2;
}
else
{ if(表达式3)
语句3;
else
语句4;
} null 4. 条件运算符和条件表达式
(1) 使用条件运算符的条件:在if语句中, 如果表达式为“真”或“假”时,都只执行一个赋值语句并且给同一个变量赋值时,可以使用条件运算符。例如:
if(x>y)
a=x;
else
a=y;
可以用条件表达式表示如下:
a=x>y?x:y
其执行过程为:当x>y条件为真时,a取x值;否则a取y值。其中x>y? x:y为条件表达式。 null (2) 条件表达式的一般形式:
表达式1?表达式2: 表达式3
(3) 条件表达式的执行过程:首先计算表达式1,如果非0(真)则计算表达式2, 表达式2的值作为条件表达式的值; 如果表达式1的值为0(假),则计算表达式3, 表达式3的值作为条件表达式的值。如图3-9所示。 null图 3-9 条件表达式的执行过程 null (4) 条件表达式的优先级:条件运算符有三个操作数,称三目运算符。它是C语言中唯一的一个三目运算符。条件运算符优先于赋值运算符, 但低于关系运算符和算术运算符。 例如:
x=a>0?a*10:a*(-10)
运算顺序相当于:
x=(a>0)?(a*10):(a*(-10))
所以括号可以省略不写。 null条件运算符的结合方式为“从右至左”。 例如:
x>y?x:y>z?y:z
运算顺序相当于
x>y?x:(y>z?y:z)
如果x=1、 y=2、 z=3, 则条件表达式的值为3。 null3.3.4 开关分支结构switch-case
与if语句类似,开关分支结构也是选择结构的一种形式。 switch语句与if语句的区别在于: 一个if语句只能对一个判断条件进行处理,而一个switch语句可以处理多个判断条件;一个if语句一般只有两个程序分支,而一个switch语句可以控制多个程序分支。 null1. switch语句的一般形式
switch(表达式)
{
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
…
case 常量表达式n:语句n;break;
default: 语句n+1;
} null 2. switch语句的执行过程
首先计算表达式的值,当表达式的值等于常量表达式1的值时,执行语句1;当表达式的值等于常量表达式2的值时,执行语句2; ……;当表达式的值等于常量表达式n的值时,执行语句n;否则执行default后面的语句n+1。当执行到break语句时跳出switch结构。如图3-10所示。 null图 3-10 swith语句的执行过程 null例3.5 根据考试成绩,打印等级分。 null程序如下:
main()
{ int x;
printf(″x=″);
scanf(″%d″,&x); /*输入成绩*/
switch(x/10)
{ case 10:
case 9:printf(″A\n″);break;
case 8:printf(″B\n″);break;
case 7:
case 6:printf(″C\n″);break;
default:printf(″D\n″);〖ZK)〗
}
} null程序的运行结果如下:
x=98
A 例3.5程序中,case 10与case 9共用一组语句,case 7与case 6共用一组语句。 null 3. switch语句的使用说明
(1) switch后面的表达式可以是整型或字符型表达式, 也可以是枚举型数据(详细内容见第6章)。 如果表达式的值为实型数,则自动舍弃小数部分。
(2) case和default可以互换位置,不影响程序的执行结果。 但习惯上把default放在case的后面。 null例如, 例3.5中的switch语句改写为下面的形式仍然是正确的。
switch(x/10)
{ default:printf(″D\n″);break;
case 10:
case 9:printf(″A\n″);break;
case 8:printf(″B\n″);break;
case 7:
case 6:printf(″C\n″);
} null (3) 每一个case后的常量表达式的值必须是互异的, 否则会出现互相矛盾的现象。
例如,例3.5中的switch语句如果写成
case 8:printf(″B\n″);
case 8:printf(″C\n″);
那么当表达式的值为8时,出现了两种执行
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
, 这是矛盾的。 null (4) break是个跳转语句(详细内容见本章3.5节),它的作用是跳出switch结构。最后一个分支的break语句可以省略。
switch结构中,如果去掉break语句,其执行顺序将变为图3-11所示的结果。 null图 3-11 去掉break语句的switch结构的执行过程 null (5) 多个case可以共用一组语句。例如,例3.5中,当表达式的值为9或10时,执行同一组语句。
(6) case后的语句可以是单个语句,也可以是复合语句。 是复合语句时,可以省略大括号。 null例 3.6 某运输公司计算运费的标准如下:
距离 折扣率
s<200 0
200≤s<400 2%
400≤s<1000 5%
1000≤s<2000 10%
2000≤s 15% null 设每公里每吨货物的基本运费为t,货物重量为w,距离为s,折扣率为d,则总运费的计算公式为 ft=t*w*s*(1-d) 程序如下:
main()
{ int i,s;
float ft,t,d,w;
printf(″t,w,s=″);
scanf(″%f%f%d″,&t,&w,&s);
if(s>=2000)
i=10;
else
i=s/200; nullswitch(i)
{ case 0:d=0;break;
case 1:d=0.2;break;
case 2:
case 3:
case 4:d=0.5;break;
case 5:
case 6:
case 7:
case 8:
case 9:d=0.1;break;
cdse 10:d=0.15;
}
ft=t*w*s*(1-d);
printf(″ft=%f\n″,ft);
} null3.3.5 无条件转向语句goto
1. goto语句的一般形式
goto 标号;
…
标号:
…
其中, 标号的构成应符合标识符的构成规则。 null 2. goto语句的功能
当执行到goto语句时,无条件地转到标号所指向的程序行继续执行。例如:
goto loop;
在程序的某处必须存在标号loop。 null 3. goto语句的使用说明
(1) 标号可以出现在任何语句的开始处, 其一般形式为: 标号:
(2) 结构化程序设计主张限制使用goto语句,因为滥用goto语句,将破坏程序的模块化结构,程序的可维护性和可读性差。
(3) goto语句主要用于if结构和循环结构中。 null3.4 循环结构 在程序设计中,经常遇到这样的情况,求解某些问题, 需要重复执行指定的语句序列或程序段,这种程序结构称为循环结构,而被重复执行的语句序列或程序段称为循环体。在循环结构中,循环体被反复执行,直到满足循环中止条件才能停止执行并退出循环体。 null例 3.7计算n!, n取值是10。
main()
{ int i=1;
long j=1;
loop:if(i>10)
printf(″%ld\n″,j);
else
{j*=i;
i+=1;
goto loop;
}
程序的运行结果如下:
3628800 null 例3.7程序采用了循环结构,其中else后的复合语句为循环体;变量i为循环控制变量,初值为1;其后每执行一次循环体,则对i值进行一次修改;if语句对是否执行循环体进行判断:如果i<=10则执行循环体,否则(如果i>10),停止执行并退出循环体。 null 从例3.7程序可以看到, 循环结构由下面4个部分组成:
(1) 初始化部分: 建立循环首次执行所必备的条件; 例如,i=1; j=1;。
(2) 循环体部分:需要重复执行的操作,例如,j*=i; 。
(3) 修改部分:修改某些值,使循环每次执行有别于前次,并逐渐趋于结束;例如,i+=1;。
(4) 终止条件测试部分:当不满足终止条件时,执行循环体;当满足终止条件时,结束执行并退出循环结构。例如, i>10。 null3.4.1 当型循环结构while
1. while语句的一般形式
while(表达式)
{
循环体各语句;
} null 2. while语句的执行过程
首先计算表达式的值,如果表达式的值非0(真), 则执行循环体各语句,然后重新计算表达式的值, 并再次做出判断;如果表达式的值为0(假), 则退出循环结构。执行过程如图3-3所示。 null 例 3.8 用while语句改写例3.7。
main()
{int i=1;
long j=1;
while(i<=10)
{ j*=i;
i+=1;
}
printf(″%ld\n″,j);
}
程序的运行结果如下:
3628800 null 3. while语句的使用说明
(1) 循环体可以是单个语句,也可以是复合语句。采用复合语句时必须用大括号括起来。
(2) 表达式可以是关系表达式或逻辑表达式。 下面是两个常用的省略形式:
while(x) 表示while(x! =0)
while(! x) 表示while(x==0) null (3) 循环体中应有使循环趋于结束的语句。例如,例3.8程序中,循环结束条件是i>10,循环体中i+=1;语句将最终导致i>10的发生。如果无此语句,i的值始终不变,则该循环将永远执行下去,这种情况称为死循环。例如:
while(1)
{…}
就是一个死循环。 null例 3.9 计算1+2+3+…+100。
main()
{ int i,sum;
i=1;sum=0;
while(i<=100)
{ sum=sum+i;
i=i+1;
}
printf(″sum=%d\n″,sum)
}
程序的运行结果如下:
sum=5050 null3.4.2 直到型循环结构do-while
如果说while结构的特点是“先判断, 后执行(循环体)”的话,那么do-while结构的特点则是“先执行(循环体), 后判断”。
1. do-while语句的一般形式
do
{
循环体各语句;
}
while(表达式); null 2. do-while语句的执行过程
首先执行循环体各语句,然后计算表达式的值,如果表达式的值非0,则再次执行循环体。如此反复,直到表达式的值为0时,退出循环结构。执行过程如图3-4所示。 null例 3.10用do-while语句改写例3.7。
main()
{ int i=1;
long j=1;
do
{ j*=i;i+=1;
}
while(i<=10);
printf(″%ld\n″,j);
}
程序的运行结果如下:
3628800 null 3. do-while语句的使用说明
(1) while结构与do-while结构可以互相转换。
由例3.8和例3.10程序可以看出,同一个问题既可以用while语句处理,也可以用do-while 语句完成。只要表达式的值第一次为“真”, 两种循环结构的执行结果是相同的。 null (2) 因为do-while语句先执行循环体,后判断表达式, 所以do-while结构至少执行循环体一次,这一点与while语句不同。 例如,如果将例3.8、 例3.10程序中的赋值语句i=1,改为i=11,则运算结果将发生变化:例3.8程序的运行结果是1(不执行循环体,j=1);而例3.10程序的运行结果是11(执行循环体一次, j=1*11)。 读者可以自行验证。 null例 3.11 由键盘任意输入10个整数, 输出其中的奇数。
main()
{ int i=1,x;
do
{ scanf(″%d″,&x);
if(x%2==1)
printf(″%d ″,x);
i=i+1;
}
while(i<=10);
} null 例3.11程序中,利用x%2==1判断x是否为奇数。同理, 还可以利用x%2==0判断x是否为偶数。 null3.4.3 for循环结构
for语句常常用于循环次数已经确定的循环结构。
1. for语句的一般形式
for(表达式1;表达式2;表达式3)
{
循环体各语句;
} null 2. for语句的执行过程
(1) 计算表达式1;
(2) 计算表达式2,如果其值非0(真),则执行循环体; 如果其值为0(假),则退出循环体。
(3) 计算表达式3, 然后重复执行第(2)步。
执行过程如图3-12所示。 null图 3-12 for语句的执行过程 null例 3.12用for语句改写例3.7。
main()
{ int i;
long j=1;
for(i=1;i<=10;i++)
j*=i;
printf(″%ld″,j);
}
程序的运行结果如下:
3628800 null 从例3.12程序可以看出,for语句的3个表达式起着不同的作用。表达式1一般用于循环控制变量赋初值(例如i=1);表达式2一般作为循环结束的判断条件(例如i<=10);表达式3一般用于修改循环控制变量的值,使循环趋于结束。因此, for语句最简单的应用形式如下:
for(循环控制变量赋初值;循环结束条件;修改循环控制变量的值)
{
循环体各语句;
} null 3. for语句的使用说明
(1) for语句中的三个表达式可以省略, 但分号不能省略。
例如, 例3.12程序中的for语句可以改写为:
int i=1;
long j=1;
for(;i<=10;i++)
j*=i;
其中,表达式1省略,因为i的初值已在int i=1;中赋过了。 null (2) 表达式2省略时,系统将认为表达式2始终为真,循环将永无休止地执行下去,造成死循环。因此省略表达式2时要慎重。
(3) 表达式3省略时,应在循环体内修改循环控制变量的值,以保证循环能正常结束。
例如, 例3.12程序可改写为:
int i=1;
long j=1;
for(;i<=10;)
{j*=i;i++;
} null (4) 表达式1和表达式3可以是简单的表达式也可以是逗号表达式。
例如,例3.12程序中的for语句可改写为:
int i;
long j;
for(i=1,j=1;i<=10;j*=i,i++)
;
表达式1中同时设两个初值,表达式3中首先计算阶乘,然后i自增。注意,该for语句的循环体为空语句,本来应在循环体中的语句放在了表达式3中, 作用是一样的。由此可见,for语句的功能是很强的。 null (5) 表达式2一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式。只要其值为非0,就执行循环体。 null 4. for语句的应用举例
(1) for(i=0;(c=getchar())!=′′;i++);
表达式2首先从键盘接收一个字符赋给c, 然后判断此赋值表达式的值是否不等于′′(空格字符),不等于′′则循环计数。
(2) for(i=0;i<=100;i++);
循环体为一空语句, 此种形式一般用于循环延时。 null (3) for(;(c=getchar())! =′\n′;)
printf(″%c″,c);
其作用是每读入一个字符则输出该字符, 直到输入一个“回车换行”为止。运行情况如下:
Command (输入)
Command (输出)
请注意,从键盘向计算机输入字符时,是在输入回车以后(标志输入结束)才送到内存缓冲区中的;只有送入缓冲区之后, 才能再读出这些字符并输出,并不是从键盘键入一个字符就马上输出一个字符。 null例 3.13 输出0~100之间的偶数。
main()
{ int i;
for(i=0,i<=100,i=i+2)
printf(″%d ″,i);
} null3.4.4 多重循环
一个循环结构的循环体内又包含另一个完整的循环结构, 称为嵌套循环。内嵌的循环结构中还可以嵌套循环,这就是多重循环。例如:
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
printf(″%d″,i*j);
第一个for语句(外层for)的循环体是另一个for语句(内层for), 构成了嵌套循环。
while循环、do-while循环和for循环,既可以自身组织嵌套,也可以互相嵌套。 null 例3.14 求3~100之间的所有素数。
所谓素数(又称质数),是指除了能被1和自身整除外,不能被任何其它整数整除的自然数。如3、5、7、11等都是素数。
验证一个自然数m是否是素数的方法很多。最容易理解(但并不是最简单)的一种方法是:将m除以2~(m-1)的每一个自然数,如果都除不尽,则m是素数;只要有一个能除尽, m就不是素数。
用双重循环很容易设计出这个程序:用外层循环提供被判断的数据(3~100),用内层循环完成对每一个数据的判断。 null程序如下:
main()
{ int i,m,k,j=0;
for(m=3;m<=100;m++)
{ k=0;
for(i=2;i<=m-1;i++) /*判断是否为素数*/
if(m%i==0)
{ k=1;
break;
} null if(k==0)
{ printf(″%3d ″,m);
j=j+1;
if(j%4==0)
printf(″\n″);
}
}
} null运行结果如下:
3 5 7 11
13 17 19 23
29 31 37 41
43 47 53 59
61 67 71 73
79 83 89 97 null 例3.14程序中,变量k作为是否是素数的标志,k=0时为素数;if(j%4==0)用来控制每行输出4个素数。 null3.5 辅助语句 3.5.1 break语句
1. break语句的一般形式
break; null 2. break语句的功能
(1) 在switch-case结构中,当执行到break语句时,跳出switch-case结构,继续执行switch-case的后继语句。例如, 例3.5程序所示。
(2) 在循环结构中,当执行到break语句时,跳出循环体, 继续执行循环结构的后继语句。 null 例 3.15 计算半径i=1到i=10的圆面积,当圆面积a>100时, 执行break语句,提前终止循环结构(剩余的几次循环不再执行)。 main()
{ int i;
float a;
for(i=1;i<=10;i++)
{ a=3.14*i*i;
printf(″i=%d a=%8.2f\n″,i,a);
if(a>100)
break;
}
} null运行结果如下:
i=1 a=3.14
i=2 a=12.56
i=3 a=28.26
i=4 a=50.24
i=5 a=78.50
i=6 a=113.04 null 3. break语句的使用说明
(1) break语句只适用于循环语句和switch-case语句, 不能用于其它语句。
(2) 在多重循环中使用break语句时,只能跳出包含该break语句的那层循环体,不能跳出所有循环。例如,例3.14程序所示。 null3.5.2 continue语句
1. continue语句的一般形式
continue;
2. continue语句的功能
在循环结构中, 当执行到continue语句时, 结束本次循环,继续执行下一次循环。 null 3. continue语句与break语句的区别
continue语句只结束本次循环,并不终止循环。
break语句则是结束循环,跳出循环体。
例如, continue与break的区别 (1) while(i<10) (2) while(i<10)
{ …; { …;
if(j>100) if(j>100)
break; continue;
else else
…; …;
} } null 程序(1)的执行过程如图3-13(a)所示,程序(2)的执行过程如图3-13(b)所示。 图 3-13 break语句与continue语句的区别 null4. continue语句的使用说明
continue语句只适用于循环结构。
例 3.16 打印100~200之间不能被3整除的数。
main()
{ int i,j=0;
for(i=100;i<=200;i++)
{if(i%3==0)
continue;
printf(″%d ″,i);
j=j+1;
if(j%8==0)
printf(″\n″);
}
} null运行结果如下:
100 101 103 104 106 107 109 110
112 113 115 116 118 119 121 122
124 125 127 128 130 131 133 134
136 137 139 140 142 143 145 146
148 149 151 152 154 155 157 158
160 161 163 164 166 167 169 170
172 173 175 176 178 179 181 182
184 185 187 188 190 191 193 194
196 197 199 200 null 例3.16程序中,当i能被3整除时, 执行continue语句, 结束本次循环(跳过printf()函数),继续判断下一个数据。 null3.6 应用举例 例 3.17 “终止标志”的使用。
在编程序时,经常采用这样的方法:当程序在执行中遇到某一特定值时,立即停止当前的计算,转去执行其它的处理。 下面是一个统计全班学生总成绩、平均成绩的程序。
设-1为输入学生成绩的结束标志,n为学