1、C+语言基础盐城工学院 惠为君C+概述C+的特点发展历史和未来(CC+(AT&T)Java(SUN)C#(MS)与其它语言比较(7点):面向对象的概念:数据的封装和隐藏、继承、多态VC上机过程C+的字符集的字符集26个个小写字母小写字母 abcdefghijklmnopqrstuvwxyz 26个个大写字母大写字母 ABCDEFGHIJKLMNOPQRSTUVWXYZ 10个个阿拉伯数字阿拉伯数字0 1 2 3 4 5 6 7 8 9其他符号其他符号+-*/=,._:;?|!#%&()空格空格 C+语言使用下列基本字符来构成词法单位:结束第二章:数据类型 运算符 表达式2.1VC+的数据类型计
2、算机所处理的数据以一定形式存放在内计算机所处理的数据以一定形式存放在内存中,数据的存储方式以及能够进行的合存中,数据的存储方式以及能够进行的合法运算都与数据类型直接相关。法运算都与数据类型直接相关。C+的特的特点之一就是提供了丰富的数据类型,以便点之一就是提供了丰富的数据类型,以便处理各种不同的数据。处理各种不同的数据。数据类型总是与运数据类型总是与运算封装在一起,本质上是面向对象的。算封装在一起,本质上是面向对象的。本本章将简要介绍章将简要介绍C+中的数据类型及相关运中的数据类型及相关运算,以及常量、变量、表达式、语句等,算,以及常量、变量、表达式、语句等,最后介绍简单的输入输出方法。最后介
3、绍简单的输入输出方法。2.1.1 关键字数据类型说明符与修饰符bool char wchar_t class const double enum float int long short signedstructunionunsignedvoidvolatile存储类型说明符autoexterninlineregisterstatic访问说明符friendprivateprotectedpublic其它说明符asmexplicitnamespaceoperatortemplatethistypedeftypenameusingvirtual语句与标号breakcasecatchcontinue
4、defaultdoelseforgotoifreturnswitchthrowtrywhile运算符及逻辑值deletefalsenewsizeoftrue 还有一些关键字本书未介绍:还有一些关键字本书未介绍:const_cast dynamic_cast reinterpret_cast static_cast export mutable typeid 下面可用一些关键字代替逻辑运算符:下面可用一些关键字代替逻辑运算符:and and_eq bitand bitorCompl not or or_eqXor xor_eq not_eq2.1.2 标识符标识符标识符(Identifier,I
5、D)是程序员定义的“单词”,用来给变量、常量、数据类型、函数等命名。合法标识符由字母或下划线开始,由字母、数字、下划线组成,其有效长度为131个字符,长度超过31个字符者只识别前31个字符,VC+标识符长度为1247个字符。建议使用有一定含义的英文单词或拼音序列作标识符,以提高可读性;另外尽量不用下划线或双下划线打头,以免与系统定义的关键字冲突。ok标识符标识符例:判断下面哪些是合法的标识符:MyFileSalary94amountvoid94SalarySalary94$amountf3.5Num_of_Student2.1.2结束2.1.3 标点符号标点符号标点符号包括:#、()、,、:、
6、;、等。标点符号的作用:有一定的语法意义。如字符和字符串常量分别用和“”引起来。对语法符号起分隔作用。如;等2.1.3结束2.1.5 C+的基本数据类型的基本数据类型图2-1C+的数据结构实型float双精度型doubleC+的数据类型基本数据类型非基本数据类型数组type指针type*结构struct联合union枚举enum类class整型int字符型char逻辑型bool无值型void实型ok C+对基本数据类型也分别进行了封装,称为内置数据类型,内置数据类型不仅定义了数据类型,还定义了常用操作。本节仅介绍各种基本数据类型的定义,常用操作将在后面介绍。C+为强类型语言,所有数据的使用严格
7、遵从“先说明后使用”的原则,以便编译器进行编译。整型用来存放整数,整数(有符号的整数)在内存中存放的是它的补码,无符号数没有符号位,存放的就是原码。整数占用的字节数与机型有关,32位机上占用4个字节。字符型用来保存字符,存储的是该字符的ASCII码,占用一个字节。如大写字母A的ASCII码为65,在对应的一个字节中存放的就是65。字符型数据从本质上说也是整数,可以是任何一个8位二进制整数。由于汉语系字符很多,用ASCII字符集处理远远不够,因此又创立了双字节字符集(DBCS:double-byte character set),每个字符用两个字节来编码。为便于软件的国际化,国际上一些知名公司联
8、合制定了新的宽字节字符标准Unicode。该标准中所有字符都是双字节的,不同的语言和字符集分别占用其中一段代码。这种用统一编码处理西文、中文及其它语言符号,就是unicode码。C+同时也支持宽字符类型(wchar_t),或称双字节字符型。实型和双精度型都用来存放实数,两者表示的实数精度不同。实数在内存中以规范化的浮点数存放,包括尾数、数符和阶码。数的精度取决于尾数的位数,32位机上实型为23位(因规范化数的数码最高位恒为1,不必存储,实际为24位),双精度为52位。逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+6.0中为1个
9、字节。布尔型在运算中可以和整型相互转化,false对应为0,true对应为1或非0无值型主要用来说明函数的返回值类型,将在函数一章中具体介绍。基本数据类型还可以加上一些修饰词,包括:signed(有符号)、unsigned(无符号)、long(长)、short(短)。参见下表:2.2结束类型名称占用字节数取值范围bool布尔型true,false(signed)char有符号字符型1-128127unsigedchar无符号字符型10255(signed)short(int)有符号短整型2-3276832767unsignedshort(int)无符号短整型2065535(signed)int
10、(signed)有符号整型4-231(231-1)unsigned(int)无符号整型40(232-1)(signed)long(int)有符号长整型4-231(231-1)unsignedlong(int)无符号长整型40(232-1)float实型4-10381038double双精度型8-1030810308longdouble长双精度型8-1030810308void无值型0无值VC+中所有基本数据类型2.1.6 常量在程序的执行过程中,值保持不变的量称为 常量字面常量,指程序中直接给出的量;常量的值在程序执行过程中保持不变;并且存储在程序区,而非数据区;根据取值和表示方法的不同,可分
11、为以下几种:a.整形常量d.字符串常量c.字符型常量b.实型常量okA整型常量十进制表示法八进制表示法十六进制表示法其他表示法即整数,可以有多种表示方法:ok 整数的十进制表示方法十进制表示与我们熟悉的书写方式相同。如15 -24ok 整数的八进制表示 八进制表示以0开始,由数字07组成,用来表示一个八进制数。如:012/八进制数12,即十进制数10-0655/八进制数-655,即十进制数-429ok 整数的十六进制表示 十六进制以0X(大小写均可)开始,由数字09和字母AF(大小写均可)组成,用来表示一个十六进制数。以下是一些常整数的例子:0 x32A /十六进制数32A,即十进制数810-
12、0 x2fe0 /十六进制数-2fe0,/即十进制数-12256ok整数的其他表示方法 整型常量还可以表示长整数和无符号整数。长整型常数以 L 或 l 结尾,无符号常整数以 U 或 u 结尾,以 U L 或 L U(大小写均可)结尾则可表示无符号长整型常数。例如:-84L/十进制长整数-84026U/八进制表示的无符号整数260X32LU/十六进制表示的无符号长整型数32。整数结束B实型常量(1)一般形式与平时书写形式相同,由数字 0 9和小数点组成。例如:0.23 -125.76 0.0 .46 -35.(2)指数形式(也称为科学表示法)表示为尾数乘以10的次方形式,由尾数、E或e和阶数组成
13、。指数形式要求在E或e前面的尾数部分必须有数字,后面的指数部分必须为整数。例:判断下列表示是否合法123E12-.34e-2E41.43E3.5包含小数点和10的幂的数为实型常量,有两种表示方法:实数 结束C字符型常量 字符常量是用单引号引起来的单个字符。在内存中保存的是字符的ASCII码值。在所有字符中,有些是可显示字符,通常就用单引号引起来表示:a/字符a/字符4/字符4/空格字符有些是特殊情况字符,如不可显示的字符等,c+使用转义序列表示方法,如(祥见表2-3,此处略):n/换行 /字符 字符常 结束D.字符串常量字符串常量与字符型常量的区别字符串常量a占两个字节,存放a和 0,值为0
14、x6100字符型常量a占一个字节,存放a,值为0 x612.3.2结束用双引号引起来的若干个字符称为字符串常量。例如:I am a Chinese.,123,a,2 标识符常量及常量说明符CONST用常量说明符const给字面常量起个名字(标识符),这个标识符就称为标识符常量;因为标识符常量的说明和引用形式很像变量,所以也称常变量;例如:const float PI=3.14159;const int Number_of_Student=100;常变量必须也只能在说明时进行初始化;常变量初始化之后,不允许再被赋值;常变量必须先说明后使用;常变量存储在数据区,并且可以按地址访问,编译时系统对常变
15、量进行类型检查。C+建议使用常变量,而尽量不使用字面常量。2.3.3结束2.1.7 变 量1 变量说明 2 变量赋初值 变量,在程序中是指可以改变值的量;变量必须用标识符进行标识,称为变量名;变量有类型之分,如整形变量、字符变量等;任何变量都必须先说明后使用;一是便于编译程序为变量分配空间,二是便于编译时进行语法检查;变量使用的第一步,是给变量赋初始值;ok1变量说明 在C+中,变量说明的一般格式为:存储类型数据类型 变量名1,变量名2,变量名n;下面是变量说明的几个例子:inti,j,k;/说明三个整型变量i,j,kfloatx,y,z;/说明三个实型变量x,y,zcharc1,c2;/说明
16、两个字符型变量c1,c2doubledx;/说明一个双精度型变量dx变量说明结束2变量赋初值(1)变量说明时直接赋初值。例如:int a=3,b=4,c=5;float x=3.0;(2)用赋值语句赋初值。严格的说,只有前者可称赋初值例如:float x,e;x=3.5;e=2.71828;结束给变量赋初值称为初始化,有两种方法:2.2基本运算符对常量和变量进行运算是通过运算符来实现的.常量和变量通过运算符组成C+表达式,由表达式再组成C+语句.运算符是完成对常量和变量进行运算的符号.把参与运算的对象称为操作数.按照要求的操作数的个数,运算符分为单目(一元)运算符、双目(二元)运算符和三目(三
17、元)运算符。单目运算符只对一个操作数运算,如负号运算符“”等;双目运算符要求有两个操作数,如乘号运算符“*”等;三目运算符要求有三个操作数,三元运算符只有一个“?:”。1.算术运算符优先级运算符名称3+正,单目-负,单目5*乘,双目/除,双目%求余,双目6+加,双目-减,双目ok运算符重载:当两个操作数均为整数时,*和/重载为整乘和整除,结果为整数,除法运算后舍去小数取整。如:5/4/结果为1,整数当两个操作数均为整数,%定义为求余运算,也称求模运算,结果为两个整数相除后的余数。如果两个整数中有负数,则先用两数绝对值求余,最后结果的符号与被除数相同。例如6%3/结果为06%7/结果为67%6/
18、结果为1 C+中算术运算应注意数据溢出问题,即运算结果超出对应数据类型的表示范围。编译程序只会对除法运算时除数为0这种情况提示出错,而特别容易溢出的整数的加、减和乘法运算产生溢出的情况,系统不作为错误处理,程序将继续执行并产生错误的计算结果。因此,程序设计者必须在程序中解决检查并处理整数溢出问题。只要有一个操作数是实数,两个操作数均转换为double型,*和/重载为普通的乘和除,结果是实数:5/4.0/结果为1.25,实数2.关系运算符和逻辑运算符ok 关系运算符都是二元运算符,包括:(大于)、(不小于)、(小于)、(不小于)、=(等于)和!=(不等于)。关系运算符完成两个操作数大小的比较,结
19、果为逻辑值true(真)或false(假)。每种可比较大小的数据类型,都重载了关系运算符。不同类型,自动转换为同一类型后,采用对应关系运算符进行比较。在C+中这两个逻辑值与整数之间有一个对应关系,真对应1,假对应0;反过来,0对应假,非0整数对应真。所以关系运算结果可以作为整数参与算术运算、关系运算、逻辑运算及其他运算。2.关系运算符和逻辑运算符设有定义 floata=3.2;intb=5;则:3ab/结果是?根据右结合原则其运算过程如下:a5b3.23F,即0F即0优先级运算符名称语义2!逻辑非,单目操作数的值为真,则结果为假;12&逻辑与,双目当两个操作数全为真时,结果为真,否则为假;13
20、|逻辑或,双目两个操作数中有一个为真,则结果为真;逻辑运算符 逻辑运算符用来进行逻辑运算。其操作数和运算结果均为逻辑量。运算结果同样可以作为一个整数参与其他运算。由于逻辑值和整数之间的对应关系,也允许整型和字符型操作数进行逻辑运算:21&0/逻辑与,21与0,结果为假:021|0/逻辑或,21或0,结果为真:1!21/逻辑非,21的非,结果为假:0逻辑运算符3.位运算符(1)按位取反运算符“”(2)左移运算符“”(4)按位与运算符“&”(5)按位或运算符“|”(6)按位异或运算符“”okc+语言提供字位运算,它对操作数的各个位进行操作。(1)按位取反运算符“”将操作数的每个二进制位取反,即1变
21、为0,0变为1。例如,整数a的值为10011011,则a的值为01100100。(2)左移运算符“”运算一般格式为:a”与左移运算符类同,将左操作数向右移动右操作数指定的二进制位数,忽略移位后的小数部分,并在高位补0。一个整数右移n位相当于除以2的n次方,但比除法快。在VC+6.0中有符号数右移时高位补符号位,严格对应除法。以上三种单目运算不影响数据本身的值,而是只产生一个中间量,这个中间量被引用后即不再存在。(4)按位与运算符“&”将两个操作数的对应位逐一进行按位逻辑与运算。运算规则为:对应位均为1时,该位运算结果为1;否则为0。例如:a 01001101b 00001111a&b 0000
22、1101该运算可用来将整数的某些位置0,而保留所需要的位,上例保留了低四位。(5)按位或运算符“|”将两个操作数的对应位逐一进行按位逻辑或运算。运算规则为:只要有一个数对应位为1,该位运算结果即为1;两个数对应位均为0,该位结果为0。例如:a 01001101b 00001111a|b 01001111该运算符可用来将整数的某些位置1。上例高四位不变,低四位全1。(6)按位异或运算符“”将两个操作数的对应位逐一进行按位异或运算。运算规则为:当对应位的值不同时,该位运算结果为1,否则为0。例如:a 01001101b 00001111a b 01000010该运算符可用来将一个整数的某些位取反,
23、或将整型变量的值置0(将整型变量与自身按位异或)。上例低四位取反,高四位不变。需要说明的一点是,以上例子中的整数都只取了低8位一个字节。4.赋值运算符ok 将数据存放到相应存储单元中称为赋值,如果该单元中已有值,赋值操作以新值取代旧值;从某个存储单元中取出数据使用,称为引用,引用不影响单元中的值,即一个量可以多次引用。常量只能引用,不能赋值。赋值通过赋值运算符“=”来完成,其意义是将赋值号右边的值送到左边变量所对应的单元中。赋值号不是等号,它具有方向性。C+将变量名代表的单元称为“左值”,而将变量的值称为“右值”。左值必须是内存中一个可以访问且可以合法修改的对象,因此只能是变量名,而不能是常量
24、或表达式。4.赋值运算符例如下面的赋值运算是错误的:3.1415926=pi;/左值不能是常数x+y=z;/左值不能是表达式constintN=30;N=40;/左值不能是常变量5.自增自减运算运算分前置和后置两种,前置是先增减后引用,即先对变量自加或自减,用新的值参与其他运算;后置则是先引用后增减,即用变量原来的值参与其他运算,然后再对变量进行自加或自减,例如: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,再赋给该变量。要求:
25、操作数只能是变量,不能是常量或表达式;ok6.SIZEOF()运算符用于计算一个操作数类型或一个变量的字节数。一般格式为:sizeof(数据类型)或 sizeof(变量名)例如:sizeof(int)值为4sizeof(float)值为4doublex;sizeof(x)值为8结束2.2.2表达式1算术表达式2关系表达式3逻辑表达式和逻辑表达式求值的优化4赋值表达式与复合赋值表达式5逗号表达式ok1.算术表达式使用时注意:1、表达式中每个变量都有确定的值时才能进行表达式求值;2、考虑到算术运算溢出和精度问题,应避免:(1)两个很接近的数直接相减;(2)除数是一个很小的数;(3)整数的连续乘运算
26、。ok由算术运算符连接的表达式称为算术表达式,例如:a+b*3;2.关系表达式例如:abc /*等同于(ab)c,先求ab 的值,再将结果0或1与c比较大小*/a+bc+d /*等同于(a+b)(c+d),结果为0或1*/y=ab /*计算ab的值0或1 赋给y,y的值为0或1*/由关系运算符连接的表达式。值为true或false。ok3.逻辑表达式和逻辑表达式求值的优化由逻辑运算符连接的表达式称为逻辑表达式。逻辑表达式的值为true或false。这个值可对应整数1或0参与其他运算。ok已知:inta=10,b=20,c=30;floatx=1.8,y=2.4;ay|ab-!c按优先级与结合性
27、,其求值顺序等同于:(ay)|(a(b-(!c)t1=1t2=0t4=0-&t3=0t5=bt6=1|得整个表达式的值为:13.逻辑表达式和逻辑表达式求值的优化在求逻辑表达式值的过程中,一旦表达式的值能够确定,就不再逐步进行下面的运算。称为“求值优化”。已知:inta=10,b=20,c=30;求:ab|c+/结果以及a,b,c的值t1=1整个表达式的值为 1可见:表达式 c+已不需要计算所以:c不变仍为30编程人员在使用逻辑运算时应当加以小心,优化计算固然提高了运算效率,但可能产生副作用。所谓副作用,就是出乎设计人员的意料,得到预想不到的结果。4.赋值表达式与复合赋值表达式赋值表达式的格式为
28、:变量=表达式 例如:x=5+6;a=b=c=d+1;在C+中,所有的双目算术运算符和位运算符均可与赋值运算符组合成一个单一运算符,称为复合运赋值算符。包括以下10个:+=*=/=%=&=|=复合赋值运算符的要求与格式与赋值运算符完全相同,表示为:变量 复合赋值运算符 表达式 它等同于 变量=变量 运算符 表达式 例如:x+=5 等同于:x=x+5ok5.逗号表达式C+中,逗号既是分隔符,又是运算符,用逗号连接起来的表达式称为逗号表达式。一般格式为:表达式1,表达式2,表达式n逗号表达式中的每一个表达式都会被运算,整个逗号表达式的值为最后一个表达式的值。例如:a=(x=3,x+=6,5+6);
29、/a=11x=92.5.2结束2.2.3不同类型数据的混合运算和赋值时的类型转换1 不同类型数据的混合运算2 赋 值 类 型 转 换ok运算过程中,当某个二元运算符两边的操作数类型不同但属于类型相容时,系统先将精度低的操作数变换到与另一操作数精度相同,而后再进行运算。所谓类型相容,指的就是类型不同但系统可以自动进行转换。当赋值号的左值和右值类型不一致但属于类型相容时,由系统自动进行类型转换。具体规则如下:(1)字符可以作为整数参与数值运算,整数值为其ASCII码。(2)操作数为字符或短整型时,系统自动变换成整型。(3)操作数为实型时,系统自动变换成双精度型。(4)其余情况,当两操作数类型不同时
30、,将精度低(或表示范围小)的操作数的数据类型变换到与另一操作数类型相同再进行运算 例如有变量: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。2.赋值类型转换2.5.3结束系统自动进行类型转换规则:1、实型数赋给整形变量:取整
31、;注意溢出;2、整型数赋给实型变量:先转换为实型数;3、字符型数赋给整形变量:ASCII码为依据;分为两种情况:符号位是0或1时不同;若符号位为1,则低位字节不变,高位字节全部置1再赋值。4、绝对值较大的数赋给表达范围较小的数据类型时,注意溢出;2.5.4强制类型转换运算符ok其格式为:()/形式一或 ()/形式二作用:将表达式强制转换为类型,但表达式的值及其类型不变。任意数据类型赋值运算中,当左值与右值类型不一致时,系统将按照左值的类型,自动进行强制转换。例如:设有以下定义doublex=2.3,y;inti=2,j;(1)j2.3x2.322(1)j=x;(2)y=i;由系统按左值j、y类
32、型自动完成强制转换功能(2)y2i22.02.02.5.4强制类型转换运算符第三章:简单输入/输出3.1cincin用来在程序执行期间给变量输入数据,用来在程序执行期间给变量输入数据,一般格式为:一般格式为:cin变量名变量名1变量名变量名2变量名变量名n;cout实现将数据输出到显示器的操作,实现将数据输出到显示器的操作,一般格式为:一般格式为:cout表达式表达式1表达式表达式2表达式表达式n;同时必须在程序开头增加一行:同时必须在程序开头增加一行:#include3.1.1十进制数据的输入输出请看下例:inti,j;floatx,y;cout”Inputi,j,x,y:”ij;/Dcin
33、xy;cout”i=”it”j=”jendl;cout”x+y=”x+yendl;若输入:10204.58.6则程序输出:i=10j=20 x+y=13.1输出时各数据间是无间隔的,因此应当有意输出一些间隔符ok3.1.2输入字符数据输入字符数据cin与与cin.get()的区别的区别(1)cin例如例如:charc1,c2,c3;cinc1;/Acinc2c3;程序执行到程序执行到A行时,等待用户输入数据。行时,等待用户输入数据。若输入:若输入:Abc则则cin分别将字符分别将字符A、b、c赋给变量赋给变量c1、c2、c3。cin自动跳过输入的自动跳过输入的空白空白字符(包括空格,制字符(包
34、括空格,制表,表,backspace和回车等)。和回车等)。(2)cin.get()例如:例如:charc1,c2,c3,c4;cin.get(c1);/Bcin.get(c2);cin.get(c3);程序执行到程序执行到B行时,若输入:行时,若输入:Ab则执行结果是:字符则执行结果是:字符A、空格、字符、空格、字符b分别赋给变量分别赋给变量c1、c2、c3;输入行中仍;输入行中仍保留回车符。保留回车符。cin.get()把从键盘上输入把从键盘上输入的所有字符,包括的所有字符,包括空白空白字符,都作为输字符,都作为输入字符赋给字符变量入字符赋给字符变量 关于字符的输出,请看下例,假定字符关于
35、字符的输出,请看下例,假定字符c1、c2、c3的值分别为字符的值分别为字符a、b和和c,执行以下语,执行以下语句序列:句序列:coutc1tc2n;coutc3endl;coutOkendl;屏幕上将输出:屏幕上将输出:abcOk输出时字符之间是无间隔的,如果想让字符间输出时字符之间是无间隔的,如果想让字符间有间隔,必须输出间隔符有间隔,必须输出间隔符 补充.字符串输入输出向一个字符数组中输入字符串时,用函数getline()。getline()以用户按下回车键作为结束,在此之前的所有输入都放入字符数组中:cin.getline(char,int)其中第一个参数是已经定义的字符数组名,第二个参
36、数是读入字符的最多个数n(包括字符串结束符/0)。ok常用cout输出字符串。双引号中的字符串常量照原样输出,程序中通常通过输出字符串常量来输出一些提示信息。字符数组将输出串结束符前所有字符。补充:字符串输入输出函数保证在执行时总会为字符串的结束符保留一个字节。当键盘的输入字符(字节)数多于(n1)时,后面的字符不会进入字符数组,字符串结束符自动加在字符数组的最后一个字节中。当输入字符数少于该值时,字符串结束符自动加在输入到字符数组中的最后一个字符的后面。请看下例:charcity11;cin.getline(city,10);/输入城市名最多5个中文字cout“城市名:“cityendl;o
37、k如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制。例如:inti,j,k,l;cout”Inputi(oct),j(hex),k(hex),l(dec):”octi;/输入为八进制数cinhexj;/输入为十六进制数cink;/输入仍为十六进制数cindecl;/输入为十进制数cout”hex:”i=”hexiendl;cout”dec:”j=”decjt;cout”k=”kendl;cout”oct:”l=”octl;coutdecendl;/恢复十进制输出状态ok输入输出的格式控制(1)各种进制数据的输入输出
38、执行时输出:Inputi(oct),j(hex),k(hex),l(dec):此时从键盘输入:0320 x3f0 xa017则输出结果为:hex:i=1adec:j=63k=160oct:l=21由于已经在cin中指明数制,因此从键盘输入时,八进制和十六进制数可以省略其开头的0和0 x标志。在cin或cout中指明数制后,该数制将一直有效,直到重新指明用其他数制。特别注意:输入数据的格式、个数和类型必须与cin中的变量一一对应,否则不仅使输入数据错误,而且影响后面其他数据的正确输入。输入输出的格式控制为了使数据间隔开,还可以用C+提供的函数setw()指定输出数据项的宽度。例如:inti=2,
39、j=3;floatx=2.6,y=1.8;coutsetw(6)isetw(10)jendl;coutsetw(10)i*jendl;coutsetw(8)xsetw(8)yendl;输出结果为:2362.61.8使用setw()必须在程序的开始处增加:#include ok(2)设置数据间隔第第4 4章章 流程控制语句流程控制语句4.1 选择结构程序设计选择结构程序设计 对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。流程控制语句也称为过程化语句。分支语句是三种基本流程控制语句之一。C+提供以下三种分支语句:if语句条件运算符“?:”swith语句4.2.1 IF 语句语
40、句if语句有两种基本格式为:1、if();2、if()else;IF 语句语句【例41】输入一个年份,判断是否闰年。算法分析:假定年份为year,闰年的条件是:year%4=0&year%100!=0|year%400=0。#includevoidmain()intyear;cout输入年份:year;if(year%4=0&year%100!=0|year%400=0)coutyear是闰年endl;elsecoutyear不是闰年endl;ok分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。#includevoidmain()inta,b,c,max;cout
41、abc;couta=atb=btc=cb)max=a;elsemax=b;if(cmax)cout“最大数为:”cendl;elsecout“最大数为:”maxendl;IF 语句语句【例42】从键盘上输入三个整数,输出其中的最大数。okif 语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。if 语句可实现二选一分支,而嵌套if语句则可以实现多选一的多路分支情况。嵌套有两种形式,第一种是嵌套在else分支中:if();elseif()语句2;elseifelse;第二种是嵌套在if分支中为:if()if();else;IF 语句语句/方法1:采用if中嵌套形式#includevoidm
42、ain()inta,b,c,max;coutabc;couta=atb=btc=cb)if(ac)max=a;/ab且acelsemax=c;/ab且ac)max=b;/acelsemax=c;/a=b且bccout最大数max=max;IF 语句语句【例3.3】用嵌套if语句完成【例3.2】的任务。ok/方法2:采用else中嵌套形式#includevoidmain()inta,b,c,max;coutabc;couta=atb=btc=cb&ac)max=a;elseif(ba&bc)max=b;elsemax=c;cout最大数为:max=max;IF 语句语句ok 要特别注意else和
43、if的配对关系。C+规定了if和else的“就近配对”原则,即相距最近且还没有配对的一对if和else首先配对。按上述规定,第二种嵌套形式中的else应与第二个if配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“”中。如第二种嵌套形式中,要让else和第一个if配对,语句必须写成:if(表达式1)if(表达式2)语句1;else 语句2;第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用第一种嵌套形式。请看以下两个语句:/语句1:if(n%3=0)if(n%5=0)coutn是15的倍数endl;else cout
44、 n是3的倍数但不是5的倍数 endl;/语句2:if(n%3=0)if(n%5=0)coutn是15的倍数endl;else cout n 不是3的倍数两个语句的差别只在于一个“”,但表达的逻辑关系却完全不同。【例44】某商场优惠活动规定,某种商品单 价为80元,一次购买5件以上(包含 5件)10件以下(不包含10件)打9 折,一次购买10件以上(包含10件)打8折。设计程序根据客户的购买量计 算总价。IF 语句语句算法算法1、输入购买件数、输入购买件数count,设置单价,设置单价price=80(元元)2、根据、根据count值确定折扣值确定折扣discount;3、实际售价、实际售价a
45、mount=price*count*discount;4、输出、输出amount的值。的值。算法细化:算法细化:2.1、if(count=5&count=10)discount=0.8;ok#includevoidmain()floatprice=80,discount,amount;/单价,折扣,总价intcount;/购买件数cout输入购买件数:count;if(count5)discount=1;elseif(count10)discount=0.9;elsediscount=0.8;amount=price*count*discount;cout购买件数:countendl;cout
46、单价:pricet折扣:“discountendl;cout总价:amount0,方程有两个不同实根;若delta0)方程有两个不同实根;计算)方程有两个不同实根;计算3.3、if(delta0)方程无实根;计算)方程无实根;计算ok#include#includevoidmain()floata,b,c;floatdelta,x1,x2;constfloatzero=0.0001;/定义一个很小的常数cout输入三个系数a(a!=0),b,c:abc;couta=atb=btc=cendl;delta=b*b-4*a*c;求一元二次方程的根源程序求一元二次方程的根源程序if(fabs(del
47、ta)zero)/绝对值很小的数即被认为是0cout方程有两个相同实根:;coutx1=x2=-b/(2*a)0)delta=sqrt(delta);x1=(-b+delta)/(2*a);x2=(-b-delta)/(2*a);cout方程有两个不同实根:;coutx1=x1tx2=“x2endl;else/delta0cout方程无实根!endl;请在VC+平台上运行,输入不同的系数,使程序所有分支都可以被执行一次。3.1.2 条件运算符条件运算符“?:”if语句在某些情况下可以用条件运算符“?:”来简化表达。“?:”是一个三元运算符,其构成的表达式格式为:?:执行逻辑:先计算表达式1,若
48、其值为真(或非0),则计算表达式2(不计算表达式3),并将该值作为整个表达式的值;反之,即表达式1的值为假或为0,则计算表达式3(不计算表达式2),并将该值作为整个表达式的值。例如:int a=6,b=7,min=ab?a:b;/min=6 min=ab?+a:+b;/min=7 a=7 b=7 min=ascore;switch(score)caseA:casea:coutexcellent;break;caseB:caseb:coutgood;break;default:coutfair;(5)从形式上看,)从形式上看,switch语句的可读性比嵌套语句的可读性比嵌套if语句好,但不是所有
49、多选一的问题都可由开关语句好,但不是所有多选一的问题都可由开关语句完成,这是因为开关语句中限定了条件表语句完成,这是因为开关语句中限定了条件表达式的取值类型。达式的取值类型。ok SWITCH语句例子语句例子【例36】运输公司对所运货物实行分段计费。设运输里程为s,则运费打折情况如下:s250不打折扣250=s5002%折扣500=s10005%折扣1000=s20008%折扣2000=s300010%折扣3000=s15%折扣设每公里每吨的基本运费为p,货物重量为w,折扣为d,则总运费f为:f=p*w*s*(1-d)设计程序,当输入p、w和s后,计算运费f。算法算法1、输入每吨运费、输入每吨
50、运费p、货物重量、货物重量w、运输里程、运输里程s;2、根据运输里程、根据运输里程s计算折扣计算折扣d;3、计算总运费、计算总运费f=p*w*s*(1-d);4、输出计算结果;、输出计算结果;算法细化:算法细化:2、根据运输里程、根据运输里程s计算折扣计算折扣d分分析析:如如果果用用switch语语句句,必必须须使使表表达达式式符符合合语语法法要要求求,分分析析发发现现,里里程程s的的分分段段点点均均是是250的的倍倍数数,因因此此,将将里里程程s除除以以250,取取整整数数商商,便便得到若干整数值。得到若干整数值。okswitch(c=s/250)case0:d=0;break;case1: