AYUDA no encuentro error . C++

Iniciado por seanagu, 19 Octubre 2017, 01:36 AM

0 Miembros y 1 Visitante están viendo este tema.

seanagu

Estoy recién arrancando con la programación  y como ejercicio tengo que hacer un programa que se fije si las personas ingresadas pueden o no ser candidatos a diputados/senadores. Compila pero el resultado dado es incorrecto.
Según el criterio de la edad me da bien la respuesta de Si o No pero al fijarse si viven en argentina y en la provincia hay un error.
Les dejo el código (en algunas funciones hay parámetros de mas que no uso, después lo arreglo)

Espero que alguien pueda darme una mano. Gracias!

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdio>
#include <string.h>

#define rutaCandidatos "DatosCandidatos.dat"
#define rutaVive "Vive.dat"

using namespace std;


/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct candidato {
char nombre[50];
unsigned fechaNacimiento;
char paisCuatro [50];
char puesto [15];

};


struct vive{
char nombre[50];
char pais [50];
char provincia [50];
};

struct NodolistaCandidatos{
candidato info;
NodolistaCandidatos*sgte;
};

struct NodolistaVive{
vive info;
NodolistaVive*sgte;
};


void insertarNodoCandidatosalfinal(NodolistaCandidatos *&lista, candidato a)
{
if (lista==NULL)
{
lista= new NodolistaCandidatos();
lista->info = a;
lista->sgte = NULL;
}
else
{
NodolistaCandidatos *aux=lista;
while (aux->sgte!=NULL)
{
aux= aux->sgte;
}
aux->sgte= new NodolistaCandidatos();

aux = aux->sgte;
aux->info= a;
aux->sgte = NULL;
}
return;
}



void insertarNodoVivealfinal(NodolistaVive *&lista, vive j)
{
if (lista==NULL)
{
lista= new NodolistaVive();
lista->info = j;
lista->sgte = NULL;
}
else
{
NodolistaVive *aux=lista;
while (aux->sgte!=NULL)
{
aux= aux->sgte;
}
aux->sgte= new NodolistaVive();
aux = aux->sgte;
aux->info= j;
aux->sgte = NULL;
}
return;
}




NodolistaCandidatos*crearListaCandidatos (FILE*data)
{ NodolistaCandidatos*Lcandidatos =NULL;
candidato a;
while(fread(&a, sizeof(candidato),1, data))
{ insertarNodoCandidatosalfinal(Lcandidatos, a);

}
fclose(data);
return Lcandidatos;

}



NodolistaVive *crearListaVive(FILE *data)
{
NodolistaVive *lvive=NULL;
vive b;
while (fread(&b, sizeof(vive),1,data))
{
insertarNodoVivealfinal(lvive, b);
}
fclose(data);
return lvive;
}



void DatosMemoria (FILE*candidatos, FILE*vive, NodolistaCandidatos*&listacandidatos, NodolistaVive*&listaVive)
{listacandidatos=crearListaCandidatos (candidatos);
listaVive=crearListaVive(vive);
return;
}





NodolistaCandidatos* BuscarNodoCandidato(NodolistaCandidatos *lista, char nombre [])
{
while (lista)
{
if (lista->info.nombre==nombre)
return lista;
lista= lista->sgte;
}
return lista; }




NodolistaVive* BuscarNodoVive(NodolistaVive*lista, char nombre[])
{
while (lista)
{
if (lista->info.nombre==nombre)
return lista;
lista= lista->sgte;
}
return lista;
}



int edadCandidato(int Fechanacimiento)
{
int z = 2017 - Fechanacimiento / 10000;
return z;
}




bool NoCumpleRequisitos (NodolistaVive*listaVive, NodolistaCandidatos*listacandidatos, char nombre [], char pais[], char paisCuatro [], char provincia [])
{
while (  listaVive!=NULL )
 
  { if(( listaVive-> info.nombre == nombre) &&( (strcmp(listacandidatos->info.paisCuatro, "argentina")==0)))
{

if ( (strcmp(listaVive ->info.provincia, "buenos aires"))==0)
return false; // encuentra el candidato y residio los ultimos 4 años en argentina y reside en buenos aires desde hace 2 años
else
return true;

}
return true;

   }
}

bool puedeSerCandidato (char provincia[], char paisCuatro [], char puesto[], char nombre[], char pais[], NodolistaCandidatos*listacandidatos, NodolistaVive*listaVive)
{  if ( strcmp (puesto, "senador")==0)
 {if (!NoCumpleRequisitos (listaVive, listacandidatos, nombre, pais, paisCuatro, provincia) && edadCandidato ((BuscarNodoCandidato (listacandidatos, nombre))->info.fechaNacimiento)>30)
return true;

else return false;
 }


if ( strcmp (puesto, "diputado")==0)
 {if (!NoCumpleRequisitos(listaVive, listacandidatos, nombre, pais, paisCuatro, provincia) && edadCandidato ((BuscarNodoCandidato (listacandidatos, nombre))->info.fechaNacimiento)>22)
return true;

else
return false;
 }

}





int main() {

candidato c;
FILE* p;
p=fopen(rutaCandidatos,"w");
strcpy(c.nombre,"Carlos Gomez");
c.fechaNacimiento=19670803;
strcpy(c.puesto, "senador");
strcpy(c.paisCuatro,"venezuela");  // pais en el que vivio los ultimos por lo menos 4 años,

fwrite(&c,sizeof(c),1,p);
strcpy(c.nombre,"Carla Robles");
c.fechaNacimiento=20130807;
strcpy(c.puesto, "senador");
strcpy(c.paisCuatro,"argentina");

fwrite(&c,sizeof(c),1,p);
strcpy(c.nombre,"Luis Alberto");
c.fechaNacimiento= 19689612;
strcpy(c.puesto, "diputado");
strcpy(c.paisCuatro,"argentina");

fwrite(&c,sizeof(c),1,p);
strcpy(c.nombre,"Fabiana Riez");
c.fechaNacimiento=19859394;
strcpy(c.paisCuatro,"argentina");
strcpy(c.puesto, "diputado");
fwrite(&c,sizeof(c),1,p);
fclose(p);


vive d;
FILE *f;
f=fopen(rutaVive,"w");
// strcpy(d.pais,"Argentina");
strcpy(d.nombre,"Carlos Gomez");
strcpy(d.provincia, "buenos aires");
fwrite(&d,sizeof(d),1,f);


strcpy(d.nombre,"Fabiana Riez");
strcpy(d.provincia, "buenos aires");
fwrite(&d,sizeof(d),1,f);


strcpy(d.nombre,"Luis Alberto");
strcpy(d.provincia, "cordoba");
fwrite(&d,sizeof(d),1,f);


strcpy(d.nombre,"Carla Robles");
strcpy(d.provincia, "buenos aires");  //provincia en la que residio por lo menos los ultimos dos años
fwrite(&d,sizeof(d),1,f);
fclose(f);


FILE *fcand;
FILE *fviv;
NodolistaVive *lvive=NULL;
NodolistaCandidatos *Lcandidatos =NULL;
NodolistaCandidatos *aux;
bool puede;
//muestro los archivos
if ((fcand =fopen(rutaCandidatos,"r")) && (fviv =fopen(rutaVive,"r")))
{
DatosMemoria(fcand, fviv, Lcandidatos, lvive);
fclose(fcand);
fclose(fviv);
aux = Lcandidatos;
while (aux)
{
puede =puedeSerCandidato(lvive->info.provincia, aux->info.paisCuatro, aux->info.puesto, aux->info.nombre, lvive->info.pais, Lcandidatos, lvive);

if (puede==true)
cout  << aux->info.nombre << " puede ser candidato "  << endl;

if(puede==false)
cout << aux->info.nombre << " NO puede ser candidato "  << endl;
aux= aux->sgte;
}
}

else
cout << "Error al intentar abrir un archivo" << endl;




return 0;
}



· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex

engel lex

muestra lo que haces, el resultado obtenido y el esperado
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

seanagu

Lo que me da:

Carlos Gomez NO puede ser candidato
Carla Robles NO puede ser candidato
Luis Alberto NO puede ser candidato
Fabiana Riez NO puede ser candidato


Lo que debería dar:


Carlos Gomez NO  puede ser candidato (segun requisito de la ciudadania arg)
Carla Robles NO puede ser candidato (según el requisito de la edad)
Luis Alberto  NO puede ser candidato (según el requisito de la residencia en bs as)
Fabiana Riez  puede ser candidato

srWhiteSkull

Depura en las funciones puedeSerCandidato() y NoCumpleRequisitos(), ahí tienes unas condiciones que terminan devolviendo true o false, responsables del resultado no correcto.

Para depurar puedes ayudarte mostrando los datos por pantalla (por medio de cout) de los datos que son comparados en las condiciones conflictivas, y de esa forma te ayudará a seguir mejor el flujo del programa. Por ejemplo usando un :

...

cout << "True, el dato tal es mayor que el dato cual" << endl;
return true;
...