Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Sistemi - MRettangolare.cs

MRettangolare.cs

Caricato da: Poggi Marco
Scarica il programma completo

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5.  
  6. namespace Sistema
  7. {
  8.     class MRettangolare
  9.     {
  10.         protected double[] vettore = null;
  11.         private int righe, colonne;
  12.  
  13.         public MRettangolare(int quanteRighe, int quanteColonne)
  14.         {
  15.             righe = Math.Abs(quanteRighe);
  16.             colonne = Math.Abs(quanteColonne);
  17.             if ((righe * colonne) == 0)
  18.                 throw new Exception($"Impossile creare una matrice {righe} * {colonne}");
  19.             vettore = new Double[righe * colonne];
  20.             for (int i = 0; i < vettore.Length; i++)
  21.                 vettore[i] = 0.0;
  22.         }
  23.  
  24.         public int Righe
  25.         {
  26.             get
  27.             {
  28.                 return righe;
  29.             }
  30.         }
  31.  
  32.         public int Colonne
  33.         {
  34.             get
  35.             {
  36.                 return colonne;
  37.             }
  38.         }
  39.  
  40.         public double this[int riga, int colonna]
  41.         {
  42.             set
  43.             {
  44.                 ControlloDimensioni(riga, colonna);
  45.                 vettore[riga * this.colonne + colonna] = value;
  46.             }
  47.  
  48.             get
  49.             {
  50.                 ControlloDimensioni(riga, colonna);
  51.                 return vettore[riga * this.colonne + colonna];
  52.             }
  53.  
  54.         }
  55.  
  56.         protected void ControlloDimensioni(int riga, int colonna)
  57.         {
  58.             if (!((riga >= 0) && (riga < righe) && (colonna >= 0) && (colonna < colonne)))
  59.             {
  60.                 throw new OverflowException($"Impoeeiobile accedere alla cella [{riga}] [{colonna}]");
  61.             }
  62.         }
  63.  
  64.         public override string ToString()
  65.         {
  66.             System.Text.StringBuilder esito = new System.Text.StringBuilder("", 1000);
  67.             for (int i = 0; i < vettore.Length; i++)
  68.             {
  69.                 if ((i > 0) && ((i % colonne) == 0))
  70.                     esito.Append('\n');
  71.                 esito.AppendFormat("{0,11:f4}", vettore[i]);
  72.             }
  73.             esito.Append("\n");
  74.             return esito.ToString();
  75.         }
  76.  
  77.         public static MRettangolare operator *(double scalare, MRettangolare m)
  78.         {
  79.             return m * scalare;
  80.         }
  81.  
  82.         public static MRettangolare operator *(MRettangolare m, double scalare)
  83.         {
  84.             int i, j;
  85.             MRettangolare esito;
  86.             if (m.GetType() == typeof(Matrice))
  87.                 esito = new Matrice(m.righe);
  88.             else
  89.                 esito=new MRettangolare(m.righe, m.colonne);
  90.             for (i = 0; i < m.righe; i++)
  91.             {
  92.                 for (j = 0; j < m.colonne; j++)
  93.                 {
  94.                     esito[i, j] = scalare * m[i, j];
  95.                 }
  96.             }
  97.             return esito;
  98.         }
  99.  
  100.         public static MRettangolare operator *(MRettangolare sinistra, MRettangolare destra)
  101.         {
  102.             int fineRighe, fineColonne;
  103.             if (sinistra.righe != destra.colonne)
  104.                 throw new Exception("\nImpossibile moltiplicare due matrici con dimensioni diverse.\n");
  105.             fineRighe = sinistra.colonne;
  106.             fineColonne = destra.colonne;
  107.             MRettangolare esito;
  108.             if (fineRighe == fineColonne)
  109.                 esito = new Matrice(fineRighe);
  110.             else
  111.                 esito = new MRettangolare(fineRighe, fineColonne);
  112.             for (int Riga = 0; Riga < fineRighe; Riga++)
  113.             {
  114.                 for (int Colonna = 0; Colonna < fineColonne; Colonna++)
  115.                 {
  116.                     esito[Riga, Colonna] = 0.0;
  117.                     for (int l = 0; l < fineRighe; l++)
  118.                     {
  119.                         esito[Riga, Colonna] += sinistra[Riga, l] * destra[l, Colonna];
  120.                     }
  121.                 }
  122.             }
  123.             return esito;
  124.         }
  125.  
  126.         public static MRettangolare operator +(MRettangolare sinistra, MRettangolare destra)
  127.         {
  128.             int i, j, fineRighe, fineColonne;
  129.             if ((sinistra.righe != destra.Righe) || (sinistra.righe != destra.colonne))
  130.                 throw new Exception("\nImpossibile sommare due matrici con dimensioni diverse.\n");
  131.             fineRighe = sinistra.righe;
  132.             fineColonne = sinistra.colonne;
  133.             MRettangolare risultato;
  134.             if (fineRighe == fineColonne)
  135.                 risultato = new Matrice(fineRighe);
  136.             else
  137.                 risultato = new MRettangolare(fineRighe, fineColonne);
  138.             for (i = 0; i < fineRighe; i++)
  139.             {
  140.                 for (j = 0; j < fineColonne; j++)
  141.                 {
  142.                     risultato[i, j] = sinistra[i, j] + destra[i, j];
  143.                 }
  144.             }
  145.  
  146.             return risultato;
  147.         }
  148.     }
  149. }