版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.1C#语言简介C#语言是一种面向对象的、安全的、现代的计算机编程语言。其结构清晰、效率高、功能强,使得程序员可以快速地编写各种基于Microsoft.NET平台的应用程序,并且拥有C++的执行效率和运算能力,同时也具备像VisualBasic一样的易用性。正是由于C#面向对象的卓越设计,使它成为构建各类组件的理想之选—无论是高级的商业对象还是系统级的应用程序。使用简单的C#语言结构,这些组件可以方便地转化为XML网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用。返回下一页3.1C#语言简介最重要的是,C#使得C++程序员可以高效的开发程序,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的掌握。
C#相对于C和C++在许多方面进行了限制和增强。①指针(Pointer)只能被用于不安全模式。大多数对象访问通过安全的引用实现,以避免无效的调用,并目有许多算法用于验证溢出,指针只能用于调用值类型,以及受垃圾收集控制的托管对象。上一页下一页返回3.1C#语言简介②对象不能被显式释放,代之以当不存在被引用时通过垃圾回收器回收。③只允许单一继承(SingleInheritance,但是一个类可以实现多个接口(Interfaces)④C#比C++更加类型安全。默认的安全转换是隐含转换,例如由短整型转换为长整型和从派生类转换为基类。而接日同整型,及枚举型同整型不允许隐含转换,非空指针(通过引用相似对象)同用户定义类型的隐含转换必须被显式的确定,不同于C++的复制构造函数。⑤数组声明语法不同(“int[]a=newint[5]”而不是“inta[5]”)。⑥枚举位于其所在的命名空间中。返回上一页下一页3.1C#语言简介⑦C#中没有模版(Template),但是在C#2.0中引入了泛型(GenericProgramming),并目支持一些C++模版不支持的特性。比如泛型参数中的类型约束。另一方面,表达式不像C++模版中能被用于类型参数。⑧属性支持,使用类似访问成员的方式调用。⑨完整的反射支持。返回上一页3.2数据类型、变量和常量3.2.1数据类型在编写应用程序时,都必须使用某种方式表小数据,因此必须正确使用数据类型。c#中数据类型可以分为值类型和引用类型。值类型又可以称为数值类型,其中包含简单类型(SimpleTypes)、枚举类型(EnumTypes)和结构类型(StructTypes)二种;引用类型包含类类型(ClassTypes)、对象类型(Object7}pes}、字符串类型(StringTypes)、数组类型(ArrayTypes)、接口类型(InterfaceTypes)和委托类型(DelegateTypes)等。返回下一页3.2数据类型、变量和常量1.值类型值类型包括简单值类型和复合型类型。简单值类型可以再细分为整数类型、字符类型、实数类型和布尔类型;而复合型类型则是简单类型的复合,包括结构类型和枚举类型(如图3-1所示)。(1)整数类型整数类型见表3-1。返回上一页下一页3.2数据类型、变量和常量(2)字符类型C#中采用Unicode字符集来表示字符类型,长度为16位。①Unicode字符集。Unicode是一种重要的通用字符编码标准,是继ASCII(美国国家交互信息标准编码)字符码后的一种新字符编码。C#2005提供的字符类型按照国际标准,采用了Unicode字符集。②char(字符类型)。数据范围是0-65535之间的Unicode字符集中的单个字符,占用两字节,表示无符号16位整数。③特殊字符和转义字符。有些特殊字符无法直接放在引号中,此时要表示这些字符,必须使用转义符(见表3-2)。返回上一页下一页3.2数据类型、变量和常量(3)实数类型实数类型包括单精度浮点型(floar),双精度浮点型(double)和十进制型(decimal)三种,见表3-3。(4)布尔类型布尔(bool)类型取值只能是Ture或者False,布尔类型对应于.NET类库中的System.Boolean结构。它在计算机中占4个字节,即32位存储空间。(5)结构类型把一系列相关的信息组织成为一个单一实体的过程,这就是创建一个结构的过程。返回上一页下一页3.2数据类型、变量和常量其中的每个信息称为它的一个成员。例如:Structperson{stringm_name;//姓名intm_age;//年龄stringm_sex;//性别}(6)枚举类型枚举类型是一组被命名的数字常量,即:目每个常量都被赋予了一个容易记忆的“名字使用enum关键字创建枚举类型,例如:一个枚举类型中包含了多个相关的数字常量。返回上一页下一页3.2数据类型、变量和常量enumweather{sunny,//默认值0。Cloudy,//默认值1。Rain,//默认值2。gnow,//默认值3。fog//默认值4。}引用枚举成员,例如:Weatherbj;bj=Weather.Sunny;引用枚举成员,例如:
返回上一页下一页3.2数据类型、变量和常量//显示结果Console.WriteLine(bj);//显示Sunny,而不是数字0。给枚举成员明确赋值,例如:enumMonth{Jan=1,Feb=2,Mar=3,...Dec=12}返回上一页下一页3.2数据类型、变量和常量2.引用类型引用类型是C#中和值类型并列的类型。值类型的变量直接存储数据的值,而引用类型的变量不直接存储其数据的值,它存储的是对其数据对象(该类型的实例)的引用,即存储的是指向数据的地址。C#中存储数据的地方有两种:堆和栈。值类型存储在栈中,而引用类型存储在动态的堆中,栈是先进先出的有系统竹理的空间,而堆是由应用程序控制的,可随时申请和释放该空间。引用类型包括类(class)、接口(interface),委托(delegate)和数组Carray(如图3-2所示)。返回上一页下一页3.2数据类型、变量和常量(1)类类(class)是一组具有相同数据结构和相同操作的对象集合。创建类的实例必须使用关键字new来进行声明。类和结构之间的根本区别在于:结构是值类型,而类是引用类型。对于值类型,每个变量直接包含自身的所有数据,每创建一个变量,就在内存中开辟一块区域;而对于引用类型,每个变量只存储对日标存储数据的引用,每创建一个变量,就增加一个指向日标数据的指针。返回上一页下一页3.2数据类型、变量和常量
(2)接口应用程序之间要相互调用,就必须事先达成一个协议,被调用的一方在协议中对自己所能提供的服务进行描述。在C#中,这个协议就是接口(interface),接口定义中对方法的声明,既不包括访问限制修饰符,也不包括方法的执行代码。注意:如果某个类继承了一个接口,那么它就要实现该接口所定义的服务,也就是实现接口中的方法。(3)委托委托用于封装某个方法的调用过程。委托的使用过程分为3步:①定义delegatevoidHelloDelegate();②实例化HelloDelegatehd一newHelloDelegate(p1.Say);//p1.Say调用的方法返回上一页下一页3.2数据类型、变量和常量③调用hd();(4)数组数组主要用于同一数据类型的数据进行批量处理。在C#中,数组需要初始化之后才能使用。例如:int[]arrayl=newint[3]{2,3,5};int[]arrayl={2,3,5};注意:对规则多维数组,调用Length属性所得的值为整个数组的长度;而调用其GetLength方法,参数为0时得到数组第1维的长度,为1时得到数组第2维的长度,以此类推。而对于不规则多维数组,调用Length属性和以。为参数调用其GetLength方法,得到的都是第一维的长度。返回上一页下一页3.2数据类型、变量和常量3.类型转换(1)数值转换相容的数据类型可以混合运算。运算中,不同数据类型先被自动转换为相同数据类型,然后再进行运算。转换时低容量数据类型向高容量数据类型转换。数值的转换有一个原则,即从低精度类型到高精度类型通常可以进行隐式转换;而从高精度类型则必须进行显式转换。返回上一页下一页3.2数据类型、变量和常量将小容量数据类型转换成大容量数据类型时,系统自动完成,成为隐式转换。intx=123456longy=x;//将int隐式转换为long将大容量数据类型转换成小容量数据类型时,可能丢失信息,所以必须使用强制类型转换。dPcimald=100.99intx=(int)d;//显式转换,山高精度到低精度的转换//x的值是100,小数点后的值被舍弃具体转换过程中信息的丢失就依靠各数据类型的精度了(可以参考上面数据类型)。返回上一页下一页3.2数据类型、变量和常量(2)枚举转换枚举类型与其他任何类型之间都不存在隐式转换,而和枚举类型相关的显式转换包括:①从所有整数类型(包括字符类型)和实数类型到枚举类型的显式转换;②从枚举类型到所有整数类型(包括字符类型)和实数类型的显式转换;③从枚举类型到枚举类型的显式转换。(3)装箱和拆箱转换主要是值类型与引用类型之间的相互转换。简而言之,装箱是从值类型到引用类型的转换。返回上一页下一页3.2数据类型、变量和常量同样,拆箱是从引用类型到值类型的转换。使用拆箱可以像操作简单类型一样操作复杂的引用类型,这是C#中非常强大的功能。例如:Objectobj1=10Inti=(int)obj;//拆箱Intj=100;Objectobj2=j;//装箱返回上一页下一页3.2数据类型、变量和常量3.2.2变量当需要访问存储在变量中的信息时,只需要使用变量的名称即可。为变量起名时要遵守c#语言的规定。1.变量的命名规则①变量名必须以字母开头。②变量名只能由字母、数字和下画线组成,而不能包含空格、标点符号、运算符等其他符号。③变量名不能与c#中的关键字名称相同。④变量名不能与c#中的库函数名称相同。返回上一页下一页3.2数据类型、变量和常量但在C#中有一点是例外,那就是允许在变量名前加前缀“@”。在这种情况下,就可以使用前缀“@”加上关键字作为变量的名称。这卞要是为了与其他语言进行交匀_时避免冲突。因为前缀“@”实际上并不是名称的一部分,其他的编程语言就会把它作为一个普通的变量名。在其他情况下,不推荐使用前缀“@”作为变量名的一部分。2.声明并初始化变量第1步:声明变量。作用:通过声明变量,可以在内存中为该变量申清存储空间。返回上一页下一页3.2数据类型、变量和常量语法:类型变量名;例如:intnumberOfVisitors;stringbear;第2步:初始化变量。作用:给变量分配初值。语法:变量名一初值;例如:stringbear;bear=“Grizzly”;//声明和初始化步完成
stringbear=“Grizzly";下面给出了一些合法和非法的变量名的例了:
返回上一页下一页3.2数据类型、变量和常量inti;//合法
intNo.l;//小合法,含有非法字符
stringtotal;//合法
charuse;//小合法,与关键字名称相同
char@use;//合法
floatMain;//小合法,与函数名称相同尽管符合了上述要求的变量名就可以使用,但还是应该在给变量取名的时候,给出具有描述性质的名称,这样写出来的程序便于理解。比如一个消息字符串的名字就可以叫s-message;而e90PT就不是一个好的变量名。返回上一页下一页3.2数据类型、变量和常量可以在一条语句中命名多个类型相同的变量,例如:inta,b,c=50,d;应注意以下儿个事项。①C#语言区分大小写。②变量命名的约定:一般用骆驼表示法命名,首个单词的首字母小写,其余单词的首字母大写。例如:numberOfVisitors。③bool只能取两个值:True或False。返回上一页下一页3.2数据类型、变量和常量④char表示单个Unicode字符,用‘’表示。⑤使用后缀。
boolisOpen=0;//错误
boolisOpen=false;char=”A“;decimalbalance=3400.20;//错误decimalbalance=3400.20M;返回上一页下一页3.2数据类型、变量和常量3.2.3常量常量就是其值固定不变的量。从数据类型角度来看,'常量的类型可以是任何一种值类型或引用类型。一个常量的声明,就是声明程序中要用到的常量的名称和它的值。和变量一样,可以同时声明一个或多个给定类型的常量。'常量通常用来表示有意义的固定数值,如圆周率,声明常量时必须对其赋值。常量的声明语法格式如下:const类型常量名=数值例如:constdecimalP工=3.1415926M;//圆周率
constintearthRadius=6378;//地球半径返回上一页下一页3.2数据类型、变量和常量3.2.4表达式运算符就是表达式中的符号。运算符包括:一元运算符、算术运算符、移位运算符、关系和类型测试运算符、逻辑运算符、条件逻辑运算符、条件运算符和赋值运算符。1.常见运算符常见运算符,见表3-4。返回上一页下一页3.2数据类型、变量和常量2.特殊运算符(1)字符串连接符+字符串连接是最常用的字符串运算。所谓字符串的连接,就是将两个字符串连接在一起,形成新的字符串。例如:“abe”+”efg”结果是abcefg“36812”+“3.14”结果是368123.14(2)is运算符is运算符检查表达式是否是指定的类型,如果是,结果为True,否则结果为False。例如:返回上一页下一页3.2数据类型、变量和常量intk=2;boolistTest=kisint;//isTest=true(3)sizeof运算符sizeof运算符获得值类型数据在内存占用的字节数。sizeof运算符的使用格式如下:sizeof(类型标识符)(4)typeof运算符typeof运算符用于获得一个对象的类型。(5)checked和unchecked运算符这两个运算符用于控制整数算术运算中当前环境的溢出情况。
返回上一页下一页3.2数据类型、变量和常量Shortvall=2000,va12=2000;shortmyshort;myshort=checked((short)(vall+val2));//出现错误,但是被忽略。3.运算符的优先级运算符的优先级,见表3-5。返回上一页下一页3.2数据类型、变量和常量表达式计算规则包括以下儿条:①按照运算符的优先级计算表达式。②可以使用圆括号控制运算的顺序。③左结合和右结合:所有一元运算符都是左结合的;赋值运算符和条件运算符是右结合的。返回上一页3.3流程控制3.3.1条件语句条件语句可以根据条件是否满足或根据表达式的值控制代码的执行分支。c#有两个分支代码的结构:if语句,测试特定条件是否满足;switch语句,比较表达式和许多不同的值。1.if语句对于条件分支,C#继承了C和C++的if...else结构,其细致的语法归纳起来总共有3种:if语句、if...else语句和if...elseif...else语句,下面分别进行介绍。(1)最基本的if语句语法格式:if(条件表达式)功能代码;返回下一页3.3流程控制
语法说明:①if是该语句中的关键字,后续紧跟一对小括号,该对小括号任何时候不能省略,小括号的内部是具体的条件,语法上要求该表达式结果为boolean类型,后续为功能的代码,也就是当条件成立时执行的代码,在程序书写时,一般为了直观的表达包含关系,功能代码一般需要缩进;②需要特别注意的是,这单的语句只能是一行,关于多行结构的语句,后续将说明,if(条件表达式)后续一般不书写分号;返回上一页下一页3.3流程控制③if语句的执行流程为—如果条件表达式成立,则执行功能代码,如果条件表达式不成立,则不执行后续的功能代码。例如:inta=10if(a>=0)Console.WriteLine(“a是正数”);if(a%2==0)Console.WriteLine(“a是偶数”);
返回上一页下一页3.3流程控制在该示例代码中,第一个条件是判断变量a的值是否大于等于零,如果该条件成立则执行输出,第一个条件是判断变量a是否为偶数,如果成立也输出。思考:注意以下代码的执行流程。intm=20;if(m>20);M+=20;Console.WriteLine(m);
返回上一页下一页3.3流程控制按照前面的语法格式说明,只有m+=20;这行代码属于功能代码,而后续的输出语句和前面的条件形成程序结构,所以该程序执行以后输出的结果为20。如果当条件成立时,需要执行的语句有多句,则可以使用语句块来进行表述,语法格式如下:if(条件表达式){功能代码;}使用这种语法格式,使用一个代码块来代替前面的功能代码,这样可以在代码块内部书写任意多行的代码,而目也使整个程序的逻辑比较清楚,所以在实际的代码编写中推荐使用这种逻辑。返回上一页下一页3.3流程控制[例3-1]设计一个简单的成绩评判程序。//程序清单P3_1.csusingSysTem;publicclassP3_1{publicstaticvoidMain(){Console.Write(’’***成绩评定***\n请输入成绩:”);//转义字符‘\n'表示换行//Parse方法完成将字符串转换成整数intscore=int.Parse(Console.ReadLine())if(score>=90){返回上一页下一页3.3流程控制Console.WriteLine(“成绩优秀!”);}if(score>=60&&score<90){Console.WriteLine(“马马乎乎!”);}if(score<60){Console.WriteLine(“还要努力哟!”);}}}返回上一页下一页3.3流程控制(2)标准if...else语句if...else语句实现了封闭的条件,在程序中使用的更加常见。其中else关键字的作用是“否则”,即条件不成立的情况。语法格式:if(布尔表达式){
功能代码块l;}功能代码块2;}返回上一页下一页3.3流程控制
语法说明:如果if或else之后的功能代码块中只包含一条执行语句,则嵌套的花括号可以省略,如果包含了两条以上的执行语句,嵌套部分一定要加上花括号{…},把这些语句组合为一个块;如果遗漏花括号,将造成两个严重后果,首先,C#只将第一句与if语句关联起来,下一个语句将不再成为if语句的一部分,其次,当遇到else时,不会将它与前一个if语句关联起来,所以会产生语法错误。返回上一页下一页3.3流程控制例如:intn=12;if(n%2!=0)Console.WriteLine(“n是奇数”);elseConsole.WriteLine(“n小是奇数”);因为n%2的值是0,条件不成立,执行else语句的代码,程序输出“n不是奇数”。返回上一页下一页3.3流程控制[例3-2]判断某一年是否是闰年。判断闰年的方法是:一个数可以被4整除并A不可以被100整除,或者直接可以被400整除的数就是闰年。//程序清单P3_2.csusingSystem;{publicclassP3_2{publicstaticvoidMain()intyear;Console.Write(“***判断闰年***\n请输入年份:”);返回上一页下一页3.3流程控制year=int.Parse(Console.ReadLine());if(((year%4==0)&&(year%100!=0))}}(year%400==0)){Console.WriteLine(”{0}是闰年。”,year);}else{返回Console.WriteLine(“{0}不是闰年。”,year);}}}上一页下一页3.3流程控制程序说明:当程序中有多个if时,else语句和最近的if匹配。
if(条件1>
功能代码l;if(条件2)
功能代码2;else
功能代码3;则这里的else语句和条件2对应的if语句匹配,前面的条件1是一个独立的语句。在实际代码中,可以使用花括号使整个程序的结构更加清楚。返回上一页下一页3.3流程控制(3)多条件if...elseif...else语句在现实中,有些时候的条件不是一个,而是一组相关的条件,例如将阿拉伯数字转换为中文大写,根据分数转换为对应的等级等,都是多条件的结构,在程序中为了避免写多个if语句的结构,提供了一类专门的多分支语句,这就是if...elseif...else语句。语法格式:if(条件1)
功能代码l;返回上一页下一页3.3流程控制elseif(条件2)功能代码2;elseif(条件3)功能代码3;…else功能代码;语法说明:①elseif是else和if两个关键字,中间使用空格进行间隔;②条件1到条件n都是boolean类型;③elseif语句可以有任意多句;返回上一页下一页3.3流程控制④最后的else语句为可选;⑤如果功能代码部分不是语句块,也就是不用大括号,则只能写一句。执行流程:当条件1成立时,则执行功能代码1;当条件1不成立目条件2成立时,则执行功能代码2;如果条件1、条件2都不成立目条件3成立,则执行功能代码3;依次类推,如果所有条件都不成立,则执行else语句的功能代码。其执行流程的流程如上所示。【例3-3】实现将b分制的成绩转换为A,B,C,D和E。
返回上一页下一页3.3流程控制//程序清单P3_3.csusingSystem;{publicclassP3_3{publicstaticvoidMain()intscore;Console.Write(“***成绩转换+++}n请输入成绩:”);score=int.Parse(Console.ReadLine());if(score>=90)返回上一页下一页3.3流程控制{Console.WriteLine(“A")}elseif(score>=80){Console.WriteLine(“B")}elseif(score>=70){Console.WriteLine(“C")}返回上一页下一页3.3流程控制elseif(score>=60)Console.WriteLine(”D");}elseConsole.WriteLine(”E”);}}
}返回上一页下一页3.3流程控制从该代码中可知,每个elseif语句在书写时是有顺序的,在实际n写时,必须按照逻辑上的顺序进行书写,否则将出现逻辑错误。If...elseif...else语句是C#语言中提供的一个多分支条件语句,但是在判断某些问题时,会书写的比较麻烦,所以在语法中提供了另外一个语句—switch语句来更好地实现多分支语句的判别。返回上一页下一页3.3流程控制2.switch语句switchescase语句适合于从一组4_斥的分支中选择一个执行分支。C++和Java程序员应该很熟悉它,该语句类似于VB中的SelectCase语句。其形式是switch参数的后面跟一组case子句。如果switch参数中表达式的值等于某个case子句旁边的某个值,就执行该case子句中的代码。此时不击要使用花括号把语句组合到块中;只击使用break语句标记每个case代码的结尾即可。也返回上一页下一页3.3流程控制可以在switch语句中包含一个default子句,如果表达式不等于任何case子句的值,就执行default子句的代码。语句格式:switch(表达式){case常量表达式:
嵌入语句…default:嵌入语句}返回上一页下一页3.3流程控制语法说明:①switch表达式的类型为sbyte,byte,short,ushort,int,uint,long,ulong,char,string,枚举或用户自定义类型;②每个case分支中的常量表达式必须能隐式转换为switch表达式的类型;③default分支可有可无,但每个switch语句最多只能有一个default分支;④不允许出现“贯穿”情况,即在某一case分支中没有跳转语句。下面的switch语句测试integerA变量的值:
返回上一页下一页3.3流程控制switch(inteqerA){case1:Console.WriteLine(“inteqerA=1”);break;case1:Console.WriteLine(“inteqerA=2”);break;case1:Console.WriteLine(“integerA=3”);break;返回上一页下一页3.3流程控制default:Console.WriteLine(”inteqerAisnot1,2,or3”);break;}注意case的值必须是常量表达式,不允许使用变量。和C相比,C#的switchwcase语句更安全,特别是它禁止所有case中的失败条件。如果激活了块中靠前的一个case子句,后面的case子句就不会被激活,除非使用goto语句特别标记要激活后面的case子句。编译器会把没有break语句的每个case子句标记为错误:
返回上一页下一页3.3流程控制Controlcannotfallthroughfromonecaselabel(“case2:”)toanother在有限的儿种情况下,这种失败是允许的,但在大多数情况下是不希望出现这种失败的,而目这会导致出现很难察觉的逻辑错误。应让代码II:}常工作,而不是出现异常。但在使用goto语句时((C#支持),会在switch...case中重复出现失败。如果确实想这么做,就应重新考虑设计方案了。下面的代码说明了如何使用goto模拟失败,得到的代码会非常混乱:返回上一页下一页3.3流程控制//assumecountryandlanguageareoftypestringswitch(country){case“America”:CallAmericanOnlyMethod();qotocase“Britain";case“Frence”:language=“French";break;Case“Britain”:language=“English";break;}返回上一页下一页3.3流程控制但这有一种例外情况:如果一个case子句为空,就可以从这个case跳到下一个case上,这样就可以用相同的方式处理两个或多个case子句了(不击要goto语句)。
switch(country){case“au”:case“uk”:case“us”:language="English";break;返回上一页下一页3.3流程控制case“at”:case“de”language=”German";break;}在C#中,switch语句中case子句的排放顺序是无关紧要的,甚至可以把default子句放在最前面。因此,任何两个case都不能相同。这包括值相同的不同常量,所以不能这样编写:返回上一页下一页3.3流程控制//assumecountryisoftypestringconststringengland=“uk”;conststringbritain=“uk”;Switch(country){caseengland:casebritain://thiswillcauseacompilationerrorlanguage=“English";break;}返回上一页下一页3.3流程控制上面的代码还说明了C#中的switch语句与C++中的switch语句的另一个不同之处:在C#中,可以把字符串用作测试变量。[例3-4]显示某一年的某月的天数。
//程序清单P3_4.csusingSystem;publicclassP3_4{publicstaticvoidMain(){返回上一页下一页3.3流程控制Console.Write(“请输入年份:");intyear=int.Parse(Console.ReadLine())Console.Write(“请输入月份:");intmonth=int.Parse(Console.ReadLine());intmonthDays=0;switch(month){case1:case3:case5:case7:case8:case10:case12:monthDays=31;
返回上一页下一页3.3流程控制break;//System.DateTime类用于时期和时间的处理,IsLeapYear方法判断是否为闰年case2:monthDays=DateTime.IsLeapYear(year)?29:28;break;}Console.Write(“{0}年{1}l1共{2}天。”,year,month,monthDays);}}返回上一页下一页3.3流程控制[例3-5]根据用户输入的分数,输出分数的等级。用户输入的分数范围是0-100,分数等级为A,B,C,D,E五个等级,90-100为A,80-89为B,70-79为C,60-69为D,60以下为E.//程序清单P3_5.csusingSystem;usingSystem.Collections.Generic;usingSystem.teXt;namespaceConsoleApplication1{classProgram{返回上一页下一页3.3流程控制staticvoidMain(string[]args){Console.WriteLine(“请输入成绩:”);intmark=Convert.ToInt32(Console.ReadLine())mark=mark/10;switch(mark){Case9:Console.WriteLine(“A”);break;Case8:Console.WriteLine(“B”);返回上一页下一页3.3流程控制break;Case7:Console.WriteLine(“C”);break;Case6:Console.WriteLine(“D”);break;Console.ReadLine();}}}返回上一页下一页3.3流程控制3.3.2循环语句在编写程序过程中,往往出现相同类型操作需要重复出现,如实现1+2+…+100,则需要做99次加法,这类问题使用循环语句解决,可以使问题变得简单。即循环语句用于实现语句块的重复执行。根据问题的具体情况,C#中提供了四种不同的循环机制:for循环、while循环、do...while循环和foreach循环。这单介绍前二种循环机制,foreach循环将在数组中进行介绍。返回上一页下一页3.3流程控制1.for循环for循环常用于己知循环次数的情况,使用该循环时,测试是否满足某个条件,如果满足条件,则进入下一次循环,否则,退出该循环。(1)for循环语句的语法格式
for(表达式l;表达式2;表达式3){
循环语句序列;}其中表达式1用于参与循环条件变量的初始化,该表达式仅执行一次;表达式2为条件
返回上一页下一页3.3流程控制判断表达式,即每次循环体开始之前,判断该表达式是否成立,如果成立,进入下一次循环,否则,循环结束;表达式3用于参与循环条件变量的运算,一般为递增或递减的循环计数器。循环语句序列用于描述重复执行的语句,当语句序列中仅含有一条语句时,花括号可以省略。流程图如图3-3所示。该结构中,表达式1、表达式2、表达式3是可选的,但应该注意死循环的发生。如表达式2省略,并目不采用转移语句,会导致死循环的发生。可以在循环体中的任何位置放置break语句来强制终止for循环—随时跳出for循环。break语句通常包含于if语句中。返回上一页下一页3.3流程控制(2)for循环语句的使用根据下面的实例,了解for语句的工作流程及实现方法。[例3-6]计算1+2+3+…+100。使用for语句实现。分析:该问题属于重复执行加法的问题,并目参与运算的两个操作数不断的按规律增加。该类问题可以通过循环进行解决。在窗体设计图中,双击按钮buttonl编写“计算”按钮的Click(单击)事件代码为:返回上一页下一页3.3流程控制privatevoidbuttonl_Click(objectsender,System.EventArgse){intsum;sum=0;for(intk=1;k<=100;k=k+l){sum=sum+k;}labell.Text=”从1加到100值为”+sum.ToString());}返回上一页下一页3.3流程控制运行程序时,单击“计算”按钮,将在标签上显示运行结果,如图3-4所示。【例3-7〕计算n!,假设n=10。分析:该例实现阶乘的运算,可以使用改变乘数的值进行实现,使用循环可以方便地实现该类问题。程序的运行结果如图3-5所示。编写“计算”按钮的Click(单击)事件代码为:返回上一页下一页3.3流程控制privatevoidbuttonl-_Click(objectsender,System.EventArqse){intsum,k;Sum=1;for(k=1;k<=10;k++)Sum=sum*k;}textBoxl.Text=sum.ToStrinq();
返回上一页下一页3.3流程控制2.while循环与for循环语句比较,while语句使用的频率要低一些,它可以用于不知道循环次数的情况;用于在循环时判断是否满足某个条件。每一次在循环的顶部进行检测循环是否继续,当循环的条件为假时,退出循环。(1)while循环语句的语法格式
while(布尔条件表达式){语句序列;}返回上一页下一页3.3流程控制布尔条件表达式是每次循环开始前进行判断的条件,当条件表达式的值为真时,执行循环;否则,退出循环。该语句结构的流程图如图3-6所示。说明:①布尔条件表达式是一个具有boolean值的条件表达式,为循环的条件;②作为循环体的语句序列可以是简单语句、复合语句和其他结构语句;
返回上一页下一页3.3流程控制③while循环的执行过程为首先计算条件表达式的值,如果为真(True),则执行后面的循环体,执行完后,再开始一个新的循环,如果为假(False),则终止循环,执行循环体后面的语句;④可以在循环体中的任何位置放置break语句来强制终止while循环—随时跳出while循环,break语句通常包含于if语句中;⑤可以在循环体中的任何位置放置continue语句,在整个循环体没有执行完就重新判断条件,以决定是否开始新的循环,continue语句通常包含于if语句中。
返回上一页下一页3.3流程控制(2)while循环语句的使用与for循环不同的是,while循环最常用于下述情况:在循环开始前,不知道重复执行一个语句或语句块的次数。通常,在某次迭代中,while循环体中的语句把布尔标记设置为False结束循环,如例3-8所示。[例3-8]计算从1加至100的值。
返回上一页下一页3.3流程控制//程序清单P3_8.csusingSystem;publicclassP3_7{publicstaticvoidMain(){inti=0;//循环变量i初始化intsum=0;//求和变量sum初始化while(i<=100)//循环判断{返回上一页下一页3.3流程控制sum=sum+i;//累加=i+1;//循环条件修改}Console.WriteLine(“sum=”+sum);}}返回上一页下一页3.3流程控制所有的C#循环机制,包括while循环,如果只重复执行一条语句,而不是一个语句块,都可以省略花括号。许多程序员都认为最好在任何情况下都加上花括号。3.do...while循环do...while循环非常类似于while循环,是while循环的后测试版本。一般情况下,可以相4_转换使用。它们之间的差别在于while循环的测试条件在每一次循环开始时执行,而do...while循环的测试条件是在每一次循环体结束时进行判断。因此,while循环可能一次循环也执行不了,要看测试条件,而do...while循环应至少执行一次循环体。(1)do...while的语法格式返回上一页下一页3.3流程控制Do{语句序列;while(布尔条件表达式)}(2)do...while的使用[例3-9]使用do...while语句实现1+2+3+...+100。在窗体设计图中,双击按钮buttonl编写“计算”按钮的Click(单击)事件代码为:返回上一页下一页3.3流程控制privatevoidbuttonlClick(objectsender,System.EventArgse){intsum;sum=0;intk=1;Do{sum=sum+k;k=k+1;返回上一页下一页3.3流程控制}while(k<=100);labell.Text=”从1加到100值为,'+sum.ToStrinq();//将sum显式转换为字符串[例3-10]输入身份证号码判别男女。//程序清单P3_10.csusingSystem;publicclassP3_9{publicstaticvoidMain(){返回上一页下一页3.3流程控制StringsConsole.Write”请输入18位身份证号码:do{s=Console.ReadLine();if(s.Lenqth==18//身份证长度验证gotoOUTIDE;//跳转至循环外Console.Write(”长度不正确\n请重新输入18位身份证号码:”);}while(s.Lenqth!=18);
返回上一页下一页3.3流程控制
…//还可以有其他验证,如出生日期、效验码的验证等OUTIDE:Console.Write(“身份证号码为:”+s);if(s[16]%2==0)Console.WriteLine(“,性别为女”);elseConsole.WriteLine(“,性别为男”);}}返回上一页下一页3.3流程控制4.循环的嵌套当一个循环(称为“外循环”)的循环语句序列内包含另一个循环(称为“内循环”),称为循环的嵌套,这种语句结构称为多重循环结构。内循环中还可以包含循环,形成多层循环(循环嵌套的层数理论上无限制)。三种循环(while循环、do...while循环、for循环)可以互相嵌套。在多重循环中,需要注意的是循环语句所在循环的层数。如以下代码所示:返回上一页下一页3.3流程控制【例3-11】编程实现九九乘法表。分析:本例中实现每一个一位数i显示从1乘到i,对于i的取值要从1取到9,所以可以使用两重循环实现。实现每一个一位数i显示从1乘到i,即:Intsum=0;for(inti=1;i<=10;i=i+1)for(intk=1;k<=10;k=k+1)Sum=sum+k;返回上一页下一页3.3流程控制每一步中又进行了重复的乘法运算,k*I。K=1,k<=I例3-11中使用两重循环实现,其中外层循环实现乘法表中第二乘数i取值范围为1-9,内层循环在外层循环的基础上计算第一个乘数k的取值范围为1-i,其乘积以及表达式在Label控件中显示,如图3-7所示。按钮的Click(单击)事件代码为:返回上一页下一页3.3流程控制privatevoidbuttonl1_Click(objectsender,System.EventArgse){labell.Text=””;strings=”;intsum;for(inti=1;i<10;i=i+l){s=“”;返回上一页下一页3.3流程控制for(intk=1;k<=i;k=k+1){sum=k*i;s=s+k.ToStrinq()+”X"+i.ToStrinq()+"="+sum.ToStrinq()+”;”;}labell.Text+=s+"\n";//显示并换行}}返回上一页下一页3.3流程控制3.3.3跳转语句使用跳转语句,可以使程序执行跳转到程序中其他部分。c#中提供四种转移语句:goto语句、break语句、continue语句、return语句。1.goto语句goto语句可以将程序控制直接转移给标签制定的语句。但由于goto语句改变了程序的正常流程,使得程序特别容易出错,所以尽量不要用。而目,用goto语句实现的循环完全可以用循环语句实现,因此,goto语句很少使用。
返回上一页下一页3.3流程控制2.break语句break语句可以用于退出所在的最近循环,使用break语句时,将结束循环,执行后面的语句。break不能放在循环语句或switch语句后,否则发生错误。3.continue语句continue语句用于循环语句中,类似于break语句,但仅从当前的循环迭代中退出,然后执行下一次迭代循环。4.return语句return语句用于将控制权返回到出现return的函数的调用方。return语句要求后跟与方法返回类型相同的表达式。如果方法返回类型为void,则可以使用不带表达式的return语句。返回上一页下一页3.3流程控制【例3-12】使用计数器循环语句了解continue语句的使用,要求输出大于5的数。本例使用控制台程序实现。“计算”按钮的Click(单击)事件代码为:staticvoidMain(string[]args{for(inti=1;i<=10;i=i+1)if(i<5){continue;Console.WriteLine(i);返回上一页下一页3.3流程控制}Console.ReadLine()}本程序的运行结果为:56789该例中当i<5时通过continue退出本次循环,所以运行结果中不显示1、2、3、4数字。返回上一页下一页3.3流程控制3.3.4异常处理语句C#提供了处理错误的机制,即使用异常类Exception为每种错误提供定制的处理,并把识别错误的代码和处理错误的代码分离开来。异常具有以下一些特点。①在应用程序遇到异'淞清况(如被零除情况或内存不足警告)时,就会产生异常。②发生异常时,控制流立即跳转到关联的异常处理程序(如果存在)。返回上一页下一页3.3流程控制③如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误信息。④可能导致异常的操作通过try关键字来执行。⑤异常处理程序是在异常发生时执行的代码块。在C#中,catch关键字用于定义异常处理程序。⑥程序可以使用throw关键字显式地引发异常。⑦异常对象包含有关错误的详细信息,其中包括调用堆栈的状态以及有关错误的文本说返回上一页下一页3.3流程控制⑧即使引发了异常,finally块中的代码也会执行,从而使程序可以释放资源。C#的异常可能由两种方式导致:throw语句无条件抛出异常;C#语句和表达式执行过程中激发了某个异常的条件,使得操作无法正常结束,从而①②口引发异常,例如整数除法操作分母为零时将抛出一个异常。返回上一页下一页3.3流程控制异常由try语句来处理,try语句提供了一种机制来捕捉执行过程中发生的异常。C#主要有二种异常处理语句:①用try...catch捕获异常;②用try...finally清除异常;③用try...catch...flnally处理所有的异常。
1.try...catch定义及使用正常情况下,程序流进入try控制块,如果没有错误发生,就会正常操作。当程序流离开try控制块后,如果没有发生错误,将执行catch后的finally语句块或顺序执行;当执行try时发生错误,程序流就会跳转到相应的catch语句块。返回上一页下一页3.3流程控制【例3-13】在TextBox控件中接受两个数,计算它们的商。分析:该例中需要利用TextBox的Text属性接受数字,因为Text属性值描述的类型为字符串型,所以在程序运行的过程中,可能引发异常;另外,除数不能为0,否则,引发异常。程序运行效果如图3-8所示。“计算a/b”按钮的Click事件代码为:返回上一页下一页3.3流程控制inta,b,c;Try{a=Convert.ToInt32(textBox1.Text);}Catch{MessageBox.Show(’,请将al均值输入为数字’,);return;}返回上一页下一页3.3流程控制返回Try{b=Convert.ToInt32(textBox2.Text);}Catch{MessageBox.Show("请将b的值输入为数字");return;}Try{上一页下一页3.3流程控制返回c=a/b;}catch(DivideByZeroException)//如果发生的异常为除以0{MessageBox.Show(“除数小能为0”);return;}MessaqeBox.Show(“整数a与整数b的商为”+c.ToStrinq());}上一页下一页3.3流程控制2.try...finally定义及使用如果关心的是清除异常而不是错误处理,可以使用try...finally清除异常来实现。它不仅抑制了出错消息,而A所有包含在finally块中的代码在异常被引发后仍然会被执行。尽竹程序不正常终止,但还可以为用户获取一条消息。finally块用于清除try块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。控制总是传递给finally块,与try块的退出方式尤关。catch用于处理语句块中出现的异常,而finally用于保证代码语句块的执行,与前面的try块的退出方式无关。[例3-14]使用try…finally语句。程序代码如下:返回上一页下一页3.3流程控制返回//程序清单P3_14.csusingSystem;publicclassSample{publicstaticvoidMain()tryConsole.WriteLine(“执行try子句!");gotoleave;//跳转到leave标签}finally{Console.WriteLine(“执行finally子句}”);}上一页下一页3.3流程控制返回运行结果如图3-9所示。
3.try...catch...finally定义及使用应用程序最有可能的途径是合并前面两种错误处理技术--捕获错误、清除并继续执行应用程序。要做的就是在出错处理代码中使用try…catch…finally语句。leave:Console.WriteLine(“执行leave标签!”);Console.ReadLine();}}上一页下一页3.3流程控制catch和finally一起使用的常见方式是:在try块中获取并使用资源,在catch块中处理异常情况,并在finally块中释放资源。【例3-15】使用异常处理语句来完成异常清况的捕获。程序代码如下:返回上一页下一页3.3流程控制返回//程序清单P3_15.csusingSystem;publicclassCatch_Finally_TesT{staticvoidmain(){TryConsole.WriteLine(“执行测试程序开始.”);thrownewNullReferenceException();}catch(NullReferenceExceptione){上一页下一页3.3流程控制返回运行结果如图3-10所示。Console.WriteLine(“异常1被捕获”,e);}Catch{Console.WriteLine(“异常2被捕获.”);}Finally{Console.WriteLine(“执行finally程序块.”);}}System.Console.ReadLine();}上一页3.4类和对象现实生活中的类是人们对客观对象不断认识而产生的抽象的概念,而对象则是现实生活中的一个个实体。面向对象程序设计的类概念从本质上和人们现实生活中的类概念是相同的。类是面向对象编程的基本单位,是一种包含数据成员、函数成员的数据结构。类的数据成员有变量、域和事件。函数成员包括方法、属性、构造函数和析构函数等。类和结构同样都包含了自己的成员,但它们之间最主要的区别在于:类是引用类型,而结构是值类型。类支持继承机制,通过继承,派生可以扩展类的数据成员和函数方法,进而达到代码重用泪!设计重用的目的。返回下一页3.4类和对象类是c#中功能最强大的数据类型,在c#中,类分为两种:由系统提供的预先定义的,这些类在.NET框架类库中;用户定义数据类型。在创建对象之前必须先定义该对象所属的类,然后由类声明对象。在VisualStudio.NET集成环境中,工具箱中的每个控件,都是被图形文字化的可视的类,而把这些控件添加到窗体设计器中后,窗体设计器中的控件则是对象,即由工具箱中的类创建的对象。返回上一页下一页3.4类和对象3.4.1声明类在类定义中需要使用关键字class,其定义格式为:类修饰符clan:类名{类体}“类名”是一个合法的C#标识符,表示数据类型(类类型)名称,“类体”以一对花括号开始和结束。在一对大括号后面可以跟一个分号,也可以省略分号。class关键字前面是类修饰符,指访问级别,类名称位于class之后。例如:返回上一页下一页3.4类和对象Classstudent//类名为student{PublicstringID;PublicstringName;PublicstringSex;}上例定义了一个名为“Student”(学生)的类,类体中包括学生的学号(“ID”、姓名“Name”)与性别(“Sex”)。返回上一页下一页3.4类和对象“类体”包括类中的所有数据及对数据的操作,面向对象程序设计将数据和对数据的操作作为一个整体,以类的形式进行定义,这种机制叫“封装”。在“类体”中,所有的数据及对数据的操作的集合叫类成员,类成员的种类很多,本章仅介绍“字段”、“属性”、“方法”与“构造函数”。“字段”是类定义中的数据,也叫类的变量。在上例中定义的“ID",“Name”,与“Sex”,等均为类中的字段。如果需要在类定义的多个方法中使用某个变量,该变量应该声明为字段。返回上一页下一页3.4类和对象“属性”用于读取和写入“字段”值,“属性”是字段的自然扩展,对用户而言,“属性”等同于“字段”本身,对程序员而言,属性是一种读写“字段”的特殊方法。“方法”实质上就是函数,通常用于对字段进行计算和操作,即对类中的数据进行操作,以实现特定的功能。返回上一页下一页3.4类和对象3.4.2创建对象1.声明对象声明对象的格式与声明基本数据类型的格式相同,其语法格式为:
类名对象名;例如:Students1;//声明个学生类对象s1对象声明后,击用“new”关键字将对象实例化。实例化的语法格式:
对象名=new类名();例如:sl=newStudent(),//为s1分配内存Students1=newStudent();//声明的同时实例化返回上一页下一页3.4类和对象2.访问对象访问对象实质是访问对象成员,对对象变量成员的访问使用“.”运算符。例如:s1.ID=“2005001”;s1.Name=“张二”;s1.Sex=“女”;使用对象变量为另一对象变量整体赋值,例如:Students2;s2=sl;“或“Students2=s1;可以使用对象中的某一成员为变量赋值。例如:stringshame=sl.Name;返回上一页下一页3.4类和对象3.4.3类成员1.字段(域)可以把字段理解为类级别的变量、常量,用以存储该类的实例的相关数据。例如:publicclassDate{privateint_year;privateint_monthprivateint_day;}返回上一页下一页3.4类和对象大多数情况下字段的访问修饰符均为private,如果修饰符为public,那么在类之外都可以访问该字段,但不建议这样做,应该通过属性或方法来访问类中的数据。2.属性属性将类中的数据暴露给类外。例如:publicclassDate{privateint_year;返回上一页下一页3.4类和对象返回privateint_month;privateint_day;publicintYear;{Get{Return_year;}Set{_year=value;}}上一页下一页3.4类和对象返回publicintMonth;{Get{Return_month;}Set{_month=value;}}上一页下一页3.4类和对象返回publicintDay;{Get{Return_day;}}}上一页下一页3.4类和对象此处给Date类定义了三个属性,分别为Year,Month,Day。get中使用关键词return,set中使用关键词value。Year也是可读可写属性。Month也是可读可写属性,但其写权限只限于类内部。Day是只读属性。返回上一页下一页3.4类和对象
Datedate=newDate();date._year=2008;//错误,year为privatedate.Yonth=2008;//正确
date.Day=3;//错误,Day属性不可写说明,上述这样设计一个日期类属性的读写可能是不合理的,此处这样做只是为了解释属性的具体用法。[例3-16]返回上一页下一页3.4类和对象返回上一页下一页3.4类和对象_pageSize=20;}Else{_pageSize=value;}}}返回上一页下一页3.4类和对象这是一个分页类中的页大小属性,表示一页显示多少条记录。可以看到,在设置PageSize属性值时,如果值小于等于0,则会以默认值20代替。3.方法“方法”是包含一系列语句的代码块,方法可以有返回值,如果没有返回值,则应该在方法名称前冠以void表示无返回值。
4.事件在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。[例3-1]返回上一页下一页3.4类和对象//程序清单P3_17publicpartialclassForml:Form{publicForm1(){InitializeComponent();}privatevoidFormlLoad(objectsender,EventArgse){}返回上一页下一页3.4类和对象返回privatevoidbuttonl_Click(objectsender,EventArgse){Carcar=newCar();car.OnOilWarning+=newOilEventHandler(OilWarning);//关联事件car.FillOil(5);car.Startup();}publicvoidOilWarninq(objectsender,OilEventArqse){上一页下一页3.4类和对象返回MessaqeBox.Show(“监测到了汽车油量异常,当前油量为:”+e.OilMass);}}上一页下一页3.4类和对象返回//事件代理,可以理解为这个事件要传送什么内容//事件参数此时使用自己写的oilEventArgspublicdelegatevoidOilEventHandler(objectsender,OilEventArgse);//事件参数上一页下一页3.4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 豫浙中小企业融资的区域差异与协同发展路径研究
- 谷胱甘肽赋能乳酸菌:胁迫抗性调控机制的深度解析
- 谢启昆论诗诗:诗学批评的独特视角与价值
- 调制磁场策略:提升ECM效率的理论、实践与展望
- 2026咸阳彩虹学校教师招聘笔试备考试题及答案详解
- 2026上海电视台《17》招募暑期实习生笔试模拟试题及答案详解
- 语言生态学视域下藏区小学汉语教学成功模式构建研究
- 语境赋能:高中英语语法教学的创新与突破
- 2026年广西(北海市)高校毕业生“三支一扶”计划招募92人笔试备考题库及答案详解
- 语义信息模型驱动应急预案数字化转型:理论、实践与展望
- 酒店全员安全生产责任制度范本
- 皮质醇增多症患者的麻醉管理
- 沧州交通学院《智能制造专业英语》2023-2024学年第二学期期末试卷
- 工程防洪度汛管理制度
- 2025中国建设银行的贷款合同范本
- 项目经理讲安全课件
- 2024年山东高中学业水平合格考试化学试卷真题(含答案详解)
- 酒店妆容培训
- T-CSBT 012-2024 全血及成分血外观检查和处置指南
- 2025年中医养生茶饮课件
- 第一章体育与健康基础知识 第一节 科学发展体能 课件 2024-2025学年人教版初中体育与健康八年级全一册
评论
0/150
提交评论