Triangolo di Tartaglia in JAVA e C++

Triangolo di Tartaglia in Java

Sapreste scrivere un programma in JAVA e in C++ che stampa il triangolo di Tartaglia fino ad una riga scelta a piacere?

 

 

Come studenti universitari, di Matematica, Ingegneria, Fisica o quant’altro sicuramente vi imbatterete nell’annoso problema dei fondamenti di programmazione (materia, a mio avviso, fondamentale). Ebbene tenterò di sopperire queste mancanze con qualche articolo scritto nel tempo libero che vada a coprire un po’ tutti gli argomenti trattati durante questi corsi.

 

Scriverò quel che mi verrà in mente, non saranno perciò delle vere e proprie lezioni di difficoltà crescente ma più un modo per confrontarsi.

 

Il più delle volte userò come linguaggio il JAVA, nel caso di forti distinzioni con il C++ li evidenzierò: solo nel caso in cui i codici nei due linguaggi siano completamente diversi (ipotesi rara ma non impossibile) allora vedrò di scrivere il codice in entrambi i linguaggi di programmazione.

 

Cercherò di essere il più chiaro possibile tramite commenti sparsi dovunque: spero che il mio lavoro vi sia utile! Wink

 

 

Argomento del giorno: stampare un triangolo di Tartaglia di n righe.

 

 

Difficoltà: facile \ \bullet\ \bullet\ \circ\ \circ\ \circ\ \ \ (2/5)

 

 

Prerequisiti: ciclo for, array, funzioni.

 

 

La prima cosa da fare è, ovviamente, creare una classe main.

 

 

package it.youmath.tartaglia;
import java.util.Scanner;
/**
* @author Fylax*/
public class Tartaglia {
 /* Creazione del triangolo di Tartaglia di n elementi.
 */
 public static void main(String[] args) {
  //Frase di introduzione.
  System.out.print("Inserire la dimensione del triangolo di Tartaglia desiderata: ");
  //Scanner: Raccolta dati.
  Scanner input = new Scanner(System.in);
  //Viene considerato l'ingresso dello scanner come intero.
  int n = input.nextInt();
  //Calcola il triangolo long[][] triangle = Calcola(n);
  //Stampa il triangolo Stampa(triangle);
 }

 

 

Analizzando il codice è evidente cosa succede: viene chiesto all’utente di inserire la dimensione del triangolo e tale valore (tramite l’oggetto Scanner) viene salvato come intero in n.

 

Tale valore viene passato alla funzione Calcola che restituisce una matrice di long chiamata triangle che ha esattamente il triangolo al suo interno.

 

Tale matrice viene passata a sua volta alla funzione stampa che si occupa di stampare il triangolo di Tartaglia. Facile no? Smile

 

Nota: la matrice è di long anziché di int perché è molto probabile che, per certe scelte di n, il triangolo vada oltre i limiti degli int.

 

Ora però arriva la parte interessante: il lettore interessato avrà sicuramente già iniziato a fare congetture su cosa facciano o meno le due funzioni. Eccolo accontentato!

 

 

 /**
 * Calcola il triangolo di Tartaglia di una data dimensione.
 * @param dim Dimensione Triangolo ovvero numero delle righe.
 * @return Triangolo di Tartaglia. */
 public static long[][] Calcola(int dim) {
  //Definizione di una matrice quadrata n*n per la rappresentazione del triangolo.
  long x[][] = new long[dim][dim];
  //Imposizione primo elemento unitario.
  x[0][0] = 1;
  for (int i = 1; i < x.length; i++) {
      //Imposizione prima colonna unitaria.
      x[i][0] = 1;
      //Imposizione diagonale principale unitaria.
      x[i][i] = 1;
      for (int j = 1; j < i + 1; j++) {
          //Somma righe precedenti.
          x[i][j] = x[i - 1][j - 1] + x[i - 1][j];
      }
  }
  return x;
 }

 

 

Come già annunciato è evidente che tale funzione, per poter fare il proprio lavoro, ha bisogno di un intero che indichi il numero di righe del triangolo di Tartaglia. Di conseguenza la prima cosa che fa è creare una matrice quadrata della dimensione del parametro passato, al fine di poter salvare i valori trovati da qualche parte.

 

Ora, osservando un triangolo di Tartaglia qualsiasi, evidenzia facilmente che questo altri non è che una matrice triangolare inferiore con diagonale principale e prima colonna unitarie. Dunque per prima cosa si pone come primo elemento (tex)t_{1,1}=1(/tex}.

 

Fatto ciò, tramite un doppio ciclo for, si scansiona l’intera matrice ponendo la prima riga (tex)t_{1,j}=1(/tex) mentre con gli altri elementi semplicemente si rispetta la regola che caratterizza il triangolo di Tartaglia: ogni elemento è pari alla somma dell’elemento sulla riga precedente ed uguale colonna con l’elemento su riga precedente e colonna precedente. Ovvero in matematichese: (tex)t_{i,j}=t_{i-1,j}+t_{i-1,j-1}(/tex}.

 

A questo punto tramite il return si stabilisce che la funzione avrà come valore finale quello espresso da tale parola chiave.

 

Per quanto riguarda la stampa il discorso è affine

 

 

 /** * Stampa il triangolo di Tartaglia calcolato.
 * Non stampa gli elementi dopo la diagonale principale.
 * @param x Matrice contentente il triangolo. */
 private static void Stampa(long x[][]) {
  //Frase riassuntiva.
  System.out.println("Il triangolo di Tartaglia desiderato è:");
  for (int i = 0; i < x.length; i++) {
      for (int j = 0; j < i + 1; j++) {
          //Stampa generico elemento.
          System.out.print(x[i][j]);
          //Spazio aggiunto per formattazione.
          System.out.print(' ');
      }
      System.out.println();
  }
 }
}

 

 

Al solito una matrice viene scansionata da doppio ciclo for e facendo il print di ogni elemento. Il println vuoto viene utilizzato esclusivamente per andare a capo.

 

Un lettore attento si sarà sicuramente accorto di un abuso della clausola static. In effetti questo è un artefatto che ho creato per evitare di utilizzare la tecnologia ad oggetti (necessaria invece in Java). Nell’allegato comunque è possibile visionare il codice come sarebbe più corretto pensando ad una programmazione orientata agli oggetti.

 

Inoltre negli allegati è presente lo stesso programma realizzato in C++ opportunamente commentato, per chi preferisse tale linguaggio. Li puoi scaricare da qui (tramite Google Drive).

 

Agente Fylax

 

Articolo precedente

 

 


Tags: scrivere un programma che stampa il triangolo di Tartaglia fino ad una riga desiderata.