Showing posts with label maxim. Show all posts
Showing posts with label maxim. Show all posts

Saturday, December 23, 2017

Minim și maxim dintr-un șir

Aflarea minimului și maximului dintr-un șir dar și a pozițiilor lor este o problemă interesantă și trebuie văzută ca un mod de agregare a subprogramelor de alflare a minimului și respectiv a maximului sau se construiește un subprogram de sine-stătător.
Varianta A: Se utilizează subprogramele existente și se agregă prin apelare.

         SUBROUTINE MAXIM (X,N,MAX,IPOZ)
         MIN=X(1)
         IPOZ=1
         DO 10 I=2,N
         IF(MAX.LE.X(I)) GO TO 10
         MAX=X(I)
         IPOZ=I
10     CONTINUE
          RETURN
         END

         SUBROUTINE MINIM (X,N,MIN,IPOZ)
         MIN=X(1)
         IPOZ=1
         DO 10 I=2,N
         IF(MIN.LE.X(I)) GO TO 10
         MIN=X(I)
         IPOZ=I
10     CONTINUE
          RETURN
         END
        SUBROUTINE MINMAX (X,N,MIN,MAX,IPOZMIN, IPOZMAX)
        CALL MINIM (X,N,MIN,IPOZMIN)
        CALL MAXIM (X,N,MAX,IPOZMAX)
         RETURN
         END
Varianta B: se preiau într-o singură subrutină prelucrările celor două surutine deja existente fără să se mai apeleze alte rutine existente în bibliotecă.

         SUBROUTINE MINMAX (X,N,MIN,MAX,IPOZMIN, IPOZMAX)
         MIN=X(1)
         IPOZMIN=1
         MAX=X(1)
         IPOZMAX=1
         DO 10 I=2,N
         IF(MIN.GE.X(I)) GO TO 10
         MIN=X(I)
         IPOZMIN=I
10     CONTINUE
         DO 20 I=2,N
         IF(MAX.LE.X(I)) GO TO 10
         MAX=X(I)
         IPOZMIN=I
20     CONTINUE
         RETURN
         END
Varianta C: se caută o îmbunătățire a variantei B prin regruparea într-o singură secvență repetitivă a tuturor prelucrărilor care au același număr de repetări și mai ales că prelucrările sunt independente.

         SUBROUTINE MINMAX (X,N,MIN,MAX,IPOZMIN, IPOZMAX)
         MIN=X(1)
         IPOZMIN=1
         MAX=X(1)
         IPOZMAX=1
         DO 20 I=2,N
         IF(MIN.GE.X(I)) GO TO 10
         MIN=X(I)
         IPOZMIN=I
10     IF(MAX.LE.X(I)) GO TO 20
         MAX=X(I)
         IPOZMIN=I
20     CONTINUE
         RETURN
         END
Cele prezentate aici sunt doar câteva considerații ii mari a programa în limbajul FORTRAN, în vremurile în care șeful de proiect gestiona la nivel de linie sursă ceea ce se scria și se regăsea în final într-un produs care trebuia să fie reprezentativ pentru centrul de calcul unde se producea acel text sursă, care era livrat sub formă de cartele perforate și era însoțit de imprimantă.

(23 decembrie 2017)

Maxim dintr-un șir

Se consideră șirul x1, x2, x3, ..., xk, ...., xn cu n componente și se pune problema găsirii elementului maxim și a poziției acestuia din șir.
Diagrama sau schema logică după care se scrie subprogramul este:



Ideia de subprogram apare din faptul că alegerea maximului dintr-un șir apare în numeroase probleme și deci de fiecare dată trebuie apelat un subprogram de bibliotecă și nu scrisă secvența respectivă.

         SUBROUTINE MAXIM (X,N,MAX)
         MAX=X(1)
         DO 10 I=2,N
         IF(MAX.LE.X(I)) GO TO 10
         MAX=X(I)
10     CONTINUE
          RETURN
         END
Dacă se dorește și aflarea poziției elementului minim subprogramului i se adaugă în lista de parametrii variabila IPOZ și ceva instrucțiuni de atribuire, după cum urmează:

         SUBROUTINE MAXIM (X,N,MAX,IPOZ)
         MAX=X(1)
         IPOZ=1
         DO 10 I=2,N
         IF(MAX.LE.X(I)) GO TO 10
         MAX=X(I)
         IPOZ=I
10     CONTINUE
          RETURN
         END
Am preferat să nu scriu acest subprogram ca subprogram funcție datorită faptului că îl voi folosi să returneze nu numai valoarea elementului maxim și și poziția pe care acesta se află. În plus, fără modificări semnificative îl modific să stabilesc și valorile maximă și minimă din șir și pozițiile acestora dacă vreau.


(14 decembrie 2017)