版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计程序设计(程序设计基础与程序设计基础与VC+应用)应用)暨南大学电气信息学院严东松2015-2016学年第一学期第 1章 C+/CLI编程基础1. 课程安排、目标和要求2. C+、VS、.Net ,C+/CLI,C+/CLR,MFC3. VS2010的安装、设置,熟悉界面与操作4. 应用程序编写5. 数据类型6. 控制台输入、输出7. 函数8. 基本语句 C+语言设计创建人: Dr. Bjarne Stroustrup1.1 程序设计语言发展 1. 面向过程的程序设计方法面向过程的程序设计方法 所谓“面向过程”,就是不必了解计算机的内部逻辑,而把精力主要集中在对如何求解问题的算法逻
2、辑和过程的描述上,通过编写程序,把解决问题的步骤告诉计算机。 C语言是典型的面向过程的语言。 C语言是结构化程序设计语言,它的程序设计特点就是函数设计。 所谓函数,就是模块的基本单位,是对处理问题的一种抽象。 2. 面向对象的程序设计方法面向对象的程序设计方法C+则是在标准C语言的基础上,引入“面向对象”概念而扩充形成的混合型面向对象语言。面向对象的程序设计方法不是以函数过程和数据结构为中心,而是以对象代表求解问题的中心环节。它追求的是现实问题空间与软件系统解空间的近似和直接模拟。这就改变了原来计算机程序的分析、设计和实现的过程与方法之间的脱节和跳跃状态,从而使人们对复杂系统的认识过程与系统的
3、程序设计实现过程尽可能地一致。 和传统的程序设计方法相比,面向对象的程序设计具有抽象、封装、继承和多态性等特征。 “面向对象”不仅仅作为一种技术,更作为一种方法论贯穿于软件设计的各个阶段。面向对象的技术在系统程序设计、数据库及多媒体开发等领域都得到广泛应用。 3. 可视化程序设计可视化程序设计 所谓“可视化”程序设计,也有人将其称为“组件”设计。它的实质就是面向对象程序设计方法,只是系统为程序员做了大量工作,节省设计时间并使许多设计过程可见而已。 但相应也带来新的问题,即要求程序员要熟悉软件环境及其工作原理。 面向对象设计首先是从给定问题抽象出类,然后根据类创建描述问题的对象并处理对象发出的各
4、种消息。C+/CLI C+指的是Bjarne Stroustrup在BELL实验室发明的C+语言,它实现了运行时取得速度和尺寸最佳化的静态对象模型,然而它除了堆分配外不支持程序的动态修改,它准许无限地接近底层设备,但在程序运行过程中几乎无法操作活动类型,也无法操作与程序相关联的底层结构。 Herb Sutter,C+/CLI的主要构造者之一,称C+是一门“混凝土”式的语言。 标准C+是一门非常静态的语言,其原则是尽量在编译期对程序的合法性和逻辑作出检查。而在运行时的动态信息方面,标准C+是有所欠缺的。C+/CLICLI则指的是通用语言结构,一种支持动态组件编程模型的多重结构,在许多情况下,这代
5、表了一个与C+对象模型完全颠倒了的模式。一个实时的软件层,有效地执行系统,在底层操作系统与程序之间运行。操作底层的设备受到一定的限制,操作执行程序中的活动类型及与程序相关联的下部结构得到了支持。而C+/CLI改变了这一现状,C+/CLI拥有完备的元数据,允许程序在运行期查询完整的类型信息,并可以由类型信息动态创建对象,甚至可以动态创建类型,添加方法等等,这种强大的运行期的动态特性对于现代应用领域(例如分布式WEB应用)是必须的。 斜杠(/)代表C+和CLI的捆绑。 C+/CLI代表托管和本地编程的结合。 是进行.NET编程模式的最佳切入点。 C+/CLI是一集标准化的语言扩展(对标准C+进行扩
6、展),是标准C+的一个超集。1.1 .NET与C+/CLIY1.1.1 .NET框架概述框架概述.NET框架的体系结构包括五大部分:程序设计语言及公共语言规范(CLS)、应用程序平台(ASP.NET及Windows窗体等)、ADO.NET及基础类库、公共语言运行时(CLR)和程序开发环境(Visual Studio.NET)。.NET框架的体系结构如图1.1所示。1.1.1 .NET框架概述l公共语言规范(Common Language Specification,CLS):CLS定义了各种语言间的互操作性规则,是许多应用程序所有互用语言的通用功能,如图1.2所示。1.1.1 .NET框架概述
7、l应用程序平台:该部分主要包括ASP.NET应用程序和Windows Forms应用程序,其中ASP.NET应用程序主要用于构建基于Internet的应用程序,而Windows窗体用于创建基于CLR的Windows图形用户界面的窗口应用程序。lADO.NET:ADO.NET主要用于操作存储在关系型数据库管理系统(DBMS)中的数据,它提供了对关系数据、XML和应用程序数据的访问,是.NET框架中重要的组成部分。l基类库(Basice Class Library):.NET框架的基类库提供许多类与接口,包括ADO.NET、XML、IO、网络、调试、安全和多线程等,这些类库都是以命名空间的方式来组
8、织的。l公共语言运行时(Common Language Runtime,CLR):CLR的作用是负责执行程序,并提供内存管理、线程管理、安全管理、异常处理、通用类型系统及生命周期监控等核心服务。l编程工具开发环境:Visual Studio.NET是一套多语言系列的开发工具,使用Visual Studio.NET不仅可以创建Windows平台下的Windows应用程序和网络应用程序,还可以创建网络服务、智能设备应用程序和Office插件等。1.1.2 公共语言运行时在.NET框架之上,无论采用哪种编程语言编写的应用程序,都首先被编译成中间语言IL(Microsoft Intermediate
9、Language,微软中间语言,简称IL),然后IL再次经过一个JIT(Just In Time,即时编译)编译器编译成为本地CPU可执行的机器码。.NET编译器和.NET执行引擎的工作流程图如图1.3所示。1.1.3 C+/CLI概述C+/CLI代表托管和本地编程的结合。C+/CLI是一种用来代替C+托管扩展的新的语言规范,它重新简化了C+托管扩展的语法,并提供了更好的代码可读性。1.2 简单的C+/CLI程序Y1.2.1 创建创建CLR控制台程序控制台程序【例1.1】 创建CLR控制台程序。(1)启动Visual Studio 2010集成开发环境,在菜单栏中选择“文件”“新建”“项目”菜
10、单命令,弹出如图1.4所示的“新建项目”对话框。1.2.1 创建CLR控制台程序(2)在对话框的左侧选择“Visual C+”节点下的“CLR”节点,并在对话框的中部选择“CLR控制台应用程序”项。在“名称”栏中输入Ex1_1,并在“位置”栏中指定该项目保存的位置,可以单击“浏览”按钮选择其他保存路径。(3)单击“确定”按钮后,集成开发环境会自动创建Ex1_1项目,并自动打开源代码编辑窗口。此时可以在Ex1_1.cpp源文件的main函数中添加计算圆面积的代码。代码如下:/ Ex1_1.cpp : 主项目文件#include stdafx.husing namespace System; in
11、t main(array args) Console:Clear(); Console:Write(L输入圆的半径: ); double r = Double:Parse(Console:ReadLine(); double area = 3.14159 * * r * r; Console:WriteLine(L半径为0的圆面积为: 1, r, area); return 0;1.2.1 创建CLR控制台程序(4)选择“生成”“生成解决方案”菜单命令以编译项目,并选择“调试”“开始执行(不调试)”菜单命令以运行项目。Ex1_1项目运行的结果如图1.5所示。1.2.2 命名空间C+/CLI编写
12、的应用程序可以使用.NET基类库中的类型。在.NET基类库中,最基本的命名空间是System,其中提供了大量核心的类型,并在程序中会经常地使用。.NET常用命名空间及其说明如表1.1所示。.NET命名空间说 明System包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、特性和处理异常的基础类和基类System:CollectionsSystem:Collections:Generic这些命名空间定义了一些集合容器对象,还有一些基类型和接口,可以允许用户创建强类型的集合System:DataSystem:Data:OdbcSystem:Data:OracleClientSystem:
13、OleDbSystem:SqlClient这些命名空间包含组成大部分ADO.NET结构的类,其中封装用于ODBC/Oracle/OleDb和SqlServer的.NET数据提供程序的类,该提供程序描述用来访问托管空间中的ODBC/Oracle/OleDb和SqlServer数据源的类集合System:Diagnostics定义了许多类型,可以通过程序调试并跟踪代码的执行System:DrawingSystem:Drawing:Drawing2DSystem:Drawing:Printing提供对GDI+基本图形功能的访问,其中提供高级的二维和矢量图形功能,以及提供与打印相关的服务System:
14、IO包含允许对数据流和文件进行同步和异步读写的类型System:Net为当前网络采用的多种协议提供简单的编程接口System:Threading提供支持多线程编程的类和接口System:Windows:Forms包含用于创建基于Windows的应用程序的类,这些应用程序可以充分利用Windows操作系统中的丰富的用户界面功能1.2.2 命名空间命名空间提供了一种从逻辑上理解和组织关联类型从逻辑上理解和组织关联类型的方式。与标准C+相同,C+/CLI中同样通过using指令来将特定命名空间引入到当前程序文件中。如果需要使用.NET中不同功能的类型时,需要引入该类型所在的命名空间。例如:using
15、 System; / 通用基类库类型using System:Drawing; / 图形呈现类型using System:Windows:Forms; / GUI窗口部件类型using System:Data; / 通用以数据为中心的类型using System:Data:SqlClient; / SQL Server数据访问类型1.2.2 命名空间当引入某个命名空间后,就可以使用该命名空间中的所有包含的类型。例如,如果需要创建Bitmap类型的实例对象,那么必须引入System:Drawing命名空间。using System;using System:Drawing;int main(ar
16、ray args) Bitmap bmp = gcnew Bitmap( 32, 32 ); / 创建一个大小为2020像素的位图 return 0;1.2.2 命名空间如果未引入System:Drawing命名空间,那么当编译器在解析Bitmap类型时会产生编译错误。然而,可以通过使用完全限定名来声明一个未引入命名空可以通过使用完全限定名来声明一个未引入命名空间的类型间的类型。例如:using System;int int main(array args) System:Drawing:Bitmap bmp = gcnew System:Drawing:Bitmap( 32, 32 ); r
17、eturn 0;1.2.3 应用程序入口【例1.2】 访问在命令行上执行程序的参数。其中,在main函数内通过for循环遍历整个数组中的参数,并输出到控制台上。代码如下:/ Ex1_2.cpp: 主项目文件#include stdafx.husing namespace System; int main(array args) Console:WriteLine(L命令行参数: ); for ( int i = 0; iLength; i+) / 输出所有参数 Console:WriteLine(L参数0: 1, i, argsi); return 0;1.2.3 应用程序入口当成功编译并连接
18、Ex1_2项目后,选择“开始”“所有程序”“附件”“命令提示符”菜单命令。然后在命令行上执行Ex1_2.exe程序,并在后面输入一些参数,其执行的结果如图1.6所示。1.2.4 控制台输入/输出1控制台输出控制台输出Console类提供了几个静态方法用于在控制台上输出字符串或含有变量的混合文本。其中,该类的WriteLine方法用于在控制台上输出一行文本,并自动换方法用于在控制台上输出一行文本,并自动换行;而行;而Write方法则可以输出单个值,但不会自动换行方法则可以输出单个值,但不会自动换行。例如:Console:Write(L半径为8的圆);Console:WriteLine(L面积为:
19、 0, 3.14*8*8 );Write和WriteLine方法都可以接受0个、1个或多个参数,这些参数之间通过逗号(“,”)隔开。在这两个方法输出的字符串中,可以通过大括号(“ ”)来分别引用所带的参数。例如:Console:WriteLine(L半径为0的圆面积为: 1, 8, 3.14*8*8);其中,0为格式化占位符,表示将在该处插入所引用的参数的值。如果需要插入更多的参数,则可以增加占位符所对应参数的编号,如1、2、3等,并且编号的顺序可以颠倒。例如:Console:WriteLine(L第1个半径为2的圆面积为: 0, 3.14*8*8, 1, 8);1.2.4 控制台输入/输出还
20、可以在格式化占位符中指定输出的格式、对齐方式及精度等。通常,可以指定格式化占位符的格式规范为n,w:Axx,其中n为索引值,用于选择逗号后的第几个参数;A为单个字母的格式化说明符,表示将如何对变量格式化,其可选的值如表1.2所示。格式说明符说 明C或c把值作为货币量输出D或d把整数作为十进制值输出。如果指定的精度大于位数,则在数值的坐标位填充0E或e按照科学计数法输出浮点值F或f把浮点数作为#.#的定点数输出G或g根据指定的精度值,决定是否以最紧凑的形式输出,如果没有指定则适用默认精度N或n把值作为定点十进制值输出,必要时以3位组成一组中间用逗号分隔X或x把整数作为十六进制值输出。分别根据值为
21、X或x,输出形式为大写或小写1.2.4 控制台输入/输出【例1.3】 控制台格式化输出的示例。在main函数中通过调用Console类的WriteLine方法,以不同方式格式化输出一个负整数和一个浮点数。代码如下。 Console:WriteLine(标准数字格式字符串:); Console:WriteLine( L(C) 货币格式: 0:Cn + L(D) 十进制格式: 0:Dn + L(E) 指数计数法: 1:En + (F) 顶点格式: 1:Fn + (G) 常规格式: 0:Gn + (默认格式): 0 (default = G)n + (N) 数字格式: 0:Nn + (P) 百分比格
22、式: 1:Pn + (X) 十六进制格式: 0:Xn, -123, -123.45f); Ex1_3项目运行后,将根据标准数字格式字符串来分别格式化输出负整数-123和浮点数-123.45f。其执行结果如图1.7所示。1.2.4 控制台输入/输出2控制台输入控制台输入ReadLine方法是将整行文本存入到一个字符串中,当按下【Enter】键时,则结束文本的读取。该方法返回一个返回一个String类型的变量类型的变量,以表示一个String数据类型的引用,其中包含实际读入的字符串。例如:String line = Console:ReadLine();由于ReadLine方法将以字符串形式返回输
23、入的内容,所以如果需要获取从控制台输入的整数和双精度浮点数时,可以通过这些基本数据类型的包装类的Parser方法将字符串解析成该类型的值。例如:int value1 = Int32:Parse( Console:ReadLine() ); / 将输入转换为int类型的值double value2 = Double:Parse( Console:ReadLine() ); / 将输入转换为double类型的值如果需要按照逐个字符的读取方式输入数据,那么可以调用Read方法读取方法读取输入的字符,并将其转换成对应的数字值输入的字符,并将其转换成对应的数字值。例如:char ch = Console
24、:Read(); / 读取一个字符,并返回该字符的ASCII码int n = Console:Read();1.2.4 控制台输入/输出ConsoleKeyInfo类有3个可访问属性用于帮助确定被按下的是哪个或哪些键。其中,属性Key是ConsoleKey枚举类型,用于指定被按下的键;属性KeyChar表示按下的键的Unicode字符码,该字符码以wchar_t类型存储;属性Modifiers是ConsoleModifiers枚举类型,用于表示是否是Shift、Alt或Ctrl键的按键组合。例如:ConsoleKeyInfo keyPressed = Console:ReadKey(true)
25、;Console:WriteLine(L控制台按键: 0, keyPressed . Key);Console:WriteLine(L按键的Unicode码: 0, keyPressed . KeyChar);Console:WriteLine(LShift Alt Ctrl按键: 0, keyPressed . Modifiers);【例1.4】 控制台输入示例。在main函数中通过循环调用Console类的ReadKey方法,获取用户的按键信息,并且当按【Esc】键时退出。代码如下。1.2.4 控制台输入/输出当Ex1_4程序运行时,每当用户按下一个键或者包含【Ctrl】、【Shift】或
26、【Alt】键的组合键时,都将输出该键的键值、Unicode码及其组合键。Ex1_4项目的运行结果如图1.8所示。 ConsoleKeyInfo cki; Console:WriteLine(L按下一个键及任意Ctrl、Alt和Shift组合键.); Console:WriteLine(L(按Esc键退出); do cki = Console:ReadKey(true); Console:Write(L已按下了: ); Console:Write (L0键, cki.Key); Console:Write (LUnicode码: 0, cki.KeyChar); Console:Write (L
27、组合键: 0, cki.Modifiers); Console:WriteLine(); while (cki.Key != ConsoleKey:Escape);1.3.3 强制类型转换在实际编程应用中,经常会遇到类型的相互转换问题。在CLR环境中,通常使用safe_cast显式地对类型进行强制转换。safe_cast的用法与static_cast的用法相同,它们都在关键字后通过尖括号对(“”)来指定转换后的新类型,并在括号(“( )”)中指定需要转换的变量和表达式。其用法如下:cli:safe_cast( expression )cli:static_cast( expression )当
28、使用static_cast进行类型的转换时是强制性的,并没有在任何运行过程进行类型检查来保证转换的正确性,所以编程人员需要明白自己所进行的转换是否合理。但是,若使用若使用safe_cast进行类型转换时,编译器将不产生转换错误,而是进行类型转换时,编译器将不产生转换错误,而是在运行时进行检查并判断转换是否可行在运行时进行检查并判断转换是否可行。如果safe_cast在将一种类型转换为另一种类型时不成功,那么产生错误。例如:double value1 = 10.5, value2 = 15.5;int sum = safe_cast(value1 + value2);String str = s
29、afe_cast(sum); / error C2682: 不能从int转换到String类型1.3.3 强制类型转换在System命名空间中还提供了Convert类用于将一个基本数据类型转换为另一个基本数据类型。Convert类还支持将任何自定义类型转换为任何基类型,但是自定义类型必须实现IConvertible接口,以定义将实现类型转换为每个基类型的方法。Convert类中常用的转换方法如表1.4所示。方 法 名 称转 换 说 明方 法 名 称转 换 说 明ToBoolean()任意类型boolToInt64()任意类型long longToByte()任意类型unsigned charT
30、oSByte()任意类型signed charToChar()任意类型wchar_tToSingle()任意类型floatToDecimal()任意类型DecimalToString()任意类型StringToDouble()任意类型doubleToUInt16()任意类型unsigned shortToInt16()任意类型shortToUInt32()任意类型unsigned intToInt32()任意类型intToUInt64()任意类型unsigned long long1.3.3 强制类型转换【例1.6】 类型强制转换的示例。在main函数中分别调用Convert类中的类型转换函数
31、将double类型的数转换为整型、bool类型、字符串类型等。代码如下。Double dNumber = 23.15; try Int32 iNumber = Convert:ToInt32(dNumber); Console:WriteLine(LDouble类型0 转换为整型: 1, dNumber, iNumber); catch (OverflowException e) Console:WriteLine(L范围溢出: 0, e-ToString(); try.catch结构为异常处理,参见教材P801.3.3 强制类型转换当Ex1_6项目运行后,其执行结果如图1.10所示。 Boo
32、lean bNumber = Convert:ToBoolean(dNumber); Console:WriteLine(LDouble类型0 转换为bool类型: 1, dNumber, bNumber); String strNumber = Convert:ToString(dNumber); Console:WriteLine(LDouble类型0转换为String类型:1, dNumber,strNumber); try Char chrNumber = Convert:ToChar(strNumber-Substring(0, 1); Console:WriteLine(L将字符串
33、0 转换为Char类型: 1, strNumber-Substring(0, 1), chrNumber); catch (FormatException e) Console:WriteLine(L字符串格式错误: 0, e-ToString(); 2.2.1 变量变量1. 变量的定义变量的定义定义一个变量的最基本的形式就是由“类型”和“变量名”组成的,如:int nNum1;int nNum2;int nNum3;double x;有时,还可以将同类型的变量定义在一行语句中,不过变量名要用逗号(,)分隔。例如上面的变量还可这样定义:int nNum1, nNum2, nNum3;doubl
34、e x;但要注意有两种类型的变量定义,一种是跟踪句柄,另一种是指针。在C+/CLI中,定义一个跟踪句柄变量,需要在类型名后面或变量名前面加上“”符号,而对于指针变量,则使用“*”。例如:String handlename;/ 在类型名后面String handlename;/ 在变量名前面String* pointername;String *pointername;2. 变量的初值化变量的初值化程序中常需要对一些变量预先设置初值,这一过程称为初始化。一般来说,可在定义变量的同时使变量初始化。例如:int nNum1 = 3;/ 指定nNum1为整型变量,初值为3double x = 1.28
35、;/ 指定x为双精度浮点变量,初值为1.28也可以在多个变量的定义语句中单独对某个变量初始化,如:int nNum1, nNum2 = 3, nNum3;变量的初始化还有另外一种形式,称为构造初始化,例如: int nX(1), nY(3);3. 变量名变量名在C+/CLI中,变量名的命名法则仍采用ISO C+的规定(对于其它标识符也一样):(1)标识符都必须由大小写字母、数字字符(09)和下划线(_)组成,且第一个字符必须为字母或下划线。(2)任何标识符中都不能有空格、标点符号及其他字符,且字符大小写是有区别的,例如,data、Data、DaTa、DATA等都是不同的标识符。(3)不能和C+
36、/CLI预留的关键字同名(如表2.1所示),包括双个单词组成的关键字(如表2.2所示)。也不能和C+/CLI本身的标识符同名(如表2.3所示)。1. 整型整型在C+/CLI程序中,可以使用的整数总共有8种,如表2.4所示。【例例Ex_Int】整型数据整型数据#include stdafx.husing namespace System;int main(array args)charv = F;/ 用字符常量进行初始化shortw(123);/ 用括号方式初始化intx = 456789;/ 用十进制整数赋值longy = 123456789L;/ 用长整型数赋值,注意后缀LInt64z =
37、0 xFEDCBA123456789;/ 用十六进制赋值 Console:WriteLine( v ); Console:WriteLine( w ); Console:WriteLine( x ); Console:WriteLine( y );Console:WriteLine( y.ToString() );Console:WriteLine( z );Console:WriteLine( z.ToString() );return 0;2. 浮点型浮点型在C+/CLI程序中,浮点类型只有2种,如表2.5所示。【例例Ex_Float】浮点数据浮点数据#include stdafx.hus
38、ing namespace System;int main(array args)floatw = 123.456f;/ 浮点数的小数标准形式System:Singlex = 7890e4f;/ 浮点数的指数形式doubley = 123456789.123456789;/ 有效位太长 Doublez = 123456789012345e-300; / 指数形式将被重置 Console:WriteLine( w ); Console:WriteLine( x );Console:WriteLine( y ); Console:WriteLine( z ); return 0;3. Decima
39、l型型C+/CLI的十进制实数类型只有一个System:Decimal,用来要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。一个Decimal值的范围为7.9x10-287.9x1028,虽远小于浮点类型,但它有28个有效位。【例例Ex_Decimal】Decimal数据数据#include stdafx.husing namespace System;int main(array args)Decimal w = System:Convert:ToDecimal(123456789012345678901.2345678);Console:WriteLine( w ); Deci
40、mal x = (Decimal)0.1234567890123456789012345678;/ ADecimal y = (Decimal)0.0000000000000000789012345678;/ B Console:WriteLine( x );Console:WriteLine( y );/ 使用Decimal构造函数Decimal z(0 xeb1f0ad2, 0 xab54a98c, 0, false, 0);/ = 12345678901234567890Console:WriteLine( z );return 0;4. 布尔型布尔型C+/CLI提供的布尔类型只有一种,
41、如表2.5所示。5. 字符型字符型C+/CLI提供的字符型只有一种,如表2.6所示,用来表征单个16位Unicode字符。【例例Ex_Char】字符数据字符数据#include stdafx.husing namespace System;int main(array args)Chara = LA;/ 字符常量ACharb = Lx0041;/ 通过转义符用16进制的Unicode编码值指定字符AConsole:WriteLine ( a );Console:WriteLine ( b );return 0;编译运行,结果如下:1. 整型常量整型常量整型常量没有小数部分也没有指数部分,它可以
42、用十进制、八进制和十六进制形式。以0开头的数是八进制整数。以0 x或0X开头的数是十六进制整数2. 浮点型常量浮点型常量浮点型常量即实数,它有十进制数或指数两种表示形式。3. 布尔常量布尔常量上述整型常量和浮点型常量可统称为数字常量,它们在C+/CLI中都是值类型对象。布尔常量也是值类型对象,但它只有两个值:true和false。4. 字符常量字符常量字符常量是用单引号括起来的一个字符。如A、g、%、 等都是字符常量。若在字符常量前加上“L”前缀则表示Unicode字符常量,例如:Lb和b,一个是Unicode字符,另一个是ASCII字符。2.3.1 算术运算符算术运算符C+/CLI的算术运算
43、符是用于整型、浮点型、Decimal型等数值的算术运算,有双目的加减乘除四则运算符、求余运算符以及单目的正负、自增、自减运算符。具体如下:+正号运算符,如+4,+1.23等-负号运算符,如-4,-1.23等*乘法运算符,如6*8,1.4*3.56等/除法运算符,如6/8,1.4/3.56等%模运算符或求余运算符,如40%11等+加法运算符,如6+8,1.4+3.56等-减法运算符,如6-8,1.4-3.56等+自增,如i+; 或 +i; 等效于i = i + 1; 或i += 1;-自减,如i-; 或 -i; 等效于i = i - 1; 或i -= 1;1. 复合赋值复合赋值在C+/CLI中,
44、规定了下列10种复合赋值运算符:+=加赋值&=位与赋值-=减赋值|=位或赋值*=乘赋值=位异或赋值/=除赋值=右移位赋值2. 多重赋值多重赋值所谓多重赋值多重赋值是指在一个赋值表达式中出现两个或更多的赋值符“=”,例如:nNum1 = nNum2 = nNum3 = 100/ 若结尾有分号“;”,则表示是一条语句赋值表达式几乎可以出现在程序的任何地方,由于赋值运算符的等级比较低,因此这时的赋值表达式两边要加上圆括号。例如:a = 7 + (b = 8)/ 赋值表达式值为15,a值为15,b值为8a = (c = 7) + ( b = 8)/ 赋值表达式值为15,a值为15,c值为7,b
45、值为8( a = 6 ) = (c = 7) + ( b = 8)/ 赋值表达式值为15,a值为15,c值为7,b值为8C+/CLI中的关系表达式的类型是bool型,其值是布尔量true或false。由于关系运算需要两个操作数,所以关系运算符都是双目运算符,其结合性是从左至右。C+/CLI提供了下列6种关系运算符:小于,若表达式e1 e2成立,则结果为true,否则为false=小于等于,若表达式e1 大于,若表达式e1 e2成立,则结果为true,否则为false=大于等于,若表达式e1 = e2成立,则结果为true,否则为false=相等于,若表达式e1 = e2成立,则结果为true,
46、否则为false!=不等于,若表达式e1 != e2成立,则结果为true,否则为false例如,对于数学中的“acb”,则相应的C+/CLI表达式可写成“(ac)&(cb)”,其中的“&”就是一个C+/CLI逻辑运算符。逻辑运算符用于将多个关系表达式或逻辑量(“真”或“假”)组成一个逻辑表达式。C+/CLI提供了下列3种逻辑运算符:!逻辑非(单目)&逻辑与(双目)|逻辑或(双目)位运算符是对操作数按其在计算机内表示的二制数逐位地进行逻辑运算或移位运算,参与运算的操作数只能是整型常量或整型变量。C+/CLI语言提供了6种位运算符:按位求反,单目运算符右移,双目运算符&a
47、mp;按位与,双目运算符按位异或,双目运算符|按位或,双目运算符条件运算符“?:”是C+/CLI中唯一的一个三目运算符,它具有下列格式: ? :表达式e1、表达式e2和表达式e3是条件运算符“?:”的三个操作数。逗号运算符“,”是优先级最低的运算符,它用于把多个表达式连接起来,构成一个逗号表达式。逗号表达式的一般形式为:e1,e2,e3,en在计算时,C+/CLI将从左至右逐个计算每个表达式,最终整个表达式的结果是最后计算的那个表达式的类型和值,即en的类型和值的类型和值。例如:a = 1, b = a + 2, c = b + 32.4.1 表达式语句、空语句表达式语句、空语句表达式语句、空
48、语句及块语句是程序中一些顺序执行(操作)的语句,故又称为顺序语句。表达式语句是最简单的语句,任何一个表达式加上分号就是一个表达式语句。例如:x + y;nNum = 5;1. if语句语句C+/CLI的if语句,又称为条件语句条件语句,具有下列一般形式(格式中,凡尖括号内容表示必须的,方括号内容表示可选的):if () else 事实上,上述形式可分为下列三种情况:(1) 简单if语句,即有下列形式:if () (2) if.else语句,即有下列形式:if () else(3) 嵌套的if语句。从整体上来看,if语句结构可看成是一个单条语句。【例例Ex_Compare】比较两个整数的大小比较
49、两个整数的大小#include stdafx.husing namespace System;int main(array args)int nNum1, nNum2;Console:Write(L请输入第一个整数: );nNum1 = Int32:Parse( Console:ReadLine() );Console:Write(L请输入第二个整数: );nNum2 = Int32:Parse( Console:ReadLine() ); if ( nNum1 != nNum2 )if ( nNum1 nNum2 )Console:WriteLine(L0 1, nNum1.ToString
50、(), nNum2.ToString();elseConsole:WriteLine(L0 1, nNum1.ToString(), nNum2.ToString();elseConsole:WriteLine(L0 = 1, nNum1.ToString(), nNum2.ToString();return 0;2. switch语句语句当程序有多个条件判断时,若使用if语句则可能使嵌套太多,降低了程序的可读性。开关语句switch能很好地解决这种问题,它具有下列形式:switch ( )case :S1case :S2.case :Sn default :Sn+1 anotherChar
51、chGrade;Console:Write(LPlease input a char(AE):);chGrade = Char:Parse( Console:ReadLine();switch(chGrade)case A:case a:Console:WriteLine(L90-100);break;case B:case b:Console:WriteLine(L80-89);break;case C:case c:Console:WriteLine(L70-79);case D:case d:Console:WriteLine(L60-69);case E:case e:Console:
52、WriteLine(L60);default:Console:WriteLine(LError!);【例例Ex_Switch】使用使用switch语句语句【例例Ex_Switch】使用使用switch语句语句编译运行后,当用户输入A,则结果如下:但若运行后,当用户输入d时,则结果如下:Why?while循环语句具有下列形式:while ()while循环语句的功能是:当表达式e为true或不为0时便开始执行while循环体s中的语句,然后反复执行,每次执行都会判断表达式e是否为true或不为0,若为false或为0,则终止循环,执行循环结构后面的语句。【例例Ex_While】使用使用while
53、循环循环#include stdafx.husing namespace System;int main(array args)intnNum = 1, nTotal = 0;while ( nNum=50 )nTotal += nNum;nNum+;Console:WriteLine(LThe sum, from 1 to 50, is: 0, nTotal.ToString();return 0;编译运行,结果如下:而do.while循环语句具有下列形式:do while (); 【例例Ex_DoWhile】使用使用do.while循环循环#include stdafx.husing na
54、mespace System;int main(array args)intnNum = 1, nTotal = 0;do nTotal += nNum;/ AnNum+;/ B while (nNum=50);Console:WriteLine(LThe sum, from 1 to 50, is: 0, nTotal.ToString();return 0;程序运行的结果如下:for循环语句具有下列格式:for (e1;e2;e3) 【例例Ex_For】使用使用for循环循环#include stdafx.husing namespace System;int main(array arg
55、s)intnTotal = 0;for (int nNum=1; nNum=50; nNum+)nTotal += nNum; Console:WriteLine(LThe sum, from 1 to 50, is: 0, nTotal.ToString();return 0;编译运行,结果如下:for each循环语句具有下列格式:for each ( 元素 in 集合 ) 【例例Ex_Each】使用使用for.each循环循环#include stdafx.husing namespace System;int main(array args)array numbers = gcnew
56、array 1, 2, 3, 4 ;for each ( int i in numbers )Console:WriteLine( i );/ 输出return 0;代码中,数组numbers被定义成一维整型数组,其初始值设定为1、2、3和4。2.5.1 函数的定义函数的定义在C+/CLI程序中,每一个函数的定义都是由4个部分组成的,即函数名、函数类型、形式参数表和函数体,其定义的格式如下: ( )根据上述定义格式,可以编写一个函数sum,如图2.5所示,注意它们的书写规范。下面就函数定义的几个部分分别说明。1. 函数类型和返回值函数类型和返回值函数类型函数类型决定了函数所需要的返回值类型,它
57、可以是除数组类型数组类型之外的任何有效的C+/CLI数据类型,包括引用、指针等。若函数类型为若函数类型为void时,则表示该时,则表示该函数没有返回值函数没有返回值。在函数体中必须通过return语句来指定函数的返回值,且返回值的类型应与函数类型相同。return语句的格式如下:return (表达式);2. 形式参数表形式参数表函数定义中,函数头的形式参数又简称为形参形参。参数表中的每一个形参都是每一个形参都是由形参的数据类型和形参名来构成由形参的数据类型和形参名来构成,形数个数可以是0个,表示没有形式参数,但圆括号不能省略,也可以是1个或多个,但多个形参间要用逗号分隔。3. 函数体函数体函数的函数体函数体由在一对花括号中的若干条语句组成,用于实现这个函数执行的功能。1. 函数的实参和形参函数的实参和形参定义一个函数就是为了以后的调用。调用函数时,先写函数名,然后紧跟
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GBT 35405-2017 基于 ebXML 的运力预订和应答》专题研究报告
- 《GB-T 39534-2020金属和合金的腐蚀 液体中不锈钢和镍基合金均匀腐蚀速率测定方法》专题研究报告
- 《GB-T 11417.7-2012眼科光学 接触镜 第7部分- 理化性能试验方法》专题研究报告
- 《幼儿文学》课件-6.3幼儿图画故事创编
- 云存储运维服务协议
- 智能家居行业智能窗帘研发工程师岗位招聘考试试卷及答案
- 2025年《保教知识与能力》幼师资格真题试卷及答案
- 2025年城管协管考试题及答案
- 2025年盘园儿钢合作协议书
- 2025亚马逊物流(FBA)新手官方指南
- DB41T 990-2014 生产建设项目水土保持单元工程质量评定标准
- (2025秋新版)苏教版科学三年级上册全册教案
- 农商行法律培训课件
- 部编版小学二年级语文上册教学反思集体备课计划
- 执法用手机管理办法
- 双重管理安全员管理办法
- 2019-2025年中国鲜切水果行业市场调查研究及投资前景预测报告
- 染色体核型分析报告解读要点
- 2025年中国泵行业市场白皮书
- (高清版)DB1303∕T 357-2023 鲜食核桃果实主要病虫害防治技术规程
- 无人机集群技术-智能组网与协同 课件全套 第1-8章 绪论- 无人机集群任务分配
评论
0/150
提交评论