Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/02/2013, 12:47
amchacon
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Duda con un programa en C

Cita:
Iniciado por extol Ver Mensaje
P.D: le agregue muchos fflush(stdin) por el tema de los buffers.
Eso no es estandar, como tampoco lo es la librería conio... ¿Y para que usas la librería windows.h?

He eliminados esas librerías y te he cambiado la función fflush por otra más estándar (y más estable!). Después lo he probado a mi me va bien, no se si el error se ha arreglado con lo del buffer:

Código:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct cuenta
{
    char num[5];
    char titular[256];
    int fecha;
    float saldo;
};

void LimpiarBuffer();
void cargar(struct cuenta[]);
struct cuenta *buscar(struct cuenta[],char*);
void actualizar(struct cuenta [],float,int);
int cant_cuentas;

int main()
{
    struct cuenta *reg,*rta;
    int tipo;
    float monto;
    char nro_cuent[5];
    puts("Ingrese cantidad de cuentas");
    scanf("%d",&cant_cuentas);
     LimpiarBuffer();
    reg=(struct cuenta*)malloc(cant_cuentas*sizeof(struct cuenta));
    if (reg==NULL)
    {
        puts("Error de memoria");
        exit(-1);
    }
    else
    {
        puts("Ingrese datos de las cuentas");
        cargar(reg);
        system("cls");
        puts("Acttalizar");
        puts("Ingrese numero de cuenta");
        scanf("%s",nro_cuent);
        LimpiarBuffer();

        puts("Ingrese monto y tipo de movimiento (monto/tipo)");
        scanf("%f",&monto);
        LimpiarBuffer();
        do
        {
            puts("1-Agregar 2-Extraer");
            scanf("%d",&tipo);
             LimpiarBuffer();
        }
        while(tipo!=1 && tipo!=2);

        rta=buscar(reg,nro_cuent);
        if(rta)
        {
            actualizar(rta,monto,tipo);
            printf("La cuenta se actualizo correctamente, y su saldo es %f\n",(*rta).saldo);
        }
        else puts("No se acntualizo la cuenta");
    }/* Del else */
    return 0;
}

void cargar(struct cuenta r[])
{
    int i;
    for(i=0; i<cant_cuentas; i++)
    {
        printf("Ingrese el numero de la cuenta %d \n",i+1);
        scanf("%s",r[i].num);
        LimpiarBuffer();
        puts("Ingrese titular");
        scanf("%s",r[i].titular);
        LimpiarBuffer();
        puts("Ingrese fecha de apertura");
        scanf("%d",&r[i].fecha); // La fecha tiene tres campos: Dia,mes y anyo... Como lo piensas introducir solo con un numero?
        LimpiarBuffer();
        puts("Ingrese saldo");
        scanf("%f",&r[i].saldo);
        LimpiarBuffer();
    }
}

struct cuenta *buscar(struct cuenta r[],char *t)
{
    int i=0;
    do
    {
        i++;
    }
    while(strcmp(r[i-1].num,t)!=0 && i<cant_cuentas);
    if (strcmp(r[i-1].num,t)==0)
    {
        return &r[i-1];
    }
    else return NULL;
}

void actualizar(struct cuenta r[],float m,int t)
{
    if (t==1)
    {
        r->saldo=r->saldo+m;
    }
    else
    {
        r->saldo=r->saldo-m;
    }
}

void LimpiarBuffer()
{
    while (getchar() != '\n');
}
PD: La funcion de busqueda no tiene ningún problema, yo la vea correcta
PD2: No se recomienda el uso de variables globales para que dos funciones se comuniquen entre sí.