《第二章C编程基础.ppt》由会员分享,可在线阅读,更多相关《第二章C编程基础.ppt(78页珍藏版)》请在三一办公上搜索。
1、第二章 C#编程基础,本章学习目标,熟悉C#基本数据类型掌握选择、循环、跳转语句的使用方法掌握定义和初始化数组的方法掌握访问数组元素的方法,第二章 C#编程基础,2.1 基本数据类型2.2 常量与变量2.3 表达式2.4 选择语句2.5 循环语句2.6 跳转语句2.7 数组,2.1 基本数据类型,2.1.1 值类型2.1.2 引用类型2.1.3 值类型与引用类型的关系,2.1 基本数据类型,简单类型枚举类型结构类型,值类型,引用类型,类接口数组委托,两者有很大区别,2.1 基本数据类型,值类型,引用类型,内存,.,int num;num=1024;,num,.,string str;str=“
2、abc”;,str,内存,2.1.1 值类型,所谓值类型就是一个包含实际数据的量。即当定义一个值类型的变量时,C#会根据它所声明的类型,以堆栈方式分配一块大小相适应的存储区域给这个变量,随后对这个变量的读或写操作就直接在这块内存区域进行。,2.1.1 值类型,2.1.1 值类型,枚举类型:由用户定义的一组有限个整型符号常量。定义枚举类型枚举成员赋值声明枚举变量访问枚举变量,2.1.1 值类型枚举类型,定义枚举类型enum 枚举名:数据类型/枚举成员 数据类型除了char之外的整数类型。默认为32位整数类型,第一个枚举值为0,第二个为1,依次加1。枚举成员 枚举成员均为符号常量,常量名之间用逗号
3、分隔。,2.1.1 值类型枚举类型,定义枚举类型实例 enum WeekdaysMon,Tues,Wed,Thur,Fri,Sat,Sun/Mon=0,Tues=1,Wed=2,Thur=3,Fri=4,Sat=5,Sun=6,2.1.1 值类型枚举类型,枚举成员赋值(1)修改枚举的默认值(2)修改一个或多个枚举成员的值(3)为多个枚举成员赋同样的值,2.1.1 值类型枚举类型,枚举成员赋值(1)修改枚举的默认值public enum WeekdaysMon=1,Tues,Wed,Thur,Fri,Sat,Sun,枚举Weekdays的第一个枚举值为1,其后依次加1.,2.1.1 值类型枚举类
4、型,枚举成员赋值(2)修改一个或多个枚举成员的值public enum Weekdays Mon,Tues=-1,Wed,Thur,Fri=3,Sat,Sun,第一个被赋值的枚举成员之前的枚举成员,按默认方式赋值;如为某个枚举成员赋值,则其后的枚举成员值在此基础上依次加1.,2.1.1 值类型枚举类型,枚举成员赋值(3)为多个枚举成员赋同样的值 public enum Weekdays Mon,Tues=3,Wed,Thur,Fri=Mon,Sat,Sun,被赋值枚举成员一定要位于赋值的枚举成员之后!,2.1.1 值类型枚举类型,声明枚举变量 格式:枚举名 变量名;,2.1.1 值类型枚举类型
5、,访问枚举变量 枚举变量的值必须是枚举成员,枚举成员需要用枚举名引导。例:enum Color red,green,blue Color c=Color.red;int i=(int)c;或:int i=(int)Color.red;,2.1.2 引用类型,2.1.2 引用类型,一个引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。引用类型分两步创建:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量。,2.1.2 引用类型,例如:string s1,s2;s1=ABCD;s2=s1;其中,s1,s2是指向字符串的引用变量,
6、s1的值是字符串“ABCD”存放在内存的地址,这就是对字符串的引用,两个引用型变量之间的赋值,使得s2、s1都是对“ABCD”的引用。如图所解。,堆内存,栈内存,ABCD,s1,s2,2.1.3 值类型与引用类型关系,可以把值类型与引用类型的值赋给object类型变量,C#用“装箱”和“拆箱”来实现值类型与引用类型之间的转换。装箱就是将值类型包装成引用类型的处理过程。当一个值类型被要求转换成一个object对象时,装箱操作自动进行,它首先创建一个对象实例,然后把值类型的值复制到这个对象实例,最后由object对象引用这个对象实例。拆箱操作与装箱相反,它是将一个object类型转换成值类型。首先
7、检查由object引用的对象实例值类型的包装值,然后把实例中的值拷贝到值类型的变量中。,2.1.3 值类型与引用类型关系,装箱操作实例:using System;class Demo public static void Main()int x=123;object obj1=x;/装箱操作 x=x+100;/改变x的值obj1的值并不会随之改变 Console.WriteLine(x=0,x);/x=223 Console.WriteLine(obj1=0,obj1);/obj1=123,2.1.3 值类型与引用类型关系,实例的装箱操作说明如图所示。,2.1.3 值类型与引用类型关系,拆箱操
8、作实例:using System;class Demo public static void Main()int x=123,y;object obj1=x;/装箱操作 x=x+100;/改变x的值,此时obj1的值并不会随之改变 y=(int)obj1;/拆箱操作,必须进行强制类型转换 Console.WriteLine(x=0,x);/x=223 Console.WriteLine(obj1=0,obj1);/obj1=123,2.2 常量与变量,2.2 常量与变量,变量的声明数据类型 变量名int age;变量名标示符命名规则只能使用数字、字母、下划线标识符首字母必须是字母、下划线不能使
9、用关键字作为标示符C#区分大小写变量命名规范不要用下划线作为变量名首字符不要仅靠大小写区分两个变量小写字母开头如果多个单词命名变量名,从第二个单词开始,每个单词首字母大写。例如:int averageAge;,2.2 常量与变量,变量初始化,int a=2;/定义a为整型变量,初值为2char b=A;/定义b为字符型变量,初值为Adouble x=2.1234;/定义x为实型变量,初值为2.1234也可对被定义的变量的部分变量进行初始化。如int u,v=100,w;/定义u,v,w为整型变量,v的初值为100,float y=1.1;/错误,因为1.1默认为double类型,范围比floa
10、t大,因此double类型向float类型转化时会报错。如需转化:float y=(float)1.1或float y=1.1f,2.3 表达式,算术运算符关系运算符逻辑运算符位运算符赋值运算符条件运算符,2.3 表达式,算术运算符,关系运算符,关系运算符,逻辑运算符,逻辑运算符,&:短路与(当第一个操作数为假时,则表达式的结果为假,不再计算第二个操作数)|:短路或(当第一个操作数为真时,则表达式的结果为假,不再计算第二个操作数),位运算符,位运算符,赋值运算符,赋值运算符,条件运算符,条件运算符表达式1?表达式2:表达式3如果“表达式1”的值为非0(真),则条件表达式的运算结果等于“表达式2
11、”的值,否则,运算结果等于“表达式3”的值。例如:int i=2,j=4;max;max=ij?i:j;/max的值为4,表达式中的类型转换,在表达式中,操作数的数据类型可以不同,只要相互兼容即可。当表达式中混合了几种不同的数据类型时,C#会基于运算的顺序将它们自动转换成同一类型。隐式转换:数值范围小的类型数值范围大的类型,无符号整数类型 有符号整数类型(float不能转换为decimal),2.4 选择语句,if()if()else if()else(else语句与最近的if匹配)switch,条件判断嵌套 if,机票预定:输出实际机票价格原价为4000元5-10月为旺季,头等舱打9折,经济
12、舱打7.5折其他时间为淡季,头等舱打6折,经济舱打3折,需要两次判断首先判断是旺季还是淡季再判断头等舱还是经济舱,嵌套 if 实现,条件判断嵌套 if,if(month=5 else/淡季/,关键代码,嵌入的一对 ifelse,switch 示例,从键盘输入学生的百分制成绩,换算成等级成绩90-100:A,80-89:B,70-79:C,60-69:D,其余:E,switch 示例,Console.Write(“输入学生百分制成绩:”);int grade=int.Parse(Console.ReadLine();switch(grade/10)case 9:case 10:Console.W
13、riteLine(“你的成绩为:A”);break;case 8:Console.WriteLine(“你的成绩为:B”);break;case 7:Console.WriteLine(“你的成绩为:C”);break;case 6:Console.WriteLine(“你的成绩为:D”);break;default:Console.WriteLine(“你的成绩为:E”);break;,条件判断的表达式类型 整型或字符串break 语句的要求:每个 case 都有 breakdefault 也要有 break特殊情况:,case 中没有其他语句时,不需要break语句,2.4 循环语句,Wh
14、ile语句do-while语句for 语句,2.4 循环语句,用不同的循环语句求,While语句,using System;public class Sum100 public static void Main()int Sum,i;Sum=0;i=1;while(i=100)Sum+=i;i+;Console.WriteLine(Sum is+Sum);,do-while语句,using System;public class Sum100 public static void Main()int sum,i;sum=0;i=1;do sum+=i;i+;while(i=100)Consol
15、e.WriteLine(“sum is+sum);,for 语句,using System;public class Sum100 public static void Main()int sum,i;for(sum=0,i=1;i=100;i+)sum+=i;Console.WriteLine(“sum is+sum);for(sum=0,i=1;i=100;sum+=i,i+);/循环体是一空语句 Console.WriteLine(“sum is+sum);,2.6 跳转语句,continue语句break语句return语句,2.6 跳转语句,在循环结构中,continue 和 bre
16、ak怎样跳转?,for()continue;,for()break;,跳出循环结构,跳到下次循环,在二重循环中会怎样呢?,Continue语句,下面红色框中代码的作用是什么?,int count=0;for(i=0;i 3;i+)/提示输入成绩 for(j=0;j 4;j+)Console.Write(第0个学员的成绩:,j+1);score=int.Parse(Console.ReadLine();sum=sum+score;if(score 85)continue;count+;/计算平均分并输出,continue 跳出本次循环,继续下一次循环,统计成绩在85分以上的学员人数,Break语
17、句,5个专卖店促销,每个专卖店每人限购3件衣服,可以随时选择离开,离店时要结账,for(i=0;i5;i+)/每次进一个专卖店 for(j=0;j3;j+)/每个店限购3件 if(离开这家店)break;选购一件衣服 结账,Break语句,关键代码,int i=0,j=0,count=0;string choice;for(i=0;i 5;i+)/外层循环控制依次进入下一个专卖店 Console.WriteLine(n欢迎光临第0家专卖店,i+1);for(j=0;j 3;j+)/内层循环一次买一件衣服 Console.Write(要离开吗?y/n);choice=Console.ReadLi
18、ne();if(choice=y)/如果离开,就跳出,结账,进入下一个店 break;Console.WriteLine(买了一件衣服);count+;/买一件衣服 Console.WriteLine(离店结账,买了0件衣服,count);,break 跳出内层循环,choice=y,2.6 跳转语句,for()for()continue;,for()for()break;,跳出本层循环,继续执行外层循环,跳出本次循环,继续下一次循环,break 和 continue 用在二重循环中:,return语句,语法形式:return;或 return 表达式;return语句出现在一个方法内,在方法
19、中执行到return语句时,程序流程转到调用这个方法处。如果方法没有返回值(返回类型修饰为void),则使用return返回;如果方法有返回值,那么使用return表达式格式,其后面跟的表达式就是方法的返回值。,return语句,using System;public class Prime100 public static bool prime(int m)for(int i=2;im;i+)if(m%i=0)return false;/返回给调用者 return true;,求1-100之间所有素数,public static void Main()int m,k,n=1;Console.
20、Write(0,-4,2);for(m=3;m100;m+=2)if(prime(m)/调用方法prime Console.Write(0,-4,m);if(+n%10=0)Console.WriteLine(n);Console.Read();,2.7 数组,声明一维数组,数据类型 数组名例如:int a1;double f1;string s1;,创建一维数组对象,数据类型 数组名数组名=new 数据类型元素个数或数据类型 数组名=new 数据类型元素个数,一维数组初始化,如何设置大小及初始化?,/使用 new 设置大小/创建长度为5的整型数组int array=new int5;,/创建
21、的同时初始化int arr=new int5 0,1,2,3,4;int arr=new int 0,1,2,3,4;/省略长度int arr=0,1,2,3,4;/省略new,5方括号中的数字决定数组的长度,0,1,2,3,4大括号中的元素个数决定数组的长度,一维数组,使用一维数组 for 循环for(int i=0;i数组个数;i+)/数组名 i foreach循环foreach(数据类型 变量名 in 数组名)/循环体变量名:循环变量,依次获取数组中各元素的值,其类型必须与数组的类型一致。,一维数组,获得数组的长度(元素的个数):,数组名.Length,常作为循环的条件,/循环打印数组元
22、素int array=new int5 0,1,2,3,4;/声明并初始化一维数组for(int i=0;i array.Length;i+)/输出数组中的所有元素 Console.WriteLine(arrayi);,/循环打印数组元素int array=new int5 0,1,2,3,4;/声明并初始化一维数组foreach(int i in array)/输出数组中的所有元素 Console.WriteLine(i);,常见错误,数组初始值的数目与数组的长度不一样,/循环打印数组元素int array=new int5 0,1,2;/声明并初始化一维数组for(int i=0;i ar
23、ray.Length;i+)/输出数组中的所有元素 Console.WriteLine(arrayi);,初始值的个数必须与数组的长度一样!,代码错误,一维数组,string arr3;arr3=new string3 I,like,C#;,int arr1=new int3;,int arr2=new int31,2;,int arr1,new int31,2,0,正误判断:,int arr4=new string3;,类型应一致,2.7 数组,声明多维数组,数据类型,数组名例如:int,score;double,table;,创建多维数组对象,数据类型,数组名数组名=new 数据类型siz
24、e1,size2,size3 size1,size2,size3分别标明每一维的元素个数或数据类型,数组名=new 数据类型size1,size2,size3,二维数组,如何设置二维数组大小及初始化?,/使用 new 设置大小/创建长度为2*3的整型数组int,array=new int2,3;,/创建的同时初始化int,arr=new int2,30,1,2,3,4,5;int,arr=new int,0,1,2,3,4,5;/省略长度int,arr=0,1,2,3,4,5;/省略new,2,3方括号中的数字决定数组的行数和列数,0,1,23,4,5;大括号中的元素个数决定数组的行数和列数,
25、二维数组,使用二维数组使用双重循环,外循环控制行,内循环控制列。for(int i=0;i数组行数;i+)for(int j=0;j数组列数;j+)/数组名 i,j foreach循环foreach(数据类型 变量名 in 数组名)/循环体变量名:循环变量,依次获取数组中各元素的值,其类型必须与数组的类型一致。,数组与System.Array,获得某一维元素个数,数组名.Length,System.Array类型是所有数组类型的抽象基类型任何数组可以使用System.Array具有的属性及方法获得数组的长度(元素的个数):,数组名.GetLength(int dimension),二维数组,/
26、循环打印数组元素int,array=new int2,30,1,2,3,4,5;/声明并初始化二维数组for(int i=0;i array.GetLength(0);i+)/输出数组中的所有元素 for(int j=0;j array.GetLength(1);j+)Console.WriteLine(arrayi,j);,/循环打印数组元素int,array=new int2,30,1,2,3,4,5;/声明并初始化二维数组foreach(int i in array)/输出数组中的所有元素 Console.WriteLine(i);,二维数组使用,2.7 数组,不规则数组:是一个数组的数
27、组,它的内部每个数组的长度可以不同;声明不规则数组,数据类型 数组名例如:int score;double table;,创建多维数组对象,数据类型 数组名数组名=new 数据类型 size size表示不规则数组的行数数组名0=new 数据类型size0数组名1=new 数据类型size1数组名size-1=new 数据类型sizen,不规则数组,不规则数组初始化,/创建的同时初始化int array=new int3;/array是由3个数组组成的数组array0=new int1,2,3array1=new int1,2,3,4,5array2=new int1,2,不规则数组,/循环打
28、印数组元素int array=new int3;/array是由3个数组组成的数组array0=new int1,2,3;array1=new int1,2,3,4,5;array2=new int1,2for(int i=0;i array.Length;i+)/输出不规则数组中的所有元素 for(int j=0;j arrayi.Length;j+)Console.WriteLine(arrayij);,/循环打印数组素int,array=new int2,30,1,2,3,4,5;/声明并初始化二维数组foreach(int i in array)/输出数组中的所有元素 Console.
29、WriteLine(i);,不规则数组使用,ArrayList(补充),System.Collections.ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变数组的长度。优点:1.支持自动改变大小的功能2.可以灵活的插入元素3.可以灵活的删除元素4.可以灵活访问元素局限性:跟一般的数组比起来,速度上差些,声明数组列表,ArrayList 数组列表名称=new ArrayList(),ArrayList,用一个已经实例化的数组初始化数组列表,ArrayList 数组列表名称=new ArrayList(数组名称),int myArray=new int61,2,3,4,5
30、,6;ArrayList aList=new ArrayList(myArray);,ArrayList,添加元素-将对象添加到ArrayList的结尾处,数组列表.Add(object value),ArrayList aList=new ArrayList();aList.Add(a);aList.Add(b);aList.Add(c);aList.Add(d);aList.Add(e);/结果为:abcde,ArrayList,添加元素-将对象添加到ArrayList的指定位置,数组列表.Insert(int index,object value),ArrayList,ArrayList
31、 aList=new ArrayList();aList.Add(a);aList.Add(b);aList.Add(c);aList.Add(d);aList.Add(e);aList.Insert(0,“ff);/结果为:ffabcde,删除元素-从ArrayList中移除特定对象的第一个匹配项,注意是第一个,ArrayList,数组列表.Remove(object obj),aList.Add(a);aList.Add(b);aList.Add(c);aList.Add(d);aList.Add(e);aList.Remove(a);/结果为bcde,删除元素-移除ArrayList的指
32、定索引处的元素,ArrayList,数组列表.RemoveAt(int index),aList.Add(a);aList.Add(b);aList.Add(c);aList.Add(d);aList.Add(e);aList.RemoveAt(0);/结果为bcde,删除元素-从ArrayList中移除一定范围的元素。Index表示索引,count表示从索引处开始的数目,ArrayList,数组列表.RemoveRange(int index,int count),aList.Add(a);aList.Add(b);aList.Add(c);aList.Add(d);aList.Add(e);aList.RemoveRange(1,3);/结果为ae,删除元素-从ArrayList中移除所有元素。,ArrayList,数组列表.Clear(),获取元素值-获取数组列表中第i个元素,ArrayList,数组列表i-1,总结,C#基本数据类型分为哪两类?值类型与引用类型的区别是什么?选择、循环、跳转语句的使用方法是什么?如何定义和初始化数组?如何访问数组元素?,