第三章 C# 基础知识
回顾 Visual Studio .NET 2003 是用于创建、编写、运行和调试程序的集成开发环境 用户使用 VS.NET 中的“起始页”可以自定义 IDE。IDE 还包含许多有用的链接,如最近的项目、下载和联机新闻组等 VS.NET 中的程序组成项目和解决方案。项目是一组相关的文件,解决方案则是一组相关的项目 Visual Studio .NET 为用户提供了用于浏览文件的各种窗口 “动态帮助”窗口为用户提供了与当前光标所在位置相关的文章
目标 在C#中定义变量和常量 使用C# 中的基本数据类型 理解装箱和拆箱的概念 使用C#中的运算符,选择结构和循环结构 定义和使用数组,了解结构和枚举
C# 数据类型 C# 数据类型 大小 默认值 示例 int 有符号的 32 位整数 int rating = 20; float int rating = 20; float 32 位浮点数,精确到小数点后 7 位 0.0F float temperature = 40.6F; byte 无符号的 8 位整数 byte gpa = 2; short 有符号的 16 位整数 short salary = 3400; long 有符号的 64 位整数 0L long population = 23451900; bool 布尔值,true 或 false False bool IsManager = true; string Unicode 字符串 - string color = “Orange” Char 单个 Unicode 字符 ‘\0’ char gender = ‘M’;
变量 2-1 变量用于存储特定数据类型的值 语法: 访问修饰符 数据类型 变量名 int Public string Private 2 盐 5.4 胡椒粉 “Test” 糖 float Protected …… 糖 盐 胡椒粉 int float string
变量 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 ("布尔值 = " + test); Console.WriteLine ("短整型值 = " + num1); Console.WriteLine ("整型值 = " + num2); Console.WriteLine ("字符串值 = " + val); Console.WriteLine ("浮点值 = " + num3); } 变量中存储的值取决于该变量的类型
常量 2-1 常量用于在整个程序中将数据保持同一个值 语法: const 数据类型 常量名 = 常量值; Public Private Protected
常量 2-2 const 关键字用于声明常量 声明常量 在表达式中使用常量 static void Main(string[] args) { // PI常量PI const float _pi = 3.14F; // 由地球引力引起的加速度常量,单位为 cm/s*s const float _gravity = 980; // 钟摆的长度 int length = 40; // 钟摆的周期 double period = 0; // 钟摆周期的计算公式 period = 2 * _pi * Math.Sqrt(length / _gravity); Console.WriteLine ("钟摆的周期为 {0} 秒", period); } 声明常量 在表达式中使用常量
C# 的基本数据类型 3-1 C# 中的数据类型分为两个基本类别 值类型 引用类型 表示实际数据 只是将值存放在内存中 值类型都存储在堆栈中 int、char、结构 引用类型 表示指向数据的指针或引用 包含内存堆中对象的地址 为 null,则表示未引用任何对象 类、接口、数组、字符串
被传递的 val 在 Test() 方法内被改变 C# 的基本数据类型 3-2 static void Main(string[] args) { // 声明一个值类型的整型数据类型 int val = 100; Console.WriteLine("该变量的初始值为 {0}", val); Test(val); // 由于该数据类型属于值类型,所以将恢复其初始值 Console.WriteLine("该变量的值此时为 {0}", val); } static void Test(int getVal) int temp = 10; getVal = temp * 20; 将 val 的初始值传递给 Test() 方法 不反映已经改变的 val 值,而保留原始值 被传递的 val 在 Test() 方法内被改变
将 DataTypeTest 的引用传递给 Test() C# 的基本数据类型 3-3 class DataTypeTest { public int Val; } static void Main(string[] args) { DataTypeTest 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; 将 DataTypeTest 的引用传递给 Test() 不反映已经改变的 val 值,而保留原始值 被传递的 val 在 Test() 中改变
装箱和拆箱 2-1 装箱是将值类型转换为引用类型 拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与 Object 类型的值相互转换,将值类型与引用类型链接起来
装箱和拆箱 2-2 装箱 拆箱 int val = 100; object obj = val; 值类型 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); 引用类型 值类型 被装过箱的对象才能被拆箱
运算符和表达式 9-1 Result = number * 100 运算符 运算符和表达式 表达式 操作数 变量 变量 常量 操作数和运算符的组合 操作数
运算符和表达式 9-2 类别 运算符 说明 表达式 算术运算符 + 执行加法运算(如果两个操作数是字符串,则该运算符用作字符串连接运算符,将一个字符串添加到另一个字符串的末尾) 操作数1 + 操作数2 - 执行减法运算 操作数1 - 操作数2 * 执行乘法运算 操作数1 * 操作数2 / 执行除法运算 操作数1 / 操作数2 % 获得进行除法运算后的余数 操作数1 % 操作数2 ++ 将操作数加 1 操作数++ 或++操作数 -- 将操作数减 1 操作数-- 或--操作数 ~ 将一个数按位取反 ~操作数
运算符和表达式 9-3 类别 运算符 说明 表达式 三元运算符(条件运算符) ?: 检查给出的第一个表达式 expression 是否为真。如果为真,则计算 operand1,否则计算 operand2。这是唯一带有三个操作数的运算符 表达式? 操作数1: 操作数2
问题 下面的运算结果是什么? 1、 27 % 5 = 2、 ~11 = 2 -12 为什么?
运算符和表达式 9-4 类别 运算符 说明 表达式 比较运算符 > 检查一个数是否大于另一个数 操作数1 > 操作数2 < 检查一个数是否小于另一个数 操作数1 < 操作数2 >= 检查一个数是否大于或等于另一个数 操作数1 >= 操作数2 <= 检查一个数是否小于或等于另一个数 操作数1 <= 操作数2 == 检查两个值是否相等 操作数1 == 操作数2 != 检查两个值是否不相等 操作数1 != 操作数2
运算符和表达式 9-5 类别 运算符 说明 表达式 成员访问运算符 . 用于访问数据结构的成员 数据结构.成员 赋值运算符 = 给变量赋值 操作数1 = 操作数2 逻辑运算符 && 对两个表达式执行逻辑“与”运算 操作数1 && 操作数2 || 对两个表达式执行逻辑“或”运算 操作数1 || 操作数2 ! 对两个表达式执行逻辑“非”运算 ! 操作数 ( ) 将操作数强制转换为给定的数据类型 (数据类型) 操作数
运算符和表达式 9-6 赋值运算符 (=) 变量 = 表达式; 例如: 身高 = 177.5; 体重 = 78; 性别 = “m”;
运算符和表达式 9-7 一元运算符 (++/--) Variable ++; 相当于 Variable = Variable + 1; 一元运算符 (++/--) Variable ++; 相当于 Variable = Variable + 1; Variable --; Variable = Variable - 1;
运算符和表达式 9-8 运算符 计算方法 表达式 求值 结果(假定 X = 10) += 运算结果 = 操作数1 + 操作数2 X += 5 15 -= 运算结果 = 操作数1 - 操作数2 X -= 5 X = X - 5 5 *= 运算结果 = 操作数1 * 操作数2 X *= 5 X = X * 5 50 /= 运算结果 = 操作数1 / 操作数2 X /= 5 X = X / 5 2 %= 运算结果 = 操作数1 % 操作数2 X %= 5 X = X % 5
运算符和表达式 9-9 C# 运算符的优先级 优先级(1 最高) 说明 运算符 结合性 1 括号 ( ) 从左到右 2 自加/自减运算符 ++/-- 从右到左 3 乘法运算符 除法运算符 取模运算符 * / % 4 加法运算符 减法运算符 + - 5 小于 小于等于 大于 大于等于 < <= > >= 6 等于 不等于 = != 7 逻辑与 && 8 逻辑或 || 9 赋值运算符和快捷运算符 = += *= /= %= -= C# 运算符的优先级
前置和后置自加/自减运算符 表达式 类型 计算方法 结果(假定 num1 的值为 5) num2 = ++num1; 前置自加 前置自减 num1 = num1 - 1; num2 = 4; Num1 = 4; num2 = num1--; 后置自减
问题 计算结果: 1、 int i = 0; bool result = false result = (++i) + i == 2?true:false; result = true
算术运算符 将值赋给变量 在表达式中使用的算术运算符 static void Main(string[] args) { // x2 的系数 int coefficient1 = 2; // x 的系数 int coefficient2 = -7; // 二次方程的常数值 int constant = 3; // 存放表达式 b2 - 4ac 的值 double expression = 0; double x1 = 0; double x2 = 0; Console.WriteLine("二次方程为: {0}x2 + {1}x + {2}", coefficient1, coefficient2, constant); expression = Math.Sqrt(coefficient2 * coefficient2 - (4 * coefficient1 * constant)); x1 = ((-coefficient2) + expression) / (2 * coefficient1); x2 = ((-coefficient2) - expression) / (2 * coefficient1); Console.Write("x = {0:F2} ", x1); Console.Write(" 或 "); Console.WriteLine("x = {0:F2}", x2); } 将值赋给变量 在表达式中使用的算术运算符
选择结构 3-1 选择结构用于根据表达式的值执行语句 if … else 语法: if (<条件>) { <语句块> } else
选择结构 3-2 switch…case 语法: switch (选择变量) { case 值1: … break; case 值2: ... default : }
选择结构 3-3 switch…case 的其他特性 各个 case 标签不必连续,也不必按特定顺序排列 default 标签可位于 switch…case 结构中的任意位置 default 标签不是必选的,但使用 default 标签是一个良好的编程习惯 每两个 case 标签之间的语句数不限
循环结构 循环结构用于对一组命令执行一定的次数或反复执行一组命令,直到指定的条件为真。 循环结构的类型 while 循环 do 循环 for 循环 foreach 循环
while 循环 2-1 车上有几个座位? 检查! 停车! while (seat <= 25) 是! 否!
while 循环 2-2 while 循环反复执行指定的语句,直到指定的条件为真 语法 : break 语句可用于退出循环 { // 语句 } break 语句可用于退出循环 continue 语句可用于跳过当前循环并开始下一循环
do…while 循环 2-1 车上有几个座位? do 检查! 停车! while (seat <= 25) 是! 否!
do…while 循环 2-2 do…while 循环与 while 循环类似,二者区别在于 do…while 循环中即使条件为假时也至少执行一次该循环体中的语句。 语法 : do { // 语句 } while (条件)
for 循环 for 循环要求只有在对特定条件进行判断后才允许执行循环 这种循环用于将某个语句或语句块重复执行预定次数的情形 语法 : { //语句 }
foreach 循环 对班上的每一个学生 计算分数 教 室 计算总分
foreach 循环 2-1 语法: foreach 循环用于遍历整个集合或数组 foreach (数据类型 元素(变量) 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(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); 为所有计数器设置初始值 接受输入 使用了所有输入的字符 之后,循环自动终止 对输入的每一个 字符都进行循环
数组 3-1 数组是同一数据类型的一组值 数组属于引用类型,因此存储在堆内存中 数组元素初始化或给数组元素赋值都可以在声明数组时或在程序的后面阶段中进行 语法: 数据类型[元素个数] 数组名称; int[6] arrayHere;
数组 3-2 78 (0) 67 (1) 89 (2) 92 (3) 66 (4) 学生分数的整数数组 数组位置 Joe Tom Lee Jim Bill 职员姓名的字符串数组 23.5 18.9 27.3 21.4 29.6 室温的浮点数组
数组 3-3 数组声明 初始化数组元素的循环 显示输出的循环 static void Main(string[] args) { int count; Console.WriteLine("请输入您要登记的学生人数 "); count=int.Parse(Console.ReadLine()); // 声明一个存放姓名的字符串数组,其长度等于提供的学生人数 string[] names = new string[count]; // 用一个 for 循环来接受姓名 for(int i=0; i<count; i++) Console.WriteLine(“请输入学生 {0} 的姓名 ",i+1); names[i]=Console.ReadLine(); } Console.WriteLine("已登记的学生如下: "); // 用 foreach 循环显示姓名 foreach(string disp in names) Console.WriteLine("{0}", disp); 数组声明 初始化数组元素的循环 显示输出的循环
所有与 Student 关联的详细信息都可以作为一个整体进行存储和访问 结构 自定义数据类型 可以在其内部定义方法 无法实现继承 属于值类型 主要结构: struct student { public int stud_id; public string stud_name; public float stud_marks; public void show_details() //显示学生详细信息 } 数据成员 struct structEx { public int structDataMember; public void structMethod1() //structMethod1 实现 } 方法 所有与 Student 关联的详细信息都可以作为一个整体进行存储和访问
枚举 枚举(Enum,Enumerator 的缩写)是一组已命名的数值常量 用于定义具有一组特定值的数据类型 枚举以 enum 关键字声明 public class Holiday { public enum WeekDays Monday, Tuesday, Wednesday, Thursday, Friday } public void GetWeekDays (String EmpName, WeekDays DayOff) //处理工作日 static void Main() Holiday myHoliday = new Holiday(); myHoliday.GetWeekDays ("Richie", Holiday.WeekDays.Wednesday); Wednesday = 2
枚举(续) C# 中的枚举包含与值关联的数字 默认情况下,将 0 值赋给枚举的第一个元素,然后对每个后续的枚举元素按 1 递增 在初始化过程中可重写默认值 public enum WeekDays { Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5 }
总结 2-1 变量是存放特定数据类型的值的容器,而常量也存放特定数据类型的值,但常量在整个程序中都保持一致 装箱是将值类型转换为引用类型,而拆箱则是将引用类型转换为值类型 C# 提供了以下类型的选择结构: if if…else switch…case
总结 2-2 C# 提供了以下类型的循环结构: 数组是可将同一类型的多个数据元素作为单个实体存放的一种数据结构 while 循环 do 循环 for 循环 foreach 循环 数组是可将同一类型的多个数据元素作为单个实体存放的一种数据结构 C# 中的结构可以在其内部定义方法并可包括一个构造函数 枚举是一组已命名的数值常量