C++基础知识 基本控制结构程序设计 c++完全讲义ppt__unit01_第1页
C++基础知识 基本控制结构程序设计 c++完全讲义ppt__unit01_第2页
C++基础知识 基本控制结构程序设计 c++完全讲义ppt__unit01_第3页
C++基础知识 基本控制结构程序设计 c++完全讲义ppt__unit01_第4页
C++基础知识 基本控制结构程序设计 c++完全讲义ppt__unit01_第5页
已阅读5页,还剩194页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,C+ 程序设计,C+程序设计(第二版). 高等教育出版社,2,本章将简要介绍C+中的数据类型及相关运算,以及常量、变量、表达式、语句等,最后介绍简单的输入输出方法。,第一章 C+基础知识,3,第一章 C+基础知识,1.3 C+的词法单位,1.6 运算符和表达式,1.8 简单的输入输出,1.7 数组与字符数组,1.5 常量和变量,1.4 C+ 中的数据类型,ok,1.1 C+语言概述,1.2 一个C+程序实例,4,1.1 C语言概述,历史: C+是由C语言为基础发展起来的。 C语言是作为UNIX操作系统的开发语言为人们所认识。七十年代末,C语言开始移植到非UNIX环境中,并逐步脱离UNIX系统成为一种独立的程序设计语言。 1988年美国国家标准协会ANSI对C语言进行了标准化,产生了ANSI C。,5,1.1 C 语言概述,(1)C语言既具备高级语言的结构和编程环境,又提供类似于汇编语言那样的系统资源操纵能力及程序执行效率。适合解决有实时要求的问题。,C语言的主要特点:,(2)有丰富的运算符和数据类型,表达式类型多样化,可以方便地实现在其他语言中较难实现的运算,对各种不同类型的程序设计都有良好的适应性。,(3)以函数为基础实现程序的结构化设计,支持大型程序的多文件构成及单个文件独立编译,适合大型复杂程序的设计。,(4)语言简洁、紧凑,使用方便、灵活。,(5)可移植性好。,6,1.1 C 语言概述,C+是由C发展成为的以面向对象为主要特征的语言。作为C语言的超集,C+继承了C的所有优点,又对数据类型做了扩充,使得编译系统可以检查出更多类型错误。,C+支持面向对象程序设计,通过类和对象的概念把数据和对数据的操作封装在一起,通过派生、继承、重载和多态性等特征实现了软件重用和程序自动生成,使得大型复杂软件的构造和维护变得更加有效和容易。,C+语言的主要特点:,7,1.1 C 语言概述,C+与C完全兼容,很多用C编写的库函数和应用程序都可以为C+所用。,但正是由于与C兼容,使得C+不是纯正的面向对象的语言,它既支持面向对象程序设计,也支持面向过程设计。但我们应当注意用面向对象的思想进行设计,以发挥出C+的优势。,C+语言的兼容性:,8,1.2 一个C+程序实例,# include int max(int i, int j) /A if (i=j) return i; else return j; int main(void) /B coutij; /从键盘上输入变量值 coutmax number is:max(i, j) n ; /输出提示和结果 return 0; ,【例1.1】 一个简单的C+程序。,程序组成:,注释,编译预处理指令,程序体,由若干函数组成,其中有且仅有一个主函数main(),这是程序的执行入口。在Windows编程中定义为winmain()。,下面进入VC+ 运行,9,1.3 C+的词法单位,1.3.1 C+的字符集,1.3.2 关键字,1.3.3 标识符(ID,identifier),1.3.4 标点符号,ok,10,1.3.1 C+的字符集,ASCII码字符集是计算机中的常用字符集。它包括英文字母及阿拉伯数字等128个字符,存储一个ASCII码占用一个字节单元。,汉字国标码用于汉字处理。国标码的存储占用两个字节单元。,Unicode字符集对各类字符进行统一的双字节编码。它包括了世界上多种语言的基本字符,最多可容纳65536个字符。 ASCII码字符集,国标码字符集都是它的子集。,ok,常用字符集:,11,C+的字符集,C+语言基本字符:,12,1.3.2 关 键 字,关键字(keyword): 又称保留字。是由系统定义的具有特定含义的英文单词。关键字不能另作它用。,C+区分大小写,关键字全部由小写字母组成。标准C+(ISO14882)定义了74个关键字,具体的C+编译器会做一些增删。常用关键字及分类见表2.1。,ok,13,关 键 字,表2-1 C+常用关键字及分类,ok,14,关 键 字,15,1.3.3 标识符,标识符(Identifier,ID ): 是程序员定义的“单词”,用来给变量、常量、数据类型、函数等命名。,合法标识符由字母或下划线开始,由字母、数字、下划线组成,其有效长度为131个字符,长度超过31个字符者只识别前31个字符,VC+标识符长度为1247个字符。,建议使用有一定含义的英文单词或拼音序列作标识符,以提高可读性;另外尽量不用下划线或双下划线打头,以免与系统定义的关键字冲突。,ok,16,标识符,例: 判断下面哪些是合法的标识符:,MyFile,Salary 94,amount,void,94Salary,Salary94,$amount,f3.5,Num_of_Student,17,1.3.4 标点符号,标点符号: #、( )、 ,、 :、 ;、 “、 等。,标点符号的作用:,有一定的语法意义。如字符和字符串常量分别用 和 “ ”引起来。,对语法符号起分隔作用。如 ;等,18,1.4 C+中的数据类型,ok,19,C+基本数据类型称为内置数据类型,内置数据类型不仅定义了数据类型,还定义了常用操作。本节仅介绍各种基本数据类型的定义,常用操作将在后面介绍。,C+为强类型语言,所有数据的使用严格遵从“先说明后使用”的原则,以便编译器进行编译。,整型:用来存放整数,整数(有符号的整数)在内存中存放的是它的补码,无符号数没有符号位,存放的就是原码。整数占用的字节数与机型有关,32位机上占用4个字节。,内置数据类型:,20,字符型:用来保存字符,存储的是该字符的ASCII码,占用一个字节。如大写字母A的ASCII码为65,在对应的一个字节中存放的就是65。字符型数据从本质上说也是整数,可以是任何一个8位二进制整数。C+同时也支持宽字符类型(wchar_t),或称双字节字符型。,实型:单精度和双精度型都用来存放实数,两者表示的实数精度不同。实数在内存中以规范化的浮点数存放,包括尾数、数符和阶码。数的精度取决于尾数的位数,32位机上实型为23位(因规范化数的数码最高位恒为1,不必存储,实际精度为24位),双精度为52位。,21,逻辑型:也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+6.0中为1个字节。布尔型在运算中可以和整型相互转化,false对应为0,true对应为1或非0,无值型:主要用来说明函数的返回值类型,将在函数一章中具体介绍。,基本数据类型还可以加上一些修饰词,包括:signed(有符号)、unsigned(无符号)、long(长)、short(短)。参见下表:,22,VC+中所有基本数据类型,23,1.5 常量和变量,1.5.1 变 量,1.5.2 文字常量,1.5.3 常变量,在程序中,常量和变量是用来表示数据的; 常量又分为字面常量、常变量;,ok,24,1.5.1 变 量,1 变量说明,2 变量初始化值,变量,在程序中是指可以改变值的量; 变量必须用标识符进行标识,称为变量名; 变量有类型之分,如整形变量、字符变量等; 任何变量都必须先说明后使用;一是便于编译程序为变量分配空间,二是便于编译时进行语法检查; 变量使用的第一步,是给变量赋初始值;,ok,25,变量说明,在C+中,变量说明的一般格式为: 存储类型数据类型 变量名1,变量名2, ,变量名n;,例: int i, j, k; /说明三个整型变量i, j, k float x, y, z; /说明三个单精度实型变量x, y, z char c1, c2; /说明两个字符型变量c1, c2 double dx; /说明一个双精度型变量dx,26,变量初始化,赋初值: 定义变量时即给变量一个值称为变量初始化或给变量赋初值 例如: int a=3, b=4, c=5; float x=3.0; 变量初始化可以避免引用到随机变量。,27,1.5.2 文字常量,1. 整型常量,4. 字符串常量,3. 字符型常量,2. 实型常量,文字常量:指程序中直接给出的量; 常量的值在程序执行过程中保持不变;并且存储在程序区,而非数据区; 根据取值和表示方法的不同,可分为以下几种:,ok,28,整型常量,十进制表示法,八进制表示法,十六进制表示法,其他表示法,整型常量表示方法:,ok,29,整数的十进制表示方法,十进制表示与我们熟悉的书写方式相同。 例: 15 -24,ok,30,整数的八进制表示,八进制表示以0开始,由数字07组成,用来表示一个八进制数。 例: 012 /八进制数12,即十进制数10 -0655 /八进制数-655,即十进制数-429,ok,31,整数的十六进制表示,十六进制以0X(大小写均可)开始,由数字09和字母AF(大小写均可)组成,用来表示一个十六进制数。 例: 0x32A /十六进制数32A,即十进制数810 -0x2fe0 /十六进制数-2fe0, /即十进制数-12256,ok,32,整数的其他表示方法,长整型常量和无符号整型常量: 长整型常数以 L 或 l 结尾,无符号常整数以 U 或 u 结尾,以 U L 或 L U(大小写均可)结尾则可表示无符号长整型常数。 例如: -84L /十进制长整数-84 026U /八进制表示的无符号整数26 0X32LU /十六进制表示的无符号长整型数32。,33,实型常量,(1)一般形式与平时书写形式相同,由数字 0 9和小数点组成。例如: 0.23 -125.76 0.0 .46 -35.,(2) 指数形式(也称为科学表示法)表示为尾数乘以10的次方形式,由尾数、E或e和阶数组成。指数形式要求在E或e前面的尾数部分必须有数字,后面的指数部分必须为整数。,例 : 判断下列表示是否合法,123E12,-.34e-2,E4,1.43E3.5,包含小数点和10的幂的数为实型常量 表示方法:,34,字符型常量,字符常量: 用单引号引起来的单个字符。在内存中保存的是字符的ASCII码值。在所有字符中,可显示字符通常就用单引号引起来表示: a /字符a /字符 4 /字符4 /空格字符 特殊情况字符,如不可显示的字符等,c+使用转义序列表示方法(详见表2-3,此处略): n /换行 /字符,35,4. 字符串常量,字符串常量与字符型常量的区别:,字符串常量a 占两个字节,存放a和 0,值为0x6100,字符型常量a 占一个字节,存放a,值为0x61,字符串常量: 用双引号引起来的若干个字符。 例如: I am a Chinese.,123, a , ,36,1.5.3 常变量,标识符常量: 用常量说明符const给文字常量起的名字(标识符),因为其说明和引用形式很像变量,所以也称常变量; 例如: const float PI=3.14159; const int Number_of_Student=100; 常变量必须也只能在说明时进行初始化; 常变量初始化之后,不允许再被赋值; 常变量必须先说明后使用; 常变量存储在数据区,并且可以按地址访问,编译时系统对常变量进行类型检查。 C+建议使用常变量,而不要使用文字常量。,37,1.6 运算符和表达式,1.6.1 运算符、优先级和结合性,1.6.2 基本运算符及其表达式,1.6.4 算术类型转换和赋值类型转换 (选读),1.6.5 求值次序与副作用,1.6.3 语句,本节的重点: 介绍与基本数据类型封装在一起的运算(操作)。,ok,38,1.6.1 运算符、优先级和结合性,ok,在C+中对常量或变量进行运算或处理的符号称为运算符,参与运算的对象称为操作数。,运算符按操作数的数量分类: 单目运算符只对一个操作数运算,如负号运算符“”等; 双目运算符要求有两个操作数,如乘号运算符“*”等; 三目运算符要求有三个操作数,三元运算符只有一个“?:”。,39,1.6.1 运算符、优先级和结合性,ok,优先级和结合性决定了运算中的优先关系。,优先级:指不同运算符在运算中的优先关系,可以用序号表示,序号越小,优先级越高。 例如: 加号()和减号()的优先级是6;乘号( * )和除号( / )的优先级是5;* 和 / 的优先级高于和。,40,1.6.1 运算符、优先级和结合性,结合性: 决定优先级相等的运算符组合在一起时的运算次序,同一优先级的运算符有相同的结合性。 如+、-的结合性是从左到右(左结合),则a+b+c-d的运算次序为: (a+b)+c)-d /先算a+b,再加c,最后减d 又如前+和单目负-的结合性是从右到左(右结合),则-+a的运算次序为: -(+a) /先做+a,再取相反数(加负号) 这对算法描述是必须的,每一步做什么必须确定。,41,1.6.1 运算符、优先级和结合性,例: (1) a*b+c; /先做乘法运算,再做加法 (2) a+b-c ; /根据左结合性,先取a、b相加; /再取c,最后相减 演示如下:设a=10,b=20,c=15;,10,20,15,15,42,1 算术运算符及其表达式,4 逻辑运算、逻辑表达式及其求值优化,5 位运算(选读),2 赋值运算符赋值表达式,3 自增、自减运算,6 逗号运算符与逗号表达式,1.6.2 基本运算符及其表达式,7 sizeof( )运算符,表达式:由运算符、操作数及标点符号组成的,能取得一个值的式子。,43,1.算术运算符及其表达式,ok,44,整数的算术运算: 当两个操作数均为整数时,*和/重载为整乘和整除,结果为整数,除法运算后舍去小数取整。如: 5/4 /结果为1,整数,当两个操作数均为整数,%定义为求余运算,也称求模运算,结果为两个整数相除后的余数。如果两个整数中有负数,则先用两数绝对值求余,最后结果的符号与被除数相同。例如 6%3 /结果为0 6%7 /结果为6 7%6 /结果为1 -7%6 /结果为-1 7%-6 /结果为1 -7%-6 /结果为-1,45,实数的算术运算: 只要有一个操作数是实数,两个操作数均转换为double型,*和/重载为普通的乘和除,结果是实数: 5/4.0 /结果为1.25,实数,运算符的重载: 运算符总是与操作数封装在一起。相同的运算符对不同类型的操作数执行的运算是有差异的。,46,算术表达式:,使用时注意: 1、表达式中每个变量都有确定的值时才能进行表达式求值; 2、C+中算术运算应注意数据溢出问题,即运算结果超出对应数据类型的表示范围。编译程序只会对除法运算时除数为0这种情况提示出错,因此,程序设计者必须在程序中解决检查并处理整数溢出问题。,ok,由算术运算符连接的表达式,如:a+b*3 ;,47,2.赋值运算符与赋值表达式,ok,赋值与引用: 将数据存放到相应存储单元中称为赋值,如果该单元中已有值,赋值操作以新值取代旧值;从某个存储单元中取出数据使用,称为引用,引用不影响单元中的值,即一个量可以多次引用。常量只能引用,不能赋值。,赋值通过赋值运算符“=”来完成,其意义是将赋值号右边的值送到左边变量所对应的单元中。赋值号不是等号,它具有方向性。,48,左值与右值: C+将变量名代表的单元称为 “左值”,而将变量的值称为“右值”。 左值必须是内存中一个可以访问且可以合法修改的对象,因此只能是变量名,而不能是常量或表达式。,2.赋值运算符与赋值表达式,例如下面的赋值运算是错误的: 3.1415926=pi; /左值不能是常数 x+y=z; /左值不能是表达式 const int N=30; N=40; /左值不能是常变量,49,2.赋值运算符与赋值表达式,赋值表达式: 由赋值运算符连接的表达式。格式为: 变量 = 表达式 例如:x=5+6;a=b=c=d+1; 复合运赋值算符:由双目算术运算符和位运算符与赋值运算符组合成的单一运算符,共10个: + = = * = / = % = = &= | = = 格式为: 变量 复合赋值运算符 表达式 它等同于 变量 = 变量 运算符 表达式 例如:x+=5 等同于:x=x+5,ok,50,3.自增自减运算,前置和后置运算: 前置是先增减后引用,即先对变量自加或自减,用新的值参与其他运算;后置则是先引用后增减,即用变量原来的值参与其他运算,然后再对变量进行自加或自减,例如: int i=5, j=5, m, n; m=i+; /后置;相当于m=i; i=i+1; /结果:i的值为6,m的值为5; n=+j; /前置;相当于j=j+1;n=j; /结果:j的值为6,n的值为6;,自增自减运算符: 意义:使变量当前值加1或减1,再赋给该变量。 要求:操作数只能是变量,不能是常量或表达式;,ok,51,4.逻辑运算、逻辑表达式及其求值优化,ok,逻辑运算: 用于判断分析,运算符包括关系和逻辑运算符。 关系运算符: 包括:(大于)、(大于等于)、(小于)、(小于等于)、= =(等于)和!=(不等于)。关系运算符完成两个操作数大小的比较,结果为逻辑值true(真)或false(假)。每种可比较大小的数据类型,都重载了关系运算符。不同类型,自动转换为同一类型后进行比较。,在C+中这两个逻辑值与整数之间有一个对应关系,真对应1,假对应0;反过来,0对应假,非0整数对应真。所以逻辑运算结果可以作为整数参与算术运算、关系运算、逻辑运算及其他运算。,52,关系表达式:,例如: a+bc+d /*等同于(a+b)(c+d), 结果为0或1*/ y=ab /*计算ab的值0或1 赋给y,y的值为0或1*/ abc /*等同于(ab)c,先求ab 的值, 再将结果0或1与c比较大小*/,由关系运算符连接的表达式。值为true或false。,ok,53,4.逻辑运算、逻辑表达式及其求值优化,设有定义 float a=3.2;int b=5;则: 3ab /结果是?,根据右结合 原则其运算 过程如下:,a,5,b,3.2,3,F, 即0,F即0,54,逻辑运算符:,包括:!、&和|,其优先级和语义见下表。,55,由逻辑运算符连接的表达式。 其操作数和运算结果均为逻辑量。运算结果同样可以作为一个整数参与其他运算。,由于逻辑值和整数之间的对应关系,也允许整型和字符型操作数进行逻辑运算: 21&0 /逻辑与,21与0,结果为假:0 21|0 /逻辑或,21或0,结果为真:1 !21 /逻辑非,21的非,结果为假:0,逻辑表达式:,逻辑表达式计算时,逻辑非优先级最高,关系运算其次,逻辑与和逻辑或最低。,56,ok,已知: int a=10, b=20, c=30;float x=1.8, y=2.4;,ay|ay)|(a(b-(!c),t1=1,t2=0,t4=0,-,&,t3=0,t5=b,t6=1,|,得整个表达式的值为:,1,57,逻辑表达式求值的优化:,在求逻辑表达式值的过程中,一旦表达式的值能够确定,就不再逐步进行下面的运算。称为“求值优化”。,已知: int a=10, b=20, c=30; 求: ab | c+ /结果以及a,b,c的值,t1=1,整个表达式的值为 1,可见: 表达式 c+ 已不需要计算所以: c不变仍为 30,编程人员在使用逻辑运算时应当加以小心,优化计算固然提高了运算效率,但可能产生副作用。所谓副作用,就是出乎设计人员的意料,得到预想不到的结果。,58,5. 位运算(选读),(1)按位取反运算符“” (2)左移运算符“” (4)按位与运算符“&” (5)按位或运算符“|” (6)按位异或运算符“”,ok,c+语言提供字位运算,它对操作数的各个位进行操作。,59,(1)按位取反运算符“” 将操作数的每个二进制位取反,即1变为0,0变为1。例如,整数a的值为10011011,则a的值为01100100。,(2)左移运算符“” 运算一般格式为:an 其中a为整数,n为一个正整数常数。语义为将a的二进制数依次向左移动n个二进制位,并在低位补0。左移n位相当于乘以2的n次方,但移位运算的速度比乘法快。,(3)右移运算符“” 与左移运算符类同,将左操作数向右移动右操作数指定的二进制位数,忽略移位后的小数部分,并在高位补0。一个整数右移n位相当于除以2的n次方,但比除法快。 在VC+6.0中有符号数右移时高位补符号位,严格对应除法。,以上三种单目运算不影响数据本身的值,而是只产生一个中间量,这个中间量被引用后即不再存在。,60,(4)按位与运算符“&” 将两个操作数的对应位逐一进行按位逻辑与运算。运算规则为:对应位均为1时,该位运算结果为1;否则为0。例如: a 01001101 b 00001111 a & b 00001101 该运算可用来将整数的某些位置0,而保留所需要的位,上例保留了低四位。,(5)按位或运算符“|” 将两个操作数的对应位逐一进行按位逻辑或运算。运算规则为:只要有一个数对应位为1,该位运算结果即为1;两个数对应位均为0,该位结果为0。例如: a 01001101 b 00001111 a | b 01001111 该运算符可用来将整数的某些位置1。上例高四位不变,低四位全1。,61,(6)按位异或运算符“” 将两个操作数的对应位逐一进行按位异或运算。运算规则为:当对应位的值不同时,该位运算结果为1,否则为0。例如: a 01001101 b 00001111 a b 01000010 该运算符可用来将一个整数的某些位取反,或将整型变量的值置0(将整型变量与自身按位异或)。上例低四位取反,高四位不变。,62,6.逗号运算符与逗号表达式,用逗号连接起来的表达式称为逗号表达式, (C+中,逗号既是分隔符,又是运算符。) 格式为: 表达式1,表达式2,表达式n 逗号表达式中的每一个表达式都会被运算,整个逗号表达式的值为最后一个表达式的值。 例如:a=(x=3,x+=6,5+6);/a=11 x=9,63,7. sizeof( ) 运算符,用于计算一个操作数类型或一个变量的字节数。一般格式为: sizeof (数据类型) 或 sizeof(变量名) 例如:sizeof(int) 值为4 sizeof( float) 值为4 double x; sizeof( x) 值为8,64,1.6.3 语句,1 表达式语句:表达式; 2 空语句: ; 3 复合语句: /若干语句 流程控制语句:流程控制语句用来控制或 改变程序的执行方向 ;,1.6.3结束,65,1.6.4 算术类型转换和赋值类型转换(选读),1 混合运算的类型转换规则,2 赋 值 类 型 转 换,ok,运算过程中,当某个二元运算符两边的操作数类型不同但属于类型相容时,系统先将精度低的操作数变换到与另一操作数精度相同,而后再进行运算。,类型相容: 类型不同但系统可以自动进行转换。,当赋值号的左值和右值类型不一致但属于类型相容时,由系统自动进行类型转换。,3 强 制 类 型 转 换,66,1. 混合运算的类型转换规则,数据类型转换方向,ok,67,具体规则: (1)字符可以作为整数参与数值运算,整数值为其ASCII码。 (2)操作数为字符或短整型时,系统自动变换成整型。 (3)操作数为实型时,系统自动变换成双精度型。 (4)其余情况,当两操作数类型不同时,将精度低(或表示范围小)的操作数的数据类型变换到与另一操作数类型相同再进行运算,例: char c1, c2; int i1, i2; float x1, x2; 则表达式 x2=c1*i1+c1*x1+c1*c2 的求值过程为:将c1转换成整型,完成c1*i1,结果表示为t1;将c1和x1均转换成双精度型,完成c1*x1,结果表示为t2;将c1和c2均转换成整型,完成c1*c2,结果表示为t3;然后t1转换成双精度型,完成t1+t2,结果表示为t4;将t3转换成双精度型,完成t4+t3,最后结果转为单精度型赋给x2。,68,2.赋值类型转换,2.5.3结束,系统自动进行类型转换规则: 1、实型数赋给整型变量:取整;注意溢出; 2、整型数赋给实型变量:先转换为实型数; 3、字符型数赋给整型变量:ASCII码为依据;分为两种情况:符号位是0或1时不同; 若符号位为1,则低位字节不变,高位字节全部置1再赋值。 4、绝对值较大的数赋给表达范围较小的数据类型时,注意溢出;,69,赋值运算中,当左值与右值类型不一致时, 系统将按照左值的类型,自动进行强制转换。,例如: 设有以下定义 double x=2.3,y; int i=2,j;,(1) j,2.3,x,2.3, ,2,2,(1) j=x; (2) y=i;,由系统按 左值j 、y 类型自动 完成强制 转换功能,(2) y,2,i,2, ,2.0,2.0,70,3 强制类型转换,ok,强制类型转换运算符格式为: (type) 表达式 /形式一 或 type (表达式) /形式二,作用:将表达式强制转换为type类型, 但表达式的值及其类型不变。,设有变量说明:int a=7, b=5;float x; 表达式 x=a/b的值将为1。 如果希望表达式求出这两个整数相除的实数商1.4赋给x,就需要将两个操作数或其中一个操作数进行强制类型转换。可表示为: x=(float)a/(float)b或x=(float)a/b,71,说明: (1)强制类型转换不改变表达式本身的值类型,而是产生一个临时变量,用来暂存转换后的值,该临时变量引用后即自动释放。如上例,执行强制类型转换后变量a和b的值及类型都不变,而是各自产生一个临时变量,用这两个临时变量的值进行运算。 (2)强制类型转换符优先级较高,只对紧随其后的表达式起作用,而对其他部分不起作用。如表达式(float)a/b的含义是先将变量a强制转换为浮点数,然后与整数b运算。,72,1.6.5 求值次序与副作用(选读),ok,在符合优先级和结合性的前提下,C语言的标准对表达式中各操作数的求值次序没有做统一规定。,编译器为提高代码质量,在不影响优先级和结合性的前提下也要对操作数的访问次序作调整。在安排顺序时,如果某个操作数经历了求值运算,那么这个求值可能影响到其他操作数的值,这时就会产生副作用。 例如,设有int a=2, b=5, c; 对表达式c=a*b+(+a)+(b=10) 三个同级运算中,是先算a*b,还是+a,还是b=10,其次再算哪个?显然求值次序不同将导致结果不同。,73,1.7 数组与字符数组,1.7.1 数 组,1.7.2 字 符 数 组,本节介绍一种用户自定义的导出数据类型 数组类型,ok,74,1.7.1 数组,数组定义: 数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置区分,位置用下标表示。 例如数列或向量就可以看作一个数组,其中的元素用一个下标即可确定。 矩阵也可看作一个数组,其中的元素需要用“行”、“列”两个下标确定。 数组下标的个数称作维数,上述代表数列的数组和代表矩阵的数组分别称为一维数组和二维数组。本节只介绍一维数组。,ok,75,一维数组,一维数组的定义格式: 存储类型 数据类型 数组名常量; 数据类型指的是数组中元素的数据类型,可以是C+中定义的任何一种数据类型。 写在中括号中的常量用来定义数组大小,即数组中元素的个数。 例如:int m5; /定义数组m, 其中有5个整数 const int N=3; float xN; /数组x中有3个实数,ok,76,一维数组,数组的存储: 数组在存储单元中是按下标的顺序连续存放的,数组名代表数组存储区域的首地址。 数组的元素: 标识方法是用数组名和下标: 数组名表达式 表达式用来计算下标值。C+中规定数组第一个元素的下标为0。,ok,77,一维数组,注意: C+中数组大小在编译时确定,编译系统按照定义为数组分配一段连续的存储单元,这段单元的大小也是不能改变的,因此数组大小不能用变量定义,而只能是一个正整数常量。 下列定义是非法的: int count; float scount; /数组个数不能是变量,且必 /须在定义时指明; const float Num=3; int nNum; /数组个数不能是实数; 对数组的访问指的是对数组元素的访问,不能直接将数组名作为访问对象,对数组赋值也必须对每一个元素逐个赋值。,ok,78,一维数组,1,1,2,3,1,输出,2.4.1结束,1,2,3,1+2=3,【例1.2】使用数组的简单例子。 # include void main() int int_arr4; int_arr0=1; int_arr1=1; int_arr2=2; int_arr3=int_arr1+int_arr2; coutint_arr0n int_arr1n int_arr2n int_arr3 n; ,79,1.7.2 字符数组,字符数组定义: 如果数组中的元素为字符,就称为字符数组。例如: char string110; /可用来保存10个字符的字符数组; char city_name1 = N,a,n,j,i,n,g; /可用来保存7个字符的字符数组; 字符串与字符数组: C+中用字符数组保存字符串。允许直接用字符串常量给字符数组初始化。例如: char city_name2=”Nanjing”; 用字符串初始化,字符数组会自动加上一个串结束符0 。串结束符在字符串操作中具有十分重要的意义,因此在定义字符数组大小时,要注意留出足够的空间保存串结束符。,ok,80,1.7.2 字符数组,字符串处理函数: 字符串处理函数定义在头文件中,其中包括: strlen(s)/返回字符串s的实际长度(不包括0) strcpy(s1,s2)/将字符串s2中0之前的所有字符/依次赋值到字符串s1中,最后再加上一个0。 由于不能直接对字符数组名赋值,所以将一个字符串的值赋给另一个字符串必须用字符串复制函数完成。例如: char string220; string2=”VC+”; /非法 strcpy(string2, “VC+”); /合法,81,1.7.2 字符数组,【例1.3】 字符数组和字符串处理函数的应用。 # include # include using namespace std; int main( ) char s1 =”Hello C+”;/初始化决定数组s1有10个元素 char s210, s320; s20= B; s21= e; s22=g; s23= i; s24= n; s25= 0; /对字符串结束处理非常重要 strcpy(s3, s2); cout”The length of”s1”is:”strlen(s1)n; couts2ts3n; return 0 /只有字符数组可整体输出,因为有结束符 运行结果:The length of “Hello C+” is 9 Begin Begin,2.4.2结束,82,1.8 简单的输入输出,1.8.1 C+的输入输出简介,1.8.2 数据的输入输出,ok,1.8.3 输入输出的格式控制,83,输入流对象cin: cin用来在程序执行期间给变量输入数据, 一般格式为: cin变量名1变量名2变量名n; 输出流对象cout: cout实现将数据输出到显示器的操作, 一般格式为: cout using namespace std;,ok,1.8.1 C+输入输出简介,84,1.8.2 数据的输入输出,cin 与cinget( )的区别: (1) cin 例如: char c1, c2, c3; cinc1; /A cinc2c3; 程序执行到A行时,等待用户输入数据。 若输入:A b c 则cin分别将字符A、b、c赋给变量c1、c2、c3。 cin自动跳过输入的空白字符(包括空格,制表,backspace和回车等)。,ok,1.字符的输入输出,85,1.8.2 数据的输入输出,(2)cinget() 例如: char c1, c2, c3, c4; cin.get (c1); /B cin.get (c2); cin.get (c3); 程序执行到B行时,若输入:A b 则执行结果是:字符A、空格、字符b分别赋给变量c1、c2、c3;输入行中仍保留回车符。cin.get()把从键盘上输入的所有字符,包括空白字符,都作为输入字符赋给字符变量,ok,86,字符的输出: 使用cout。假定字符c1、c2、c3的值分别为字符a、b和c,执行以下语句序列: coutc1tc2n; coutc3endl; coutOkendl; 屏幕上将输出: a b c Ok 输出时字符之间是无间隔的,如果想让字符间有间隔,必须输出间隔符,1.8.2 数据的输入输出,87,2.字符串输入输出,输入:常用函数getline() : cin.getline (char ,int) 其中第一个参数是已经定义的字符数组名,第二个参数是读入字符的最多个数n(包括字符串结束符/0)。 getline()输入以用户按下回车键作为结束。,ok,输出:常用cout输出字符串。双引号中的字符串常量照原样输出,程序中通常通过输出字符串常量来输出一些提示信息。字符数组将输出串结束符前所有字符。,88,1.8.2 数据的输入输出,说明: 函数getline()保证在执行时总会为字符串的结束符保留一个字节。当键盘的输入字符(字节)数多于(n1)时,后面的字符不会进入字符数组,字符串结束符自动加在字符数组的最后一个字节中。当输入字符数少于该值时,字符串结束符自动加在输入到字符数组中的最后一个字符的后面。 例: char city11; cin.getline(city, 10); / 输入城市名最多5个中文字 cout “城市名:“ city endl;,ok,89,例: int i, j; float x, y; coutij; /D cinxy; cout 则程序输出: i=10 j=20 x+y=13.1 输出时各数据间是无间隔的,因此应当有意输出一些间隔符,ok,3. 十进制数据的输入输出,90,如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制。例如: int i, j, k, l; cout oct i; /输入为八进制数 cin hex j; /输入为十六进制数 cin k; /输入仍为十六进制数 cin dec l; /输入为十进制数 cout” hex:” i=” hex i endl; cout” dec:” j=” dec jt; cout” k=” k endl; cout” oct:” l=” oct l; cout dec endl; /恢复十进制输出状态,ok,1.8.3 输入输出的格式控制,(1)各种进制数据的输入输出,91,执行时输出: Input i(oct), j(hex), k(hex), l(dec): 此时从键盘输入: 032 0x3f 0xa0 17 则输出结果为: hex:i=1a dec:j=63 k=160 oct:l=21 注意:使用不带.h的头文件时,必须在cin中指明数制,否则从键盘输入时,不认八进制和十六进制数开头的0和0x标志。指明后可省略0和0x标志。 注意:在cin或cout中指明数制后,该数制将一直有效,直到重新指明用其他数制。 特别注意:输入数据的格式、个数和类型必须与cin中的变量一一对应,否则不仅使输入数据错误,而且影响后面其他数据的正确输入。,92,1.8.3 输入输出的格式控制,为了使数据间隔开,还可以用C+提供的函数setw() 指定输出数据项的宽度。例如: int i=2, j=3; float x=2.6, y=1.8; cout,ok,(2)设置数据间隔,93,第二章 基本控制结构程序设计,结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。 本章将介绍C+分支结构和循环结构的设计方法。还将介绍一些常用算法。,94,第二章 基本控制结构程序设计,2.2 分支结构程序设计,2.7 枚举类型,2.6 常用算法的应用实例,2.4 转向语句,2.3 循环结构程序设计,2.8 输入输出文件简介,2.5 结构化程序设计思想(选读),2.1 算法的概念与表示方法,95,2.1 算法的概念与表示方法,2.1.1 算 法 的 概 念,2.1.3 算 法描述的三种基本结构,2.1.2 算 法 的 表 示,96,2.1.1 算 法 的 概 念,算法: 算法是解决问题的步骤。 计算机算法的特征: 可执行性 确定性 有穷性 可输入输出信息 算法是程序设计学习的重点。,97,2.1.2算法的表示,流程图: 流程图是图形化的表示方法,比较直观,基本组成元件包括矩形框、菱形框、箭头线等。其中矩形框表示要执行的指令,在框内标注指令内容;菱形框表示要判断其中表达式的值是真还是假;箭头线则标示指令的流程方向。 伪码: 伪码是介于自然语言和程序设计语言之间的一种类自然语言的表示方法,书写形式自由,容易转换为程序。,98,2.1.3算法描述的三种基本结构,3 循 环 结 构,1 顺 序 结 构,2 分 支 结 构,算法的基本结构: 对算法的理论研究和实践表明,任何算法的描述都可以分解为三种基本结构或它们的组合,这三种基本结构是顺序结构、分支结构和循环结构。,99,num115;,2.1.3算法描述的三种基本结构,(1) 顺序结构,【例21】 求两数之和。,流程图,显示结果:35,num220;,sumnum1+num2;,演示算法执行过程,输出sum;,100,2.1.3算法描述的三种基本结构,(2) 分支结构,【例22】 输入三个数,输出其中的最大数。,x7;,y12;,z10;,if(xy) maxx; else max y;,if (zmax) maxz;,输出max;,显示结果:12,流程图,块1,块2,真,假,演示算法执行过程,101,2.1.3算法描述的三种基本结构,【例23】求4个整数的和。,显示结果:60,演示算法执行过程,12,3,14,26,2,16,42,1,18,60,0,count4; /整数个数 sum0; /累加和的初值 while (count0) x输入一个整数; sumsum+x; countcount-1; 输出sum;,102,2.2 分支结构程序设计,对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。 分支语句是基本流程控制语句之一。C+提供三种分支语句。,2.2.1 if语句,2.2.2 if语句的嵌套,2.2.4 swich语句,2.2.3 条件运算符“?:”,103,2.2.1 if 语句,if语句基本格式: 1、if (表达式) 语句1; 2、if (表达式) 语句1; else 语句2;,【例2.4】 输入一个年份,判断是否闰年。,【例2.5】 从键盘上输入三个整数,输出其中的最大数。,104,嵌套if语句: if 语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。if 语句可实现二选一分支,而嵌套if语句则可以实现多选一的多路分支情况。 嵌套有两种形式,嵌套在else分支中: if (表达式1) 语句1; else if (表达式2) 语句2; else if else 语句n; 嵌套在if分支中: if () if () ; else;,2.2.2 if 语句的嵌套,【例2.6】用嵌套if语句完成【例2.5】的任务。,105,else和if的配对关系: C+规定了if和else的“就近配对”原则,即相距最近且还没有配对的一对if和else首先配对。按上述规定,第二种嵌套形式中的else应与第二个if配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“”中。如第二种嵌套形式中,要让else和第一个if配对,语句必须写成: if (表达式1) if (表达式2) 语句1 ; else 语句2 ; 第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用第一种嵌套形式。,2.2.2 if 语句的嵌套,106,配对关系实例: /语句1: if(n%3=0) if(n%5=0) coutn是15的倍数endl; else cout n是3的倍数但不是5的倍数 endl; /语句2: if(n%3=0) if(n%5=0) coutn是15的倍数endl; else cout n 不是3的倍数 两个语句的差别只在于一个“”,但表达的逻辑关系却完全不同。,【例2.7】 某商场购物优惠活动,【例2.8】 求一元二次方程的根。,107,2.2.3 条件运算符“?:”,三元运算符: 三元运算符条件运

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论