C语言项目开发教程PPT第2章.ppt

上传人:牧羊曲112 文档编号:6504383 上传时间:2023-11-07 格式:PPT 页数:86 大小:258KB
返回 下载 相关 举报
C语言项目开发教程PPT第2章.ppt_第1页
第1页 / 共86页
C语言项目开发教程PPT第2章.ppt_第2页
第2页 / 共86页
C语言项目开发教程PPT第2章.ppt_第3页
第3页 / 共86页
C语言项目开发教程PPT第2章.ppt_第4页
第4页 / 共86页
C语言项目开发教程PPT第2章.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《C语言项目开发教程PPT第2章.ppt》由会员分享,可在线阅读,更多相关《C语言项目开发教程PPT第2章.ppt(86页珍藏版)》请在三一办公上搜索。

1、第2章,程序控制结构,算法的实现过程是由一些列操作组成的,这些操作之间的执行次序就是程序的控制结构。结构化程序设计方法强调使用的基本结构是顺序、选择和循环3种控制流程,任何简单或复杂的算法都可以由它们组合而成。一般情况下,程序中的代码按其出现的顺序依次执行,这叫做“顺序执行”。顺序结构是程序设计中最简单、最常用的基本结构。选择结构程序不是按照语句的顺序依次执行,而是根据给定的条件成立与否,决定下一步选取哪条执行路径。选择结构的特点是:在各种可能的操作分支中,根据所给定的选择条件是否成立,来决定执行某一分支的相应操作,而且在任何情况下,无论分支多少,仅选其一。算法中有时需要反复执行某一特定操作,

2、循环控制就是由特定的条件决定某些语句重复执行的控制方式。由于顺序结构比较常见,本章中着注重介绍选择控制结构和循环控制结构的语法规则、语句的使用和程序执行流程等知识。,任务2.1 测身高,任务目标掌握关系运算符和关系表达式的概念和用法。掌握逻辑运算符和逻辑表达式的概念和用法。掌握条件运算符和条件表达式的概念和用法。掌握if分支语句的用法,包括单分支语句、双分支语句以及多分支语句。掌握switch分支语句的用法。完成测身高程序。,2.1.1 控制语句中的运算符和表达式1关系运算符和关系表达式,关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断比较的结果

3、是否符合给定的条件。例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3”条件,因此关系表达式的值为“真”(即“条件满足”),用值1表示;如果a的值为2,不满足“a3”条件,则关系表达式的值为“假”,用数值0表示。C语言中提供6种不同的关系运算符,简单介绍如表2-1所示。表2-1 关系运算符运 算 符名 称运算规则运算对象运算结果举 例表达式值大于a=2;b=3;ab;0=大于等于a=2;b=3;a=b;0=等于a=2;b=3;a=b;0!=不等于a=2;b=3;a!=b;1当多种运算符在一个表达式中同时使用时,要注意运算符的优先级,防止记错运算符优先级的

4、最好方法是添加圆括号。关系运算符的优先级关系如下:,(1)前4种关系运算符(,=)的优先级别相同,后两种也相同。前4种高于后2种。例如,“”优先于“=”。而“”与“a+b等效于c(a+b)。ab!=c等效于(ab)!=c。a=bc等效于a=(bc)。,【案例2-1】关系表达式。#include void main()int a,b,c,x,y;a=1,b=2,c=3;x=ab;y=a=c);printf(%dn,a=b!=2);printf(%dn,a+54);printf(%dn,a!=b!=c);程序运行结果如下:0,111011注意,要区分关系运算符“=”和赋值运算符“=”。,【案例2-

5、2】运算符“=”和“=”的区分。#include void main()int a=3,b=2,c1,c2;c1=(a=b);printf(a=%d,b=%d,c1=%dn,a,b,c1);c2=(a=b);printf(a=%d,b=%d,c2=%dn,a,b,c2);程序运行结果如下:a=2,b=2,c1=2a=2,b=2,c2=1“=”为赋值操作,其结果为将右边表达式的值赋给左边变量,会改变左边变量的值,而“=”为关系表达式,用来判断左右两边表达式的值是否相同,相同时表达式结果为1,不同时为0,不会改变左右两边表达式的值。,2逻辑运算符和逻辑表达式,当判断条件有多个时,只执行一个判断并不

6、足以确定程序执行流程,而是需要同时执行多个比较并综合多个比较结果来进行判断,这时就需要用到逻辑运算和逻辑表达式。C语言提供三种逻辑运算符,这几种运算符的简单介绍如表2-2所示。表2-2 逻辑运算符运 算 符名 称运算规则运算对象运算结果举 例表达式值!非逻辑非(NOT)数字、整型或实数型逻辑值1或0a=1;!a0a|b1“&”和“|”是“双目运算符”,它要求有两个运算量(操作数),如(ab)&(xy),(ab)|(xy)。“!”是一目运算符,只要求一个运算量,如!(ab)。表2-3为逻辑运算的“真值表”。用它表示当a和b的值为不同组合时,各种逻辑运算所得到的值。,程序的目的是解决客观世界中存在

7、的问题,因此常常需要模拟客观世界中的事物或者概念,如学生。在计算机中是如何表示一个学生或者其他事物的呢?首先要做的是找到这个事物中会被关注的信息。比如在学生信息管理系统中,学生的学号、姓名、年龄、性别、院系等信息会被关注,则在计算机中将这些信息表示出来,即可代表一个学生。但是不同的属性具有不同的数据类型,如学号为整型或者字符型、姓名为字符型、性别为字符型、学院为字符型、成绩为浮点型等,如表2-3所示。表2-3 真值表ab!a!ba&ba|b真真假假真真真假假真假真假真真假假真假假真真假假除了逻辑非以外,逻辑运算符的优先级低于关系运算符,但逻辑非的优先级高于算数运算符。,如前所述,逻辑表达式的值

8、应该是一个逻辑量“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。例如:若a=4,则!a的值为0。因为a的值为非0,对它进行非运算,值为1。若a=4,b=5,则a&b的值为1。因为a和b的值都为非0,对它进行与运算,值为1。a、b同前,a|b的值为1。a、b同前,!a|b的值为1。4&0|2的值为1。通过这几个例子可以看出,由系统给出的逻辑运算结果不是0就是1。而参加逻辑运算的运算对象可以是任何数值。如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些是作为逻辑

9、运算的对象。例如:53&2|83”。在关系运算符两侧的5和3作为数值参加关系运算,“53”的值为1。再进行“1&2”的运算,此时1和2均是逻辑运算对象,均为“真”处理,因此结果为1。再往下进行“1|84-!0”的运算。根据优先次序,“!0”的结果为1,表达式变成“1|83”,“83”的结果为0。最后得到“1|0”的结果为1。,【案例2-3】逻辑运算。#include void main()int a,b,c;a=2,b=3;printf(%d,(a=0)程序运行结果如下:0 a=20 b=0a=2,b=1,c=1a=2,b=2,c=1&和|均是短路运算符。在一个或多个&相连的表达式中,只要有一

10、个操作数为0,则整个表达式为0。同理,在|相连的表达式中,只要前面有一个表达式结果为0,则整个表达式的结果为0,后续运行不再继续进行。所以在“+a|+b&+c”中,由于“+a”的结果为2,则整个与逻辑表达式的结果为1,后续的“+b”和“+c”不再执行。但表达式如果为“+a&+b&+c”,则需要依次执行“+a”、“+b”和“+c”来得到最终逻辑表达式的结果。,3条件运算符和条件表达式,条件运算符是“?”,它是C语言中唯一的三目运算符。其基本语法为:表达式1?表达式2:表达式3求值过程为:先求表达式1,若其值为真(非0),则将表达式2的值作为整个表达式的取值;若表达式1的值为假(0),则将表达式3

11、的值作为整个表达式的取值。例如:max=(ab)?a:b;其执行结果为将a和b中较大的值赋值给max。条件运算符优先级高于赋值、逗号运算符,低于其他运算符。例如:m=10&b-20?a:b等价于:(a+=10&b-20)?a:bx=3+a5?100:200等价于:x=(3+a5)?100:200),【案例2-4】条件运算符。#include void main()int a,b,c,d,max;a=5;b=7;c=12;d=4;max=(ab?a:b);max=(maxc?max:c);max=(maxd?max:d);printf(The maximal number is%d.n,max)

12、;程序运行结果如下:The maximal number is 12.,2.1.2 if语句,if语句是C语言中最简单的流程控制语句,if语句的作用是判断多给定的条件是否满足,根据条件判定结果(真或假)来决定执行什么操作。其基本语法为:if(布尔表达式)代码段其含义是,如果布尔表达式的值为真,则继续执行下面的代码段,否则跳过这个代码段,执行后面的语句。布尔表达式可以为常量、变量、关系表达式或逻辑表达式。代码段可以是一条语句或多条语句,如果只有一条语句,则可以省略大括号。C语言的if语句有三种基本形式。,1单分支if语句,if(表达式)语句段 这是if语句最简单的一种形式。它根据表达式的值进行判

13、定,以决定是否执行某个程序片段。单分支if语句的执行流程如图2-1所示。图2-1 单分支if语句执行流程图,【案例2-5】数字排序。#include void main()int a,b,c,t;printf(请输入三个整数:);scanf(%d%d%d,该程序的运行结果如下:请输入三个整数:4 9 7a=4,b=3,c=7排序后结果为:a=3,b=4,c=7,2双分支if语句,双分支if语句的一般形式为:if(布尔表达式)代码段else代码段根据布尔表达式判定选择哪个分支执行。如果表达式值为真,则执行if分支语句组;如果为假,则执行else分支语句。if-else语句的执行流程如图2-2所示

14、。图2-2 双分支if语句执行流程图,【案例2-6】三角形判定。#include void main()int a,b,c;printf(请输入三角形的三条边:);scanf(%d%d%d,分别输入正确的边和错误的边,程序运行结果如下:请输入三角形的三条边:0 2 3a=0,b=2,c=3两边之和小于第三边或有边为0,不构成三角形请输入三角形的三条边:1 2 3a=1,b=2,c=3两边之和小于第三边或有边为0,不构成三角形请输入三角形的三条边:2 3 4a=2,b=3,c=4可以构成三角形,3多分支if语句,多重分支if语句的一般形式为:if(布尔表达式1)代码段1else if(布尔表达式

15、2)代码段2else if(布尔表达式n-1)代码段n-1 else 代码段n 前面所给的两种形式的if语句一般适用于对判定结果做出两种选择的情况,即有两个分支。但是实际情况往往比较复杂,常常会出现多个分支的情况,此时就可以采用第三种形式的if分支语句。其执行过程为:依次判断表达式的值,当某个表达式的值为真时,则执行对应的语句,然后跳转到整个if语句之外的语句执行;如果所有的表达式都为假,则执行else语句对应的程序段,然后继续执行整个程序。,【案例2-7】编写C语言程序,从键盘上输入一个字符,识别输入的字符类型:大写字母、小写字母、数字或其他类型。#include void main()ch

16、ar c;printf(请输入一个字符:);scanf(%c,依次输入一个数字、一个大写字母、一个小写字母和一个其他字符,程序运行结果如下:请输入一个字符:5您输入的字符为5,这是一个数字请输入一个字符:t您输入的字符为t,这是一个小写字母请输入一个字符:E您输入的字符为E,这是一个大写字母请输入一个字符:!您输入的字符为!,这是一个其他字符在多重if语句中,要注意各个表达式所表示的条件必须是互相排斥的。也就是说,只有表达式1不满足时才会判断表达式2,而当表达式2不满足时才会判断表达式3,其余依次类推,只有所有表达式均不满足时才执行最后的else语句。也就是说,在所有的条件表达式中,应该只有一

17、个条件表达式是为真的,并执行器对应的代码段;其余表达式均为假,所对应的代码段均不执行。,【案例2-8】成绩等级判定。编写程序,让用户输入一个在0100以内的学生考试成绩(整数),要求计算机判定并输入成绩等级:90分以上为优秀;8089分为良好;7079分为中等;6069分为及格,60分以下为不合格。#include void main()int score;printf(请输入学生成绩(0100):);scanf(%d,程序运行结果如下:请输入学生成绩(0100):34您的成绩不合格请输入学生成绩(0100):87您的成绩为良好请输入学生成绩(0100):104输入数据不合法,2.1.3 sw

18、itch 语句,用if嵌套的语句处理多层次的情况分支太多,程序冗长而且可读性低,C语言提供switch语句直接处理多分支选择。switch的一般形式如下:switch(表达式)case常量表达式1:代码段1;break;case常量表达式2:代码段2;break;case常量表达式n:代码段n;break;default:代码段n+1switch 语句根据一个表达式的值选择要执行的代码片段,其流程图和if-else-if 语句类似。其执行过程为:先计算表达式的值,然后逐个与case 之后的常量比较,当表达式的值和某个常量的值相等时,执行对应常量后面的语句组。如果表达式的值和所有常量的值均不相等

19、,则执行default 之后的代码段,如果没有default,则什么也不执行,直接执行后续代码。,switch 之后的表达式,可以是整形表达式、字符型表达式或枚举型表达式。每一个case 之后的值都要相互不同。当表达式的值和一个case 的值相等时,则执行该case 后的代码段,后续其他case 则不再进行比较,所以代码段之后一定要加一个break,表示跳转到switch 之后的语句,如果不加,则会出现异常错误,最后一个分支可以不加break。多个case 可以共用一组执行语句,如:switch(week)case 1:case 2:case 3:case 4:case 5:printf(“工

20、作日”);case 6:case 7:printf(“假期”);default:printf(“输入错误”);用switch 语句,同样可以实现成绩等级判定程序。,【案例2-9】成绩等级判定2。#include void main()int score;printf(请输入学生成绩(0100):);scanf(%d,分别输入各个等级的数据,程序运行结果如下:请输入学生成绩(0100):62您的成绩为合格请输入学生成绩(0100):3您的成绩为不合格请输入学生成绩(0100):94您的成绩为优秀请输入学生成绩(0100):104您的成绩为优秀请输入学生成绩(0100):72您的成绩为中等,2.1

21、.4 任务实现,1问题描述每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。小孩成人后的身高与其父母的身高和自身的性别密切相关。设faHeight为其父身高,moHeight为其母身高,身高预测公式为:男性成人时身高=(faHeight+moHeight)0.54cm 女性成人时身高=(faHeight0.923+moHeight)/2cm 此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生饮食习惯,那么可增加身高1.5%。编程从键盘输入用户的性别、父母身高、是否喜爱体育锻炼、是否有良好的饮食习惯等

22、条件,利用给定公式和身高预测方法对孩子的身高进行预测。,2要点解析,要计算孩子的身高,首先要确定计算表达式。而身高的计算公式是由父母身高、性别、饮食习惯和体育锻炼相关的,所以要根据特定的条件选择来确定身高表达式,这就要用到选择控制结构。最常用的选择控制语句为if语句,本案例中选择if语句来实现这一功能。程序具体流程为:输入父母身高;确定孩子性别;选择是否经常锻炼;选择是否有良好的饮食习惯;确定身高计算公式;计算身高并输出。程序中用到的变量有:faHeight 和 moHeight float类型,分别表示孩子父母的身高。sex char类型,用来表示孩子的性别,输入字符M表示男性,F表示女性。

23、sport char类型,用来表示是否喜欢体育锻炼,输入字符Y表示经常体育锻炼,N表示不经常体育锻炼。dietchar类型,用来表示是否有良好的饮食习惯,输入字符Y表示有良好的饮食习惯,N则为没有。,3程序实现,程序具体实现过程如下:#include void main()float faHeight,moHeight,height;char sex,sport,diet;printf(请分别输入父母的身高,以cm为单位:);scanf(%f%f,if(sport=Y|sport=y),height=height*(1+0.02);printf(是否有良好的饮食习惯,Y表示是,N表示否:);f

24、flush(stdin);scanf(%c,程序运行结果如下:请分别输入父母的身高,以cm为单位:180 163180.000000 163.000000请输入孩子的性别,M表示男性,F表示女性:f是否经常进行体育锻炼,Y表示是,N表示否:y是否有良好的饮食习惯,Y表示是,N表示否:n预测的孩子的身高为:170.379,任务2.2 学生信息管理系统之成绩统计,任务目标了解循环控制结构的概念。掌握for循环语句的用法。掌握while循环语句的用法。掌握do-while循环语句的用法。完成学生信息统计任务。,2.2.1 for循环,for语句是C语言所提供的功能更强、使用更广泛的一种循环语句。fo

25、r 语句的一般形式为:for(表达式1;表达式2;表达式3)循环语句其中,表达式1:通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。表达式2:通常是循环条件,一般为关系表达式或逻辑表达式。表达式3:通常可用来修改循环变量的值,一般是赋值语句。这3个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。省略表达式时,表达式之间的逗号不能省略。循环语句在条件满足的时候重复执行。,for语句的执行过程如下:首先计算表达式1的值。再计算表达式2的值,若值为真(非0)则执行循环体一次,否则跳出循环。计算表达式

26、3的值,然后转回到表达式2重复执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for语句的执行过程如图2-3所示。图2-3 for循环流程图,【案例2-10】从键盘输入一个正整数n,求1,2,3,n之和并输出结果。该程序显然应该用的循环结构,读取n之后,求n个数之和,设置循环变量,计算循环次数,当计算次数小于等于n时执行循环体,大于n时结束。源程序如下:#include void main()int n=0,sum=0;/初始时n为0,和sum为0printf(请输入整数n:);scanf(%d,程序运行结果如下:请输

27、入整数n:51到5之和为15Press any key to continue该程序中for循环中首先执行表达式1,将i 赋值为1,然后每次判断i的值决定是否继续循环,每次执行循环体之后i的值加1。当i的值超过n之后,循环结束。,【案例2-11】输出菲波那契(Fibonacci)数列的前40个数,每行5个。斐波那契数列的性质为:第一个数为1,第二个数为1,其余每个数为其前面两个数之和。即:f(1)=1 n=1f(2)=1 n=2f(n)=f(n-1)+f(n+1)n=3#include#define N 40void main()int f,f1,f2;f1=1;f2=1;int i;prin

28、tf(Fibonacci的前%d项为:n,N);printf(%10d%10d,f1,f2);for(;i=N;i+)f=f1+f2;/生成新的Fibonacci数printf(%10d,f);if(i%5=0)printf(n);f1=f2;/重新设置f1和f2f2=f;,程序运行结果如下:Fibonacci的前40项为:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 13462

29、69 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155本例的for语句中,表达式1已省去,循环变量的初值在for语句之前已经定义。for语句中的各表达式都可省略,但分号间隔符不能少。如:for(;表达式;表达式)省去了表达式1,for(表达式;表达式)省去了表达式2。for(表达式;表达式;)省去了表达式3,for(;)省去了全部表达式。,注意:上述程序中用“#define N 40”,即以常量的形式定义N的值而不是在main函数中声明,这是一个很好的编程习惯。如果要改变输出数字的个数,如

30、改为输出斐波那契数列的前30项,则只要在define语句中修改即可,而不需要改变循环体中语句。这在程序规模很大、变量在多处都被使用时尤其重要。除了表达式以外,循环体也可以是空语句。如:int n=0;printf(input a string:n);for(;getchar()!=n;n+);printf(%d,n);本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样,就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的printf语句当成循环体来执行。反过来说,如循环体不为

31、空语句时,决不能在表达式的括号后加分号,这样又会认为循环体是空语句而不能反复执行。这些都是编程中常见的错误,要十分注意。,【案例2-12】分别输出1100之间的奇数和偶数。#include#define N 100void main()int i;printf(1100之间的奇数有:n);for(i=1;i=100;i=i+2)printf(%5dt,i);printf(n);printf(1100之间的偶数有:n);for(i=2;i=100;i=i+2)printf(%5dt,i);,程序运行结果如下:1100之间的奇数有:1 3 5 7 9 11 13 15 17 1921 23 25

32、27 29 31 33 35 37 3941 43 45 47 49 51 53 55 57 5961 63 65 67 69 71 73 75 77 7981 83 85 87 89 91 93 95 97 991100之间的偶数有:2 4 6 8 10 12 14 16 18 2022 24 26 28 30 32 34 36 38 4042 44 46 48 50 52 54 56 58 6062 64 66 68 70 72 74 76 78 8082 84 86 88 90 92 94 96 98 100,2.2.2 while循环,while循环的一般形式如下:while(表达式)

33、语句组其中,表达式描述循环的条件,语句组为循环体,描述要反复执行的操作。while语句的执行过程为:先计算表达式的值,如果表达式的值为真,则循环条件成立,执行循环体,直到表达式不成立为止。因此,while循环又称当型循环,表示当条件成立即循环执行,适用于循环次数不确定时。图2-4 while循环流程图while语句的特点是:先判断,再执行。如果表达式一开始就不成立,则循环体一次也不执行。while语句的执行流程如图2-4所示。,注意循环条件的编辑问题,即循环的初值和终值有没有被多计算或少计算,如while(i10)和while(i=10)相比,循环体执行的次数不同。循环条件的设置非常重要,否则

34、可能会导致死循环。例如,当循环条件为永真时,则循环体就会无休止地重复执行,出现死循环。例如:while(1),若执行该段程序,则循环条件永远满足,循环体不断重复执行,直到强制关闭程序为止。死循环会大量占用系统资源,在编程过程中一定要注意。循环体中必须有改变循环条件的语句,否则也会导致死循环。例如,i 初始值为1,循环条件为while(i5),若循环体中并没有改变i值的操作,则该条件一直可以满足,同样会导致死循环。当然,也可以在循环体中添加其他语句来终止循环。读者可以尝试自己编写一个死循环程序,观察程序运行结果。,【案例2-13】用while语句实现输出1100以内的所有奇数和偶数。#inclu

35、de#define N 100void main()int i;printf(1100之间的奇数有:n);i=1;while(i=N)printf(%5dt,i);i=i+2;printf(n);printf(1100之间的偶数有:n);i=2;while(i=N)printf(%5dt,i);i=i+2;,程序运行结果如下:1100之间的奇数有:1 3 5 7 9 11 13 15 17 1921 23 25 27 29 31 33 35 37 3941 43 45 47 49 51 53 55 57 5961 63 65 67 69 71 73 75 77 7981 83 85 87 89

36、 91 93 95 97 991100之间的偶数有:2 4 6 8 10 12 14 16 18 2022 24 26 28 30 32 34 36 38 4042 44 46 48 50 52 54 56 58 6062 64 66 68 70 72 74 76 78 8082 84 86 88 90 92 94 96 98 100通过案例2-13可以看出,for循环语句和while循环语句在大部分情况下可以互换使用,但是在某些情况下,比较适合用while语句而不适合用for。比如案例2-14。,【案例2-14】从键盘输入一系列数字,求其平均数。由于数字的个数是不确定的,所以无法设置for循

37、环中的循环条件,因此也不能用for循环来实现这一功能。用户不断地输入数据,直到输入-999为止,表示没有新的数据。用while实现这一功能,源程序如下:#include#define N 100void main()float num=0,sum=0,average;/分别存储读入的数据、数据总和和平均值int i=0;/数据个数printf(请输入数据:);scanf(%f,程序执行结果如下:请输入数据:4请输入数据:5请输入数据:6请输入数据:-5请输入数据:-999输入结束,共输入4个数据,平均值为2.50,2.2.3 do-while循环,do-while语句的一般形式为:do 语句组

38、while(表达式);do-while语句和while语句类型,其执行过程为:先执行循环体一次,然后计算表达式的值,如果表达式的值为真,则循环条件成立,重复执行循环体;若表达式的值为假,则退出循环,转而执行循环语句之后的语句。图2-5 do-while语句流程图do-while的执行流程如图2-5所示。do-while为“直到型”,即重复执行循环体,直到条件不满足为止。do-while和while的区别如下:,(1)do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。(2)在while语句中,表达式之后

39、不能加分号,而在do-while中表达式的后面必须加分号。与while类似,循环条件的设置很重要,否则会导致死循环。同样,循环体中必须有改变循环条件的语句。,【案例2-15】求一个正整数各位数字之和。#include void main()int num,i=0;printf(请输入一个正整数:);scanf(%d,该程序运行结果如下:请输入一个正整数:345各位数字之和为:12通过案例2-15,可以看出三种循环结构的区别和联系:,(1)for和while循环都是在执行循环体之前先判断循环条件,循环体中的语句可能执行也可能不执行;而do-while循环是先执行循环体再判断循环条件,循环体中的语

40、句至少执行一次。(2)在选择循环结构时,如果循环次数已知,则选for循环;如果循环次数未知,则选while循环;若需要至少执行一次循环体,则选择do-while循环。(3)三种循环体可以相互替换。,【案例2-16】分别使用for、while、do-while语句实现同一功能:输出0100之间能被3整除的数。源程序如下:/for循环#include#define N 100void main()for(int i=1;i#define N 100void main(),int i=1;while(i#define N 100void main()int i=1;doif(i%3=0)printf

41、(%5d,i);i+;while(i=N);printf(n);程序运行结果如下:3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 4851 54 57 60 63 66 69 72 75 78 81 84 87 90 93 9699,2.2.4 任务实现,1问题描述编写程序,先提示用户输入学生人数,然后再输入所有学生的成绩,最后根据输入数据计算学生成绩的平均分、最高分、最低分、不及格人数、优秀人数等统计信息。本程序的主要功能是不断地输入学生成绩,这显然是一个循环过程。由于是在程序执行过程中才知道学生人数,则需要定义变量控制循环次数,每次循环读入一个学生成绩,

42、并将这个成绩加入到统计信息中。2要点解析学生信息统计程序主要分为四个功能:统计学生平均成绩、计算最高分和最低分、统计不合格学生人数(成绩低于60分)、统计优秀学生人数(成绩高于等于90分)。初始时学生数目是未知的,程序首先要读入学生数目,然后根据学生数目控制循环体运行的次数,因此应适合使用for 循环语句。改变程序的控制方式,改为用户不断地向程序输入成绩信息,直到输入-1为止,统计所输入的所有有效成绩信息,这时应使用while语句。程序中将会用到以下控制变量。num:整型变量,表示学生的总人数,作为循环控制变量。使用while循环时不输入学生的总人数,此时用变量have作为循环控制变量,hav

43、e为1时表示继续读入数据,当读到-1时将have赋值为0,表示没有新的数据输入,开始进行信息统计。score:浮点类型变量,用来读入每一个学生成绩。average:浮点类型变量,用来存储学生成绩的平均值。max和min:浮点类型变量,分别用来存储学生成绩最大值和最小值。flunk和excellent:整型变量,分别用来统计不及格和优秀学生数目。,3程序实现,使用for循环语句的程序实现如下:/学生信息统计程序实现1#include void main()float score,sum=0;/定义学生总成绩int num;/定义循环变量float max=0,min=100;/最大值和最小值,初

44、始时均为0和100int flunk=0,excellent=0;/不及格人数和优秀学生人数,初始时均为0float average;/平均值printf(请输入学生人数:);scanf(%d,for(int i=1;imax)max=score;/计算学生最高成绩if(score=90)excellent+;/统计优秀学生人数average=sum/num;printf(学生平均成绩为:%.1fn,average);printf(学生成绩最高分为:%.1fn,max);printf(学生成绩最低分为:%.1fn,min);printf(不及格学生数目为:%dn,flunk);printf(优

45、秀的学生数目为:%dn,excellent);,输入10个学生成绩信息,程序运行结果如下:请输入学生人数:10请输入第1个学生成绩:74请输入第2个学生成绩:25请输入第3个学生成绩:68请输入第4个学生成绩:96请输入第5个学生成绩:93请输入第6个学生成绩:95请输入第7个学生成绩:83请输入第8个学生成绩:59请输入第9个学生成绩:73请输入第10个学生成绩:77学生平均成绩为:74.3学生成绩最高分为:96.0学生成绩最低分为:25.0不及格学生数目为:2优秀的学生数目为:3也可以使用while循环语句实现上述程序,程序源代码如下:,/学生信息统计程序实现2#include void

46、main()float score=0,sum=0;/定义学生总成绩float max=0,min=100;/最大值和最小值,初始时均为0和100int flunk=0,excellent=0;/不及格人数和优秀学生人数,初始时均为0float average;/平均值int num=0;/计算学生总人数,输出为0int have=1;/循环控制变量,为1时继续输入数据,/为0时结束输入while(have=1)sum+=score;/计算学生总成绩if(scoremax)max=score;/计算学生最高成绩if(score=90)excellent+;/统计优秀学生人数,printf(请输

47、入学生成绩:);/获取每一个学生成绩scanf(%f,输入学生成绩信息,执行结果如下:,请输入学生成绩:74请输入学生成绩:25请输入学生成绩:68请输入学生成绩:96请输入学生成绩:93请输入学生成绩:95请输入学生成绩:83请输入学生成绩:59请输入学生成绩:73请输入学生成绩:77请输入学生成绩:-1输入的学生人数为:10学生平均成绩为:74.3学生成绩最高分为:96.0学生成绩最低分为:25.0不及格学生数目为:2优秀的学生数目为:3,任务2.3 猜价格游戏,任务目标掌握break语句的用法。掌握continue语句的用法。掌握循环嵌套语句和分析嵌套语句的用法。完成猜价格游戏程序。2.

48、3.1 break和continue语句在程序控制中,有时还需要在结构中改变程序的执行,比如在switch 语句中,使用了break。为了能更灵活地控制循环结构,C 语言提供了continue 和break 语句,用来实现程序的跳转执行。,1break语句,break语句通常用在循环语句和switch 语句中,这里介绍break在循环结构中的使用方法。Break的一般形式为:break;当break语句用于for、while、do-while语句中时,可以使程序终止break所在层的循环,即跳出当前循环,转而执行当前循环之后的语句。通常break语句总是和if语句连在一起,即满足某一条件时跳出

49、循环。例如:for(i=0;i=100;i+)if(i=1)break;/跳出for语句printf(%d,i);执行这段代码,输出结果为1。break语句对if-else的条件语句不起作用。在多层循环中,一个break语句只向外跳一层。break语句还可以用作循环结束的条件,如在while循环中,如果表达式为永真,如while(1),则可以在循环语句中用break来结束循环。,【案例2-17】读取一系列正整数,求其最大值。由于实现不知道正整数的个数,所以选择while循环来实现,当用户输入“-1”时表示输入结束。#include void main()int num,max=0;int i=

50、1;printf(请输入数据,以-1结束:n);while(1)scanf(%d,程序运行结果如下:请输入数据,以-1结束:34562673522234-1最大值为:234,2continue语句,continue 的一般形式为:continue;continue的作用为跳过循环体中剩余的语句而执行下一次循环,continue语句只能用在for、while和do-while循环体中,通常和if语句一起使用。注意break和continue的区别。break 语句用于终止最近的循环或它所在的 switch 语句,控制传递给终止语句后面的语句(如果有的话)。而continue 语句将控制权传递给它

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号