<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">El 26 de septiembre de 2016, 12:11, Davidson, Steven <span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hola Facundo,<div class="gmail_extra"><br></div><div class="gmail_extra">- El primer problema que veo en la implementación del algoritmo es en el 2º bucle 'for', que corresponde al paso #2 en el algoritmo, en la función 'sustAtras()'. El algoritmo indica que debes buscar el menor valor de 'p', pero tu implementación busca el valor de 'p' que corresponda al menor elemento de 'm[p][i]'. La implementación debería ser:<br><br>for( p=i; p<n && m[p][i] == 0; p++ ) {}<br><br>if( p == n )  // No se encontró ninguno</div><div class="gmail_extra">  return nullptr;  // => retornamos un puntero nulo como error del algoritmo</div><div class="gmail_extra"><br></div><div class="gmail_extra">// Paso #3</div><div class="gmail_extra">if( p != i )<br>{<br>  // Intercambio de filas: E[p] <-> E[i]<br>}<br><br>- Te falta la implementación del paso #8 antes del #9; esto es,</div><div class="gmail_extra"><br></div><div class="gmail_extra">// Paso #8</div><div class="gmail_extra">resultados[n-1] = m[n-1][n] / m[n-1][n-1];<br><br></div><div class="gmail_extra">- La implementación del paso #9 del algoritmo no es del todo correcta. Tienes que tener cuidado al "traducir" las cotas de los índices del algoritmo a las de C/C++ para que sus índices sean correctos al usarlos con los arrays. Reescribiendo tu código fuente, esto sería:<br><br><div class="gmail_extra">for( int x=n-2; x>=0; x-- )  //Sustitución hacia atrás<br>{<br>  resultados[x] = m[x][n];</div><div class="gmail_extra">  for( int y=x+1; y<n; y++ )</div><div class="gmail_extra">  {<br></div><div class="gmail_extra">    resultados[x] -= m[x][y]*resultados[y];</div><div class="gmail_extra">  }</div><div class="gmail_extra"> </div><div class="gmail_extra">  resultados[x] /= m[x][x];</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">- Por último, esta función debe retornar un puntero a 'float'. Debería ser,</div><div class="gmail_extra"><br></div><div class="gmail_extra">float* sustAtras( float m[10][11], int n )<br>{<br></div><div class="gmail_extra">  ...</div><div class="gmail_extra">  return resultados;</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">Esto implica que tendremos un problema, ya que el array 'resultados' se destruirá al terminar esta función, al ser un array local al aámbito de 'sustAtras()'. Una solución es definir 'resultados' como estático; esto es,</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">float* sustAtras( float m[10][11], int n )<br>{<br></div><div class="gmail_extra">  static float resultados[10];</div><div class="gmail_extra">  ...</div><div class="gmail_extra">  return resultados;</div><div class="gmail_extra">}</div><div><br></div><div>De esta manera, el array no se destruirá hasta que termine el programa.</div><div><br></div><div>Otra solución es pasar el array resultante como parámetro a la función; esto es,</div></div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">bool sustAtras( float resultados[10], float m[10][11], int n )<br>{<br></div><div class="gmail_extra">  ...</div><div class="gmail_extra">  return true;  // Todo ha ido bien</div><div class="gmail_extra">}</div><div><br></div></div><div class="gmail_extra">De esta manera, puedes comunicarte fuera de esta función para indicar si hubo algún error durante el algoritmo, en lugar de enviar mensaje directamente al usuario. Por ejemplo,</div><div class="gmail_extra"><br></div><div class="gmail_extra">int main()<br>{<br>  float resultados[10];</div><div class="gmail_extra">  ...</div><div class="gmail_extra">  if( sustAtras(resultados, matriz, n) )<br>  {</div><div class="gmail_extra">    printf("Resultados:\n");<div class="gmail_extra">    for(int i=0; i<n; i++){</div><div class="gmail_extra">        printf("\tx%d: %f", i+1, resultados[i]);  // Escribiste: resultados+i, lo cual es incorrecto en esta situación y sustituí %d por %f porque queremos 'float'</div><div class="gmail_extra">    }</div>  }<br>  else<br>    printf("El sistema no tiene una unica solucion\n");</div><div class="gmail_extra">  ...</div></div><div class="gmail_extra">}<br><br><br>Espero que esto te ayude.<span class="gmail-HOEnZb"><font color="#888888"><br><br></font></span></div><span class="gmail-HOEnZb"><font color="#888888"><div class="gmail_extra">Steven</div></font></span><div><div class="gmail-h5"><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">2016-09-25 9:30 GMT-04:00 Facundo Curti <span dir="ltr"><<a href="mailto:facu.curti@gmail.com" target="_blank">facu.curti@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hola lista!<div>Estoy haciendo un trabajo para la uni, la cosa es que hice un algoritmo que permite resolver un sistema de ecuaciones lineales con el metodo de sustitucion hacia atras.</div><div><br></div><div>Este es el algoritmo: <a href="https://k61.kn3.net/E/6/D/C/3/4/C05.png" target="_blank">https://k61.kn3.net<wbr>/E/6/D/C/3/4/C05.png</a></div><div><br></div><div>Lamentablemente, el algoritmo esta explicado muy vagamente, o por lo menos ami se me hizo dificil entenderlo.</div><div><br></div><div>De cualquier forma, googleando y tratando de sacar el codigo por mi cuenta, he logrado hacer un algoritmo que aplica gauss correctamente, sin embargo, el codigo me falla al realizar la sustitucion hacia atras. (el ultimo paso).</div><div><br></div><div>Por ej, ingreso la siguiente matriz:</div><div>1  -5  1  7</div><div>10  0  20  6</div><div>5  0  -1  4</div><div><br></div><div>Y luego de aplicar gauss, la matriz resultante es esta:</div><div>1  -5  1  7</div><div>0  25  -6  -31</div><div>0  0  22  -2</div><div><br></div>Lo cual es correcto. Sin embargo, al momento de calcular el valor de las variables, el resultado es este:<br>  x1=4  x2=8  x3=12<br><br>Cuando en realidad debria ser:<br>x3=-2/22<br>x2=-31/25 - (-6*x3)<br>x1= 7/1 - (-5*x2) - (1*x3)<div><br></div><div>Les adjunto el programa en C que hice, y tambien se los dejo en el siguiente link de pastebin:</div><div><a href="http://pastebin.com/ca1Y8dA9" target="_blank">http://pastebin.com/ca1Y8dA9</a><br></div><div><br></div><div>El lugar donde aparentemente esta el error es este:<br><br></div><div><ol style="color:rgb(172,172,172);background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(247,247,247);margin:0px;padding:0px 0px 0px 55px;font-family:consolas,menlo,monaco,"lucida console","liberation mono","dejavu sans mono","bitstream vera sans mono",monospace,serif;font-size:12px"><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial">    <span style="color:gray;font-style:italic">//::::Aca es donde aparentemente esta el error::::</span></div></li><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial">    for<span style="color:rgb(0,100,0)">(</span><span style="color:purple;font-weight:bold">int</span> x=n; x><span style="color:rgb(0,0,139)">0</span>; x--<span style="color:rgb(0,100,0)">)</span><span style="color:rgb(0,100,0)">{</span> <span style="color:gray;font-style:italic">//Sustitucion hacia atras</span></div></li><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial">        resultados<span style="color:rgb(0,100,0)">[</span>x<span style="color:rgb(0,100,0)">]</span>=m<span style="color:rgb(0,100,0)">[</span>x<span style="color:rgb(0,100,0)">]</span><span style="color:rgb(0,100,0)">[</span>n+<span style="color:rgb(0,0,139)">1</span><span style="color:rgb(0,100,0)">]</span>/m<span style="color:rgb(0,100,0)">[</span>x<span style="color:rgb(0,100,0)">]</span><span style="color:rgb(0,100,0)">[</span>x<span style="color:rgb(0,100,0)"><wbr>]</span>; <span style="color:gray;font-style:italic">//Es igual a su B</span></div></li><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial"> </div></li><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial">        for <span style="color:rgb(0,100,0)">(</span><span style="color:purple;font-weight:bold">int</span> y=x+<span style="color:rgb(0,0,139)">1</span>; y<n+<span style="color:rgb(0,0,139)">1</span>; y++<span style="color:rgb(0,100,0)">)</span> <span style="color:rgb(0,100,0)">{</span> <span style="color:gray;font-style:italic">//Le resto a eso las demas variables</span></div></li><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial">            resultados<span style="color:rgb(0,100,0)">[</span>x<span style="color:rgb(0,100,0)">]</span>=resultados<span style="color:rgb(0,100,0)">[</span>x<span style="color:rgb(0,100,0)">]</span>-m<span style="color:rgb(0,100,0)">[</span><wbr>x<span style="color:rgb(0,100,0)">]</span><span style="color:rgb(0,100,0)">[</span>y<span style="color:rgb(0,100,0)">]</span>*resultados<span style="color:rgb(0,100,0)">[</span>y<span style="color:rgb(0,100,0)">]</span>;</div></li><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial">        <span style="color:rgb(0,100,0)">}</span></div></li><li style="background-image:initial;background-position:initial;background-repeat:initial;background-color:rgb(255,255,255)"><div style="padding:0px 8px;vertical-align:top;color:rgb(51,51,51);border-left:1px solid rgb(221,221,221);background-image:initial;background-position:initial;background-repeat:initial"> </div></li><li>    <span style="background-color:rgb(255,255,255);color:rgb(0,100,0)">}</span><br></li></ol><font color="#006400" face="consolas, menlo, monaco, lucida console, liberation mono, dejavu sans mono, bitstream vera sans mono, monospace, serif"><span style="font-size:12px"><br></span></font></div><div><br></div><div>Por ultimo aclarar. Se que hay otros metodos para calcular Gauss (usando pivotes), y que me ahorrarian hacer la sustitucion hacia atras, sin embargo, el ejercicio me pide resolverlo de esta forma. (Luego también tengo que hacer otros algoritmos que si usen pivote).</div><div><br></div><div>Espero puedan ayudarme, perdon por un mensaje tan extenso. Muchas gracias! :)</div></div>
<br></blockquote></div></div></div></div></div>
<br>______________________________<wbr>_________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" rel="noreferrer" target="_blank">http://listas.conclase.net/<wbr>mailman/listinfo/cconclase_<wbr>listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" rel="noreferrer" target="_blank">http://listas.conclase.net/<wbr>index.php?gid=2&mnu=FAQ</a><br></blockquote></div><br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Perdón por haber demorado en responder. Estoy a full con otros trabajos ademas de este, y fui adelantando en los otros.</div><div class="gmail_extra">Ya lo pude arreglar, muchas gracias! :) No quedó exactamente como decias, pero funciona. Tenias razon un esto:</div><div class="gmail_extra"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Tienes que tener cuidado al "traducir" las cotas de los índices del algoritmo a las de C/C++ para que sus índices sean correctos al usarlos con los arrays</blockquote><div class="gmail_extra"><br></div><div class="gmail_extra">Como decías, el error estaba a la hora de traducir los indices. Además, me di cuenta que en ningún momento había colocado un return al codigo xD. De todas formas, como decías, el array luego era destruido.</div><div class="gmail_extra">En definitiva, el codigo me quedó de la siguiente manera (también lo adjunto):</div><div class="gmail_extra"><br></div><div class="gmail_extra"><a href="http://pastebin.com/7nPft0Mu" style="word-wrap:break-word;color:rgb(39,102,190);font-family:arial,verdana,sans-serif;font-size:13.6px;background-color:rgb(245,245,245)">http://pastebin.com/7nPft0Mu</a><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Muchas gracias! :)</div></div>