Flowgorithm 2023
Flowgorithm 2023
Sommario
Capitolo I Introduzione 8
1 Introduzione ................................................................................................................. 11
Capitolo II Installazione 13
1 Sistema Operativo Windows ......................................................................................... 14
Versione 64 bit .................................................................................................................................................................. 14
Versione 32 bit .................................................................................................................................................................. 14
2 Sistema Operativo iOS ................................................................................................. 14
Emulatore Wine ................................................................................................................................................................. 15
GitHub ................................................................................................................................................................................. 15
Video Youtube ................................................................................................................................................................... 16
3 Sistema Operativo Linux .............................................................................................. 16
Capitolo IX Istruzioni 66
1 Output .......................................................................................................................... 67
2 Input ............................................................................................................................. 69
3 Assegnazione ............................................................................................................... 69
4 Commento .................................................................................................................... 70
5 Dichiarazione ................................................................................................................ 71
6 If ................................................................................................................................... 72
7 Cicli di ripetizione ......................................................................................................... 73
For ........................................................................................................................................................................................ 73
Do ......................................................................................................................................................................................... 73
While .................................................................................................................................................................................... 74
8 Chiamata di Funzione o Procedura ............................................................................... 75
9 Grafica Tartaruga ......................................................................................................... 75
Ruotare ............................................................................................................................................................................... 75
Avanzare ............................................................................................................................................................................. 75
Punto iniziale ..................................................................................................................................................................... 76
Esempi ................................................................................................................................................................................ 76
Disegno di un fiore ..................................................................................................................................................... 76
Scalinate ...................................................................................................................................................................... 77
Indice 0
1 Introduzione
Flowgorithm su Facebook
Esercizi (ITA- ENG) 217 con gli esempi dell'eBook (Esercizi - parte 1 217 ) e i nuovi
esempi (Esercizi - parte 2 231 ) in continuo aggiornamento
Altre risorse
Flowgorithm su Reddit
Flowgorithm su Discord
Flowgorithm su Twitter
Strumenti utili
1.1 Introduzione
Flowgorithm
Python, QBasic, Ruby, Swift 2, Visual Basic .NET e Visual Basic for Applications (utilizzato in
Microsoft Office), TypeScript, Scala.
Una importante collezione di algoritmi di vario genere, famosi o meno, creati con il software
Flowgorithm, possono essere visionati e/o scaricati dal mio eBook presente nel mio sito
all’indirizzo [Link] oppure Esercizi - parte 1 217 .
2 Installazione
Come installare Flowgorithm in vari Sistemi Operativi
Tuttavia, se si ha necessità solo dell'eseguibile, usa il link qui sotto. Nota: non verranno associati
i tipi di file.
1. Devi avere 'Homebrew', il gestore di pacchetti software di terze parti per MacOS. Se
non ne hai uno, puoi seguire il passaggio di installazione QUI.
2.2.2 GitHub
Vedere il seguente sito:
e successivamente
Dopo aver inserito la chiave del repository di Wine bisogna aggiungere il repository nella
lista di apt
e, volendo verificare che la versione di Wine sia maggiore o uguale alla 6, si può eseguire
il comando
wine --versione
wine Desktop/[Link]
Nella mia esperienza alla prima esecuzione si accorge della mancanza del pacchetto
Gecko, che servirebbe per il rendering dell'HTML, siccome però non serve a Flowgorithm,
cliccare pure Cancel ogni volta che appare questa richiesta. Durante il lancio e anche
durante l'esecuzione, nel terminale appariranno diversi messaggi di errori, si possono
tranquillamente ignorare senza pregiudicare l'esecuzione del programma, come si può
vedere nell'immagine qua sotto.
3 Flowgorithm
Le caratteristiche di Flowgorithm
Dalla versione 3 di Flowgorithm è stata introdotta la Grafica Tartaruga . L'idea deriva dal
classico linguaggio di programmazione LOGO, sviluppato nel 1967. Permette di creare
immagini con le semplici azioni della "tartaruga" - un "pennello" grafico che può essere
ruotato e spostato per creare immagini. L'obiettivo è insegnare i concetti di
programmazione attraverso i passaggi sequenziali necessari per creare un'immagine.
Concetti di base
A seconda della versione del LOGO, la figura può sembrare un animale reale
(appunto una tartaruga ) con una testa e quattro zampe o, come nel UCBLogo
La tartaruga sarà rivolta verso la parte superiore dello schermo. Qualsiasi disegno
grafico precedente verrà cancellato dallo schermo e dalla memoria del computer.
La "tartaruga" sta puntando in una particolare direzione e può muoversi solo in
quella direzione. Può muoversi avanti o indietro, come un'auto con retromarcia,
ma non lateralmente. Per disegnare in qualsiasi altra direzione, la "tartaruga" deve
prima girare in modo che sia rivolta nella nuova direzione.
Per spostare la "tartaruga" si usa il comando Avanza, abbreviato fd o forward. Forward
richiede un input, che deve essere un numero. L'effetto dell'avanti è quello di muovere
la tartaruga nella direzione in cui è rivolta, attraverso una distanza specificata
dall'input. L'unità di distanza è il "passo della tartaruga", una piccola distanza che
dipende dalla risoluzione dello schermo del computer. Generalmente, un passo della
tartaruga è la linea più piccola che il tuo computer può disegnare.
Il comando LOGO
forward 80
se la "tartaruga" era rivolta verso la parte superiore dello schermo, aveva come
conseguenza lo spostamento dell'animale che lasciava dietro una traccia, una linea
che indicava il percorso seguito.
Le prime tartarughe erano veri e propri robot che si muovevano lungo il pavimento.
Hanno preso il nome di "tartaruga" a causa dei gusci duri che circondano le loro
delicate parti elettroniche. Una tartaruga robot aveva una penna nella pancia, che
poteva estrarre e spingerla fino al pavimento o riportare su dentro di sé, dentro la
pancia. Quando la penna era giù, la tartaruga disegnava una traccia del suo
movimento lungo il pavimento.
Logo fornisce comandi primitivi per alzare e abbassare la penna della" tartaruga". Il
comando penup (abbreviato pu) non richiede input; il suo effetto è quello di alzare la
penna. In altre parole, dopo aver usato questo comando, qualsiasi ulteriore movimento
della tartaruga non traccerà linee.
penup
forward 80
Il comando back (o bk) richiede un input, che deve essere un numero. L'effetto è
quello di spostare la tartaruga all'indietro della distanza utilizzata come input.
penup
back 80
Alla "tartaruga", vengono forniti altri due comandi: left (abbreviato lt) prende un
input, che deve essere un numero. Il suo effetto è quello di far girare la tartaruga
verso la sua sinistra. L'angolo attraverso il quale la tartaruga gira è l'input; gli
angoli sono misurati in gradi.
left 45
Il comando right (o rt) è proprio come left, tranne per il fatto che gira la tartaruga in
senso orario, verso la propria destra.
right 45
Il comando
repeat 4 [.......]
Tabella di Equivalenza
penup
back 80
e poi, con doppio click del mouse sulla figura Turn appena
e poi, con doppio click del mouse sulla figura Turn appena
repeat 4
[.......]
Il codice viene evidenziato utilizzando lo stesso colore utilizzato dalle forme corrispondenti del
diagramma di flusso. Ciò consente di vedere visivamente la correlazione tra il codice e il
diagramma di flusso. Inoltre, se si evidenziano le forme nel diagramma di flusso o si esegue il
programma, il codice sorgente verrà evidenziato in modo corrispondente.
· Pseudocodice IBO
[Link] Temi
Dalla versione 3 l'utente può estendere i temi colore all'applicazione. La nuova finestra
"Schema colori" consentirà all'utente di scaricare temi colore, selezionare uno dei classici
schemi integrati e applicarli all'applicazione. La casella "Applica lo schema di colori a
Windows" è una casella di controllo, quindi l'utente può applicare lo schema solo al
diagramma di flusso.
In definitiva, ciò consentirà a Flowgorithm di avere un tema scuro, un tema chiaro o
qualsiasi colore, se è per questo. L'immagine sotto mostra il tema del colore Cyberspace
applicato a tutte le finestre.
[Link] Menù
Dalla versione 3, Flowgorithm conterrà altre 7 forme: 3 per i grafici delle tartarughe e le
altre 4 per i file. Questo potrebbe intimidire i nuovi studenti anche perché le nuove figure
potrebbero non essere utilizzate nei corsi di programmazione. Facendo clic sulla freccia in
basso verranno visualizzate le nuove forme. Il sistema ricorderà la selezione dell'utente.
Nella versione 3, le finestre devono essere impostate per l'aspetto automatico quando
vengono aperte o chiuse. Spesso è difficile per i docenti destreggiarsi tra le varie finestre
durante le dimostrazioni in classe. La nuova funzionalità, se selezionata, posizionerà e
[Link] Specifiche
· Array mono dimensionali
· Cicli con controllo in testa e in coda
· Cicli enumerativi (FOR)
· Dichiarazione esplicita delle variabili. I diagrammi di flusso generalmente usano
dichiarazione implicita (essendo abbastanza minimalisti). Tuttavia, praticamente tutti i
linguaggi di programmazione utilizzano dichiarazioni esplicite. Quindi, è una buona idea
per gli studenti impararlo fin dall'inizio.
· Ricorsione controllata. Flowgorithm è fornito di uno stack interno (piuttosto che lo stack
del sistema). Se lo studente crea accidentalmente una chiamata ricorsiva infinita, il
programma non si bloccherà. Si riceverà, al contrario, un messaggio di errore.
· Supporta operatori sia della famiglia dei linguaggi di programmazione come C che della
famiglia del BASIC. Si possono utilizzare qualunque di questi operatori
indipendentemente dal linguaggio di programmazione che si vuole imparare.
· Sono supportate funzioni e procedure create dall’utente che possono o meno restituire
un valore.
· Oltre 20 funzioni predefinite.
E ancora...
· Sono supportati diversi stili di rappresentazione come il tipo classico, IBM, SDL, e altri...
· I diagrammi di flusso possono essere stampati sia a colori che in bianco e nero.
· I diagrammi di flusso possono essere salvati in un file PNG sia a colori che in bianco e
nero.
· L’editor possiede una caratteristica chiamata "Layout Windows". È progettato per
aiutare a visualizzare il contenuto senza alcun intervento manuale sulla finestra.
· I programmi sono salvati in XML.
[Link] In aggiunta
• Sono supportati diversi stili di diagramma di flusso. Ciò include: classico, IBM, SDL e
altro...
• I diagrammi di flusso possono essere esportati sia in formato PNG (bitmap) che in
formato SVG (vettoriale) in qualsiasi schema di colori.
La barra dei menu presenta la maggior parte dei comandi disponibili nel programma, suddivisi
per menu (elenchi di scelte). Tramite tastiera è possibile consultare la barra dei menu
premendo il tasto Alt e spostandosi con la Freccia Destra o Sinistra per leggere le intestazioni di
ogni menu. Una volta individuato quello di interesse, è possibile leggere le voci contenute al suo
interno utilizzando i comandi Freccia Giù o Su. Per attivare una voce è sufficiente, dopo averla
individuata, premere il tasto Invio.
Per aprire ciascuno dei menu disponibili, si possono utilizzare anche le seguenti combinazioni di
tasti, dette anche tasti caldi (hot):
Per chiudere un menu è sufficiente selezionare un comando del menu, attivare un altro menu o
premere il tasto Alt.
[Link] Stampa
Selezionando la voce di menù “Stampa” si aprirà la seguente finestra:
[Link] Lingua
[Link] Dimensionamento
L'applicazione ora è "DPI-aware". Ciò significa che la finestra si "ridimensionerà" su schermi più
grandi (con grande risoluzione) utilizzando un fattore di scala. Normalmente questo è
impostato al 125% o 150%. L'utente può anche modificare il fattore di scala corrente dal menu
Questa possibilità è utile ad esempio in ambito laboratoriale nel momento in cui si utilizza una
risoluzione molto dettagliata (ad esempio 4k) di difficile lettura agli ultimi posti nel laboratorio.
Cliccando su qualsiasi elemento della zona “Anteprima” (a sinistra), si avrà la possibilità (sulla
destra) di cambiare a proprio piacimento la combinazione di colori per l’elemento selezionato.
All’indirizzo Flowgorithm - Download Color Schemes si possono trovare gli schemi preinstallati
ed altri nuovi, la cui colorazione può essere modificata dall’utente.
I pulsanti freccia servono per modificare l’ordine dei parametri della funzione. Modificando
l’ordine dei parametri si deve prestare attenzione a quanto scritto nel flowchart come codice!!
All’interno della finestra ci vengono proposte tre schede per la selezione di ulteriori
impostazioni prima della creazione.
La prima scheda Stile ci ricorda quella che viene attivata dalla sequenza del menù Modifica à
Scegli lo stile del diagramma vista precedentemente.
Il campo Margini consente di impostare lo spazio in pixels intorno all’immagine (padding). Per
Word è consigliato impostare tale spazio a 0.
È possibile salvare l’immagine della funzione scelta in un file in formato .SVG (Scalable Vector
Graphics) o in formato .EMF (Enhanced Meta File). Inoltre è possibile salvare le immagini anche
con sfondo trasparente.
sImmediatamente sotto la barra dei menu è presente la barra degli strumenti standard, che
contiene i pulsanti dei comandi utilizzati più di frequente (tasti di scelta rapida) per la gestione
dei file e per l'esecuzione delle operazioni più importanti.
Pulsante Descrizione
Salva il flowchart
Aumenta ingrandimento
Diminuisci ingrandimento
Combinazioni colori
Finestra ‘Variabili’
Finestra ‘Esecuzione’
Finestra ‘Codifica’
Selezione lingua
Attenzione: i pulsanti della barra degli strumenti standard corrispondono alle voci più utilizzate
presenti nella barra dei menu; la barra degli strumenti standard, perciò, ha solo la funzione di
rendere tali voci più accessibili. Per esempio, se si vuole salvare il documento su cui si sta
scrivendo è sufficiente utilizzare l'apposito pulsante presente sulla barra degli strumenti senza
dover ogni volta aprire il menu File e selezionare la voce Salva.
Per selezionare i pulsanti della barra degli strumenti standard tramite tastiera è possibile:
In questo modo viene selezionato il primo pulsante della barra; per spostarsi fra i pulsanti è
sufficiente utilizzare il tasto Tab per muoversi da sinistra verso destra e la combinazione di tasti
Shift più Tab per muoversi da destra verso sinistra. Una volta individuato il pulsante d’interesse
occorre premere il pulsante Invio per attivarlo.
5 Le finestre di Flowgorithm
5.1 Finestra “Esecuzione”
Selezionando la voce di menù Finestra “Esecuzione” viene attivata una finestra utilizzata
per monitorare l’esecuzione dell’algoritmo e per inserire da tastiera i valori necessari.
Il metodo classico per interagire con il computer è utilizzare la modalità "Console". Usando
questo approccio, il programma visualizza in uscita su uno schermo solo testo e l’utente
immette i dati utilizzando la tastiera. A volte la console permette al testo di cambiare i colori,
ma, per la maggior parte, è testo bianco su sfondo nero.
Mentre la Console funziona, la sua interfaccia semplice può rendere difficile distinguere l'input
dell'utente e l'output del programma. Così, invece di usare la schermata di solo testo,
Flowgorithm trasforma il tutto in una tipica finestra di messaggio. Dal punto di vista dei
programmatori, sono messaggi diretti e testuali.
I messaggi sono colorati in abbinamento alle forme di ingresso e di uscita utilizzati nel
diagramma di flusso. Nella schermata a destra, l'input dell'utente è visualizzato in blu, mentre
l'output del programma viene visualizzato in verde. Nella sua barra degli strumenti si possono
notare delle icone che non compaiono nella barra degli strumenti della finestra principale.
Pulsante Descrizione
Aumenta ingrandimento
Diminuisci ingrandimento
Finestra ‘Variabili’
Salva il flowchart
Selezionando la voce di menù Finestra “Codifica” si aprirà la finestra tramite la quale sarà
possibile vedere la trasformazione del flowchart creato, codificato in automatico in uno dei
tanti linguaggi di programmazione predisposti da Flowgorithm.
Pulsante Descrizione
Aumenta ingrandimento
Diminuisci ingrandimento
Salva il flowchart
Il pulsante permette di rimuovere o aggiungere lo spazio tra le righe per una migliore
lettura
Ogni variabile ha un colore codificato in base al suo tipo di dati. A prima vista, si può dire
esattamente che tipo di dati vengono memorizzati e focalizzarsi su un determinato tipo
di dato.
Pulsante Descrizione
Visualizzazione in colonne
Visualizzazione etichette
Aumenta ingrandimento
Diminuisci ingrandimento
La versione 3 introduce la grafica della Tartaruga in Flowgorithm. L'idea deriva dal classico
linguaggio di programmazione LOGO, sviluppato nel 1967. Questà modalità permette di creare
immagini con le semplici azioni della "Tartaruga" - un "pennello" grafico che può essere ruotato
e spostato per creare immagini. L'obiettivo è insegnare i concetti di programmazione attraverso
i passaggi sequenziali necessari per creare un'immagine.
· Il campo di disegno ha una "estensione" (da -1.000.000 e 1.000.000) sia per l'asse x
che per y.
6 Menù contestuale
Il menù contestuale può essere attivato utilizzando il tasto destro del mouse su specifiche
posizioni.
· Se si clicca, col tasto destro del mouse, sulla freccia di flusso apparirà un menu pop-up
mostrando tutte le figure che possono essere inserite
· Se si clicca, col tasto destro del mouse, sulla parte vuota della finestra di editazione
si attiverà il menù pop-up a destra attraverso il quale è possibile passare a menù già
trattati precedentemente.
7 Funzioni predefinite
7.1 Matematiche
Dalla
Funzione Descrizione version
e..
7.2 Stringa
Funzione Descrizione
7.4 Altre
Dalla
Funzione Descrizione version
e..
Restituisce TRUE se si raggiunge la fine del file. Questa funzione è usata
EOF() per la lettura di un file aperto
Random(n
) Restituisce un numero intero tra 0 e n - 1
8 Costanti predefinite
La semantica di Flowgorithm prevede tre costanti predefinite. “True” e “False” spesso
utilizzate per inizializzare le variabili booleane e “Pi”, costante normalmente utilizzata in
matematica.
Tabella Operatori
Costanti Note
9 Istruzioni
9.1 Output
Figura associata
Cosa fa
9.2 Input
Figura associata
Cosa fa
9.3 Assegnazione
Figura associata
Cosa fa
9.4 Commento
Figura associata
Cosa fa
9.5 Dichiarazione
Figura associata
Cosa fa
9.6 If
Figura associata
Cosa fa
Alla fine, una struttura If controlla Ise l’età inserita da tastiera e assegnata
alla varibile “age” è maggiore o uguale a 18. Se si è maggiorenni. Il
programma visualizzerà la frase "Go vote!" altrimenti visualizzera la frase
"Sorry, not yet".
Cosa fa
9.7.2 Do
Figura associata
Cosa fa
Un ciclo Do è simile al ciclo While tranne per il fatto che le istruzioni al suo
interno vengono eseguite almeno una volta prima di poterne verificare la
condizione di ciclo.
Esempio
9.7.3 While
Figura associata
Cosa fa
Cosa fa
Cosa fa
9.9.2 Avanzare
Figura associata
Cosa fa
Cosa fa
9.9.4 Esempi
[Link] Disegno di un fiore
Con un input di 5 avremo …..
[Link] Scalinate
Con un input di 10 avremo…
9.10.1 Lettura
Figura associata
Cosa fa
9.10.2 Scrittura
Figura associata
Cosa fa
9.10.3 Chiusura
Figura associata
Cosa fa
9.10.4 Apertura
Figura associata
Cosa fa
Esempio
9.10.5 Esempi
[Link] Fibonacci con utilizzo di file
Flowgorithm usa il file registro di Windows per conservare le impostazioni utente. Sono
conservate solo poche impostazioni. Queste includono linguaggio, colori, modello di
diagramma e massima grandezza dello stack interno di Flowgorithm.
\HKEY_CURRENT_USER\Software\Flowgorithm
Valore Modificato
Chiave predefinit dal Descrizione
o software
Contiene il nome del modello ("Default",
"Classic", ecc... ) Se non viene riconosciuto il
Chart Style Default Si
valore della chiave, l’applicazione utilizzerà il
modello "Default".
Contiene il nome dello schema colori
corrente ("Pastel", "Cyberspace", ecc...) Se
Color Scheme Pastel Si non viene riconosciuto il valore della chiave,
l’applicazione utilizzerà il schema colori
"Pastel".
Contiene il codice ISO del linguaggio
visualizzato. Se non viene riconosciuto il
Language en Si
valore della chiave, l’applicazione utilizzerà il
codice lingua "en" (English).
\HKEY_CURRENT_USER\Software\Flowgorithm
Valore Modificato
Chiave predefinit dal Descrizione
o software
MRU 0 Null string Si Elenco dei file utilizzati più di recente.
\HKEY_CURRENT_USER\Software\Flowgorithm\Printer
Valore Modificato
Chiave predefinit dal Descrizione
o software
Valore booleano che specifica se per
Landscape False Si impostazione predefinita la stampante sarà
orizzontale (True) o verticale (False).
Margin Bottom 0.75 Si Margine in pollici.
\HKEY_CURRENT_USER\Software\Flowgorithm\Shapes
Valore Modificato
Chiave predefinit dal Descrizione
o software
Nome dello stile grafico corrente. Questo
Name n/a Si
viene visualizzato sui controlli a discesa
Breve descrizione della combinazione di
About n/a Si
colori.
Author n/a Si L'autore dello stile grafico.
N.B. La cartella comparirà nel file registro di Windows SOLO se viene utilizzato uno schema di
colori diverso da quello predefinito.
\HKEY_CURRENT_USER\Software\Flowgorithm\Colors
Valore Modificato
Chiave predefinit dal Descrizione
o software
Nome della combinazione di colori
Name n/a Si personalizzata corrente. Questo viene
visualizzato sui controlli a discesa
Breve descrizione della combinazione di
About n/a Si
colori.
Author n/a Si L'autore dello stile grafico.
Loop n/a Si Colori della figura del ciclo (Per, Mentre, Fai).
\HKEY_CURRENT_USER\Software\Flowgorithm
Valore Modificato
Chiave predefinit dal Descrizione
o software
Contiene la dimensione massima della pila.
Se l'applicazione supera questa dimensione,
visualizzerà un errore di overflow dello
stack. Questa impostazione non può essere
Max Stack Size 5000 No modificata dall'interno dell'applicazione. In
pratica, questo valore non dovrebbe mai
essere raggiunto a meno che il
programmatore non crei una chiamata
ricorsiva infinita.
I valori vengono letti, ma mai impostati (né aggiunti). Puoi aggiungere manualmente la chiave
nel registro e assegnarle il valore di stringa "false".
Nella versione 1.8, tutto il testo, normalmente visualizzato nell'applicazione, veniva spostato in
una tabella di ricerca. Ogni volta che viene caricata una finestra, il testo viene letto dalla tabella
di ricerca e utilizzato sullo schermo.
Ecco come Flowgorithm supporta più lingue. Può esserci un file di "traduzione" per ogni lingua
supportata. Flowgorithm caricherà quello corrente e questo, a sua volta, cambierà tutto il testo
dell'applicazione.
Quindi, per creare una nuova traduzione, non si richiede alcuna programmazione o strumento.
È necessario creare solo una nuova versione del file di testo.
I file INI riconoscono tre elementi sintattici di base: commenti, intestazioni di sezione e
dichiarazioni chiave/valore. Da questi è in grado di rappresentare tabelle non gerarchiche. Gli
elementi sono i seguenti:
Il nome e la chiave della sezione vengono utilizzati per identificare un valore in modo univoco.
Questo è più o meno equivalente alle tabelle e alle righe trovate nei database.
Durante la traduzione, i nomi delle sezioni ei nomi delle chiavi non devono essere modificati.
Molti dei valori contengono campi speciali indicati da parentesi graffe (parentesi). Quando il
valore viene letto, i dati verranno inseriti in questi campi. Anche questi nomi di campo non
devono essere modificati. In caso contrario, non verrà inserito nulla.
Quello che segue è un esempio dal file inglese. Questa sezione determina il testo visualizzato
sulle forme se viene utilizzata la didascalia "Shape Verbose".
Esempio
[Shape Verbose]
Assign = Assign {Variable} = {Expression}
Call = Call {Call}
Declare = Declare {Type} {Variable}
Declare Array = Declare {Type} Array {Variable}
Do = Do {Expression}
For Inc = For {variable} = {Start} to {End}
For Inc Step = For {Variable} = {Start} to {End} step {Step}
For Dec = For {Variable} = {Start} to {End} decreasing
For Dec Step = For {Variable} = {Start} to {End} decreasing step {Step}
Flowgorithm è progettato per i principianti, quindi è meglio usare termini alla loro
portata. Ad esempio (in spagnolo), è meglio tradurre "Integer" in "Entero" piuttosto che
tenerlo "Integer". Ovviamente, usa quello che ritieni possa essere più vantaggioso.
11.4 Altro
Per modificare il file INI, utilizzare qualsiasi editor di testo come, ad esempio, Notepad++
([Link]).
Da scaricare:
· Programmi di prova
I programmi scritti con Flowgorithm sono molto semplici. Non esistono dati di grande
complessità da dover essere compressi. I dati vengono salvati in un file di testo proprio
come se fossero scritti in Java, C#, ecc... In questo modo, piuttosto che avere file binari
complessi, questi ultimi sono di facile lettura e portabili verso altri sistemi. L’idea è che
usando questa applicazione questi file possano essere letti da altri strumenti (tipo
editor). Perciò i files vengono salvati in formato XML (Extended Markup Language).
Esempio
Prendiamo come esempio il seguente flowchart corrispondente all’esercizio “Somma tra due
numeri”:
Quando l’utente salva il suo esercizio con un determinato nome, Flowgorithm genera un file. Il
file generato da Flowgorithm (file sorgente) ha estensione .FPRG, ma non è un file proprietario
cioè non è un file che può essere letto solo dal software di appartenenza.
Proviamo ad aprire il file .FPRG corrispondente all’esercizio di cui sopra utilizzando non
Flowgorithm ma un editor di testo come ad esempio WordPad. Ecco cosa potremo vedere.
Forse a molti questo codice risulterà incomprensibile ma, anche per costoro, potrebbe essere
utile sapere alcune informazioni.
Per prima cosa si nota che l’autore, D. Cook, ha utilizzato il linguaggio XML (eXtended Markup
Language) che è una estensione del linguaggio HTML (Hyper Text Markup Language), il
linguaggio base che viene utilizzato per la generazione delle pagine web.
Perché l’autore ha utilizzato l’XML? Una prima risposta potrebbe essere perché è intelligibile
cioè, nonostante sia un codice sconosciuto ai più, si riesce a interpretare anche se vagamente. E
poi, con l’XML è possibile creare nuovi tagsa seconda dell’intendimento dell’autore.
La parte iniziale:
<attribute name="created"
value="Um9iZXJ0bztERVNLVE9QLVJPQkVSVE87MjA
xOS0wMi0wNzsiMDg6NDI6NDUgIjszMDU2"/>
<attribute name="edited"
value="Um9iZXJ0bztERVNLVE9QLVJPQkVSVE87MjA
xOS0wMi0wNzsiMDg6NDU6MDcgIjsxOzMxNjU="/>
</attributes>
Nel flowchart:
In fase di creazione:
In fase di creazione:
In fase di creazione:
Ovviamente possono essere presenti altri tag diversi da quelli visti fino ad ora e corrispondenti
a particolari operazioni / funzioni di Flowgorithm.
Per capire bene qual è l’importanza (per l’utente generico) dell’uso dell’XML, proviamo a vedere
il sorgente dell’esercizio “Somma tra due numeri” svolto utilizzando una funzione nuova creata
dall’utente che svolge, appunto, la somma tra due numeri. L’esercizio si compone di due parti:
una parte principale (MAIN) e una parte secondaria (FUNCTION) richiamata all’interno del
MAIN.
Oltre ad aver già spiegato prima parte della sua composizione, all’interno del file .FRPG (in XML)
è presente una funzione in più rispetto a quella principale (MAIN): è la funzione
“SumOfTwoNumbers” posizionata subito dopo la funzione MAIN.
Questa funzione, così costruita, puo’ essere copiata dal file XML e incollata all’interno di un altro
file XML (altro esercizio) che puo’ far uso di questa funzione subito prima del tag
<flowgorithm>. Dopo aver salvato il tutto e riaperto il file col software Flowgorithm, la funzione
verrà posizionata nella zona funzioni perfettamente funzionante e pronta all’uso all’interno del
nostro flowchart.
In questa maniera è possibile costruire una libreria (un file di tipo testuale .TXT) di funzioni da
copiare e incollare in quegli esercizi dove fosse necessario il loro utilizzo.
13 Programmazione e Flowgorithm
13.1 Il mio primo diagramma di flusso
Questo breve tutorial, serve creare un semplice programma chiamato “Ciao Mondo”. Si tratta
di un programma tradizionale per neofiti che visualizza "Ciao, mondo!" sullo schermo.
Quando si avvia un nuovo diagramma di flusso, vedrete due rettangoli arrotondati chiamati
simboli "terminali". Questi simboli rappresentano l'inizio e la fine del programma.
Molti diagrammi iniziano il flusso visualizzando il testo "Start". Flowgorithm, invece, usa il testo
"Main". La maggior parte dei linguaggi di programmazione iniziano con "Main" e Flowgorithm …
altrettanto.
Tutto, in un diagramma di flusso, è rappresentato da una figura geometrica. Potrai aggiungere
le figure tra la figura principale e quella finale.
Per aggiungere una figura, spostare il puntatore del mouse su una linea. Se è possibile
aggiungere una figura, la linea diventa di colore arancione.
Fare doppio clic o clicca col pulsante destro del mouse per aggiungere una figura.
Un menu pop-up apparirà mostrando tutte le figure che possono essere inserite.
Nei diagrammi di flusso, ogni azione che il computer può eseguire è rappresentata da una
figura diversa. Ad esempio, le figure di ingresso e di uscita sono rappresentate con
parallelogrammi.
Si può utilizzare anche il “copia e incolla”. Nell’immagine qui sotto è disegnata in grigio perché
non si è ancora copiato niente in memoria.
Il programma “Ciao Mondo” necessita di una figura per l’output. Ciò permetterà di visualizzare
l’informazione nello schermo del computer.
Spostare il mouse sopra il parallelogramma verde con la scritta interna “Output”: ora verrà
evidenziata con un rettangolo blu.
Cliccare sulla figura col pulsante sinistro del mouse e la figura verrà inserita nel diagramma.
Appena inserita, la figura apparirà colorata di grigio. In Flowgorithm, il colore grigio indica che la
figura è “incompleta”. Ciò significa che la figura ha necessita di altra informazione per poter
funzionare.
È necessario indicare a Flowgorithm cosa volete che visualizzi. Ciò può essere qualsiasi cosa: da
un risultato di un calcolo ad un messaggio.
Eseguendo un doppio click sulla figura si entra nella modalità modifica.
Apparirà una fistra intitolata "Scrittura su schermo". Con questa finestra sarà possibile indicare
cosa far apparire nello schermo del computer.
Nella finestra, scrivere "Ciao mondo!". Attenzione: è necessario aggiungere ache gli apici. Nei
linguaggi di programmazione ciò viene chiamata String (stringa).
Cliccare sul pulsante OK per continuare. Se viene commesso un errore, Flowgorithm ci avvisa
subito. Doppio click sulla figura per correggere l’errore.
Poiché tutte le figure sono colorate nella maniera corretta, ora è possibile eseguire quanto
creato.
Apparirà una nuova finestra chiamate "Finestra Esecuzione" usata per visualizzare le
informazioni e per inserire i dati.
13.3 Identificatori
Ogni volta che si definisce una funzione o una variabile, viene dato un nome univoco
chiamato "identificatore". Per evitare che gli identificatori possano essere confusi con
altri elementi in una espressione, esse devono seguire una convenzione. Ogni linguaggio
di programmazione ne possiede una e possono differire da un linguaggio all'altro.
13.5 Operatori
Flowgorithm fornisce anche la possibilità d’uso di alcuni operatori tipici del Visual Basic
poiché sono utili, semanticamente ben definiti:
^ potenza
In Java e in C#, l’operatore "+" è utilizzato sia per la concatenazione di stringhe sia come
operatore nelle addizioni. Ciò potrebbe trarre in inganno. In Flowgorithm, l’operatore “+” è
utilizzato come operatore aritmetico. Per la concatenazione viene usato il simbolo
“&” (ampersand) e per l’operazione di esponenziazione, il simbolo “^”
13.5.1 Precedenze
La tabella seguente evidenzia il livello di precedenza degli operatori aritmetici e logici, dal
più alto (valutato per prima) al più basso (valutato per ultimo).
Livell
Nome Operazione Note
o
2 E (logico)
∨
|| or
1 O (logico)
Esempi
Soluzion
Espressione Note
e
1+3^2 10
alcun valore ma risulta essere comunque utile (come la funzione) per ottimizzare lo schema
dell’algoritmo in blocchi.
· Valore
In questo caso alla funzione (o alla procedura) vengono passati dei valori (numeri,
stringa, ecc..) direttamente
· Riferimento
In questo caso alla funzione (o alla procedura) vengono passati dei valori (numeri,
stringa, ecc..) memorizzati in variabili
Esempio:
Somma di due numeri (utilizzando una funzione)
Esempio:
Somma di due numeri (utilizzando una procedura)
Nel passaggio dei parametri bisogna stare attenti che corrispondano (in numero, posizione e
tipo) i parametri utilizzati nella funzione chiamante e i parametri utilizzati nella funzione (o
procedura) stessa.
Alla stringa “parol” concatenare la lettera “a” per ottenere la stringa “parola” utilizzando le
funzioni
1a risoluzione
2a risoluzione
3a risoluzione
4a risoluzione
1a risoluzione
In questo caso la funzione 'quadrato' non restituisce alcun valore ma ha il compito di valutare
l'espressione "a ^ 2" passata come parametro con la chiamata alla procedura nel programma
principale
dove:
2a risoluzione
in questo caso l'istruzione "Ouput", nel programma principale, si incarica della visualizzazione e
per fare ciò la stessa istruzione "Output" richiede un elemento da visualizzare, elemento che la
funzione "quadrato", per come è stata scritta nella 1a risoluzione, non viene fornito per cui è
necessario cambiare la funzione "quadrato" in questo modo:
dove:
13.7 La ricorsione
13.7.1 Introduzione
Nell’arte possiamo trovare uno dei massimi rappresentanti della ricorsione: Maurits Cornelis
Escher. Il nome di Escher è indissolubilmente legato alle sue incisioni su legno, litografie e
mezzetinte che tendono a presentare costruzioni impossibili (mondi impossibili), esplorazioni
dell'infinito, tassellature del piano e dello spazio e motivi a geometrie interconnesse che
cambiano gradualmente in forme via via differenti.
E in Russia …..
Si possono fare tanti esempi per comprendere questo metodo di approccio ai problemi.
Si può fare l’esempio di una fabbrica di auto suddivisa in tanti reparti, ognuno specializzato
nella costruzione di particolari parti dell’auto: progettazione, carrozzeria, verniciatura,
meccanica, collaudo, ecc. E probabilmente ognuno di questi reparti, a sua volta, è suddiviso in
altri piccoli reparti per l’attuazione di compiti più piccoli atti alla realizzazione del lavoro
compito di quel singolo reparto.
Questo metodo di risoluzione viene denominato “Top Down” (dall’alto verso il basso) ovvero
scomporre il problema in sotto problemi più piccoli che a loro volta possono essere scomposti
in sotto problemi più piccoli, ecc. fino ad arrivare ad un problema non più scomponibile (detto
atomico) da cui ripartire e risalire (metodo “Bottom Up”, dal basso verso l’alto) fino al risultato
finale.
Ovviamente noi tutti applichiamo questa metodologia fin da piccoli in modo automatico ma la
maggior parte di noi, diventando grandi o utilizzando strumenti o dispositivi più veloci per
risolvere il problema, dimentica questa metodologia dandola per scontata e ciò ha come
conseguenza la perdita della conoscenza del meccanismo stesso (logica) che porta alla
risoluzione del problema.
Nella implementazione di un algoritmo, il metodo “Top Down” può essere raggiunto con
l’utilizzo, ad esempio, di funzioni e procedure che hanno il compito (ognuno diverso) di
risolvere un pezzo del problema.
Ma se per risolvere il problema si attua lo stesso compito anche per ogni singolo pezzo del
problema stesso, ecco che allora interviene un altro meccanismo: la ricorsione.
Ad ogni chiamata (utilizzo interno alla stessa funzione, Top Down) si semplificano/riducono i
dati, così ad un certo punto si arriva ad uno dei casi di base. Quando la funzione chiama sé
stessa, sospende la sua esecuzione per eseguire la nuova chiamata (con dati più piccoli/ridotti).
L’esecuzione riprende quando la chiamata interna a sé stessa termina cioè la sequenza di
chiamate ricorsive termina quando quella più interna (annidata) incontra uno dei casi di base
(atomici o non più scomponibili).
A questo punto la funzione stessa risale di livello (Bottom Up) ricordandosi la composizione del
problema a livello precedente (elaborazione intermedia) fino alla risoluzione di quest’ultimo
(livello di partenza).
Pro
Spesso la ricorsione permette di risolvere un problema anche molto complesso con poche linee
di codice.
Contro
La ricorsione è poco efficiente perché richiama molte volte una funzione e questo:
Qualsiasi problema ricorsivo può essere risolto in modo non ricorsivo (ossia iterativo), ma la
soluzione iterativa potrebbe non essere facile da individuare oppure essere molto più
complessa.
Quando non ci sono particolari problemi di efficienza e/o memoria, l’approccio ricorsivo è in
genere da preferire se:
· è più intuitivo di quello iterativo
· la soluzione iterativa non è evidente o agevole
· Torre di Hanoi (la Torre di Hanoi, anche conosciuta come Torre di Lucas dal nome del
suo inventore, è un rompicapo matematico composto da tre paletti e un certo numero
di dischi di grandezza decrescente, che possono essere infilati in uno qualsiasi dei
paletti. [Link] )
Ovviamente, come detto precedentemente, ogni funzione ricorsiva può essere espressa
in modo iterativa.
Ecco la risoluzione iterativa del problema
14 Paradigma di Programmazione
14.1 Gli elementi di base
14.1.1 Introduzione
In informatica, un paradigma di programmazione è uno stile fondamentale di programmazione,
ovvero un insieme di strumenti concettuali forniti da un linguaggio di programmazione per la
stesura del codice sorgente di un programma, definendo dunque il modo in cui il
programmatore concepisce e percepisce il programma stesso. Diversi paradigmi si
differenziano per i concetti e le astrazioni usate per rappresentare gli elementi di un
programma (come ad esempio le funzioni, gli oggetti, le variabili, vincoli, ecc.) e per i
procedimenti usati per l'esecuzione delle procedure di elaborazione dei dati (assegnazione,
calcolo, iterazione, data flow, ecc).
Per quanto riguarda almeno i linguaggi di programmazione usati nella pratica industriale
dello sviluppo del software, si può identificare un "filone principale" di paradigmi di
programmazione:
programmazione modulare
(anni ottanta) Smalltalk, Eiffel, C++, Java, Python, Ruby, piattaforma .NET
(Espressioni regolari)
programmazione procedurale
programmazione strutturata
programmazione logica
programmazione funzionale
programmazione a vincoli
Con l’uscita della versione 2.15.0, Flowgorithm si arricchisce di una nuova funzionalità: il
supporto per la personalizzazione dei modelli di programmazione.
Questa documentazione individua il formato e i modelli utilizzati da Flowgorithm. Tutto ciò può
essere utile per creare nuovi modelli partendo da quelli esistenti.
I files con estensione INI riconoscono tre elementi sintattici di base: commenti, intestazioni di
sezione, e dichiarazioni di chiave o di valore. Partendo da questi, si è in grado di rappresentare
tabelle non gerarchiche.
Il nome e la chiave della sezione vengono utilizzati per identificare univocamente un valore.
Questo è, più o meno, equivalente alle tabelle e alle righe presenti negli archivi di dati
(databases).
Esempio
[Variable ID]
Convention = camel
Normal = {Name}
Conflict = var_{Name}
Formato linea
I tre valori non devono necessariamente essere presenti tutti nella riga. Se l’indentazione è
lasciata vuota, ad esempio, il sistema assumerà il valore 0 (zero) o il significato di nessuna
modifica.
[Link] Campi
Molte delle diverse chiavi / valori contengono "campi" che sono indicati da parentesi graffe
‘{‘ (parentesi graffa aperta) e ‘}’ (parentesi graffa chiusa). Quando viene generato un
programma, il testo viene inserito in questi campi a seconda dell'oggetto corrente (ad es. una
espressione, una istruzione, ecc.). I contenuti dei campi possono essere prelevati direttamente
dall'oggetto o, in alcuni casi, generati utilizzando altre parti del modello.
I nomi dei campi non sono ‘case sensitive’ (ovvero non c’è alcuna distinzione fra maiuscole e
minuscole). L'utilizzo di una doppia parentesi graffa aperta ‘{{‘ indica una sequenza di
sostituzione.
Text
= Set {Variable} = {Expression}
La maggior parte dei campi sono specifici per la sezione nella quale vengono utilizzati. Tuttavia,
ci sono alcuni campi definiti ‘globali’ molto utili. Sono progettati per superare i limiti del
formato del modello di programmazione.
[Link] Flag
Quando viene generato il codice sorgente, il sistema può includere o escludere le righe in base
alle informazioni dello stesso programma. Ciò può essere dovuto al fatto che sia necessaria
una specifica sintassi, in presenza di diverse chiamate di libreria (in base al tipo di dati
utilizzato in una istruzione), ecc ....
Per controllare quali linee sono valide nel modello di programmazione, il sistema fa uso dei
Flags. I Flags sono definiti dalla sezione nella quale hanno un significato e possono essere
utilizzati per controllare il codice sorgente generato. Si possono utilizzare più Flags ma separati
da virgole. La linea è considerata valida se, e solo se, tutti i Flags sono abbinati in maniera
corretta. Se un Flag è preceduto dal simbolo tilde ‘~’, il sistema lo individuerà come essere
‘False’.
L'esempio seguente utilizza diversi Flags, in particolare "inc" e "step". Nel contesto di una
struttura iterativa For, il Flag "Step" è impostato su True nella struttura iterativa For avente un
valore di step diverso da 1 e "inc" è impostato a True se la struttura iterativa For segue un
andamento in ordine crescente (positivo).
La combinazione di questi valori comporterà la selezione di una riga (che inizia con ‘for’).
[For]
Text = for {Variable} = {Start} To {End} | inc, ~step
= for {Variable} = {Start} To {End} Step {step} | inc, step
= for {Variable} = {Start} To {End} Step -1 | ~inc, ~step
= for {Variable} = {Start} To {End} Step -{step} | ~inc, step
= -->BLOCK | |1
= end for
[Link] Indentazione
La maggior parte dei linguaggi di programmazione consente l'uso dell'indentazione per
formattare visivamente il testo. Ciò consente al programmatore di poter facilmente distinguere
e comprendere blocchi e ad altri elementi sintattici. L'ultimo sotto valore di una riga può
contenere la modifica nella indentazione del codice generato.
Nell'esempio seguente, la riga che contiene il valore speciale "---> BLOCK" (che ha un flag vuoto)
ha un singolo "1" per l’indentazione. Ciò farà indentare il testo inserito di 1 livello.
[Link] Array
[Link] Altro
14.1.5 Programma
Quando un diagramma di flusso (flowchart) viene convertito in un determinato linguaggio di
programmazione, il sistema parte dalla sezione [Program]. Questa sezione dà, allo sviluppatore,
la possibilità di inserire la funzione principale, le funzioni aggiuntive, le intestazioni di funzione e
altre definizioni necessarie. Come conseguenza, nella sezione si farà un uso importante dei
flags.
Esempio Java
[Program]
Text = import [Link].*;
= import [Link];
=
= public class JavaApplication {{
= private static Scanner input = new
| input |1
Scanner([Link]);
= private static Random random = new Random(); | random |1
=
= -->MAIN | |1
= -->FUNCTIONS | |1
= | tofixed |1
= private static String toFixed(double value, int digits) {{ | tofixed |1
= return [Link]("%." + digits + "f", value); | tofixed |2
=} | tofixed |1
=}
Nell’esempio precedente i flags sono utilizzati, opzionalmente, per creare dichiarazioni per la
funzione Scanner e Random rispettivamente. Inoltre, se viene utilizzata la funzione ToFixed, il
modello creerà una funzione locale chiamata ToFixed() che implementerà tale logica.
Campi
Nessuno
Flags
Per poter inserire il blocco della struttura iterativa While, si utilizzi una singola linea contenente
i seguenti valori speciali. Se si vuole cambiare l’indentazione del blocco, assicurarsi di
specificare l’indentazione dopo il secondo simbolo di pipe ‘|’.
Esempio Java
[Language]
Name = Java
Extension = java
Direction = left-to-right
Keywords = abstract, assert, boolean, break, byte, case, catch, char, class, const
= continue, default, double, do, else, enum, extends, false, final, finally
= float, for, goto, if, implements, import, instanceof, int, interface, long
= native, new, null, package, private, protected, public, return, short, static
= strictfp, super, switch, synchronized, this, throw, throws, transient, true, try
= void, volatile, while
Conflicts = input
Case
= true
Sensitive
Options = aligned
[Link] Attributi
Attributi Contenuti
Keywords Questa chiave è utilizzata per elencare tutte le chiavi del linguaggio di
programmazione di destinazione. L’elenco verrà utilizzato per generare
identificatori univoci per il resto del programma. E’ importante elencare
tutte le parole chiave e le parole riservate che potrebbero causare errori
sintattici quando vengono usati dall’utente come un qualsiasi
identificatore.
Conflicts Questa chiave viene utilizzata con le stesse modalità della chiave
precedente Keywords. Essa fornisce un elenco delle parole chiave o parole
riservate che verrà utilizzato per la generazione di identificatori.
Comunque, questo elenco viene predisposto per elencare gli identificatori
che lo stesso modello crea. Ad esempio, se un modello crea una funzione
chiamata Output, allora la parola ‘output’ dovrebbe essere elencata qui.
14.2.2 Identificatori
La maggior parte di linguaggi di programmazione possiede un elenco di parole chiave (che
seguono lo stesso formato degli identificatori) che implementano i diversi elementi sintattici del
linguaggio di programmazione. Ad esempio, la maggior parte dei linguaggi di programmazione
utilizza la parola chiave "if" per le istruzioni condizionali.
Il conflitto risultante causerà un codice generato non valido (generando ad esempio un errore
di sintassi).
Esempio Java
[Function ID]
Convention = camel
Normal = {Name}
Conflict = func_{Name}
[Variable ID]
Convention = camel
Normal = {Name}
Conflict = var_{Name}
Nota: il carattere di sottolineatura ‘_’ non è consentito negli identificatori di Flowgorithm. Può
essere usato per creare una stringa univoca prefissa (o suffisso) di caratteri.
La chiave ‘Convention’
La chiave ‘Convention’ viene utilizzata per creare un identificatore utilizzando la convenzione di
denominazione della lingua di destinazione. Può contenere una delle due opzioni:
1. Proper
2. Camel
L’opzione Proper viene utilizzata da linguaggi come Visual Basic e Smalltalk. In questa
convenzione, la prima lettera di ogni parola è maiuscola come TestProgram e FirstName. Le
lingue, come Java e C#, usano questa convenzione solo per i nomi di classe.
L’opzione Camel viene utilizzata per nomi di variabili in lingue come C # e Java. In questa
convenzione, la prima lettera della parola è in minuscolo mentre il resto è in maiuscolo o
minuscolo. Ad esempio: testProgram e firstName.
Campi
Nessuno
Flags
Nessuno
La chiave ‘Normal’
Viene utilizzata questa chiave se l'identificatore, utilizzato nel diagramma di flusso, non è in
conflitto con le parole chiave del linguaggio di destinazione.
Campi
La chiave ‘Conflict’
Se l'identificatore di Flowgorithm è in conflitto con una delle parole chiave del linguaggio di
destinazione, questa chiave viene utilizzata per generare un nuovo identificatore.
Campi Contenuti
14.2.3 Tipi
La sezione ‘Types’ definisce i nomi dei tipi di dato del linguaggio di destinazione.
Esempio Java
[Types]
Integer = int
Real = double
Boolean = boolean
String = String
Campi
Nessuno
Campi
Nessuno
Ogni volta che il modello deve creare una stringa testuale, utilizza questa sezione. Esistono una
serie di tasti di caratteri di sostituzione che sono utili per ignorare i delimitatori.
Esempio Java
[String Literal]
Text = "{Characters}"
Replace Char 1 ="
Replace By 1 = \"
Replace Char 2 =\
Replace By 2 = \\
Campi Contenuti
Flags
Nessuno
Campi
Nessuno
Flags
Nessuno
Esempio Java
[Integer Literal]
Tex
= {integral}
t
Campi Contenuti
Flags
Nessuno
Questa sezione consente di definire il formato dei numeri reali. Se viene prodotto uno
pseudocodice, non esitare a utilizzare il formato della nazione di destinazione.
Esempio Java
[Real Literal]
Tex
= {integral}.{fractional}
t
Campi Contenuti
Flags
Nessuno
Esempio Java
[Boolean Literal]
True = true
False = false
Campi
Nessuno
Flags
Nessuno
14.4 Espressioni
14.4.1 Espressioni e funzioni intrinseche
[Link] Espressioni
Le espressioni nei diversi linguaggi di programmazione differiscono notevolmente nella
struttura delle precedenze. Di conseguenza, i modelli utilizzano un semplice sistema per
convertire qualsiasi espressione Flowgorithm nel formato della lingua di destinazione. Per fare
ciò, i modelli usano lo stesso sistema sia per le chiamate di funzioni intrinseche (come Cos,
ToInteger, ecc ...) che per gli operatori. Ogni funzione e/o operatore ha gli stessi campi, ovvero
{1} e {2}. Questi rappresentano i valori passati ad una funzione intrinseca o la parte a sinistra e
la parte a destra di un operatore.
Campi Contenuti
Livelli di precedenza
Ogni funzione o operatore contiene anche chiavi condivise per la precedenza dell'operatore
(nel linguaggio di programmazione di destinazione) e quale precedenza è necessaria per {1} e
{2}. Maggiore è il valore numerico assegnato alla funzione o operatore, maggiore è la sua
precedenza. Ad esempio, nella maggior parte dei linguaggi di programmazione, la
moltiplicazione e la divisione vengono calcolate prima dell'addizione e della sottrazione. In
questo caso, gli operatori di moltiplicazione e divisione avranno un valore di precedenza più
elevato.
Esempio Java
[Cos]
Precedence = 100
Needed 1 =0
Text = [Link]({1})
La sezione ‘Subexpression’
Ogni volta che il sistema deve incrementare la precedenza di {1} o {2}, si utilizzerà la sezione
[Subexpression]. Questa sezione differisce dalle altre funzioni e operatori poichè non contiene
flag e ha solo un campo {Expression}.
Esempio Java
[Subexpression]
Precedence = 100
Text = ({Expression})
Sezioni Operatore
Chiavi
Campi Contenuti
L'esempio seguente definisce un operatore logico AND di base in Java. I valori di precedenza
necessari per {1} e {2} sono tipici degli operatori da sinistra verso destra che consentono
cambiamenti (ad esempio: X && y && z).
[And]
Precedence =2
Needed 1 =2
Needed 2 =3
Text = {1} && {2}
Flags
Diversi linguaggi di programmazione utilizzano spesso operatori diversi o chiamate di librerie, in
base al tipo di dato utilizzato. A volte un operatore è incorporato direttamente in un linguaggio
di programmazione mentre, in altri casi, richiede una chiamata alla libreria. Un buon esempio di
questo è l'operatore esponente. In Flowgorithm e nella famiglia di linguaggio BASIC, il simbolo ^
viene utilizzato per indicare un esponente. I linguaggi della famiglia C (come Java) tendono a
utilizzare una chiamata di funzione di una specifica libreria, cioè verrà utilizzata la funzione
Pow().
Inoltre, i linguaggi di programmazione hanno regole diverse che definiscono quale tipo di dati
viene restituito da un calcolo. Queste varie "conversioni aritmetiche generiche" possono variare
notevolmente tra i vari linguaggi. Ad esempio, nella famiglia di linguaggi C l'espressione "1/2"
restituirà zero. Le regole stabiliscono che se entrambi gli operandi sono interi, viene utilizzato
l'intero matematico. In Flowgorithm e nella famiglia di linguaggi tipo BASIC, la virgola mobile
viene sempre utilizzata per la divisione (0,5).
Quindi, per gestire tutti questi diversi scenari, i modelli contengono un numero elevato di flag in
modo da poter selezionare la sintassi corretta.
[Add]
Type = integer | integer-integer
= real | ~integer-integer
Precedence =5
Needed 1 =5
Needed 2 =6
Text = {1} + {2}
I seguenti flag permettono di verificare una certa combinazione tra {1} e {2}. Spesso questi sono
usati con il prefisso di negazione ‘~’ per gestire casi speciali.
L'esempio seguente mostra in che modo Java considera le stringhe e i valori numerici in modo
diverso. Nota: la precedenza "Needed" varia notevolmente in base al confronto di una stringa
con un'altra stringa. Nell'ultima riga, quando viene usato .equals, {1} deve avere una
precedenza di 100 (max in questo modello) e {2} richiede solo 1 (dato che è racchiuso tra
parentesi).
Esempio Java
[Equals]
Precedence =3 | ~string-string
= 100 | string-string
Needed 1 =4 | ~string-string
= 100 | string-string
Needed 2 =4 | ~string-string
=1 | string-string
Esempio Java
[Variable Access]
Precedence = 100
Text = {name} | ~subscript
= {name}
| subscript
[{subscript}]
Campi Contenuti
Il primo e l'ultimo flag possono essere utilizzati se la sintassi differisce nella prima o ultima
istruzione nel blocco.
Esempio Java
[Argument]
Separator = ,{space}
Text = {expression}
Campi
Nessuno
Flags Contenuti
Campi Contenuti
{Parameter Name} Il nome del parametro della funzione che corrisponde all'argomento.
Questo è necessario per "argomenti nominati" usati in linguaggio come
Swift e Smalltalk.
Il primo e l'ultimo flag possono essere utilizzati se la sintassi differisce nella prima o ultima
istruzione nel blocco.
14.5 Funzioni
14.5.1 Funzione Principale
La sezione Main (funzione) segna l'inizio dell'esecuzione del programma. La sintassi esatta di
questa funzione può essere molto utile tra i linguaggi di programmazione. A volte, il blocco
delle istruzioni viene lasciato fuori dalle definizioni delle funzioni e, altre volte, i parametri della
funzione principale differiscono dal resto del programma.
Esempio Java
[Main]
= public static void main(String[] args)
Text
{{
= -->BLOCK | |1
=}
Campi
Nessuno
Il primo e l'ultimo flag possono essere utilizzati se la sintassi differisce per la prima o l'ultima
istruzione nel blocco.
Flags
Per inserire il blocco della struttura While, si utilizza una singola riga contenente i seguenti
codici speciali. Se si vuole vuole cambiare l’indentazione del blocco, assicurasi di specificare
l’indentazione dopo il secondo simbolo pipe ‘|’.
14.5.2 Parametri
La sezione Parameter è usata per generare una lista di parametri da usare nelle sezioni
[Function] e [Function Header].
Esempio Java
[Parameter]
Separator = ,{space}
Text = {type} {name} | ~array
= {type}[] {name} | array
Campi
Nessuno
Flags
Nessuno
Campi Contenuti
Il primo e l'ultimo flag possono essere utilizzati se la sintassi differisce per la prima o l'ultima
istruzione nel blocco.
14.5.3 Funzioni
I modelli contengono diverse sezioni per creare la sintassi per le funzioni. Questi includono
tutte le funzioni ad eccezione della funzione Main. A volte la funzione principale richiede un
formato molto specifico o dichiarazioni speciali (per impostare il programma). Main è definito
in un'altra sezione.
Esempio Java
[Function]
Tex
= public static {type} {name}({parameters}) {{ | return
t
= public static void {name}({parameters}) {{ | ~return
= -->BLOCK | |1
= | return |1
= return {return}; | return |1
=}
Campi Contenuti
Per inserire il blocco della funzione (corpo della funzione), si usa una riga singola contenente i
seguenti codici speciali. Se si vuole cambiare l’indentazione del blocco, assicurarsi di specificare
l’indentazione dopo il secondo carattere pipe ‘|’.
La sezione [Funcion Header] utilizza il testo generato dalla sezione [Parameter] 153 . È usata
anche nella sezione [Function] 152 .
Esempio C++
[Function Header]
Text = {type} {name}({parameters}); | return
= void {name}({parameters}); | ~return
Campi Contenuti
La sezione Variable Header usa lo stesso metodo utilizzato per generare un elenco di variabili.
Vengono inserite nelle funzioni usando il valore speciale ---> VARIABLES.
Esempio Pascal
[Variable Header]
Text = {variables} : array of {type}; | array
= {variables} : {type}; ~array
La chiave ‘Separator’
La chiave definisce il testo che verrà inserito tra l'elenco dei nomi delle variabili.
Campi
Nessuno
Flags
Nessuno
La chiave ‘Text’
La chiave ‘Text’viene utilizzata per generare la sintassi di ciascun elemento nell'elenco. La
variabile {size} contiene un valore valido se l'istruzione Declare è un Array. Utilizzare il flag
'array' per una corretta sintassi.
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
La chiave ‘Text’
La chiave ‘Text’ viene utilizzata per generare la sintassi di ciascun elemento nell'elenco. La
variabile {size} contiene un valore valido se l'istruzione Declare è un array. Utilizzare il flag
'array' per una corretta sintassi.
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
1. Separate (predefinita)
2. Merged
Quando è impostata a Merged, tutti i nomi delle variabili saranno uniti in un'unica lista. In
questo caso, i campi {size} e {type} non hanno senso.
Campi
Nessuno
Flags
Nessuno
14.6 Istruzioni
14.6.1 Assegnazione
I modelli utilizzano una singola sezione per definire la sintassi delle dichiarazioni di
assegnazione. La sintassi dell'espressione assegnata è definita dalle sezioni operatore /
funzione.
Esempio Java
[Assign]
Text = {Variable} = {Expression};
Campi Contenuti
{variable} Nome della variabile. Questa è definita nella sezione [Variable Access].
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
14.6.2 Chiamata
I modelli utilizzano una singola sezione per definire la sintassi delle istruzioni di chiamata.
Esempio Java
[Call]
Text = {Name}({Arguments});
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
14.6.3 Commento
I commenti hanno un ruolo essenziale nella documentazione di un programma. La sintassi dei
commenti varia notevolmente tra i linguaggi di programmazione con la presenza del commento
di riga (in liea) o la presenza del blocco commento.
Esempio Java
[Comment]
Text = // {Text}
Campi Contenuti
Flags
Nessuno
Esempio Pascal
[Comment]
Text = {{ {Text} }
Replace Char 1 =}
Replace By 1 =
Campi
Nessuno
Flags
Nessuno
14.6.4 Dichiarazione
Esistono due sezioni utilizzate per creare la sintassi per le istruzioni di dichiarazione. Questi
definiscono la sintassi della lista dei nomi delle variabili (dichiarati) e la sintassi della
dichiarazione stessa.
Esempio Java
[Declare Name]
Separator = ,{space}
Text = {name} | ~array
= {name} = new {Type}[{Size}] | array
[Declare]
Text = {Type} {Variables}; | ~array
= {Type}[] {Variables}; | array
La chiave ‘Separator’
Campi
Nessuno
Flags
Nessuno
La chiave ‘Text’
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
La chiave ‘Text’
La chiave ‘Text’ viene utilizzata per generare la sintassi di ciascun elemento nell'elenco. La
variabile {size} contiene un valore valido se l'istruzione Declare è un array. Usare il flag 'array'
per una corretta sintassi.
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
Esempio Pascal
[Declare]
Name Mode = Singular
Text SetLength({Name}, {Size}); |array
Le seguenti definizioni provengono da una versione semplificata del modello Java Programming
Language. Notare che ognuno dei sotto blocchi aumenta l’indentazione di 1.
Esempio Java
[Do]
Text = do {{
= -->BLOCK || 1
= } while({condition});
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
Per inserire il blocco della struttura Do, si utilizza una riga singola contenente i seguenti valori
speciali. Se si vuole cambiare l’indentazione del blocco, assicurarsi di specificare l’indentazione
dopo il secondo simbolo pipe ‘|’.
Le seguenti definizioni provengono da una versione semplificata del modello Java Programming
Language. Notare che ognuno dei sotto blocchi aumenta l’indentazione di 1.
Esempio Java
[For]
= for ({Variable} = {Start}; {Variable} <= {End}; {Variable}++)
Text | inc, ~step
{{
= for ({Variable} = {Start}; {Variable} <= {End}; {Variable} +=
| inc, step
{step}) {{
= for ({Variable} = {Start}; {Variable} >= {End}; {Variable}--) {{ | ~inc, ~step
= for ({Variable} = {Start}; {Variable} >= {End}; {Variable} -=
| ~inc, step
{step}) {{
= -->BLOCK | |1
= end for
Campi Contenuti
Nota: non si può utilizzare un valore negativo. Usare il flag "inc" per
determinare la direzione del ciclo.
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
Per inserire il blocco della struttura For, si utilizza una riga singola contenente i seguenti valori
speciali. Se si vuole cambiare l’indentazione del blocco, assicurarsi di specificare l’indentazione
dopo il secondo simbolo pipe ‘|’.
Le seguenti definizioni provengono da una versione semplificata del modello Java Programming
Language. Notare che ognuno dei sotto blocchi aumenta l’indentazione di 1.
Esempio Java
[While]
Text = while({condition}) {{
= -->BLOCK | |1
=}
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
Per inserire il blocco della struttura While, si utilizza una riga singola contenente i seguenti
valori speciali. Se si vuole cambiare l’indentazione del blocco, assicurarsi di specificare
l’indentazione dopo il secondo simbolo pipe ‘|’.
Le seguenti definizioni provengono da una versione semplificata del modello Java Programming
Language. Notare che ognuno dei sotto blocchi aumenta l’indentazione di 1.
Esempio Java
[Assign]
Text = if ({condition}) {{
= -->TRUEBLOCK | |1
= } else {{ | else
= -->FALSEBLOCK | else |1
=}
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
else La struttura If ha un blocco False (Else). In altre parole, il ramo "else" del
diagramma di flusso contiene forme.
Per inserire il blocco della struttura If, si utilizza una riga singola contenente i seguenti valori
speciali. Se si vuole cambiare l’indentazione del blocco, assicurarsi di specificare l’indentazione
dopo il secondo simbolo pipe ‘|’.
-->TRUEBLOCK Inserisce il codice generato dal blocco True della struttura If.
14.6.9 Input
I modelli usano una singola sezione per definire la sintassi dell’istruzione Input.
Esempio Java
[Input]
Text = {Variable} = [Link](); | integer
= {Variable} = [Link](); | real
= {Variable} = [Link](); | boolean
= {Variable} = [Link](); | string
= {Variable} = [Link](); | none
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
14.6.10 Output
14.6.10.1Output
I modelli usano una singola sezione per definire la sintassi dell’istruzione Output.
Esempio Java
[Assign]
Text = [Link]({Expression}); | newline
= [Link]({Expression}); | ~newline
La chiave ‘Text’
La chiave ‘Text’ viene utilizzata per generare la sintassi dell’istruzione Output. I vari flag
possono essere utilizzati per selezionare diverse sintassi in base al tipo di dati letto.
Campi Contenuti
Il primo e l'ultimo Flag possono essere utilizzati se la sintassi differisce per il primo o l'ultimo
elemento nell'elenco.
14.6.10.2Lista Output
In molti casi, l'istruzione di output richiede un elenco di espressioni piuttosto che un lungo
elenco di termini concatenati.
Esempio C++
[Output List]
Separator = <<
Text = {expression}
Come funziona
Questa sezione crea un elenco eseguendo il ‘refactoring’ dell'espressione originale utilizzando
l'operatore di concatenazione. Vengono modificate solo le concatenazioni al livello
dell'espressione principale (l'espressione secondaria viene lasciata sola). Quindi, la seguente
espressione Flowgorithm:
"The GCD of " & NumberA & " and " & NumberB & " is " & A
Chiave ‘Separator’
La chiave ‘ Separator’ definisce il testo che verrà inserito nell'elenco dei nomi degli argomenti.
Campi
Nessuno
Chiave ‘Text’
La chiave ‘Text’ viene utilizzata per generare la sintassi della lista.
Campi Contenuti
Conflicts = index
Case Sensitive = true
Options =
; =======================================================
; Literals
; =======================================================
[Types]
Integer = number
Real = number
Boolean = boolean
String = string
[Function ID]
Convention = camel
Normal = {Name}
Conflict = func_{Name}
[Variable ID]
Convention = camel
Normal = {Name}
Conflict = var_{Name}
[String Literal]
Text = "{Characters}"
Replace Char 1 = "
Replace By 1 = \"
Replace Char 2 = \
Replace By 2 = \\
[Boolean Literal]
true = true
false = false
[Integer Literal]
Text = {Integral}
[Real Literal]
Text = {Integral}.{Fractional}
[Variable Access]
Precedence = 100
Text = {Name} | ~subscript
= {Name}[{Subscript}] | subscript
; =======================================================
; Expressions
; =======================================================
; Lua precedence:
; 1. or
; 2. and
; 3. Relational ==, >, < ...
; 4. Concatenation: ..
; 5. Addition
; 6. Multiply
; 7. Unary: Not, -
; 8. ^
; 100. Atom, paranthesis
[Or]
Precedence = 1
Needed 1 = 1
Needed 2 = 2
Text = {1} or {2}
[And]
Precedence = 2
Needed 1 = 2
Needed 2 = 3
Text = {1} and {2}
[Equals]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} == {2}
[Not Equals]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} ~= {2}
[Less Than]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} < {2}
[Greater Than]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} > {2}
[Concatenate]
Precedence = 4
Needed 1 = 4
Needed 2 = 5
Text = {1} .. {2}
[Add]
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} + {2}
[Subtract]
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} - {2}
[Multiply]
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} * {2}
[Divide]
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} / {2}
[Modulus]
Precedence = 1
Needed 1 = 1
Needed 2 = 1
Text = [Link]({1}, {2})
[Power]
Precedence = 8
Needed 1 = 9
Needed 2 = 8
Text = {1} ** {2}
[Not]
Precedence = 7
Needed 1 = 7
Text = not {1}
[Negate]
Precedence = 7
Needed 1 = 7
Text = -{1}
[Subexpression]
Precedence = 100
Text = ({Expression})
; =======================================================
; Intrinsic Functions
; =======================================================
[Abs]
Precedence = 100
Needed 1 = 100
Text = [Link]{1}
[ArcCos]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ArcSin]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ArcTan]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Char]
Precedence = 100
Needed 1 = 100
Needed 2 = 0
Text = [Link]({1}, index({1}), index({1})
[Cos]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Int]
Precedence = 100
Needed 1 = 100
Text = [Link]({1})
[Len]
Precedence = 100
Needed 1 = 100
Text = [Link]({1})
[Log]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Log10]
Precedence = 100
Needed 1 = 0
Text = math.log10({1})
[Pi]
Precedence = 100
Text = [Link]
[Random]
Precedence = 100
Needed 1 = 0
Text = ([Link]({1}) - 1)
[Sin]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Sgn]
Precedence = 100
Needed 1 = 0
Text = sgn({1})
[Size]
Precedence = 100
Needed 1 = 100
Text = size({1})
[Sqrt]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Tan]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ToChar]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ToCode]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ToInteger]
Precedence = 100
Needed 1 = 0
Text = [Link](tonumber({1}))
[ToFixed]
Precedence = 100
Needed 1 = 0
Needed 2 = 0
Text = toFixed({1}, {2})
[ToReal]
Precedence = 100
Needed 1 = 0
Text = tonumber({1})
[ToString]
Precedence = 100
Needed 1 = 0
Text = tostring({1})
; =======================================================
; Function call
; =======================================================
[Function Call]
Precedence = 100
Text = {name}({arguments})
[Argument]
Separator = ,{space}
Text = {expression}
; =======================================================
; Program
; =======================================================
[Program]
Text = -- Gets the size of the array (by using the max index) | size
= function size(values) | size
= return [Link](values) + 1 | size | 1
= end | size
= | size
= -->FUNCTIONS
= -->MAIN
[Main]
Text = -- Main | functions
= [Link]([Link] ()) -- Prepare the random number generator |
random
= |
random
= -->BLOCK
; =======================================================
; Function
; =======================================================
[Function]
Text = function {name}({parameters})
= -->BLOCK | | 1
= | return | 1
= return {return} | return | 1
= end
=
[Parameter]
Separator = ,{space}
Text = {name}
; =======================================================
; Statements
; =======================================================
[Assign]
Text = {Variable} = {Expression}
[Call]
Text = {Name} ({Arguments})
[Comment]
Text = -- {Text}
[Declare Name]
Separator = ,{space}
Text = {name} | ~array
= {Name} = {{} | array
[Declare]
Text = local {variables}
[Do]
Text = repeat
= -->BLOCK | | 1
= until not ({condition})
[For]
Text = for {Variable} = {start}, {end} do | inc, ~step
= for {Variable} = {start}, {end}, {step} do | inc, step
= for {Variable} = {start}, {end}, -{step} do | ~inc
= -->BLOCK | | 1
= end
[Input]
Text = {Variable} = tonumber([Link]()) | integer
= {Variable} = tonumber([Link]()) | real
= {Variable} = [Link]([Link]()) == "true") | boolean
= {Variable} = [Link]() | string
= {Variable} = [Link]() | none
[If]
Text = if {condition} then
= -->TRUEBLOCK | | 1
= else | else
= -->FALSEBLOCK | else | 1
= end
[Output]
Separator = ,{space}
Text = [Link]({List}, "\n") | newline
= [Link]({List}) | ~newline
[While]
Text = while {condition} do
= -->BLOCK | | 1
= end
Conflicts = input
Case Sensitive = true
Options =
; =======================================================
; Literals
; =======================================================
[Types]
Integer = int
Real = double
Boolean = boolean
String = String
[Function ID]
Convention = camel
Normal = {Name}
Conflict = func_{Name}
[Variable ID]
Convention = camel
Normal = {Name}
Conflict = var_{Name}
[String Literal]
Text = "{Characters}"
Replace Char 1 = "
Replace By 1 = \"
Replace Char 2 = \
Replace By 2 = \\
[Boolean Literal]
true = true
false = false
[Integer Literal]
Text = {Integral}
[Real Literal]
Text = {Integral}.{Fractional}
[Variable Access]
Precedence = 100
Text = {Name} | ~subscript
= {Name}[{Subscript}] | subscript
; =======================================================
; Expressions
; =======================================================
; 1. or
; 2. and
; 3. ==
; 4. Relational >, < ...
; 5. Addition
; 6. Multiply
; 7. Cast ()
; 8. Unary: Not, !
; 100. Atom, paranthesis
[Or]
Precedence = 1
Needed 1 = 1
Needed 2 = 2
Text = {1} {pipe}{pipe} {2}
[And]
Precedence = 2
Needed 1 = 2
Needed 2 = 3
Text = {1} && {2}
[Equals]
Precedence = 3 | ~string-string
= 100 | string-string
Needed 1 = 4 | ~string-string
= 100 | string-string
Needed 2 = 4 | ~string-string
= 1 | string-string
[Not Equals]
Precedence = 3 | ~string-string
= 100 | string-string
Needed 1 = 4 | ~string-string
= 100 | string-string
Needed 2 = 4 | ~string-string
= 1 | string-string
[Less Than]
Precedence = 4
Needed 1 = 5 | ~string-string
= 100 | string-string
Needed 2 = 5 | ~string-string
= 1 | string-string
Needed 1 = 5 | ~string-string
= 100 | string-string
Needed 2 = 5 | ~string-string
= 1 | string-string
[Greater Than]
Precedence = 4
Needed 1 = 5 | ~string-string
= 100 | string-string
Needed 2 = 5 | ~string-string
= 1 | string-string
Needed 1 = 5 | ~string-string
= 100 | string-string
Needed 2 = 5 | ~string-string
= 1 | string-string
[Concatenate]
Precedence = 5
Needed 1 = 5 | string-1
= 1 | ~string-1
Needed 2 = 6
[Add]
Type = real | ~integer-integer
= integer | integer-integer
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} + {2}
[Subtract]
Type = real | ~integer-integer
= integer | integer-integer
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} - {2}
[Multiply]
Type = real | ~integer-integer
= integer | integer-integer
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} * {2}
[Divide]
Type = real
Precedence = 6
Needed 1 = 6 | ~integer-integer
= 100 | integer-integer
Needed 2 = 7
Text = {1} / {2} | ~integer-integer
= (double) {1} / {2} | integer-integer
[Modulus]
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} % {2}
[Power]
Type = real
Precedence = 100
Needed 1 = 0
Needed 2 = 0
Text = [Link]({1}, {2})
[Not]
Type = boolean
Precedence = 7
Needed 1 = 7
Text = !{1}
[Negate]
Type = real | ~integer
= integer | integer
Precedence = 7
Needed 1 = 7
Text = -{1}
[Subexpression]
Precedence = 100
Text = ({Expression})
; =======================================================
; Intrinsic Functions
; =======================================================
[Abs]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ArcCos]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ArcSin]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ArcTan]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Char]
Precedence = 100
Needed 1 = 100
Needed 2 = 0
Text = {1}.charAt({2})
[Cos]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Int]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Len]
Precedence = 100
Needed 1 = 100
Text = {1}.length()
[Log]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Log10]
Precedence = 100
Needed 1 = 0
Text = Math.log10({1})
[Pi]
Precedence = 100
Text = [Link]
[Random]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Sin]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Sgn]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Size]
Precedence = 100
Needed 1 = 100
Text = {1}.length
[Sqrt]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[Tan]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ToChar]
Precedence = 100
Needed 1 = 100
Text = (char) {1}
[ToCode]
Precedence = 100
Needed 1 = 100
Text = (int) {1}[0]
[ToFixed]
Type = string
Precedence = 100
Needed 1 = 0
Needed 2 = 0
Text = toFixed({1},{2})
[ToInteger]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ToReal]
Precedence = 100
Needed 1 = 0
Text = [Link]({1})
[ToString]
Precedence = 100
Needed 1 = 100
Text = {1}.toString()
; =======================================================
; Function call
; =======================================================
[Function Call]
Precedence = 100
Text = {name}({arguments})
[Argument]
Separator = ,{space}
Text = {expression}
; =======================================================
; Program
; =======================================================
[Program]
Text = import [Link].*;
= import [Link];
=
= public class JavaApplication {{
= private static Random random = new Random(); | random
| 1
= private static Scanner input = new Scanner([Link]); | input
| 1
= | random,
~input
= | ~random,
input
= | random,
input
= -->MAIN |
| 1
= -->FUNCTIONS |
| 1
= | tofixed
| 1
= private static String toFixed(double value, int digits) {{ | tofixed
| 1
= return [Link]("%." + digits + "f", value); | tofixed
| 2
= } | tofixed
| 1
= }
[Main]
Text = public static void main(String[] args) {{
= -->BLOCK | |
1
= }
; =======================================================
; Function
; =======================================================
[Parameter]
Separator = ,{space}
Text = {type} {name} | ~array
= {type}[] {name} | array
[Function]
Text =
= public static {type} {name}({parameters}) {{ | return
= public static void {name}({parameters}) {{ | ~return
= -->BLOCK | | 1
= | return | 1
= return {return}; | return | 1
= }
; =======================================================
; Statements
; =======================================================
[Assign]
Text = {Variable} = {Expression};
[Call]
Text = {Name}({Arguments});
[Comment]
Text = // {Text}
[Declare Name]
Separator = ,{space}
Text = {name} | ~array
= {name} = new {Type}[{Size}] | array
[Declare]
Text = {Type} {Variables}; | ~array
= {Type}[] {Variables}; | array
[Do]
Text = do {{
= -->BLOCK | | 1
= } while ({condition});
[For]
Text = for ({Variable} = {Start}; {Variable} <= {End}; {Variable}++)
{{ | inc, ~step
= for ({Variable} = {Start}; {Variable} <= {End}; {Variable} += {step})
{{ | inc, step
= for ({Variable} = {Start}; {Variable} >= {End}; {Variable}--)
{{ | ~inc, ~step
= for ({Variable} = {Start}; {Variable} >= {End}; {Variable} -= {step})
{{ | ~inc, step
= -->BLOCK
| | 1
= }
[Input]
Text = {Variable} = [Link](); | integer
= {Variable} = [Link](); | real
= {Variable} = [Link](); | boolean
= {Variable} = [Link](); | string
= {Variable} = [Link](); | none
[If]
Text = if ({condition}) {{
= -->TRUEBLOCK | | 1
= } else {{ | else
= -->FALSEBLOCK | else | 1
= }
[Output]
Text = [Link]({Expression}); | newline
= [Link]({Expression}); | ~newline
[While]
Text = while ({condition}) {{
= -->BLOCK | | 1
= }
Keywords = and, array, as, asm, begin, case, class, const, constructor,
destructor
= dispinterface, div, do, downto, else, end, except, exports, file,
finalization
= finally, for, function, goto, if, implementation, in, inherited,
initialization, interface
= in, is, library, nil, not, object, of, or, out, packed
= procedure, program, property, raise, randomize, record, repeat,
resourcestring, set
= string, then, to, try, type, unit, until, uses, var, while, with
Conflicts =
; =======================================================
; Literals
; =======================================================
[Types]
Integer = integer
Real = real
Boolean = boolean
String = string
[Function ID]
Convention = proper
Normal = {Name}
Conflict = {Name}_function
[Variable ID]
Convention = proper
Normal = {Name}
Conflict = {Name}_variable
[String Literal]
Text = '{Characters}'
Replace Char 1 = '
Replace By 1 = ''
[Boolean Literal]
true = true
false = false
[Integer Literal]
Text = {Integral}
[Real Literal]
Text = {Integral}.{Fractional}
[Variable Access]
Precedence = 100
Text = {Name} | ~subscript
= {Name}[{Subscript}] | subscript
; =======================================================
; Expressions
; =======================================================
; Pascal precedence: (ONLY FOUR)
; 1. Comparison: =, <>, <, >, <=, >=
; 2. Addition & Or: +, -, or, xor
; 3. Multiply & And: *, /, mod, and
; 4. Not: not
; 100. Atom, paranthesis
[Or]
Precedence = 3
Needed 1 = 3
Needed 2 = 4
Text = {1} or {2}
[And]
Precedence = 3
Needed 1 = 3
Needed 2 = 4
Text = {1} and {2}
[Equals]
Precedence = 1
Needed 1 = 2
Needed 2 = 2
Text = {1} = {2}
[Not Equals]
Precedence = 1
Needed 1 = 2
Needed 2 = 2
Text = {1} <> {2}
[Less Than]
Precedence = 1
Needed 1 = 2
Needed 2 = 2
Text = {1} < {2}
[Greater Than]
Precedence = 1
Needed 1 = 2
Needed 2 = 2
Text = {1} > {2}
[Concatenate]
Precedence = 2
Needed 1 = 2 | string-1
= 1 | ~string-1
Needed 2 = 3 | string-2
= 1 | ~string-2
[Add]
Precedence = 2
Needed 1 = 2
Needed 2 = 3
Text = {1} + {2}
[Subtract]
Precedence = 2
Needed 1 = 2
Needed 2 = 3
Text = {1} - {2}
[Multiply]
Precedence = 3
Needed 1 = 3
Needed 2 = 4
Text = {1} * {2}
[Divide]
Precedence = 3
Needed 1 = 3
Needed 2 = 4
Text = {1} / {2}
[Modulus]
Precedence = 3
Needed 1 = 3
Needed 2 = 4
Text = {1} mod {2}
[Power]
Precedence = 100
Needed 1 = 1
Needed 2 = 1
Text = Power({1}, {2})
[Not]
Precedence = 4
Needed 1 = 4
Text = Not {1}
[Negate]
Precedence = 4
Needed 1 = 4
Text = -{1}
[Subexpression]
Precedence = 100
Text = ({Expression})
; =======================================================
; Intrinsic Functions
; =======================================================
[Abs]
Precedence = 100
Needed 1 = 1
Text = Abs({1})
[ArcCos]
Precedence = 100
Needed 1 = 1
Text = ArcCos({1})
[ArcSin]
Precedence = 100
Needed 1 = 1
Text = ArcSin({1})
[ArcTan]
Precedence = 100
Needed 1 = 1
Text = ArcTan({1})
[Char]
Precedence = 100
Needed 1 = 100
Needed 2 = 1
Text = {1}[{2}]
[Cos]
Precedence = 100
Needed 1 = 1
Text = Cos({1})
[Int]
Precedence = 100
Needed 1 = 1
Text = Int({1})
[Len]
Precedence = 100
Needed 1 = 1
Text = Length({1})
[Log]
Precedence = 100
Needed 1 = 1
Text = Log({1})
[Log10]
Precedence = 100
Needed 1 = 1
Text = Log10({1})
[Pi]
Precedence = 100
Text = Pi
[Random]
Precedence = 100
Needed 1 = 1
Text = Random({1})
[Sin]
Precedence = 100
Needed 1 = 1
Text = Sin({1})
[Sgn]
Precedence = 100
Needed 1 = 1
Text = Sgn({1})
[Size]
Precedence = 100
Needed 1 = 1
Text = Length({1})
[Sqrt]
Precedence = 100
Needed 1 = 1
Text = Sqrt({1})
[Tan]
Precedence = 100
Needed 1 = 1
Text = Tan({1})
[ToChar]
Precedence = 100
Needed 1 = 1
Text = Chr({1})
[ToCode]
Precedence = 100
Needed 1 = 1
Text = Ord({1})
[ToFixed]
Precedence = 100
Needed 1 = 1
Needed 2 = 1
Text = ToFixed({1}, {2})
[ToInteger]
Precedence = 100
Needed 1 = 1
Text = StrToInt({1})
[ToReal]
Precedence = 100
Needed 1 = 1
Text = StrToFloat({1})
[ToString]
Precedence = 100
Needed 1 = 1
Text = FloatToStr({1})
; =======================================================
; Function call
; =======================================================
[Function Call]
Precedence = 100
Text = {name}({arguments})
[Argument]
Separator = ,{space}
Text = {expression}
; =======================================================
; Program
; =======================================================
[Program]
Text = program MyProgram;
= uses Math, SysUtils;
= | functions
= {{ Headers } | functions
= -->HEADERS | functions
= -->FUNCTIONS
= -->MAIN
[Main]
Text = | functions
= {{ Main } | functions
= var | declare
= -->VARIABLES | declare | 1
= | declare
= begin
= randomize; {{Prepare the random number generator} | random | 1
= | random
= -->BLOCK | | 1
= end.
; =======================================================
; Function
; =======================================================
[Parameter]
Separator = ,{space}
Text = {name} : {type} | ~array
= var {name} : array of {type} | array
[Function]
Block Extra = 1 | return
= 0 | ~return
Text =
= procedure {name} ({parameters}); | ~return
= var | ~return, declare
= -->VARIABLES | ~return, declare | 1
= | ~return, declare
= begin | ~return
= -->BLOCK | ~return | 1
= end; | ~return
[Function Header]
Text = procedure {name} ({parameters}); forward; | ~return
= function {name} ({parameters}) : {type}; forward; | return
; =======================================================
; Variable Header
; =======================================================
[Variable Header]
Text = {variables} : array of {type}; | array
= {variables} : {type}; | ~array
; =======================================================
; Statements
; =======================================================
[Assign]
Text = {Variable} := {Expression}; | ~last
= {Variable} := {Expression} | last
[Call]
Text = {Name} ({Arguments}); | ~last
= {Name} ({Arguments}) | last
[Comment]
Replace Char 1 = }
Replace By 1 =
Text = {{ {Text} }
[Declare Name]
Separator = ,{space}
Text = {name}
[Declare]
Name Mode = Singular
Text = SetLength({Name}, {Size}); | array, ~last
= SetLength({Name}, {Size}) | array, last
[Do]
Text = repeat
= begin
= -->BLOCK | | 1
= end
= until not ({condition}); | ~last
= until not ({condition}) | last
[For]
Text = For {Variable} := {Start} to {End} do | ~step, inc
= For {Variable} := {Start} downto {End} do | ~step, ~inc
= begin | ~step
= -->BLOCK | ~step |
1
= end; | ~step, ~last
= end | ~step, last
= | step
= {Variable} := {Variable} + {Step}; | step, inc
= {Variable} := {Variable} - {Step}; | step, ~inc
= end; | step, ~last
= end | step, last
[Input]
Text = ReadLn({Variable}); | ~last
= ReadLn({Variable}) | last
[If]
Text = if {condition} then
= begin
= -->TRUEBLOCK | | 1
= end | else
= else | else
= begin | else
= -->FALSEBLOCK | else | 1
= end; | ~last
= end | last
[Output]
Text = WriteLn({Expression}); | newline, ~last
= Write({Expression}); | ~newline, ~last
[While]
= end; | ~last
= end | last
; =======================================================
; Literals
; =======================================================
[Types]
Integer = int
Real = float
Boolean = bool
String = str
[Function ID]
Convention = camel
Normal = {Name}
Conflict = func_{Name}
[Variable ID]
Convention = camel
Normal = {Name}
Conflict = var_{Name}
[String Literal]
Text = "{Characters}"
Replace Char 1 = "
Replace By 1 = \"
Replace Char 2 = \
Replace By 2 = \\
[Boolean Literal]
true = True
false = False
[Integer Literal]
Text = {Integral}
[Real Literal]
Text = {Integral}.{Fractional}
[Variable Access]
Precedence = 100
Text = {Name} | ~subscript
= {Name}[{Subscript}] | subscript
; =======================================================
; Expressions
; =======================================================
; Python precedence:
; 1. or
; 2. and
; 3. not
; 4. Relational and equality: =, >, < ...
; 5. Addition
; 6. Multiply
; 7. Unary: -
; 8. **
; 100. Atom, paranthesis
[Or]
Precedence = 1
Needed 1 = 1
Needed 2 = 2
Text = {1} or {2}
[And]
Precedence = 2
Needed 1 = 2
Needed 2 = 3
Text = {1} and {2}
[Equals]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} == {2}
[Not Equals]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} != {2}
[Less Than]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} < {2}
[Greater Than]
Precedence = 3
Needed 1 = 4
Needed 2 = 4
Text = {1} > {2}
[Concatenate]
Precedence = 5
Needed 1 = 5 | string-1
= 1 | ~string-1
Needed 2 = 6 | string-2
= 1 | ~string-2
[Add]
Type = real | ~integer-integer
= integer | integer-integer
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} + {2}
[Subtract]
Type = real | ~integer-integer
= integer | integer-integer
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} - {2}
[Multiply]
Type = real | ~integer-integer
= integer | integer-integer
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} * {2}
[Divide]
Type = real
Precedence = 6
Needed 1 = 6 | ~integer-integer
= 1 | integer-integer
Needed 2 = 7
Text = {1} / {2} | ~integer-integer
= float({1}) / {2} | integer-integer
[Modulus]
Type = integer
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} % {2}
[Power]
Type = real
Precedence = 8
Needed 1 = 9
Needed 2 = 8
Text = {1} ** {2}
[Not]
Type = boolean
Precedence = 3
Needed 1 = 3
Text = not {1}
[Negate]
Type = real | ~integer
= integer | integer
Precedence = 7
Needed 1 = 7
Text = -{1}
[Subexpression]
Precedence = 100
Text = ({Expression})
; =======================================================
; Intrinsic Functions
; =======================================================
[Abs]
Precedence = 100
Needed 1 = 0
Text = fabs({1})
[ArcCos]
Precedence = 100
Needed 1 = 0
Text = acos({1})
[ArcSin]
Precedence = 100
Needed 1 = 0
Text = asin({1})
[ArcTan]
Precedence = 100
Needed 1 = 0
Text = atan({1})
[Char]
Precedence = 100
Needed 1 = 100
Needed 2 = 0
Text = {1}[{2}]
[Cos]
Precedence = 100
Needed 1 = 0
Text = cos({1})
[Int]
Precedence = 100
Needed 1 = 0
Text = int({1})
[Len]
Precedence = 100
Needed 1 = 0
Text = len({1})
[Log]
Precedence = 100
Needed 1 = 0
Text = log({1})
[Log10]
Precedence = 100
Needed 1 = 0
Text = log10({1})
[Pi]
Precedence = 100
Text = [Link]
[Random]
Precedence = 100
Needed 1 = 6
Text = int([Link]() * {1})
[Sin]
Precedence = 100
Needed 1 = 0
Text = sin({1})
[Sgn]
Precedence = 100
Needed 1 = 0
Text = sgn({1})
[Size]
Precedence = 100
Needed 1 = 0
Text = len({1})
[Sqrt]
Precedence = 100
Needed 1 = 0
Text = sqrt({1})
[Tan]
Precedence = 100
Needed 1 = 0
Text = tan({1})
[ToChar]
Precedence = 100
Needed 1 = 0
Text = chr({1})
[ToCode]
Precedence = 100
Needed 1 = 0
Text = ord({1})
[ToInteger]
Precedence = 100
Needed 1 = 0
Text = int({1})
[ToFixed]
Type = string
Precedence = 100
Needed 1 = 0
Needed 2 = 0
Text = toFixed({1},{2})
[ToReal]
Precedence = 100
Needed 1 = 0
Text = float({1})
[ToString]
Precedence = 100
Needed 1 = 0
Text = str({1})
; =======================================================
; Function call
; =======================================================
[Function Call]
Precedence = 100
Text = {name}({arguments})
[Argument]
Separator = ,{space}
Text = {expression}
; =======================================================
; Program
; =======================================================
[Program]
Text = import random | random
= | random
= -->FUNCTIONS
= -->MAIN
[Main]
Text = # Main | functions
; =======================================================
; Function
; =======================================================
[Function]
Text = def {name}({parameters}):
= -->BLOCK | | 1
= pass | ~block | 1
= | return | 1
= return {return} | return | 1
=
[Parameter]
Separator = ,{space}
Text = {name}
; =======================================================
; Statements
; =======================================================
[Assign]
Text = {Variable} = {Expression}
[Call]
Text = {Name} ({Arguments})
[Comment]
Text = # {Text}
[Declare Name]
Separator = ,{space}
Text = {name}
[Declare]
Name mode = Singular
[For]
Text = for {Variable} in range({start}, {end} + {step}, {step}): | inc
= for {Variable} in range({start}, {end} - {step}, -{step}): | ~inc
= -->BLOCK | | 1
= pass | ~block | 1
[Input]
Text = {Variable} = int(input()) | integer
= {Variable} = float(input()) | real
= {Variable} = (input().lower == 'true') | boolean
= {Variable} = input() | string
= {Variable} = input() | none
[If]
Text = if {condition}:
= -->TRUEBLOCK | | 1
= pass | ~block | 1
= else: | else
= -->FALSEBLOCK | else | 1
[Output]
Text = print({Expression}) | newline
= print({Expression}, end='', flush=True) | ~newline
[While]
Text = while {condition}:
= -->BLOCK | | 1
= pass | ~block | 1
Keywords = AddHandler, AddressOf, Alias, And, AndAlso, As, Boolean, ByRef, Byte,
ByVal
= Call, Case, Catch, CBool, CByte, CChar, CDate, CDec, CDbl, Char
= CInt, Class, CLng, CObj, Const, Continue, CSByte, CShort, CSng, CStr
= CType, CUInt, CULng, CUShort, Date, Decimal, Declare, Default,
Delegate, Dim
= DirectCast, Do, Double, Each, Else, ElseIf, End, EndIf, Enum, Erase
= Error, Event, Exit, False, Finally, For, Friend, Function, Get,
GetType
= Global, GoSub, GoTo, Handles, If, Implements, Imports, In, Inherits,
Integer
= Interface, Is, IsNot, Let, Lib, Like, Long, Loop, Me, Mod
= Module, MustInherit, MustOverride, MyBase, MyClass, Namespace,
Narrowing, New, Next
= Not, Nothing, NotInheritable, NotOverridable, Object, Of, On,
Operator, Option, Optional
; =======================================================
; Literals
; =======================================================
[Types]
Integer = Integer
Real = Double
Boolean = Boolean
String = String
[Function ID]
Convention = proper
Normal = {Name}
Conflict = [{Name}]
[Variable ID]
Convention = camel
Normal = {Name}
Conflict = [{Name}]
[String Literal]
Text = "{Characters}"
Replace Char 1 = "
Replace By 1 = ""
[Boolean Literal]
true = True
false = False
[Integer Literal]
Text = {Integral}
[Real Literal]
Text = {Integral}.{Fractional}
[Variable Access]
Precedence = 100
Text = {Name} | ~subscript
= {Name}({Subscript}) | subscript
; =======================================================
; Expressions
; =======================================================
; VB .NET precedence:
; 1. or
; 2. and
; 3. not
; 4. Relational and equality: =, >, < ...
; 5. Addition
; 6. Multiply
; 7. Unary: -
; 8. ^
[Or]
Precedence = 1
Needed 1 = 1
Needed 2 = 2
Text = {1} Or {2}
[And]
Precedence = 2
Needed 1 = 2
Needed 2 = 3
Text = {1} And {2}
[Equals]
Precedence = 4
Needed 1 = 5
Needed 2 = 5
Text = {1} = {2}
[Not Equals]
Precedence = 4
Needed 1 = 5
Needed 2 = 5
Text = {1} <> {2}
[Less Than]
Precedence = 4
Needed 1 = 5
Needed 2 = 5
Text = {1} < {2}
[Greater Than]
Precedence = 4
Needed 1 = 5
Needed 2 = 5
Text = {1} > {2}
[Concatenate]
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} & {2}
[Add]
Precedence = 5
Needed 1 = 5
Needed 2 = 6
Text = {1} + {2}
[Subtract]
Precedence = 5
Needed 1 = 5
Needed 2 = 6
[Multiply]
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} * {2}
[Divide]
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} / {2}
[Modulus]
Precedence = 6
Needed 1 = 6
Needed 2 = 7
Text = {1} Mod {2}
[Power]
Precedence = 8
Needed 1 = 9
Needed 2 = 8
Text = {1} ^ {2}
[Not]
Precedence = 3
Needed 1 = 3
Text = Not {1}
[Negate]
Precedence = 7
Needed 1 = 7
Text = -{1}
[Subexpression]
Precedence = 100
Text = ({Expression})
; =======================================================
; Intrinsic Functions
; =======================================================
[Abs]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[ArcCos]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[ArcSin]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[ArcTan]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Char]
Precedence = 100
Needed 1 = 100
Needed 2 = 1
Text = {1}.CharAt({2})
[Cos]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Int]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Len]
Precedence = 100
Needed 1 = 100
Text = {1}.Length
[Log]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Log10]
Precedence = 100
Needed 1 = 1
Text = Math.Log10({1})
[Pi]
Precedence = 100
Text = [Link]
[Random]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Sin]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Sgn]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Size]
Precedence = 100
Needed 1 = 100
Text = {1}.Length
[Sqrt]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[Tan]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[ToChar]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[ToCode]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[ToFixed]
Precedence = 100
Needed 1 = 1
Needed 2 = 1
Text = ToFixed({1}, {2})
[ToInteger]
Precedence = 100
Needed 1 = 1
Text = Convert.ToInt32({1})
[ToReal]
Precedence = 100
Needed 1 = 1
Text = [Link]({1})
[ToString]
Precedence = 100
Needed 1 = 100
Text = {1}.ToString()
; =======================================================
; Function call
; =======================================================
[Function Call]
Precedence = 100
Text = {name}({arguments})
[Argument]
Separator = ,{space}
Text = {expression}
; =======================================================
; Program
; =======================================================
[Program]
Text = Imports System
=
= Public Module MyProgram
= Private random as new Random() | Random | 1
= | Random | 1
= -->MAIN | | 1
= -->FUNCTIONS | | 1
= |
tofixed | 1
= Function ToFixed(value As Double, digits As Integer) As String |
tofixed | 1
= Return [Link]("f" & digits) |
tofixed | 2
= End Function |
tofixed | 1
= |
input | 1
= ' .NET can only read single characters or entire lines from the console. |
input | 1
= ' The following functions are designed to help input specific data types. |
input | 1
= Private Function inputValue() As Double | input | 1
= | output | 1
= Private Sub output(text As String) | output | 1
= [Link](text) | output |
2
= End Sub | output | 1
= End Module
[Main]
Text = Sub Main | |
= -->BLOCK | | 1
= End Sub | |
; =======================================================
; Function
; =======================================================
[Parameter]
Separator = ,{space}
Text = {name} As {type} | ~array
= ByRef {name}() As {type} | array
[Function]
Text =
= Private Sub {name} ({parameters}) | ~return
= -->BLOCK | ~return | 1
= End Sub | ~return
; =======================================================
; Statements
; =======================================================
[Assign]
Text = {Variable} = {Expression}
[Call]
Text = {Name}({Arguments})
[Comment]
Text = ' {Text}
[Declare Name]
Separator = ,{space}
Text = {name} As {Type} | ~array
= {name}({Size}) As {Type} | array
[Declare]
Text = Dim {Variables}
[Do]
Text = Do
= -->BLOCK | | 1
= Loop While {condition}
[For]
Text = For {Variable} = {Start} To {End} | ~step
= For {Variable} = {Start} To {End} Step {step} | step
= -->BLOCK | | 1
= Next
[Input]
Text = {Variable} = inputText() | ~string
= {Variable} = inputValue() | String
[If]
Text = If {condition} Then
= -->TRUEBLOCK | | 1
= Else | else
= -->FALSEBLOCK | else | 1
= End If
[Output]
Text = output({Expression})
[While]
Text = Do While {condition}
= -->BLOCK | | 1
= Loop
15 Versioni precedenti
15.1 Versioni 32 bit
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
16 Altro
Contatto
e-mail: Flowgorithm [Link].
Informazioni
Origine del Nome
Il nome è la fusione dei termini “flowchart" e "algorithm".
Scritto in
Flowgorithm è implementato utilizzando Microsoft C#.
Autore
Devin Cook
Licenza
Download in PDF
Ulteriori Informazioni
Older Revisions
17 Esercizi
17.1 Esercizi - parte 1
Vai all'eBook
Tipologia esercizio
Grafica Tartaruga
File
Elaborazioni Generiche / Matematiche
Elaborazioni con utilizzo di Stringhe
Elaborazioni con utilizzo di Array
Elaborazioni con utilizzo di Funzioni / Procedure
Elaborazioni Ricorsive
Esercizi
Dat
Nu a
Tipolo
me Descrizione mo Note
gia dific
ro
a
Somma di due numeri (v1 - usando una terza
1
variabile)
Somma di due numeri (v2 - senza usare una terza
2
variabile)
Scambiare due numeri (v1 - usando una terza
3
variabile)
Scambiare due numeri (v2 - senza usare una terza
4
variabile)
5 Data la base e l’altezza di un triangolo, scrivere l’area
6 Conversione angolare (gradi <--> radianti)
Addizionare due numeri usando la chiamata per valore
7
e la chiamata per riferimento
22 Serie di potenze
23 Progressione aritmetica
24 Progressione geometrica
52 Distributore di bevande
53 Cambia monete
57 Numeri sconnessi
79 Fattoriale inverso
80 Calcolo del fattoriale (visione di tutte le cifre)
Calcolo del fattoriale utilizzando la formula di Stirling
81
per i grandi numeri
82 Calcolo delle disposizioni semplici
264 Operatori a livello del bit (AND, OR, XOR) con interi
Tipologia esercizio
Grafica Tartaruga
File
Elaborazioni Generiche / Matematiche
Elaborazioni con utilizzo di Stringhe
Esercizi
Nu Data
Tipolo
mer Descrizione mod Note
o gia ifica
2 Disegno floreale
3 Poligoni regolari
4 Disegnare una stella
5 Disegnare scale
Autore: Petr
6 Disegno di funzione
Vanecek
7 Lettura da file
8 Scrittura su file: numeri di Fibonacci
9 Scrittura su file: elevamento al quadrato di numeri
(vedere esercizio n.
10 Giorno della settimana ver 2 216 in 'Esercizi -
parte 1')
11 Calcolare il numero di occorrenze di un numero
Calcolare il numero di occorrenze delle parole
12
inserite
Vedere
13 Conversione data giuliana -> gregoriana
approfondimento
Autore: Shafiqur
14 Separatore di parole
Bhuiyan
15 Visualizzare i sottomultipli di N (col calcolo del resto)
Autore: Shafiqur
Bhuiyan
28 Hilbert (frattale)
29 Albero (frattale)
30 Stella
31 Stella (frattale)
33 Ottagono
34 Spirale
35 Quadrati
37 Quadrati (frattale)
38 Triangoli (frattale)
39 Curve (frattale)
40 Incroci (frattale)
41 La mia città
42 Generatore di istogrammi
43 Stella marina
44 Fiore
45 Mandala
46 Spirale
47 Movimento casuale
48 Conchiglia
49 Addobbo
50 Felce
51 Sierpinski
53 Assi cartesiani
54 Stelle casuali
55 Naifeh Saida
59 Cronometro inverso
60 Cronometro da cucina