Класс "вектор" с перегруженными операторами - C#

Узнай цену своей работы

Формулировка задачи:

Класс – вектор, Члены класса – 3 прямоугольные декартовые координаты, Методы – конструктор, деструктор, метод вывода вектора. Операторы перегрузки сложение( +), скалярное (%) и векторное (*) произведения векторов, вычисления угла (/) между двумя векторами. Исходные данные: а = {ax, ay, az} b = {bx, by, bz} Результат: c =(a+b) X a; d = ab; Найти и вывести угол между векторам a и b, b и c, с и а

Решение задачи: «Класс "вектор" с перегруженными операторами»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication
  6. {
  7.     public struct RVector
  8.     {
  9.         private int ndim;
  10.         private double[] vector;
  11.  
  12.         public RVector(int ndim)
  13.         {
  14.             this.ndim = ndim;
  15.             this.vector = new double[ndim];
  16.             for (int i = 0; i < ndim; i++)
  17.             {
  18.                 vector[i] = 0.0;
  19.             }
  20.         }
  21.  
  22.         public RVector(double[] vector)
  23.         {
  24.             this.ndim = vector.Length;
  25.             this.vector = vector;
  26.         }
  27.  
  28.         public double this[int i]
  29.         {
  30.             get
  31.             {
  32.                 if (i < 0 || i > ndim)
  33.                 {
  34.                     throw new Exception("Requested vector index is out of range!");
  35.                 }
  36.                 return vector[i];
  37.             }
  38.             set { vector[i] = value; }
  39.         }
  40.  
  41.         public int GetVectorSize
  42.         {
  43.             get { return ndim; }
  44.         }
  45.  
  46.  
  47.  
  48.  
  49.         public RVector SwapVectorEntries(int m, int n)
  50.         {
  51.             double temp = vector[m];
  52.             vector[m] = vector[n];
  53.             vector[n] = temp;
  54.             return new RVector(vector);
  55.         }
  56.  
  57.         public override string ToString()
  58.         {
  59.             string str = "(";
  60.             for (int i = 0; i < ndim - 1; i++)
  61.             {
  62.                 str += vector[i].ToString() + ", ";
  63.             }
  64.             str += vector[ndim - 1].ToString() + ")";
  65.             return str;
  66.         }
  67.  
  68.         public override bool Equals(object obj)
  69.         {
  70.             return (obj is RVector) && this.Equals((RVector)obj);
  71.         }
  72.  
  73.         public bool Equals(RVector v)
  74.         {
  75.             return vector == v.vector;
  76.         }
  77.  
  78.         public override int GetHashCode()
  79.         {
  80.             return vector.GetHashCode();
  81.         }
  82.  
  83.         public static bool operator ==(RVector v1, RVector v2)
  84.         {
  85.             return v1.Equals(v2);
  86.         }
  87.  
  88.         public static bool operator !=(RVector v1, RVector v2)
  89.         {
  90.             return !v1.Equals(v2);
  91.         }
  92.  
  93.         public static RVector operator +(RVector v)
  94.         {
  95.             return v;
  96.         }
  97.  
  98.         public static RVector operator +(RVector v1, RVector v2)
  99.         {
  100.             RVector result = new RVector(v1.ndim);
  101.             for (int i = 0; i < v1.ndim; i++)
  102.             {
  103.                 result[i] = v1[i] + v2[i];
  104.             }
  105.             return result;
  106.         }
  107.  
  108.         public static RVector operator -(RVector v)
  109.         {
  110.             double[] result = new double[v.ndim];
  111.             for (int i = 0; i < v.ndim; i++)
  112.             {
  113.                 result[i] = -v[i];
  114.             }
  115.             return new RVector(result);
  116.         }
  117.  
  118.         public static RVector operator -(RVector v1, RVector v2)
  119.         {
  120.             RVector result = new RVector(v1.ndim);
  121.             for (int i = 0; i < v1.ndim; i++)
  122.             {
  123.                 result[i] = v1[i] - v2[i];
  124.             }
  125.             return result;
  126.         }
  127.  
  128.         public static RVector operator *(RVector v, double d)
  129.         {
  130.             RVector result = new RVector(v.ndim);
  131.             for (int i = 0; i < v.ndim; i++)
  132.             {
  133.                 result[i] = v[i] * d;
  134.             }
  135.             return result;
  136.         }
  137.  
  138.         public static RVector operator *(double d, RVector v)
  139.         {
  140.             RVector result = new RVector(v.ndim);
  141.             for (int i = 0; i < v.ndim; i++)
  142.             {
  143.                 result[i] = d * v[i];
  144.             }
  145.             return result;
  146.         }
  147.  
  148.         public static RVector operator /(RVector v, double d)
  149.         {
  150.             RVector result = new RVector(v.ndim);
  151.             for (int i = 0; i < v.ndim; i++)
  152.             {
  153.                 result[i] = v[i] / d;
  154.             }
  155.             return result;
  156.         }
  157.  
  158.         public static RVector operator /(double d, RVector v)
  159.         {
  160.             RVector result = new RVector(v.ndim);
  161.             for (int i = 0; i < v.ndim; i++)
  162.             {
  163.                 result[i] = v[i] / d;
  164.             }
  165.             return result;
  166.         }
  167.  
  168.         public static double DotProduct(RVector v1, RVector v2)
  169.         {
  170.             double result = 0.0;
  171.             for (int i = 0; i < v1.ndim; i++)
  172.             {
  173.                 result += v1[i] * v2[i];
  174.             }
  175.             return result;
  176.         }
  177.  
  178.         public static double Angle(RVector v1, RVector v2)
  179.         {
  180.             double result = 0.0, norm1 = 0.0, norm2 = 0.0;
  181.             for (int i = 0; i < v1.ndim; i++)
  182.             {
  183.                 result += v1[i] * v2[i];
  184.                 norm1 += v1[i] * v1[i];
  185.                 norm2 += v2[i] * v2[i];
  186.             }
  187.             result = result / Math.Sqrt(norm1) / Math.Sqrt(norm2);
  188.             return Math.Acos(result);
  189.         }
  190.  
  191.         public double GetNorm()
  192.         {
  193.             double result = 0.0;
  194.             for (int i = 0; i < ndim; i++)
  195.             {
  196.                 result += vector[i] * vector[i];
  197.             }
  198.             return Math.Sqrt(result);
  199.         }
  200.  
  201.         public double GetNormSquare()
  202.         {
  203.             double result = 0.0;
  204.             for (int i = 0; i < ndim; i++)
  205.             {
  206.                 result += vector[i] * vector[i];
  207.             }
  208.             return result;
  209.         }
  210.  
  211.         public void Normalize()
  212.         {
  213.             double norm = GetNorm();
  214.             if (norm == 0)
  215.             {
  216.                 throw new Exception("Tried to normalize a vector with norm of zero!");
  217.             }
  218.             for (int i = 0; i < ndim; i++)
  219.             {
  220.                 vector[i] /= norm;
  221.             }
  222.         }
  223.  
  224.         public RVector GetUnitVector()
  225.         {
  226.             RVector result = new RVector(vector);
  227.             result.Normalize();
  228.             return result;
  229.         }
  230.  
  231.         public static RVector CrossProduct(RVector v1, RVector v2)
  232.         {
  233.             if (v1.ndim != 3)
  234.             {
  235.                 throw new Exception("Vector v1 must be 3 dimensional!");
  236.             }
  237.             if (v2.ndim != 3)
  238.             {
  239.                 throw new Exception("Vector v2 must be 3 dimensional!");
  240.             }
  241.             RVector result = new RVector(3);
  242.             result[0] = v1[1] * v2[2] - v1[2] * v2[1];
  243.             result[1] = v1[2] * v2[0] - v1[0] * v2[2];
  244.             result[2] = v1[0] * v2[1] - v1[1] * v2[0];
  245.             return result;
  246.         }
  247.     }
  248.  
  249.     class Program
  250.     {
  251.         static void Main(string[] args)
  252.         {
  253.  
  254.             RVector v1 = new RVector(new double[] { 10.0, 9.0, 8.0});
  255.             RVector v2 = new RVector(new double[] { 5.0, 4.0, 3.0});
  256.             double d = 10.0;
  257.             Console.WriteLine("\nv1 = {0}", v1);
  258.             Console.WriteLine("v2 = {0}", v2);
  259.             Console.WriteLine("d = {0}", d);
  260.             Console.WriteLine("v2 + v1 = {0}", (v2 + v1));
  261.             Console.WriteLine("v2 - v1 = {0}", (v2 - v1));
  262.             Console.WriteLine("v1 * d = {0}", (v1 * d));
  263.             Console.WriteLine("v1 / d = {0}", (v1 / d));
  264.    
  265.             Console.WriteLine("Dot product of v1 and v2 = {0}", RVector.DotProduct(v1, v2));
  266.             Console.WriteLine("Cross product of v1 and v2 = {0}", RVector.CrossProduct(v1, v2).ToString());
  267.             Console.WriteLine("Angle between v1 and v2 = {0}", RVector.Angle(v1, v2));
  268.  
  269.             Console.ReadLine();
  270.         }
  271.     }
  272. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы