《第02章C#数据类型.ppt》由会员分享,可在线阅读,更多相关《第02章C#数据类型.ppt(76页珍藏版)》请在三一文库上搜索。
1、第二章 数据类型与流程控制,2.1 C#语言概述 2.2 C#数据类型 2.3 C#流程控制语句,2.1 C#语言概述,在C+和Java的基础上设计的。 完全面向对象。,2.1.1 C#语言特点,语法简洁 C#和Java一样,使用统一操作符,淘汰了c+的伪关键字 精心的面向对象设计 只允许单继承;无全局函数,全局变量和全局常数等概念,代码可读性更好,减少命名冲突 与Web结合紧密 c#构建的组件能够方便的为web服务,并可以通过internet被运行在任何操作系统的任何语言调用。,完全的安全性和错误处理 提供了类型安全的内在的完整安全性能。 从internet和intranet下载的代码不允许
2、访问本地文件和资源;不允许使用未初始化变量,提供边界检查与溢出检查;使用内存的垃圾回收机制。 版本处理技术 内置版本控制功能 灵活性和兼容性 在托管状态不能使用指针,但用委托(Delegate)模拟指针功能。,2.1.2 C#与其他语言比较,与c+比较 编译目标 C+为本地可执行代码;C#为中间语言(IL) 内存管理 C+显示删除;C#回收机制 指针 C+大量使用;C#一般不使用 字符串处理 C+作为类处理;C#作为基本数据类型 继承机制 C+多继承;C#单继承,与java比较,2.2 C#数据类型,分为两类:值类型和引用类型。 值类型: 包括基本类型、枚举类型、结构类型。 引用类型: 包括类
3、、接口、数组、委托。,Using Sysem; namespace TyeExample /引用类型 class REfTypeRectangle public int Width; public int Height; /值类型 struct ValTypeRetangle public int Width; public int Height; class program public static void Main() /定义rect1为引用类型变量 RefTypeRectangle rect1=new RefTypeRectangle(); rect1.Width=10; rect1
4、.Height=15; /定义rect2为引用类型变量,并与rect1指向相同对象 RefTypeRectangle rect2=rect1; /输出rect2 Console.WriteLine(“Dimensions of rect2 are”+rect2.width+”x”+rect2.Height); Console.WriteLine(“changing dimensions of rect1”); /通过rect1更改对象值 rect1.width=20; rect1.Height=25; Console.WriteLine(“Dimensions of rect2 now are
5、”+rect2.width+”x”+rect2.Height); ,/定义rect3为值类型变量 ValTypeREtangle rect3=new ValTypeRetangle(); rect3.Width=10; rect3.Height=15 /定义rect4为值类型变量,并用rect3为其赋值 ValTypeREtangle rect4=rect3; /输出rect4值 Console.WriteLine(“Dimensions of rect4 are”+rect4.width+”x”+rect4.Height); Console.WriteLine(“changing dimen
6、sions 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(); ,值类型和引用类型的区别,2.2.1 值类型,值类型包括整型、浮点型、小数型、布尔型、字符型、结构型、枚举型。 声明一个值类型的语法形式为: = n; 例如: int a = 100; /声明一个整型变量a,并
7、赋初值为100; 注意,C#不允许使用未初始化的变量。,1.整型,C#提供了九种整型: sbyte:1字节有符号 byte: 1字节无符号 short: 2字节有符号 ushort: 2字节无符号 int: 4字节有符号,最常用 uint: 4字节无符号 long: 8字节有符号 ulong:8 字节无符号 char:2字节,单个Unicode字符编码,例如:1,注意: 声明变量,均可采用十进制或十六进制 long x=0x23ab; 可以指定类型 long x= 1234L 默认为int,2.浮点类型,float:4字节浮点数,常用。例如:35.0f double:8字节浮点数,常用。例如:
8、2.7E+23,3.小数型,即decimal类型,共128个二进制位,具有28至29位十进制有效数字。适用于金融、货币等需要高精度数值的领域。,4.布尔型,用bool表示,bool类型只有两个值true和false。 例如: bool isExist = false; bool b = (i0 /错误,5.字符型,char型,为单个Unicode字符,字符型常量必须用单引号引起来 。 char mychar1=A; 如果是字符串是单个字符的组合,对应的类型为string。string类型的常量用双引号将字符串引起来。 String myString1=“ABCD”; char和string类型
9、的常量均可以使用转义符。 char mychar2=x0041/字母“A”十六进制表示 char mychar3=u0041 /字母“A”Unicode表示,6.结构型,结构(Struct)是复合值类型(数据保存在堆栈上),而类是引用(数据保存在堆上) 对性能特别关注的情况下,可以考虑使用结构。 凡是使用结构实现的功能,均可以用类实现。 声明struct类型的语法形式为: 附加声明 访问修饰符 struct 结构名称: 实现的接口 结构体;,using System; namespace StrucExample public struct Point public int x; public
10、 int y; public String s; public struct Point1 public static int x; public static int y; public static String s; class Program public static void Main() Point p; p.x=3; p.y=4; p.s=“ok”; Console.WriteLine(“The result is 0,1,2”,p.x,p.y,p.s); /对于结构中的静态变量,直接使用结构名,变量名 Point1.x=1; Point1.y=2;Point1.s=“good
11、”; Console.WriteLine(“The result is 0,1,2”,Point1.x,Point1.y,Point1.s); ,7.枚举型,枚举(enum)是一组命名常量的集合,称为枚举成员列表。它可以为一组在逻辑上密不可分的整数值提供便于记忆的符号,从而使代码更清晰,也易于维护。 声明enum类型变量的语法为: 附加声明 访问修饰符 enum 名称:数据类型 枚举列表 每种枚举类型都有一种基本类型,long 、int、short、byte; 默认:int,enum days Sun,Mon,Tue,Wed,Thu,Fri,Sat; / Sun:0,Mon:1,Tue:2 e
12、num days Mon=1,Tue,Wed,Thu,Fri,Sat,Sun; / Mon:1,Tue:2 enum days Mon=1,Wed=3,Sun,Thu=8; / Mon:1,Wed:3,Sun:4,Thu:8 Enum num:bytex1=255,x2,枚举类型应用: using System; using System.Collections.Generic; using System.Text; namespace Ex05_02 class Program enum dayslnWeek Sunday = 1, Monday = 2, Tuesday = 3, Wedn
13、esday = 4, Thursday = 5, Friday = 6, Saturday = 7, static void Main(string args) dayslnWeek m_day1 = dayslnWeek.Sunday; dayslnWeek m_day2 = dayslnWeek.Monday; dayslnWeek m_day3 = dayslnWeek.Tuesday;,dayslnWeek m_day4 = dayslnWeek.Wednesday; dayslnWeek m_day5 = dayslnWeek.Thursday; dayslnWeek m_day6
14、= dayslnWeek.Friday; dayslnWeek m_day7 = dayslnWeek.Saturday; Console.WriteLine(m_day1); Console.WriteLine(Convert.ToInt32(m_day1); Console.WriteLine(m_day2); Console.WriteLine(Convert.ToInt32(m_day2); Console.WriteLine(m_day3); Console.WriteLine(Convert.ToInt32(m_day3); Console.WriteLine(m_day4); C
15、onsole.WriteLine(Convert.ToInt32(m_day4); Console.WriteLine(m_day5); Console.WriteLine(Convert.ToInt32(m_day5); Console.WriteLine(m_day6); Console.WriteLine(Convert.ToInt32(m_day6); Console.WriteLine(m_day7); Console.WriteLine(Convert.ToInt32(m_day7); Console.ReadLine(); ,注意: 结构是由不同类型的数据组成的一组新的数据类型,
16、结构类型变量的值是由各个成员的值组合而成; 枚举类型不同,枚举类型的变量在某一时刻只能取其枚举的某一个元素值,不能同时使用多个。,2.2.2 引用类型,“引用”指该类型的变量并不直接存储所包含的实际数据,而是存储实际数据的地址。 C#中的引用类型有四种: 类、委托、接口和数组。,1.类,C#的类与Java的类非常相似。个别地方有区别。 类是面向对象编程的基本单位,是一种包含数据成员、函数成员和嵌套类型的数据结构。类的数据成员有常量、域和事件。函数成员包括方法、属性、索引指示器、运算器、构造函数和析构函数。类和结构同样都包含了自己的成员,但它们之间最主要的区别在于:类是引用类型,而结构是值类型。
17、 类支持继承机制,通过继承,派生类可以扩展基类的数据成员和函数方法,进而达到代码重用和设计重用的目的。,2.委托,指引用方法的类型,它实际上相当于C+中的函数指针原型,主要区别是: 委托在C#中是安全的,它允许实例化和调用类的静态方法,也可以调用类的指定实例的方法。在声明委托类型时,只需要指定委托指向的原型的类型,它不能有返回值,也不能带有输出类型的参数。,3.接口,接口是一组包含了方法的数据结构,只有声明部分,没有实现部分。 接口一旦声明,就不要再更改,否则就失去了接口的意义。 接口成员可以是方法,属性,索引指示器和事件,但不能是量,域,操作符和构造函数,也不能包含任何静态成员,4.数组,数
18、组用于存储同一种类型的数据。 数组是一种引用类型,而不是值类型。 数组是按照数组名、数据元素的类型和维数来描述的。 C#中可以有一维数组、多维数组、交错数组 交错数组的实际含义就是指数组的数组。例如: int jaggedArray3 = new int 1,3,5,7,9, new int 0,2,4,6, new int 11,22 ;,数组的声明语法举例,int integers; integers= new int30; int integers= new int30; String mystring=“first”,”second”,”third”; String mystring=
19、new string“first”,”second”,”third”;,数组的使用,访问数组中的元素时,其下标是从0开始索引的。 数组元素可以是任何类型,包括数组类型。 可以使用Length属性获取一维数组的长度, 如果是多维数组,则可以使用GetLength方法确定其某一特定维的长度。 由多种对数组操作的方法,例如Sort和Reverse,可以将数组按照升序或降序排列。,静态数组的声明和初始化 using System; using System.Collections.Generic; using System.Text; namespace staticArray class Progr
20、am static void Main(string args) /一维数组 int arr1 = 7, 34, 2, 15, 22, 37, 11 ; foreach (int n in arr1) Console.Write(“0“, n + “ “); Console.WriteLine(); Console.Write(“请输入数组的下标:“); int k; k = Convert.ToInt32(Console.ReadLine(); Console.WriteLine(arr1k);,/二维数组 int, arr2 = 1, 2, 3 , 4, 5, 6 ; Console.Wr
21、ite(“数组的行数为:“); Console.Write(arr2.Rank); Console.Write(“n“); Console.Write(“数组的列数为:“); Console.Write(arr2.GetUpperBound(arr2.Rank - 1) + 1); Console.Write(“n“); for (int i = 0; i “); /多维数组 /声明一个三维数组 int, , arr3; /初始化该三维数组 arr3 = new int, 1, 2, 3 , 4, 5, 6 ; /使用foreach语句遍历数组并输出 foreach (int i in arr
22、3) Console.WriteLine(i); , 动态数组的声明及初始化 using System; using System.Collections.Generic; using System.Text; namespace dynaticArray class Program static void Main(string args) /一维数组 int arr = new int5; Console.WriteLine(“请输入一组数:“); for (int i = 0; i arr.GetUpperBound(0) + 1; i+) arri = Convert.ToInt32(
23、Console.ReadLine(); Console.WriteLine(“显示输入后的数组:“); foreach (int n in arr) Console.Write(“0“, n + “,“); Console.WriteLine();,/二维数组 Console.Write(“请输入定义数组的行数:“); int row = Convert.ToInt32(Console.ReadLine(); Console.Write(“请输入定义数组的列数:“); int col = Convert.ToInt32(Console.ReadLine(); int, arr2 = new i
24、ntrow, col; Console.WriteLine(“结果:“); for (int i = 0; i = j) Console.Write(“*“); else Console.Write(“); Console.WriteLine(); ,例.使用Sort和Reverse方法对数组排序,using System; namespace ArrayExample1 class Program static void Main() /声明一维数组Artists,并赋初始值; string Artists = “Leonardo“, “Monet“, “Van Gogh“, “Klee“
25、; /将数组Artists做升序排列,并输出其结果; Array.Sort(Artists); for (int i = 0; i Artists.Length; i+) Console.WriteLine(Artistsi); ,/将数组Artists做降序排列,并输出其结果; Array.Reverse(Artists); for (int i = 0; i Artists.Length; i+) Console.WriteLine(Artistsi); Console.ReadLine(); ,2.2.3 值类型之间的数据转换,有两种转换方式: 隐式转换与显式转换; 如果是不同值类型之间
26、的转换,可以使用Convert类。,2.2.3 值类型之间的数据转换(续),隐式转换 从低精度、小范围的数据类型转换为高精度、大范围的数据类型,可以用隐式转换。 例如: int k = 1; long i = 2; i = k; /隐式转换,2.2.3 值类型之间的数据转换(续),显式转换 如: long k = 5000; int i = (int)k 所有的隐式转换也都可以采用显式转换的形式来表示。如: int i = 10; long j = (long)i; 将大范围类型的数据转换为小范围类型的数据的时候,必须特别谨慎,因为此时有丢失数据的危险。,2.2.4 装箱与拆箱,在.net中的
27、通用类型系统(Common Type system,CTS)中,所有类型都是对象(object),都派生自System.Object。CTS支持两组类型:值类型和引用类型。如果变量是值类型那么这个变量就包含实际的数据。也就是在内存中确实会分配那么一部分空间给这个变量并存储值,引用类型就类似一个类型安全的指针,本身并没有开辟内存空间去存储东西。 Object 类:所有其他 类的基类,装箱:将值类型转换为object类型 int i = 13; object ob = i; 拆箱:将object类型转换为值类型 int i = 13; object ob = i; int j = (int)ob;
28、,2.2.5 运算符与优先级,初级运算符 () . x+ x new typeof sizeof checked unchecked 一元运算符 + ! +x x和数据类型转换 乘/除运算符 * / % 加/减运算符 + 移位运算符 关系运算符 = is as 比较运算符 = = != 按位AND运算符 & 按位XOR运算符 | 按位OR运算符 布尔 AND运算符 & 布尔OR运算符 | 三元运算符 ?: 赋值运算符 = += = *= /= %= &= |= = = =,2.3 C#流程控制语句,顺序执行 分支 循环 异常捕获 如果一个逻辑块包含两条或两条以上的语句序列,必须使用大括号将语句
29、括起来。,2.3.1 条件分支语句,if语句:它的功能是根据布尔表达式的值(true或者false)选择要执行的语句序列,使用时要注意else应和最近的if语句匹配。,常见形式有: 1) 单独使用if语句,不加else语句 if ( 布尔表达式 ) 布尔表达式为真时执行的语句序列 2) if语句和else语句配套使用的单条件测试 if ( 布尔表达式 ) 布尔表达式为真时执行的语句序列 else 布尔表达式为假时执行的语句序列 ,2.3.1 条件分支语句(续),3) else块中嵌套if语句的多条件测试 if ( 布尔表达式1 ) 布尔表达式1为真时执行的语句序列 else if ( 布尔表达
30、式2) 布尔表达式2为真时执行的语句序列 else if ( 布尔表达式3) 布尔表达式3为真时执行的语句序列 else 所有条件均为假时执行的语句序列 ,注意,else和if之间有一个空格。,设有一个数学函数的表达式为: if(x0) y=1; else if(x=0) y=0; esle y=-1; ,2.3.1 条件分支语句(续),switch 语句也叫case语句 switch语句与C+和Java均不完全相同。 switch语句常用形式为: switch (表达式) case 常量表达式1: 语句序列1 case 常量表达式2: 语句序列2 default: 语句序列 ,2.3.1 条
31、件分支语句(续),常量表达式 switch条件表达式的值和每个case后的常量表达式可以是string、int、char、enum或其它值类型。 语句序列 每个case后的语句序列可以用大括号括起来,也可以不用, 但是每个case块的最后一句一定要是break语句,或者是goto语句。,switch语句的执行顺序 a) 如果switch语句的条件表达式的值和某一个case标记后指定的值相等,则转到该case标记后的语句序列执行; b)若switch语句的条件表达式的值和任何一个case标记后指定的值都不相等,则跳到default标记后的语句序列执行; c)若switch语句下面没有defaul
32、t标记,则跳到switch语句的结尾。,2.3.1 条件分支语句(续),注意: a) 当找到符合条件表达式值的case标记时,如果其后有语句序列,则它只会执行此case块中的语句序列,不会再对其它的case标记进行判断,所以才要求每个语句序列的最后一条语句必须是break语句, 但是有一个情况例外:如果某个case块为空,则会从这个case块直接跳到下一个case块上。 b) 如果case后有语句,则此case的顺序怎么放都无所谓,甚至可以将default子句放到最上面。因此,在一个switch中,不能有相同的两个case标记。,例.使用switch语句,完成对成绩等级的评定,using Sy
33、stem; namespace SwitchExample public class Program public static void Main() Console.Write(“请输入成绩:“); /从键盘接收一行字符 string str = Console.ReadLine(); /转换为整型 int i = Int32.Parse(str.Trim();/i=Convert.ToInt32(str) if (i 100 | i 0) Console.WriteLine(“成绩不在0-100范围内“); ,else switch (i / 10) case 10: Console.W
34、rite(“满分,“); goto case 9; case 9: Console.WriteLine(“优秀“); break; case 8: case 7: Console.WriteLine(“良好“); break; case 6: Console.WriteLine(“及格“); break; default: Console.WriteLine(“不及格“); break; Console.ReadLine(); ,用 switch语句来显示一个月的天数(忽略跨年度) 1: using System; 2: 3: class FallThrough 4: 5: public st
35、atic void Main(string args) 6: 7: if (args.Length != 1) return; 8: 9: int nMonth = Int32.Parse(args0); 10: if (nMonth 12) return; 11: int nDays = 0; 12: 13: switch (nMonth) 14: 15: case 2: nDays = 28; break; 16: case 4: 17: case 6: 18: case 9: 19: case 11: nDays = 30; break; 20: default: nDays = 31;
36、 21: 22: Console.WriteLine(“0 days in this month“,nDays); 23: 24: ,2.3.2 循环语句,包括: for语句,与Java相同 while语句,与Java相同 do-while语句,与Java相同 foreach语句,用于对集合进行操作。,2.3.2 循环语句(续),For语句 一般形式为: for (初始值;循环条件;循环控制) 语句序列 ,在Main方法中加入如下代码: public static void Main() Console.Clear(); Console.BackgroundColor = ConsoleCol
37、or.Blue; Console.ForegroundColor = ConsoleColor.Red; Console.Beep(); for (int i = 1; i 10; i += 2) Console.SetCursorPosition(40 - i / 2, i); for (int j = 0; j i; j+) Console.Write(“*“); Console.WriteLine(); Console.ReadLine(); ,例.使用for语句控制循环体,2.3.2 循环语句(续),While语句 一般形式为: while (条件) 语句序列 显然,循环体内的程序可能
38、会执行多次,也可能一次也不执行。,表达式必须是一个布尔表达式。 布尔表达式必须放在圆括号内。 假如首次求值时,布尔表达式为false,语句不会运行。 假如想要在一个while的控制下执行两个或者更多的语句,必须使用大括号将语句分组到一个块中。,用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 false; i+; return
39、true; ,/ / get all prime / / / / public static List getPrime(int min, int max) if (min / print all prime / public static void printPrime() _prime.print(); ,2.3.2 循环语句(续),do-while 一般形式为: do 语句序列 while (条件); 与while语句不同的是,do-while语句循环体内的程序至少会执行一次,然后再判断条件是否为true,如果条件为true,则继续循环。,如何使用do-while循环来实现求整数的阶乘。
40、 long y=1; do y*=x; x-; while(x0),在do 循环中计算平均值 1: using System; 2: 3: class ComputeAverageApp 4: 5: public static void Main() 6: 7: ComputeAverageApp theApp = new ComputeAverageApp(); 8: theApp.Run(); 9: 10: 11: public void Run() 12: 13: double dValue = 0; 14: double dSum = 0; 15: int nNoOfValues =
41、0;,16: char chContinue = y; 17: string strInput; 18: 19: do 20: 21: Console.Write(“Enter a value: “); 22: strInput = Console.ReadLine(); 23: dValue = Double.Parse(strInput); 24: dSum += dValue; 25: nNoOfValues+; 26: Console.Write(“Read another value?“); 27: 28: strInput = Console.ReadLine(); 29: chC
42、ontinue = Char.FromString(strInput); 30: 31: while (y = chContinue); 32: 33: Console.WriteLine(“The average is 0“,dSum / nNoOfValues); 34: 35: ,在静态 Main函数中实例化 ComputeAverageApp类型的一个对象。它同样接着调用实例的Run方法, 该方法包含了计算平均值所有必要的功能。 do 循环跨越第1931行。条件是这样设定的:分别回答各个问题 “y”,以决定是否要增加另一个值。输入任何其它 字符会引起程序退出 do语块,且平均值被计算。
43、,foreach语句 foreach语句用于逐个提取集合中的元素,并对集合中每个元素执行语句序列中操作的场合。foreach语句特别适合对集合(Collection)对象的存取。其一般形式为: foreach ( 类型 标识符 in 表达式 ) 语句序列 ,2.3.2 循环语句(续),例.使用foreach语句提取Hashtable对象的每个元素,using System; using System.Collections; namespace ForeachExample class Program public static void Main() /声明一个Hashtable集合hs,
44、/并使用Hashtable.Add方法为其添加带有指定键和值的元素 Hashtable hs = new Hashtable(); hs.Add(“001“, “str1“); hs.Add(“002“, “str2“); hs.Add(“003“, “str3“);,/循环显示hs集合的每个元素; Console.WriteLine(“code string“); foreach (string s in hs.Keys) Console.WriteLine(s + “ “ + hss); Console.ReadLine(); ,程序读所有的环境变量 1: using System; 2:
45、 using System.Collections; 3: 4: class EnvironmentDumpApp 5: 6: public static void Main() 7: 8: IDictionary envvars = Environment.GetEnvironmentVariables(); 9: Console.WriteLine(“There are 0 environment variables declared“, envvars.Keys.Count); 10: foreach (String strKey in envvars.Keys) 11: 12: Con
46、sole.WriteLine(“0 = 1“,strKey, envvarsstrKey.ToString(); 13: 14: 15: ,对GetEnvironmentVariables的调用返回一个IDictionary类型接口,它是由.NET框架中的许多类实现了的字典接口。 通过 IDictionary 接口,可以访问两个收集:Keys 和 Values。在这个例子里,我在foreach语句中使用Keys,接着查 找基于当前key值的值(第12行)。 当使用foreach时,只要注意一个问题:当确定循环变量的类型时,应该格外小心。选择错误的类型并没有受到编译 器的检测,但它会在运行时受检
47、测,且会引发一个异常。,课堂练习,使用foreach语句和Hashtable类,编写一个程序,先将一个班的同学的姓名和成绩输入存放到一个Hashtable中,然后计算全班平均成绩,打印输出;并将最高分数的个人的姓名和分数输出。 ForeachExample-2.cs,2.3.3 跳转语句,1.break语句 功能:退出最近的封闭switch、while、do-while、for或foreach语句。 格式: break;,【例】循环接收和输出键盘输入的每一行的值,当接收的内容为空字符串时退出。,using System; namespace BreakExample public class Program public static void Main() for (; ; ) Console.Write(“请输入一个字符串(直接回车退出):“); string s = Console.ReadLine(); if (s = “) break; Console.WriteLine(“你输入的是: 0.“, s); Console.ReadLine(); ,2.continue语句 功能:将控制传递给下一个while、do-while、for或foreach,继续执行下一次循环。 格式: continue
链接地址:https://www.31doc.com/p-2250312.html