Il 0% ha trovato utile questo documento (0 voti)
10 visualizzazioni43 pagine

Fortran 3

Il documento descrive i diagrammi di flusso e gli enunciati di trasferimento per progettare algoritmi. Vengono introdotti i simboli geometrici usati nei diagrammi di flusso e spiegati gli enunciati di trasferimento incondizionato e condizionato come IF.
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
10 visualizzazioni43 pagine

Fortran 3

Il documento descrive i diagrammi di flusso e gli enunciati di trasferimento per progettare algoritmi. Vengono introdotti i simboli geometrici usati nei diagrammi di flusso e spiegati gli enunciati di trasferimento incondizionato e condizionato come IF.
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 43

DIAGRAMMI DI

FLUSSO
ED
ENUNCIATI DI
TRASFERIMENTO
IL COMPORTAMENTO SEQUENZIALE

Per progettare un programma un po’ più complesso di quelli


semplici visti finora ci occuperemo ora della

PROGETTAZIONE GRAFICA DI UN ALGORITMO

Con algoritmo intendiamo la sequenza di passaggi


successivi con cui si può risolvere un problema

La PROGETTAZIONE GRAFICA DI UN ALGORITMO è eseguita


costruendo il DIAGRAMMA DI FLUSSO (o FLOWCHART)
dell’algoritmo , ossia una sequenza grafica dei passaggi che il
programma deve fare per risolvere il problema
Le forme geometriche nei diagrammi di flusso
Nei diagrammi di flusso le operazioni da fare vengono racchiuse
all’interno di opportune figure geometriche, ognuna delle quali
specifica un certo tipo di operazione. Tali figure sono connesse da
linee orientate che indicano la sequenza delle operazioni

OVALE (inizio programma o arresto)

RETTANGOLO (CALCOLI; ASSEGNAZIONI)

INPUT E OUTPUT
Le forme geometriche nei diagrammi di flusso

ROMBO O LOSANGA
Per decidere come procedere

CERCHIETTO simbolo di continuazione


Le forme geometriche nei diagrammi di flusso

NO SI
I>1000

Poiché la forma a rombo indica sempre una decisione da essa


usciranno sempre almeno due frecce a seconda dell’esito.
Le forme geometriche nei diagrammi di flusso

A B+5

C 𝒅+𝒆

N N+1

La forma rettangolare indica una operazione di calcolo da salvare in


una locazione di memoria e quindi corrisponde ad un enunciato di
assegnazione
L’enunciato di TRASFERIMENTO INCONDIZIONATO
Gli enunciati eseguibili vengono eseguiti ‘normalmente’, ossia in
sequenza dal calcolatore. Tuttavia vi è la possibilità di interrompere
questo comportamento sequenziale mediante alcuni tipi di
istruzione.

Per imporre al calcolatore di interrompere la sequenzialità delle


operazioni si può utilizzare l’enunciato:

GO TO n
Tale enunciato impone al calcolatore di andare alla riga identificata
dalla label n

E’ fondamentale che in riga n vi sia un enunciato ESEGUIBILE


L’enunciato di TRASFERIMENTO INCONDIZIONATO
Progettiamo un codice per stampare i numeri interi positivi. In tal
caso sarà necessario utilizzare l’enunciato di GO TO

I 1 Loop infinito!!!

Per renderlo
completo
occorrerebbe
PRINT I una istruzione che
arresti il calcolo
quando I assume
un valore
predeterminato

I I+1
L’enunciato di TRASFERIMENTO INCONDIZIONATO

I 1

PRINT I

I I+1
L’enunciato di TRASFERIMENTO INCONDIZIONATO
Progettiamo un codice che legge da tastiera l’identificativo di uno
studente (rappresentato da un numero intero) e i suoi tre voti in tre
materie distinte e ne fa la media

READ ID, V1, V2, V3 Loop infinito!!!

Per renderlo
completo
AVER (V1+V2+V3)/3 occorrerebbe
una istruzione
che gli dica di
fermarsi quando
PRINT ID, AVER il numero di
letture effettuate
supera il
numero di
studenti della
classe
L’enunciato di TRASFERIMENTO INCONDIZIONATO

READ ID, V1, V2, V3

AVER (V1+V2+V3)/3

PRINT ID, AVER


L’enunciato di TRASFERIMENTO CONDIZIONATO
Nei precedenti segmenti di programma abbiamo visto che il calcolatore
esegue dei cicli infiniti a causa dell’imposizione derivante dall’enunciato di
TRASFERIMENTO INCONDIZIONATO
Per ovviare a questo problema occorre un enunciato in GRADO DI
PRENDERE DECISIONI del tipo:
SE ACCADE UNA CERTA COSA VAI IN UN PUNTO DEL PROGRAMMA
oppure
SE QUESTA COSA NON ACCADE VAI ALLORA IN UN ALTRO PUNTO DEL
PROGRAMMA
Questo tipo di istruzioni sono state progettate nel linguaggio
FORTRAN e ricadono tra i cosiddetti enunciati di
trasferimento condizionato:

IF(accade qualche cosa) allora


fai queste cose IF
else SI
NO
fai queste altre cose
fine dell’enunciato
CORPO DELL’IF
L’ENUNCIATO IF HA DIVERSE FORME. In tutte queste forme, tuttavia, ciò
che occorre saper descrivere è il cosiddetto CORPO DELL’IF, ossia
l’espressione relazionale che compare nelle parentesi
dell’IF
IF(accade qualche cosa)=IF(espressione relazionale)

Una espressione relazionale è costituita da due espressioni


aritmetiche collegate da un operatore di relazione.
CORPO DELL’IF
Vi sono 6 operatori relazionali che in FORTRAN vengono tradotti nel
seguente modo:

maggiore di .GT. (greater than)


maggiore o eguale a .GE. (greater equal)
minore di .LT. (less than)
minore o eguale a .LE. (less equal)
eguale a .EQ. (equal)
diverso da .NE. (no equal)
Le grandezze che vengono confrontate nel corpo dell’IF sono poste a
sinistra e destra dell’operatore relazionale:
Ad esempio la sintassi dell’enunciato FORTRAN che traduce il
confronto :
se IUM è maggiore di 100
è:
IF(IUM.GT.100)
CORPO DELL’IF
Occorre tener presente due regole per la scrittura di espressioni
relazionali.

1) Non bisogna confrontare espressioni reali con espressioni intere


(avendo i reali e gli interi differenti rappresentazioni interne)
2) A causa dell’errore di arrotondamento bisogna fare attenzione
all’uso dell’operatore .EQ. nel confronto tra numeri reali.

Ad esempio se il corpo dell’IF deve verificare se A è uguale a B è


meglio scrivere:
IF (ABS(A-B).LE.0.0001)
In luogo di
IF(A.EQ.B)

avendo assunto in tal caso una soglia di tolleranza dell’ordine di


1E-4 nel calcolo dei numeri reali
ESERCIZI PROPOSTI
Tradurre le seguenti espressioni relazionali:

I<J

(A+3)≤B

5I=2J

B>A2
(I+3) ≠J

(lnA+sin(B3))≥50
IF LOGICO
Il più utilizzato enunciato di IF è il cosidetto IF logico, la cui sintassi è
la seguente:
IF(espressione relazionale) ENUNCIATO A

Tale enunciato dice al calcolatore che, se


l’espressione relazionale posta tra parentesi è
verificata allora occorre eseguire l’enunciato A
Pertanto il seguente segmento di programma:

IF(espressione relazionale) ENUNCIATO A


ENUNCIATO B

dice al calcolatore di eseguire l’enunciato A se l’espressione


relazionale è vera. Altrimenti di passare all’enunciato successivo
(in tal caso l’enunciato B).
Se l’enunciato A è un enunciato di trasferimento allora è possibile
violare la normale sequenzialità delle operazioni
IF LOGICO
IF(espressione relazionale) GO TO n In tal caso, se l’espressione
ENUNCIATO B relazionale è vera, vengono
…… saltate tutte le righe incluse
n ENUNCIATO C tra l’IF e l’enunciato C (cioè
l’enunciato posto nella riga
identificata dalla label n).
Altrimenti si passa alla riga
Violazione sequenzialità successiva (enunciato B)

IF(espressione relazionale) A=3.0 In tal caso, se l’espressione


ENUNCIATO B relazionale è vera nella
…… locazione di memoria A viene
n ENUNCIATO C posto il reale 3.0 e
successivamente si passa
all’enunciato B. Se
l’espressione relazionale è
falsa in A non viene posto il
reale 3.0 e si passa alla riga
successiva (enunciato B)
IF LOGICO
IF(espressione relazionale) GO TO n
ENUNCIATO B
……
n ENUNCIATO C
NO SI
Espressione
relazionale

Enunciato B

Enunciato C
IF LOGICO
IF(espressione relazionale) A=3.0
ENUNCIATO B
……
n ENUNCIATO C
NO SI
Espressione
relazionale

A=3.0

Enunciato B
IF LOGICO

I <- 1 Riconsideriamo il programma


che stampa i numeri interi
positivi. Per evitare il problema
PRINT I del loop infinito progettiamo un
codice che stampi, ad esempio, i
primi 100 numeri interi positivi.
I<-I+1

SI NO
I≤100 STOP
IF LOGICO

I <- 1

PRINT I

I <- I+1

SI NO
I≤100 STOP
READ NUM IF LOGICO
Riconsideriamo
I <- 1 il programma
che legge
READ ID V1 V2 V3 l’identificativo
degli studenti e
i loro 3 voti e
AVER <- (V1+V2+V3)/3
ne fa la media.
Per evitare il
PRINT ID AVER problema del
loop infinito
progettiamo un
I <- I+1 codice che
legga da input il
SI
NO numero di
I≤NUM STOP studenti della
classe
READ NUM

I <- 1

READ ID V1 V2 V3

AVER <- (V1+V2+V3)/3

PRINT ID AVER

I <- I+1
SI
NO
I≤NUM STOP
IF ARITMETICO
L’IF aritmetico VERIFICA IL SEGNO DI UNA ESPRESSIONE ARITMETICA.
A seconda del segno di tale espressione (POSITIVO, ZERO o NEGATIVO) il
controllo è trasferito in punti diversi
La sintassi dell’IF aritmetico è

IF(espressione) L,M,N

Se il valore dell’espressione è minore di zero il controllo è trasferito


alla riga individuata dalla label L
Se il valore dell’espressione è eguale a zero il controllo è trasferito
alla riga individuata dalla label M
Se il valore dell’espressione è maggiore di zero il controllo è
trasferito alla riga individuata dalla label N

L può essere eguale ad M in modo da trasferire il controllo ad L se


l’espressione è minore o eguale a zero

M può essere eguale ad N in modo da trasferire il controllo ad N se


l’espressione è maggiore o eguale a zero
IF ARITMETICO
L’IF aritmetico IF(espressione) L,M,N
implementa il seguente schema logico:

positivo negativo
N ESPRESSIONE L

zero

M
IF ARITMETICO
IF(espressione) L,M,N
Gli enunciati posti nelle righe L,M,N devono essere eseguibili.

Gli enunciati di IF ARITMETICO E IF LOGICO

SONO EQUIVALENTI

IF(X-2.0)10,20,30
Equivale a
IF(X.LT.2.0)GO TO 10
IF(X.EQ.2.0)GO TO 20
GO TO 30

IF(X-2.0)10,10,20
Equivale a
IF(X.LE.2.0)GO TO 10
GO TO 20
READ A,B,C IF ARITMETICO
Esercizio equazioni
secondo grado
DELTA <- B^2-4AC

positivo NEGATIVO
DELTA PRINT : NO SOLUZIONI
REALI

ZERO

PRINT : DUE
SOLUZIONI REALI
PRINT : DUE COINCIDENTI
SOLUZIONI
REALI DISTINTE
STOP
IF ARITMETICO
GO TO CALCOLATO
La forma più generale dell’enunciato di GO TO calcolato è la
seguente:

GO TO (n1,n2,….,nk),J
dove:

n1, n2, …, nk sono costanti intere positive (senza segno!!!) che


corrispondono ad altrettante labels di enunciati

J è una variabile intera che può assumere valori compresi tra 1 e k

Se J=1 il controllo viene trasferito alla riga di comando identificata


dalla label n1

Se J=2 il controllo viene trasferito alla riga di comando identificata


dalla label n2
…..
….
Se J=k il controllo viene trasferito alla riga di comando identificata
dalla label nk
GO TO CALCOLATO
Consideriamo ad esempio il seguente segmento di programma
L=3
GO TO (15,30,22,76),L
In tal caso l’enunciato viene trasferito alla riga identificata dalla
label 22
L=2
GO TO (15,30,22,76),L
In tal caso l’enunciato viene trasferito alla riga identificata dalla
label 30
L=4
GO TO (15,30,22,76),L
In tal caso l’enunciato viene trasferito alla riga
identificata dalla label 76
L=1
GO TO (15,30,22,76),L
In tal caso l’enunciato viene trasferito alla riga
identificata dalla label 15
PROBLEMI DI ORDINAMENTO: ricerca del massimo
Consideriamo il problema del confronto tra 4 numeri per la ricerca
del più grande tra essi. Siano A,B,C, D tali numeri.
Si può pensare di procedere secondo il diagramma di flusso
riportato in figura

NO SI
A≥B

NO NO
B≥C SI
A≥C SI

NO SI NO SI NO SI NO SI
C≥D B≥D C≥D A≥D

B D D A
D C D C
PROBLEMI DI ORDINAMENTO: ricerca del massimo
Vediamo ora di studiare la complessità dell’algoritmo

NO SI
A≥B

Al primo step utilizziamo 1 IF per confrontare n=2 numeri


AeB

Numero di if= 2**(n-2)=1


PROBLEMI DI ORDINAMENTO: ricerca del massimo

NO NO
B≥C SI
A≥C SI

Al secondo step utilizziamo 2 IF. Complessivamente


stiamo confrontando n=3 numeri A e B e C

Numero di if del secondo step= 2**(n-2)=2


PROBLEMI DI ORDINAMENTO: ricerca del massimo
NO SI NO SI NO SI NO SI
C≥D B≥D C≥D A≥D

Al terzo step confrontiamo n=4 numeri A,B, C e D e


abbiamo bisogno di

Numero di if= 2**(n-2)=4

La complessità del problema aumenta esponenzialmente


con i numeri N da confrontare secondo la regola
2^0+2^1+…..+2^(N-2)
LAR<- A PROBLEMI DI
SI
ORDINAMENTO:
LAR≥B ricerca del
NO massimo
LAR<- B
SI
LAR≥C In tal caso,la complessità del
problema è pari a
NO
LAR<- C (N-1)

SI
LAR≥D
NO
LAR<- D
PRINT LAR
ESERCIZI: costruzione delle flowcharts
Scrivere la flowchart del programma che calcola la somma dei
primi M (con M fornito da input) termini della serie

𝒂𝒏
𝒏

dove: an=1/n
Scrivere la flowchart del programma che calcola il prodotto:

2*(4/3)*(6/5)*(8/7)*……..*(150/149)

Scrivere la flowchart del programma che calcola l’m-mo termine


della successione di Fibonacci (M>3)
Scrivere la flowchart di un programma che legge in un file i voti di
tutti gli N studenti (N da schermo) e determina quanti studenti
hanno un voto superiore a 27
READ M
Flowchartdel
SUM <- 0 programma
che calcola
la somma
I <- 1 dei primi M
(con M
SUM <- SUM+(1/I) fornito da
input)
termini
della serie
I <- I+1
𝒂𝒏
SI 𝒏
I≤M
dove:
NO
an=1/n
PRINT SUM
Flowchartdel
programma
che calcola
la somma
dei primi M
(con M
fornito da
input)
termini
della serie

𝒂𝒏
𝒏

dove:

an=1/n
IDEN <= 1; INUM<=2; PROD<=1

Flowchart del programma che


PROD <- PROD*(INUM/IDEN) calcola il prodotto:

2*(4/3)*(6/5)*(8/7)*...*(150/149)
INUM <- INUM+2

IDEN<- IDEN+2

NO
I DEN≤149

SI

PROD <- PROD*(INUM/IDEN)

PRINT PROD
Flowchart del programma che
calcola il prodotto:

2*(4/3)*(6/5)*(8/7)*...*(150/149)
READ M Scrivere la
flowchart
I1<=1 del
programma
I2<=1 che calcola
L’M-mo
ICONT<=3 termine
della
I3<=I1+I2 successione
di Fibonacci
(M>3)
I1<=I2

I2<=I3

ICONT<=ICONT+1

SI NO
ICONT ≤M PRINT I3
Programma
che
calcola
L’M-mo
termine
della
successio
ne di
Fibonacci
(M>3)

Potrebbero piacerti anche