资源描述
主讲:李越辉主讲:李越辉北京工商大学计算机学院北京工商大学计算机学院C语言程序设计语言程序设计 本讲主要介绍程序设计的一般本讲主要介绍程序设计的一般方法、结构化程序设计思想以及三方法、结构化程序设计思想以及三种结构化程序设计的基本结构种结构化程序设计的基本结构顺序结构、选择结构和循环结构。顺序结构、选择结构和循环结构。第三讲 逻辑思维与计算机解题3将实际问题抽象为逻辑关系将实际问题抽象为逻辑关系枚举法解题思路枚举法解题思路关系与关系表达式关系与关系表达式程序的循环结构与分支结构程序的循环结构与分支结构学学 习习 目目 标标41.1.关系运算符与关系表达式关系运算符与关系表达式2.2.人的思维到用计算机语言的表示人的思维到用计算机语言的表示3.3.枚举的概念与思路枚举的概念与思路4.4.程序的控制结构程序的控制结构内内 容容 要要 点点5 计算机强大的逻辑分析功能是由人通过计算机强大的逻辑分析功能是由人通过程序赋给它的。一些逻辑问题必须转换成程序赋给它的。一些逻辑问题必须转换成计算机能够看得懂的数学表达式和一定的计算机能够看得懂的数学表达式和一定的程序指令。这一章我们通过例子来介绍如程序指令。这一章我们通过例子来介绍如何将人对问题的思考转换为让计算机能解何将人对问题的思考转换为让计算机能解的数学表达式,同时给出一些通常要用到的数学表达式,同时给出一些通常要用到的程序结构和的程序结构和C/C+语句。语句。引言引言6北京工商大学某班有四位同学中的一位做了好北京工商大学某班有四位同学中的一位做了好事,不留名,表扬信来了之后,班主任问这四事,不留名,表扬信来了之后,班主任问这四位同学是谁做的好事。位同学是谁做的好事。A A说:不是我。说:不是我。B B说:是说:是C C。C C说:是说:是D D。D D说:他胡说说:他胡说。已知三个人说的是真话,一个人说的是假话。已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。现在要根据这些信息,找出做了好事的人。【任务任务3.1】“谁做的好事谁做的好事”7 为了解这道题,我们需要学为了解这道题,我们需要学习如何通过习如何通过逻辑思维与判断逻辑思维与判断解这解这类问题的思路。类问题的思路。解题思路解题思路83.1 算算朮运算符朮运算符在在C/C+中基本的算术运算符有五个,分别为中基本的算术运算符有五个,分别为 加加 +乘乘 *减减 -除除 /求余求余%cout 21%4=大于等于大于等于 大于大于 =等于等于 =小于等于小于等于 小于小于 !=不等于不等于9为了讲解关系运算符和关系表达式,先在机为了讲解关系运算符和关系表达式,先在机器上建立和运行下列程序。器上建立和运行下列程序。3.2 关系运算符和关系表达式关系运算符和关系表达式10/*/*/*/*程程 序:序:3_0.cpp *3_0.cpp */*/*功功 能:能:为讲解关系运算而编为讲解关系运算而编*/*/*编制人:编制人:李越辉李越辉 */*/*时时 间:间:20082008年年3 3月月2020日日 */*/*引例引例11#include void main()cout 2 的逻辑值是的逻辑值是“2)“,1 为真为真“endl;cout=2 的逻辑值是的逻辑值是“=2)“,1 为真为真“endl;cout“3=2 的逻辑值是的逻辑值是“(3=2)“,0为假为假“endl;cout“3 2 的逻辑值是的逻辑值是“(3 2)“,0为假为假“endl;cout“3=2 的逻辑值是的逻辑值是“(3=2)“,0为假为假“endl;cout“3!=2 的逻辑值是的逻辑值是“(3!=2)“,1为真为真“2 的逻辑值是的逻辑值是 1,1为真为真3=2 的逻辑值是的逻辑值是 1,1为真为真3=2 的逻辑值是的逻辑值是 0,0为假为假3 2 的逻辑值是的逻辑值是 0,0为假为假3=2 的逻辑值是的逻辑值是 0,0为假为假3 !=2 的逻辑值是的逻辑值是 1,1为真为真程序运行结果是:程序运行结果是:13 关系运算符关系运算符 例如:变量例如:变量 1 为为 b,变量,变量 2 为为 c,关系运算符为,关系运算符为 。关系表达式为关系表达式为b c在程序中系统要测试由关系表达式所表示的关在程序中系统要测试由关系表达式所表示的关系是否成立,成立为真,不成立为假。系是否成立,成立为真,不成立为假。关系表达式是有值的,这个值非关系表达式是有值的,这个值非 0 即即 1,是布,是布尔值。关系表达式成立,其值为尔值。关系表达式成立,其值为 1。关系表达式不。关系表达式不成立,其值为成立,其值为 0。上述性质在编写程序时用到,因。上述性质在编写程序时用到,因此很重要。此很重要。关系表达式的一般格式关系表达式的一般格式14 结合本题任务,可以将四个人说的四句话写结合本题任务,可以将四个人说的四句话写成关系表达式。成关系表达式。在声明变量时,我们让在声明变量时,我们让thisman表示要寻找表示要寻找的做了好事的人,定义它是字符变量。的做了好事的人,定义它是字符变量。char thisman=;/定义字符变量并将其初始化为空定义字符变量并将其初始化为空 接着让接着让“=”的含义为的含义为“是是”,让让“!=”的含义为的含义为“不是不是”。使用关系表达式解决一些问题使用关系表达式解决一些问题15说话人说话人说的话说的话写成关系表达式写成关系表达式A“不是我不是我”thisman!=AB“是是C”thisman=CC“是是D”thisman=DD“他胡说他胡说”thisman!=D利用关系表达式将四个人所说的利用关系表达式将四个人所说的话表示成下表话表示成下表16在在C/C+中字符在存储单元中是以中字符在存储单元中是以ASCII码的形式存放的。因此,用赋值语句码的形式存放的。因此,用赋值语句thisman=A;与与thisman=65;两者是等效的,在以两者是等效的,在以thisman为标识的存储为标识的存储单元中存的是数字单元中存的是数字65。建议你用如下实验加。建议你用如下实验加以验证。以验证。thisman 65地址地址xxxx赋值语句设置初始值赋值语句设置初始值17/*/*程程 序:序:3_1.cpp */*功功 能:能:验证验证A和和65是否相等是否相等*/*编制人:编制人:wuwh */*时时 间:间:2001年年6月月27日日 */*#include/预编译命令预编译命令void main()/主函数主函数/主函数开始主函数开始char thisman;/声明字符变量声明字符变量thisman,thisman=A;/thisman赋值为赋值为A/输出关系表达式输出关系表达式“65=A”的值的值cout 65=A 关系表达式的值为关系表达式的值为(65=A),1为真。为真。endl;/主函数结束主函数结束程序实例程序实例18 结合任务结合任务3.1分析,分析,A、B、C、D四个人,只有一四个人,只有一位是做好事者。令做好事者为位是做好事者。令做好事者为1,未做好事者为,未做好事者为0,可,可以有如下以有如下4种状态(情况)种状态(情况)状态状态ABCDNo11000No20100No30010No400013.3 枚举法的思路枚举法的思路19这四种状态可简化写成这四种状态可简化写成状态状态状态状态赋值表达式赋值表达式赋值表达式赋值表达式1 1thisman=Athisman=A2 2thisman=Bthisman=B3 3thisman=Cthisman=C4 4thisman=Dthisman=D 显然第一种状态是假定显然第一种状态是假定显然第一种状态是假定显然第一种状态是假定A A是做好事者,第二种状态是做好事者,第二种状态是做好事者,第二种状态是做好事者,第二种状态是假定是假定是假定是假定B B是做好事者,是做好事者,是做好事者,是做好事者,。所谓。所谓。所谓。所谓枚举枚举枚举枚举是按照者四种假定逐是按照者四种假定逐是按照者四种假定逐是按照者四种假定逐一地去测试四个人的话有几句是真话,如果不满足三句一地去测试四个人的话有几句是真话,如果不满足三句一地去测试四个人的话有几句是真话,如果不满足三句一地去测试四个人的话有几句是真话,如果不满足三句为真,就否定掉这一假定,换下一个状态再试。为真,就否定掉这一假定,换下一个状态再试。为真,就否定掉这一假定,换下一个状态再试。为真,就否定掉这一假定,换下一个状态再试。具体做法如下:具体做法如下:具体做法如下:具体做法如下:20(1)假定让)假定让thisman=A代入四句话中代入四句话中状态状态说的话说的话关系表达式关系表达式CAthisman!=A;A!=A0Bthisman=C;A=C0Cthisman=D;A=D0Dthisman!=D;A!=D1四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为1 1,显然不是,显然不是,显然不是,显然不是AA做的好事做的好事做的好事做的好事21(2)假定让)假定让thisman=B代入四句话中代入四句话中状态状态说的话说的话关系表达式关系表达式CAthisman!=A;B!=A1Bthisman=C;B=C0Cthisman=D;B=D0Dthisman!=D;B!=D1四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为2 2,显然不是,显然不是,显然不是,显然不是BB做的好事做的好事做的好事做的好事22(3)假定让)假定让thisman=C代入四句话中代入四句话中状态状态说的话说的话关系表达式关系表达式CAthisman!=A;C!=A1Bthisman=C;C=C1Cthisman=D;C=D0Dthisman!=D;C!=D1四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为四个关系表达式的值的和为3 3,就是,就是,就是,就是CC做的好事做的好事做的好事做的好事23 综上所述一个人一个人去试,就是综上所述一个人一个人去试,就是枚举枚举。从编。从编写程序看,实现枚举最好用写程序看,实现枚举最好用循环结构循环结构。这部分的程序写出如下:这部分的程序写出如下:for(k=1;kyuS2:y不能被不能被4整除,则输出整除,则输出y“不是闰年不是闰年”。然后转。然后转到到S6算 法 的 概 念(三)S3:若:若y能被能被4整除,不能被整除,不能被100整除,整除,则输出则输出y“是闰年是闰年”。然后转到。然后转到S6S4:若:若y能被能被100整除,又能被整除,又能被400整除,整除,输出输出y“是闰年是闰年”;否则输出;否则输出“不是闰不是闰年年”。然后转到然后转到S6S5:输出:输出y“不是闰年不是闰年”S6:y+1=yS7:当:当y2500时,转时,转S2继续执行,如继续执行,如y2500,算法停止。,算法停止。算 法 的 概 念(四)在这个算法中,采取了多次判断。在这个算法中,采取了多次判断。先判断先判断y能否被能否被4整除,如不能,整除,如不能,则则y必然不是闰年。如必然不是闰年。如y 能被能被4整整除,并不能马上决定它是否闰年,除,并不能马上决定它是否闰年,还要看它能否被还要看它能否被100整除。如不整除。如不能被能被100整除,则肯定是闰年整除,则肯定是闰年(例例如如1996年年)。如能被。如能被100整除,还整除,还不能判断它是否闰年,还要被不能判断它是否闰年,还要被400整除,如果能被整除,如果能被400整除,则整除,则它是闰年,否则不是闰年。它是闰年,否则不是闰年。在这个算法中,每做一步,都分别在这个算法中,每做一步,都分别分离出一些范围分离出一些范围(巳能判定为闰年巳能判定为闰年或非闰年或非闰年),逐步缩小范围,使被,逐步缩小范围,使被判断的范围愈来愈小,直至执行判断的范围愈来愈小,直至执行S5时,只可能是非闰年。见图时,只可能是非闰年。见图2.1示意。示意。算 法 的 特 性(一)一个算法应该具有以下特点:一个算法应该具有以下特点:1.有穷性有穷性u一个算法应包含有限的操作步骤,而不能一个算法应包含有限的操作步骤,而不能是无限的。是无限的。u事实上,事实上,“有穷性有穷性”往往指往往指“在合理的范在合理的范围之内围之内”。究竟什么算。究竟什么算“合理限度合理限度”,并无严格标准,由人们的常识和需要而并无严格标准,由人们的常识和需要而定。定。2.确定性确定性u算法中的每一个步骤都应当是确定的,而算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。不应当是含糊的、模棱两可的。算 法 的 特 性(二)3.有零个或多个输入有零个或多个输入u所谓输入是指在执行算法时需要从外界所谓输入是指在执行算法时需要从外界取得必要的信息。一个算法也可以没有取得必要的信息。一个算法也可以没有输入。输入。4.有一个或多个输出有一个或多个输出u算法的目的是为了求解,算法的目的是为了求解,“解解”就是就是输出。没有输出的算法是没有意义的。输出。没有输出的算法是没有意义的。5.有效性有效性u算法中的每一个步骤都应当能有效地执算法中的每一个步骤都应当能有效地执行,并得到确定的结果。行,并得到确定的结果。怎样表示一个算法u为了表示一个算法,可以为了表示一个算法,可以用不同的方法。常用的有用不同的方法。常用的有自然语言、传统流程图、自然语言、传统流程图、结构化流程图、伪代码、结构化流程图、伪代码、PAD图等。图等。用自然语言表示算法u用自然语言表示通俗易懂,但文字冗用自然语言表示通俗易懂,但文字冗长,长,容易出现容易出现“歧义性歧义性”。自然语言。自然语言表示的含义往往不太严格,要根据上表示的含义往往不太严格,要根据上下文才能判断其正确含义。此外,用下文才能判断其正确含义。此外,用自然语言描述包含分支和循环的算法,自然语言描述包含分支和循环的算法,不很方便不很方便(如例如例2.5的算法的算法)。因此,除。因此,除了很简单的问题以外,一般不用自然了很简单的问题以外,一般不用自然语言描述算法。语言描述算法。用流程图表示算法(一)u流程图是用一些图框表示各种操作。用图形表示流程图是用一些图框表示各种操作。用图形表示算法,直观形象,易于理解。美国国家标准化协算法,直观形象,易于理解。美国国家标准化协会会ANSI(American National Standard Institute)规定了一些常用的流程图符号。规定了一些常用的流程图符号。u其中菱形框的作用是对一个给定的条件进行判断,其中菱形框的作用是对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的根据给定的条件是否成立来决定如何执行其后的操作。它有一个入口,两个出口。操作。它有一个入口,两个出口。u连接点连接点(小圆圈小圆圈)是用于将画在不同地方的流程线是用于将画在不同地方的流程线连接起来。图中有两个以连接起来。图中有两个以为标志的连接点为标志的连接点(在连在连接点圈中写上接点圈中写上“1”),它表示这两个点是互相连,它表示这两个点是互相连接在一起的。实际上它们是同一个点,只是画不接在一起的。实际上它们是同一个点,只是画不下才分开来画。用连接点,可以避免流程线的交下才分开来画。用连接点,可以避免流程线的交叉或过长,使流程图清晰。叉或过长,使流程图清晰。用流程图表示算法(二)判定闰年的算法用流程图表示传统流程图的弊端u传统的流程图用流程线指出各框的执行顺传统的流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,序,对流程线的使用没有严格限制。因此,使用者可以不受限制地使流程随意地转来使用者可以不受限制地使流程随意地转来转去,使流程图变得毫无规律。转去,使流程图变得毫无规律。u这种算法难以阅读,也难以修改,从而使这种算法难以阅读,也难以修改,从而使算法的可靠性和可维护性难以保证。如果算法的可靠性和可维护性难以保证。如果我们写出的算法能限制流程的无规律任意我们写出的算法能限制流程的无规律任意转向,阅读起来就很方便。转向,阅读起来就很方便。u既然用基本结构的顺序组合可以表示任何既然用基本结构的顺序组合可以表示任何复杂的算法结构,那么基本结构之间的流复杂的算法结构,那么基本结构之间的流程线就属多余的了。程线就属多余的了。用N-S流程图表示算法(一)u1973年美国学者年美国学者I.Nassi和和B.Shneiderman提提出了一种新的流程图形式。在这种流程图出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包法写在一个矩形框内,在该框内还可以包含其他的从属于它的框,或者说,由一些含其他的从属于它的框,或者说,由一些基本的框组成一个大的框。这种流程图又基本的框组成一个大的框。这种流程图又称称N-S结构化流程图。这种流程图适于结构结构化流程图。这种流程图适于结构化程序设计,因而很受欢迎。化程序设计,因而很受欢迎。uN-S流程图用以下的流程图符号:流程图用以下的流程图符号:用N-S流程图表示算法(二)用伪代码表示算法(一)u用传统的流程图和用传统的流程图和N-S图表示算法,直观易懂,图表示算法,直观易懂,但画起来比较费事。因此,流程图适宜表示一但画起来比较费事。因此,流程图适宜表示一 个算法,但在设计算法过程中使用不是很理想。个算法,但在设计算法过程中使用不是很理想。为了设计算法时方便,常用一种称为伪代码为了设计算法时方便,常用一种称为伪代码(pseudo code)的工具。的工具。u伪代码是用介于自然语言和计算机语言之间的文伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。它如同一篇文章,自上而字和符号来描述算法。它如同一篇文章,自上而下地写下来。每一行下地写下来。每一行(或几行或几行)表示一个基本操作。表示一个基本操作。它不用图形符号,因此书写方便它不用图形符号,因此书写方便、格式紧凑,、格式紧凑,也比较好懂,便于向计算机语言算法也比较好懂,便于向计算机语言算法(即程序即程序)过过渡。渡。用伪代码表示算法(二)u即计算机语言中具有的语句关键字用英文表示,即计算机语言中具有的语句关键字用英文表示,其他的可用汉字表示。总之,以便于书写和阅读其他的可用汉字表示。总之,以便于书写和阅读为原则。用伪代码写算法并无固定的、严格的语为原则。用伪代码写算法并无固定的、严格的语法规则,只要把意思表达清楚,并且书写的格式法规则,只要把意思表达清楚,并且书写的格式要写成清晰易读的形式。要写成清晰易读的形式。u例求例求5!,用伪代码表示的算法如下:,用伪代码表示的算法如下:BEGIN(算法开始算法开始)1=t2=iwhile iti+1=iprint tEND(算法结束算法结束)用伪代码表示算法(三)BEGIN(算法开始算法开始)2000=ywhile yyEND(算法结束算法结束)用伪代码表示算法(四)u从以上例子可以看到:伪代码书写格式比较自由,从以上例子可以看到:伪代码书写格式比较自由,容易表达出设计者的思想。用伪代码写的算法也容易表达出设计者的思想。用伪代码写的算法也很容易修改。用伪代码很容易写出结构化的算法很容易修改。用伪代码很容易写出结构化的算法。例如上面例子都是结构化的算法。但是用伪代。例如上面例子都是结构化的算法。但是用伪代码写算法不如流程图直观,可能会出现逻辑上的码写算法不如流程图直观,可能会出现逻辑上的错误(例如循环或选择结构的范围搞错等)。错误(例如循环或选择结构的范围搞错等)。u以上介绍了常用的表示算法的几种方法,在程序以上介绍了常用的表示算法的几种方法,在程序设计中读者可以根据需要和习惯任意选用。软件设计中读者可以根据需要和习惯任意选用。软件专业人员一般习惯使用伪代码,考虑到国内广大专业人员一般习惯使用伪代码,考虑到国内广大初学人员的情况,为便于理解,以后各章中主要初学人员的情况,为便于理解,以后各章中主要采用形象化的采用形象化的N-S图表示算法。但是,对其他方图表示算法。但是,对其他方法也应有所了解,以便在阅读其他书刊时不致发法也应有所了解,以便在阅读其他书刊时不致发生困难。生困难。用计算机语言表示算法u要完成一件工作,包括设计算法和实要完成一件工作,包括设计算法和实现算法两个部分。设计算法的目的是现算法两个部分。设计算法的目的是为了实现算法。因此,不仅要考虑如为了实现算法。因此,不仅要考虑如何设计一个算法,也要考虑如何实现何设计一个算法,也要考虑如何实现一个算法;一个算法;u用计算机语言表示算法必须严格遵循用计算机语言表示算法必须严格遵循所用语言的语法规则,这是和伪代码所用语言的语法规则,这是和伪代码不同的。我们将前面介绍过的算法用不同的。我们将前面介绍过的算法用C语言表示;语言表示;u用计算机语言表示的算法用计算机语言表示的算法程序。程序。3.1 程序设计的一般方法u程序就是按照某种算法,在有限的步骤内程序就是按照某种算法,在有限的步骤内对一些经过整理的、按照一定形式组织起对一些经过整理的、按照一定形式组织起来的有关联的数据(即数据结构)进行分来的有关联的数据(即数据结构)进行分析研究,得到期望的结果的计算机可以执析研究,得到期望的结果的计算机可以执行的指令序列。所以,数据结构和算法是行的指令序列。所以,数据结构和算法是程序设计的主要因素。程序设计的主要因素。u程序设计的一般方法可以概括为以下四个程序设计的一般方法可以概括为以下四个步骤:步骤:明确处理对象、选择算法明确处理对象、选择算法画流程图画流程图编写程序编写程序调试程序调试程序3.1 程序设计的一般方法u已知三角形三条边,求三角形的面积已知三角形三条边,求三角形的面积首先需要明确处理对象,选择适合的算法首先需要明确处理对象,选择适合的算法根据数据特点和取值范围,浮点型的数据可根据数据特点和取值范围,浮点型的数据可以很好地表示三角形的边长和面积。以很好地表示三角形的边长和面积。如果如果a a、b b、c c符合两边之和大于第三边,则符合两边之和大于第三边,则a a、b b、c c可以组成三角形,其面积的算法可可以组成三角形,其面积的算法可以使用海伦公式以使用海伦公式第二步画流程图。第二步画流程图。3.1 程序设计的一般方法开始开始结束结束输入输入a、b、cs=(a+b+c)/2area=sqrt(s*(s-a)*(s-b)*(s-c)a+bc并且并且b+ca并且并且a+c b打印三角形面积打印三角形面积打打印印“无无法法构构成成三三角形角形”不成立成立3.1 程序设计的一般方法u已知三角形三条边,求三角形的面积已知三角形三条边,求三角形的面积第三步根据流程图编写程序。第三步根据流程图编写程序。选择一种计算机语言,按照流程图用该计选择一种计算机语言,按照流程图用该计算机语言提供的语句体系编写源程序。算机语言提供的语句体系编写源程序。第四步调试程序。第四步调试程序。对已经编写好的源程序进行上机调试,并对已经编写好的源程序进行上机调试,并验算结果。如果不正确,修改程序再调试,验算结果。如果不正确,修改程序再调试,直到得到期望的结果。直到得到期望的结果。3.2 结构化程序设计(一)u结构化程序设计方法的基本思想是结构化程序设计方法的基本思想是:任何程序都可用三种基本结构的组合任何程序都可用三种基本结构的组合来实现。来实现。这三种基本结构是:顺序结构、选择这三种基本结构是:顺序结构、选择结构和循环结构。结构和循环结构。这三种结构都具有一个入口和一个出这三种结构都具有一个入口和一个出口。口。要求限制无条件转移语句(即要求限制无条件转移语句(即gotogoto语语句)的使用句)的使用3.2 结构化程序设计(二)u顺序结构顺序结构:是按照书写顺序依次执行的。是按照书写顺序依次执行的。u选择结构选择结构:是对给定的条件进行判断,再根据判断的是对给定的条件进行判断,再根据判断的结果决定执行哪一个分支。结果决定执行哪一个分支。u循环结构循环结构:是在给定条件成立时反复执行某段程序。是在给定条件成立时反复执行某段程序。条件程序段1程序段2条件程序段程序段1程序段23.3 C语言的顺序结构(一)u顺序结构是结构化程序设计的三种顺序结构是结构化程序设计的三种基本结构中最简单的。它可以独立基本结构中最简单的。它可以独立存在,也可以出现在选择结构或循存在,也可以出现在选择结构或循环结构中,整个程序都存在顺序结环结构中,整个程序都存在顺序结构。在顺序结构中,函数、一段程构。在顺序结构中,函数、一段程序或者语句是按照出现的先后顺序序或者语句是按照出现的先后顺序执行的。执行的。u例例 求求ax2+bx+c=0方程的解。方程的解。a、b、c由键盘输入,且由键盘输入,且b2-4ac0。3.3 C语言的顺序结构(二)u用伪代码表示算法:用伪代码表示算法:u定义定义a、b、c、p、x1、x2用于存放方程的系用于存放方程的系数、中间变量和结果;数、中间变量和结果;u输入输入a、b、cu令令p=sqrt(b*b-4*a*c)u计算计算x1、x2:u x1=(-b+p)/(2*a)u x2=(-b-p)/(2*a)u输出方程的根输出方程的根x1、x2开始开始输入输入a、b、cp=sqrt(b2-4ac)x1=(-b+p)/2ax2=(-b-p)/2a输出方程的根输出方程的根x1、x2结束结束举一反三举一反三:画出实现:画出实现“输入三个数输入三个数a、b、c,输出平均值输出平均值aver”的程序的流程图和伪代码。的程序的流程图和伪代码。3.4 if 语句(一)u选择结构是结构化程序的三种基本结选择结构是结构化程序的三种基本结构之一,用于根据给定条件的判断执构之一,用于根据给定条件的判断执行何种操作。行何种操作。C语言中的选择结构有两语言中的选择结构有两种:种:if语句和语句和switch语句。语句。if语句主要语句主要提供两个分支的选择,提供两个分支的选择,switch语句提供语句提供多分支的选择。下面我们先介绍最为多分支的选择。下面我们先介绍最为常用的选择结构常用的选择结构if语句。语句。3.4 if 语句语句(二二)uif 语句的基本形式语句的基本形式if(条件)条件)语句语句1;else语句语句2;条件条件语句语句1语句语句2成成立立不不成成立立3.4 if 语句语句(三三)判断方程判断方程ax2+bx+c=0是否有实是否有实数解,其中数解,其中a、b、c由键盘输入由键盘输入 分析分析:用伪代码表示算法:用伪代码表示算法:定义定义a、b、c、p用于存放用于存放方程的系数、中间变量;方程的系数、中间变量;输入输入a、b、c令令p=b*b-4*a*cif(p=0)输出方程有实数解输出方程有实数解else 输出方程无实数解输出方程无实数解 开始开始p=b2-4ac结束结束p=0输出有实数解输出有实数解输出无实数解输出无实数解成成立立不不成成立立输入输入a、b、c由由键键盘盘输输入入系系数数a、b、c,判判断断方方程程ax2+bx+c=0是是否否有有实实数数解,如果有则输出其解。(提示:需要用到复合语句)解,如果有则输出其解。(提示:需要用到复合语句)3.4 if 语句语句(四四)当语句当语句2为空时,为空时,else可以省可以省略,略,if语句形式变换为:语句形式变换为:if(条件)条件)语句;语句;条件条件语句语句成成立立不不成成立立例例:由键盘输入由键盘输入x、y两个数,要求从大到小排序并输出。两个数,要求从大到小排序并输出。分析分析:关键技术:两个变量互换算法是:关键技术:两个变量互换算法是:t=x;x=y;y=t;定义定义x、y、t用于存放输入的两个数和中间变量;用于存放输入的两个数和中间变量;输入输入x、y if(xy)t=x;x=y;y=t;输出输出x、y开始开始定义变量定义变量x、y结束结束从键盘给从键盘给x、y 赋值赋值xy?x、y互换互换NoYes 输出输出x、y#include void main()float x,y,t;scanf(“%f,%f”,&x,&y);if(xy)t=x;x=y;y=t;printf(“%6.2f,%6.2f”,x,y);3.4 if 语句语句(五五)3.4 if 语句语句(六六)当当if语语句句中中的的语语句句1或或语语句句2是是一一个个含含if语语句句的的复复合合语语句句时时,形成形成if语句的嵌套。语句的嵌套。形式一:当语句形式一:当语句2是是if语句结构语句结构if (条件条件1)语句语句1 else if (条件条件2)语句语句2 else 语句语句3形式二:当语句形式二:当语句1是是if语句结构语句结构if (条件条件1)if (条件条件2)语句语句1 else 语句语句2else 语句语句3条件条件1语句语句1成成立立不成立不成立条件条件2语句语句2语句语句3成成立立不成立不成立条件条件1语句语句1成成立立不成立不成立条件条件2语句语句2语句语句3成立成立不成立不成立3.4 if 语句语句(七七)3.4 if 语句语句(八八)分析分析:采用形式二的算法:采用形式二的算法:采用形式一的算法:采用形式一的算法:定义变量定义变量x,y 定义变量定义变量x,y输入输入x 输入输入x if (x=0)if (x0)y=-1;if (x0)y=-1;else if (x=0)y=0;else y=0;else y=1;else y=1;输出输出y值值 输出输出y值值举一反三举一反三:试判断下列选择结构是否可以表示上例函数。:试判断下列选择结构是否可以表示上例函数。if(x0)y=-1;if(x=0)y=0;else y=1;/*/*程程 序序 名:名:3_4.cpp(分支程序示例)(分支程序示例)*/*作作 者:者:李越辉李越辉 */*编制时间:编制时间:2007年年3月月 */*主要功能:实现符号函数主要功能:实现符号函数 */*#include /预编译命令预编译命令void main()/主函数主函数 /主函数开始主函数开始int x=0,y=0;/声明声明x,y为整型变量,初始化为为整型变量,初始化为0cout 请输入请输入x x;/从键盘输入整数送至从键盘输入整数送至x中中if(x0)/如果如果x0,将,将1赋给赋给yy=1;elseif(x=0)/如果如果x=0,将,将0赋给赋给yy=0;elsey=-1;/否则(否则(x0),将),将-1赋给赋给ycout 当当x=x 时时,y=y=0)if(a=0)if(a0)printf(“a0n”);if(a0)printf(“a0n”);else printf(“a0n”);else printf(“a=0n”);NSNS图图有了上述了解之后,我们来看解有了上述了解之后,我们来看解“谁做的好事谁做的好事”的程序框图的程序框图现在我们来分析现在我们来分析“谁做的好事谁做的好事”的的NS流程图。流程图。它是由两大块组成的,如图它是由两大块组成的,如图循环体循环体for(k=1;k=4;k+)语句语句1;1;第一块第一块循环结构循环结构第二块第二块分支结构分支结构 第一块是第一块是循环结构循环结构,功能是产生被试对,功能是产生被试对象,依次为象,依次为A、B、C、D。并测试四句话有多。并测试四句话有多少句为真,如有少句为真,如有3句为真,则可确定做好事者,句为真,则可确定做好事者,同时置有解标志为同时置有解标志为1。第二块为第二块为分支结构分支结构,功能是判断是否无,功能是判断是否无解,如为真,则输出无解信息。解,如为真,则输出无解信息。这是粗看。再往细看,第一块的循环体这是粗看。再往细看,第一块的循环体又由两块组成,如图又由两块组成,如图中含两条赋值语句中含两条赋值语句中含一条分支语句中含一条分支语句讲这一段是希望你掌握讲这一段是希望你掌握NS图,这对今后的学图,这对今后的学习会有好处。按照程序框图很容易写出程序(如习会有好处。按照程序框图很容易写出程序(如下页所示)下页所示)thisman=64+k;sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D);sum=3真真假假输出该被测试者;输出该被测试者;有解标志置有解标志置1 1;/*/*程程 序序 名:名:3_5.cpp */*作作 者:李越辉者:李越辉 */*编制时间:编制时间:2007年年3月月 */*主要功能:谁做的好事主要功能:谁做的好事 */*#include /预编译命令预编译命令void main()/主函数主函数 /主函数开始主函数开始int k=0,sum=0,g=0;/声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为0char thisman=;for(k=1;k=4;k=k+1)/k既是循环控制变量,也表示第既是循环控制变量,也表示第k个人个人 /for 循环体开始循环体开始thisman=64+k;sum=(thisman!=A)+(thisman=C)+(thisman=D)+(thisman!=D);if(sum=3)/如果如果4句话有句话有3句话为真,则输出该人句话为真,则输出该人 /输出做好事者输出做好事者cout 做好事者为做好事者为 char(64+k)endl;g=1;/有解标志置有解标志置1 /for 循环体结束循环体结束if(g!=1)/则输出无解信息则输出无解信息 cout Cant found!endl;/主函数结束主函数结束#include void main()int k=0,sum=0,g=0;char thisman=;for(k=1;k=4;k=k+1)thisman=64+k;sum=(thisman!=A)+(thisman=D)+(thisman=C)+(thisman!=D);if (sum=3)cout 做好事者为做好事者为 char(64+k)endl;g=1;if(g!=1)cout Cant found!endl;/*/*程程 序序 名:名:3_6.cpp */*作作 者:李越辉者:李越辉 */*编制时间:编制时间:2008的好事的好事 */*#include /预编译命令预编译命令void main()/主函数主函数 /主函数开始主函数开始int k=0,sum=0,g=0;/声明变量为整数类型,且均初始化为声明变量为整数类型,且均初始化为0for(k=1;k=4;k=k+1)/循环从循环从k为为1到到4,sum=0;/循环体内的初始化循环体内的初始化if(k!=1)sum=sum+1;/如如A的话为真,则让的话为真,则让sum加加1;if(k=3)sum=sum+1;/如如B的话为真,则让的话为真,则让sum加加1;if(k=4)sum=sum+1;/如如C的话为真,则让的话为真,则让sum加加1;if(k!=4)sum=sum+1;/如如D的话为真,则让的话为真,则让sum加加1;if(sum=3)/若有三句话为真,则做下列两件若有三句话为真,则做下列两件事事cout This man is char(64+k)endl;/输出做好事者输出做好事者g=1;/让有解标志置让有解标志置1if(g!=1)/则输出无解信息则输出无解信息 cout Cant found!endl;/主函数结束主函数结束for(k=1;k=4;k=k+1)sum=0;if(k!=1)sum=sum+1;/如如A的话为真,的话为真,则让则让sum加加1;if(k=3)sum=sum+1;/如如B的话为真,则让的话为真,则让sum加加1;if(k=4)sum=sum+1;/如如C的话为真,则让的话为真,则让sum加加1;if(k!=4)sum=sum+1;/如如D的话为真,则让的话为真,则让sum加加1;./*/*程 序 名:3_7.cpp */*作 者:李越辉 */*编制时间:2008年3月 */*主要功能:谁做的好事 */*#include /预编译命令预编译命令void main()/主函数主函数 /主函数开始主函数开始int k=0,g=0;/声明变量为整数类型,且均初始化为声
展开阅读全文