[ Foro de Pascal ]
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
Por cierto insertar y mostrar, estan hechos no los pongo para acortar codigo.
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.
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.....
Lo encontre por ahi , no lo hice yo ...
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".
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.
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.
limitesup se me quedo ahi pero sobra
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.)