elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con LISTAS y un switch.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con LISTAS y un switch.  (Leído 2,498 veces)
flowrd23

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Problema con LISTAS y un switch.
« en: 4 Julio 2019, 20:49 pm »

Estoy empezando a entender listas, tengo el siguiente problema: El menú de opciones vuelve a repetirse indefinidamente luego de devolver "inicio", en vez de volver a solicitar una opción al usuario ¿Qué anda mal?
Código:

/*5 El programa para ubicar un disco de una colección de música que se encuentra ordenada en
estantes debe tener los siguientes datos:
a Nombre el disco
b Grupo musical
c Soporte (vinilo, CD, cassette)
d Año de lanzamiento
e Categorı́a (clásica, jazz, folclore, tango, etc)
f Ubicación (estante en el cual se encuentra)
5.1 La base de datos debe crecer y decrecer dinámicamente.
5.2 Debe permitir buscar y mostrar la búsqueda de cualquiera de los datos miembro.
5.3 Debe permitir el ordenamiento.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct NODO {
char nombre[31];
char grupo[31];
int year;
char categoria[31];
struct NODO *siguiente;
}NODO;

void crearLista(NODO *);//ASÍ ES *crearLista(), ES UNA FUNCIÓN QUE DEBERÍA DEVOLVER UN PUNTERO A UN TIPO NODO.
//Y en el argumento de la función tenemos que necesita recibir un puntero a un tipo de struct NODO.
int main(){
NODO *inicio=NULL;
int OPTION=0;
puts("Ingrese una opción.\n");


do{
printf("1- AGREGAR ARTISTA A LA LISTA \n2-BUSCAR GRUPO MUSICAL EN LA LISTA\n3-LISTAR TODO LOS DATOS\n4-SALIR\n\n");
scanf("%d", &OPTION);

switch(OPTION){
case 1:
puts("Ingrese los datos del grupo: \n");
crearLista(inicio);
break;
break;
case 2:
puts("NOT AVAIBLE");
break;
case 3:
puts("NOT AVAIBLE");
break;
//default: printf( "Opción no válida\n" );
                //break;
}
  }while(OPTION !=4);
return 0;
}
void crearLista(NODO *inicio){


NODO *ptr, *newNodo;
newNodo= (NODO *) malloc(sizeof(NODO));
if(newNodo==NULL){
printf("OUT OF MEMORY.\n");
}
printf("Nombre:\n ");
gets(newNodo->nombre);
getchar();
printf("Grupo:\n ");
gets(newNodo->grupo);
getchar();
puts("\nAño de lanzamiento: ");
gets(&newNodo->year);
getchar();
puts("\nCategoría: ");
gets(newNodo->categoria);
getchar();
if(inicio==NULL){
newNodo->siguiente=NULL;
inicio=newNodo;

}else{
ptr=inicio;
while(ptr->siguiente!=NULL){
ptr=ptr->siguiente;
}
ptr->siguiente=newNodo;
newNodo->siguiente=NULL;
      }

}


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #1 en: 5 Julio 2019, 01:25 am »

El programa parece que funciona correctamente...
Si tu problema es que no se vuelve a mostrar lo de "Ingrese una opcion\n" es porque se encuentra fuera del <do while>. Si no te refieres a eso, manda la salida de tu programa y especifica cuál es el problema ya que yo al menos no lo encuentro  :-X


En línea

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #2 en: 5 Julio 2019, 03:08 am »

Muchas gracias por responder.
El problema es que vuelve a ingresar automáticamente a la opción 1 luego de ingresar el primer el primer dato a la lista.
Una captura:
https://ibb.co/jyyWwX3
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #3 en: 5 Julio 2019, 21:35 pm »

No lo ejecuté, pero tienes varios errores. Primero, la recomendación es que uses fgets en lugar de gets, pues esta última es una función insegura. Pasando a los errores, uno es que estás leyendo year con gets, pero year es un int, por lo que gets está sobrescribiendo memoria incorrectamente y obviamente year queda con basura. Usa scanf.

Otro, el getchar que usas es para eliminar el caracter de nueva línea '\n' que algunas funciones dejan en el buffer de entrada, pero gets no es una de esas funciones, por lo que, en tu programa, los getchar lo unico que ocasionan es que el primer caracter de la siguiente línea introducida sea descartado, es decir, en el ejemplo de la captura que pusiste, lo que en realidad se estaría almacenando en grupo es "ammstein", ya que la "R" es leída y removida por el getchar que le precede. Debes borrar todos los getchar y sólo ponerlos después de los scanf, que sí dejan el '\n'.

Y el que quizás sea el más importante, el parámetro de crearLista es de tipo incorrecto. Como sabrás, cuando quieres que una función sea capaz de modificar una variable (como un int, float, etc.) que le pases como argumento, hay que hacerlo por referencia, que en C significa pasar un puntero a dicha variable. Lo mismo pasa con los punteros: si quieres modificar un puntero (no sólo los valores a los que apunta, sino el propio puntero), debes pasarle un puntero a puntero. Porque tal como lo tienes, crearLista recibe una copia del puntero inicio, por lo que cuando haces esto:

Código
  1. inicio=newNodo;

lo que estás modificando es la copia de inicio que sólo existe dentro de crearLista. Al regresar a main, inicio (la variable local de main) seguirá apuntando a NULL. Cambia el prototipo y la definición de la función a:

Código
  1. void crearLista(NODO **inicio)

y dentro de esa función, donde ponías inicio, pon *inicio. Y la invocas así:

Código
  1. crearLista(&inicio);

Te reitero que no lo probé, por lo que no sé si haya más errores, pero esto debería corregir al menos el problema que tienes actualmente.
« Última modificación: 5 Julio 2019, 21:37 pm por RayR » En línea

flowrd23

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #4 en: 4 Agosto 2019, 01:49 am »

Gracias....
Cómo uso el fgets?
Traté de usar para una sola entrada para el miembro nombre (ignorando y borrando los demás miembros de la estructura nodo) :  fgets(nuevo->nombre, 31, stdin);  y NO FUNCIONA....
Código
  1. /*5 El programa para ubicar un disco de una colección de música que se encuentra ordenada en
  2. estantes debe tener los siguientes datos:
  3. a Nombre el disco
  4. b Grupo musical
  5. c Soporte (vinilo, CD, cassette)
  6. d Año de lanzamiento
  7. e Categor&#305;&#769;a (clásica, jazz, folclore, tango, etc)
  8. f Ubicación (estante en el cual se encuentra)*/
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. typedef struct nodo{
  12. char album[50];
  13. char nombre[50];
  14. char soporte[31];
  15. int year;
  16. char category[31];
  17. int ubicacion;
  18. struct nodo *siguiente;
  19. }nodo;
  20. void ingresar_Nodo();
  21. void desplegar_Lista();
  22. nodo *primero=NULL;
  23. nodo *ultimo=NULL;
  24. FILE *a;
  25. int main(){
  26. puts("----BIENVENIDO---\t\n");
  27. int OPTION;
  28. do{
  29. printf("1) Ingresar álbum.\n 2) Desplegar la lista completa de discos.\n 3)SALIR.\n");
  30. scanf("%d", &OPTION);
  31. switch(OPTION){
  32. case 1:
  33. ingresar_Nodo();
  34. break;
  35. case 2:
  36. desplegar_Lista();
  37. break;
  38. }
  39. }while(OPTION!=3);
  40. return 0;
  41. }
  42. void ingresar_Nodo(){
  43. nodo *nuevo=(nodo *) malloc(sizeof(nodo));
  44.  
  45. printf("Ingrese datos del álbum:\n");
  46. printf("Album: ");
  47. scanf("%s", nuevo->album);
  48. fflush(stdout);
  49. printf("Nombre:");
  50. scanf("%s",nuevo->nombre);
  51. fflush(stdout);
  52. printf("Soporte: ");
  53. scanf("%s",nuevo->soporte);
  54. fflush(stdout);
  55. printf("Año: ");
  56. scanf("%d",&nuevo->year);
  57. printf("Categoría: ");
  58. scanf("%s",nuevo->category);
  59. fflush(stdout);
  60. printf("Ubicación física: ");
  61. scanf("%d",&nuevo->ubicacion);
  62. nuevo->siguiente=NULL;
  63. if(primero==NULL){
  64. primero=nuevo;
  65. ultimo=nuevo;
  66. }else{
  67. ultimo->siguiente=nuevo;
  68. ultimo=nuevo;
  69. }
  70.  
  71. }
  72. void desplegar_Lista(){
  73. puts("\tDESPLEGANDO LISTA COMPLETA....\n");
  74. nodo *auxiliar=(nodo *) malloc(sizeof(nodo));
  75. int i=0;
  76. auxiliar=primero;
  77. while(auxiliar!=NULL){
  78. printf("%s\n %s\n %s\n %d\n %s\n %d\n\n", auxiliar->album, auxiliar->nombre, auxiliar->soporte, auxiliar->year, auxiliar->category, auxiliar->ubicacion);
  79. auxiliar=auxiliar->siguiente;
  80. i++;
  81. }if(i==0){
  82. puts("LISTA VACÍA!\n");
  83. }
  84. }
  85.  
  86.  
  87.  
En línea

flowrd23

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #5 en: 4 Agosto 2019, 01:53 am »

Respecto al código anterior, es funcional con scanf si las entradas de palabras no tienen espacio.  Cómo incorporo correctamente fgets? probé cambiando todos los scanf que reciben caracteres con fgets pero así lo pasa por alto y vuelve al menú...
Necesito resolver esto, para avanzar más.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #6 en: 4 Agosto 2019, 02:10 am »

No creo que tenga ninguna complicación. En internet habrá infinidad de ejemplos al igual que en otros temas de este foro...
Código
  1. char nombre[50];
  2.  
  3. printf("Introduce tu nombre: ");
  4. fgets(nombre, 50, stdin);
  5.  
  6. printf("Tu nombre es: %s", nombre); // se mostrara "Tu nombre es: <nombre>\n" (con salto de linea al final)
PD: Ten cuidado ya que <fgets()> guarda también el salto de línea de cuando das al ENTER.

Y el problema que tendrás será porque tienes cosas en el buffer (saltos de línea seguramente) y no lo limpias. Es cierto que todo el mundo usa la función <fflush(stdin)> de forma incorrecta ya que <fflush()> está diseñada para trabajar con <stdout> pero obviamente no hace lo mismo. Tienes otras alternativas para limpiar el buffer que se comentaron en un tema de este foro de C/C++.
En línea

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #7 en: 5 Agosto 2019, 00:05 am »

Ya intenté probando limpiadores de buffers...fflush, .....getchar, etc. NO CONSIGO solución, ahora me saltea los scanf que levantan  año y ubicación.
Código
  1. void ingresar_Nodo(){
  2. nodo *nuevo=(nodo *) malloc(sizeof(nodo));
  3.  
  4. printf("Ingrese datos del álbum:\n");
  5. printf("Album: ");
  6. fgets(nuevo->album, 50, stdin);
  7. //scanf("%s", nuevo->album);
  8. //fflush(stdout);
  9. printf("Nombre:");
  10. fgets(nuevo->nombre, 50, stdin);
  11. //scanf("%s",nuevo->nombre);
  12. //fflush(stdout);
  13. printf("Soporte: ");
  14. fgets(nuevo->soporte, 31, stdin);
  15. printf("Año:");
  16. scanf("%d", &nuevo->year);
  17. printf("\nCategoría: ");
  18. fgets(nuevo->category, 31, stdin);
  19. //scanf("%s",nuevo->category);
  20. //fflush(stdout);
  21. printf("Ubicación física: ");
  22. scanf("%d",&nuevo->ubicacion);
  23.  
  24. nuevo->siguiente=NULL;
  25. if(primero==NULL){
  26. primero=nuevo;
  27. ultimo=nuevo;
  28. }else{
  29. ultimo->siguiente=nuevo;
  30. ultimo=nuevo;
  31. }
  32.  
  33. }
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con LISTAS y un switch.
« Respuesta #8 en: 5 Agosto 2019, 01:44 am »

Tienes que saber cuándo tienes algo en el buffer y cuando no. Si no tienes nada y pones un <getchar()> el programa espera un ENTER, entonces tienes que darlo antes de que te salga el siguiente mensaje y puedas introducir el siguiente dato. En tu caso sobran <getchar()> ya que <fgets()> guarda el ENTER dentro del nombre y no son necesarios pero si tienes problemas será que estás sobrepasando el límite de tamaño que tienes establecido.

Si cambiando el tamaño no consigues solucionarlo coloca un ejemplo de ejecución para poder verlo con más detalle.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con Listas
Java
HadesDark 2 2,370 Último mensaje 9 Noviembre 2007, 22:00 pm
por Ragnarok
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,097 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
Switch Emulator: el falso emulador de Nintendo Switch es un timo
Noticias
wolfbcn 0 1,605 Último mensaje 14 Marzo 2017, 21:36 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines