/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema con programa en borland c

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
ghviso



Registrado: 15 Jun 2011
Mensajes: 3

MensajePublicado: 15/06/2011 12:22 pm
Título: Problema con programa en borland c

El programa tendria que mostrar:
1) Un listado con la cantidad de pasajeros por destino
2) Un listado con los 10 vuelos con mayor cantidad de pasajeros
3) La menor cantidad de pasajeros que viajo en algun vuelo

el codigo es:

#include <stdio.h>
#include <stdlib.h>
#define MAXA 100
#define MAXB 10
////////////////////////////////////////////////////////////////////////
struct RegFec
{
int D;
int M;
int A;
}typedef RegFec;

struct RegHr
{
int H;
int M;
}typedef RegHr;

struct RegVuelo
{
char N[10];
RegFec F;
RegHr H;
char D[10];
int C;
}typedef RegVuelo;

struct RegVueloA
{
char D[10];
int C;
}typedef RegVueloA;

struct RegVueloB
{
char N[10];
int C;
}typedef RegVueloB;

RegVueloA A[MAXA];
RegVueloB B[MAXB];

RegFec F;
RegHr Hr;
RegVuelo vuelo;


int ceA=0;
int ceB=0;
int I=0;
int cant=0;
int Hubo_Datos=0;
int HayDatos;
////////////////////////////////////////////////////////////////////////
int EsBisiesto (A)
{
int Es=0;

if ( ((A%4==0) && (A%100!=0)) || (A%400==0) )
{
Es=1;
}
return Es;
}
////////////////////////////////////////////////////////////////////////
int CantDias (M,A)
{
int Dias = 31;

if ( (M==4) || (M==6) || (M==9) || (M==11) )
{
Dias=30;
}
else
{
if ( (M==2) && (EsBisiesto (A)==1) )
{
Dias=29;
}
else
{
if ( (M==2) && (EsBisiesto (A)==0) )
{
Dias=28;
}
}
}
return Dias;
}
////////////////////////////////////////////////////////////////////////
int FechaValida(RegFec F)
{
int Es=0;

if (F.A>1800)
{
if ( (F.M>=1) && (F.M<=12) )
{
if ( (F.D>=1) && ( (CantDias (F.M,F.A))>=(F.D) ))
{
Es=1;
}
}
}
return Es;
}
////////////////////////////////////////////////////////////////////////
int IngresarFechaValida (RegFec F)
{
do
{
printf("Ingrese Dia\n");
scanf("%d",&F.D);

printf("Ingrese Mes\n");
scanf("%d",&F.M);

printf("Ingrese Año\n");
scanf("%d",&F.A);

}
while (FechaValida(F)==0);
return 0;
}
////////////////////////////////////////////////////////////////////////
int IngresarHoraValida (RegHr Hr)
{
int H;
int M;

do
{
printf("Ingrese la Hora\n");
scanf("%d",&H);
}while ((H>23) || (H<0) );

do
{
printf("Ingrese los Minutos\n");
scanf("%d",&M);
}while ( (M>59) || (M<0) );

Hr.H = H;
Hr.M = M;
return 0;
}
////////////////////////////////////////////////////////////////////////
int IngresarDatos (RegVuelo vuelo)
{
printf("Ingrese el numero de vuelo\n");
scanf("%s",vuelo.N);

IngresarFechaValida (vuelo.F);
IngresarHoraValida (vuelo.H);

printf("Ingrese el destino\n");
scanf("%s",vuelo.D);

do
{
printf("Ingrese la cantidad de pasajeros\n");
scanf("%d",&vuelo.C);
}while (vuelo.C<0);
return 0;
}
////////////////////////////////////////////////////////////////////////
int VerificarFinDatos (int HayDatos)
{
int Aux;

do
{
printf("Ingrese 1 si quiere ingresar datos o cualquier tecla para finalizar\n");
scanf("%d",&Aux);
}while ((Aux!=1) && (Aux!=0) );

if (Aux==1)
{
HayDatos=1;
}

else
{
HayDatos=0;
}
return HayDatos;
}
////////////////////////////////////////////////////////////////////////
int Buscar (RegVueloA A[MAXA], int ceA, RegVuelo vuelo)

{
int i = 0;

int pos;

while ((i < ceA) && (A[i].D != vuelo.D))
{
i=i+1;
}

if (i==ceA)

pos= -1;

else

pos= i;

return (pos);
}
//////////////////////////////////////////////////////
int InsertarOrdenado (RegVueloB B[MAXB], int *ceB,RegVuelo vuelo)
{
int i=(*ceB -1);

if (*ceB == MAXB)
{
if (B[i].C < vuelo.C)
i=i-1;
}
else
*ceB=*ceB+1;


while ((i>=0) && (B[i].C < vuelo.C))
{

B[i+1].C = B[i].C;
B[i+1].N[10] = B[i].N[10];
i = i-1;
}

if (i != MAXB-1)
{
B[i+1].C = vuelo.C;
B[i+1].N[10] = vuelo.N[10];

}
return 0;
}
////////////////////////////////////////////////////////////////////////
int Proceso (RegVuelo vuelo, RegVueloA A[MAXA],RegVueloB B[MAXB], int *cant, int *I, int *ceA, int *ceB)
{
int pos;

pos = (Buscar(A, *ceA, vuelo));

if (pos>=0)
{
A[pos].C = A[pos].C+vuelo.C ;
}
else
{
if (*ceA!=MAXA)
{
A[*ceA].D[10] = vuelo.D[10];
A[*ceA].C = vuelo.C;
*ceA=*ceA+1;
}
else
{
exit (0);
}
}

if (I==0)
{
*cant=vuelo.C ;
}
else
{
if (vuelo.C < *cant)
{
*cant=vuelo.C;
}
}

I=I+1;

InsertarOrdenado (B, ceB, vuelo);

return 0;
}
///////////////////////////////////////////////////////////////////////
int MostrarDatos (RegVueloA A[MAXA], RegVueloB B[MAXB], int *cant, int *ceA, int *ceB, int Hubo_Datos)
{
int I=0;

for ((I=0) ; (I<(*ceA)) ; I++)
{
printf ("Destino: %d,Cantidad de pasajeros: %d\n", A[I].D[10], A[I].C);
}
for (I=0 ; (I<(*ceB)) ; I++)

{
printf ("Vuelo: %d,Cantidad: %d\n", B[I].N[10], B[I].C);
}
if (Hubo_Datos==1)
{
printf ("La menor cantidad fue: %d", *cant);
}
else

printf ("No hubo vuelos");

return 0;

}





///////////////////////////////////////////////////////////////////////
int main()
{


while (VerificarFinDatos (HayDatos)==1)
{
Hubo_Datos=1;
IngresarDatos(vuelo);
Proceso (vuelo,A,B,&cant,&I,&ceA,&ceB);
}

MostrarDatos (A,B,&cant,&ceA,&ceB,Hubo_Datos) ;

return 0;
}

el problema es que muestra todo 0
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7520
Ubicación: Mexico

MensajePublicado: 15/06/2011 2:29 pm
Título:

El detalle:

* Las declaraciones de alias con "typedef" estan mal, deberian ser, siguiendo el primer uso:
Código:
typedef struct RegFec {
   int D;
   int M;
   int A;
} RegFec;


* En las funciones "EsBisiesto" y "CantDias" te falta indicar el tipo de los parametros (signed int).

* Varias de las funciones (por ejemplo "IngresarHoraValida") retornan un valor que no es utilizado en el programa, deberias cambiarles el tipo de retorno a "void", ya en eso deberias agregar los prototipos (declaraciones) de las funciones al principio del programa para no depender del orden de estas (de las funciones).

* El planteamiento de las estructuras esta mal ya que el tipo "Vuelo" deberia incluir estructuras de tipo "RegVueloA" y "RegVueloB", por cierto esos nombres no dicen nada sobre el tipo. Peor aun, los tipos son identicos, solo se diferencian en el nombre de una campo ("D" vs "N", de nuevo los nombres no dicen nada). En lugar de esos dos tipos deberias utilizar uno solo y diferenciar de la forma que ya lo haces: utilizando dos arrays.

* Los campos "N" y "D" de las estructuras son de tipo "array de caracteres", ellos no los puedes copiar mediante el operador de asignacion:
Código:
while ( (i >= 0) && (B[i].C < vuelo.C) ) {
   B[i + 1].C = B[i].C;
   B[i + 1].N[10] = B[i].N[10];
   i = i - 1;
}
if (i != MAXB - 1) {
   B[i + 1].C = vuelo.C;
   B[i + 1].N[10] = vuelo.N[10];
}

Para empezar es erroneo ya que el elemento 10 del campo "N" no existe (el ultimo tiene el indice 9) y solo copiaria el ultimo elemento (si lo fuera).

En su lugar debes utilizar la funcion "strcpy" (prototipo en <string.h>):
Código:
while ( (i >= 0) && (B[i].C < vuelo.C) ) {
   B[i + 1].C = B[i].C;
   strcpy(B[i + 1].N, B[i].N);
   i = i - 1;
}
if (i != MAXB - 1) {
   B[i + 1].C = vuelo.C;
   strcpy(B[i + 1].N, vuelo.N);
}


* Mismo caso en la funcion "Proceso".

* La funcion "MostrarDatos". En esta hay varios errores y/o deficiencias:

1) Su valor de retorno siempre es cero, hay que cambiar su tipo de retorno a "void".

2) Ya tienes una variable "global" con el nombre "I", mejor utiliza el nombre usual para el primer contador: "i". Y no es necesario darle un valor inicial al declararla ya que lo primero que haces en los bucles es asignarle el valor 0.

3) Elimina los parentesis y las llaves de los bucles "for", no son necesarios.

4) Para imprimir los campos "D" y "N" como son cadenas no debes indicar un elemento con "[]" y debes utilizar el especificador de formato "%s".

5) Los parametros "cant", "ceA" y "ceB" no son modificados dentro de la funcion, por ello deberian ser de tipo signed int.

Con los cambios la funcion terminaria asi:
Código:
void MostrarDatos(RegVueloA A[MAXA], RegVueloB B[MAXB], int cant, int ceA, int ceB, int Hubo_Datos)
{
   int i;
   
   for (i = 0 ; i < ceA; i++)
      printf ("Destino: %s,Cantidad de pasajeros: %d\n", A[i].D, A[i].C);
   
   for (i = 0 ; i < ceB; i++)
      printf ("Vuelo: %s,Cantidad: %d\n", B[i].N, B[i].C);
   
   if (Hubo_Datos == 1) {
      printf ("La menor cantidad fue: %d", cant);
   } else
      printf ("No hubo vuelos");
}


No se si hay mas errores en el programa ya que no lo revise a fondo. Debes realizar los cambios que te comente y nos avisas si eso resuelve el problema.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
ghviso



Registrado: 15 Jun 2011
Mensajes: 3

MensajePublicado: 15/06/2011 3:21 pm
Título:

La verdad mil gracias por la respuesta, ya estaba por resignarme que nadie iba a animarse a ni siquiera ver el codigo xD
En lo que seria la definicion de los registros vuelo, vueloA y vueloB estan diferenciados porque la trastocada de la profesora quiere que trabajemos con arreglos de registros en lugar de con matrices, por eso si bien a la vista son muy similares guardan una diferencia, que es que en el primero se ingresan los datos, y los otros 2 son simplemente para definir los arreglos los cuales en el vueloA guarda la cantidad de pasajeros y el destino y en vueloB guarda la cantidad y el numero de vuelo.
Con lo del strcopy la verdad mil gracias, no tenia ni la mas remota idea de que no se podia hacer asignacion directa de strings. Lo del [10] que tenian era esperando que de esa manera definiera que fuese un string xD
Igualmente acabo de hacer todas las modificaciones que me decias y la salida sigue siendo esta:

Destino: "", cantidad de pasajeros: 0
Vuelo: "", cantidad: 0
La menor cantidad fue: 0

:S:S por las dudas te copio como cambie el "proceso" que es el unico que no copie textual :P

int Proceso (RegVuelo vuelo, RegVueloA A[MAXA],RegVueloB B[MAXB], int *cant, int *I, int *ceA, int *ceB)
{
int pos;

pos = (Buscar(A, *ceA, vuelo));

if (pos>=0)
{
A[pos].C = A[pos].C+vuelo.C ;
}
else
{
if (*ceA!=MAXA)
{
strcpy(A[*ceA].D, vuelo.D);
A[*ceA].C = vuelo.C;
*ceA=*ceA+1;
}
else
{
exit (0);
}
}

if (I==0)
{
*cant=vuelo.C ;
}
else
{
if (vuelo.C < *cant)
{
*cant=vuelo.C;
}
}

I=I+1;

InsertarOrdenado (B, ceB, vuelo);

return 0;
}

Y de nuevo, mil gracias enserio =)
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7520
Ubicación: Mexico

MensajePublicado: 16/06/2011 6:39 am
Título:

¿Por favor puedes colocar el codigo fuente completo del programa? Si tengo un poco de tiempo libre lo reviso en la tarde (en unas horas).

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
ghviso



Registrado: 15 Jun 2011
Mensajes: 3

MensajePublicado: 16/06/2011 7:32 am
Título:

asi es como quedo despues de las modificaciones


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXA 100
#define MAXB 10
////////////////////////////////////////////////////////////////////////
typedef struct RegFec {
int D;
int M;
int A;
} RegFec;

typedef struct RegHr {
int H;
int M;
} RegHr;

typedef struct RegVuelo{
char N[10];
RegFec F;
RegHr H;
char D[10];
int C;
} RegVuelo;

typedef struct RegVueloA {
char D[10];
int C;
} RegVueloA;

typedef struct RegVueloB {
char N[10];
int C;
} RegVueloB;

RegVueloA A[MAXA];
RegVueloB B[MAXB];

RegFec F;
RegHr Hr;
RegVuelo vuelo;


int ceA=0;
int ceB=0;
int I=0;
int cant=0;
int Hubo_Datos=0;
int HayDatos;
////////////////////////////////////////////////////////////////////////
int EsBisiesto (int A)
{
int Es=0;

if ( ((A%4==0) && (A%100!=0)) || (A%400==0) )
{
Es=1;
}
return Es;
}
////////////////////////////////////////////////////////////////////////
int CantDias (int M,int A)
{
int Dias = 31;

if ( (M==4) || (M==6) || (M==9) || (M==11) )
{
Dias=30;
}
else
{
if ( (M==2) && (EsBisiesto (A)==1) )
{
Dias=29;
}
else
{
if ( (M==2) && (EsBisiesto (A)==0) )
{
Dias=28;
}
}
}
return Dias;
}
////////////////////////////////////////////////////////////////////////
int FechaValida(RegFec F)
{
int Es=0;

if (F.A>1800)
{
if ( (F.M>=1) && (F.M<=12) )
{
if ( (F.D>=1) && ( (CantDias (F.M,F.A))>=(F.D) ))
{
Es=1;
}
}
}
return Es;
}
////////////////////////////////////////////////////////////////////////
int IngresarFechaValida (RegFec F)
{
do
{
printf("Ingrese Dia\n");
scanf("%d",&F.D);

printf("Ingrese Mes\n");
scanf("%d",&F.M);

printf("Ingrese Año\n");
scanf("%d",&F.A);

}
while (FechaValida(F)==0);
return 0;
}
////////////////////////////////////////////////////////////////////////
int IngresarHoraValida (RegHr Hr)
{
int H;
int M;

do
{
printf("Ingrese la Hora\n");
scanf("%d",&H);
}while ((H>23) || (H<0) );

do
{
printf("Ingrese los Minutos\n");
scanf("%d",&M);
}while ( (M>59) || (M<0) );

Hr.H = H;
Hr.M = M;
return 0;
}
////////////////////////////////////////////////////////////////////////
int IngresarDatos (RegVuelo vuelo)
{
printf("Ingrese el numero de vuelo\n");
scanf("%s",vuelo.N);

IngresarFechaValida (vuelo.F);
IngresarHoraValida (vuelo.H);

printf("Ingrese el destino\n");
scanf("%s",vuelo.D);

do
{
printf("Ingrese la cantidad de pasajeros\n");
scanf("%d",&vuelo.C);
}while (vuelo.C<0);
return 0;
}
////////////////////////////////////////////////////////////////////////
int VerificarFinDatos (int HayDatos)
{
int Aux;

do
{
printf("Ingrese 1 si quiere ingresar datos o cualquier tecla para finalizar\n");
scanf("%d",&Aux);
}while ((Aux!=1) && (Aux!=0) );

if (Aux==1)
{
HayDatos=1;
}

else
{
HayDatos=0;
}
return HayDatos;
}
////////////////////////////////////////////////////////////////////////
int Buscar (RegVueloA A[MAXA], int ceA, RegVuelo vuelo)

{
int i = 0;

int pos;

while ((i < ceA) && (A[i].D != vuelo.D))
{
i=i+1;
}

if (i==ceA)

pos= -1;

else

pos= i;

return (pos);
}
//////////////////////////////////////////////////////
int InsertarOrdenado (RegVueloB B[MAXB], int *ceB,RegVuelo vuelo)
{
int i=(*ceB -1);

if (*ceB == MAXB)
{
if (B[i].C < vuelo.C)
i=i-1;
}
else
*ceB=*ceB+1;


while ( (i >= 0) && (B[i].C < vuelo.C) ) {
B[i + 1].C = B[i].C;
strcpy(B[i + 1].N, B[i].N);
i = i - 1;
}
if (i != MAXB - 1) {
B[i + 1].C = vuelo.C;
strcpy(B[i + 1].N, vuelo.N);
}
return 0;
}
////////////////////////////////////////////////////////////////////////
int Proceso (RegVuelo vuelo, RegVueloA A[MAXA],RegVueloB B[MAXB], int *cant, int *I, int *ceA, int *ceB)
{
int pos;

pos = (Buscar(A, *ceA, vuelo));

if (pos>=0)
{
A[pos].C = A[pos].C+vuelo.C ;
}
else
{
if (*ceA!=MAXA)
{
strcpy(A[*ceA].D, vuelo.D);
A[*ceA].C = vuelo.C;
*ceA=*ceA+1;
}
else
{
exit (0);
}
}

if (I==0)
{
*cant=vuelo.C ;
}
else
{
if (vuelo.C < *cant)
{
*cant=vuelo.C;
}
}

I=I+1;

InsertarOrdenado (B, ceB, vuelo);

return 0;
}
///////////////////////////////////////////////////////////////////////
void MostrarDatos(RegVueloA A[MAXA], RegVueloB B[MAXB], int cant, int ceA, int ceB, int Hubo_Datos)
{
int i;

for (i = 0 ; i < ceA; i++)
printf ("Destino: %s,Cantidad de pasajeros: %d\n", A[i].D, A[i].C);

for (i = 0 ; i < ceB; i++)
printf ("Vuelo: %s,Cantidad: %d\n", B[i].N, B[i].C);

if (Hubo_Datos == 1) {
printf ("La menor cantidad fue: %d", cant);
} else
printf ("No hubo vuelos");
}





///////////////////////////////////////////////////////////////////////
int main()
{


while (VerificarFinDatos (HayDatos)==1)
{
Hubo_Datos=1;
IngresarDatos(vuelo);
Proceso (vuelo,A,B,&cant,&I,&ceA,&ceB);
}

MostrarDatos (A,B,cant,ceA,ceB,Hubo_Datos) ;

return 0;
}
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com