《第02章C数据类型》由会员分享,可在线阅读,更多相关《第02章C数据类型(76页珍藏版)》请在金锄头文库上搜索。
1、1第二章第二章 数据类型与流程控制2.1 2.1 C#C#语言概述语言概述 2.2 2.2 C#C#数据类型数据类型 2.3 2.3 C#C#流程控制语句流程控制语句 22.1 C#2.1 C#语言概述语言概述 u在在C+和和Java的基础上设计的。的基础上设计的。u完全面向对象。完全面向对象。32.1.1C#语言特点语言特点语法简洁语法简洁C#和和Java一样,使用统一操作符,淘汰了一样,使用统一操作符,淘汰了c+的伪关键字的伪关键字精心的面向对象设计精心的面向对象设计只允许单继承;无全局函数,全局变量和全局常数等概念,代码可读性更好,减少命名只允许单继承;无全局函数,全局变量和全局常数等概
2、念,代码可读性更好,减少命名冲突冲突与与Web结合紧密结合紧密c#构建的组件能够方便的为构建的组件能够方便的为web服务,并可以通过服务,并可以通过internet被运行在任何操作系统的任何被运行在任何操作系统的任何语言调用。语言调用。4完全的安全性和错误处理完全的安全性和错误处理提供了类型安全的内在的完整安全性能。提供了类型安全的内在的完整安全性能。从从internet和和intranet下载的代码不允许访问本地文件和资源;不允许使用未初始化变量,下载的代码不允许访问本地文件和资源;不允许使用未初始化变量,提供边界检查与溢出检查;使用内存的垃圾回收机制。提供边界检查与溢出检查;使用内存的垃圾
3、回收机制。版本处理技术版本处理技术内置版本控制功能内置版本控制功能灵活性和兼容性灵活性和兼容性在托管状态不能使用指针,但用委托(在托管状态不能使用指针,但用委托(Delegate)模拟指针功能。)模拟指针功能。52.1.2C#与其他语言比较与其他语言比较与与c+比较比较编译目标编译目标C+为本地可执行代码;为本地可执行代码;C#为中间语言为中间语言(IL)内存管理内存管理C+显示删除;显示删除;C#回收机制回收机制指针指针C+大量使用;大量使用;C#一般不使用一般不使用字符串处理字符串处理C+作为类处理;作为类处理;C#作为基本数据类型作为基本数据类型继承机制继承机制C+多继承;多继承;C#单
4、继承单继承6与与java比较比较项目项目C#Java运行环境CLRJVM面向对象是是多重继承否否内存管理使用垃圾回收机制使用垃圾回收机制异常处理Try-catch-finallyTry-catch-finally指针非管理代码中使用不支持类型安全性验证强制类型验证强制类型验证命名空间支持支持布尔值true or falsetrue or false变量初始化不能使用为初始化变量默认初始化中间语言处理将MSIL转换为JIT机器码Java字节码访问修饰Public ,protected, private, internal ,partial Public,protected,private72.2
5、 C#2.2 C#数据类型数据类型u分为两类:值类型和引用类型。分为两类:值类型和引用类型。值类型:值类型:包括基本类型、枚举类型、结构类型。包括基本类型、枚举类型、结构类型。引用类型:引用类型:包括类、接口、数组、委托。包括类、接口、数组、委托。8Using Sysem;namespace TyeExample /引用类型 class REfTypeRectangle public int Width; public int Height; /值类型 struct ValTypeRetangle public int Width; public int Height; class progr
6、am public static void Main() /定义rect1为引用类型变量 RefTypeRectangle rect1=new RefTypeRectangle(); rect1.Width=10; rect1.Height=15; /定义rect2为引用类型变量,并与rect1指向相同对象 RefTypeRectangle rect2=rect1; /输出rect2 Console.WriteLine(“Dimensions of rect2 are”+rect2.width+”x”+rect2.Height); Console.WriteLine(“changing dim
7、ensions of rect1”); /通过rect1更改对象值 rect1.width=20; rect1.Height=25; Console.WriteLine(“Dimensions of rect2 now are”+rect2.width+”x”+rect2.Height); /定义rect3为值类型变量ValTypeREtangle rect3=new ValTypeRetangle(); rect3.Width=10; rect3.Height=15/定义rect4为值类型变量,并用rect3为其赋值ValTypeREtangle rect4=rect3;/输出rect4值C
8、onsole.WriteLine(“Dimensions of rect4 are”+rect4.width+”x”+rect4.Height);Console.WriteLine(“changing dimensions of rect3”); /更改rect3值,由于rect3与rect4分别保存自己的值,rect4的值不受影响。 rect3.width=20; rect3.Height=25;Console.WriteLine(“Dimensions of rect4 now are”+rect2.width+”x”+rect4.Height);Console.ReadLine(); 9
9、值类型和引用类型的区别值类型和引用类型的区别特性特性值类型值类型引用类型引用类型变变量中保存的内容量中保存的内容实际实际数据数据指向指向实际实际数据的引用指数据的引用指针针内存空内存空间间配置配置堆堆栈栈(Stack)受管制的堆(受管制的堆(ManagedHeap)内存需求内存需求较较少少较较多多执执行效率行效率较较快快较较慢慢内存内存释释放放时间时间点点执执行超行超过过定定义变义变量量的作用域的作用域时时由垃圾回收机制由垃圾回收机制负责负责回收回收可以可以为为null不可以不可以可以可以102.2.1 2.2.1 值类型值类型u值类型包括整型、浮点型、小数型、布尔值类型包括整型、浮点型、小数
10、型、布尔型、字符型、结构型、枚举型。型、字符型、结构型、枚举型。声明一个值类型的语法形式为:声明一个值类型的语法形式为: = n;例如:例如:inta=100;/声明一个整型变量声明一个整型变量a,并赋初值为,并赋初值为100;注意注意,C#不允许使用未初始化的变量。不允许使用未初始化的变量。111.1.整型整型uC#提供了九种整型:提供了九种整型:sbyte:1字节有符号字节有符号byte:1字节无符号字节无符号short:2字节有符号字节有符号ushort:2字节无符号字节无符号int:4字节有符号,最常用字节有符号,最常用uint:4字节无符号字节无符号long:8字节有符号字节有符号u
11、long:8字节无符号字节无符号char:2字节,单个字节,单个Unicode字符编码,例如:字符编码,例如:112注意:注意:声明变量,均可采用十进制或十六进制声明变量,均可采用十进制或十六进制longx=0x23ab;可以指定类型可以指定类型longx=1234L默认为默认为int132.2.浮点类型浮点类型floatfloat:4 4字节浮点数,常用。例如:字节浮点数,常用。例如:35.0f35.0fdoubledouble:8 8字节浮点数,常用。例如:字节浮点数,常用。例如:2.7E+232.7E+23143.3.小数型小数型u即即decimal类型,共类型,共128个二进制位,个二
12、进制位,具有具有28至至29位十进制有效数字。适用于位十进制有效数字。适用于金融、货币等需要高精度数值的领域。金融、货币等需要高精度数值的领域。154.4.布尔型布尔型u用用bool表示,表示,bool类型只有两个值类型只有两个值true和和false。例如:例如:boolisExist=false;boolb=(i0&i); Console.Write(数组的列数为:); Console.Write(arr2.GetUpperBound(arr2.Rank - 1) + 1); Console.Write(n); for (int i = 0; i arr2.Rank; i+) string
13、 s = ; for (int j = 0; j ); /多维数组 /声明一个三维数组 int, , arr3; /初始化该三维数组 arr3 = new int, 1, 2, 3 , 4, 5, 6 ; /使用foreach语句遍历数组并输出 foreach (int i in arr3) Console.WriteLine(i); 32 动态数组的声明及初始化using System;using System.Collections.Generic;using System.Text;namespace dynaticArray class Program static void Main
14、(string args) /一维数组 int arr = new int5; Console.WriteLine(请输入一组数:); for (int i = 0; i arr.GetUpperBound(0) + 1; i+) arri = Convert.ToInt32(Console.ReadLine(); Console.WriteLine(显示输入后的数组:); foreach (int n in arr) Console.Write(0, n + ,); Console.WriteLine(); /二维数组 Console.Write(请输入定义数组的行数:); int row
15、= Convert.ToInt32(Console.ReadLine(); Console.Write(请输入定义数组的列数:); int col = Convert.ToInt32(Console.ReadLine(); int, arr2 = new introw, col; Console.WriteLine(结果:); for (int i = 0; i row; i+) for (int j = 0; j = j) Console.Write(*); else Console.Write(); Console.WriteLine(); 33例例. .使用使用SortSort和和Rev
16、erseReverse方法对数组排序方法对数组排序usingSystem;namespaceArrayExample1classProgramstaticvoidMain()/声明一维数组声明一维数组Artists,并赋初始值;,并赋初始值;stringArtists=Leonardo,Monet,VanGogh,Klee;/将数组将数组Artists做升序排列,并输出其结果;做升序排列,并输出其结果;Array.Sort(Artists);for(inti=0;iArtists.Length;i+)Console.WriteLine(Artistsi);34/将数组将数组Artists做降序
17、排列,并输出其结果;做降序排列,并输出其结果;Array.Reverse(Artists);for(inti=0;iArtists.Length;i+)Console.WriteLine(Artistsi);Console.ReadLine();352.2.3 2.2.3 值类型之间的数据转换值类型之间的数据转换u有两种转换方式:有两种转换方式:隐式转换与显式转换;隐式转换与显式转换;u如果是不同值类型之间的转换,可以如果是不同值类型之间的转换,可以使用使用Convert类。类。362.2.3 2.2.3 值类型之间的数据转换值类型之间的数据转换( (续续) )u隐式转换隐式转换 从低精度、小
18、范围的数据类型转换从低精度、小范围的数据类型转换为高精度、大范围的数据类型,可以用为高精度、大范围的数据类型,可以用隐式转换。隐式转换。 例如:例如: int k = 1;int k = 1; long i = 2; long i = 2; i = k; / i = k; /隐式转换隐式转换372.2.3 2.2.3 值类型之间的数据转换值类型之间的数据转换( (续续) )u显式转换显式转换如:如:longk=5000;inti=(int)k所有的隐式转换也都可以采用显式转换的形式来所有的隐式转换也都可以采用显式转换的形式来表示。如:表示。如:inti=10;longj=(long)i;将大范
19、围类型的数据转换为小范围类型的数据的将大范围类型的数据转换为小范围类型的数据的时候,必须特别谨慎,因为此时有丢失数据的危险。时候,必须特别谨慎,因为此时有丢失数据的危险。382.2.4 2.2.4 装箱与拆箱装箱与拆箱u在在.net中的通用类型系统中的通用类型系统(CommonTypesystem,CTS)中,所有类型都是对象(中,所有类型都是对象(object),都派生都派生自自System.Object。CTS支持两组类型:值类型和引用支持两组类型:值类型和引用类型。如果变量是值类型那么这个变量就包含实际的类型。如果变量是值类型那么这个变量就包含实际的数据。也就是在内存中确实会分配那么一部
20、分空间给数据。也就是在内存中确实会分配那么一部分空间给这个变量并存储值,引用类型就类似一个类型安全的这个变量并存储值,引用类型就类似一个类型安全的指针,本身并没有开辟内存空间去存储东西。指针,本身并没有开辟内存空间去存储东西。uObject类:所有其他类:所有其他类的基类类的基类39u装箱:将值类型转换为装箱:将值类型转换为object类型类型 int i = 13; object ob = i; u拆箱:将拆箱:将object类型转换为值类型类型转换为值类型 int i = 13; object ob = i; int j = (int)ob; 402.2.5 2.2.5 运算符与优先级运算
21、符与优先级初级运算符初级运算符().x+xnewtypeofsizeofcheckedunchecked一元运算符一元运算符+!+xx和数据类型转换和数据类型转换乘乘/除运算符除运算符*/%加加/减运算符减运算符+移位运算符移位运算符关系运算符关系运算符=isas比较运算符比较运算符=!=按位按位AND运算符运算符&按位按位XOR运算符运算符|按位按位OR运算符运算符布尔布尔AND运算符运算符&布尔布尔OR运算符运算符|三元运算符三元运算符?:赋值运算符赋值运算符=+=*=/=%=&=|=412.3 C#2.3 C#流程控制语句流程控制语句1.顺序执行顺序执行2.分支分支3.循环循环4.异常捕
22、获异常捕获如果一个逻辑块包含两条或两条以如果一个逻辑块包含两条或两条以上的语句序列,必须使用大括号上的语句序列,必须使用大括号将语句将语句括起来。括起来。422.3.1 2.3.1 条件分支语句条件分支语句 uif语语句句:它它的的功功能能是是根根据据布布尔尔表表达达式式的的值值(true或或者者false)选选择择要要执执行行的的语语句句序序列列,使使用时要注意用时要注意else应和最近的应和最近的if语句匹配。语句匹配。43u常见形式有:常见形式有:1)单独使用单独使用if语句,不加语句,不加else语句语句if(布尔表达式布尔表达式)布尔表达式为真时执行的语句序列布尔表达式为真时执行的语
23、句序列2)if语句和语句和else语句配套使用的单条件测试语句配套使用的单条件测试if(布尔表达式布尔表达式)布尔表达式为真时执行的语句序列布尔表达式为真时执行的语句序列else布尔表达式为假时执行的语句序列布尔表达式为假时执行的语句序列442.3.1 2.3.1 条件分支语句条件分支语句( (续续) )3)else块中嵌套块中嵌套if语句的多条件测试语句的多条件测试if ( if ( 布尔表达式布尔表达式1 )1 ) 布尔表达式布尔表达式1 1为真时执行的语句序列为真时执行的语句序列 else if ( else if ( 布尔表达式布尔表达式2) 2) 布尔表达式布尔表达式2 2为真时执行
24、的语句序列为真时执行的语句序列 else if ( else if ( 布尔表达式布尔表达式3)3) 布尔表达式布尔表达式3 3为真时执行的语句序列为真时执行的语句序列 elseelse 所有条件均为假时执行的语句序列所有条件均为假时执行的语句序列 注意,注意,elseelse和和ifif之间有一个空格。之间有一个空格。45设有一个数学函数的表达式为:设有一个数学函数的表达式为:if(x0) y=1;else if(x=0) y=0; esle y=-1; 462.3.1 2.3.1 条件分支语句条件分支语句( (续续) )uswitch语句也叫语句也叫case语句语句uswitch语句与语句
25、与C+和和Java均不完全相同。均不完全相同。switch语句常用形式为:语句常用形式为:switch (表达式) case 常量表达式1: 语句序列1 case 常量表达式2: 语句序列2 default: 语句序列472.3.1 2.3.1 条件分支语句条件分支语句( (续续) )u常量表达式常量表达式switch条条件件表表达达式式的的值值和和每每个个case后后的的常常量量表表达达式式可可以以是是string、int、char、enum或或其其它它值值类类型。型。u语句序列语句序列每每个个case后后的的语语句句序序列列可可以以用用大大括括号号括括起起来来,也也可可以以不不用用,但但是
26、是每每个个case块块的的最最后后一一句句一一定定要要是是break语句,或者是语句,或者是goto语句。语句。48uswitch语句的执行顺序语句的执行顺序a)如如果果switch语语句句的的条条件件表表达达式式的的值值和和某某一一个个case标标记记后后指指定定的的值值相相等等,则则转转到到该该case标记后的语句序列执行;标记后的语句序列执行;b)若若switch语语句句的的条条件件表表达达式式的的值值和和任任何何一一个个case标标记记后后指指定定的的值值都都不不相相等等,则则跳跳到到default标记后的语句序列执行;标记后的语句序列执行;c)若若switch语语句句下下面面没没有有
27、default标标记记,则则跳到跳到switch语句的结尾。语句的结尾。492.3.1 2.3.1 条件分支语句条件分支语句( (续续) )注意:注意:a)当当找找到到符符合合条条件件表表达达式式值值的的case标标记记时时,如如果果其其后后有有语语句句序序列列,则则它它只只会会执执行行此此case块块中中的的语语句句序序列列,不不会会再再对对其其它它的的case标标记记进进行行判判断断,所所以以才才要要求求每每个个语语句句序序列列的的最最后后一一条条语语句句必必须须是是break语语句句,但但是是有有一一个个情情况况例例外外:如如果果某某个个case块块为为空空,则则会会从从这这个个case
28、块块直直接接跳到下一个跳到下一个case块上。块上。b)如如果果case后后有有语语句句,则则此此case的的顺顺序序怎怎么么放放都都无无所所谓谓,甚甚至至可可以以将将default子子句句放放到到最最上上面面。因因此此,在在一一个个switch中中,不不能能有有相相同同的的两个两个case标记标记。50例例. .使用使用switchswitch语句,完成对成绩等级的评定语句,完成对成绩等级的评定usingSystem;namespaceSwitchExamplepublicclassProgrampublicstaticvoidMain()Console.Write(请输入成绩:请输入成绩:
29、);/从键盘接收一行字符从键盘接收一行字符stringstr=Console.ReadLine();/转换为整型转换为整型inti=Int32.Parse(str.Trim();/i=Convert.ToInt32(str)if(i100|i0)Console.WriteLine(成绩不在成绩不在0-100范围内范围内);51elseswitch(i/10)case10:Console.Write(满分,满分,);gotocase9;case9:Console.WriteLine(优秀优秀);break;case8:case7:Console.WriteLine(良好良好);break;cas
30、e6:Console.WriteLine(及格及格);break;default:Console.WriteLine(不及格不及格);break;Console.ReadLine();52用用switch语句来显示一个月的天数(忽略跨年度)语句来显示一个月的天数(忽略跨年度)1:usingSystem;2:3:classFallThrough4:5:publicstaticvoidMain(stringargs)6:7:if(args.Length!=1)return;8:9:intnMonth=Int32.Parse(args0);10:if(nMonth12)return;11:intnD
31、ays=0;12:13:switch(nMonth)14:15:case2:nDays=28;break;16:case4:17:case6:18:case9:19:case11:nDays=30;break;20:default:nDays=31;21:22:Console.WriteLine(0daysinthismonth,nDays);23:24:532.3.2 2.3.2 循环语句循环语句u包括:包括:for语句,与语句,与Java相同相同while语句,与语句,与Java相同相同do-while语句,与语句,与Java相同相同foreach语句,用于对集合进行操作。语句,用于对集合
32、进行操作。542.3.2 2.3.2 循环语句(续)循环语句(续)For语句语句一般形式为:一般形式为:for(初始值初始值;循环条件循环条件;循环控制循环控制)语句序列语句序列55在在Main方法中加入如下代码:方法中加入如下代码:publicstaticvoidMain()Console.Clear();Console.BackgroundColor=ConsoleColor.Blue;Console.ForegroundColor=ConsoleColor.Red;Console.Beep();for(inti=1;i10;i+=2)Console.SetCursorPosition(4
33、0-i/2,i);for(intj=0;ji;j+)Console.Write(*);Console.WriteLine();Console.ReadLine();例例. .使用使用forfor语句控制循环体语句控制循环体562.3.2 2.3.2 循环语句(续)循环语句(续)While语句语句一般形式为:一般形式为:while(条件条件)语句序列语句序列显显然然,循循环环体体内内的的程程序序可可能能会会执执行行多多次次,也可能一次也不执行。也可能一次也不执行。57表达式必须是一个布尔表达式。表达式必须是一个布尔表达式。布尔表达式必须放在圆括号内。布尔表达式必须放在圆括号内。假如首次求值时,布
34、尔表达式为假如首次求值时,布尔表达式为false,语句,语句不会运行。不会运行。假如想要在一个假如想要在一个while的控制下执行两个或者的控制下执行两个或者更多的语句,必须使用大括号将语句分组到更多的语句,必须使用大括号将语句分组到一个块中。一个块中。58用用while语句求语句求100以内所有的素数?以内所有的素数? / check prime / / / public static bool isPrime(int a) int i=2; while ( i a) if (Math.IEEERemainder(float)a, (float)i) = 0) /是否能被i整除 return
35、 false; i+;return true; u/ / get all prime / / / / public static List getPrime(int min, int max) if (min 1) throw new Exception(min must greater than 1); int i; for (i = min; i = max; i+) if (isPrime(i) _prime.add(i); return _prime; / / print all prime / public static void printPrime() _prime.print(
36、); 592.3.2 2.3.2 循环语句(续)循环语句(续)do-while一般形式为:一般形式为:do语句序列语句序列while(条件条件);与与while语句不同的是,语句不同的是,do-while语句循语句循环体内的程序至少会执行一次,然后再判断环体内的程序至少会执行一次,然后再判断条件是否为条件是否为true,如果条件为,如果条件为true,则继续,则继续循环。循环。60如何使用如何使用do-while循环来实现求整数的阶乘。循环来实现求整数的阶乘。longy=1;doy*=x;x-;while(x0)61在在do循环中计算平均值循环中计算平均值1:usingSystem;2:3:c
37、lassComputeAverageApp4:5:publicstaticvoidMain()6:7:ComputeAverageApptheApp=newComputeAverageApp();8:theApp.Run();9:10:11:publicvoidRun()12:13:doubledValue=0;14:doubledSum=0;15:intnNoOfValues=0;16:charchContinue=y;17:stringstrInput;18:19:do20:21:Console.Write(Enteravalue:);22:strInput=Console.ReadLin
38、e();23:dValue=Double.Parse(strInput);24:dSum+=dValue;25:nNoOfValues+;26:Console.Write(Readanothervalue?);27:28:strInput=Console.ReadLine();29:chContinue=Char.FromString(strInput);30:31:while(y=chContinue);32:33:Console.WriteLine(Theaverageis0,dSum/nNoOfValues);34:35:在静态在静态Main函数中实例化函数中实例化ComputeAver
39、ageApp类型的一个对象。它同样类型的一个对象。它同样接着调用实例的接着调用实例的Run方法,方法,该方法包含了计算平均值所有必要的功能。该方法包含了计算平均值所有必要的功能。do循环跨越第循环跨越第1931行。条件是这样设定的:分别回答各个问题行。条件是这样设定的:分别回答各个问题“y”,以决定是否要增加另一个值。输入任何其它以决定是否要增加另一个值。输入任何其它字符会引起程序退出字符会引起程序退出do语块,且平均值被计算。语块,且平均值被计算。62uforeach语句语句foreach语句用于逐个提取集合中的元素,并语句用于逐个提取集合中的元素,并对集合中每个元素执行语句序列中操作的场合
40、。对集合中每个元素执行语句序列中操作的场合。foreach语句特别适合对集合(语句特别适合对集合(Collection)对象的)对象的存取。其一般形式为:存取。其一般形式为:foreach(类型类型标识符标识符in表达式表达式)语句序列语句序列2.3.2 2.3.2 循环语句循环语句( (续续) )63例例. .使用使用foreachforeach语句提取语句提取HashtableHashtable对象的每个元素对象的每个元素usingSystem;usingSystem.Collections;namespaceForeachExampleclassProgrampublicstaticvo
41、idMain()/声明一个声明一个Hashtable集合集合hs,/并使用并使用Hashtable.Add方法为其添加带有指定键和值的元素方法为其添加带有指定键和值的元素Hashtablehs=newHashtable();hs.Add(001,str1);hs.Add(002,str2);hs.Add(003,str3);64/循环显示循环显示hs集合的每个元素;集合的每个元素;Console.WriteLine(codestring);foreach(stringsinhs.Keys)Console.WriteLine(s+hss);Console.ReadLine();65程序读所有的环
42、境变量程序读所有的环境变量1:usingSystem;2:usingSystem.Collections;3:4:classEnvironmentDumpApp5:6:publicstaticvoidMain()7:8:IDictionaryenvvars=Environment.GetEnvironmentVariables();9:Console.WriteLine(Thereare0environmentvariablesdeclared,envvars.Keys.Count);10:foreach(StringstrKeyinenvvars.Keys)11:12:Console.Wri
43、teLine(0=1,strKey,envvarsstrKey.ToString();13:14:15:对对GetEnvironmentVariables的调用返回一个的调用返回一个IDictionary类型接口,它是类型接口,它是由由.NET框架中的许多类实现了的字典接口。框架中的许多类实现了的字典接口。通过通过IDictionary接口,可以访问两个收集:接口,可以访问两个收集:Keys和和Values。在这个例在这个例子里,我在子里,我在foreach语句中使用语句中使用Keys,接着查接着查找基于当前找基于当前key值的值(第值的值(第12行)。行)。当使用当使用foreach时,只要
44、注意一个问题:当确定循环变量的类型时,应该时,只要注意一个问题:当确定循环变量的类型时,应该格外小心。选择错误的类型并没有受到编译格外小心。选择错误的类型并没有受到编译器的检测,但它会在运行时器的检测,但它会在运行时受检测,且会引发一个异常。受检测,且会引发一个异常。66课堂练习课堂练习使用使用foreach语句和语句和Hashtable类,编写一个类,编写一个程序,先将一个班的同学的姓名和成绩输入程序,先将一个班的同学的姓名和成绩输入存放到一个存放到一个Hashtable中,然后计算全班平均中,然后计算全班平均成绩,打印输出;并将最高分数的个人的姓成绩,打印输出;并将最高分数的个人的姓名和分
45、数输出。名和分数输出。ForeachExample-2.cs672.3.3 2.3.3 跳转语句跳转语句u1.break语句语句功能:功能:退出最近的封闭退出最近的封闭switch、while、do-while、for或或foreach语句。语句。格式:格式:break;68【例例】循环接收和输出键盘输入的每一行的值,当接收的内容为空字符循环接收和输出键盘输入的每一行的值,当接收的内容为空字符串时退出。串时退出。usingSystem;namespaceBreakExamplepublicclassProgrampublicstaticvoidMain()for(;)Console.Write
46、(请输入一个字符串(直接回车退出)请输入一个字符串(直接回车退出):);strings=Console.ReadLine();if(s=)break;Console.WriteLine(你输入的是你输入的是:0.,s);Console.ReadLine();69u2.continue语句语句功能:功能:将控制传递给下一个将控制传递给下一个while、do-while、for或或foreach,继续执行下一次循,继续执行下一次循环。环。格式:格式:continue;2.3.3 2.3.3 跳转语句跳转语句 ( (续续) )70u3.goto语句语句一般不用。一般不用。2.3.3 2.3.3 跳转
47、语句跳转语句 ( (续续) )71u4.return语句语句功能:功能:将控制返回到出现将控制返回到出现return语句的函语句的函数成员的调用方。数成员的调用方。格式:格式:return表达式表达式;其中表达式为可选项,如果该函数成员其中表达式为可选项,如果该函数成员的返回类型不为的返回类型不为null,则,则return语句必须使语句必须使用表达式返回这个类型的值,否则用表达式返回这个类型的值,否则return语语句不能使用表达式。句不能使用表达式。2.3.3 2.3.3 跳转语句跳转语句 ( (续续) )722.3.5 2.3.5 异常处理异常处理u1.try-catch语句语句try语
48、句序列语句序列catch(异常类型(异常类型标识符)标识符)异常处理异常处理在程序运行正常的时候,执行在程序运行正常的时候,执行try块内的程块内的程序。如果序。如果try块中出现了异常,程序就转移到块中出现了异常,程序就转移到catch块中执行块中执行。73u2.try-catch-finally语句语句try语句序列语句序列catch(异常类型(异常类型标识符)标识符)异常处理异常处理finally语句序列语句序列2.3.5 2.3.5 异常处理异常处理 ( (续续) )74u3.throw语句语句格式:格式:throw表达式表达式;抛出表达式的值。抛出表达式的值。注意表达式类型必须是注意
49、表达式类型必须是System.Exception或从或从System.Exception派生的类的类型。派生的类的类型。throw也可以不带表达式,不带表达式的也可以不带表达式,不带表达式的throw语句只能用在语句只能用在catch块中,在这种情况下,块中,在这种情况下,它重新抛出当前正在由它重新抛出当前正在由catch块处理的异常。块处理的异常。2.3.5 2.3.5 异常处理异常处理 ( (续续) )75例例. .异常处理异常处理usingSystem;namespaceTryCatchExampleclassProgramstaticvoidF()tryG();catch(Exceptionerr)Console.WriteLine(方法方法F中捕获到中捕获到:+err.Message);76/重新抛出当前正在由重新抛出当前正在由catch块处理的异常块处理的异常errthrow;staticvoidG()thrownewException(方法方法G中抛出的异常。中抛出的异常。);staticvoidMain()tryF();catch(Exceptionerr)Console.WriteLine(方法方法Main中捕获到中捕获到:+err.Message);Console.ReadLine();