第2章 基本数据类型 王德俊 上海交通大学继续教育学院
第2章 基本数据类型 2.1 一个简单的程序 2.2 基本数据类型 2.3 变量与常量 2.4 基本运算 2.5 数组的定义和使用 (数组类与数组列表类 结构 枚举)
数组类与数组列表类 用简单选择法对n个数排序 选择排序过程: (1)首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换---第一趟选择排序,结果最小的数被安置在第一个元素位置上 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换---第二趟选择排序 (3)重复上述过程,共经过n-1趟排序后,排序结束
数组类与数组列表类(续) static void Main(string[] args) { const int n = 10; int[] a=new int[n]; int i,j,k,x; Console.WriteLine("Input 10 numbers:"); for(i=0;i<=n-1;i++) a[i]=int.Parse(Console.ReadLine()); Console.WriteLine(); //输入数组元素
数组类与数组列表类(续) for(i=0;i<=n-2;i++) { k=i; //记录最小的数所在的位置 for(j=i+1;j<=n-1;j++) if(a[j]<a[k]) k=j; if(i!=k) { x=a[i];a[i]=a[k];a[k]=x;} } //简单选择排序 Console.WriteLine("The sorted numbers:"); for(i=0;i<=n-1;i++) Console.Write("{0} ", a[i]); Console.WriteLine(); Console.ReadLine(); } //输出数组元素
数组类与数组列表类(续) C#通过.NET框架中的System.Array数组类来支持数组,因此, 可以使用该类的属性与方法操作数组 数组列表类(ArrayList)是一个集合类,由该类声明的对象也 可以当做数组来使用
System.Array类 System.Array类提供创建、操作、搜索和排序数组的方法,因 而在CLR中用作所有数组的基类。列举常用属性和方法如下: 1)Length属性 2)IsReadOnly属性 3)Clone方法 4)CopyTo方法 5)Sort方法 6)Reverse方法
System.Array类(续) Length属性: 是数组对象的一个只读属性,表示数组包含多少个元素 int [ ]A=new int[10]; for(int i=0;i<A.Length;i=i+1) A[i]=i; IsReadOnly属性,此属性对于所有数组总是 false。
Clone方法 实现克隆数组功能,使用格式: 目标数组名=(数组类型名)源数组名.Clone( ); 例如: int [ ]A=new int[5]{10,8,6,4,2};// 声明并初始化数组A,该数组将作为源数组 int [ ]B; // 声明数组B,该数组将作为目标数组 B=(int [ ])A.Clone(); // 使用Clone方法 使用克隆方法时,将得到一个与源数组一模一样的数组,且目标数组不需要再实例化 Clone方法创建 Array的浅表副本。即仅复制 Array的元素(无论它们是引用类型还是值类型),但不复制这些引用所引用的对象。
CopyTo方法 实现数组拷贝功能,使用格式: 源数组名.CopyTo(目标数组名,起始位置); 例如: int [ ]A=new int[5]{6,7,8,9,10}; // 声明并初始化数组A,该数组将作为源数组 int [ ]B=new int[10]{1,2,3,4,5,1,2,3,4,5}; // 声明并初始化数组B,该数组将作为目标数组 A.CopyTo(B,5); 将数组A中的各元素值6、7、8、9、10合并到数组B中,合并后数组B中的各元素值为1、2、3、4、5、6、7、8、9、10 利用“起始位置”参数,可以将一个元素较少的数组中的元素值合并到一个元素较多的数组中
Sort方法 实现数组排序功能,使用格式为: Array.Sort(数组名); 例如: int [ ]A=new int[5]{10,8,6,4,2}; Array.Sort(A); 排序后,数组A中各元素值的排列顺序为:2、4、6、8、10
Reverse方法 将数组名对应的数组元素顺序反转,格式如下: Array.Reverse(数组名); 例如: Array. Reverse(A); 如果数组A中各元素值原来为:2、46、6、8、10,则反转后 为:10、8、6、46、2
示例ArraySort [例1] 创建Windows应用程序 在程序中声明包含10个元素的双精度型数组 为数组元素赋值为0~100之间的随机实数 单击“升序”按钮,数组按升序排序 单击“降序”按钮,数组按降序排序 输出排序前后数组的元素值
在Form1类定义中声明一个double类型的数组和一个string类型的变量: double [ ]A=new double[10]; string s;
窗体的Load事件代码: private void Form1_Load(object sender, System.EventArgs e) { Random rn=new Random( ); // 声明一个随机数生成对象 for(int i=0;i<A.Length;i=i+1) A[i]=Math.Round(rn.NextDouble( )*100,1); // 赋予数组各元素随机值 s+=A[i]+" "; // 将数组元素值的原顺序保存为一个字符串 } s+="\n\n"; label1.Text="数组原顺序为:\n"+s;
Array.Sort(A); “升序”按钮的Click事件代码: private void button1_Click(object sender, System.EventArgs e) // 升序 { Array.Sort(A); label1.Text="数组原顺序为:\n"+s; label1.Text+="数组升序排序:\n"; for(int i=0;i<A.Length;i++) label1.Text+=A[i]+" "; } // 升序处理结束
“降序”按钮的Click事件代码: private void button2_Click(object sender, System.EventArgs e) // 降序 { Array.Sort(A); Array.Reverse(A); label1.Text="数组原顺序为:\n"+s; label1.Text+="数组降序排序:\n"; for(int i=0;i<A.Length;i++) label1.Text+=A[i]+" "; } // 降序处理结束
在程序代码中使用了随机数生成对象rn的NextDouble方法,该方法能够生成一个0.0~1.0之间的实数 为了使生成的随机数只保留一位小数,使用了Math(数学)类中的Round方法以确定小数点后保留几位小数 Round方法的使用格式为: Math.Round(双精度类型数据,需要保留的小 数位数)
System.Collections.ArrayList类 ArrayList类属于System.Collections命名空间
System.Collections.ArrayList类 1) Count属性 2) IsReadOnly属性 3) Clone与CopyTo方法 4) Add 方法 5) BinarySearch 方法 6) Sort方法和Reverse方法
System.Collections.ArrayList类 ArrayList 对象名=new ArrayList(数组名); 其中,“数组名”为已经实例化的数组 例如: int [ ]A=new int[5]; // 声明并实例化数组 ArrayList AL=new ArrayList(A); // 声明并实例化数组列表 这样,AL相当于包含5个元素的整型数组
1 ) ArrayList类的Count属性 在数组列表ArrayList类中,表示包含元素个数的属性为Count, 其性质与用法与数组的Length属性相同
2) IsReadOnly属性 数组列表均具有IsReadOnly属性,利用该属性可以获知数组 列表中的元素是否为只读的 IsReadOnly属性值默认为false(假)
3) Clone与CopyTo方法 克隆(Clone)与拷贝(CopyTo)方法的功能均为数组复制操 作: 使用格式如下: 目标数组列表名=(ArrayList)源数组列表名.Clone( ); 源数组列表名. CopyTo(目标数组名) // Array必须具有从零开始的索引。
4 )Add 方法 将对象添加到 ArrayList的结尾处。使用格式: 数组列表名.Add(object对象); 如: ArrayList myAL = new ArrayList(); for (int i = 0; i <= 4; i++) myAL.Add(i * 2);
5)BinarySearch 方法 使用默认的比较器在整个已排序的 ArrayList中搜索元素,并返回该元素从零开始的索引,没找到则返回小于零的值。使用格式: 数组列表名. BinarySearch(object对象); 如: int myIndex = myAL.BinarySearch(6); if (myIndex < 0) Console.WriteLine("没找到"); else Console.WriteLine("找到{0}", myIndex);
ArrayList方法使用例子 for (int i = 0; i <= 4; i++) myAL.Add(i * 2); ArrayList myAL = new ArrayList(); for (int i = 0; i <= 4; i++) myAL.Add(i * 2); ArrayList myBL = (ArrayList)myAL.Clone(); int []A=new int[5]; myAL.CopyTo (A); int myIndex = myBL.BinarySearch(6); if (myIndex < 0) Console.WriteLine("没找到"); else Console.WriteLine("找到{0}", myIndex);
6) Sort方法和Reverse方法 Sort方法使用格式为: Reverse方法使用格式为: 数组列表名称.Sort( ); 例如: int [ ]A=new int[5]{5,4,3,2,1}; ArrayList AL=new ArrayList(A); AL.Sort( ); AL.Reverse(); 排序后,数组列表AL中各元素值的排列顺序为:1、2、3、4、5 反转后,各元素值的排列顺序为:5、4、3、2、1
4 自定义数据类型 自定义的数据类型包括结构与枚举 结构与枚举都属于值类型,而数组是引用类型 (1) 结构类型 (2) 枚举类型
(1) 结构类型 结构类型可以用来处理一组类型不同、内容相关的数据 1) 定义结构 2) 声明结构变量 3) 访问结构变量
1) 定义结构 结构的定义需要使用struct关键字,格式如下: struct 结构类型名 { public 类型名1 结构成员名1; ... } “结构类型名”表示用户定义的新数据类型名称 一对大括号之间定义结构成员 “类型名”可以是基本数据类型,也可以是另一个已定义的结构类型
例如: struct date { public uint year,month,day; } struct employee public string name; public bool sex; public date birthday; public string phone; public decimal pay;
2) 声明结构变量 定义结构后,可以用结构来声明变量 例如:date d1; // 声明一个结构变量d1 可以在声明结构变量的同时,为结构变量赋值,实质上是为结构变量中的成员赋值,如: date d1 = new date(); d1.year = 2012; d1.month = 10; d1.day = 8; date d2 = d1; // 用结构变量d1为d2赋值 又如: employee jerry; jerry=tom; // 用结构变量tom为结构变量jerry赋值 33
3) 访问结构变量 使用结构中的成员必须指出访问的结构变量 方法是在结构变量和成员之间通过运算符“.”连接在一起: 结构变量名.成员名 例如: tom.name="汤姆"; tom.sex=true; tom.birthday.year=1980; tom.birthday.month=5; tom.birthday.day=26; tom.phone="13868782069"; tom.pay=1500;
(2) 枚举类型 枚举类型是由用户定义的一组整型符号常量 使用枚举可以将一组相关的有限常量组织在一起,保证变量只能具有预定的值 由于常量都有名称,易于辨认,从而提高了程序的可读性 1) 定义枚举类型 2) 声明与访问枚举变量
1) 定义枚举类型 定义枚举类型使用关键字enum,定义枚举类型的一般格式为: enum 枚举类型名 { 符号常量1, 符号常量2, … } 枚举类型的成员均为符号常量,常量名之间用逗号分隔 例如: enum SolarSystem Sun,Earth,Moon
枚举常量成员的默认值为0、1、2…,可以在定义枚举类型时为成员赋予 特定的整数值 例如: enum SolarSystem { Sun=700000, // 太阳半径 Earth=6380, // 地球赤道半径 Moon=1740 // 月亮半径 }
2) 声明与访问枚举变量 声明枚举变量与声明基本类型变量的格式相同 SolarSystem S; // 声明一个枚举变量S 可以在声明枚举变量的同时为变量赋值 枚举变量的值必须是枚举成员,枚举成员需要用枚举类型引导 例如: SolarSystem S= SolarSystem.Sun; // 为枚举变量S赋值Sun 对枚举变量的访问同基本类型变量,例如: SolarSystem S= SolarSystem.Sun; int Num=S; // 将S的值赋给整型变量Num
本讲小结 数组类与数组列表类 结构 枚举