《C#语言程序设计》PPT课件.ppt_第1页
《C#语言程序设计》PPT课件.ppt_第2页
《C#语言程序设计》PPT课件.ppt_第3页
《C#语言程序设计》PPT课件.ppt_第4页
《C#语言程序设计》PPT课件.ppt_第5页
已阅读5页,还剩357页未读 继续免费阅读

下载本文档

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

文档简介

C#语言程序设计C#LanguagePrograming,杜进;EnterduTELnterdu,课程简介,信息素养教育是大学生通识教育的重要内容之一。C#是一种优秀的面向对象语言,它继承了C+和Java等语言的优点,并与现代软件工程相适应。C#语言利用.NET作为运行平台,使得它在Windows图形用户界面、Web应用、数据库等方面有强大的功能。本课程的目标是:学习和掌握C#语言的原理和方法,以及C#在常见的各类信息的处理以及企业信息化的应用,以此来提高信息意识和信息化素养,更深入地理通过程序设计来处理信息的原理和方法,更自如地应用计算机来为专业工作服务,为服务于企业信息化打下基础。本课程要求在先修课程大学计算机基础(下)或VFP数据库中已经有程序设计的基础知识。,C#语言程序设计,2,课程目录,第0章C#语言学习前的准备第1章VisualC#简介第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:dzsw95书籍:P.J.Deital等著.VisualC#2008大学教程(第3版).电子工业出版社karliWatson等著.C#入门经典(第4版).清华大学出版社网络:www.mono-Mono开源项目创建Linux、Windows与MacOSX平台上的.NET程序;/publications/standards/Ecma-334.htmECMA-334标准:C#语言规范;,C#语言程序设计,7,第1章VisualC#简介,本章目录运行一个运用C#编写的应用程序实例CC+JavaVisualC#OOP(面向对象编程)技术.NET框架与CLR(公共语言运行环境)VisualStudioIDE介绍,8,C#语言程序设计,第1章VisualC#简介,一个应用程序实例Examplesch01AdvancedPainter.exe,C#语言程序设计,9,第1章VisualC#简介,CC+JavaVisualC#发展历史C语言1973年由贝尔实验室的DennisRitchie开发的,最初作为UNIX操作系统的开发语言;C+20世纪80年代初由贝尔实验室的BjarneStroustrup开发的,在C语言的基础上提供了面向对象编程的特性;人们需要迅速地、正确地、经济地建立软件,部分可以利用对象,来复用软件组件;,C#语言程序设计,10,第1章VisualC#简介,CC+JavaVisualC#发展历史JavaSun于1991年开始的一个内部公司研究项目:开发一个基于C+的语言,即Java;Sun于1995年正式推出Java,由于Java可用在Web页面中增加动态内容(即交互性、动画等),因此一经推出,立刻引起了企业界的兴趣;,C#语言程序设计,11,第1章VisualC#简介,CC+JavaVisualC#发展历史C#2000年微软推出;由AndersHejlsberg和ScottWilramuth领导的小组开发;为什么要开发C#呢?,C#语言程序设计,12,第1章VisualC#简介,OOP(面向对象编程)技术对象(object)对象技术是一种包装机制,可以创建有意义的软件单元;对象具有属性(property或attribute);对象要进行操作(也称为行为或方法);类(class)是一类相关对象。类指定对象的一般格式,对象的属性与操作取决于所属的类;,C#语言程序设计,13,第1章VisualC#简介,.NET框架与CLR(公共语言运行环境),C#语言程序设计,14,第1章VisualC#简介,VisualStudioIDE介绍VSIDE界面介绍VSIDE可视化编程程序示例,C#语言程序设计,15,第1章VisualC#简介,小节本章专业术语CLR(CommonLanguageRuntime)公共语言运行环境GUI(GraphicalUserInterface)图形用户界面IDE(IntegratedDevelopmentEnvironment)集成开发环境OOP(Object-OrientedProgramming)面向对象编程练习题练习把工具箱中的控件放到窗体上,熟悉每个控件的模样。记事本GUI;日历与提醒GUI计算器GUI;闹钟GUI收音机GUI,C#语言程序设计,16,第1章结束,C#语言程序设计,17,THANKS!,Seeyounexttime!,第2章C#简单程序编写,本章目录代码遍历一个C#控制台程序程序解读C#程序创建一个Windows程序示例,C#语言程序设计,18,第2章C#简单程序编写,代码遍历一个C#控制台程序,C#语言程序设计,19,第2章C#简单程序编写,程序解读注释:用来说明程序和提高程序的可读性;单行注释语句/界定注释可以跨多行/*Thisisadelimitedcomment.Itcanbesplitovermanylines*/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(WelcometoC#Programming!);Console.Read();WriteLine方法用来在控制台输出变量;Read方法用来在控制台输入信息;;是每个语句结束的符号;,C#语言程序设计,22,第2章C#简单程序编写,C#程序创建IDE的代码颜色模式IDE使用过的代码颜色模式为语法颜色高亮度显示,有助于区别不同程序元素;例如,关键字显示为蓝色,注释文本显示为绿色;行号利于程序阅读和修改;ToolsOptions对话框TextEditorLineNumbers,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#简单程序编写,小节本章专业术语.NETFCL(.NETFrameworkClassLibrary).NET框架类库练习题按照例子2.1编写并运行控制台程序将例子2.1的代码故意“破坏”,如缺括号或将关键字拼写错误,看看编译器产生语法错误的消息,并分析错误消息产生的原因。,C#语言程序设计,28,第2章结束,C#语言程序设计,29,THANKS!,Seeyounexttime!,第3章C#程序设计基础,本章目录标识符C#中数据类型C#中的变量和常量结构类型和枚举类型C#运算符和表达式C#中常用类和结构,C#语言程序设计,30,3.1标识符,C#的标识符名称必须遵守以下规则:(1)所有的标识符只能由字母、数字和下划线这3类字符组成,且第一个字符必须为字母或下划线。(2)标识符中不能包含空格、标点符号、运算符等其他符号。(3)标识符严格区分大小写。(4)标识符不能与C#关键字名相同。(5)标识符不能与C#中的类库名相同。,a12_c,1abc,3.2C#中数据类型,C#中数据类型分类图,3.2.1值类型值类型的变量内含变量值本身,C#的值类型可以分为简单类型、结构类型和枚举类型。下面仅介绍简单类型。,1.整数类型,2.实数类型,3字符类型,例如,可以采用如下方式字符变量赋值:charc=H;/字符Hcharc=x0048;/字符H,十六进制转义符(前缀为x)charc=u0048;/字符H,Unicode表示形式(前缀为u)charc=r;/回车,转义字符在表示一个字符常数时,单引号内的有效字符数量必须且只能是一个,而且不能是单引号或者反斜杠()。,4.布尔类型布尔类型数据用于表示逻辑真和逻辑假,布尔类型的类型标识符是bool。,3.2.2引用类型引用类型也称为参考类型。和值类型相比,引用类型的变量不直接存储所包含的值,而是指向它所要存储的值。类似C中的指针。,1.object类object是C#中所有类型(包括所有的值类型和引用类型)的基类,C#中的所有类型都直接或间接地从object类中继承而来。因此,对一个object的变量可以赋予任何类型的值。floatf=1.23;objectobj1;/定义obj1对象obj1=f;objectobj2=China;/定义obj2对象并赋初值,2.string类C#还定义了一个string类,表示一个Unicode字符序列,专门用于对字符串的操作。同样,这个类也是在.NETFramework的命名空间System中定义的,是类System.String的别名。字符串在实际中应用非常广泛,利用string类中封装的各种内部操作,可以很容易完成对字符串处理。例如:stringstr1=123+abc;/+运算符用于连接字符串charc=HelloWorld!2;/运算符可以访问string中的单个字符,c=estringstr2=China;stringstr3=China;/字符串的另一种表示形式,用引起来。boolb=(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】设计一个控制台程序说明类型转换的应用。,usingSystem;namespaceProj3_1classProgramstaticvoidMain(stringargs)inti=65,i1,i2;doubled=66.3456,d1,d2;charc=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.装箱转换装箱转换是指将一个值类型的数据隐式地转换成一个对象类型的数据。例如,下面语句就执行了装箱转换:inti=8;objectobj=i;或objectobj=(object)i;2.拆箱转换拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。例如,下面语句就执行了拆箱转换:objectobj=2;inti=(int)obj;拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不同之处。,3.3C#中的变量和常量3.3.1变量1.变量定义在C#程序里使用某个变量之前,必须要告诉编译器它是一个什么样的变量,因此要对变量进行定义。定义变量的方法如下:访问修饰符数据类型变量名=初始值;例如:stringname=王华;intage=20;也可以同时声明一个或多个给定类型的变量,例如:inta=1,b=2,c=3;,2.理解值类型的变量如果一个变量的值是普通的类型,那么这个C#变量就是值类型的变量。值类型的变量直接把值存放在变量名标记的存储位置上。当定义一个值类型变量并且给它赋值的时候,这个变量只能存储相同类型的数据。所以,一个int类型的变量就只能存放int类型的数据。另外,当把值赋给某个值类型的变量时,C#会首先创建这个值的一个拷贝,然后把这个拷贝放在变量名所标记的存储位置上。例如:intx;inty=2;x=y;,3.理解引用类型的变量引用表示所使用的是变量或对象的地址而不是变量或对象本身。当声明引用类型变量时,程序只是分配了存放这个引用的存储空间。要想创建对象并把对象的存储地址赋给该变量,就需要使用new操作符。例如:MyClassvar;/MyClass是已定义的类或类型var=newMyClass();数组示例:inta=newint31,2,3;for(inti=0;ib?a:b计算过程是,当ab,max=a;否则max=b。,3.5.9运算符的优先级运算符的优先级是指在表达式中哪一个运算符应该首先计算。C#根据运算符的优先级确定表达式的求值顺序:优先级高的运算先做,优先级低的操作后做,相同优先级的操作从左到右依次做,同时用小括号控制运算顺序,任何在小括号内的运算最优先进行。,3.6C#中常用类和结构,C#中一切都是对象。,3.6.1String类,string类型是.NETFramework中的String类的别名。string类型定义了相等运算符(=和!=)用于比较两个string对象,叧外,+运算符用于连接字符串,运算符可以用来访问string中的各个字符。,【例3.7】设计一个控制台程序求用户输入的子串在主串中位置。,usingSystem;namespaceProj3_6classProgramstaticvoidMain(stringargs)Stringmstr,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);elseConsole.WriteLine(两个字符串相同);,3.6.2Math类Math类位于System命名空间中,它包含了实现C#中常用算术运算功能的方法,这些方法都是静态方法,可通过“Math.方法名(参数)”来使用。,3.6.3Convert类Convert类位于System命名空间中,用于将一个值类型转换成另一个值类型。这些方法都是静态方法,可通过“Convert.方法名(参数)”来使用。,3.6.4DateTime结构DateTime结构类位于System命名空间中,DateTime值类型表示值范围在公元0001年1月1日午夜12:00:00到公元9999年12月31日晚上11:59:59之间的日期和时间。可以通过以下语法格式定义一个日期时间变量:DateTime日期时间变量=newDateTime(年,月,日,时,分,秒);例如,以下语句定义了2个日期时间变量:DateTimed1=newDateTime(2009,10,1);DateTimed2=newDateTime(2009,10,1,8,15,20);其中,d1的值为2009年10月1日零点零分零秒,d2的值为2009年10月1日8点15分20秒。,【例3.8】设计一个控制台程序说明DataTime结构的使用。,usingSystem;namespaceProj3_7classProgramstaticvoidMain(stringargs)DateTimed1=DateTime.Now;/定义当前日期时间变量DateTimed2=newDateTime(2009,10,1);/定义一个日期时间变量Console.WriteLine(d1:0,d1);inti=d1.Year;/求d1的年intj=d1.Month;/求d1的月intk=d1.Day;/求d1的日inth=d1.Hour;/求d1的时intm=d1.Minute;/求d1的分ints=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);DateTimed3=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!,Seeyounexttime!,第4章C#控制语句,本章目录选择语句循环语句跳转语句,C#语言程序设计,79,4.1选择控制语句,4.1.1if语句基本语法格式如下:if(条件表达式)语句;其中,“条件表达式”是一个关系表达式或逻辑表达式,当“条件表达式”为true时,执行后面的“语句”。,4.1.2ifelse语句语法形式如下:if(条件表达式)语句1;else语句2;其中的“条件表达式”是一个关系表达式或逻辑表达式。当“条件表达式”为true时执行“语句1”;当“条件表达式”为false时执行“语句2”。,4.1.3ifelseif语句ifelseif语句用于进行多重判断,其语法形式如下:if(条件表达式1)语句1;elseif(条件表达式2)语句2;elseif(条件表达式n)语句n;else语句n+1;,【例4.4】编写一个程序,将用户输入的分数转换成等级。,usingSystem;namespaceProj4_4classProgramstaticvoidMain(stringargs)floatx;Console.Write(分数:);x=float.Parse(Console.ReadLine();if(x=90)Console.WriteLine(等级为A);elseif(x=80)Console.WriteLine(等级为B);elseif(x=70)Console.WriteLine(等级为C);elseif(x=60)Console.WriteLine(等级为D);elseConsole.WriteLine(等级为E);,4.1.4switch语句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学分)。,usingSystem;namespaceProj4_5classProgramstaticvoidMain(stringargs)charch;Console.Write(课程代号:);ch=(char)Console.Read();switch(ch)casem:caseM:casew:caseW:Console.WriteLine(8学分);break;casep:caseP:casec:caseC:Console.WriteLine(5学分);break;casee:caseE:Console.WriteLine(6学分);break;default:Console.WriteLine(输入的课程代号不正确);break;,4.2循环控制语句,4.2.1while语句while语句的一般语法格式如下:while(条件表达式)语句;,【例4.6】编写一个程序,将用户输入的整数反向显示出来。,usingSystem;namespaceProj4_6classProgramstaticvoidMain(stringargs)intdigit,num;Console.Write(输入一个整数:);num=int.Parse(Console.ReadLine();Console.Write(反向显示结果:);while(num!=0)digit=num%10;/依次求个位、十位、上的数字digitnum=num/10;Console.Write(digit);Console.WriteLine();,4.2.2do-while语句do-while语句的一般语法格式如下:do语句;while(条件表达式);,【例4.7】采用do-while语句重新编写例4.6的程序。usingSystem;namespaceProj4_7classProgramstaticvoidMain(stringargs)intdigit,num;Console.Write(输入一个整数:);num=int.Parse(Console.ReadLine();Console.Write(反向显示结果:);dodigit=num%10;num=num/10;Console.Write(digit);while(num!=0);Console.WriteLine();,4.2.3for语句for语句通常用于预先知道循环次数的情况,其一般语法格式如下:for(表达式1;表达式2;表达式3)语句;,【例4.8】编写一个程序,输出如图4.12所示的乘法表。,usingSystem;namespaceProj4_8classProgramstaticvoidMain(stringargs)inti,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.1break语句break语句使程序从当前的循环语句(do、while和for)内跳转出来,接着执行循环语句后面的语句。,【例4.9】编写一个程序,判断从键盘输入的大于3的正整数是否为素数。,usingSystem;namespaceProj4_9classProgramstaticvoidMain(stringargs)intn,i;boolprime=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);elseConsole.WriteLine(0不是素数,n);,4.3.2continue语句continue语句也用于循环语句,它类似于break,但它不是结束循环,而是结束循环语句的当前一次循环,接着执行下一次循环。在while和do-while循环结构中,执行控制权转至对“条件表达式”的判断,在for结构中,转去执行“表达式2”。【例4.10】编写一个程序,对用户输入的所有正数求和,如果输入的是负数,则忽略该数。程序每读入一个数,判断它的正负,如果为负,则利用continue语句结束当前一次循环,继续下一次循环,否则将该数加到总数上去。,usingSystem;namespaceProj4_10classProgramstaticvoidMain(stringargs)intsum=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.3goto语句goto语句也可以跳出循环和switch语句。goto语句用于无条件转移程序的执行控制,它总是与一个标号相匹配,其形式为:goto标号;“标号”是一个用户自定义的标识符,它可以处于goto语句的前面,也可以处于其后面,但是标号必须与goto语句处于同一个函数中。定义标号时,由一个标识符后面跟一冒号组成。,通常不要使用goto语句!,第4章C#控制语句,小节本章专业术语练习题课后练习,C#语言程序设计,99,第4章结束,C#语言程序设计,100,THANKS!,Seeyounexttime!,第5章数组和集合,本章目录一维数组二维数组Array类交错数组ArrayList类List类,C#语言程序设计,101,5.1一维数组,5.1.1一维数组的定义定义一维数组的语法格式如下:数组类型数组名;例如,以下定义了3个一维数组,即整型数组a、双精度数组b和字符串数组a;doubleb;stringc;在定义数组后,必须对其进行初始化才能使用。初始化数组有两种方法:动态初始化和静态初始化。,5.1.2一维数组的动态初始化动态初始化需要借助new运算符,为数组元素分配内存空间,并为数组元素赋初值,数值类型初始化为0,布尔类型初始化为false,字符串类型初始化为null。动态初始化数组的格式如下:数组类型数组名=new数据类型n元素值0,元素值1,元素值n-1;其中,“数组类型”是数组中数据元素的数据类型,n为“数组长度”,可以是整型常量或变量,后面一层大括号里为初始值部分。1.不给定初始值的情况如果不给出初始值部分,各元素取默认值。例如:inta=newint10;该数组在内存中各数组元素均取默认值0。,2.给定初始值的情况如果给出初始值部分,各元素取相应的初值,而且给出的初值个数与“数组长度”相等。此时可以省略“数组长度”,因为后面的大括号中已列出了数组中的全部元素。例如:inta=newint101,2,3,4,5,6,7,8,9,10;或inta=newint1,2,3,4,5,6,7,8,9,10;在这种情况下,不允许“数组长度”为变量,例如:intn=5;/定义变量nintmyarr=newintn1,2,3,4,5;/错误如果给出“数组长度”,则初始值的个数应与“数组长度”相等,否则出错。例如:intmya=newint21,2;/正确intmya=newint21,2,3;/错误intmya=newint21;/错误,5.1.3一维数组的静态初始化静态初始化数组时,必须与数组定义结合在一起,否则会出错。静态初始化数组的格式如下:数据类型数组名=元素值0,元素值1,元素值n-1;用这种方法对数组进行初始化时,无需说明数组元素的个数,只需按顺序列出数组中的全部元素即可,系统会自动计算并分配数组所需的内存空间。例如,以下是对整型数组myarr的静态初始化:intmyarr=1,2,3,4,5;在这种情况下,不能将数组定义和静态初始化分开,例如,以下是错误的。intmyarr;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语句循环访问该数组。intmya=1,2,3,4,5,6;foreach(intiinmya)System.Console.Write(0,i);Console.WriteLine();输出为:123456。,5.1.5一组数组的越界若有如下语句定义并初始化数组ca:intca=newint101,2,3,4,5,6,7,8,7,9,10;数组ca的合法下标为09,如果程序中使用ca10或ca50,则超过了数组规定的下标,因此越界了。C#系统会提示以下出错信息。未处理的异常:Syatem.IndexOutOfRangeException:索引超出了数组界限。,【例5.1】设计一个控制台应用程序,采用二分查找方法在给定的有序数组a中查找用户输入的值,并提示相应的查找结果。,usingSystem;namespaceProj5_1classProgramstaticvoidMain(stringargs)doublea=newdouble100,1.2,2.5,3.1,4.6,5.0,6.7,7.6,8.2,9.8;doublek;intlow=0,high=9,mid;Console.Write(k:);k=double.Parse(Console.ReadLine();while(lowk)high=mid-1;elselow=mid+1;Console.WriteLine(未找到0,k);,5.2二维数组,5.2.1二维数组的定义定义二维数组的语法格式如下:数组类型,数组名;其中,“数据类型”为C#中合法的数据类型,“数组名”为C#中合法的标识符。例如,以下语句定义了3个二维数组,即整型数组x、双精度数组y和字符串数组,x;double,y;string,z;对于多维数组,可以作类似的推广,例如,以下语句定义了一个三维数组,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=newint23;该数组各数组元素均取默认值0。,2.给定初始值的情况如果给出初始值部分,各元素取相应的初值,而且给出的初值个数与对应的“数组长度”相等。此时可以省略“数组长度”,因为后面的大括号中已列出了数组中的全部元素。例如:int,x=newint231,2,3,4,5,6;或int,x=newint,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=newint3,21,2,3,4,5,6;foreach(intiinmyb)Console.Write(0,i);Console.WriteLine();其输出为:123456。,【例5.2】设计一个控制台应用程序,输出九行杨辉三角形。,usingSystem;namespaceProj5_2classProgramconstintN=10;staticvoidMain(stringargs)inti,j;int,a=newintN,N;for(i=1;iN;i+)/1列和对角线元素均为1ai,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.3Array类,Array类是所有数组类型的抽象基类型。,【例5.3】设计一个控制台应用程序,产生10个019的随机整数,对其递增排序并输出。,usingSystem;namespaceProj5_3classProgramstaticvoidMain(stringargs)inti,k;intmyarr=newint10;/定义一个一维数组Randomrandobj=newRandom();/定义一个随机对象for(i=myarr.GetLowerBound(0);i=myarr.GetUpperBound(0);i+)k=randobj.Next()%20;/返回一个019的正整数myarr.SetValue(k,i);/给数组元素赋值Console.Write(随机数序:);for(i=myarr.GetLowerBound(0);i=myarr.GetUpperBound(0);i+)Console.Write(0,myarr.GetValue(i);Console.WriteLine();Array.Sort(myarr);/数组排序Console.Write(排序数序:);for(i=myarr.GetLowerBound(0);i=myarr.GetUpperBound(0);i+)Console.Write(0,myarr.GetValue(i);Console.WriteLine();,5.4交错数组,交错数组:元素为数组的数组,元素的维度和大小可以不同。多维数组:元素的维度和大小的均相同。5.4.1交错数组的定义和初始化以下语句定义了一个由3个元素组成的一维数组,其中每个元素都是一个一维整数数组:intarrj=newint3;必须初始化arrj的元素后才可以使用它。可以如下所示初始化该元素:arrj0=newint5;arrj1=newint4;arrj2=newint2;,5.4.2访问交错数组中的元素交错数组元素的访问方式与多维数组类似,通常使用Length方法返回包含在交错数组中的数组的数目,例如,以下程序定义一个交错数组myarr并初始化,最后输出所有元素的值。intmyarr=newint3;myarr0=newint1,2,3,4,5,6;myarr1=newint7,8,9,10;myarr2=newint11,12;for(inti=0;i);p2.dispoint();,6.5构造函数和析构函数,6.5.1构造函数1.什么是构造函数构造函数是在创建给定类型的对象时执行的类方法。构造函数具有如下性质:构造函数的名称与类的名称相同。构造函数尽管是一个函数,但没有任何类型,即它既不属于返回值函数也不属于void函数。一个类可以有多个构造函数,但所有构造函数的名称都必须相同,它们的参数各不相同,即构造函数可以重载。当类对象创建时,构造函数会自动地执行;由于它们没有返回类型,因此不能像其他函数那样进行调用。当类对象声明时,调用哪一个构造函数取决于传递给它的参数类型。构造函数不能被继承。,2.调用构造函数当定义类对象时,构造函数会自动执行。1)调用默认构造函数不带参数的构造函数称为默认构造函数。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。假设一个类包含有默认构造函数,调用默认构造函数的语法如下:类名对象名=new类名();如果没有为对象提供构造函数,则默认情况下C#将创建一个构造函数,该构造函数实例化对象,并将所有成员变量设置为相应的默认值。2)调用带参数的构造函数假设一个类中包含有带参数的构造函数,调用这种带参数的构造函数的语法如下:类名对象名=new类名(参数表);,【例6.2】设计一个控制台应用程序,说明调用构造函数的过程。,namespaceProj6_2classProgrampublicclassTPoint1/声明类TPoint1intx,y;/类的私有变量publicTPoint1()/默认的构造函数publicTPoint1(intx1,inty1)/带参数的构造函数x=x1;y=y1;publicvoiddispoint()Console.WriteLine(0,1),x,y);staticvoidMain(stringargs)TPoint1p1=newTPoint1();/调用默认的构造函数Console.Write(第一个点=);p1.dispoint();TPoint1p2=newTPoint1(8,3);/调用带参数的构造函数Console.Write(第二个点=);p2.dispoint();,6.5.2析构函数1.什么是析构函数在对象不再需要时,希望确保它所占的存储空间能被收回。C#中提供了析构函数用于专门释放被占用的系统资源。析构函数具有如下性质:析构函数在类对象销毁时自动执行。一个类只能有一个析构函数,而且析构函数没有参数,即析构函数不能重载。析构函数的名称是“”加上类的名称(中间没有空格)。与构造函数一样,析构函数也没有返回类型。析构函数不能被继承。,2.调用析构函数当一个对象被系统销毁时自动调用类的析构函数。,【例6.3】设计一个控制台应用程序,说明调用析构函数的过程。,using

温馨提示

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

评论

0/150

提交评论