Pascal/Turbo Pascal - Hola, necesito ayuda con un ejercicio de vectores

 
Vista:
sin imagen de perfil

Hola, necesito ayuda con un ejercicio de vectores

Publicado por Juan Manuel (3 intervenciones) el 08/06/2020 02:04:40
Estoy un poco perdido en el tema, alguien me puede ayudar?

Hacer un programa modular que mediante un menú de opciones realice:
1. A pedido del operador:
(a) Cargar un vector A con una cantidad Fil de valores aleatorios enteros, que estén en el intervalo
[0,Max]. Validar que Max sea mayor o igual que 0 y menor o igual a 1000, también validar que Fil
sea mayor que cero y menor o igual a la CANTIDAD_ELEMENTOS (dimensión) del vector A.
(b) Cargar un vector B con valores enteros hasta que el operador no quiera ingresar mas valores. La
cantidad de valores debe estar en la variable entera Col. El intervalo de los valores y validaciones son
idénticas que para el ítem (a)
(c) Insertar todos los valores de B en A en una posición Pos elegida por el usuario, validar que Pos esté
en el intervalo [1,Fil]. Validar que la nueva cantidad de valores del vector A sea mayor que cero y
menor o igual a la CANTIDAD_ELEMENTOS (dimensión) del vector A.
(d) Modificar todos los valores pares de A, sumar 1 (uno) a los valores pares.
2. Mostrar a pedido del operador los valores de A del primer Tercio (1) o segundo Tercio (2) o tercer Tercio
(3) mediante el módulo mostrarVector(A,Fil,Tercio). El parámetro formal Tercio es de tipo entero, si
Tercio=1 el módulo mostrará el primer tercio de A, si Tercio=2 el módulo mostrará el segundo tercio de
A y si Tercio=3 el módulo mostrará el tercer tercio de A.
3. Eliminar todos los valores 0 (cero) de A.
4. Salir.
Nota 1: La variable entera Max es igual para ítem (a) como para el ítem (b) del punto 1.
Nota 2: Validar que el ítem (c) y (d) del punto 1 o el punto 2 o el punto 3 solo deben ejecutarse si antes se
ejecuta el ítem (a) y el ítem (b) del punto 1.
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 08/06/2020 10:40:15
Ayuda con un ejercicio de vectores:

Buf. Problema denso. Esto ya no es de primer curso. ¿o sí?
en cualquier caso, apunto algunas ideas para desarrollar un respuesta. NO es un programa que haga las tareas enunciadas, pero lo he escrito así porque me expreso mejor en Pascalés que en español. Las ideas van en lineas de comentario. Donde pongo un {...} es que espero que te lo trabajes y escribas el código que he explicado inmediatamente antes. Y lo más importane:
RECOMIENDO NO EXAMINAR ESTE CODIGO HASTA HABER LEIDO Y COMPRENDIDO PERFECTAMENTE EL ENUNCIADO DEL EJERCICIO.

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
Program EjercicioDeVectores;
uses crt;
const LIMITE_MAX = 1000;
      CANTIDAD_ELEMENTOS = 500;        // Por poner un valor cualquiera
type TVector = array[1..CANTIDAD_ELEMENTOS] of Integer;
 
var A, B: TVector:
  Max: Integer;  // No me gusta usar el identificador Max como nombre de variable porque ya hay
     // una funcion Max en el modulo math y si se usa este modulo puede haber conflictos.
     // Pero bueno, lo mantengo. Otra cosa. El enunciado no define si Max tiene
     // el mismo valor siempre (creo que si) o es modificable/definible por el operador.
     // Si es lo segundo, usar DefinirMax
  Fil: Integer;
  Pos: Integer;       // Ocurre lo mismo que con Max. Pos tambien es el nombre de una funcion de Pascal
  Opcion: integer;
 
Procedure DefinirMax(var Max: Integer);
begin
     // Hacer un bucle Repeat...Until con una readln que permita introducir
     // el valor de Max hasta que cumpla (Max >= 0) and (Max <= 1000)
  {...}
 end;
 
Procedure DefinirFil;                  // Ver si se decide pasar Fil por parametro
begin
     // Hacer un bucle Repeat...Until con una readln que permita introducir
     // el valor de Fil hasta que cumpla (Fil > 0) and (Fil <= CANTIDAD_ELEMENTOS
  {...}
end;
 
Procedure DefinirPos;                  // Ver si se decide pasar Pos por parametro}
begin
     // Hacer un bucle Repeat...Until con una readln que permita introducir
     // el valor de Pos hasta que cumpla (Pos > 0) and (Pos <= Fil)
     // and (Pos + Col) <= CANTIDAD_ELEMENTOS
  {...}
end;
 
Procedure Modulo1a;
var i: Integer;
begin
  DefinirMax(Max);
  DEfinirFil(Fil);
  for i := 1 to CANTIDAD_ELEMENTOS do  // Inicializar el vector
    A[i] := 0;
 
  if Max > 0 then  // Si Max es cero, A[i] debe estar en [0..0] para todo i entre 1 y Fil
  begin
    randomize;
    for i := 1 to Fil do
      A[i] := Random(Max + 1);
  end;
end;
 
Procedure Modulo1b;
var i: Integer;
begin
  if fil > 0 then                      // Comprobar que se ha definido Fil
  begin
  for i := 1 to CANTIDAD_ELEMENTOS do  // Inicializar el vector
    B[i] := 0;
  Col := 0;                            // Indice del vector B
     // Hacer un bucle Repeat...Until que pida al operador los valores del vector B. En cada ciclo
     // incrementar el indice Col := Col+ 1 e introducir el nuevo valor en B[Col]. El bucle debe
     // parar cuando el operador introduzca un valor incorrecto, por ejemplo -1 o cuando
     // Col >= CANTIDAD_ELEMENTOS. Lo del valor -1 solo se acepta para acabar el bucle si Col > 0
     // porque debe haber al menos 1 dato en el vector B. Esto ya es para matrícula de honor
  {...}
  end;
end;
 
Procedure Modulo1c;
var i: Integer;
begin
  if (Fil > 0) and (Col > 0) then
  begin
    DefinirPos;                        // Pos debe ser en este punto > 0
    for i := 1 to Col do
      A[i + Pos - 1] := B[i];
     // Supongo que en este punto hay que actualizar el valor de Fil al nuevo número de
     // datos en A, aunque el enunciado no lo dice expresamente
    Fil := Pos + Col - 1;
  end,
end;
 
Procedure Modulo1d;
var i: Integer;
begin
     // Supongo que el cero se considera par. La comprobación de si un valor es par o no la podemos
     // hacer por medio de (v mod 2) = 0 o por la funcion estandar Odd (Impar): if not Odd(v)...
  for i := 1 to Fil do
  if not Odd(A[i]) then
     A[i] := A[i] + 1;
end;
 
Procedure ModuloMostrarVector(A: TVector; Fil: Integer; Tercio: Integer);
var i, Desde, Hasta, Cuantos: Integer;
begin
  if (Fil >= 3) and (Tercio >= 1) and (Tercio <= 3) then
  begin
     // Aqui la complicación está en como tratar el caso de que Fil no sea multiplo de 3.
     // En teoría, si he interpretado bien el enunciado, Fil tiene que estar en [1..1000]
     // pero con menos de 3 elementos es difícil definir qué es 1/3. Asumo que Fil >= 3 y
     // si no, visualizar todo A[] entre 1 y Fil.
    Cuantos := Fil div 3
    Desde := (Tercio - 1) * Cuantos + 1;
    if Tercio < 3 then
      Hasta := Desde + Cuantos
    else
      Hasta := Fil;
  end else
  begin
    Desde := 1;
    Hasta := Fil;
  end;
end;
     // Y ahora visualizar en pantalla los valores de A[] entre Desde y Hasta.
    {...}
end;
 
Procedure Modulo3;
var i, j: Integer;
    C: TVector;
begin
     // Este tema no lo tengo muy claro. Supongo que consiste en mover a la izquierda los valores A[i+1]..A[Fil]
     // cuando A[i] = 0 pero no veo qué hay que hacer con los valores entre A[Fil+1] y A[CANTIDAD_ELEMENTOS].
     // En cualquier caso, voy a escribir una posible solucion
  for i := 1 do C[i] := A[i]           //Copiar A sobre C
  j := 0;
  for i := 1 to Fil do                 // Revisar todos los valores
    if C[i] <> 0 then                  // Este vale, copiarlo de vuelta sobre A
	begin
	  j := j + 1;
	  A[j] := C[i];	                   // j nos vale como indice y como contador
	end;
  Fil := j;                            // Y el nuevo número de datos es ...
end;
 
begin                                  // Program EjercicioDeVectores
                                       // Inicializar variables
                                       // Si Max es fijo, poner aqui su valor}
  Max := 0;
                                       // Y si no, pedir al operador que lo ponga
  DefinirMax(Max);
  Fil := 0;
  Pos := 0;
  for i := 1 to CANTIDAD_ELEMENTOS do
  begin
    A[i] := 0;
    B[i] := 0;
  end;
 
     // Hacer un bucle Repeat...Until con una readln que permita introducir
     // el valor de Opcion hasta que cumpla que Opcion = 4 (Terminar). Si
     //  (Opcion >= 1) and (Opcion <= 3) ejecutar el modulo correspondiente
   {...}
end.

Otros temas tales como el pase de las variables como parámetros de los procedimiento,
bucles de petición de respuesta a un menu, visualizacion de los vectores en pantalla,
etc los dejo a criterio de tu expresión artística.
Suerte y que tengas un buen día, Juan Manuel.
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