C#NET程序设计实验报告.docx
《C#NET程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《C#NET程序设计实验报告.docx(78页珍藏版)》请在冰点文库上搜索。
C#NET程序设计实验报告
福建农林大学金山学院
实验报告
课程名称:
.NET程序设计
姓名:
洪绵绵
系:
信息与机电工程系
专业:
计算机科学与技术
年级:
2008
学号:
082231029
指导教师:
林松
职称:
讲师
2010年12月29日
实验项目列表
序号
实验项目名称
成绩
指导教师
1
实验一、数组、类、接口与结构(验证性2学时)
林松
2
实验二、委托与事件(验证性2学时)
林松
3
实验三、文件与Windows窗体程序设计(验证性2学时)
林松
4
实验四、数据库操作1(综合性2学时)
林松
5
实验五、数据库操作2(综合性,2学时)
林松
福建农林大学金山学院实验报告
系:
信息与机电工程专业:
计算机科学与技术年级:
2008级
姓名:
洪绵绵学号:
082231029实验室号_608计算机号B3
实验时间:
2010.11.26上午一二节指导教师签字:
成绩:
实验一数组、类、接口与结构
一、实验目的和要求
1、了解数组、类、接口和结构的定义、概念。
2、了解结构和类的区别。
3、掌握数组的声明、实例化、初始化和访问。
4、掌握类、接口的声明和使用,结构的声明和调用。
二、实验内容和原理
1、屏幕打印10行杨辉三角,逐行输出,用到Console.Write("{0,5}",A[i,j]);和Console.WriteLine();语句。
2、创建抽象基类Shape和派生类Rectangle,Circle利用多态性实现Area(计算面积)和Show(在屏幕上显示图形名称和面积)抽象方法
3、声明一个接口ICDPlayer,包含4个接口方法:
Play(),Stop(),NextTrack()和PreviousTrack(),以及一个只读属性CurrentTrack创建类CDPlayer实现该接口,模拟CD的播放、停止、下一音轨、上一音轨的操作。
4、声明一个表示平面坐标系中的点的结构体CoOrds,包含字段x,y,以及带2个参数的构造函数。
分别利用三种不同的方法(默认构造函数、有2个参数的构造函数、先声明结构体变量再对其x,y字段赋值),创建3个平面坐标点变量。
求这3个点所构成的三角形面积。
注意判断3个坐标点是否可以构成三角形。
三、实验环境
1、硬件:
PC机
2、软件:
windowsXP、VS2008
四、算法描述及实验步骤
1、
(1)打开记事本,编写代码。
(2)定义一个二维数组,杨辉三角只需处理(赋值和输出)下三角各元素即可。
所有下三角各元素初始化为1。
(3)杨辉三角下三角各元素满足如下条件:
第一列及对角线上的元素均为1;其余每
个元素等于它上一行同一列元素与上一行前一列元素之和,即:
A[i,j]=A[i-l,j]+A[j-1]。
(4)屏幕打印数组中的三角中各元素,可逐行输出(Console.Write("{0,5}",A[i,j]);Console.WriteLine();)
(5)保存记事本文件为exp1_1.cs
(6)在命令行界面(桌面开始程序vs2008vstoolsvs2008命令提示)编译源文件(csc…\exp1_1.cs)、运行(exp1_1.exe)并查看结果。
2、
(1)打开vs2008,创建新项目(控制台应用程序),并命名为exp1_2。
(2)定义基类Shape,其中含有:
一个保护的string类型字段name;带一个参数的构造方法为name字段赋值;两个抽象方法:
Area()(返回一个双精度的值)和Show()(无返回值)。
(3)定义派生类Rectangle,其中含有:
两个私有的双精度类型的字段width,heigh;带三个参数的构造方法为name,width和heigh赋值,其中为name赋值调用父类的构造方法;实现方法Area()(返回举行的面积)和Show()(无返回值,在屏幕上显示图形名称(矩形)和面积)。
(4)定义派生类Circle,其中含有:
一个私有双精度类型的字段radius;带两个参数的构造方法为name,radius赋值,其中为name赋值调用父类的构造方法;实现方法Area()(返回举行的面积)和Show()(无返回值,在屏幕上显示图形名称(圆)和面积)。
(5)在program类(默认)中Main方法中:
创建一个Shape类型的数组s,其中两个元素分别为newRectangle(“小矩形”,1.0,2.0)和newCircle(“大圆”,3.5);使用foreach遍历s,调用每个元素的Show方法。
(6)编译和测试程序,并查看运行结果。
3、
(1)打开vs2008,创建新项目(控制台应用程序),并命名为exp1_3。
(2)声明一个接口ICDPlayer,包含:
4个无返回值的方法:
Play(),Stop(),NextTrack()和PreviousTrack();一个整型的只读属性CurrentTrack。
(3)定义类CDPlayer实现该接口ICDPlayer,包含:
一个初始值为0的私有整型字段currentTrack;实现Play方法,功能是在屏幕上输出字符串“启动CD…”;实现Stop方法,功能是在屏幕上输出字符串“停止CD…”;实现NextTrack方法,功能是在屏幕上输出字符串“下一个音轨…”,并让currentTrack的值加1;实现PreviousTrack方法,功能是在屏幕上输出字符串“前一个音轨…”,并让currentTrack的值减1;实现只读属性CurrentTrack,读取时返回字段currentTrack的值。
(4)在program类(默认)中Main方法中:
创建一个CDPlayer类型的实例myCD;调用Play方法后在屏幕上输出当前音轨的值(CurrentTrack属性值);调用两次NextTrack方法后在屏幕上输出当前音轨的值;调用一次PreviousTrack方法后在屏幕上输出当前音轨的值;调用Stop方法。
(5)编译和测试程序,并查看运行结果。
4、
(1)打开vs2008,创建新项目(控制台应用程序),并命名为exp1_4。
(2)声明一个表示平面坐标系中的点的结构体CoOrds,包含字段x,y,以及带2个参数的构造函数。
(3)分别利用三种不同的方法(默认构造函数、有2个参数的构造函数、先声明结构体变量再对其x,y字段赋值),创建3个平面坐标点变量。
(4)编译和测试程序,并查看运行结果。
五、调试过程
六、实验结果
1、屏幕打印10行杨辉三角,如下图:
2、
3、
4、
七、总结
通过这个实验,我了解到了数组、类、接口和结构的定义,基本认识了结构和类的区别。
在一定程度上掌握了数组的声明、实例化、初始化和访问。
对于类、接口的声明和使用,结构的声明和调用有了进一步的认识。
附录:
(1)exp1_1.cs
usingSystem;
namespaceexp1_1
{
classprogram
{
staticvoidMain()
{int[,]A=newint[10,10];
inti,j;
for(i=0;i<10;i++)//下三角初始化为0
for(j=0;j<=i;j++)
A[i,j]=1;
for(i=2;i<10;i++)//计算杨辉三角
for(j=1;j
A[i,j]=A[i-1,j]+A[i-1,j-1];
for(i=0;i<10;i++)//显示输出
{for(j=0;j<=i;j++)
Console.Write("{0,5}",A[i,j]);
Console.WriteLine();
}
}
}
}
(2)exp1_2.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceexp1_2
{
publicabstractclassShape
{
privatestringname;
publicShape(strings)
{
Id=s;
}
publicstringId
{
get
{
returnname;
}
set
{
name=value;
}
}
publicabstractdoubleArea
{
get;
}
publicoverridestringToString()
{
returnId+"Area="+string.Format("{0:
F2}",Area);
}
//publicabstractvoidShow(Area);
//{
//Console.WriteLine("{0}",Area);
//}
}
publicclassRectangle:
Shape
{
privatedoublewidth;
privatedoubleheigh;
publicRectangle(stringname,doublewidth1,doubleheigth1):
base(name)
{
width=width1;
heigh=heigth1;
}
publicoverridedoubleArea
{
get
{
returnwidth*heigh;
}
}
//publicoverridevoidShow();
//{
//Console.WriteLine("{0:
F2}",Area);
//}
}
publicclassCircle:
Shape
{
privatedoubleradius;
publicCircle(stringname,doubleradius1):
base(name)
{
radius=radius1;
}
publicoverridedoubleArea
{
get
{
returnradius*radius*System.Math.PI;
}
}
//publicoverridevoidShow();
//{
//Console.WriteLine("{0:
F2}",Area);
//}
}
classProgram
{
staticvoidMain(string[]args)
{
Shape[]S=
{
newRectangle("小矩形",1.0,2.0),
newCircle("大圆",3.5)
};
foreach(ShapesinS)
{
Console.WriteLine(s);
}
Console.ReadKey();
}
}
}
(3)exp1_3.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceexp1_3
{
publicinterfaceICDPlayer
{
voidPlay();
voidStop();
voidNextTrack();
voidPreviousTrack();
intCurrentTrack();
}
publicclassCDPlay:
ICDPlayer
{
privateintcurrentTrack=0;
publicvoidPlay()
{
Console.WriteLine("启动CD");
Console.WriteLine("{0}",currentTrack);
}
publicvoidStop()
{
Console.WriteLine("停止CD");
}
publicvoidNextTrack()
{
Console.WriteLine("下一个音轨");
Console.WriteLine("{0}",++currentTrack);
}
publicvoidPreviousTrack()
{
Console.WriteLine("上一个音轨");
Console.WriteLine("{0}",--currentTrack);
}
publicintCurrentTrack()
{
returncurrentTrack;
}
}
classProgram
{
staticvoidMain()
{
CDPlaymyCD=newCDPlay();
myCD.Play();
myCD.NextTrack();
myCD.NextTrack();
myCD.PreviousTrack();
myCD.Stop();
Console.ReadKey();
}
}
}
(4)exp1_4.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceexp1_4
{
publicstructCoOrds
{
publicintx,y;
publicCoOrds(intp1,intp2)
{
x=p1;
y=p2;
}
}
classProgram
{
staticvoidMain()
{
doublea,b,c,p,Area;
CoOrdscoords1=newCoOrds();
Console.WriteLine("平面坐标点1:
x={0},y={1}",coords1.x,coords1.y);
CoOrdscoords2=newCoOrds(10,20);
Console.WriteLine("平面坐标点2:
x={0},y={1}",coords2.x,coords2.y);
CoOrdscoords3;
coords3.x=22;
coords3.y=3;
Console.WriteLine("平面坐标点3:
x={0},y={1}",coords3.x,coords3.y);
a=Math.Sqrt((coords1.x-coords2.x)*(coords1.x-coords2.x)+(coords1.y-coords2.y)*(coords1.y-coords2.y));
b=Math.Sqrt((coords1.x-coords3.x)*(coords1.x-coords3.x)+(coords1.y-coords3.y)*(coords1.y-coords3.y));
c=Math.Sqrt((coords2.x-coords3.x)*(coords2.x-coords3.x)+(coords2.y-coords3.y)*(coords2.y-coords3.y));
if(a+b<=c||a+c<=b||b+c<=a)
{
Console.WriteLine("这些平面坐标不能构成三角形!
!
!
");
}
else
{
p=(a+b+c)/2;
Area=Math.Sqrt(p*(p-a)*(p-b)*(p-c));
Console.WriteLine("三角形的面积={0}",Area);
}
Console.ReadKey();
}
}
}
福建农林大学金山学院实验报告
系:
信息与机电工程专业:
计算机科学与技术年级:
2008级
姓名:
洪绵绵学号:
082231029实验室号_608计算机号B3
实验时间:
2010.12.3上午一二节指导教师签字:
成绩:
实验二委托与事件
一、实验目的和要求
1)掌握委托和事件的概念、定义。
2)掌握委托和事件的应用
二、实验内容和原理
1)利用委托实现一个客户端/服务器简单聊天程序
2)利用事件实现一个客户端/服务器简单聊天程序
三、实验环境
1、硬件:
PC机
2、软件:
windowsXP、VS2008
四、算法描述及实验步骤
(1)创建新项目,并命名为exp2_1(委托)。
1.创建存储消息的类,类名为MsgPackage
1)包含两个公有字符串字段name,message用来存放消息发送者的姓名和内容。
2)公有的构造方法带两个字符串类型的参数,用于给两个字段赋值。
2.创建基于委托的聊天服务器类
1)创建聊天服务器类,命名为DChatServer
2)在DchatServer类内声明一个委托,当聊天消息到达时,委托将调用在客户端的回调函数。
A.将委托命名为OnMsgArrived。
B.将这个委托声明为public,无返回类型,带有一个MsgPackage类型的参数。
3)创建不包含具体实现代码的构造函数
4)定义一个字段来存储已连接客户端的委托
A.将字段命名为mOnMsgArrived
B.将字段定义为OnMsgArrived委托类型的一个static引用。
5)定义有客户端调用的连接客户端和服务器的方法
A.将方法命名为ClientConnect
B.将方法声明为publicstatic无返回类型
C.包含一个OnMsgArrived类型的参数。
D.创建方法的具体实现:
使用“+=”运算符将这个新委托添加到已经存储在mOnMsgArrived调用列表的委托中。
6)执行下面的步骤,定义一个由客户端调用的,用来断开客户端与服务器的方法
A.将方法命名为ClientDisconnect
B.声明方法为publicstatic无返回类型
C.与ClientConnect具有同样的签名
D.方法的具体实现:
使用“-=”运算符从mOnMsgArrived调用列表中删除委托。
7)执行下面的步骤,定义一个发送指定消息给所有已连接的客户端的方法,其中某个客户端可能会有异常
A.将方法命名为SendMsg
B.声明为publicstatic无返回类型
C.两个参数:
一个MsgPackage类型的消息,一个object类型的参数表示被排除的客户端。
D.具体实现:
如果被排除客户参数是null,那么将调用多路广播委托给所有的客户端发送消息;如果被排除的客户端参数不是null,那么在mOnMsgArrived委托的调用列表中进行迭代,并且只调用那么与被排除的客户端参数不匹配的委托。
(在MSDN中查看GetInvocationList()、DynamicInvoke()和Target属性)
2.创建基于委托的聊天客户端类
1)创建聊天客户端类,命名为DchatClient
2)添加一个私有字符串类型的字段clientName(客户端名字)
3)添加一个Name属性用来读和写字段clientName的值
4)在DChatClient类内实现一个回调方法,当服务器接收到聊天消息时,将通过委托调用该方法。
A.将方法命名为Show
B.声明为private无返回类型
C.只接受一个MsgPackage类型的参数
D.具体实现:
把客户端的名字和字符串参数输出到控制台
5)添加一个构造函数,参数为一个字符串变量名为clientName
具体实现:
将参数值赋给clientName字段;通过调用服务器的ClientConnect方法将客户端链接到服务器上。
其中,由于ClientConnect方法的参数是委托类型,因此传递给此方法是委托的一个实例,这个实例应用客户端的内定义的回调方法去实例化。
3.创建基于委托的聊天应用代码
1)在program类,创建一个名为DelegateChatServerDemo的静态方法。
2)向控制台输出一行文本,显示程序开始。
3)实例化3个DChatClient对象,将客户端名“张三”、“李四”、“王五”传递给构造函数。
4)调用DChatServer的静态方法SendMsg向服务器发送消息。
该消息是张三发送给所有的客户端。
5)调用DChatServer的静态方法SendMsg向服务器发送消息。
该消息李四发送给所有的客户端。
6)调用DChatServer的静态方法SendMsg向服务器发送消息。
该消息王五发送给所有的客户端。
7)张三发送消息给除客户端“王五”以外的所有客户端。
8)向控制台上发送一行文本,显示程序结束。
9)在Main函数中调用DelegateChatServerDemo。
4.编译和测试程序,并查看运行结果。
(2)创建新项目,并命名为exp2_2(事件)。
1)定义事件的委托类型MsgArrivedEventHandle(ChatEventArgschatEventArgs)
2)定义包含事件信息的类(ChatEventArgs类)
3)创建包含事件的类:
DchatServer
A.定义事件msgArrivedEvent
B.定义激活事件的成员SendMsg(objectsender,ChatEventArgschatEventArgs)
4)定义事件的处理程序DchatClient
5)关联事件和事件的处理程序
6)激活事件,在program类(默认)中,与上一个实验相同。
7)编译和测试程序,并查看运行结果。
五、调试过程
六、实验结果
1.利用委托实现一个客户端/服务器简单聊天程序的运行结果如图1所示;
2.利用事件实现一个客户端/服务器简单聊天程序的运行结果如图2所示。
图1
图2
七、总结
通过此次实验,我掌握了委托和事件的概念、定义,对于委托和事件的应用有了进一步的了解,并且对课本上的知识有了更深刻的理解,收获颇多。
附录:
1.利用委托实现一个客户端/服务器简单聊天程序的代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceexp2_1
{
classMsgPackage
{
publicstringname;
publicstringmessage;
publicM