本章导读本章从实例分析着手,使读者了解并掌握 C语言三种基本流程控制结构:顺序、选择、循环结构,加深对 C
语言程序开发设计过程的感性认识,强化培养编程思路,为进一步进行 C语言程序设计打下基础。
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本书目录第 3章 结构化程序设计本章主要知识点
(1) 顺序结构及程序设计。
(2)选择结构及程序设计。
(3)循环结构及程序设计 。
(4)结构化程序设计方法,编程思路与综合实训第 3章 结构化程序设计
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本章导读
3.2 选择结构程序设计
3.3 循环结构程序设计
3.4 结构化程序设计方法与综合实训
3.1 顺序结构程序设计
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本章目录
3.1.2 顺序结构语句
3.1.3 程序实训
3.1.1 顺序结构的 C程序实例
3.1 顺序结构程序设计
3.1.1 C程序实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
C程序实例
【 例 3.1】 编程实现:输入一个长方形的二边长,求长方形的面积并输出 。
/*程序名为 l3_1.cpp。 */
#include "stdio.h"
main()
{ float a,b,s;
scanf("%f%f",&a,&b);
s=a*b;
printf("The area of rectangle is %5.2f,\n",s);
}
返回本节目录程序运行情况如下:
输入:
3.0 4.0 < CR >
输出:
The area of rectangle is 12.00,
这个程序属于顺序结构,程序是按照书写的顺序自上而下一步步执行,程序中的每一条语句都被执行一次,且仅能被执行一次 。
【 例 3.1】 编程
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3.1.2 顺序结构语句 1
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

C语言的顺序结构语句可以分为四大类:
1.表达式语句表达式的后面加一个分号就构成了一个语句,例如,sum=a+b; 。 事实上,
C语言中有使用价值的表达式语句主要有 3种:
(1)赋值语句 。 例如,sum=a+b;
(2)自动增 1,减 1运算符构成的表达式语句 。 例如,i++;
(3)逗号表达式语句 。 例,x=1,y=2;
2.空语句语句仅有一个分号,;”,它表示什么也不做 。 一般和后面章节所讲循环语句结合使用起到延时作用 。
3,复合语句由 "{"和 "}"把一些变量定义和执行语句组合在一起,称之为复合语句,又称语句块 。 复合语句的语句形式如下:
{语句 1;语句 2; … ;语句 n; }
返回本节目录返回本节目录例如,{int a=0,b=1,sum;
sum=a+b;
printf("%d",sum);
}
【 注意 】 与 C语言中的其他语句不同,复合语句不以分号作为结束符,
若复合语句的 "}"后面出现分号,那不是该复合语句的组成成分,而是单独的一个空语句。在复合语句起始部分可以有变量定义,如:
"int a=0,b=1,sum;",也可以没有。复合语句的 "{}"内可能会有多个语句,但在语法上把它整体上视为一条语句看待。
4.函数调用语句由一个函数调用加上一个分号组成一个语句,如:
scanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
3.1.2 顺序结构语句 2
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

C程序实例
【 例 3.2】 由键盘输入两个整数给变量 a和 b,然后输出 a和 b,在交换 a和 b中的值后,
再输出 a和 b,验证两个变量中的数值是否正确地进行了交换 。
/*程序名为 l3_2.cpp。 */
#include "stdio.h"
main()
{ int a,b,t;
printf("Enter a and b:\n");
scanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
t=a;a=b;b=t;
printf("a=%d,b=%d\n",a,b);
}
程序运行情况如下:
Enter a and b:
123 456 < CR >
a=123,b=456
a=456,b=123 返回本节目录
3.1.3 程序实训 【 例 3.2】
返回本节目录注意:在程序中交换两个变量 a 和 b的值,不可以简单地用,a=b;b=a;两条语句来实现。假设 a 和 b的值分别为 23和 78,赋值语句 a=b;将使 a的值变为 78,接下来的 b=a;使 b的值变为 78,这样,a和 b的值最终都变为 78。所以在本例中引入了中间变量 t,用来临时存放 a的值,这样才能完成变量 a
和 b的正确交换。
【 例 3,3】 输入一个 double类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入处理,然后输出此数,以便验证处理是否正确。
/*程序名为 l3_3.cpp。 */
#include "stdio.h"
main()
{ double x;
printf("Input x:\n");
scanf("%lf",&x);
3.1.3 程序实训 【 例 3.3】
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3.1.3 程序实训 【 例 3,3】
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
printf("(1) x=%f\n",x); /*将 x输出 */
x=x*100;
x=x+0.5;
x=(int)x;
x=x/100; /*将 x扩大 100倍,加上 0.5之后取整,再缩小
100倍 */
printf("(2) x=%f\n",x); /*将四舍五入后的 x输出 */
}
程序运行情况如下:
Input x:3.14159< CR >
则输出的结果为:
(1) x=3.141590
(2) x=3.140000
3.1.3 程序实训 【 例 3.4】
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
【 例 3.4】 从键盘上输入一大写英文字母,要求改用相应的小写字母输出。
/*程序名为 l3_4.cpp。 */
#include "stdio.h"
main()
{ char c1,c2;
scanf("%c",&c1);
printf("The upper case is %c,\n",c1);
c2=c1+'a'-'A';
printf("The lower case is %c,\n",c2);
}
程序运行时:
输入,B<CR>
输出:
The upper case is B,
The lower case is b,
3.2 选择结构程序设计
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3.2.1 选择结构的 C程序实例
3.2.2 if 语句
3.2.3 switch 语句
3.2.4 程序实训返回本章目录
3.2.1 选择结构的 C程序实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
【 例 3.5】 请输入两个整数 a,b,比较 a+b和 a× b哪个大,输出判断结果。
/*程序名为 l3_5.cpp。 */
#include "stdio.h"
main()
{ int a,b,s1,s2;
printf("请输入两个整数 a,b,");
scanf("%d,%d",&a,&b);
s1=a+b; s2=a*b; /*求两个数的和、积 */
if(s1>s2)
printf("(a+b)>(a*b) /n"); /*语句 A*/
else
printf(" (a+b)<=(a*b)\n"); /*语句 B*/
}
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

运行结果为:
请输入两个整数 a,b,2,3<CR>
(a+b)<=(a*b)
在这个程序中使用了 if分支语句,它不像前面的程序那样,按照语句的书写顺序一步步执行下去,而是根据所给条件的真假,选择两者其中之一执行。该程序执行的过程是:比较两数的和与积,如果 s1>s2,
则执行语句 A(跳过语句 B不执行 ),否则,就跳过语句 A执行语句 B。可见 if语句在程序中起到了改变语句执行顺序的作用。 if语句就是我们在下一节中要介绍的条件分支语句。
3.2.1 选择结构的 C程序实例结果返回本节目录
3.2.2 if 语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

1,if语句的一般形式返回本节目录
2,if-else中的复合语句
3,非关系、非逻辑表达式构成的条件表达式
4,if语句的嵌套
1,if语句的一般形式 1
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

1,if语句的一般形式:
if语句有两种形式:
( 1)不含 else子句的 if语句语句形式如下:
if(<表达式 >) <语句 1>
例如 if(a<b){t=a;a=b;b=t;}
其中,if是 C语言的关键字,表达式两侧的圆括号不可少,最后是一条语句,
称为 if子句。如果在 if子句中需要多个语句,则应该使用花括号把一组语句括起来组成复合语句,这样在语法上仍满足 "一条语句 "的要求。
执行过程:首先计算紧跟在 if后面一对圆括号中的表达式的值,如果该表达式的值为非零(“真”),则执行其后的 if子句,然后去执行 if语句后的下一个语句。如果该表达式的值为零(“假”),则跳过 if子句,直接执行 if语句后的下一个语句。
返回 3.2.2目录
1,if语句的一般形式 2
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

( 2)含 else子句的 if语句语句形式如下:
if(<表达式 >)
<语句体 1>
[else
<语句体 2>]
执行过程:首先计算 <表达式 >的值,如果该表达式的值为非零( "真 "),
则执行 <语句体 1>,如果该表达式的值为零( "假 "),则跳过 <语句体 1>,
直接执行 <语句体 2>,两者执行其一后再去执行 if语句后的下一个语句。
返回 3.2.2目录
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

1,if语句的一般形式实例
【 例 3.6】 求分段函数的值,如果 x≥0,y=2x+1,否则,y=0 。
#include "stdio.h"
main() /*程序名为 l3_6.cpp。 */
{ int x,y; /*变量 y存放 f(x)的值 */
printf("请输入 x的值,");
scanf("%d",&x);
if(x>=0)
y=2*x+1;
else
y=0;
printf("当 x=%d时,f(x)=%d",x,y);
}
返回 3.2.2目录
1,if语句的一般形式实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

运行结果:
请输入 x的值,3<CR>
当 x=3时,f(x)=7
因为输入 x=3,那么 x>=0为真,所以输出 2*3+1=7。
C语言中有一种特有的条件运算符“?:”,我们在前面章节已作介绍,它在某种程序上可以起到逻辑判断的作用。本例中的 if语句也可用条件运算符表达式实现如下:
y=x>=0?2*x+1:0;
但有些判断不能用条件表达式完成,或者很繁琐、表达不清晰。
返回 3.2.2目录
2,if-else中的复合语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

2,if-else中的复合语句如果两个分支中需要执行的语句不止一条,必须用,{}”括起来,作为一个复合语句使用。若只是一条语句,,{}”可以省略。
【 注意 】
(1)if后面的 <表达式 >一定要有括号;
(2)if和 else同属于一个 if语句,else不能作为语句单独使用,它只是 if语句的一部分,与 if配对使用,因此程序中不可以没有 if而只有 else;
(3)只能执行与 if有关的语句或者执行与 else有关的语句,而不可能同时执行两者;
(4)如果 <语句 1>和 <语句 2>是非复合语句,那么该语句一定要以分号结束,
(5)if语句的表达式可以是任意类型的 C语言的合法的表达式,但计算结果必须为整型、字符型或浮点型之一。
返回 3.2.2目录
3.非关系、非逻辑表达式构成的条件表达式 1
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3.非关系、非逻辑表达式构成的条件表达式
【 例 3.10】 以 "赋值表达式 "为分支条件的实例。
/*程序名为 l3_10.cpp。 */
#include"stdio.h"
main()
{ int s;
if(s=2)
printf("hello");
else
printf("error");
}
分支条件 <表达式 >的类型不限于逻辑 /关系表达式,可以是任意的 C语言有效表达式(如赋值表达式,算术表达式等等),因此也可以是作为表达式特例的常量或变量。
返回 3.2.2目录
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3.非关系、非逻辑表达式构成的条件表达式 2
【 例 3.10】 中的条件表达式是一个赋值表达式,并不是判断 s是否等于 2。相当于 if(2)printf("hello");,这是合法的。由于该条件表达式的值是非零值,恒为真,
故本程序的 printf("error");无论如何都不会被执行。 if语句最终执行哪一个分支,
取决于条件表达式的计算结果。同一个条件的也可以用多种表达方式。
【 例 3.11】 以 "变量 "为分支条件的实例。
/*程序名为 l3_11.cpp。 */
#include "stdio.h"
main()
{ int x,y; scanf("%d",&x);
if(x)
y=1;
else
y=-1;
返回 3.2.2目录
3.非关系、非逻辑表达式构成的条件表达式 3
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

printf("y=%d\n",y);
}
现把程序中 if(x)改成 if(x!=0),此时虽然条件表达式写法不同,但是完成的功能是相同的。
下面两种表示方法经常使用:
if(x)等价于 if(x!=0)
if(!x)等价于 if(x==0)
返回 3.2.2目录
4,if语句的嵌套 1
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

在一个 if语句中又包含另一个 if语句,从而构成了
if语句的嵌套使用。内嵌的 if语句既可以嵌套在 if子句中,也可以嵌套在 else子句中。例如:
【 例 3.12】 输入 a,b两个整数的值,比较大小并输出结果。
#include "stdio.h,/*程序名为 l3_12.cpp。 */
main()
{ int a,b; printf("请输入 a,b,") ; scanf("%d%d",&a,&b);
if(a>b)
printf("a>b\n");
else
if(a<b)
printf("a<b\n");
else
printf("a=b\n");
} 返回 3.2.2目录
4,if语句的嵌套 2
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

【 注意 】 if语句的嵌套形式不是刻意去追求的,而是在解决问题过程中随着解决问题的需要而采用的 。
if与 else的配对规则
if语句出现嵌套形式时,C语言规定,else子句总是和前面最近的不带 else子句的 if语句配对,与书写格式无关 。 注意从书写格式要有层次感 ( 好的程序员应该养成这一习惯,以便他人理解你的程序和自己将来的修改 ) 。 如果 if的数目和 else的数目相同,从内层到外层一一对应,不易出错 。 如果 if与 else的数目不一致,为实现编程者的意图,必要的时候必须加 "{}",来强制确定配对关系 。 否则,
就不能实现编程者的真正意图 。
返回 3.2.2目录
4,if语句的嵌套实例 1
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

【 例 3.13】 写出下列程序的输出结果 。
/*程序名为 l3_13.cpp。 */
#include"stdio.h"
main()
{ int x=4,y=5,z=2,max;
max=x;
if(z>y)
if(z>x)
max=z;
else
if(y>x)
max=y;
printf(" max=%d",max);
}
运行结果:
max=4 返回 3.2.2目录
4,if语句的嵌套实例 2
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

【 例 3.14】 编写程序,根据输入的学生成绩,给出相应的等级 。 90分以上的等级为 A,60分以下的等级为 E,其余每 10分一个等级 。 程序如下:
#include"stdio.h"
main() /*程序名为 l3_14.cpp。 */
{ int g; printf("input g:");
scanf("%d",&g); printf("g=%d,",g);
if(g>=90)
printf("A\n");
else if(g>=80)
printf("B\n");
else if(g>=70)
printf("C\n");
else if(g>=60)
printf("D\n");
else
printf("E\n");
}
返回 3.2.2目录
4,if语句的嵌套实例 3
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

当执行以上程序时,首先输入,输出学生的成绩,然后进入 if语句; if语句中的表达式将依次对学生成绩进行判断,若能使某 if 后的表达式值为 1,则执行与其相应的子句,之后便退出整个 if结构 。
例如,若输入的成绩为 78分,首先输出,g=78,,当从上至下逐一检测时,使 g>=70这一表达式的值为 1,因此在输出 "g=78,"之后再输出 C,
便退出整个 if结构 。
若输入的成绩为 30分,首先输出相应成绩 "g=30,",其次进入相应判断,
最后再输出相应等级 "E",便退出整个 if结构 。
返回 3.2.2目录
3.2.3 switch 语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

1,switch语句的一般形式返回本节目录
2,switch语句的执行过程
3,switch语句的实例
1,switch语句的一般形式
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

1,switch语句的一般形式
switch语句的一般形式是:
switch(<表达式 >)
{case <常量表达式 1>,<语句序列 1>
case <常量表达式 2>,<语句序列 2>
……
case <常量表达式 n>,<语句序列 n>
[default,<语句序列 n+1>]
}
【 说明 】,
① switch语句是关键字,其后面大括号里括起来的部分称为 switch语句体 。
要特别注意必须写这一对大括号 。
② switch后 <表达式 >的运算结果可以是整型,字符型或枚举型表达式等,
<表达式 >两边的括号不能省略 。
返回 3.2.3目录
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

③ case也是关键字,与其后面 <常量表达式 >合称为 case语句标号 。 <常量表达式 >的值在运行前必须是确定的,不能改变,因此不能是包含变量的表达式,而且数据类型必须与 <表达式 >一致 。 如:
int x=3,y=7,z;
switch(z)
{ case 1+2,/*是正确的 */
case x+y,/*是错误的 */
}
④ case和常量之间要有空格,case后面的常量之后有 ","。
⑤ default也是关键字,起标号的作用 。 代表所有 case标号之外的那些标号 。
default可以出现在语句体中任何标号位置上 。 在 switch语句体中也可以无 default标号 。
⑥ <语句序列 1>,<语句序列 2>等,可以是一条语句,也可以是若干语句 。
⑦ 必要时,case 语句标号后的语句可以不写 。
1,switch语句的一般形式返回 3.2.3目录
2,switch语句的执行过程
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

2,switch语句的执行过程首先计算 <表达式 >的值,然后在 switch语句体内寻找与该吻合的 case标号,如果有与该值相等的标号,则执行从该标号后开始的各语句,
包括在其后的所有 case和 default语句,直到 switch语句体结束 。 如果没有与该值相等的标号,并且存在 default标号,则从 default标号后的语句开始执行,直到 switch语句体结束 。 如果没有与该值相等的标号,并且不存在 default标号,则跳过 switch语句体,什么也不执行 。
在 switch语句中使用 break语句
break语句也称间断语句 。 可以在各个 case之后的语句最后加上 break语句,每当执行到 break语句时,立即跳出 switch语句体 。 switch语句通常总是和 break语句联合使用,使得 switch语句真正起到多个分支的作用 。
返回 3.2.3目录
3,switch语句的实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3,switch语句的实例
【 例 3.17】 模拟自动饮料机 。 按屏幕所示功能,输入所选择的合法数字,输出可获得的相应饮料名称 。 程序如下:
/*程序名为 l3_17.cpp。 */
#include "stdio.h"
main()
{ int button;
printf("==========自动饮料机 ==========\n");
printf("1.可口可乐 \n");
printf("2.雪碧 \n");
printf("3.芬达 \n");
printf("4.百事可乐 \n");
printf("5.非常可乐 \n");
printf("请按 1--5键选择饮料,\n");
scanf("%d",&button);
返回 3.2.3目录
3,switch语句的实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

switch(button)
{ case 1:printf("\n你获得一听可口可乐 \n");break;
case 2:printf("\n你获得一听雪碧 \n");break;
case 3:printf("\n你获得一听芬达 \n");break;
case 4:printf("\n你获得一听百事可乐 \n");break;
case 5:printf("\n你获得一听非常可乐 \n");break;
default:printf("\n非法操作 !\n");break;
}
}
运行结果:
=============自动饮料机 ==============
1.可口可乐
2.雪碧
3.芬达
4.百事可乐
5.非常可乐请按 1-5按钮选择饮料,3<CR>
你获得一听芬达 返回 3.2.3目录
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本章目录
3.3.2 while语句
3.3.3 do-while语句
3.3.1 循环结构的 C程序实例
3.3 循环结构程序设计
3.3.4 for 语句
3.3.5 循环的嵌套
3.3.6 break语句和 continue语句
3.3.7 程序实训
3.3.1 循环结构的 C程序实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

【 例 3.19】 有一张厚度为 0.1毫米的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可以抵达(再对折一次就超过)珠穆朗玛峰的高度?程序如下:
main() /*程序名为 l3_14.cpp。 */
{ double h=0.1; int n=0; /* n用来累计对折次数 */
while(h<=8848180)
{ h=h*2; n=n+1;
}
printf("对折次数为,%d,此时厚度,%.2f\n",n-1,h/2);
}
重复对折一张纸,实质就是厚度乘以 2,次数加 1。用顺序结构编程为:
h=h*2; n=n+1;
……
这样的语句一直重复写到 h满足题目要求为止。实际中这类问题,就可用循环结构编程实现。本例中,使用的是循环结构中的 while语句。
C语言共有三种类型的循环语句,while,do-while和 for语句。
返回本节目录
3.3.2 while语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
1.while语句的一般形式
while( <表达式 >)
<循环体语句 >
说明,while语句是 C的关键字,其后面的一对括号中的 <表达式 >,可以是 C语言的任意合法表达式,由它来控制循环体语句是否执行,括号不能省略 。 <
循环体语句 >可以是一条语句,也可以是多条语句,一般来说循环体是一条语句时不用加 "{}",如果是多条语句,就一定要加 "{}" 构成复合语句 。 其中的语句可以是空语句,表达式语句或作为循环体一部分的复合语句,如果循环体是一个空语句,表示不执行任何操作 ( 一般用于延时 ) 。
( 1) 计算 while后一对括号中的 <表达式 >的值 。 当值为非零时,则执行步骤
( 2) ;当值为零时,则执行步骤 ( 3) 。
( 2) 执行 <循环体语句 >后,转去执行步骤 ( 1) 。
( 3) 退出 while循环 。
2.while语句的执行过程
while语句实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3.while语句实例例 3.21】 用 while循环语句实现从 1加到 100,并将结果打印出来 。
/*程序名为 l3_21.cpp。 */
#include "stdio.h"
main() / *若 sum的值超过 int型变量能表示的范围,则设置成长整型 */
{ int sum=0,i=1; while(i<=100)
{ sum+=i;
i++;}
printf("其和是 %d\n",sum);
/*若 sum为长整型,则相应的输出也设置成长整型 ld*/
}
运行结果:
其和是 5050
返回本节目录
do
<循环体语句 >
while( <表达式 >) ;
说明,do是 C语言的关键字,必须和 while联合使用 。 do-while循环由
do开始,用 while结束;注意,在 while结束后必须有分号,它表示该语句的结束 。 其它同 while循环语句 。
3.3.3 do-while语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

1.do-while语句的一般形式返回本节目录
2.do-while语句的执行过程
( 1) 执行 do后面的 <循环体语句 >。
( 2) 计算 while后一对括号中的 <表达式 >的值 。 当值为非零时,转去执行步骤 ( 1) 。 当值为零时,则执行步骤 ( 3) 。
( 3) 退出 while循环 。
运行结果:
其和是 5050
在本例中,循环条件和循环体以及得到的结果都是和 while循环一样的,只是用 do-while语句来实现。
do-while语句实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

3.do-while语句实例
【 例 3.23】 用 do-while语句实现求 1+2+…+100 的和。
#include "stdio.h" /*程序名为 l3_23.cpp。 */
main()
{ int sum=0,i=1; / *若 sum的值超过 int型变量能表示的范围,则设置成长整型 */
do
{ sum+=i;
i++;} while(i<=100);
printf("其和是 %d\n",sum);
/*若 sum为长整型,则相应的输出也设置成长整型 ld*/
}
返回本节目录
3.3.4 for 语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

for语句是 C语言提供的一种在功能上比前面两种循环语句更强的一种循环语句 。
for循环语句格式如下:
for( <表达式 1>; <表达式 2>; <表达式 3>)
<循环体语句 >
说明,for是 C语言的关键字,三个表达式之间的必须用分号 "; "隔开 。 三个表达式可以是任意形式的 C表达式,通常主要用于 for循环的控制 。 一般 <表达式 1>用于计算循环变量初始值,<表达式 2>为循环体是否执行的条件,<表达式 3>为循环变量的调整 。 <循环体语句 >的使用同 while,do-while循环语句 。 for循环语句的格式还可以表示为:
for( <初始化表达式 >; <条件表达式 >; <修正表达式 >)
<循环体语句 >
在某种情况下,用 for语句表示循环,显得紧凑而清晰 。 尤其是它能利用 <表达式 3>自动地使循环变量发生改变,不像 while结构那样要在循环体中设置 "修正操作 "。 实际上,for语句中的 <表达式 3>不仅限于修正循环变量,而且可以是任何操作 。 例如前面例题中介绍的求 1到 100的和,用 for语句可以表示为:
for(sum=0,i=1;i<=n;sum+=i,i++); 返回本节目录
1.for语句的一般形式
for 语句的执行过程
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
2.for语句的执行过程
① 首先计算 <表达式 1>。
② 求 <表达式 2>的值;若其值为非零,则转去执行 ③ ;若 <表达式 2>的值为零,则转去执行 ⑤,结束 for语句 。
③ 执行一次 for循环体 。
④ 求解 <表达式 3>,转 ② 执行 。
⑤ 结束循环,执行循环之后的语句 。
3.for语句实例
【 例 3.25】 用 for语句实现求 1-100之和 。
#include "stdio.h"
main() /*程序名为 l3_25.cpp。
{ int sum=0,i=1;
/ *若 sum的值超过 int型变量能表示的范围,则设置为长整型 */
for 语句的实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
for( ;i<=n;i++)
sum+=i;
printf("其和是 %d\n",sum);
/*若 sum为长整型,则相应的输出也设置成长整型 ld*/
}
运行结果:
其和是 5050
for循环的执行过程:先执行表达式 1,为空语句,然后判断 "i<=n"是否成立,如果为真,执行循环体 "sum+=i",转而执行 "i++",再判断 "i<=n",
如此反复,直到 "i<=n"为假为止 。 在这个例子中,i是循环控制变量,
每次循环时,它的值都被改变且进行检验 。
for 语句多样性
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
for语句的多样性由于 C语言中表达式的形式十分丰富,对 for语句的三个控制表达式可以灵活运用,因此造成 for语句形式多种多样 。
( 1) <表达式 1>为空语句如上例中求 1-100的和 。 本来由 <表达式 1>完成的初始化可提到循环之外完成 。
( 2) <表达式 1>和 <表达式 3>是逗号表达方式
( 3) 用空循环来延长时间常用空循环来产生延时,以达到某种特定要求 。 如:
for(t=0;t<time;t++);
( 4) 无限循环
for循环的三个表达式中,任何一个都可以省略,但是分号 "; "不可省略 。 所以下面的写法:
for( ;; )
<语句 >
是一个无限循环 。 将成为死循环 。
3.3.5 循环的嵌套
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录在一个循环内又完整地包含另一个循环,称为循环的嵌套,即循环体自身包含循环语句 。
前面介绍了三种类型的循环,它们自己本身可以嵌套,如在 for循环中包含另一个 for循环,也可以互相嵌套,例如可以 for循环中包含一个 while循环或者
do-while循环等等 。
下面通过几个例子来介绍循环嵌套的概念和运用 。
【 例 3.26】 打印如下形式的乘法小九九表:
1*1=1
2*1=2 2*2=4
……
9*1=9 9*2=18 9*3=27 …… 9*9=81
分析:表体共九行,所以首先考虑一个打印九行的算法:
for(i=1;i<=9;i++)
{ 打印第 i行 }
其次考虑如何 "打印第 i行 "。 每行都有 i个表达式? *? =积,可以写为:
for(j=1;j <= i;j++)
{ 打印第 j个表达式 }
循环的嵌套实例
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录打印第 j个表达式,可写为:
printf("%d*%d=%-3d",i,j,i*j);
在写这个语句时,不写换行,只能在第 j个表达式输出后写一个语句使之换行 。
printf("\n");
综上所述,打印以上形式的乘法小九九表的程序如下:
【 例 3.26】 /*程序名为 l3_26.cpp。 */
#include "stdio.h"
main()
{ int i,j; /* i,j 分别控制行和列的输出 */
for(i=1;i<=9;i++)
{ for(j=1;j <= i;j++)
printf("%d*%d=%-3d",i,j,i*j);
printf("\n"); /*另起一行 */
}
}
3.3.6 break语句和 continue语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
1,break语句
2,continue语句
1,break语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回 3.3.6目录
1,break语句前面已经介绍过用 break语句跳出当前的 switch语句流程 。 在循环结构中,也可以用 break语句使流程跳出本层循环体,从而提前强制性结束本层循环 。
break语句的一般形式为:
break;
【 例 3.28】 在循环体中 break语句执行示例 。
#include "stdio.h"
main() /*程序名为 l3_28.cpp。 */
{ int i,s=0;
for(i=1;i<=10;i++)
{ s=s+i;
if(s>5) break;
printf("s=%d\n",s);
}
printf("使用 break语句时,s的最终值为,%d\n",s);
}
break语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

程序运行后的输出结果如下:
s=1
s=3
使用 break语句时,s的最终值为,6
本例中,如果没有 break语句,程序将进行 10次循环;但当 i=3时,s的值为 6,if
语句中的表达式 s>5 值为 1,于是执行 break语句,循环立即中断,跳出 for
循环,从而提前中止循环,并转向循环体外的下一条语句 。 此时,s的值为
6。
break语句使用说明:
( 1) 只能在 switch语句体和循环体内使用 break语句 。
( 2) 当 break语句出现在,其作用是跳出该 switch语句体 。 当 break语句出现在循环体中,但并不在 switch语句体内时,则在执行 break语句后,使流程跳出本层循环体 。
返回 3.3.6目录
2,Continue语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

2.continue语句
continue语句的一般形式为:
continue;
【 例 3.30】 将 【 例 3.28】 中的 break语句改用 continue语句,来比较两者的区别 。
#include "stdio.h"
main() /*程序名为 l3_30.cpp。 */
{ int i,s=0;
for(i=1;i<=10;i++)
{ s=s+i;
if(s>5) continue;
printf("s=%d\n",s);
}
printf("使用 continue语句时,s的最终值为,%d\n",s);
}
返回 3.3.6目录
Continue语句
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

程序运行后的输出结果如下:
s=1
s=3
使用 continue语句时,s的最终值为,55
在本例中,当 i=1时,输出 s=1,当 i=2时,输出 s=3,当 i=3时,s的值为 6,
if语句中的表达式 s>5 值为 1,于是执行 continue语句,跳过循环体中余下的语句,而去对 for语句中的 "表达式 3"求值,然后进行 "表达式
2"的条件测试,最后根据 "表达式 2"的值来决定循环是否继续执行 。
不论 continue是作为何种语句成分出现的,都将按此功能执行,这点与 break有所不同 。 可以看出,continue语句的功能是结束本次循环 。
返回 3.3.6目录
3.3.7 编程实训 1
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
【 例 3.32】 编程输出如下图形:
*
***
*****
*******
*********
程序如下:
#include "stdio.h"
main() /*程序名为 l3_32.cpp。 */
{ int i,j;
for(i=1;i<=5;i++)
{ for(j=1;j<=10-i;j++)
printf(" ");
for(j=1;j<=2*i-1;j++)
printf("*");
printf("\n");
}
}
3.3.7 编程实训 2
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节首
【 例 3.33】 求整数 3-100中的素数 。 为了检查某数是否是素数,采用的方法是,
从 n=3起直到 100止,逐个用 i=2~ n/2去试除 n,只要有一个能整除,说明该数不是素数 。 程序如下:
main() /*程序名为 l3_27.cpp。 */
{ int i,n,num;
for(n=3,num=0;n<=100;n++)
{ for(i=2;i<=n-1;i++)
if(n%i==0) break;
if(n==i) /*若 n=i,则说明 n不能被 2~ n-1整除,所以 n为素数 */
{ printf("%4d",n);
num++;
}
} printf("\n素数个数是,%d\n",num);
}
运行结果:
3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89
97
素数个数是,24
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本章目录
3.4.2 综合实训
3.4.1 结构化程序设计方法
3.4 结构化程序设计方法与综合实训
3.4.1 结构化程序设计方法
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

结构化程序设计的思想是由 E.W.Dijkstra等人于上世纪 60年代后期提出的 。 其思想是:一个程序的任何逻辑问题均可用,顺序,,,选择,和,循环,这三种基本逻辑结构来描述 。 实现这些程序流程的语句都是流程控制语句 。
流程控制语句在程序设计中起着重要的作用,通过三种基本控制结构,使结构化程序具有唯一入口和唯一出口,没有死循环 。 再一个特点是程序组织结构化,即程序设计采用自顶向下,逐步细化,功能模块化的方法 。 这种方法就是将程序设计成一个个功能简单独立的模块,
C语言是一种很好的结构化程序设计语言,它提供了比其他高级语言更丰富的流程控制语句 。 有四种语句是顺序执行的,( 1) 空语句; ( 2) 表达式语句; ( 3) 函数调用语句; ( 4) 复合语句 。 选择语句有 if语句和 switch语句 。
循环语句有 for,while和 do-while语句以及一些辅助流程转向语句,如
continue,break等 。 顺序结构,选择结构和循环结构共同作为各种复杂程序的基本构造单元 。 由三种结构经过反复嵌套构成的程序称为结构化程序 。
使用结构化程序设计的优点是:结构化构造减少了程序的复杂性,提高了可靠性,可测试性和可维护性;使用少数基本结构,使程序结构清晰,易读易懂;容易验证程序的正确性 。
循环程序设计是有一定的编程规律和思路的,穷举与迭代是两类具有代表性应用的基本算法 。
本节主要内容是引导读者编程来实现这些基本算法 。 返回本节目录
3.4.2 综合实训 1
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录
【 例 3.34】 用泰勒级数求 e的近似值 。 直到最后一项小于 1e-6为止 。
e=1+1/1!+1/2!+1/3!+… +1/n!+…
程序如下:
/*源程序名为 l3_34.cpp。 泰勒级数 e*/
#include "stdio.h"
main()
{ float e=1.0,t=1.0; /*用 e存放结果,用 t存放 n!,n的值每次加 1*/
int n=1;
while(1/t>1e-6)
{ t=t*n; /*求 n!*/
e=e+1/t; /* 实现求 n!的倒数的和 */
n++;
}
printf("e=%8.6f\n",e);
}
运行结果:
e=2.718282
3.4.2 综合实训 2
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录通过本例可以体现这样一个编程思路:凡是遇到求若干个有规律变化的项的乘积,就可在循环体中用 求累乘积 的 编程通式 t=t*x来编程实现;求其和,用 求累加和 的 编程通式 s=s+x来编程实现,其中 t,s分别为累积,累和,初值分别为
t=1,s=0,x为变化的项的通式 。
【 例 3.35】 百钱百鸡问题 。 公元前,我国古代数学家张丘建在,算经,一书中提出了 "百鸡问题 ":鸡翁一,值钱五,鸡母一,值钱三,鸡雏三值钱一 。
百钱买百鸡,问鸡翁,鸡母,鸡雏各几何?
分析:这是一个有名的不定方程问题 。 设:
cocks:鸡翁数,hens:鸡母数,chicks:鸡雏数,则有:
cocks+hens+chicks=100
5*cocks+3*hens+chicks/3=100
据上述不定方程,很容易得到三个变量的取值条件:
cocks,0-19之间的整数 。
hens,0-33之间的整数 。
chicks,0-100之间的整数 。
解题思路:依次取 cocks值域中的一个值,然后再在试取 hens值域中的每一个值,
根据前两者取值,求出 chicks后,看是否合乎题意,合乎者为解 。
3.4.2 综合实训 3
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境

返回本节目录编程如下,/*源程序名为 l3_35.cpp。 百钱百鸡问题 */
#include "stdio.h"
main()
{ int cocks,hens,chicks;
for(cocks=1;cocks<=19;cocks++)
for(hens=1;hens<=33;hens++)
{ chicks=100-cocks-hens;
if(5*cocks+3*hens+chicks/3.0==100)
printf("cocks=%d,hens=%d,chicks=%d\n",cocks,hens,chicks");
} }
程序运行结果如下:
cocks=4,hens=18,chicks=78
cocks=8,hens=11,chicks=81
cocks=12,hens=4,chicks=84
本例采用的编程算法是 穷举法 。 其 基本思想是,对问题的所有可能状态一一测试,
直到找到解或全部可能状态都测试过为止 。 下面例题为另一类型的穷举问题 。
【 例 3.36】 爱因斯坦的阶梯问题 。
设有一阶梯,每步跨 2阶,最后余 1阶;每步跨 3阶,最后余 2阶;每步跨 5阶,最后余 4阶;每步跨 6阶,最后余 5阶;每步跨 7阶时,正好到阶梯顶 。 问共有多少阶梯?
问题分析:设阶梯数为,ladders,则题中条件可以改写为:
( 1) ladders % 2 =1
( 2) ladders % 3 =2
( 3) ladders % 5 =4
( 4) ladders % 6 =5
( 5) ladders % 7 =0
由条件 ( 5) 知,阶梯数一定为 7的倍数 。 于是可以从 7开始,分别对 7,17,21、
28,35… 数列进行测试,看哪一个符合题意 。 由条件 ( 1) 又知,阶梯数一定是奇数,因此可把上述数列中的数去掉一半 。
算法:依次对 7,7+14,7+14+14,… 用条件 ( 2) ( 3) ( 4) 进行测试,找出符合题意者 。
3.4.2 综合实训 4
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境
) 返回本节目录
3.4.2 综合实训 5
《C
语言程序设计
,(V
isu
al
C+
+
6.
0
环境
) 返回本节目录程序如下:
/*程序名为 l3_36.cpp。 */
#include "stdio.h"
main()
{ int ladders=7;
while(ladders % 3!=2||ladders % 5!=4||ladders % 6!=5)
ladders+=14;
printf("ladders=%d\n",ladders);
}
运行结果:
ladders=119