Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 7 Diciembre 2018, 02:12 am



Título: modificar lectura de cadenas(Solucionado)
Publicado por: Beginner Web en 7 Diciembre 2018, 02:12 am
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
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. const int MAX=32;
  8. typedef char tcad[MAX];
  9. typedef struct tfecha{
  10. int dia;
  11. int mes;
  12. int anyo;
  13. };
  14. typedef struct tdomicilio{
  15. tcad calle;
  16. int numero;
  17. tcad barrio;
  18. tcad localidad;
  19. };
  20. typedef struct tvehiculo{
  21. tcad marca;
  22. tcad modelo;
  23. tcad patente;
  24. };
  25. typedef struct thorario{
  26. tcad entrada;
  27. tcad salida;
  28. };
  29. typedef struct tchofer{
  30. int legajo;
  31. tcad apellido;
  32. tcad nombre;
  33. int DNI;
  34. tfecha fecha_nacimiento;
  35. tdomicilio domicilio;
  36. tvehiculo vehiculo_asignado;
  37. thorario horario_trabajo;
  38. int horas_extras;
  39. };
  40. typedef struct tnodo *pnodo;
  41. typedef struct tnodo{
  42. tchofer dato;
  43. pnodo sig;
  44. };
  45.  
  46. void iniciar_lista(pnodo &lista);
  47. void crear_nodo(pnodo &nuevo);
  48. void agregar_final(pnodo &lista, pnodo nuevo);
  49. void listar_choferes(pnodo lista, tcad buscado);
  50. void listar_chofer_horas_extras(pnodo lista);
  51. void nueva_cadena(tcad &cadena);
  52.  
  53. int main()
  54. {
  55. int opcion;
  56. pnodo milista, nuevo;
  57. tcad buscado;
  58. iniciar_lista(milista);
  59. do{
  60. system("cls");
  61. cout<<"1. Agregar chofer"<<endl;
  62. cout<<"2. Listar choferes segun horario de entrada"<<endl;
  63. cout<<"3. Listar chofer con mayor cantidad de horas extras"<<endl;
  64. cout<<"4. Salir"<<endl;
  65. cin>>opcion;
  66. switch(opcion){
  67. case 1: crear_nodo(nuevo);
  68. if(nuevo!=NULL)
  69. agregar_final(milista,nuevo);
  70. break;
  71. case 2: cout<<"Ingrese hora: ";
  72. nueva_cadena(buscado);
  73. listar_choferes(milista,buscado);break;
  74. case 3: listar_chofer_horas_extras(milista);break;
  75. case 4: cout<<"FIN DEL PROGRAMA"<<endl;break;
  76. default: cout<<"Opcion incorrecta"<<endl;
  77. }
  78. system("pause");
  79. }while(opcion!=4);
  80. }
  81.  
  82. void iniciar_lista(pnodo &lista)
  83. {
  84. lista=NULL;
  85. }
  86.  
  87. void crear_nodo(pnodo &nuevo)
  88. {
  89. nuevo=new tnodo;
  90. if(nuevo!=NULL){
  91. cout<<"Ingrese datos personales"<<endl;
  92. cout<<"Legajo: ";
  93. cin>>nuevo->dato.legajo;
  94. cout<<"Apellido: ";
  95. nueva_cadena(nuevo->dato.apellido);
  96. cout<<"Nombre: ";
  97. nueva_cadena(nuevo->dato.nombre);
  98. cout<<"DNI: ";
  99. cin>>nuevo->dato.DNI;
  100. cout<<"Fecha de nacimiento"<<endl;
  101. cout<<"Dia: ";
  102. cin>>nuevo->dato.fecha_nacimiento.dia;
  103. cout<<"Mes: ";
  104. cin>>nuevo->dato.fecha_nacimiento.mes;
  105. cout<<"Año: ";
  106. cin>>nuevo->dato.fecha_nacimiento.anyo;
  107. cout<<"Domicilio"<<endl;
  108. cout<<"Calle: ";
  109. nueva_cadena(nuevo->dato.domicilio.calle);
  110. cout<<"Numero: ";
  111. cin>>nuevo->dato.domicilio.numero;
  112. cout<<"Barrio: ";
  113. nueva_cadena(nuevo->dato.domicilio.barrio);
  114. cout<<"Localidad: ";
  115. nueva_cadena(nuevo->dato.domicilio.localidad);
  116. cout<<"Vehiculo asignado"<<endl;
  117. cout<<"Marca: ";
  118. nueva_cadena(nuevo->dato.vehiculo_asignado.marca);
  119. cout<<"Modelo: ";
  120. nueva_cadena(nuevo->dato.vehiculo_asignado.modelo);
  121. cout<<"Patente: ";
  122. nueva_cadena(nuevo->dato.vehiculo_asignado.patente);
  123. cout<<"Horario entrada: ";
  124. nueva_cadena(nuevo->dato.horario_trabajo.entrada);
  125. cout<<"Horario salida: ";
  126. nueva_cadena(nuevo->dato.horario_trabajo.salida);
  127. cout<<"Horas extras: ";
  128. cin>>nuevo->dato.horas_extras;
  129. nuevo->sig=NULL;
  130. }
  131. else
  132. cout<<"MEMORIA INSUFICIENTE"<<endl;
  133. }
  134.  
  135. void agregar_final(pnodo &lista, pnodo nuevo)
  136. {
  137. pnodo i;
  138. if(lista==NULL)
  139. lista=nuevo;
  140. else{
  141. for(i=lista;i->sig!=NULL;i=i->sig);
  142. i->sig=nuevo;
  143. }
  144. }
  145.  
  146. void listar_choferes(pnodo lista, tcad buscado)
  147. {
  148. int cantidad=0;
  149. pnodo i;
  150. if(lista!=NULL){
  151. for(i=lista;i!=NULL;i=i->sig){
  152. if(strcmp(i->dato.horario_trabajo.entrada,buscado)==0){
  153. cout<<"Chofer"<<endl;
  154. cout<<"Nombre: "<<i->dato.nombre<<endl;
  155. cout<<"Apellido: "<<i->dato.apellido<<endl;
  156. cout<<"Patente de vehiculo asignado: "<<i->dato.vehiculo_asignado.patente<<endl<<endl;
  157. cantidad++;
  158. }
  159. }
  160. cout<<"Cantidad de choferes: "<<cantidad<<endl;
  161. }
  162. else
  163. cout<<"LISTA VACIA"<<endl;
  164. }
  165.  
  166. void listar_chofer_horas_extras(pnodo lista)
  167. {
  168. pnodo i, chofer;
  169. if(lista!=NULL){
  170. chofer=lista;
  171. for(i=lista;i!=NULL;i=i->sig){
  172. if(i->dato.horas_extras>chofer->dato.horas_extras)
  173. chofer=i;
  174. }
  175. cout<<"Chofer con mayor cantidad de horas extras"<<endl;
  176. cout<<"Nombre: "<<chofer->dato.nombre<<endl;
  177. cout<<"Apellido: "<<chofer->dato.apellido<<endl;
  178. cout<<"DNI: "<<chofer->dato.DNI<<endl;
  179. cout<<"Horas extras: "<<chofer->dato.horas_extras<<endl;
  180. }
  181. else
  182. cout<<"LISTA VACIA"<<endl;
  183. }
  184.  
  185. void nueva_cadena(tcad &cadena)
  186. {
  187. fflush(stdin);
  188. gets(cadena);
  189. fflush(stdin);
  190. }


Título: Re: modificar lectura de cadenas
Publicado por: 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.


Título: Re: modificar lectura de cadenas
Publicado por: K-YreX en 7 Diciembre 2018, 02:42 am
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


Título: Re: modificar lectura de cadenas
Publicado por: Beginner Web en 7 Diciembre 2018, 02:55 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
  1. void nueva_cadena(tcad &cadena)
  2. {
  3. fflush(stdin);
  4. gets(cadena);
  5. fflush(stdin);
  6. }


Título: Re: modificar lectura de cadenas(Solucionado)
Publicado por: 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
  1. void pedir(char *mensaje) {
  2.   // Posiblemente algunas instrucciones antes
  3.   cout << mensaje;
  4.   // Otras instrucciones antes
  5. }

Instrucciones antes o después pueden ser los fflush, etc.


Título: Re: modificar lectura de cadenas(Solucionado)
Publicado por: Beginner Web en 7 Diciembre 2018, 05:47 am
El cout no es para funciones?
No se que quisiste decir.
Algo así quise decir yo.
Código
  1. void pedir(char *mensaje) {
  2.   // Posiblemente algunas instrucciones antes
  3.   cout << mensaje;
  4.   // Otras instrucciones antes
  5. }

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


Título: Re: modificar lectura de cadenas(Solucionado)
Publicado por: 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?






Título: Re: modificar lectura de cadenas(Solucionado)
Publicado por: Beginner Web en 12 Diciembre 2018, 06:25 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