P_78_E5A-No+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 2: Cada número se lee preguntando previamente si se quiere introducir un número. En la lista de números no puede haber valore repetidos


 * __Versión 2__: **
 * Cada número se lee preguntando previamente si se quiere introducir un número. **
 * En la lista de números no puede haber valore repetidos. **

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

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

FUNCTION fniBuscarElemento (     iNumBuscado: Integer ;                            CONST aiLista:     taiVectores ;                                  iLongitud:   Integer) : Integer ; VAR boEncontrado :   Boolean ; i : Integer ; BEGIN boEncontrado := FALSE ; i := 1 ;

WHILE NOT boEncontrado AND ( i <= iLongitud) DO                 IF  aiLista  [i] = iNumBuscado THEN boEncontrado := TRUE ELSE i := i + 1 ;

IF boEncontrado  THEN fniBuscarElemento := i    ELSE fniBuscarElemento := 0 ; END ;

PROCEDURE LeerNumerosDistintos (VAR   aiLista: taiVectores ;                                VAR  iLongitud: Integer); VAR cResp :   Char ; iNumero : Integer ; BEGIN Write ('Introducir un numero (S/N): ') ; Readln(cResp) ;

WHILE (Upcase (cResp) = 'S') AND (iLongitud < iLONG_FISICA) DO               BEGIN Write ('Numero ', iLongitud:2, ': ') ; Readln(iNumero) ;

IF fniBuscarElemento (iNumero, aiLista, iLongitud)  = 0  THEN BEGIN iLongitud             := iLongitud + 1 ; aiLista [iLongitud] := iNumero ;

IF iLongitud < iLONG_FISICA THEN BEGIN Write ('Introducir otro numero (S/N): ') ; Readln(cResp) ; END END ELSE Writeln ('ERROR: El numero ', iNumero, ' ya esta en la lista') ; 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 ;

LeerNumerosDistintos (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_5B.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