Pascal/Turbo Pascal - Hola podrían ayudarme con este ejercicio de Vectores.

 
Vista:
sin imagen de perfil
Val: 4
Ha disminuido su posición en 30 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Hola podrían ayudarme con este ejercicio de Vectores.

Publicado por Belen (1 intervención) el 09/06/2020 05:12:10
1. A pedido del usuario:
1. 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 100, también validar que Fil
sea mayor que cero y menor o igual a Max.
2. 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 1.
3. 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 Max.
4. Mostrar el vector A modificado.
5. Salir.

Hice todos los puntos mencionados, pero en el punto 3 necesito que no se borren las ultimas posiciones y valores del vector A.
En el módulo 3 al ingresar los elementos del vector B en una posición seleccionada por el usuario en el vector A, entra el vector B completo en la posición, pero me borra los valores del vector A que estaban a partir de esa posición.
Necesito que funcione de la misma forma como en la siguiente imagen.
Por ejemplo cargo el Vector A (1,0,3,18,5) y el Vector B (43,12,23,9,55), elijo la posición 4 del Vector A para insertar el Vector B y debería quedar el Vector A (1,0,3,43,12,23,9,55,18,5).
Pero con el módulo que hice me queda el Vector A (1,0,3,43,12,23,9,55) y esto está mal.

Imagen

Este es el programa que hice:

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
program Vectores;
uses
   crt;
const
   Max= 100;
type
   TVector= array[1..Max] of integer;
var
   A, B: TVector;
   Fil, Col, S, Posicion: integer;
   resp1: char;
 
Procedure CargarVectorA(var A: TVector; var Fil: integer);
var
   Max, i:integer;
begin
  repeat
    writeln('Ingrese la cantidad maxima del intervalo [1,Max]');
    readln(Max);
  until (Max >= 0) and ( Max <= 100);
  begin
  repeat
    writeln('Ingrese la cantidad de valores a generar:');
    readln(Fil);
  until (Fil > 0) and (Fil <= Max);
  randomize;
  for i := 1 to Fil do
    A[i] := 1 + Random(Max);
  for i := Fil+1 to Max do
    A[i] := 0;
  end;
end;
 
Procedure CargarVectorB(var B: TVector; var Col: integer);
var
   Max, i, numero:integer;
begin
i:= 0;
resp1:= 'n';
  repeat
    writeln('Ingrese la cantidad maxima del intervalo [1,Max]');
    readln(Max);
  until (Max >= 0) and ( Max <= 100);
  repeat
     repeat
     write('Ingrese un numero: ');
     readln(numero);
     until (numero >= 0) and (numero <= Max);
       begin
          i := i + 1;
          B[i] := numero;
       end;
    writeln('Quiere ingresar mas valores? (s/n)');
    readln(resp1);
    until resp1='n';
  Col := i;
end;
 
procedure insertar(var A: TVector; var B: TVector; var Fil: integer; var Col: integer; Pos: integer);
var
   i: Integer;
begin
  if (Fil > 0) and (Col > 0) then
  begin
  if (Pos > 0) then
   for i := 1 to Col do
      A[i + Pos - 1] := B[i];
    Fil := Pos + Col - 1;
  end;
end;
 
procedure mostrarVector1(A: TVector; Fil: integer);
var
   i: integer;
begin
  writeln('Elementos del Vector A:');
  for i := 1 to Fil do
  writeln('Valor[',i,']=', A[i]);
end;
 
procedure menu(var Opc: integer);
begin
 writeln('1) - Cargar Vector A');
 writeln('2) - Cargar Vector B');
 writeln('3) - Insertar los valores del Vector B en el Vector A');
 writeln('4) - Mostrar Vector A');
 writeln('5) - Salir');
 writeln('Elija una opcion');
 readln(Opc);
end;
 
begin
 S:= 5;
 repeat
  clrscr;
  menu(S);
  case S of
   1: begin
      cargarVectorA(A, Fil);
      end;
   2: begin
      cargarVectorB(B, Col);
      end;
   3: begin
      //fixme validar la posición
      repeat
      writeln('Ingrese la posicion: ');
      readln(Posicion);
      until (Posicion <= Max);
      insertar(A, B, Fil, Col, Posicion);
      end;
   4: mostrarVector1(A, Fil);
   5: begin
      writeln('Hasta luego!');
   end
  else
   writeln('Error en la opcion...');
  end;
  readln;
 until (S=5);
end.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
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 podrían ayudarme con este ejercicio de Vectores.

Publicado por juanba (40 intervenciones) el 09/06/2020 11:45:59
Creo que ha sido mi error al no interpretar correctamente el significado de "Insertar" en mi respuesta al post de Jose Manuel. Gracias a tu esquema veo que es necesario abrir el espacio correspondiente a los numeros que se van a insertar en el vector A. Para ello se desplazan a la derecha todos los valores de A desde Pos en adelante. Hay que tener cuidado de empezar en el último valor y progresar hacia la izquierda en este desplazamiento. Si se progresa de izquierda a derecha se puede encontrar con que los valores que queremos desplazar han sido sobreescritos por un desplazamiento anterior. Un ejempo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  // Suponemos que en B solo hay dos valores: B= 2 y que Fil= 10 y Pos = 5;
  for i := Pos to Fil do
    A[i+2] := A[i] ;
 
// La secuencia de operaciones en el bucle for será
// A[7] <-- A[5]
// A[8] <-- A[6]
// A[9] <-- A[7] Pero A[7] en realidad contiene A[5] después de la primera operacion!
// Y el valor original de A[7] se ha perdido!
// Solucion: Viajar en sentido contrario
  for i := Fil downto Pos do
    A[i+Col] := A[i];
// Y las operaciones son:
// A[12]  <-- A[10]
// A[11]  <-- A[9]
.....
// A[8] <-- A[6]
// A[7] <-- A[5]
// Todos los datos se han ido guardando en posiciones mas altas del vector antes de ser cubiertos por los siguientes

La rutina de Insertar podria quedar asi:

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
// En las declaraciones del programa cambiar const Max= 100 por const LIMITE=100;
// y llevar Max a la seccion var
 
procedure insertar(var A: TVector; var B: TVector; var Fil: integer; var Col: integer; Pos: integer);
var
   i: Integer;
begin
  if (Fil > 0) and (Col > 0)  and (Pos <= Fil) then
  begin
    If (Fil + Col) > Max then      // Comprobar que hay espacio para la insercion
    begin
      writeln('Houston, tenemos un problema');
      readln;
    end
    else
    begin                          // Hay espacio suficiente
      if (Pos > 0) then
      begin                        // Mover Col puestos a la derecha desde
                                   // el punto de insercion. EMPEZANDO POR EL FINAL
        for i := Fil downto Pos  do
          A[i+Col] := A[i];
                                  // Y sobreescribir B en A a partir de Pos
        for i := 1 to Col do
          A[i + Pos - 1] := B[i];
 
        Fil := Fil + Col;
      end;
    end;
  end;
end;

Esta vez la he comprobado (gracias a que tenía tu programa compelto) y me parece que funciona. Incluso se puede repetir varias veces la operación 3. Insertar y va insertando B sobre A alegremente.

Algunos comentarios bienintencionados:
a) El identificador Max tiene dos significados diferentes a lo largo del programa. Es tanto el limite de la longitud efectiva de los vectores como el limite superior de los valores de cada vector. Por ello hay que andar con mucho cuidado al manejar este identificador. De hecho yo quitaria la declaracion

1
const Max=100,

y pondría en su lugar

1
const LIMITE=100,

Llevando Max a la sección var:

1
2
3
var
   A, B: TVector;
   Fil, Col, S, Posicion, Max: integer;

De este modo será visible en todo el programa. Además habría que quitarlo de la declaracion en los procedimientos CargarVectorA y CargarVectorB para que estos usen la variable global. Al menos yo entiendo que hay un unico Max para los dos vectores. Caso de no ser así podriamos tener los valores limitados p.ej. a 10 en el vector A y a 99 en el vector B y al hacer la insercion (opcion 3 del menu) nos entrarian en A valores no permitidos.
Por lo tanto asumo que Max es un único valor para todo el programa y es el que se define en CargarVectorA. No es necesario ni conveniente volver a pedirlo en CargarVectorB.

b) El enunciado dice que Max tiene que cumplir (Max >= 0) and (Max <= LIMITE) y que (Fil > 0) and (Fil <= Max). Bien, pues prueba a ponerle un cero a Max en la opcion 1 del menu (CargarVectorA) y verás que alegría. ¿que valor se le puede dar a Fil que sea > 0 y <= 0 al mismo tiempo? En mi teclado no encuentro ninguno.

c) Como he dicho, a CargarVectorB ahora le sobra la lectura de Max, pero se debe comprobar que el numero de valores introducidos cumpla (Col <= Max). Por lo tanto la salida del bucle podría ser algo asi:

1
2
3
4
5
6
if (i < Max) then
      writeln('Quiere ingresar mas valores? (s/n)')
    else
      writetln('Ya ha terminado de llenar el vector ¡Que bien!');
    readln(resp1);
    until (resp1='n') or (resp1='N') or (i >= Max);

Por cierto, aqui se ve la ambivalencia del identificador Max: en estas lineas se usa como limite del numero de elementos y unas pocas lineas mas arriba se usa como limite del valor de los elementos. Esto es legal, pero confuso.
De propina atrapamos la pulsacion de la 'N' mayuscula además de la 'n' minuscula.

d) Una pequeña mejora en este procedimiento del vector B: Cambiar
write('Ingrese un numero: '); por
write('Ingrese el valor del item ', i+1, ' del vector B: ');

e) Otra mejora es poner un mensaje de fallo si no se cumple (numero >= 0) and (numero <= Max)

f) En el punto 3 del menu principal conviene limitar la Posicion a Fil. Con Posicion mayor que Fil no habría una insercion dentro de A.

Espero que estos apuntes te ayuden y esperemos que mi proxima intervencion no induzca a error.
Suerte.
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

Hola podrían ayudarme con este ejercicio de Vectores.

Publicado por Martin Mosna (1 intervención) el 31/08/2023 19:29:52
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
program vectores;
 
uses CRT, DOS, SYSUTILS;
 
const max = 100;
var
	va : array[1..max] of integer;
	vb : array [1..max] of integer;
	fil, i, acum, z : integer;
	x : char;
BEGIN
	for i:=1 to max do
	begin
		va[i]:=0;
		vb[i]:=0;
	end;
 
	writeln('Ingrese valor del vector A: ');
	readln(fil);
	if(fil>0) and (fil<=100)then
	begin
		if(max <= 100) and (max >= 0) then
		begin
			for i:= 1 to fil do
			begin
				writeln('ingrese valor: ');
				readln(va[i]);
			end;
		end
	end
	else
	begin
		writeln('el vector no cumple las condiciones');
	end;
 
 
	i:=1;
	acum:=0;
	writeln('quiere agregar un elemento al vector B? "s/n"  ');
	readln(x);
	while (x = 's') do
	begin
			writeln('ingrese un valor: ');
			readln(vb[i]);
			i:=i+1;
			acum:= acum +1;
			writeln('quiere agregar un elemento al vector B? "s/n"  ');
			readln(x);
	end;
 
	if (x='n') then
		begin
			writeln('la cantidad de elementos que tiene el vector B es: ');
			writeln(acum);
		end;
 
 
	for i:=1 to acum do
	begin
		writeln('ingrese en que posicion del vector A quiere guardar el numero: ', vb[i], ' del vector B');
		readln(z);
		if (z < max) and (z > 0) then
		begin
				va[z]:=vb[i];
		end;
	end;
 
	for i:=1 to max do
	begin
	writeln('estos valores contiene ahora el vector A: ');
	write(va[i]);
	end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar