Advertisement
magneto903

lab1

Nov 19th, 2024
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.98 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Numerics;
  4.  
  5. namespace V2DataProject
  6. {
  7.     // Делегаты
  8.     public delegate void FValues(double x, ref Complex y1, ref Complex y2);
  9.     public delegate DataItem FDI(double x);
  10.  
  11.     // Структура DataItem
  12.     public struct DataItem
  13.     {
  14.         public double X { get; set; }
  15.         public Complex Y1 { get; set; }
  16.         public Complex Y2 { get; set; }
  17.  
  18.         public DataItem(double x, Complex y1, Complex y2)
  19.         {
  20.             X = x;
  21.             Y1 = y1;
  22.             Y2 = y2;
  23.         }
  24.  
  25.         public string ToString(string format)
  26.         {
  27.             return $"X: {X.ToString(format)}, Y1: {Y1.ToString(format)}, Y2: {Y2.ToString(format)}";
  28.         }
  29.  
  30.         public override string ToString()
  31.         {
  32.             return $"X: {X}, Y1: {Y1}, Y2: {Y2}";
  33.         }
  34.     }
  35.  
  36.     // Абстрактный базовый класс V2Data
  37.     public abstract class V2Data
  38.     {
  39.         public string Key { get; set; }
  40.         public DateOnly Date { get; set; }
  41.  
  42.         protected V2Data(string key, DateOnly date)
  43.         {
  44.             Key = key;
  45.             Date = date;
  46.         }
  47.  
  48.         public abstract int XCount { get; }
  49.         public abstract (double, double) MinMaxMagnitude { get; }
  50.         public abstract string ToLongString(string format);
  51.  
  52.         public override string ToString()
  53.         {
  54.             return $"Key: {Key}, Date: {Date}";
  55.         }
  56.     }
  57.  
  58.     // Класс V2DataList
  59.     public class V2DataList : V2Data
  60.     {
  61.         public List<DataItem> DataItems { get; set; }
  62.  
  63.         public V2DataList(string key, DateOnly date) : base(key, date)
  64.         {
  65.             DataItems = new List<DataItem>();
  66.         }
  67.  
  68.         public V2DataList(string key, DateOnly date, double[] x, FDI F) : base(key, date)
  69.         {
  70.             DataItems = new List<DataItem>();
  71.             HashSet<double> xSet = new HashSet<double>();
  72.             foreach (var xi in x)
  73.             {
  74.                 if (xSet.Add(xi))
  75.                 {
  76.                     DataItems.Add(F(xi));
  77.                 }
  78.             }
  79.         }
  80.  
  81.         public override int XCount => DataItems.Count;
  82.  
  83.         public override (double, double) MinMaxMagnitude
  84.         {
  85.             get
  86.             {
  87.                 double min = double.MaxValue;
  88.                 double max = double.MinValue;
  89.                 foreach (var item in DataItems)
  90.                 {
  91.                     double mag1 = item.Y1.Magnitude;
  92.                     double mag2 = item.Y2.Magnitude;
  93.                     min = Math.Min(min, Math.Min(mag1, mag2));
  94.                     max = Math.Max(max, Math.Max(mag1, mag2));
  95.                 }
  96.                 return (min, max);
  97.             }
  98.         }
  99.  
  100.         public override string ToString()
  101.         {
  102.             return $"Type: V2DataList, {base.ToString()}, Count: {DataItems.Count}";
  103.         }
  104.  
  105.         public override string ToLongString(string format)
  106.         {
  107.             string result = ToString() + "\n";
  108.             foreach (var item in DataItems)
  109.             {
  110.                 result += item.ToString(format) + "\n";
  111.             }
  112.             return result;
  113.         }
  114.     }
  115.  
  116.     // Класс V2DataArray
  117.     public class V2DataArray : V2Data
  118.     {
  119.         public double[] XArray { get; set; }
  120.         public Complex[] Y1Array { get; set; }
  121.         public Complex[] Y2Array { get; set; }
  122.  
  123.         public V2DataArray(string key, DateOnly date) : base(key, date)
  124.         {
  125.             XArray = new double[0];
  126.             Y1Array = new Complex[0];
  127.             Y2Array = new Complex[0];
  128.         }
  129.  
  130.         public V2DataArray(string key, DateOnly date, double[] x, FValues F) : base(key, date)
  131.         {
  132.             int n = x.Length;
  133.             XArray = new double[n];
  134.             Y1Array = new Complex[n];
  135.             Y2Array = new Complex[n];
  136.             for (int i = 0; i < n; i++)
  137.             {
  138.                 XArray[i] = x[i];
  139.                 Complex y1 = new Complex();
  140.                 Complex y2 = new Complex();
  141.                 F(x[i], ref y1, ref y2);
  142.                 Y1Array[i] = y1;
  143.                 Y2Array[i] = y2;
  144.             }
  145.         }
  146.  
  147.         public DataItem? this[int index]
  148.         {
  149.             get
  150.             {
  151.                 if (index >= 0 && index < XArray.Length)
  152.                 {
  153.                     return new DataItem(XArray[index], Y1Array[index], Y2Array[index]);
  154.                 }
  155.                 else
  156.                 {
  157.                     return null;
  158.                 }
  159.             }
  160.         }
  161.  
  162.         public override int XCount => XArray.Length;
  163.  
  164.         public override (double, double) MinMaxMagnitude
  165.         {
  166.             get
  167.             {
  168.                 double min = double.MaxValue;
  169.                 double max = double.MinValue;
  170.                 foreach (var y in Y1Array)
  171.                 {
  172.                     double mag = y.Magnitude;
  173.                     min = Math.Min(min, mag);
  174.                     max = Math.Max(max, mag);
  175.                 }
  176.                 foreach (var y in Y2Array)
  177.                 {
  178.                     double mag = y.Magnitude;
  179.                     min = Math.Min(min, mag);
  180.                     max = Math.Max(max, mag);
  181.                 }
  182.                 return (min, max);
  183.             }
  184.         }
  185.  
  186.         public static explicit operator V2DataList(V2DataArray source)
  187.         {
  188.             V2DataList result = new V2DataList(source.Key, source.Date);
  189.             for (int i = 0; i < source.XArray.Length; i++)
  190.             {
  191.                 DataItem item = new DataItem(source.XArray[i], source.Y1Array[i], source.Y2Array[i]);
  192.                 result.DataItems.Add(item);
  193.             }
  194.             return result;
  195.         }
  196.  
  197.         public override string ToString()
  198.         {
  199.             return $"Type: V2DataArray, {base.ToString()}";
  200.         }
  201.  
  202.         public override string ToLongString(string format)
  203.         {
  204.             string result = ToString() + "\n";
  205.             for (int i = 0; i < XArray.Length; i++)
  206.             {
  207.                 result += $"X: {XArray[i].ToString(format)}, Y1: {Y1Array[i].ToString(format)}, Y2: {Y2Array[i].ToString(format)}\n";
  208.             }
  209.             return result;
  210.         }
  211.     }
  212.  
  213.     // Класс V2MainCollection
  214.     public class V2MainCollection : List<V2Data>
  215.     {
  216.         public V2Data this[DateOnly date]
  217.         {
  218.             get
  219.             {
  220.                 foreach (var item in this)
  221.                 {
  222.                     if (item.Date == date)
  223.                     {
  224.                         return item;
  225.                     }
  226.                 }
  227.                 return null;
  228.             }
  229.         }
  230.  
  231.         public bool Add(V2Data data)
  232.         {
  233.             foreach (var item in this)
  234.             {
  235.                 if (item.Key == data.Key && item.Date == data.Date)
  236.                 {
  237.                     return false;
  238.                 }
  239.             }
  240.             base.Add(data);
  241.             return true;
  242.         }
  243.  
  244.         public V2MainCollection(int nA, int nL)
  245.         {
  246.             for (int i = 0; i < nA; i++)
  247.             {
  248.                 double[] x = { i, i + 1, i + 2 };
  249.                 V2DataArray dataArray = new V2DataArray($"Array_{i}", DateOnly.FromDateTime(DateTime.Now.AddDays(i)), x, SampleFValues);
  250.                 Add(dataArray);
  251.             }
  252.             for (int i = 0; i < nL; i++)
  253.             {
  254.                 double[] x = { i, i + 1, i + 2 };
  255.                 V2DataList dataList = new V2DataList($"List_{i}", DateOnly.FromDateTime(DateTime.Now.AddDays(i)), x, SampleFDI);
  256.                 Add(dataList);
  257.             }
  258.         }
  259.  
  260.         public string ToLongString(string format)
  261.         {
  262.             string result = "";
  263.             foreach (var item in this)
  264.             {
  265.                 result += item.ToLongString(format) + "\n";
  266.             }
  267.             return result;
  268.         }
  269.  
  270.         public override string ToString()
  271.         {
  272.             string result = "";
  273.             foreach (var item in this)
  274.             {
  275.                 result += item.ToString() + "\n";
  276.             }
  277.             return result;
  278.         }
  279.  
  280.         // Пример функций для делегатов
  281.         public static void SampleFValues(double x, ref Complex y1, ref Complex y2)
  282.         {
  283.             y1 = new Complex(Math.Sin(x), Math.Cos(x));
  284.             y2 = new Complex(Math.Cos(x), Math.Sin(x));
  285.         }
  286.  
  287.         public static DataItem SampleFDI(double x)
  288.         {
  289.             Complex y1 = new Complex(Math.Sin(x), Math.Cos(x));
  290.             Complex y2 = new Complex(Math.Cos(x), Math.Sin(x));
  291.             return new DataItem(x, y1, y2);
  292.         }
  293.     }
  294.  
  295.     // Класс Program с методом Main
  296.     class Program
  297.     {
  298.         static void Main(string[] args)
  299.         {
  300.             // 1. Создать объект V2DataArray и вывести его данные
  301.             double[] xArray = { 0.0, 1.0, 2.0 };
  302.             V2DataArray dataArray = new V2DataArray("ArrayKey", DateOnly.FromDateTime(DateTime.Now), xArray, V2MainCollection.SampleFValues);
  303.             Console.WriteLine("V2DataArray ToLongString:");
  304.             Console.WriteLine(dataArray.ToLongString("F2"));
  305.  
  306.             // Преобразовать в V2DataList
  307.             V2DataList dataList = (V2DataList)dataArray;
  308.             Console.WriteLine("Converted V2DataList ToLongString:");
  309.             Console.WriteLine(dataList.ToLongString("F2"));
  310.  
  311.             // 2. Использование индексатора
  312.             Console.WriteLine("Indexer test:");
  313.             Console.WriteLine(dataArray[1]?.ToString("F2") ?? "Index out of range");
  314.             Console.WriteLine(dataArray[10]?.ToString("F2") ?? "Index out of range");
  315.  
  316.             // 3. Создать V2MainCollection и вывести данные
  317.             V2MainCollection mainCollection = new V2MainCollection(2, 2);
  318.             Console.WriteLine("V2MainCollection ToLongString:");
  319.             Console.WriteLine(mainCollection.ToLongString("F2"));
  320.  
  321.             // 4. Вывести xCount и MinMaxMagnitude для каждого элемента
  322.             foreach (var item in mainCollection)
  323.             {
  324.                 Console.WriteLine($"{item}: xCount = {item.XCount}, MinMaxMagnitude = {item.MinMaxMagnitude}");
  325.             }
  326.  
  327.             // 5. Использование индексатора по DateOnly
  328.             DateOnly existingDate = mainCollection[0].Date;
  329.             V2Data foundItem = mainCollection[existingDate];
  330.             Console.WriteLine(foundItem != null ? $"Found item with date {existingDate}: {foundItem}" : $"No item found with date {existingDate}");
  331.  
  332.             DateOnly nonExistingDate = DateOnly.FromDateTime(DateTime.Now.AddYears(1));
  333.             V2Data notFoundItem = mainCollection[nonExistingDate];
  334.             Console.WriteLine(notFoundItem != null ? $"Found item with date {nonExistingDate}: {notFoundItem}" : $"No item found with date {nonExistingDate}");
  335.         }
  336.     }
  337. }
  338.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement