domingo, 12 de junio de 2011

Deitel_Java_5.26 (Eliminar la Instrucción Break de un Programa en Java)

_____________________________________________________________________________________
5.26 Una critica de las instrucciones break y continue es que ninguna es estructurada. En realidad, estas instrucciones pueden reemplazarse en todo momento  por instrucciones estructuradas, aunque hacerlo podría ser inadecuado. Describa, en general, cómo eliminaría las instrucciones break de un ciclo en un programa, para reemplazarlas con alguna de las instrucciones estructuradas equivalentes. [Sugerencia: la instrucción break se sale de un ciclo desde el cuerpo de éste.  La otra forma de salir es que falle la prueba de continuación de ciclo. Considere utilizar en la prueba de continuación de ciclo una segunda prueba que indique una "salida anticipada debido a una condición de 'interrupción'". Use la técnica que desarrolló aquí para eliminar la instrucción  break de la aplicación de la figura 5.12.
_____________________________________________________________________________________
SOLUCIÓN:
Una alternativa a break es usar una condición que sirva de centinela para poder salir del ciclo for cuando esto ocurra. En el siguiente código se muestra esto con el auxilio de una variable llamada precisamente centinela.

Cuando el programa se ejecuta se imprime

Salio del ciclo en cuenta = 6

Debido a que el incremento a la variable cuenta se realiza de todas maneras al final del ciclo, antes de verificar la condición centinela. Se puede cambiar el valor de cuenta restandole 1 fuera de for. Sin embargo este es un programa muy simple. En el caso en el que después de que se cumple la condición centinela hay instrucciones a realizar en el cuerpo de for deberán encerrarse en un if que verifique que la condición centinela se ha alcanzado.


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*                                                         *
* Este programa usa una instruccion if para eliminar una  *
* instruccion break.                                      *
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

public class Deitel_5_26

{      // Abre Deitel_5_26

public static void main(String args[])
{      // Abre main
int cuenta;
int centinela = 0;

for ( cuenta = 1; cuenta <= 10 && 0 == centinela; cuenta++ )
{   // Abre for
if ( 5 == cuenta )  
centinela = 1;
}   // Cierra for 

System.out.printf("\nSalio de ciclo en cuenta = %d\n", cuenta );

}      // Cierra main

}      // Cierra Deitel_5_26

Deitel_Java_5.25 (Imprimir un Rombo de Tamaño Arbitrario)

5.24 Modifique la aplicación que escribió en el ejercicio 5.24, para que lea un número impar en el rango de 1 a 19, de manera que especifique el número de filas del rombo. Su programa deberá entonces mostrar un rombo del tamaño apropiado.

Este programa es en esencia el mismo que Deitel_5.24. Sólo se ha añadido un pequeño ciclo while que recibe el número impar, el cual no se ha limitado a estar entre 1 y 19, sino a cualquier impar. Depende el usuario introducir un numero que pueda ser desplegado en su pantalla.
Una salida es la que sigue:

         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *

El siguiente código debe guardarse como UsaDeitel_5_25.java
  public class UsaDeitel_5_24

  {       // Abre clase publica UsaDeitel_5_24
  
  public static void main(String args[])
  {     // Abre main
  
  Deitel_5_24 miObjeto = new Deitel_5_24();

  // Se llama metodo Imprime()

  miObjeto.Imprime();

  }     // Cierra main
  }       // Cierra clase publica UsaDeitel_5_24




El siguiente código debe guardarse como Deitel_5_25.java 

  
   import java.util.Scanner;


   public class Deitel_5_24

   {         // Abre clase Deitel_5_24

   private int Tamano = 9;

     
   // la varibale Tamano controla la diagonal del rombo


       // Se define el metodo Imprime
   public void Imprime()
   {     // Abre metodo Imprime
   
   Scanner entrada = new Scanner(System.in);
   int x = 4;  // 4 no tiene ningun sentido especial
               // se puede usar cualquier numero par

   System.out.print("\nEste programa despliega un rombo en la pantalla.");

   while ( x % 2 == 0 )
   {   // Abre while

   System.out.println("\nPor favor introduzca un entero impar que definira su dimension: ");
   x = entrada.nextInt();

   }     // Cierra while

   Tamano = x;

   System.out.println("\nAqui esta el rombo: \n\n");

   for ( int i = 1; i <= ((Tamano/2) + 1); i ++ )
   {   // Abre for
          
   for ( int  k = 1; k <= Tamano / 2 - i + 1; k++ )
   System.out.printf(" ");
                         
   // Este ciclo imprime el triangulo superior       
   for ( int j = (Tamano / 2) - i + 2; j <= (Tamano / 2) + i; j++ )  
   System.out.printf("*");


   System.out.printf("\n"); 
    
   }   // Cierra for


   // Abre segundo for, que imprime el triangulo de abajo

   for ( int l = 1; l <= Tamano / 2; l++ )
   {    // Abre for que imprime el segundo triangulo
   
   // Se imprimen los espacios

   for( int m = 1; m <= l; m++ )
   {     // Abre for
   
   System.out.printf(" "); 
   
   }     // Cierra for 

   for (int n = l + 1; n <= Tamano - l  ; n++)
   System.out.printf("*");

    
   System.out.println();

   }    // Cierra for que imprime el segundo triangulo

   }     // Cierra metodo Imprime
   }         // Cierra clase Deitel_5_24



Deitel_Java_5.24

5.24 Escriba una aplicación que imprima la siguiente figura de rombo. Puede utilizar instrucciones de salida que impriman un solo asterisco (*), un solo espacio o un solo carácter de nueva línea. Maximice el uso de la repetición ( con instrucciones for anidadas ), y minimice el número de instrucciones de salida.
     *
   ***
  *****
 *******
*********
 *******
  *****
   *** 

     *

El siguiente código debe guardarse como  UsaDeitel_5_24.java
Este programa puede imprimir un rombo de cualquier tamaño, sólo debe cambiarse la variable Tamano, cuidando que sea un entero impar.

  public class UsaDeitel_5_24

  {       // Abre clase publica UsaDeitel_5_24
  
  public static void main(String args[])
  {     // Abre main
  
  Deitel_5_24 miObjeto = new Deitel_5_24();

  // Se llama metodo Imprime()

  miObjeto.Imprime();

  }     // Cierra main
  }       // Cierra clase publica UsaDeitel_5_24

El siguiente código debe guardarse como UsaDeitel_5_24.java

   public class Deitel_5_24

   {         // Abre clase Deitel_5_24

   private int Tamano = 9;

   // la varibale Tamano controla la diagonal del rombo


       // Se define el metodo Imprime
   public void Imprime()
   {     // Abre metodo Imprime
     
   for ( int i = 1; i <= ((Tamano/2) + 1); i ++ )
   {   // Abre for
          
   for ( int  k = 1; k <= Tamano / 2 - i + 1; k++ )
   System.out.printf(" ");
                         
   // Este ciclo imprime el triangulo superior       
   for ( int j = (Tamano / 2) - i + 2; j <= (Tamano / 2) + i; j++ )  
   System.out.printf("*");


   System.out.printf("\n"); 
    
   }   // Cierra for


   // Abre segundo for, que imprime el triangulo de abajo

   for ( int l = 1; l <= Tamano / 2; l++ )
   {    // Abre for que imprime el segundo triangulo
   
   // Se imprimen los espacios

   for( int m = 1; m <= l; m++ )
   {     // Abre for
   
   System.out.printf(" "); 
   
   }     // Cierra for 

   for (int n = l + 1; n <= Tamano - l  ; n++)
   System.out.printf("*");

    
   System.out.println();

   }    // Cierra for que imprime el segundo triangulo

   }     // Cierra metodo Imprime
   }         // Cierra clase Deitel_5_24


viernes, 10 de junio de 2011

Deitel_Java_5.23 (Leyes de De Morgan en Java)

5.23 (Leyes de De Morgan) En este capítulo, hemos hablado sobre los operadores lógicos && , &, ||, |, ^ y !. Algunas veces, las leyes de De Morgan pueden hacer que sea más conveniente para nosotros expresar una expresión lógica. Estas leyes establecen que la expresión !(condición1 && condición2) es lógicamente equivalente a la expresión (!condición1 || !condición2). También establecen que la expresión !(condición1 || condición2) es lógicamente equivalente a la expresión (!condición1 && !condición2). Use las leyes de De Morgan para escribir expresiones equivalentes para cada una de las expresiones siguientes, luego escriba una aplicación que demuestre que, tanto la expresión original como la nueva expresión, producen en cada caso el mismo valor:

a) !(x < 5) && !(y >= 7)
b) !(a == b) || !(g != 5)
c) !( (x <= 8) && (y > 4))
d) !( (i > 4) || ( j <= 6 ) )

El siguiente código debe guardarse como UsaDeitel_5_23.java
 
 public class UsaDeitel_5_23

 {       // Abre UsaDeitel_5_23
 
 public static void main(String args[])
 {   // Abre main

 //Se define el metodo Deitel_5_23
 
 Deitel_5_23 miObjeto = new Deitel_5_23();

 /*
 // Se llama al metodo caso a 
 miObjeto.Casoa();
 */

 // Se llama al metodo caso b 
 miObjeto.Casob();

 /*
 // Se llama al metodo caso c 
 miObjeto.Casoc();

 // Se llama al metodo caso d 
 miObjeto.Casod();
 */
 }   // Cierra main

 }       // Cierra UsaDeitel_5_23
    


El siguiente código debe guardarse como Deitel_5_23.java

 import java.util.Scanner;


 public class Deitel_5_23

 {    // Abre clase Deitel_5_23
 
  Scanner entrada = new Scanner(System.in);
  private int incognita;

 // Abre metodo caso a
 public void Casoa()
 {  // Abre metodo caso a
  int x = 0;
  int y = 0;

  
  System.out.print("\nEste programa corrobora con un ejemplo ");
  System.out.print("las leyes de De Morgan.\n");

  System.out.println("\nSegun las leyes de De Morgan, ");
  System.out.print("\n!(x < 5) && !(y >= 7) es equivalente a ");
  System.out.print("!((x < 5) || !(y >= 7)) ");
 

  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita = ( !(x < 5) && !(y >= 7 ))? 1: 0; ");

  System.out.println("\nPor favor introduzca un valor de x: ");
  x = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de y: ");
  y = entrada.nextInt();

  incognita = ( !(x < 5) && !(y >= 7 ))? 1: 0; 

  System.out.printf("\nEl valor de incongnita es: %d\n", incognita);

  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita = !( (x < 5) || (y >= 7 ))? 1: 0; ");
  System.out.println("\nPor favor introduzca un valor de x: ");
  x = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de y: ");
  y = entrada.nextInt();

  incognita = !( (x < 5) || (y >= 7 ))? 1: 0; 

  System.out.printf("\nEl valor de incongnita es: %d\n", incognita);
 }  // Cierra metodo caso a
    

 // Abre metodo caso b
 public void Casob()
 {  // Abre metodo caso b
  int a;
  int b;
  int g;

  System.out.println("\nSegun las leyes de De Morgan, ");
  System.out.println("\n!(a == b) || !(g != 5) es equivalente a ");
  System.out.println("\n!((a == b) && (g != 5)) ");
 
  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita = (!(a == b) || !(g != 5))? 1:0; ");

  System.out.println("\nPor favor introduzca un valor de a: ");
  a = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de b: ");
  b = entrada.nextInt();

  System.out.println("\nPor favor introduzca un valor de g: ");
  g = entrada.nextInt();

  incognita = (!(a == b) || !(g != 5))? 1:0; 

  System.out.printf("\nEl valor de incongnita es: %d\n", incognita);

  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita =  !((a == b) && (g != 5))? 1: 0;");

  System.out.println("\nPor favor introduzca un valor de a: ");
  a = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de b: ");
  b = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de g: ");
  g = entrada.nextInt();
    
  incognita =  !((a == b) && (g != 5))?1:0;
   
  System.out.printf("\nEl valor de incongnita es: %d\n", incognita);
 }  // Cierra metodo caso b


 // Abre metodo caso c
 public void Casoc()
 {  // Abre metodo caso c

  int x = 0;
  int y = 0;

  System.out.println("\nSegun las leyes de De Morgan, ");
  System.out.println("\n!((x <= 8) && (y > 4)) es equivalente a ");
  System.out.println("\n(!(x <= 8) || !(y > 4)) ");
 
  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita = !((x <= 8) && (y > 4))? 1: 0;  ");

  System.out.println("\nPor favor introduzca un valor de x: ");
  x = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de y: ");
  y = entrada.nextInt();

  incognita = !((x <= 8) && (y > 4))? 1: 0;  

  System.out.printf("\nEl valor de incongnita es: %d\n", incognita);

  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita = (!(x < 5) || !(y >= 7))? 1: 0;"); 

  System.out.println("\nPor favor introduzca un valor de x: ");
  x = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de y: ");
  y = entrada.nextInt();
  
  incognita = (!(x < 5) || !(y >= 7))? 1: 0; 

  System.out.printf("\nEl valor de incongnita es: %d\n", incognita);
 }  // Cierra metodo caso c

 // Abre metodo caso d
 public void Casod()
 {  // Abre metodo caso d

  int i;
  int j;

  System.out.println("\nSegun las leyes de De Morgan, ");
  System.out.println("\n!((i > 4) || (j <= 6)) es equivalente a ");
  System.out.println("\n(!(i > 4) && !(j <= 6)) ");
 
  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita = !((i > 4) || (j <= 6))? 1:0;");

  System.out.println("\nPor favor introduzca un valor de i: ");
  i = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de j: ");
  j = entrada.nextInt();

  incognita = !((i > 4) || (j <= 6))? 1:0;

  System.out.printf("\nEl valor de incongnita es: %d\n", incognita);

  System.out.print("\n La variable incognita toma los valores 0 o 1 ");
  System.out.print("de la siguiente manera: \n");
  System.out.println("\n incognita = !(i > 4) && !( j <= 6 )"); 

  System.out.println("\nPor favor introduzca un valor de i: ");
  i = entrada.nextInt();
  
  System.out.println("\nPor favor introduzca un valor de j: ");
  j = entrada.nextInt();

  incognita = !(i > 4) && !( j <= 6 )? 1:0; 

  System.out.printf("\nEl valor de incognita es: %d\n", incognita);
 }  // Cierra metodo caso d

 }    // Cierra clase Deitel_5_23

jueves, 9 de junio de 2011

Método de Montante en C


René Mario Montante Pardo

El mexicano René Mario Montante Pardo desarrolló en 1973 un método numérico que resuelve un sistema de ecuaciones en álgebra lineal utilizando solamente enteros, a diferencia del método de Gauss. No sólo eso, sino que con el mismo método se obtiene el determinante y la inversa de la matriz. El método es el más exacto que hay para encontrar la solución de un sistema de ecuaciones, ya que las presenta al final en forma de fracción y no pierde información en el camino, lo cual sí pasa con el método de Gauss - Jordan.

El método consiste en formar la matriz  extendida C  con las entradas de la matriz de coeficientes del sistema, la matriz identidad y el vector  de las entradas independientes del sistema. Posteriormente es necesario ir cambiando las entradas de C por medio de la siguiente fórmula:

para k != i

C(k, l) = [(C(i,i)*C(k,l) - C(k,i)*C(i,l)]/pant;


Se utiliza un par de variables auxiliares llamadas pact (pivote actual) y pant ( pivote anterior). Al inicio pant = 1; y pact = C(i,i). Donde i corre desde 1 hasta N, N el número de ecuaciones del sistema. Los pivotes van tomando los valores de la diagonal principal. Al final, el número que queda en la diagonal principal es el determinante, lo que queda en lugar de la matriz identidad es la inversa y la última columna corresponde a la solución del sistema multiplicada por el último pivote actual (pact).
Como ejemplo, sea el sistema de ecuaciones

2x - y +  z  = 2
 x     + 3z  = 4
    2y + 2z  = 4

Al añadir la matriz unidad se obtiene:

  2      -1       1       1       0       0       2
  1       0       3       0       1       0       4
  0       2       2       0       0       1       4

en el primer paso ( i = 1) pact = 2 y pant = 1. Después del primer ciclo se obtiene

  2      -1       1       1       0       0       2
  0       1       5      -1       2       0       6
  0       4       4       0       0       2       8

Aquí i = 2, pact = 1 y pant = 2. Al terminar este ciclo la matriz es:

  1       0       3       0       1       0       4
  0       1       5      -1       2       0       6
  0       0      -8       2      -4       1      -8

Aquí i = 3, pact = -8 y pant = 1. Después de éste ciclo finalmente se obtiene la matriz:

 -8       0       0      -6       4      -3      -8
  0      -8       0      -2       4      -5      -8
  0       0      -8       2      -4       1      -8

En lugar de la matriz del sistema se obtuvo

 -8   0   0
  0  -8   0
  0   0  -8

Lo cual indica que el determinante de la matriz

2   -1   1
1    0   3
0    2   2

es -8

En tanto que la inversa de esta matriz es:

         -6   4   -3
(1/-8)   -2   4   -5
          2  -4    1

y la solución del sistema es

       
       -8        1
(-1/8) -8    =   1
       -8        1 

Lo cual indica que x = 1, y = 1, z = 1 es la solución.
A continuación se presenta el algoritmo en C. Este programa es completo, en el sentido de que es, creo, bastante amable con el usuario. Se puede cambiar la variable Tamano para resolver sistemas de cualquier tamaño.

#include <stdio.h>
#define Tamano 3
// La variable Tamano controla el numero de ecuaciones del sistema
// se puede cambiar facilmente para resolver sistemas de cualquier
// tamano

// Prototipos de funciones
void Recibe(int Arreglo[][2*Tamano + 1]);
void Imprime(int Array[][2*Tamano + 1]);
void Calcula(int C[][2*Tamano + 1]);

int main()
{  // Abre main

int i;
int j;

printf("\nEste programa usa el metodo de Montante para calcular");
printf(" el determinante, la matriz inversa y la solucion de un");
printf(" sistema de %d ecuaciones lineales con %d incognitas.\n", Tamano, Tamano);

// Se define una matriz que incluye la matriz de coeficientes, la unidad de 
// Tamano X Tamano y los terminos independientes del sistema
int Matriz[Tamano][2*Tamano + 1] = { {0, 0} };

// Llamada a la funcion Recibe
Recibe(Matriz);

// Llamada a la funcion Imprime
Imprime(Matriz);

// Llamada a la funcion Calcula
Calcula(Matriz);
  
// Se llama a la funcion Imprime
Imprime(Matriz);

// Se imprime el determinante
printf("\n\nEl determinante de la matriz es: %d\n", Matriz[0][0]);    

// Se imprime la matriz inversa
printf("\n\n\nEsta es la matriz inversa:\n \n");
  
for ( j = 0; j < Tamano; j++ )
{    // Abre for
for ( i = Tamano; i < 2*Tamano; i++ )
{      // Abre for anidado
printf("\t%3d\t", Matriz[j][i]);  
}      // cierra for anidado
 
printf("\n");

if ( Tamano/2 - 1 == j )
printf("(1/%d)", Matriz[0][0]); 
}    // Cierra for 


// Se imprime la solucion del sistema
printf("\n\n\nA continuacion se presentan las soluciones del sistema.");
printf(" Los numeros de la izquierda se refieren a la variable. \n"); 
for ( i = 0; i < Tamano; i++ )
{   // Abre for
printf("%3d\t = %6d/%d\n", i + 1, Matriz[i][2*Tamano], Matriz[0][0]); 
}   // Cierra for
return 0;
}  // Cierra main


////////////////////////////////////////////////////////////
//FUNCION RECIBE
/////////////////////////////////////////////////////////////

void Recibe( int Arreglo[][2*Tamano + 1])

{    // Abre funcion Recibe 

int i;
int j;
int k;
int l;
int m;

// Este par de ciclos reciben los coeficientes del sistema
printf("\nSE RECIBEN LOS COEFICIENTES DEL SISTEMA: \n");
for ( i = 0; i < Tamano; i++ )
for ( j = 0; j < Tamano; j++ ) 
{  // Abre for
printf("\nPor favor introduzca el coeficiente %d de la ecuacion %d: ", j + 1, i + 1);
scanf("%d", &Arreglo[i][j]);
}  // Cierra for

// Este ciclo adiciona la matriz unidad de TamanoXTamano 
for ( k = 0; k < Tamano; k++ )
Arreglo[k][Tamano + k] = 1; 

// Este ciclo recibe los terminos independientes 
printf("\nSE RECIBEN LOS TERMINOS INDEPENDIENTES. \n");
for ( m = 0; m < Tamano; m++ )
{  // Abre for
printf("\nIntroduzca el termino independiente de la ecuacion %d: ", m + 1);
scanf("%d", &Arreglo[m][2*Tamano ]); 
 }  // Cierra for 
 }         // Cierra funcion Recibe

//////////////////////////////////////////////////
//FUNCION IMPRIME
////////////////////////////////////////////////// 

void Imprime(int Array[][2*Tamano + 1]) 

{        // Abre la funcion Imprime
int i;
int j;
  
printf("\n\n");
for ( i = 0; i < Tamano; i++ )
{   // Abre for 

for ( j = 0; j < 2*Tamano + 1; j++ )
{    // Abre for anidado
printf("%3d\t", Array[i][j]); 
}    // Cierra for anidado 
  
printf("\n");
}    // Cierra for

}        // Cierra la funcion Imprime


///////////////////////////////////////////////////////
//FUNCION CALCULA
///////////////////////////////////////////////////////

void Calcula(int C[][2*Tamano + 1])

{     // Abre funcion Calcula
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ El algoritmo requiere que se haga una copia de la matriz original       +
+ Solo debe alterarse la matriz C cuando i se incrementa, esto se         +
+ Introducir la sentencia                                                 +  
+   B[k][l] = ( (C[i][i]*C[k][l]) - (C[k][i]*C[i][l]) )/pant;             +
+                                                                         +
+ hace en la parte principal de la funcion                                +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

// Se definen las variables pact (pivote actual) y pant(pivote anterior)   
// ademas de variables controladoras de ciclos                             
                                                                        
int B[Tamano][2*Tamano + 1];                                            
int pant = 1;  // Al principio pant = 1                                  
int pact;                                                               
int l;                                                                  
int k;                                                                  
int i = 0;                                                              
int j;                                                 
int s; 
int t;

// El pivote siempre va tomando valores consecutivos de la diagonal
// principal, esto se controla con la variable i en el siguiente ciclo
// for
for ( i = 0; i < Tamano; i++ )
{   // Abre for
// Se cambia el valor de pact
pact = C[i][i];

/* Descomente estas lineas para ver la impresion de estas variables
  printf ("\npact = %d", pact);
  printf ("\npant = %d", pant);
  */

// Los siguientes ciclos controlan las columnas y las filas respectivamente
for ( l = 0; l < 2*Tamano + 1; l++)
for ( k = 0; k < Tamano; k++ )
{  // Abre for anidado
  // El renglon sobre el que se ha tomado el pivote actual se deja intacta
  // esto se logra con el siguiente condicional
if ( k != i )
{    // Abre if
  // La asignacion de valores no se hace directamente sobre la matriz C sino sobre
  // una copia. Esto porque de lo contrario se estaria modificando la matriz con 
  // la que se calcula cada vez que se asigna un nuevo valor

B[k][l] = ( (C[i][i]*C[k][l]) - (C[k][i]*C[i][l]) )/pant;

}    // Cierra if
}  // Cierra for anidado 


// Se asigna los valores de la matriz A a la matriz C
   
for ( s = 0; s < Tamano; s++ )
{   // Abre for anidado
for ( t = 0; t < 2*Tamano + 1; t++ )
{    // Abre for anidado
   //Como el renglon del pivote actual (pact) no se modifico
   //entonces no se asigna en la variable original
if ( s != i)
C[s][t] = B[s][t] ; 
}    // Cierra for anidado 
}

  /* Descomente estas lineas para ver la evolucion del algoritmo
     cada vez que cambia i 
  printf("\n");
  Imprime(C);
  */

// Se cambia el valor de pant
pant = pact; 

}   // Cierra for
  
}     // Cierra funcion Calcula

Related Posts Plugin for WordPress, Blogger...