Pascal/Turbo Pascal - Ayuda con este problema

   
Vista:

Ayuda con este problema

Publicado por Pedro (7 intervenciones) el 14/01/2016 23:09:20
Buenas amigos, espero se encuentren bien, disculpen quería solicitar un poco de ayuda por aquí ya que estoy un poco atascado en la resolución de un programa, primero lo que quiero hacer:

La idea es insertar una matriz NxN y un vector de la misma longitud que el lado de la matriz, todo perfecto hasta aquí. Pero resulta que luego quiero cambiar a la primera posición (Fila 1), una fila entera si el primer componente de alguna fila es "1" ejemplo: A[i,j] = 1, quiero cambiar toda esa primera a la primera, y la que estaba en la primera cambiarla a la posición donde se encontró esta, ya esa parte también la tengo resuelta, mi problema está en como hacer para cambiar el elemento del vector que también corresponde al elemento de la matriz, pongamos un ejemplo y digamos que la matriz y el vector son los siguientes: (El vector sería la última columna, osea los que están después de las barras)

2 5 -1 0 | -8
3 1 0 4 | 15
2 -1 2 3 | 22
1 3 -2 -2 | 15

Ahora bien, como en una de las filas el primer elemento es "1". entonces se debería mover toda esa fila a la primera posición, y donde se encuentra actualmente la fila que contiene al 1 mover la otra fila quedando de la siguiente forma:

1 3 -2 -2 | 15
3 1 0 4 | 15
2 -1 2 3 | 22
2 5 -1 0 | -8

Mi problema es que el programa que he creado hasta ahora, cambia perfectamente la fila (Que vendría siendo la matriz), pero el elemento después de la barra no lo cambia (El vector), o mejor dicho, lo cambia en algunos casos, por ejemplo cuando pruebo ingresando matrices de 3 elementos lo hace perfectamente, pero cuando ingreso una matriz como la de arriba (4x4), me cambia las filas, y los elementos después de la barra no los cambia.

A continuacion adjunto todo el código que lo que he desarrollado hasta ahora.

El código en sí de lo que creo que creo que está fallando es el procedimiento pasarUno, no se si es que he pasado por referencia alguna variable mal (Los vectores), pero sinceramente no logro dar con la solución después de más de 5 horas intentando. Alguien sabría como podría solucionarlo?

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
Program Menu_base;
uses crt;
Type
    Matriz = array[1..10,1..10] of real;
    Vector = array[1..10] of real;
Var
    X : matriz;
    Y,Z : Vector;
    N ,op : integer;
 
 
procedure Llenar(Var A: Matriz; Var B: Vector; Var  N:integer);
var  i, j,k: integer;
begin
     writeln;writeln;
     write('Indique el tamano del lado de la matriz (NxN) : ');
     readln(N);
     writeln;
     k:=1;
     for i:= 1 to N do
     begin
         for j:= 1 to N do
         begin
             write(' Coeficiente [',i,',',j,']= ');
             readln( A[i,j]);
             if j = N then
             begin
             write(' Termino independiente: ');
             readln(B[k]);
             k:=k+1;
             end;
         end;
     writeln;
     end;
end;
 
procedure Mostrar(Z: Matriz; L: Vector; N: integer);
var i,j: integer;
begin
    writeln; writeln;
    writeln( ' Sistema de ecuaciones ',N:2,' X ',N:2);
    writeln; writeln;
    for i:= 1 to N do
    begin
      for j:= 1 to N do
      write('    ',Z[i,j]:0:0);
      write('    =    ',L[i]:0:0);
      writeln;
    end;
end;
 
procedure pasarUno(var a: Matriz; var vecInds,vecAux: Vector);  {vecInds = Vector que contiene los terminos independientes}
var i,j:integer;                                                {vecAux = Vector auxiliar}
    aux:real;
begin
     {Si alguna Fila tiene como primer elemento "1"
     entonces se pasa esa fila a la primera posición}
     aux:=0;
     for i:=1 to n do
     begin
          if a[i,1]=1 then
          begin
               for j:=1 to n do
               begin
               vecAux[j]:= a[i,j];
               a[i,j]:= a[1,j];
               a[1,j]:=vecAux[j]; {Falta también subir el término independiente}
               {:::::::: AQUÍ abajo comienza el código para subir el término independiente (En el vector) ::::::::}
               aux:=vecInds[1];    {Cuando el lado de la matriz es par el cambio en el vector funciona}
               vecInds[1]:=vecInds[i];   {Pero cuando es impar no lo cambia}
               vecInds[i]:=aux;
               end;
          end;
     end;
end;
 
Begin
     op:= -1;
     While op <> 0 do begin
           ClrScr;
           writeln; writeln;
           writeln( 'Menu Base');
           writeln; writeln;
           writeln( '1. Llenar Matriz ');
           writeln( '2. Mostrar Matriz por filas');
           writeln( '3. Cambiar fila con primer elemento = 1 arriba');
           writeln;
           writeln( '0. Salir');
           writeln;
           write( 'Seleccione (0-3) : ');
 
           readln( op );
 
           case op of
           1 : Llenar(X,Y,N) ;
           2 : Mostrar(X,Y,N);
           3 : pasarUno(X,Y,Z);
           else
               if op <> 0 then writeln ('Opcion invalida ..');
           end;
           if op <> 0 then readln;
     end;
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

Ayuda con este problema

Publicado por Pedro (7 intervenciones) el 15/01/2016 10:58:27
Alguien sabe que puede ocasionar el error?
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

Ayuda con este problema

Publicado por David (139 intervenciones) el 15/01/2016 17:51:06
Te propongo esta solución:

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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
Program Menu_base;
 
uses crt;
 
Type
 
    Matriz = array[1..10,1..10] of real;
 
    Vector = array[1..10] of real;
 
Var
 
    X : matriz;
 
    Y,Z : Vector;
 
    N ,op : integer;
 
 
 
 
 
procedure Llenar(Var A: Matriz; Var B: Vector; Var  N:integer);
 
var  i, j,k: integer;
 
begin
 
     writeln;writeln;
 
     write('Indique el tamano del lado de la matriz (NxN) : ');
 
     readln(N);
 
     writeln;
 
     k:=1;
 
     for i:= 1 to N do
 
     begin
 
         for j:= 1 to N do
 
         begin
 
             write(' Coeficiente [',i,',',j,']= ');
 
             readln( A[i,j]);
 
             if j = N then
 
             begin
 
             write(' Termino independiente: ');
 
             readln(B[k]);
 
             k:=k+1;
 
             end;
 
         end;
 
     writeln;
 
     end;
 
end;
 
 
 
procedure Mostrar(Z: Matriz; L: Vector; N: integer);
 
var i,j: integer;
 
begin
 
    writeln; writeln;
 
    writeln( ' Sistema de ecuaciones ',N:2,' X ',N:2);
 
    writeln; writeln;
 
    for i:= 1 to N do
 
    begin
 
      for j:= 1 to N do
 
      write('    ',Z[i,j]:0:0);
 
      write('    =    ',L[i]:0:0);
 
      writeln;
 
    end;
 
end;
 
 
 
procedure pasarUno(var a: Matriz; var vecInds: vector; var vecAux: Vector);  {vecInds =
 
Vector que contiene los terminos independientes}
 
var i,j:integer;                                                {vecAux = Vector auxiliar}
 
    aux:real;
 
begin
 
     {Si alguna Fila tiene como primer elemento "1"
 
     entonces se pasa esa fila a la primera posición}
 
     aux:=0;
 
     for i:=1 to n do
 
     begin
 
          if a[i,1]=1 then
 
          begin
 
               for j:=1 to n do
 
               begin
 
               vecAux[j]:= a[i,j];
 
               a[i,j]:= a[1,j];
 
               a[1,j]:=vecAux[j]; {Falta también subir el término independiente}
 
               {:::::::: AQUÍ abajo comienza el código para subir el término independiente
 
(En el vector) ::::::::}
 
               aux:=vecInds[1];    {Cuando el lado de la matriz es par el cambio en el
 
vector funciona}
 
               vecInds[1]:=vecInds[i];   {Pero cuando es impar no lo cambia}
 
               vecInds[i]:=aux;
 
               end;
 
          end;
 
     end;
 
end;
 
 
 
Begin
 
     op:= -1;
 
     While op <> 0 do begin
 
           ClrScr;
 
           writeln; writeln;
 
           writeln( 'Menu Base');
 
           writeln; writeln;
 
           writeln( '1. Llenar Matriz ');
 
           writeln( '2. Mostrar Matriz por filas');
 
           writeln( '3. Cambiar fila con primer elemento = 1 arriba');
 
           writeln;
 
           writeln( '0. Salir');
 
           writeln;
 
           write( 'Seleccione (0-3) : ');
 
 
 
           readln( op );
 
 
 
           case op of
 
           1 : Llenar(X,Y,N) ;
 
           2 : Mostrar(X,Y,N);
 
           3 : pasarUno(X,Y,Z);
 
           else
 
               if op <> 0 then writeln ('Opcion invalida ..');
 
           end;
 
           if op <> 0 then readln;
 
     end;
 
end.

En realidad, el error estaba en que tú tenías esto procedure pasarUno(var a: Matriz; var vecInds, vecAux: Vector)
y en realidad deberías tener esto procedure pasarUno(var a: Matriz; var vecInds: vector; var vecAux: Vector) porque si no el segundo vector lo estabas pasando por valor y no por referencia, de ahí el error.
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

Ayuda con este problema

Publicado por Pedro (7 intervenciones) el 15/01/2016 21:35:39
Hey amigo, primero que nada muchas gracias por tu respuesta, sin embargo aún sigo teniendo el mismo error, ya que he modificado el código colocando los parámetros del procedimiento pasarUno que corresponden a los vectores para ser pasados por referencia, y de igual manera al introducir una matriz 4x4 no me intercambia los vectores (De los términos independientes, osea la última columna que viene siendo el vector). He probado con esta matriz:

2 5 -1 0 -8
3 1 0 4 15
2 -1 2 3 22
1 3 -2 -2 -15

En donde la última fila debería pasar a ser la primera, sin embargo cambia la fila sin cambiar la posición del elemento correspondiente a la última columna, y me la deja de la siguiente forma:

1 3 -2 -2 -8
3 1 0 4 15
2 -1 2 3 22
2 5 -1 0 -15

Cuando la forma correcta debería ser:

1 3 -2 -2 -15
3 1 0 4 15
2 -1 2 3 22
2 5 -1 0 -8

Realmente no tengo la menor idea de cual puede ser el problema.
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

Ayuda con este problema

Publicado por David (139 intervenciones) el 16/01/2016 13:06:19
A ver si me aclaro: ¿pretendes cambiar toda la fila o sólo el término independiente?
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

Ayuda con este problema

Publicado por Pedro (7 intervenciones) el 16/01/2016 18:37:59
La fila y el termino independiente que corresponde a la fila, sin embargo ya he podido hacerlo. Gracias por el apoyo!
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