Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: seanagu en 19 Octubre 2017, 01:36 am



Título: AYUDA no encuentro error . C++
Publicado por: seanagu en 19 Octubre 2017, 01:36 am
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
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string.h>
  4.  
  5. #define rutaCandidatos "DatosCandidatos.dat"
  6. #define rutaVive "Vive.dat"
  7.  
  8. using namespace std;
  9.  
  10.  
  11. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  12.  
  13. struct candidato {
  14. char nombre[50];
  15. unsigned fechaNacimiento;
  16. char paisCuatro [50];
  17. char puesto [15];
  18.  
  19. };
  20.  
  21.  
  22. struct vive{
  23. char nombre[50];
  24. char pais [50];
  25. char provincia [50];
  26. };
  27.  
  28. struct NodolistaCandidatos{
  29. candidato info;
  30. NodolistaCandidatos*sgte;
  31. };
  32.  
  33. struct NodolistaVive{
  34. vive info;
  35. NodolistaVive*sgte;
  36. };
  37.  
  38.  
  39. void insertarNodoCandidatosalfinal(NodolistaCandidatos *&lista, candidato a)
  40. {
  41. if (lista==NULL)
  42. {
  43. lista= new NodolistaCandidatos();
  44. lista->info = a;
  45. lista->sgte = NULL;
  46. }
  47. else
  48. {
  49. NodolistaCandidatos *aux=lista;
  50. while (aux->sgte!=NULL)
  51. {
  52. aux= aux->sgte;
  53. }
  54. aux->sgte= new NodolistaCandidatos();
  55.  
  56. aux = aux->sgte;
  57. aux->info= a;
  58. aux->sgte = NULL;
  59. }
  60. return;
  61. }
  62.  
  63.  
  64.  
  65. void insertarNodoVivealfinal(NodolistaVive *&lista, vive j)
  66. {
  67. if (lista==NULL)
  68. {
  69. lista= new NodolistaVive();
  70. lista->info = j;
  71. lista->sgte = NULL;
  72. }
  73. else
  74. {
  75. NodolistaVive *aux=lista;
  76. while (aux->sgte!=NULL)
  77. {
  78. aux= aux->sgte;
  79. }
  80. aux->sgte= new NodolistaVive();
  81. aux = aux->sgte;
  82. aux->info= j;
  83. aux->sgte = NULL;
  84. }
  85. return;
  86. }
  87.  
  88.  
  89.  
  90.  
  91. NodolistaCandidatos*crearListaCandidatos (FILE*data)
  92. { NodolistaCandidatos*Lcandidatos =NULL;
  93. candidato a;
  94. while(fread(&a, sizeof(candidato),1, data))
  95. { insertarNodoCandidatosalfinal(Lcandidatos, a);
  96.  
  97. }
  98. fclose(data);
  99. return Lcandidatos;
  100.  
  101. }
  102.  
  103.  
  104.  
  105. NodolistaVive *crearListaVive(FILE *data)
  106. {
  107. NodolistaVive *lvive=NULL;
  108. vive b;
  109. while (fread(&b, sizeof(vive),1,data))
  110. {
  111. insertarNodoVivealfinal(lvive, b);
  112. }
  113. fclose(data);
  114. return lvive;
  115. }
  116.  
  117.  
  118.  
  119. void DatosMemoria (FILE*candidatos, FILE*vive, NodolistaCandidatos*&listacandidatos, NodolistaVive*&listaVive)
  120. {listacandidatos=crearListaCandidatos (candidatos);
  121. listaVive=crearListaVive(vive);
  122. return;
  123. }
  124.  
  125.  
  126.  
  127.  
  128.  
  129. NodolistaCandidatos* BuscarNodoCandidato(NodolistaCandidatos *lista, char nombre [])
  130. {
  131. while (lista)
  132. {
  133. if (lista->info.nombre==nombre)
  134. return lista;
  135. lista= lista->sgte;
  136. }
  137. return lista; }
  138.  
  139.  
  140.  
  141.  
  142. NodolistaVive* BuscarNodoVive(NodolistaVive*lista, char nombre[])
  143. {
  144. while (lista)
  145. {
  146. if (lista->info.nombre==nombre)
  147. return lista;
  148. lista= lista->sgte;
  149. }
  150. return lista;
  151. }
  152.  
  153.  
  154.  
  155. int edadCandidato(int Fechanacimiento)
  156. {
  157. int z = 2017 - Fechanacimiento / 10000;
  158. return z;
  159. }
  160.  
  161.  
  162.  
  163.  
  164. bool NoCumpleRequisitos (NodolistaVive*listaVive, NodolistaCandidatos*listacandidatos, char nombre [], char pais[], char paisCuatro [], char provincia [])
  165. {
  166. while (  listaVive!=NULL )
  167.  
  168.   { if(( listaVive-> info.nombre == nombre) &&( (strcmp(listacandidatos->info.paisCuatro, "argentina")==0)))
  169. {
  170.  
  171. if ( (strcmp(listaVive ->info.provincia, "buenos aires"))==0)
  172. return false; // encuentra el candidato y residio los ultimos 4 años en argentina y reside en buenos aires desde hace 2 años
  173. else
  174. return true;
  175.  
  176. }
  177. return true;
  178.  
  179.    }
  180. }
  181.  
  182. bool puedeSerCandidato (char provincia[], char paisCuatro [], char puesto[], char nombre[], char pais[], NodolistaCandidatos*listacandidatos, NodolistaVive*listaVive)
  183. {  if ( strcmp (puesto, "senador")==0)
  184.  {if (!NoCumpleRequisitos (listaVive, listacandidatos, nombre, pais, paisCuatro, provincia) && edadCandidato ((BuscarNodoCandidato (listacandidatos, nombre))->info.fechaNacimiento)>30)
  185. return true;
  186.  
  187. else return false;
  188.  }
  189.  
  190.  
  191. if ( strcmp (puesto, "diputado")==0)
  192.  {if (!NoCumpleRequisitos(listaVive, listacandidatos, nombre, pais, paisCuatro, provincia) && edadCandidato ((BuscarNodoCandidato (listacandidatos, nombre))->info.fechaNacimiento)>22)
  193. return true;
  194.  
  195. else
  196. return false;
  197.  }
  198.  
  199. }
  200.  
  201.  
  202.  
  203.  
  204.  
  205. int main() {
  206.  
  207. candidato c;
  208. FILE* p;
  209. p=fopen(rutaCandidatos,"w");
  210. strcpy(c.nombre,"Carlos Gomez");
  211. c.fechaNacimiento=19670803;
  212. strcpy(c.puesto, "senador");
  213. strcpy(c.paisCuatro,"venezuela");  // pais en el que vivio los ultimos por lo menos 4 años,
  214.  
  215. fwrite(&c,sizeof(c),1,p);
  216. strcpy(c.nombre,"Carla Robles");
  217. c.fechaNacimiento=20130807;
  218. strcpy(c.puesto, "senador");
  219. strcpy(c.paisCuatro,"argentina");
  220.  
  221. fwrite(&c,sizeof(c),1,p);
  222. strcpy(c.nombre,"Luis Alberto");
  223. c.fechaNacimiento= 19689612;
  224. strcpy(c.puesto, "diputado");
  225. strcpy(c.paisCuatro,"argentina");
  226.  
  227. fwrite(&c,sizeof(c),1,p);
  228. strcpy(c.nombre,"Fabiana Riez");
  229. c.fechaNacimiento=19859394;
  230. strcpy(c.paisCuatro,"argentina");
  231. strcpy(c.puesto, "diputado");
  232. fwrite(&c,sizeof(c),1,p);
  233. fclose(p);
  234.  
  235.  
  236. vive d;
  237. FILE *f;
  238. f=fopen(rutaVive,"w");
  239. // strcpy(d.pais,"Argentina");
  240. strcpy(d.nombre,"Carlos Gomez");
  241. strcpy(d.provincia, "buenos aires");
  242. fwrite(&d,sizeof(d),1,f);
  243.  
  244.  
  245. strcpy(d.nombre,"Fabiana Riez");
  246. strcpy(d.provincia, "buenos aires");
  247. fwrite(&d,sizeof(d),1,f);
  248.  
  249.  
  250. strcpy(d.nombre,"Luis Alberto");
  251. strcpy(d.provincia, "cordoba");
  252. fwrite(&d,sizeof(d),1,f);
  253.  
  254.  
  255. strcpy(d.nombre,"Carla Robles");
  256. strcpy(d.provincia, "buenos aires");  //provincia en la que residio por lo menos los ultimos dos años
  257. fwrite(&d,sizeof(d),1,f);
  258. fclose(f);
  259.  
  260.  
  261. FILE *fcand;
  262. FILE *fviv;
  263. NodolistaVive *lvive=NULL;
  264. NodolistaCandidatos *Lcandidatos =NULL;
  265. NodolistaCandidatos *aux;
  266. bool puede;
  267. //muestro los archivos
  268. if ((fcand =fopen(rutaCandidatos,"r")) && (fviv =fopen(rutaVive,"r")))
  269. {
  270. DatosMemoria(fcand, fviv, Lcandidatos, lvive);
  271. fclose(fcand);
  272. fclose(fviv);
  273. aux = Lcandidatos;
  274. while (aux)
  275. {
  276. puede =puedeSerCandidato(lvive->info.provincia, aux->info.paisCuatro, aux->info.puesto, aux->info.nombre, lvive->info.pais, Lcandidatos, lvive);
  277.  
  278. if (puede==true)
  279. cout  << aux->info.nombre << " puede ser candidato "  << endl;
  280.  
  281. if(puede==false)
  282. cout << aux->info.nombre << " NO puede ser candidato "  << endl;
  283. aux= aux->sgte;
  284. }
  285. }
  286.  
  287. else
  288. cout << "Error al intentar abrir un archivo" << endl;
  289.  
  290.  
  291.  
  292.  
  293. return 0;
  294. }


· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: AYUDA no encuentro error . C++
Publicado por: engel lex en 19 Octubre 2017, 01:42 am
muestra lo que haces, el resultado obtenido y el esperado


Título: Re: AYUDA no encuentro error . C++
Publicado por: seanagu en 19 Octubre 2017, 01:46 am
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


Título: Re: AYUDA no encuentro error . C++
Publicado por: srWhiteSkull en 19 Octubre 2017, 17:03 pm
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 :

Código:
...

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