[ Foro de C ]

Error no se en donde :'( ayuda

04-Feb-2014 13:35
Moon Black
4 Respuestas

Codifique un programa en C, que permita almacenar los siguientes datos bancarios:
1)Nombres y apellidos
2)Cedula de identidad
3)Fecha de nacimiento
4)Tipo de operacion(Deposito o Retiro)
5)Monto de la operacion
6)Tipo de cliente(Con prioridad (C/P) o sin prioridad(S/P)).
7)Cliente con prioridad(C/P):
   A)Discapacitados
   B)3era Edad (Mayor a 60 años)
   C)Embarazadas
8)Monto disponible en cuenta.

PARA GENERAR REPORTES DE:
1)Listado general y cantidad de clientes
2)Listado y cantidad de clientes (C/P)
3)Listado y cantidad de clientes que realicen DEPOSITOS o RETIROS.(S/P)
4)Estado de la cuenta de un cliente antes y despues de cada operacion
5)Listado y cantidad de personas(C/P) que tengan montos menores a 5.000BsF
6)Listado y cantidad de Clientes con edades comprendidas:
>=20 y < 35 años
con montos disponibles en cuentas:
>=5.000BsF y <25.000BsF
NOTA:
Los listados deben contar con:
_____________________________________________
|nombre apellido|cedula|edad|monto disp en cuenta|
codigo fuente:::


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

struct fecha{
int dia,mes,anio,edad;

};

struct cliente{
char nombre[20],apellido[40],cp_cliente[0],
t_operacion[10];

};

struct oper_bancarias{

float md_cuenta,ma_cuenta;
int operacion,cedula;

};



int main(void){


       float m_oper;
       int i,opc_prioridad,anio_actual=2014,
       cedula_buscar,cliente_sp=0,cliente_cp=0,opcion,cliente_cpm=0,N_clientes;



       printf("Ingrese el numero de clientes: ");
       fflush(stdin);
       scanf("%d",&N_clientes);
struct fecha fecha_nac[N_clientes];
struct cliente crear_cliente[N_clientes];
struct oper_bancarias operac_b[N_clientes];
//datos personales
  for(i=0;i<N_clientes;i++){
printf("Nombre del cliente: ");
fflush(stdin);
gets(crear_cliente[i].nombre);

printf("Apellido del cliente: ");
fflush(stdin);
gets(crear_cliente[i].apellido);

printf("Cedula del cliente: ");
fflush(stdin);
scanf("%d",&operac_b[i].cedula);

printf("\nFecha de nacimiento del cliente\n");
printf("Dia: ");
fflush(stdin);
scanf("%d",&fecha_nac[i].dia);

printf("mes: ");
fflush(stdin);
scanf("%d",&fecha_nac[i].mes);

printf("anio: ");
fflush(stdin);
scanf("%d",&fecha_nac[i].anio);

fecha_nac[i].edad =anio_actual- fecha_nac[i].anio;

printf("\nEdad del cliente: %d",fecha_nac[i].edad);

//prioridad del cliente
printf("\nPrioridad del cliente\n");
printf(" 1.Con prioridad\n");
printf(" 2.Sin prioridad\n");
printf("opcion: ");
fflush(stdin);
scanf("%d",&opc_prioridad);
if(opc_prioridad==1){
              ++cliente_cp;
printf(" a.Discapacitado\n");
printf(" b.tercera edad (> a 60 anios)\n");
printf(" c.Embarazadas\n");
printf("letra de la opcion: ");
fflush(stdin);
gets(crear_cliente[i].cp_cliente);
}
if(opc_prioridad==2){
       ++cliente_sp;
}
//operciones bancarias

printf("\nMonto disponible en la cuenta del cliente: ");
fflush(stdin);
scanf("%f",&operac_b[i].md_cuenta);
if(operac_b[i].md_cuenta)

printf("Tipo de operacion que desea hacer\n");


printf(" 1.Deposito\n");
printf(" 2.Retiro");
printf("\nIngrese su opcion: ");
fflush(stdin);
scanf("%d",&operac_b[i].operacion);
if(fecha_nac[i].edad>=20 && fecha_nac[i].edad<35){
   if(operac_b[i].ma_cuenta>=5000 && operac_b[i].ma_cuenta<25000) ++cliente_cpm;
}
if(operac_b[i].operacion==1){


       printf("Cuanto desea depositar: ");
       fflush(stdin);
       scanf("%f",&m_oper);

      operac_b[i].ma_cuenta= operac_b[i].md_cuenta + m_oper;
if (operac_b[i].ma_cuenta<5000) if(opc_prioridad==1) ++cliente_cpm;
       printf("Monto actual de la cuenta: %.3f\n\n",operac_b[i].ma_cuenta);
}
if (operac_b[i].operacion==2){

       printf("Cuanto desea retirar: ");
       fflush(stdin);
       scanf("%f",&m_oper);

       operac_b[i].ma_cuenta= operac_b[i].md_cuenta - m_oper;
      if (operac_b[i].ma_cuenta<5000) if(opc_prioridad==1) ++cliente_cpm;

  printf("Monto actual de la cuenta: %.3f\n\n",operac_b[i].ma_cuenta);


}


       }
     do{
              system("pause");
              system("cls");
      printf("\n\n1. Mostrar listado general y cantidad de clientes\n");
      printf("2. Listado y cantidad de clientes (C/P)\n");
      printf("3. Listado y cantidad de clientes que realicen Depositos o Retiros (S/P)\n");
      printf("4. Estado de la cuenta de un cliente antes y despues de una operacion\n");
      printf("5. Listado y cantidad de personas (C/P) que tengan montos menores a 5.000 BsF\n");
      printf("6. Listado y cantidad de Clientes con edades comprendidas:\n");
      printf("mayores o igual a 20 y menor 35 anios con montos disponibles en cuentas: mayor o igual 5.000BsF y  menor a 25.000BsF\n");
      printf("7.Salir\n\n");
      printf("opcion:");

      scanf("%d",&opcion);
      fflush(stdin);
      switch (opcion){

      case 1:
      printf("Nombre y apellido| Cedula | Edad | Monto disp. en la cuenta |\n");
      for(i=0;i<N_clientes;i++){
      printf("\n%s %s    %s    %d    %g\n",crear_cliente[i].nombre,crear_cliente[i].apellido,
             operac_b[i].cedula,fecha_nac[i].edad,operac_b[i].md_cuenta);
            }
            printf("cantidad de clientes: %d",N_clientes);
      break;

      case 2:
       printf("Nombre y apellido| Cedula | Edad | Monto disp. en la cuenta |\n");
       for(i=0;i<N_clientes;i++){
      printf("\n%s %s    %s    %d    %g\n",crear_cliente[i].nombre,crear_cliente[i].apellido,
             operac_b[i].cedula,fecha_nac[i].edad,operac_b[i].md_cuenta);

            }
            printf("\nCantidad de clientes con prioridad: %d",cliente_cp);
      break;
      case 3:
        printf("Nombre y apellido| Cedula | Edad | Monto disp. en la cuenta |\n");
      for(i=0;i<N_clientes;i++){
      printf("\n%s %s    %s    %d    %g\n",crear_cliente[i].nombre,crear_cliente[i].apellido,
             operac_b[i].cedula,fecha_nac[i].edad,operac_b[i].md_cuenta);
            }

            printf("Cantidad total de operaciones(S/P): %d,",cliente_sp);
            break;
             case 4:
       printf("Cedulas disponibles\n");
       for(i=0;i<N_clientes;i++){
              printf("%s\n%d\n\n",crear_cliente[i].nombre,
                    operac_b[i].cedula);


       }

       printf("Indique la cedula del cliente:");
       fflush(stdin);
       scanf("%d",&cedula_buscar);
       for(i=0;i<N_clientes;i++){
       if(operac_b[i].cedula==cedula_buscar){
              printf("Nombre:",crear_cliente[i].nombre);
       }
       }
              if(operac_b[i].operacion==1){
              printf("Operacion: Deposito");
              }else printf("Operacion: Retiro\n");
              printf("Monto disponible en la cuenta antes de la operacion: %.3f\n",operac_b[i].md_cuenta);
              printf("Monto disponible en la cuenta actualmente: %.3f\n",operac_b[i].ma_cuenta);


       break;
 case 5:
                  printf("Nombre y apellido| Cedula | Edad | Monto disp. en la cuenta |\n");
      for(i=0;i<N_clientes;i++){
      printf("\n%s %s    %s    %d    %g\n",crear_cliente[i].nombre,crear_cliente[i].apellido,
             operac_b[i].cedula,fecha_nac[i].edad,operac_b[i].md_cuenta);
            }
            printf("cantidad de clientes (C/P) con montos menores a 5000BsF: %d",cliente_cpm);

              break;

                 case 6:

                         printf("Nombre y apellido| Cedula | Edad | Monto disp. en la cuenta |\n");
      for(i=0;i<N_clientes;i++){
      printf("\n%s %s    %s    %d    %g\n",crear_cliente[i].nombre,crear_cliente[i].apellido,
             operac_b[i].cedula,fecha_nac[i].edad,operac_b[i].md_cuenta);
            }
 printf("cantidad de clientes:%d",cliente_cpm);

                        break;
       }

      }

while(opcion!=7);
getch();
return 0;
}



04-Feb-2014 13:41
Moon Black

Amigos este programa me costo mucho hacerlo al principio corria de maravilla pero luego al colocar 3 case mas se detenia.. y eso que el IDE codeblock decia que no tenia errores....
es dicir recibia los datos pero no los mostraba y antes si lo hacia ya he echo lo que he podido no tengo tantos conocimientos en C espero ayuden :).....


04-Feb-2014 15:57
Nacho Cabanes (+83)

Siendo estrictos, el IDE CodeBocks, igual que cualquier otro, no te dice que tu programa no contenga errores, sino que "compila", es decir, que lo ha conseguido convertir a código máquina. Eso no quiere decir que no contenga errores lógicos, sino que "ha entendido las órdenes".

Un programa como el siguiente, compila pero no tiene sentido, y (por supuesto) CodeBlocks no te avisaría de ningún problema con él:


#include <stdio.h>
int main()
{
    puts("2+3=6");
    return 0;
}


En tu caso, deberías dar más detalles sobre qué es lo que funciona y qué es lo que no funciona. La forma ideal de saberlo es ejecutando el programa paso a paso con el depurador de tu entorno de desarrollo (CodeBlocks, en tu caso), o añadir nuevas órdenes "printf" que te ayuden a saber por dónde avanza tu programa para que puedas descubrir dónde se interrumpe la ejecución.

Yo veo varias cosas peligrosas en tu programa, como el hecho de que la variable "i" se comparta en tantas zonas distintas, o el mezclar "gets" y "scanf", pero no tengo ahora el tiempo necesario para poder probarlo a fondo, así que necesitaría más detalles sobre la zona del programa que te da problemas.


04-Feb-2014 16:28
Moon Black

yo otra vez jejeje.... bueno amigo son las consultas en el clico do while  al momento de intentar imprimir los datos que introduje en las variables se detiene el programa sera por tener la variable "i" demasiado compartida?
En esa zona es donde tengo el problema...


04-Feb-2014 17:26
Nacho Cabanes (+83)

Por una parte: ese do-while que te da problemas, ocupa ¡94 líneas!  Deberías afinar un poco más. Por que al bloque do..while a mí se me entra y me muestra este menú:


1. Mostrar listado general y cantidad de clientes
2. Listado y cantidad de clientes (C/P)
3. Listado y cantidad de clientes que realicen Depositos o Retiros (S/P)
4. Estado de la cuenta de un cliente antes y despues de una operacion
5. Listado y cantidad de personas (C/P) que tengan montos menores a 5.000 BsF
6. Listado y cantidad de Clientes con edades comprendidas:
mayores o igual a 20 y menor 35 anios con montos disponibles en cuentas: mayor o igual 5.000BsF y  menor a 25.000BsF
7.Salir


Por otra parte, da varios "warnings" (avisos) al compilar:


prueba01.c:156: warning: format ?%s? expects type ?char *?, but argument 4 has type ?int?
prueba01.c:165: warning: format ?%s? expects type ?char *?, but argument 4 has type ?int?
prueba01.c:174: warning: format ?%s? expects type ?char *?, but argument 4 has type ?int?
prueba01.c:208: warning: format ?%s? expects type ?char *?, but argument 4 has type ?int?
prueba01.c:219: warning: format ?%s? expects type ?char *?, but argument 4 has type ?int?


Como has mezclado "gets" y "scanf", te puede saltar valores. Por ejemplo, en una primera prueba a mí me pasa esto:


opcion: 1
 a.Discapacitado
 b.tercera edad (> a 60 anios)
 c.Embarazadas
letra de la opcion: 
Monto disponible en la cuenta del cliente:


Es decir, no está haciendo esta lectura:


printf("letra de la opcion: ");
fflush(stdin);
gets(crear_cliente[i].cp_cliente);


Luego al probar un poco más la ejecución, si intentas entrar a la opción 1, sí abandona el programa con un mensaje de error:


opcion:1
Nombre y apellido| Cedula | Edad | Monto disp. en la cuenta |
Fallo de segmentación


Luego está fallando aquí:


      for(i=0;i<N_clientes;i++){
      printf("\n%s %s    %s    %d    %g\n",crear_cliente[i].nombre,crear_cliente[i].apellido,
             operac_b[i].cedula,fecha_nac[i].edad,operac_b[i].md_cuenta);
            }


lo que quiere decir que el problema puede ser debido al warning anterior (esa es una de las líneas en las que te avisaba) o a que alguno de los datos no se haya llegado a guardar, porque te esté saltando lecturas como la que te he indicado (o a cualquier otra cosa, pero esas dos son candidatos muy claros).

Muestra datos tras cada lectura, para comprobar que todo se ha leído correctamente, y corrige esos warnings antes de seguir adelante.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)