Germano Gabbianelli avatar Germano Gabbianelli committed d1ec327

Aggiunto NumeroRelativo.

Comments (0)

Files changed (4)

Calcolatrice.java

     public static void main(String[] args) {
         Test.testNodoLista();
         Test.testNumero();
+        Test.testNumeroRelativo();
     }
 }
 class Numero {
-    public NodoLista cifre;
-    public int lunghezza;
+    protected NodoLista cifre;
+    protected int lunghezza;
+
+    public Numero() {
+        this.lunghezza = 0;
+    }
 
     public Numero(String numero) {
+        this.daStringa(numero);
+    }
+
+    protected Numero(NodoLista cifre, int lunghezza) {
+        this.cifre = cifre;
+        this.lunghezza = lunghezza;
+    }
+
+    public int getLunghezza() {
+        return this.lunghezza;
+    }
+
+    protected void daStringa(String numero) {
         int cifra = Character.getNumericValue(numero.charAt(0));
         NodoLista nodo = new NodoLista(cifra, null);
         int lunghezza = 1;
         this.lunghezza = lunghezza;
     }
 
-    private Numero(NodoLista cifre, int lunghezza) {
-        this.cifre = cifre;
-        this.lunghezza = lunghezza;
-    }
-
     public String toString() {
         String rappr = "";
         NodoLista cifra = this.cifre;
         }
         return risultato;
     }
-
-
-    // Sottrazione tra naturali. Sottrae al più grande tra i due numeri
-    // l'altro numero.
-    public Numero sottrai(Numero numero) {
-        NodoLista nodo1, nodo2, appoggio, sott;
-        int riporto, lunghezza;
-        
-        appoggio = sott = new NodoLista();
-        riporto = 0;
-
-        if (compareTo(numero) < 0) {
-            nodo1 = numero.cifre;
-            nodo2 = this.cifre;
-            lunghezza = numero.lunghezza;
-        } else {
-            nodo1 = this.cifre;
-            nodo2 = numero.cifre;
-            lunghezza = this.lunghezza;
-        }
-
-        while (nodo2 != null) {
-            if (nodo1.info - riporto >= nodo2.info) {
-                sott.next = new NodoLista(nodo1.info - nodo2.info - riporto, null);
-                riporto = 0;
-            }
-            else if (nodo1.next != null) {
-                sott.next = new NodoLista(10 + nodo1.info - nodo2.info - riporto, null);
-                riporto = 1;
-            }
-            else
-                sott.next = new NodoLista(nodo2.info - nodo1.info - riporto, null);
-
-            sott = sott.next;
-            nodo1 = nodo1.next;
-            nodo2 = nodo2.next;
-        }
-        while(nodo1 != null) {
-            if (nodo1.info - riporto >= 0) {
-                sott.next = new NodoLista(nodo1.info - riporto, null);
-                riporto = 0;
-            }
-            else {
-                sott.next = new NodoLista(10 + nodo1.info - riporto, null);
-                riporto = 1;
-            }
-            sott = sott.next;
-            nodo1 = nodo1.next;
-        }
-
-        boolean eliminato = true;
-        sott = appoggio.next;
-
-        while (eliminato && sott.next != null) {
-            while (sott.next.next != null)
-                sott = sott.next;
-            if (sott.next.info == 0) {
-                sott.next = null;
-                sott = appoggio.next;
-                lunghezza--;
-            } else {
-                eliminato = false;
-            }
-        }
-
-        return new Numero(appoggio.next, lunghezza);
-    }
-
 }

NumeroRelativo.java

+class NumeroRelativo extends Numero {
+    protected boolean positivo;
+
+    public NumeroRelativo(String numero) {
+        this.daStringa(numero);
+    }
+
+    protected NumeroRelativo(NodoLista cifre, int lunghezza, boolean positivo) {
+        super(cifre, lunghezza);
+        this.positivo = positivo;
+    }
+
+    protected void daStringa(String numero) {
+        this.positivo = true;
+        if (numero.charAt(0) == '-') {
+            numero = numero.substring(1);
+            this.positivo = false;
+        }
+        super.daStringa(numero);
+    }
+
+    public NumeroRelativo somma(NumeroRelativo numero) {
+        // -5 + 4 => 4-5    5 + -4 => 5 - 4
+        NumeroRelativo risultato;
+        if (this.positivo != numero.positivo) {
+            risultato = differenza(numero);
+        } else {
+            Numero somma = super.somma(numero);
+            risultato = new NumeroRelativo(somma.cifre, somma.lunghezza, true);
+            if (!this.positivo && !numero.positivo)
+                risultato.positivo = false;
+        }
+        return risultato;
+    }
+
+    // a - b == a + (-b)
+    public NumeroRelativo sottrai(NumeroRelativo numero) {
+        return somma(new NumeroRelativo(numero.cifre, numero.lunghezza, !numero.positivo));
+    }
+
+    private NumeroRelativo differenza(NumeroRelativo numero) {
+        NodoLista nodo1, nodo2, appoggio, sott;
+        int riporto, lunghezza;
+        boolean positivo;
+        
+        appoggio = sott = new NodoLista();
+        riporto = 0;
+
+        if (compareTo(numero) < 0) {
+            nodo1 = numero.cifre;
+            nodo2 = this.cifre;
+            positivo = !this.positivo;
+            lunghezza = numero.lunghezza;
+        } else {
+            nodo1 = this.cifre;
+            nodo2 = numero.cifre;
+            positivo = this.positivo;
+            lunghezza = this.lunghezza;
+        }
+
+        while (nodo2 != null) {
+            if (nodo1.info - riporto >= nodo2.info) {
+                sott.next = new NodoLista(nodo1.info - nodo2.info - riporto, null);
+                riporto = 0;
+            }
+            else if (nodo1.next != null) {
+                sott.next = new NodoLista(10 + nodo1.info - nodo2.info - riporto, null);
+                riporto = 1;
+            }
+            else
+                sott.next = new NodoLista(nodo2.info - nodo1.info - riporto, null);
+
+            sott = sott.next;
+            nodo1 = nodo1.next;
+            nodo2 = nodo2.next;
+        }
+
+        while(nodo1 != null) {
+            if (nodo1.info - riporto >= 0) {
+                sott.next = new NodoLista(nodo1.info - riporto, null);
+                riporto = 0;
+            }
+            else {
+                sott.next = new NodoLista(10 + nodo1.info - riporto, null);
+                riporto = 1;
+            }
+            sott = sott.next;
+            nodo1 = nodo1.next;
+        }
+
+        boolean eliminato = true;
+        sott = appoggio.next;
+
+        while (eliminato && sott.next != null) {
+            while (sott.next.next != null)
+                sott = sott.next;
+            if (sott.next.info == 0) {
+                sott.next = null;
+                sott = appoggio.next;
+                lunghezza--;
+            } else {
+                eliminato = false;
+            }
+        }
+
+        return new NumeroRelativo(appoggio.next, lunghezza, positivo);
+    }
+
+
+    public String toString() {
+        String rappr = super.toString();
+        if (!this.positivo)
+            rappr = "-" + rappr;
+        return rappr;
+    }
+
+
+}
         System.out.println(a.compareTo(a) + " == 0");
         System.out.println(max_long.compareTo(new Numero("156789")) + " > 0");
 
-        // test sottrazione tra interi
-        System.out.println(zero.sottrai(zero) + " == 0");
-        System.out.println(max_long.sottrai(max_int) + " == 9223372034707292160");
-        System.out.println(max_int.sottrai(max_long) + " == 9223372034707292160");
+
+    }
+
+    public static void testNumeroRelativo() {
+        System.out.println("********** TEST: NumeroRelativo **********");
+        NumeroRelativo zero = new NumeroRelativo("0"),
+                       max_int = new NumeroRelativo("2147483647"),                // 2³¹-1
+                       max_long = new NumeroRelativo("-9223372036854775807"),      // 2⁶³-1
+                       a = new NumeroRelativo("1267650600228229401496703205376"), // 2¹⁰⁰
+                       b = new NumeroRelativo("115"),
+                       c = new NumeroRelativo("-238549");
+
+        System.out.println(zero + " == 0");
+        System.out.println(max_long + " == -9223372036854775807");
+        System.out.println(c + " == -238549");
+
+        // test somma
+        System.out.println(zero.somma(zero) + " == 0");
+        System.out.println(b.somma(c) + " == -238434");
+        System.out.println(c.somma(b) + " == -238434");
+        System.out.println(max_long.somma(max_int) + " == -9223372034707292160");
+        System.out.println(max_int.somma(c) + " == 2147245098");
+
+        // test sottrai
+        System.out.println(a.sottrai(a) + " == 0");
+        System.out.println(b.sottrai(a) + " == -1267650600228229401496703205261");
+
     }
 }
 
+    /*
+    public static void testNumeroRelativo() {
+        Numero a, b, c, d; int esp;
+        System.out.println("*******************SOMMA*******************\n\n");
+        a = new Numero("340");
+        b = new Numero("-23525");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 5 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("344320");
+        b = new Numero("-23525");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 6 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("-23501");
+        b = new Numero("23525");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 2 == " + c.getLunghezza() + "\n");
+            
+        a = new Numero("-23501");
+        b = new Numero("23500");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("-23");
+        b = new Numero("-25");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 2 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("76");
+        b = new Numero("69");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 3 == " + c.getLunghezza() + "\n");
+            
+        a = new Numero("-101");
+        b = new Numero("101");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("101");
+        b = new Numero("-101");
+        c = a.somma(b);
+        System.out.println(a + " + " + b + " == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+         
+        System.out.println("\n***************MOLTIPLICA****************\n\n");
+        a = new Numero("-9324");
+        b = new Numero("676");
+        c = a.moltiplica(b);
+        System.out.println(a + " * " + b + " == " + c);
+        System.out.println("lunghezza e' 7 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("3999");
+        b = new Numero("-2111");
+        c = a.moltiplica(b);
+        System.out.println(a + " * " + b + " == " + c);
+        System.out.println("lunghezza e' 7 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("3563");
+        b = new Numero("41");
+        c = a.moltiplica(b);
+        System.out.println(a + " * " + b + " == " + c);
+        System.out.println("lunghezza e' 6 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("-7522");
+        b = new Numero("-1324");
+        c = a.moltiplica(b);
+        System.out.println(a + " * " + b + " == " + c);
+        System.out.println("lunghezza e' 7 == " + c.getLunghezza() + "\n");
+            
+        a = new Numero("-7522");
+        b = new Numero("0");
+        c = a.moltiplica(b);
+        System.out.println(a + " * " + b + " == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("0");
+        b = new Numero("456");
+        c = a.moltiplica(b);
+        System.out.println(a + " * " + b + " == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+
+        System.out.println("\n******************POTENZA****************\n\n");
+        a = new Numero("5");
+        esp = 3;
+        c = a.potenza(esp);
+        System.out.println(a + " ^ " + esp + " == " + c);
+        System.out.println("lunghezza e' 3 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("-5");
+        esp = 3;
+        c = a.potenza(esp);
+        System.out.println(a + " ^ " + esp + " == " + c);
+        System.out.println("lunghezza e' 3 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("-3");
+        esp = 4;
+        c = a.potenza(esp);
+        System.out.println(a + " ^ " + esp + " == " + c);
+        System.out.println("lunghezza e' 2 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("1308");
+        esp = 32;
+        c = a.potenza(esp);
+        System.out.println(a + " ^ " + esp + " == " + c);
+        System.out.println("lunghezza e' 100 == " + c.getLunghezza() + "\n");
+            
+        a = new Numero("54567546738");
+        esp = 0;
+        c = a.potenza(esp);
+        System.out.println(a + " ^ " + esp + " == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+            
+        a = new Numero("0");
+        esp = 24;
+        c = a.potenza(esp);
+        System.out.println(a + " ^ " + esp + " == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+            
+        System.out.println("\n***************FATTORIALE****************\n\n");
+        a = new Numero("10");
+        c = a.fattoriale();
+        System.out.println(a + "! == " + c);
+        System.out.println("lunghezza e' 7 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("1");
+        c = a.fattoriale();
+        System.out.println(a + "! == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("0");
+        c = a.fattoriale();
+        System.out.println(a + "! == " + c);
+        System.out.println("lunghezza e' 1 == " + c.getLunghezza() + "\n");
+
+        a = new Numero("5");
+        c = a.fattoriale();
+        System.out.println(a + "! == " + c);
+        System.out.println("lunghezza e' 3 == " + c.getLunghezza() + "\n");
+
+}
+*/
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.