《C++语言基础》全套课件(完整版)_第1页
《C++语言基础》全套课件(完整版)_第2页
《C++语言基础》全套课件(完整版)_第3页
《C++语言基础》全套课件(完整版)_第4页
《C++语言基础》全套课件(完整版)_第5页
已阅读5页,还剩492页未读 继续免费阅读

下载本文档

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

文档简介

C++语言基础C++概述C++的特点发展历史和未来 (C\C++(AT&T)\Java(SUN)\C#(MS))与其它语言比较(7点):面向对象的概念:数据的封装和隐藏、继承、多态VC上机过程C++的字符集26个小写字母

abcdefghijklmnopqrstuvwxyz26个大写字母

ABCDEFGHIJKLMNOPQRSTUVWXYZ10个阿拉伯数字

0123456789

其他符号

+-*/=,._:;?\"'~|!#%&()[]{}^<>空格C++语言使用下列基本字符来构成词法单位:结束第二章:数据类型运算符表达式2.1VC++的数据类型计算机所处理的数据以一定形式存放在内存中,数据的存储方式以及能够进行的合法运算都与数据类型直接相关。C++的特点之一就是提供了丰富的数据类型,以便处理各种不同的数据。数据类型总是与运算封装在一起,本质上是面向对象的。本章将简要介绍C++中的数据类型及相关运算,以及常量、变量、表达式、语句等,最后介绍简单的输入输出方法。2.1.1关键字数据类型说明符与修饰符boolcharwchar_tclassconstdoubleenumfloatintlongshortsignedstructunionunsignedvoidvolatile存储类型说明符autoexterninlineregisterstatic访问说明符friendprivateprotectedpublic其它说明符asmexplicitnamespaceoperatortemplatethistypedeftypenameusingvirtual

语句与标号breakcasecatchcontinuedefaultdoelseforgotoifreturnswitchthrowtrywhile

运算符及逻辑值deletefalsenewsizeoftrue

还有一些关键字本书未介绍:

const_castdynamic_castreinterpret_caststatic_castexportmutabletypeid下面可用一些关键字代替逻辑运算符:andand_eqbitandbitorComplnotoror_eqXorxor_eqnot_eq2.1.2标识符标识符(Identifier,ID)是程序员定义的“单词”,用来给变量、常量、数据类型、函数等命名。合法标识符由字母或下划线开始,由字母、数字、下划线组成,其有效长度为1-31个字符,长度超过31个字符者只识别前31个字符,VC++标识符长度为1-247个字符。建议使用有一定含义的英文单词或拼音序列作标识符,以提高可读性;另外尽量不用下划线或双下划线打头,以免与系统定义的关键字冲突。ok标识符例:判断下面哪些是合法的标识符:

MyFileSalary94amountvoid94SalarySalary94$amountf3.5Num_of_Student2.1.2结束2.1.3标点符号标点符号包括:#、()、{}、,、:、;、"、'等。标点符号的作用:有一定的语法意义。如字符和字符串常量分别用‘’和“”引起来。对语法符号起分隔作用。如;等2.1.3结束2.1.5C++的基本数据类型图2-1C++的数据结构实型float双精度型doubleC++的数据类型基本数据类型非基本数据类型数组type[]指针type*结构struct联合union枚举enum类class整型int字符型char逻辑型bool无值型void实型ok

C++对基本数据类型也分别进行了封装,称为内置数据类型,内置数据类型不仅定义了数据类型,还定义了常用操作。本节仅介绍各种基本数据类型的定义,常用操作将在后面介绍。

C++为强类型语言,所有数据的使用严格遵从“先说明后使用”的原则,以便编译器进行编译。

整型用来存放整数,整数(有符号的整数)在内存中存放的是它的补码,无符号数没有符号位,存放的就是原码。整数占用的字节数与机型有关,32位机上占用4个字节。

字符型用来保存字符,存储的是该字符的ASCII码,占用一个字节。如大写字母A的ASCII码为65,在对应的一个字节中存放的就是65。字符型数据从本质上说也是整数,可以是任何一个8位二进制整数。由于汉语系字符很多,用ASCII字符集处理远远不够,因此又创立了双字节字符集(DBCS:double-bytecharacterset),每个字符用两个字节来编码。为便于软件的国际化,国际上一些知名公司联合制定了新的宽字节字符标准——Unicode。该标准中所有字符都是双字节的,不同的语言和字符集分别占用其中一段代码。这种用统一编码处理西文、中文及其它语言符号,就是unicode码。C++同时也支持宽字符类型(wchar_t),或称双字节字符型。

实型和双精度型都用来存放实数,两者表示的实数精度不同。实数在内存中以规范化的浮点数存放,包括尾数、数符和阶码。数的精度取决于尾数的位数,32位机上实型为23位(因规范化数的数码最高位恒为1,不必存储,实际为24位),双精度为52位。逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++6.0中为1个字节。布尔型在运算中可以和整型相互转化,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(signed)有符号整型4-231

(231-1)unsigned(int)无符号整型40(232-1)(signed)long(int)有符号长整型4-231

(231-1)unsignedlong(int)无符号长整型40(232-1)float实型4-1038

1038double双精度型8-10308

10308longdouble长双精度型8-10308

10308void无值型0无值VC++中所有基本数据类型2.1.6常量在程序的执行过程中,值保持不变的量称为常量字面常量,指程序中直接给出的量;常量的值在程序执行过程中保持不变;并且存储在程序区,而非数据区;根据取值和表示方法的不同,可分为以下几种:a.整形常量d.字符串常量c.字符型常量b.实型常量oka整型常量十进制表示法八进制表示法十六进制表示法其他表示法即整数,可以有多种表示方法:ok

整数的十进制表示方法十进制表示与我们熟悉的书写方式相同。如15-24ok

整数的八进制表示

八进制表示以0开始,由数字07组成,用来表示一个八进制数。如:012 //八进制数12,即十进制数10-0655 //八进制数-655,即十进制数-429ok

整数的十六进制表示

十六进制以0X(大小写均可)开始,由数字09和字母AF(大小写均可)组成,用来表示一个十六进制数。以下是一些常整数的例子:0x32A//十六进制数32A,即十进制数810-0x2fe0//十六进制数-2fe0,

//即十进制数-12256ok整数的其他表示方法

整型常量还可以表示长整数和无符号整数。长整型常数以L

或l

结尾,无符号常整数以U

或u

结尾,以UL

或LU(大小写均可)结尾则可表示无符号长整型常数。例如:-84L //十进制长整数-84026U //八进制表示的无符号整数260X32LU//十六进制表示的无符号长整型数32。整数结束b实型常量(1)一般形式与平时书写形式相同,由数字09和小数点组成。例如:0.23-125.760.0.46-35.(2)指数形式(也称为科学表示法)表示为尾数乘以10的次方形式,由尾数、E或e和阶数组成。指数形式要求在E或e前面的尾数部分必须有数字,后面的指数部分必须为整数。

例:判断下列表示是否合法123E12-.34e-2E41.43E3.5包含小数点和10的幂的数为实型常量,有两种表示方法:实数结束c字符型常量

字符常量是用单引号引起来的单个字符。在内存中保存的是字符的ASCII码值。在所有字符中,有些是可显示字符,通常就用单引号引起来表示:′a′ //字符a ′@′ //字符@ ′4′ //字符4 ′′ //空格字符有些是特殊情况字符,如不可显示的字符等,c++使用转义序列表示方法,如(祥见表2-3,此处略):

′\n′ //换行

′\\′//字符\字符常结束

d.字符串常量字符串常量与字符型常量的区别字符串常量″a″占两个字节,存放′a′和′\0′,值为0x6100字符型常量′a′占一个字节,存放′a′,值为0x61\0aa2.3.2结束用双引号引起来的若干个字符称为字符串常量。例如:″IamaChinese.″,″123″,″a″,″″2标识符常量及常量说明符const用常量说明符const给字面常量起个名字(标识符),这个标识符就称为标识符常量;因为标识符常量的说明和引用形式很像变量,所以也称常变量;例如:constfloatPI=3.14159;constintNumber_of_Student=100;常变量必须也只能在说明时进行初始化;常变量初始化之后,不允许再被赋值;常变量必须先说明后使用;常变量存储在数据区,并且可以按地址访问,编译时系统对常变量进行类型检查。C++建议使用常变量,而尽量不使用字面常量。2.3.3结束2.1.7变量1变量说明

2变量赋初值

变量,在程序中是指可以改变值的量;变量必须用标识符进行标识,称为变量名;变量有类型之分,如整形变量、字符变量等;任何变量都必须先说明后使用;一是便于编译程序为变量分配空间,二是便于编译时进行语法检查;变量使用的第一步,是给变量赋初始值;ok变量说明

在C++中,变量说明的一般格式为:《存储类型》数据类型变量名1《,变量名2,,变量名n》;

下面是变量说明的几个例子:inti,j,k; //说明三个整型变量i,j,kfloatx,y,z; //说明三个实型变量x,y,zcharc1,c2;//说明两个字符型变量c1,c2doubledx; //说明一个双精度型变量dx变量说明结束变量赋初值(1)变量说明时直接赋初值。例如: inta=3,b=4,c=5; floatx=3.0; (2)用赋值语句赋初值。严格的说,只有前者可称赋初值例如: floatx,e; x=3.5; e=2.71828;

结束给变量赋初值称为初始化,有两种方法:2.2基本运算符

对常量和变量进行运算是通过运算符来实现的.常量和变量通过运算符组成C++表达式,由表达式再组成C++语句.

运算符是完成对常量和变量进行运算的符号.把参与运算的对象称为操作数.按照要求的操作数的个数,运算符分为单目(一元)运算符、双目(二元)运算符和三目(三元)运算符。单目运算符只对一个操作数运算,如负号运算符“”等;双目运算符要求有两个操作数,如乘号运算符“*”等;三目运算符要求有三个操作数,三元运算符只有一个“?:”。1.算术运算符优先级运算符名称3+正,单目

-负,单目5*乘,双目

/除,双目

%求余,双目6+加,双目

-减,双目ok运算符重载:当两个操作数均为整数时,*和/重载为整乘和整除,结果为整数,除法运算后舍去小数取整。如:5/4 //结果为1,整数当两个操作数均为整数,%定义为求余运算,也称求模运算,结果为两个整数相除后的余数。如果两个整数中有负数,则先用两数绝对值求余,最后结果的符号与被除数相同。例如6%3 //结果为06%7 //结果为67%6 //结果为1C++中算术运算应注意数据溢出问题,即运算结果超出对应数据类型的表示范围。编译程序只会对除法运算时除数为0这种情况提示出错,而特别容易溢出的整数的加、减和乘法运算产生溢出的情况,系统不作为错误处理,程序将继续执行并产生错误的计算结果。因此,程序设计者必须在程序中解决检查并处理整数溢出问题。

只要有一个操作数是实数,两个操作数均转换为double型,*和/重载为普通的乘和除,结果是实数:5/4.0 //结果为1.25,实数2.关系运算符和逻辑运算符ok

关系运算符都是二元运算符,包括:(大于)、(不小于)、(小于)、(不小于)、==(等于)和!=(不等于)。关系运算符完成两个操作数大小的比较,结果为逻辑值true(真)或false(假)。每种可比较大小的数据类型,都重载了关系运算符。不同类型,自动转换为同一类型后,采用对应关系运算符进行比较。在C++中这两个逻辑值与整数之间有一个对应关系,真对应1,假对应0;反过来,0对应假,非0整数对应真。所以关系运算结果可以作为整数参与算术运算、关系运算、逻辑运算及其他运算。2.关系运算符和逻辑运算符

设有定义floata=3.2;intb=5;则:3>a>b //结果是?根据右结合原则其运算过程如下:a5b3.23>F,即0>F即0优先级运算符名称语义2!逻辑非,单目操作数的值为真,则结果为假;12&&逻辑与,双目当两个操作数全为真时,结果为真,否则为假;13||逻辑或,双目两个操作数中有一个为真,则结果为真;逻辑运算符

逻辑运算符用来进行逻辑运算。其操作数和运算结果均为逻辑量。运算结果同样可以作为一个整数参与其他运算。

由于逻辑值和整数之间的对应关系,也允许整型和字符型操作数进行逻辑运算:21&&0 //逻辑与,21与0,结果为假:021||0 //逻辑或,21或0,结果为真:1!21 //逻辑非,21的非,结果为假:0逻辑运算符位运算符(1)按位取反运算符“~”(2)左移运算符“<<”(3)右移运算符“>>”(4)按位与运算符“&”(5)按位或运算符“|”(6)按位异或运算符“^”okc++语言提供字位运算,它对操作数的各个位进行操作。(1)按位取反运算符“~”将操作数的每个二进制位取反,即1变为0,0变为1。例如,整数a的值为10011011,则~a的值为01100100。(2)左移运算符“<<”运算一般格式为:a<<n其中a为整数,n为一个正整数常数。语义为将a的二进制数依次向左移动n个二进制位,并在低位补0。左移n位相当于乘以2的n次方,但移位运算的速度比乘法快。

(3)右移运算符“>>”与左移运算符类同,将左操作数向右移动右操作数指定的二进制位数,忽略移位后的小数部分,并在高位补0。一个整数右移n位相当于除以2的n次方,但比除法快。在VC++6.0中有符号数右移时高位补符号位,严格对应除法。以上三种单目运算不影响数据本身的值,而是只产生一个中间量,这个中间量被引用后即不再存在。

(4)按位与运算符“&”将两个操作数的对应位逐一进行按位逻辑与运算。运算规则为:对应位均为1时,该位运算结果为1;否则为0。例如:a01001101b00001111a&b00001101该运算可用来将整数的某些位置0,而保留所需要的位,上例保留了低四位。(5)按位或运算符“|”将两个操作数的对应位逐一进行按位逻辑或运算。运算规则为:只要有一个数对应位为1,该位运算结果即为1;两个数对应位均为0,该位结果为0。例如:a01001101b00001111a|b01001111该运算符可用来将整数的某些位置1。上例高四位不变,低四位全1。(6)按位异或运算符“^”将两个操作数的对应位逐一进行按位异或运算。运算规则为:当对应位的值不同时,该位运算结果为1,否则为0。例如:a01001101b00001111a^b01000010该运算符可用来将一个整数的某些位取反,或将整型变量的值置0(将整型变量与自身按位异或)。上例低四位取反,高四位不变。需要说明的一点是,以上例子中的整数都只取了低8位一个字节。4.赋值运算符ok

将数据存放到相应存储单元中称为赋值,如果该单元中已有值,赋值操作以新值取代旧值;从某个存储单元中取出数据使用,称为引用,引用不影响单元中的值,即一个量可以多次引用。常量只能引用,不能赋值。赋值通过赋值运算符“=”来完成,其意义是将赋值号右边的值送到左边变量所对应的单元中。赋值号不是等号,它具有方向性。

C++将变量名代表的单元称为“左值”,而将变量的值称为“右值”。左值必须是内存中一个可以访问且可以合法修改的对象,因此只能是变量名,而不能是常量或表达式。4.赋值运算符例如下面的赋值运算是错误的:3.1415926=pi;

//左值不能是常数x+y=z;

//左值不能是表达式constintN=30;N=40;

//左值不能是常变量5.自增自减运算运算分前置和后置两种,前置是先增减后引用,即先对变量自加或自减,用新的值参与其他运算;后置则是先引用后增减,即用变量原来的值参与其他运算,然后再对变量进行自加或自减,例如:inti=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,再赋给该变量。要求:操作数只能是变量,不能是常量或表达式;oksizeof()运算符

用于计算一个操作数类型或一个变量的字节数。一般格式为:sizeof(数据类型)

或sizeof(变量名)

例如:sizeof(int)

值为4

sizeof(float)

值为4

doublex;

sizeof(x)

值为8结束2.2.2表达式1算术表达式

2关系表达式

3逻辑表达式和逻辑表达式求值的优化4赋值表达式与复合赋值表达式5逗号表达式ok1.算术表达式使用时注意:1、表达式中每个变量都有确定的值时才能进行表达式求值;2、考虑到算术运算溢出和精度问题,应避免:(1)两个很接近的数直接相减;(2)除数是一个很小的数;(3)整数的连续乘运算。ok由算术运算符连接的表达式称为算术表达式,例如:a+b*3;2.关系表达式例如:a>b>c /*等同于(a>b)>c,先求a>b的值,再将结果0或1与c比较大小*/a+b>c+d/*等同于(a+b)>(c+d),结果为0或1*/y=a>b /*计算a>b的值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;a<b&&x>y||a<b-!c按优先级与结合性,其求值顺序等同于:(a<b)&&(x>y)||(a<(b-(!c)))t1=1t2=0t4=0-&&t3=0t5=b<t6=1||

得整个表达式的值为:①②③⑥④⑤⑦13.逻辑表达式和逻辑表达式求值的优化在求逻辑表达式值的过程中,一旦表达式的值能够确定,就不再逐步进行下面的运算。称为“求值优化”。已知:

inta=10,b=20,c=30;求:a<b||c++ //结果以及a,b,c的值t1=1①整个表达式的值为1可见:表达式c++已不需要计算所以: c不变仍为30编程人员在使用逻辑运算时应当加以小心,优化计算固然提高了运算效率,但可能产生副作用。所谓副作用,就是出乎设计人员的意料,得到预想不到的结果。4.赋值表达式与复合赋值表达式

赋值表达式的格式为:

变量=表达式例如:x=5+6;a=b=c=d+1;

在C++中,所有的双目算术运算符和位运算符均可与赋值运算符组合成一个单一运算符,称为复合运赋值算符。包括以下10个:+=–=*=/=%=<<=>>=&=|=^=复合赋值运算符的要求与格式与赋值运算符完全相同,表示为:

变量复合赋值运算符表达式它等同于

变量=变量运算符表达式

例如:x+=5

等同于:x=x+5ok逗号表达式

C++中,逗号既是分隔符,又是运算符,用逗号连接起来的表达式称为逗号表达式。一般格式为:表达式1,表达式2,…,表达式n

逗号表达式中的每一个表达式都会被运算,整个逗号表达式的值为最后一个表达式的值。例如:a=(x=3,x+=6,5+6);//a=11x=92.5.2结束2.2.3不同类型数据的混合运算和赋值时的类型转换1不同类型数据的混合运算

2赋值类型转换

ok运算过程中,当某个二元运算符两边的操作数类型不同但属于类型相容时,系统先将精度低的操作数变换到与另一操作数精度相同,而后再进行运算。

所谓类型相容,指的就是类型不同但系统可以自动进行转换。当赋值号的左值和右值类型不一致但属于类型相容时,由系统自动进行类型转换。具体规则如下:(1)字符可以作为整数参与数值运算,整数值为其ASCII码。(2)操作数为字符或短整型时,系统自动变换成整型。(3)操作数为实型时,系统自动变换成双精度型。(4)其余情况,当两操作数类型不同时,将精度低(或表示范围小)的操作数的数据类型变换到与另一操作数类型相同再进行运算例如有变量:charc1,c2;inti1,i2;floatx1,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、实型数赋给整形变量:取整;注意溢出;2、整型数赋给实型变量:先转换为实型数;3、字符型数赋给整形变量:ASCII码为依据;分为两种情况:符号位是0或1时不同;若符号位为1,则低位字节不变,高位字节全部置1再赋值。4、绝对值较大的数赋给表达范围较小的数据类型时,注意溢出;2.5.4强制类型转换运算符ok其格式为:

(<type>)<表达式> //形式一或<type> (<表达式>)

//形式二作用:将表达式强制转换为<type>类型, 但表达式的值及其类型不变。任意数据类型

赋值运算中,当左值与右值类型不一致时,系统将按照左值的类型,自动进行强制转换。例如: 设有以下定义

doublex=2.3,y;inti=2,j;(1)j2.3x2.3……22(1)j=x; (2)y=i;由系统按左值j、y类型自动完成强制转换功能(2)y2i2……2.02.02.5.4强制类型转换运算符第三章:简单输入/输出3.1cincin用来在程序执行期间给变量输入数据,一般格式为:cin>>变量名1《>>变量名2>>…>>变量名n》;

cout实现将数据输出到显示器的操作,一般格式为:cout<<表达式1《<<表达式2<<…<<表达式n》;

同时必须在程序开头增加一行:#include<iostream.h>3.1.1十进制数据的输入输出请看下例:inti,j;floatx,y;cout<<”Inputi,j,x,y:”<<endl;cin>>i>>j; //Dcin>>x>>y; cout<<”i=”<<i<<′\t′<<”j=”<<j<<endl;cout<<”x+y=”<<x+y<<endl;若输入:10204.58.6<CR>则程序输出:i=10 j=20x+y=13.1输出时各数据间是无间隔的,因此应当有意输出一些间隔符ok3.1.2输入字符数据cin与cin.get()的区别(1)cin例如: charc1,c2,c3; cin>>c1;

//A

cin>>c2>>c3;

程序执行到A行时,等待用户输入数据。若输入:Abc<CR>则cin分别将字符A、b、c赋给变量c1、c2、c3。cin自动跳过输入的空白字符(包括空格,制表,backspace和回车等)。

(2)cin.get()例如: charc1,c2,c3,c4; cin.get(c1); //B cin.get(c2); cin.get(c3);程序执行到B行时,若输入:Ab<CR>则执行结果是:字符′A′、空格、字符′b′分别赋给变量c1、c2、c3;输入行中仍保留回车符。cin.get()把从键盘上输入的所有字符,包括空白字符,都作为输入字符赋给字符变量

关于字符的输出,请看下例,假定字符c1、c2、c3的值分别为字符′a′、′b′和′c′,执行以下语句序列:cout<<c1<<′\t′<<c2<<′\n′;cout<<c3<<endl;cout<<′O′<<′k′<<endl;屏幕上将输出:a bcOk输出时字符之间是无间隔的,如果想让字符间有间隔,必须输出间隔符

补充.字符串输入输出向一个字符数组中输入字符串时,用函数getline()。getline()以用户按下回车键作为结束,在此之前的所有输入都放入字符数组中:cin.getline(char[],int)其中第一个参数是已经定义的字符数组名,第二个参数是读入字符的最多个数n(包括字符串结束符‘/0’)。ok常用cout输出字符串。双引号中的字符串常量照原样输出,程序中通常通过输出字符串常量来输出一些提示信息。字符数组将输出串结束符前所有字符。补充:字符串输入输出函数保证在执行时总会为字符串的结束符保留一个字节。当键盘的输入字符(字节)数多于(n-1)时,后面的字符不会进入字符数组,字符串结束符自动加在字符数组的最后一个字节中。当输入字符数少于该值时,字符串结束符自动加在输入到字符数组中的最后一个字符的后面。请看下例:charcity[11];cin.getline(city,10);

//输入城市名最多5个中文字cout<<“城市名:“<<city<<endl;ok如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制。例如:inti,j,k,l;cout<<”Inputi(oct),j(hex),k(hex),l(dec):”<<endl;cin>>oct>>i; //输入为八进制数cin>>hex>>j; //输入为十六进制数cin>>k; //输入仍为十六进制数cin>>dec>>l; //输入为十进制数cout<<”hex:”<<”i=”<<hex<<i<<endl;cout<<”dec:”<<”j=”<<dec<<j<<′\t′;cout<<”k=”<<k<<endl;cout<<”oct:”<<”l=”<<oct<<l;cout<<dec<<endl; //恢复十进制输出状态ok输入输出的格式控制(1)各种进制数据的输入输出执行时输出:Inputi(oct),j(hex),k(hex),l(dec):此时从键盘输入:0320x3f0xa017<CR>则输出结果为:hex:i=1adec:j=63 k=160oct:l=21由于已经在cin中指明数制,因此从键盘输入时,八进制和十六进制数可以省略其开头的0和0x标志。

在cin或cout中指明数制后,该数制将一直有效,直到重新指明用其他数制。特别注意:输入数据的格式、个数和类型必须与cin中的变量一一对应,否则不仅使输入数据错误,而且影响后面其他数据的正确输入。输入输出的格式控制为了使数据间隔开,还可以用C++提供的函数setw()指定输出数据项的宽度。例如:inti=2,j=3;floatx=2.6,y=1.8;cout<<setw(6)<<i<<setw(10)<<j<<endl;cout<<setw(10)<<i*j<<endl;cout<<setw(8)<<x<<setw(8)<<y<<endl;输出结果为:

2362.61.8使用setw()必须在程序的开始处增加:#include<iomanip.h>ok(2)设置数据间隔第4章流程控制语句4.1选择结构程序设计

对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。流程控制语句也称为过程化语句。分支语句是三种基本流程控制语句之一。C++提供以下三种分支语句:if语句

条件运算符“?:”

swith语句

4.2.1if

语句if语句有两种基本格式为:1、if(<表达式>)<语句1>;2、if(<表达式>)<语句1>else <语句2>;if语句【例4.1】输入一个年份,判断是否闰年。算法分析:假定年份为year,闰年的条件是:year%4==0&&year%100!=0||year%400==0。#include<iostream.h>voidmain(){ intyear; cout<<"输入年份:"<<endl; cin>>year; if(year%4==0&&year%100!=0 ||year%400==0) cout<<year<<"是闰年"<<endl; elsecout<<year<<"不是闰年"<<endl;}ok分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。#include<iostream.h>voidmain(){inta,b,c,max;cout<<"输入三个正数:";cin>>a>>b>>c;cout<<"a="<<a<<'\t'<<"b="<<b<<'\t‘ <<"c="<<c<<endl;if(a>b)max=a;elsemax=b;if(c>max)cout<<“最大数为:”<<c<<endl;elsecout<<“最大数为:”<<max<<endl;}if

语句【例4.2】从键盘上输入三个整数,输出其中的最大数。ok

if语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。if语句可实现二选一分支,而嵌套if语句则可以实现多选一的多路分支情况。嵌套有两种形式,第一种是嵌套在else分支中:if(<表达式1>)<语句1>;elseif(<表达式2>)语句2;elseif…else<语句n>;

第二种是嵌套在if分支中为:if(<表达式1>)if(<表达式2>)<语句1>;

else<语句2>;

if语句//方法1:采用if中嵌套形式#include<iostream.h>voidmain(){ inta,b,c,max; cout<<"输入三个正数:"; cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl; if(a>b)if(a>c)max=a;//a>b且a>c elsemax=c;//a>b且a<c else if(b>c)max=b;//a<=b且b>c elsemax=c;//a<=b且b<c cout<<"最大数max="<<max;}if

语句【例3.3】用嵌套if语句完成【例3.2】的任务。ok//方法2:采用else中嵌套形式#include<iostream.h>voidmain(){ inta,b,c,max; cout<<"输入三个正数:"; cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl; if(a>b&&a>c)max=a; elseif(b>a&&b>c)max=b; elsemax=c; cout<<"最大数为:max="<<max;}if

语句ok

要特别注意else和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)cout<<n<<″是15的倍数″<<endl;elsecout<<n<<″是3的倍数但不是5的倍数″<<endl;//语句2:if(n%3==0){if(n%5==0)cout<<n<<″是15的倍数″<<endl;}elsecout<<n<<″不是3的倍数″两个语句的差别只在于一个“{}”,但表达的逻辑关系却完全不同。【例4.4】某商场优惠活动规定,某种商品单价为80元,一次购买5件以上(包含

5件)10件以下(不包含10件)打9

折,一次购买10件以上(包含10件)打8折。设计程序根据客户的购买量计算总价。if

语句算法1、输入购买件数count,设置单价price=80(元)2、根据count值确定折扣discount;3、实际售价amount=price*count*discount;4、输出amount的值。算法细化:2.1、if(count<5)discount=1;2.2、if(count>=5&&count<10)discount=0.9;2.3、if(count>=10)discount=0.8;ok#include<iostream.h>voidmain(){floatprice=80,discount,amount;//单价,折扣,总价

intcount; //购买件数

cout<<"输入购买件数:"<<endl;cin>>count;if(count<5)discount=1;elseif(count<10)discount=0.9;elsediscount=0.8;amount=price*count*discount;cout<<"购买件数:"<<count<<endl;cout<<"单价:"<<price<<'\t'<<"折扣:“

<<discount<<endl;cout<<"总价:"<<amount<<endl;}请在VC++平台上运行,输入不同的件数,使程序所有分支都可以被执行一次。ok【例4.5】求一元二次方程

ax2+bx+c=0的根。其中系数a(a≠0)、b、c的值由键盘输入。分析:输入系数a(a≠0)、b、c后,令delta=b2–4ac,结果有三种情况:若delta=0,方程有两个相同实根;若delta>0,方程有两个不同实根;若delta<0,方程无实根。if

语句算法1、输入系数a(a≠0)、b、c;2、令delta=b2–4ac;3、根据delta的值求方程的根;4、输出方程的根;算法细化:3.1、if(delta==0)方程有两个相同实根;计算…3.2、if(delta>0)方程有两个不同实根;计算…3.3、if(delta<0)方程无实根;计算…ok#include<iostream.h>#include<math.h>voidmain(){ floata,b,c; floatdelta,x1,x2; constfloatzero=0.0001;//定义一个很小的常数

cout<<"输入三个系数a(a!=0),b,c:"<<endl; cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b<<'\t‘ <<"c="<<c<<endl; delta=b*b-4*a*c;求一元二次方程的根源程序if(fabs(delta)<zero){//绝对值很小的数即被认为是0 cout<<"方程有两个相同实根:"; cout<<"x1=x2="<<-b/(2*a)<<endl;}elseif(delta>0){ delta=sqrt(delta); x1=(-b+delta)/(2*a); x2=(-b-delta)/(2*a); cout<<"方程有两个不同实根:"; cout<<"x1="<<x1<<'\t'<<"x2=“ <<x2<<endl;} else //delta<0 cout<<"方程无实根!"<<endl;}请在VC++平台上运行,输入不同的系数,使程序所有分支都可以被执行一次。3.1.2条件运算符“?:”

if语句在某些情况下可以用条件运算符“?:”来简化表达。“?:”是一个三元运算符,其构成的表达式格式为:<表达式1>?<表达式2>:<表达式3>执行逻辑:先计算表达式1,若其值为真(或非0),则计算表达式2(不计算表达式3),并将该值作为整个表达式的值;反之,即表达式1的值为假或为0,则计算表达式3(不计算表达式2),并将该值作为整个表达式的值。例如:inta=6,b=7,min=a<b?a:b;//min=6 min=a<b?++a:++b;//min=7a=7b=7min=a<b?a++:b++;//min=6a=7b=7ok3.1.3switch语句用嵌套if语句可以实现多选一的情况。另外C++中还提供了一个switch语句,称为开关语句,也可以用来实现多选一:switch(表达式){case常量表达式1:《语句序列1》《break;》……case常量表达式n:《语句序列n》《break;》《default:语句序列》}

switch语句格式(1)各个case(包括default)分支出现的次序可以任意,通常将default放在最后。(2)break语句可选,如果没有break语句,每一个case分支都只作为开关语句的执行入口,执行完该分支后,还将接着执行其后的所有分支。因此,为保证逻辑的正确实现,通常每个case分支都与break语句联用。(3)每个常量表达式的取值必须各不相同,否则将引起歧义。(4)允许多个常量表达式对应同一个语句序列。例如:charscore;cin>>score;switch(score){case′A′:case′a′:cout<<″excellent″; break;case′B′:case′b′:cout<<″good″;break;default:cout<<″fair″;}(5)从形式上看,switch语句的可读性比嵌套if语句好,但不是所有多选一的问题都可由开关语句完成,这是因为开关语句中限定了条件表达式的取值类型。

okswitch语句例子【例3.6】

运输公司对所运货物实行分段计费。设运输里程为s,则运费打折情况如下:

s<250 不打折扣

250<=s<500 2%折扣

500<=s<1000 5%折扣

1000<=s<2000 8%折扣

2000<=s<3000 10%折扣

3000<=s 15%折扣设每公里每吨的基本运费为p,货物重量为w,折扣为d,则总运费f为:f=p*w*s*(1-d)设计程序,当输入p、w和s后,计算运费f。算法1、输入每吨运费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:d=0.02;break;case2:case3:d=0.05;break;case4:case5:case6:case7:d=0.08;break;case8:case9:case10:case11:d=0.1;break;default:d=0.15;}s<250 不打折扣250<=s<500 2%折扣500<=s<1000 5%折扣1000<=s<2000 8%折扣2000<=s<3000 10%折扣3000<=s15%折扣#include<iostream.h>#include<iomanip.h>voidmain(){intc,s;floatp,w,d,f; cout<<"输入运输单价p,重量w和里程s:"<<endl; cin>>p>>w>>s;c=s/250; switch(c){ case0:d=0;break; case1:d=0.02;break; case2:case3:d=0.05;break; case4:case5:case6:case7:d=0.08;break; case8:case9:case10:case11:d=0.1;break; default:d=0.15;} f=p*w*s*(1-d); cout<<"运输单价为"<<p<<'\t'<<"重量为"<<w<<'\t‘ <<"里程为"<<s<<endl; cout<<"折扣为"<<d<<endl; cout<<"运费为"<<f<<endl;}请在VC++平台上运行,输入不同的里程,使程序所有分支都可以被执行一次。ok【例3.7】

设计一个计算器程序,实现加、减、乘、除运算。分析:读入两个操作数和运算符,根据运算符完成相应运算。#include<iostream.h>voidmain(){floatnum1,num2;charop;cout<<"输入操作数1,运算符,操作数2:"<<endl;cin>>num1>>op>>num2;switch(op){case'+':cout<<num1<<op<<num2<<"="<<num1+num2<<endl;break;case'-':cout<<num1<<op<<num2<<"="<<num1-num2<<endl;break;case'*':cout<<num1<<op<<num2<<"="<<num1*num2<<endl;break;case'/':cout<<num1<<op<<num2<<"="<<num1/num2<<endl;break;default:cout<<op<<"是无效运算符!";}}常量表达式采用字符型,上机运行一下。循环控制语句是三种基本流程控制语句之一。C++提供以下三种循环语句:while语句

do-while语句

for语句4.3循环结构程序设计4.3.1while语句while语句也称为当循环。语句格式为:while(表达式)

循环体语句;

图3.1while语句的执行流程图求表达式的值表达式值为真?是否执行循环体语句while语句【例4.8】求1+2+3+4的值。okN个连续整数相加算法1、设置变量i用来放被加数,变量sum用来放和值,并初始化;2、从第一个数开始,依次将被加数赋给i,并进行操作sumsum+i;3、输出sum;细化算法2:

while(还有被加数) { i=当前被加数;

sum+=i;i准备接受下一个被加数;

}源程序如下:#include<iostream.h>voidmain(){inti=1,sum=0;//循环初始条件

while(i<=4){ sum+=i; i++; //修改循环条件

}cout<<"sum="<<sum<<endl;

}在VC++平台上运行,试一试是否正确okwhile语句注意:在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。C++表达方式灵活,上例中的循环语句还可以写成:while(i<=n)sum+=i++;或者while(sum+=i++,i<=n);//循环体为空语句修改程序后在VC++平台上运行,看是否正确4.3.2do-while语句

do-while语句称为直到循环,格式为:

do循环体语句

while(表达式)

否是表达式的值为真?执行循环体语句求表达式的值图3.2do-while语句的执行流程图do-while语句do/while语句和while语句的区别:多数情况下可以互相替代。区别是do/while语句至少执行一次循环体后再判断循环条件是否满足;while语句先判断条件是否满足,然后才执行循环体。【例4.9】

输入一段文本,统计文本的行数、单词数及字符数。假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行。算法分析:1、逐个读入文本中的字符,直到读到一个输入结束符EOF为止。2、如何算行数?行结束标志为读到字符′\n′;3、如何算单词数?设一个变量isword,读到字符时isword=1,读到间隔符时isword=0;如果读到一个间隔符而此时isword值为1,则说明刚读完一个单词;(如果读到一个字符而此时isword值为0,则说明刚开始读一个单词;)4、如何算字符数?do-while语句ok算法1、设置变量line、word、ch分别代表行数、单词数、非分隔字符数,并初始化;设置变量isword来辅助统计单词数;2、do{ 从键盘读入一个字符c;

if(c==’\n’)line++; if(是单词开头)word++; if(c不是分隔符)ch++; }while(c!=EOF);3、输出统计结果。将下面的程序在VC++平台上运行,试一试是否正确#include<iostream.h>voidmain(){charc;intline=0,word=0,ch=0;//ch为非分隔字符数intisword=0;do{c=cin.get();if(c==′\n′)line++;//遇换行符行数+1if(c!=′′&&c!=′\t′&&c!=′\n′){//读到非间隔符

if(isword==0)word++;//在单词的起始处给单词数+1ch++; //字符数加+1isword=1;}elseisword=0; //读到间隔符}while(c!=EOF);cout<<”行数:”<<line<<endl;cout<<”单词数:”<<word<<endl;cout<<”字符数:”<<char<<endl;}4.3.3for语句for循环语句的格式为:for(<表达式1>;<表达式2>;<表达式3>)<循环体语句>图3.3for语句的执行流程图否是求表达式1的值求表达式2的值表达式2值为真?执行循环体语句求表达式3的值okfor语句、while语句、do/while语句实现相同的功能:1+2+3+4inti=1,sum=0;

//循环初始条件while(i<=4)

{sum+=i;i++;

//修改循环条件

}inti=1,sum=0;//循环初始条件do{ sum+=i; i++;//修改循环条件

}while(i<=4);for(inti=1,sum=0;i<=4;i++){ sum+=i;}/*习惯上:表达式1:循环初始条件;表达式2:循环终止条件;表达式3:修改循环条件*/okfor语句的应用for语句的几点说明:1、是先判断型的,同while语句;2、使用更为灵活:三个表达式可以是任意表达式,因此他们就可以实现循环初始化、计算、修改循环条件等任务,而不一定非在循环体中进行;

for语句的应用【例4.11】设计程序输出Fibonacii数列的前20项,要求每行输出5个数据。Fibonacii数列定义如下:算法分析:除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量;属递推算法。算法:1、设置变量n表示第几项,变量f1和f2用来记住当前项f3之前的两项;变量初始化n=0;2、while(当前项不到第20项)

{ if(当前项是第0项)f1=0; if(当前项是第1项)f2=1;if(当前项是第2项或更高项)f3=f1+f2;

按要求输出f3;f1=f2;f2=f3;//记住最近两项 当前项后移一位;

}【例3.11】设计程序输出Fibonacii数列的前20项,要求每行输出2个数据。Fibonacii数列定义如下:程序如下://文件名:Ex3_11.cpp#include<iostream.h>#include<iomanip.h>voidmain(){intfib0=0,fib1=1,fib2; cout<<setw(5)<<fib0<<setw(5)<<fib1<<endl; for(intn=3;n<=20;n++){ fib2=fib0+fib1; cout<<setw(5)<<fib2; if(n%5==0)cout<<endl;

//控制每行2个数据

fib0=fib1;fib1=fib2;}}for语句的应用在VC++平台上运行运行结果:0 1 1 2 3 5 8 13 21 3455 89 144 233377610 987 159725844181【例4.12】输入一个不超过5位的整数,将其反向后输出。例如输入247,变成742输出。算法分析:1、将整数的各个数位逐个位分开,用一个数组保存各个位的值,然后反向组成新的整数。2、将整数各位数字分开的方法是,通过求余得到个位数,然后将整数缩小十倍,再求余,并重复上述过程,分别得到十位、百位……,直到整数的值变成0为止。

for语句的应用ok数据:1、设置变量num表示输入的整数,整型数组digit[5]用来存放num的各个位;变量i用来表示数组的当前下标;算法:1、输入num;变量初始化:i=0;2、while(num!=0){ num对10取余,得num的当前个位数digit[i];

num整除10,即去掉个位数,十位变个位,百位变十位,……;

i++;数组digit准备记录下一位;}3、将数组元素按下标从高到低的顺序输出;程序如下:#include<iostream.h>vo

温馨提示

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

评论

0/150

提交评论