modificar lectura de cadenas(Solucionado)

Iniciado por Beginner Web, 7 Diciembre 2018, 02:12 AM

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

Beginner Web

Hola a todos, miren estaba repasando un poco de lo que vi en Estructura de Datos y rehaciendo todo de nuevo y me encuentro que este modulo llamado crear_nodo(nodo nuevo); le pide al usuario ingresar enteros y cadenas y yo habia utilizado el gets(cadena); y la funcion fflush(stdin); para limpiar el buffer el punto es que no me gusto para nada colocar el fflush(stdin); antes y despues de leer una cadena con gets(cadena); si alguien sabe de alguna forma mas estetica me ayuda porfis?
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

const int MAX=32;
typedef char tcad[MAX];
typedef struct tfecha{
int dia;
int mes;
int anyo;
};
typedef struct tdomicilio{
tcad calle;
int numero;
tcad barrio;
tcad localidad;
};
typedef struct tvehiculo{
tcad marca;
tcad modelo;
tcad patente;
};
typedef struct thorario{
tcad entrada;
tcad salida;
};
typedef struct tchofer{
int legajo;
tcad apellido;
tcad nombre;
int DNI;
tfecha fecha_nacimiento;
tdomicilio domicilio;
tvehiculo vehiculo_asignado;
thorario horario_trabajo;
int horas_extras;
};
typedef struct tnodo *pnodo;
typedef struct tnodo{
tchofer dato;
pnodo sig;
};

void iniciar_lista(pnodo &lista);
void crear_nodo(pnodo &nuevo);
void agregar_final(pnodo &lista, pnodo nuevo);
void listar_choferes(pnodo lista, tcad buscado);
void listar_chofer_horas_extras(pnodo lista);
void nueva_cadena(tcad &cadena);

int main()
{
int opcion;
pnodo milista, nuevo;
tcad buscado;
iniciar_lista(milista);
do{
system("cls");
cout<<"1. Agregar chofer"<<endl;
cout<<"2. Listar choferes segun horario de entrada"<<endl;
cout<<"3. Listar chofer con mayor cantidad de horas extras"<<endl;
cout<<"4. Salir"<<endl;
cin>>opcion;
switch(opcion){
case 1: crear_nodo(nuevo);
if(nuevo!=NULL)
agregar_final(milista,nuevo);
break;
case 2: cout<<"Ingrese hora: ";
nueva_cadena(buscado);
listar_choferes(milista,buscado);break;
case 3: listar_chofer_horas_extras(milista);break;
case 4: cout<<"FIN DEL PROGRAMA"<<endl;break;
default: cout<<"Opcion incorrecta"<<endl;
}
system("pause");
}while(opcion!=4);
}

void iniciar_lista(pnodo &lista)
{
lista=NULL;
}

void crear_nodo(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
cout<<"Ingrese datos personales"<<endl;
cout<<"Legajo: ";
cin>>nuevo->dato.legajo;
cout<<"Apellido: ";
nueva_cadena(nuevo->dato.apellido);
cout<<"Nombre: ";
nueva_cadena(nuevo->dato.nombre);
cout<<"DNI: ";
cin>>nuevo->dato.DNI;
cout<<"Fecha de nacimiento"<<endl;
cout<<"Dia: ";
cin>>nuevo->dato.fecha_nacimiento.dia;
cout<<"Mes: ";
cin>>nuevo->dato.fecha_nacimiento.mes;
cout<<"Año: ";
cin>>nuevo->dato.fecha_nacimiento.anyo;
cout<<"Domicilio"<<endl;
cout<<"Calle: ";
nueva_cadena(nuevo->dato.domicilio.calle);
cout<<"Numero: ";
cin>>nuevo->dato.domicilio.numero;
cout<<"Barrio: ";
nueva_cadena(nuevo->dato.domicilio.barrio);
cout<<"Localidad: ";
nueva_cadena(nuevo->dato.domicilio.localidad);
cout<<"Vehiculo asignado"<<endl;
cout<<"Marca: ";
nueva_cadena(nuevo->dato.vehiculo_asignado.marca);
cout<<"Modelo: ";
nueva_cadena(nuevo->dato.vehiculo_asignado.modelo);
cout<<"Patente: ";
nueva_cadena(nuevo->dato.vehiculo_asignado.patente);
cout<<"Horario entrada: ";
nueva_cadena(nuevo->dato.horario_trabajo.entrada);
cout<<"Horario salida: ";
nueva_cadena(nuevo->dato.horario_trabajo.salida);
cout<<"Horas extras: ";
cin>>nuevo->dato.horas_extras;
nuevo->sig=NULL;
}
else
cout<<"MEMORIA INSUFICIENTE"<<endl;
}

void agregar_final(pnodo &lista, pnodo nuevo)
{
pnodo i;
if(lista==NULL)
lista=nuevo;
else{
for(i=lista;i->sig!=NULL;i=i->sig);
i->sig=nuevo;
}
}

void listar_choferes(pnodo lista, tcad buscado)
{
int cantidad=0;
pnodo i;
if(lista!=NULL){
for(i=lista;i!=NULL;i=i->sig){
if(strcmp(i->dato.horario_trabajo.entrada,buscado)==0){
cout<<"Chofer"<<endl;
cout<<"Nombre: "<<i->dato.nombre<<endl;
cout<<"Apellido: "<<i->dato.apellido<<endl;
cout<<"Patente de vehiculo asignado: "<<i->dato.vehiculo_asignado.patente<<endl<<endl;
cantidad++;
}
}
cout<<"Cantidad de choferes: "<<cantidad<<endl;
}
else
cout<<"LISTA VACIA"<<endl;
}

void listar_chofer_horas_extras(pnodo lista)
{
pnodo i, chofer;
if(lista!=NULL){
chofer=lista;
for(i=lista;i!=NULL;i=i->sig){
if(i->dato.horas_extras>chofer->dato.horas_extras)
chofer=i;
}
cout<<"Chofer con mayor cantidad de horas extras"<<endl;
cout<<"Nombre: "<<chofer->dato.nombre<<endl;
cout<<"Apellido: "<<chofer->dato.apellido<<endl;
cout<<"DNI: "<<chofer->dato.DNI<<endl;
cout<<"Horas extras: "<<chofer->dato.horas_extras<<endl;
}
else
cout<<"LISTA VACIA"<<endl;
}

void nueva_cadena(tcad &cadena)
{
fflush(stdin);
gets(cadena);
fflush(stdin);
}
7w7

CalgaryCorpus

crear una funcion que reciba el string a mostrar y que internamente haga el cout, el fgets o gets y el fflush.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

K-YreX

Intentaré darte un par de ideas por si quieres aplicar alguna:
- En primer lugar yo en C++ prefiero usar <string> en lugar de cadenas de caracteres C ya que creo que facilitan algunas tareas. Y para coger los datos uso <cin> de <iostream> en vez de <gets()> de <cstdio>.
- Si por lo que sea prefieres seguir usando cadenas de caracteres, cambiaría los <gets()> por <fgets()>.
- Para evitar los <fflush(stdin)> hay un par de temas en el foro que creo que ya has visto. Tienes la opción de usar <fseek()> para ponerte al final del buffer si hay más caracteres de los admitidos o si te quedan saltos de línea puedes capturarlos con un <getchar()> hasta que no quede ninguno. Eso ya depende de lo que necesite tu programa.
Suerte. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

#3
Cita de: CalgaryCorpus en  7 Diciembre 2018, 02:34 AM
crear una funcion que reciba el string a mostrar y que internamente haga el cout, el fgets o gets y el fflush.
Me gusta la idea pero el cout no es para funciones y no estaria bien ya que los mensajes que para pedir al usuario el dato son diferentes aplicare igual la "funcion", me quedo mejor y mas compacto, gracias  ;-)
Código (cpp) [Seleccionar]
void nueva_cadena(tcad &cadena)
{
fflush(stdin);
gets(cadena);
fflush(stdin);
}
7w7

CalgaryCorpus

El cout no es para funciones?
No se que quisiste decir.
Algo así quise decir yo.
Código (cpp) [Seleccionar]
void pedir(char *mensaje) {
   // Posiblemente algunas instrucciones antes
   cout << mensaje;
   // Otras instrucciones antes
}


Instrucciones antes o después pueden ser los fflush, etc.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Beginner Web

Cita de: CalgaryCorpus en  7 Diciembre 2018, 04:26 AM
El cout no es para funciones?
No se que quisiste decir.
Algo así quise decir yo.
Código (cpp) [Seleccionar]
void pedir(char *mensaje) {
   // Posiblemente algunas instrucciones antes
   cout << mensaje;
   // Otras instrucciones antes
}


Instrucciones antes o después pueden ser los fflush, etc.
ahh procedimientos si, pero igual no va funcionar
7w7

CalgaryCorpus

Dices sentencias pero no das argumentas.
Que es lo que "no va a funcionar" y por que dices que no va a funcionar?




Aqui mi perfil en LinkedIn, invitame un cafe aqui

Beginner Web

Cita de: CalgaryCorpus en  7 Diciembre 2018, 05:53 AM
Dices sentencias pero no das argumentas.
Que es lo que "no va a funcionar" y por que dices que no va a funcionar?





Perdon, tienes razon me confundí, claro que si va funcionar pero no de la manera que yo quiero
7w7