发布时间 : 星期六 文章C#习题参考答案 《c#面向对象程序设计》 郑宇军更新完毕开始阅读b71fec2e0066f5335a8121cd
+“.log”),在其中记录用户各次登录的时间信息。
Chapter 9
9_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 10
10_1 抽象类和接口都不能被实例化,抽象类中的抽象方法和接口中的接口方法都只有方法声明,而没有执行体。抽象方法和接口方法都需要在具体的派生类中提供实现。
抽象类可以有成员字段和非抽象方法,但接口不能。即接口是比抽象类更为“抽象”的一种数据类型。
10_2 如果需要通过对象实例来调用方法,那么应采用隐式实现的方式。如果要区别不同接
口的同名方法,那么应采用显式实现的方式,并在调用时先将对象转换为对应的接口类型。
10_3 不能,必须是重载基类中的虚拟方法才能使用override修饰符。 10_4 略
10_5 组合框和列表框的元素集合都实现了ICollection接口,那么可以创建一个ArrayList或List
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.AddRange(PostTraverse(node.Left)); if (node.Right != null)
nodes.AddRange(PostTraverse(node.Right)); nodes.Add(node.Value); return nodes.ToArray();
}
public static BinaryTree EmptyBinaryTree {
get { return new BinaryTree(); } } }
class Program {
static void Main() {
BinaryTree tree1 = new BinaryTree(1); int i = 1;
BTNode r = tree1.Root; while (i < 100) {
r.Left = new BTNode(i * 2); r.Right = new BTNode(i * 3); if (i % 2 == 1) {
r = r.Left; i = i * 2; } else {
r = r.Right; i = i * 3; } }
object[] result = BinaryTree.PreTraverse(tree1.Root); Console.WriteLine(\前序遍历:\ foreach (object obj in result) Console.Write(obj.ToString() + ','); Console.WriteLine(\中序遍历:\
result = BinaryTree.InTraverse(tree1.Root); foreach (object obj in result) Console.Write(obj.ToString() + ','); Console.WriteLine(\后序遍历:\
result = BinaryTree.PostTraverse(tree1.Root); foreach (object obj in result) Console.Write(obj.ToString() + ','); } }
10_8 略
Chapter 11
11_1 略
11_2 泛型类A使用的类型参数S在A中没有定义,应将其改为
B
11_3 输出内容如下: 2 : A's System.Int32 2 : B's System.Int32 2.5 : B's System.Double