第二章 C++简单程序设计 数学与统计科学学院 胡凤珠
目录 2.1 C++语言概述 2.2 基本数据类型和表达式 2.3 数据的输入与输出 2.4 算法的基本控制结构 2.5 自定义数据类型 2.6 小结
2.1 C++语言概述 2.1.1 C++的产生 有些人之所以重要,是因为它们改变了历史;另一些人更重要,因为他们创造了历史。丹尼斯.M.里奇属于第二种人。他创造了世界上最为广泛的编程语言:“C”语言,他的功绩不止于此,他还和肯.汤普森一起带头开发了Unix OS。
2.1.1 C++的产生 2.1 C++语言概述 C++是从C语言发展演变而来的。
2.1 C++语言概述 2.1.1 C++的产生 C++的产生 贝尔实验室的Dennis Ritchie在B语言的基础上1972年实现的最初的C。 C++是美国贝尔实验室于1980年开发出来的一种过程性与面向对象性结合的程序设计语言最初他把这种新的语言叫做“含类的C”,到1983年才取名为C++。 从1989年开始C++语言的标准化工作。 于1994年制定了ANSI C++标准草案。 于1998年11月被国际标准化组织(ISO)批准为国际标准,成为目前的C++。
2.1.2 C++的特点 2.1 C++语言概述 C++语言与C语言兼容,C语言是C++语言的一个子集。 支持面向对象的方法
将文件iostream中的代码嵌入到程序中该指令处 2.1 C++语言概述 2.1.3 C++程序实例 例2-1 将文件iostream中的代码嵌入到程序中该指令处 //2_1.cpp #include <iostream> using namespace std; int main() { cout << "Hello!" << endl; cout << "Welcome to c++!" << endl; return 0; } 运行结果: 针对命名空间的指令,见第5章 函数返回值类型 cout是输出流对象 <<插入符屏幕输出操作符 >>提取符键盘输入操作符 endl 换行符
补例:从键盘输入2个int整数,编程求两数和。 2.1 C++语言概述 2.1.3 C++程序实例 补例:从键盘输入2个int整数,编程求两数和。 I/O流库,提供所有的输入输出操作 #include <iostream.h> int add(int ,int); void main( ) { int a,b; cout<< "Enter a b: "; cin>>a>>b; int c=add(a,b); cout<< "a+b="<<c<<endl; } int add(int x,int y) return x+y; cout:流类对象 <<:插入符 提供屏幕输出; cin:流类对象 >>:提取符 提供键盘输入: 函数原型说明 函数返回值类型 函数调用 endl:换行 运行程序后显示: Enter a,b: 键盘键入18 36回车后,输出: a+b=54 函数定义
2.1.4 C++字符集 2.1 C++语言概述 C++语言字符集同于C语言字符集。由下列字符组成: 大小写的英文字母:A~Z,a~z 数字字符:0~9 特殊字符: ! # % ^ & * _ + = - ~ < > / \ ‘ “ ; . , : ? ( ) [ ] { } 反斜杠
2.1.5词法记号 2.1 C++语言概述 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 标识符 用来命名程序中一些实体的一种单词。 文字 在程序中直接使用符号表示的数据。 操作符(运算符)用于实现各种运算的符号。 分隔符 用于分隔各个词法记号或程序正文。 空白符 空格、制表符(Tab键产生的字符)、垂直制 表符、换行符、回车符和注释的总称。
11 2.1 C++语言概述 2.1.5词法记号 关键字 C++预定义的单词(63个)
2.1.5词法记号 2.1 C++语言概述 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 12 2.1 C++语言概述 2.1.5词法记号 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 用标识符来命名变量名、函数名、类名、对象名、常量名、类型名、语句标号名、宏名等。 C++规定,标识符是由大小写字母、数字和下划线组成的,且以字母或下划线开头的字符集合。 定义标识符时注意: 1、区分大小写; 2、字符个数不受限;建议长度最好不要超过8个字符。 3、见名知义。
运算符是一种用于进行某种操作的单词。运算符是由1个或多个合法字符组成的。 13 2.1 C++语言概述 2.1.5词法记号 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 文字 在程序中直接使用符号表示的数据。 操作符(运算符) 用于实现各种运算的符号。 运算符是一种用于进行某种操作的单词。运算符是由1个或多个合法字符组成的。 C++运算符可以重载。
2.1.5词法记号 2.1 C++语言概述 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 14 2.1 C++语言概述 2.1.5词法记号 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 文字 在程序中直接使用符号表示的数据。 操作符(运算符) 用于实现各种运算的符号。 分隔符 用于分隔各个词法记号或程序正文。 C++中常用的分隔符与C中相同,包括: 空格符:单词间的分隔符。 逗号符:变量名之间或对象名之间、函数表中参数之间的分隔符。 分号符:for循环语句中关键字for后边括号内的3个表达式之间的分隔符。 冒号符:仅用做语句标号和语句之间以及开关语句中case<整常型表达式>与语句序列之间的分隔符。 另外,单撇号、双撇号和括号、花括号等用于某些实体的定界符。
2.1.5词法记号 2.1 C++语言概述 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 15 2.1 C++语言概述 2.1.5词法记号 关键字 C++预定义的单词。 标识符 用来命名程序中一些实体的一种单词。 文字 在程序中直接使用符号表示的数据。 操作符(运算符)用于实现各种运算的符号。 分隔符 用于分隔各个词法记号或程序正文。 空白符 空格、制表符(Tab键产生的字符)、垂直制 表符、换行符、回车符和注释的总称。 *注释: C++中的注释符(/*和*/)或者 行注释符(//)用来注释 从该注释符以后的该行信息为注释信息。 行注释符(//)不可放在语句前边。
2.2.1 基本数据类型 2.2 基本数据类型和表达式 以Visual C++ 6.0编译系统为例 布尔型 bool 1 类型名 取值范围 布尔型 bool 1 false,true 字符型 char -128~127 有符号字符型 signed char 无符号字符型 unsigned char 0~255 有符号短整型 short(signed short) 2 -32768~32767 无符号短整型 unsigned short 0~65535 有符号基本整型 int(signed int) 4 -2147483648~2147483647 无符号基本整型 unsigned int 0~4294967295 有符号长整型 long(signed long) 无符号长整型 unsigned long 单精度实型 float 3.4×10-38~3.4×1038 双精度实型 double 8 1.7×10-308~1.7×10308 长双精度实型 long double 以Visual C++ 6.0编译系统为例
2.2.1 基本数据类型 2.2 基本数据类型和表达式 说明: 1) 在int之前有修饰符出现时,可以省略关键字int; 例如:signed short int unsigned short int signed int unsigned int signed long int unsigned long int 2) 单精度类型float(7位有效)、双精度类型double (15位 有效)、长精度类型long double统称浮点类型; 3) char类型和各种int类型统称整型类型; char类型变量在内存中以它的ASCII码值的形式存储; 4) 字宽长度(字节)取决于操作系统和编译器的实现,可用 sizeof验证;
2.2 基本数据类型和表达式 2.2.1 基本数据类型 实验课验证
2.2 基本数据类型和表达式 2.2.1 基本数据类型
2.2.2 常量 2.2 基本数据类型和表达式 常量:是指在程序运行的整个过程中其值始终不可改变的 量,也就是直接使用符号(文字)表示的值。 例如:12,3.5,’A’都是常量。 常量的种类: 整型常量 浮点型(实型)常量 字符型常量 字符串常量 布尔型常量 枚举常量(以后介绍)
2.2.2 常量 ①整型常量 2.2 基本数据类型和表达式 以文字形式出现的整数,包括正整数、负整数和零。 整型常量可以用十进制、八进制和十六进制表示。 (1)十进制整型常量 (2)八进制整型常量 (3)十六进制整型常量
2.2.2 常量 ①整型常量 2.2 基本数据类型和表达式 (1)、十进制表示 例:132, -345 由0~9的数字组成 不能以0开始 长整型(L或l) : 25763L 无符号整型(U或u): 46754U 无符号长整型 : 157682UL 例:132, -345 由0~9的数字组成 不能以0开始 无前缀 (2)、八进制表示 例:0123:八进制数123 (=十进制数83) -011:八进制数-11 (=十进制数-9) 由0 ~ 7的数字组成 以数字0为前缀 (3)、十六进制表示 由0~9的数字及A ~ F的字母(大小写均可)组成 以0x或0X为前缀 例:0x123:十六进制数123(=十进制数 291) -0x12:十六进制数-12(=十进制数-18)
整数部分和小数部分可省略,但不能同时省略 2.2 基本数据类型和表达式 2.2.2 常量 ②浮点型常量 浮点型(实型)常量由整数部分和小数部分构成,只有十进制表示,表示形式有两种: ① 小数形式,又称一般形式,格式如下: <整数部分>.<小数部分> 例如:0.123 123. 123.0 0.0 .123 整数部分和小数部分可省略,但不能同时省略 ② 指数形式,又称科学表示法,格式如下: <整数部分>.<小数部分>e<指数部分> 例如:123000= 123×103 :123e3或123E3 注意:字母e(或E)之前、后必须有数字,且e后面的指数必须为整数。 例如:1e3 1.8e-3 -123e-6 e3 2.1e3.5 .e3 e 错误
2.2.2 常量 ②浮点型常量 2.2 基本数据类型和表达式 浮点型常量分:单精度、双精度和长双精度3类。 单精度: 2.34f 7.5e3F .5e-2f (float) 双精度: 2.51 3.12 (没有后缀,double) 长双精度: 5.76L 0.32e5L 3.2e-1l (long double) 浮点型常量(实型常量)缺省为double型,如果后缀F(或f )可以使其成为float型,例如:12.3f。
2.2.2 常量 整数和实数类型常量举例 2.2 基本数据类型和表达式 10 num v #include <iostream> using namespace std; int main() { const int PRICE = 30; int num, total; double v, r, h; num = 10; total = num * PRICE; cout << total << endl; r = 2.5; h = 3.2; v = 3.14159 * r * r * h; cout << v << endl; return 0; } 300 total 2.5 r 3.2 h 整数常量 实数常量
例 字符型常量是用一对单撇号括起一个字符。 2.2.2 常量 ③字符型常量 '\ddd' 和 '\xhh' 2.2 基本数据类型和表达式 字符型常量表示方法有如下: 用一对单撇号括起一个图形符号。 其值为所括起字符在ASCII表中的编码。 例 ’a’ ’A’ ’1’ ’abc’ “a” 如 ’A’——65, ’a’——97, ②用一对单撇号括起反斜线加上字符的ASCII码值。可用下述两种形式: '\ddd' 和 '\xhh' ddd:1到3位八进制数字 例如:’\033’ hh:1到2位十六进制数字 例如:’\x1b’
2.2.2 常量 ③字符型常量 2.2 基本数据类型和表达式 C++转义字符 列表: 字符常量形式 ASCII码 (十六进制) 含义 \a 07 响铃 \n 0A 换行 \t 09 水平制表符 \v 0B 垂直制表符 \b 08 退格 \r 0D 回车 \f 0C 换页 \\ 5C 字符“\” \” 22 双撇号 \’ 27 单撇号 \0 空字符 制表符相当于键盘上按下Tab键之间的距离(比如8个空格),也称为空白符。空白符只在字符常量和字符串常量中起作用。在其它地方出现时,只起间隔作用, 编译程序对它们忽略。
2.2 基本数据类型和表达式 2.2.2 常量 ③字符型常量 C++转义字符 举例: 十六进制数字 八进制数字
9.12 2.2.2 常量 2.2 基本数据类型和表达式 常量:是指在程序运行的整个过程中其值始终不可改变的 量。 常量的种类: 整型常量 29 2.2 基本数据类型和表达式 2.2.2 常量 9.12 常量:是指在程序运行的整个过程中其值始终不可改变的 量。 常量的种类: 整型常量 浮点型(实型)常量 字符型常量 字符串常量 布尔型常量 枚举常量(以后介绍)
h e l \ 0 字符串常量是由一对双撇号括起的字符序列。 2.2.2 常量 ④字符串常量 2.2 基本数据类型和表达式 可由任何字符组成,包含空格符、转义字符和其他字符,也包含汉字。 合法的字符串常量: ”How do you do.”, ” CHINA”,” a” , ” $123.45” , ” ” 字符串结束符(自动加入) :'\0'用来标识字符串的结束,即ASCII码值为0的空字符。 例:字符串“hello”在内存中 h e l \ 0
字符常量与字符串常量的区别: 字符常量 串常量 由一维数组存放 由一个字符型变量存放 h \0 'h' “h” 用单撇号括起 用双撇号括起 字符串有结束符('\0' ) 字符常量'h'在内存中占用 一个字节 字符串常量"h"在内存中占 用两个字节 可进行加、减法运算 可进行连接,复制等运算
布尔常量只有false(假)和 true(真)两个。 2.2 基本数据类型和表达式 2.2.2 常量 ⑤布尔常量 布尔常量只有false(假)和 true(真)两个。
在程序运行期间,其值可以改变的量称为变量。 2.2 基本数据类型和表达式 2.2.3 变量 在程序运行期间,其值可以改变的量称为变量。 ①变量的声明和定义 声明语句形式如下: 数据类型 变量名1, 变量名2, ..., 变量名n; 在定义一个变量的同时,也可以给它赋以初值 例如: int a=3,b=4; ☆变量命名应遵守下列规则: ⑴ 按标识符命名规则命名,字母严格区分大小写。 ⑵ “见名知意”。 ⑶ 系统中的关键字、库中的类名和函数名等不能作 变量名。 ⑷ 变量名长度没有限制,但不宜过长。
在程序运行期间,其值可以改变的量称为变量。 2.2 基本数据类型和表达式 2.2.3 变量 在程序运行期间,其值可以改变的量称为变量。 ①变量的声明和定义 修饰符 signed : 有符号型,常被省略 unsigned :无符号型 long :长型 short :短型 ☆变量的类型: 整型 字符型 浮点型(实型) 空值型 void 布尔型 bool 基本数据类型 数据类型 枚举 数组 结构体 共用体 类 构造数据类型
在程序运行期间,其值可以改变的量称为变量。 35 2.2 基本数据类型和表达式 2.2.3 变量 在程序运行期间,其值可以改变的量称为变量。 ②从变量的作用域角度来分:全局变量和局部变量。 (以后逐步补充) 从变量值存在的时间(即生存期)分:静态存储方式和动态存储方式。 静态存储方式是程序运行期间由系统分配固定的存储空间的方式。 动态存储方式是程序运行期间根据需要动态的分配存储空间的方式。 存储空间可以分为三部分: 程序区 静态存储区:(如:全局变量) 动态存储区: (函数形参、自动变量、函数调用的现场保护和返回地址)
在程序运行期间,其值可以改变的量称为变量。 2.2 基本数据类型和表达式 2.2.3 变量 在程序运行期间,其值可以改变的量称为变量。 ③变量的存储类型(以后逐步补充) auto自动类:采用堆栈方式分配内存空间,属于暂时性存储,其存储空间可以被若干变量多次覆盖使用。 register寄存器类:存放在通用寄存器中。 extern外部类:在所有函数和程序段中都可引用。 static静态类:在内存中是以固定地址存放的,在整个程序运行期间都有效。 //1.cpp #include <iostream.h> int add(int x,int y) //x、y默认为auto { static int sum; return sum=x+y; } extern int b;//全局变量b static int r;//全局变量r int a; void main( ) { int a;//默认为auto cout<< "Enter a b: "; cin>>a>>b; register int c=add(a,b); cout<< "a+b="<<c<<endl; }
2.2.4符号常量 2.2 基本数据类型和表达式 C++程序中,常量通常使用符号常量来表示。可增加程序的可读性,为修改常量值带来方便。 37 2.2 基本数据类型和表达式 2.2.4符号常量 C++程序中,常量通常使用符号常量来表示。可增加程序的可读性,为修改常量值带来方便。 定义常量使用常类型说明符const。格式如下: const <类型说明符> <常量名>=<常量值>; 或者 <类型说明符> const <常量名>=<常量值>; 例如:const double pi=3.1415; double const pi2=3.14159; 定义常量时应做到如下几点: 使用常类型说明符const; 确定常量名,按照标识符命名规则; 指定常量类型; 给出常量值。
38 2.2 基本数据类型和表达式 2.2.4符号常量 符号常量举例: 错误1 const double r=3.2;
起作用的范围 2.2.4符号常量 2.2 基本数据类型和表达式 符号常量举例: 符号常量在声明时一 定要赋初值,而在程 序中间不能改变其值。 39 2.2 基本数据类型和表达式 2.2.4符号常量 符号常量举例: 符号常量在声明时一 定要赋初值,而在程 序中间不能改变其值。 错误1 const double r=3.2; 起作用的范围 错误2 不能修改pi的值
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 运算符的种类和功能 C++的运算符有以下几类: (1)算术运算符 (+ - * / % ++ --) (2)赋值运算符 (=及其扩展赋值运算符) (3)逗号运算符 (,) (4)关系运算符 (> < == >= <= !=) (5)逻辑运算符 (!&& ||) (6)条件运算符 (?:) (7)求字节数运算符(sizeof) *(8)位运算符 (<< >> ~ | ∧ &)
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 运算符的种类和功能(补充) C++的运算符有以下几类: (9)指针运算符 (*和&) (10)强制类型转换运算符( (类型) ) (11)分量运算符(.->) (12)括号运算符(()、[ ])
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (1)算术运算符 及其表达式 (1)基本的算术运算符: +: 加法运算符,或正值运算符。如:3+5、+3 -: 减法运算符, 或负值运算符。如:5-2、-3 *: 乘法运算符, 如:3*5 /: 除法运算符, %: 模运算符 (求余运算符),要求两侧均应为整型数据, 如:7%4的值为3 混合运算时:先按照优先级,如果优先级相同则根据结合性。 基本算术运算的优先级: 单目运算符高于双目运算符。双目运算中,*,/,%高于+,-。
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (1)算术运算符 及其表达式 (2) 自增、自减运算符 作用是使变量的值增1或减1 如: ++i ; i++ ; --i; i--; ++i是先执行i=i+1后,再使用i的值; i++是先使用i的值后,再执行i=i+1。 例如:int 3; //如果i的原值为3 ①j=++i; i的值先变成4, 再赋给j,i,j的值均为4 ②j=i++; 先将 i的值3赋给j,j的值为3,然后i变为4 由算术运算符、操作数和括号构成的表达式称为算术 表达式。
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (1)算术运算符 及其表达式 例:算术运算举例: #include <iostream> using namespace std; void main( ) { int a='a'+3/8*6-12/5; cout<<a<<endl; double d=1.2e2/12+5.2*5-10/4; cout<<d<<endl; int b(5),c(3); a=b+++--c; cout<<a<<','<<b<<','<<c<<endl; } 97 0 2 120/12+26-2=34 b++ + --c 5+2=7
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (2)赋值运算符 及其表达式 =:基本赋值运算符,作用是: 将一个数据赋给一个变量。 例1:int a; a=3; 将一个表达式的值赋给一个变量。 例2:int a=4,b=7,c; c=a+b; 3 a 4 a b 7 11 c
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (2)赋值运算符 及其表达式 复合的赋值运算符 46 2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (2)赋值运算符 及其表达式 复合的赋值运算符 在赋值符“=”之前加上其他运算符,可以构成复合的运算符。 例1:a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8)和x*=(y+8 ) x%=3 等价于 x=x%3 11个双目:=(基本赋值),+=(加赋值), =(减赋值),*=(乘赋值),/=(除赋值),%=(求余赋值),<<=(左移赋值),>>=(右移赋值),&=(按位与赋值),|=(按位或赋值),^=(按位异或赋值)。 说明: ①赋值运算符具有副作用。 例如:j=3;i=(k=j+1)+(j=5); ②赋值运算符的结合性是由右至左的。 46
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (2)赋值运算符 及其表达式 赋值表达式 例2: 变量=表达式 称为赋值表达式。 赋值表达式 例2: 变量=表达式 称为赋值表达式。 a = 5 表达式值为5 a = b = c = 5 表达式值为5,a,b,c均为5 a = 5 + (c = 6) 表达式值为11,a为11,c为6 a = (b = 4) + (c = 6)表达式值为10,a为10,b为4,c为 6 a = (b = 10) / (c = 2)表达式值为5,a为5,b为10,c为 2 a += 3 等价于 a = a + 3 x *= y + 8 等价于 x = x * (y + 8) a += a -= a * a 等价于 a = a + (a = a - ( a * a ))
2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (2)赋值运算符 及其表达式 例:赋值运算符举例:
先讲 再讲 2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (4)关系运算与关系表达式 (5)逻辑运算与逻辑表达式 (3)逗号运算符 及其表达式
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (4)关系运算与关系表达式 关系运算是比较简单的一种逻辑运算 双目运算:>(大于),<(小于),>=(大于等于),<=(小于等于),= =(等于),!=(不等于)。 说明: (1)前四种优先级高于后两种; (2)关系表达式是一种最简单的逻辑表达式,表达式的值是逻辑(bool) 值,其结果类型为 bool,值只能为 true 或 false。 例如:int a=9,b=1,c=10,x=2,y=6; a > b c <= a + b x + y == 3
或者 2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (4)关系运算与关系表达式 例:关系运算举例: 'b'<'e'逻辑值为真 1 ('b'+3)==('e'-1)? 98+3 == 101-1?假 0 假0+真1+('e'+5)!='k' 101+5!=107真1
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (5)逻辑运算与逻辑表达式 逻辑运算符 !(非) &&(与) ||(或) 优先次序: 高 → 低 逻辑表达式 例如:(a > b) && (x > y) 其结果类型为 bool,值只能为 true 或 false
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (5)逻辑运算与逻辑表达式 “&&” 的“短路特性” 表达式1 && 表达式2 先求解表达式1; 若表达式1的值为false,则最终结果为false,不再 求解表达式2; 若表达式1的结果为true,则求解表达式2,以表达式 2的结果作为最终结果; “||”也具有类似的特性
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (5)逻辑运算与逻辑表达式 例:逻辑运算举例: !和++优先级同 右结合 54 2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (5)逻辑运算与逻辑表达式 例:逻辑运算举例: !和++优先级同 右结合 !5值为0 b和c不进行运算 5||--b||c-- ((a-5)&&(--b))||c||++b (0&&(--b))||5||++b a b c的值仍然都为5 --a||(++b&&c)||++b 4||( ++b&&c)||++b a的值变为4 其他的不变
14 40 2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (3)逗号运算符 及其表达式 逗号运算符是双目运算符,优先级最低。 它将两个表达式连接起来,又称为“顺序求值运算符”。 格式: 表达式1,表达式2,……,表达式n 求解过程:先求解表达式1,再求解表达式2,……,最后求解表达式n的值。 整个逗号表达式的值是表达式n的值。 例如: 3+5,6+8 表达式的结果是? a = 2* 5 , a * 4 表达式最终结果为? 14 40
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (6)条件运算符与条件表达式 ?:是C++中唯一的三目运算符 条件表达式一般形式 注意:条件运算符优先级高于赋值 运算符,低于逻辑运算符。 表达式2、3的类型可以不同,条件 表达式的最终类型为 2 和 3 中较 高的类型。 条件表达式一般形式 表达式1?表达式2:表达式3 表达式1 必须是 bool 类型 执行顺序: 先求解表达式1, 若表达式1的值为true,则求解表达式2,表达式2的值为最 终结果。 若表达式1的值为false,则求解表达式3,表达式3的值为最 终结果。 例: x = a > b ? a : b;
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (6)条件运算符与条件表达式 例:逗号和条件运算符举例: 3 4 1 1 a b c c=(a=b=3,a==b,a+b) 由于执行了a=b=3 故最后c=(a+b)=6 3<5?++a:++b ++a的值为逗号表达式的值 即4 a=1 b=3 1&&3||(c=5) 最后一个表达式的值为1
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (7) sizeof 运算符 单目运算,语法形式: sizeof (类型名) 或者 sizeof(表达式) 结果值: “类型名”所指定的类型或“表达式”的结果类型在内存 中存放时所占的字节数。 例:cout<<sizeof(int)<<endl; double x=6.5; cout<< sizeof(x);
或者 2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (7) sizeof 运算符 例:条件运算和sizeof 运算举例: 59 2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (7) sizeof 运算符 例:条件运算和sizeof 运算举例: 或者 三目运算符优先级低于插入符 括号必须加上 三目运算符自右向左,故c=13 条件表达式的类型取决于表达式中冒号前后两个操作数中类型高的类型。double占8个字节。
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (7) sizeof 运算符 sizeof 运算符举例:
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (8) 位运算 (1)逻辑位运算符 : 将各个二进制位由1变0,由0变1。 (1)逻辑位运算符 : ~ (单目,按位取反) & (双目,按位与) ∧ (双目,按位异或) | (双目,按位或) 将各个二进制位由1变0,由0变1。 两个都为1时结果为1 两个不同则结果为1,否则为0 两个其中有一个为1则结果为1 (2)移位运算符 :用来将某个操作数向某个方向(或左,或右)移动所指定的二进制位数 。 >> 右移运算符 ,<< 左移运算符
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (8) 位运算 位运算——取反(~) 将各个二进制位由1变0,由0变1。 62 2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (8) 位运算 位运算——取反(~) 将各个二进制位由1变0,由0变1。 单目运算符,对一个二进制数按位取反。 以16位为例: 025:0000000000010101 ~025:1111111111101010 **********************2011/3/1 62
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 以8位为例: (8) 位运算 位运算——按位与(&) 两个都为1时结果为1 63 2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (8) 位运算 位运算——按位与(&) 两个都为1时结果为1 举例:计算 3 & 5 以8位为例: 3: 0 0 0 0 0 0 1 1 5:(&) 0 0 0 0 0 1 0 1 3 & 5: 0 0 0 0 0 0 0 1 用途: 将某一位置0,其他位不变。
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (8) 位运算 位运算——按位或(|) 两个其中有一个为1则结果为1 64 2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (8) 位运算 位运算——按位或(|) 两个其中有一个为1则结果为1 举例:计算 3 | 5 3: 0 0 0 0 0 0 1 1 5:(|) 0 0 0 0 0 1 0 1 3 | 5: 0 0 0 0 0 1 1 1 用途: 将某些位置1,其他位不变。
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (8) 位运算 位运算——按位异或(^) 两个不同则结果为1,否则为0 65 2.2 基本数据类型和表达式 2.2.5 运算符与表达式 (8) 位运算 位运算——按位异或(^) 两个不同则结果为1,否则为0 举例:计算 071^052 071: 0 0 1 1 1 0 0 1 052: (^) 0 0 1 0 1 0 1 0 071^052 : 0 0 0 1 0 0 1 1 用途: 使特定位翻转(与0异或保持原值,与1异或取反) 例如:要使 01111010 低四位翻转: 0 1 1 1 1 0 1 0 (^) 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (8) 位运算 (2)移位运算符 :用来将某个操作数向某个方向(或左,或右)移动所指定的二进制位数 。 >> : (双目,右移运算符 ,a>>2 ) << : (双目,左移运算符, b<<3) 说明: 两个双目运算符优先级同; 移位规则:将一个操作数化为二进制数,向左移位时,移出位丢弃,右端一律补0;向右移位时,移出位丢弃,左端或者补0,或者补符号位。 移位运算符组成的表达式的值为算术值。
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 (8) 位运算 位操作运算符只能对整型数(包括short、long、signed、unsigned)施加运算,不能对float、double、void、long double型以及更为复杂的类型进行操作。
运 算 符 2.2.5 运算符与表达式 2.2 基本数据类型和表达式 ● 运算符 算术运算符:(+ - * / % ++ --) 算术运算符:(+ - * / % ++ --) 关系运算符:(< <= == > >= !=) 逻辑运算符:((! && ||) 位运算符 :(<< >> ~ | ^ &) 赋值运算符:(= 及其扩展) 条件运算符:(?:) 逗号运算符:(,) 指针运算符:(* &) 求字节数 :(sizeof) 强制类型转换:(类型) 分量运算符:(. ->) 下标运算符:([]) 其它 :(( ) -)
2.2 基本数据类型和表达式 2.2.5 运算符与表达式 运算符优先级及结合性 ● 优先级和结合规则总表
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 例:表达式3+4*(12-6)/(1+2)的计算顺序为: ● 运算符的计算规则 不同级别的运算符按运算符的优先级别确定计算顺序, 优先级别高(即优先级别数小)的运算符先计算: 相同级别的运算符按结合规则确定计算顺序。 例:表达式3+4*(12-6)/(1+2)的计算顺序为: (12-6)=6 (1+2)=3 4*6=24 24/3=8 3+8=11
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 混合运算时数据类型的转换 隐含转换 一些二元运算符(算术运算符、关系运算符、逻辑运算符、 位运算符和赋值运算符)要求两个操作数的类型一致。 在算术运算和关系运算中如果参与运算的操作数类型不一 致,编译系统会自动对数据进行转换(即隐含转换),基 本原则是将低类型数据转换为高类型数据。 char,short,int,unsigned,long,unsigned long,float,double 低 高
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 混合运算时数据类型的转换 隐含转换 当参与运算的操作数必须是bool型时,如果操作数是其 它类型,编译系统会自动将非0数据转换为true,0转换 为false。 位运算的操作数必须是整数,当二元位运算的操作数是 不同类型的整数时,也会自动进行类型转换, 赋值运算要求左值与右值的类型相同,若类型不同,编 译系统会自动将右值转换为左值的类型。 例如:int a=5; double y=4.2; a=y+4; 左值=右值
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 混合运算时数据类型的转换 显式转换————即(10)强制类型转换 语法形式(3种): 类型说明符(表达式) 或 (类型说明符)表达式 类型转换操作符<类型说明符>(表达式) 在新标准中类型转换操作符可以是专用类型转换: const_cast、dynamic_cast、 reinterpret_cast、static_cast 显式类型转换的作用:是将表达式的结果类型转换为类型 说明符所指定的类型。 例:float z=6.5; int(z) 或 (int)z 或 static_cast<int>(z) 三种完全 等价。
2.2.5 运算符与表达式 2.2 基本数据类型和表达式 显式转换————即(10)强制类型转换 在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。 例如:int a=3;float x=3.4,y=4.8; (double)a; 将a转换成double类型 a=(int)(x+y); 将x+y的值转换成整型 x=(float)(5%3); 将5%3的值转换成float型
2.2 基本数据类型和表达式 2.2.5 运算符与表达式 补充 例:强制类型运算符举例: 强制类型转换
语句标号需按照标识符命名规则,数字不可以打头,所以24不可以 2.2 基本数据类型和表达式 2.2.6 语句 C++的语句包括: 空语句 例如:; 声明语句 例如:int a; 表达式语句 例如:2+3; c=4*k; 选择语句 例如:if(a>b)cout<<“a>b”; else cout<<“a<=b”; 循环语句 例如:while(a>1){cout<<“a>1”;a--;} 跳转语句 例如:goto k24; 复合语句:将多个语句用一对大括号包围,便构成一个复 合语句。 例如:{sum=sum+i; i++;} 标号语句 例如:k24:cout<<“end”; 语句标号需按照标识符命名规则,数字不可以打头,所以24不可以
2.3 数据的输入和输出 2.3.1 I/O流 在C++中,将数据从一个对象到另一个对象的流动抽象为 “流”。流在使用前要被建立,使用后要被删除。 从流中获取数据的操作称为提取操作,向流中添加数据的 操作称为插入操作。 数据的输入与输出是通过I/O流来实现的,cin和cout是预 定义的流类对象。 cin用来处理标准输入,即键盘输入。 cout用来处理标准输出,即屏幕输出。
2.3 数据的输入和输出 2.3.2 预定义的插入符和提取符 “<<”是预定义的插入符,作用在流类对象cout上便可实 现屏幕输出。 cout << 表达式 << 表达式... 键盘输入是将提取符作用在流类对象cin上。 cin >> 表达式 >> 表达式... 在输入语句中,提取符可以连续写多个,每个后面跟一个 表达式,该表达式通常是用于存放输入值的变量。 例如: int a, b; cin >> a >> b;
课本编写错误,没有11章 2.3.3 简单的I/O格式控制 2.3 数据的输入和输出 常用的I/O流类库操纵符 操纵符名 含 义 dec 含 义 dec 数值数据采用十进制表示 hex 数值数据采用十六进制表示 oct 数值数据采用八进制表示 ws 提取空白符 endl 插入换行符,并刷新流 ends 插入空字符 setprecision(int) 设置浮点数的小数位数(包括小数点) setw(int) 设置域宽 通常这样用 cin>>ws; 目的就是去除输入中前面的空格 例:cout << setw(5) << setprecision(3) << 3.1415; 课本编写错误,没有11章
2.4 算法的基本控制结构 怎样表示一个算法 可以用不同的方法表示算法,常用的有: 自然语言 传统流程图 结构化流程图 伪代码
2.4 算法的基本控制结构 用流程图表示算法 美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号: 起止框 判断框 处理框 输入/输出框 注释框 流向线 连接点
2.4 算法的基本控制结构 三种基本结构的图示: 顺序结构 选择结构
2.4 算法的基本控制结构 循环结构的图示: 当型(While型)循环结构 直到型(Until型)循环 (经典的直到型)
三种基本结构的共同特点: (1)只有一个入口; (2)只有一个出口; (注意:一个菱形判断框有两个出口,而一个选择结构只有 一个出口。不要将菱形框的出口和选择结构的出口混淆。 ) (3)结构内的每一部分都有机会被执行到; (4)结构内不存在“死循环”(无终止的循环)。
传统流程图 C++中的直到型循环 结构化流程图 三 种 基 本 结 构 : 1. 顺序结构: 2. 选择结构: 3. 循环结构 1. 顺序结构: 2. 选择结构: 3. 循环结构 三 种 基 本 结 构 : C++中的直到型循环 1.顺序结构: 3.循环结构: 2.选择结构: 结构化流程图
2.4.1 用if语句实现选择结构 2.4 算法的基本控制结构 if语句的语法形式 ① if (表达式) 语句 假(0) 真(非0) 真 语句1 语句2 假 ① if (表达式) 语句 例:if (x > y) cout << x; if (表达式) 语句1 else 语句2 else cout << y; if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式3) 语句3 … else 语句 n ② ③
第3种 流程图举例: 2.4.1 用if语句实现选择结构 2.4 算法的基本控制结构 if(表达式1) 语句1 else if (表达式2) 语句2 else if (表达式3) 语句3 else if (表达式4) 语句4 else 语句5 第3种 流程图举例: 表达式1 表达式2 表达式3 表达式4 语句1 语句2 语句3 语句4 语句5 假 真
2.4.1 用if语句实现选择结构 2.4 算法的基本控制结构 例1:输入两个整数,比较两个数的大小。 #include<iostream> using namespace std; int main( ) { int x, y; cout << "Enter x and y:"; cin >> x >> y; if (x > y) cout << "x > y" << endl; if (x < y) cout << "x < y" << endl; if (x == y) cout << "x = y" << endl; return 0; }
2.4.1 用if语句实现选择结构 2.4 算法的基本控制结构 说明: (1)三种形式的if语句在if后都有“表达式”,一般为逻辑表达式或关系表达式,也可为其它类型。 例如:if(b>3) cout<<b; if(‘a’)cout<<a; (2)带else的if语句,在每个else前面有一个分号,整个语句结束处有一个分号。虽然分号是C语句的组成部分,但是if和else同属于一个语句。 (3)在if和else后面也可以用一对花括号“{}” 括起的一个复合语句.
2.4.2 多重选择结构 ——嵌套的if结构 语法形式 注意 2.4 算法的基本控制结构 90 2.4 算法的基本控制结构 2.4.2 多重选择结构 ——嵌套的if结构 语法形式 if( ) if( ) 语句 1 else 语句 2 else if( ) 语句 3 else 语句 4 注意 语句 1、2、3、4 可以是复合语句,每层的 if 与 else 配对,或用 { } 来确定层次关系。
2.4.2 多重选择结构 ——嵌套的if结构 2.4 算法的基本控制结构 例2-3:输入两个整数,比较两个数的大小。 #include<iostream> using namespace std; int main( ) { int x, y; cout << "Enter x and y:"; cin >> x >> y; if (x != y) if (x > y) cout << "x > y" << endl; else cout << "x < y" << endl; cout << "x = y" << endl; return 0; }
2.4.2 多重选择结构 ——嵌套的if结构 2.4 算法的基本控制结构 注意:if与else的配对关系。else总是与它上面的最近的没有配对的if配对。 if( ) if( ) 语句1 else 语句2 else if( ) 语句3 else 语句4 内嵌if if( ) if( ) 语句1 else if( ) 语句2 else 语句3 内嵌if
2.4.2 多重选择结构 ——switch语句 2.4 算法的基本控制结构 一般形式 switch (表达式) 93 2.4 算法的基本控制结构 2.4.2 多重选择结构 ——switch语句 一般形式 switch (表达式) { case 常量表达式 1:语句1 case 常量表达式 2:语句2 ┆ case 常量表达式 n:语句n default : 语句n+1 } 执行顺序 以case中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case分支最后应该加break语句。
2.4.2 多重选择结构 ——switch语句 2.4 算法的基本控制结构 在使用switch语句时应注意以下几点: 94 2.4 算法的基本控制结构 2.4.2 多重选择结构 ——switch语句 在使用switch语句时应注意以下几点: 每个case后的语句执行完成后,建议加break语句;否则程序会顺序执行下面的case,直到switch语句结束或遇到第一个break时跳出。 case后的各常量表达式的值都是int型或char型,值不能相同,否则会出现错误。 在case后,允许有多个语句,可以不用{}括起来。 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。 default子句可以省略不用。
2.4.2 多重选择结构 ——switch语句 2.4 算法的基本控制结构 例2-4: 输入一个0~6的整数,转换成星期输出。 95 95 2.4 算法的基本控制结构 2.4.2 多重选择结构 ——switch语句 例2-4: 输入一个0~6的整数,转换成星期输出。 #include <iostream> using namespace std; int main() { int day; cin >> day; switch (day) { case 0: cout << "Sunday" << endl; break; case 1: cout << "Monday" << endl; break; case 2: cout << "Tuesday" << endl; break; case 3: cout << "Wednesday" << endl; break; case 4: cout << "Thursday" << endl; break; case 5: cout << "Friday" << endl; break; case 6: cout << "Saturday" << endl; break; default: cout<<"Day out of range Sunday .. Saturday" << endl; break; } return 0;
—— while语句 2.4.3 循环结构 2.4 算法的基本控制结构 while语句用来实现“当型”循环结构。 一般形式: 96 2.4 算法的基本控制结构 2.4.3 循环结构 —— while语句 while语句用来实现“当型”循环结构。 一般形式: while (表达式) 语句; 可以是复合语句 执行顺序: 先判断表达式的值,若为 true 时,执行语句。 循环体中应有使循环趋向于结束的语句。否则会 得到死循环。
—— while语句 2.4.3 循环结构 2.4 算法的基本控制结构 例2-5 求自然数1~3之和 例2-5 求自然数1~3之和 分析:本题需要用累加算法,累加过程是一个循环过程, 可以用while语句实现。 #include <iostream> using namespace std; int main() { int i = 1, sum = 0; while (i <= 3) { //课本是求1到10的累加之和 sum += i; //相当于sum = sum + i; i++; //i增1,使得循环趋于结束 } cout << "sum = " << sum << endl; return 0;
C++中do—while语句用来实现非经典的“直到型”循环结构。 2.4 算法的基本控制结构 2.4.3 循环结构 —— do-while语句 C++中do—while语句用来实现非经典的“直到型”循环结构。 一般形式: do 语句 while (表达式); 可以是复合语句。 执行顺序: 先执行循环体语句,后判断条件。 表达式为 true 时,继续执行循环体。 与while语句的比较: 同一个问题可以用do-while,也可用while处理。 do—while的循环体至少执行一次。
例2-7用do-while语句编程,求自然数1~3之和。 2.4 算法的基本控制结构 2.4.3 循环结构 例2-7用do-while语句编程,求自然数1~3之和。 #include <iostream> using namespace std; int main() { int i = 1, sum = 0; do { sum += i; i++; } while (i <= 3); cout << "sum = " << sum << endl; return 0; }
对比下面的程序 2.4.3 循环结构 2.4 算法的基本控制结构 例2-5 : 例2-7: #include <iostream> using namespace std; int main() { int i, sum = 0; cin >> i; while (i <= 3) { sum += i; i++; } cout<< "sum= " << sum << endl; return 0; 例2-7: #include <iostream> using namespace std; int main() { int i, sum = 0; cin >> i; do { sum += i; i++; } while (i <= 3); cout << "sum=" << sum << endl; return 0; } ******************2011/09/28 注意:如果while后面的表达式一开始就为假时,两种循环的 结果是不同的。
对比下面的程序 注意区别 2.4.3 循环结构 2.4 算法的基本控制结构 例2-5 : 例2-7: 101 2.4 算法的基本控制结构 2.4.3 循环结构 注意区别 对比下面的程序 例2-5 : #include <iostream> using namespace std; int main() { int i, sum = 0; cin >> i; while (i <= 3) { sum += i; i++; } cout<< "sum= " << sum << endl; return 0; 例2-7: #include <iostream> using namespace std; int main() { int i, sum = 0; cin >> i; do { sum += i; i++; } while (i <= 3); cout << "sum=" << sum << endl; return 0; } ******************2011/09/28 注意:如果while后面的表达式一开始就为假时,两种循环的 结果是不同的。 101
—— for语句 2.4.3 循环结构 2.4 算法的基本控制结构 102 2.4 算法的基本控制结构 2.4.3 循环结构 —— for语句 C++中的for语句使用灵活,不仅可用于循环次数已经确定的 情况,而且可用于循环次数不确定而只给出循环结束条件的情 况,它完全可以代替while和do—while语句。 for (表达式1 ;表达式2;表达式3) 语句 循环前先求解 为true时执行循环体 每次执行完循环体后求解 for语句一般形式:
—— for语句 2.4.3 循环结构 2.4 算法的基本控制结构 例如 用for循环求 #include <iostream> using namespace std; void main( ) { int i,sum=0; for(i=1;i<=100;i++) sum=sum+i; cout<<sum<<endl; } #include <iostream> using namespace std; void main( ) { int i,sum=0; i=1; while(i<=100) { sum=sum+i; i++; } cout<<sum<<endl; } for循环最容易理解的形式: for(循环变量赋初值;循环条件;循环变量增值)语句
—— for语句 2.4.3 循环结构 2.4 算法的基本控制结构 说明: for(表达式1;表达式2;表达式3) 语句 “表达式1”、“表达式2”和“表达式3”都可以缺省,但“;”不能缺省。 1)省略“表达式1(循环变量赋初值)”, 则应在for语句前对循环变量赋初值。例如:i=1; for( ;i<=10;i++) sum=sum+1; 2)省略“表达式2(循环条件)”, 则认为表达式2始终为真,为死循环。 例如:for(i=1; ;i++)sum=sum+i; 相当于: i=1; while(1){sum=sum+i; i++;} int i,a;for(i=1; ;i++){sum=sum+i; cin>>a;if(a==5)break;} 3)省略“表达式3(循环变量增量)”, 这时可在循环体中加入修改循环变量的语句。 例如:for(i=1;i<=10; ) {sum=sum+i;i++;}
—— for语句 2.4.3 循环结构 2.4 算法的基本控制结构 说明: for(表达式1;表达式2;表达式3) 语句 4)省略“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。 例如:for( ;i<=10; ) 相当于:while(i<=10) {sum=sum+i;i++;} {sum=sum+i;i++;} 5)三个表达式都可以省略,为死循环。 例如: for( ;;)语句 相当于: while(1)语句 for( ;;){cin>>a;if(a==5)break;}// 不是死循环 6)表达式1可以是设置循环变量的初值的赋值表达式,也可以是与循环变量无关的其它表达式。 例如: i=0; for(sum=0;i<=100;i++)sum=sum+i;
—— for语句 2.4.3 循环结构 2.4 算法的基本控制结构 说明: for(表达式1;表达式2;表达式3) 语句 7) 表达式1和表达式3可以是简单表达式也可以是逗号表达式。 例如: for(sum=0,i=1;i<=100;i++)sum=sum+i; 或: for(i=0,j=100;i<=100;i++,j--)k=i+j; 8)表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。 例如: for(i=0;c=‘a’;i+=c); 又如: for( ;c =‘a’; ; ) cout<<c; 注意:从键盘向计算机输入时,按回车以后才将一批数据一起送到内存缓冲区中。 int a,b;cin<a<b;
2.4 算法的基本控制结构 2.4.3 循环结构 —— for语句 例2-8:输入一个整数,求出它的所有因子。 //正整数
2.4.4 循环结构与选择结构的嵌套 2.4 算法的基本控制结构 1、选择嵌套(已讲) 2、循环嵌套 108 2.4 算法的基本控制结构 2.4.4 循环结构与选择结构的嵌套 1、选择嵌套(已讲) 2、循环嵌套 一个循环体内又包含另一个完整的循环结构称为循环的嵌套。 内嵌的循环中还可以嵌套循环,这就是多层循环。 三种循环(while、do-while和for循环)可以互相嵌套。 下面几种都是合法的形式: (1) while( ) (2) do (3) for( ; ; ) {… {… { while( ) do for( ; ; ) {…} {… } {… } } while( ); } } while( ); (4) while( ) (5) for( ; ; ) (6) do { … { … { … do{…} while( ) for( ; ; ){ } while( ); {…} … … … } } } while( ) ; 1)三种循环可互相嵌套,层数不限; 2)外层循环可包含两个以上内循环,但不能相互交叉; 3)嵌套循环的执行流程(外循环执行一次,内循环执行一遍)。
2.4.4 循环结构与选择结构的嵌套 2.4 算法的基本控制结构 2、循环嵌套 【补充例】循环嵌套的例子 外循环执行一次,内循环执行一遍 109 2.4 算法的基本控制结构 2.4.4 循环结构与选择结构的嵌套 2、循环嵌套 循环变量的变化: 1 k j i 【补充例】循环嵌套的例子 外循环执行一次,内循环执行一遍
2.4.4 循环结构与选择结构的嵌套 * *** ***** ******* 2.4 算法的基本控制结构 2、循环嵌套 实验:例2-9 编写程序输出以下图案 * *** ***** ******* (redefinition)定义重复的意思 一般在同一段代码中不要出现变量重复定义,否则就会报出错;
2.4 算法的基本控制结构 2.4.4 循环结构与选择结构的嵌套 例2-9 编写程序输出以下图案 * *** ***** *******
2.4 算法的基本控制结构 2.4.4 循环结构与选择结构的嵌套 3、选择、循环嵌套 举例:求100—120之间不能被3整除的数。 #include <iostream> using namespace std; int main() { for (int n = 100; n <= 120; n++) { if (n % 3 != 0) cout << n<<endl; } return 0;
2.4.4 循环结构与选择结构的嵌套 2.4 算法的基本控制结构 3、选择、循环嵌套 例2-10 读入一系列整数,统计出正整数个数i和负整数个数j,读 入0则结束。 分析: 需要读入一系列整数,但是整数个数不定,要在每次读 入之后进行判断,因此使用while循环比较合适。循环 控制条件应该是整数n!=0。由于要判断数的正负并分别 进行统计,所以需要在循环内部嵌入选择结构。
2.4.4 循环结构与选择结构的嵌套 2.4 算法的基本控制结构 #include <iostream> using namespace std; int main() { int i = 0, j = 0, n;//正整数个数i和负整数个数j cout << "Enter some integers please (enter 0 to quit): “<< endl; cin >> n; while (n != 0) { if (n > 0) i += 1; if (n < 0) j += 1; cin >> n; } cout << "Count of positive integers: " << i << endl; cout << "Count of negative integers: " << j << endl; return 0; }
2.4.5 其他控制语句 2.4 算法的基本控制结构 1、break语句 使程序从循环体或switch语句内跳出,继续执行逻辑上的下 一条语句。不宜用在别处。 一般形式: break; 注意:在多层循环中, 一个break语句只向外跳一层。 例:计算r=1到r=10时的圆面积,直到面积area大于100为止。 float pi=3.14159; for(r=1;r<=10;r++) { area=pi*r*r; if(area>100) break; cout<<r<<“,”<<area; }
2.4.5 其他控制语句 2.4 算法的基本控制结构 2、 continue语句 结束本次循环,即跳过循环体中下面尚未执行的语句,接着 进行下一次是否执行循环的判定。 一般形式:continue; continue语句和break语句的区别 continue语句只结束本次循环,而不是终止整个循环的执 行。 break语句则是结束整个循环过程,不再判断执行循环的 条件是否成立。
2.4.5 其他控制语句 2.4 算法的基本控制结构 【补充例】continue语句的使用 #include <iostream> using namespace std; void main() { int i=10; while(i>6) {i--; if(i==9)continue; cout<<i<<endl; } }
2.4.5 其他控制语句 2.4 算法的基本控制结构 3、goto语句 #include <iostream> using namespace std; void main() { int i=10; while(i>6) {i--; if(i==9)goto th; cout<<i<<endl; } th:cout<<"结束"<<endl; goto语句一般形式: goto 语句标号; 语句标号用标识符表示。 例如:
2.4.5 其他控制语句 2.4 算法的基本控制结构 3、goto语句 结构化程序设计方法主张限制使用goto语句,因为滥用 一般来说,可以有两种用途: (1) 与if语句一起构成循环结构; (2) 从循环体中跳转到循环体外。 但是这种用法不符合结构化原则,一般不宜采用,只有 在不得已时才使用。 (例如能大大提高效率)
2.4.5 其他控制语句 2.4 算法的基本控制结构 例:用if 语句和goto语句构成循环,求 #include <iostream> using namespace std; void main( ) { int i,sum=0; i=1; loop: if(i<=100) { sum+=i; i++; goto loop; } cout << sum<< endl; sum=0+1 sum=1+2=3 sum=3+3=6 sum=6+4 …… sum=4950+100=5050 注意:语句标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。
2.5.1 typedef声明 2.5 自定义数据类型 为一个已有的数据类型另外命名 语法形式: typedef 已有类型名 新类型名表; 例如 typedef double A, V; typedef int N; N i1, i2; A a; V v;
2.5.2 枚举类型——enum 2.5 自定义数据类型 只要将需要的变量值一一列举出来,便构成了一个枚举类 型。 枚举类型的声明形式如下: 例如: enum Weekday{SUN, MON, TUE, WED, THU, FRI, SAT}; 枚举变量定义形式: [enum] 枚举类型名 枚举变量;
2.5.2 枚举类型——enum 2.5 自定义数据类型 枚举类型应用说明: 对枚举元素按常量处理,不能对它们赋值。例如,不能 写:SUN = 0; 枚举元素具有默认值,它们依次为: 0,1,2,......。 也可以在声明时另行指定枚举元素的值,如:enum Weekday{SUN=7,MON=1,TUE,WED,THU,FRI,SAT}; 枚举值可以进行关系运算。 整数值不能直接赋给枚举变量,如需要将整数赋值给枚 举变量,应进行强制类型转换。
2.5 自定义数据类型 2.5.2 枚举类型——enum 例2-11 设某次体育比赛的结果有四种可能:胜(WIN)、负 (LOSE)、平局(TIE)、比赛取消(CANCEL),编写程 序顺序输出这四种情况。 分析:由于比赛结果只有四种可能,所以可以声明一个 枚举类型,声明一个枚举类型的变量来存放比赛结果。
2.5.2 枚举类型——enum 2.5 自定义数据类型 例2-11 0, 1, 2, 3 #include <iostream> using namespace std; enum GameResult {WIN, LOSE, TIE, CANCEL}; int main() { GameResult result; //可以不写enum,也可以写 enum GameResult omit = CANCEL; for (int count = WIN; count <= CANCEL; count++) { result = GameResult(count); if (result == omit) cout << "The game was cancelled" << endl; else { cout << "The game was played "; if (result == WIN) cout << "and we won!"; if (result == LOSE) cout << "and we lost."; cout << endl; } } return 0; } 0, 1, 2, 3
2.6 小结 主要内容 C++语言概述、基本数据类型和表达式、数据的输入与 输出、算法的基本控制结构、自定义数据类型。 达到的目标
本章结束 作业见1-2章练习题电子稿