Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 结构化程序设计 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)

Similar presentations


Presentation on theme: "第3章 结构化程序设计 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)"— Presentation transcript:

1 第3章 结构化程序设计 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
第3章 结构化程序设计 本章导读 本章从实例分析着手,使读者了解并掌握C语言三种基本流程控制结构:顺序、选择、循环结构 ,加深对C语言程序开发设计过程的感性认识,强化培养编程思路,为进一步进行C语言程序设计打下基础。 《 C语言程序设计》 (Visual C++ 6.0环境) 本章主要知识点 (1) 顺序结构及程序设计。 (2)选择结构及程序设计。     (3)循环结构及程序设计。 (4)结构化程序设计方法、编程思路与综合实训 返回本书目录

2 第3章 结构化程序设计 3.1 顺序结构程序设计 3.2 选择结构程序设计 3.3 循环结构程序设计 3.4 结构化程序设计方法与综合实训
第3章 结构化程序设计 《 C语言程序设计》 (Visual C++ 6.0环境) 3.1 顺序结构程序设计 3.2 选择结构程序设计 3.3 循环结构程序设计 3.4 结构化程序设计方法与综合实训 返回本章导读

3 3.1 顺序结构程序设计 3.1.1 顺序结构的C程序实例 3.1.2 顺序结构语句 3.1.3 程序实训
3.1 顺序结构程序设计 《 C语言程序设计》 (Visual C++ 6.0环境) 顺序结构的C程序实例 顺序结构语句 程序实训 返回本章目录

4 3.1.1 C程序实例 C程序实例 《 C语言程序设计》 (Visual C++ 6.0环境)
【例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); } 返回本节目录

5 【例3.1】编程 《 C语言程序设计》 (Visual C++ 6.0环境) 程序运行情况如下: 输入:
< CR > 输出: The area of rectangle is 这个程序属于顺序结构,程序是按照书写的顺序自上而下一步步执行,程序中的每一条语句都被执行一次,且仅能被执行一次。 返回本节目录

6 3.1.2 顺序结构语句1 C语言的顺序结构语句可以分为四大类: 《 C语言程序设计》 (Visual C++ 6.0环境) 1.表达式语句
顺序结构语句1 《 C语言程序设计》 (Visual 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;} 返回本节目录

7 3.1.2 顺序结构语句2 《 C语言程序设计》 (Visual C++ 6.0环境) 例如:{int a=0,b=1,sum;
顺序结构语句2 《 C语言程序设计》 (Visual C++ 6.0环境) 例如:{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); 返回本节目录

8 3.1.3 程序实训【例3.2】 C程序实例 《 C语言程序设计》 (Visual C++ 6.0环境)
程序实训【例3.2】 C程序实例 《 C语言程序设计》 (Visual C++ 6.0环境) 【例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; } 程序运行情况如下: Enter a and b: < CR > a=123,b=456 a=456,b=123 返回本节目录

9 3.1.3 程序实训【例3.3】 《 C语言程序设计》 (Visual C++ 6.0环境)
程序实训【例3.3】 《 C语言程序设计》 (Visual C++ 6.0环境) 注意:在程序中交换两个变量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); 返回本节目录

10 3.1.3 程序实训【例3. 3】 《 C语言程序设计》 (Visual C++ 6.0环境)
程序实训【例3. 3】 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: < CR > 则输出的结果为: (1) x= (2) x= 《 C语言程序设计》 (Visual C++ 6.0环境) 返回本节目录

11 3.1.3 程序实训【例3.4】 《 C语言程序设计》 (Visual C++ 6.0环境)
程序实训【例3.4】 【例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); } 《 C语言程序设计》 (Visual C++ 6.0环境) 程序运行时: 输入:B<CR> 输出: The upper case is B . The lower case is b . 返回本节目录

12 3.2 选择结构程序设计 3.2.1 选择结构的C程序实例 3.2.2 if 语句 3.2.3 switch 语句 3.2.4 程序实训
3.2 选择结构程序设计 《 C语言程序设计》 (Visual C++ 6.0环境) 选择结构的C程序实例 if 语句 switch 语句 程序实训 返回本章目录

13 3.2.1 选择结构的 C程序实例 《 C语言程序设计》 (Visual 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语言程序设计》 (Visual C++ 6.0环境) 返回本节目录

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

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

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

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

18 1. if语句的一般形式实例 《 C语言程序设计》 (Visual C++ 6.0环境)
【例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); } 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.2.2目录

19 1. if语句的一般形式实例 《 C语言程序设计》 (Visual 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; 但有些判断不能用条件表达式完成,或者很繁琐、表达不清晰。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.2.2目录

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

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

22 3.非关系、非逻辑表达式构成的条件表达式2 《 C语言程序设计》 (Visual C++ 6.0环境)
【例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; 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.2.2目录

23 3.非关系、非逻辑表达式构成的条件表达式3 《 C语言程序设计》 (Visual 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目录

24 4. if语句的嵌套1 在一个if语句中又包含另一个if语句,从而构成了if语句的嵌套使用。内嵌的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。例如: 《 C语言程序设计》 (Visual C++ 6.0环境) 【例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"); printf("a=b\n"); } 返回3.2.2目录

25 4. if语句的嵌套2 《 C语言程序设计》 (Visual C++ 6.0环境)
if与else的配对规则 if语句出现嵌套形式时,C语言规定:else子句总是和前面最近的不带else子句的if语句配对,与书写格式无关。注意从书写格式要有层次感(好的程序员应该养成这一习惯,以便他人理解你的程序和自己将来的修改)。如果if的数目和else的数目相同,从内层到外层一一对应,不易出错。如果if与else的数目不一致,为实现编程者的意图,必要的时候必须加"{}",来强制确定配对关系。否则,就不能实现编程者的真正意图。 返回3.2.2目录

26 4. if语句的嵌套实例1 《 C语言程序设计》 (Visual 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 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.2.2目录

27 4. if语句的嵌套实例2 《 C语言程序设计》 (Visual 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"); } 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.2.2目录

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

29 3.2.3 switch 语句 1. switch语句的一般形式 2. switch语句的执行过程 3. switch语句的实例
《 C语言程序设计》 (Visual C++ 6.0环境) 1. switch语句的一般形式 2. switch语句的执行过程 3. switch语句的实例 返回本节目录

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

31 1 . switch语句的一般形式 《 C语言程序设计》 (Visual 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 语句标号后的语句可以不写。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.2.3目录

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

33 3 . switch语句的实例 3. switch语句的实例 《 C语言程序设计》 (Visual C++ 6.0环境)
【例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目录

34 3 . switch语句的实例 《 C语言程序设计》 (Visual 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> 你获得一听芬达 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.2.3目录

35 3.3 循环结构程序设计 3.3.1 循环结构的C程序实例 3.3.2 while语句 3.3.3 do-while语句
3.3 循环结构程序设计 循环结构的C程序实例 《 C语言程序设计》 (Visual C++ 6.0环境) while语句 do-while语句 for 语句 循环的嵌套 break语句和continue语句 程序实训 返回本章目录

36 3.3.1 循环结构的C程序实例 《 C语言程序设计》 (Visual C++ 6.0环境)
【例3.19】有一张厚度为0.1毫米的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可以抵达(再对折一次就超过)珠穆朗玛峰的高度?程序如下: main() /*程序名为l3_14.cpp。*/ { double h=0.1; int n=0; /* n用来累计对折次数*/ while(h<= ) { 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语句。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回本节目录

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

38 while语句实例 3.while语句实例 《 C语言程序设计》 (Visual C++ 6.0环境)
/*程序名为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 返回本节目录

39 3.3.3 do-while语句 1.do-while语句的一般形式 2.do-while语句的执行过程
《 C语言程序设计》 (Visual C++ 6.0环境)      do <循环体语句> while(<表达式>); 说明:do是C语言的关键字,必须和while联合使用。do-while循环由do开始,用while结束;注意,在while结束后必须有分号,它表示该语句的结束。其它同while循环语句。 2.do-while语句的执行过程   (1)执行do后面的<循环体语句>。 (2)计算while后一对括号中的<表达式>的值。当值为非零时,转去执行步骤(1)。当值为零时,则执行步骤(3)。 (3)退出while循环。 返回本节目录

40 do-while语句实例 3.do-while语句实例 《 C语言程序设计》 (Visual C++ 6.0环境)
#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*/ } 运行结果: 其和是5050 在本例中,循环条件和循环体以及得到的结果都是和while循环一样的,只是用do-while语句来实现。 返回本节目录

41 3.3.4 for 语句 1.for语句的一般形式 《 C语言程序设计》 (Visual C++ 6.0环境)
<循环体语句> 说明: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++); 返回本节目录

42 for 语句的执行过程 2.for语句的执行过程 3.for语句实例 《 C语言程序设计》 (Visual C++ 6.0环境)
①首先计算<表达式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型变量能表示的范围,则设置为长整型*/ 返回本节目录

43 for 语句的实例 《 C语言程序设计》 (Visual 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是循环控制变量,每次循环时,它的值都被改变且进行检验。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回本节目录

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

45 3.3.5 循环的嵌套 《 C语言程序设计》 (Visual C++ 6.0环境)
在一个循环内又完整地包含另一个循环,称为循环的嵌套,即循环体自身包含循环语句。 前面介绍了三种类型的循环,它们自己本身可以嵌套,如在for循环中包含另一个for循环,也可以互相嵌套,例如可以for循环中包含一个while循环或者do-while循环等等。 下面通过几个例子来介绍循环嵌套的概念和运用。 《 C语言程序设计》 (Visual C++ 6.0环境) 【例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个表达式} 返回本节目录

46 循环的嵌套实例 《 C语言程序设计》 (Visual C++ 6.0环境) 打印第j个表达式,可写为:
printf("%d*%d=%-3d",i,j,i*j); 在写这个语句时,不写换行,只能在第j个表达式输出后写一个语句使之换行。 printf("\n"); 综上所述,打印以上形式的乘法小九九表的程序如下: 《 C语言程序设计》 (Visual C++ 6.0环境) 【例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"); /*另起一行*/ } 返回本节目录

47 3.3.6 break语句和continue语句 1. break语句 2. continue语句
《 C语言程序设计》 (Visual C++ 6.0环境) 1. break语句 2. continue语句 返回本节目录

48 1. break语句 1. break语句 《 C语言程序设计》 (Visual C++ 6.0环境)
前面已经介绍过用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); 返回3.3.6目录

49 break语句 《 C语言程序设计》 (Visual 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语句后,使流程跳出本层循环体。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.3.6目录

50 2. Continue语句 2.continue语句 《 C语言程序设计》 (Visual C++ 6.0环境)
【例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目录

51 Continue语句 《 C语言程序设计》 (Visual 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语句的功能是结束本次循环。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回3.3.6目录

52 3.3.7 编程实训1 《 C语言程序设计》 (Visual C++ 6.0环境) 【例3.32】编程输出如下图形: * *** *****
编程实训1 【例3.32】编程输出如下图形: * *** ***** ******* ********* 程序如下: 《 C语言程序设计》 (Visual C++ 6.0环境) #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"); } 返回本节目录

53 3.3.7 编程实训2 《 C语言程序设计》 (Visual C++ 6.0环境)
【例3.33】求整数3-100中的素数。为了检查某数是否是素数,采用的方法是,从n=3起直到100止,逐个用i=2~n/2去试除n,只要有一个能整除,说明该数不是素数。程序如下: 《 C语言程序设计》 (Visual C++ 6.0环境) 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); 运行结果: 素数个数是:24 返回本节首

54 3.4 结构化程序设计方法与综合实训 3.4.1 结构化程序设计方法 3.4.2 综合实训
《 C语言程序设计》 (Visual C++ 6.0环境) 结构化程序设计方法 综合实训 返回本章目录

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

56 3.4.2 综合实训1 《 C语言程序设计》 (Visual C++ 6.0环境)
综合实训1 【例3.34】用泰勒级数求e的近似值。直到最后一项小于1e-6为止。 e=1+1/1!+1/2!+1/3!+…+1/n!+… 程序如下: /*源程序名为l3_34.cpp。 泰勒级数 e*/ 《 C语言程序设计》 (Visual C++ 6.0环境) #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= 返回本节目录

57 3.4.2 综合实训2 《 C语言程序设计》 (Visual C++ 6.0环境)
综合实训2 通过本例可以体现这样一个编程思路:凡是遇到求若干个有规律变化的项的乘积,就可在循环体中用求累乘积的编程通式t=t*x来编程实现;求其和,用求累加和的编程通式s=s+x来编程实现,其中t 、s分别为累积、累和,初值分别为t=1,s=0,x为变化的项的通式。 《 C语言程序设计》 (Visual C++ 6.0环境) 【例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后,看是否合乎题意,合乎者为解。 返回本节目录

58 3.4.2 综合实训3 《 C语言程序设计》 (Visual C++ 6.0环境)
综合实训3 编程如下:/*源程序名为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 本例采用的编程算法是穷举法。其基本思想是:对问题的所有可能状态一一测试,直到找到解或全部可能状态都测试过为止。下面例题为另一类型的穷举问题。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回本节目录

59 3.4.2 综合实训4 《 C语言程序设计》 (Visual C++ 6.0环境) 【例3.36】爱因斯坦的阶梯问题。
综合实训4 【例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、 、…用条件(2)(3)(4)进行测试,找出符合题意者。 《 C语言程序设计》 (Visual C++ 6.0环境) 返回本节目录

60 3.4.2 综合实训5 《 C语言程序设计》 (Visual C++ 6.0环境) ladders=119 程序如下:
综合实训5 《 C语言程序设计》 (Visual 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 返回本节目录


Download ppt "第3章 结构化程序设计 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)"

Similar presentations


Ads by Google