jueves, 25 de abril de 2013

Archivos en C++

Esta vez les traigo un código en c++, donde se utiliza lo que es archivos (.dat).
Tomando como ejemplo, suponiendo, una cuenta en un banco cualquiera. Una simulación de lo que sería abrir una cuenta en un banco de la localidad.

Bueno, no quiero adentrarme a la teoría, mas bien, solo al código suponiendo que los conceptos que se utilizan en este código ya han sido "masticado y digeridos" o sea aprendidos.

En este caso se utiliza lo que son estructuras, una estructura llamada banco que contiene el nombre, un numero de cuenta que se incrementa automáticamente a medida que vayamos agregando un usuario y un saldo que nos servirá para hacer las transacciones cotidianas (depositar, retirar, consultar...).

A esta estructura le pondremos como seudónimo la variable bank, el cual le agregaremos o lo convertiremos en un vector de 50 clientes, se podría hacer dinámicamente, pero este sería otra clase :). Y bueno, tiene un menú el cualquier nos indicará que queremos hacer con nuestra cuenta ficticia.

Bueno cualquiera pregunta, escríbanme al correo msantos01@hotmail.com. Así sabré si por lo menos ven mis aportes, sino pues que sea de buen provecho para ustedes. 

Aquí esta el código

#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<conio.h>

struct banco {
  char nombre[20];
  int cuenta;
  float saldo;
};
typedef struct banco bank;

/***********************************************************************/

main()
{
  bank cliente[50];
  int cant_cliente=0, opc;

  int menu(void);
  int abrir(bank cliente[], int cant_cliente);
  void depositar(bank cliente[], int cant_cliente);
  void retirar(bank cliente[], int cant_cliente);
  void consultar(bank cliente[], int cant_cliente);
  int recuperar(bank cliente[], int cant_cliente);
  void guardar(bank cliente[], int cant_cliente);

  cant_cliente = recuperar(cliente, cant_cliente);

  do {
    opc=menu();
      switch(opc) {
case 1: cant_cliente=abrir(cliente,cant_cliente);
break;

case 2: depositar(cliente,cant_cliente);
break;

case 3: retirar(cliente,cant_cliente);
break;

case 4: consultar(cliente,cant_cliente);
break;

case 5: guardar(cliente,cant_cliente);
cout<<"\n SALIENDO......"<<endl;
getch();
break;

default: cout<<"NO ES OPCION......"<<endl;
getch();
break;
      }
  } while(opc!=5);
}

/***********************************************************************/

int menu(void)
{
  int opc;
    clrscr();  /* Limpia pantalla */
  cout<<"BANCO NACIONAL"<<endl;
  cout<<"\n1. Apertura de cuenta"<<endl;
  cout<<"2. Depositar en cuenta"<<endl;
  cout<<"3. Retirar de la cuenta"<<endl;
  cout<<"4. Consultar cuenta"<<endl;
  cout<<"5. Salir del menu"<<endl;
  cout<<"\n Escoja una opcion: ";
  cin>>opc;

  return(opc);
}

/***********************************************************************/

int recuperar(bank cliente[50], int cant_cliente)
{
  ifstream entrada;                                       
  entrada.open("C:\CUENTAS.dat");

  if(!entrada) {
    cout<<"Error en la apertura"<<endl;
    cout<<"Posiblemente el banco inicia operaciones"<<endl;
    getch();
  }
  else {
    while(!entrada.eof()) {
      entrada>>cliente[cant_cliente].nombre;
      entrada>>cliente[cant_cliente].cuenta;
      entrada>>cliente[cant_cliente].saldo;
      cant_cliente++;
    }
  cant_cliente-=1;
  }

  entrada.close();
  return(cant_cliente);
}

/***********************************************************************/

void guardar(bank cliente[50], int cant_cliente)
{
  int i;
  ofstream salida;
  salida.open("C:\CUENTAS.dat");

  if(!salida) {
    cout<<"ERROR"<<endl;
  }
  else {
    for(i=0; i<cant_cliente; i++) {
      salida<<cliente[i].nombre<<" ";
      salida<<cliente[i].cuenta<<" ";
      salida<<cliente[i].saldo<<" ";
      salida<<"\n";
    }
  }
  salida.close();
}

/***********************************************************************/

int abrir(bank cliente[50], int cant_cliente)
{
  int c=0;
  cout<<"\nIntroduzca el nombre: ";
  cin>>cliente[cant_cliente].nombre;
  cout<<"Introduzca el saldo de apertura: ";
  cin>>cliente[cant_cliente].saldo;
  c+=cant_cliente;
  c++;
  cliente[cant_cliente].cuenta=c;
  cout<<"\nSu numero de cuenta es: "<<cliente[cant_cliente].cuenta;
  getch();
  cant_cliente++;

  return(cant_cliente);
}

/***********************************************************************/

void consultar(bank cliente[50], int cant_cliente)
{
  int i, n_cuenta, pos=-1;

  cout<<"\nInserte el numero de su cuenta: ";
  cin>>n_cuenta;
    for(i=0; i<cant_cliente; i++) {
      if(n_cuenta==cliente[i].cuenta)
pos=i;
    }

    if(pos!=-1) {
      cout<<"\n Cliente: "<<cliente[pos].nombre<<endl;
      cout<<" Usted posee en su cuenta: B/"<<cliente[pos].saldo<<endl;
    }
    else {
      cout<<"\nLa cuenta no esta registrada"<<endl;
    }
    getch();

    return;
}

/***********************************************************************/

void depositar(bank cliente[50], int cant_cliente)
{
  int i, n_cuenta, pos=-1;
  float deposito;

  cout<<"\nInserte el numero de su cuenta: ";
  cin>>n_cuenta;
    for(i=0; i<cant_cliente; i++) {
      if(n_cuenta==cliente[i].cuenta)
pos=i;
    }

    if(pos!=-1) {
      cout<<"\n Cuanto es el deposito: ";
      cin>>deposito;
      cliente[pos].saldo+=deposito;
    }
    else {
      cout<<"\nLa cuenta no esta registrada"<<endl;
      getch();
    }

  return;
}

/***********************************************************************/

void retirar(bank cliente[50], int cant_cliente)
{
  int i, n_cuenta, pos=-1;
  float retiro;

  cout<<"\nInserte el numero de su cuenta: ";
  cin>>n_cuenta;
    for(i=0; i<cant_cliente; i++) {
      if(n_cuenta==cliente[i].cuenta)
pos=i;
    }

    if(pos!=-1) {
      cout<<"\n Cuanto es el retiro: ";
      cin>>retiro;
if(retiro > cliente[pos].saldo) {
 cout<<"\n No dispone de tal cantidad"<<endl;
 getch();
}
else {
 cliente[pos].saldo-=retiro;
}
    }
    else {
      cout<<"\nLa cuenta no esta registrada"<<endl;
      getch();
    }

  return;
}  

/********************************************************************************/

y como siempre, estas son las capturas del programa.


Este es el mensaje que nos aparece en la primera ejecución, ya que se crea el archivo CUENTAS.dat que en mi caso se encuentra en BORLANDC/BIN/. allí se guardarán los datos y saldos de nuestro banco ficticio.







Y bueno,.. eso es todo.

Algo más, si quieres donar a mi blog, se le agradecería mucho, ya que me animaría a publicar más programas hecho por este servidor. Gracias.

jueves, 4 de abril de 2013

Inversa de una Matriz

La inversa de una matriz por método de Gauss-Jordan.

Un pequeño programa hecho en C, que utiliza este método. Antes que veamos el código veamos un poco de teoría...

Dada una matriz A, ¿Podremos encontrar otra matriz B tal que A·B=B·A=I?

Esta matriz B existe aunque no siempre, de existir se le llama matriz inversa de A y se nota A-1. Para que exista la inversa de A, ésta tiene que ser cuadrada pues de lo contrario no se podría hacer el producto por la izquierda y por la derecha, luego cuando hablamos de matrices invertibles estamos hablando de matrices cuadradas.

Condición necesaria y suficiente para que una matriz sea invertible es que no sea singular, es decir, que su determinante sea no nulo |A| ≠ 0

Cálculo de la matriz inversa

Método de Gauss-Jordan

Este método consiste en colocar junto a la matriz de partida (A) la matriz identidad (I) y hacer operaciones por filas, afectando esas operaciones tanto a A como a I, con el objeto de transformar la matriz A en la matriz identidad, la matriz resultante de las operaciones sobre I es la inversa de A (A-1).

Las operaciones que podemos hacer sobre las filas son:

a) Sustituir una fila por ella multiplicada por una constante, por ejemplo, sustituimos la fila 2 por ella multiplicada por 3.

b) Permutar dos filas

c) Sustituir una fila por una combinación lineal de ella y otras.



Utilizando este ejemplo. mostraré el código y su posterior ejecución. :-)

#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<math.h>

/*********************************** imprime matriz **********************/

void desplegar(int n, double **A) {
  int i,j,f,c;
  for(i=1; i<=n; i++) {
    f=(i+1)+12;
    for(j=1; j<=(2*n); j++) {
      c=(j+1)*9;
      gotoxy(c,f);
      cprintf("  %.2f",A[i][j]);
    }
  }
}

/**************************************** captura valor ******************/

double LeeValor(void) {
  double valor;
  scanf("%lf",&valor);
  return valor;
}

/*********************************************************************/

void main() {
  int n,f,c,i,renglon;
  double **A,grande,temp,p,cero;

  clrscr();

  printf("\n Cuantas filas tiene el sistema?: ");
  scanf("%d",&n);

  printf("\n f=%d, c=%d.\n",n,(2*n));


  /******************************** Asigno memoria ***********************/

  A=(double **)calloc(n,sizeof(double *));
  for(i=0; i<n; i++) {
    A[i]=(double *)calloc((2*n),sizeof(double));
  }
  /********************************************************************/

  for(f=1; f<=n; f++) {

    printf("\n fila %d\n",f);
    for(c=1; c<=n; c++) {
      printf("columna %d= ",c);
      A[f][c]=LeeValor();
      A[f][n+c]=0;
    }
    A[f][n+f]=1;
  }
  /********************************************************************/

  for(f=1; f<=n; f++) {

    grande=fabs(A[f][f]);
    renglon=f;

    for(c=f+1; c<=n; c++) {

      if(grande < fabs(A[c][f])) {
grande=fabs(A[c][f]);
        renglon=c;
      }
    } //FIN DEL FOR

    if(grande==0) {

      printf("\n No tiene solucion");
    } //FIN DEL IF

    if(renglon!=f) {

      for(c=1; c<=(2*n); c++) {
temp=A[f][c];
A[f][c]=A[renglon][c];
        A[renglon][c]=temp;
      }
    } //FIN DEL IF

    p=A[f][f];

    for(c=1; c<=(2*n); c++) {
      A[f][c]/=p;
    } //FIN DEL FOR

    for(renglon=1; renglon<=n; renglon++) {

      if(renglon!=f) {
cero=A[renglon][f];
for(c=1; c<=(2*n); c++) {
          A[renglon][c]-=cero*A[f][c];
        }
      }
    } //FIN DEL FOR
  } //FIN DEL FOR
  desplegar(n,A);

  /**************************** Libero memoria *****************************/

  for(i=0; i<n; i++) {
    free(A[i]);
  }
  free(A);
  /*********************************************************************/

  getch();

}

/**********************************************************************/


Y bueno este es la ejecución.


Créditos:
Prof. Luis Real
http://www.ematematicas.net

Algo más, si quieres donar a mi blog, se le agradecería mucho, ya que me animaría a publicar más programas hecho por este servidor. Gracias.