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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con un ejercicio en C. tema Struct
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con un ejercicio en C. tema Struct  (Leído 5,777 veces)
Elowispo

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda con un ejercicio en C. tema Struct
« 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.


En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.470


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Ayuda con un ejercicio en C. tema Struct
« Respuesta #1 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!


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

Elowispo

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda con un ejercicio en C. tema Struct
« Respuesta #2 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
« Última modificación: 25 Octubre 2021, 22:58 pm por K-YreX » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda con un ejercicio en C. tema Struct
« Respuesta #3 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:
      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
      [SOLUCIONADO]¿Como printear un valor de un struct dentro de otro struct?
      Programación C/C++
      Firos 0 5,004 Último mensaje 24 Marzo 2011, 13:47 pm
      por Firos
      Ayuda Struct « 1 2 »
      Programación C/C++
      BlackM4ster 10 4,581 Último mensaje 8 Abril 2013, 14:37 pm
      por BlackM4ster
      Ayuda con struct en C
      Programación C/C++
      nyper01 4 2,164 Último mensaje 15 Diciembre 2013, 23:04 pm
      por nyper01
      Ejercicio en C ayuda struct,tabla,vector datos
      Programación C/C++
      banguu 2 2,465 Último mensaje 10 Noviembre 2015, 01:09 am
      por banguu
      Duda con respecto a struct dentro de struct
      Programación C/C++
      Naimaderis 1 3,238 Último mensaje 2 Abril 2017, 00:10 am
      por ivancea96
      WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines