Advertisement
NelloRizzo

Frazioni

Oct 3rd, 2019
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.55 KB | None | 0 0
  1. // https://pastebin.com/u/nellorizzo
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace Rationals
  9. {
  10.     /*
  11.      * Gestione delle operazioni tra frazioni aritmetiche.
  12.      * Cosa intendiamo con frazione? Come si svolgono le operazioni tra frazioni?
  13.      * Una [frazione] è costituita da [numeratore] e [denominatore], entrambi numeri interi.
  14.      * Una frazione può essere <ridotta ai minimi termini> (MCD - altro algoritmo).
  15.      * Una frazione può essere <trasformata in numero reale>.
  16.      * Un numero reale può essere <trasformato in frazione>.
  17.      * Una frazione può essere <rappresentata sotto forma di stringa>.
  18.      * <Operazioni:
  19.      * - Addizione
  20.      * - Sottrazione
  21.      * - Moltiplicazione
  22.      * - Divisione
  23.      * - Inverso
  24.      * - Cambio segno
  25.      * - Uguaglianza tra frazioni (?)>
  26.      * */
  27.     class Fraction
  28.     {
  29.         public int Numerator { get; private set; }
  30.         public int Denominator { get; private set; }
  31.         public int Sign { get; private set; }
  32.         // creazione di frazione
  33.         //   come possiamo creare una frazione?
  34.         //     1. a partire da numeratore e denominatore
  35.         public Fraction(int numerator, int denominator)
  36.         {
  37.             //if (numerator * denominator < 0) Sign = -1; else Sign = 1;
  38.             Sign = (numerator * denominator < 0) ? -1 : 1;
  39.             Numerator = Math.Abs(numerator);
  40.             Denominator = Math.Abs(denominator);
  41.             // TODO: Se il denominatore è 0 cosa succede???
  42.  
  43.             // riduco ai minimi termini
  44.             Normalize();
  45.         }
  46.         //     2. a partire da un numero intero
  47.         public Fraction(int number) : this(numerator: number, denominator: 1)
  48.         {
  49.             // richiama l'altro costruttore passando 1 come denominatore...
  50.             //Numerator = number;
  51.             //Denominator = 1;
  52.         }
  53.         //     3. a partire da un numero con la virgola
  54.         public Fraction(float number, int digits)
  55.         {
  56.             int power = (int)Math.Pow(10, digits); // 10 ^ digits
  57.             Sign = (number < 0) ? -1 : 1;
  58.             Numerator = (int)Math.Truncate(Math.Abs(number) * power);
  59.             Denominator = power;
  60.             Normalize();
  61.         }
  62.         //     4. la frazione unitaria? (il numero 1 potrebbe essere una frazione 1/1)
  63.         public Fraction() : this(1, 1) { }
  64.         //     5. esiste uno zero? - non lo prendo in considerazione (almeno per ora)
  65.  
  66.         // implementazione dell'algoritmo di Euclide per calcolare il M.C.D.
  67.         // con la tecnica ricorsiva.
  68.         // TODO: Chi potrà, in futuro, utilizzare il metodo MCD?
  69.         int MCD(int a, int b)
  70.         {
  71.             if (a < b) { int t = a; a = b; b = t; }
  72.             if (b == 0) return a;
  73.             return MCD(b, a % b);
  74.         }
  75.         // riduzione ai minimi termini
  76.         private void Normalize()
  77.         {
  78.             // prendo il Massimo Comune Divisore tra il Numeratore e il Denominatore
  79.             int mcd = MCD(Numerator, Denominator);
  80.             // divido il numeratore per il m.c.d.
  81.             Numerator /= mcd;
  82.             // divido il denominatore per il m.c.d.
  83.             Denominator /= mcd;
  84.         }
  85.         // trasformazione in numero reale
  86.         public double ToReal() { return Sign * (double)Numerator / Denominator; }
  87.         // rappresentazione come stringa
  88.         public override string ToString()
  89.         {
  90.             // TODO: Queste concatenazioni di stringhe non mi piacciono...
  91.             string result = "";
  92.             if (Sign < 0) result = "-";
  93.             result += Numerator.ToString();
  94.             if (Denominator != 1)
  95.                 result += "/" + Denominator.ToString();
  96.             return result;
  97.         }
  98.         // operazioni...
  99.         // Addizione tra frazioni
  100.         // Ho la frazione sulla quale viene applicato il metodo Add
  101.         // che deve essere addizionata ad un'altra frazione passata come parametro
  102.         // Primo problema: cosa restituisco? La soluzione più semplice è quella di restituire
  103.         //                 una terza frazione SOMMA che contiene appunto la somma delle due frazioni
  104.         public Fraction Add(Fraction other)
  105.         {
  106.             int n = this.Sign * this.Numerator * other.Denominator +
  107.                 other.Sign * this.Denominator * other.Numerator;
  108.             int d = this.Denominator * other.Denominator;
  109.  
  110.             return new Fraction(n, d);
  111.         }
  112.         // opposto di una frazione...
  113.         public Fraction Opposite() { return new Fraction(-Sign * Numerator, Denominator); }
  114.         // Sottrazione = Addizione con l'opposto della seconda...
  115.         public Fraction Sub(Fraction other)
  116.         {
  117.             return Add(other.Opposite());
  118.         }
  119.         public Fraction Mul(Fraction other)
  120.         {
  121.             int n = this.Numerator * this.Sign * other.Sign * other.Numerator;
  122.             int d = this.Denominator * other.Denominator;
  123.             return new Fraction(n, d);
  124.         }
  125.         public Fraction Inverse() { return new Fraction(Sign * Denominator, Numerator); }
  126.         public Fraction Div(Fraction other)
  127.         {
  128.             return Mul(other.Inverse());
  129.         }
  130.  
  131.         // L'eleganza del C#:
  132.         public static explicit operator Fraction(double d) { return new Fraction((float)d, 5); }
  133.  
  134.         public static explicit operator double(Fraction f) { return f.ToReal(); }
  135.         public static Fraction operator +(Fraction f1, Fraction f2) { return f1.Add(f2); }
  136.         public static Fraction operator +(Fraction f, double d) { return f.Add((Fraction)d); }
  137.         public static Fraction operator +(double d, Fraction f) { return f + d; }
  138.         public static Fraction operator -(Fraction f1, Fraction f2) { return f1.Sub(f2); }
  139.         public static Fraction operator -(Fraction f1, double f2) { return f1.Sub((Fraction)f2); }
  140.         public static Fraction operator -(double d, Fraction f) { return f.Opposite() + d; }
  141.         public static Fraction operator *(Fraction f1, Fraction f2) { return f1.Mul(f2); }
  142.         public static Fraction operator *(Fraction f, double d) { var t= f.Mul((Fraction)d); return t; }
  143.         public static Fraction operator *(double d, Fraction f) { return f.Mul((Fraction)d); }
  144.         public static Fraction operator /(Fraction f1, Fraction f2) { return f1.Div(f2); }
  145.         public static Fraction operator /(Fraction f, double d) { return f.Div((Fraction)d); }
  146.         public static Fraction operator /(double d, Fraction f) { return ((Fraction)d).Div(f); }
  147.     }
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement