当前位置:文档之家› 类和对象

类和对象

6.1实验目的和要求1.熟悉面向对象的基本概念。

2.进一步掌握类的各种成员的使用方法。

3.掌握对象之间通信的基本方法。

6.2实验内容与步骤题目1 点和直线类(1)创建C#控制台应用程序L6_1。

(2)在程序中新建一个点类CzPoint,为其定义两个double类型的私有字段成员x和y,分别表示点的横坐标和纵坐标。

(3)为CzPoint定义两个公有属性X、Y,分别用于封装对字段x 和y的读写访问。

(4)定义CzPoint的带参构造函数,在其中对字段x和y进行初始化。

参考源代码如下:public CzPoint(double x, double y){this.x = x;this.y = y;}(5)为CzPoint定义公有方法Move,用于按指定的水平距离和垂直距离移动坐标点。

参考源代码如下:public void Move(double dx, double dy){x += dx;y += dy;}(6)对CzPoint类进行相等和不相等操作符重载。

两个坐标点相等,是指它们的横坐标和纵坐标都相等。

(7)在程序主方法中创建坐标为(1,2)和(3,3)的两个坐标点对象,判断它们是否相等;而后将第一个坐标点移动到第二个坐标点上,再判断它们是否相等。

(8)在程序中再新建一个直线类CzLine,为其定义两个double类型的字段成员a和b,分别表示直线的斜率和截距;再定义字段的封装属性A和B,但它们都是只读的。

(9)为CzLine定义两个构造函数,一个根据斜率和截距来创建直线对象,另一个则根据两个CzPoint对象来构造直线对象(直线穿过这两个点)。

后一个的参考源代码如下:public CzLine(CzPoint p1, CzPoint p2){if (p1 == p2)throw new ArgumentException("两点不能相同");this.a = (p2.Y - p1.Y) / (p2.X - p1.X);this.b = p1.Y - this.a * p1.X;}(10)为CzLine定义公有方法Move,但它只用于平移直线,而不改变直线的斜率。

再为其定义公有方法Contains,用于判断某点是否在该直线上。

(11)类似的,为CzLine重载相等和不等操作符。

(12)最后在程序主方法中采用不同的方式创建直线对象,并编译运行程序,测试它们的使用效果。

程序的整体结构如下:个人编程:源代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace L6_1{class Program{static void Main(string[] args){CzPoint a = new CzPoint(1, 2);CzPoint b = new CzPoint(3, 3);if (a == b)Console.WriteLine("点(1,2)与点(3,3)相等.");elseConsole.WriteLine("点(1,2)与点(3,3)不等.");Console.WriteLine("将点(1,2)移动到点(3,3)");a.Move(3, 3);if (a == b)Console.WriteLine("点(1,2)移动后与点(3,3)相等.");elseConsole.WriteLine("点(1,2)移动后与点(3,3)不等.");CzLine L1 = new CzLine(2, 0);CzLine L2 = new CzLine(a, b);L1.Move(1);if (L1 == L2)Console.WriteLine("2条直线相等.");elseConsole.WriteLine("2条直线不等.");L1.Contains(a);Console.Read();}}public class CzPoint{private double x;private double y;public double X{get { return x; }set { x = value; }}public double Y{get { return y; }set { y = value; }}public CzPoint(double x, double y){this.x = x;this.y = y;}public void Move(double dx, double dy){x += dx;y += dy;}public static bool operator ==(CzPoint a, CzPoint b) {if (a.X == b.Y && a.Y == b.Y)return true;elsereturn false;}public static bool operator !=(CzPoint a, CzPoint b) {if (a.X != b.Y || a.Y != b.Y)return true;elsereturn false;}}public class CzLine{private double a;private double b;public double A{set { a = value; }}public double B{set { b = value; }}public CzLine(double a, double b){this.a = a;this.b = b;}public CzLine(CzPoint p1, CzPoint p2){if (p1 == p2)throw new ArgumentException("两点不能相同");this.a = (p2.Y - p1.Y) / (p2.X - p1.X);this.b = p1.Y - this.a * p1.X;}public void Move(double db){this.b -= this.a * db;}public void Contains(CzPoint p){if (p.Y == p.X * this.a + this.b)Console.WriteLine("点({0},{1})在这条直线上.", p.X, p.Y);elseConsole.WriteLine("点({0},{1})不在这条直线上.", p.X, p.Y);}public static bool operator ==(CzLine L1, CzLine L2){if (L1.a == L2.a && L1.b == L2.b)return true;elsereturn false;}public static bool operator !=(CzLine L1, CzLine L2){if (L1.a != L2.a || L1.b != L2.b)return true;elsereturn false;}}}运行结果:题目2 向量类(1)创建C#控制台应用程序L6_2。

(2)在程序中新建一个向量类CzVector,在其中定义一个double[]类型的私有字段_values,用于维护向量的各个元素值。

(3)为CzVector定义三个公有属性Length、Sum和Prod,分别用于返回向量的长度、向量所有元素的和以及向量所有元素的积。

(4)在CzVector中定义一个索引函数,用于获取或设置向量各个元素的值。

(5)为CzVector定义两个构造函数,一个根据指定长度来对向量进行初始化(向量各元素取默认值0),另一个由指定的数组来构造向量并设置各元素的值。

参考源代码如下:public CzVector(int length){_values = new double[length];}public CzVector(params double[] dArray){_values = dArray;}(6)利用操作符重载来实现向量加法、减法和乘法。

这三种运算均要求两个向量的长度相等。

设向量α=(a1, a2, …, a n), β=(b1, b2, …, b n),那么α+β=(a1+ b1, a2+ b2, …, a n+ b n),减法与之类似,而α*β= a1*b1+ a2* b2+ …+ a n* b n,λ*α=(λ*a1, λ*a2, …, λ*a n)。

以加法操作符重载为例,参考源代码如下:public static CzVector operator +(CzVector v1, CzVector v2){if (v1.Length != v2.Length)return null;CzVector result = new CzVector(v1.Length);for (int i = 0; i < v1.Length; i++)result[i] = v1[i] + v2[i];return result;}(7)类似的,利用操作符重载来判断两个向量是否相等。

向量相等的条件是:两个向量的长度相等,且各个位置上的对应元素值也相等。

(8)为CzVector定义一个ConsoleOutput方法,用于在控制台一行输出向量的所有元素,其之间以空格分割。

(9)在程序主方法中随机定义几个向量对象,并测试其运算结果。

参考源代码如下:static void Main(){CzVector v1 = new CzVector(1, -5, 9, 6);CzVector v2 = new CzVector(0, 1, 2, 3);Console.Write("v1 = ");v1.ConsoleOutput();Console.Write("v2 = ");v2.ConsoleOutput();CzVector v3 = v1 + v2;Console.Write("v1 + v2 = ");v3.ConsoleOutput();Console.Write("3 * (v1 + v2) = ");(v3 * 3).ConsoleOutput();Console.WriteLine("v1 * v2 = {0}", v1 * v2); }源代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace L6_2{class Program{static void Main(string[] args){CzVector v1 = new CzVector(1, -5, 9, 6);CzVector v2 = new CzVector(0, 1, 2, 3);Console.Write("v1 = ");v1.ConsoleOutput();Console.Write("v2 = ");v2.ConsoleOutput();CzVector v3 = v1 + v2;Console.Write("v1 + v2 = ");v3.ConsoleOutput();Console.Write("3 * (v1 + v2) = ");(v3 * 3).ConsoleOutput();Console.WriteLine("v1 * v2 = {0}", v1 * v2);Console.Read();}}public class CzVector{protected double[] _values;public double this[int index]{get{if (index < 0 || index >= Length)throw new ArgumentException("超出索引范围!");elsereturn this._values[index];}set{if (index < 0 || index >= Length)throw new ArgumentException("超出索引范围!");elsethis._values[index] = value;}}public int Length{get { return _values.Length; }}public double Sum{get{double result = _values[0];for (int i = 0; i < _values.Length; i++)result += _values[i];return result;}}public double Prod{get{double result = _values[0];for (int i = 0; i < _values.Length; i++)result *= _values[i];return result;}}public CzVector(int length){_values = new double[length];}public CzVector(params double[] dArray){_values = dArray;}public static CzVector operator +(CzVector v1, CzVector v2) {if (v1.Length != v2.Length)return null;CzVector result = new CzVector(v1.Length);for (int i = 0; i < v1.Length; i++)result[i] = v1[i] + v2[i];return result;}public static CzVector operator -(CzVector v1, CzVector v2) {if (v1.Length != v2.Length)return null;CzVector result = new CzVector(v1.Length);for (int i = 0; i < v1.Length; i++)result[i] = v1[i] - v2[i];return result;}public static double operator *(CzVector v1, CzVector v2) {if (v1.Length != v2.Length)return 0;double result = 0;for (int i = 0; i < v1.Length; i++)result += v1[i] * v2[i];return result;}public static CzVector operator *(CzVector v1, double v2){CzVector result = new CzVector(v1.Length);for (int i = 0; i < v1.Length; i++)result[i] = v1[i] * v2;return result;}public static bool operator ==(CzVector v1, CzVector v2){if (v1.Length == v2.Length){for (int i = 0; i < v1.Length; i++)if (v1[i] != v2[i])return false;return true;}elsereturn false;}public static bool operator !=(CzVector v1, CzVector v2){if (v1.Length == v2.Length){for (int i = 0; i < v1.Length; i++){if (v1[i] != v2[i])return true;}return false;}elsereturn true;}public void ConsoleOutput(){for (int i = 0; i < _values.Length; i++)Console.Write("{0} ",this._values[i]);Console.WriteLine();}}}运行结果:。

相关主题