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,