• 756.37 KB
  • 2022-04-22 11:14:26 发布

C#程序设计大学教程 (罗宾 刘艺 孟武生 著) 机械工业出版社 课后答案

  • 96页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'课后答案网,用心为你服务!大学答案---中学答案---考研答案---考试答案最全最多的课后习题参考答案,尽在课后答案网(www.khdaw.com)!Khdaw团队一直秉承用心为大家服务的宗旨,以关注学生的学习生活为出发点,旨在为广大学生朋友的自主学习提供一个分享和交流的平台。爱校园(www.aixiaoyuan.com)课后答案网(www.khdaw.com)淘答案(www.taodaan.com) 第1章绪论复习题1.什么是程序设计?答:计算机程序设计又称为编程(programming),是一门设计和编写计算机程序的科学和艺术。程序是程序设计中最基本的概念,也是软件中最基本的概念。程序是计算任务的处理对象和处理规则的描述。所谓计算任务是指所有通过计算来解决实际问题的任务。处理对象是数据,如数字、文字和图像等。处理规则一般指处理动作和步骤。在低级语言中,程序是一组指令和相关的数据。在高级语言中,程序一般是一组说明和语句,它包括了算法和数据结构。程序设计就是为计算机设计和编写程序,使其按照人所规定的算法对数据进行处理。通常程序设计包括了问题建模、算法设计、编写代码和编译调试等过程。2.当今的计算机是基于什么模型?答:现代计算机都是基于冯·诺伊曼模型的。此模型着眼于计算机的内部结构,定义了处理机的运行过程。该模型把计算机分为四个子系统:存储器、算术/逻辑单元、控制单元和输入/输出单元。3.为什么不称计算机为数据处理器?答:数据处理器。可以认为是一个接受输入数据,处理数据,产生输出数据的黑盒。尽管这个模型能够体现现代计算机的功能,但是它的定义还是太狭窄。这个模型并没有说明它处理的类型以及是否可以处理一种以上的类型。换句话说,它并没有清楚的说明一个基于这个模型的机器能够完成操作的类型和数量。它是专用机器还是通用机器呢?这种模型可以表示为一种设计用来完成特定任务的专用计算机(或者处理器),比如用来控制建筑物温度或汽车油料使用。但计算机作为一个当今使用的术语,是一种通用的机器。它可以完成各种不同的工作。4.你所知道的程序设计语言有哪些?你知道它们有什么不同特点吗?(答案略) 5.位模式是如何表示一个构成文本的语言符号的?答所谓位(bit,binarydigit的缩写)是存储在计算机中的最小单位;它是0或1。位代表设备的某一状态,这些设备只能处于两种状态中的某一种状态。计算机存储器并不知道所存储的位模式是表示哪种类型的数据。实际上计算机存储器仅仅将数据以位模式存储。至于解释位模式是数字类型、文本类型、或其它的数据类型,则是由输入/输出设备或程序的完成。换句话说,当数据输入计算机时,它们被编码,当呈现给用户时,它们被解码。位模式可以表示任何一个构成文本的语言符号。在一种语言中,位模式到底需要多少位来表示一个文本符号主要取决于该语言集中到底有多少不同的文本符号。例如,如果要创建的某个虚构的语言仅仅使用大写的英文字母,则只需要26个符号。相应的这种语言的位模式则至少需要表示26个符号。对另一种语言,如中文,可能需要更多的符号。在一种语言中,表示某一符号的位模式的长度取决于该语言中所使用的符号的数量。更多的符号意味着更长的位模式。6.计算机程序设计语言是如何分类的?答:程序设计语言可划分为低级语言、中级语言和高级语言。低级语言或称机器语言,是程序设计语言中最基础的类型,能被计算机直接理解。机器语言的区别取决于制造商和计算机的型号。高级语言是在计算机能够理解和处理之前必须首先翻译成机器语言的程序设计语言。C、C++、Pascal和FORTRAN都是高级语言的例子。汇编语言是中级语言,非常接近于机器语言,没有其他高级语言所表现出的语言复杂程度,运行时仍然得先翻译成机器语言。7.C#是什么?答:C#(发音为:Csharp)是Microsoft公司开发的一种新的语言,也是.NET公用语言运行环境的内置语言。它完美的结合了C/C++的强大功能、Java的面向对象特征和VisualBasic的易用性,从而构成一种类型安全的、简单的面向对象的编程语言。8.C#的集成开发环境包括那些组成部分?答:C#的集成开发环境主要由这几部分组成:通用语言运行时CLR(CommonLanguageRuntime),它是整个开发框架的基础;由CLR所提供的一组基础类库;在开发技术方面,C# 的集成开发环境提供了全新的数据库访问技术ADO.NET,以及网络应用开发技术ASP.NET和Windows编程技术WinForms。9.简述程序设计的过程。答:程序的设计过程包括:问题建模、算法设计、编写代码、编译调试。程序将以数据处理的方式解决客观世界中的问题,因此在程序设计之初,首先应该将实际问题抽象成一个求解模型,然后为该模型设计和制定算法。通过问题建模,可以清楚地描述各种概念、已知条件、所求结果,以及已知条件与所求结果之间的联系等各方面的信息。模型和算法的结合将给出问题的解决方案。具体的解决方案确定后,需要对所采用的算法进行描述,算法的初步描述可以采用自然语言方式,然后逐步将其转化为程序流程图或其他直观方式。这些描述方式比较简单明确,能够比较明显地展示程序设计思想,是进行程序调试的重要参考。使用计算机系统提供的某种程序设计语言,根据上述算法描述,将已设计好的算法表达出来,使得非形式化的算法转变为形式化的由程序设计语言表达的算法,这个过程称为程序编码。程序设计者可以通过常用的开发工具(如Java、VisualBasic等)依据程序设计语言的语法规则编写程序,并将源代码编译成可执行程序。由于很少能保证程序第一次就能够正确运行,所以程序设计时经常需要使用调试程序来帮助查找程序错误,解决程序运行中存在的问题。调试程序能够在运行的程序中检测到一个事件,并向程序员指出该事件在程序由哪条代码的触发。只有编译调试成功了,才完成了程序的设计过程。测试题10.以下关于计算机程序的描述不正确的是。A、计算机程序是指按照时间顺序依次安排的计算机工作步骤。B、简单地讲,计算机程序也可以表示成:算法+数据结构。C、计算机程序是对计算步骤的编排和优化。D、计算机程序是计算任务的处理对象和处理规则的描述。答案:C(提示:计算机程序是对计算步骤的编排,但不一定优化) 11.现代的内部存储计算机程序的概念是由提出来的。A、美籍匈牙利数学家约翰•冯•诺伊曼B、英国数学家奥古斯塔•埃达•拜伦C、法国发明家约瑟夫D、英国数学家和发明家查尔斯•巴比答案:A12.以下程序设计语言在历史上出现的正确顺序是。A、FORTRAN、BASIC、C#、JAVAB、FORTRAN、C、JAVA、C#C、LISP、BASIC、C#、C++D、COBOL、C#、Pascal、JAVA答案:B13.以下的应用程序中,不能将源代码翻译成目标代码是。A、编译器B、解释器C、汇编程序D、虚拟机答案:D14.计算机内存中存储体的基本单位是。A、字节B、字C、位D、字符答案:C 15.可用于表示来自世界上不同语言的符号。A、ASCII码B、扩展ASCII码C、扩展ASCII码和Unicode码D、Unicode码答案:D16.以下有关计算机数据表示的说法不正确的是。A、计算机中并没有采用文本的编码来表示数字。B、计算机存储器仅仅将数据以位模式存储,它并不知道其存储的数据是哪种类型。C、在一种语言中,位模式到底需要多少位来表示一个符号这主要取决于内存的大小。D、一个字中包含多个位,字可以是8位、16位、32位,甚至是64位。答案:C17.程序设计语言通常分为。A、面向过程的、函数式的、面向对象的或逻辑的语言B、机器语言、汇编语言、高级语言C、数据库语言、通用语言、嵌入式语言D、可视化语言、非可视化语言答案:B18.C#从版本开始推出了C#for.NET集成开发环境。A、C#7B、C#5C、C#8D、C#2005答案:D 19.C#是出品的一种优秀的集成开发工具。A、SUN公司B、Borland公司C、IBM公司D、Microsoft公司答案:D练习题20.设计一个窗体,从组件面板中选择一些常见控件放置在其上。运行该程序,观察运行结果,并察看C#自动生成了那些代码。(答案略)21.查阅资料,找出最近10年来新出现的程序设计语言,了解为什么人们要推出这些新的语言,并讨论程序设计与语言的关系。(答案略)22.一种计算机程序设计语言有10种不同的指令。如果指令不重复,在这种语言能编出多少5条指令的程序?又能编出多少7条指令的程序?答:5条指令的程序:10×9×8×7×6(种)7条指令的程序:10×9×8×7×6×5×4(种)讨论:今天对一个最终用户来说,硬件、软件和数据哪一个更有价值? 第2章程序设计基础复习题1.简述C#程序的基本框架结构。答:C#程序由一个或多个独立的类组成,每个类归属于某个命名空间。C#的类可以由一个或多个方法组成,其中类中的静态Main方法可用作程序运行的入口。2.代码质量评审的原则是什么?撰写代码时如何使程序结构清晰,易于阅读?答:通过编程经验的总结和软件工程的研究,归纳出如下代码质量评审原则:正确性指程序代码要实现软件设计所要求的功能;可靠性指代码最后编译的程序要能够稳定、可靠、安全的运行;规范化指代码书写的风格、命名规则等要符合规范;可读性指代码要便于查看和理解;在程序代码中适当使用空格、空行、缩进以及必要的注释和规范的命名,可以使程序结构清晰,易于阅读。3.什么是数据类型?以变量为例,阐述数据类型的意义。答:某种数据类型就好比是一套“用来解释存储于某内存位置上的值(好比变量的值)”的规则。举个例子,如果变量是个整数,存储于其中的位(bits)就被解释为一个整数;如果变量的数据类型是字符串,存储于其中的位(bits)就被解释为一组字符。当然,对编译器来说,数据类型的含义远不止于此。编译器还必须能够理解以下规则:"定义每一种数据类型能够接受的值"以及"对这些值来说哪些操作合法"。通过这些知识,编译器便能够决定一个特定数据类型的值是否被正确地使用。4.C#数据类型可分为几大类?C#值类型包括哪些?答:C#中的数据类型可以分为值类型和引用类型两大类。其中值类型包括:简单类型、枚举 类型和结构类型;引用类型包括:数组类型、类类型、接口类型和代理类型。测试题5.以下声明常量的语句正确的是。A、doublePI=3.14159;B、constdoublePI=3.14159;C、staticdoublePI=3.14159;D、staticconstdoublePI=3.14159;答案:B6.C#中简单数据类型包括。A、整数类型,字符类型,枚举类型和结构类型B、整数类型,字符类型,布尔类型和实数类型C、整数类型,字符类型,结构类型和类类型D、整数类型,字符类型,布尔类型,结构类型和类类型答案:B7.以下类型在内存中所占大小从小到大排序,正确的是。A、byteshortlongB、bytelongshortC、charbytefloatD、doublefloatlong答案:A8.每个C#语句以结束。A、右大括号“}”B、回车C、点号“.”D、分号“;” 答案:D9.下面可作为变量名的是。A、tryB、continueC、$500D、24Hour答案:C10.在C#中,以下程序注释正确的是。A、{注释行1注释行2注释行3}B、//注释行1注释行2注释行3//C、(*注释行1注释行2注释行3*)D、/*注释行1注释行2注释行3*/ 答案:D11.关于以下两行代码,不正确的说法是。floatf=3.2;inti=f;A、代码无法编译通过。B、代码可以编译通过,i的值为3。C、第2行应改为inti=(int)f;D、第1行应改为floatf=3.2F;答案:B12.以下代码无法编译通过,是因为。classTest{staticintmyArg=1;publicstaticvoidMain(String[]args){intmyArg;Console.WriteLine(myArg);}}A、Main方法中的变量myArg没有初始化。B、Main方法中的变量myArg与Test类的myArg字段同名。C、Test类的myArg字段不能在定义时就同时赋值。D、Console.WriteLine(myArg)语句不能使用整数类型的myArg,而应使用字符串类型的myArg。答案:A13.以下的Main方法定义中,可用作公有类中程序运行入口的是。A、publicstaticvoidMain()B、publicstaticvoidMain(string[]string) C、publicstaticvoidMain(stringargs)D、staticpublicintMain(string[]args)答案:B14.已知a、b、c、d都是int类型的变量,而且已有互不相同的值,顺序执行下列语句后,条件等式为true的是。b=a;a=c;d=a;d=b;A、a==cB、a==dC、c==dD、b==a答案:A15.下列实数表示方法中不正确的是。A、8.625e+5B、5e-3FC、2345.34D、1000答案:D16.以下语句中属于合法类型转换的是。A、(int)"A"B、(char)"A"C、(bool)(2-2)D、(char)(651/12)答案:D 17.下列字符比较的结果为真(true)的是。A、"a"<"A"B、"c"<="A"C、"a"=="A"D、"a">"A"答案:D练习题18.指出下面表达式的类型:a.4567b."true"c."C"d.67.0e.56Ff."T"g."8"h.true答:a.intb.stringc.chard.doublee.floatf.stringg.charh.bool19.定义一个表示学生性别的枚举类型。答:enumTSex{male,female,unknown}20.定义一个表示图书信息的结构类型。要求包含:书名、作者、出版社、定价、页数、书号等字段。试编写一个简单的控制台程序,使用ReadLine语句为一个图书信息的各个字段赋值,并用WriteLine语句在屏幕上显示这些值。参考程序:usingSystem;structTBook{publicstringName;//书名publicstringAuthor;//作者publicstringPub;//出版社 publicdoublePrice;//定价publicintPages;//页数publicstringISBN;//书号}classClass1{publicstaticvoidMain(string[]args){TBooktb=newTBook();Console.WriteLine("请输入书名:");tb.Name=Console.ReadLine();Console.WriteLine("请输入作者:");tb.Author=Console.ReadLine();Console.WriteLine("请输入出版社:");tb.Pub=Console.ReadLine();Console.WriteLine("请输入定价:");tb.Price=double.Parse(Console.ReadLine());Console.WriteLine("请输入页数:");tb.Pages=int.Parse(Console.ReadLine());Console.WriteLine("请输入书号:");tb.ISBN=Console.ReadLine();Console.WriteLine("---------------------");Console.WriteLine("《"+tb.Name+"》作者:"+tb.Author+","+tb.Pub+"出版");Console.WriteLine("定价:"+tb.Price.ToString()+"元,共计"+tb.Pages.ToString()+"页,书号:"+tb.ISBN);} }界面如下:21.阅读以下程序,分析运行结果。publicstaticvoidMain(string[]args){boolb1=true;boolb2=false;boolb3=(1>2);b3=b2;b3=(b2==b1);System.Console.WriteLine("b3is{0}",b3);}答:b3isfalse第3章程序设计进阶复习题1.什么是表达式?C#程序中复杂的表达式是如何建立的? 答:一个表达式就是一个能够返回值的简单结构。最简单的表达式是变量和常量。在C#中也可以通过使用运算符、方法调用以及类型转换等,建立复杂的表达式。2.C#语言中主要有哪些运算符?它们的优先级是怎样的?C#语言中包括有赋值运算符、增减运算符、算术运算符、关系运算符、逻辑运算符、位运算符等。C#语言中主要运算符及其优先级如下:优先级运算符类型运算符[].()(方法调用)优先级最高一元运算符!~++--+-new()(强制类型转换)算术运算符*/%+-优先级较高位移运算符<<>><<=>>==!=关系运算符&^|优先级较低位移运算符&&||逻辑运算符?:(三元判断运算符,例如:A>B?X:Y)=优先级最低赋值运算符+=-=*=/=%=3.在程序设计的流程控制中,有哪些基本结构?这些结构在C#语言中是如何实现的?答:在程序设计的流程控制中,有如下三种基本控制结构:顺序结构、选择结构、循环结构。在C#语言中顺序结构由顺序执行的各条语句实现;选择结构由if语句、switch语句实现;循环结构由while语句、do-while语句、for语句实现。4.在什么情况下循环过程会出现死循环?在C#语言中使用哪条语句可以跳出循环体?答:当循环条件永远为真时,也就是说永远无法达到循环的边界时会出现死循环。使用break关键字可以强行跳出循环体。 5.case语句有哪几种变形?他们又如何使用?答:case语句的几种变形有:简单的case语句、带缺省语句的case语句、带有多值分支的case语句、带有范围值分支的case语句。(使用方法略)6.什么是算法?算法有哪些特征?答:算法是为了求解某一问题在有限步骤内、定义了具体操作序列的规则集合。通俗点说,算法就是针对一类特定问题,使用计算机解题的过程。一个算法应该具有以下五个重要的特征:•确切性(Noambiguity)算法的每一步骤必须有确切的定义。而不应该有二义性,例如,在算法中不能出现诸如“赋值为100或1000”。•输入(Input)有0个或多个输入,用于初始化运算对象。所谓0个输入是指无需输入条件,而算法本身定出了初始条件。•输出(Output)没有输出的算法是毫无意义的。一个算法应该有一个或多个输出,以反映对输入数据加工后的结果。•可行性(Feasibility)算法原则上能够精确地运行,而且对于算法中的每种运算,在原理上人们应该能用笔和纸做有限次运算后完成。•有穷性(Finite)算法必须保证执行有限步之后结束。只具有前面四个特征的规则集合,称不上算法。例如,尽管操作系统能完成很多任务,但是它的计算过程并不终止,而是无穷无尽的执行、等待执行,所以操作系统不是算法。7.什么是排序算法?排序算法有哪些?答:为了更有效地使用数组,通过对数组中的元素进行排序,使其按一定的顺序排列的算法都称为排序算法。排序算法有很多,如:冒泡排序、选择排序、插入排序、快速排序、合并排序、希尔(Shell)排序、堆排序等8.什么是查找算法?查找算法有哪些?答: 查找就是从列表(list)或者数组中找出需要的数据项,确定目标所在位置的算法,也叫检索。查找的算法很多,有顺序查找、折半查找、散列值查找、转移表查找等。测试题9.以下运算符按运算优先级从高到低排列顺序正确的是。A、!、*、<、=B、!、=、*、>=C、!、*、&&、>=D、!=、*、&&、>=答案:A10.以下循环语句的执行次数是。intx=37;inty=3;while(y<=x){y*=y;}A、0B、1C、2D、3答案:C11.下列字符串比较的结果为真(True)的是。A、"a"<"A"B、"c"<="A" C、"a"=="A"D、"a">"A"答案:D12.设有以下声明,则合法的赋值语句是。inti1,i2,i3;boolb1,b2,b3;A、i3=i1/i2;B、b1=i1&&i2;C、b2=i1n){m=m-n;}while(n>m){n=n-m;}}System.Console.WriteLine(m); A、4B、5C、6D、7答案:D18.下面程序执行后move的值是。intmove=0;inty=68/8;if(y>8){move=y/2+5;}else{inta=y;intb=6;move=a%b;}System.Console.WriteLine(move);A、1B、2C、3D、4答案:B19.表达式25/3%3*2的值是。A、4B、4.0C、6 D、8答案:A20.在for循环语句中,循环控制变量的取值是如何变化的?A、自动增1B、自动减1C、根据for语句的不同形式来确定D、必须在循环体中给循环控制变量赋值答案:C21.在While循环语句中执行的流程为。A、先判断后执行B、先执行后判断C、由循环条件决定D、可以先判断,也可以先执行答案:A22.指出下面程序的输出结果是什么?publicstaticvoidMain(string[]args){constintA=4;inta=2;switch(a*2){caseA:System.Console.WriteLine(a);default:System.Console.WriteLine(a*2);}}A、2 B、4C、2和4D、程序出错答案:C23.关于下面程序段的正确说法是。charmychar="c";switch(mychar){default:case"a":System.Console.WriteLine("a");break;case"b":System.Console.WriteLine("b");break;}A、程序出错,default位置不对。B、程序出错,case表达式必须是int类型,不能使用char类型。C、程序正确,屏幕显出输出字符a。D、程序正确,屏幕无显出输出。答案:D24.以下方式中,不方便表示算法的是。A、伪代码B、流程图C、Pascal语言D、PAD图答案:C25.累加求和是。A、基本算法B、排序算法C、查找算法 D、迭代和递归算法答案:A26.是用于编写解决问题的算法的两种途径。A、求最大值和最小值B、函数和过程C、查找和排序D、迭代和递归答案:D27.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中变化如为:(1)8447251521(2)1547258421(3)1521258447(4)1521254784则采用的排序方法是。A、选择排序B、冒泡排序C、快速排序D、插入排序答案:B练习题28.阅读以下程序,分析运行结果。publicclassTotal{publicstaticvoidMain(string[]args){ inty,x=1,total=0;while(x<=10){y=x*x;System.Console.WriteLine(y);total+=y;++x;}System.Console.WriteLine("totalis"+total);}}答:1~10的整数平方的和。29.指出以下程序段的错误:intsex=2%3;if(sex=1){System.Console.WriteLine("Man");}else{System.Console.WriteLine("Woman");}答:语法错误,应该改为sex==1。30.指出以下程序段的错误:publicstaticvoidMain(string[]args){stringsay="Ilovemyteacher.";stringstr=say.Substring(7,10);if(str=="myteacher"){System.Console.WriteLine("right!"); }else{System.Console.WriteLine("wrong!");}}答:比较字符串是否相等应该使用equals方法,而不能使用关系运算符==。t=="myteacher"应该改为t.equals("myteacher")31.指出以下程序段的错误:publicstaticvoidMain(string[]args){inta=4;intb=2;switch(b*2){casea:System.Console.WriteLine(a-b);break;caseb:System.Console.WriteLine(a+b);}}答:switch语句的case分支的值必须是常量。32.指出以下程序段的错误:publicstaticvoidMain(string[]args){inta=3;intb=6;for(inti=a;i<=b;i++){ a=1;b=5;System.Console.WriteLine(i);if(i>=(b-a))i--;}}答:本题中没有语法错误,但在for语句的循环体内,对循环变量进行操作,造成死循环。33.指出以下程序段的错误:publicstaticvoidMain(string[]args){for(floaty=0;y!=1.2;y+=0.1){System.Console.WriteLine(y);if(y>1.5)break;}}答:因为浮点数的值不精确,y只会等于1.2000002,而永远不会等于1.2,造成死循环。34.试编写一个程序,将1~500间能同时被2,5,7整除的数打印出来。参考程序1——整除法:classProgram1{publicstaticvoidMain(string[]args){for(inti=1;i<=500;i++){if((i%2==0)&&(i%5==0)&&(i%7==0)){System.Console.WriteLine(i);}} }}参考程序2——公约数法:classProgram2{publicstaticvoidMain(string[]args){intk=0;inti=1;while(k<=500){k=2*5*7*i;if(k>=500)break;System.Console.WriteLine(k);i=i+1;}}}35.试编写一个程序,显示如图所示的一个数字金字塔。112112321123432112345432112345654321123456765432112345678765432112345678987654321参考程序:publicclassNewClass{publicstaticvoidMain(string[]args){inti=9;for(introw=1;row<=i;row++) {for(intcolumn=1;column<=(i-row);column++){System.Console.Write("");}for(intcolumn=1;column<=row;column++){System.Console.Write(column);}for(intcolumn=row-1;column>0;column--){System.Console.Write(column);}System.Console.WriteLine();}}}}36.如果我国的经济增长以每年7.5%的速度保持稳定不变,试编写一个程序,计算过多少年可以实现总量翻两番?参考程序:publicclassDoubleTimes{publicstaticvoidMain(string[]args){intn=0;doubleinc=0.075,sum=1;//增长率inc为7.5%,当前总量sum为1while(sum<=4){sum=(1+inc)*sum;//计算总量n++;//计算年数;System.Console.WriteLine("第"+n+"年达到"+sum);}System.Console.WriteLine("一共"+n+"年实现翻两番。"); }}37.将下列程序改写为非递归形式。intexam(intx){intresult;if(x==0)result=1;elseresult=x*exam(x–1);returnresult;}答:上面的函数可改写如下:intexam(intx){inti,result,j=1;if(x==0)result=j;if(x>0)for(i=1;ilist[i+1]){done=false; temp=list[i];list[i]=list[i+1];list[i+1]=temp;}}j++;}}}publicclassMainClass{publicstaticvoidMain(){int[]iArrary=newint[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};BubbleSortersh=newBubbleSorter();sh.Sort(iArrary);for(intm=0;m///必需的设计器变量。///privateSystem.ComponentModel.IContainercomponents=null;//////清理所有正在使用的资源。//////如果应释放托管资源,为true;否则为false。protectedoverridevoidDispose(booldisposing){if(disposing&&(components!=null)){components.Dispose();}base.Dispose(disposing);}#regionWindows窗体设计器生成的代码//////设计器支持所需的方法-不要///使用代码编辑器修改此方法的内容。///privatevoidInitializeComponent(){this.button1=newSystem.Windows.Forms.Button();this.button2=newSystem.Windows.Forms.Button();this.textBox1=newSystem.Windows.Forms.TextBox();this.SuspendLayout();////button1// this.button1.Location=newSystem.Drawing.Point(42,207);this.button1.Name="button1";this.button1.Size=newSystem.Drawing.Size(75,23);this.button1.TabIndex=0;this.button1.Text="触发事件";this.button1.UseVisualStyleBackColor=true;this.button1.Click+=newSystem.EventHandler(this.button1_Click);////button2//this.button2.Location=newSystem.Drawing.Point(155,207);this.button2.Name="button2";this.button2.Size=newSystem.Drawing.Size(75,23);this.button2.TabIndex=1;this.button2.Text="结束";this.button2.UseVisualStyleBackColor=true;this.button2.Click+=newSystem.EventHandler(this.button2_Click);////textBox1//this.textBox1.Location=newSystem.Drawing.Point(42,23);this.textBox1.Multiline=true;this.textBox1.Name="textBox1";this.textBox1.ScrollBars=System.Windows.Forms.ScrollBars.Vertical;this.textBox1.Size=newSystem.Drawing.Size(188,161);this.textBox1.TabIndex=2;////Form1//this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.ClientSize=newSystem.Drawing.Size(292,266);this.Controls.Add(this.textBox1);this.Controls.Add(this.button2);this.Controls.Add(this.button1); this.Name="Form1";this.Text="Form1";this.Load+=newSystem.EventHandler(this.Form1_Load);this.ResumeLayout(false);this.PerformLayout();}#endregionprivateSystem.Windows.Forms.Buttonbutton1;privateSystem.Windows.Forms.Buttonbutton2;privateSystem.Windows.Forms.TextBoxtextBox1;}}///////////////////////////////////////////////////////////////////////////Form1.cs代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespaceWindowsExample{publicpartialclassForm1:Form{privateinti;publicForm1(){ InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){i=0;}privatevoidbutton2_Click(objectsender,EventArgse){Close();}privatevoidbutton1_Click(objectsender,EventArgse){i=i+1;textBox1.Text+="共计触发了"+i+"次单击事件rn";}}}/////////////////////////////////////////////////////////////////////程序运行结果如下所示: 9.参照Windows系统“附件”中的“计算器”,自行编写一个简易的计算器。要求:可以实现由0~5构成的整数的加减运算。参考程序://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////form1.Designer.cs代码namespaceWindowsExample{partialclassForm1{//////必需的设计器变量。///privateSystem.ComponentModel.IContainercomponents=null;//////清理所有正在使用的资源。//////如果应释放托管资源,为true;否则为false。protectedoverridevoidDispose(booldisposing){if(disposing&&(components!=null)){components.Dispose();}base.Dispose(disposing);}#regionWindows窗体设计器生成的代码//////设计器支持所需的方法-不要///使用代码编辑器修改此方法的内容。 ///privatevoidInitializeComponent(){this.button1=newSystem.Windows.Forms.Button();this.button2=newSystem.Windows.Forms.Button();this.button3=newSystem.Windows.Forms.Button();this.button4=newSystem.Windows.Forms.Button();this.button5=newSystem.Windows.Forms.Button();this.button6=newSystem.Windows.Forms.Button();this.buttonExit=newSystem.Windows.Forms.Button();this.buttonClear=newSystem.Windows.Forms.Button();this.buttonAdd=newSystem.Windows.Forms.Button();this.buttonSub=newSystem.Windows.Forms.Button();this.buttonEqual=newSystem.Windows.Forms.Button();this.textBox1=newSystem.Windows.Forms.TextBox();this.SuspendLayout();////button1//this.button1.Location=newSystem.Drawing.Point(53,141);this.button1.Name="button1";this.button1.Size=newSystem.Drawing.Size(40,23);this.button1.TabIndex=0;this.button1.Text="0";this.button1.UseVisualStyleBackColor=true;this.button1.Click+=newSystem.EventHandler(this.InputNumber);////button2//this.button2.Location=newSystem.Drawing.Point(99,141);this.button2.Name="button2";this.button2.Size=newSystem.Drawing.Size(40,23);this.button2.TabIndex=0;this.button2.Text="1";this.button2.UseVisualStyleBackColor=true;this.button2.Click+=newSystem.EventHandler(this.InputNumber); ////button3//this.button3.Location=newSystem.Drawing.Point(145,141);this.button3.Name="button3";this.button3.Size=newSystem.Drawing.Size(40,23);this.button3.TabIndex=0;this.button3.Text="2";this.button3.UseVisualStyleBackColor=true;this.button3.Click+=newSystem.EventHandler(this.InputNumber);////button4//this.button4.Location=newSystem.Drawing.Point(53,181);this.button4.Name="button4";this.button4.Size=newSystem.Drawing.Size(40,23);this.button4.TabIndex=0;this.button4.Text="3";this.button4.UseVisualStyleBackColor=true;this.button4.Click+=newSystem.EventHandler(this.InputNumber);////button5//this.button5.Location=newSystem.Drawing.Point(99,181);this.button5.Name="button5";this.button5.Size=newSystem.Drawing.Size(40,23);this.button5.TabIndex=0;this.button5.Text="4";this.button5.UseVisualStyleBackColor=true;this.button5.Click+=newSystem.EventHandler(this.InputNumber);////button6//this.button6.Location=newSystem.Drawing.Point(145,181);this.button6.Name="button6";this.button6.Size=newSystem.Drawing.Size(40,23); this.button6.TabIndex=0;this.button6.Text="5";this.button6.UseVisualStyleBackColor=true;this.button6.Click+=newSystem.EventHandler(this.InputNumber);////buttonExit//this.buttonExit.Location=newSystem.Drawing.Point(53,103);this.buttonExit.Name="buttonExit";this.buttonExit.Size=newSystem.Drawing.Size(40,23);this.buttonExit.TabIndex=0;this.buttonExit.Text="Exit";this.buttonExit.UseVisualStyleBackColor=true;this.buttonExit.Click+=newSystem.EventHandler(this.buttonExit_Click);////buttonClear//this.buttonClear.Location=newSystem.Drawing.Point(99,103);this.buttonClear.Name="buttonClear";this.buttonClear.Size=newSystem.Drawing.Size(40,23);this.buttonClear.TabIndex=0;this.buttonClear.Text="C";this.buttonClear.UseVisualStyleBackColor=true;this.buttonClear.Click+=newSystem.EventHandler(this.buttonClear_Click_1);////buttonAdd//this.buttonAdd.Location=newSystem.Drawing.Point(195,103);this.buttonAdd.Name="buttonAdd";this.buttonAdd.Size=newSystem.Drawing.Size(40,23);this.buttonAdd.TabIndex=0;this.buttonAdd.Text="+";this.buttonAdd.UseVisualStyleBackColor=true;this.buttonAdd.Click+=newSystem.EventHandler(this.buttonAdd_Click);////buttonSub //this.buttonSub.Location=newSystem.Drawing.Point(195,141);this.buttonSub.Name="buttonSub";this.buttonSub.Size=newSystem.Drawing.Size(40,23);this.buttonSub.TabIndex=0;this.buttonSub.Text="-";this.buttonSub.UseVisualStyleBackColor=true;this.buttonSub.Click+=newSystem.EventHandler(this.buttonSub_Click);////buttonEqual//this.buttonEqual.Location=newSystem.Drawing.Point(195,181);this.buttonEqual.Name="buttonEqual";this.buttonEqual.Size=newSystem.Drawing.Size(40,23);this.buttonEqual.TabIndex=0;this.buttonEqual.Text="=";this.buttonEqual.UseVisualStyleBackColor=true;this.buttonEqual.Click+=newSystem.EventHandler(this.buttonEqual_Click);////textBox1//this.textBox1.Location=newSystem.Drawing.Point(53,48);this.textBox1.Name="textBox1";this.textBox1.Size=newSystem.Drawing.Size(182,21);this.textBox1.TabIndex=1;////Form1//this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.ClientSize=newSystem.Drawing.Size(292,266);this.Controls.Add(this.textBox1);this.Controls.Add(this.buttonEqual);this.Controls.Add(this.buttonSub);this.Controls.Add(this.buttonAdd);this.Controls.Add(this.buttonClear); this.Controls.Add(this.buttonExit);this.Controls.Add(this.button6);this.Controls.Add(this.button5);this.Controls.Add(this.button4);this.Controls.Add(this.button3);this.Controls.Add(this.button2);this.Controls.Add(this.button1);this.Name="Form1";this.Text="Form1";this.ResumeLayout(false);this.PerformLayout();}#endregionprivateSystem.Windows.Forms.Buttonbutton1;privateSystem.Windows.Forms.Buttonbutton2;privateSystem.Windows.Forms.Buttonbutton3;privateSystem.Windows.Forms.Buttonbutton4;privateSystem.Windows.Forms.Buttonbutton5;privateSystem.Windows.Forms.Buttonbutton6;privateSystem.Windows.Forms.ButtonbuttonExit;privateSystem.Windows.Forms.ButtonbuttonClear;privateSystem.Windows.Forms.ButtonbuttonAdd;privateSystem.Windows.Forms.ButtonbuttonSub;privateSystem.Windows.Forms.ButtonbuttonEqual;privateSystem.Windows.Forms.TextBoxtextBox1;}}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Form1.cs代码usingSystem; usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespaceWindowsExample{publicpartialclassForm1:Form{enumcalculateType{none,add,sub};calculateTypecalType=calculateType.none;intx,y;boolisY=false;publicForm1(){InitializeComponent();textBox1.TextAlign=HorizontalAlignment.Right;}privatevoidInputNumber(objectsender,EventArgse){Buttonnum=(Button)sender;if(isY){textBox1.Clear();isY=false;}textBox1.Text+=num.Text;}privatevoidbuttonAdd_Click(objectsender,EventArgse){ calType=calculateType.add;x=Convert.ToInt32(textBox1.Text);isY=true;}privatevoidbuttonSub_Click(objectsender,EventArgse){calType=calculateType.sub;x=Convert.ToInt32(textBox1.Text);isY=true;}privatevoidbuttonEqual_Click(objectsender,EventArgse){if(textBox1.Text!="")y=Convert.ToInt32(textBox1.Text);if(calType==calculateType.add){textBox1.Text=Convert.ToString(x+y);calType=calculateType.none;}if(calType==calculateType.sub){textBox1.Text=Convert.ToString(x-y);calType=calculateType.none;}isY=true;}privatevoidbuttonExit_Click(objectsender,EventArgse){Close();}privatevoidbuttonClear_Click_1(objectsender,EventArgse) {textBox1.Text="";calType=calculateType.none;isY=false;}}}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////程序运行结果如下所示:第9章GDI+编程复习题1.简述GDI+的概念。答:GDI+是GDI的后续版本。GDI+是一种应用程序编程接口(API),通过一套部署为托管代码的类来展现。这套类被称为GDI+的“托管类接口”。2.GDI+中的Graphics类是如何处理的?答:GDI+中的绘图操作几乎都是通过调用System.Drawing.Graphics类的实例方法来实现的。有 两种方式可以获得Graphics类的实例对象,第一种方式是重写OnPaint()事件,它是一个Form类继承Control类的虚拟方法。另一种方式不需要等待OnPaint()事件,而是直接在窗体中绘制图形。3.在GDI+中,对于图像是如何进行处理的?答:GDI+对图像的处理也进行了大幅度的改进,使得加载和显示图像变得非常简单。在GDI+中,图像的属性和操作是由System.Drawing名称空间中的Image类提供的。Image类是一个抽象类,它是另外两个图像类——Bitmap和Metafile的基类。Bitmap类用来封装GDI+中的位图,此位图由图形图像及其属性的像素数据组成。Bitmap对象是用于处理由像素数据定义的图像的对象。Metafile类用来定义图形图元文件。图元文件包含描述一系列图形操作的记录,这些操作可以被记录(构造)和被回放(显示)。测试题4.在程序中已知有定义:Pointp=newPoint(50,60);Sizes1=newSize(10,20);Sizes2=newSize(20,30);下列代码错误的是_____。A、PointnewP1=p+s1;B、PointnewP2=p–s2;C、SizenewS=s1+s2;D、PointnewP3=newP1+newP2;答案:D练习题5.设计一个Windows应用程序实例,在该实例中有一个按钮和一个文本框,通过点击按钮调出颜色选择对话框,根据用户的颜色选择设置文本框的背景颜色。参考代码:usingSystem;usingSystem.Drawing; usingSystem.Windows.Forms;publicclassClr:Form{Buttonb1=newButton();TextBoxtb=newTextBox();ColorDialogclg=newColorDialog();publicClr(){b1.Click+=newEventHandler(b1_click);b1.Text="选择颜色";tb.Location=newPoint(50,50);this.Controls.Add(b1);this.Controls.Add(tb);}publicvoidb1_click(objectsender,EventArgse){clg.ShowDialog();tb.BackColor=clg.Color;}publicstaticvoidMain(){Application.Run(newClr());}}6.设计一个Windows应用程序实例,在该实例中用画笔以Dash风格画一条直线、以DashDotDot风格画一个椭圆、以Dot风格画一个馅饼图形、以Solid风格画一个多边形。参考代码:usingSystem;usingSystem.Windows.Forms;usingSystem.Drawing;usingSystem.Drawing.Drawing2D; publicclassDrawgra:Form{publicDrawgra(){this.Text="运用画笔示例";this.Size=newSize(450,400);this.Paint+=newPaintEventHandler(Draw_Graphics);}publicvoidDraw_Graphics(objectsender,PaintEventArgse){Graphicsg=e.Graphics;Penpenline=newPen(Color.Red,5);Penpenellipse=newPen(Color.Blue,5);Penpenpie=newPen(Color.Tomato,3);Penpenpolygon=newPen(Color.Maroon,4);//以Dash风格画一条直线penline.DashStyle=DashStyle.Dash;g.DrawLine(penline,50,50,100,200);//以DashDotDot风格画一个椭圆penellipse.DashStyle=DashStyle.DashDotDot;g.DrawEllipse(penellipse,15,15,50,50);//以Dot风格画一个馅饼图形penpie.DashStyle=DashStyle.Dot;g.DrawPie(penpie,90,80,140,40,120,100);//以Solid风格画一个多边形g.DrawPolygon(penpolygon,newPoint[]{ newPoint(30,140),newPoint(270,250),newPoint(110,240),newPoint(200,170),newPoint(70,350),newPoint(50,200)});}publicstaticvoidMain(){Application.Run(newDrawgra());}}}第10章文件操作复习题1.简述文件和流的概念。答:文件(file)和流(stream)即有区别又有联系。文件是在各种媒质上(可移动磁盘、硬盘、CD等)永久存储的数据的有序集合。它是一种进行数据读写操作的基本对象。通常情况下文件按照树状目录进行组织,每个文件都有文件名、文件所在路径、创建时间、访问权限等属性。从概念上讲,流非常类似于单独的磁盘文件,它也是进行数据读取操作的基本对象。流为我们提供了连续的字节流存储空间。虽然数据实际存储的位置可以不连续,甚至可以分布在多个磁盘上,但我们看到的是封装以后的数据结构,是连续的字节流抽象结构。2.什么是输入/输出流?C#的输入/输出流分为哪2大类?答:流指的是一种数据流。为了处理数据流,人们把在程序和输入/输出(I/O)设备或文件之间进行传输的对象称为流。可从中读出一系列字节的对象称为"输入流";而能向其中写入一系列字节对象则称为"输出流"。C#中的所有输入输出,无论它是文件I/O还是涉及键盘和屏幕的I/O,都是通过流的使用来完成的。一个流就是以另一个对象为源或目的地传送信息的对象。流就像 一个管道,连通了信息的源及其目的地。如果输入数据流来自键盘,则程序从键盘读取数据;如果输入数据流来自文件,则程序从文件读取数据。类似地,输出数据流则输出至文件或屏幕。C#的输入/输出流可分为两大类,文本流(textstream)和二进制流(binarystream)。一个文本流是一行行的字符,换行符表示这一行的结束。一个二进制流是由与外部设备中的内容一一对应的系列字节组成的。使用中没有字符翻译过程,而且所读写的字节数目也与外设中的数目相同。根据ANSI标准的规定,一个二进制流可以有由程序所定义的一定数目空字节在其尾部。3.在C#中,文件种类通常分为哪两类?如何实现对文件的读写?答:C#中有两种类型的文件:二进制文件和文本文件。这两种文件都将数据以位流序列的方式存储数据,即一个0或1的序列。二进制文件是作为一个字节序列来处理的,而文本文件是作为一个字符序列来处理的。在C#程序中读写文件的关键是把输入输出流作为程序和一个命名文件之间的管道,通过流来读写文件数据。读写文件一般采用3个步骤的算法:(1)把一个I/O流连接到文件;(2)通过流读写数据;(3)关闭流。通常,FileStream类主要用于二进制文件的读写。而.NET中的StreamReader类和StreamWriter类为我们提供了按文本模式读写数据的方式。4.C#中的Directory类有哪些功能?举例说明其方法的用途。答:Directory类为我们提供了对磁盘和目录进行管理的功能,如复制、移动、重命名、创建和删除目录,获取和设置与目录的创建、访问及写入操作相关的时间信息。如:CreateDirectory方法用于创建指定路径中的所有目录;Delete方法用于删除指定的目录;Move方法能够重命名或移动目录;Exists方法用于确定给定路径是否引用磁盘上的现有目录;GetCurrentDirectory方法用于获取应用程序的当前工作目录;GetFiles方法用于返回指定目录中的文件的名称等。 测试题5.以下关于流的说法不正确的是。A、流就像一个管道,连通了信息的源及其目的地。B、流就是以另一个对象为源或目的地传送信息的对象。C、流传输的是二进制数据,以bit为单位传输和处理。D、System.out是连接程序和标准输出设备的一个输出流。答案:C6.字符流与字节流的区别是。A、前者是块读写,后者是字节读写B、每次读入的字节数不同C、前者带有缓冲,后者没有D、二者没有区别,可以互换使用答案:A7.以下程序代码段用于从文本文件中读入第一行,其中myfile是文件名,s是字符串变量。正确的程序代码段是。A、StreamReadersr=newStreamReader(myfile);s=sr.readLine();B、FileInfofi=newFileInfo(myfile);s=fi.OpenRead();C、StreamReadersr=newStreamReader(myfile);s=sr.OpenRead();D、FileStreamfs=newFileStream(myfile,FileMode.Open,FileAccess.Read,FileShare.None);StreamReadersr=newStreamReader(fs);s=sr.OpenRead(); 答案:A练习题8.判断程序A10_1.cs的运行结果(字符‘A’的ASCII码为65,字符‘a’的ASCII码为97)。//程序清单A10_1.cs:usingSystem;usingSystem.IO;namespaceA10_1{classpro{staticvoidMain(){StreamWritersw=File.CreateText("A10-1.txt");for(inti=0;i<26;i++){sw.Write("A"+i);sw.Write((char)("A"+i));}for(inti=0;i<26;i++){sw.Write("a"+i);sw.Write((char)("a"+i));}sw.Close();FileStreamfs=File.OpenRead("A10-1.txt");BinaryReaderbr=newBinaryReader(fs);Console.WriteLine("{0}{1}:{2}",br.ReadChar(),br.ReadChar(),br.ReadChar());fs.Seek(2*3,SeekOrigin.Begin);Console.WriteLine("{0}{1}:{2}",br.ReadChar(),br.ReadChar(),br.ReadChar());fs.Seek(25*3,SeekOrigin.Begin);Console.WriteLine("{0}{1}:{2}",br.ReadChar(),br.ReadChar(),br.ReadChar());fs.Seek(26*3,SeekOrigin.Begin);Console.WriteLine("{0}{1}:{2}",br.ReadChar(),br.ReadChar(),br.ReadChar());fs.Close();}}参考答案:65:A 67:C90:Z97:a9.编写程序A10_2.cs,使得程序每次都能显示上一次运行的时间。参考答案:usingSystem;usingSystem.IO;namespaceA10_2{classpro{staticvoidMain(string[]args){if(!File.Exists("A10_2.txt")){StreamWritersw=File.CreateText("A10_2.txt");sw.Write(DateTime.Now.ToString());sw.Close();Console.WriteLine("程序首次运行");}else{StreamReadersr=newStreamReader("A10_2.txt");Console.WriteLine("上次运行时间:"+sr.ReadLine());sr.Close();}}}}第11章数据库程序开发复习题1.简述数据库系统则主要由以下三大部分组成。答:一个数据库系统则主要由以下三大部分组成:•数据库按一定结构组织在一起的相关数据的集合•数据库管理系统(DBMS)它是专门负责组织和管理数据信息的软件•数据库应用程序它使我们能够获取、显示和更新由DBMS存储的数据 2.简要介绍关系数据库的组成要素。答:关系数据库模型是数据的逻辑表示,只需考虑数据间的关系而不必关心数据的物理结构。关系数据库中包括:表(Table)一个表就是一组相关的数据按行排列,象一张表格一样。比如一个出版社表存储着所有相关出版社的信息。其中,每一行对应一家出版社,在这一行中,包括该出版社的名称、城市、地址、电话、联系人、备注等具体信息,这些信息在表中组成了特定的列。如图11-1所示。字段(Field)在表中,每一列称为一个字段。每一个字段都有相应的描述信息,如数据类型、数据宽度等。记录(Record)在表中,每一行称为一条记录。索引(Index)为了加快访问数据库的速度,许多数据库都使用索引。3.SQL语言分为哪几类?SQL语言作为关系数据库管理系统中的一种通用的结构查询语言,已经被众多的数据库管理系统所采用。SQL语言功能强大,但语法并不复杂,按用途分为以下三类:•DML(DataManipulationLanguage数据操作语言)用于查询、修改或者删除数据•DDL(DataDefinitionLanguage数据定义语言)用于定义数据的结构,例如创建数据库中的表、视图、索引等•DCL(DataControlLanguage数据控制语言)用来授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视4.简要介绍数据源、数据提供者和数据集的定义和关系。答:数据源(DataSource)是指本地和远程的物理数据库,或者是XML文件。在传统的数据库程序设计中,开发者往往需要直接与数据源打交道,因而也就需要复杂、专用的接口。数据提供者(DataProvider)将如何实现与物理数据库或者XML文件连接的复杂过程细节对用户隐藏,展现在用户面前的只是简单地使用该部件轻松地完成连接到一个或多个数据源、传送命令,以及将数据传送到数据集(DataSet)中。数据集(DataSet)对象用来表示来自一个或多个数据源并保存在内存中的表和关系。DataSet 提供了一个操纵数据的临时工作区域或者称之为虚拟高速缓存器。它们的关系可以参考下图:数据数据集数据源提供者5.对比分析ADO与ADO.NET。参考答案:可以从以下几个方面来进行对比:数据的内存中表示形式在ADO中,数据的内存中表示形式为记录集。在ADO.NET中,它为数据集。它们之间有重要的差异。表的个数记录集看起来像单个表。如果记录集将包含来自多个数据库表的数据,则它必须使用JOIN查询,将来自各个数据库表的数据组合到单个结果表中。相反,数据集是一个或多个表的集合。数据集内的表称为数据表;明确地说,它们是DataTable对象。如果数据集包含来自多个数据库表的数据,它通常将包含多个DataTable对象。即,每个DataTable对象通常对应于单个数据库表或视图。这样,数据集可以模仿基础数据库的结构。数据集通常还包含关系。数据集内的关系类似于数据库中的外键关系,即它使多个表中的行彼此关联。例如,如果数据集包含一个有关投资者的表和另一个有关每个投资者的股票购买情况的表,则数据集可能还包含一个关系来连接投资者表的各个行和购买表的对应行。由于数据集可以保存多个独立的表并维护有关表之间关系的信息,因此它可以保存比记录集丰富得多的数据结构,包括自关联的表和具有多对多关系的表。数据导航和游标在ADO中,使用ADO中的MoveNext方法顺序扫描记录集的行。在ADO.NET中,行表示为集合,因此可以像依次通过任何集合那样依次通过表,或通过序号索引或主键索引访问特定行。DataRelation对象维护有关主记录和详细资料记录的信息,并提供方法使您可以获取与正在操作的记录相关的记录。例如,从Investor表的“NateSun”的行开始,可以定位到Purchase表 中描述其购买情况的那组行。“游标”是数据库元素,它控制记录导航、更新数据的能力和其他用户对数据库所做更改的可见性。ADO.NET不具有固有的游标对象,而是包含提供传统游标功能的数据类。例如,在ADO.NETDataReader对象中提供只进、只读游标的功能。连接效率在ADO.NET中,打开连接的时间仅足够执行数据库操作,例如“选择”(Select)或“更新”(Update)。可以将行读入数据集中,然后在不保持与数据源的连接的情况下使用它们。在ADO中,记录集可以提供不连接的访问,但ADO主要是为连接的访问设计的。ADO和ADO.NET中的不连接处理之间存在一个显著差异。在ADO中,通过调用OLEDB提供程序来与数据库通信。但在ADO.NET中,通过数据适配器(OleDbDataAdapter、SqlDataAdapter、OdbcDataAdapter或OracleDataAdapter对象)与数据库通信,这将调用OLEDB提供程序或基础数据源提供的API。ADO和ADO.NET之间的主要区别在于:在ADO.NET中,数据适配器允许控制将对数据集所做的更改传输到数据库的方式,方法是实现性能优化、执行数据验证检查或添加其他任何额外处理。应用程序间的数据共享在应用程序间传输ADO.NET数据集比传输ADO不连接的记录集要容易得多。若要将ADO不连接的记录集从一个组件传输到另一个组件,需要使用COM封送。若要在ADO.NET中传输数据,可以使用数据集,它可以传输XML流。相对于COM封送,XML文件的传输提供以下便利之处:a)、丰富的数据类型COM封送提供一组有限的数据类型(由COM标准定义的那些类型)。由于ADO.NET中的数据集传输基于XML格式,所以对数据类型没有限制。因此,共享数据集的组件可以使用这些组件一般会使用的任何丰富的数据类型集。b)、功能传输大型ADO记录集或大型ADO.NET数据集会使用网络资源;随着数据量的增长,施加于网络的压力也在增加。ADO和ADO.NET都使您可以最大限度地降低所传输的数据。但ADO.NET还提供另一个性能优势:ADO.NET不需要数据类型转换。而需要COM封送来在组件间传输记录集的ADO,则需要将ADO数据类型转换为COM数据类型。c)、透防火墙防火墙可以影响试图传输不连接的ADO记录集的两个组件。请记住,防火墙通常配置为允许HTML文本通过,但防止系统级请求(如COM封送)通过。 因为组件使用XML交换ADO.NET数据库,所以防火墙可以允许数据集通过。6.简述ADO.NET的体系结构。参考答案略。可以参照下图:应用程序DataSet对象DataReaderDatatable对象DataRelationDataTablessDataViewDataAdapter对象CommandBuilder对象Command对象Connection对象数据库1数据库2数据库nADO.NET中各个类的关系7.简单介绍使用ADO.NET技术开发一个典型的数据库应用程序的过程。参考答案略。可以参考下图: 数据应用程序开发基本流程测试题8.以下关于数据库的说法正确的是。A、数据库系统是特指数据库管理系统。B、非关系型数据库管理系统有:Access、MySql等。C、数据库管理系统是管理和维护数据库的程序系统。D、主键是表中某个唯一的数据字段。答案:C9.以下关于SQL语言的说法不正确的是。A、SQL语言是一种嵌入式开发语言。B、SQL语言是关系型数据库的公共语言。C、SQL语言是非过程化语言。D、SQL语言是一种通用的结构查询语言。答案:A练习题10.已知数据库中建立了一个名为StudentScore表,用于管理本年度各年级中每个学生的年均成绩,该表的结构如下: 字段名称字段类型含义说明StduentID数字学号Name文本姓名Sex文本性别Grade数字年级Score数字本年度的年均成绩使用保持连接的方式编写程序,查询StudentScore中不及格学生的学号、姓名、年级和成绩。并将结果在ListBox中显示出来。参考答案:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Data.SqlClient;namespaceA11_1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){listBox1.Items.Add("学号姓名年级成绩");//设置连接字符串stringconnectionString=Properties.Settings.Default.MyDatabaseConnectionString;//根据连接字符串创建SqlConnection实例 SqlConnectionconn=newSqlConnection(connectionString);//创建SqlCommand实例,并设置SQL语句和使用的连接实例SqlCommandcmd=newSqlCommand();cmd.CommandText="SelectStudentID,Name,Grade,ScoreFromStudentScoreWhere(Score<60)";cmd.Connection=conn;try{conn.Open();SqlDataReaderr=cmd.ExecuteReader();while(r.Read()==true){listBox1.Items.Add(string.Format("{0}{1}{2}{3}",r[0],r[1],r[2],r[3]));}r.Close();}catch(Exceptionerr){MessageBox.Show(err.Message,"成绩查询失败");}finally{conn.Close();}}}}11.编写程序,以“[学号][姓名]”的样式在comboBox1中显示StudentScore的内容。参考答案:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data; usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Data.SqlClient;namespaceA11_2{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){//设置连接字符串stringconnectionString=Properties.Settings.Default.MyDatabaseConnectionString;//根据连接字符串创建SqlConnection实例SqlConnectionconn=newSqlConnection(connectionString);//创建SqlCommand实例,并设置SQL语句和使用的连接实例SqlCommandcmd=newSqlCommand();cmd.CommandText="Select*FromStudentScore";cmd.Connection=conn;try{conn.Open();SqlDataReaderr=cmd.ExecuteReader();while(r.Read()==true){comboBox1.Items.Add(string.Format("[{0}]{1}",r[0],r[1]));}comboBox1.SelectedIndex=0;r.Close();} catch(Exceptionerr){MessageBox.Show(err.Message,"数据显示失败");}finally{conn.Close();}}}}12.已知数据库中定义了一张person表,表的数据结构如下:字段名称字段类型含义说明ID数字编号Name文本姓名Sex文本性别Age数字年龄ZIP文本邮政编码编写代码,在DataGridView中显示该数据表中年龄大于20的所有纪录,显示时以编号的升序排序,要求禁止用户编辑数据。参考答案:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Data.SqlClient;namespaceA11_3{ publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){stringconnectionstring=Properties.Settings.Default.MyDatabaseConnectionString;SqlConnectionconn=newSqlConnection(connectionstring);try{conn.Open();SqlDataAdapteradapter=newSqlDataAdapter("selectID,Name,Sex,AgefrompersonwhereAge>20orderbyID",conn);DataSetdataset=newDataSet();//如果不指定表名,则系统自动生成一个默认的表名adapter.Fill(dataset,"person");//可以使用索引引用生成的表dataGridView1.DataSource=dataset.Tables["person"];adapter.Dispose();}catch(Exceptionerr){MessageBox.Show(err.Message);}finally{conn.Close();}}privatevoidForm1_Load(objectsender,EventArgse){ //不允许用户直接在最下面的行添加新行dataGridView1.AllowUserToAddRows=false;//不允许用户直接按Delete键删除行dataGridView1.AllowUserToDeleteRows=false;}}}'