C#程序设计及应用教程(第2版)课后答案_人民邮电出版社_....doc_第1页
C#程序设计及应用教程(第2版)课后答案_人民邮电出版社_....doc_第2页
免费预览已结束,剩余4页可下载查看

下载本文档

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

文档简介

c#程序设计及应用教程(第2版)课后答案 人民邮电出版社 (马俊、邓居英.txt心态决定状态,心胸决定格局,眼界决定境界。当你的眼泪忍不住要流出来的时候,睁大眼睛,千万别眨眼,你会看到世界由清晰到模糊的全过程。 本文由stone_小石头贡献 pdf文档可能在wap端浏览体验不佳。建议您优先选择txt,或下载源文件到本机查看。 习题 1 参考解答 1、可以用 c#编写哪些类型的应用程序? 【解答】 1)控制台应用程序。 2) windows 应用程序。 3) asp.net web 应用程序。 4) asp.net web 服务应用程序。 5) asp.net 水晶报表 web 应用程序。 6)智能设备应用程序。 7)安装和部署应用程序。 2、什么是命名空间?命名空间和类库的关系是什么? 【解答】 1)命名空间是对类的一种逻辑上的分组, 即将类按照某种关系或联系划分到不同的命名 空间下。 2)命名空间又可以包含其它的命名空间,例如 system.windows.forms,是指 system 命名空间下有 windows 命名空间,windows 命名空间下有 forms 命名空间。 3)所有类库都在规定的命名空间下。 3、举例说明 using 关键字有哪些主要用途。 【解答】 在 c#中,using 关键字有 3 个用途 1)指定引用的命名空间,例如:using system.windows.forms; 2)简化命名空间的层次表达形式,例如:using winform=system.windows.form; 3)作为语句,定义一个范围。例如: font font1 = new font(arial, 10.0f); using (font1) 程序执行到“”时,就会自动释放 font1 对象。 习题 2 参考解答 1、c#支持的数据类型有那些?值类型和引用类型有何不同? 【解答】 c#支持的数据类型有: (1)值类型,包括:简单类型、结构类型、枚举类型。其中,简单类型又分为:整型、布 尔型、字符型、浮点型、小数型。 (2)引用类型,包括:对象类型、类类型、接口、元数据、字符串类型、数组。 值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量 存放的则是数据的地址,即对象的引用。当把一个值变量赋给另一个值变量时,会在堆栈 (stack)中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈 中保存对同一个堆(heap)位置的两个引用。进行数据操作时,对于值类型,由于每个变 量都有自己的值,因此对一个变量的操作不会影响到其他变量;对于引用类型的变量,对一 个变量的数据进行操作就是对这个变量在堆中的数据进行操作, 如果两个引用类型的变量引 用同一个对象, 实际含义就是它们在堆栈中保存的堆的地址相同, 因此对一个变量的操作就 会影响到引用同一个对象的另一个变量。 2、c#中不同整型之间进行转换的原则是什么? 【解答】 在整型之间进行转换时, 小范围类型可以隐式转换为大范围类型, 但大范围类型转换为小 范围类型时需要使用显式转换。 3、简述装箱和拆箱的过程。 【解答】 装箱是将值类型隐式地转换为object类型或者转换为由该值类型实现了的接口类型。装箱 一个数值会为其分配一个对象实例,并把该数值拷贝到新对象中。拆箱是显式地把object类 型转换成值类型,或者把值类型实现了的接口类型转换成该值类型。 4、分别写出下列语句执行的结果。 1) console.writeline(0-0:pgood,12.34f); 2) console.writeline(0-0:#good,0); 3) console.writeline(0-0:00000good,456); 【解答】 12.34-1,234.00%good 0-good 456-00456good 5、编写一个控制台应用程序,输出 1 到 5 的平方值,要求: 1) 用 for 语句实现。 2) 用 while 语句实现。 3) 用 do-while 语句实现。 【解答】 using system; using system.collections.generic; using system.text; namespace outputsquarevalue class program static void main() /用 for 语句实现 for (int i = 1; i = 5; i+) console.writeline(0的平方值为1, i, i * i); /用 while 语句实现 int j = 0; while (j+ 5) console.writeline(0的平方值为1, j, j * j); /用 do-while 语句实现 int k = 1; do console.writeline(0的平方值为1, k, k * k); while (k+ 5); console.readline(); 6、编写一个控制台应用程序,要求用户输入 5 个大写字母,如果用户输入的信息不满 足要求,提示帮助信息并要求重新输入。 【解答】 using system; using system.collections.generic; using system.text; namespace inputcapitalletter class program static void main() bool ok = false; while (ok = false) console.write(请输入 5 个大写字母:); string str = console.readline(); if (str.length != 5) console.writeline(你输入的字符个数不是 5 个,请重新输入。); else ok = true; for (int i = 0; i 5; i+) char c = stri; if (c z) console.writeline(第0个字符“1”不是大写字母,请重新 输入。, i + 1, c); ok = false; break; 7、编写一个控制台应用程序,要求完成下列功能。 1) 接收一个整数 n。 2) 如果接收的值 n 为正数,输出 1 到 n 间的全部整数。 3) 如果接收的值为负值,用 break 或者 return 退出程序。 4) 转到(1)继续接收下一个整数。 【解答】 using system; using system.collections.generic; using system.text; namespace testoutput class program static void main() while (true) console.write(请输入一个整数(负值结束):); string str = console.readline(); try int i = int32.parse(str); if (i 0) break; for (int j = 1; j = i; j+) console.writeline(j); catch console.writeline(你输入的不是数字或超出整数的表示范围, 请重新输入 ); 8、编写一个控制台应用程序,求 1000 之内的所有“完数” 。所谓“完数”是指一个数恰好 等于它的所有因子之和。例如,6 是完数,因为 6=1+2+3。 【解答】 using system; using system.collections.generic; using system.text; namespace completenumber class program static void main(string args) for (int i = 2; i = 1000; i+) int s = 1; string str = 1; for (int j = 2; j = (int)math.sqrt(i); j+) if (j * (i / j) = i) if (j != i / j) s += j + i / j; str += string.format(+0+1, j, i / j); else s += j; str += string.format(+0, j); if (s = i) console.writeline(0=1, i, str); console.readline(); 9、错误和异常有什么区别,为什么要进行异常处理,用于异常处理的语句有哪些? 【解答】 错误是指在执行代码过程中发生的事件, 它中断或干扰代码的正常流程并创建异常对象。 当错误中断流程时, 该程序将尝试寻找异常处理程序 (一段告诉程序如何对错误做出响应的 代码) ,以帮助程序恢复流程。换句话说,错误是一个事件,而异常是该事件创建的对象。 当使用短语“产生异常”时,表示存在问题的方法发生错误,并创建异常对象(包含该 错误的信息及发生的时间和位置) 来响应该错误。 导致出现错误和随后异常的因素包括用户 错误、资源失败和编程逻辑失败。这些错误与代码实现特定任务的方法有关,而与该任务的 目的无关。 如果不进行异常处理,即不对错误做出响应,程序的健壮性就会大打折扣,甚至无法保 证正常运行,所以必须要进行异常处理。 用于异常处理的语句有:try-catch 语句、try-catch-finally 语句、throw 语句。 习题 3 参考解答 1、c#语言中的数组类型有何特点? 【解答】 1)数组一般用于存储同一种类型的数据,包括 object 类型。 2)数组是一种引用类型,而不是值类型。 3)c#中除了可以有一维数组、多维数组外,还有交错型数组。 2、泛型和非泛型的主要区别是什么?为什么说使用泛型比使用对应的非泛型效率高? 【解答】泛型是数据类型的一种通用表示形式,它可以表示任何一种数据类型。泛型 (generic)是具有占位符(类型参数)的类、结构、接口和方法,它与普通类的区别是泛 型多了一个或多个表示类型的占位符,这些占位符用尖括号括起来。占位符表示某种类型, 这种类型在创建泛型类的实例时才用实际类型来替换。定义一个类或者方法时,可以用泛 型占位符代表任何一种类型,而在引用时再指定具体类型。当代码调用泛型类或方法时, c#编译器会自动将定义的泛型转换为引用代码中指定的类型,从而大大简化了程序员编 写代码的复杂度。另外,由于占位符可以代表任何一种类型,因此在方法中只定义一次类 型就能实现所有类型的引用。 3、编写一个控制台应用程序,计算 1+ x ? 要求精度为 10?8。 【解答】 using system; class test3 public static void main() int n = 50; double x = 3; double s = 0; double a = 1; for (int i = 1; i = n; i+) a *= i; s += math.pow(-1, i + 1) * math.pow(x, i) / a; console.writeline(n=0,s=1:0.00000000, n, s); x 2 x3 x 4 xn + ? + l + (?1)( n +1) 2! 3! 4! n! 4、编写一个控制台应用程序,接收一个长度大于 3 的字符串,完成下列功能。 (1)输出字符串的长度。 (2)输出字符串中第一个出现字母 a 的位置。 (3)在字符串的第 3 个字符后面插入子串“hello” ,输出新字符串。 (4)将字符串“hello”替换为“me” ,输出新字符串。 (5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 【解答】 【解答】 using system; class test4 public static void main() string str = ; while (str.length -1) console.writeline(第一个出现字母 a 的位置是:0, i); else console.writeline(字符串中不包含字母 a。); /(3) string str1 = str.insert(3, hello); /在第 3 个(初始序号为)字符前插入 hello console.writeline(插入 hello 后的结果为:0, str1); /(4) string str2 = str1.replace(hello, me); console.writeline(将 hello 替换为 me 后的结果为:0, str2); /(5) string arr = str2.split(m); console.writeline(以 m 为分隔符分离后的字符串有:); for (int j = 0; j arr.length; j+) console.writeline(arrj); 习题 4 参考解答 1、编写一个控制台应用程序,完成下列功能。 (1)创建一个类,用无参数的构造函数输出该类的类名。 (2)增加一个重载的构造函数,带有一个 string 类型的参数,在此构造函数中将传递的字 符串打印出来。 (3)在 main 方法中创建属于这个类的一个对象,不传递参数。 (4)在 main 方法中创建属于这个类的另一个对象,传递一个字符串“this is a string.” 。 (5)在 main 方法中声明类型为这个类的一个具有 5 个对象的数组,但不要实际创建分配 到数组里的对象。 (6)写出运行程序应该输出的结果。 【解答】 using system; class test1 public test1() console.writeline(this); public test1(string str) console.writeline(str); public static void main() test1 t1 = new test1(); test1 t2 = new test1(this is a string.); test1 t3 = new test15; 输出结果: test1 this is a string. 2、编写一个控制台应用程序,定义一个类 myclass,类中包含有 public、private 以及 protected 数据成员及方法。然后定义一个从 myclass 类继承的类 mymain,将 main 方法 放在 mymain 中, main 方法中创建 myclass 类的一个对象, 在 并分别访问类中的数据成员 及方法。要求注明在试图访问所有类成员时哪些语句会产生编译错误。 【解答】 using system; class myclass public int i; private int j; protected int k; public void method1() console.writeline(public method.); private void method2() console.writeline(private method.); protected void method3() console.writeline(protected method.); class mymain : myclass public static void main() myclass t = new myclass(); console.writeline(i=0, t.i); console.writeline(j=0, t.j); /会出现编译错误,私有成员不允许在其它类中访问 console.writeline(k=0, t.k); /会出现编译错误,应该创建 mymain 的对象,然 /后通过 mymain 的对象访问 t.method1(); t.method2(); /会出现编译错误,私有的方法不允许在其它类中调用 t.method3(); /会出现编译错误,应该创建 mymain 的对象,然后通过 mymain 的 /对象调用该方法 3、创建一个类包含有 protected 数据。在相同的文件里创建第二个类,用一个方法操纵第 一个类里的 protected 数据。 【解答】 using system; class class1 protected int i = 5; protected void mymethod() console.writeline(protected method.); class class2 : class1 private void newmethod() console.writeline(this.i); this.i += 10; console.writeline(this.i); public static void main() class2 t = new class2(); t.newmethod(); 4、结构和类的区别是什么? 【解答】 1)结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上。 2)对结构中的数据进行操作比对类或对象中的数据进行操作速度要快。 3)一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结 构效率更高。 习题 5 参考解答 1、简要回答下列问题。 (1)举例说明 new 关键字可用于哪些方面? (2)sealed 关键字的作用是什么?什么情况下需要使用 sealed 关键字? (3)哪些关键字可以用于版本控制? 【解答】 1)在 c#中,new 关键字可用作运算符或修饰符。作为运算符用于在堆上创建对象和调用构 造函数。作为修饰符用于隐藏基类成员的继承成员。 2) 在类声明中使用 sealed 修饰符可防止其它类继承此类。在方法声明中使用 sealed 修饰 符可防止扩充类重写此方法。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来, 由于密封类永远不会有任何派生类, 所以对密封类的实例的虚拟函数成员的调用可以转换为 非虚拟调用来处理。 3) override 关键字和 new 关键字均可用于版本控制。 在 c#中,默认情况下方法不是虚拟的。若要使方法成为虚拟方法,必须在基类的方法声 明中使用 virtual 修饰符。然后,派生类可以使用 override 关键字重写基类中的虚拟方法, 或使用 new 关键字隐藏基类中的虚拟方法。如果 override 关键字和 new 关键字均未指定, 编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。 2、简要回答抽象类和接口的主要区别。 【解答】 抽象类和接口的一个主要差别是:类可以实现多个接口,但仅能从一个抽象类或任何其 它类型的类继承。 3、编写一个控制台应用程序,完成下列功能,并回答提出的问题。 (1)创建一个类 a,在构造函数中输出“a” ,再创建一个类 b,在构造函数中输出“b” 。 (2)从 a 继承一个名为 c 的新类,并在 c 内创建一个成员 b。不要为 c 创建构造函数。 (3)在 main 方法中创建类 c 的一个对象,写出运行程序后输出的结果。 (4)如果在 c 中也创建一个构造函数输出“c” ,整个程序运行的结果又是什么? 【解答】 using system; public class a public a() console.writeline(a); public class b public b() console.writeline(b); public class c : a b newb = new b(); class mainclass public static void main() c newc = new c(); console.readline(); 输出结果: b a 如果在 c 中也创建一个构造函数输出“c” ,即添加: public c() console.writeline(c); 则整个程序运行的结果为: b a c 4、编写一个控制台应用程序,完成下列功能,并写出运行程序后输出的结果。 (1)创建一个类 a,在 a 中编写一个可以被重写的带 int 类型参数的方法 mymethod,并 在该方法中输出传递的整型值加 10 后的结果。 (2)再创建一个类 b,使其继承自类 a,然后重写 a 中的 mymethod 方法,将 a 中接收的 整型值加 50,并输出结果。 (3)在 main 方法中分别创建类 a 和类 b 的对象,并分别调用 mymethod 方法。 【解答】 using system; public class a public virtual void mymethod(int num) num += 10; console.writeline(num); public class b : a public override void mymethod(int num) num += 50; console.writeline(num); class mainclass public static void main() a newa = new a(); newa.mymethod(2); b newb = new b(); newb.mymethod(2); console.readline(); 输出结果: 12 52 5、假设 node 类的每一个节点包括有两个字段:m_data(引用节点的数据)和 m_next(引 用链接列表中的下一项) 。这两个字段都是由构造函数方法设置的。该类有两个功能,第一 个功能是通过名为 data 和 next 的只读属性访问 m_data 和 m_next 字段。 第二个功能是对 system.object 的 tostring 虚拟方法进行重写。 试分别用类和泛型两种方法编写程序实现上 述功能。 【解答】 using system; class node object m_data; node m_next; public node(object data, node next) m_data = data; m_next = next; / 访问结点数据 public object data get return m_data; / 访问下一个结点 public node next get return m_next; / 获取结点数据描述 public override string tostring() return m_data.tostring(); / 链表结点类的泛型定义 class node t m_data; node m_next; public node(t data, node next) m_data = data; m_next = next; / 访问结点数据 public t data get return m_data; set m_data = value; / 访问下一个结点 public node next get return m_next; set m_next = value; / 获取结点数据描述 public override string tostring() return m_data.tostring(); / 使用结点类型或泛型结点类型 class linkedlist static void main(string args) / 创建整数链表 /node head = new node(5, null); /head = new node(10, head); /head = new node(15, head); /遍历链表求整数和 /int32 sum = 0; /for (node current = head; current != null; / current = current.next) / / sum += (int32)current.data; / / 输出结果 /console.writeline(sum of nodes = 0, sum); / 用泛型创建整数链表 node head = new node(5, null); head = new node(10, head); head = new node(15, head); / 遍历求和 int32 sum = 0; for (node current = head; current != null; current = current.next) sum += current.data; / 输出 console.writeline(sum of nodes = 0, sum.tostring(); 习题 6 参考解答 1、填空题 (1)使控件是否可以对用户交互做出响应的属性是(enabled) 。 (2)控制控件是否显示的属性是(visible) 。 (3)若要在文本框中输入密码,常指定(passwordchar)属性。 (4)若某复选框某时刻【checkstate】属性的值为 indeterminate,则其属性【checked】的值 为(true) 。 (5)使用(groupbox)或(panel)控件可以将多个 radiobutton 控件分为两个单选

温馨提示

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

评论

0/150

提交评论