1、第三章,C# 基础知识,回顾,Visual Studio .NET 2008 是用于创建、编写、运行和调试程序的集成开发环境 VS.NET 中的程序组成项目和解决方案。项目是一组相关的文件,解决方案则是一组相关的项目 Visual Studio .NET 为用户提供了用于浏览文件的各种窗口,目标,在C#中定义变量和常量 使用C# 中的基本数据类型 理解装箱和拆箱的概念 使用C#中的运算符,选择结构和循环结构 定义和使用数组,了解结构和枚举,基本数据类型,整数类型 实数类型 字符类型 布尔类型 对象类型,基本数据类型,1.整数类型整数类型又有有符号整数与无符号整数。有符号整数可以带正负号,无符号
2、整数不需带正负号,默认为正数。 有符号整数包括sbyte(符号字节型)、short(短整型)、int(整型)、long(长整型)。 无符号整数包括byte(字节型)、ushort(无符号短整型)、uint(无符号整型)、ulong(无符号长整型)。,基本数据类型,2. 实数类型实数类型包括float(单精度浮点型)、double(双精度浮点型)、decimal(十进制型)。 3.字符类型1. Unicode字符集Unicode是一种重要的通用字符编码标准是继ASCII字符码后的一种新字符编码,如UTF-16允许用16位字符组合为一百万或更多的字符。C#支持Unicode字符集,基本数据类型,2
3、. char(字符型)char(字符型):数据范围是065535之间的Unicode字符集中的单个字符,占用2个字节。char(字符型)表示无符号16位整数,char(字符型)的可能值集与Unicode字符集相对应。 3. string(字符串型)string(字符串型):指任意长度的Unicode字符序列,占用字节根据字符多少而定。string(字符串型)表示包括数字与空格在内的若干个字符序列,允许只包含一个字符的字符串,甚至可以是不包含字符的空字符串。,基本数据类型,4.布尔类型bool(布尔型):表示布尔逻辑量。bool(布尔型)数据范围是“true”(真)和“false”(假)。boo
4、l(布尔型)占用一个字节。bool(布尔型)的值“true”(真)和“false”是关键字。 5. object(对象型)可以表示任何类型的值,其占用字节视具体表示的数据类型而定。 object(对象型)是所有其他类型的最终基类。C#中的每种类型都是直接或间接从object类型派生的。,变量,大家回顾:变量命名规则(注意:不能是关键字),变量 2-1,语法: 访问修饰符 数据类型 变量名,int,string,float,变量(临时存储在运行过程中,可以改变其保存的值)是一种特定数据类型的值,age,name,weight,Public,Private,Protected,变量,例如: int
5、 number; / 声明一个整型变量 bool open; / 声明一个布尔型变量 decimal bankBlance; / 声明一个十进制变量 可以一次声明多个变量,例如:sbyte a , b; / 声明两个有符号字节型变量如果一次声明多个变量,变量名之间用逗号分隔。,变量赋值,C#规定,变量必须赋值后才能引用。为变量赋值需使用赋值号“=”。例如: int number;number = 32; / 为变量赋值32 也可以使用变量为变量赋值,例如:bool close; close=open; / 为变量赋值true(假设open为已声明的bool型变量,其值为true),变量赋值,可
6、以为几个变量一同赋值,例如:int a , b , c;a = b = c = 32; 可以在声明变量的同时为变量赋值,相当于将声明语句与赋值语句合二为一。例如:double area , radius = 16;,变量 2-2,static void Main(string args)/ 声明布尔型、字符串型、整型、短整型和浮点型变量 bool test = true;short num1 = 19;int num2 = 14000;string val = “Jamie“;float num3 = 14.5f;/ 显示变量值 Console.WriteLine (“布尔值 = “ + te
7、st);Console.WriteLine (“短整型值 = “ + num1);Console.WriteLine (“整型值 = “ + num2);Console.WriteLine (“字符串值 = “ + val);Console.WriteLine (“浮点值 = “ + num3);,变量中存储的值取决于该变量的类型,常量 2-1,语法: 访问修饰符 const 数据类型 常量名 = 常量值;,Public,Private,Protected,常量表示在整个程序运行过程中数据将保持不变,注意:常量必须在声明的时候初始化(赋值),常量 2-2,static void Main(st
8、ring args) / PI常量PIconst float PI = 3.14F;/ 圆的半径 int r=10;/ 圆的周长 double length = 2*PI*r;/ 圆的面积 double area = PI*r*r;Console.WriteLine (“圆的周长:0,圆的面积:1“, length,area); ,声明常量,在表达式中使用常量,const 关键字用于声明常量,C# 的基本(预定义)数据类型 4-1,C# 中的数据类型分为两个基本类别 值类型 引用类型 两者之间的区别 概念上:值类型直接存储其值,而引用类型存储对值的引用(内存地址) 存放在内存中的位置:值类型存
9、放在栈中,引用类型存放在堆中,注意:区分某个类型还是引用类型,因为这种存储位置的不同会产生不同的影响 堆与栈的区别:?,值类型和引用类型举例 值类型 int、short 、 char、double 、struct(结构),enum(枚举) 引用类型 预定义的引用类型 :object (所有类的基类)、string(字符串) 类、接口、数组 如果引用类型的值为null,表示没有没有存放任何对象的地址,C# 的基本(预定义)数据类型 4-2,C# 的基本(预定义)数据类型 4-3,static void Main(string args) / 声明一个值类型的整型数据类型int val = 100
10、;Console.WriteLine(“该变量的初始值为 0“, val); Test(val);/ 由于该数据类型属于值类型,所以将恢复其初始值 Console.WriteLine(“该变量的值此时为 0“, val); static void Test(int getVal) int temp = 10;getVal = temp * 20; ,将 val 的初始值传递给 Test() 方法,被传递的 val 在 Test() 方法内被改变,不反映已经改变的 val 值,而保留原始值,C# 的基本(预定义)数据类型 4-4,static void Main(string args) Dat
11、aTypeTest objTest = new DataTypeTest();objTest.Val = 100;/ 传递属于引用类型的对象Test(objTest);/ 由于该数据类型属于引用类型,所以会考虑新处理的值 Console.WriteLine(“变量的值为 0“, objTest.Val); static void Test(DataTypeTest dataTest) int temp = 10;dataTest.Val = temp * 20; class DataTypeTest public int Val; ,将 DataTypeTest 的引用传递给 Test(),被
12、传递的 val 在 Test() 中改变,装箱和拆箱 2-1,int val = 100; object obj = val; Console.WriteLine (“对象的值 = 0“, obj);,int val = 100; object obj = val; int num = (int) obj; Console.WriteLine (“num: 0“, num);,值类型,引用类型,值类型,引用类型,值类型,装箱和拆箱 2-2,装箱是将值类型转换为引用类型 拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与 Object 类型的值相互转换,将值类型与引用类
13、型链接起来,注意:被装过箱的对象才能被拆箱,类型一定要相同,short val = 100; object obj = val; int num = (int) obj; Console.WriteLine (“num: 0“, num);,运算符和表达式 9-1,运算符? 操作数?,Result,=,number,*,100;,变量,变量,常量,操作数,表达式,表达式=操作数和运算符的组合,运算符,算术运算符,前置和后置自加/自减运算符,算术运算符分类,一元运算符:只处理一个操作数(自加运算符+,自减运算符-) 二元运算符:用来处理两个操作数,大多数都是:+,-,*,/等。思考:1. int
14、 num = 5;int result = num+;result = +num;Console.WriteLine(result);,三元运算符,比较运算符,运算符和表达式,快捷运算符,运算符的优先级,C# 运算符的优先级,问题,计算结果: 1、 int i = 0;bool result = falseresult = (+i) + i = 2?true:false; result =,true,算术运算符,static void Main(string args) / x2 的系数int coefficient1 = 2;/ x 的系数int coefficient2 = -7;/ 二次
15、方程的常数值 int constant = 3;/ 存放表达式 b2 - 4ac 的值 double expression = 0;double x1 = 0;double x2 = 0;Console.WriteLine(“二次方程为: 0x2 + 1x + 2“, coefficient1, coefficient2, constant);expression = Math.Sqrt(coefficient2 * coefficient2 - (4 * coefficient1 * constant);x1 = (-coefficient2) + expression) / (2 * co
16、efficient1);x2 = (-coefficient2) - expression) / (2 * coefficient1);Console.Write(“x = 0:F2 “, x1);Console.Write(“ 或 “);Console.WriteLine(“x = 0:F2 “, x2); ,将值赋给变量,在表达式中使用的算术运算符,求平方根,选择结构程序的设计,在C#中,提供两种选择语句实现流程的改变: if语句,用于判断特定的条件能否满足,用于单分支选择,也可以通过嵌套实现多分支选择。 switch语句,用于多分支选择。,控制程序流,语法:if ()else ,1.条件
17、语句:根据条件是否满足或根据表达式的值控制代码的执行分支,if else,必须为布尔值,If举例,某商店为了吸引顾客,采取以下优惠活动:所购商品在1000元以下的,打9折优惠;所购商品多于1000元的,打8折优惠。试采用if语句实现该优惠。 采用美国的ABCDE五级打分制来显示成绩,试编写if语句实现该功能。优 :90分以上良 :8089分中 :7079分差 :6069分不及格 :60分以下,控制程序流,语法: switch (选择变量) case 值1: break; case 值2: break;case 值3: break;.default : break; ,switchcase :适
18、用于从一组互斥的分支中选择一个执行分支,必须是一个常量表达式,switchcase 的其他特性,选择结构 3-3,各个 case 标签不必连续,也不必按特定顺序排列 default 标签可位于 switchcase 结构中的任意位置 default 标签不是必选的,但使用 default 标签是一个良好的编程习惯 每两个 case 标签之间的语句数不限 可以把几个case语句放在一起。case 1: case 2:,Switch举例,某航空公司规定在旅游的旺季79月份,如果订票数超过20张,票价优惠15%,20张以下,优惠5%;在旅游的淡季15月份、10月份、11月份,如果订票数超过20张,票
19、价优惠30%,20张以下,优惠20%;其他情况一律优惠10%设计程序,根据月份和订票张数决定票价的优惠率,循环,在编写程序过程中,往往出现相同类型操作需要重复出现,如实现1+2+100,则需要做99次加法,这类问题使用循环语句解决,可以使问题变得简单。即循环语句用于实现语句块的重复执行。直到指定的条件发生改变。 根据问题的具体情况,C#中提供了四种不同的循环机制: for循环 while循环 dowhile循环 foreach循环。 大家考虑前三种循环的适用情况:九九乘法表的输出,for 循环,for 循环要求每次对特定条件进行判断,当只有满足条件后才允许执行循环体。 这种循环适用于一个语句或
20、语句块重复执行预定次数语法 : for (第一次循环前要计算的表达式; 测试的条件; 每次循环后要计算的表达式) /语句 for (int i = 0;i 100;i+) Console.WriteLine(i); ,与for循环语句比较,while语句使用的频率要低一些,它可以用于不知道循环次数的情况;用于在循环时判断是否满足某个条件。每一次在循环的顶部进行检测循环是否继续,当循环的条件为假时,退出循环。 语法 :while (条件) / 语句 break 语句可用于退出循环 continue 语句可用于跳过当前循环并开始下一循环,while 循环,dowhile 循环 2-2,dowhil
21、e循环非常类似于while循环。一般情况下,可以相互转换使用。它们之间的差别在于while循环的测试条件在每一次循环开始时执行,而dowhile循环的测试条件在每一次循环体结束时进行判断。同样的,dowhile可以解决一些循环问题,但使用的频率较少。 dowhile 适用于至少执行一次该循环体 语法 : do / 语句 while (条件) ;,foreach 循环,这是最后一个循环结构。 在不求数组长度的情况下,想要循环遍历该数组的每个元素,而不改变每个元素的值,怎么办?要改变每个元素的值,又怎么办?,foreach 循环 2-1,foreach 循环用于遍历整个集合或数组 语法:forea
22、ch (数据类型 元素(变量) in 集合或者数组)/语句,包含其它对象的对象,foreach 循环示例,static void Main(string args) / 存放字母的个数 int countLetters = 0;/ 存放数字的个数int countDigits = 0;/ 存放标点符号的个数int countPunctuations = 0;/ 用户提供的输入 string input;Console.WriteLine(“请输入一个字符串 “);input = Console.ReadLine();/ 声明 foreach 循环以遍历输入的字符串中的每个字符。 foreach
23、(char chr in input)/ 检查字母if(char.IsLetter(chr)countLetters+;/ 检查数字if(char.IsDigit(chr)countDigits+;/ 检查标点符号if(char.IsPunctuation(chr)countPunctuations+;Console.WriteLine(“字母的个数为: 0“, countLetters);Console.WriteLine(“数字的个数为: 0“, countDigits);Console.WriteLine(“标点符号的个数为: 0“, countPunctuations); ,为所有计数
24、器设置初始值,接受输入,对输入的每一个 字符都进行循环,使用了所有输入的字符 之后,循环自动终止,跳转语句,跳转语句:可以立即跳转到程序中另一行代码的语句。 goto:可以直接跳转到程序中用标签(一个标识符,后跟一个冒号)指定的另一行goto Label1Console.WriteLine(“this wont executed”);Label1:Console.WriteLine(“Continuing execution from here”); 注意:不提倡使用该语句,跳转语句,break; continue return大家说明以上跳转语句的用法,数组,考虑数组的概念? 数组的分类?
25、怎样声明数组? 怎样给数组的元素赋值?,数组 3-1,数组是同一数据类型的一组值 数组属于引用类型,因此存储在堆内存中 数组元素初始化或给数组元素赋值都可以在声明数组时或在程序的后面阶段中进行语法:数据类型维数1,维数1, 数组名称;int6 arrayHere;,数组 3-3,static void Main(string args) int count;Console.WriteLine(“请输入您要登记的学生人数 “);count=int.Parse(Console.ReadLine();/ 声明一个存放姓名的字符串数组,其长度等于提供的学生人数 string names = new s
26、tringcount;/ 用一个 for 循环来接受姓名 for(int i=0; icount; i+)Console.WriteLine(“请输入学生 0 的姓名 “,i+1);namesi=Console.ReadLine();Console.WriteLine(“已登记的学生如下: “);/ 用 foreach 循环显示姓名 foreach(string disp in names)Console.WriteLine(“0“, disp); ,数组声明,初始化数组元素的循环,显示输出的循环,结构,类引用类型,保存在堆中,性能有一定的损失。 有时需要一种小的数据结构,来包含少量的数据,而
27、类的功能多于我们的需要(如:不需要继承),并且性能要好,我们该怎么办? 现在我们已经使用了那些常见的结构体呢?,结构,结构的声明struct 结构的名字/字段/ 方法,struct structEx public int structDataMember;public void structMethod1()/structMethod1 实现 ,自定义数据类型 可以在其内部定义方法 无法实现继承 属于值类型主要结构:,struct student public int stud_id;public string stud_name;public float stud_marks;public
28、void show_details()/显示学生详细信息,进一步研究结构,数据成员,方法,所有与 Student 关联的详细信息都可以作为一个整体进行存储和访问,结构和类的区别,枚举,public class Holiday public enum WeekDaysMonday,Tuesday,Wednesday,Thursday,Fridaypublic void GetWeekDays (String EmpName, WeekDays DayOff)/处理工作日static void Main()Holiday myHoliday = new Holiday();myHoliday.Ge
29、tWeekDays (“Richie“, Holiday.WeekDays.Wednesday); ,枚举(Enum,Enumerator 的缩写)是一组已命名的数值常量 用于定义具有一组特定值的数据类型 枚举以 enum 关键字声明,Wednesday = 2,枚举(续),C# 中的枚举包含与值关联的数字 默认情况下,将 0 值赋给枚举的第一个元素,然后对每个后续的枚举元素按 1 递增 在初始化过程中可重写默认值,public enum WeekDays Monday=1,Tuesday=2,Wednesday=3,Thursday=4,Friday=5 ,总结 2-1,变量是存放特定数据类型的值的容器,而常量也存放特定数据类型的值,但常量在整个程序中都保持一致 装箱是将值类型转换为引用类型,而拆箱则是将引用类型转换为值类型 C# 提供了以下类型的选择结构: if ifelse switchcase,总结 2-2,C# 提供了以下类型的循环结构: while 循环 do 循环 for 循环 foreach 循环 数组是可将同一类型的多个数据元素作为单个实体存放的一种数据结构 C# 中的结构可以在其内部定义方法并可包括一个构造函数 枚举是一组已命名的数值常量,