Autor Tema: Generar y ordenar datos en un fichero. (C++)

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

06 Noviembre, 2013, 10:20 pm
Leído 3004 veces

xamo

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 373
  • Karma: +0/-0
  • Sexo: Femenino
Buenas, tengo la siguiente práctica que realizar en C++ y hay ciertas partes que no me salen.  :banghead:

Crear un programa para generar de forma aleatoria un fichero de texto formado por un número de líneas entre 1 y 10000 que pasaremos como argumento al ejecutar el programa. Sus líneas han de contener los siguientes campos:

    un nombre (cadena aleatoria),
    apellidos (cadena aleatoria),
    edad (numero aleatorio entre 0 y 120),
    dni (numero aleatorio entre 0 y 10000 que no puede aparecer repetido en el fichero).

Si la llamada al programa no tiene argumentos el programa ha de mostrar un menú con las siguientes opciones:

    Opcion 1: búsqueda de usuario con un determinado dni. Al elegir esta opción el programa ha de buscar si existe en el fichero alguna linea con ese dni y una vez encontrada nos ha de mostrar el resto de campos de la línea donde aparece.
    Opción 2: listado de edad, dni, nombre y apellidos ordenados por edad.
    Opción 3: Salir del programa.


Mi código es el siguiente, y con comentarios comento mis problemas: (no sé porque no se mantiene la identación, si lo he pegado después de poner los tags  :-\)

Spoiler

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>


using namespace std;

void cabecera (void){ /*función cabecera que usaré simplemente como guía de que primero va el nombre, luego el apellido, etc*/

ofstream fich("practica1.txt",ifstream::app); /*app: escribo al final del fichero*/

fich<<" Nombre : Apellidos : Edad : DNI "<<endl;
}

int compruebarangolineas(int lineas){ /*miramos si el número de líneas está entre 0 y 10000*/

if(lineas>=1 && lineas<= 10000)
return 1;
else
return 0;

}

void nombre(void){ /*generamos un nombre aleatoriamente*/

char k; /*carácter*/
int i;
string nombre=""; /*cadena*/

ofstream fich("practica1.txt",ifstream::app);


 for(i=0;i<12;i++){ /*nombre de 12 caracteres*/
        k= rand() % 25 + 'a';
nombre=nombre+k;
    }

fich<<nombre; /*metemos la cadena nombre en el fichero*/

fich<<":"; /*para separar*/

}

void apellidos(void){
char k;
int i;
string apellidos="";

ofstream fich("practica1.txt",ifstream::app);

for(i=0;i<20;i++){
        k= rand() % 25 + 'a';
apellidos=apellidos+k;
}

fich<<apellidos;

fich<<":";

}

void edad(void){

ofstream fich("practica1.txt",ifstream::app);

int edad;

edad=(rand() % 121); /*entre 0 y 120*/

fich<<edad;

fich<<":";

}

//INTENTANDO HACER LA OPCION 1 DEL MENU DEBI TOCAR ALGO, QUE AHORA NO SE ME GENERAN LOS DNIS
int CompruebaDni(int dni, vector<int> v){ /*los dnis irán guardados en un vector*/
int t;

for(t=0;t<=v.size();t++){
if(v[t]=dni)
return 0; /* si alguna componente del vector coincide con el dni que le paso como parametro devuelvo 0*/
}


return 1;
}

void dni(int i){

int t,indicador;
vector <int> v(1);

ofstream fich("practica1.txt",ifstream::app);

t=(rand() % 10001); /*generamos un dni nuevo*/


indicador = CompruebaDni(t,v); /*comprobamos que no esté repe con los almacenados en el vector*/

if(indicador==1){ /*no está repe*/
fich<<t;
fich<<endl;
v[i]=t;

v.resize(v.size()+1);
} /*aumenta el tamaño de v en 1*/
 /* si no generamos uno nuevo */

else {dni(i)}; /*y volvemos a comprobar generando un nuevo dni número i*/

}


void EscribirFichero(int lineas){

int i,j = 0;

for(i=0;i<=lineas-1;i++){ /*escribiremos lineas-veces el nombre, apellidos, edad y dni*/

nombre();

apellidos();

edad();

dni(j);
j++;

}
}

//Crear menu y funciones 1 y 2 del menu

int main (int argn, char **argv){

int lineas;

if (argn ==2){

lineas = atoi(argv[1]);
int comprobacion = compruebarangolineas(lineas);
if (comprobacion == 0) printf ("Error. Introduzca un numero de lineas entre 1 y 10000" );

cabecera();
string cadena;

EscribirFichero(lineas);


int vis;
cout << "Introduzca 1 si quiere visualizar el contenido del fichero." <<endl;
cout << "Si no, presione cualquier tecla:" << endl;;
cin >> vis;

if (vis == 1){
ifstream f("practica1.txt");

   while(!f.eof()) {
      getline(f,cadena);
      cout << cadena << endl;
   }
   f.close();
}

else {

// función menu
}

}



system("PAUSE");
return 0;

}

[cerrar]

Espero que me podáis ayudar, en esencia me quedan generar los dnis y las opciones del menú.
Muchas gracias por todo y saludos.  :)

07 Noviembre, 2013, 06:29 pm
Respuesta #1

xamo

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 373
  • Karma: +0/-0
  • Sexo: Femenino
A muy malas también se podría realizar en C, lo digo por si nadie sabe ayudarme con el C++.  :-\