《谭浩强《C程序设计》课件第3章.ppt》由会员分享,可在线阅读,更多相关《谭浩强《C程序设计》课件第3章.ppt(113页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3章章 程序设计初步程序设计初步第第4章章 函数与预处理函数与预处理第第5章章 数组数组第第6章章 指针指针第第7章章 自定义数据类型自定义数据类型第第2 2篇篇面向过程的程序设计面向过程的程序设计第第3章章 程序设计初步程序设计初步3.1 面向过程的程序设计和算法面向过程的程序设计和算法3.2 +程序和语句程序和语句3.3 赋值语句赋值语句3.4 C+的输入与输出的输入与输出3.5 编写顺序结构的程序编写顺序结构的程序3.6 关系运算和逻辑运算关系运算和逻辑运算3.7 选择结构和语句选择结构和语句3.8 条件运算符和条件表达式条件运算符和条件表达式3.9 多分支选择结构和多分支选择结构和
2、switch语句语句3.10 编写选择结构的程序编写选择结构的程序3.11 循环结构和循环语句循环结构和循环语句3.12 循环的嵌套循环的嵌套3.13 break语句和语句和continue语句语句3.14 编写循环结构的程序编写循环结构的程序在面向过程的程序设计中,程序设计者必须指定计在面向过程的程序设计中,程序设计者必须指定计算机执行的具体步骤,程序设计者不仅要考虑程序算机执行的具体步骤,程序设计者不仅要考虑程序要要“做什么做什么”,还要解决,还要解决“怎么做怎么做”的问题,根据的问题,根据程序要程序要“做什么做什么”的要求,写出一个个语句,安排的要求,写出一个个语句,安排好它们的执行顺序
3、。怎样设计这些步骤,怎样保证好它们的执行顺序。怎样设计这些步骤,怎样保证它的正确性和具有较高的效率,这就是算法需要解它的正确性和具有较高的效率,这就是算法需要解决的问题。决的问题。3.1 面向过程的程序设计和算法面向过程的程序设计和算法一个面向过程的程序应包括以下两方面内容:一个面向过程的程序应包括以下两方面内容:(1)对数据的描述。在程序中要指定数据的类型和对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构数据的组织形式,即数据结构(data structure)。(2)对操作的描述。即操作步骤,也就是算法对操作的描述。即操作步骤,也就是算法(algorithm)。对于面向过
4、程的程序,可以用下面的公式表示:对于面向过程的程序,可以用下面的公式表示:程序程序=算法算法+数据结构数据结构 作为程序设计人员,必须认真考虑和设计数据结构作为程序设计人员,必须认真考虑和设计数据结构和操作步骤和操作步骤(即算法即算法)。算法是处理问题的一系列的步骤。算法必须具体地算法是处理问题的一系列的步骤。算法必须具体地指出在执行时每一步应当怎样做。指出在执行时每一步应当怎样做。3.1.1 算法的概念算法的概念不要认为只有不要认为只有“计算计算”的问题才有算法。广义地说,的问题才有算法。广义地说,为解决一个问题而采取的方法和步骤,就称为为解决一个问题而采取的方法和步骤,就称为“算算法法”。
5、计算机算法可分为两大类别:数值算法和非数值算计算机算法可分为两大类别:数值算法和非数值算法。数值算法的目的是求数值解。非数值算法包括法。数值算法的目的是求数值解。非数值算法包括的面十分广泛,最常见的是用于事务管理领域。目的面十分广泛,最常见的是用于事务管理领域。目前,计算机在非数值方面的应用远远超过了在数值前,计算机在非数值方面的应用远远超过了在数值方面的应用。方面的应用。C+既支持面向过程的程序设计,又支持面向对象既支持面向过程的程序设计,又支持面向对象的程序设计。无论面向过程的程序设计还是面向对的程序设计。无论面向过程的程序设计还是面向对象的程序设计,都离不开算法设计。象的程序设计,都离不
6、开算法设计。1.自然语言自然语言用中文或英文等自然语言描述算法。但容易产生歧用中文或英文等自然语言描述算法。但容易产生歧义性,在程序设计中一般不用自然语言表示算法。义性,在程序设计中一般不用自然语言表示算法。2.流程图流程图 可以用传统的流程图或结构化流程图。用图的形式可以用传统的流程图或结构化流程图。用图的形式表示算法,比较形象直观,但修改算法时显得不大表示算法,比较形象直观,但修改算法时显得不大方便。方便。3.伪代码伪代码(pseudo code)伪代码是用介于自然语言和计算机语言之间的文字伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。如和符号来描述算法。如3.1.2 算法
7、的表示算法的表示if x is positive then print xelse print-x用伪代码写算法并无固定的、严格的语法规则,只用伪代码写算法并无固定的、严格的语法规则,只需把意思表达清楚,并且书写的格式要写成清晰易需把意思表达清楚,并且书写的格式要写成清晰易读的形式。它不用图形符号,因此书写方便、格式读的形式。它不用图形符号,因此书写方便、格式紧凑,容易修改,便于向计算机语言算法紧凑,容易修改,便于向计算机语言算法(即程序即程序)过渡。过渡。4.用计算机语言表示算法用计算机语言表示算法 用一种计算机语言去描述算法,这就是计算机程序。用一种计算机语言去描述算法,这就是计算机程序。
8、由第由第1章已知,一个程序包含一个或多个程序单位章已知,一个程序包含一个或多个程序单位(每个程序单位构成一个程序文件每个程序单位构成一个程序文件)。每一个程序单。每一个程序单位由以下几个部分组成:位由以下几个部分组成:(1)预处理命令。如预处理命令。如#include命令和命令和#define命令。命令。(2)声明部分。例如对数据类型和函数的声明,以声明部分。例如对数据类型和函数的声明,以及对变量的定义。及对变量的定义。(3)函数。包括函数首部和函数体,在函数体中可函数。包括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句。以包含若干声明语句和执行语句。如下面是一个完整的如下面是一个
9、完整的C+程序:程序:3.2 C+程序和语句程序和语句#include /预处理命令预处理命令using namespace std;/在函数之外的声明部分在函数之外的声明部分int a=3;/在函数之外的声明部分在函数之外的声明部分int main()/函数首部函数首部 float b;/函数内的声明部分函数内的声明部分 b=4.5;/执行语句执行语句 coutab;/执行语句执行语句 return 0;/执行语句执行语句如果一个变量在函数之外进行声明,此变量是全局如果一个变量在函数之外进行声明,此变量是全局变量,它的有效范围是从该行开始到本程序单位结变量,它的有效范围是从该行开始到本程序单
10、位结束。如果一个变量在函数内声明,此变量是局部变束。如果一个变量在函数内声明,此变量是局部变量,它的有效范围是从该行开始到本函数结束。量,它的有效范围是从该行开始到本函数结束。C+程序结构可以用图程序结构可以用图31表示。表示。图图3.1程序应该包括数据描述(由声明语句来实现)和数程序应该包括数据描述(由声明语句来实现)和数据操作(由执行语句来实现)。数据描述主要包括据操作(由执行语句来实现)。数据描述主要包括数据类型的声明、函数和变量的定义、变量的初始数据类型的声明、函数和变量的定义、变量的初始化等。数据操作的任务是对已提供的数据进行加工。化等。数据操作的任务是对已提供的数据进行加工。C+程
11、序中最小的独立单位是语句程序中最小的独立单位是语句(statement)。它相当于一篇文章中的一个句子。句子是用句号结它相当于一篇文章中的一个句子。句子是用句号结束的。语句一般是用分号结束的束的。语句一般是用分号结束的(复合语句是以右复合语句是以右花括号结束的花括号结束的)。C+语句可以分为以下语句可以分为以下4种:种:1.声明语句声明语句如如int a,b;在在C语言中,只有产生实际操作的才称为语言中,只有产生实际操作的才称为语句,对变量的定义不作为语句,而且要求对变量语句,对变量的定义不作为语句,而且要求对变量的定义必须出现在本块中所有程序语句之前。因此的定义必须出现在本块中所有程序语句之
12、前。因此C程序员已经养成了一个习惯:程序员已经养成了一个习惯:在函数或块的开头在函数或块的开头位置定义全部变量。在位置定义全部变量。在C+中,对变量中,对变量(以及其他以及其他对象对象)的定义被认为是一条语句,并且可以出现在的定义被认为是一条语句,并且可以出现在函数中的任何行,即可以放在其他程序语句可以出函数中的任何行,即可以放在其他程序语句可以出现的地方,也可以放在函数之外。这样更加灵活,现的地方,也可以放在函数之外。这样更加灵活,可以很方便地实现变量的局部化可以很方便地实现变量的局部化(变量的作用范围变量的作用范围从声明语句开始到本函数或本块结束从声明语句开始到本函数或本块结束)。2.执行
13、语句执行语句通知计算机完成一定的操作。执行语句包括:通知计算机完成一定的操作。执行语句包括:(1)控制语句,完成一定的控制功能。控制语句,完成一定的控制功能。C+有有9种控种控制语句,即制语句,即 if()else (条件语句)条件语句)for()(循环语句)循环语句)while()(循环语句)循环语句)dowhile()(循环语句)循环语句)continue (结束本次循环语句)结束本次循环语句)break (中止执行或循环语句)中止执行或循环语句)switch (多分支选择语句)多分支选择语句)goto (转向语句)转向语句)return (从函数返回语句)从函数返回语句)(2)函数和流对
14、象调用语句。函数调用语句由一次函数和流对象调用语句。函数调用语句由一次函数调用加一个分号构成一个语句,例如函数调用加一个分号构成一个语句,例如sort(x,y,z);/假设已定义了假设已定义了sort函数,它有函数,它有3个参数个参数coutx100)z=z-100;cout0)cout0endl;按语法规定按语法规定if后面的后面的()内是一个条件内是一个条件。现在在现在在x的的位置上换上一个赋值表达式位置上换上一个赋值表达式“a=b”,其作用是:其作用是:先进行赋值运算(将先进行赋值运算(将b的值赋给的值赋给a),),然后判断然后判断a是是否大于否大于0,如大于,如大于0,执行,执行cou
15、t00)cout0endl;因为在因为在if的条件中不能包含赋值语句。的条件中不能包含赋值语句。C+把赋值把赋值语句和赋值表达式区别开来,增加了表达式的种类,语句和赋值表达式区别开来,增加了表达式的种类,能实现其他语言中难以实现的功能。能实现其他语言中难以实现的功能。输入和输出并不是输入和输出并不是C+语言中的正式组成成分。语言中的正式组成成分。C和和C+本身都没有为输入和输出提供专门的语句结本身都没有为输入和输出提供专门的语句结构。输入输出不是由构。输入输出不是由C+本身定义的,而是在编译本身定义的,而是在编译系统提供的系统提供的I/O库中定义的。库中定义的。C+的输出和输入是用的输出和输入
16、是用“流流”(stream)的方式实现的方式实现的。图的。图3.2和图和图3.3表示表示C+通过流进行输入输出的通过流进行输入输出的过程。过程。3.4 C+的输入与输出的输入与输出图图3.2图图3.3有关流对象有关流对象cin、cout和流运算符的定义等信息是存和流运算符的定义等信息是存放在放在C+的输入输出流库中的,因此如果在程序中的输入输出流库中的,因此如果在程序中使用使用cin、cout和流运算符,就必须使用预处理命令和流运算符,就必须使用预处理命令把头文件把头文件stream包含到本文件中:包含到本文件中:#include 尽管尽管cin和和cout不是不是C+本身提供的语句,但是在不
17、本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由致混淆的情况下,为了叙述方便,常常把由cin和和流提取运算符流提取运算符“”实现输入的语句称为输入语句实现输入的语句称为输入语句或或cin语句,把由语句,把由cout和流插入运算符和流插入运算符“”实现输实现输出的语句称为输出语句或出的语句称为输出语句或cout语句。根据语句。根据C+的语的语法,凡是能实现某种操作而且最后以分号结束的都法,凡是能实现某种操作而且最后以分号结束的都是语句。是语句。cout语句的一般格式为语句的一般格式为 cout表达式表达式1表达式表达式2变量变量1变量变量2变量变量n;在定义流对象时,系统会在内存中
18、开辟一段缓冲区,在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行用来暂存输入输出流的数据。在执行cout语句时,语句时,先把插入的数据顺序存放在输出缓冲区中,直到输先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到出缓冲区满或遇到cout语句中的语句中的endl(或或n,ends,flush)为止,此时将缓冲区中已有的数据一为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默起输出,并清空缓冲区。输出流中的数据在系统默认的设备认的设备(一般为显示器一般为显示器)输出。输出。*3.4.1 输入流与输出流的基本操作输入流与输出流的基本
19、操作一个一个cout语句可以分写成若干行。如语句可以分写成若干行。如coutThis is a simple C+program.endl;可以写成可以写成 coutThis is /注意行末尾无分号注意行末尾无分号a C+program.endl;/语句最后有分号语句最后有分号也可写成多个也可写成多个cout语句,即语句,即coutThis is;/语句末尾有分号语句末尾有分号cout a C+;cout program.;coutendl;以上以上3种情况的输出均为种情况的输出均为This is a simple C+program.注意注意 不能用一个插入运算符不能用一个插入运算符“”插
20、入多个输出项:插入多个输出项:couta,b,c;/错误,不能一次插入多项错误,不能一次插入多项couta+b+c;/正确,这是一个表达式,作为一项正确,这是一个表达式,作为一项在用在用cout输出时,用户不必通知计算机按何种类型输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义数据按相应的类型输出。如已定义a为为int型,型,b为为float型,型,c为为char型,则型,则couta b cabcd;可以写成可以写成 cina /注意行末尾无分号注意行末尾无分号 b /这样写可能看起来清
21、晰些这样写可能看起来清晰些 c d;也可以写成也可以写成cina;cinb;cinc;cind;以上以上3种情况均可以从键盘输入:种情况均可以从键盘输入:1 2 3 4 也可以分多行输入数据:也可以分多行输入数据:1 2 3 4 在用在用cin输入时,系统也会根据变量的类型从输入流输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有中提取相应长度的字节。如有char c1,c2;int a;float b;cinc1c2ab;如果输入如果输入1234 56.78 注意:注意:34后面应该有空格以便和后面应该有空格以便和56.78分隔开。也分隔开。也可以按下面格式输入:可以按下面格式
22、输入:1 2 34 56.78 (在在1和和2之间有空格之间有空格)不能用不能用cin语句把空格字符和回车换行符作为字符输语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符入给字符变量,它们将被跳过。如果想将空格字符或回车换行符或回车换行符(或任何其他键盘上的字符或任何其他键盘上的字符)输入给字输入给字符变量,可以用符变量,可以用3.4.3节介绍的节介绍的getchar函数。函数。在组织输入流数据时,要仔细分析在组织输入流数据时,要仔细分析cin语句中变量的语句中变量的类型,按照相应的格式输入,否则容易出错。类型,按照相应的格式输入,否则容易出错。上面介绍的是使用
23、上面介绍的是使用cout和和cin时的默认格式。但有时时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。向右对齐等。C+提供了在输入输出流中使用的控提供了在输入输出流中使用的控制符制符(有的书中称为操纵符有的书中称为操纵符),见书中表,见书中表3.1。需要注意的是:需要注意的是:如果使用了控制符,在程序单位的如果使用了控制符,在程序单位的开头除了要加开头除了要加iostream头文件外,还要加头文件外,还要加iomanip头头文件。文件。
24、举例:举例:输出双精度数。输出双精度数。*3.4.2 在输入流与输出流中使用控制符在输入流与输出流中使用控制符double a=123.456789012345;对对a赋初值赋初值(1)couta;输出:输出:123.456 (2)coutsetprecision(9)a;输出:输出:123.456789 (3)coutsetprecision(6);恢复默认格式恢复默认格式(精度为精度为6)(4)cout setiosflags(ios fixed);输出:输出:123.456789(5)coutsetiosflags(ios fixed)setprecision(8)a;输出:输出:123
25、.45678901(6)coutsetiosflags(ios scientific)a;输出:输出:1.234568e+02(7)coutsetiosflags(ios scientific)setprecision(4)a;输出:输出:1.2346e02下面是整数输出的例子:下面是整数输出的例子:int b=123456;对对b赋初值赋初值(1)coutb;输出:输出:123456(2)couthexb;输出:输出:1e240 (3)coutsetiosflags(ios uppercase)b;输出:输出:1E240 (4)coutsetw(10)b,b;输出:输出:123456,123
26、456(5)coutsetfill(*)setw(10)b;输出:输出:*123456(6)coutsetiosflags(ios showpos)b;输出:输出:+123456如果在多个如果在多个cout语句中使用相同的语句中使用相同的setw(n),并使用并使用setiosflags(ios right),可以实现各行数据右对齐,可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。如果指定相同的精度,可以实现上下小数点对齐。例例3.1 各行小数点对齐。各行小数点对齐。#include#include using namespace std;int main()double
27、a=123.456,b=3.14159,c=-3214.67;coutsetiosflags(ios fixed)setiosflags(ios right)setprecision(2);coutsetw(10)aendl;coutsetw(10)bendl;coutsetw(10)cendl;return 0;输出如下:输出如下:123.46 (字段宽度为字段宽度为10,右对齐,取两位小数,右对齐,取两位小数)3.14 -3214.67先统一设置定点形式输出、取两位小数、右对齐。先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效这些设置对其后的输出均有效(除非重新设置除
28、非重新设置),而,而setw只对其后一个输出项有效,因此必须在输出只对其后一个输出项有效,因此必须在输出a,b,c之前都要写之前都要写setw(10)。C+还保留了还保留了C语言中用于输入和输出单个字符的语言中用于输入和输出单个字符的函数,使用很方便。其中最常用的有函数,使用很方便。其中最常用的有getchar函数和函数和putchar函数。函数。1.putchar函数(字符输出函数)函数(字符输出函数)putchar函数的作用是向终端输出一个字符。例如函数的作用是向终端输出一个字符。例如putchar(c);它输出字符变量的值。它输出字符变量的值。3.4.3 用用getchar和和putch
29、ar 函数进行字符的输入和输出函数进行字符的输入和输出例例3.2 输出单个字符。输出单个字符。#include /或者包含头文件或者包含头文件stdio.h:#include using namespace std;int main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);putchar(n);putchar(66);putchar(79);putchar(89);putchar(10);return 0;运行结果为运行结果为BOYBOY可以看到:可以看到:用用putchar可以输出转义字符,可以输出转义字符,putch
30、ar(n)的作用是输出一个换行符,使输出的当前位的作用是输出一个换行符,使输出的当前位置移到下一行的开头。置移到下一行的开头。putchar(66)的作用是将的作用是将66作作为为ASCII码转换为字符输出,码转换为字符输出,66是字母是字母B的的ASCII码,因此码,因此putchar(66)输出字母输出字母B。其余其余类似。类似。putchar(10)中的中的10是换行符的是换行符的ASCII码,码,putchar(10)输出一个换行符,作用与输出一个换行符,作用与putchar(n)相同。相同。也可以输出其他转义字符,如也可以输出其他转义字符,如 putchar(101)(输出字符输出字
31、符A,八进制的八进制的101是是A的的ASCII码)码)putchar()(输出单引号字符输出单引号字符)putchar(015)(输出回车,不换行,使输出的当前位置输出回车,不换行,使输出的当前位置移到本行开头)移到本行开头)2.getchar函数(字符输入函数)函数(字符输入函数)此函数的作用是从终端(或系统隐含指定的输入设此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。备)输入一个字符。getchar函数没有参数,其一般函数没有参数,其一般形式为形式为getchar()函数的值就是从输入设备得到函数的值就是从输入设备得到的字符。的字符。例例3.3 输入单个字符。输入单个字符
32、。#include using namespace std;int main()char c;c=getchar();putchar(c+32);putchar(n);return 0;在运行时,如果从键盘输入大写字母在运行时,如果从键盘输入大写字母A并按回并按回车键,就会在屏幕上输出小写字母车键,就会在屏幕上输出小写字母a。请注意,请注意,getchar()只能接收一个字符。只能接收一个字符。getchar函函数得到的字符可以赋给一个字符变量或整型变量,数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。例也可以不赋给任何变量,作为表达式的一部分。例如,例如
33、,例3.3第第5行可以用下面一行代替:行可以用下面一行代替:putchar(getchar()()+32););putchar(n);因为因为getchar()读入的值为读入的值为A,A+32是小写字是小写字母母a的的ASCII码,因此码,因此putchar函数输出函数输出a。此时不必定义变量此时不必定义变量c。也可用也可用cout输出输出getchar函数得到字符的函数得到字符的ASCII的值:的值:coutgetchar();这时输出的是整数这时输出的是整数97,因为用,因为用getchar()读入的实际读入的实际上是字符的上是字符的ASCII码,现在并未把它赋给一个字符码,现在并未把它赋
34、给一个字符变量,变量,cout就按整数形式输出。如果改成就按整数形式输出。如果改成cout(c=getchar();/设设c已定义为字符变量已定义为字符变量则输出为字母则输出为字母a,因为要求输出字符变量因为要求输出字符变量c的值。的值。可以看到用可以看到用putchar和和getchar函数输出和输入字符函数输出和输入字符十分灵活方便,由于它们是函数所以可以出现在表十分灵活方便,由于它们是函数所以可以出现在表达式中,例如达式中,例如cout(c=getchar()+32);在在C语言中是用语言中是用printf函数进行输出,用函数进行输出,用scanf函数函数进行输入的。进行输入的。C+保留
35、了保留了C语言的这一用法。在此语言的这一用法。在此只作很简单的介绍。只作很简单的介绍。scanf函数一般格式是函数一般格式是 scanf(格式控制,输入变量地址表列格式控制,输入变量地址表列)printf函数的一般格式是函数的一般格式是printf(格式控制,输出表列格式控制,输出表列)3.4.4 用用scanf和和printf函数进行输入和输出函数进行输入和输出例例3.4 用用scanf和和printf函数进行输入和输出。函数进行输入和输出。#include using namespace std;int main()int a;float b;char c;scanf(%d%c%f,&a,
36、&c,&b);/注意在变量名前要加地址运算注意在变量名前要加地址运算符符&printf(a=%d,b=%f,c=%cn,a,b,c);return 0;运行情况如下:运行情况如下:12 A 67.98(本行为输入,输入的本行为输入,输入的3个数据间以空格相间个数据间以空格相间)a=12,b=67.980003,c=A(本行为输出本行为输出)输入的整数输入的整数12送给整型变量送给整型变量a,字符字符A送给字符送给字符变量变量c,67.98送给单精度变量送给单精度变量b。例例3.5 求一元二次方程式求一元二次方程式ax2+bx+c=0的根。的根。a,b,c的的值在运行时由键盘输入,它们的值满足值
37、在运行时由键盘输入,它们的值满足b2-4ac0。根据求根据求x1,x2的算法。它可以编写出以下的算法。它可以编写出以下C+程序:程序:#include#include /由于程序要用到数学函数由于程序要用到数学函数sqrt,故应包含头故应包含头文件文件cmathusing namespace std;int main()float a,b,c,x1,x2;cinabc;x1=(-b+sqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrt(b*b-4*a*c)/(2*a);coutx1=x1endl;coutx2=x2endl;return 0;3.5 编写顺序结构的程序编写顺序结构
38、的程序运行情况如下:运行情况如下:4.5 8.8 2.4 x1=-0.327612x2=-1.17794如果程序中要用到数学函数,都要包含头文件如果程序中要用到数学函数,都要包含头文件cmath(也可以用老形式的头文件也可以用老形式的头文件math.h,但提倡使但提倡使用用C+新形式的头文件,请参阅第新形式的头文件,请参阅第14章章14.3节节)。在。在写程序时,一定要注意将数学表达式正确地转换成写程序时,一定要注意将数学表达式正确地转换成合法的合法的C+表达式。表达式。可以看到:可以看到:顺序结构的程序中的各执行语句是顺序顺序结构的程序中的各执行语句是顺序执行的。这种程序最简单,最容易理解。
39、执行的。这种程序最简单,最容易理解。往往要求根据某个指定的条件是否满足来决定执行往往要求根据某个指定的条件是否满足来决定执行的内容。例如,购物在的内容。例如,购物在1000元以下的打九五折,元以下的打九五折,1000元及以上的打九折。元及以上的打九折。C+提供提供if语句来实现这种条件选择。如语句来实现这种条件选择。如if amount1000 tax=0.95;/amount代表购物总额,代表购物总额,tax代表折扣代表折扣else tax=0.9;/若若amount1000,条件满足,条件满足,tax=0.95,否则否则tax=0.9pay=amount*tax;/pay为实付款为实付款流
40、程可以用图流程可以用图3.4表示。表示。图图3.43.6 关系运算和逻辑运算关系运算和逻辑运算上面上面if语句中的语句中的“amount1000”实现的不是算术运实现的不是算术运算,而是关系运算。实际上是比较运算,将两个数算,而是关系运算。实际上是比较运算,将两个数据进行比较,判断比较的结果。据进行比较,判断比较的结果。“amount”是一个比较符,称为关系运算符。是一个比较符,称为关系运算符。C+的关系运算符有:的关系运算符有:(小于小于)(大于大于)=(大于或等于大于或等于)=(等于等于)!=(不等于不等于)优先级相同优先级相同(低低)3.6.1 关系运算和关系表达式关系运算和关系表达式关
41、于优先次序:关于优先次序:前前4种关系运算符(种关系运算符(,)的优先级)的优先级别相同,后两种也相同。前别相同,后两种也相同。前4种高于后两种。例如,种高于后两种。例如,“”优先于优先于“”。而。而“”与与“a+b 等效于等效于 c(a+b)ab=c 等效于等效于(ab)=c a=bc 等效于等效于a=(bc 等效于等效于a=(bc)用关系运算符将两个表达式连接起来的式子,称为用关系运算符将两个表达式连接起来的式子,称为关系表达式。关系表达式的一般形式可以表示为关系表达式。关系表达式的一般形式可以表示为表达式表达式 关系运算符关系运算符 表达式表达式其中的其中的“表达式表达式”可以是算术表达
42、式或关系表达式、可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式。例如,下逻辑表达式、赋值表达式、字符表达式。例如,下面都是合法的关系表达式:面都是合法的关系表达式:ab,a+bb+c,(a=3)(b=5),ab)(b=0”的值为的值为“真真”。在。在C和和C+中都用数值中都用数值1代代表表“真真”,用,用0代表代表“假假”。如果有以下赋值表达式:如果有以下赋值表达式:d=ab 则则d得到的值为得到的值为1f=abc f得到的值为得到的值为0C语言没有提供逻辑型数据,关系表达式的值语言没有提供逻辑型数据,关系表达式的值(真或真或假假)分别用数值分别用数值1和和0代表。代表。C+
43、增加了逻辑型数据。增加了逻辑型数据。逻辑型常量只有两个,即逻辑型常量只有两个,即false(假假)和和true(真真)。逻辑型变量要用类型标识符逻辑型变量要用类型标识符bool来定义,它的值只来定义,它的值只能是能是true和和false之一。如之一。如bool found,flag=false;/定义逻辑变量定义逻辑变量found和和flag,并使并使flag的初值的初值为为falsefound=true;/将逻辑常量将逻辑常量true赋给逻辑变量赋给逻辑变量found由于逻辑变量是用关键字由于逻辑变量是用关键字bool来定义的,因此又称来定义的,因此又称为布尔变量。逻辑型常量又称为布尔常量
44、。所谓逻为布尔变量。逻辑型常量又称为布尔常量。所谓逻辑型,就是布尔型。辑型,就是布尔型。设立逻辑类型的目的是为了看程序时直观易懂。设立逻辑类型的目的是为了看程序时直观易懂。3.6.2 逻辑常量和逻辑变量逻辑常量和逻辑变量在编译系统处理逻辑型数据时,将在编译系统处理逻辑型数据时,将false处理为处理为0,将将true处理为处理为1。因此,逻辑型数据可以与数值型因此,逻辑型数据可以与数值型数据进行算术运算。数据进行算术运算。如果将一个非零的整数赋给逻辑型变量,则按如果将一个非零的整数赋给逻辑型变量,则按“真真”处理,如处理,如flag=123;/赋值后赋值后flag的值为的值为truecoutb
45、)&(xy)可写成可写成 ab&xy (a=b)|(x=y)可写成可写成 a=b|x=y (!a)|(ab)可写成可写成!a|ab将两个关系表达式用逻辑运算符连接起来就成为一将两个关系表达式用逻辑运算符连接起来就成为一个逻辑表达式,上面几个式子就是逻辑表达式。逻个逻辑表达式,上面几个式子就是逻辑表达式。逻辑表达式的一般形式可以表示为辑表达式的一般形式可以表示为表达式表达式 逻辑运算符逻辑运算符 表达式表达式逻辑表达式的值是一个逻辑量逻辑表达式的值是一个逻辑量“真真”或或“假假”。前。前面已说明,在给出逻辑运算结果时,以数值面已说明,在给出逻辑运算结果时,以数值1代表代表“真真”,以,以0代表代
46、表“假假”,但在判断一个逻辑量是,但在判断一个逻辑量是否为否为“真真”时,采取的标准是:时,采取的标准是:如果其值是如果其值是0就认就认为是为是“假假”,如果其值是非,如果其值是非0就认为是就认为是“真真”。例。例如:如:(1)若若a=4,则则!a的值为的值为0。因为。因为a的值为非的值为非0,被认作,被认作“真真”,对它进行,对它进行“非非”运算,得运算,得“假假”,“假假”以以0代表。代表。(2)若若a=4,b=5,则则a&b的值为的值为1。因为。因为a和和b均为非均为非0,被,被认为是认为是“真真”。(3)a,b值同前,值同前,a-b|a+b的值为的值为1。因为。因为a-b和和a+b的值
47、都为的值都为非零值。非零值。(4)a,b值同前,值同前,!a|b的值为的值为1。(5)4&0|2 的值为的值为1。在在C+中,整型数据可以出现在逻辑表达式中,在中,整型数据可以出现在逻辑表达式中,在进行逻辑运算时,根据整型数据的值是进行逻辑运算时,根据整型数据的值是0或非或非0,把,把它作为逻辑量假或真,然后参加逻辑运算。它作为逻辑量假或真,然后参加逻辑运算。通过这几个例子可以看出:通过这几个例子可以看出:逻辑运算结果不是逻辑运算结果不是0就就是是1,不可能是其他数值。而在逻辑表达式中作为,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是参加逻辑运算的运算对象可以是0(“假假
48、”)或任)或任何非何非0的数值(按的数值(按“真真”对待)。如果在一个表达对待)。如果在一个表达式中的不同位置上出现数值,应区分哪些是作为数式中的不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对值运算或关系运算的对象,哪些作为逻辑运算的对象。象。实际上,逻辑运算符两侧的表达式不但可以是关系实际上,逻辑运算符两侧的表达式不但可以是关系表达式或整数表达式或整数(0和非和非0),也可以是任何类型的数据,也可以是任何类型的数据,如字符型、浮点型或指针型等。系统最终以如字符型、浮点型或指针型等。系统最终以0和非和非0来判定它们属于来判定它们属于“真真”或或“假假”。例如
49、。例如c&的值为的值为1。可以将表可以将表3.2改写成书中表改写成书中表3.3形式。形式。熟练掌握熟练掌握C+的关系运算符和逻辑运算符后,可以的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来表示一个复杂的条件。巧妙地用一个逻辑表达式来表示一个复杂的条件。例如,要判别某一年例如,要判别某一年(year)是否为闰年。闰年的条是否为闰年。闰年的条件是符合下面两者之一:件是符合下面两者之一:能被能被4整除,但不能被整除,但不能被100整除。整除。能被能被100整除,又能被整除,又能被400整除。例如整除。例如2004、2000年是闰年,年是闰年,2005、2100年不是闰年。年不是闰年。可以用
50、一个逻辑表达式来表示:可以用一个逻辑表达式来表示:(year%4=0&year%100!=0)|year%400=0 当给定当给定year为某一整数值时,如果上述表达式值为为某一整数值时,如果上述表达式值为真真(1),则,则year为闰年;否则为闰年;否则year为非闰年。可以为非闰年。可以加一个加一个“!”用来判别非闰年:用来判别非闰年:!(year%4=0&year%100!=0)|year%400=0)若表达式值为真若表达式值为真(1),year为非闰年。也可以用下面为非闰年。也可以用下面的逻辑表达式判别非闰年:的逻辑表达式判别非闰年:(year%4!=0)|(year%100=0&ye