Programa en C

Publicado por Solanet, Noviembre 09, 2009, 19:53:05

Tema anterior - Siguiente tema

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

Solanet

Buenas tengo que hacer un programa que permita
registrarse (en un cierto intervalo de tiempo)...
votar (en un cierto intervalo de tiempo)
ver resultados (despues que cierre la fecha de votacion)

el programa lo tengo listo:

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <conio.h>

using namespace std;

typedef struct {
    char apellido[40];
    char nombre[40];
    int dni;
    char carrera[40];
    int voto;
}registro;

typedef struct {
int dni;
int idvoto;
}registrovoto;

void registrarse();
int votar();
int resultados();
bool estaEnArchivo(char *,registro);
bool estaEnArchivoVoto(char *,registrovoto);

int main (int argc, char ** argv){
        system("color 3f");
        int fecha;
        int opcion=0;
        system("CLS");
        cout<<"Bienvenido al centro electoral de la UNLa\n"<< endl<<endl<<endl<<endl<< "Ingrese la fecha actual sin puntos: (XXXX.XX.XX - Anio,Mes,Dia)" << endl;
        cin>>fecha;
        while (opcion!=4){
        system("CLS");
        cout << "Que operacion desea realizar:\n" << endl << "1 - Registrarse\n"<< endl << "2 - Votar\n" << endl <<"3 - Ver Resultados\n" << endl<< "4 - Salir\n"<< endl;
        cin>>opcion;
        switch (opcion){

            case 1:
                     if ((fecha>=20091115)&&(fecha<20091201))//Seria del 15/11/2009 hasta el 01/12/2009)*/
                    registrarse();
                     break; //Llamar a funcion registrarse
            case 2:
                     if ((fecha>20091201)&&(fecha<20100101))//Seria del 01/12/2009 hasta el 01/01/2010
                     votar();
                     break; //Llamar a funcion votar
            case 3:
                     if(fecha>=20100101) //Seria Despues de la fecha de cierre de votacion
                     resultados();
                     break; //Llamar a funcion ver resultados
                     }

    }
    cout <<"Operacion Finalizada. Hasta Luego."<<endl;
}


void registrarse()
{
  system("CLS");
  FILE *pf;
  registro regaux;
  cout<<"Usted eligio registrarse."<<endl;
  cout<<"Ingrese su DNI (sin puntos): "<<endl;
  cin >>regaux.dni;
  cout<<"Ingrese su nombre:"<<endl;
  cin >> regaux.nombre ;
  cout<<"Ingrese su apellido:"<<endl;
  cin >> regaux.apellido ;
  cout<<"Ingrese su carrera:"<<endl;
  cin >> regaux.carrera;

  if (estaEnArchivo("file_registro.txt",regaux)==false){
  pf=fopen("file_registro.txt","a");
  if (pf!=NULL){
  fwrite(&regaux,sizeof(registro),1,pf);
  fclose(pf);
  cout<<"Registracion finalizada con Exito. Gracias ya puede votar.Presiones una tecla para continuar"<<endl;
  }else{
  cout<<"Error al querer abrir el archivo.Presione una tecla para continuar"<<endl;
  }
  system("PAUSE");
  }else{
  cout<<"Ya se encuentra registrado.Presione una tecla para continuar"<<endl;
  }
  system("PAUSE");
}
bool estaEnArchivo(char * ruta,registro regorig){
FILE * pf;
registro regaux;
bool esta=false;
pf=fopen(ruta,"r");
if (pf!=NULL){
while((feof(pf)==0)&&(esta==false)){
fread(&regaux,sizeof(registro),1,pf);
if (regaux.dni==regorig.dni)
  esta=true;
  }
  fclose(pf);
  }else{
  cout<<"Error al querer abrir el archivo.Presione una tecla para continuar"<<endl;
  }
  return esta;
}
bool estaEnArchivoVoto(char * ruta,registrovoto regorig){
FILE * pf;
registrovoto regaux;
bool esta=false;
pf=fopen(ruta,"r");
if (pf!=NULL){
while((feof(pf)==0)&&(esta==false)){
fread(&regaux,sizeof(registrovoto),1,pf);
if (regaux.dni==regorig.dni)
  esta=true;
  }
  fclose(pf);
  }else{
  cout<<"Error al querer abrir el archivo.Presione una tecla para continuar"<<endl;
  }
  return esta;
}



int votar()

{
    FILE* pf;
    system("CLS");
    registro regaux;
    registrovoto regauxvoto;
    int dni,opcion,voto;
    cout<<"Ingrese su DNI xx.xxx.xxx sin puntos\n"<<endl;
    cin>>regaux.dni;
    regauxvoto.dni=regaux.dni;
    if (estaEnArchivo("file_registro.txt",regaux)==true){ // Me fijo si esta registrado.
    if (estaEnArchivoVoto("file_votos.txt",regauxvoto)==false){ // Me fijo si ya voto.
      pf=fopen("file_votos.txt","a");
      if (pf!=NULL){
      cout<<"Elija a que lista desea votar\n"<<endl;
      cout<<"1-Turismo\n2-Sistemas\n3-Audiovision\n4-Alimentos\n5-Voto en blanco\n"<<endl;
      cin>>regauxvoto.idvoto;
      fwrite(&regauxvoto,sizeof(registrovoto),1,pf);
      fclose(pf);
      cout<<"Votacion finalizada con Exito. Gracias por votar."<<endl;
      }else{
      cout<<"Error al querer abrir el archivo."<<endl;
      }
    }else{
      cout<<"Ya habia votado anteriormente."<<endl;
    }
    }else{
    cout << "Usted no esta registrado, porfavor registrese para continuar" << endl;
    }
    system("pause");
    return 0;
}

int resultados ()
{
        registrovoto regaux;
        int tur=0,sis=0,aud=0,ali=0,bla=0,total=0;
        cout<<"1-Turismo\n2-Sistemas\n3-Audiovision\n4-Alimentos\n5-Voto en blanco\n"<<endl;
        FILE * fp;
    fp=fopen("file_votos.txt","r");
    if (fp!=NULL){
    while(feof(fp)==0){
    total++;
    fread(&regaux,sizeof(registrovoto),1,fp);
    switch(regaux.idvoto){
case 1: tur++ ; break;
case 2: sis++ ; break;
case 3: aud++ ; break;
case 4: ali++;  break;
case 5: bla++ ; break;
    }
    }

            cout << "Votos Totales: " << total << endl;
cout << "Votos Turismo: " << tur <<endl;
cout << "Votos Sistemas: " << sis <<endl;
cout << "Votos Audivision: " << aud <<endl;
cout << "Votos Alimentos: " << ali <<endl;
cout << "Votos Votos en Blanco: " << bla <<endl;

   
    }else{
      cout<<"Error al querer abrir el archivo. No se Voto Nada"<<endl;
    }
    system("pause");
    return 0;
}


Pero me gustaria saber como hacer para ponerle "fechas" osea para que apartir de una determinada fecha me deje entrar al menu votar, y asi.
¿Se entiende?

y otra pregunta de yapa....el programa funciona bien, pero siempre el "ultimo voto" que realizo me lo cuenta como doble a la hora de ver resultados.


Muhas gracias-
El Ataque de Los Piojos te hace quedar Divididos en un mundo de Viejas Locas donde los Jovenes Callejer

Predicador

Hola,
Respecto a lo de las fechas, deberias leerlas (usando alguna funcion, no se cual, no soy muy ducho en C) de la maquina (o quizas de algun NTP server) y a partir de ahi por medio de logica determinar que hacer, si dejar votar o mostrar cosas.


Respecto al recuento de votos, creo que el problema esta en el control que haces al leer el archivo.
Yo reescribiria la funcion como:

int resultados ()
{
        registrovoto regaux;
        int tur=0,sis=0,aud=0,ali=0,bla=0,total=0;
        cout<<"1-Turismo 2-Sistemas 3-Audiovision 4-Alimentos 5-Voto en blanco "<<endl;
        FILE * fp;
       fp=fopen("file_votos.txt","r");
       if (fp!=NULL){
          while (fread(&regaux,sizeof(registrovoto),1,fp)==1) {
             total++;
             switch(regaux.idvoto){
               case 1: tur++ ; break;
               case 2: sis++ ; break;
               case 3: aud++ ; break;
               case 4: ali++;  break;
               case 5: bla++ ; break;
             }
          }
     
            cout << "Votos Totales: " << total << endl;
         cout << "Votos Turismo: " << tur <<endl;
         cout << "Votos Sistemas: " << sis <<endl;
         cout << "Votos Audivision: " << aud <<endl;
         cout << "Votos Alimentos: " << ali <<endl;
         cout << "Votos Votos en Blanco: " << bla <<endl;

         
       }else{
            cout<<"Error al querer abrir el archivo. No se Voto Nada"<<endl;
       }
       system("pause");
       return 0;
}


Ya que de la manera que vos implementas el bucle con feof no me parece la manera correcta ya cuando lee el ultimo registro aun no se llega al fin de archivo, en la siguiente lectura el fread si lee el fin de archivo pero tambien incrementa el total y luego la funcion feof es verdadera saliendo del bucle.
Con la modificacion que propongo, el while controla que se lea un registro completo, si eso no sucede es que o hubo error de lectura o es fin de archivo. Cualquier cosa, podes leer la referencia del fread: http://www.cplusplus.com/reference/clibrary/cstdio/fread/

Baii
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

dc740

Hola... no leí el código. y probablemente esto no te ayude. pero soy un poco purista... este tipo de cosas:

cout << "Que operacion desea realizar:\n" << endl

son de C++, no son de C... quizás sea de molesto. pero es buena costumbre no mezclar. Si más adelante te ponés con C++ vas a ver que también es un hermoso lenguaje. Y ahi podés usar cosas de C... pero a la inversa... mmm

Otra cosa... "using namespace std"... espero que sepas lo que significa... también estás usando partes de C++ en código que debería ser C.
No sé si soy vueltero. pero yo (particularmente) recomiendo poner el namespace adelante de lo que corresponda... asi uno sabe con que "paquete" está trabajando... cuando estás leyendo código ageno no es nada cómodo tener que andar buscando el "using..." cuando sólo tenés interés en una función

Es como en java... muchos desarrolladores no ponen "this" cuando están llamando a un método del mismo objeto. Y quizás parezca trivial, pero cuando se trata de atributos, o variables, poner el evidente "this" puede evitarle a otro que esté leyendo el código tener que subir a la parte de declaraciones a ver si eso que se está usando es un atributo de la clase, o es un objeto que declaramos en el método y demás.

Para uno solo no es necesario. pero cuando el código lo tienen que leer varias personas hace que las cosas sean más sencillas de comprender.

Un saludo grande. Mucha suerte con el programita  :up: