Pseudocodice e top down per migliorare la nostra produttività

Posted by Dibi Store Wed, 26 Dec 2007 16:31:00 GMT

Lo pseudocodice è una particolare tecnica che ci aiuta nella scrittura di un codice migliore, più efficente e in un tempo minore. Lo pseudocodice può non è un codice eseguibile direttamente da un computer, bensì ci aiuta nel tradurre l'algoritmo (o procedura) nel nostro linguaggio preferito. Oggi dimostretrò come questo, unito alla tecnica top down possa aiutarci in molte occasioni.

Enunciazione del problema

Il nostro obiettivo sarà quello di stampare il fattoriale dei numeri da 1 a 5 in formato tabellare, usando come linguaggio il C. A scopo didattico non verrà utilizzata nessuna libreria per effettuare il calcolo. Il fattoriale di un numero x, non è altro che il prodotto di se stesso per tutti i numeri in ordine decresente a partire da se stesso fino a 1. Per esempio il fattoriale di 5 é: 5! = 5 * 4 * 3 * 2 * 1. Anche se può sembrare a prima lista banale, il programma presenta molte caratteristiche che risaltano i vantaggi dell'uso dello pseudocodice e della tecnica top down.

risultato finale:
  1	1
  2	2
  3	6
  4	24
  5	120

La tecnica top down prevede che si parta da un unica dichiarazione dell'obiettivo su una riga (o poche al massimo), che però descriva sempre completamente l'algoritmo. Potremmo quindi iniziare scrivendo questo pseudocodice:

  Stampa in formato tabellare il prodotto dei numeri da 1 a 5.

Ovviamente questo codice è ben lontano dal poter essere convertito in codice reale, per qui andremo man mano ad estenderlo. In particolare ragionando sul problema è chiaro che avremo bisogno di alcune variabili e di qualche iterazione:

  inizializzare le variabili
  
  Per ogni numero da 1 a 5
      stampa il fattoriale di ogni numero

Le cose cominciano ad essere interessanti, infatti notate che abbiamo dapprima inserito una nuova istruzione per l'inizializzazione delle variabili, e annunciato un ciclo che itera su tutti i numeri. Per quanto banale questo comincia già a creare una certa struttura al nostro codice e a chiarire un po le idee. Infine notate gli spazi e le indentazioni che rendono più leggibile lo pseudocodice.

Ragionando per un momento sul problema, ci viene chiaro che avremmo bisogno di 3 variabili, una sarà l'iteratore principale che useremo nel primo ciclo, che per comodità chiameremo number, di una variabile secondaria che chiamerermo i che servirà per un secondo ciclo (dobbiamo costruire un iterazione per calcolare il fattoriale), e infine una variabile sum che conterrà il prodotto delle iterazioni del secondo ciclo. Non preoccupatevi se non capite subito il mio ragionamento, in quanto l'obiettivo non è capire il significato del codice ma imparare a usare le due tecniche che ho presentato:

    inizializzare variabili number, i e sum
    
    Per ogni numero da 1 a 5(usa number come variabile di controllo)
        stampa il numero corrente seguito da un segno di tabulazione
        
        assegna a sum un valore uguale a number
        
        per ogni numero in ordine decrescente da number a 1(usa i come variabile di controllo)
            moltiplica sum per i
            
        stampa sum

Questo codice non sarà difficile da convertire in un linguaggio come il C:

  #include "stdio.h"

  int main ()
  {
  	int number, y, sum;

  	for(number = 1; number <= 5; ++number)
  	{
  		printf("%d\t", number );
  		sum = number;

  		for ( y = number; y > 1; --y)
  			sum *= y - 1;

  		printf("%d\n", sum );

  	} /* for */

  	return 0;
  }

Che produrrà il risultato desiderato:

  dibistore:4 oskar$ gcc esercizio3.c 
  dibistore:4 oskar$ ./a.out 
  1	    1
  2	    2
  3	    6
  4	    24
  5	    120
  dibistore:4 oskar$ 

Conclusioni

Avete imparato le tecniche base per scrivere un buon pseudocodice e avete sperimentato la tecnica top down. Sono sicuro che potranno tornarvi molto utili, specialmente quando un problema sembra contorto. Vi consiglio di esercitarvi un pò con queste tecniche, cercando magari un pò di documentazione online. Uno dei vantaggi più grandi a mio parere dello pseudocodice è che ora sarà estremamente semplice riscrivere lo stesso codice in un altro linguaggio, per esempio ruby:

  (1..5).each do |number|
    printf("#{number}\t")
    sum = number

    number.downto(2) {|y| sum *= y - 1 }

    printf("#{sum}\n")

  end
  

Posted in  | Tags  | no comments | no trackbacks