资源描述
C# 语 言 程 序 设 计C# Language Programing,杜进;Enterdu TEL:13871340263 ,课程简介,信息素养教育是大学生通识教育的重要内容之一。 C#是一种优秀的面向对象语言,它继承了C+和Java等语言的优点,并与现代软件工程相适应。C#语言利用.NET作为运行平台,使得它在Windows图形用户界面、Web应用、数据库等方面有强大的功能。 本课程的目标是: 学习和掌握C#语言的原理和方法,以及C#在常见的各类信息的处理以及企业信息化的应用,以此来提高信息意识和信息化素养,更深入地理通过程序设计来处理信息的原理和方法,更自如地应用计算机来为专业工作服务,为服务于企业信息化打下基础。 本课程要求在先修课程大学计算机基础(下)或VFP数据库中已经有程序设计的基础知识。,C#语言程序设计,2,课程目录,第0章 C#语言学习前的准备 第1章 Visual C#简介 第2章 C#简单程序编写 第3章 C#程序设计基础 第4章 C#控制语句 第5章 数组和集合 第6章 面向对象程序设计 第7章 继承和接口设计 第8章 Windows窗体应用程序设计 第9章 用户界面设计,3,C#语言程序设计,第0章 C#语言学习前的准备,计算机基础知识测试题: 将下列项目归类为硬件或软件: CPU、编译器、输入单元、字处理程序、Java程序 填空题: 计算机编程语言包括:机器语言、 和 。 计算机只能直接理解其本身的 语言,这种语言是由1和0构成的。 计算机处理数据时由一组指令控制,这组指令称为计算机 。 将高级语言程序变成机器语言的程序称为 。,4,C#语言程序设计,第0章 C#语言学习前的准备,计算机基础知识测试题: 写出计算机网络相关缩略语的全称: W3C、HTML、XML、HTTP、SOAP,5,C#语言程序设计,可以开始进入C#课程学习了!,课程的重点、难点 重点:C#应用程序的架构、程序调试、数据类型(值类型、引用类型)、流程控制语句(条件分支语句、循环语句、异常处理)、常用类操作和数据处理、封装、继承、多态、接口 难点:C#应用程序的架构、应用类型、循环语句、异常处理、面向对象的程序设计、继承、接口 课时安排 总课时:48(课内)+32(课外) 周课时:2(课堂)+1(实验)+2(课后),C#语言程序设计,6,可以开始进入C#课程学习了!,参考资料 ftp:/dzsw:dzsw221.232.141.195 书籍: P.J.Deital等著.Visual C# 2008 大学教程(第3版).电子工业出版社 karli Watson等著.C#入门经典(第4版).清华大学出版社 网络: www.mono- Mono开源项目 创建Linux、Windows与Mac OS X平台上的.NET程序; www.ecma-international.org/publications/standards/Ecma-334.htm ECMA-334标准:C#语言规范; 微软开发人员联机库,C#语言程序设计,7,第1章 Visual C#简介,本章目录 运行一个运用C#编写的应用程序实例 C C+ Java Visual C# OOP(面向对象编程)技术 .NET框架与CLR(公共语言运行环境) Visual Studio IDE介绍,8,C#语言程序设计,第1章 Visual C#简介,一个应用程序实例 Examplesch01AdvancedPainter.exe,C#语言程序设计,9,第1章 Visual C#简介,C C+ Java Visual C#发展历史 C语言 1973年由贝尔实验室的Dennis Ritchie开发的,最初作为UNIX操作系统的开发语言; C+ 20世纪80年代初由贝尔实验室的Bjarne Stroustrup开发的,在C语言的基础上提供了面向对象编程的特性; 人们需要迅速地、正确地、经济地建立软件,部分可以利用对象,来复用软件组件;,C#语言程序设计,10,第1章 Visual C#简介,C C+ Java Visual C#发展历史 Java Sun于1991年开始的一个内部公司研究项目:开发一个基于C+的语言,即Java; Sun于1995年正式推出Java,由于Java可用在Web页面中增加动态内容(即交互性、动画等),因此一经推出,立刻引起了企业界的兴趣;,C#语言程序设计,11,第1章 Visual C#简介,C C+ Java Visual C#发展历史 C# 2000年微软推出;由Anders Hejlsberg和Scott Wilramuth领导的小组开发; 为什么要开发C#呢?,C#语言程序设计,12,第1章 Visual C#简介,OOP(面向对象编程)技术 对象(object) 对象技术是一种包装机制,可以创建有意义的软件单元; 对象具有属性(property或attribute); 对象要进行操作(也称为行为或方法); 类(class)是一类相关对象。类指定对象的一般格式,对象的属性与操作取决于所属的类;,C#语言程序设计,13,第1章 Visual C#简介,.NET框架与CLR(公共语言运行环境),C#语言程序设计,14,第1章 Visual C#简介,Visual Studio IDE介绍 VS IDE界面介绍 VS IDE可视化编程程序示例,C#语言程序设计,15,第1章 Visual C#简介,小节 本章专业术语 CLR(Common Language Runtime)公共语言运行环境 GUI(Graphical User Interface)图形用户界面 IDE(Integrated Development Environment)集成开发环境 OOP(Object-Oriented Programming)面向对象编程 练习题 练习把工具箱中的控件放到窗体上,熟悉每个控件的模样。 记事本GUI;日历与提醒GUI 计算器GUI;闹钟GUI 收音机GUI,C#语言程序设计,16,第1章结束,C#语言程序设计,17,THANKS!,See you next time!,第2章 C#简单程序编写,本章目录 代码遍历一个C#控制台程序 程序解读 C#程序创建 一个Windows程序示例,C#语言程序设计,18,第2章 C#简单程序编写,代码遍历一个C#控制台程序,C#语言程序设计,19,第2章 C#简单程序编写,程序解读 注释:用来说明程序和提高程序的可读性; 单行注释语句 / 界定注释可以跨多行 /* This is a delimited comment. It can be split over many lines */ using指令(注意大小写):帮助编译器找到程序使用的类; C#有丰富的预定义类,这些类组织成名字空间(namespace,即相关类的集合),.NET的名字空间统称为.NET的框架类库(FCL); 对使用的每个新.NET类,要指定类所在的名字空间;,C#语言程序设计,20,第2章 C#简单程序编写,程序解读 用户定义类 每个程序至少要有一个用户定义类(即程序员定义的类); 注意:class关键字要小写,C#中的关键字(保留字)都必须小写;但所有类名都是以大写字母开头(即Pascal规则); Main方法 Main后面的括号是个程序块,被称为方法; 在每个程序,类中有一个Main方法,否则这个程序无法执行;,C#语言程序设计,21,第2章 C#简单程序编写,程序解读 Console类 Console类提供标准输入/输出功能,使程序可以在执行时读取和现实文本; Console.WriteLine(Welcome to C# Programming!); Console.Read(); WriteLine方法用来在控制台输出变量; Read方法用来在控制台输入信息; ; 是每个语句结束的符号;,C#语言程序设计,22,第2章 C#简单程序编写,C#程序创建 IDE的代码颜色模式 IDE使用过的代码颜色模式为语法颜色高亮度显示,有助于区别不同程序元素;例如,关键字显示为蓝色,注释文本显示为绿色; 行号 利于程序阅读和修改; ToolsOptions对话框Text EditorLine Numbers,C#语言程序设计,23,第2章 C#简单程序编写,C#程序创建 代码缩进 将代码缩进设置为每层3格,也可以使用Tab键; 程序文件名 程序默认的文件名是Program.cs,可以在属性窗口中修改; IntelliSense特性 IntelliSense(智能感应)可在输入程序时列出类的成员和方法名,方便输入;,C#语言程序设计,24,第2章 C#简单程序编写,C#程序创建 程序保存、编译与运行 F5:启动调试 常见编程错误 注意留意常见的错误; 一个错误可能产生多个错误消息;,C#语言程序设计,25,第2章 C#简单程序编写,C#程序创建 良好编程习惯 习惯上,类名应该以大写字母开头,其中每个单词首字母用大写; 习惯上,包含一个公用类的文件命名时应于类同名,包括拼写和大小写,这样命名有助于程序员确定程序的类所在的位置; 在分隔类体的左右括号之间将内容缩进一级,这种格式有利于显示类声明结构,增加可读性; 设置缩进量,采用一致的习惯; 和类一样,在定义方法时体的左右括号之间将每个方法声明的整体缩进一层;,C#语言程序设计,26,第2章 C#简单程序编写,一个Windows程序示例,C#语言程序设计,27,第2章 C#简单程序编写,小节 本章专业术语 .NET FCL(.NET Framework Class Library).NET框架类库 练习题 按照例子2.1编写并运行控制台程序 将例子2.1的代码故意“破坏”,如缺括号或将关键字拼写错误,看看编译器产生语法错误的消息,并分析错误消息产生的原因。,C#语言程序设计,28,第2章 结束,C#语言程序设计,29,THANKS!,See you next time!,第3章 C#程序设计基础,本章目录 标识符 C#中数据类型 C#中的变量和常量 结构类型和枚举类型 C#运算符和表达式 C#中常用类和结构,C#语言程序设计,30,3.1 标识符,C#的标识符名称必须遵守以下规则: (1)所有的标识符只能由字母、数字和下划线这3类字符组成,且第一个字符必须为字母或下划线。 (2)标识符中不能包含空格、标点符号、运算符等其他符号。 (3)标识符严格区分大小写。 (4)标识符不能与C#关键字名相同。 (5)标识符不能与C#中的类库名相同。,a12_c ,1abc ,3.2 C#中数据类型,C#中数据类型分类图,3.2.1值类型 值类型的变量内含变量值本身,C#的值类型可以分为简单类型、结构类型和枚举类型。下面仅介绍简单类型。,1. 整数类型,2. 实数类型,3 字符类型,例如,可以采用如下方式字符变量赋值: char c=H ; / 字符H char c=x0048; / 字符H,十六进制转义符(前缀为x) char c=u0048; / 字符H,Unicode表示形式(前缀为u) char c=r; / 回车,转义字符 在表示一个字符常数时,单引号内的有效字符数量必须且只能是一个,而且不能是单引号或者反斜杠()。,4. 布尔类型 布尔类型数据用于表示逻辑真和逻辑假,布尔类型的类型标识符是bool。,3.2.2 引用类型 引用类型也称为参考类型。和值类型相比,引用类型的变量不直接存储所包含的值,而是指向它所要存储的值。类似C中的指针。,1. object类 object是C#中所有类型(包括所有的值类型和引用类型)的基类,C#中的所有类型都直接或间接地从object类中继承而来。因此,对一个object的变量可以赋予任何类型的值。 float f=1.23; object obj1; /定义obj1对象 obj1=f; object obj2=China;/定义obj2对象并赋初值,2. string类 C#还定义了一个string类,表示一个Unicode字符序列,专门用于对字符串的操作。同样,这个类也是在.NET Framework的命名空间System中定义的,是类System.String的别名。 字符串在实际中应用非常广泛,利用string类中封装的各种内部操作,可以很容易完成对字符串处理。例如: string str1=123+abc; /+运算符用于连接字符串 char c=Hello World!2; /运算符可以访问string中的单个字符,c=e string str2=China; string str3=China; / 字符串的另一种表示形式,用引起来。 bool b=(str2=str3); /=运算符用于两个字符串比较,b=true,3.2.3 类型转换 数据类型在一定条件下是可以相互转换的,如将int型数据转换成double型数据。C#允许使用两种转换的方式:隐式转换和显式转换。 1. 隐式转换 隐式转换是系统默认的、不需要加以声明就可以进行的转换。,2. 显式转换 显式转换又叫强制类型转换,与隐式转换相反,显式转换需要用户明确地指定转换类型,一般在不存在该类型的隐式转换时才使用。格式如下: (类型标识符)表达式 其作用是将“表达式”值的类型转换为“类型标识符”的类型。例如: (int)1.23 /把double类型的1.23转换成int类型,结果为1 需要提醒注意以下几点: (1)显式转换可能会导致错误。进行这种转换时编译器将对转换进行溢出检测。如果有溢出说明转换失败,就表明源类型不是一个合法的目标类型,转换就无法进行。 (2)对于从float、double、decimal到整型数据的转换,将通过舍入得到最接近的整型值,如果这个整型值超出目标类型的范围,则出现转换异常。,【例3.1】 设计一个控制台程序说明类型转换的应用。,using System; namespace Proj3_1 class Program static void Main(string args) int i=65,i1,i2; double d = 66.3456,d1,d2; char c = A,c1,c2; Console.WriteLine(i=0:d5,d=1:f,c=2, i, d, c); i1 = (int)d; /强制类型转换 d1 = i;/隐式类型转换 c1 = (char)i;/强制类型转换 Console.WriteLine(i1=0:d5,d1=1:f,c1=2, i1, d1, c1); i2 = c; /隐式类型转换 d2 = (int)d; /强制类型转换,转换成整数后再隐式转为double类型 c2 = (char)d; /强制类型转换 Console.WriteLine(i2=0:d5,d2=1:f,c2=2, i2, d2, c2); ,3.2.4 装箱和拆箱 1. 装箱转换 装箱转换是指将一个值类型的数据隐式地转换成一个对象类型的数据。例如,下面语句就执行了装箱转换: int i=8; object obj=i; 或 object obj=(object)i; 2. 拆箱转换 拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。例如,下面语句就执行了拆箱转换: object obj=2; int i=(int)obj; 拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不同之处。,3.3 C#中的变量和常量 3.3.1 变量 1. 变量定义 在C#程序里使用某个变量之前,必须要告诉编译器它是一个什么样的变量,因此要对变量进行定义。定义变量的方法如下: 访问修饰符 数据类型 变量名 = 初始值; 例如: string name=王华; int age=20; 也可以同时声明一个或多个给定类型的变量,例如: int a=1,b=2,c=3;,2. 理解值类型的变量 如果一个变量的值是普通的类型,那么这个C#变量就是值类型的变量。值类型的变量直接把值存放在变量名标记的存储位置上。 当定义一个值类型变量并且给它赋值的时候,这个变量只能存储相同类型的数据。所以,一个int类型的变量就只能存放int类型的数据。另外,当把值赋给某个值类型的变量时,C#会首先创建这个值的一个拷贝,然后把这个拷贝放在变量名所标记的存储位置上。 例如: int x; int y=2; x=y;,3. 理解引用类型的变量 引用表示所使用的是变量或对象的地址而不是变量或对象本身。当声明引用类型变量时,程序只是分配了存放这个引用的存储空间。要想创建对象并把对象的存储地址赋给该变量,就需要使用new操作符。例如: MyClass var; /MyClass是已定义的类或类型 var=new MyClass(); 数组示例: int a = new int3 1, 2, 3; for (int i = 0; i 3; i+) Console.Write(0 ,ai);,3.3.2 常量 1. 直接常量 直接常量是指把程序中不变的量直接硬编码为数值或字符串值,例如,以下都是直接常量: 100 /整型直接常量 1.23e5 /浮点型直接常量,2. 符号常量 符号常量是通过关键字const声明的常量,包括常量的名称和它的值。常量声明的格式如下: const 数据类型 常量名=初始值; 其中,“常量名”必须是C#的合法标识符,在程序中通过常量名来访问该常量。“类型标识符”指示了所定义的常量的数据类型,而“初始值”是所定义的常量的值。 例如: const double PI=3.14159265;,3.4 结构类型和枚举类型 3.4.1 结构类型 1. 结构类型的声明 结构类型由若干“成员”组成的。数据成员称为字段,每个字段都有自已的数据类型。声明结构类型的一般格式如下: struct 结构类型名称 字段访问修饰符 数据类型 字段1; 字段访问修饰符 数据类型 字段2; . 字段访问修饰符 数据类型 字段n; ;,例如,以下声明一个具有姓名和年龄的结构体类型Student: struct Student/声明结构类型Student public int xh;/学号 public string xm;/姓名 public string xb;/性别 public int nl;/年龄 public string bh;/班号 ;,2. 结构类型变量的定义 声明一个结构类型后,可以定义该结构类型的变量(简称为结构变量)。定义结构变量的一般格式如下: 结构类型 结构变量; 例如,在前面的结构类型Student声明后,定义它的两个变量如下: Student s1,s2;,3. 结构变量的使用 1)访问结构变量字段 访问结构变量字段的一般格式如下: 结构变量名.字段名 例如,s1.xh表示结构变量s1的学号,s2.xm表示结构变量s2的姓名。 结构体变量的字段可以在程序中单独使用,与普通变量完全相同。 2)结构变量的赋值 结构变量的赋值有两种方式。 结构变量的字段赋值:使用方法与普通变量相同。 结构变量之间赋值:要求赋值的两个结构变量必须类型相同。例如: s1=s2; 这样s2的所有字段值赋给s1的对应字段。,【例3.2】 设计一个控制台程序说明结构类型的应用。,using System; namespace Proj3_2 class Program struct Student /结构类型声明应放在Main函数的外面 public int xh; /学号 public string xm; /姓名 public string xb; /性别 public int nl; /年龄 public string bh; /班号 ,static void Main(string args) Student s1,s2;/定义两个结构类型变量 s1.xh = 101; s1.xm = 李明; s1.xb = 男; s1.nl = 20; s1.bh = 07001; Console.WriteLine(学号:0,姓名:1,性别:2,年龄:3, 班号:4, s1.xh, s1.xm, s1.xb, s1.nl, s1.bh); s2 = s1;/将结构变量s1赋给s2 s2.xh = 108; s2.xm = 王华; Console.WriteLine(学号:0,姓名:1,性别:2,年龄:3, 班号:4, s2.xh, s2.xm, s2.xb, s2.nl, s2.bh); ,3.4.2 枚举类型 枚举类型也是一种自定义数据类型,它允许用符号代表数据。枚举是指程序中某个变量具有一组确定的值,通过“枚举”可以将其值一一列出来。 1. 枚举类型的声明 枚举类型使用enum关键字声明,其一般语法形式如下: enum 枚举名枚举成员1,枚举成员2, 其中,enum是结构类型的关键字。例如,以下声明一个名称为color的表示颜色的枚举类型: enum Color Red,Green,Blue,White,Black 在声明枚举类型后,可以通过枚举名来访问枚举成员,其使用语法如下: 枚举名.枚举成员,2. 枚举成员的赋值 在声明的枚举类型中,每一个枚举成员都有一个相对应的常量值,默认情况下C#规定第1个枚举成员的值取0,它后面的每一个枚举成员的值按加1递增。例如,前面Color中,Red值为0,Green值为1,Blue值为2,依次类推。 可以为一个或多个枚举成员赋整型值,当某个枚举成员赋值后,其后的枚举成员没有赋值的话,自动在前一个枚举成员值之上加1作为其值。例如: enum Color Red=0, Green, Blue=3, White, Black=1; 则这些枚举成员的值分别为0、1、3、4、1。,3. 枚举类型变量的定义 声明一个枚举类型后,可以定义该枚举类型的变量(简称为枚举变量)。定义枚举变量的一般格式如下: 枚举类型 枚举变量; 例如,在前面的枚举类型Color声明后,定义它的两个变量如下: Color c1,c2;,1)枚举变量的赋值 枚举变量赋值的语法格式如下: 枚举变量=枚举名.枚举成员 例如: c1=Color.Red; 2)枚举变量的访问 枚举变量像普通变量一样直接访问。,3.5 C#运算符和表达式,3.5.1 算术运算符,3.5.2 字符串运算符 字符串运算符只有一个,就是加号(+)。它除了作为算术运算符之外,还可以将字符串连接起来,变成合并的新字符串。例如: string s=Hello; s=s+, World.; Console.WriteLine(s); /输出:Hello, World.,3.5.3 赋值运算符 赋值运算符(=)用于改变变量的值,它先求出右侧表达式的结果,然后再将结果赋给左侧的变量。,3.5.4 关系运算符,3.5.5 逻辑运算符,3.5.6 位运算符,3.5.7 条件运算符 条件运算符是一个三元运算符,每个操作数同时又是表达式的值。由条件运算符构成的表达式称为条件表达式。条件运算符的使用格式如下: 表达式1 ? 表达式2 : 表达式3 它的计算方式为,先计算“表达式1”(必须为布尔值)的值,如果其值true,则“表达式2”的值作为整个表达式的最终结果;否则“表达式3”的值作为整个表达式的值。 例如,以下表达式返回a和b中的最大值: max=ab ? a : b 计算过程是,当ab,max= a; 否则max=b。,3.5.9 运算符的优先级 运算符的优先级是指在表达式中哪一个运算符应该首先计算。 C#根据运算符的优先级确定表达式的求值顺序:优先级高的运算先做,优先级低的操作后做,相同优先级的操作从左到右依次做,同时用小括号控制运算顺序,任何在小括号内的运算最优先进行。,3.6 C#中常用类和结构,C#中一切都是对象 。,3.6.1 String类,string类型是.NET Framework中的String类的别名。string类型定义了相等运算符(=和!=)用于比较两个string对象,叧外,+运算符用于连接字符串,运算符可以用来访问string中的各个字符。,【例3.7】 设计一个控制台程序求用户输入的子串在主串中位置。,using System; namespace Proj3_6 class Program static void Main(string args) String mstr,sstr; Console.Write(输入主串:); mstr = Console.ReadLine(); Console.Write(输入子串:); sstr = Console.ReadLine(); Console.WriteLine(主串长度=0,子串长度=1, mstr.Length, sstr.Length); if (String.Compare(mstr, sstr) != 0) /使用静态方法 Console.WriteLine(位置:0, mstr.IndexOf(sstr); else Console.WriteLine(两个字符串相同); ,3.6.2Math类 Math类位于System命名空间中,它包含了实现C#中常用算术运算功能的方法,这些方法都是静态方法,可通过“Math.方法名(参数)”来使用。,3.6.3 Convert类 Convert类位于System命名空间中,用于将一个值类型转换成另一个值类型。这些方法都是静态方法,可通过“Convert.方法名(参数)”来使用。,3.6.4 DateTime结构 DateTime结构类位于System命名空间中,DateTime值类型表示值范围在公元0001年1月1日午夜12:00:00到公元9999年12月31日晚上11:59:59之间的日期和时间。 可以通过以下语法格式定义一个日期时间变量: DateTime 日期时间变量 = new DateTime(年,月,日,时,分,秒); 例如,以下语句定义了2个日期时间变量: DateTime d1 = new DateTime(2009,10,1); DateTime d2 = new DateTime(2009,10,1,8,15,20); 其中,d1的值为2009年10月1日零点零分零秒,d2的值为2009年10月1日8点15分20秒。,【例3.8】 设计一个控制台程序说明DataTime结构的使用。,using System; namespace Proj3_7 class Program static void Main(string args) DateTime d1 = DateTime.Now; /定义当前日期时间变量 DateTime d2 = new DateTime(2009, 10, 1); /定义一个日期时间变量 Console.WriteLine(d1:0,d1); int i = d1.Year;/求d1的年 int j = d1.Month;/求d1的月 int k = d1.Day;/求d1的日 int h = d1.Hour;/求d1的时 int m = d1.Minute;/求d1的分 int s = d1.Second;/求d1的秒,Console.WriteLine(d1:0年1月2日3时4分5秒, i,j,k,h,m,s); Console.WriteLine(d2:0,d2); Console.WriteLine(相距时间:0,d2 - d1); DateTime d3 = d1.AddDays(100); /d3为d1的100天后的日期 Console.WriteLine(d3:0,d3); Console.WriteLine(DateTime.IsLeapYear(i);/静态方法调用 Console.WriteLine(DateTime.IsLeapYear(d2.Year); ,第3章 C#程序设计基础,小节 本章专业术语 练习题 课后练习,C#语言程序设计,77,第3章 结束,C#语言程序设计,78,THANKS!,See you next time!,第4章 C#控制语句,本章目录 选择语句 循环语句 跳转语句,C#语言程序设计,79,4.1 选择控制语句,4.1.1 if语句 基本语法格式如下: if (条件表达式) 语句; 其中,“条件表达式”是一个关系表达式或逻辑表达式,当“条件表达式”为true时,执行后面的“语句”。,4.1.2 ifelse语句 语法形式如下: if (条件表达式) 语句1; else 语句2; 其中的“条件表达式”是一个关系表达式或逻辑表达式。当“条件表达式”为true时执行“语句1”;当“条件表达式”为false时执行“语句2”。,4.1.3 ifelse if语句 ifelse if语句用于进行多重判断,其语法形式如下: if (条件表达式1) 语句1; else if (条件表达式2) 语句2; else if (条件表达式n) 语句n; else 语句n+1;,【例4.4】 编写一个程序,将用户输入的分数转换成等级。,using System; namespace Proj4_4 class Program static void Main(string args) float x; Console.Write(分数:); x=float.Parse(Console.ReadLine(); if (x=90) Console.WriteLine(等级为A); else if (x = 80) Console.WriteLine(等级为B); else if (x = 70) Console.WriteLine(等级为C); else if (x = 60) Console.WriteLine(等级为D); else Console.WriteLine(等级为E); ,4.1.4 switch语句 switch语句也称为开关语句,用于有多重选择的场合测试某一个变量具有多个值时所执行的动作。switch语句的语法形式为: switch (表达式) case 常量表达式1: 语句1; case 常量表达式2: 语句2; case 常量表达式n: 语句n; default:语句n+1; ,【例4.5】 编写一个程序,要求输入课程后显示相应的学分:数学(代号为m,8学分)、物理(代号为p,5学分)、化学(代号为c,5学分)、语文(代号为w,8学分)、英语(代号为e,6学分)。,using System; namespace Proj4_5 class Program static void Main(string args) char ch; Console.Write(课程代号:); ch=(char)Console.Read(); switch (ch) case m: case M: case w: case W: Console.WriteLine(8学分); break; case p: case P: case c: case C: Console.WriteLine(5学分); break; case e: case E: Console.WriteLine(6学分); break; default: Console.WriteLine(输入的课程代号不正确); break; ,4.2 循环控制语句,4.2.1 while语句 while语句的一般语法格式如下: while (条件表达式) 语句;,【例4.6】 编写一个程序,将用户输入的整数反向显示出来。,using System; namespace Proj4_6 class Program static void Main(string args) int digit,num; Console.Write( 输入一个整数:); num=int.Parse(Console.ReadLine(); Console.Write( 反向显示结果:); while (num!=0) digit=num % 10; /依次求个位、十位、上的数字digit num=num / 10; Console.Write(digit); Console.WriteLine(); ,4.2.2 do-while语句 do-while语句的一般语法格式如下: do 语句; while (条件表达式);,【例4.7】 采用do-while语句重新编写例4.6的程序。 using System; namespace Proj4_7 class Program static void Main(string args) int digit,num; Console.Write(输入一个整数:); num=int.Parse(Console.ReadLine(); Console.Write(反向显示结果:); do digit=num % 10; num=num/10; Console.Write(digit); while (num!=0); Console.WriteLine(); ,4.2.3 for语句 for语句通常用于预先知道循环次数的情况,其一般语法格式如下: for (表达式1;表达式2;表达式3) 语句;,【例4.8】 编写一个程序,输出如图4.12所示的乘法表。,using System; namespace Proj4_8 class Program static void Main(string args) int i,j; for (i = 1; i = 9; i+) for (j = 1; j = i; j+) Console.Write(01=2 , i, j, i * j); Console.WriteLine(); ,4.3 跳 转 语 句 4.3.1 break语句 break语句使程序从当前的循环语句(do、while和for)内跳转出来,接着执行循环语句后面的语句。,【例4.9】 编写一个程序,判断从键盘输入的大于3的正整数是否为素数。,using System; namespace Proj4_9 class Program static void Main(string args) int n, i; bool prime = true; Console.Write(输入一个大于3的正整数:); n = int.Parse(Console.ReadLine(); for (i = 3; i = Math.Sqrt(n); i+) if (n % i = 0) prime = false; break; if (prime) Console.WriteLine(0是素数, n); else Console.WriteLine(0不是素数, n); ,4.3.2 continue语句 continue语句也用于循环语句,它类似于break,但它不是结束循环,而是结束循环语句的当前一次循环,接着执行下一次循环。 在while和do-while循环结构中,执行控制权转至对“条件表达式”的判断,在for结构中,转去执行“表达式2”。 【例4.10】 编写一个程序,对用户输入的所有正数求和,如果输入的是负数,则忽略该数。程序每读入一个数,判断它的正负,如果为负,则利用continue语句结束当前一次循环,继续下一次循环,否则将该数加到总数上去。,using System; namespace Proj4_10 class Program static void Main(string args) int sum=0,n=1; while (n!=0) /循环 Console.Write(输入一个整数(以0表示结束):); n=int.Parse(Console.ReadLine(); if (n0) continue; /开始下一次循环 sum+=n; Console.WriteLine(所有正数之和=0,sum); ,4.3.3 goto语句 goto语句也可以跳出循环和switch语句。goto语句用于无条件转移程序的执行控制,它总是与一个标号相匹配,其形式为: goto 标号; “标号”是一个用户自定义的标识符,它可以处于goto语句的前面,也可以处于其后面,但是标号必须与goto语句处于同一个函数中。定义标号时,由一个标识符后面跟一冒号组成。,通常不要使用goto语句!,第4章 C#控制语句,小节 本章专业术语 练习题 课后练习,C#语言程序设计,99,第4章 结束,C#语言程序设计,100,THANKS!,See you next time!,第5章 数组和集合,本章目录 一维数组 二维数组 Array类 交错数组 ArrayList类 List类,C#语言程序设计,101,5.1 一维数组,5.1.1 一维数组的定义 定义一维数组的语法格式如下: 数组类型 数组名; 例如,以下定义了3个一维数组,即整型数组a、双精度数组b和字符串数组c。 int a; double b; string c; 在定义数组后,必须对其进行初始化才能使用。初始化数组有两种方法:动态初始化和静态初始化。,5.1.2 一维数组的动态初始化 动态初始化需要借助new运算符,为数组元素分配内存空间,并为数组元素赋初值,数值类型初始化为0,布尔类型初始化为false,字符串类型初始化为null。 动态初始化数组的格式如下: 数组类型 数组名=new 数据类型n元素值0,元素值1,元素值n-1; 其中,“数组类型”是数组中数据元素的数据类型,n为“数组长度”,可以是整型常量或变量,后面一层大括号里为初始值部分。 1. 不给定初始值的情况 如果不给出初始值部分,各元素取默认值。例如: int a = new int10; 该数组在内存中各数组元素均取默认值0。,2. 给定初始值的情况 如果给出初始值部分,各元素取相应的初值,而且给出的初值个数与“数组长度”相等。此时可以省略“数组长度”,因为后面的大括号中已列出了数组中的全部元素。例如: int a = new int101,2,3,4,5,6,7,8,9,10; 或 int a = new int1,2,3,4,5,6,7,8,9,10; 在这种情况下,不允许“数组长度”为变量,例如: int n = 5; /定义变量n int myarr = new intn 1,2,3,4,5;/错误 如果给出“数组长度”,则初始值的个数应与“数组长度”相等,否则出错。例如: int mya = new int2 1,2;/正确 int mya = new int2 1,2,3;/错误 int mya = new int2 1;/错误,5.1.3 一维数组的静态初始化 静态初始化数组时,必须与数组定义结合在一起,否则会出错。静态初始化数组的格式如下: 数据类型 数组名=元素值0,元素值1,元素值n-1; 用这种方法对数组进行初始化时,无需说明数组元素的个数,只需按顺序列出数组中的全部元素即可,系统会自动计算并分配数组所需的内存空间。 例如,以下是对整型数组myarr的静态初始化: int myarr=1,2,3,4,5; 在这种情况下,不能将数组定义和静态初始化分开,例如,以下是错误的。 int myarr; myarr=1,2,3,4,5;/错误的数组的静态初始化,5.1.4 访问一维数组中的元素 访问一维数组中的某个元素:名称下标或索引。 所有元素下标从0开始,到数组长度减1为止。例如,以下语句输出数组myarr的所有元素值: for (i=0;i5;i+) Console.Write(0 ,ai); Console.WriteLine(); C#还提供foreach语句。该语句提供一种简单、明了的方法来循环访问数组的元素。例如,以下代码定义一个名称为mya的数组,并用foreach语句循环访问该数组。 int mya = 1,2,3,4,5,6; foreach (int i in mya) System.Console.Write(0 ,i); Console.WriteLine(); 输出为:1 2 3 4 5 6。,5.1.5 一组数组的越界 若有如下语句定义并初始化数组ca: int ca = new int101,2,3,4,5,6,7,8,7,9,10; 数组ca的合法下标为09,如果程序中使用ca10或ca50,则超过了数组规定的下标,因此越界了。C#系统会提示以下出错信息。 未处理的异常: Syatem.IndexOutOfRangeException:索引超出了数组界限。,【例5.1】设计一个控制台应用程序,采用二分查找方法在给定的有序数组a中查找用户输入的值,并提示相应的查找结果。,using System; namespace Proj5_1 class Program static void Main(string args) double a=new double100,1.2,2.5,3.1,4.6,5.0,6.7,7.6,8.2,9.8; double k; int low=0,high=9,mid; Console.Write(k:); k=double.Parse(Console.ReadLine(); while (low k) high = mid - 1; else low = mid + 1; Console.WriteLine(未找到0,k); ,5.2 二维数组,5.2.1 二维数组的定义 定义二维数组的语法格式如下: 数组类型, 数组名; 其中,“数据类型”为C#中合法的数据类型,“数组名”为C#中合法的标识符。 例如,以下语句定义了3个二维数组,即整型数组x、双精度数组y和字符串数组z。 int, x; double, y; string, z; 对于多维数组,可以作类似的推广,例如,以下语句定义了一个三维数组p。 int, p;,5.2.2 二维数组的动态初始化 动态初始化二维数组的格式如下: 数据类型, 数组名=new 数据类型mn 元素值0,0,元素值0,1,元素值0,n-1, 元素值1,0,元素值1,1,元素值1,n-1, 元素值m-1,0,元素值m-1,1,元素值m-1,n-1 ; 其中,“数组类型”是数组中数据元素的数据类型,m、n分别为行数和列数,即各维的长度,可以是整型常量或变量。,1. 不给定初始值的情况 如果不给出初始值部分,各元素取默认值。例如: int, x = new int23; 该数组各数组元素均取默认值0。,2. 给定初始值的情况 如果给出初始值部分,各元素取相应的初值,而且给出的初值个数与对应的“数组长度”相等。此时可以省略“数组长度”,因为后面的大括号中已列出了数组中的全部元素。例如: int, x = new int231,2,3,4,5,6; 或 int, x = new int,1,2,3,4,5,6;,5.2.3 二维数组的静态初始化 静态初始化数组时,必须与数组定义结合在一起,否则会出错。静态初始化数组的格式如下: 数据类型, 数组名=元素值0,0,元素值0,1,元素值0,n-1, 元素值1,0,元素值1,1,元素值1,n-1, 元素值m-1,0,元素值m-1,1,元素值m-1,n-1; 例如,以下语句是对整型数组myarr的静态初始化。 int, myarr=1,2,3,4,5,6;,5.2.4 访问二维数组中的元素 为了访问二维数组中的某个元素,需指定数组名称和数组中该元素的行下标和列下标。例如,以下语句输出数组myarr的所有元素值。 for (i=0;i2;i+) for (j=0;j3;j+ Console.Write(0 ,myarri,j); Console.WriteLine(); 对于多维数组,也可以使用foreach语句来循环访问每一个元素,例如。 int, myb = new int3, 2 1, 2, 3,4, 5,6; foreach (int i in myb) Console.Write(0 , i); Console.WriteLine(); 其输出为:1 2 3 4 5 6。,【例5.2】 设计一个控制台应用程序,输出九行杨辉三角形。,using System; namespace Proj5_2 class Program const int N=10; static void Main(string args) int i,j; int, a=new intN,N; for (i=1;iN;i+) /1列和对角线元素均为1 ai,i=1;ai,1=1; for (i=3;iN;i+)/求第3N行的元素值 for (j=2;j=i-1;j+) ai,j=ai-1,j-1+ai-1,j; for (i=1;iN;i+)/输出数序 for (j=1;j=i;j+) Console.Write(0,-2 ,ai,j); Console.WriteLine(); ,5.3 Array类,Array类是所有数组类型的抽象基类型。,【例5.3】 设计一个控制台应用程序,产生10个019的随机整数,对其递增排序并输出。,using System; namespace Proj5_3 class Program static void Main(string args) int i,k; int myarr = new int10; /定义一个一维数组 Random randobj = new Random(); /定义一个随机对象 fo
展开阅读全文