Salve gente, forse è più semplice di quello che mi sembra, ma vorrei chiedervi se c'è qualcuno che può dirmi come articolare in sburoutine il seguente programma? Cioè per articolare come sottoprogramma la fase di acquisizione dei valori so come fare, ma per la restante parte di codice c'è qualcuno che può farmi vedere come impostare la cosa?

Traccia:

Siano dati in ingresso il riempimento e gli elementi di un array di reali V. Scrivere un programma
che conti quanti elementi negativi e quanti elementi positivi siano presenti nell’array e stampi i
primi 3 elementi maggiori di 1.0 se gli elementi positivi sono più numerosi dei negativi, stampi i
primi 3 elementi minori di 1.0 altrimenti. Si organizzi il programma in sottoprogrammi.


Programma:


PROGRAM es2_1
IMPLICIT NONE

!*** SEZIONE DICHIARATIVA

INTEGER:: i,riemp,maxnum,n,p,j,k
PARAMETER(maxnum=100)
REAL:: vet1,vet2,vet3
DIMENSION vet1(maxnum),vet2(maxnum),vet3(maxnum)
LOGICAL::trovato

!*** SEZIONE ESECUTIVA

! Lettura elementi array

CALL leggi_vet(vet1,maxnum,riemp)

! contiamo gli elementi positivi e negativi

n=0
p=0
DO i=1,riemp
IF(vet1(i)>=0) THEN
p=p+1
ELSE ! il valore è negativo
n=n+1
END IF
END DO

WRITE(*,*)" Il numero di valori positivi e' pari a: ", p
WRITE(*,*)" Il numero di valori negativi e' pari a: ", n

IF(p>n) THEN
j=0
i=1
DO WHILE((i<=riemp).AND.(j<3))
IF(vet1(i)>1.0) THEN
j=j+1
vet2(j)=vet1(i)
END IF
i=i+1
END DO
ELSE ! n>p

k=0
i=1
DO WHILE((i<=riemp).AND.(k<3))
IF(vet1(i)<1.0) THEN
k=k+1
vet3(k)=vet1(i)
END IF
i=i+1
END DO
END IF

! Stampa valori

IF(p>=n) THEN
WRITE(*,*)" I primi tre valori di vet1 maggiori di 1.0 sono: "
WRITE(*,*) (vet2(i), i=1,3)
ELSE
WRITE(*,*)" I primi tre elementi di vet1 minori di 1.0 sono: "
WRITE(*,*) (vet3(i), i=1,3)
END IF

READ(*,*)

END PROGRAM

!************************************************* ********SCRITTURA SUBROUTINES*************************************** ****************************

SUBROUTINE leggi_vet(v,num,riemp)
IMPLICIT NONE

!*** SEZIONE DICHIARATIVA

! parametri formali
INTEGER::num,riemp
REAL:: v
DIMENSION v(num)

! variabili locali
INTEGER:: i

!*** SEZIONE ESECUTIVA

WRITE(*,*)"Inserisci il numero di elementi:"
READ(*,*) riemp

DO i=1,riemp
WRITE(*,*)"Inserisci elemento", i,":"
READ(*,*) v(i)
END DO

END SUBROUTINE

Grazie a chi dedicherà del tempo per cercare di darmi una mano,