C习题参考答案 c面向对象程序设计 郑宇军.doc_第1页
C习题参考答案 c面向对象程序设计 郑宇军.doc_第2页
C习题参考答案 c面向对象程序设计 郑宇军.doc_第3页
C习题参考答案 c面向对象程序设计 郑宇军.doc_第4页
C习题参考答案 c面向对象程序设计 郑宇军.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题参考答案Chapter 11_1 对象 客观世界中的事物都是对象,包括有形的物理对象,可感知的逻辑实体,以及概念化的抽象实体。它有自己的属性,能够执行特定的操作。 类 具有相同属性和操作的一组对象的集合;它描述的不是单个对象,而是“一类”对象的共同特征。其重要性在于它是面向对象技术中最重要的结构,它支持信息隐藏和封装,进而支持对抽象数据类型(ADT)的实现。1_2 略1_3 参考图如下图11_4 UML与面向对象 UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它溶入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。标准建模语言UML适用于以面向对象技术来描述任何类型的系统,而且适用于系统开发的不同阶段,从需求规格描述直至系统完成后的测试和维护。Chapter 22_1 程序的功能一般通过方法代码来实现。每个方法都是从其第一行代码开始执行,直至最后一行代码结束,期间可以通过代码来调用其他的方法,从而完成各式各样的操作。C#程序的起点是由Main方法定义的,程序总是从Main方法的第一行代码开始执行,在Main方法结束时停止运行。2_2 略(注:不同版本的Visual Studio的菜单项有所区别)2_3 略(注:不同版本的Visual Studio引用的程序集有所区别)2_4 C#源代码会被编译为一种通用的中间语言(IL)代码,该语言类似于低级语言,但其代码与具体的硬件平台无关;之后CLR再针对特定的平台将IL程序翻译为机器指令,加载所需要的资源并管理执行。2_5/动态链接库程序using System;namespace p2_5 class Adder public static int Add(int a, int b) return a+b; /控制台应用程序using System;using p2_5;namespace P2_6 class Program static void Main() Console.WriteLine(请输入两个数:); int a = int.Parse(Console.ReadLine(); int b = int.Parse(Console.ReadLine(); Console.WriteLine(0+1=2, a, b, Adder.Add(a+b); Chapter 33_1 略3_2 第一:值类型的变量直接包含自身的所有数据,每创建一个变量,就在内存中开辟一块区域;只有通过变量才能修改它所包含的数据。而引用类型的变量只存储对目标数据的引用,每创建一个变量,就增加一个指向目标数据的指针;有可能出现多个引用类型的变量指向同一份数据的情况,这时修改一个变量就会影响到其它所有的变量。 第二:作为方法参数时,值类型变量传递的是数值,引用类型变量传递的是地址,因此如果方法的执行代码修改了变量,对值类型的变量不会有影响,但会改变引用类型的变量。 第三:装箱是将一个值类型转换为一个对象类型(object),而拆箱则是将一个对象类型显式转换为一个值类型。3_3 略3_4 对整数为真,对实数不一定,因为实数受到计算机精度的影响。3-5 四次执行的结果分别是:3,6,-6,-33-6 当两个操作数均为布尔类型时,与运算“&”和逻辑与运算“&”的求值效果相同,或运算“|”和逻辑或运算“|”的求值效果相同。但异或运算“”不存在对应的条件逻辑运算。3-7 不是。if-else可进行任意分支,而“?:”操作符要求第二和第三个操作数的类型必须一致。3-8 class Program static void Main(string args) Console.WriteLine(按任意键退出,其它键继续); while(Console.ReadKey().KeyChar!=Q) Console.WriteLine(请输入本金:); double x = double.Parse(Console.ReadLine(); Console.WriteLine(请输入利率:); double y = double.Parse(Console.ReadLine(); Console.WriteLine(请输入存款年数:); double z = double.Parse(Console.ReadLine(); Console.WriteLine(本息合计为:); for (int i=0; iz; i+) x= x + x*y; Console.WriteLine(x); Console.WriteLin(按任意键退出,其它键继续); Console.ReadLine(); 3-9 (1)class Program static void Main(string args) Console.WriteLine(Please input a number:); int n = int.Parse(Console.ReadLine(); int i = 1, x = 1; while (i = n) x = x * i; i+; Console.WriteLine(x); Console.ReadLine(); (2)class Program static void Main() Console.WriteLine(Please input a number:); int n = int.Parse(Console.ReadLine(); int i = 1, x = 1; do x = x * i; i+; while (i = n); Console.WriteLine(x); Console.ReadLine(); (3)class Program static void Main() Console.WriteLine(Please input a number:); int n = int.Parse(Console.ReadLine(); int x = 1; for (int i = 1; i = n; i+) x = x * i; Console.WriteLine(x); Console.ReadLine(); 3-10 略 3-11 class Program static void Main() Console.WriteLine(请输入一个字符串:); Console.WriteLine(Simp(Console.ReadLine(); public static string Simp(string s) StringBuilder sb1 = new StringBuilder(); for (int i = 0; i s.Length; i+) while (i s.Length - 1 & si = si + 1) i+; sb1.Append(si); return sb1.ToString(); 3-12(1)class Program static void Main() int sum = 0; for (int i = 1; i = 50; i+) sum += 2*i; Console.WriteLine(sum); Console.ReadLine(); (2) class Program static void Main() int sum = 0, m = 1; for (int i = 1; i (ComplexNumber c1, ComplexNumber c2) double a = c1.x*c1.x + c1.y*c1.y; double b = c2.x*c2.x + c2.y*c2.y; return a b; public static bool operator =(ComplexNumber c1, ComplexNumber c2) return a = b | a b; public static bool operator = c2); public static bool operator c2); 4_5 不能,因为this表示当前对象,而静态成员是通过类型本身而非对象来访问的。4_6 如果字符串格式错误的几率很小,使用Parse方法具有更高的效率;否则应选用TryParse方法来提高程序的可靠性。4_7 略4_8 public int GetAge(DateTime birthday) int y = DateTime.Year, m = DateTime.Month, d = DateTime.Day; if (d birthday.Day) m-; if (m = size) free -= size; else Console.WriteLine(剩余空间不足!); public virtual void Delete(float size) if (free + size 0; i-) for (int j = 0; j 0) Student s = studentsj; studentsj = studentsj + 1; studentsj + 1 = s; foreach (Student s in students) Console.WriteLine(s);6_3 public static void WriteDelegateInfo(Delegate dg) if (dg = null) return; Console.WriteLine(MethodName: 0, dg.Method.Name); Console.WriteLine(MethodBelongType: 0, dg.Method.DeclaringType); Console.WriteLine(Target: 0, dg.Target); foreach (Delegate dg in dg3.GetInvocationList() Console.WriteLine(dg.Method); Console.WriteLine(dg.Target); 6_4 输出为:2, 3, 46_5 匿名方法可以把一段代码直接作为参数使用,而无需显式地定义方法的原型。通过捕获外部变量,匿名方法还能够实现与外部程序的状态共享。这不仅能够简化程序,提高了代码的可维护性,还大大方便了程序中的各种计算。6_6 事件是委托类型的对象,事件的触发方法是该对象的客户,而事件的处理方法是该对象提供的服务。6_7 旅行团所关联的导游和负责业务员是明确的,可以在改变状态的方法代码中访问这些导游和业务员对象。而旅行团所关联的游客可能不断变化,采用发布/订阅方式能够方便地通知所有绑定的游客。6_8 略Chapter 77_1 可从以下几方面考虑:(1)合理布局:在左上方或正上方提供车次和站名的输入控件,在中央显示查询结果。 (2)方便导航:在查询结果中,通过单击车次和站名可直接显示相关信息。 (3)简化输入:允许用户通过简拼或双拼等方式来输入中文站名。 (4)撤销和恢复:允许用户回退到上次查询。 (5)等待响应:查询时间较长时,显示等待光标,还可先显示部分查询结果。7_2 对于不常用的字体族,创建其Font对象时要先检查用户计算机上是否安装了该字体。必要时可随程序安装字体。7_3 在窗体尺寸改变事件中,通过Form对象的Height属性来进行控制。7_4 通过文本框的KeyPress事件来进行控制:void textBox1_KeyPress(object sender, KeyPressEventArgs e) int ch = e.KeyChar; if (ch57 & ch!=8) e.Handled = false;7_5 略7_6 如果增加之后的数值超过控件的Maximum,第二行代码执行后会发生异常,而第一行代码会使控件中的数值等于Maximum。7_7 略7_8 提示:可参考MSDN帮助中的Control控件文档。7_9 主要方面有:(1)业务对象与窗体界面绑定,通常是在窗体类中定义一个业务对象类型的字段成员,通过窗体初始化事件的处理代码来将对象信息显示在窗体控件中。(2)在保存对象信息时,通常要检查窗体控件中对应的输入信息是否完整和合法,否则应要求用户重新输入。(3)如果要在不同的窗体间传递对象,那么可将对象变量作为目标窗体的构造函数参数,通过其构造函数来初始化对应的对象字段。(4)如果多个窗体共享一个对象信息,那么在其中一个窗体修改了对象信息后,应及时更新其它窗体的显示内容。Chapter 88_1 以1000000以内的int值为例:static void Main() FileStream fs1 = new FileStream(num.txt, FileMode.Create); for (int a = 1, b = 1; a = 1000000; a += b) int t = b; b = a; a = t; int x = a/(224); fs1.WriteByte(byte)x); /写入2532位 a -= x; x = a/(216); fs1.WriteByte(byte)x); /写入1724位 a -= x; x = a/(28); fs1.WriteByte(byte)x); /写入916位 a -= x; fs1.WriteByte(byte)x); /写入18位 fs1.Position = 0; Console.Write(请输入要读取的数列项: ); int i = int.Parse(Console.ReadLine(); fs1.Position = 4 * i; int y = 16777216*fs1.ReadByte() + 65536*fs1.ReadByte() + 256*fs1.ReadByte() + fs1.ReadByte(); Console.WriteLine(数列项为: + y); fs1.Close(); 8_2 提示:创建一个文本文件,在窗体的关闭事件中向文件写入当前时间,在窗体的启动事件中读取上次写入时间。8_3 在控制台逐行依次输出48578_4 二进制方式对文件的存取效率较高,但编程更为复杂,需要处理字节类型与其它各种类型之间的转换。文本方式存取文件速度较慢,占用的磁盘容量也较大,但编程更为简单,只需要把各种类型都按字符串格式处理即可。8_5 略8_6 应在显示对话框之前设置的属性主要有:Filter、FilterIndex、InitialDirectory、RestoreDirectory、Multiselect、OverwritePrompt;之后设置的属性主要有FileName有FileNames。8_7 在写入每个对象时,应首先将对象的类型名写入文件;在读取文件时,首先读取类型名,再根据不同的类型来使用构造函数创建对象。8_8 在写入文件流时,可通过一个密钥字符来对文件的每个字节进行加密,即将字节与密钥字符进行与或运算后写入文件,读取时再与密钥字符进行一次与或运算来进行解密:public void Save(BinaryWriter writer, char key) char chs = new char_username.Length; for (int i=0; ichs.Length; i+) chsi = _usernamei key; writer.Write(chs); chs = new char_password.Length; for (int i=0; ichs.Length; i+) chsi = _passwordi key; writer.Write(chs); writer.Write(_staffId key);public static User Load(BinaryReader reader, char key) string username = reader.ReadString(); char chs1 = new charusername.Length; for (int i=0; iusername.Length; i+) chs1i = usernamei key; string password = reader.ReadString(); char chs2 = new charpassword.Length; for (int i=0; iusername.Length; i+) chs2i = passwordi key; int staffId = reader.ReadInt32(); return new User(chs1, chs2, staffId key);8_9 提示:要管理用户登录系统的记录,可为每个用户创建一个文本文件(如“用户ID”+“.log”),在其中记录用户各次登录的时间信息。Chapter 99_1 try-catch:正常情况下执行try代码段中的语句,出现异常就转而执行catch代码段中的语句。如果catch语句限定了异常类型,那么只有指定异常发生时转入catch代码段,否则不作处理。try-catch-finally:执行情况和try-catch结构类似,但不论是否发生异常,程序最后都会执行finally语句中的代码段。finally语句应放在所有catch语句之后,且只能出现一次。try-catch:实际上不进行异常处理。正常情况下执行try代码段中的语句,出现异常后则在执行完finally代码段之后引发异常。9_2 输出发生参数异常9_3 对于常量表达式,如果使用checked操作符强制对表达式进行类型检查,或是在编译时指定了“/checked+”选项,那么发生溢出的表达式将不能通过编译。如果不要求检查,那么执行到发生溢出的表达式就会引发OverflowException异常。对于一般运算表达式,执行到发生溢出的表达式都会引发OverflowException异常。表达式发生溢出主要是指整数变量的范围超出了其类型的最大/最小取值范围,如对取值为30000的short型变量加10000,或是将1000强制转换为byte型变量。9_4 打开文件时可能引发的异常主要有:(1)DirverNotFoundException:指定的磁盘分区不存在。(2)DirectoryNotFoundException:指定的文件目录不存在。(3)FileNotFoundException:指定的文件不存在。(4)FileLoadException:加载文件内容失败。如果文件是用于记录程序相关信息,那么在打开文件失败时应创建新文件;如果用户需要使用程序来编辑文件内容,那么应向用户报告错误并由用户选择相应的处理方式。9_5 略9_6 略Chapter 1010_1 抽象类和接口都不能被实例化,抽象类中的抽象方法和接口中的接口方法都只有方法声明,而没有执行体。抽象方法和接口方法都需要在具体的派生类中提供实现。抽象类可以有成员字段和非抽象方法,但接口不能。即接口是比抽象类更为“抽象”的一种数据类型。10_2 如果需要通过对象实例来调用方法,那么应采用隐式实现的方式。如果要区别不同接口的同名方法,那么应采用显式实现的方式,并在调用时先将对象转换为对应的接口类型。10_3 不能,必须是重载基类中的虚拟方法才能使用override修饰符。10_4 略10_5 组合框和列表框的元素集合都实现了ICollection接口,那么可以创建一个ArrayList或List列表对象,将元素集合作为参数传递给列表对象的构造函数,而后调用列表对象的Sort方法进行排序。10_6 略10_7 包括二叉树节点类型BTNode和二叉树类型BinaryTree两部分,参考代码如下。 / / 二叉树节点类型 / public class BTNode private object value; private BTNode left, right; public object Value get return this.value; set this.value = value; public BTNode Left get return left; set left = value; public BTNode Right get return right; set right = value; public BTNode(object obj) value = obj; / / 二叉树类型 / class BinaryTree : ICollection private BTNode root; public BTNode Root get return root; public int Count get return PreTraverse(root).Length; private BinaryTree() this.root = null; public BinaryTree(object obj) this.root = new BTNode(obj); public BinaryTree(BTNode root) this.root = root; public void CopyTo(Array array, int index) PreTraverse(root).CopyTo(array, index); IEnumerator IEnumerable.GetEnumerator() return PreTraverse(root).GetEnumerator(); bool ICollection.IsSynchronized get return false; object ICollection.SyncRoot get return null; public static object PreTraverse(BTNode node) /前序遍历 if (node = null) return null; ArrayList nodes = new ArrayList(); nodes.Add(node.Value); if (node.Left != null) nodes.AddRange(PreTraverse(node.Left); if (node.Right != null) nodes.AddRange(PreTraverse(node.Right); return nodes.ToArray(); public static object InTraverse(BTNode node) /中序遍历 if (node = null) return null; ArrayList nodes = new ArrayList(); if (node.Left != null) nodes.AddRange(InTraverse(node.Left); nodes.Add(node.Value); if (node.Right != null) nodes.AddRange(InTraverse(node.Right); return nodes.ToArray(); public static object PostTraverse(BTNode node) /后序遍历 if (node = null) return null; ArrayList nodes = new ArrayList(); if (node.Left != null) nodes.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论