项目3技能目标会画程序的流程图或N-S结构图会用if-else实现分支结构和多分支结构的程序设计会用条件运算符进行分支结构的程序设计会用switch语句实现多分支结构的程序设计会用for语句、while语句、do-while语句进行循环结构程序设计会用break语句和continue语句知识目标掌握if-else语句的用法掌握条件运算符的使用掌握switch语句的用法掌握for语句、while语句和do-while语句的使用掌握循环的签套使用掌握break和continue语句的使用项目任务与解析本项目实现班级学生成绩管理系统中用if语句实现菜单的选择执行、用switch语句实现菜单的选择执行、用循环语句实现主菜单的选择执行。本项目包含下面几个任务:任务4:用if语句实现菜单的选择执行任务5:用switch语句实现菜单的选择执行任务6:用循环语句实现主菜单的选择执行主要内容3.1任务4:用if语句实现菜单的选择执行3.2必备知识与理论3.3扩展知识与理论3.4任务5:用switch语句实现菜单的选择执行3.5必备知识与理论3.6扩展知识与理论3.7任务6:用循环语句实现菜单的选择执行3.8必备知识与理论3.9扩展知识与理论3.1任务4:用if语句实现菜单的选择执行1.问题描述对显示的菜单,选择要执行的菜单序号,并显示要执行的菜单名。2.具体实现P41程序3.知识分析在多数情况下顺序结构的程序是很少的,一般还包括分支和循环结构。分支结构还包括if-else结构和switch结构。我们首先来学习分支结构,在学习分支结构前了解一些算法的概念,关系运算符和逻辑运算符的使用。3.2必备知识与理论•3.2.1算法的概念•1.算法•算法就是程序处理问题的步骤与方法。•1976年瑞士计算机科学家NiklausWirth提出了一个著名的公式:•算法+数据结构=程序•2.算法的特性简单地说,算法就是进行操作的方法和操作步骤。例如,菜谱实际上是做菜肴的算法,乐谱实际上是演奏的算法,计算机程序是用某种程序设计语言描述的解题算法。通常认为算法有如下一些性质:•(1)有穷性一个算法要在有限的步骤内解决问题(这里所说的步骤是指计算机执行步骤)。计算机程序不能无限地运行下去(甚至不能长时间地运行下去),所以一个无限执行的方法不能成为程序设计中的“算法”。•(2)确定性确定性具有两重意义:一是所描述的操作应当具有明确的意义,不应当有歧义性。例如,不能发出这样的操作指令:“执行一个算术操作”。因为它既没有指出算术操作的类型,也没有指出操作数。•确定性的另一重意义:·操作作序列只有一个初始动作,序列中每一动作仅有一个后继动作;·序列终止表示问题得到解答或问题没有解答,不能没有任何结论。•(3)有零个或多个输入输入就是从外界取得必要的信息。一个算法可以有零个或多个输入,例如:输入一个年份,判断其是否是闰年。同时一个算法可以没有输入,例如:计算出5!是多少。•(4)有一个或多个输出•算法的目的就求解,“解”就是我们想要得到的最终结果。输出是同输入有着某些特定关系的量。一个算法得到的最终结果就是输出。没有输出的算法是没有意义的。•(5)可执行性•一个算法应当是可以由计算机执行的,算法中描述的操作都是可以通过计算机的运行来实现。3.2.2算法的表示方法•1.自然语言表示算法•自然语言是相对于计算机语言而言的,是指人们在日常生活中使用的语言,如汉语、英语等。对于某些程序员来说,自然语言通俗易懂。但是,对于规模大、复杂的算法,使用自然语言来描述,往往很冗长,不直观,而且容易发生歧义。比如对于以下这句话:如果A大于B,就给它加1。在理解时就可能出现歧义,是给A加1?还是给B加1。•对于以上的一段话,如果我们用C语言进行编程则为:•if(AB)•A=A+1;•正是由于自然语言描述算法具有的缺陷,所以在程序设计中很少有人使用。•2.传统流程图表示法用一些图框表示各种操作,用线表示这些操作的执行顺序。我国国家标准GB1526—89中推荐的一套流程图标准化符号,它与国际标准化组织ISO提出的ISO流程图符号是一致的。图3-1为其中常用的一些符号。过程判断数据预定义过程起止流程线连接注释图3.2常用的流程图标准化符号•平行四边形表示数据,其中可注明数据名称、来源、用途或其它的文字说明。•处理矩形表示各种处理功能。例如,执行一个或一组特定的操作,从而使信息的值、信息形式或所在位置发生变化。矩形内可注明处理名称或其简要功能。•预定义过程带有双竖边线的矩形,表示已命名的处理。该处理为在另外地方已得到详细说明的一个操作或一组操作。例如库函数或其它已定义的函数等。矩形内可注明特定处理名称或其简要功能。•判断菱形表示判断。菱形内可注明判断的条件。它只有一个入口,但可以有若干个可供选择的出口,在对定义的判断条件求值后,有一个且仅有一个出口被选择。求值结果可在表示出口路径的流线附近写出。•流线直线表示执行的流程。当流程自上向下或由左向右时,流程线可不带箭头,其它情况应加箭头表示流程。•端点。扁圆形表示转向外部环境或从外部环境转入的端点符。例如,程序流程的起、始点。•注解。注解是程序的编写者向阅读者提供的说明。注解符由纵边线构成,它用虚线连接到被注解的符号或符号组上。图3-2(a)、(b)、(c)中的虚线框,分别为用流程图表示的三种基本流程控制结构。S1S2S3PS1S2真假PS2假真(a)顺序结构(b)选择结构(c)重复结构图3-2用流程图描述的三种基本结构•例3-1用流程图描述从三个数中取最大数的算法。•从三个数中取最大数的算法思路是:假定这三个数是a,b,c,则首先可以比较a,b两数,从中选大者;然后再用这个大数与数c比较,从中取大者。这时得到的大数,就是三个数中的最大数。这个算法用流程图描述如图3-3(a)所示。•通常,求解一个问题的算法不是唯一的。例如图3-3(b)也是一个三数中取大的算法。它的基本思路是,先设max=第一个数,然后依次输入i个数,每输入一个数,与max比较一次,把大的放入max中。当输完i个数时,max中存放的就是这i个数中的最大数。这里,i是一个计数器,用于统计输入数的个数,所以每输入一个数,要执行一次自增操作。这个算法与图3-3(a)所示算法的不同在于:•算法结构不同:图3-3(a)所示算法采用了两个选择结构,而图3-3(b)所示算法采用了一个循环结构和一个选择结构。•算法的灵活性不同:图3-3(b)中的算法可以用来求任意个数中的最大数。a=b输入a,b,cmax=a真假max=bmax=c真假输出max输出c开始结束i=3输入一个n假真假输出max开始结束max=0,i=1真i++n=maxmax=n(a)一个三数中取大的算法(b)另一个三数中取大的算法图3-3三数中取大算法的流程图描述3.用N-S流程图表示算法•灵活的流线是程序中隐藏错误的祸根。针对这一弊病,1973年美国学者I.Nassi和B.Shneiderman提出了一种无流线的流程图,称为N-S图。它的三种基本结构如图3-4所示。•N-S图的每一种基本结构都是一个矩形框,整个算法可以像堆积木一样堆成。其中,(a)为三个操作组成的顺序结构;(b)为二分支的选择结构;(c)为当型重复结构,即当命题P为“真”时,就重复执行S。S1S2S3PS1S2当PS假真(c)循环结构(a)顺序结构(b)选择结构图3-4用N-S图描述三种基本流程结构图3-5(a)、(b)给出了用与图3-3(a)、(b)流程图对应的N-S图。a=bmax=amax=b输入a,b,c假真max=c输出max输出c真假当i=3i++n=maxmax=n真假输入n初始化:max=0,i=1输出max(a)采用选择结构(b)采用循环结构图3-5三数中取大算法的N-S图描述3.用伪码表示算法•伪代码(pseudocode)是用介于自然语言与计算机语言之间的文字符号算法描述的工具。它无固定的、严格的语法规则,通常是借助某种高级语言的控制结构,中间的操作可以用自然语言(如中文或英文),也可以用程序设计语言,或使用自然语言与程序设计语言的混合体。一般专业人员习惯用伪代码进行算法描述。•下面是与图3-3相对应的三数中取大算法的伪代码描述。(1)与图3-3(a)相对应的三数中取大算法的伪代码描述:输入a,b,c;if(a=b)max=a;elsemax=bif(max=c)输出max;else输出c;(2)与图3-3(b)相对应的三数中取大算法的伪代码描述:初始化:mac=0,i=1;当(i=3)(输入n;i++;if(n=max)max=n;)输出max;3.2.3结构化程序设计•结构化程序设计的基本思路是:把一个复杂的问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解的范围之内。采取以下的方法保证得到结构化的程序:•自顶向下;•逐步细化(求精);•模块化设计;•结构化编码。结构化程序具有如下的特征:一个程序单元由顺序、分支和循环这三种基本结构组成;一个大的程序由若干个不同功能的小模块组成;每一个小模块只有一个入口和一个出口;3.2.4命题与C语言中的逻辑值•对选择结构、循环结构,流程的改变都是由判断决定的,即需要根据判断决定选择,根据判断决定是否循环以及循环的结束。通常,判断是针对命题的“真”、“假”进行的。例如,下面是一些命题:·(行驶中)前面的交通信号灯是红色的。·今天下雨。·a≥b。·如果a不能被b整除。这些命题的值都只能是一个逻辑(布尔)值:“真”或“假”。•早期的C语言不提供专门的逻辑(布尔)类型,规定用非0值表示“真”,用0值表示“假”。•在C99中,增加了_Bool类型,并增加了头文件stdbool.h,在其中定义了宏bool、true和false,用true存储1,用false存储0。3.2.5关系运算与关系表达式1.C语言的关系运算符•关系运算是指对两个表达式值的大小比较。C语言中提供有如下6个关系运算符:>(大于)>=(大于或等于)<(小于)<=(小于或等于)==(等于)!=(不等于)•后两个(==和!=)的优先级小于前4个,但它们都低于算术运算符,高于赋值运算符,并且它们结合方式都是从左向右的。2.关系表达式•用关系运算符将两个表达式(可以是算术表达式、关系表达式,逻辑表达式,赋值表达式,字符表达式等)连接起来的表达式,称为关系表达式。•关系表达式的值只有两个:关系表达式成立,即为“真”(通常为1);关系表达式不成立,即为“假”(0)。3.2.6逻辑运算与逻辑表达式1.逻辑运算符与优先级C语言有三个逻辑运算符,它们是:&&(逻辑与)||(逻辑或)!(逻辑非)•&&和||是二元运算符,结合方向为自左至右;!为一元运算符,结合方向为自右至左。•!的优先级高于&&,&&的优先级高于||。•&&和||的优先级低于关系运算符,而!的优先级高于关系运算符。2.逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的表达式就是逻辑表达式,逻辑表达式的值应该是一个逻辑量“真”或“假”。逻辑运算中有很多有趣的规律,这种规律称为短路原则。•1.在一个&&表达式中,若&&的一端为0,则不必再计算另一端,该表达式的值肯定为0(在C语言中由于&&是从左向右结合的,所以只考虑左端,即当&&号的左端为0时,不再计算其右端),可以把它记为:0&&a=0•2.在一个||表达式中,若||的一端为1,则不必计算另一端,该||表达式的值必为1。现把它记为:1||a=1诸如此类关于表达式的值的规律有如下一些:0||a==a1&&a==a1||a==10&&a==0a||!a==10&&!a==0以及a||a==aa&&a==a!(a||b)==!a&&!b!(a&&b)==!a||!b!(!a)==a•记住这些规律,能使复杂的逻辑运算简化、清晰。3.3扩展知识与理论选择型程序描述了求解规则:在不同的条件下所应进行的相应操作。•3.3.1if(表达式)语句•这种语句的结构是:•if(表达