




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章导读C++语言背景3个简单的C++程序C++程序开发流程VisualC++环境介绍
§1.1引言用于编写计算机程序的语言称为程序设计语言。程序设计语言按其发展的先后可分为机器语言、汇编语言和高级语言。
机器语言是由“0”和“1”构成的二进制代码,能被计算机直接理解和执行。汇编语言将二进制代码映射为一些人们可以读懂的助记符,如ADD、SUB等,同时又用变量取代地址。高级语言是更接近自然语言的程序设计语言,其易学易用、通用性强、移植性好,便于各类人员学习和使用。
1.2C++语言背景C++是从C语言发展演变过来的,是C语言的超集。
C++支持面向对象的程序设计方法,特别适合大中型软件开发项目。无论开发效率、软件的可重用性、可扩充性、可维护性和可靠性都具有很大的优越性。由于对C语言的完全兼容,很多C语言程序可以不经修改就可以被C++编译通过。
【例1.1】在屏幕上显示“HelloWorld!”。//Examplee1_1.cpp#include<iostream>//预处理,包含基本输入输出库#include<cstring>//预处理usingnamespacestd;//使用名字空间stdintmain()//主函数{ cout<<"Helloworld!"<<endl;/*屏幕显示*/ return0;//函数完成,返回0}
运行结果如图1-1:1.3第1个程序1.注释(comment)。注释用来说明和提高程序的可读性,也可以帮助其它人阅读和理解程序。运行程序时,注释语句并不使计算机产生任何操作。C++编译器忽略注释误句,不产生任何机器目标码。C++有两种注释方法,一是以//开头,二是以/*开头,以*/结束。2.预处理#include是预处理指令(preprocessor),是发给C++预处理器的消息。预处理器先处理以#开头的语句之后再编译该程序。本质上,预处理替换带有特殊文件内容的指令。iostream和cstring这两个文件包含了程序将用到的输入输出实用程序。程序说明3.名字空间(namespace)说明程序将使用到对象,名字用于特殊的std范围内,这个特殊范围包含许多预定义对象的名字。4.主函数C++程序包含一个或多个函数,其中有且只有一个main函数。左花括号“{”应放在每个函数体(body)开头,对应右花括号“}”应放在每个函数的结尾。一对花括号之间是函数体。cout<<"Helloworld!"<<endl;是一条语句,每条语句应以分号(又称为语句终止符)结束。return0表示函数执行完毕后返回。
程序说明§1.4第2个程序【例1.2】编写程序,求s=1+2+3+…+n的值。//Examplee1_2.cpp#include<iostream>#include<cstring>usingnamespacestd;intsum(intn){for(inti=1,s=0;i<=n;i++) s=s+i;returns;}intmain(){intn;cout<<"Pleaseinputn:";cin>>n;//输入语句,给n赋值cout<<"1+2+...+"<<n<<"=“<<sum(n)<<endl;return0;}1.函数调用除了main函数,还有用户设计的sum函数,sum函数返回运算结果并由main函数中的cout输出。main函数可以调用sum函数,程序转到sum,完成后又返回到main函数。
2.算法
sum函数实现了求1到n的和的任务。其实,解决问题的方法就是算法。算法需要用计算机语言表现出来。
§1.4第2个程序【例1.2】编写程序,分别求1+2+3+…+100和5!
§1.5第3个程序//Examplee1_3.cpp#include<iostream>#include<cstring>usingnamespacestd;classcomputer{public: sum(intn){ s=0; for(inti=1;i<=n;i++) s=s+i; }voidfactorial(intn){s=1;for(inti=1;i<=n;i++)s=s*i;}voidprint(){cout<<“结果是:”<<s<<endl;}private:ints;};
intmain(){ computerc,d; c.sum(100); c.print();d.factorial(5); d.print(); return0;}§1.5第3个程序面向对象的程序设计方法类computer,这个类包含两个成员函数:求和函数sum和求阶乘函数factorial
§1.6C++程序开发流程1.需求分析2.编辑程序3.编译4.连接5.运行§1.7VisualC++6.0简介1.7.1VisualC++界面VisualC++6集成开发环境,被划分成四个主要区域:菜单和工具栏、工作区窗口、代码编辑窗口和输出窗口:
项目工作区窗口代码窗口输出窗口1.7.1VisualC++界面1.菜单栏VisualC++菜单栏包含了开发环境中几乎所有的命令,它为用户提供了代码操作、程序的编译、调试、窗口操作等一系列的功能。与一般Windows应用程序一样有:文件、编辑、视图、插入、工程、编译、工具、窗口、帮助等菜单。2.工具栏通过工具栏,可以迅速地使用常用的菜单命令。最常用的工具栏是标准工具栏,当鼠标指向这些工具时,通常有信息提示工具的含义,因此,也比较容易掌握。若要显示或隐藏某个工具栏,则在任一工具栏的快捷菜单中选择相应的命令即可。1.7.1VisualC++界面3.项目工作区项目是开发一个程序时需要的所有文件的集合,而工作区是进行项目组织的工作空间。利用项目工作区窗口可以观察和存取项目的各个组成部分。在VisualC++中,一个工作区可以包含多个项目。项目工作区有ClassView、Resource和FileView三个选项卡,分别用来浏览当前项目所包含的类、资源和文件。在VisualC++中,项目中所有的源文件都是采用文件夹的方式进行管理的,它将项目名作为文件夹,在此文件夹下包含源程序代码文件(.cpp、.h),项目文件(.dsp)以及项目工作区文件(.dsw)等。若要打开一个项目,只需打开对应的项目工作区文件即可。1.7.1VisualC++界面4.代码窗口一般位于开发环境中的右边,各种程序代码的源文件、资源文件、文档文件等都可以通过该窗口显示。5.输出区输出区有多个选项卡,最常用的是“编译”。在编译、连接时,这里会显示有关的信息,供调试程序用。6.状态栏状态栏一般位于开发环境的最低部,它用来显示当前操作状态、注释、文本光标所在的行、列号等信息。
1.7.2
C++程序的开发过程
1.创建空工程
2.创建C++源文件
1.7.2
C++程序的开发过程
1.7.2
C++程序的开发过程3.编译、连接和运行编译、连接和运行可以分别执行。(1)编译(Ctrl+F7)选择“编译
编译e1_1.cpp”命令。编译结果显示在输出区中,如果没有错误,则生成Exl2_1.obj;(2)连接(F7)选择“编译
构建e1_1.exe”命令。连接信息显示在输出区中,如果没有错误,则生成TEST.exe;(3)运行(Ctrl+F5)
本章介绍了C++的发展历史和语言背景。通过3个不同层次程序的介绍,展示了C++程序的特点和样式。示例中展示了很多重要的C++程序要素,包括:语句、预处理、注释、类等;本章最后介绍了VisualC++6.0编程环境并说明了一个程序从建立到编译运行的过程。
总结本章导读
标识符和关键字数据类型概述基本数据类型常值和变量运算符、表达式与语句宏定义其他运算符与语句
cin和cout2.1标识符和关键字
标识符是程序中用来给变量、函数、数组、类、命名空间起的名称。其命名规则如下:由大小写英文字母、数字和下划线组成,而且不能以数字开头。标识符区分大小写。标识符的有效长度取决于编译系统,如VisualC++规定最长247个字符,TurboC++规定最长32个字符。一般建议尽量简短。标识符不能和关键字同名。关键字asmdefaultfloatoperatorstatic_castunionautodeleteforprivatestructunsignedbooldofriendprotectedswitchusingbreakdoublegotopublictemplatevirtualcasedynamic_castifregisterthisvoidcatchelseinlinereinterpret_castthrowvolatilecharenumintreturntruewchar_tclassexplicitlongshorttrywhileconstexportmutablesignedtypedef.const_castexternnamespacesizeoftypeid..continuefalsenewstatictypename
§2.2
数据类型概述长双精度浮点型(longdouble)空数据类型数据类型基本数据类型布尔型(bool)字符型(char)整型(int)长整型(long)短整型(short)有符号整型(signed)无符号整型(unsigned)浮点型(float)单精度浮点型(float)双精度浮点型(double)复杂数据类型指针数据类型(pointer)结构(struct)联合(union)枚举(enum)类(class)§2.3基本数据类型类型名称长度取值范围布尔型bool布尔型或逻辑型1false(假)或true(真)字符型char字符型1-128~127signedchar有符号字符型1-128~127unsignedchar无符号字符型10~255
整
型short或shortint短整型2-32768~32767signedshort或signedshortint有符号短整型2-32768~32767unsignedshort或unsignedshortint无符号短整型20~65535int整型4-2147483648~2147483647signed或signedint有符号整型4-2147483648~2147483647unsigned或unsignedint无符号整型40~4294967295long或longint长整型4-2147483648~2147483647signedlong或signedlongint有符号长整型4-2147483648~2147483647unsignedlong或unsignedlongint无符号长整型40~4294967295实
型float单精度型43.4×10-38~3.4×1038double双精度型81.7×10-308~1.7×10308longdouble长双精度型101.2×10-4932~3.4×104932说明:1.以上字节数是基于32位系统的,对于16位系统,int、unsignedint、signedint为2字节。2.float类型数据有效数字为7位,double类型数据有效数字为15位,double类型数据有效数字为19位,其取值范围可能因为机器的不同有微弱的差别。3.VisualC++6.0中double和longdouble相同。
§2.3基本数据类型§2.3基本数据类型2.3.1字符型字符型数据指通常所说的字符,采用ASCII编码(见附录)来表示,存储时占用一个字节。字符数据的书写形式是用单引号括起的单个字符,例如用'A'、'a'、'1'、'2'分别表示A、B、1、2字符等,以区别于源程序中所用的字符。字符数据主要用于表示信息,例如程序的输入和输出信息。2.3.2整型整型用来描述整数,整型所占有的字节数与具体硬件有关,C++中整型分为短整型(short)、基本整型(int)、长整型(longint),每个整数类型根据有无符号,又分为有符号(signed)和无符号(unsigned)两种。§2.3基本数据类型2.3.3实型实型用来描述实数,又称浮点型。根据表示实数的精度不同,C++的实型分为:单精度型float,双精度型double和longdouble。实型也可以用科学记数法表示,例如:3.4E-38,其中3.4是尾数,-38是阶码。2.3.4布尔型布尔型数据用来表示逻辑数据。布尔逻辑值只包含两种:真(true)或假(false),true的值为整数1,false的值为整数0。非布尔型数据在运算中可以和布尔型数据互换,0为false,非零值为true。2.3.5void型void型为无值型,其数据长度为空,主要用于定义无返回值的函数和无类型指针。§2.4常量和变量2.4.1常量在程序运行过程中,其值不能改变的量称为常量。1.字面常量⑴整型常量.十进制表示:要求第1个数字不能为0(整数0除外),如:35,-16等;.八进制表示:要求以0开头,由数字0~7组成,如:065,021等.十六进制表示:要求以0X或0x开头,由数字0~9和字母a~f(或者A~F)组成,如:0x12,0x2F等。
⑵实型常量C++中实型常量有一般形式和指数形式两种表示方法。.一般形式由数字0~9和小数点“.”组成,如:0.12,-12.3,.03等;.指数形式由尾数,E或e和阶数组成,如:1E12,-.3E9等。实型数也可以加后缀f、d、和l(或F、D、和L)。⑶字符型常量字符型常量是由单引号括起来的单个字符
§2.4常量和变量转义字符字符ASCII值含义十进制十六进制\aBEL70x07响铃\bBS80x08退格(相当于Backspace)\fFF120x0C换页\nLF100x0A换行\rCR130x0D回车(Enter)\tHT90x09水平制表符(Tab)\vVT110x0B纵向制表符\0空00x00空字符\\\920x5C反斜杠\’‘390x27单引号\”“340x22双引号\ddd可表示任意字符0~127\000~\0771到3位8进制数所代表的字符\xhh可表示任意字符0~127\x00~\xFF1到2位16进制数所代表的字符//Exampleex2_1.cpp#include<iostream>#include<cstring>usingnamespacestd;intmain(){cout<<"\x07operation\tsystem\n";cout<<'\101'<<'\t'<<'A'<<'\012';return0;}【例2.1】演示转义字符。⑷字符串常量用双引号括起来的若干个字符称为字符串常量,如:"Helloworld!"、"78"字符串常量在内存中顺序存放字符串中每个字符,并以转义字符“\0”作为字符串的结束字符。因此,字符串占用的实际字节数为字符串的长度加1。字符常量和字符串常量的区别如下:"A"//占两个字节,'A'和'\0',存放值为0X4100'A'//占一个字节,'A',存放值为
0X412.4.1常量2.4.1常量2.标识符常量标示符常量是指有名字的常量。C++程序中标识符常量需要先定义后使用。定义标识符常量有两种方式:l
使用const说明符。这样的标识符常量常被称为常变量,格式为:
const类型名常量名=值例如:constdoublePI=3.14159;常变量必须在说明时进行初始化,而且初始化之后不允许再赋值。l
另外一种方法是采用编译预处理命令。格式为:
#define常量名值例如:
#definePI3.14159标识符常量必须先说明后引用,与字面常量相比,标示符常量增加了程序的可读性和可维护性。例如PI值如果用字面常量3.14159来处理,那么如果要修改其精度时,在程序中所有使用的3.14159的地方都需要修改,而标示符常量只要在说明处修改即可。
§2.4.2变量
在程序运行过程中,其存储的值可以被改变的量,被称为变量。变量必须通过标识符进行说明,称为变量名。变量名和内存单元地址存在映射关系,程序可以通过变量名寻址,从而访问其存储的数据。
§2.4.2变量1.变量的说明在C++中,变量说明的格式为:[存储类型]数据类型变量名1[,变量名2,…,变量名n];其中[]括起来的部分为可选项,省略号为多次重复。如:inti,j,k;floatx;longa,b,c;变量具有4个基本要素:名字、类型、初值和作用域。
§2.4.2变量
变量名为标识符的一种,符合标识符的命名规则。变量的名称尽可能简短并有一定的含义,例如:number、total等。变量的数据类型可以是基本数据类型也可以是复杂数据类型,变量的数据类型不仅规定了变量所占内存空间的大小,也规定了该变量上的相应操作。变量的作用域是指变量在程序中有定义的范围,即该变量名在某段代码区域是否有意义。变量在说明时由存储类型来规定其作用域,从作用域的角度出发,可将变量分为全局变量和局部变量。在函数内或在块语句内定义的变量,只能在函数体内或块体内使用,所以被称为“局部变量”,这一部分内容将在后面函数章节中详细介绍。
§2.4.2变量
给变量赋初值有两种方式:
①变量说明时直接赋初值,称之为变量的初始化。如:
inta=10;floatx=3.0,y=1.0,z=2.0;②用赋值语句赋初值,如:
floatx;
x=10.0;没有被赋值的变量其初值取决于存储类型,静态存储的变量将自动为0,否则被随机初始化。定义的变量可以被多次引用,其值可以被随时修改。
§2.5运算符、表达式与语句2.5.1运算符和表达式
在程序中对变量和常量进行运算或处理的符号称为运算符,参与运算的对象被称为操作数。
(1)运算符的功能;(2)运算符与操作对象即操作数(包括常量、变量、函数调用等)的关系:①要求操作数的个数(单目、双目、三目);②要求操作数的类型(如求余运算符%要求操作数是整型);③结合方向(操作数到运算符)::左结合、右结合(单目、赋值类、条件运算符);(3)运算符的优先级;(4)运算结果的数据类型:不同类型数据运算将发生类型转换。
1.算术运算符及算术表达式C++中的算术运算符共有7个,分别为:+(正)、-(负)、+(加)、-(减)、*(乘)、/(除)、%(取模,或称求余运算符)
2.关系运算符及关系表达式C++中的关系运算符共有6个,分别为:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于)3.逻辑运算符及逻辑表达式C++中有3种逻辑运算符,分别为:!(逻辑非)、&&(逻辑与)、||(逻辑或)2.5.1运算符和表达式
4.位运算符及位运算表达式C++提供的位运算符共有6个,分别为:~(按位取反)、<<(左移)、
>>(右移)、&(按位与)、|(按位或)、^(按位异或)
2.5.1运算符和表达式
5.自增、自减运算符(++、--)自增、自减运算符的功能是使变量的值增1或减1,分别有以下两种格式:++k和k++、--k和k--++是自增运算符。++k或k++都是让变量k的值加1。--是自减运算符。--k或k--都是让变量k的值减1。
//Examplee2_2.cpp#include<iostream.h>intmain(){ inta=3,b,c; b=++a; cout<<"a="<<a<<'\t'<<"b="<<b<<endl; c=a++; cout<<"a="<<a<<'\t'<<"c="<<c<<endl; b=--a; cout<<"a="<<a<<'\t'<<"b="<<b<<endl; c=a--; cout<<"a="<<a<<'\t'<<"c="<<c<<endl; c=a+++b; cout<<"a="<<a<<'\t'<<"c="<<c<<endl;
return0;}【例2.2】自增与自减运算符6.赋值运算符及赋值表达式⑴赋值号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如:a=3;也可以将一个表达式的值赋给一个变量,如:r=x%y;⑵复合的赋值运算符在C++中,可以在赋值运算符之前加上其他运算符,构成复合赋值运算符。共有10种复合赋值运算符:+=-=*=/=%=<<=>>=&=∧=|=前5种是算术运算符组成的复合赋值运算符,由算术运算符和复合赋值运算符结合在一起;后5种是位运算符组成的复合赋值运算符,由位运算符和赋值运算符结合在一起。参加算术复合赋值运算的两个运算数,先进行算术运算,然后将其结果赋给第一个运算数。
2.5.1运算符和表达式7.优先级和结合性优先级运算符名称结合方向1()括号,改变优先级从左至右::作用域运算符[]数组下标.,->成员选择运算符.*,->*成员指针选择运算符2++,--自增,自减运算符从右至左&取地址*取内容!逻辑求反~按位求反+,-正,负号(数据类型)强制转换sizeof计算数据类型长度new,delete动态内存分配和释放优先级运算符名称结合方向3*,/,%乘法,除法,求余
从左至右4+,-加,减5<<,>>左移,右移6<,<=,>,=>小于,小于等于,大于,大于等于7==,!=等于,不等于8&按位与9^按位异或10|按位或11&&逻辑与12||逻辑或13?:条件运算符14=,+=,-=*=,/=%=,<<=,>>=&=,∧=,|=赋值运算符从右至左15,顺序运算符从左至右语句是C++程序中的基本单位,C++中的语句可以分为以下几种:1.表达式语句表达式语句由表达式与分号组成,为最简单的语句,其语法格式为:表达式;2.空语句只有一个分号构成的语句被称为空语句。3.复合语句由一对“{}”括起来的一组语句构成一个复合语句,复合语句在语法上起一个语句的作用,单个语句必须以“;”结束,而复合语句的结束符为“}”4.流程控制语句流程控制语句用来控制或改变程序的执行流程,主要有选择语句和循环语句。2.5.2语句§2.6类型转换2.6.1类型转换概述
三种方式:
类型自动转换、赋值类型转换和强制类型转换
1.不同数据类型的差异
(1)float<double(2)(char,short,int,long)<(float,double)(3)char<short<int<long(4)signed<unsigned2.数据类型转换产生的6种效果(1)数据类型提升与降格(2)为保持数值不变,整型短数据转换成整型长数据时将产生符号位扩展与零扩展。(3)最高位失去符号位功能(signed型转换成unsigned型)与变成符号位(unsigned型转换成signed型):长度不变,数值可能改变(4)丢失精度(5)截去高位(溢出)产生数值的变化:发生在长的整型数据转换成较短类型的整型数据时。(6)给实数赋值,float型只能接受7位有效数字,double型只能接受16位有效数字,多给无效。§2.6数据类型转换系统自动按运算顺序将低级的数据直接转换成高级的数据,以保证运算的精度,具体规则为:
(1)float
在运算时自动转换成double;
(2)char和short在运算时自动转换成整型数据int;
(3)int和unsigned混合运算时,将整型数据转换成无符号整型数据,即是用补码参加运算,不会影响结果的正确性;
(4)int或unsigned与long混合运算时,都转换成long型。
(5)int、unsigned、long与浮点型数据混合运算时,都转换成浮点型数据(double)。§2.6.2
自动类型转换
高doublefloatlongchar,shortunsigned低自动类型转换规则int§2.6.2
自动类型转换§2.6.3
赋值类型转换
赋值运算时,如果赋值运算符两侧的类型(指基本类型)不一致,系统自动将表达式的值转换成变量的类型存到变量的存储单元,转换的结果可能会:(1)当整型数据赋给浮点型变量时,数值上不发生任何变化,但有效位增加。如:
float
f;f=4;
/*内存中变量f的值为4.000000*/§2.6.3
赋值类型转换
(2)当单、双精度浮点型数据赋给整型变量时,浮点数的小数部分将被舍弃。如:
intx=4.35;/*内存中变量x的值为4,精度丢失。如果赋的值绝对值很大则将溢出。*/(3)将字符型数据赋给整型变量时,由于字符型数据在运算时根据其ASCII码值自动转化为整型数据,所以将字符型数据的ASCII码值存储到变量中。如:
intx;x='a';/*内存中变量x的值为97*/(4)将有符号的整型数据赋给长整型变量,系统要进行符号位扩展。将无符号的整型数据赋给长整型变量时,只需0扩展即可。(5)将长整型数据赋给整型变量或将整型数据赋给字符型变量,都有可能溢出。例如:
charch=321;溢出后ch的值为'A'。§2.6.3
赋值类型转换
(6)同长度有符号整型数据赋给无符号整型变量时,数据将失去符号位功能。例如:
unsignedu=-1;则u的值为65535。(7)同长度无符号整型数据赋给有符号整型变量时,数据将得到符号位功能。例如:
inti=65535u;则i的值为-1。以上(2)、(5)、(6)、(7)将可能改变所赋数据的值。§2.6.3
赋值类型转换
§2.6.4强制类型转换
利用强制类型转换运算符将一个表达式的值强制转换成所需类型。即:
(类型名)(表达式)
强制类型转换的作用主要有:①使某些数据(例如实型数据)能够进行某种类型(例如求余)运算②设计四舍五入算法,例如将一个实数保留两位小数:设实数f,则(int)(100*f+0.5)/100.0即可实现该算法。③利用动态存储分配建立链表等等。强制类型转换由于是程序员主动进行的类型转换,一般不会发生意想不到的问题。
本节我们介绍了C语言数据类型转换的问题,在自动类型转换、赋值类型转换和强制类型转换中,我们重点要防止赋值类型转换中存在出现的问题,为此,我们在程序设计时要掌握几条原则:(1)要避免数值的变化:避免signed型与unsigned型之间的数据转换;注意计算或输入中数值范围不超过使用类型的数值范围,以防数据溢出,否则定义较高数据类型。(2)使用数据类型时应尽量避免丢失精度,必要时定义较高的数据类型§2.6数据类型转换-小结§2.7编译预处理2.7.1宏定义1.不带参数的宏定义用一个指定的标识符(即名子)来代表一个字符串,它的一般形式为:#define标识符字符串这就是已经介绍过的定义符号常量。如:#definePI3.1415926它的作用是指定用标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。
§2.7编译预处理2.带参数的宏定义这种宏定义不是进行简单的字符串替换,还要进行参数替换。其定义的一般形式为:#define宏名(参数表)字符串字符串中包含在括弧中所指定的参数。如:#defineS(a,b)a*barea=S(3,2);定义矩形面积S,a是b是边长。在程序中用了S(3,2),用3、2分别代替宏定义中的形式参数a、b,即用3*2代替a*b,因此赋值语句展开为:area=S(3,2);§2.7编译预处理2.7.2文件包含所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来。即将另外的文件包含到本文件之中。C++提供了#include命令用来实现“文件包含”的操作。其一般形式为#include"文件名"或#include<文件名>§2.7编译预处理2.7.3条件编译一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令有以下几种形式:第1种形式:#ifdef标识符程序段1#else程序段2#endif它的作用是当所指定的标识符已经被define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。其中#else部分可以没有,即可以简化为:#ifdef标识符程序段1#endif这里的“程序段”可以是语句组,也可以是命令行。
§2.8其他运算符与语句2.8.1new和delete运算符
new运算符可以为任意类型的对象或变量在堆中申请一块内存的存储空间,并返回该存储空间的首地址,将该地址作为new运算符的结果返回给引用变量或指针变量。如果未能分配到内存空间,则返回空(NULL)。
new运算符的语法格式如下:
new<类型>(初值表)或者
new<类型>
delete运算符用于释放new运算符申请的动态内存空间,只能作用与new返回的指针,语法格式:delete指针变量;或者
delete[]指针变量
§2.8其他运算符与语句2.8.2作用域运算符在C语言中,如果全局变量名与局部变量同名,则在局部变量的作用域内会将同名的全局变量隐藏起来,在该作用域内无法再访问同名全局变量。C++提供作用运算符“::”,用以访问被隐藏的全局变量,可以解决全局变量和局部变量同名时所发生的冲突。例如:inta=10;intmain(){
inta=0;cout<<::a<<endl;//输出结果为10cout<<a<<endl;//输出结果为0
return0;}§2.8其他运算符与语句2.8.3逗号运算符逗号运算符(,)一个比较特殊的运算符,它的作用是将若干个表达式连接起来。逗号表达式的语法格式:表达式1,表达式2,…,表达式n如:3+5,4*3又如:a=3,b=5,c=a*b逗号把若干独立的运算表达式结合成为一个表达式称为逗号表达式。逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,…,一直计算到表达式n的值,因此又称逗号表达式为顺序求解表达式。整个逗号表达式的值是最后一个表达式n的值。如:i=4,j=6,k=8;//整个逗号表达式的值是8x=8*2,x*4;
//整个逗号表达式的值是64,x的值是16§2.8其他运算符与语句2.8.4条件运算符条件运算符为“?:”,它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的语法格式为:表达式1?表达式2:表达式3其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。例如:max=a>b?a:b;执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max。条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符,
其中“?”和“:”是一对运算符,不能分开单独使用,其结合方向是自右至左。
§2.8其他运算符与语句2.8.5sizeof运算符sizeof运算符是一元运算符,用于计算数据类型或表达式占用内存的字节数。格式为:sizeof(类型名)或sizeof(表达式)例如:
sizeof(int)//值为4(32位机器)
sizeof(1+2.5)//值为8,因为1和2.5都转换为double类型
2.9C++语言的输入和输出
输入/输出(又称I/O)是程序的基本功能。数据通过输入设备如键盘、文件输入,运行结果通过输出设备如显示器、打印机输出。
C++没有专门的I/O语句,I/O操作是通过库函数或对象实现的,其中包括C语言标准库stdio.h中的printf()、scanf(),C++旧标准库iostream.h和C++新标准库iostream中的cin、cout。使用新标准库中的cin、cout需要在程序中插入以下代码:
#include<iostream>usingnamespacestd;
2.9C++语言的输入和输出2.9.1cout
cout可以直接输出基本数据类型的数据,其一般格式如下:cout<<表达式1[<<表达式2<<…<<表达式n];其中“<<”称为插入运算符,表达式将连续输出在显示器上。例如:cout<<"输入里程:";cout<<"x="<<x<<",y="<<y;为了能够准确控制输出格式,C++标准库iostream和iomanip提供了格式控制符用于输入输出格式控制
.2.9C++语言的输入和输出标准库iostream控制符功能说明用途dec设置十进制输入输出控制hex设置十六进制oct设置八进制ws提取输入流的空白字符输入控制skipws跳过输入流的空白字符noskipws不跳过输入流的空白字符endl插入一个换行符输出控制left左对齐right右对齐showpoint输出小数点showpos正数前加+号scientific指数形式fixed以定点数输出浮点数,保证小数点后的位数标准库iomanip控制符功能说明用途setfill(int)设置填充字符输出控制setprecision(int)设置实数的精度setw(int)设置数据的宽度2.9C++语言的输入和输出2.9.2cincin可以直接输入基本数据类型的数据。其一般格式为:cin>>变量名1[>>变量名2>>…>>变量名n];其中“>>”称为提取运算符。程序将暂定执行,等待用户从键盘上输入相应的数据。例如:inta,b;cin>>a>>b;程序运行时可以输入:100200<Enter>“Enter”表示回车。多个数据之间用一个或多个空格分隔,输入的数据需要和变量一一对应,上面的输入将使得a等于100,b等于200。给字符类型变量输入数据时,如果需要提取空格等空白字符(空格、TAB、Enter),需要加上输入控制符noskipws:charc1,c2;cin>>noskipws>>c1>>c2;当输入:
ws<Enter>则c1为字符a,而c2为空格。
//Examplee2_3.cpp#include<iostream>#include<iomanip>usingnamespacestd;intmain(){charc1,c2;cout<<"输入两个字符:";cin>>skipws>>c1>>c2;cout<<“c1,c2分别为:"<<c1<<","<<c2<<endl;cout<<"再输入两个字符:";cin.clear();cin.ignore();cin>>noskipws>>c1>>c2;cout<<“c1,c2分别为:”<<c1<<","<<c2<<endl;doubled=314.15926;cout<<d<<endl;cout<<setprecision(0)<<d<<endl <<setprecision(1)<<d<<endl <<setprecision(4)<<d<<endl;
//定点方式表示实数
cout<<setiosflags(ios::fixed); //控制小数点右边的数字个数
cout<<setprecision(8)<<d<<endl; //指数形式
cout<<setiosflags(ios::scientific)<<d<<endl;
cout<<setprecision(6);
intyear=2009; cout<<setw(15)<<year<<endl;
cout<<"十进制:"<<dec<<year<<endl <<"十六进制:"<<hex<<year<<endl <<"八进制:"<<oct<<year<<endl; cout<<setw(20)<<setfill('*')<<right<<d<<endl; cout<<setw(20)<<setfill('@')<<left<<d<<endl;return0;}【例2.3】演示输入输出及格式控制【例2.3】演示输入输出及格式控制【例2.4】输入一个大写字母,将其转换为小写字母输出#include<iostream>#include<cstring>usingnamespacestd;
intmain(){charc;cout<<"输入一个大写字母:";cin>>c;c=c+32;cout<<"该字母的小写形式为:"<<c<<endl;
return0;}转换公式为:C=5/9*(F–32)程序如下: #include<iostream>#include<iomanip>usingnamespacestd;intmain(){
floattemprature; cout<<"请输入华氏温度:"; cin>>temprature; temprature=(temprature-32)*5/9; cout <<"摄氏温度是:"<<setiosflags(ios::fixed)<<setprecision(2)<<temprature<<endl;
return0;}
【例2.5】编写程序将输入的华氏温度转换为摄氏温度,输出结果精确到小数点后2位。#include<iostream>#include<cstring>usingnamespacestd;
intmain(){cout<<"注意:以下输入数据均为整数"<<endl;cout<<"开始里程:";intStartPost;cin>>StartPost;cout<<"开始时间(时,分,秒):";intStartHour,StarMinute,StarSecond;cin>>StartHour>>StarMinute>>StarSecond;cout<<"结束里程:";intEndPost;cin>>EndPost;cout<<"结束时间(时,分,秒):";intEndHour,EndMinute,EndSecond;cin>>EndHour>>EndMinute>>EndSecond;intElapsedTS=(EndHour*3600+EndMinute*60+EndSecond)-(StartHour*3600+StarMinute*60+StarSecond);【例2.6】汽车在有里程标志的公路上行进。输入开始和结束的里程及时间(以时、分、秒输入),计算并输出平均速度(公里数/每小时)。intElapsedHour=ElapsedTS/3600;intElapsedMinute=ElapsedTS%3600/60;intElapsedSecond=ElapsedTS%60;doubleElapsedTime=ElapsedHour+ElapsedMinute/60.0+ElapsedSecond/3600.0;intDistant=EndPost-StartPost;doubleVelocity=Distant/ElapsedTime;cout<<"汽车行驶了"<<Distant<<"公里\n"<<"消耗时间"<<ElapsedHour<<"小时"<<ElapsedMinute<<"分"<<ElapsedSecond<<"秒\n"<<"平均速度:"<<Velocity<<"公里/小时\n";
return0;}
本章导读
程序基本结构顺序结构选择结构:if语句,switch语句循环结构:while语句,dowhile语句,for语句其他控制结构:
goto,break,continue,exit(),returnC++程序是由一个或多个函数组成。每个函数由若干条语句组成。语句是完成具体任务的命令。编写和设计程序其实就是用函数和语句描述和解决实际的问题。描述的过程就是编写程序和组织程序的过程。目前设计程序有面向过程和面向对象两种主要方法。结构化程序设计是这两种方法的基础和原则。结构化程序设计方法中模块是基本概念,模块化设计是其中心。一个模块可以是一条语句、一段程序、一个函数等。模块相对独立,又可以相互联系。结构化程序设计把程序模块分为顺序结构、选择结构和循环结构。任何复杂的程序都是由这三种基本结构组成。
§3.1程序基本结构顺序结构选择结构循环结构§3.1程序基本结构顺序结构非常简单,将两个语句顺序排列即可。例如:t=a;a=b;b=t;
3.2顺序结构选择结构又称为分支结构。C++用if语句和switch语句实现分支结构。3.3.1if语句if语句是实现分支结构的主要形式。其基本格式如下:if(<表达式>)
模块1;else
模块2;模块可以是一条语句、复合语句甚至是其他结构。表达式通常是一个条件判断,用来控制程序的流向。表达式是真(非0),则执行模块1,否则执行模块2。如果省略else,则双分支结构变成但分支结构,如:if(<表达式>)
模块;3.3
选择结构//Examplee3_1.cpp#include<iostream>#include<cstring>usingnamespacestd;intmain(){inttaxiType;floats;floatmoney;cout<<"输入出租车类型(0或1):";cin>>taxiType;cout<<"输入里程:";cin>>s;【例3.1】输入出租车类型和里程,计算打车的费用。if(s<3)money=6;//3公里以内6元elseif(taxiType==0)money=6+(s-3)*1.5;elsemoney=6+(s-3)*1.2;cout<<“打车的费用为:”<<money<<endl;return0;}switch语句又称为多分支开关控制语句,主要用于解决多分支的问题。其格式如下:switch(<整型表达式>){case<数值1>:模块1;case<数值2>:模块2;…case<数值n>:模块n;default:模块n+1;}switch中得整型表达式合case后面的数值形成对应关系,如果匹配则执行对应后面的模块。default用于不能和所有case后面数值匹配的其他情况,也可以省略。如果执行某个模块完成后,没有跳出switch语句,程序将按照顺序执行下一个case后面的模块。所以,对于正常的多分支开关控制语句,常常在模块后面加上一句break;用于执行后跳出。
3.3.2switch语句3.3.2switch语句多分支开关控制语句的流程图
//Examplee3_2.cpp#include<iostream>#include<cstring>usingnamespacestd;intmain(){ intscore; cout<<"请输入成绩:"; cin>>score;
switch(score/10) { case0: case1: case2: case3:【例3.2】输入一个成绩,判断成绩级别。case4:case5:cout<<"不合格";break;case6:case7:cout<<"合格";break;case8:cout<<"良好";break;case9:case10:cout<<"优秀";break;default:cout<<"成绩输入可能有问题";break;}cout<<endl;return0;}C++语言实现循环的方式主要有3种:while语句、dowhile语句和for语句。3.4.1while语句 while语句构成“当型循环”,其语法如下:while(<表达式>)<循环体>当表达式不为0时重复执行循环体。当表达式为0时退出循环。如果表达式永远无法为0,将形成“死循环”。3.4循环结构3.4循环结构有100人向投币箱投币,第1人投1元,第2人投2元,…,第100人投100元。很显然,最后投币箱中的总金额是1+2+3+…+100,相当于1到100这100个自然数的和。计算机用变量和常量处理数据,因此可以设s代表投币箱中的金额,i表示每次投币金额,凑巧的是,每次投币的金额和投币顺序号一样,每次投币操作都可以认为是下面两个操作的重复:s=s+i;//向投币箱投入i元i=i+1;//第i+1人准备投i+1元这种投币操作是有限次数的,共100次,即i超过100就停止,写成循环就是:i=1;//第1个人准备投1元s=0;while(i<=100){s=s+i;i=i+1;}//Examplee3_3.cpp#include<iostream>usingnamespacestd;intmain(){ inti=1;//第1个人准备投1元
ints=0; while(i<=100) { s=s+i; i=i+1; } cout<<"1+2+3+...+100="<<s<<endl;
return0;}
【例3.3】计算1+2+3+…+100dowhile语句称为直到型循环。所谓直到型循环意思是直到不满足什么条件时退出循环。其语法如下:do{<循环体>}while(<表达式>);上面求和的程序也可以写成:i=1;s=0;do{s=s+i;i=i+1;}while(i<=100);效果和前面的一样。
3.4.2dowhile语句当型循环和直到型循环的比较
左边当型循环结束后s等于0,而右边直到型循环结束后s等于1。这是因为循环条件都不满足,但直到型循环至少执行1次才会遇到循环条件的判断。正常情况下,两种循环没什么区别。
for语句是最常用的循环。其语法如下:for(<表达式1>;<表达式2>;<表达式3>)<循环体>循环执行方式为:表达式1:只执行1次。通常是为循环作准备。表达式2:通常作为循环条件部分,如果为空,相当于真值。表达式3:通常作为循环变量调整的部分。循环体:重复运行的模块。这个部分也可以对循环进行调整和控制。
3.4.3for语句3.4.3for语句以上求和的程序用for语句可以写成:for(i=1,s=0;i<=100;i++)s=s+i;for语句可以有以下省略方式:for(;②;③)循环体;for(;②;)循环体;//相当于while(②)循环体;for(;;)循环体;相当于for(;1;)循环体;for(;;);//死循环for语句构造的循环通常称为计数型循环。循环变量控制了整个循环,可以通过循环变量的初值和终值以及每次调整的数值(步长)来计算循环的次数,例如上面的程序的循环次数等于:#include<iostream>usingnamespacestd;intmain(){ intmax,min; inta; cout<<"输入第1个数:"; cin>>a; max=min=a; for(inti=2;i<=10;i++) { cout<<"输入第"<<i<<"个数:"; cin>>a; if(a>max)【例3.4】输入10个数,输出其中最大和最小的数max=a;elseif(a<min) min=a;}cout<<"max="<<max<<endl;cout<<"min="<<min<<endl;return0;}和分支结构一样,循环也允许嵌套。嵌套的循环可以完成更复杂的任务。【例3.5】计算并输出2~100之间的素数之和。分析:所谓素数指的是除了1和自身以外,没有其他因子。根据这个定义,可以用除了1和自身以外的小于该数的数去除该数,如果所有的数都不能整除,则可以判断该数是素数。例如:对于自然数7,用2、3、4、5、6去除7,发现都不能整除,则判断出7是素数;而对于自然数15,用2~14之间的数(包括2和14)去除15,则发现3、5可以整除15,则15不是素数。
3.4.4循环的嵌套#include<iostream>usingnamespacestd;
intmain(){ ints=0; inti,j; for(i=2;i<=100;i++)//产生2~100之间的数i { for(j=2;j<=i-1;j++)//产生除了1和i以外的数
if(i%j==0)break;//发现i的因子
if(j==i)//2~i-1之间没有发现因子,则i是素数
s=s+i;//累加素数
}
cout<<"2到100之间的素数之和为:"<<s<<endl;
return0;}3.5.1break语句break语句用于switch语句和循环语句中,不能用于其它语句。其功能是跳出开关控制语句和跳出循环。例如例3.5中的break可以跳出j循环。3.5.2continue语句
与break语句退出循环不同的是,continue语句只结束本次循环,接着进行下一次循环的判断,如果满足循环条件,继续循环,否则退出循环。
3.5其他控制语句3.5.3goto语句goto语句为无条件转向语句,形式为:goto语句标号语句标号用标示符表示,命名规则同变量名。
3.5.4exit()函数
exit()是一个库函数,执行该函数将返回操作系统,常用于终止程序的执行。exit()可以返回值,例如:exit(1);3.5.5returnreturn也可以完成跳转,通常用于完成任务或者异常情况下的返回。具体在函数章节中阐述。//Examplee3_6.cpp#include<iostream>usingnamespacestd;intmain(){inti,s;for(i=1,s=0;i<=10;i++){if(i%2==0)continue;if(i%10==7)break;s=s+i;}cout<<"s="<<s<<endl;
return0;}【例3.6】演示跳转语句
【程序分析】程序中当i是偶数,即i%2==0时,遇到continue,程序转向for语句的表达式3:i++;当i%10==7,即对10求余等于7时遇到break语句,程序将跳出循环。其他的数都会遇到s=s+i;所以,可以看出,程序遇到7将退出循环输出s。i从1循环到7,只有1、3、5这3个数累加到变量s中,所以最后s的值是1+3+5等于9。
【例3.7】输出下面图形#include<iostream>usingnamespacestd;
voidmain(){ inti,j; for(i=1;i<=5;i++) { for(j=1;j<=5-i;j++) cout<<""; for(j=1;j<=2*i-1;j++) cout<<"*"; cout<<endl; }}3.6程序示例【程序分析】这是一类图形输出的例子。设计这样的程序需要抓住内外循环的关联。其中需要找到以下规律:l
星号前的空格个数与行数之间的关系l
星号个数与行数之间的关系对于本题,行号i从1开始循环到5,规律如下:l
星号前的空格个数为5-i个l
星号个数为2*i-1个3.6程序示例3.6程序示例【例3.8】计算s=1×2×3×4×5×6×7×8。【分析】题目其实就是求8!。计算阶乘和求和很相似,不过还是有点区别。程序如下:#include<iostream>usingnamespacestd;
intmain(){ intt=1; for(inti=1;i<=8;i++) t=t*i;
cout<<"8!="<<t<<endl;return0;}本章导读
前面我们介绍的数据都是基本数据类型,如整型、字符型、浮点型等。存放这些简单类型数据的变量称为简单变量。每个变量有一个单独的名字,系统给它们分配一存储单元,通过变量名来实现数据的存取。然而在实际应用中往往需要处理同一性质的成批数据,C++支持数组处理来满足这一需求。数组本身并不是一种数据类型,而是一种其他类型的构造类型。
所谓数组,就是一组类型相同的变量。它用一个数组名标识,每个数组元素都是通过数组名和元素的相对位置—下标来引用。数组可以是一维的,也可以是多维的。观察以下系列变量:inta1,a2,a3,…,a10这是一组int类型变量,我们可以定义以下数组来代替这些变量:inta[10];这就是数组,该数组包括以下元素:
a[0],a[1],a[3],…,a[9]其中下标从0开始,和前面不同的是,这些变量统一共享一个数组名a。下面我们具体研究。
4.1数组的基本概念一维数组用于存储一行或一列的数据。定义方式如下:<类型><数组名>[<常量表达式>];<类型>:数组元素的数据类型,可以是int,char,float等简单类型,以及后面我们要学到的结构体、类等复杂类型。<数组名>:数组的标示,命名规则同变量名。<常量表达式>:用来定义数组的长度,因为数组也必须先定义再使用。例如:
inta[10];chars[100];4.2一维数组4.2一维数组定义数组时需要注意:1.数组长度用常量表达式来定义,不能使用变量来动态定义,以下方法是错误的:
intn=10;inta[n];2.定义数组的同时可以对数组初始化。以下初始化的方法都是允许的:
inta[10]={1,2,3,4,5,6,7,8,9,10};//全部元素都初始化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论