Showing posts with label minim. Show all posts
Showing posts with label minim. 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)

Thursday, December 14, 2017

Aflarea minimului dintre trei elemente

Ani în șir, la disciplina Limbaje de programare am dat la examen problema: să se scrie programul FORTRAN pentru aflarea elementului minim dintre elementele a, b și c, date pe cartele și să se afișeze rezultatul. Nu m-am plictisit niciodată, pentru că din 20 de persoane foarte rare au fost cazurile în care aveam și schema logică și programul așa cum trebuiau ele să fie și nu niște caricaturi de tot râsul, deși cei cărora le ceream acest mic detaliu se dădeau mari programatori.
Schema logică esteprezentată în partea dreaptă, iar programul FORTRAN IV este următorul:
C         PROGRAM AFLARE ELEMENT MINIM
C         DINTRE 3 ELEMENTE INTREGI CITITE DE PE
C         CARTELE
            INTEGER A,B,C,MIN
            READ(5,10)A,B,C
10        FORMAT(I5,I5,I5)
            MIN=A
            IF(MIN.GT.B) MIN=B
            IF(MIN.GT.C) MIN=C
            WRITE(6,20) MIN
20         FORMAT(13HMINIMUL ESTE ,I5)
             STOP
             END
O altă variantă de a realiza acest program fără a folosi IF() logic este aceea în care se utilizează evaluarea de expresii aritmetice, ceea ce conduce la construcția un pic mai complicată ce urmează:
C         PROGRAM AFLARE ELEMENT MINIM
C         DINTRE 3 ELEMENTE INTREGI CITITE DE PE
C         CARTELE
            INTEGER A,B,C,MIN
            READ(5,10)A,B,C
10        FORMAT(I5,I5,I5)
            MIN=A
            IF(MIN-B) 30,30,20
20        MIN=B
30        IF(MIN-C) 50,50,40
40        MIN=C
50        WRITE(6,60) MIN
60         FORMAT(13HMINIMUL ESTE ,I5)
             STOP
             END

Acest al doilea program nu prea arată bine căci conține prea multe instrucțiuni și acea pânză de păianjen de etichete, care sunt destul de greu de urmărit și mai ales de a li se asigura să fie în progresie aritmetică cu primul termen 10 și cu rație tot 10.
Aflarea minimului dintre trei elemente este un program fortran banal, dar care dă de furcă la foarte mulți programatori care știu să rezolve lucruri complicate, dar se împiedică în fleacuri.



(14 decembrie 2017)