VisualC#语法基础.ppt_第1页
VisualC#语法基础.ppt_第2页
VisualC#语法基础.ppt_第3页
VisualC#语法基础.ppt_第4页
VisualC#语法基础.ppt_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

第2章VisualC NET语法基础 内容简介 设计C 程序的主要目的是完成数据的运算与管理 C 支持丰富的数据类型 运算符以及控制流程的语句 是实现这一目的的基础保证 在编写C 程序时 不同类型的数据都必须遵循 先定义 后使用 的原则 本章主要介绍C 程序的基本结构以及基本数据类型 常量 变量 运算符和表达式等基础知识 目录 2 1C 程序结构 2 2基本数据类型 2 6值类型 2 7本章小结 2 3变量与常量 2 5引用类型 2 4运算符与表达式 2 1C 程序结构 2 1 1程序的组成要素C 程序支持控制台应用程序 Windows应用程序和Web应用程序 其中控制台应用程序是字符界面的 其余两类应用程序是图形界面 这三种应用程序的操作模式基本相同 也具有相同或相近的组成要素 2 1 1程序的组成要素 1 标识符2 关键字3 语句4 注释5 命名空间6 类的定义和类的成员7 C 程序中的方法 2 1 1程序的组成要素 1 标识符与Java中定义及命名规则相同 区分大小写 关键字不可以用作普通标识符 但可以用 前缀来避免这种冲突 这是Java中不具有的特性 例如 int bool 3 Console WriteLine bool System Threading Thread Sleep 1000 C 中标识符的命名约定类名约定首字母大写变量名 方法名等则约定使用Camel命名法 2 1 1程序的组成要素 2 关键字关键字 keyword 是C 程序语言保留作为专用的有特定意义的字符串 不能作为通常的标识符来使用 在C 语言中主要有如下关键字 abstract as base bool break byte case catch char checked class const continue decimal defaultdelegate do double else enum event explicit extern false finally fixed float for foreach get goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed set short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe using value virtual volatile while 2 1 1程序的组成要素 3 语句语句是应用程序中执行操作的一条命令 C 代码由一系列语句组成 每条语句都必须以分号结束 可以在一行中书写多条语句 也可以将一条语句书写在多行上 使用 来表示应用程序中的不同层次和代码块 提示 为了表示代码的结构层次 要注意语句的缩进 虽然缩进在程序格式中不是必须的 但缩进可以清晰地显示出程序的结构层次 这是一种良好的编程习惯 2 1 1程序的组成要素 4 注释 1 行注释 使用行注释标识符 表示该标识符后的 一行 为注释部分 2 块注释 块注释分别以 和 为开始和结束标识符 在此中间的内容 均为注释的部分 3 文档注释 在C 中 还可以用 符号来开头 在一般情况下 编译器也会忽略它们 但可以通过配置相关工具 在编译项目时 提取注释后面的文本 创建一个特殊格式的文本文件 该文件可用于创建文档说明书 例如 2 1 1程序的组成要素 namespaceConsoleApplication1 classProgram 这是一个控制台程序 没有返回值staticvoidMain string args System Console WriteLine 参数1 args 0 System Console ReadLine 2 1 1程序的组成要素 5 命名空间命名空间有两种 系统命名空间和用户自定义命名空间 系统命名空间是一个逻辑的命名系统 用来组织庞大的系统类资源 让开发者使用起来结构清晰 层次分明 使用简单 同时 用户也可以使用自定义的命名空间以解决应用程序中可能出现的名称冲突 2 1 1程序的组成要素 5 命名空间 1 定义命名空间 在C 中定义命名空间的语法格式如下 namespaceSpaceName 上述格式中 namespace为声明命名空间的关键字 SpaceName为命名空间的名称 在花括号中间的内容都属于名称为SpaceName的命名空间的范围 其中可以包含类 结构 枚举 委托和接口等可在程序中使用的类型 2 1 1程序的组成要素 2 嵌套命名空间 命名空间内包含的可以是类 结构 枚举 委托和接口 同时也可以在命名空间中包含其他命名空间 从而构成树状层次结构 例如 namespaceWrox namespaceProCSharp namespaceBasics classClassExample Codefortheclasshere 每个类名的全称都由它所在命名空间的名称与类名组成 这些名称用 隔开 首先是最外层的命名空间 最后是它自己的短名 2 1 1程序的组成要素 3 using语句 当出现多层命名空间嵌套时 键入起来很繁琐 为此 要在文件的顶部列出类所在的命名空间 前面加上using关键字 在文件的其他地方 就可以使用其类型名称来引用命名空间中的类型了 例如 usingSystem usingWrox ProCSharp 所有的C 源代码都以语句 usingSystem 开头 因为Microsoft提供的许多有用的类都包含在System命名空间中 2 1 1程序的组成要素 6 类的定义和类的成员每一个C 应用程序都必须借助于 NETFramework类库实现 因此必须使用using关键字把 NETFramework类库相应的命名空间引入到应用程序的项目中来 C 的源代码必须存放到类中 一个C 应用程序至少要包括一个自定义类 自定义类使用关键字class声明 其名字是一个标识符 类的成员包括属性 方法和事件 主要由方法构成 例如控制台应用程序或Windows应用程序必须包含Main方法 Main方法是应用程序的入口 程序的运行时 从Main方法的第一条语句开始执行 直到执行完最后一条语句为止 2 1 1程序的组成要素 7 C 程序中的方法C 应用程序中的方法一般包括方法头部和方法体 方法头部主要包括返回值类型 方法名 形式参数 简称 形参 类型及名称 若方法中包含多个形参 形参之间用逗号分隔 方法体使用一对 括起来 通常包括声明部分和执行部分 声明部分用于定义变量 执行部分可以包含赋值运算 算法运算 方法调用等语句或语句块 2 1 2语法格式中的符号约定 表2 1列出了VisualC NET参考的语法格式中常用的符号约定 2 2基本数据类型 C 中的数据类型 值类型 引用类型 指针类型 仅用于安全代码中 整数类型 浮点类型 字符类型 Decimal类型 布尔类型 类 接口 委托 数组 简单类型 枚举类型 结构类型 2 2基本数据类型 值类型值类型的数据存储在内存的堆栈中 可以提供快速访问 如果变量是值类型的 这个变量包含实际数据 在一个独立的内存区域保存自己的值 如果在代码中修改其值 在内存中会保存修改后的值 当值类型在方法体内被声明时 它们都是被放置到栈上的 值类型有时也会被放置到堆上 记住这条规则 值类型总是放在它们被声明的地方 如果一个值类型数据在方法体外被声明 且存在于一个引用类型中 那么它将被堆总的引用类型所取代 引用类型引用类型指向存储在内存堆中的数据的指针或引用 与纯粹的地址不同 引用总是指向一个对象 而且这个对象具有指定的类型 并且在堆上分配了存储空间 2 2基本数据类型 2 2 1数值类型2 2 2字符类型2 2 3布尔类型和对象类型 2 2基本数据类型 2 2 1数值类型数值类型可以分为整数类型和实数类型 1 整数类型C 中支持8种整数类型 sbyte byte short ushort int uint long ulong 这8种类型通过其占用存储空间的大小以及是否有符号来存储不同极值范围的数据 根据实际应用的需要 选择不同的整数类型 整数类型的相关说明如表2 2所示 2 2 1数值类型 2 实数类型实数类型包括浮点型和小数型 decimal 浮点型又包括单精度浮点型 float 和双精度浮点型 double 浮点型数据一般用于表示一个有确定值的小数 计算机对浮点数的运算速度大大低于对整数的运算速度 数据的精度越高 对计算机的资源要求越高 因此 在精度要求不是很高的情况下 尽量使用单精度类型 占用4个字节 如果精度要求较高的情况 则可以使用双精度类型 占用8个字节 因为使用浮点型表示小数的最高精度只能够达到16位 为了满足高精度的财务和金融计算领域的需要 C 提供了小数型 占用12个字节 实数类型数据的相关说明如表2 3所示 2 2 2字符类型 字符类型包括字符型 char 和字符串型 string 字符包括数字字符 英文字母 表达式符号等 C 提供的字符类型按照国际上公认的标准 采用Unicode字符集 字符型是指单个字符 一个Unicode的标准字符长度为16位 占用2个字节 char是类System Char的别名 字符串型是指多个字符 其占用字节根据字符数量而定 允许不包含字符的空字符串 string是类System String的别名 2 3变量与常量 在程序处理数据的过程中 常量和变量用来标识数据 2 3 1变量2 3 2常量2 3 3类型转换 2 3 1变量 在程序运行过程中 其值可以改变的量称为变量 变量可以用来保存从外部或内部接收的数据 也可以保存在处理过程中产生的中间结果或最终结果 在C 中 每一个变量都必须具有变量名 存储空间和取值等属性 1 变量的声明要使用变量 就必须声明它们 即给变量指定一个名称和一种类型 变量命名应遵循标识符的命名规则 如 必须以字母 下划线等Unicode字符开头 不能以数字开头 不能包含空格 声明了变量后 编译器才会申请一定大小的存储空间 用来存放变量的值 2 3 1变量 1 变量的声明一个语句可以定义多个相同类型的变量 变量间用逗号分隔 标识符和变量类型之间至少要有一个空格 定义变量的语句以分号结束 例如 inta b c floatm n charch1 ch2 下面给出一些非法的变量名的例子 int3a 不合法 以数字开头floatnamespace 不合法 与关键字名称相同 2 3 1变量 2 变量的赋值在C 中 变量必须赋值后才能引用 为变量赋值 一般使用等号 例如 charch1 ch2 ch1 O ch2 K inta b c a b c 0 2 3 1变量 3 变量的初始化变量的初始化就是在定义变量的同时给变量赋初值 其一般形式为 数据类型变量名1 初值1 变量名2 初值2 例如 floatf1 1 25 f2 3 6 f3 例2 1 变量的定义和使用 2 3 2常量 在程序运行过程中 其值保持不变的量称为常量 常量类似于数学中的常数 常量可分为直接常量和符号常量两种形式 1 直接常量所谓直接常量 就是在程序中直接给出的数据值 在C 中 直接常量包括整型常量 浮点型常量 小数型常量 字符型常量 字符串常量和布尔型常量 2 3 2常量 1 直接常量 1 整型常量 整型常量分为有符号整型常量 无符号整型常量和长整型常量 有符号整型常量写法与数学中的常数相同 直接书写 无符号整型常量在书写时添加u或U标志 长整型常量在书写时添加l或L标记 例如 3 3U 3L 2 浮点型常量 浮点型常量分为单精度浮点型常量和双精度浮点型常量 单精度浮点型常量在书写时添加f或F标记 双精度浮点型常量添加d或D标记 例如 7f 7d 需要注意的是 以小数形式直接书写而未加标记时 系统将自动解释成双精度浮点型常量 例如 9 0即为双精度浮点型常量 2 3 2常量 3 小数型常量 在C 中 小数型常量的后面必须添加m或M标记 否则就会被解释成标准的浮点型数据 C 中的小数和数学中的小数是有区别的 例如 5 0M 4 字符型常量 字符型常量是一个标准的Unicode字符 使用两个单引号来标记 例如 5 d 昱 都是标准的字符型常量 C 还允许使用一种特殊形式的字符型常量 即以反斜杠 开头 后面跟字符的字符序列 这种字符型常量被称为转义字符常量 该形式的常量可以表示控制字符或不可见字符 当然也可以表示可见字符 例如 n 表示换行符 而 x41 则表示字符A C 中常用的转义字符如表2 4所示 2 3 2常量 5 字符串常量 字符串常量表示若干个Unicode字符组成的字符序列 使用两个双引号来标记 例如 5 abc 清华大学 都是字符串 6 布尔型常量 布尔型常量只有两个 一个是true 表示逻辑真 另一个是false 表示逻辑假 2 3 2常量 2 符号常量符号常量使用const关键字定义 格式为 const类型名称常量名 常量表达式 常量表达式 不能包含变量 函数等值会发生变化的内容 可以包含其他已定义常量 如果在程序中非常频繁地使用某一常量 可以将其定义为符号常量 例如 constdoublePI 3 14159 例2 2 不同类型的常量格式测试 2 3 3类型转换 在程序处理数据的过程中 经常需要将一种数据类型转化为另一种数据类型 数据类型的转换方式有两种 隐式转换和显式转换 1 隐式转换隐式转换一般发生在数据进行混合运算的情况下 是由编译系统自动进行的 不需要加以声明 在该过程中 编译器无需对转换进行详细检查就能够安全地执行转换 隐式转换一般不会失败 不会出现致命隐患或造成信息丢失 例如 shorts 1 inti s 需要注意的是 隐式转换无法完成由精度高的数据类型向精度低的类型转换 例如 inti 1 shorts i 错误 如果必须进行转换 就应该使用显式类型转换 2 3 3类型转换 1 隐式转换隐式转换需要遵循如下规则 1 参加运算的数据类型不一致 先转换成同一类型 再进行计算 不同类型数据进行转换时 按照数据长度增加的方向进行 以保证数据精度不降低 例如 int型数据与long型进行运算 则先把int型数据转换成long型再计算 2 所有浮点型数据都是以双精度型进行的 例如 表达式5 3 5f 2 8d的3项先全部转换成双精度再进行运算 3 byte和short型数据参与运算时 必须先转换成int型数据 4 char类型可以隐式转换成ushort int uint long float double或decimal类型 但其他类型不能隐式转换成char类型 2 3 3类型转换 2 显式转换显式类型转换 又称为强制类型转换 该方式需要用户明确的指定转换的目标类型 该类型转换的一般形式为 类型说明符 需要转换的表达式 例如 shorts 7 inti int s 将s的值显式转化为int类型 并赋值于int类型变量i显式转换包含所有的隐式类型转换 即把任何编译器允许的隐式类型转换写成显式转换都是合法的 显式类型转换并不一定总是成功 且转换过程中会出现数据丢失 2 3 3类型转换 2 显式转换需要注意的是 使用显式转换时 如果要转换的数据不是单个变量 需要加圆括号 在转换过程中 仅仅是为本次运算的需要对变量的长度进行临时性转换 而不是改变变量定义的类型 例如 floata 3 5f inti int a 5 1 把表达式a 5 1的结果转换为int型 但a的类型为float 值仍然是3 5f 2 3 3类型转换 3 使用方法进行数据类型的转换 1 Parse方法Parse方法可以将特定格式的字符串转换为数值 其使用格式为 数值类型名称 Parse 字符串型表达式 例如 inti int Parse 100 字符串符合整型格式 转换成功intj int Parse 100 0 字符串不符合符合整型格式 出错 2 Convert类的方法 3 ToString方法 2 3 3类型转换 3 使用方法进行数据类型的转换 1 Parse方法 2 Convert类的方法Convert类提供了常用的方法将数字字符串转化为相应的数值 如ToBoolean ToByte ToChar ToInt32 ToSingle等方法 Convert类还提供了ToString方法将其他数据类型转换为字符串 提供了ToChar方法将整型的ASCII码值转换为对应字符 例如 strings 97 intn Convert ToInt32 s n 97charc Convert ToChar n ASCII码为97的字符是a c a 2 3 3类型转换 3 使用方法进行数据类型的转换 1 Parse方法 2 Convert类的方法 3 ToString方法ToString方法可将其他数据类型的变量值转换为字符串类型 其使用格式为 变量名称 ToString 其中 变量名称 也可以是某个方法的调用 例如 intn 97 strings n ToString s 97 stringt Convert ToChar n ToString t a 例2 3 数值字符串与数值之间的转换 2 4运算符与表达式 2 4 1运算符与表达式类型运算符用于对操作数进行特定的运算 而表达式则是运算符和相应的操作数按照一定的规则连接而成的式子 常见的运算符有算术运算符 字符串运算符 关系运算符和逻辑运算符等 相应的 表达式也可分为算术表达式 字符串表达式 关系表达式和逻辑表达式等 2 4 1运算符与表达式类型 1 算术运算符和算术表达式算术运算符有一元运算符与二元运算符 一元运算符包括 取正 取负 自增 自减 二元运算符包括 加 减 乘 除 求余 与 只能用于变量 当 或 运算符置于变量的左边时 称之为前置运算 表示先进行自增或自减运算再使用变量的值 而当 或 运算符置于变量的右边时 称之为后置运算 表示先使用变量的值再自增或自减运算 二元运算符的意义与数学意义相同 其中 求余 运算符是以除法的余数作为运算结果 求余运算也叫求模 例如 intx 7 2 5 3 1 x的值为4 2 4 1运算符与表达式类型 2 字符串运算符与字符串表达式字符串运算符只有一个 即 运算符 表示将两个字符串连接起来 例如 strings1 abc 123 s1的值为 abc123 运算符还可以将字符串型数据与一个或多个字符型数据连接在一起 例如 strings2 Hello 你 好 s2的值为 Hello你好 2 4 1运算符与表达式类型 3 关系运算符与关系表达式关系运算又叫比较运算 实际上是逻辑运算的一种 关系表达式的返回值总是布尔值 关系运算符用于对两个操作数进行比较 以判断两个操作数之间的关系 C 中定义的比较操作符有 等于 不等于 大于 大于或等于 关系表达式的运算结果只能是布尔型值 要么是true 要么是false 例如 设置变量i 1 j 2 则关系表达式i j的结果为true 2 4 1运算符与表达式类型 4 逻辑运算符与逻辑表达式C 语言提供了4类逻辑运算符 条件与 或 逻辑与 条件或 或 逻辑或 逻辑非 和 逻辑异或 其中 和 都是二元操作符 而 为一元操作符 它们的操作数都是布尔类型的值或表达式 或 表示对两个操作数的逻辑与操作 其区别在于 利用 计算时 当第1个操作数为false时 不再计算第2个操作数的值 而利用 计算时 则还要计算第2个操作数的值 或 表示对两个操作数的逻辑或操作 其区别在于 利用 计算时 当第1个操作数为true时 不再计算第2个操作数的值 而利用 计算时 则还要计算第2个操作数的值 2 4 1运算符与表达式类型 4 逻辑运算符与逻辑表达式 表示对某个布尔型操作数的值求反 即当操作数为false时 运算结果为true 表示对两个布尔型操作数进行异或运算 当两个操作数不一致时 其结果为true 否则为false 提示 在C 中 三个运算符可用于将两个整型数以二进制方式进行按位与 按位或 按位异或运算 运算符可以进行按位取反运算 分别用于左移位和右移位 2 4 1运算符与表达式类型 5 其他运算符与表达式 1 typeof运算符 typeof操作符用于获取类型的System Type对象 具体使用方法 如下 Console WriteLine typeof System Int32 输出System Int32Console WriteLine typeof float 输出System SingleConsole WriteLine typeof double 输出System Double在C 中 标识一个整型变量时 使用int和System Int32是同一个效果 typeof操作符就是将C 中的数据类型转化为 NET框架中的类型 2 4 1运算符与表达式类型 2 new运算符 new操作符用于创建一个新的类型实例 通常用于创建一个类的实例 例如 Formfrm newForm 3 条件操作符 条件操作符 也称为三元操作符 对条件表达式b x y 先计算条件b 然后进行判断 如果b的值为true 计算x的值 运算结果为x的值 否则 计算y 运算结果为y的值 三元操作符绝不会既计算x又计算y 条件操作符是从右至左结合的 例如 表达式a b c d e将按a b c d e 形式执行 2 4 2运算符的优先级 运算符的优先级 是指当一个表达式中包含多种类型的运算符时 先进行哪种运算 表2 6总结了常用运算符从高到低的优先级顺序 2 5引用类型 从数据存储的角度 C 的类型可分为值类型和引用类型 一个具有引用类型的数据并不驻留在栈内存中 而是存储于堆内存中 在堆内存中分配内存空间直接存储所包含的值 而在栈内存中存放定位到存储具体值的索引位置编号 当访问一个具有引用类型的数据时 需要到栈内存中检查变量的内容 而该内容指向堆中的一个实际数据 C 的引用类型包括类 接口 委托 数组和字符串等 2 5 1类 class 类是C 面向对象程序设计中最重要的组成部分 是最基本的编程单位 它由若干个数据成员 方法成员等组成 C 中的类需要使用class关键字来进行表示和声明 一个完整的类的定义示例如下 classStudent intno stringname charsex intscore publicstringAnswer stringresult 该考生信息如下 result n学号 no result n姓名 name returnresult 2 5 2接口 interface 接口是一种特殊的数据类型 接口与类的关系是 接口负责声明类的标准行为 而类负责实现这些行为 使用接口来设计程序的最大好处是实现了软件设计的规范化和标准化 在C 中 接口类型使用interface进行标识 一个完整的接口示例如下 interfaceIStudent 声明接口 stringAnswer 注意 方法中不能够包含任何语句 2 5 3委托 delegate 委托 delegate 相当于C 中指向函数的指针 但与C 的指针不同 委托完全是面向对象的 它把一个对象实例和方法都进行封装 所以委托是安全的 C 使用delegate来标记一个委托 其一般形式如下 delegate返回值类型委托名称 方法参数列表 一个完整的委托示例如下 delegatevoidMyDelegate 声明委托其中 MyDelegate是委托的名称 void表示该委托所指向的方法无返回结果 圆括号中没有方法参数列表 表示该委托指向的方法不需要参数 例2 4 委托的简单应用 Example2 4 2 5 3委托 delegate 其实他们是有区别的 在非托管C C 中 函数的地址就是一个内存地址 该地址不会携带任何额外的信息 例如函数期望的参数个数 参数类型 函数的返回值类型及函数的调用约定 总之 非托管C C 中函数指针是非类型安全的 而 NET中的委托是类型安全的 委托会检测他所保存的函数引用是否和声明的委托匹配 2 5 4数组 array 数组是指同类数据组成的集合 它是数据最常用的存储方式之一 数组中包含的变量称为数组的元素 数组元素可以是包括数组类型在内的任何类型 C 支持的数组种类 一维数组 规则的多维数组 不规则多维数组数组能够存储整型 字符串等类型的数据 但是不论数组存储了多少个数据 其中的数据必须是同一种类型 2 5 4数组 array 数组的概念可以把数组看成是很多个变量的集合 这些变量具有相同的类型 它们在内存中是连续存放的 这些变量均具有相同的名称 并且可以通过下标相互区分 每一个这样的变量我们把它称为数组元素 如假设存放300个学生数学成绩的数组名为cj 要求出所有学生的数学的平均分 可使用下列语句 aver 0 0 for i 0 i 300 i aver aver cj i aver aver 300 2 5 4数组 array 数组的定义一般而言 数组都必须先声明后使用 在C C 这样一类语言中 数组在声明时 就要明确数组的元素个数 由编译器分配存储空间 但在C 中数组是一个引用型类型 声明数组时 只是预留一个存储位置以引用将来的数组实例 实际的数组对象是通过new运算符在运行时动态产生的 因此在数组声明时 不需要给出数组的元素个数 数组的声明与创建 1 一维数组 1 一维数组声明语法形式type arrayName 其中 type 可以是C 中任意的数据类型 表明后面的变量是一个数组类型 必须放在数组名之前arrayName 数组名 遵循标识符的命名规则例如 int a1 a1是一个含有int类型数据的数组double f1 f1是一个含有double类型数据的数组string s1 s1是一个含有string类型数据的数组 数组的声明与创建 2 创建数组对象用new运算符创建数组实例 有二种基本形式 声明数组和创建数组分别进行 type arrayName 数组声明 必须放在数组名前arrayName newtype size 创建数组实例其中 size 表明数组元素的个数声明数组和创建数组实例也可以合在一起写 type arrayName newtype size 例如 int a1 a1 newint 10 a1是一个有10个int类型元素的数组string s1 newstring 5 s1是含有5个string类型的数组 数组的声明与创建 2 多维数组 1 多维数组声明语法形式type arrayName 多维数组就是指能用多个下标访问的数组 在声明时方括号内加逗号 就表明是多维数组 有n个逗号 就是n 1维数组 例如 int score score是一个int类型的二维数组float table table是一个float类型的三维数组 数组的声明与创建 3 创建数组对象声明数组和创建数组分别进行 type arrayName 数组声明arrayName newtype size1 size2 size3 创建数组实例size1 size2 size3 分别表明多维数组每一维的元素个数声明数组和创建数组实例也可以合在一起写 type arrayName newtype size1 size2 size3 例如 int score score newint 3 4 score是一个3行4列的二维数组float table newfloat 2 3 4 table是一三维数组 每维分别是2 3 4 3 不规则数组一维数组和多维数组都属于矩形数组 而C 所特有的不规则数组是数组的数组 它的内部每个数组的长度可以不同 就像一个锯齿形状 不规则数组声明type arrayName 方括号 的个数与数组的维数相关 例如 int jagged jagged是一个int类型的二维不规则数组创建数组对象以二维不规则数组为例 int jagged jagged newint 3 jagged 0 newint 4 jagged 1 newint 2 jagged 2 newint 6 数组的声明与创建 数组的初始化 1 一维数组初始化语法形式1 type arrayName newtype size val1 val2 valn 数组声明与初始化同时进行时 size也就是数组元素的个数必须是常量 而且应该与大括号内的数据个数一致 语法形式2 type arrayName newtype val1 val2 valn 省略size 由编译系统根据初始化表中数据个数 自动计算数组大小 语法形式3 type arrayName val1 val2 valn 数组声明与初始化同时进行 还可以省略new运算符 语法形式4 type arrayName arrayName newtype size val1 val2 valn 数组的初始化 1 一维数组初始化把声明与初始化分开在不同的语句中进行时 size同样可以缺省 也可以是一个变量 例如 以下数组初始化实例都是等同的 int nums newint 10 0 1 2 3 4 5 6 7 8 9 int nums newint 0 1 2 3 4 5 6 7 8 9 int nums 0 1 2 3 4 5 6 7 8 9 int nums nums newint 10 0 1 2 3 4 5 6 7 8 9 注意 C 中不允许部分初始化 数组的初始化 2 多维数组初始化多维数组初始化是通过将对每维数组元素设置的初始值放在各自的一个大花括号内完成 以最常用的二维数组为例来讨论 语法形式1 type arrayName newtype size1 size2 val11 val12 val1n val21 val22 val2n valm1 valm2 valmn 数组声明与初始化同时进行 数组元素的个数是size1 size2 语法形式2 type arrayName newtype val11 val12 val1n val21 val22 val2n valm1 valm2 valmn 省略size 由编译系统根据初始化表中花括号 的个数确定行数 再根据 内的数据确定列数 从而得出数组的大小 数组的初始化 语法形式3 type arrayName val11 val12 val1n val21 val22 val2n valm1 valm2 valmn 数组声明与初始化同时进行 还可以省略new运算符 语法形式4 type arrayName arrayName newtype size1 size2 val11 val12 val1n val21 val22 val2n valm1 valm2 valmn 把声明与初始化分开在不同的语句中进行时 size1 size2同样可以缺省 但也可以是变量 数组的初始化 例如 以下数组初始化实例都是等同的 int a newint 3 4 0 1 2 3 4 5 6 7 8 9 10 11 int a newint 0 1 2 3 4 5 6 7 8 9 10 11 int a 0 1 2 3 4 5 6 7 8 9 10 11 int a a newint 3 4 0 1 2 3 4 5 6 7 8 9 10 11 数组的初始化 3 不规则数组初始化下面以二维不规则数组为例来讨论 不规则数组是一个数组的数组 所以它的初始化通常是分步骤进行的 type arrayName newtype size size可以是常量或变量 后面一个中括号 内是空着的 表示数组的元素还是数组且这每一个数组的长度是不一样 需要单独再用new运算符生成 arrayName 0 newtype size0 val1 val2 valn1 arrayName 1 newtype size1 val1 val2 valn2 数组的初始化 例如 char st1 newchar 3 st1是由三个数组组成的数组st1 0 newchar S e p t e m b e r st1 1 newchar O c t o b e r st1 2 newchar N o v e m b e r 例 数组的初始化 数组元素的访问 1 一维数组的引用一维数组的引用语法形式 数组名 下标 下标 数组元素的索引值 实际上就是要访问的那个数组元素在内存中的相对位移 记住相对位移是从0开始的 所以下标的值从0到数组元素的个数 1为止 数组元素的访问 例 定义一个数组 存放一组数据 找出这组数中最大数和最小数 usingSystem classMaxMin publicstaticvoidMain intmax min int queue newint 10 89 78 65 52 90 92 73 85 91 95 max min queue 0 for inti 1 imax max queue i if queue i min min queue i Console WriteLine 最大数是 0 最小数是 1 max min 数组元素的访问 2 多维数组的引用多维数组的引用语法形式 数组名 下标1 下标2 下标n 例 求两个矩阵的乘积 假定一个矩阵A为3行4列 另一个矩阵B为4行3列 根据矩阵乘法的规则 其乘积C为一个3行3列的矩阵 数组元素的访问 3 不规则数组的引用 语法形式 数组名 下标1 下标2 下标n 示例 打印杨辉三角 111121133114641151010511615201561 数组与System Array 在C 中 System Array类型是所有数组类型的抽象基类型 所有的数组类型均由之派生 这样设计的好处是任何数组都可以使用System Array具有的属性及方法 例如 System Array有一个Length属性 通过它可以获取数组的长度 有一个GetLength n 方法 用它可以得到第n维的数组长度 n从0开始 程序中利用这个属性和方法 可以有效地防止数组下标的越界 System Array类提供的Clear Copy Find Resize Sort等方法 可用于清空数组元素的值 复制数组元素 搜索数组元素 更改数组长度和对数组元素进行排序等 例2 5 数组的简单应用 数组与System Array 例 动态地定义一个数组 存放一组数据 找出这组数中最大数和最小数 usingSystem classMaxMin publicstaticvoidMain intmax min k k 10 int queue newint 10 89 78 65 52 90 92 73 85 91 95 max min queue 0 for inti 1 imax max queue i if queue i min min queue i Console WriteLine 最大数是 0 最小数是 1 max min Console Read C 数组 任何数组都是System Array的派生类为什么不直接使用System Array System Array是抽象类 不能实例化System Array假定成员数据类型是object对于值类型 会增加box unbox的开销对于引用类型 使用时需显式转换 C 数组 堆 array array 1 array 0 引用类型成员 堆 array 值类型成员 数组综合应用实例 示例 扑克牌游戏 用计算机模拟洗牌 分发给四个玩家并将四个玩家的牌显示出来 不考虑大小王 基本思路 首先扑克牌数据化 用三位整数表示一张扑克牌 最高位表示牌的种类 后两位表示牌号 例如 101 102 103 113表示红桃A到K 201 202 203 213表示方块A到K 301 302 303 313表示梅花A到K 401 402 403 413表示黑桃A到K 数组综合应用实例 2 将52张牌按照常规初始顺序放入一维数组Card中 不考虑大小王 3 利用随机函数洗牌 具体算法 1 初始i置为0 2 随机产生一个i 52之间的整数k 3 将card数组中card i 和card k 的值交换 4 i增1 5 重 2 4 直到i等于52 则完成一次洗牌过程 可以将上面的洗牌过程重复多次 以获得更好的洗牌效果 4 将洗好的牌依次分发给四个玩家 即放入二维数组Player中 5 将发牌结果显示出来 2 5 5字符串 字符串是一个由若干个Unicode字符组成的字符数组 字符串常量使用双引号来标记 如 string123 就是一个字符串常量 String和String在c 中是一样的 String类属于System命名空间 是 NETFramework提供的专门处理字符串的类库 string是String在C 中的别名 静态串stringString对象的内容是不可改变的 所以称做静态串 不可改变指的是只要创建一个String类型的对象 就不能再更改对象的值 任何赋值 修改操作都将被分配一个新值 stringlastName lastName Ming stringfirstName Zhang stringname firstName lastName stringsameName name char s2 计 算 机 科 学 strings3 newstring s2 可以使用String类的Compare CompareOrdinal CompareTo Equals EndsWith和StartsWith等方法进行字符串的比较 使用Copy和CopyTo方法可以将字符串或子字符串复制到另一个字符串或Char类型数组 使用IndexOf IndexOfAny LastIndexOf和LastIndexOfAny等方法可以获取字符串中的字符串 使用Substring和Split方法可以通过原始字符串的组成部分创建一个或多个新字符串 使用Concat和Join方法可以通过一个或多个子字符串创建新字符串 使用Insert Replace Remove PadLeft PadRight Trim TrimEnd 和TrimStart等方法可以修改字符串的全部或部分 使用ToLower ToLowerInvariant ToUpper和ToUpperInvariant等方法可以更改字符串中Unicode字符的大小写 使用Length属性可以获取字符串中Char对象的数量 使用Chars属性可以访问字符串中实际的Char对象 2 5 5字符串 字符串既然是字符数组 就可以通过索引来提取字符串中的字符 例如 stringstr1 中华人民共和国 charc str1 2 字符型变量c的值为字符 人 字符串搜索strings ABC科学 inti s IndexOf 科 字符串比较函数strings1 abc strings2 abc intn string Compare s1 s2 n 0表示两个字符串相同 n0表示s1 s2 2 5 5字符串 虽然字符串是引用类型 但C 仍然允许使用 来比较两个字符串的大小 实际上是比较字符串中对应字符的大小 例如 strings1 abc s2 ABC boolb s1 s2 b的值为truestrings1 abc strings2 abc stringresult 不相同 if s1 s2 result 相同 2 5 5字符串 判断字符串是否为空strings strings1 不空 if s Length 0 s1 空 得到子字符串或字符strings 取子字符串 stringsub s Substring 2 2 charch1 s 0 字符串删除函数strings 香格里拉 从索引为2开始取2个字符 sub 里拉 s内容不变stringsub s Remove 0 2 插入字符串strings 计算机科学 s1 计算机软件科学 s内容不变strings1 s Insert 3 软件 字符串替换函数strings1 s Replace 计算机 软件 2 5 5字符串 NETFramework类库中的System Text StringBuilder类用来构造可变字符串 包含Length Append Insert Remove Replace ToString等成员 分别用来获得字符串长度 追加字符 删除字符 替换字符和将StringBuilder转换成string等操作 例2 6 字符串的简单应用 2 5 6集合 集合是通过高度结构化的方式存储任意对象的类 集合不仅能随意调整大小 而且对存储或检索存储在其中的对象提供了更高级的方法 而数组的类型必须是相同的 且创建时就必须知道数组内含有多少元素 还需要通过循环索引来访问这些元素 与数组相比 使用集合管理数据会更加方便 实际上 数组是集合的一种类型 集合类型 集中放置一堆类似对象的类型对于集合类型的要求能够查看内部对象的个数能够定位每个对象 以便读 写能够在对象间遍历 2 5 6集合 表2 7常用集合类 2 5 6集合 1 集合类的选择每个集合有其自身的功能及限制 集合专用性越强 其限制就越多 选择集合类时 一般要考虑以下问题 1 是否需要随机访问集合中的元素 此时不能选择Queue队列类 Stack栈类 LinkedList双向链表类 而其余的集合可以提供随机访问 2 是否需要一个序列列表 需要先进先出操作时 可使用Queue队列类 而需要后进先出操作时 可使用Stack栈类 3 是否包含一个值 还是一个键和一个值的集合 其中 一个值 的集合是一种基于IList列表接口派生的集合 一个键和一个值 的集合是一种基于IDictionary字典接口的集合 2 5 6集合 1 集合类的选择 4 是否需要通过索引访问每个元素 常用集合类中 只有ArrayList是从索引为零的元素开始逐个访问集合元素 Hashtable Dictionary通过元素的键 即元素名字 提供对元素的访问 而SortedList通过其元素的从零开始的索引 或者通过其元素的键提供对元素的访问 5 是否需要用与输入元素方式不同的方式对元素排序 Hashtable按其元素的哈希代码对元素排序 SortedList以及SortedDictionary根据IComparer接口实现按键对元素的排序 而ArrayList提供Sort排序方法 6 是否需要信息的快速搜索和检索 对于小集合 10个元素或更少 ListDictionary比Hashtable快 SortedDictionary提供比Dictionary更快的查找 2 5 6集合 2 集合的使用C 为用户提供了foreach语句 更好地支持了集合的使用 利用foreach语句可以方便地遍历集合中的每一个元素 foreach语句的表达式的类型必须是集合类型 foreach语句的格式为 foreach 类型标识符in表达式 嵌入语句 fore

温馨提示

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

评论

0/150

提交评论