Per Software applicativo si intende l’insieme di tutti i programmi che possiedono i più svariati obiettivi e che risolvono problemi di una stessa classe. Sono per lo più sviluppati da uno o più utenti o da case specializzate nello sviluppo di software (Software house). Rientra nel Software applicativo qualsiasi programma progettato e prodotto da parte di un utente. In questa lezione vengono richiamati i passi fondamentali per progettare, realizzare e rendere eseguibile un programma.
E’ bene sottolineare che il software applicativo è uno “strato” superiore al software di base.
Il software di base è l’insieme di tutti i programmi che fungono da interfaccia tra l’hardware ed il software applicativo.
E’ indispensabile:
Rappresentare il mondo reale con combinazioni di strutture dati e procedure che operano sulle strutture.
Nel seguito la lezione è dedicata solo alla programmazione strutturata.
E’ bene sottolineare che non esistono linguaggi e tecniche di programmazione migliori o peggiori ma linguaggi e tecniche che meglio si adattano a risolvere problemi specifici la cui scelta va valutata caso per caso.
Viene definita procedura l’insieme di una o più attività finalizzate al conseguimento di un preciso obiettivo.
Le procedure possono essere classificate in:
La classificazione nasce dalla estrema diversità della natura dei problemi e delle risorse necessarie. Infatti, le procedure gestionali richiedono notevoli risorse di memoria (archivi e/o database) e ridotta elaborazione, viceversa, le procedure di tipo scientifico usano pochi dati e notevoli e complesse elaborazioni.
In ambito aziendale esistono moltissimi dati e moltissimi documenti cartacei. L’azienda in genere, non ha bisogno di complessi algoritmi, ma di grandi archivi magnetici per contenere i dati e di molti programmi semplici per gestire questi dati: Programmi di registrazione, di modifica, di calcolo, ordinamento e stampa. Archivi e software gestionale esistono già sul mercato e l’Azienda in genere può acquistarli direttamente dai fornitori.
Costo sviluppo sw x procedura A
Costo sviluppo sw x procedura B
Esemplificando lo studio di fattibilità serve a formalizzare e a far valutare quanto viene a costare lo sviluppo dei programmi per le singole procedure A, B, etc. e complessivamente. I costi sono confrontati con i relativi guadagni derivanti dall’ introduzione delle procedure automatiche.
L’ analisi della procedura consiste nella definizione delle specifiche utente cioè gli analisti esaminano l’esistente procedura e tutte le interazioni con le altre procedure. Vengono anche esaminati quali sono i flussi di dati e gli utenti interessati da questi flussi. Tenendo presente le esigenze aziendali gli analisti propongono, utilizzando strumenti tipici (es. diagramma data-flow) alcune soluzioni “informatiche” per lo sviluppo della procedura automatica. Nella figura è riportata, tra le tre procedure individuate (presenze, stipendi e contabilità) un esemplificato data-flow per la procedura stipendi.
La procedura prevede, prima della elaborazione e stampa dei cedolini di stipendio, l’organizzazione e l’afflusso dei giorni di presenza dei dipendenti e contemporanea consultazione dei dati di contabilità ed amministrativi dei singoli dipendenti di cui si deve elaborare il cedolino.
La fase di progettazione ha inizio dopo l’approvazione di una delle soluzioni proposte in fase di analisi. Bisogna precisare che ogni procedura nuova richiede sostanziosi investimenti in termini economici ed è alto il rischio che si corre qualora la procedura progettata non sia aderente ai requisiti richiesti. Il progetto deve prevedere, infatti, le risorse hardware e software da impegnare, il personale, i costi.
In questa fase, ad esempio, come è schematicamente riportato nella figura, per ogni Progetto è valutato il costo di hw (Hardware) e sw (software) per le singole procedure (stipendi, magazzino, gestione filiali estere). Viene scartata, ad esempio, la procedura di gestione filiali estere perché troppo onerosa, le altre vengono invece accettate dalla Direzione aziendale.
Fase di sviluppo (acquisto o sviluppo di hardware e software per ogni singolo progetto)
Terminata la fase di progettazione si passa allo sviluppo cioè all’acquisto o sviluppo di hardware e software. Spesso hardware e software specifico non sono disponibili e quindi è necessario far sviluppare sia hardware che software specifico secondo il progetto (es. particolari terminali e software per i conti correnti postali, terminali e software per le prenotazioni, etc.). L’Azienda che non dispone di programmatori ricorre a società di software (hardware e software house) specializzate sia per l’acquisto di hardware che di software.
Dopo aver completato lo sviluppo dei programmi e l’eventuale costruzione o acquisto di tutte le risorse hardware necessarie si procede all’installazione (o consegna all’ esercizio) o conversione da un sistema al nuovo.
Esistono varie modalità implementative della nuova procedura: immediata, parallela, frazionata, pilota o minimale.
Segue la lunga fase di manutenzione.
Scopo principale è di verificare l’affidabilità ed efficienza nel tempo, di valutare le prestazioni della procedura/sistema e di introdurre le opportune modifiche sia al software che all’hardware per migliorare le prestazioni della procedura/sistema.
Durante questa fase ci si pone una serie di quesiti in merito alla/e procedura/e automatizzata del tipo:
Quando la manutenzione non è più in grado di far vivere il software sviluppato si entra nella fase di decadimento, e quindi si deve riprogettare la procedura e si ritorna alla prima fase.
Il software aziendale ha così un vero e proprio ciclo di vita.
1. Analisi globale e puntuale
Nel seguito della lezione dedicheremo l’attenzione ad alcune delicate fasi dello sviluppo del software. Dopo lo studio di fattibilità le singole attività tradizionali devono essere studiate in dettaglio per ricercare gli elementi utili per la progettazione della procedura automatica e dei relativi algoritmi. Le fasi preliminari che hanno questo obiettivo prendono il nome di analisi e definizione del problema. Tale analisi si può considerare composta a sua volta di un’ analisi globale (macroanalisi) e di un’analisi dettagliata e puntuale definita microanalisi. L’ analista, durante la macroanalisi, definisce, a grandi linee, le informazioni utili, le risorse necessarie, le modalità ed i tempi di accesso alle informazioni, gli algoritmi sviluppati e da sviluppare, e, principalmente, i risultati da ottenere.
In questa fase l’analista individua con esattezza il flusso delle informazioni che dettaglia con uno strumento grafico detto diagramma di flusso delle informazioni. Nel diagramma di flusso le varie attività previste sono descritte all’interno di simboli convenzionali alcuni sono riportati nella figura. Il diagramma di flusso è una visualizzazione grafica del flusso di tutte le attività (manuali e/o automatiche) come nell’esempio del Censimento rappresentato nella figura a fianco.
2. Diagramma a blocchi o mappa strutturale
Dopo aver completato la macroanalisi del problema, l’analista redige un ulteriore diagramma: il diagramma a blocchi o la mappa (diagramma) strutturale. In tale diagramma l’insieme ordinato delle istruzioni sono considerate in dettaglio. In genere il diagramma a blocchi dovrebbe essere indipendente dal linguaggio di programmazione che sarà adottato, ma, spesso il linguaggio di programmazione che si desidera utilizzare condiziona anche la stesura di tale diagramma. La mappa strutturale dettaglia ed elenca tutte le istruzioni in un linguaggio naturale avendo cura di usare alcune parole di un piccolo vocabolario (ad es. inizio, fine, leggi, scrivi, ripeti, fine-ripeti, se, fine-se, calcola, assegna, etc.). Sia il diagramma a blocchi che la mappa strutturale descrivono solo ed esclusivamente le attività di elaborazione automatica e contengono precise indicazioni imperative circa le operazioni da eseguire per giungere alla soluzione del problema.
La fase successiva all’analisi del problema ed alla creazione di una mappa strutturale consiste nello scegliere uno specifico linguaggio informatico e nel “tradurre” ogni istruzione nelle istruzioni del linguaggio.
Il linguaggio prevede:
Es.: N=INPUTBOX(” dammi N”))
La fase di traduzione prende il nome di codifica del programma.
Codificato il programma, lo si inserisce in memoria con dati di prova di cui si conoscono a priori i risultati per poter valutare la correttezza dei risultati secondo l’algoritmo progettato. Questa fase di lavoro con dati di prova prende il nome di test o debugging del programma.
Verificata la correttezza si passa alla fase conclusiva che prende il nome di documentazione della procedura/programma per eventuali futuri aggiustamenti e per memoria dei flussi.
L’unico linguaggio con cui i circuiti dell’elaboratore interagiscono è denominato linguaggio macchina. Una istruzione in linguaggio macchina deve necessariamente essere una stringa di bit: una parte di questi bit indica l’operazione da eseguire (codice operativo), le altre parti localizzano gli operandi nella memoria principale. Il linguaggio macchina è di basso livello o prima generazione – orientati hardware
La programmazione in linguaggio macchina è difficoltosa e lunga: richiede la conoscenza di tutti i codici operativi in binario e la gestione scrupolosa degli indirizzi delle locazioni di memoria. Tale programmazione è ormai superata con l’avvento di “metalinguaggi” o linguaggi simbolici più semplici che sono detti:
Si dice che il linguaggio macchina ed assemblativo sono di basso livello ed appartengono alla prima generazione dei linguaggi. Infatti i linguaggi possono essere suddivisi in quattro generazioni in base al periodo storico in cui sono stati proposti e si possono classificare in tre livelli (basso, alto, altissimo) in base alla maggiore e via via minore somiglianza con il linguaggio macchina. I linguaggi compilativi ed interpretativi sono linguaggi orientati al problema e non alla macchina, consentono al programmatore di usare parole e frasi più vicino al linguaggio naturale, sollevando così il programmatore dalla conoscenza approfondita della macchina.
I linguaggi assemblativi, compilativi ed interpretativi contengono istruzioni che devono, però essere tradotte in linguaggio macchina. Per effettuare tale traduzione si dispone di tre programmi speciali che fanno parte del software di base:
Il programma scritto in uno dei tre linguaggi precedenti prende il nome di programma sorgente, il programma dopo la traduzione in linguaggio macchina prende il nome di programma oggetto.
Come è rappresentato nelle due figure successive.
La freccia indica il programma compilatore che traduce le istruzioni in istruzioni in linguaggio macchina il cui insieme forma il linguaggio “oggetto”.
Effettuata la traduzione in linguaggio macchina il programma è eseguibile e per mandarlo in esecuzione è necessario registrarlo nella memoria principale: a ciò è deputato un altro programma speciale detto caricatore.
Il programma interprete, a differenza degli assemblatori e compilatori, traduce in linguaggio macchina un’istruzione alla volta per cui non viene creato un programma oggetto definitivo e trasportabile e, quindi, ogni volta che si deve eseguirlo bisogna sottoporlo al programma interprete di nuovo. Il processo di interpretazione non crea un codice oggetto per cui per poter rieseguire quel programma è indispensabile disporre dell’interprete sul proprio computer.
Si possono usare anche linguaggi (ad es. Visual Basic) che utilizzano un p-code (pseudocodici). Il compilatore, in questo caso (vedi figura a fianco), traduce il codice sorgente nello pseudocodice intermedio che si può conservare. Tale p-code non è linguaggio macchina e quindi, per poterlo eseguire, deve essere tradotto da parte dell’ interprete (vedi figura). Il vantaggio è la portabilità del p-code su ogni elaboratore dotato di un interprete di tale codice. Questi interpreti sono semplici e molto diffusi.
La programmazione strutturata prevede che il programma sia organizzato in moduli. Ogni modulo (o struttura di controllo) è costituito da un ingresso (one-in), una successione di istruzioni ed una uscita (one-out) da questa struttura (vedi figura a fianco).
Struttura di controllo è un’istruzione o un insieme di istruzioni che controlla la sequenza delle operazioni da applicare per l’esecuzione di un algoritmo.
Obiettivo: successione di istruzioni semplici o strutturate
Delimitatore iniziale
istruzione A;
istruzione B;
………….;
istruzione Z;
Delimitatore finale
Obiettivo: esecuzione condizionale di una specifica istruzione.
Nella figura R indica simbolicamente la condizione ed A indica il modulo da eseguire. Questa struttura controlla in ingresso se una condizione è vera o falsa: se R è vera viene eseguito il modulo A con le istruzioni contenute, se è falsa il controllo delle istruzioni è ceduto al successivo modulo.
In una mappa strutturale si suggerisce di indicare la struttura alternativa ad una via con: “Se R allora A”.
La struttura alternativa ad una via indica la via “alternativa” e non sequenziale, che subisce il flusso delle istruzioni. Nell’ambito delle strutture alternative esistono anche le strutture alternative a due o più vie.
Obiettivo: selezione di una specifica istruzione tra due istruzioni in alternativa.
La struttura a due vie (vedi figura a fianco) ha per obiettivo la selezione di una specifica istruzione tra due istruzioni in alternativa. La struttura, se la condizione R è vera fa eseguire il modulo A di programma, altrimenti, se la condizione è falsa viene eseguito il modulo B. In ogni caso dopo la verifica della condizione e l’esecuzione del modulo A o B il controllo è ceduto al modulo successivo.
In una mappa strutturale si suggerisce di indicare la struttura alternativa a due vie con: “Se R allora A altrimenti B”.
Obiettivo: esecuzione ripetuta di una specifica istruzione (Ciclo a condizione iniziale).
Sono, infine, richiamate altre due strutture di controllo che hanno per obiettivo la ripetizione di un certo numero di istruzioni (ciclo) ma che si differenziano per il controllo della condizione (WHILE e UNTIL).
La struttura WHILE (vedi figura) ha per obiettivo l’ esecuzione ripetuta di una specifica Istruzione. La struttura WHILE è anche detta Ciclo a condizione iniziale nel senso che all’inizio della struttura viene subito verificata la condizione e se la condizione R è falsa l’istruzione A non viene eseguita ma viene eseguita la B. Se R è vera l’istruzione A sarà eseguita ripetutamente finché R resta vera, appena diventa falsa il ciclo si arresta. In una mappa strutturale si suggerisce di indicare WHILE con: “Esegui A sempre che R sia vero” .
Obiettivo: esecuzione ripetuta di una specifica istruzione (Ciclo a condizione finale)
Esiste anche un’altra struttura che prende il nome di struttura con ciclo a condizione finale ed è chiamata struttura iterativa UNTIL (vedi figura).
Anche questa struttura ha per obiettivo l’ esecuzione ripetuta di una specifica Istruzione ma, a differenza della WHILE, il modulo A di programma è eseguito almeno una volta a prescindere dalla verità o falsità della condizione R. In una mappa strutturale può essere dichiarata: “Esegui A fino a che si abbia R vero” o “Ripeti A finché R vero”.
Quando il numero di iterazioni è predefinito, la struttura è detta conteggio-cicli. In una mappa strutturale se la ripetizione di un’istruzione o modulo di istruzioni deve avvenire un numero n prefissato di volte la struttura è indicata con: “Ripeti n volte”.
Per quanto concerne lo sviluppo dei programmi è bene evidenziare che l’algoritmo e il relativo programma può essere frazionato in più moduli qualora sia complesso o vi siano parti ripetitive. In tal caso il programma base che consente il collegamento di tutti i moduli di programma viene chiamato programma principale (main program). Tutti gli altri moduli di programma sono detti sottoprogrammi (subroutine).
I sottoprogrammi hanno l’obiettivo di raggruppare le istruzioni che si intendonorichiamare più volte nell’ambito del programma principale. Ad esempio, se alcune identiche operazioni sono da eseguirsi più volte (la stampa di una intestazione ad ogni cambio foglio), tali operazioni sono raggruppate in un programma che viene attivato ad ogni cambio pagina.
Per eseguire il programma principale scambia i dati con i suoi sottoprogrammi: i dati da scambiare prendono il nome di parametri o argomenti.
Una serie di sottoprogrammi di utilità vengono forniti direttamente a corredo del computer. Sono sottoprogrammi che calcolano funzioni (seno, coseno, integrale, etc.) e si possono utilizzare nell’ambito del programma principale mediante apposite istruzioni.
Gli esempi che seguono si riferiscono sempre ad un foglio elettronico (es. EXCEL) dove vengono registrati i dati di ingresso ed i risultati.
Le celle di un foglio elettronico sono individuate da due indici:
cella(i,j) in VBA cells(i,j)
Tipo:
{ax+by=c
{dx+ey=f
La mappa riportando gli identificatori delle celle diventa:
Il risultato va inserito nella cella A11 (cella(11,1)). Viene usata una struttura while.
Il risultato va inserito nella cella L11. Viene usata una struttura while.
Il coefficiente a è nella cella A1 (cella(1,1)), il coefficiente b nella cella B1 ed il risultato, se a è diverso da zero, va memorizzato nella cella C1. Viene usata una struttura a due vie alternative.
Il coefficiente a è nella cella A1 (cella(1,1)), il coefficiente b nella cella B1, il coefficiente c nella cella C1 ed i risultati, se il delta è maggiore o uguale a zero, va stampato. Viene usata una struttura alternativa a due vie.
1. Introduzione all'informatica
2. Le principali strutture dei dati
4. Hardware: gli elementi fondamentali dell'architettura di un elaboratore elettronico.
5. Le memorie, organizzazione dei dati e interfacce
6. La gestione delle memorie, indicatori di prestazioni e tassonomia dei computer
7. Software di sistema e applicativo
8. Sistemi informatici e modelli di database
9. Le forme normali e l'algebra relazionale
10. Lo sviluppo del software in azienda
12. La trasmissione dei dati e reti