《[工学]C实验报告附答案.doc》由会员分享,可在线阅读,更多相关《[工学]C实验报告附答案.doc(79页珍藏版)》请在三一文库上搜索。
1、面向对象程序设计C#实验指导及报告书 / 学年 第 学期姓 名:_学 号:_班 级:_指导教师:_计算机科学与工程学院2011实验目录实验一 创建简单的.NET应用程序3实验二 选择和循环10实验三 数组和字符串处理15实验四 类和对象编程练习21实验五 继承与多态编程练习28实验六 接口和集合36实验七 文件和输入输出45实验八 代理和事件50实验一 创建简单的.NET应用程序一、实验目的1了解C# 基本程序结构;2熟悉命令行方式下C#程序编写、编译、调试和执行过程;3了解VS2005集成开发环境的功能和特点。二、预习内容1一个C#应用程序,从编写到运行,要经过哪几个步骤?三、实验内容1.
2、调试并运行下面程序,并写出运行结果:using System;class SimpleProgramstatic void Main() Console.WriteLine(“Hello!nWorld.”);运行结果(注意,按照屏幕输出格式写):Hello!World2. 调试并运行下面程序,并写出运行结果:using System;class StarTrianglestatic void Main(string args) int i, j, k; for (i = 0; i = 3; i+) for (j = 0; j = 2 - i; j+) Console.Write( ); /一个
3、空格 for (k = 0; k = 2 * i; k+) Console.Write(*); Console.WriteLine(); Console.ReadKey();运行结果(注意,按照屏幕输出格式写): * * *3. 下面是一个模拟计算器的程序(两个操作数都为正整数)。计算器应该能够执行以下算术操作:加法、减法、乘法、除法。调试并运行下面程序,验证当从键盘输入8和2两个整数时,选择进行乘法时的计算结果。注意:程序输入时要区分大小写。using System;class CalcNumberint number1,number2;char option;int result;publ
4、ic void Number()Console.WriteLine(“Enter the First Number:”);number1=Convert.ToInt32(Console.ReadLine();Console.WriteLine(“Enter the Second Number:”);number2=Convert.ToInt32(Console.ReadLine();Console.WriteLine(“Main Menu”);Console.WriteLine(“1.Addition”);Console.WriteLine(“2.Subtraction”);Console.W
5、riteLine(“3.Multiplication”);Console.WriteLine(“4.Division”);Console.WriteLine(“Enter the Operation you want to perform:”);option=Convert.ToChar(Console.ReadLine();switch(option)case 1: result=number1 + number2; break;case 2: result=number1 - number2; break;case 3: result=number1 * number2; break;ca
6、se 4: result=number1 / number2; break;default: Console.WriteLine(“Invalid Option”); return;Console.WriteLine(“The result is 0” , result);class TestCalcstatic void Main(string args) CalcNumber obj = new CalcNumber();obj.Number();从键盘输入8和2两个整数时, (1) 选择3时的运行结果:(2) 选择5时的运行结果:(1): The result is 16(2): Inv
7、alid Option从键盘输入的8和two时(第二个数为非整数),程序运行结果:显示错误4.在保持功能不变的情况下,改写上例代码如下:using System;class CalcNumberint number1,number2;char option;public void GetNumber()Console.WriteLine(“Enter the First Number:”);number1=Convert.ToInt32(Console.ReadLine();Console.WriteLine(“Enter the Second Number:”);number2=Conver
8、t.ToInt32(Console.ReadLine();public void GetOption() Console.WriteLine(“Main Menu”);Console.WriteLine(“1.Addition”);Console.WriteLine(“2.Subtraction”);Console.WriteLine(“3.Multiplication”);Console.WriteLine(“4.Division”);Console.WriteLine(“Enter the Operation you want to perform:”);option = Convert.
9、ToChar(Console.ReadLine();public int Compute()int result;switch(option)case 1: result=number1 + number2; break;case 2: result=number1 - number2; break;case 3: result=number1 * number2; break;case 4: result=number1 / number2; break;default: throw new InvalidOperationException (“Invalid Option”);retur
10、n result;class TestCalcstatic void Main(string args) tryCalcNumber obj = new CalcNumber();obj.GetNumber();obj.GetOption();int result = obj.Compute();Console.WriteLine(“The result is 0” , result);catch(Exception e)Console.WriteLine(e.Message);比较4和3的运行结果是否完全相同:结果完全相同将Main()函数中的try和catch部分代码去掉后,运行结果又会怎
11、样?结果无法运行体会程序4的结构与程序3相比哪一个更好,好在哪里?程序4更好因为程序4考虑问题更全面,结果更精确四、实验小结在程序的调试过程中,会遇到哪些问题?应该如何去解决这些问题?五、选做实验下面程序有错误,请在调试过程中找出错误,并加以修改。根据运行结果说明该程序解决的是什么问题?请写出出错信息及修改方法:程序源代码:using System;class Appstatic long GetFact(int n)long ret = 1 ;for(i = 1; i n; i+)ret *= i;return ret;static void Main()int n = 5; Console
12、.WriteLine(“0 != 1”, n , GetFact(n);运行结果:程序求解的是什么问题?六、教师评分实验预习20%实验过程20%实验结果30%实验报告30%总成绩实验二 选择和循环一、实验目的1. 掌握C#数据类型和表达式的特点和用法。2. 熟练掌握单分支、双分支、多分支选择语句的格式与功能,能正确选取选择语句来设计选择结构的程序。3. 熟练掌握while、do-while、for、break语句、continue语句的格式和功能;并能根据循环结构的要求正确选取循环语句来实现循环和多重循环。二、预习内容1C#的内置数据类型有哪些? 2从存储角度看.NET将变量的类型分为值类型和
13、引用类型,它们两者有何区别(举例说明)?3查阅MSDN了解Random类,Math类的用法。三、实验内容1调试并运行下面程序,写出运行结果:using System;class ThrowRollpublic static void Main()int roll = 0;Random rd = new Random(); /创建一个存储随机数的变量rdConsole.Write(开始掷筛子);for(int count=0; count5; count+)roll = (int) rd.Next(1,7); /生成一个1-6之间的随机整数Console.Write (这次掷的筛子是:0 ,ro
14、ll);switch(roll)case 1:case 3:case 5:Console. Write (筛子是奇数);break;case 2:case 4:case 6:Console. Write (筛子是偶数);break;default:Console. Write (筛子不在1-6之间);break;Console.WriteLine(“它的平方根是0”, Math.Sqrt(roll); 程序运行结果:2.某服装店经营套服,也单件出售,若买的不少于50套,每套80元,不足50套,每套90元,若只买上衣每件60元,只买裤子每条45元,从键盘读入所买上衣coat和裤子trourser
15、s件数,计算应付款money?提示: (1)先计算成套的衣服多少钱? (2)再计算剩下的单件的上衣、单件的裤子多少钱;(3)计算总付款程序代码:要求用以下三套测试数据测试程序:a) coat: 55, trousers: 70b) coat: 55, trousers: 40 c) coat: -5, trousers: 3 , 此时应显示错误信息运行结果:3. 编程输入年份月份,打印该月的天数变量命名要求: 年份:year;月份:month;计算结果:天数days程序代码: 输入年份:2008;月份:10,运行结果:年份:2008;月份:2,运行结果:年份:2009;月份:1,运行结果:年份
16、:2009;月份:2,运行结果:4.计算机来当一年级的算术老师,要求给出十道两位数的四则运算的算术题,每道题10分,学生输入该题的答案,计算机根据学生的答案判断正确与否,当结束时给出成绩。 (提示:用Random类产生两个两位数的随机数)程序代码:四、实验小结谈谈本次实验的心得、体会?五、选做实验编写一个程序打印九九乘法表11=121=2 22=431=3 32=6 33=941=4 42=8 43=12 44=16六、教师评分实验预习20%实验过程20%实验结果30%实验报告30%总成绩78实验三 数组和字符串处理一、实验目的1. 要求掌握一维数组、多维数组(主要指二维)的创建、初始化、数组
17、元素的引用等方法。2. 掌握冒泡排序算法。3. 掌握二分查找算法。4. 掌握字符串处理的相关方法。二、预习内容1如何创建一个能存放十个整数的一维数组intArr?2如何创建一个如下图的不等长的存放整数的二维数组jagArr?21 543 09876 3查阅MSDN,至少写出String类的五个方法,并说明该方法的作用?三、实验内容1. 用C#实现对从键接收一组非零整数进行排序。要求:1)用选择或冒泡升序排 2)从控制台获取数据、排序、输出数组功能分别做成三个方法。 3)安排方法的调用,注意方法调用时参数的传递。程序代码:2 数组A中的N(0N-1)origin = origin.Replace
18、(smod, );return origin;elsereturn null;class Program static void Main(string args) string str = hellxyzo,wxyzoxyzrldxyz.; string smod = xyz; string newString; newString = DealString.Del(str, smod); Console.WriteLine(newString); Console.ReadKey(); 运行结果:程序完成什么样功能?5 用C#编程实现将数字字符串转换为数字要求: (1)可以转换带小数点的数字
19、字符串。(2)按从左到右的顺序转换(例如456abc可以转换为456,12ab567可以转换为12 故遇到非数字字符就从左截断,其它忽略)。 (3)要求纯算法实现(不可以使用C#中特有的转换方法,如类似Convert.ToInt32()这样现成的转换方法。推荐使用if for while等这样在所有语言里通用的语句实现)。程序代码:四、实验小结谈谈在C#中,数组的使用和字符串处理的心得和体会?五、选做实验已知一个已经从小到大排序的数组,这个数组中的一个平台就是指连续的一串值相同的元素,并且这一串元素不能再延伸,例如,在1,2,2,3,3,3,3,4,4,5,5,5,6中1,2,2,3,3,3,
20、3,4,4,5,5,5,6划线部分都是一个平台,试编写程序,接收任意一个已排好序数组,把这个数组中最长的平台找出来。在上面的例子中3,3,3,3就是该数组中最长的平台,平台长为4。六、教师评分实验预习20%实验过程20%实验结果30%实验报告30%总成绩实验四 类和对象编程练习一、实验目的1. 掌握类对象的定义; 2. 了解类的封装方法,以及如何创建类和对象;3. 掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数。4. 能够根据给定的要求定义类并实现类的成员函数;5. 理解类的成员的访问控制的含义,公有、私有和保护成员的区别6. 掌握属性的作用和使用。二、
21、预习内容1类和对象两者之间的有何区别和联系?2C#中定义一个类的语法格式是什么?三、实验内容1. 定义一个学生类,其中有学号、姓名、年龄3个数据成员,以及若干成员函数。同时编写主函数使用这个类,实现对学生数据的赋值和输出。要求:使用构造函数实现对数据的输入,使用成员函数实现对数据的输出。 调试下列的参考代码。class Studentprivate string id;private string name;private int age;public Student(string id,string name,int age)this.id = id;this.name = name;thi
22、s.age = age;public void Display()Console.WriteLine(id=0,name=1,age=2,id,name,age);public static void Main()Student s1 = new Student(001,zhangshan,16);s1.Display();Console.ReadKey();以上程序使用了构造方法,请回答(1)构造方法何时被调用?(2)关键字this有何作用?(3)在实例化了s1对象后,如要将s1对象的id改为002,程序将如何修改。2. 如果已知一个日期为2007/3/8,求10天后是哪一天,367天后呢?
23、设计思路:(1)定义一个MyDate类,成员有:class MyDate /数据成员private int day;privateint month;private int year;/方法成员public MyDate(int y,int m,int d) /构造一个日期public void MonthInc() /月份加1public viod DayInc () /日期加1public void DayInc(int x) /日期加x天public void Show () /显示日期信息(2)对MyDate类进行测试,测试代码如下:class Testpublic static vo
24、id Main()MyDate d1 = new MyDate(2007,3,8);MyDate d2 = d1;d1.DayInc(10);d1.Show();d2.DayInc(367);d2.Show();要求:将MyDate类代码编写完整,以实现程序所要求的功能。如果将Main方法中的语句MyDate d1 = new MyDate(2007,3,8);改为:MyDate d1 = new MyDate(2007,33,58);其它语句不变,程序运行结果是什么?运行结果:说明:必须对生成的日期做合法性验证,规则当year小于1900年,则year置为1900,否则year合法。mont
25、h不在有效范围内则month置1,day应当月有效,否则置1。(提示在MyDate类中增加两个方法:)public void SetDate(int d,int m,int y) /设置日期private bool CheckDate(int y,int m,int d) /对日期的有效性检查进一步,求两个日期之间的相差的天数,Date类如何改进?3. 设计一个数学中的分数类(Fraction),并测试结果是否正确。要求:(1)一个分数由分子和分母构成(2)生成的分数对象的分子和分母必须满足的条件:A、分母不为零 B、分子和分母既约(化简后最大公约数只能为1) C、分子和分母异号时分子为负(3
26、)分数对象之间能够四则运算,分数与整数之间也能够完成四则运算(4)分数对象之间能够比较大小,分数与整数之间也能够比较大小(5)一个分数的对象能够转化为小数形式程序代码:测试分数类Fraction,写出测试代码,所用测试数据和运行结果1) 测试代码2) 所用测试数据3)程序运行结果:四、实验小结六、教师评分实验预习20%实验过程20%实验结果30%实验报告30%总成绩实验五 继承与多态编程练习一、实验目的1. 理解继承的含义,掌握派生类的定义方法和实现;2. 理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。3. 编写体现类的继承性(成员变
27、量,成员方法,成员变量隐藏)的程序;4. 编写体现类多态性(成员方法重载,构造方法重载)的程序。二、预习内容1什么叫继承?继承的优点是什么?2什么是多态?多态的优点是什么?三、实验内容1. 创建一个形状类Shape,作为各种形状的基类,然后用继承来创建Circle类、Rectangle类和Square类,通过继承形成一个清晰的类层次结构。(1) 创建Shape类,在该类中定义属性name表示形状的名称,定义虚方法CalcPerimeter()和CalcArea()分别用于计算形状的周长和面积、虚方法Show()用于显示形状的所有属性的信息,在基类中Show()方法打印“形状尚未定义”信息。(2
28、) 创建Circle类,它从Shape类派生,在该类中增加属性radius表示半径,定义构造方法对radius属性及从基类继承的属性初始化,对继承自基类的虚方法CalcPerimeter()和CalcArea()进行重写以实现对圆周长和面积的计算;重写虚方法Show(),输出圆的所有属性信息。(3) 创建Rectangle类,它从Shape类派生,在该类中增加属性length和width表示长和宽,定义构造函数完成所有(自身的和继承来的)属性的初始化,对从基类继承的虚方法进行重写实现对矩形周长和面积的计算。重写虚方法Show(),输出矩形的所有属性信息。(4) 创建Square类(正方形),它
29、从Rectangle类派生,除长、宽相等外其它与Rectangle相同。用UML图表示出上述四个类的联系图:编写以上各个类之后,用如下测试程序,验证设计的类的正确性class ShapeTest static void Main(string args) Circle c1 = new Circle(circle, 5); c1.Show(); Rectangle r1 = new Rectangle(rectangle, 3, 5); r1.Show(); Square s1 = new Square(Square, 5); s1.Show(); Console.ReadKey(); 程序应
30、该输出的结果:测试代码如果改为如下的写法,输出的结果又是什么?class ShapeTest static void Main(string args) Shape shapes = new Shape4; shapes0 = new Circle(circle, 6); shapes1 = new Rectangle(rectangle1, 2, 8); shapes2 = new Rectangle(rectangle2, 4, 7); shapes3 = new Square(square, 9); for (int i = 0; i shapes.Length; i+) shapesi
31、.Show(); 程序输出结果: 思考并回答问题:(1) 基类Shape是否可以实例化对象。如果将基类中虚方法Show()关键字virtual去掉程序运行结果会怎样?(2) 将类Shape定义为抽象类,把Show()方法定义为抽象方法(abstract)后,Shape是否可以实例化对象。(3) 将Shape类的Show()方法定义为抽象方法后,再运行上述测试程序,查看效果,并回答抽象方法是否可以含 主体?2. 创建一个BankAccount类,作为各种账户的基类。然后用继承来创建两个专用的账户类:SavingAccount(储蓄账户)类和CheckingAccount(支票账户)类。(1)创建
32、BankAccount类,它拥有下列成员类成员描述owner账户所有者(私有字段)ID账户号码(公有属性),ID就取owner名balance账户余额(私有字段)Balance账户余额(只读公有属性),用有读取balance的值构造方法带一个参数,为owner赋初值,balance赋初值为0Deposit存款方法Withdraw取款方法BankAccount类的代码: (2)创建SavingAccount类,该类从BankAccount派生新特征:A 储蓄账户能获得利息,附加一个属性Interest 表示利率.B 着时间的推移,储蓄账户可以获得利息,所以为SavingAccount类增加一个A
33、ddInterest()方法,用于把利息增加到原balance基础上。利息的计算规则为interest*balance;C 同一人可同时拥有不同类型的账户,用ID属性来表示不同账户类型,ID=owner+”-S”(提示:将基类的ID加上virtual关键字,在子类中根据需要重写)。SavingAccount类的代码: (3)创建CheckingAccount类,该类从BankAccount派生新特征:A 取款操作需收取0.25元的手续费外,其它部分与BankAccount相同(提示:在子类CheckingAccount中重写从基类继承的Withdraw方法。)BID属性代表账户类型,ID=ow
34、ner+”-C”CheckingAccount类的代码: (4)编写测试代码:class TestAccountpublic static void Main()SavingAccount s1=new SavingAccount(“Tom”);s1.Deposit(150M);s1.Withdraw(50M);s1.Interest=0.05M;s1.AddInterest();Console.WriteLine(“0:1:c”, s1.ID, s1.Balance);CheckingAccount c1=new CheckingAcount(“Yorck”);c1.Deposit(150M
35、);c1.Withdraw(50M);Console.WriteLine(“0:1:c”, c1.ID, c1.Balance);运行结果:(5)多态地使用派生类class TestAccountpublic static void OperateAcc(BankAccount account)account.Deposit(150M);account.Withdraw(50M);Console.WriteLine(“0:1:c”, account.ID, account.Balance);public static void Main()SavingAccount s1=new SavingAccount(“Tom”);s1.Interest=0.05M;s1.AddInterest();OperateAcc(s1); CheckingAccount c1=new CheckingAcount(“Yorck”);OperateAcc(c1);比较(5)和(4)代码写法,谈谈你对多态的理解?四、实验小结五、教师评分实验预习20%实验过程20%实验结
链接地址:https://www.31doc.com/p-1976587.html