Pascal/Turbo Pascal - Hola necesito ayuda con un ejercicio de Vectores.

 
Vista:
Imágen de perfil de Lisa
Val: 2
Ha disminuido su posición en 9 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Hola necesito ayuda con un ejercicio de Vectores.

Publicado por Lisa (1 intervención) el 03/06/2020 01:01:58
Hola, este seria el enunciado:
1. Cargar un vector V con N valores aleatorios enteros, que estén en el intervalo [1,1000] y que sean pares.
Validar que N sea mayor que cero y menor o igual a la cantidad máxima de elementos del vector.
2. Mostrar a pedido del usuario la primera o la segunda mitad del vector.
3. Salir mostrando un mensaje de despedida.

Tengo problemas en el segundo punto, no entiendo como debo diseñar el módulo para que la opción a) muestre la primera mitad de los valores del vector entre 1 y 500; y la segunda opción b) muestre la otra mitad de los valores del vector entre 500 y 1000.

Esto es lo que fui avanzando:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
program Vectores;
uses
   crt;
const
   Max= 1000;
type
   TVector= array[1..1000] of integer;
var
   V: TVector;
   N, S, K, Posicion: integer;
   Op: char;
 
procedure cargarVector(var V: TVector; var N: integer);
var
  i, A: integer;
begin
  i:= 0;
  repeat
  writeln('Ingrese la cantidad de valores a generar:');
  readln(N);
  until (N>0) and (N<=1000);
  randomize;
  for i := 1 to N do
  begin
  repeat
  A:= 2 + random(1000);
  until (A Mod 2= 0) and (A<>0);
  if (A>1) and (A<=1000) then
  V[i] := A;
  end;
end;
 
procedure menu(var Opc: integer);
begin
 writeln('1) - Cargar Vector');
 writeln('2) - Mostrar la Primera o Segunda mitad del Vector');
 writeln('3) - Salir');
 writeln('Elija una opcion');
 readln(Opc);
end;
 
procedure mostrarVector(Vec: TVector; N: integer);
var
   i: integer;
begin
  writeln('Elementos del Vector...');
  for i := 1 to N do
  writeln('Valor[',i,']=', Vec[i]);
end;
 
begin
 N:= 0;
 S:= 3;
 repeat
  clrscr;
  menu(S);
  case S of
   1: cargarVector(V, N);
   2: begin
      mostrarVector(V, N);
      end;
   3: writeln('Hasta luego!');
  else
   writeln('Error en la opcion...');
  end;
  readln;
 until (S=3);
end.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 112
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Hola necesito ayuda con un ejercicio de Vectores.

Publicado por juanba (40 intervenciones) el 03/06/2020 11:09:16
Hola. Estaba yo disfrutando de mi insomnio cuando he visto tu consulta que me ha parecido muy interesante.
He estado estudiando el asunto y tengo algunas dudas:
a) ¿Seguro que se pide que los números del vector sean pares? ¿No será N el que debe ser par? Lo digo porque si es impar no se pueden dividir los valores en dos mitades iguales. En cambio no veo ninguna utilidad a que los valores sean pares.
b) Las dos sublistas que resulten de dividir el vector en dos mitades ¿deben de estar ordenadas? ¿o como xxxx las trajo al mundo? o sea en el orden en que se han creado.
c) Lo mismo para el vector V. ¿debe quedar tal como se ha creado? ¿o se pueden intercambiar valores y , en definitiva, dejarlo ordenado?
d) Las dos mitades deben contener los numeros entre 1 y 499 (la de los bajos) y 500 a 1000 (la de los altos) o bien tienen que tener los N/2 valores más bajos (la de los bajos) y N/2 valores más altos (la de los altos) independientemente de dónde esté el corte. De aqui viene mi primera pregunta acerca de la paridad de N. Un argumento a favor de esto ultimo es que si N = 1 el problema no tendría sentido. A menos que se pueda dividir un único número en dos mitades. Just kidding.
Voy a plantear mis conclusiones suponiendo que la última frase es la que más se aproxima a lo solicitado:
- Cargar N valores, con N par, en un vector y presentar los N/2 más bajos y/o los N/2 más altos tanto ordenados como en el desorden aleatorio en que fueron creados. Los valores pueden estar en el intervalo [1..1000] y (N >= 2) y (N <= 1000)
- Obtener la mediana, o sea el valor que tiene tantos elementos con valor inferior como superior.
- Visitando la página de Wikipedia, para encontrarla se propone ordenar el vector y tomar V[(N+1) / 2] si N es impar o la media aritmética de V[N div 2] y V[(N div 2) + 1] si N es par.
- Para ordenar el vector utilizo una rutina sencillita y no muy eficaz pero que vale para un caso como este en que solo se ejecuta una vez. Quick and dirty. Puedes encontrar ejemplos parecidos en cualquier libro que trate sobre algoritmos de ordenación (Sorting).
- Presentar los datos barriendo el vector y mostrando únicamente los valores que están por debajo o por encima de la mediana según decisión del usuario.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Program Mediana;
 
{Version con N par [2..1000] y V[i] arbitrario en [1..1000]}
{Dos opciones: Preservar el orden original o no}
uses  crt;
 
const
   Max= 1000;
   MedioMax = (Max div 2);
 
type
   TVector= array[1..Max] of integer;
 
var
   V: TVector;
   VAux: TVector;        {Vector auxiliar para preservar el orden de creación}
   N, i, Cuenta: Integer;
   ValorMed: Single;     {Valor de la Mediana}
 
Procedure CargarVector(var V: TVector; var N: integer);
var i: Integer;
begin
  {Igual al actual excepto el chequeo del valor random, que no es necesario}
  repeat
    writeln('Ingrese la cantidad de valores a generar:');
    readln(N);
  until (N >= 2) and ( N <= Max) and ((N mod 2) = 0);      {Comprobar N par}
  randomize;
 
  for i := 1 to N do          {He simplificado un poco la creacion de datos}
    V[i] := 1 + Random(Max);                  {Datos arbitrarios de 1 a Max}
(*    V[i] := 2 + Random(MedioMax - 1) * 2;   {Datos pares  de 2 a Max }*)
 
  for i := N+1 to Max do       {No es necesario, pero me gusta la limpieza}
    V[i] := 0;
end;
 
Procedure CopiarVector(var V: TVector; var VAux: TVector; N: Integer);
begin
  {Por supuesto, no es necesario "gastar" un procedimiento para hacer esto}
  for i := 1 to N do        {O mejor for i := 1 to Max y quitar el parametro N}
    VAux[i] := V[i];
end;
 
Procedure Ordenar(var VAux: TVector; N:Integer);
var i, j, x: Integer;
begin
  for i := 2 to N do
  begin
    j := i;
    while (j > 1) and (VAux[j-1] > VAux[j]) do
    begin                                     {Intercambiar VAux[j] y VAux[j-1]}
      x := VAux[j]; VAux[j] := VAux[j-1]; VAux[j-1] := x;
      j := j - 1;
    end;
  end;
end;
 
Function ObtenerMediana(var VAux: TVector; N: Integer): Single;
begin
  {Por supuesto, no es necesario "gastar" una funcion para hacer esto}
  if (N mod 2) = 1 then
    ObtenerMediana := VAux[(N div 2) + 1]
  else
    ObtenerMediana := (VAux[N div 2] + VAux[(N Div 2) + 1]) / 2.0;
end;

Una vez obtenida la mediana basta con barrer el vector (V para desordenados, VAux para ordenados) seleccionando los datos mayores o menores que la mediana. Aqui va un programa para mostrar las dos listas ordenadas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
begin               {Comprobacion de que los procedientos funcionan}
  clrscr;
  CargarVector(V, N);
  CopiarVector(V, VAux, N);
  Ordenar(VAux, N);
  ValorMed := ObtenerMediana(VAux, N);
  Writeln('Numero de datos: ', N);
  write('Inferiores:     ');
               {Si a partir de aqui usamos V, datos desordenados}
               {Si usamos VAux, datos ordenados}
  for i := 1 to N do
    if (VAux[i] < ValorMed) then
      Write(VAux[i]:4);
 
  writeln;
  writeln;
  write('Mediana: ', ValorMed:8:2);
  writeln; writeln;
  write('Superiores:     ');
  for i := 1 to N do
    if VAux[i] >= ValorMed then
      Write(VAux[i]:4);
  writeln; writeln;
  readln;
end.

Queda al menos 1 problema. Si resulta que hay varios datos iguales a la mediana, lo cual es más probable si N es muy alto, todos ellos se irán a la lista de los superiores y esa lista podrá tener más elementos que la de los inferiores.
Una muestra del resultado:

Mediana1

Espero que mis elucubraciones te sirvan para algo. Releyendo el post me entra otra duda: No sé si me he enterado de cual era el problema.
Suerte y a por ello.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar