[ Foro de Pascal ]

Maximo indice en array

27-Nov-2014 02:52
Alberto Rilo Mosteiro
9 Respuestas

Plantee e implemente un programa en PASCAL que, mediante búsqueda
secuencial, permita encontrar el menor y el mayor índice de donde se encuentra
un valor dado X en un array de números entero

Tengo este codigo de busqueda secuencial para un numero , que devuelve la posicion en la que se encuentra:


 CONST
 TAM=10;
type

tEstructura:array[1..TAM] of integer;
tPos:integer;

var a:tEstructura;
function BuscarDato(estructura:testructura;c:integer):tPos
 var i:integer;
BEGIN
 BuscarDato:=0;
 i:=1;
while (i<TAM) AND (d<>estructura[i]) DO
  i:=i+1;
IF i<= TAM 
BuscarDato:=i;
end;


Pero lo que devuelve, es la posicion del dato, y valdria si el dato no estuviese mas veces repetido, pero como saber eso? y si estuviese repetido como escribir(saber cual es el mayor de dos indices es obvio) cual es el mayor indice y cual el menor en el que aparece? Todo esto siempre en una array unidimensional



27-Nov-2014 03:12
Alberto Rilo Mosteiro

Por cierto insertar y mostrar, estan hechos  no los pongo para acortar codigo.


27-Nov-2014 09:55
Nacho Cabanes (+84)

Lo habitual es que te interese el máximo valor, no la posición en que aparece, porque, como bien has dicho, la posición puede no ser única.

Si quieres saber la primera y la última posición (algo que me parece poco útil), deberías usar un "for" en vez de un "while", para comprobar todos los valores en vez de detenerte en el primero. Además, deberás llevar un segundo índice, que sólo actualices la primera vez. Podría ser algo como


primeraPos := -1;
for ...
  if estructura[i] = dato and primeraPos = -1 then primeraPos := i;


Aun así, revisa tu código, porque pasas un parámetro "c", pero dentro la función comparas con un valor "d", así que no compilará o se comportará de forma incorrecta.


28-Nov-2014 04:29
Alberto Rilo Mosteiro



PROGRAM ejercicio8(input,output);
(*Programa que permita introducir varios elementos en un array y que mediante una funcion permita buscar el primer numero y el ultimo y determine en que puesto se encuentra.*)


TYPE
    TAarray = ARRAY[1..10] OF integer;
VAR
    Aarray:TAarray;
    u,p,a,numero:integer;
(********************************************************************************************************************************************************************************)
PROCEDURE leer;
VAR
   i:integer;
BEGIN
     i:=0;
     writeln('Introduzca los terminos separados por espacios');
     FOR i:=1 TO 10 DO
     read(Aarray[i]);                                                                                                                                                         1 2 3


END;
(************************************************************************************************************************************************************************************)
PROCEDURE buscar;
VAR
   I,serepite,repeticiones:integer;
BEGIN
     write('Que numero desea buscar?:');
     read(numero);
     repeticiones:=0;
     serepite:=0;
     FOR I:=1 TO 10 DO
         BEGIN
         IF numero = Aarray[I] THEN serepite:=1 ELSE serepite:=0;
          repeticiones:= repeticiones+serepite;
          END;
          writeln('El numero ',numero:2,' se repite ',repeticiones:2,' veces.');
END;
(**************************************************************************************************************************************************************************************)
 FUNCTION primero(numero:integer):integer;
VAR
   I:integer;
BEGIN
     FOR I:=10 DOWNTO 1 DO
     IF numero = Aarray[I] THEN primero:=I;


END;
(**************************************************************************************************************************************************************************************)
FUNCTION ultimo(numero:integer):integer;
VAR
   I:integer;
BEGIN
     FOR I:=1 TO 10 DO
     IF numero = Aarray[I] THEN ultimo:=I;


END;
(*******************************************************************************************************************************************************************************************)
BEGIN
     leer;
     REPEAT
     buscar;
     u:=ultimo(numero);
     p:=primero(numero);
     writeln('El numero ',numero:2,' aparece por primera vez en la posicion',p:2,' y por ultima vez en la posicion numero ',u:2);
     write('Desea hacer otra busqueda? Si[1] No[0]');
     read(a);
     UNTIL a = 0;


END.


Me da error en leer.....


28-Nov-2014 05:06
Alberto Rilo Mosteiro

Lo encontre por ahi , no lo hice yo ...


28-Nov-2014 11:58
Nacho Cabanes (+84)

Los mensajes de error son tus amigos. No están para que te enfades con ellos, sino para que los leas y sepas qué no está hecho de forma correcta.

Si miras dónde te da el aviso de que algo no está bien, verás que sobra un "1 2 3" dentro de "leer".


29-Nov-2014 03:25
Luis Torres (+18)

Cuando se leen 10 números el programa corre de maravilla, el problema surge cuando la cantidad de números a introducir es menor de 10.

Saludos.


29-Nov-2014 20:31
Alberto Rilo Mosteiro

El compilador que tengo no es bastante lioso con los errores y por desgracia en este cuatrimestre es el que tengo que usar, da error en una linea cuando a veces el error esta una o dos linea mas arriba. En cuanto pueda pasare al editor de texto  Notepad++  y compilar en el terminal.
Por cierto , el problema con numeros menores que 10 ya esta resuelto:


PROGRAM ejercicio8(input,output);
(*Programa que permita introducir varios elementos en un array y que mediante una funcion permita buscar el primer numero y el ultimo y determine en que puesto se encuentra.*)


TYPE
    TAarray = ARRAY[1..10] OF integer;
VAR
    Aarray:TAarray;
    u,p,a,numero:integer;
(********************************************************************************************************************************************************************************)
PROCEDURE leer;
VAR
   i:integer; limitesup:integer;
BEGIN
     i:=0;
     writeln('Introduzca los terminos separados por espacios');                                                                                                                                                         
      while not(EOLN) do
       begin
        i:=i+1;
        read(Aarray[i]);
        end;
        readln;
        
    
        
END;      
      


(************************************************************************************************************************************************************************************)
PROCEDURE buscar;
VAR
   I,serepite,repeticiones:integer;
BEGIN
     write('Que numero desea buscar?:');
     read(numero);
     repeticiones:=0;
     serepite:=0;
     FOR I:=1 TO 10 DO
         BEGIN
         IF numero = Aarray[I] THEN serepite:=1 ELSE serepite:=0;
          repeticiones:= repeticiones+serepite; 
          END;
          writeln('El numero ',numero:2,' se repite ',repeticiones:2,' veces.');
END;
(**************************************************************************************************************************************************************************************)
 FUNCTION primero(numero:integer):integer;
VAR
   I:integer;
BEGIN
     FOR I:=10 DOWNTO 1 DO
     IF numero = Aarray[I] THEN primero:=I;


END;
(**************************************************************************************************************************************************************************************)
FUNCTION ultimo(numero:integer):integer;
VAR
   I:integer;
BEGIN
     FOR I:=1 TO 10 DO
     IF numero = Aarray[I] THEN ultimo:=I;


END;
(*******************************************************************************************************************************************************************************************)
BEGIN
     leer;
     REPEAT
     buscar;
     u:=ultimo(numero);
     p:=primero(numero);
     writeln('El numero ',numero:2,' aparece por primera vez en la posicion',p:2,' y por ultima vez en la posicion numero ',u:2);
     write('Desea hacer otra busqueda? Si[1] No[0]');
     read(a);
     UNTIL a = 0;


END.





29-Nov-2014 20:33
Alberto Rilo Mosteiro

limitesup se me quedo ahi pero sobra


30-Nov-2014 17:27
Nacho Cabanes (+84)

Sólo se comporta bien con un máximo de 10 datos porque tu array es de 10 datos. Amplía el tamaño del array si quieres que se comporte bien con más datos.

¿De verdad te piden que lo hagas así, con variables globales?






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)