Cos’è RIMIRO?

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:

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. 🙂

FreeBASIC – lavorare con i files [4]

Nel precedente articolo abbiamo visto la modalità di accesso binary per lavorare con i files binari.

Oggi vedremo come creare un database: ovvero un file binario contenente dati organizzati in records.

Possiamo immaginare un record come una singola riga di una tabella contenente una o più di queste righe. Un record è composto a sua volta da uno o più campi che contengono ciascuno uno specifico tipo di dato (stringa, intero, ecc.). I records devono avere una lunghezza in bytes predefinita.

Per accedere ai campi dei singoli records si utilizza la modalità di accesso random.

Prima però di aprire un file binario in modalità random, è necessario definire il tipo di dato che rappresenterà il nostro record . Abbiamo già visto come farlo nell’articolo che trattava appunto il tipo di dato definito dall’utente.

Vediamo un esempio:

'definizione del tipo di dato (record)
type persona
nome as string * 10
cognome as string * 20
anno_di_nascita as integer
patente as boolean
end type

'dimensionamento e creazione della variabile associata al record
dim p1 as persona
dim p2 as persona
dim px as persona

'valorizzazione dei dati
p1.nome = "Mario"
p1.cognome = "Rossi"
p1.anno_di_nascita = 1977
p1.patente = false
p2.nome = "Maria"
p2.cognome = "Bianchi"
p2.anno_di_nascita = 1985
p2.patente = true

'crea il file
open "mio_db.dat" for random as #1 len=sizeof(persona)
put #1, 1, p1
put #1, 2, p2
close #1

'apri il file e leggi un dato
open "mio_db.dat" for random as #1 len=sizeof(persona)
get #1, 2, px
close #1

'stampa i dati del record 2
print "Nome: "; px.nome
print "Cognome: "; px.cognome
print "Anno di nascita: "; px.anno_di_nascita
print "Patente: "; px.patente

Come avrete notato è stato necessario, sia in fase di creazione che di lettura del file binario, specificare la lunghezza in byte del record. Per farlo si è utilizzata la funzione sizeof().

Bene. Con i files per adesso possiamo fermarci qui.

Nei prossimi articoli inizieremo a creare le nostre prime finestre grafiche. 🙂