Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Elowispo en 17 Octubre 2021, 16:52 pm



Título: Ayuda con un ejercicio en C. tema Struct
Publicado por: Elowispo en 17 Octubre 2021, 16:52 pm
Hola soy nuevo en el foro, me mandaron a hacer un ejercicio en c que dice lo siguiente:

Una compañía disquera organiza una encuesta para determinar el éxito de sus canciones. La población encuestada es dividida en cuatro categorías de acuerdo al sexo y a la edad (Por ejemplo: en personas de 20 años o menos y mayores de 20 años). A cada persona se le piden sus cinco canciones favoritas, las canciones son identificadas por números del 1 al N. Los resultados de la encuesta son tomados de la entrada estándar. Cada elemento leído representa un encuestado y contiene su nombre, apellido, sexo, edad, cedula y sus cinco canciones favoritas en orden de preferencia. Se desea que Ud. diseñe una estructura de datos en Lenguaje C para almacenar dicha información. Además, se pide realizar un programa que imprima en pantalla la tabla con la relación de los 10 primeros encuestados.

Tengo que realizarlo por el método Burbuja, agradecería un poquito de ayuda.


Título: Re: Ayuda con un ejercicio en C. tema Struct
Publicado por: MCKSys Argentina en 17 Octubre 2021, 16:53 pm
Hola!

Postea lo que llevas hecho (utiliza etiquetas GeSHi para el código) o realizar una pregunta más concreta.

Saludos!


Título: Re: Ayuda con un ejercicio en C. tema Struct
Publicado por: Elowispo en 24 Octubre 2021, 16:24 pm
Hola compañero tengo algo listo pero no creo que esta bien hecho puedes hecharle un vistazo a ver que se le puede cambiar? aqui lo tienes tal y como lo puse, por cierto estoy usando Dev C++, el problema surgue cuando se habre la consola hecha un vistazo a ver que tal.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. void lista_de_personasM();
  5. void lista_de_personasF();
  6.  
  7. int main()
  8. {
  9. lista_de_personasF();
  10. }
  11.  
  12. struct lista_de_personas{
  13. char nombre,apellido;  //variables para nombre y apellido
  14. int CI; // variable para la cedula (DNI)
  15. int edad; //Variable para la edad
  16. int sexo; //variable para el sexo
  17. int cancion[5]; //variable para a cancion
  18.  
  19.  
  20. }lista_de_personas[10];
  21.  
  22.   void lista_de_personasF(){
  23.  
  24.  
  25.   struct lista_de_personas;
  26.   int i; //variable bucle
  27.   int j; //Variable bucle
  28.  
  29.   for (i = 0;i < 2; i++){
  30.  
  31.   //INGRESAMOS LOS DATOS//
  32.   fflush(stdin);
  33.   //Guardamos nombre
  34.   printf("Personas N°[%d] \n",i+1);
  35.   printf("Introduce tu nombre y apellido por favor: \n");
  36.   printf("****Nombre**** \n");
  37.   gets(lista_de_personas[i].nombre);
  38.  
  39.   //Guardamos apellido
  40.   printf("****Apellido**** \n");
  41.   scanf("%s",&lista_de_personas[i].apellido);
  42.   //Guardamos cedula
  43.   printf("Introduce cedula de indentidad por favor: \n");
  44.   scanf("%i",&lista_de_personas[i].CI);
  45.   //Guardamos Edad
  46.   printf("Introduce tu edad por favor: \n");
  47.   scanf("%i",&lista_de_personas[i].edad);
  48.   //GUardamos genero
  49.   printf("Introduce sexo 1 = Masculido\n 2 = Femenino \n");
  50.   scanf("%s",&lista_de_personas[i].sexo);
  51.   for(j = 0;j < 5; j++){
  52.   //guardamos canciones
  53.   printf("Intoduce tus 5 canciones favoritas: \n");
  54.   printf("TOP[%i] \n",j + 1);    
  55.   scanf(" %i",&lista_de_personas[i].cancion[j]);
  56.  
  57.   }
  58. }
  59.  
  60. //Mostramos
  61. for(i=0; i<2; i++){
  62.        fflush(stdin);
  63.                printf("Persona numero[%d]",i+1);
  64. printf("Nombre: %s\n",lista_de_personas[i].nombre);
  65. printf("Numero de cedula: %i\n",lista_de_personas[i].CI);
  66. printf("edad: %i\n",lista_de_personas[i].edad);
  67. printf("sexo: %d\n",lista_de_personas[i].sexo);
  68. for(j = 0; j < 5; j++){
  69. printf("Tus canciones favoritas son: \n");
  70. printf("%i",lista_de_personas[i].cancion[j]);
  71. }
  72. printf("///////////////////////////////////////////////////////////// \n");
  73.  
  74.  
  75.   }
  76. }
  77.  
  78.  
  79.  
  80.  
  81.   void lista_de_personasM (){
  82.  
  83.  
  84.   int i;
  85.   int j;
  86.   struct lista_de_personas;
  87.  
  88.  
  89.   for(i = 0; i < 2; i++){
  90.   printf("------------------------------------------------------------ \n ");
  91. printf("------------------------------------------------------------ \n");
  92. printf("Nombre: %s\n", lista_de_personas[i].nombre);
  93. printf("Numero de cedula: %i\n", lista_de_personas[i].CI);
  94. printf("edad: %i \n", lista_de_personas[i].edad);
  95. printf("sexo: %s",lista_de_personas[i].sexo);
  96. for(j = 0; j < 5; j++){
  97. printf("Tus canciones favoritas son: \n");
  98. printf("%i",lista_de_personas[i].cancion[j]);
  99. }
  100.   }
  101.   }

MOD: El código debe estar entre etiquetas de Código GeSHi


Título: Re: Ayuda con un ejercicio en C. tema Struct
Publicado por: K-YreX en 26 Octubre 2021, 01:43 am
Bueno... A ver a ver. Parece que hay mucho trabajo por delante así que vamos a ir punto por punto:

  • Las funciones no siguen las normas básicas de las funciones:
    Una función debe realizar una función completa y autónoma. Una función es un fragmento de código que puedes reutilizar muchas veces. Para ello tiene que hacer una tarea muy bien definida y genérica. Por ejemplo: calcularMedia(...), mostrarMatriz(...), buscarMaximo(...), ... Si te fijas es muy sencillo saber qué hacen esas funciones, en cambio dos funciones que se llaman lista_de_personas_M() y lista_de_personas_F() no se sabe qué hacen a simple vista. Y además no hacen una tarea concreta sino que tienen dentro todo el programa en sí.

  • El nombre del struct no es del todo preciso. La estructura define una persona, no una lista de personas. Además estás definiendo en la línea 20 un array de struct global (no recomendable). Y cada vez que quieras usar el struct debes poner la palabra struct: en la línea 25 te falta el nombre de la variable. Poner: 'struct lista_de_personas;' es como poner: 'int;' Falta el nombre de la variable, sólo estás indicando el tipo que va a tener pero no cómo se llama. Seguramente este sea el primer error que te da al compilar.
    Otra cosa importante es que estás usando un char para guardar el nombre y otro para el apellido. Es decir, un único carácter para cada cosa, no una cadena.

    Una recomendación es usar 'typedef' para no tener que usar la palabra 'struct' todo el tiempo.
Código
  1. // Consejo EXTRA: Utiliza constantes para la longitud de los arrays estaticos
  2. #define MAX_LONGITUD_NOMBRE 20
  3. #define MAX_LONGITUD_APELLIDO 50
  4.  
  5. typedef struct {
  6.  char nombre[MAX_LONGITUD_NOMBRE];
  7.  char apellido[MAX_LONGITUD_APELLIDO];
  8.  // El DNI lo guardaria como un char[] y no como un int
  9.  //...
  10. } Encuestado;
  11.  
  12. int main() {
  13.  // Ahora para declarar un array de encuestados no hace falta hacer:
  14.  struct Encuestado encuestados[];
  15.  // Tan solo tienes que hacer:
  16.  Encuestado encuestados[];
  17. }

  • El main() de un programa de este estilo debería dar una visión general de lo que hace el programa (no cómo lo hace pero sí qué hace). En este caso si lees el main() te quedas más o menos así:  :huh:
    Yo apostaría por algo más de este estilo:
Código
  1. #define NUM_ENCUESTADOS 10
  2. #define NUM_CANCIONES 5
  3. //...
  4.  
  5. int main() {
  6.  Encuestado encuestados[NUM_ENCUESTADOS];
  7.  
  8.  for(int i = 0; i < NUM_ENCUESTADOS; ++i) {
  9.    printf("Introduce el nombre del encuestado %d: ", (i+1));
  10.    // Consejo EXTRA: Las cadenas de texto se leen con fgets() no con scanf(). Volveremos a esto mas adelante
  11.    fgets(personas[i].nombre, MAX_LONGITUD_NOMBRE, stdin);
  12.  
  13.    printf("Introduce la edad del encuestado %d: ", (i+1));
  14.    scanf("%d", &personas[i].edad);
  15.  
  16.    //...
  17.  }
  18.  // Tambien puedes hacer una funcion que sea pedirDatosEncuestado(Encuestado encuestado) y dentro poner todos los mensajes pidiendo datos y guardando la entrada del teclado...
  19.  
  20.  // Aqui ya puedes usar las funciones que quieras en base a lo que necesites
  21.  for(int i = 0; i < NUM_ENCUESTADOS; ++i) {
  22.    printf("***** DATOS DEL ENCUESTADO %d *****\n", (i+1));
  23.    // En el main() no necesito saber como va a mostrar los datos pero se lo que va a hacer. Para los detalles siempre puedes mirar dentro de la funcion
  24.    mostrarDatosEncuestado(encuestados[i]);
  25.    printf("\n");
  26.  }
  27. }

  • Entrada de datos: La función fflush() no debe usarse para limpiar el buffer de entrada (stdin). El fin de esta función (mal utilizada) es eliminar los saltos de línea '\n' que se insertan en el buffer de entrada al pulsar Enter. Aquí pueden darse 2 casos:
    • Lectura de cadenas de caracteres. La forma correcta/segura es mediante la función fgets(). Aquí pueden darse 2 casos también:
      • Se introducen más caracteres de los que se pueden almacenar en el array -> En el buffer quedarán todos los caracteres que no caben en el array y al final el salto de línea '\n'. Todo esto que queda en el buffer tiene que limpiarse.
      • Se introducen menos caracteres de los que se pueden almacenar en el array -> Se guardan todos los caracteres (incluido el salto de línea) y el buffer queda vacío.
      Para ambos casos se puede usar el siguiente código:
    Código
    1. char cadena[MAX_SIZE]; // La longitud maxima es indiferente
    2. printf("Introduce una cadena: ");
    3. fgets(cadena, MAX_SIZE, stdin);
    4. if(cadena[strlen(cadena) - 1] == '\n') // Si el ultimo caracter guardado es el salto de linea -> El buffer esta limpio
    5.  cadena[strlen(cadena) - 1] = '\0'; // Eliminamos el salto de linea que es muy molesto
    6. else // En caso de que el ultimo caracter no sea un salto de linea, significa que quedan restos en el buffer de entrada -> Hay que limpiar todo
    7.  while(getchar() != '\n'); // Elimina los caracteres que quedan en el buffer hasta encontrar el salto de linea (que es el ultimo caracter del buffer)
    • Lectura de datos que no sean cadenas de caracteres. Para este caso la función más común a utilizar es scanf(). Esta función nunca incluye el salto de línea dentro de la variable por lo que siempre quedará en el buffer. En este caso tan solo hay que limpiar todo el buffer justo después de un scanf() para asegurarnos de que siempre estará limpio.
    Código
    1. printf("Introduce un numero: ");
    2. scanf("%d", &numero);
    3. while(getchar() != '\n'); // Con el bucle podremos limpiar cualquier resto si se introduce un dato no valido ademas del salto de linea

      Y con esto creo que tienes ya recomendaciones para rato. Cualquier duda de estos temas tienes temas en este foro más antiguos donde se explican, puedes usar el botón de "Buscar" para encontrarlos.
      PD: Cuidado con los tipos de datos, tienes por ahí un %s para guardar un int...  :rolleyes: :rolleyes:
      PD2: Mencionas el método burbuja pero eso es un algoritmo de ordenación y hasta donde yo he entendido no necesitas ordenar nada en este programa... :huh: