Microsoft Word - 第3章.doc

Size: px
Start display at page:

Download "Microsoft Word - 第3章.doc"

Transcription

1 第 3 章 C# 数据类型 从本章开始, 暂时离开 Visual Studio 2010 的 IDE, 直接进入代码的学习中 计算机程序处理的对象是数据, 而数据是以整数 小数和字符等特定的形式存在的 在 C# 语言中, 变量或常量就是通过指定特定位置来存放数据的存储单元 通常来说, 一个变量或者常量都会对应着一定的数据类型, 如整型 字符型和布尔型等 一个以上的某种类型的变量或者常量在特定运算操作符的修饰下就形成了表达式 在 C# 的语法定义中, 一般将数据类型划分为内置数据类型, 以及用户定义数据类型 数据类型还可以分为值类型和引用类型两种 值类型通常用于存储值, 引用类型则用于存储对实际数据的引用 本章主要向读者详细介绍 C# 语言数据类型的相关知识 3.1 初识 C# 的数据类型 C# 中有两种数据类型, 即值类型 (value type) 和引用类型 (reference type) 值类型变量存储的是数据的实际值, 而引用类型变量存储的是它们的数据引用 值类型的每一个变量都有自己的数据复制 除了 ref 和 out 参数变量之外, 对值类型变量而言, 改变一个变量的操作不影响其他变量 而对于引用类型而言, 存在两个变量引用相同对象的可能 因此对这两个变量中的任何一个变量的操作都有可能影响另一个对象引用的对象 表 3.1 给出了 C# 数据类型的基本信息 表 3.1 C# 数据类型概述 值类型 引用类型 类 别 描 述 有符号整型 :sbyte,short,int,long 无符号整型 :byte,ushort,uint,ulong 简单类型 Unicode 字符 :char 浮点型 :float,double 高精度小数 :decimal 布尔型 :bool 枚举类型 自定义类型 enum E 结构类型 自定义类型 struct S 所有其他类型的最终基类 :object 类类型 Unicode 字符串 :string 自定义类型 class C 接口类型 自定义类型 interface I 数组类型 单维与多维数组, 例如,int[] 与 int[,] 委托类型 自定义类型 delegate T D( ) 说明 : 引用类型可以被认为是对象

2 第 3 章 C# 数据类型 关于 C# 数据类型的具体知识, 将在本章的各个小节中逐个具体讨论 对于有计算机语言知识基础的读者而言, 任何语言的数据类型都有一些相同之处 整型类型, 支持有符号或者无符号的 8 位 16 位 32 位和 64 位整数 浮点类型, 包括 float 和 double 两种类型,float 型表示 32 位单精度的 IEEE754 格式,double 型表示 64 位双精度的 IEEE754 格式 小数类型,decimal, 表示 128 位十进制小数, 应用于货币等方面的计算 布尔类型,bool, 表示 true 或者 false 类型的布尔值 字符类型,char, 表示 16 位的 Unicode 编码单元 字符串类型,string, 表示 16 位的 Unicode 编码单元的序列 在 C# 中, 字符和字符串的处理使用 Unicode 编码 在 C# 中, 简单类型是系统预先提供的一套定义好的结构类型 简单类型中包含很多用来定义的保留字, 这些保留字都是在 System 命名空间 (namespace) 里预定义好的结构类型 例如,int 是简单类型中一个 32 位整型保留字, 而 System.Int32 是在 System 命名空间中的一个预定义类型 一个简单类型同其化名的结构类型是完全一样的 也就是说,int 和 System.Int32 是一样的意义 从这个意义上讲, 数据类型的划分也可以如下 : 简单类型主要有整型 浮点类型 小数类型 布尔类型和字符型 值类型包括简单类型 集合类型和结构类型 引用类型包括类类型 接口类型 代表类型和数组类型 在本书中, 主要考虑值类型与引用类型这两种类型的划分 值类型和引用类型的不同之处在于 : 值类型的变量值直接包含数据, 而引用类型的变量则把其引用存储在对象中 值类型在堆栈 (stack) 上分配, 这样就可以确保.NET 平台下的大多数程序语言都能应用它 而引用类型则被分配在堆 (heap) 上, 这种类型变量通常作为类的实例的代表 值类型在内存中引用的时候会在堆栈 (stack) 中创建一个全新的副本, 而不是简单的引用 而引用类型仅仅是对对象地址的简单引用 在 C# 代码中, 用户可以根据需要来定义值类型或者引用类型 在编写程序时, 完全可以让两个不同的引用类型的变量引用同一个对象 这种情况下对这两个变量中任何一个变量的操作都可能会影响到另一个变量引用的对象 而每一个值类型变量有其自己的数值, 因此对其中一个变量的操作不可能影响到另外一个变量 说明 : 所有值类型以及引用类型都由对象类 (object) 发展而来 在 C# 中可通过隐性转换或显性转换来改变数据类型 隐性转换常常被应用于不同类型的变量之间的转化, 这种方式一般不会造成数据丢失 ; 显性转换通常被应用于拆箱 (unboxing) 操作, 有可能会造成数据丢失或者降低数据的精确度 3.2 存储实际数据的值类型 什么是值类型 在 C# 中, 所有被预定义的值类型都隐含地声明了一个公共的无参数的默认构造函数 每个默认构造函数都会返回一个初始为 0 的值类型的实例, 这些实例其实就是为大家所熟知的默认值 如表 3.2 给出了 C# 语言中所有值类型的默认值 65

3 第 2 篇 C# 程序设计基础 表 3.2 数据类型表 C# 数据类型 大 小 默 认 值 uint 无符号的 32 位整数 0 int 有符号的 32 位整数 0 float 32 位浮点数, 精确到小数点后 7 位 0.0F double 64 位浮点数, 精确到小数点后 15~20 位 0.0D decimal 128 位浮点数, 精确到小数点后 28~29 位 0.0M sbyte 有符号的 8 位整数 0 byte 无符号的 8 位整数 0 ushort 无符号的 16 位整数 0 short 有符号的 16 位整数 0 ulong 无符号的 64 位整数 0 long 有符号的 64 位整数 0L bool 布尔值,true 或 false false string Unicode 字符串 - char 单个 Unicode 字符 \x0000 这里需要补充说明以下几种特殊类型的默认值 : 枚举类型的默认值是 0; 结构类型的默认值是根据类型的不同而有所变化 ; 值类型都设置为各自的默认值 ; 引用类型默认赋值为空 整型 C# 中用整型变量来存储整数 根据变量所能表示数据的范围不同, 又将整型划分为字节型 (byte 和 sbyte) 短整型(short 和 ushort) 整型(int 和 uint) 长整型(long 和 ulong) 等 8 种类型 有符号整型与无符号整型在定义与语法上没有太多差异, 各种无符号类型变量所占的内存空间字节数与相应的有符号类型量相同 但由于省去了符号位, 所以无符号类型变量不能表示负数 然而他们使用场合却稍有不同 当进行编译时, 会根据是否有符号来决定具体的机器代码指令 而有无符号类型的值或者变量, 则是为了配合编译器的基本原理与性能才发挥作用的 实际上, 有符号和无符号数据在进行不同的运算方式时必须需要机器代码支持, 否则有无符号数除了增加机器指令之外再无其他意义 说明 : 在操作系统的基础代码及接口中,Win32 的 API 中广泛使用了无符号整型 在函数定义等数据结构中,16 位的无符号整型和 32 位无符号整型发挥着重要的作用 将无符号整型强制转换到有符号整型, 可以在从 Win32 类型传递到一个 CLI (Command-Line Interface, 一种对 IOS 操作系统的设置方式 ) 兼容类型时被应用 这时用户就可能需要使用 C# 的 unchecked 关键字来避免溢出错误 66

4 第 3 章 C# 数据类型 字符型 首先需要强调一下 char 类型与其他整数类型的两点不同之处 1. 不能进行其他类型到 char 类型的隐式转换 尽管 char 类型可以完全代表 sbyte byte 和 ushort 等类型, 但是 C# 仍然不允许将 sbyte byte 和 ushort 类型隐式转换到 char 类型 2. 只能以字符形式表示 char 类型的常量 在 C# 中, 这是必须遵循的原则 如果用整数形式表示 char 类型的常量, 则必须带有类型转换前缀 例如 :(char)10 既然没有隐式转换, 程序员要怎么处理 char 这种特殊的值类型呢? 一般情况下, 可以通过赋值操作来完成这种转换 赋值形式有以下 3 种 : char Ach="A"; char Ach ="\x0065"; // 十六进制 ; char Ach ="\u0065"; //unicode 表示法 通过以上的例子, 相信读者已经掌握了字符型变量赋值操作的方法 在第 2 3 行示例代码中, 出现了一些 奇怪的 代码 \x0065 以及 \u0065 到底代表什么呢? 其实, 除了赋值操作以外, 在编写程序的过程中,char 型还要经常与转义符打交道 在 C# 中, 转义符 (Excape Sequences) 是一种表示字符的特殊形式, 它是从 C 中直接借鉴并继承而来的, 用来表示 ASCII 码字符集中某些特定功能的字符, 以及不可打印的控制字符 字符型转义符如表 3.3 所示 : 表 3.3 转义符列表转义符名称转义符型式 ASCII 码值 ( 十进制 ) Unicode 编码 ( 十六进制 ) 单引号 \ 039 0x0027 双引号 \ 034 0x0022 感叹号 ( 警报 ) \a 007 0x0007 反斜杠 \\ 092 0x005C 空字符 \ x0000 退格符 \b 008 0x0008 回车符 \r 013 0x000D 换行符 \n 010 0x000A 换页符 \f 012 0x000C 水平 tab \t 009 0x0009 垂直 tab \v 011 0x000B 1~3 位八进制的任意字符 \ddd 1~2 位十六进制的任意字符 \xhh 67

5 第 2 篇 C# 程序设计基础 浮点型 下面再来介绍一下浮点类型 C# 语言中提供了两种浮点类型 : 单精度 (float) 类型和双精度 (double) 类型 float 型, 能表示的值的范围为 1.5*10ˆ 45~3.4* 10ˆ38, 精确到小数点后面 7 位 double 型, 能表示的值的范围为 5.0*10ˆ 324~1.7* 10ˆ308, 精确到小数点后面 15 位或 16 位 当二元表达式中有一个操作数为浮点类型, 另外一个操作数是整型或浮点类型时, 那么运算规则如下 : 如果另一个操作数是整型, 则被自动转换为浮点数类型 ; 如果操作数之一为 double, 则另一操作数经过相应的转换也变成 double 型, 那么运算以 double 类型的精度和取值范围进行, 并且所得结果也为 double 类型 ; 如果以上两种情况都不满足时, 运算至少以 float 类型的取值范围和精度进行, 并且所得结果也为 float 型 下面一段示例代码主要为读者演示了 float 类型与 double 类型在运算中精度的取舍问题 // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._2._4 // 定义 Program 类 // 定义程序的 Main() 方法 // 定义变量, 并进行初始化 int x = 10; float y = 4.5f; short z = 6; double w = 2.3E+3; // 输出结果的类型为 double: Console.WriteLine("The sum is 0", x + y + z + w); Console.Read(); 在示例中,4 个变量赋值后, 一个 int 类型 一个 short 类型 一个 float 类型和一个 double 类型相加, 计算结果为 double 类型 输出结果为 : The sum is

6 第 3 章 C# 数据类型 小数型 在 C# 语言中, 有一种新引进的数据类型 decimal 小数类型非常适用于金融和货币运算 数值范围为 1.0*10ˆ 28~7.9* 10ˆ28, 精确到小数点后面 28 位 在二元操作中, 小数型运算的操作法则如下 : 当一个操作数是小数类型, 另一个操作数是整型或者小数类型时, 整型操作数在运算前被编译器自动转化为小数类型再进行运算 当小数类型的算术运算产生大于该格式的值时, 系统会触发溢出错误 当小数类型的算术运算产生了小于该格式的值时, 操作的结果将会变成 0 很明显, 小数类型的精确度要远远大于浮点类型, 但是其数值范围却要比浮点类型小了很多 对于一般的变量或者常量而言, 浮点类型转化为小数类型时会产生溢出错误, 而小数类型转化为浮点类型时会造成精确度的损失 注意 : 小数型和浮点型这两种类型之间不存在隐式或显式转换 大整数型 在 C# 4 中, 新引进一种能表示任意大的带符号整数的类型 BigInteger, 定义在 System. Numerics 命令空间中 BigInteger 类型是不可变类型, 代表一个任意大的整数, 其值在理论上已没有上部或下部的界限 BigInteger 类型的成员与其他整数类型的成员近乎相同, 不同的是,BigInteger 类型没有 MinValue 和 MaxValue 属性, 也就是说它没有没有上限或下限, 对于导致 BigInteger 值增长过大的任何操作会引发 OutOfMemoryException 与普通整数类型不同, 对 BigInteger 对象可通过以下多种方式实例化 : 可以声明 BigInteger 变量并向其分配一个值, 分配的值可以是您需要的任何数值, 只要该值为整型即可 可以使用 new 关键字并提供任何整数或浮点值以作为 BigInteger 构造函数的一个参数 可以使用 new 关键字并向 BigInteger.BigInteger 构造函数提供任意大小的字节数组 此构造函数仅用于创建正的 BigInteger 值 可以调用 BigInteger 方法, 对数值表达式执行某些操作并返回计算的 BigInteger 结果 例如, 以下代码都可以初始化一个 BigInteger: namespace _3._2._6 BigInteger bigintfromdouble = new BigInteger( ); BigInteger assignedfromlong = ; BigInteger newbigint = new BigInteger( new byte[] 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ); 69

7 第 2 篇 C# 程序设计基础 Console.WriteLine("bigIntFromDouble:0", bigintfromdouble); Console.WriteLine("assignedFromLong:0", assignedfromlong); Console.WriteLine("newBigInt:0", newbigint); Console.ReadLine(); 程序运行结果如下 : bigintfromdouble: assignedfromlong: newbigint: 注意最后一个通过数组实例化的 newbigint 的输出结果, 对于通过字节数组初始化时, 数组中的每个字节的内容将被认为是一个十六进制的数, 因此 newbigint 的值为 0x a( 按数组中下标由高到低 ), 输出为十进制时就得到上面的结果了 可以像使用其他任何整数类型一样使用 BigInteger 实例 BigInteger 重载标准数值运算符, 能够执行基本数学运算, 如加法 减法 除法 乘法 减法 求反和一元求反 还可以使用标准数值运算符对两个 BigInteger 值进行比较 与其他该整型类型相似,BigInteger 还支持按位 And Or XOr 左移位和右移位运算符 对于不支持自定义运算符的语言, BigInteger 结构还提供了用于执行数学运算的等效方法 其中包括 Add Divide Multiply Negate Subtract 和多种其他内容 此外,BigInteger 增加了成员, 例如 : Sign, 可以返回表示 BigInteger 值符号的值 Abs, 可以返回 BigInteger 值的绝对值 DivRem, 可以返回除法运算的商和余数 GreatestCommonDivisor, 可以返回两个 BigInteger 值的最大公约数 复数型 在 System. Numerics 命令空间中还提供一个处理复数的类型 Complex 复数是由实数部分和虚数部分组成的数 复数 z 通常的书写形式为 z = x + yi, 其中 x 和 y 为实数,i 为虚数单位, 具有 i 2 = -1 的特性 复数的实数部分由 x 表示, 复数的虚数部分由 y 表示 在实例化和操作复数时,Complex 类型使用笛卡尔坐标系统 ( 实数, 虚数 ) 一个复数可以表示复杂平面的二维坐标系中的某个点 复数的实数部分位于 x 轴 ( 水平轴 ), 虚数部分位于 y 轴 ( 垂直轴 ) 通过使用极坐标系, 复杂平面中的任何点还可以基于其绝对值表示 在极坐标中, 一个点表示为两个数字 : 它的量值, 是指从该点到原点 ( 即 0,0 或 x 轴和 y 轴线的交点 ) 的距离 它的相位, 是指真实的轴与从原点到该点绘制的线条之间的角度 可以通过以下方法之一为复数赋值 : 70

8 第 3 章 C# 数据类型 通过将两个 Double 值传递给它的构造函数 第一个值表示复数的实数部分, 第二个值表示其虚数部分 这些值表示二维笛卡尔坐标系统中复数的位置 通过调用静态 Complex.FromPolarCoordinates 方法从点的极坐标创建复数 通过将 Byte SByte Int16 UInt16 Int32 UInt32 Int64 UInt64 Single 或 Double 值赋值给 Complex 对象 该值将成为复数的实数部分, 其虚数部分等于 0 通过将 Decimal 或 BigInteger 值强制转换为 Complex 对象 该值将成为复数的实数部分, 其虚数部分等于 0 通过将方法或运算符返回的复数赋值给 Complex 对象 例如,Complex.Add 是一个静态方法, 它返回一个属于两个复数之和的复数,Complex.Addition 运算符会计算两个复数之和, 然后返回结果 例如, 以下代码就可完成复数的实例化和运算 namespace _3._2._7 Complex z1 = new Complex(12, 6); Complex z2 = 3.14; Complex r1 = Complex.Add(z1, z2); Complex r2 = Complex.Subtract(z1, z2); Console.WriteLine("z1+z2=0", r1); Console.WriteLine("z1-z2=0", r2); Console.ReadLine(); 布尔型 在 C# 中, 布尔类型是专门用来表示 真 和 假 两个概念 布尔类型变量只有 true 和 false 两种取值 true 代表 真,false 代表 假 没有任何方法或者标准可以实现布尔类型与其他类型的转换 C# 值类型的数值类型 经过以上的分析, 下面总结一下 C# 值类型的范围与精度 如表 3.4 所示, 读者可以直观地了解到所有 C# 中值类型的取值原则 ( 不包含 BigInteger 类型 ) 了解了取值的原则不仅可以在以后的程序设计与编码过程中避免发生溢出错误, 而且可以提高代码的健壮性和安全性 71

9 第 2 篇 C# 程序设计基础 表 3.4 C# 的数值类型 类 别 位 数 类 型 范围 / 精度 8 sbyte 128~127 有符号整型 16 short ~ int ~ long ~ byte 0~255 无符号整型 16 ushort 0~ uint 0~ ulong 0~ 浮点型 32 float ~ , 精度 7 位 64 double ~ , 精度 15 位 Decimal 128 decimal ~ , 精度 28 位 在介绍完 C# 值类型的基本种类之后, 这里要补充一点关于值类型的细节 实际上, 值 类型可以进一步划分为简单类型 (simple type) 枚举类型(enum type) 和结构类型 (struct type) 以上所述的几种类型都只是简单类型的组成部分, 而关于枚举类型与结构类型将 留在后面的章节中单独讨论 3.3 存储引用地址的引用类型 什么是引用类型 顾名思义, 引用类型的重点就是 引用 二字 这里的 引用 是指该类型的变量是指向其所要存储的地址单元, 而不直接存储包含的值本身 引用类型存储实际数据的引用值的地址, 如图 3.1 所示 图 3.1 值类型与引用类型 引用类型主要包括类类型 对象类型 字符串类型 接口类型 代表类型和数组类型 本节先详细介绍一下前 3 种引用类型 类类型 类类型是引用类型中的一种数据结构, 它包含了如常量 字段和事件等的数据成员, 72

10 第 3 章 C# 数据类型 还有如方法 属性 索引 操作 构造函数和析构函数等的函数成员, 以及嵌套类型 类支持继承和多态, 这些机制确保派生类能够扩展和特殊化基类 注意 : 和 C++ 相比,C# 中的类仅允许单继承, 派生一个新对象不能有多重基类, 但允许一个类派生自多重接口 对象类型 在前面已经提及, 在 C# 中, 其他所有类型最终的基础类型是对象类型 在 C# 中, 每一种类型都直接或者间接的源于 object 这个类类型 对象类型变量是用关键字 object 来定义的, 它是 System.Object 的简化别名 因为对象类型是所有对象的基类, 所以可把任何类型的值赋给它 定义对象类型变量的一般格式 : object 变量名 ; 在程序中经常能看到用 object 定义类型的方法的参数 字符串类型 字符串类型是一个密封类, 本质上而言它直接从 object 中继承而来 同其他类型一样, 由于单继承性的限制 C# 不允许从字符串类型再派生类 字符串类型变量用关键字 string 来定义, 它是 System.String 的简化别名 在程序设计语言中, 字符串类型是一个最基本的数据类型 C# 中规定 String( 或 string) 类的对象在创建后就不能再对其进行修改 可以用字符串文字的形式来表示 string 类型的值 注意 : 没有任何操作能够改变 string 类对象的状态 定义字符串变量的一般格式为 : string 变量名 ; 例如 : string str="made'n"; C# 中可以使用 + 连接字符串 例如 : // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._3._4 // 定义 Program 类 // 定义类的私有成员变量 73

11 第 2 篇 C# 程序设计基础 static string str1 = "Made in "; static string str2 = "China"; // 定义程序的 Main( ) 方法 // 打印输出结果 Console.WriteLine(str1 + str2); Console.ReadLine(); 74 输出结果如下 : Made in China 我们还可以比较两个字符串是否相等 比较两个字符串是否相等时, 简单地使用 == 比较操作符即可 例如 : // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._3._4 // 定义 Program 类 // 定义类的私有变量, 并进行初始化 static string str1 = "Made in"; static string str2 = " China"; // 定义类的 Main( ) 方法 // 方法的处理过程 if (str1 ==str2) Console.WriteLine(" 两个字符串相同 "); Console.ReadLine(); else Console.WriteLine(" 两个字符串不同 "); Console.ReadLine(); 输出结果为 : 两个字符串不同 另外, 如果用户想访问某个字符串中的单个字符时, 可以通过访问字符串下标的方式实现 接着上面的实例程序, 可以这样编写代码 : // 声明使用的命名空间 using System;

12 第 3 章 C# 数据类型 using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._3._4 // 定义 Program 类 static string str1 = "Made in China"; // 访问字符串 str1 的第一个字符 static char ch1 = str1[0]; // 打印输出结果 Console.WriteLine(" 字符串 str1 是 0",str1); Console.WriteLine(" 字符串 str1 的第一个字符是 0", ch1); Console.ReadLine(); 程序输出结果是 : 字符串 str1 是 Made n China 字符串 str1 的第一个字符是 M 接口类型 接口类型定义一组仅存在方法标志, 但没有执行代码的函数成员命名的集合 在 C# 中, 编译器不允许实例化一个接口, 用户只能实例化一个派生自该接口的对象 类或结构能实现多个接口 一个接口可以声明一个只有抽象成员的引用类型 实际上, 由于 C# 中不允许多根继承, 所以用于实现接口的类或结构就担负起了实现接口函数成员的责任, 也就是实质意义上的多继承 当程序员定义从接口派生的类时, 这个类可以派生自多重接口 而当实现类从类的派生时,C# 就只允许从一个类派生, 即单根继承 说明 : 接口可能从多个基接口继承而来, 可以在一个接口中定义方法 属性和索引 接口的声明方法如下例 : // 声明 Iface 接口 interface Iface void showmyiface(); 类和接口最重要的区别在于, 类可以实例化并且被实现, 而接口不能被实现 接口是面向对象编程技术的基石之一, 正是由于有了接口才使得程序操作对象称为一种十分灵活的方式 由于接口部分涉及太多面向对象的概念, 在背景知识不是很齐备的情况下, 此处先不 75

13 第 2 篇 C# 程序设计基础 做具体介绍了 感兴趣的读者可以参读下面的示例程序, 体会一下接口定义的意义所在 // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._3._5 // 定义 Program 类 Write text = new Write("OK"); IPoint ipoint = (IPoint)text; ipoint.pointx(0.123d); ipoint.pointy(0.234d); ipoint.pointz(0.345d); public class Draw public Draw() // 声明接口 interface IPoint void PointX(double factor); void PointY(double factor); void PointZ(double factor); // 定义 Write 类, 继承自接口 IPoint 以及类 Draw public class Write : Draw, IPoint // 定义 Write 类的成员方法 public Write(string text) this.text = text; public void PointX(double factor) public void PointY(double factor) public void PointZ(double factor) // 私有成员变量 private string text; dynamic 类型 dynamic 类型是 C# 4 中新增加的数据类型 dynamic 类型在编译期间忽略类型检查, 76

14 第 3 章 C# 数据类型 给 dynamic 类型的对象定义任何操作编译器都认为是有效的, 也就是说, 在代码运行之前是不会检查错误的 其实, 在.NET Framework 以前的版本中通过 var 关键字和匿名方法也为 C# 提供了类似 动态编程 的方法, 只是 var 类型的对象在运行过程中不允许再更改类型, 而 dynamic 类型却可以 例如, 有以下代码 : namespace _3._3._6 var vartest = 1; dynamic dyntest = 1; Console.WriteLine("varTest:0", vartest.gettype()); Console.WriteLine("dynTest:0", dyntest.gettype()); //vartest = "Hello"; dyntest = "Hello"; // 若不注释该行, 程序不能被编译 Console.WriteLine("varTest:0", vartest.gettype()); Console.WriteLine("dynTest:0", dyntest.gettype()); Console.ReadLine(); 程序输出结果是 : vartest:system.int32 dyntest:system.int32 vartest:system.int32 dyntest:system.string 从以上运行结果可看到,dynTest 最初的类型是 Int32, 当被赋值一个字符串后, 其数据类型又变为了 String 以上程序中, 分别定义了一个 var 类型和 dynamic 类型的变量, 若去掉程序中注释掉的那行语句, 编译程序时将得到如下所示错误 : 无法将类型 string 隐式转换为 int 而对于 dynamic 类型, 则可以在程序运行期间更改其数据类型, 如上例中最初 dyntest 变量是整型, 后来又将一个字符串赋值给该变量, 这样, 该变量就会改变为字符串类型 从上例可看到,dynamic 类型的使用非常灵活 在使用时需要注意以下两个方面的问题 : 当变量定义为 dynamic 类型时, 由于在设计期间其具体类型无法确定, 因此无法使用 Visual Studio 的 IntelliSense 进行成员提示了 由于编译器将忽略 dynamic 类型变量的检查, 因此必须确保调用的属性或方法是正确的, 否则, 在程序运行时将出现异常 ( 在编译期间无法检查出这些异常 ) 在 C# 4 中提供 dynamic 支持的是称为 Dynamic Language Runtime( 简称 DLR) 的一系 77

15 第 2 篇 C# 程序设计基础 列类库 DLR 是构建于 CLR 之上的, 用来提供动态语言支持的类库 3.4 数据类型是可以转换的 什么时候发生类型转换 在程序中, 值的复制主要是指赋值运算, 以及函数方法传递参数 而类型转换主要发生于被赋值的变量 ( 或方法的形式参数 ) 的类型与实际的对象类型不一致的情况 当发生类型转换时, 源类型 (Source Type) 是指实际对象的类型, 目标类型 (Destination Type) 即被赋值的变量 ( 或方法的形参 ) 的类型 C# 中的类型转换有两种分类方法, 一种是根据转换方式的不同可以分为显式 (Explicit) 转换和隐式 (Implicit) 转换两种 ; 另外一种是根据源类型和目标类型之间的关系分为投射 (Cast) 变换(Conversion) 和封箱 / 拆箱 (Boxing/Unboxing) 从直观上看, 显式和隐式转换只是语法上存在一些不同, 其他差别不大 下面将展开深入的讨论来分析二者之间到底有何不同 C# 表示一个显式转换的语法构造形如 ( 目标类型 ) 下面的代码介绍了在 C# 语言中进行显式和隐式转换时的语法 int x = 10; // 隐式转换 long y = x; // 显示转换 x = (int) y; 显式转换 下面来重点谈一谈显式转换 当发生类型转换时, 假如在代码中明确指定了目标类型, 则称为显式转换, 否则就称为隐式转换 表 3.5 列举了所有.NET Framework 中各个数据类 型之间能够发生显式转换的类型名称及转化关系 表 3.5 显式转换 源 类 型 目标类型 Byte sbyte 或 char Sbyte Byte ushort uint ulong 或 char Int sbyte byte short ushort uint ulong 或 char Uint sbyte byte short ushort int 或 char Short sbyte byte ushort uint ulong 或 char Ushort sbyte byte short 或 char Long sbyte byte short ushort int uint ulong 或 char Ulong sbyte byte short ushort int uint long 或 char Float sbyte byte short ushort int uint long ulong char 或 decimal 78

16 第 3 章 C# 数据类型 续表 源 类 型 目标类型 Double sbyte byte short ushort int uint long ulong char float 或 decimal Char sbyte byte 或 short Decimal sbyte byte short ushort int uint long ulong char float 或 double 隐式转换 接着 节的介绍, 这里重点介绍隐式转换的方向, 以及类型范围 表 3.6 列举了所 有.NET Framework 数据类型之间的隐式转换 表 3.6 隐式转换 源 类 型 目标类型 Byte short ushort int uint long ulong float double 或 decimal Sbyte short int long float double 或 decimal Int long float double 或 decimal Uint long ulong float double 或 decimal Short int long float double 或 decimal Ushort int uint long ulong float double 或 decimal Long float double 或 decimal Ulong float double 或 decimal Float double Char ushort int uint long ulong float double 或 decimal 不同数值类型之间的转换 在 节中已经讲过, 有符号的数值类型主要包括 byte short int long float double 等 依照这个排列顺序向后排列, 编译器允许各种类型的值依次自动进行转换为其后的数值类型 这就是说, 当一个 short 型变量赋值给一个 double 型的变量时, 编译器首先做出判断, 确定允许隐式转换以后,short 型变量的值将会被自动进行转换成 double 型的值, 然后再将已经转换后的值赋给 double 型变量 在下面的示例程序中, 将具体演示两种数值类型之间的转换 // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._4._4 // 定义 Program 类 // 定义 Program 类的静态成员变量 static byte a = 1; 79

17 第 2 篇 C# 程序设计基础 static short b = a; static int c = a; static long d = a; static float e = a; static double f = a; // 打印输出结果 Console.WriteLine("byte a = " + a); Console.WriteLine("short b = " + b); Console.WriteLine("int c = " + c); Console.WriteLine("long d = " + d); Console.WriteLine("float e = " + e); Console.WriteLine("double f = " + f); Console.Read(); 由于初始化的 byte 型变量是数值类型序列中最靠前的, 所以它可以被自动转化为其余任何一种类型的变量 这个过程其实就是一个隐式转换的过程 程序的输出结果如下 : byte a =1 short b=1 int c =1 long d =1 float e =1 double f =1 当 int 型转换为 short 型时, 则使用强制类型转换 强制转换的格式如下 : ( 类型名 ) 变量名 注意 : 使用强制转换必须要考虑不同类型数值范围的问题 进行转换时, 被转换的数据大小一定要控制在目标类型的范围之内 如果将 byte 的 334 转换为 sbyte, 系统就会溢出 所以, 在多字节数据类型转换为少字节类型的时候, 必须考虑到转换的范围问题 此外, 即使字节数相同的有符号类型和无符号类型之间转换, 也要考虑转换范围等条件 数值类型和字符串之间的转换 在 C# 中, 用一对双引号包含的若干字符来表示字符串, 如 123, 这既是一串字符, 也是一个数 实际上在 C# 的语法中, 123 其实是数值字符串 因此在实际的编码工作中, 当需要将数字转化为字符串时, 可以调用 void ToString() 方法 C# 中的所有类都具有这个方法, 这大大简化了数值转换成字符串的过程 反过来, 将数值型字符串转换成数值该怎么处理呢? 在 C# 语言中,short int float 等数值类型均有一个静态函数 Parse() 这个函数就是用来将字符串转换为相应数值的 下面的例子可以更明确地说明转换的方法 : // 声明使用的命名空间 80

18 第 3 章 C# 数据类型 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._4._5 // 定义 Program 类 static float f = 3.21F; static string str = "123"; Console.WriteLine("f = " + f.tostring()); // 定义 Main( ) 方法的处理过程 if (int.parse(str) == 123) Console.WriteLine("string str =" + str); Console.WriteLine("int.Parse(str) = " + int.parse(str)); Console.WriteLine(" 转换成功 "); Console.Read(); else Console.WriteLine(" 转换失败 "); Console.Read(); 运行结果如下 : f = 3.21 string str =123 int.parse(str) =123 转换成功 在上面提到了 ToString() 方法可以将数值转换成字符串, 不过在字符串中, 结果是以十进制显示的 在转换过程中, 数据的存储只与输入输出有关, 与进制没有关系 现在可以使用 ToString(string) 方法带给它加一些参数, 就可以将其转换成十六进制 说明 : 这里需要一个 string 类型的参数, 这就是格式说明符 1. 八进制 其格式说明符是 o 或 O 任何一个八进制的数值都必须在前面加上这个格式说明符 例如 : int a = 100; int a = o144; // 十进制 // 转换成八进制表示 2. 十六进制 其格式说明符是 x 或 X, 使用这两种格式说明符的区别主要在于 A~F 六个数 81

19 第 2 篇 C# 程序设计基础 字 : x 代表 a~f 使用小写字母表示, 而 X 表示 A~F 使用大写字母表示 代码如下 : // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._4._5 // 定义 Program 类 static int a = 188; // 打印输出结果 Console.WriteLine("a(10) = " + a.tostring()); Console.WriteLine("a(16) = " + a.tostring("x")); Console.WriteLine("a(16) = " + a.tostring("x")); Console.Read(); 运行结果如下 : a(10) = 188 a(16) = bc a(16) = BC 为了显示结果的整齐, 需要控制十六进制表示的长度, 如果长度不够, 用前导的 0 填补 我们只需要在格式说明符 x 或者 X 后写上表示长度的数字就解决这个问题了 比如, 要限制在 4 个字符的长度, 可以写成 X4 在上例中追加一句: this.textbox1.appendtext("a(16) = " + a.tostring("x4") + "\n"); 其结果将输出 : a(16)=00bc 如何将一个表示十六进制数的字符串转换成整型呢? 这一转换同样需要借助于 Parse() 方法, 具体说就是 Parse(string,System.Globalization.NumberStyles) 方法 此方法的第 1 个参数是表示十六进制数的字符串, 如 AB 20 ( 表示十进制的 32) 等 ; 第 2 个参数 System.Globalization.NumberStyles 是一个枚举类型, 用来表示十六进制的枚举值是 HexNumber 如果要将 AB 转换成整型代码如下 : int b = int.parse("ab", System.Globalization.NumberStyles.HexNumber); 最后得到的 b 的值是 字符的 ASCII 码和 Unicode 码之间的转换 在实际工作中, 程序员需要得到一个英文字符的 ASCII 码或者一个汉字字符的 Unicode 82

20 第 3 章 C# 数据类型 码时, 只要将字符型数据强制转换成适当的数值型数据就可以了 反之, 将一个适当的数值型数据强制转换成字符型数据, 也可以得到相应的字符 注意 :C# 语言中字符的范围不仅包含了单字节字符, 也可以包含如中文字符的双字节字符 在下面的示例代码中, 将演示字符的 ASCII 码和 Unicode 码之间的转换 // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._4._6 // 定义 Program 类 // 私有成员变量 static char ch = 'z'; static short si = 65; static char cn = ' 人 '; static short uc = 23456; // 打印转换结果 Console.WriteLine("The ASCII code of \'" + ch + "\' is: " + (short)ch); Console.WriteLine("ASCII is " + si.tostring() + ",the char is: " + (char)si); Console.WriteLine("The Unicode of \'" + cn + "\' is: " + (short)cn); Console.WriteLine("Unicode is " + uc.tostring() + ",the char is: " + (char)uc + "\n"); Console.Read(); 运行结果如下 : The ASCII code of 'z' is: 122 ASCII is 65, the char is: A The Unicode of ' 人 ' is: Unicode is 23456, the char is: 宠 从这个例子中可以了解到, 通过强制转换, 完全能够实现字符与字符编码之间的转换 如果程序员需要的不是 short 型的编码, 请参考前面介绍的方法进行转换, 即可得到 int 等类型的编码值 注意 : 当程序员需要从相关的字符编码中查询它是哪一个字符的编码时, 也需要用到这种转换 83

21 第 2 篇 C# 程序设计基础 字符串和字符数组之间的转换 将字符串转化为字符数组时, 可以应用字符串类 System.String 提供的一个 void ToCharArray() 方法实现字符串到字符数组的转换 示例程序如下所示 84 // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._4._7 // 定义 Program 类 // 私有成员变量 static string str = "Welcome to Beijing"; static char[] chars = str.tochararray(); // 定义程序的 Main( ) 方法 // 打印输出结果 Console.WriteLine("string str = " + str); Console.WriteLine("Length of \"string\" is " + str.length); Console.WriteLine("Length of \"char array\" is " + chars.length); Console.WriteLine("char[3] = " + chars[3]); Console.Read(); 编译程序并运行, 运行结果如下 : string str = Welcome to Beijing Length of "string" is 18 Length of "char array" is 18 char[3] = c 反之, 可以使用 System.String 类的构造函数把字符数组转换成字符串 String(char[]) 和 String([char[],int,int] 是 System.String 类里两个构造函数, 通过观察很容易就能发现, 这两个构造函数都携带有字符数组参数 说明 :String(char[]) 是用一个完备的字符数组的全部元素来构造字符串的 ; 而 String([char[],int,int] 则是通过指定字符数组中具体部分来构造字符串的 下面以 String(char[]) 为例, 说明如何将字符数组转换为字符串 示例程序如下 : // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._4._7

22 第 3 章 C# 数据类型 // 定义 Program 类 // 私有成员变量 static char[] chars = 'W', 'e', 'l', 'c', 'o', 'm', 'e' ; static string str = new String(chars); // 定义程序的 Main() 方法 Console.WriteLine("str = \"" + str+"\""); Console.Read(); 运行结果为 : str = "Welcome" 注意 : 很多情况下需要把字符串转换成字符数组时, 只是为了得到该字符串中的某个字符, 那么只需要使用 System.String 的 [] 运算符即可 字符串和字节数组之间的转换 在 System.String 类中没有能实现字符串和字节数组之间的转换方法 要实现这类转换就必须借助 System.Text.Encoding 类 在该类中, 利用以下方法可以实现字符串与字节数组之间的转换 : bye[] GetBytes(string) 方法, 将字符串转换成字节数组 ; string GetString(byte[]) 方法, 将字节数组转换成字符串 System.Text.Encoding 类不能通过构造函数来实现编码之间的默认转换, 完成这项工作的是默认的 Encoding 类的各种属性方法 具体如表 3.7 所示 表 3.7 Encoding 类的各种属性方法 Encoding 属性作用 Encoding.Default Encoding.UTF7 Encoding.UTF8 Encoding.ASCII Encoding.Unicode 获取系统的当前 ANSI 代码页的编码 获取 UTF-7 格式的编码 获取 UTF-8 格式的编码 获取 7 位 ASCII 字符集的编码 获取特定顺序的 Unicode 格式的编码 在字符串转换到字节数组的过程中,Encoding.Default 会将每个单字节的英文或者数字字符转换成一个字节, 而把每个双字节的汉字字符转换成两个字节 而 Encoding.Unicode 则会将所有需要转换的部分都转换成两个字节 读者可以通过下例简单地了解一下转换的方法, 以及使用 Encoding.Default 和 Encoding.Unicode 的区别, 示例代码如下 : // 声明使用的命名空间 using System; using System.Collections.Generic; 85

23 第 2 篇 C# 程序设计基础 using System.Linq; using System.Text; namespace _3._4._8 // 定义 Program 类 // 私有成员变量 static string s = "C# 语言 "; static byte[] b1 = System.Text.Encoding.Default.GetBytes(s); static byte[] b2 = System.Text.Encoding.Unicode.GetBytes(s); static string t1 = "", t2 = ""; // 定义程序的 Main() 方法 //Main() 方法的处理过程 foreach (byte b in b1) t1 += b.tostring("") + " "; foreach (byte b in b2) t2 += b.tostring("") + " "; // 打印输出结果 Console.WriteLine("b1.Length = " + b1.length); Console.WriteLine(t1); Console.WriteLine("b2.Length = " + b2.length); Console.WriteLine(t2); Console.Read(); 运行结果如下 : b1.length = b2.length = 使用 Encoding 类的 string GetString(byte[]) 或 string GetString(byte[],int,int) 方法都可以将字节数组转换成字符串, 读者的选择要按照编码的实际需求决定 以下述代码为例, 在 TestStringBytes() 函数中添加如下语句 : byte[] bs = 97, 98, 99, 100, 101, 102; string ss = System.Text.Encoding.ASCII.GetString(bs); Console.WriteLine("The string is: " + ss + "\n"); 运行结果为 : The string is: abcdef 数值类型和字节数组之间的转换 在前面介绍的转换方法中, 我们知道了各种数值型需要使用多少字节的空间来保存数据 当各种数值类型和字节数组之间转换时, 编译器将某种数值类型的数据转换成字节数 86

24 第 3 章 C# 数据类型 组, 得到的一定是相应大小的字节数组 同理, 当把字节数组转换成数值类型时, 这个字节数组的大小必须大于相应数值类型的字节数 一般会利用 System.BitConverter 类来实现各种数值类型与字节数组之间的转换 不同类型之间的强制转换 在 C# 语言中, 可以利用 Convert 进行强制转换 Convert 可以将一个基本数据类型转换为另一个基本数据类型 表 3.8 列出了 Convert 类公开的成员 表 3.8 Convert 类公开成员 公共字段 DBNull 一个常数, 表示没有数据的数据库列 ( 即数据库为空 ) 公共方法 ChangeType 返回具有指定类型, 而且其值等效于指定对象的 Object Equals 确定两个 Object 实例是否相等 ( 从 Object 继承 ) FromBase64CharArray FromBase64String GetHashCode 将 Unicode 字符数组的子集 ( 它将二进制数据编码为 base 64 数字 ) 转换成等效的 8 位无符号整数数组 参数指定输入数组的子集以及要转换的元素数 将指定的 String( 它将二进制数据编码为 base 64 数字 ) 转换成等效的 8 位无符号整数数组 用作特定类型的哈希函数 GetHashCode 适合在哈希算法和数据结构 ( 如哈希表 ) 中使用 ( 从 Object 继承 ) GetType 获取当前实例的 Type( 从 Object 继承 ) GetTypeCode IsDBNull 返回指定对象的 TypeCode 返回有关指定对象是否为 DBNull 类型的指示 ReferenceEquals 确定指定的 Object 实例是否相同的实例 ( 从 Object 继承 ) ToBase64CharArry ToBase64String ToBoolean ToByte ToChar ToDateTime ToDecimal ToDouble ToInt16 ToInt32 ToInt64 ToSByte ToSingle ToString ToUInt16 ToUInt32 ToUInt64 将 8 位无符号整数数组的子集, 转换为用 Base 64 数字编码的 Unicode 字符数组的等价子集 将 8 位无符号整数数组的值转换为它的等效 String 表示形式 ( 使用 base 64 数字编码 ) 将指定的值转换为等效的布尔值 将指定的值转换为 8 位无符号整数 将指定的值转换为 Unicode 字符 将指定的值转换为 DateTime 将指定值转换为 Decimal 数字 将指定的值转换为双精度浮点数字 将指定的值转换为 16 位有符号整数 将指定的值转换为 32 位有符号整数 将指定的值转换为 64 位有符号整数 将指定的值转换为 8 位有符号整数 将指定的值转换为单精度浮点数字 将指定值转换为其等效的 String 表示形式 将指定的值转换为 16 位无符号整数 将指定的值转换为 32 位无符号整数 将指定的值转换为 64 位无符号整数 87

25 第 2 篇 C# 程序设计基础 计算机内部的任何数据都是以二进制保存的, 所以, 程序员只需要关心进制转换的字符串中的结果即可 显式转换可以替代隐式转换, 但隐式转换不能替代显式转换 换句话说, 可以用显式转换的地方, 隐式转换也可以使用, 只要按照程序员的需求自主选择就好 但需要显式转换的地方, 就一定不能用隐式转换 3.5 C# 的用户自定义数据类型 C# 程序使用类型声明创建新类型 类型声明指定了新类型的名字和成员 C# 可由用户自定义类型, 这种类型一般被称做复杂数据类型 本节将和读者一起来研究复杂数据类型 认识枚举类型 枚举其实不是 C# 特有的 与 C 中的枚举一样,C# 中的枚举包含枚举值, 以及与值关联的数字 所谓 枚举, 就是把这种类型数据可取的值一一列举出来 枚举类型是一种特殊的值类型, 是一组已命名的数值常量, 常用于声明一组命名的常数 枚举的类型必须是之前已经讲到的 8 个整型类型之一 枚举用关键字 enum 来声明定义 定义枚举类型的一般格式为 : enum 枚举名 [: 数据类型 ] 成员 1[= 整型常数 1], 成员 2[= 整型常数 2],, 成员 n[= 整型常数 n] 枚举类型常用于归类定义一些在编译时已知范围的, 但是具体值要在执行时才能确定的常量 可以用读者习惯的描述性名称表示枚举中的整数值, 比如, 已知三原色是红 蓝 绿, 它们同属于颜色 可以定义如下 : enum Color Red, Blue, Green 枚举相比普通整数常量有一定的优胜之处, 这主要体现在它使代码更容易阅读理解和更安全 没有指定特定的枚举类型, 那么一般会默认枚举元素的基础类型为 int 默认状态下, 将 0 赋值给枚举对象的第一个元素, 然后对每个后续的枚举元素按 1 递增 但是, 也可以在初始化阶段给元素直接赋值 具体例子如下 : enum Weekdays Mon=1,Tues,Wed,Thur,Fri,Sat,Sun 此时, 枚举成员的值从 1 开始, 而不是从 0 开始, 即 Mon 值为 1,Tues 值为 2, 其后依次加 1, 则最后一个 Sun 值为 7 说明 : 通常允许对枚举进行整型运算 88

26 第 3 章 C# 数据类型 enum Weekdays Mon,Tues,Wed,Thur= -8,Fri=13,Sat,Sun 此时,Mon=0,Tues=1,Wed=2,Thur=-8,Fri=13,Sat=14,Sun=15 通常, 在需要用一组符号来表示一组整数值的情况下, 可以使用枚举 说明 :System.Enum 是引用类型, 而枚举类型又是直接继承自 System.Enum 的, 但是枚举类型却不是引用类型 其实这部分内容涉及 MISL 部分的内容, 简要来说, 枚举类型隐式的继承自 System.Enum, 程序员不能在 C# 里显式声明这种继承关系, 所以枚举类型都是值类型 枚举编程示例 下面通过代码实例为读者具体介绍枚举的语法构成 代码如下 : // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._5._2 // 定义 Program 类 // 定义 Test 枚举类型成员 enum Test A = 1, B, C, D, E, F = 10, G ; // 定义程序的 Main( ) 方法 int x = (int)(test.a); int y = (int)(test.b); int z = (int)(test.f); int m = (int)(test.g); //01... 充当占位符, 将后面的参数对号入座 Console.WriteLine("Test.A = 0", x); Console.WriteLine("Test.B = 0", y); Console.WriteLine("Test.F = 0", z); Console.WriteLine("Test.G = 0", m); Console.Read(); 输出结果为 : 89

27 第 2 篇 C# 程序设计基础 Test.A =1 Test.B =2 Test.F =10 Test.G =11 注意 : 如果移除初始值 A= 1 以及 F=10 的设定, 因为枚举的首项默认的是 0, 那么结果将是 : Test.A =0 Test.B =1 Test.F =5 Test.G =6 创建枚举可以节省大量的时间 使用枚举比使用无格式的整数有如下几个优势 : 枚举可以提高程序的可维护性, 有助于确保给变量指定合法的期望值 ; 枚举使代码简练 清晰 ; 枚举使代码减少录入次数, 提高效率 技巧 : 枚举类型可以通过使用 System.Enum 的 ToString() 方法转换成字符串类型 认识结构类型 结构类型也是一种值类型, 它是一种堆栈 (stack) 分配的复杂数据类型, 它不支持继承 结构主要用于创建小型的对象, 并可以节省内存 结构可以包含构造函数 常量 字段 方法 属性 索引器 运算符 事件和嵌套类型等 但是, 如果同时需要上述几种成员, 则应当将类型更改为类 结构的定义和类的定义基本上是一致的, 语法如下 : //struct 为声明结构的关键字 struct StructName public int structdatamember; // 结构中显示声明的构造函数必须带有参数 public void StructMethod( 参数列表 ) // 结构体实现 结构名称最好是某个现有名词或名词短句 此外, 也可以拥有和类一样的成员 然而, 与类类型不同的是, 结构是值类型, 不需要在堆 (heap) 中分配空间 而且结构不是引用类型, 所以也不支持继承 说明 : 结构被存在堆栈 (stack) 中 结构可以提高存储效能 当一个结构与类有着相同信息的条件下, 结构可以大大地减少对存储空间的占用 结构编程示例 在下例中, 程序创建并初始化 个 points 在类 Point 中需要分配 个独立的 90

28 第 3 章 C# 数据类型 对象 (object) 代码如下 : // 声明使用的命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _3._5._4 // 定义 Point 类 class Point // 公共类型成员变量 public int x, y, z; // 定义类的成员方法 public Point() x = 0; y = 0; z = 0; public Point(int x, int y, int z) this.x = x; this.y = y; this.z = z; // 定义 Program 类 Point[] points = new Point[10000]; // 执行对象 points 的初始化, 其中每个点的坐标值分别为 (x,y,z)=(i,i*2,i*3) for (int i = 0; i < 10000; i++) points[i] = new Point(i, i * 2, i * 3); 很明显, 这个 Point 类繁琐复杂, 当执行 次初始化工作的时候会影响程序的运行速度 类的定义与初始化经常会遇到类似的困境 这时就需要结构来大显身手了 当 Point 被定义为一个结构时, 程序的执行可以简化很多 代码如下 : struct Point public int x, y, z; public Point(int x, int y, int z) this.x = x; this.y = y; this.z = z; 91

29 第 2 篇 C# 程序设计基础 不用考虑编译器的执行效率, 仅从程序的结构上就不难发现, 结构的定义比类要精简颇多! 结构 Point 中的坐标变量利用内联的性质实例化使程序整体得到了优化 注意 : 尽管可以利用结构来简化类的声明以及实现步骤, 但并不是所有情况下都比类优越 作为值类型的结构在传递数据时实际上是在传递数据本身的复制值, 而引用类型的类则是传递值的引用地址 所以当传递结构的时候就会比传递类要慢, 数据量越大差距就越明显 结构也支持方法 在一个结构的默认值的计算过程中, 将所有值类型字段设置为它们的默认值, 并将所有引用类型字段设置为 null, 这样就产生了该结构的默认值 结构可以使用封箱和拆箱操作在结构类型和对象类型之间进行转换 而且, 在结构中声明的实例构造函数必须携带参数 注意 : 结构的赋值是特别需要注意的 对于结构,this 关键字有着不同的意义 结构实例构造函数和实例成员函数中的 this 也和类中的 this 含义有所不同 在类中,this 本质上是一个引用句柄值, 它不可以再被赋值 而在结构中,this 更像一个结构类型的变量, 它可以被赋值 为了便于理解, 下面以一个代码实例来展开论述 首先定义一个描述公司的结构 scompany 代码如下 : struct scompany public string CompanyName; public object CompanyMember; public string CompanyAddress; public int CompanyGradetime; 读者不难看出, 这个声明同类的声明相似 在结构体当中, 声明了 4 个属性变量, 分别用以描述公司名称 公司成员 公司地址, 以及公司的成立年份 由于使用结构的许多限制, 所以读者不必通过 new 关键字对结构进行实例化 但是, 如果不亲自为结构的成员 new 空间使得显式初始化, 那么就永远不会完成该结构初始化 scompany s123456; Console.WriteLine(s CompanyName); 由于没有通过 new 关键字分配空间, 上述代码无疑将会报错 为了纠正这个错误, 改进程序如下列代码所示 : scompany s = new scompany(); Console.WriteLine(s CompanyName); 因为 s companyname 是一个值类型, 所以初始化默认为 0 由于结构不能创建无参数的构造函数, 所以, 以下代码不能编译通过 : 92

30 第 3 章 C# 数据类型 struct scompany public scompany(); public string CompanyName; public object CompanyMember; public string CompanyAddress; public int CompanyGradetime; 但是, 可以利用带有参数的构造函数原型来定义, 代码如下 : struct scompany public scompany(string name, object menber, int number, int gradetime) // 声明 scompany 结构中的名称 成员 地址 成立年份属性 CompanyName = name; CompanyMember = menber; CompanyAddress = address; CompanyGradetime = gradetime; // 类的成员变量 public string CompanyName; public object CompanyMember; public string CompanyAddress; public int CompanyGradetime; 说明 : 结构的语法中没有基类的列表 这是由于结构不能基于其他结构或类, 而且它们也不能作为其他结构或类的基类 结构与类有什么不同 在 C# 中, 结构与类是完全不同的类型, 具体区别如下 : 结构是值类型, 在堆栈 (stack) 上分配地址, 结构之间的赋值可以创建新的结构 ; 而类是引用类型, 在堆 (heap) 上分配地址, 类之间的赋值只是复制引用 从执行效率上来讲, 堆栈要比堆高得多 然而堆栈由于资源的限制, 导致其不适合处理大的逻辑复杂的对象, 所以结构仅适合处理小型对象, 而类则可以处理某个商业逻辑 结构与类都是由 System.Valuetype 派生而来的 类可派生于一个基类, 也可派生于任何多的接口, 结构却不可以 结构不能被继承, 类可以被继承 结构和类都能够继承接口 结构提供默认的不带参的构造函数, 且不允许替换, 但是允许用户自行添加带参的构造函数 相比之下, 类的构造函数允许替换, 带参或者不带参均可 结构没有析构函数, 类有析构函数 93

31 第 2 篇 C# 程序设计基础 结构不能使用 virtual abstract 和 sealed 关键字, 类可以使用 结构不能有 protected 修饰符, 类允许 结构中不能初始化实例字段, 类可以初始化实例字段 结构可以指定字段如何在内存中布局, 类不具备 哪些地方应使用结构类型 通过以上的介绍, 读者可以很自然地意识到结构在效率上相对于类的优越性, 这主要归因于它们在底层的值类型结构 不过, 由于结构对于大容量数据及高复杂度的算法处理时的局限性, 导致其适用范围非常狭窄 如果用户正在从事图像色彩或是固定模式的业务处理程序的设计时, 可以选用结构类型来构造这些小规模数据体 但是, 由于结构实际上是一种复杂的值类型, 所以在编译器中其整体上被定义为一个数据, 这对所有的面向对象操作而言是不利的 注意 : 不要试图在结构里构造过多的方法, 最好是能不定义方法, 就尽量避免定义方法 3.6 本章总结 从本章开始, 读者开始真正接触 C# 语言的代码操作 在本章中, 首先讲解了变量的类型以及定义, 接着又为读者介绍了 C# 语言中数据类型间的转换, 最后为读者详细阐述了常用的复杂数据类型, 枚举和结构 3.7 实战练习 1. 在 Visual Studio 2010 中新建一个控制台应用程序, 编写代码对两个字符串进行连接操作, 最后输出连接后的内容 2. 在 Visual Studio 2010 中新建一个控制台应用程序, 分别输出汉字 中 和 国 的 Unicode 码 提示 : 先将汉字分别保存在两个 char 类型的变量, 然后通过类型转换的方法输出其 Unicode 码 3. 在 Visual Studio 2010 中新建一个控制台应用程序, 将字符串 Visual C# 分解到字符数组中, 然后输出数组中第 8 个元素的内容 4. 在 Visual Studio 2010 中新建一个控制台应用程序, 用一个枚举类型来表示一个星期中的七天, 输出枚举值的数值及其对应的字符串如下所示 94 0 星期日 1 星期一

32 第 3 章 C# 数据类型 2 星期二 3 星期三 4 星期四 5 星期五 6 星期六提示 : 可通过以下代码输出一个枚举量的数值及字符串值 Console.WriteLine("0:d - 0", week. 星期日 ); 95

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

CHAPTER VC#

CHAPTER VC# 1. 2. 3. 4. CHAPTER 2-1 2-2 2-3 2-4 VC# 2-5 2-6 2-7 2-8 Visual C# 2008 2-1 Visual C# 0~100 (-32768~+32767) 2 4 VC# (Overflow) 2-1 2-2 2-1 2-1.1 2-1 1 10 10!(1 10) 2-3 Visual C# 2008 10! 32767 short( )

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

CHAPTER 1

CHAPTER 1 CHAPTER 1 1-1 System Development Life Cycle; SDLC SDLC Waterfall Model Shelly 1995 1. Preliminary Investigation 2. System Analysis 3. System Design 4. System Development 5. System Implementation and Evaluation

More information

任务 3 加法运算练习游戏 019 这就需要用到 C# 语言的基础语法, 如数据类型 运算符和控制语句, 还需要其他的常用控件 在此任务的完成过程中, 读者可以接触到 C# 的数据类型 变量常量 运算符 控制语句等基础语法, 掌握以上知识点及其在软件开发中的应用 3.2 相关知识 预定义

任务 3 加法运算练习游戏 019 这就需要用到 C# 语言的基础语法, 如数据类型 运算符和控制语句, 还需要其他的常用控件 在此任务的完成过程中, 读者可以接触到 C# 的数据类型 变量常量 运算符 控制语句等基础语法, 掌握以上知识点及其在软件开发中的应用 3.2 相关知识 预定义 任务 3 加法运算练习游戏 3.1 情境描述 选择了开发环境并理解了事件驱动机制以后, 要开发项目, 还需掌握 C# 语言的语法 本任务的目标是完成如图 3.1 和图 3.2 所示的小学生加法运算练习游戏 这个小软件的功能是在窗体中的 + 两边出现 2 个 10 以内的随机数, 让用户 ( 适合于小学生 ) 在文本框内输入其和, 然后单击 OK 按钮 若输入的和是正确的, 则跳出一个红色的图片, 同时提示答对了,

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii 前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time

More information

数据结构

数据结构 信息管理与信息系统专业 第 3 章变量与表达式 任课教师 : 吕雅丽 本章内容 3.1 C# 基本数据类型 3.2 常量与变量 3.3 创建并使用枚举类型 3.4 运算符与表达式类型 3.5 运算符的优先级与结合性 2 3.1 C# 基本数据类型 3.1.1 数值类型 1. 整数类型 整数类型又有有符号整数与无符号整数 有符号整数可以带正负号, 无符号整数不需带正负号, 默认为正数 有符号整数包括

More information

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F 1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET 2.0 2.0.NET Framework.NET Framework 2.0 ( 3).NET Framework 2.0.NET Framework ( System ) o o o o o o Boxing UnBoxing() o

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Microsoft PowerPoint - 03.Fortran程序设计基础1

Microsoft PowerPoint - 03.Fortran程序设计基础1 简单 Fortran 90 程序的构造形式 : 第二讲 Fortran 程序设计基础 (2) [PROGRAM 程序名 ] [ 声明语句 ] [ 执行语句 ] END [PROGRAM [ 程序名 ]] 程序的书写 (P5) PROGRAM MONEY!calculate balance after interest compounded! 根据利息计算余额 REAL BALANCE, INTEREST,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 计算概论 A 课程程序设计部分 C++ 语言基本成分 数据成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 再谈, 我们的进度安排 我们的学习过程 感性理性函数指针等 数据成分运算成分控制成分数组字符串 结构化的程序递归 传统学习过程 数据类型与表达式 输入输出 关系运算 控制语句 函数数组指针结构体 作业练习 感性认识作业练习 ( 以抄程序为主 ) 正常作业练习

More information

untitled

untitled 1 Outline 料 類 說 Tang, Shih-Hsuan 2006/07/26 ~ 2006/09/02 六 PM 7:00 ~ 9:30 聯 ives.net@gmail.com www.csie.ntu.edu.tw/~r93057/aspnet134 度 C# 力 度 C# Web SQL 料 DataGrid DataList 參 ASP.NET 1.0 C# 例 ASP.NET 立

More information

PowerPoint Presentation

PowerPoint Presentation 对象与对象的内存模型 北京理工大学计算机学院 金旭亮 对象的内存模型 对象与类的静态成员 装箱和拆箱 主要内容 提示 : 本讲以 C# 为主介绍, 但所讲内容同样适用于 Java 2 一 对象的内存模型 对象是如何 活 在内存中的? 我们如何访问内存中的这个对象? 代码中定义一个对象变量的含义是什么? 对象变量 与 对象 对象变量用于 引用 一个真实的对象 类 引用 new 对象变量 对象 对象变量保存在线程堆栈中

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

北京大学

北京大学 1 string 类 郭炜刘家瑛 北京大学程序设计实习 string 类 string 类是一个模板类, 它的定义如下 : typedef basic_string string; 使用 string 类要包含头文件 string 对象的初始化 : string s1("hello"); // 一个参数的构造函数 string s2(8, x ); // 两个参数的构造函数

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 描述 JSP 表达式语言的语法 认识使用 JSP 表达式的优点 在 JSP 中使用表达式语言 表达式语言简介 5 1 EL 为表达式语言 由两个组开发 JSP 标准标签库专家组 JSP 2.0 专家组 JSP 表达式语言的语法 ${EL Expression} JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 表达式语言简介

More information

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - string_kruse [兼容模式] Strings Strings in C not encapsulated Every C-string has type char *. Hence, a C-string references an address in memory, the first of a contiguous set of bytes that store the characters making up the string.

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 第 2 章 Java 语言基础 通过本章的实践, 要掌握 Java 中的标识符 关键字 常量, 熟练掌握算术 关 系 逻辑 条件 赋值 位运算符的使用, 掌握简单顺序结构的程序设计 2.1 典型习题解答 2.1 Java 中怎样进行注释? 解答 Java 语言中的注释有 3 种形式 : (1) 单行 : // (2) 多行 : /* */ (3) 文档注释 : /** */ 第三种形式是第二种形式的变形,

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

第3章 Java语言基础

第3章 Java语言基础 第 3 章 Java 语言基础 第 1/55 页 习题 3 3. 8. 9. 13. 18. 实验 : 1. 实验 4( 实 P11~12) 2. 实验任务 : 1 例 3.1( 教 P30) 2 变量赋值 ( 教 P29) 3 编写两个缓冲区对应同一个输入流对象, 并键盘输入整型 a 和双精度 b, 求和 第 2/55 页 习题 3 3. 实验任务 : 1 实验 5( 实 P12~13) 2 实验

More information

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式] 用户定义类型 User-defined Datatypes classes and structs 几何向量 (Geometry Vector) 二维平面上的向量由起点和终点构成 每个点包含两个坐标 (x, y), 因此一个向量需要四个实数表示 Start= (0.9,1.5) Start= (0.4,0.8) int main() { double xstart = 0.4; double xend

More information

Guava学习之CharSequenceReader

Guava学习之CharSequenceReader CharSequenceReader 类是以 CharSequence 的形式读取字符 CharSequenceReader 类继承自 Reader 类, 除了 remaining() hasremaining() 以及 checkopen() 函数之后, 其他的函数都是重写 Reader 类中的函数 CharSequenceReader 类声明没有用 public 关键字, 所以我们暂时还不能调用这个类

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Python 入门 孙栩 xusun@pku.edu.cn 1 课程的整体介绍 目录 contents 2 Python 的介绍及如何安装 Python 3 使用 Python 编写简单小程序 1 课程的整体介绍 课程的整体介绍 Python 入门 1. Python 的介绍与安装 2. 变量与表达式 3. 一些简单的小程序 数据结构 1. 字符串 2. 列表 3. 元组 4. 字典 5. 集合 分支与循环

More information

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 CIRCLE 1 Circle 描述 编写一个圆类 Circle, 实现半径的输入 面积的计算和输出 输入 圆的半径 (double 类型 ) 输出 圆的面积 ( 保留小数点后两位 ) 样例输入 3 样例输出 28.27 提示 圆周率的取值需要比较精确, 以保证计算结果的精度 #include

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

untitled

untitled 1 Outline ArrayList 類 列類 串類 類 類 例 理 MSDN Library MSDN Library 量 例 參 列 [ 說 ] [] [ 索 ] [] 來 MSDN Library 了 類 類 利 F1 http://msdn.microsoft.com/library/ http://msdn.microsoft.com/library/cht/ Object object

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

没有幻灯片标题

没有幻灯片标题 第 2 章 C 语言的基本数据类型与表达 式 2. 1 C 语言的语法基础 2. 2 C 语言的基本数据类型 2. 3 常量和变量 2. 4 运算符与表达式 2. 5 数据类型转换 用 第 2 章 C 语言的基本数据类型与表达 2.1 C 语言的语法基础 2. 1. 1 C 语言字符集 式 C 语言的基本符号可分 4 个类, 归纳如下 : (1) 英文字母 : 大小写各 26 个, 共计 52 个

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章流程控制和数组 3.1 实验目的 (1) 熟练掌握控制台应用程序的代码编写和调试, 以及运行方法 (2) 掌握选择结构的一般语法格式和应用 (3) 掌握 switch 语句的用法 (4) 掌握选择结构的嵌套的用法, 能灵活使用选择结构解决实际问题 (5) 掌握 while 循环语句的一般语法格式 (6) 掌握 for 循环语句的一般语法格式 (7) 掌握循环嵌套的语法格式 (8) 掌握一维数组的定义

More information

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 PERSON 1 Person 题目描述 编写程序, 定义一个基类 Person, 包含 name 和 age 两个数据成员 ; 再由它派生出学生类 Student 和教师类 Teacher, 其中学生类添加学号 no 数据, 教师类添加职称 title 数据 ; 要求每个类均有构造函数 析构函数和显示数据的函数

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/ 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:// 不能以数字开头 D._3_ B:// 不能用点和空格 提问 抢答 E.$anothervar C: // 不能用点和空格

More information

<4D F736F F D D0ADD2E9B7D6CEF6CBB5C3F7BCB0B2BFB7D6CAB5CFD6D4B4B4FAC2EB2E646F63>

<4D F736F F D D0ADD2E9B7D6CEF6CBB5C3F7BCB0B2BFB7D6CAB5CFD6D4B4B4FAC2EB2E646F63> GT02 协议分析说明及部分实现源代码 (java 版 ) 版本 :1.0 2010.06.21 一收数据部分 服务端收到的都是字节流 ( 字节数组 ), 处理过程中都是 16 进制处理比较方便, 所以要把字节数组转换成 16 进制字符串 使用 Byte2Hex.Bytes2HexString(byte[] readbytes) 将字节数组转换成 16 进制字符串供以后业务流程使用 二收到数据后的解析

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程

Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程 Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程序大小超过 256M 是未定义的 解释 : 我们测试用的源程序大小不会超过 256M 2 程序结构 Mx*

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

untitled

untitled 1 MSDN Library MSDN Library 量 例 參 列 [ 說 ] [] [ 索 ] [] 來 MSDN Library 了 類 類 利 F1 http://msdn.microsoft.com/library/ http://msdn.microsoft.com/library/cht/ Object object 參 類 都 object 參 object Boxing 參 boxing

More information

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th 计算机组成原理习题课 1 授课老师 : 王浩宇 haoyuwang@bupt.edu.cn 1 练习 : 机器数的表示和相互转化 练习 1: 当十六进制数 9B 和 FF 分别表示为原码 补码 反码 移码和无符号数时, 所对应的十进制数各为多少 ( 设机器数采用一位符号位 )? 16 进制 真值 无符号数 原码 ( 真值 ) 反码 ( 真值 ) 补码 ( 真值 ) 移码 ( 真值 ) 9BH 二进制十进制

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63> 基于 WINCE 平台 C# 编程要点之一 本文主要介绍在基于 Windows CE 平台的英创嵌入式主板下进行 C#(Microsoft Visual Stdio.Net 2005) 应用程序开发时会常常用到的一些功能函数以及开发方法, 这些方法适用于英创采用 WinCE 平台的所有型号嵌入式主板, 包括 EM9000 EM9260 EM9160 等 本文要点包括 : 文件的删除和复制 如何获取存取设备的空间大小

More information

汹涌澎湃汹涌澎湃汹涌澎湃汹涌澎湃

汹涌澎湃汹涌澎湃汹涌澎湃汹涌澎湃 第 3 章 变量和表达式 要想高效地学习 C# 的用法, 重要的是理解创建计算机程序时需要做什么 计算机程序最基本的描述也许是一系列处理数据的操作, 即使是最复杂的示例, 这个论述也正确, 例如, Microsoft Office 套装软件之类的大型多功能的 Windows 应用程序 应用程序的用户虽然看不到它们, 但这些操作总是在后台进行 为了进一步解释它, 考虑一下计算机的显示单元 我们常常比较熟悉屏幕上的内容,

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

class sometimes { int naive; void make_money() { this.naive++; int main() { sometimes keep = new sometimes; keep.naive = 0; while (getint() < Wallace)

class sometimes { int naive; void make_money() { this.naive++; int main() { sometimes keep = new sometimes; keep.naive = 0; while (getint() < Wallace) Mx* Language Reference Manual 2017 年 3 月 8 日 1 用词说明 未定义 指中央还没有表态指规范并没有定义该情况发生时语言的表现 初衷是为了给同学们提供一些自己发挥的空间, 在测试数据里, 这些没有定义的情况是不会发生的 例 : 术语 : 编译器接受源代码长度如果超过 1M, 结果是未定义的 解释 : 我们测试用的源代码长度不会超过 1M, 可以假设测试数据不会出现这种情况

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 WWW PHP 2003 1 Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 Comments PHP Shell Style: # C++ Style: // C Style: /* */ $value = $p * exp($r * $t); # $value

More information

长 安 大 学 硕 士 学 位 论 文 基 于 数 据 仓 库 和 数 据 挖 掘 的 行 为 分 析 研 究 姓 名 : 杨 雅 薇 申 请 学 位 级 别 : 硕 士 专 业 : 计 算 机 软 件 与 理 论 指 导 教 师 : 张 卫 钢 20100530 长安大学硕士学位论文 3 1 3系统架构设计 行为分析数据仓库的应用模型由四部分组成 如图3 3所示

More information

Microsoft Word - ch04三校.doc

Microsoft Word - ch04三校.doc 4-1 4-1-1 (Object) (State) (Behavior) ( ) ( ) ( method) ( properties) ( functions) 4-2 4-1-2 (Message) ( ) ( ) ( ) A B A ( ) ( ) ( YourCar) ( changegear) ( lowergear) 4-1-3 (Class) (Blueprint) 4-3 changegear

More information

CORBA IDL 部分语法 octet 8 位 8 位数保证传递过程中不变 (char 不是 ) IDL 提供两个模板类型 :sequence ( 序列 ) 和 string ( 字符串 ) 象数组一样, 要用 typedef 指定 sequence 和 string 类型的名字 一个序列是一个可

CORBA IDL 部分语法 octet 8 位 8 位数保证传递过程中不变 (char 不是 ) IDL 提供两个模板类型 :sequence ( 序列 ) 和 string ( 字符串 ) 象数组一样, 要用 typedef 指定 sequence 和 string 类型的名字 一个序列是一个可 CORBA IDL 部分语法 octet 8 位 8 位数保证传递过程中不变 (char 不是 ) IDL 提供两个模板类型 :sequence ( 序列 ) 和 string ( 字符串 ) 象数组一样, 要用 typedef 指定 sequence 和 string 类型的名字 一个序列是一个可变长度成员清单, 成员可以为任何 IDL 类型 它象一维数组, 但长度是 不定的 它可以是有界的也可以是无界的,

More information

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点 复习 Protected 可以被子类 / 同一包中的类访问, 不能被其他类访问 弱化的 private 同时赋予 package access class MyType { public int i; public double d; public

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

Microsoft Word - 97.01.30軟體設計第二部份範例試題_C++_ _1_.doc

Microsoft Word - 97.01.30軟體設計第二部份範例試題_C++_ _1_.doc 電 腦 軟 體 設 計 乙 級 技 術 士 技 能 檢 定 術 科 測 試 範 例 試 題 (C++) 試 題 編 號 :11900-920201-4 審 定 日 期 : 94 年 7 月 1 日 修 訂 日 期 : 96 年 2 月 1 日 97 年 1 月 30 日 ( 第 二 部 份 ) 電 腦 軟 體 設 計 乙 級 技 術 士 技 能 檢 定 術 科 測 試 應 檢 參 考 資 料 壹 試

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class - Table.class

More information

untitled

untitled Inside ASP.NET 2.0- ASP.NET 1.1 2. 理念 讀 了 了 度 讀 了 理 類 來 來說 流 了 來 來 來 來 理 來 不 讀 不 不 力 來參 流 讀 了 異 行 來了 錄 行 不 了 來 了 來 行 論說 了 更 不 例 來了 力 行 樂 不 說 兩 例 利 來 了 來 樂 了 了 令 讀 來 不 不 來 了 不 旅行 令 錄 錄 來 了 例 來 利 來 ManagerProvide

More information

untitled

untitled 1 7 7.1 7.2 7.3 7.4 7.5 2 7.1 VFT virtual 7.1 3 1 1. 2. public protected public 3. VFT 4. this const volatile 4 2 5. ( ) ( ) 7.1 6. no-static virtual 7.2 7. inline 7.3 5 3 8. this this 9. ( ) ( ) delete

More information

Spring3.x开发入门

Spring3.x开发入门 Spring Bean 管理 Spring 的工厂类 课程安排 Spring 的 Bean 管理 (XML 方式 ) Spring 的属性注入 (XML 方式 ) Spring 的 Bean 管理 ( 注解方式 ) Spring 的属性注入 ( 注解方式 ) Spring 的工厂类 Spring 的 Bean 管理 (XML 方式 ) 三种实例化 Bean 的方式 使用类构造器实例化 ( 默认无参数

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

Microsoft PowerPoint - 10 模板 Template.pptx

Microsoft PowerPoint - 10 模板 Template.pptx 模板 Tempalte 泛型编程的需要 Why Templates? 设想你对整数类型实现了一个排序算法 : void sort(int *is,int n); 用该函数可以对实 复数或工资单排序吗? 模板可以复用源代码 - 泛型编程. inline void Swap( int &x, int &y){ int t = x; x = y; y =t; inline void Swap(double

More information

class sometimes { int naive; void make_money() { this.naive++; int main() { sometimes keep = new sometimes; keep.naive = 0; while (getint() < Wallace)

class sometimes { int naive; void make_money() { this.naive++; int main() { sometimes keep = new sometimes; keep.naive = 0; while (getint() < Wallace) Mx* Language Reference Manual 2017 年 4 月 3 日 1 用词说明 未定义 (Undefined Behavior) 指中央还没有表态指规范并没有定义该情况发生时语言的表现 初衷是为了给同学们提供一些自己发挥的空间, 在测试数据里, 这些没有定义的情况是不会发生的 例 : 术语 : 编译器接受源代码长度如果超过 1M, 结果是未定义的 解释 : 我们测试用的源代码长度不会超过

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378> 第 1 部分 Visual Studio 6.0 开发环境介绍 本书以 Visual C++ 6.0 作为 C 源程序的实践开发环境, 本章将首先介绍 Visual C++ 6.0 环境的基本操作, 包括 Visual C++ 6.0 的安装和启动,C 源程序的编辑 运行与调试 1.1 安装与启动 Visual C++ 6.0 MSDN Visual C++ 6.0 1.1 Microsoft Visual

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

Microsoft PowerPoint - C语言课件-9-结构体.pptx

Microsoft PowerPoint - C语言课件-9-结构体.pptx 第九章结构体 郎大鹏 第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题 9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10];

More information

第一章三角函数 1.3 三角函数的诱导公式 A 组 ( ) 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角, 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C 2 ( 中诱导公式 ) ( ) B. cos(

第一章三角函数 1.3 三角函数的诱导公式 A 组 ( ) 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角, 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C 2 ( 中诱导公式 ) ( ) B. cos( 第一章三角函数 1. 三角函数的诱导公式 A 组 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C ( 中诱导公式 ) B. cos( B C) cos A D. sin( B C) sin A sin60 cos( ) sin( 0 )cos( 70 ) 的值等于

More information