Nome utente: 

Password: 

Ripeti password: 

Email: 

Nome utente: 

Password: 

Descrizione del flow-chart: 

Livello di visibilità:   privato   di gruppo   pubblico

  
    NO SI      OK 
ESC
progetto 1
progetto 2
progetto 3
progetto 4
progetto 5
progetto 6
progetto 7
progetto 8
progetto 9
progetto 10
progetto 11
progetto 12
progetto 13
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ESC
Login
Registrati
Esporta FC corrente
Importa FC
Importa da gruppo
Importa per tema
Opzioni
Logout
ESC
Logout
Load da db remoto
Save su db remoto
Opzioni
ESC
Fortran
C/C++
Java
ESC
molto lento
lento
normale
veloce
molto veloce
turbo
ESC
zoom in e out
linea griglia
colore forme
allarga celle
restringi celle
allunga celle
accorcia celle
impostazioni iniziali
niente linea
molto sottile
sottile
media
spessa
arancio
blu cielo
bianco
bianco fumo
corallo
cyan
cyan chiaro
giallo
kaki
lavanda
lino
verde chiaro
   SALVA   
ANNULLA
CHIUDI
COPIA

ELEMENTI BASE DEL LINGUAGGIO


VARIABILI

Una variabile è una cella di memoria contenente valori numerici reali. Perchè un'istruzione possa utilizzare una variabile è necessario che questa abbia un nome. La dichiarazione delle variabili, nomi ed eventualmente valori iniziali, va fatta prima di ogni altra istruzione scrivendo
VAR: nomevariabile1=valorevariabile1, nomevariabile2=valorevariabile2, etc
Il nome di una variabile è una sequenza di caratteri alfanumerici che inizia con una lettera o con il simbolo '_'. Nel caso in cui il primo carattere sia un '_' la variabile sarà forzata ad assumere valori interi.
E' possibile utilizzare un singolo nome di variabile per riferirsi ad una sequenza contigua di celle di memoria detta array. Per esempio la dichiarazione
VAR: elenco[5]
assegna il nome elenco a 5 celle di memoria contigue. Quando in un'istruzione vorrò riferirmi ad una delle celle scriverò rispettivamente elenco[0], elenco[1], elenco[2], elenco[3] ed elenco[4]. Scrivere solo elenco produrrà lo stesso effetto che scrivere elenco[0], cioè si farà riferimento alla cella iniziale della sequenza.
E' possibile, inoltre, organizzare una sequenza contigua di celle di memoria come una tabella i cui elementi possono essere identificati da un indice di riga ed uno di colonna. Per esempio la dichiarazione
VAR: tabella[2][5]
assegna il nome tabella a 10 celle di memoria contigue: le prime cinque per la prima riga della tabella, le seconde cinque per la seconda riga. Quando in un'istruzione vorrò riferirmi ad una delle celle, per esempio quella occupante la terza colonna della prima riga, scriverò tabella[0][2]. Si noti che si conta sempre a partire da 0, quindi il primo indice(0) sta per prima riga, il secondo indice(2) per terza colonna.
Per default ogni variabile è inizializzata a 0, altrimenti avrà il valore esplicitamente indicato nella dichiarazione come mostrato nell'esempio che segue:
VAR: x=5, elenco[5]=(1, 2, 3, 4, 5)
Un'istruzione può cambiare il valore della variabile assegnandole il risultato della valutazione di una certa espressione numerica:
x = (x+y)*2
L'istruzione precedente - ad esempio - somma i valori delle celle di nome x ed y, quindi moltiplica per 2 ed il risultato diventa il nuovo valore della cella di nome x.


COSTANTI

Le costanti sono nomi mnemonici che possono essere usati in luogo di valori numerici. Alcune sono già incorporate nel linguaggio e pronte per essere usate:
NE: la costante base dei logaritmi naturali, 2.7182...
PI: la costante pi greco, 3.1415...
SR2: la costante radice quadrata di 2, 1.4142...
Altre possono utilmente essere introdotte dall'utente. Ad esempio dopo la definizione
DEF: ACC_GRA=9.80665
la costante ACC_GRA potrà essere utilizzata nelle istruzioni del programma al posto del valore numerico 9.80665
Con la definizioni di costanti appropriate, inoltre, l'utente può parametrizzare i propri programmi. Potrà, ad esempio, dichiarare un array di dimensione N, dove N è una costante precedentemente definita.


OPERATORI

-x		--> 	l'opposto di x
x + y 		--> 	la somma di x ed y
x - y 		--> 	la sottrazione di y da x
x * y		--> 	la moltiplicazione fra x ed y
x / y		--> 	la divisione di x per y
x % y		--> 	il resto della divisione intera di x per y
x ^ y           --> 	x elevato alla y

OPERATORI DI CONFRONTO

x = y 		--> 	vero se x è uguale ad y
x > y 		--> 	vero se x è maggiore di y
x < y		--> 	vero se x è minore di y
x >= y		--> 	vero se x è maggiore o al più uguale ad y
x <= y		--> 	vero se x è minore o al più uguale ad y
x != y          --> 	vero se x è diverso da y
E' possibile realizzare confronti complessi utilizzando gli operatori .OR. e .AND. - ad esempio:
x < 0 .OR. x > 1    --> vero per valori di x esterni all'intervallo (0; 1) 
x > 0 .AND. x < 1   --> vero per valori di x interni all'intervallo (0; 1)

FUNZIONI NUMERICHE

ABS(x) 		--> 	il valore assoluto di x
ACOS(x) 	--> 	l'arcocoseno di x
ASIN(x)		--> 	l'arcoseno di x
ATAN(x)		--> 	l'arcotangente di x
ATAN2(x, y)    	-->    	l'angolo determinato dal punto di ascissa x ed ordinata y
CEIL(x, y) 	--> 	x arrotondato per eccesso con y cifre decimali
COS(x)		--> 	il coseno di x, dove x è espresso in radianti
FLOOR(x, y) 	--> 	x arrotondato per difetto con y cifre decimali
LN(x) 		--> 	il logaritmo naturale di x
LOG(x, y)	--> 	il logaritmo in base y di x    
LOG10(x)	--> 	il logaritmo in base 10 di x
LOG2(x)		--> 	il logaritmo in base 2 di x  
MAX(x, y)	--> 	il maggiore fra x ed y
MCD(x, y)       -->     il massimo comun divisore di x ed y
MCM(x, y)       -->     il minimo comune multiplo di x ed y
MIN(x, y)	--> 	il minore fra x ed y
POW(x, y)	--> 	x elevato alla y
RAND()		--> 	un numero pseudocasuale compreso fra 0 ed 1
RD(x)		--> 	l'angolo di x gradi espresso in radianti        
ROOT(x, y)	-->    	la radice di x con indice y
ROUND(x, y) 	--> 	x arrotondato con y cifre decimali
SIN(x)		--> 	il seno di x, dove x è espresso in radianti
SQRT(x)		--> 	la radice quadrata di x 
TAN(x)		--> 	la tangente trigonometrica di x, dove x è espresso in radianti 

FUNZIONI GRAFICHE

SET(l, h, s, ux, uy)
l ed h sono le nuove dimensioni logiche (lunghezza ed altezza) della finestra grafica, s lo spessore degli assi in pixel, ux ed uy le posizioni segnate sugli assi; s, ux ed uy sono parametri facoltativi; se l oppure h sono posti a 0, vengono adattati per definire una finestra isometrica

FSET(c, s, fp)
c è un intero che determina il nuovo colore per linee e punti (0 quello corrente, 1 nero, 2 blu, 3 rosso, 4 verde), s lo spessore della linea (0 quello corrente, 1 linea sottile, 2 linea media, 3 linea spessa), fp un intero che codifica la forma dei punti (0 quella corrente, 1 quadratino piccolo, 2 quadratino grande, 3 ics, 4 più)

RESET()
la finestra grafica e le caratteristiche di linee e punti vengono riportati allo stato iniziale

ORIGIN(x, y)
(x; y) diventa la nuova origine del sistema di riferimento, rispetto alla quale saranno determinate le posizioni espresse come argomenti dei vari comandi

ORIGIN2(r, alfa)
come ORIGIN, dove però la nuova origine è espressa in coordinate polari

GOTO(x, y)
determina la nuova posizione corrente nella finestra, cioè il primo estremo dei segmenti che potranno essere tracciati

GOTO2(r, alfa)
come GOTO, dove però la nuova posizione è espressa in coordinate polari

LINETO(x, y)
traccia un segmento dalla posizione corrente a quella di coordinate (x; y) e questa diventa la nuova posizione corrente

LINETO2(r, alfa)
come LINETO, dove però la nuova posizione è espressa in coordinate polari

TOPOINT(x, y)
traccia un segmento terminato da un punto dalla posizione corrente a quella di coordinate (x; y) e questa diventa la nuova posizione corrente

TOPOINT2(r, alfa)
come TOPOINT, dove però la nuova posizione è espressa in coordinate polari

POINT(x, y)
traccia un punto nella posizione di coordinate (x; y) e questa diventa la nuova posizione corrente

POINT2(r, alfa)
come POINT, dove però la nuova posizione è espressa in coordinate polari

UNDO(n)
elimina gli ultimi n elementi immessi nella finestra grafica; se n non è indicato viene assunto il valore 1

IMPORTANTE: per le istruzioni FSET, GOTO(2), LINETO(2) TOPOINT(2) e POINT(2) è possibile impostare un ulteriore parametro per indicare esplicitamente la testina di scrittura.
Il sistema dispone di quattro testine di stampa indipendenti, per cui il suddetto parametro può assumere i valori 1, 2, 3 o 4. Quando non indicato è assunto per default il valore 1.


OPERAZIONI DI INPUT/OUTPUT

L'esecuzione di un blocco di INPUT/OUTPUT contenenente l'istruzione
IN: x1, x2 ... , xn
consente all'utente di immettere da tastiera n valori numerici che saranno assegnati alle variabili indicate x1 .. xn
L'esecuzione di un blocco di INPUT/OUTPUT contenenente l'istruzione
OUT: x1, x2 ... , xn
consente all'utente di inviare sul dispositivo standard di output (lo schermo) gli n valori numerici delle variabili indicate x1 .. xn.
E' possibile leggere da tastiera o inviare in output un intero array utilizzando le parentesi quadre senza indicazione della dimensione. Ad esempio:
OUT: x[]
E' possibile, ancora, inserire nell'elenco x1, x2 ... , xn delle stringhe esplicative o di formattazione. Esempio:
OUT: "x1: ", x1, " x2: ", x2


ISTRUZIONI DI CICLO

Un'istruzione complessa del tipo
x = 0 : 100 : 5
identifica in un blocco ciclo il valore iniziale della variabile contatore (x=0), il valore finale (x=100) ed il passo (5), ossia l'incremento della variabile contatore ad ogni esecuzione del ciclo.
Il passo può essere omesso, in tal caso sarà assunto per default il valore 1. Oppure può essere negativo per implementare cicli discendenti del tipo
x = 100 : 0 : -5


FUNZIONI DEFINITE DALL'UTENTE

Queste sono le funzioni costruite a partire dal blocco FUNCTION; la sintassi per definirle è la seguente:
nome_funzione(x1, x2, .., xn)
VAR: y1, y2, .., ym
x1, x2, .., xn sono i cosiddetti parametri formali, cioè le variabili locali che assumono i valori specificati al momento della chiamata della funzione.
y1, y2, .., ym sono le variabili locali per così dire di servizio della funzione, variabili cioè che esistono e sono utilizzate dalla funzione solo durante il suo tempo di corsa.
Una variabile locale implicitamente definita assieme ad ogni funzione è il nome stesso della funzione: essa conterrà il valore restituito dalla funzione al blocco chiamante.
Una funzione può sempre richiamare ricorsivamente se stessa.


.. INFINE UN ESEMPIO PER L'USO DELL'INTERFACCIA

CHIUDI


è un'applicazione per l'implementazione ed il test di algoritmi nel linguaggio dei diagrammi di flusso. La tecnologia interamente basata sul web fa si che i suoi contenuti ed i suoi servizi siano immediatamente fruibili online, senza alcuna necessità di installazione ed ovviamente indipendentemente dal sistema operativo client, anche su dispositivi mobile. Può, quindi, immediatamente essere utilizzata anche in modalità presentazione, per esempio da un docente in aula con il supporto della LIM.

Il suo funzionamento di default non prevede la memorizzazione e/o gestione di alcun dato che possa minare la sicurezza o la privacy dell'utente. In particolare il client-side storage è utilizzato al solo scopo di archiviare e quindi consentire il riutilizzo dei lavori dell'utente.
Comunque, come per tutti i software complessi, non è possibile escludere a priori malfunzionamenti o blocchi di cui l'utente deve essere consapevole, così liberando l'autore da ogni responsabilità per le eventuali conseguenze.

Per ogni informazione, delucidazione o richiesta si può contattare l'autore all'indirizzo e-mail info@computazioni.it.

Un punto di forza di COMPUTAZIONI è sicuramente la semplicità e la versatilità dell'interfaccia utente. Il menu ad icone consente in ogni momento di individuare e selezionare l'azione opportuna. La tecnologia drag-and-drop rende naturale e fluido il processo di costruzione di flow-chart, anche complessi, ma sempre coerenti con il paradigma della programmazione strutturata. Altre funzionalità e vincoli grafici assistono l'utente nelle fasi di editazione ed esecuzione così da preservare immediatezza ed intuitività di ogni operazione. Per l'implementazione di alcune funzionalità grafiche dell'applicazione il software è stato integrato con una piccola ma versatile libreria JavaScript, Raphaël, pubblicata da Dmitry Baranovskiy con licenza MIT.

Una scelta progettuale importante ha in effetti riguardato proprio una caratteristica dell'interfaccia. Quando un diagramma-programma va in esecuzione è possibile seguire real-time nelle finestre dedicate alla memoria i processi di associazione nome-indirizzo, di allocazione degli spazi, di chiamata-ritorno nelle funzioni ricorsive, etc. In altre parole vengono evidenziate alcune di quelle azioni elementari che consentono ad un esecutore di algoritmi (per esempio il computer che stai usando!) di portare a termine il suo compito. Questo nella convinzione che una significativa comprensione del potere dei computer non possa prescindere dall'osservazione di quanto semplici siano le operazioni di base e quindi di come la magia risieda tutta nell'organizzazione di queste (quindi nell'algoritmo!).

COMPUTAZIONI nasce, comunque, come parte integrante di un progetto più ampio denominato LABLOGICO.

Il LABoratorio di LOGIca e pensiero COmputazionale è un progetto per la realizzazione di un insieme strutturato di ambienti software atti a stimolare/favorire lo sviluppo e l'esercizio di quelle attitudini e capacità cognitive a cui si fa spesso riferimento con l'espressione "pensiero computazionale".

L' enfasi con la quale - da qualche tempo - aziende, associazioni, sistemi educativi pubblici e privati parlano di coding e del suo ruolo essenziale nella formazione delle nuove generazioni è sicuramente un indizio importante circa un mutato atteggiamento che va maturando nei confronti del tema della relazione fra computer science e molti ambiti della nostra vita pubblica e privata.

Stiamo tutti, cioè, acquisendo consapevolezza - o semplicemente prendendo atto - del fatto che le tecnologie connesse o veicolate dai computer modificheranno, ed in più sensi lo stanno già facendo, il nostro modo di essere, di pensare e - tout court - di vivere con un taglio radicale sconosciuto ad ogni passata rivoluzione.

Intendiamoci, ogni tecnologia importante ha ampliato le nostre possibilità ed i nostri spazi di libertà: così è stato per il fuoco, per la stampa a caratteri mobili, per l'elettricità. Ma gli scenari che si intravvedono in conseguenza dalle applicazioni più avanzate della computer science (basti pensare a tutto ciò che generalmente viene etichettato come intelligenza artificiale o alla bio-robotica) sembrano effettivamente validare il precedente assunto.

Comunque, non potremo più limitarci a fruire della tecnologia dei computer ignorando alcuni presupposti fondamentali del loro potere (espressione cara al filosofo cognitivista D. Dennett) - o meglio non ci conviene! E non ci conviene per almeno due ordini di motivi.

Il primo fa strettamente riferimento al mondo prossimo venturo già evocato in cui, probabilmente, le nostre azioni e le nostre scelte - anche quelle più personali e legate a dimensioni valoriali - si intrecceranno con contesti fluidi ed avari di certezze. Perchè quanto appena detto non appaia esagerato, invito a riflettere sulle coppie semantiche umano vs artificiale e reale vs simulato: chi potrebbe negare che, soprattutto in particolari ambiti, già oggi le linee di confine appaiono sfumate e decidere su cosa stia di qua e cosa di là comincia a diventare un problema di fede o di interpretazione?

Il secondo ordine di motivi è, invece, significativamente correlato a LabLogiCo e trae origine dalla chiara visione di un' opportunità. Mi riferisco alla possibilità di disporre di una palestra virtuale dove esercitare e verificare concretamente la congruità e l'efficacia di molti processi mentali critici e soprattutto trasversali rispetto a situazioni ordinarie o contesti di studio/ lavoro che potrebbero richiederne l'applicazione.

Alcuni dei risultati più significativi e consolidati di quasi un secolo di computer science si prestano magnificamente allo scopo. Sappiamo che, perchè i computer elaborino informazione che potremo utilmente utilizzare o possano creare per noi nuovi mondi in cui operare/lavorare/giocare, occorre far sì che abbiano le necessarie competenze (ovvero dispongano del software, cioè del progetto/programma, opportuno). E' questo il punto cruciale della tesi che sto esponendo. La realizzazione effettiva, la messa a punto del succitato progetto, del programma, è un'operazione complessa in cui il  pensiero si trova a riflettere sistemicamente sulle sue stesse logiche, su quelle inerenti alla natura ed ai vincoli teorici/pratici del problema, sugli strumenti/modalità di descrizione e di elaborazione proprie del computer - quindi a formulare e tentare di rispondere a domande del tipo:

Come devo descrivere/formalizzare il problema perchè non ci sia ambiguità circa punto di partenza e risultati da conseguire? A che livello di dettaglio? Cosa posso trascurare e cosa no? Che succede a fronte di un imprevisto? Come posso riusare risultati già conseguiti?

Per di più il tipo di mobilitazione sistemica delle risorse cognitive che ho evocato dipende solo relativamente dalle dimensioni dei problemi, essendo intrinseco alla loro natura computazionale. L'interessante corollario di questa considerazione è che anche il neofita può immediatamente cominciare a trarre giovamento dall'esercizio, anche con questioni/problemi molto semplici ed introduttivi.

L'AUTORE
Andrea Prevete, laureato in Fisica Cibernetica, ha continuato ad occuparsi di computer science anche grazie ad una ricca storia di collaborazioni con l'Università. In particolare gli anni spesi come docente a contratto nei corsi di Laurea in Ingegneria ed in Informatica - densi, impegnativi ma gratificanti soprattutto per i rapporti sempre cordiali e produttivi con gli studenti - hanno sicuramente contribuito a creare le giuste motivazioni per ideare e portare a compimento il progetto qui presentato.

AVVIA
CHIUDI