P_78_E5A-Si+puede+haber+valores+distintos

=__**Leer lista de números e intercambiar el mayor y el menor**__=

Crear un programa que genere una lista de, como máximo, 20 números reales, todos ellos distintos. A continuación intercambie la posición de los valores máximo y mínimo.

Nota: Se deben codificar programas para rellenar el array, para mostrarlo, para buscar el valor máximo, para buscar el valor mínimo y para intercambiar el contenido de dos posiciones del array.


 * __Versión 1__: **
 * Se pregunta al inicio cuánto números se van a introducir y seguiamente va pidiendo los números. **
 * En la lista de números si puede haber valores repetidos. **

code format="pascal" PROGRAM P_78_E_5A ; USES Crt ; CONST iLONG_FISICA         = 10  ;

TYPE taiVectores = ARRAY [1 .. iLONG_FISICA] OF Integer ;

PROCEDURE LeerNumeros (VAR   aiLista: taiVectores ;                            iLongitud: Integer); VAR i : Integer ; BEGIN FOR i := 1 TO iLongitud DO       BEGIN Write ('Numero ', i:2, ': ') ; Readln(aiLista[i]) ; END ; END ;

FUNCTION fniBuscarPosicMenor (CONST  aiLista:  taiVectores ;                                    iLongitud:  Integer) : Integer ; VAR i, iPosMenor, iMenor : Integer ; BEGIN iMenor      := aiLista [1] ; iPosMenor := 1 ;

FOR i := 1  TO iLongitud DO

IF aiLista  [i] < iMenor THEN BEGIN iMenor      := aiLista [i] ; iPosMenor := i ; END ;

fniBuscarPosicMenor := iPosMenor END ;

FUNCTION fniBuscarPosicMayor (CONST  aiLista:  taiVectores ;                                    iLongitud:  Integer) : Integer ; VAR i, iPosMayor, iMayor : Integer ; BEGIN iMayor      := aiLista [1] ; iPosMayor := 1 ;

FOR i := 1  TO iLongitud DO

IF aiLista  [i] > iMayor THEN BEGIN iMayor      := aiLista [i] ; iPosMayor := i ; END ;

fniBuscarPosicMayor := iPosMayor END ;

PROCEDURE Intercambiar  (VAR  iNum_1,  iNum_2:  Integer) ; VAR iTemp : Integer ; BEGIN iTemp  :=  iNum_1 ; iNum_1 :=  iNum_2 ; iNum_2 :=  iTemp END ;

PROCEDURE MostrarNumeros (CONST  aiLista: taiVectores;                                iLongitud: Integer) ; VAR i : Integer ; BEGIN FOR i := 1 TO iLongitud DO       Write (aiLista[i]:8) ; Writeln ; END ;

VAR { Variables del programa principal --} aiLista                        : taiVectores ; iLongitud, iPosMenor, iPosMayor : Integer ;

BEGIN {-- Programa principal } iLongitud := 0 ;

Write ('Indica cuantos numeros vas a escribir: ') ; ReadLN (iLongitud) ;

LeerNumeros (aiLista, iLongitud) ;

IF iLongitud > 0 THEN BEGIN Writeln ; WriteLn ('Lista de los numeros leidos: ') ; MostrarNumeros (aiLista, iLongitud) ;

iPosMenor := fniBuscarPosicMenor (aiLista, iLongitud) ; iPosMayor := fniBuscarPosicMayor (aiLista, iLongitud) ;

Intercambiar (aiLista [iPosMenor], aiLista [iPosMayor] ) ;

Writeln ; WriteLn ('Lista de los numeros leidos (intercambiando Menor y Mayor): ') ; MostrarNumeros (aiLista, iLongitud) ; END ELSE WriteLn ('No has escrito ningun número') ;

Writeln ; ReadLn ; END. { FIN de P_74_E_5A.PAS } code

code format="pascal" FUNCTION fniBuscarPosicMenor (CONST  aiLista:  taiVectores ;                                    iLongitud:  Integer) : Integer ;
 * En lugar de las dos funciones :**

FUNCTION fniBuscarPosicMayor (CONST  aiLista:  taiVectores ;                                    iLongitud:  Integer) : Integer ; code

Se podría haber codificado** un único procedimiento **:

code format="pascal" PROCEDURE BuscarPosicMayorMenor (CONST  aiLista: taiVectores ;                                       iLongitud: Integer ;                                 VAR     iPosMenor, iPosMayor : Integer); VAR i, iMenor, iMayor : Integer ; BEGIN iMenor   := aiLista [1] ; iMayor   := aiLista [1] ; iPosMenor := 1 ; iPosMayor := 1 ;

FOR i := 1  TO iLongitud DO              IF  aiLista  [i] < iMenor THEN BEGIN iMenor   := aiLista [i] ; iPosMenor := i                   END ELSE IF aiLista  [i] > iMayor THEN BEGIN iMayor   := aiLista [i] ; iPosMayor := i                   END END ; code