Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Duda con un programa en C

Estas en el tema de Duda con un programa en C en el foro de C/C++ en Foros del Web. Hola a todos. Queria saber si por favor me podian ayudar. Tengo este programa en C y funciona todo bien, hasta la función 'buscar', alli ...
  #1 (permalink)  
Antiguo 10/02/2013, 12:25
 
Fecha de Ingreso: enero-2013
Mensajes: 9
Antigüedad: 11 años, 3 meses
Puntos: 0
Duda con un programa en C

Hola a todos. Queria saber si por favor me podian ayudar. Tengo este programa en C y funciona todo bien, hasta la función 'buscar', alli se sale..Para mi es el tema de la busqueda secuencial que hago.

El ejercicio estaba a medio hacer, y yo debía completarlo.



Código C:
Ver original
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<windows.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6.  
  7. struct cuenta
  8. {
  9. char num[5];
  10. char titular[];
  11. int fecha;
  12. float saldo;
  13. };
  14.  
  15. void cargar(struct cuenta[]);
  16. struct cuenta *buscar(struct cuenta[],char*);
  17. void actualizar(struct cuenta [],float,int);
  18. int cant_cuentas;
  19.  
  20. main()
  21. {
  22. struct cuenta *reg,*rta;
  23. int tipo;
  24. float monto;
  25. char nro_cuent[5];
  26. puts("Ingrese cantidad de cuentas");
  27. fflush(stdin);
  28. scanf("%d",&cant_cuentas);
  29. reg=(struct cuenta*)malloc(cant_cuentas*sizeof(struct cuenta));
  30. if (reg==NULL)
  31. {
  32. puts("Error de memoria");
  33. }
  34. else{
  35. puts("Ingrese datos de la cuenta");
  36. cargar(reg);
  37. system("cls");
  38. puts("Acutalizar");
  39. puts("Ingrese numero de cuenta");
  40. fflush(stdin);
  41. scanf("%s",nro_cuent);
  42. puts("Ingrese monto y tipo de movimiento (monto/tipo)");
  43. fflush(stdin);
  44. scanf("%f",&monto);
  45. do{
  46. puts("1-Agregar 2-Extraer");
  47. fflush(stdin);
  48. scanf("%d",&tipo);
  49. }while(tipo!=1 && tipo!=2);
  50. rta=buscar(reg,nro_cuent);
  51. if(rta)
  52. {
  53. actualizar(rta,monto,tipo);
  54. printf("La cuenta se actualizo correctamente, y su saldo es %f\n",(*rta).saldo);
  55. }
  56. else puts("No se acntualizo la cuenta");
  57. }/* Del else */
  58. }
  59.  
  60.  
  61.  
  62.  
  63. void cargar(struct cuenta r[])
  64. {
  65. int i;
  66. for(i=0;i<cant_cuentas;i++)
  67. {
  68. puts("Ingrese numero de cuenta");
  69. fflush(stdin);
  70. scanf("%s",r[i].num);
  71. fflush(stdin);
  72. puts("Ingrese titular");
  73. fflush(stdin);
  74. scanf("%s",r[i].titular);
  75. puts("Ingrese fecha de apertura");
  76. fflush(stdin);
  77. scanf("%d",&r[i].fecha);
  78. puts("Ingrese saldo");
  79. fflush(stdin);
  80. scanf("%f",&r[i].saldo);
  81. }
  82. }
  83.  
  84. struct cuenta *buscar(struct cuenta r[],char *t)
  85. {
  86. int i=0;
  87. do{
  88. i++;
  89. }while(strcmp(r[i-1].num,t)!=0 && i<cant_cuentas);
  90. if (strcmp(r[i-1].num,t)==0)
  91. {  
  92. return &r[i-1];
  93. }
  94. else return NULL;
  95. }
  96.  
  97. void actualizar(struct cuenta r[],float m,int t)
  98. {
  99. if (t==1)
  100. {
  101. r->saldo=r->saldo+m;
  102. }
  103. else
  104. {
  105. r->saldo=r->saldo-m;
  106. }
  107. }


P.D: le agregue muchos fflush(stdin) por el tema de los buffers.

Desde ya les agradezco mucho. Saludos.
  #2 (permalink)  
Antiguo 10/02/2013, 12:47
 
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í.
  #3 (permalink)  
Antiguo 10/02/2013, 18:16
 
Fecha de Ingreso: enero-2013
Mensajes: 9
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Duda con un programa en C

Hola amchacon gracias por responder.

El windows.h lo uso porque tengo el dev-c++ y no funciona el clrscr(). Pero hice lo siguiente, me baje el Turbo c++, le agregue el clrscr() y ahora funciona de 10!

Un saludo y gracias de nuevo!

Etiquetas: funcion, int, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:13.