综合实验报告
(2011-- 2012年度第一学期)
名 称:面向对象程序设计综合实验(1) 题 目: 器件类的设计与实现 院 系: 数理系 班 级: 信息班 学 号:
学生姓名: 指导教师: 王 涛 设计周数: 1周
成 绩:
日期:2011年8月29日
一、实验的目的与要求
1. 培养信息类学生面向对象编程技术的基本能力。 2. 掌握C#程序设计语言。
3. 了解面向对象编程的基本概念。熟练掌握类的编写,掌握类的封装、类的继承,
掌握函数的重载,掌握类的构造函数和析构函数的编写。
二、实验
1. 实验内容与成果要求
基本要求:完成变压器类、开关类、刀闸类、线路类、母线类、节点类和发电机类的设计与调试。
基本要求:鼠标在屏幕上通过操作可以绘制基础电力设备器件。 提高要求:能实现设备的平移。 提高要求:能实现设备的旋转。 2. 分析
此实验总共有九个电力设备类型,可以通过建立一个电力设备抽象类(父类)的方法来简化编程,通过子类继承、覆写来实现各个电力设备的差异化。
1.父类里应大致包括起点位置、宽度、高度、比例等基本参数,还应有设备的画法、平移方法、设备临域的计算方法等基本方法;
2.每个电力设备都应画在一个矩形框中,方便操作和定位; 3. 实现过程
3.1. 总设备抽象类(Element)的设计与实现
Element是所有电力设备类型的父类,应具有所有电力设备的公共属性和通用方法,它是从Object继承的类。定义参数变量x,y,w,h,b,分别用于存储画图时矩形框的横坐标、纵坐标、宽、高、比例。如下:
private float x;
private float y; private float w; private float h;
private float b;
并用get,set方法进行封装。然后定义Element类的方法如下:
1) public virtual void draw(Graphics g ,Pen mypen)
该函数用于绘制设备图形,是虚函数,因此可以在子类中对其进行覆写; 2) public RectangleF Move_Rect(RectangleF r,float x,float y,float b)
该函数用于图形平移时坐标的变化; 3) public bool is_pick(PointF p)
该函数用于判断设备是否被拾起,p为鼠标点下时的坐标,返回值为布尔值,当值
为真时代表拾起,值为假时代表未被拾起;
3.2 母线(Bus)的设计与实现
Bus是继承Element的子类,除了从Element中继承来的所有变量外,母线没有其他私有变量;除了从Element中继承来方法,Bus没有其他私有方法;这里对图形画法进行覆写; 其方法如下:
public override void draw(Graphics g, Pen mypen)
{
g.DrawLine(mypen, X*B , Y *B, (X + W) * B, Y* B);
}
3.3 开关(Break)的设计和实现
Break是继承Element的子类,从Element中继承了所有的变量和方法。这里需要定义5个外接矩形并设定坐标如下:
private void _computer_location() {
r1=new RectangleF(0,-2,4,4);
r2=new RectangleF(4,0,5,0); r3=new RectangleF(9,-5,15,10); r4=new RectangleF(24,0,5,0); r5=new RectangleF(29,-2,4,4);
}
然后在各个矩形里画相应的图形。覆写draw方法如下:
public override void draw(Graphics g, Pen mypen) {
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X + r2.Width, r2.Y); g.DrawRectangle(mypen, r3.X, r3.Y, r3.Width, r3.Height); g.DrawLine(mypen, r4.X, r4.Y, r4.X + r4.Width, r4.Y); g.DrawEllipse(mypen, r5);
}
3.4 刀闸(Daozha)的设计与实现
Daozha也是继承Element的子类,从Element中继承了所有的变量和方法。这里需要定义7个外接矩形并设定坐标如下:
private void _computer_location()
{
r1 = new RectangleF(0, -2, 4, 4); r2 = new RectangleF(4, 0, 10, 0); r3 = new RectangleF(14, -2, 4, 4); r4 = new RectangleF(18, 0, 15, -10); r5 = new RectangleF(33, -2, 4, 4); r6 = new RectangleF(37, 0, 10, 0); r7 = new RectangleF(47, -2, 4, 4);
}
然后在各个矩形里画相应的图形。对draw方法的覆写如下:
public override void draw(Graphics g, Pen mypen)
{
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X + r2.Width, r2.Y); g.DrawEllipse(mypen, r3);
g.DrawLine(mypen, r4.X, r4.Y, r4.X + r4.Width, r4.Y + r4.Height); g.DrawEllipse(mypen, r5);
g.DrawLine(mypen, r6.X, r6.Y, r6.X + r6.Width, r6.Y); g.DrawEllipse(mypen, r7); }
3.5 电容(DRong)的设计与实现
DRong是继承Element的子类,继承了Element所有的变量和方法。这里需要定义6个外接矩形并设定坐标如下:
private void _computer_location()
{
r1 = new RectangleF(0, -2, 4, 4); r2 = new RectangleF(4, 0, 10, 0); r3 = new RectangleF(14, -4, 0, 8); r4 = new RectangleF(19, -4, 0, 8); r5 = new RectangleF(19, 0, 10, 0); r6 = new RectangleF(29, -2, 4, 4);
}
然后在各个矩形里画相应的图形。覆写draw方法如下:
public override void draw(Graphics g, Pen mypen) {
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X + r2.Width, r2.Y); g.DrawLine(mypen, r3.X, r3.Y, r3.X, r3.Y + r3.Height); g.DrawLine(mypen, r4.X, r4.Y, r4.X, r4.Y + r4.Height); g.DrawLine(mypen, r5.X, r5.Y, r5.X + r5.Width, r5.Y); g.DrawEllipse(mypen, r6); }
3.6 接地线(Jiedi)的设计与实现
Jiedi是继承Element的子类,继承了Element所有的变量和方法。这里需要定义5个外接矩形并设定坐标如下:
private void _computer_location() {
r1 = new RectangleF(-2, 0, 4, 4); r2 = new RectangleF(0, 4, 0, 10); r3 = new RectangleF(-11, 14, 22, 0); r4 = new RectangleF(-7, 18, 14, 0); r5 = new RectangleF(-5, 22, 10, 0);
}
然后在各个矩形里画相应的图形。覆写draw方法如下:
public override void draw(Graphics g, Pen mypen) {
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X, r2.Y + r2.Height); g.DrawLine(mypen, r3.X, r3.Y, r3.X + r3.Width, r3.Y); g.DrawLine(mypen, r4.X, r4.Y, r4.X + r4.Width, r4.Y); g.DrawLine(mypen, r5.X, r5.Y, r5.X + r5.Width, r5.Y);
}
3.7 二绕变压器(Transfer)的设计与实现 Transfer是继承Element的子类,继承了Element所有的变量和方法。这里需要定义6个外接矩形并设定坐标如下:
private void _computer_location() {
r1 = new RectangleF(0, -2, 4, 4); r2 = new RectangleF(4, 0, 10, 0); r3 = new RectangleF(14, -10, 20, 20); r4 = new RectangleF(24, -10, 20, 20); r5 = new RectangleF(44, 0, 10, 0); r6 = new RectangleF(, -2, 4, 4);
}
然后在各个矩形里画相应的图形。覆写draw方法如下:
public override void draw(Graphics g, Pen mypen) {
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X + r2.Width, r2.Y); g.DrawEllipse(mypen, r3); g.DrawEllipse(mypen, r4);
g.DrawLine(mypen, r5.X, r5.Y, r5.X + r5.Width, r5.Y); g.DrawEllipse(mypen, r6); }
3.8 三绕变压器(Three_trans)的设计与实现
Three_trans是继承Element的子类,继承了Element所有的变量和方法。这里需要定义9个外接矩形并设定坐标如下:
private void _computer_location() {
r1 = new RectangleF(0, -2, 4, 4); r2 = new RectangleF(4, 0, 10, 0); r3 = new RectangleF(14, -5, 20, 20); r4 = new RectangleF(24, -5, 20, 20); r5 = new RectangleF(19, -15, 20, 20); r6 = new RectangleF(44, 0, 10, 0);
r7 = new RectangleF(, -2, 4, 4); r8 = new RectangleF(29,-25,0,10); r9 = new RectangleF(27,-29,4,4);
}
然后在各个矩形里画相应的图形,覆写draw方法如下:
public override void draw(Graphics g, Pen mypen) {
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X + r2.Width, r2.Y); g.DrawEllipse(mypen, r3); g.DrawEllipse(mypen, r4); g.DrawEllipse(mypen, r5);
g.DrawLine(mypen, r6.X, r6.Y, r6.X + r6.Width, r6.Y); g.DrawEllipse(mypen, r7);
g.DrawLine(mypen, r8.X, r8.Y, r8.X, r8.Y + r8.Height); g.DrawEllipse(mypen ,r9); }
3.9 线路(XianLu)的设计与实现
XianLu是继承Element的子类,继承了Element所有的变量和方法。这里需要定义2个外接矩形并设定坐标如下:
private void _computer_location() {
r1 = new RectangleF(0, -2, 4, 4); r2 = new RectangleF(4, 0, 20, 0);
}
然后在各个矩形里画相应的图形,覆写draw方法如下: public override void draw(Graphics g, Pen mypen)
{
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X + r2.Width, r2.Y); }
3.10 发电机(Generator)的设计与实现
Generator是继承Element的子类,继承了Element所有的变量和方法。这里需要定义7个外接矩形并设定坐标如下:
private void _computer_location() {
r1 = new RectangleF(0, -2, 4, 4); r2 = new RectangleF(4, 0, 10, 0); r3 = new RectangleF(14, -10, 20, 20); r4 = new RectangleF(14, -5, 10, 8); r5 = new RectangleF(24, -5, 10, 8); r6 = new RectangleF(34, 0, 10, 0);
r7 = new RectangleF(44, -2, 4, 4);
}
然后在各个矩形框里画相应的图形,覆写draw方法如下:
public override void draw(Graphics g, Pen mypen) {
_computer_location(); g.DrawEllipse(mypen, r1);
g.DrawLine(mypen, r2.X, r2.Y, r2.X + r2.Width, r2.Y); g.DrawEllipse(mypen, r3);
g.DrawArc(mypen, r4, 0, -180);//不对吧,不知道 g.DrawArc(mypen, r5, 0, 180);
g.DrawLine(mypen, r6.X, r6.Y, r6.X + r6.Width, r6.Y); g.DrawEllipse(mypen, r7); }
3.11 windows窗体设计(以开关为例)
(a)双击ToolStripMenuItem的各项,进入里面写代码:
private void 开关ToolStripMenuItem_Click(object sender, EventArgs e) {
draw_type = \"开关\";
}
(b) 定义一个device-set变量,类型为list (c) 定义draw-type 确定所画设备类型和mouse_status 鼠标状态。引入事件MouseDown ,代码如下: Break breaker = new Break(x, y, 33F, 10F, 1F); breaker.draw(graphics, pen); device_list.Add(breaker); 这样,当鼠标点中绘制设备,再选择开关时,就可以画出开关。其他器件类似,用if语句实现选择。 (d)由于窗体最小化后为了避免图像丢失,所以必须定义重绘函数。 private void draw_all() { if (device_list.Count > 0) { Graphics graphics = this.CreateGraphics(); Pen pen = new Pen(Color.Black, 1F); graphics.Clear(this.BackColor); for (int i = 0; i < device_list.Count; i++) { device_list[i].draw(graphics,pen); } } } 3.12 实现设备的移动 (1)在Element类中已经定义过判断是否拾取函数is_pick,现在在Form1里设计一个元件是否被拾取的方法:遍历设备集中画好的元件,调用 is-pick方法,值为true就返回设备的索引值。 private int pick(PointF p) { int bh=-1; if (device_list.Count > 0) { for (int i = 0; i < device_list.Count; i++) { if (device_list[i].is_pick(p)) { bh=i; break; } } } return bh; } 用if语句在MouseDown事件中编写鼠标状态为“移动”时引发的结果:定义一个名为pick-num的变量记录被拾取设备的索引值,初始值为-1,把选中设备的索引值赋给它 ,并用x_w、y_w表示鼠标选中位置与左上角坐标的偏移量。设计鼠标移动时(MouseMove)触发的事件:当有选中的设备(pick-num>=0)时, 把鼠标的坐标加上偏移量赋值给元件坐标值,重绘即可。 private void 平移ToolStripMenuItem_Click(object sender, EventArgs e) { mouse_type = \"平移\"; } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (pick_num >= 0) { float x = (float)e.X; float y = (float)e.Y; device_list[pick_num].X = x-x_w; device_list[pick_num].Y = y-y_w ; draw_all(); } } 三、实验总结 1. 收获 C#语言对我们来说是完全陌生的,通过这次实验了解了C#编程的基本方法和思路。在本实验用到了封装、继承、虚方法、覆写等知识点,反复练习后基本掌握了这些。另外也体会到做事需要耐心和细心。 2. 重难点 找出共有属性和方法; 对各个类的封装; 完成系统化实现。 3. 亮点 通过不断修正找到实现设备移动的比较合理的坐标设计方法。 参考文献 无 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务