330 likes | 532 Views
第 2 章 C# 编程基础. 主要内容与学习目标. 主要内容: (1) 变量与常数、声明变量、给变量赋值、读取变量的值、 MessageBox.Show 方法、连接字符串、换行符。 (2) 基本数据类型、整型、读取从文本框中输入的值、将计算结果显示在文本框中、将数字字符串转换为整数、异常 ( 格式异常、溢出异常 ) 处理。 (3) 字符数据类型、将指定字符串转换为字符、将字符转换为字符串、 Char 数据类型和数值类型之间的转换、 Char.IsLetter 方法、 Char.IsDigit 方法。
E N D
主要内容与学习目标 • 主要内容: • (1)变量与常数、声明变量、给变量赋值、读取变量的值、MessageBox.Show方法、连接字符串、换行符。 • (2)基本数据类型、整型、读取从文本框中输入的值、将计算结果显示在文本框中、将数字字符串转换为整数、异常(格式异常、溢出异常)处理。 • (3)字符数据类型、将指定字符串转换为字符、将字符转换为字符串、Char数据类型和数值类型之间的转换、Char.IsLetter方法、Char.IsDigit方法。 • (4)非整型数据类型、Single.Parse(s)方法、Decimal.Parse(s)方法、格式化字符串、求幂运算、非整数数据类型比较。 • (5)格式化输出。 • (6)算术表达式与算术运算符、算术运算符优先级规则。 • (7)基本数据类型的相互转换、隐式数值转换、显式转换。 • (8)bool类型变量、关系运算符、关系表达式、关系表达式的值。 • (9)面向对象程序设计初步、类和对象、消息和方法、创建自己的类、声明类、声明字段、了解修饰符private和public、声明方法、声明对象与创建对象、调用方法。 • (10)局部变量、局部变量的作用范围和实例字段的作用范围。 • 学习目标: • (1)掌握变量与常数的含义、声明和使用。 • (2)了解数据类型及使用。 • (3)了解数据类型的转换及溢出。 • (4)初步掌握MessageBox.Show方法的使用。 • (5)掌握如何向项目中添加类和引用。 • (6)掌握赋值运算符的使用。 • (7)掌握算术运算符和关系运算符的使用。 • (8)初步掌握类和对象的使用。
2.1 变量与常数 • 2.1.1 变量的含意 • 2.1.2 变量声明 • 2.1.3 常数
2.1.1 变量的含意 • 假设有两数为x、y,我们想求出两者之和,这在数学中表示为:x+y。 • 要在程序中计算x、y的和,我们必须首先声明将要指定给它们的数据类型。为其赋 • 值之后,才能计算其和。 • 假设x、y都是整数。为了声明指定给它们的数据类型是整数,可编写如下语句: • int x; • int y; • 进行此声明后,即为x和y分配了存储数据值的存储位置,内存状态如图2.1所示。 • 这些存储位置称为“变量”。而x和y是与存储位置关联的名称,称为变量名。做 • 出上述声明之后,x和y的值只能是整数值。我们使用赋值运算符“=”给x和y赋值。例如: • x = 100; • y = 98; • 此时x的值是100,y的值是98。内存状态如图2.2所示。
2.1.2 变量声明 • 在C#中,使用变量之前,必须首先声明它。声明变量的一般格式为: • 数据类型 变量名; • 任务2.1 计算路程 • 问题描述: • 有一辆汽车每小时可以行驶x公里,欲计算y小时能行驶多少公里(假设x和y均为整数)。编写一程序解决该问题。 • 解决此问题需要使用公式:路程 = 速度 × 时间。 • 要编写解决该问题的程序,可以使用3个变量:v、t和s。变量v用于存放速度的值,变量t用于存放时间的值,变量s用于存放路程的值。
2.1.3 常数 • 1. 常数的含义 • 2. 声明常数 • 注意:尽管常数与变量有些相像,但不能像变量一样更改其值或给它们赋新值。
2.2 基本数据类型 • 每个变量都具有一个类型,以确定哪些值可以存储在该变量中。 • 2.2.1 整型 • 2.2.2 字符数据类型 • 2.2.3 非整型 • 2.2.4 格式化输出 • 2.2.5 算术运算 • 2.2.6 基本数据类型的相互转换 • 2.2.7 算术溢出及显式转换溢出 • 2.2.8 布尔类型
2.2.1 整型 • C#支持9种整型:sbyte(8位有符号整型)、byte(8位无符号整型)、short(16位有符号整型)、ushort(16位无符号整型)、int(32位有符号整型)、uint(32位无符号整型)、long(64位有符号整型)、和ulong(64位无符号整型)。 • 如果整数表示的值超出了 ulong 的范围,就会产生编译错误。 • 如果某个变量总是存储整数而不是带小数的数字,则将它声明为以上类型中的一种。没有一个数值类型是存放在单个字节中的。但有时数据要存放成字节,必须能访问各个字节。这时该数据可存放在byte、sbyte类型的变量中,如果某个变量包含二进制数据或未知种类的数据,则将其声明为byte类型。 • 任务2.2:整数相乘 • 主要知识点:①读取从文本框中输入的值。②将计算结果显示在文本框中。③将数字字符串转换为整数。④异常(格式异常、溢出异常)处理。 • 问题描述:用户从键盘输入整数(如图2.7所示),当单击【相乘】按钮时,计算它们的积,并显示结果。 • 1. 创建项目和窗体 • 2. 编写应用程序的代码 • 3. 测试应用程序
2.2.2 字符数据类型 • 字符数据类型char用来处理Unicode字符。Unicode 字符是 16 位字符,用于表示世界上多数已知的书面语言。char变量以无符号的16位(两个字节)数字的形式存储,取值范围为0到65535。每个数值代表一个Unicode字符。 • Unicode的前128个数值(0~127)对应于标准美国键盘上的字母和符号。这前 128 个数值与ASCII字符集中定义的数值相同。随后的128个数值(128到 255)表示特殊字符,如拉丁字母、重音符号、货币符号以及分数。其余的数值用于表示不同种类的符号,包括世界范围的各种文本字符、音调符号以及数学和技术符号。 • 任务2.3:字符检 • 问题描述:从键盘输入一个字符,检查输入字符是否为字母字符或数字,如果不是,则输出“输入的字符不是字母字符或数字”。如果输入的字符是字母字符,则输出该字母字符的整数值。在任何一种情况下,都会显示适当的消息。 • 解决方案: • 1. 创建项目和窗体 • 2. 编写应用程序的代码 • 3. 测试应用程序
2.2.3 非整型 • 非整型数据类型是同时使用整数部分和小数部分来表示数值的类型。非整型数据类型有:float(7位有效位)、double(15到16位有效位)和decimal(28到29位有效位)。 • 它们都是有符号类型。如果某个变量可以包含小数,则将其声明为这些类型之一。 • 如果希望实数被视为非整型类型,请使用文本类型字符,文本类型字符用M表示 decimal,用F表示float,用D表示double。 • 任务2.4:贷款计算器 • 主要知识点:①Single.Parse(s)方法。②Decimal.Parse(s)方法。③格式化字符串。④求幂运算。 • 问题描述:编写一贷款计数器程序(如图2.9所示),对于特定的贷款数量、年利率和贷款周期,计算月付款和总付款。 • 计算月付款的公式为:月付款=p*r/(1-(1+r)-n) • 其中p为贷款金额;r为月利率(年利率除以12),以0到1(100%)之间的数给出;n是还完贷款需要的时间(以月为单位)。 • 解决方案: • 1. 创建项目和窗体 • 2. 编写应用程序的代码 • 3. 测试应用程序
2.2.4 格式化输出 • 可通过调用String.Format方法格式化输出信息。String.Format方法的一般格式为: • String.Format(formats, 参数列表); • 其中formats为包含一个或多个格式规范{N, M: Sn}的字符串,String.Format方法返回formats字符串,只不过将formats字符串中的第一个格式规范替换为参数列表中的第一个参数的值(该值被转换为字符串),第二个格式规范替换为参数列表中的第二个参数的值(该值被转换为字符串),依此类推。 • 在格式规范{N, M: Sn}中,N是从零开始的整数,表示要格式化的参数,0表示要格式化的参数是参数列表中的第一个参数,1表示要格式化的参数是参数列表中的第二个参数,依此类推。M是整数(可选),指示包含格式化值的区域的宽度,剩余部分用空格填充。如果 M 的符号为负,则格式化值在区域中左对齐;如果 M 的符号为正,则该值右对齐。S是格式字符(可选),n为整数(可选),指定小数位数。在格式规范{N, M: Sn}中,只有N是必需的,其他两项可有可无。 • 格式化输出说明如表2.3所示。
2.2.5 算术运算 • 1. 算术表达式与算术运算符 • 在前面的示例中,op1*op2、op1/op2、5/3 都是算术表达式,因为它们都由算术运算符和操作数组成。算术运算符(如*)指定了数值计算。表2.4归纳了C#中所使用的算术运算符。 • 2. 算术运算符优先级规则 • 在C#中,算术运算符优先级规则与我们所学的标准代数中的算术运算规则是一样的。如表2.5所示。
2.2.6 基本数据类型的相互转换 • 程序中在给变量赋值或进行数据间混合运算时,要注意所赋值的数据类型是否与变量的数据类型一致、进行混合运算的数据的类型是否一致。如果它们的类型不同,则有两种情况:隐式转换和显式转换。下面我们对隐式转换和显式转换进行讨论。 • 1. 隐式数值转换 • 表2.6显示了预定义的隐式数值转换。隐式转换可能在多种情形下发生,包括在赋值语句中和数据间混合运算时及调用方法时。 • 前面讲过数据间混合运算时,可能发生隐式转换,称为“数据提升”的隐式转换应用于算术操作符的操作数。提升基于表2.7的规则,这种转换之所以称为“提升”,是因为操作数是从低精度转换为高精度。 • 2. 显式转换 • 任务2.5:隐式和强制数值转换 • 问题描述:创建一简单的程序,测试隐式和强制数值转换。
2.2.7 算术溢出及显式转换溢出 • 算术运算符(+、-、*、/)产生的结果及显式数值转换的结果可能会超出目标类型可能值的范围。在一般情况下:可能会丢失数据或引发异常。 • 任务2.6:算术溢出及显式转换溢出 • 问题描述:创建一简单的程序,测试算术溢出及显式转换溢出。
2.2.8 布尔类型 • bool数据类型是被解释为true 或false的无符号值。如果某个变量只能包含“真/假”、“是/否”或“开/关”信息,则将它声明为bool类型。 • bool没有文本类型字符。 • 关系运算符都返回bool类型的结果。 • 关系运算符为==、!=、<、>、<=和>=,关系运算符将值彼此比较,结果为一bool类型的值,详见表2.8。 • 任务2.7:数值比较 • 问题描述:创建一简单的程序,测试布尔型变量、关系运算符及关系表达式。
2.3 面向对象程序设计初步 • 2.3.1 类和对象 • 2.3.2 消息和方法 • 2.3.3 使用现有的类 • 2.3.4 创建自己的类
2.3.1 类和对象 • 面向对象程序设计中两个最重要的概论是类和对象。从广义的术语来讲,对象是一个可以想象的物体,它既可是有形的也可是无形的。对象具有属性。例如,按钮或标签之类的GUI对象具有属性,属性是对象的特性。如按钮具有名称、宽度、高度和标题等属性。窗口具有名称、宽度、高度、标题和背景颜色等属性。对象具有行为方式(方法),它们用来描述对象可以执行的操作。例如,按钮可以被禁用、可以设置标题。标签可以显示文本。窗口可以改变大小,还可以出现或消失。表2.9列出了某些GUI对象及其属性和方法。 • 又如,人具有姓名、性别、年龄等属性。 • 类是对象的符号表示形式,它是计算机用来创建对象的模板。与蓝图描述构成建筑的项一样,类以同样的方式描述组成对象的属性和方法等。就像一幅蓝图可以用于建成多座建筑一样,一个类也可以用于根据需要创建多个对象。如果使用蓝图类比,类就是蓝图,对象就是基于该蓝图的建筑。又如人是一个类,你是人,我是人,都是人类的实例或称对象。一个类描述一类事物,描述这些事物所应具有的属性,如人有姓名、性别、年龄等属性。一个对象是类的一个实例,它具有确定的属性值,如王飞(人的实例)年龄是20,性别是男。人类只有一个,人类的实例可以有无数多个。
2.3.2 消息和方法 • 在编写面向对象程序的过程中,我们首先定义类,当程序开始运行时,由这些类创建对象以完成任务。任务可以是计算月付款、计算总付款、格式化字符串等。为了命令类或对象执行一项任务,我们要为其发送一个消息,例如,我们发送消息pow给Math类,以计算指数。 • 处理消息的类或对象必需相应编程,不能将消息随便发送给一个类或对象,而只能将消息发送给能够理解这个消息的类或对象。处理所收到消息的类或对象必须有对应的方法,也就是类或对象为完成一项任务而执行的指令序列。只能有对象调用的方法为实例方法,否则是静态方法,静态方法将在第5章详细讲述。向对象发送消息使对象调用方法,向类发送消息将调用类的方法。注意,发送给类或对象的消息必须与方法的名称相同。向类或对象发送调用方法的消息,可能以参数的形式来发送值。 • 再看一个静态方法的例子。Math类定义了静态方法pow,该方法按参数指定的值,计算指数。由于Math类有静态方法pow的定义,我们可以向Math类发送pow消息,按参数指定的值,计算指数。如以下代码计算23的值,并赋给变量b: • double b = Math.pow(2,3); • 图2.14描述了消息的发送过程。 • 方法可能返回值也可能不返回值,这要看方法的定义。在后面的章节中我们将讲述方法的定义。
2.3.3 使用现有的类 • 前面章节我们已经使用了.NET类库中的类,如Math类、MessageBox类。下面我们使用.NET类库中的类String。 • 1. String类 • 任务2.8:文字游戏 • 编写一个与用户一起玩的Eggy-Peggy文字游戏的应用程序,该程序把用户指定的字符串转换为新字符串,在指定字符串的所有元音字母前增加“egg”单词。如图2.15所示。 • 2. String类的常用属性及方法
2.3.4 创建自己的类 • 到目前为止,我们已经编写的示例应用程序都仅包含一个类,即程序的主程序类,而主程序类只有一个方法,即Main方法。在这个Main方法中,我们仅使用.NET类库中的一些预先定义的类。对于简单的小程序,这种配置是可以接受的。但对于大型程序,则不可以接受,其主要原因有如下两个: • 将一个大型应用程序的全部代码放入一个单独的Main方法中将使得该方法非常巨大,而且程序很难管理和扩展。 • 预先定义的类本身不能够满足编写大型应用程序过程中的所有程序设计要求。 • 现在我们开始学习如何编写更复杂应用程序所需要的类,这些类通常不具有Main方法,而具有自己的属性和方法。要创建一个完整的程序,我们需要把几个类组合起来,其中某一个类具有Main方法。 • 任务2.9:使用可实例化类的贷款计算器 • 前面我们曾经编写过一个贷款计算器程序。对于给定的贷款数量、年利率和贷款周期,计算月付款和总付款,那里使用简化的程序结构编写程序,它只有一个主程序类,带有一个Main方法。这里再次实现该程序,但是这次将使用一个称为“LoanCalculator”的可实例化类。 • 问题描述: 编写一贷款计算器程序,对于特定的贷款数量、年利率和贷款周期,计算月付款和总付款。 • 为了使读者容易理解该示例所包含的概念、原理和方法,我们来讲解该程序的创建。 • 1. 创建贷款计算器类的简单版本 • 2. 创建完整定义贷款计算器的类