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

Dos programas que ya me traen loco

Estas en el tema de Dos programas que ya me traen loco en el foro de C/C++ en Foros del Web. Hola a todos. Estoy haciendo dos programas y por más que intento no consigo que me funcionen del todo como yo quiero. Ya tengo la ...

  #1 (permalink)  
Antiguo 16/12/2006, 11:34
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Dos programas que ya me traen loco

Hola a todos.

Estoy haciendo dos programas y por más que intento no consigo que me funcionen del todo como yo quiero. Ya tengo la mente tan enredada que no se que hacer. (Pongo sólo el SEGUNDO programa en este post porques si no se va a hacer muy grande)

En este caso el programa es de ficheros. Tengo un problema con una variable globa y es que no la reconoce o no se. Se trata de la ParteD(). El resto del programa funciona. Pero al seleccionar en el menu el numero 6, no hace nada, sólo devuelve el menu para hacer otra selección. Espero que alguien pueda encontrar el error y como corregirlo. El código es:

/*Escribir un programa en C que a partir de un fichero dado con el formato adecuado:
a) Cuente el nº de clientes de un banco con al menos 40 años y saldo en cuenta inferior a 1.200 euros;
b) Imprima el saldo menor y el saldo mayor de los clientes mayores de 30 años;
c) Imprima la edad media de todos los clientes;
d) Imprima el número de clientes que se llaman igual y viven en la misma ciudad;*/

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

struct banco {
int Ncliente;
char Nombre[15];
char Ap[20];
int Edad;
int Saldo;
char Ciudad[20];
};
struct banco Banco[10]; /* max 10 clientes */
/* variable global para guardar los datos de los clientes */

void InsertarCliente();
/* Añade un nuevo cliente al final del fichero */

void ConsultarCliente();
/* Consulta los datos personales de un cliente a traves de la clave del fichero */

void ParteA();

void ParteB();

void ParteC();

void ParteD();



void InsertarCliente()
/* Anade un nuevo cliente al final del fichero */
{FILE *fp;
int Edad, NCliente, Saldo;
char Nombre[20], Ap[20], Ciudad[20];
printf("Cuales son los datos del cliente a insertar?\n");
printf("Cliente:");
scanf("%d", &NCliente);
fflush(stdin);
printf("Nombre:");
gets(Nombre);
fflush(stdin);
printf("Apellido:");
gets(Ap);
printf("Edad:");
scanf("%d", &Edad);
fflush(stdin);
printf("Saldo:");
scanf("%d",&Saldo);
fflush(stdin);
printf("Ciudad:");
gets(Ciudad);
if ((fp=fopen("banco.txt", "a"))==NULL) /* detecta error */
{printf("Error al abrir el fichero");
}
fprintf(fp, "%d %s %s %d %d %s\n", NCliente, Nombre, Ap, Edad, Saldo, Ciudad);
/* escribimos el registro al final del fichero */
if (fclose(fp)==0)
{printf("\nFichero cerrado correctamente");
}
else {printf("Error al cerrar fichero");
}
}




void ConsultarCliente()
/* Consulta los datos personales de un cliente a traves del campo clave NCliente */
{FILE *fp;
int i=0, salir=0, Mat;
printf("Cual es el numero de matricula del cliente a consultar? ");
scanf("%d", &Mat);
if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{printf("Error al abrir el fichero");
}
do
{/* de paso guardamos los datos en estructuras adecuadas */
fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);
if (Mat==Banco[i].Ncliente)
{printf("%d %s %s %d %d %s\n", Banco[i].Ncliente, Banco[i].Nombre, Banco[i].Ap, Banco[i].Edad, Banco[i].Saldo, Banco[i].Ciudad);
salir=1;
}
else
{i++;
}
}
while (salir!=1 && !feof(fp));
if (fclose(fp)==0)
{printf("\nFichero cerrado correctamente");
}
else {printf("Error al cerrar fichero");
}
getch();

}

//void Consultarestadisticas()
/* Consulta las estadisticas de los clientes introducidos */



void ParteA()
{
FILE *fp;
int i=0, contador=0;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
printf("Error al abrir el fichero");
}

while (!feof(fp))
{
fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);

if(Banco[i].Edad>=40 && Banco[i].Saldo<1200)
contador++;
}

if (fclose(fp)==0)
printf("\nFichero cerrado correctamente\n");
else
printf("Error al cerrar fichero");

printf("Hay %d cliente(s) mayor(es) de 40 años con saldo inferior a 1200 euros.\n", contador);
}



void ParteB()
{
FILE *fp;
int i=0, contador=0, saldo_menor, saldo_mayor;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
printf("Error al abrir el fichero");
}

while (!feof(fp))
{
fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);

if(Banco[i].Edad>30)
{
if(contador==0)
{
saldo_menor = Banco[i].Saldo;
saldo_mayor = Banco[i].Saldo;
}
else
{
if(Banco[i].Saldo<saldo_menor)
saldo_menor = Banco[i].Saldo;
if(Banco[i].Saldo>saldo_mayor)
saldo_mayor = Banco[i].Saldo;
}
contador++;
}
}

if (fclose(fp)==0)
printf("\nFichero cerrado correctamente");
else
printf("Error al cerrar fichero");

if(contador==0)
{
printf("No hay personas mayores de 30");
}
else
{
printf("\nSaldo menor: %d\n", saldo_menor);
printf("Saldo mayor: %d\n", saldo_mayor);
printf("Clientes mayores de 30 años: %d\n", contador);
}
}

void ParteC()
{
FILE *fp;
int i=0, suma_edad=0, total=0;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
printf("Error al abrir el fichero");
}

while (!feof(fp))
{
fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);

suma_edad += Banco[i].Edad;
total++;
}

if (fclose(fp)==0)
printf("\nFichero cerrado correctamente\n");
else
printf("Error al cerrar fichero");

if(total==0)
{
printf("No hay personas");
}
else
{
printf("Edad media: %d\n", suma_edad / total);
}
}

void ParteD()
{
FILE *fp;
int i=0, j, iguales=0, num_clientes=10;
for (j = i + 1; j < num_clientes; j++) {
if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0)) {
iguales++;}
}
}


main ()
{FILE * fp;
int resp;
for(;;)
{do
{//clrscr();
printf("\n\t MENU PROGRAMA\n");
printf("\t-----------------\n");
printf("1. Insertar nuevo cliente\n");
printf("2. Consultar cliente\n");
printf("3. Clientes > 40 años y saldo < 1200 euros\n");
printf("4. Saldo menor y mayor de clientes > 30 años\n");
printf("5. Edad media de los clientes\n");
printf("6. Clientes que se llaman igual y viven en la misma ciudad\n");
printf("7. Terminar\n");
scanf("%d", &resp);
}
while (resp!=1 && resp!=2 && resp!=3 && resp!=4 && resp!=5 && resp!=6 && resp!=7 && resp!=8); /* solo aceptamos respuestas validas */
switch (resp)
{case 1: InsertarCliente();
break;
case 2: ConsultarCliente();
break;
case 3: ParteA();
break;
case 4: ParteB();
break;
case 5: ParteC();
break;
case 6: ParteD();
break;
//case 3: ConsultarEstadisticas();
// break;
default: printf("\nFin de programa\a");
exit(0);
break;
}
}
}

Última edición por Nevhazovat; 16/12/2006 a las 14:50 Razón: Mejorar la comprensión
  #2 (permalink)  
Antiguo 17/12/2006, 04:51
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

Código:
void ParteD()
{
FILE *fp;
int i=0, j, iguales=0, num_clientes=10;
for (j = i + 1; j < num_clientes; j++) {
if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0)) {
iguales++;}
}

}
El problema podría estar en que tu función no hace lo que tu esperas.

Si te fijas la variable i siempre será 0. Por tanto se buscara solo la coincidencia del primer registro.
Y si no se encuentra coincidencia se abandona la función.
Y no se compararan los demás, Aun que se encuentren posiblemente otras coincidencias más adelante.

Si tienes que verificar la coincidencia en 10 registros, tienes que comparar cada uno 10 veces. En tu función solo comparas el primero 10 veces.
Y ese FILE *fp , parece estar de mas.
  #3 (permalink)  
Antiguo 17/12/2006, 05:19
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Hola.

Oops, pero si no he metido nada. En realidad lo que quería poner es:

Código:
void ParteD()
{
FILE *fp;
int i=0, j, iguales=0, num_clientes=10;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
	  printf("Error al abrir el fichero");
}

while (!feof(fp))
{

for (j = i + 1; j < num_clientes; j++) {
if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0)) {
iguales++;}
}
}

if (fclose(fp)==0)
	printf("\nFichero cerrado correctamente\n");
else
	printf("Error al cerrar fichero");

if(iguales==0)
{
	printf("No hay personas");
}
else
{
	printf("Clientes con nombre y ciudad iguales: %d\n", iguales);
}
}

Al seleccionarlo en el menu se me queda pillado. Con lo de que i siempre será cero te refieres a que no he de iniciarlizarlo a 0. Entonces tengo que recorrer 2 bucles o ¿cómo?

Muchas gracias por responder.
  #4 (permalink)  
Antiguo 17/12/2006, 05:22
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

inicializarlo es correcto.
Podria ser como tu otro programa al buscar desordenados.
  #5 (permalink)  
Antiguo 17/12/2006, 05:30
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Ufff, no veo como podría hacerlo. ¿Cómo sugieres que lo haga?
  #6 (permalink)  
Antiguo 17/12/2006, 05:53
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

Pues tu lo mencionaste, usando 2 bucles for, uno para i y otro para j.
i apuntaria al elemento buscado y j recorrería en busca de coincidencias.
el codigo te toca.
  #7 (permalink)  
Antiguo 17/12/2006, 06:03
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

¿Sería algo así?

for (i= 0; i < num_clientes; i++) {
for(j=0; j < num_clientes;j++){
  #8 (permalink)  
Antiguo 17/12/2006, 06:17
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

en este vaso estarias comparando el buscado con sigo mismo.
j tiene que ser = i+1; o 1; verifica cual te funciona mejor, el primero optimizaria la busqueda.
  #9 (permalink)  
Antiguo 17/12/2006, 06:28
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Entonces sería

for (i= 0; i < num_clientes; i++) {
for(j=i+1; j < num_clientes;j++){

De todas formas si es así se me queda pillado el programa.
  #10 (permalink)  
Antiguo 17/12/2006, 06:41
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Dos programas que ya me traen loco

tendria que funcionar, si hay datos y coincidencias.
el problea ahora esta en que si esta opcion es la primera que llamas, no te dara nada ya que la el array de estructuras Banco, esta sin datos, pues en tu funcion abres el fichero pero no lo lees.

atento a los detalles. verifica eso. tengo que irme. mañana revisare tus respuestas.
espero que todo salga bien.

solo como ultima recomendacion, tal vez este sea un programa de tarea y lo primero que quieres es terminarlo y que funciones a como sea. pero la verdad es uso de variables globales no es recomendado.
por tu cuenta, con mas tiempo podrias reescribirlo usando tus estructuras localmente y pasarlas como parametro a tus funcoines.

Saludos.
  #11 (permalink)  
Antiguo 17/12/2006, 07:05
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Hola.

Pues si, se me echó el tiempo encima haciendo las demás prácticas que eran más sencillas y estas que son las más complicadas para mí, resulta que tengo menos tiempo para pensarlas, ya que mañana antes de las 00:00 he de entregarlas, y sí, puede que el algoritmo no sea óptimo para un programador profesional, pero yo estoy empezando en esto y no tengo suficientes conocimientos para optimizarlo. Lo que me interesa es que funcione. Cuando no tenga que entregar prácticas ya podré dedicarme a mejorarlo para el examen.

Te pego el código por si hay algún otro error que haya pasado por alto.

Código:
/*Escribir un programa en C que a partir de un fichero dado con el formato adecuado:
a) Cuente el nº de clientes de un banco con al menos 40 años y saldo en cuenta inferior a 1.200 euros;
b) Imprima el saldo menor y el saldo mayor de los clientes mayores de 30 años;
c) Imprima la edad media de todos los clientes;
d) Imprima el número de clientes que se llaman igual y viven en la misma ciudad;*/

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

struct banco {
			int Ncliente;
         char Nombre[15]; 
			char Ap[20];
         int Edad; 
         int Saldo; 
         char Ciudad[20]; 
			};
struct banco Banco[10];  /* max 10 clientes */
/* variable global para guardar los datos de los clientes */

void InsertarCliente();
/* Añade un nuevo cliente al final del fichero */

void ConsultarCliente();
/* Consulta los datos personales de un cliente a traves de la clave del fichero */ 

//void ConsultarEstadisticas(); 
/* Consulta las estadisticas de los clientes introducidos */ 

void ParteA();

void ParteB();

void ParteC();

void ParteD();



void InsertarCliente()
/* Anade un nuevo cliente al final del fichero */
{FILE *fp;
int Edad, NCliente, Saldo;
char Nombre[20], Ap[20], Ciudad[20];
printf("Cuales son los datos del cliente a insertar?\n");
printf("Cliente:");
scanf("%d", &NCliente);
fflush(stdin);
printf("Nombre:");
gets(Nombre);
fflush(stdin);
printf("Apellido:");
gets(Ap);
printf("Edad:");
scanf("%d", &Edad);
fflush(stdin);
printf("Saldo:");
scanf("%d",&Saldo);
fflush(stdin);
printf("Ciudad:");
gets(Ciudad);
if ((fp=fopen("banco.txt", "a"))==NULL) /* detecta error */
		 {printf("Error al abrir el fichero");
		 }
fprintf(fp, "%d  %s  %s  %d  %d  %s\n", NCliente, Nombre, Ap, Edad, Saldo, Ciudad);
/* escribimos el registro al final del fichero */
if (fclose(fp)==0)
	  {printf("\nFichero cerrado correctamente");
	  }
else {printf("Error al cerrar fichero");
		}
}




void ConsultarCliente()
/* Consulta los datos personales de un cliente a traves del campo clave NCliente */
{FILE *fp;
int i=0, salir=0, Mat;
printf("Cual es el numero de matricula del cliente a consultar? ");
scanf("%d", &Mat);
if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
       {printf("Error al abrir el fichero"); 
		 }
do 
	{/* de paso guardamos los datos en estructuras adecuadas */
	 fscanf(fp, "%d  %s  %s  %d  %d  %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);
	 if (Mat==Banco[i].Ncliente)
       {printf("%d  %s  %s  %d  %d  %s\n", Banco[i].Ncliente, Banco[i].Nombre, Banco[i].Ap, Banco[i].Edad, Banco[i].Saldo, Banco[i].Ciudad); 
	salir=1;
       } 
	 else
       {i++; 
		 }
   } 
while (salir!=1 && !feof(fp));
if (fclose(fp)==0)
	  {printf("\nFichero cerrado correctamente");
     } 
else {printf("Error al cerrar fichero");
      } 
getch();

}


void ParteA()
{
FILE *fp; 
int i=0, contador=0;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
     printf("Error al abrir el fichero"); 
} 

while (!feof(fp))
{ 
	fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);

   if(Banco[i].Edad>=40 && Banco[i].Saldo<1200) 
	  contador++;
} 

if (fclose(fp)==0)
   printf("\nFichero cerrado correctamente\n"); 
else
	printf("Error al cerrar fichero");

printf("Hay %d cliente(s) mayor(es) de 40 años con saldo inferior a 1200 euros.\n", contador); 
}



void ParteB() 
{ 
FILE *fp;
int i=0, contador=0, saldo_menor, saldo_mayor; 

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{ 
	  printf("Error al abrir el fichero");
}

while (!feof(fp)) 
{
	fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);
    
	if(Banco[i].Edad>30)
   { 
      if(contador==0) 
		{
         saldo_menor = Banco[i].Saldo; 
         saldo_mayor = Banco[i].Saldo; 
		 }
       else 
		{
			if(Banco[i].Saldo<saldo_menor)
           saldo_menor = Banco[i].Saldo; 
         if(Banco[i].Saldo>saldo_mayor) 
			  saldo_mayor = Banco[i].Saldo;
		 }
      contador++; 
	}
} 

if (fclose(fp)==0)
   printf("\nFichero cerrado correctamente"); 
else 
	printf("Error al cerrar fichero");

if(contador==0)    
{
	printf("No hay personas mayores de 30");
} 
else
{ 
	printf("\nSaldo menor: %d\n", saldo_menor);
	printf("Saldo mayor: %d\n", saldo_mayor);
	printf("Clientes mayores de 30 años: %d\n", contador);
} 
}

void ParteC()
{
FILE *fp;
int i=0, suma_edad=0, total=0;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
	  printf("Error al abrir el fichero");
}

while (!feof(fp))
{
	fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);

	suma_edad += Banco[i].Edad;
	total++;
}

if (fclose(fp)==0)
	printf("\nFichero cerrado correctamente\n");
else
	printf("Error al cerrar fichero");

if(total==0)
{
	printf("No hay personas");
}
else
{
	printf("Edad media: %d\n", suma_edad / total);
}
}


void ParteD()
{
FILE *fp;
int i=0, j, iguales=0, num_clientes=10;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
	  printf("Error al abrir el fichero");
}

while (!feof(fp))
{

for (i= 0; i < num_clientes; i++) {
for(j=i+1; j < num_clientes;j++){
if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0)) {
iguales++;}
}
}
}

if (fclose(fp)==0)
	printf("\nFichero cerrado correctamente\n");
else
	printf("Error al cerrar fichero");

if(iguales==0)
{
	printf("No hay personas");
}
else
{
	printf("Clientes con nombre y ciudad iguales: %d\n", iguales);
}
}




main ()
{FILE * fp;

int resp;

for (;;) 
{do 
  {//clrscr(); 
	printf("\n\t  MENU PROGRAMA\n");
   printf("\t-----------------\n"); 
   printf("1. Insertar nuevo cliente\n"); 
	printf("2. Consultar cliente\n");
   printf("3. Clientes > 40 años y saldo < 1200 euros\n"); 
   printf("4. Saldo menor y mayor de clientes > 30 años\n"); 
	printf("5  Edad media de los clientes\n");
	printf("6. Clientes con nombre y ciudad iguales\n");
	printf("7. Terminar\n");
   scanf("%d", &resp); 
	}
 while (resp!=1 && resp!=2 && resp!=3 && resp!=4 && resp!=5 && resp!=6 && resp!=7); /* solo aceptamos respuestas validas */
 switch (resp) 
  {case 1:  InsertarCliente(); 
       break; 
   case 2:  ConsultarCliente(); 
       break; 
	case 3:  ParteA();
       break; 
   case 4:  ParteB(); 
       break; 
   case 5:  ParteC(); 
		 break;
	case 6:  ParteD();
	default: printf("\nFin de programa\a");
       exit(0); 
		 break;
   } 
 } 
}
  #12 (permalink)  
Antiguo 17/12/2006, 07:42
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Para poder encontrar errores (tú u otros), lo primero es ordenar el código correctamente.

Deberías tratar de indentar correctamente el código. Sino, nadie se aclara.
  #13 (permalink)  
Antiguo 17/12/2006, 07:54
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Yo creo que el código está bien ordenado ¿no? Nadie me ha dicho nada al respecto.

Si puedes echarme una mano será bienvenida.

Un saludo.
  #14 (permalink)  
Antiguo 17/12/2006, 08:51
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Cita:
Iniciado por Nevhazovat Ver Mensaje
Yo creo que el código está bien ordenado ¿no? Nadie me ha dicho nada al respecto.
Para nada (al menos el código que has puesto entre CODE).

Por ejemplo, nada más ver las primeras líneas:

Código:
struct banco {
			int Ncliente;
         char Nombre[15]; 
			char Ap[20];
         int Edad; 
         int Saldo; 
         char Ciudad[20]; 
			};
Eso no está bien.
  #15 (permalink)  
Antiguo 17/12/2006, 08:56
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Pues ahora si que me has dejado planchado. Lo único que se me ocurre es esto:

struct banco {
int Ncliente, Edad, int Saldo;
char Nombre[15], Ap[20], Ciudad[20];
};

Pero vamos creo que es lo mismo de antes. Si acaso poner Saldo como float, pero por lo demás no veo el error.
  #16 (permalink)  
Antiguo 17/12/2006, 12:09
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Hola.

He estado trabajando un poco en el programa. Pero no salen los datos bien cuando los consulto desde el menú. Además cuando doy a la opcion consultar estadisticas se me queda pillado el programa.

Si podéis revisarlo en busca de errores. Yo es que estoy tan borracho de código que no veo nada.

Código:
/*Escribir un programa en C que a partir de un fichero dado con el formato adecuado:
a) Cuente el numero de clientes de un banco con al menos 40 años y saldo en cuenta inferior a 1.200 euros;
b) Imprima el saldo menor y el saldo mayor de los clientes mayores de 30 a¤os;
c) Imprima la edad media de todos los clientes;
d) Imprima el numero de clientes que se llaman igual y viven en la misma ciudad;*/

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


struct banco {
int Ncliente;
char Nombre[15];
char Ap[20];
int Edad;
int Saldo;
char Ciudad[20];
};
struct banco Banco[10]; /* max 10 clientes */
int num_clientes = 0;
/* variable global para guardar los datos de los clientes */

void InsertarCliente();
/* A¤ade un nuevo cliente al final del fichero */

void ConsultarCliente();
/* Consulta los datos personales de un cliente a traves de la clave del fichero */

void ConsultarEstadisticas();
/* Consulta las estadisticas de los clientes introducidos */

void CargarDatos()  {

	FILE *fp;
   char c;
   int pos = 0;
   char cad[5];

   if ((fp=fopen("banco.txt","r"))!=NULL)  {
      c = getc(fp);
      Banco[num_clientes].Ncliente = atoi(&c);
		// atoi pasa de char a entero
      c = getc(fp);  // coge el espacio que separa NCliente de Nombre
      c = getc(fp);
      while (c != ' ')  { // mientras q no llegue el espacio que separa Nombre de Ap
		  Banco[num_clientes].Nombre[pos] = c;
	     pos++;
	     c = getc(fp);
      } // Esto bucle while va metiendo caracter a caracter el nombre del cliente
		c = getc(fp);
      pos = 0;
      while (c != ' ')  { // Ahora hacemos lo mismo con Ap
	     Banco[num_clientes].Ap[pos] = c;
		  pos++;
	     c = getc(fp);
     }
     c = getc(fp);
	  pos = 0;
     while (c != ' ')  {
	    cad[pos] = c;
	    pos++;
		 c = getc(fp);
     }
     cad[pos] = '\n';
     Banco[num_clientes].Edad = atoi(cad); // Volvemos a pasar la cadena cad a entero
	  pos = 0;
     c = getc(fp);
     while (c != ' ')  {
	    cad[pos] = c;
		 pos++;
	    c = getc(fp);
     }
     cad[pos] = '\n';
	  Banco[num_clientes].Saldo = atoi(cad);
     pos = 0;
     c = getc(fp);
     while (c != ' ')  {
		 Banco[num_clientes].Ciudad[pos] = c;
	    pos++;
	    c = getc(fp);
     }
	  num_clientes++;
   }


}

void InsertarCliente()  {
	/* Anade un nuevo cliente al final del fichero */
	FILE *fp;
	int Edad, NCliente, Saldo;
	char Nombre[20], Ap[20], Ciudad[20];
	printf("Cuales son los datos del cliente a insertar?\n");
	printf("NCliente:");
	scanf("%d", &NCliente);
	fflush(stdin);
	printf("Nombre:");
	gets(Nombre);
	fflush(stdin);
	printf("Apellido:");
	gets(Ap);
	printf("Edad:");
	scanf("%d", &Edad);
	fflush(stdin);
   printf("Saldo:");
	scanf("%d",&Saldo);
	fflush(stdin);
	printf("Ciudad:");
   gets(Ciudad);
	if ((fp=fopen("banco.txt", "a"))==NULL) { /* detecta error */
       printf("Error al abrir el fichero");
	}
	else  {
		 fprintf(fp, "%d %s %s %d %d %s\n", NCliente, Nombre, Ap, Edad, Saldo, Ciudad);
       /* escribimos el registro al final del fichero */
		 num_clientes++;
		 if (fclose(fp)==0)  {
		printf("\nFichero cerrado correctamente");
		 }
		 else {
	   printf("Error al cerrar fichero");
		 }
	}
}

void ConsultarCliente()  {
   /* Consulta los datos personales de un cliente a traves del campo clave NCliente */
	FILE *fp;
	int i=0, salir=0, Mat;
	printf("Cual es el numero de matricula del cliente a consultar? ");
	scanf("%d", &Mat);
	if ((fp=fopen("banco.txt", "r"))==NULL) { /* detecta error */
	printf("Error al abrir el fichero");
	}
	else  {
       do {
	  /* de paso guardamos los datos en estructuras adecuadas */
	  fscanf(fp, "%d %s %s %d %d %s\n", &(Banco[i].Ncliente), Banco[i].Nombre, Banco[i].Ap, &(Banco[i].Edad), &(Banco[i].Saldo), Banco[i].Ciudad);
	  if (Mat==Banco[i].Ncliente) {
		  printf("%d %s %s %d %d %s\n", Banco[i].Ncliente, Banco[i].Nombre, Banco[i].Ap, Banco[i].Edad, Banco[i].Saldo, Banco[i].Ciudad);
		  salir=1;
	  }
	  else  {
		  i++;
	  }
		 }
		 while (salir!=1 && !feof(fp));

		 if (fclose(fp)==0) {
		printf("\nFichero cerrado correctamente");
		 }
		 else {
		printf("Error al cerrar fichero");
		 }
		 getch();
	}
}

void ConsultarEstadisticas()  {
/* Consulta las estadisticas de los clientes introducidos */
FILE *fp;
	 int i,salir=0, cuenta_clientes = 0, menor = Banco[0].Saldo, mayor = Banco[0].Saldo, media, iguales = 0, total = 0, j;
	 if ((fp=fopen("banco.txt", "r"))==NULL) { /* detecta error */
	printf("Error al abrir el fichero");
	}
	else {
	 for (i = 0; i < num_clientes; i++)  {
	// para los clientes con mas de 40 años y mas de 1.200 euros de saldo
	if ((Banco[i].Edad > 40) && (Banco[i].Saldo > 1200))  {
		  cuenta_clientes++;
	}
	// Calculo del mayor de los saldos
	if (Banco[i].Saldo > mayor)  {
		 mayor = Banco[i].Saldo;
	}
	// Calculo del menor de los saldos
	if (Banco[i].Saldo < menor)   {
		 menor = Banco[i].Saldo;
	}
	// Calculo de la edad media de los clientes
	total = total + Banco[i].Edad;

	// Calculo de los nombres y las ciudades iguales
	for (j = i + 1; j < num_clientes; j++)  {
		if (((strcmp(Banco[i].Nombre,Banco[j].Nombre)) == 0) && ((strcmp(Banco[i].Ciudad,Banco[j].Ciudad)) == 0))  {
		1+iguales++;
		 }
	}
	media = total / num_clientes;
	printf("\nNuumero de clientes mayores de 40 años y con saldo mayor de 1.200 Euros: %d ",cuenta_clientes);

	printf("\nMayor de los saldos: %d",mayor);

	printf("\nMenor de los saldos: %d",menor);

	printf("\nMedia de edad de los clientes: %d",media);

	printf("\nNumero de clientes con nombre y ciudad iguales: %d",iguales);

		while (salir!=1 && !feof(fp));

		 if (fclose(fp)==0) {
		printf("\nFichero cerrado correctamente");
		 }
		 else {
		printf("Error al cerrar fichero");
		 }
		 getch();
	}
}

}

void main () {

	char resp;
		  CargarDatos();

	do {
		 printf("\nMENU PROGRAMA\n");
				printf("----------------\n");
				printf("1. Insertar nuevo cliente\n");
				printf("2. Consultar cliente\n");
		 printf("3. Consultar estadisticas\n");
				printf("4. Terminar\n");
				resp = getch();
				switch(resp)  {
		case '1': InsertarCliente();
			  resp = '1';
			  break;
		case '2': ConsultarCliente();
			  resp = '2';
			  break;
		case '3': ConsultarEstadisticas();
			  resp = '3';
			  break;
		default: printf("\nFin de programa\a");
			  break;
		 }
	}
	while (resp !='4'); /* solo aceptamos respuestas validas */
}
  #17 (permalink)  
Antiguo 17/12/2006, 13:10
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

No, no... Me refiero a que indentas mal. No sigues una estructura lógica en el código.

Es decir, a veces te faltan tabuladores, otras te faltan, mezclas espacios con tabuladores, pones cada comentario de una manera...
  #18 (permalink)  
Antiguo 17/12/2006, 13:23
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Pero eso es porque no se programar. Soy un novato que necesita ayuda.
  #19 (permalink)  
Antiguo 17/12/2006, 13:25
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Tampoco.

Para indentar lo único que hace falta es dar al tabulador, para programar hace falta algo más ;)

Para que te guíes con un ejemplo:

Código:
int x;
void set_x(void)
{
	int i;
	for (i = 0; i < 100; i++) {
		if (i)
			x = 5;

		printf("que bien pero que bien\n"
			"genial de lo mejor\n"
			"cuantas lineas\n");
	}
}
  #20 (permalink)  
Antiguo 17/12/2006, 13:26
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Bueno, pues tampoco se indentar.

¿Algo que aportar a mis dudas?
  #21 (permalink)  
Antiguo 17/12/2006, 13:28
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Dos programas que ya me traen loco

Te puse un ejemplo.
  #22 (permalink)  
Antiguo 17/12/2006, 13:56
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

¿Un ejemplo de qué?
  #23 (permalink)  
Antiguo 17/12/2006, 13:56
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Vamos, no te hagas la victima que bien que sabes, pero namas tiene que caerte el veinte...
El chiste es que el codigo este ordenado, que cada bloque se distinga de la linea del programa principal.
Eso hace la programacion mucho mas sencilla.

Saludos
  #24 (permalink)  
Antiguo 17/12/2006, 14:00
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Por cierto si te refieres a que el código aparece mal tabulado eso es porque a la hora de pegarlo en el bloc de notas se cambia. Por eso aparece así.
  #25 (permalink)  
Antiguo 17/12/2006, 14:02
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

No me hago la víctima. El post lo abrí para que alguien me ayude si quiere. Tu ya veo que no quieres. Está bien, lo respeto, pero entonces no respondas al post ¿no crees?

Un saludo.
  #26 (permalink)  
Antiguo 17/12/2006, 14:14
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

vale, pero si si me da la gana responderlo que?
Y checa tu programa.
Se gune sto tu problema es ParteD lo cual es obvio, y eso que no he revisado lo demas.

void ParteD()
{
FILE *fp;
int i=0, j, iguales=0, num_clientes=10;
for (j = i + 1; j < num_clientes; j++)
{
if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0))
{
iguales++;
}
}
}

Para que declaras FILE *fp si nunca lo usas en esa funcion?
Para que declaras i y j si con una es ams que suficiente?

void ParteD()
{
int i, iguales=0, num_clientes=10;
for (i=1; i < num_clientes; i++)
{
if ((strcmp(Banco[i-1].Nombre,Banco[i].Nombre) == 0) && (strcmp(Banco[i-1].Ciudad,Banco[i].Ciudad) == 0))
{
iguales++;
}
}
}

Por otro lado, el codigo no tendria sentido.

Si lo que quieres comparar son todos los elementos de la lista tendrias que hacer algo ams que eso.

Serian los de fors que te dicen uno con j y otro con i y que los dos recorran la misma lista y la vallan comparando.
Solo asi podrias comparar todos los elementos.

Para la otra solo escribe el codigo que tu piensas que esta mal, no todo el rollo.

Saludos
  #27 (permalink)  
Antiguo 17/12/2006, 14:19
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Supongo que será obvio porque lo puse en negrita quizás. Y responder si te da la gana puedes, claro está. Yo no soy el administrador del foro, pero vamos postear pa ná es tontería.

No se porque salió solo eso. En realidad lo que debería poner es:

Código:
void ParteD()
{
FILE *fp;
int i=0, j, iguales=0, num_clientes=10;

if ((fp=fopen("banco.txt", "r"))==NULL) /* detecta error */
{
	  printf("Error al abrir el fichero");
}

while (!feof(fp))
{

for (j = i + 1; j < num_clientes; j++) {
if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0)) {
iguales++;}
}
}

if (fclose(fp)==0)
	printf("\nFichero cerrado correctamente\n");
else
	printf("Error al cerrar fichero");

if(iguales==0)
{
	printf("No hay personas");
}
else
{
	printf("Clientes con nombre y ciudad iguales: %d\n", iguales);
}
}

Última edición por Nevhazovat; 17/12/2006 a las 14:47
  #28 (permalink)  
Antiguo 17/12/2006, 15:10
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Haber, explicame una cosa.
Para que abres un archivo? Namas para cerrarlo??
Algo te ha de faltar ahi.

Por otro lado, siques usando i y j cuando con una de ellas es ams que suficiente.
Y no entiendo que intentas comparar aqui:

if ((strcmp(Banco[i].Nombre,Banco[j].Nombre) == 0) && (strcmp(Banco[i].Ciudad,Banco[j].Ciudad) == 0)) {

ahi lo unico que haces es ver si un elemento es igual al que le sigue. Por ningun lado estas comparando toda la lista.

Asi que efectivamente, ese codigo no hace nada... solo habre y cierra un archivo, y hace una comparacion muy extraña que no le encuentor proposito.

Saludos
  #29 (permalink)  
Antiguo 17/12/2006, 15:21
 
Fecha de Ingreso: diciembre-2006
Mensajes: 33
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Dos programas que ya me traen loco

Bueno, evidentemente está mal, si no no estaría posteandolo aquí.

Esto es lo que tiene que hacer el programa

a) Cuente el nº de clientes de un banco con al menos 40 años y saldo en cuenta inferior a 1.200 euros.
b) Imprima el saldo menor y el saldo mayor de los clientes mayores de 30 años.
c) Imprima la edad media de todos los clientes.
d) Imprima el número de clientes que se llaman igual y viven en la misma ciudad.

Y el último apartado es el que estoy tratando de hacer.

Dices que no hacefalta j, pero si dos bucles. Eso no lo entiendo. ¿Cómo lo haces entonces?
  #30 (permalink)  
Antiguo 17/12/2006, 16:08
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Dos programas que ya me traen loco

Me refiero que no hace falta usar j cuando solo tienes un bucle. Si tuvieras 2 entonces si, uno para cada uno.
Aun asi, me dejas con la intriga de para que abres y cierras un archivo.

Saludos
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 10:16.