实验指导书 C#实验指导书.doc
实验一 C#集成开发环境实验目的(1)熟悉Visual Studio 2005的开发环境。(2)操作工具栏和项目工作区窗口。(3)创建控制台应用项目。实验准备和说明实验报告采用A4纸,封面一般包含实验目次、实验题目、班级、姓名、日期和机构名称。报告内容一般包括实验目的和要求、实验步骤、实验思考和总结。 Visual Studio 2005 是Microsoft公司基于.NET框架和多语言开发推出的目前极为流行的可视化编程环境。目前最新版本是Visual Studio 2008,该环境灵活性、完全可扩展以及具有强有力的Internet支持。实验步骤 启动Windows操作系统 启动和操作Visual Studio 2005选择“开始”菜单里面的Microsoft Visual Studio 2005,启动Visual Studio 2005,进入开发环境。 由于Visual Studio.NET所包括的各个语言工具,都使用相同的集成开发环境,所以在启动C#之前,要启动整个Visual Studio.NET。在开始菜单中选择Microsoft Visual Studio 2005进行启动,启动完毕后,打开“起始页Microsoft Visual Studio”窗口。要启动C#开发环境有两种方式,一种是单击“起始页”上的“打开项目”,选择现在已存在的C#项目文件;另一种是单击“起始页”上的“创建项目”,则打开一个“新建项目”对话框,如下图。在“项目类型”框中选择“Visual C#项目”,然后在“模板”框中任意选择一个项目模板(若是开发Windows应用项目,则选择“Windows应用程序”),并在下面“名称”文本框中设置新项目名称,然后单击“确定”按钮,一个新的C#的项目就创建了,并进入Visual StudioNET的集成开发环境。 C# 集成开发环境介绍C#的集成开发环境集成了设计、开发、编辑、测试和调试的多种功能,使得开发人员 能够方便、快速地开发应用程序。集成开发环境标题下面是菜单栏和工具栏。中央工作区是用来设计程序界面的窗体设 计器和代码编辑窗口。除此之外,即成开发环境的四周,有很多浮动窗口。菜单栏在菜单栏中,有若干个菜单标题,每个菜单标题都有一个下拉式菜单,主要菜单标题 如下。文件:主要包括新建、打开、保存、新建项目以及打开和关闭解决方案等命令。l 编辑:主要包含一些符合Windows操作风格的进行文件编辑的各项命令。如撤销、复制、粘贴、删除、查找和替换等命令。l 视图:包含显示与隐藏工具栏、工具箱(Toolbox)和各种独立的工具窗口的所有命令。l 项目:包括向当前项目添加、改变和删除组件、引用Windows对象和添加部件等命令。l 生成:包含代码生成的有关命令。l 调试:包含调试程序的命令,启动和中止当前应用程序运行的命令。l 数据:包含显示数据源和添加新数据源命令。l 格式:包括改变窗体上控件大小和对齐方式等命令。l 工具:包括进程调试、数据库连接、宏和外接程序管理、设置工具箱和选项等命令。l 窗口:包含一些屏幕窗口布局的命令。l 帮助:包含方便开发人员使用帮助信息的命令。工具栏工具栏是由多个图标按钮组成的,可提供对常用命令的快速访问。除了在菜单栏下面 显示的标准工具栏外,还有Web工具栏、控件布局工具栏等多种特定功能的工具栏。要显 示或隐藏这些工具栏,可选择“视图”菜单中的“工具栏”命令,或者在标准工具栏单击鼠 标右键,在弹出的菜单中选定所需的工具栏。标准工具栏各按钮如下图所示。 在C#的集成开发环境中,可以显示很多具有特定功能的窗口。为了方便程序开发人员的使用,通常可以将已打开的功能窗口重叠在同一位置上,通过切换其顶部或底部的选项标签就可以在不同的窗口之间切换。可以选择“视图”菜单下的相关命令显示或关闭这些功能窗口。单击窗口右上角的按钮可以把窗口固定在所在的位置,这时该按钮变成,再次单击这个按钮,可以使窗口重新浮动。例如,集成开发环境中间的工作区通常用来显示窗体设计器和代码编辑窗口(当然也可以将别的功能窗口拖动到这个位置上来),在此例中,单击其上方的“Form1.cs设计标签可以切换到代码窗口,单击“Form1.cs”标签可以切换到窗体设计器。工作区左侧的两个浮动功能窗口是工具箱与服务器资源管理器,可以单击窗口下面的标签在两个窗口之间切换。下面简要介绍一下C#集成开发环境中的主要功能窗口。 工具箱工具箱中包含了建立应用程序的各种控件以及非图形化的组件,如图110所示。 工具箱由不同的选项卡组成,各类控件、组件分别放在“数据”、“组件”、“所有 Windows窗体”、“对话框”、“常规”等选项卡下面。l “数据”选项卡中主要放置访问数据库的控件。l “组件”选项卡中放置一些系统提供的组件,如报表、消息队列等。l “对话框”选项卡中放置一些系统提供的对话框,如颜色、打开文件等。l “常规”选项卡默认为空,可以在这里保存常用的空间,包括自定义控件。l “所有Windows窗体”选项卡是最常用的选项卡,这个选项卡主要放置开发Windows应用程序所使用的控件,如文本框、标签框等,以后会陆续介绍这些控件。 解决方案资源管理器在C#中,项目是一个独立的编程单位,其中包含有窗体文件和其他一些相关的文件, 若干个项目就组成了一个解决方案。“解决方案管理器”对话框如下图所示。它以树状的结构显示整个解决方案中包括哪些项目以及每个项目的组成信息。在C#中所有包含C#代码的源文件都是以*.cs为扩展名,而不管它们是包含窗体还是普通代码,在解决方案资源管理器中显示这个文件,然后就可以编辑它了。在每个项目的下面显示了一个引用,在这里列出了该项目引用的组件。解决方案资源管理器窗口的上边有几个选项按钮,例如“刷新”、“显示”和“属性”等。通常,解决方案资源管理器隐藏了一些文件,单击“显示”选项按钮,可以显示出这些 隐藏的文件。“刷新”选项按钮的作用是可以对没有保存的项目文件进行刷新。单击“属性”选项按钮,则可以打开“属性”窗口,显示所选择对象的属性。 属性窗口属性窗口如下图所示,它用于显示和设置所选定的控件或者窗体等对象的属性。在应用程序设计时,可通过属性窗口设置或修改对象的属性。属性窗口由以下部分组成。(1)对象列表框:标识当前所选定对象的名称及所属的类。单击其右边的下拉按钮,可列出所含对象的列表,从中选择要设置属性的对象。(2)选项按钮:常用的左边两个分别是“按分类顺序”、“按字母顺序”选项按钮,可选择其中一种排列方式,显示所选对象的属性。“按分类顺序”是根据属性的性质,分类列出对象的各个属性;“按字母顺序”是按字母顺序列出所选对象的所有属性。(3)属性列表框:属性列表框由中间一条直线将其分为两部分,左边列出所选对象的属性名称,右边列出的是对应的属性值,可对该属性值进行设置或修改。如果属性值右侧有“”或 按钮,表示都有预定值可供选择。 代码编辑窗口 代码编辑窗口是专门用来进行代码设计的窗口,各种事件过程、模块和类等源程序代码的编写和修改均在此窗口进行,如下图所示。从“视图”菜单中选择“代码”命令、按F7键、用鼠标双击窗体或者窗体上的一个控件均可以打开代码编辑窗口。代码编辑窗口左上方为对象列表框,单击其下拉按钮,可显示项目中全部对象的名 称。右上方是事件、方法列表框,列出了所选定对象相关的事件、方法。通常,在编写事件 过程时,在“对象列表框”中选择对象名称,然后在“事件、方法列表框”中选择对应的事 件过程名称,即可在代码编写区域中构成所选定对象的事件过程模板,可在该事件过程模板 中编写事件过程代码。在C#的代码编辑窗口中有两个显著的特点。其一是表示项目窗体和控件的代码,现在 均是可见的,上图所示的代码编辑器窗口中“Public Class Form1”就是窗体Form1的代码段。其二是C#的代码窗口就像Windows资源管理器左边的树状目录结构一样,一个代码块、一个过程,甚至是一段注释都可以叠为一行,例如,在上图代码编辑窗口中,可以看到有几行代码左边有个“+”号或“-”号,单击“-”号可以将一段代码隐藏起来,只显示第一行,而单击“+”号,可以将其展开。这样使得程序结构一目了然,方便了代码的管理,更有利于程序的开发和设计。窗体设计器当创建和打开一个C#项目时,在其集成开发环境中的中间工作区域,将显示一个窗体 设计器。窗体是一个容器,能够放置应用程序所需要的所有控件以及图形、图片,并可随意 改变大小和移动方向。窗体设计器是用于设计和编制应用程序的用户接口,即设计应用程序 的界面。C#应用程序的设计,是以窗体为依托进行设计的。应用程序中的每一个窗口都有 它自己的窗体设计器,其中最常用的窗体设计器是Windows窗体设计器。在这个窗体设计 器上可以拖动各种控件,创建Windows应用程序界面。除此之外,在C#中创建项目时,还 会遇到用于创建Web界面的Web窗体设计器。 动态帮助窗口动态帮助窗口是通过“帮助”菜单下的“动态帮助”命令打开的,这是一个与上下文相关的的帮助系统。当单击不同的控件或者将光标在代码的不同关键字上移动时,动态帮助窗口中显示的内容将会随之发生变化。对于C#的初学者来说,利用这种“动态帮助”功能是非常有用的。 其他窗口l 类视图窗口:如下图所显示的类视图窗口,按照树状结构列出了解决方案里各个类以及其中包含的事件、方法和函数等。双击视图中的一个元素,即可打开这个元素的代码窗口,这对于浏览代码是一种很方便的方式。l 对象浏览器窗口:在对象浏览器窗口中,可以方便地查找程序中使用的所有对象的信息,包括程序中引用的系统对象和用户自定义的对象。对象浏览器的左边窗口以树状分层结构显示系统中所用到的所有类。双击其中一个 类,在右边窗口中就显示出这个类的属性方法、事件等。对象浏览器窗口如下图所示。l 服务器资源管理器:C#是面向网络的开发工具,在软件开发中,利用服务器资源管理器可以方便地监控和管理网络上的其他服务器。“服务器资源管理器”窗口如下图所示。l “输出”窗口:在“输出”窗口中,可以输出程序运行时产生的信息,包括应用程序中设定要输出的信息和编程环境给出的信息,如下图所示。l 命令窗口:“命令窗口”为用户提供了一个用命令方式与系统交互的环境,如下图所示。在“命令窗口”中用户可以直接使用C#的各种命令,例如直接输入“toolbox”命令,就可以调出工具箱。 编制控制台程序结构体和类输入以下程序并运行,从运行结果中可以看出结构体和类有什么差别?using System;struct SContact public string m_name; public int m_age; public string m_telephone;class CContact public string m_name; public int m_age; public string m_telephone = "Unknown"class ValueTypeVersusReferenceType public static void Main( ) /Struct SContact s1; s1.m_name = "李明" s1.m_age = 20; s1.m_telephone = "Unknown" SContact s2 = s1; s2.m_name = "张鹏" s2.m_age = 25; s2.m_telephone = "Unknown" Console.WriteLine("修改结构变量后:"); Console.WriteLine(s1.m_name); Console.WriteLine(s1.m_age); /Class CContact c1 = new CContact(); c1.m_name = "李明" c1.m_age = 20; CContact c2=c1; c2.m_name = "张鹏" c2.m_age = 25; Console.WriteLine("修改类变量后: "); Console.WriteLine(c1.m_name); Console.WriteLine(c1.m_age); 交互程序输入以下程序并运行,从运行结果中可以看出结构体和类有什么差别?using System;namespace P2_4 class SelectOutput static void Main() Console.WriteLine("请选择要显示的内容:"); Console.WriteLine("1开发环境"); Console.WriteLine("2编程语言"); Console.WriteLine("3项目类型"); Console.WriteLine("4退出"); /读取并判断用户输入 int i=Console.Read(); if (i='1') Console.WriteLine("Microsoft Visual StudioNET"); else if (i='2') Console.WriteLine("C Sharp"); else if (i='3') Console.WriteLine("控制台应用程序"); 这段程序本身不难理解,但有两个值得注意的问题:u Console的Read方法返回值是整数类型int,但这个返回值和用户输入的整数并不相同!尝试按下述方法修改代码: if (i = 1) Console.WriteLine("Microsoft Visual Studio .NET");看看运算结果如何?u 使用Read方法读取输入并不立即响应,而是要等到用户按下回车键之后。如果要即时做出响应,可以改用Console的ReadKey方法,如以下程序所示:using System;namespace P2_5 class SelectOutput1 static void Main() Console.WriteLine("请选择要显示的内容:"); Console.WriteLine("1开发环境"); Console.WriteLine("2编程语言"); Console.WriteLine("3项目类型"); Console.WriteLine("4退出"); /读取并判断用户输入 ConsoleKeyInfo k=Console.ReadKey(); if (k.KeyChar='1') Console.WriteLine("Microsoft Visual StudioNET"); else if (k.KeyChar='2') Console.WriteLine("C Sharp"); else if (k.KeyChar='3') Console.WriteLine("控制台应用程序"); 实验二 C#基本程序设计实验目的 掌握常用的C#语句使用方法 掌握C#中存取修饰符号的使用方法。 熟悉C#中异常处理机制 实验要求实验之前要认真阅读上课的课件以及教科书,针对性地熟悉以下要点: 熟悉常用的C#语句 熟悉C#的封装机制。 熟悉C#中异常处理机制。实验内容类的存取修饰符的用法输入以下程序代码,并调试结果,分析结果。abstract、sealed 修饰符using System;abstract class AbstractClass abstract public void MyMethod( ); sealed class DerivedClass:AbstractClass public override void MyMethod() Console.WriteLine("sealed class"); public class TestApp public static void Main() DerivedClass dc = new DerivedClass(); dc.MyMethod(); internal、virtual修饰符using System;internal class Triangle protected int m_a, m_b, m_c; public Triangle(int a, int b, int c) m_a=a; m_b=b; m_c =c; public virtual double Area( ) / Heronian formula double s=(m_a+m_b+m_c)/2.0; double dArea=Math.Sqrt(s*(s-m_a)*(s-m_b)*(s-m_c); return dArea; internal class Prism:Triangle private int m_h; public Prism(int a,int b,int c, int h):base(a,b,c) m_h=h; public override double Area() double dArea=base.Area()*2.0; dArea+=m_a*m_h-m_b*m_h+m_c*m_h; return dArea; class PrismApp public static void Main() Prism prism=new Prism(2,5,6,1); Console.WriteLine(prism.Area(); 程序异常时的处理输入并运行以下程序,显然是会不正常的,写出运行结果。using System;class NotHandled static void Main() int a=0, b=5; Console. WriteLine("Before exception is generated. "); b=b/a; 当有异常发生时,程序应当合理地处理异常,消除产生异常产生的原因,然后继续运行。 C#通过throw、try、catch和finally语句实现结构化、统一和安全的异常处理机制。l 使用trycatch语句来捕获异常 为了捕获并处理异常,用户把可能出现异常的语句放到try子句中。假如这些语句在执行中出现异常时,try子句就会捕获异常,然后转移到相应的catch子句中;如果try子句中没有异常,就会执行trycatch结构后面的代码。 在通常情况下,try子句伴随着多个catch子句,每一个catch子句对应一种特定的异常,就好像switchcase子句一样。请输入以下程序,调试并分析运行结果using System;class ExceDemo2 static void Main( ) int arr1=2, 5, 8, 3,13,32,56,61; /数组arr1比arr2长 int arr2=1, 0, 2, 3, 0, 4; for (int j=0; j<arr1.Length; j+) try Console.WriteLine("0/1=2",arr1j, arr2j, arr1j/arr2j); catch( DivideByZeroException e) /捕获异常 Console. WriteLine(" 除数不能为0"); catch( IndexOutOfRangeException e) /捕获异常 Console. WriteLine(“数组访问越界"); 上面的程序不仅捕获了除0错误也捕获了数组访问越界错误。在上例中,每个catch语句只响应类型相匹配的异常。有时,需要捕获所有的异常,而不管它是什么类型的异常。使用不带参数的catch语句就可以做到这一点。 请输入以下程序,调试并分析运行结果:using System;class ExceDemo2 static void Main( ) int arr1=2,5,8,3,13,32,56,61; /数组arr1比arr2长 int arr2=1,0,2,3,0, 4; for (int j=0; j<arr1.Length; j+) try Console.WriteLine("0/1=2",arr1 j, arr2j, arr1j/arr2j); catch Console.WriteLine(" 一些异常发生"); l 使用throw语句抛出异常 前面的程序一直捕获由C#自动产生的异常。但使用throw可以人为抛出异常。throw的一般语法格式为: throw异常对象请输入以下程序,调试并分析运行结果:using System;class ThrowDemo static void Main() try Console.WriteLine("Before throw. "); throw new DivideByZeroException(); catch (DivideByZeroException e) Console.WriteLine("Exception caught. "); Console.WriteLine("After try/catch block. "); 以上程序是人为抛出DivideByZeroException异常。 l 使用finally语句 使用finally语句可以构成try-finally或try-catch-finally的形式。当与try块一起使用时,不管是否发生了异常,都将执行finally块中的语句。因此,用户可以在finally语句 中执行一些清除资源的操作。请输入以下程序,调试并分析运行结果:using System;class finallyDemo static void Main() try Console.WriteLine("try语句中抛出一个异常"); throw new NullReferenceException(); catch Console.WriteLine("捕获所有类型的异常"); finally Console.WriteLine("执行finally语句块中的语句"); 实验三 窗体程序练习 实验目的掌握常用控件的使用掌握类的定义及对象的创建,掌握字段的声明与使用,掌握构造函数与重载构造函数的声明与使用,掌握方法的声明与使用。掌握调用方法时的参数传递特别是对象参数的传递。 实验要求 设计一个Windows应用程序,根据输入的学生相关信息单击“创建对象”按钮,创建学生对象,并显示所创建学生对象的信息,如图2-1所示。如果学生信息被修改,单击“修改对象值”按钮,显示修改后学生对象的信息,如图2-2所示。如果学生信息未被修改,单击“修改对象值”按钮,则显示对象未被修改的提示,如图2-3所示。如果学生对象有成绩信息,单击“统计”按钮,能对学生对象的成绩进行统计,并显示学生的单科成绩、总分与平均分,如图2-4所示。图2-1 创建对象 图2-2 修改对象(己作修改)图2-3 修改对象(未作修改) 图2-4 统计成绩实验步骤设计程序界面新建一个C#项目,向窗体中添加六个文本框控件textBoxltextBox6,3个按钮控件button1button3,7个标签控件label1label7。适当调整各控件的大小及位置,如图2-5所示。图2-5 设计界面 图2-6 对象的Text属性值 设置对象属性窗体与控件的Text属性如图2-6所示。代码设计中使用到的控件的Name属性见表2-1。表2-1 控件对象名称Name属性设置 编写事件代码 打开代码设计视图,在程序代码最后一个大括号的上方定义类代码如下:public class Student /类名为Student private string id,name,sex; private int age,scor1,scor2; public string ID /声明属性 get return id; set id=value; public string Name /声明属性 get return name; set name=value; public string Sex /声明属性 get return sex; set sex=value; public int Age get return age; set age=value; public int Scor1 get return scor1; set scor1 =value; public int Scor2 get return scor2; set scor2=value; /定义初始化所有数据成员的构造函数 public Student(string iid,string nname,string ssex,int aage,int sscor1,int sscor2) id=iid; name=nname; sex=ssex; age=aage; scor1=sscor1; scor2=sscor2; /重载只初始化学号、姓名、性别、年龄的构造函数 public Student(string iid,string nname,string ssex,int aage) id=iid; name=nname; sex=ssex; age=aage; public int Total( ) return scor1 +scor2; public float Average() return (float)(scor1 + scor2) / 2; 找到代码public partial class Form1 : Form,在其下大括号的下方设计声明Student类对象代码如下: private Student student;同时再定义声明CreateStudent方法、SetStudent方法、CountScor方法与ShowStudent方法代码如下:public void CreateStudent(Student stu) /创建对象方法 student = stu; public void SetStudent(string id, string name, string sex, int age,int scor1, int scor2) student.ID = id; student.Name = name; student.Age = age; student.Sex = sex; student.Scor1 = scor1; student.Scor2 = scor2; public string CountScor(Student s) /汁算成绩方法 string result; result = " 成绩1:" + s.Scor1; result += " 成绩2:" + s.Scor2 + "n" result += " 总分:" + s.Total(); result += " 平均分:" + s.Average(); return result; public string ShowStudent(Student stu) /显示学生信息方法 string result = "学号:" + stu.ID; result += "姓名:" +stu.Name; result += "性别:" +stu.Sex; result += "年龄:" +stu.Age+"n" result += "成绩1:"+stu.Scor1; result += "成绩2:"+stu.Scor2; return result; “创建对象”按钮的 Click事件代码为:private void button1_Click(object sender, EventArgs e) string s1=txtID.Text; string s2=txtName.Text; string s3=txtSex.Text; string s4=txtAge.Text; string s5=txtScor1.Text; string s6=txtScor2.Text; if(s1=""|s2=""|s3=""|s4="") /判断学号、姓名、性别与年龄文本框是否为空 lblResult.Text = "创建对象至少需要学号、姓名、性别与年龄等数据,请输入!" return; int ss4 = int.Parse(s4); if (s5 = "" | s6 = "") /如果成绩1与成绩2无信息,则调用四参数构造函数