Come costruire cicli con RIMIRO

Nel precedente articolo abbiamo visto Come operare delle scelte con RIMIRO. In questo nuovo articolo impareremo come costruire sia dei cicli semplici che dei cicli consecutivi.

Con la struttura di controllo della iterazione, anche RIMIRO può essere fatto rientrare a buon diritto tra i linguaggi di programmazione che supportano la programmazione strutturata sulla base del Teorema di Böhm-Jacopini.

Il Teorema di Böhm-Jacopini afferma che qualunque algoritmo può essere implementato in fase di programmazione utilizzando tre sole strutture di controllo: la sequenza, la selezione e l’iterazione.

Ciclo semplice

In RIMIRO per realizzare un ciclo ci occorrono almeno quattro nodi predecessori e un solo nodo successore che dovrà contenere l’istruzione da-a che è l’istruzione per l’iterazione.

In pratica:

  1. Il nodo predecessore più a sinistra rappresenta il valore iniziale per l’iterazione.
  2. Il secondo nodo predecessore subito a seguire rappresenta il valore finale.
  3. Il terzo nodo predecessore il passo di incremento.
  4. Dal quarto nodo predecessore in poi ci sono le istruzioni da ripetere ricorsivamente.

Vediamo un esempio con un’unica istruzione da iterare:

Nell’esempio più sopra troviamo, come unica istruzione, l’operatore di incremento += che fa sì che il valore del nodo su cui è applicata viene incrementato in base al valore del suo predecessore.

Se mandiamo in esecuzione il nodo numero 10 di questo grafo, con il tasto F5, otteniamo questo risultato:

Cicli consecutivi

Nulla ci vieta di realizzare con RIMIRO dei cicli consecutivi dove il risultato del primo ciclo viene utilizzato da un secondo ciclo.

Riprendendo l’esempio che abbiamo visto più sopra, aggiungiamo in sequenza un secondo ciclo:

Come possiamo notare il risultato del nodo “contatore 2” è 12 perché nel secondo ciclo si è incrementato per quattro volte il risultato del primo ciclo che aveva portato il valore del nodo “contatore 1” a 3. Ovvero il nodo “ciclo 2” ha compiuto questa operazione: 3+3+3+3.

Da notare che per far eseguire in sequenza prima il nodo “ciclo 1” e poi il nodo “ciclo 2” si è utilizzato lo stratagemma di renderli predecessori del nodo successore “ESEGUI” che ha quest’unica funzione; e per compiere nel giusto ordine la sequenza, il nodo “ciclo 1” è stato posizionato più a sinistra del nodo “ciclo 2”.

Bene. Per oggi possiamo fermarci qui. 🙂

Nel prossimo articolo vedremo insieme una seconda istruzione di iterazione: l’istruzione fino-a.

Come scaricare RIMIRO sul proprio computer e farlo funzionare

Per seguire in maniera proficua la Guida a RIMIRO è buona cosa farlo ripetendo gli esempi della Guida e provando poi a modificare da soli i grafi sperimentando in prima persona l’ambiente di sviluppo visuale RIMIRO e il relativo linguaggio integrato.

Occorre quindi avere RIMIRO sul proprio computer.

La buona notizia è che non è necessaria alcuna installazione. Sia che tu abbia un computer con sistema operativo Windows che Linux, ti basterà scaricare il relativo pacchetto facendo clic sul pulsante che trovi qui sotto.

RIMIRO è un software libero

In soli 3 passi sarai pronto per fare i tuoi esperimenti con RIMIRO dando sempre un occhio anche al Manuale RIMIRO:

  1. Scarica il file compresso relativo al tuo sistema operativo (al momento le versioni sono per sistemi a 64 bit).
  2. Decomprimi il file nella cartella che più ti aggrada, o creane una dedicata.
  3. Lancia l’eseguibile RIMIRO con doppio clic o con eventuali altre opzioni messe a disposizione dal tuo sistema operativo.

Buon divertimento! 🙂

Come operare delle scelte con RIMIRO

Con FreeBASIC abbiamo imparato a conoscere la struttura di controllo if-then-else che è una delle componenti fondamentali del paradigma della programmazione strutturata.

Questa istruzione permette di operare delle scelte, di gestire in pratica delle alternative.

Non poteva certo mancare un ingrediente del genere in RIMIRO.

Istruzione “se”

Immaginiamo di dover decidere se buttare la pasta o meno. Problemone!! 🙂

Sappiamo tutti che per farlo dobbiamo aspettare che l’acqua raggiunga il suo punto di ebollizione. Per semplificarci la vita immaginiamo di essere in una località lungo la costa e quindi il punto di ebollizione al livello del mare sarà di 100°.

Creiamo il nodo “punto di ebollizione” e assegniamogli con l’operatore di assegnamento=” il valore 100.

Ora ci serve un altro nodo per permettere all’utente di immettere il valore della temperatura misurata.

Nel precedente articolo (Input e output con RIMIRO) abbiamo già imparato come si fa.

Arrivati a questo punto dobbiamo poter confrontare i due valori.

Utilizziamo quindi l’operatore di confronto maggiore o uguale>=”.

In RIMIRO il nodo contenente come istruzione un operatore di confronto deve avere due soli predecessori che rappresenteranno i due operandi su cui operare il confronto. L’esito del confronto farà assumere al nodo il valore “vero” o “falso”.

Eccoci arrivati al punto essenziale della questione: per operare una scelta occorre sapere se un certo fenomeno o evento sia vero o falso. Il nodo che abbiamo appena creato sarà quindi il predecessore del nodo che dovrà operare la scelta che definiremo attraverso l’istruzione “se“.

Arrivati a questo punto dobbiamo definire le due alternative.

In RIMIRO il successore del nodo “se” che si trova più a sinistra verrà eseguito se il valore del predecessore del nodo “se” sarà “vero”, mentre se questo valore sarà “falso”, allora verrà eseguito il successore del nodo “se” più a destra.

Infine aggiungiamo al grafo un ultimo nodo per la stampa del risultato.

Ed ora… possiamo andare a mangiare! 🙂

Nel prossimo articolo vedremo Come costruire cicli con RIMIRO.

Input e output con RIMIRO

Potevamo non iniziare la nostra Guida a RIMIRO con il classico esempio Ciao mondo!?

Certo che no.

Bene, mettiamoci subito all’opera.

Procedura per la creazione dei nodi

In RIMIRO i programmi non sono altro che grafi.

Iniziamo quindi creando due nodi, ciascuno dei quali si occuperà di chiedere all’utente le parole da stampare successivamente a video.

Per crearli possiamo sia premere il pulsante centrale del mouse, in un punto qualsiasi della finestra di lavoro, che premere il tasto F1.

Se usiamo il mouse il nodo verrà creato nel punto dello schermo dove si trova il puntatore del mouse, se invece lo abbiamo creato tramite la tastiera il nodo verrà creato in alto a sinistra. In ogni caso, il nodo potrà poi essere spostato a piacimento (in fondo a questo articolo trovi il paragrafo “Procedura di spostamento dei nodi”).

A questo punto RIMIRO ci chiede di fornire una etichetta che identifichi il nodo e poi l’istruzione da eseguire.

Sebbene possiamo sempre scegliere qualsiasi testo per le etichette, per questo esempio scegliamo: “parola 1” e “parola 2”.

Eccoci finalmente giunti alla prima istruzione di RIMIRO.

In RIMIRO l’istruzione per l’input è semplicemente il carattere ? (il punto di domanda).

Ciascun nodo viene identificato da un numero.

Ora dobbiamo creare un terzo nodo che possa raccogliere le informazioni, comporle e poi stamparle.

L’istruzione per l’output è stampa.

Una volta creati i nodi dobbiamo unirli nella maniera opportuna attraverso degli archi.

Procedura per la creazione degli archi

Per creare un arco tra due nodi dobbiamo per prima cosa selezionare il nodo predecessore con il pulsante sinistro del mouse e poi indicare il nodo successore con il pulsante destro del mouse. A questo punto i due nodi vengono uniti con un arco rappresentato da una linea verde.

RIMIRO ci segnala il nodo selezionato sia colorando di rosso il suo perimetro che dandocene l’informazione nella finestra console.

Ripetiamo ora l’operazione per unire con un secondo arco il nodo 2 e il nodo 3.

Procedura per l’esecuzione di un grafo RIMIRO

Ora che abbiamo creato il nostro primo grafo (programma), mettiamo alla prova RIMIRO per vedere se riesce a rendere il grafo operativo.

Per far eseguire un grafo RIMIRO occorre selezionare il nodo su cui si vuole lanciare l’elaborazione e poi premere il tasto F5.

Selezioniamo quindi il nodo 3 con il pulsante sinistro del mouse e poi premiamo il tasto F5.

A questo punto RIMIRO esegue in sequenza le istruzioni dei predecessori del nodo su cui è stata lanciata la richiesta di elaborazione a partire dal predecessore che si trova più a sinistra per proseguire poi verso destra sino ad arrivare all’ultimo predecessore. Per ultima viene eseguita l’istruzione contenuta nel nodo successore su cui si è lanciata l’elaborazione.

Ed ecco il risultato finale.

Non è stupendo? 🙂

Procedura di spostamento dei nodi

Per spostare un qualsiasi nodo nella finestra di lavoro, occorre prima selezionarlo con il pulsante sinistro del mouse e poi agganciarlo con il pulsante destro del mouse.

A questo punto il nodo seguirà gli spostamenti del puntatore del mouse sino a che non sganceremo il nodo premendo ancora il pulsante destro del mouse oppure deselezionandolo con il pulsante sinistro del mouse.

Video Tutorial n.1

Bene. Per oggi ci fermiamo qui.

Nel prossimo articolo vedremo come operare delle scelte con RIMIRO.

Successione di Fibonacci con RIMIRO

Nella conclusione del precedente articolo, dedicato alla presentazione di una prima bozza della versione alfa del progetto RIMIRO, ci eravamo ripromessi di studiare come rendere operativo un generico grafo.

Ci sono volute diverse ore di programmazione con FreeBASIC, ma alla fine l’obiettivo è stato raggiunto:

Ora l’ambiente di sviluppo visuale RIMIRO permette sia di descrivere una generica base dati che l’algoritmo che opera su questa.

Per mettere alla prova RIMIRO si è lavorato sul calcolo della Successione di Fibonacci.

L’immagine in copertina a questo articolo non è una “semplice immagine”, ma l’immagine è il vero e proprio programma.

Ecco quindi cos’è un programma realizzato con RIMIRO:

Un grafo che contiene tutto: base dati, algoritmo e descrizione dell’idea operante concepita dal programmatore.

A questo punto non ci resta che lavorare su due fronti:

  1. Continuare a sviluppare RIMIRO correggendo eventuali errori, aggiungendo funzionalità ed ottimizzando il codice e le prestazioni.
  2. Cominciare a scrivere una Guida a RIMIRO sulla falsariga della Guida al FreeBASIC.

Bene. Un altro piccolo passo è stato fatto. 🙂

RIMIRO: versione alfa

Nell’articolo Cos’è RIMIRO? avevamo definito una prima struttura schematica delle procedure di base della versione alfa del progetto.

Il nostro Modello (comportamento o logica del programma) prevedeva:

  • creazione, attivazione/disattivazione ed eliminazione di un nodo
  • creazione ed eliminazione di un arco
  • spostamento di un nodo
  • salvataggio/caricamento di un grafo

A distanza di quasi tre mesi il codice è pronto.

Ovviamente il programma manca ancora della parte operativa: ovvero non è ancora in grado di eseguire alcun algoritmo.

Quello che però già possiamo fare è creare e modificare un generico grafo come quello più sotto.

Guida ai comandi disponibili

Nel prossimo articolo ragioneremo su come rendere operativo il grafo.

Cos’è RIMIRO?

Definizione e licenza di utilizzo

RIMIRO è un ambiente di sviluppo visuale, basato sui grafi, per la creazione di una generica base di dati e degli algoritmi che possono agire su questa.

RIMIRO è un software libero rilasciato sotto i termini della licenza GNU GPLv3.

Un programma è software libero se gli utenti del programma godono delle quattro libertà fondamentali:

Libertà di eseguire il programma come si desidera, per qualsiasi scopo.

Libertà di studiare come funziona il programma e di modificarlo in modo da adattarlo alle proprie necessità. L’accesso al codice sorgente ne è un prerequisito.

Libertà di ridistribuire copie in modo da aiutare gli altri.

Libertà di migliorare il programma e distribuirne pubblicamente i miglioramenti da voi apportati (e le vostre versioni modificate in genere), in modo tale che tutta la comunità ne tragga beneficio. L’accesso al codice sorgente ne è un prerequisito.

Scopo

L’articolo Grafi, diagrammi di flusso e database si concludeva proponendo i seguenti due obiettivi:

  1. Sviluppare una applicazione per la rappresentazione grafica sia di una generica base di dati che degli algoritmi. Una rappresentazione che metta insieme l’arte (colori e figure) e la scienza (concetti e idee), e che sia inoltre operativa: ovvero che si possano eseguire gli algoritmi sulla base dati.
  2. Che questa applicazione non si limiti ad essere un altro modo per fare programmazione visuale, ma che sia una educazione pratica del pensiero.

Nello stesso articolo si assegnava al progetto il nome RIMIRO.

Metodo di lavoro

Il metodo di lavoro che seguiremo si articolerà su tre aspetti:

Strumenti di lavoro

Gli strumenti di lavoro principali saranno:

Progettazione top-down di RIMIRO

Struttura schematica delle procedure e sotto-procedure della versione alfa del progetto RIMIRO.

  • Modello (comportamento o logica del programma)
    • Procedure interne:
      • creazione, attivazione/disattivazione ed eliminazione di un nodo
      • creazione ed eliminazione di un arco
      • spostamento di un nodo
      • salvataggio/caricamento di un grafo
    • Notifica (Modello -> Controllo):
      • grafo aggiornato
  • Vista (interazione con l’utente)
    • Azioni utente (Utente -> Vista -> Controllo):
      • crea, attiva/disattiva ed elimina un nodo
      • crea ed elimina un arco
      • sposta un nodo
      • salva/carica un grafo
    • Aggiornamento (Vista -> Utente):
      • visualizzazione del grafo aggiornato
  • Controllo (interlavoro interno)
    • Gestione eventi (programmazione a eventi):
      • Aggiornamento (Controllo -> Modello):
        • chiama la procedura specifica in base a:
          • informazioni del mouse
          • tasto della tastiera premuto
      • Aggiornamento (Controllo -> Vista):
        • passa il grafo aggiornato
Di Wdror-wsu-ap and Regis Frey – Opera propria, Pubblico dominio, Collegamento

Nel prossimo articolo cominceremo a sviluppare passo passo il codice FreeBASIC delle varie procedure e sotto-procedure. 🙂

Grafi, diagrammi di flusso e database

Scopo di questo articolo è quello di riflettere sul concetto di grafo, sulla relazione che i grafi hanno con i diagrammi di flusso (flow chart) e con le basi di dati (database), infine sul cominciare ad immaginare una nuova modalità di rappresentazione grafica degli algoritmi e delle basi di dati: una modalità che sia al tempo stesso descrittiva e operativa.

Cosa sono i grafi

In estrema sintesi un grafo è un insieme di punti che possono essere collegati tra loro.

Tra le tante possibili definizioni, in questo articolo chiameremo i punti con il termine nodi e i collegamenti con quello di archi.

Identificando un generico grafo con la lettera maiuscola G, l’insieme dei nodi con la lettera maiuscola N e l’insieme degli archi con la lettera maiuscola A, avremo la formula:

G(N,A)

Cosa possiamo rappresentare con un grafo?

Dalla definizione data, è facile immaginare che un grafo può rappresentare molte strutture reali o astratte, per esempio:

Codice sorgente

  • i nodi potrebbero identificare le singole istruzioni di un programma informatico;
  • gli archi potrebbero identificare la sequenza delle istruzioni descrivendo quindi tutte le possibili diramazioni.

Questo esempio ci suggerisce che il classico diagramma di flusso (flow chart) può essere assimilabile ad un grafo.

È utile ricordare che il paradigma della programmazione strutturata fa largo uso dei diagrammi di flusso per rappresentare i suoi tre elementi fondamentali:

  • sequenza (il percorso logico che segue un algoritmo o, più in generale, un generico programma)
  • selezione (o alternativa)
  • ciclo (o iterazione)

Base di dati (database)

  • i nodi potrebbero identificare i singoli concetti;
  • gli archi potrebbero identificare le relazioni tra i concetti e definirne la tipologia e la direzione.

Tipologie dei grafi

Si possono avere diverse tipologie di grafi in base ad alcune caratteristiche dei nodi o degli archi.

Grafo orientato

Se gli archi che collegano i vari nodi hanno un verso di percorrenza, allora il grafo si dice orientato, altrimenti viene definito non orientato.

Data questa definizione è facile capire che un diagramma di flusso rientra tra i grafi orientati, così come una base di dati a grafo dove la tipologia di relazione tra due concetti esprime anche una direzione.

Nomenclatura

Nei grafi orientati i vari elementi prendono le seguenti definizioni:

nodo di partenza (i): coda (o predecessore di j)
nodo di arrivo (j): testa (o successore di i)

Grafo e multigrafo

Se in un grafo vi è la presenza di almeno due nodi collegati tra loro da più archi, allora il grafo prende il nome di multigrafo.

Il diagramma di flusso è quindi un grafo orientato completo.

Una base di dati a grafo può essere sia un grafo che un multigrafo orientato completo.

L’indicazione completo ci informa che non vi sono nodi isolati: ovvero privi di un arco di collegamento con altri nodi.

Rappresentazione di un grafo con un linguaggio di programmazione

Esistono diverse possibilità per rappresentare un grafo attraverso un qualsiasi linguaggio di programmazione.

Una di queste è la lista di adiacenza.

Lista di adiacenza

Per costruire una lista di adiacenza che rappresenti un generico grafo, possiamo sfruttare due costrutti tipici della maggior parte dei linguaggi di programmazione:

E adesso? Che si fa?

Adesso è arrivato il momento di mettersi al lavoro per cercare di tradurre in codice FreeBASIC le idee che abbiamo raccolto sin qui.

Abbiamo di fronte a noi due obiettivi molto difficili:

  1. Sviluppare una applicazione per la rappresentazione grafica sia di una generica base di dati che degli algoritmi. Una rappresentazione che metta insieme l’arte (colori e figure) e la scienza (concetti e idee), e che sia inoltre operativa: ovvero che si possano eseguire gli algoritmi sulla base dati.
  2. Che questa applicazione non si limiti ad essere un altro modo per fare programmazione visuale, ma che sia una educazione pratica del pensiero.

Ogni progetto ha bisogno di un nome. Eccolo: RIMIRO. 🙂