Error de estructuras en C

Iniciado por ERIK546, 18 Junio 2012, 02:15 AM

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

ERIK546

Hola solicito la ayuda de los expertos esta vez para que me ayuden a encontrar el error que se encuentra en éste programa que utiliza una estructura para guardar diferentes datos, en una estructura llamada "alumno". Les solicito que le den un vistazo al programa y se den cuenta que al parecer no posee errores de sintaxis y presiento que es más un error lógico o algo por el estilo. La idea principal del programa es que en una estructura con el nombre "alumno" pueda guardar en las variables de dicha estructura los datos de nombre, calificación y su número de lista de "n" alumnos guardando en dichas variables de la estructura los "n" datos mediante un ciclo y un arreglo para poder mostrarlos en pantalla con otro ciclo. Les dejo el programa para que puedan decirme donde se encuentra el error, ya que el programa es compilado y ejecutado, sin embargo muestra un error en el ejecutable. Gracias a todos de antemano.

#include <stdio.h>
#include <stdlib.h>

struct alumno{
        char nombre;
        int calificacion;
        int lista;
    };

int main(){
struct alumno ALUMNO[100];
int n,l;
printf("Introduce el numero de alumnos que se tomaran los datos\n");
scanf("%d",&n);                                                                                                                   
for(l=0;l<n;l++){
                 printf("Introduce el nombre del alumno\n");
                 scanf("%s",&ALUMNO[l].nombre);
                 printf("Introduce la calificacion del alumno\n");
                 scanf("%d",&ALUMNO[l].calificacion);
                 printf("Introduce el numero de lista del alumno\n");
                 scanf("%d",&ALUMNO[l].lista);
                 }
for(l=0;l<n;l++){
                   printf("El nombre del alumno es: %s\n",ALUMNO[l].nombre);
                   printf("La calificacion del alumno es: %d\n",ALUMNO[l].calificacion);
                   printf("El numero de lista es: %d\n",ALUMNO[l].lista);
                   }

system("PAUSE");

  return 0;
}

STANHMAL

Hola que tal, el problema esta en la estructura, ya que tienes nombre para que solo guarde un carácter.

error :


struct alumno{
        char nombre;
        ...
    };


solucion :


struct alumno{
        char nombre[20];
        ...
    };


y el otro problema es que cuando lees la cadena se la mandas con el ampersand &,a para las cadenas no es necesario.

error :


...
printf("Introduce el nombre del alumno\n");
scanf("%s",&ALUMNO[l].nombre);
...


solución :


...
printf("Introduce el nombre del alumno\n");
scanf("%s",ALUMNO[l].nombre);
...


$4!u2
Power Metal vs Reggaeton



Que es mi ordenador mi tesoro que todo el mundo ha de temer. Mi ley, el ratón y el módem. Mi única patria, la red

The Swash

CitarHola,

Por encima y sin poder compilar (no estoy en mi PC) puedo decirte que el problema seguramente se encuentre en el campo nombre en la estructura alumno, en realidad debería ser un arreglo de caracteres.

char nombre[10];
o bien de manera dinámica reservando memoria:
char * nombre;

Y creo que en el scanf deberías pasar sin el "&", pero no tengo compilador para confirmarlo.

Un saludo,
Iván Portilla.

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

STANHMAL me la ganaste! Además de que me certificaste estar en lo correcto.

ERIK546

Cita de: STANHMAL en 18 Junio 2012, 02:38 AM
Hola que tal, el problema esta en la estructura, ya que tienes nombre para que solo guarde un carácter.

error :


struct alumno{
        char nombre;
        ...
    };


solucion :


struct alumno{
        char nombre[20];
        ...
    };


y el otro problema es que cuando lees la cadena se la mandas con el ampersand &,a para las cadenas no es necesario.

error :


...
printf("Introduce el nombre del alumno\n");
scanf("%s",&ALUMNO[l].nombre);
...


solución :


...
printf("Introduce el nombre del alumno\n");
scanf("%s",ALUMNO[l].nombre);
...


$4!u2

Muchas gracias por tu respuesta STANHMAL, he corregido el error y ahora arroja resultados pero tengo una nueva problemática con el programa: Te dejo el código modificado para que compruebes que he cambiado lo que señalas:

#include <stdio.h>
#include <stdlib.h>

struct alumno{
        char nombre[100];
        int calificacion[100];
        int lista[100];
    };

int main(){
struct alumno ALUMNO[100];
int n,l;
printf("Introduce el numero de alumnos que se tomaran los datos\n");
scanf("%d",&n);                                                                                                                   
for(l=0;l<n;l++){
                 printf("Introduce el nombre del alumno\n");
                 scanf("%s",ALUMNO[l].nombre);
                 printf("Introduce la calificacion del alumno\n");
                 scanf("%d",ALUMNO[l].calificacion);
                 printf("Introduce el numero de lista del alumno\n");
                 scanf("%d",ALUMNO[l].lista);
                 }
for(l=0;l<n;l++){
                   printf("El nombre del alumno es: %s\n",ALUMNO[l].nombre);
                   printf("La calificacion del alumno es: %d\n",ALUMNO[l].calificacion);
                   printf("El numero de lista es: %d\n",ALUMNO[l].lista);
                   }

system("PAUSE");

  return 0;
}

El problema ahora reside que al ejecutarse el programa lo que imprime de la variable "ALUMNO[l].calificacion" y la variable "ALUMNO[l].lista" es al parecer la dirección de memoria de dicha variable y no el valor que mandé guardar en el ciclo anterior con el "scanf". No se porque ocurre esto, gracias por todo espero que me puedan ayudar.

durasno

Hola!
CitarEl problema ahora reside que al ejecutarse el programa lo que imprime de la variable "ALUMNO[l].calificacion" y la variable "ALUMNO[l].lista" es al parecer la dirección de memoria de dicha variable y no el valor que mandé guardar en el ciclo anterior con el "scanf"

mira como declaras tus variables haber si te das cuenta:
Citarint calificacion[100];
        int lista[100];


Saludos
Ahorrate una pregunta, lee el man

ERIK546

Cita de: The Swash en 18 Junio 2012, 02:40 AM
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

STANHMAL me la ganaste! Además de que me certificaste estar en lo correcto.

Hola gracias por responder, sobre lo que dijiste de usar una variable tipo apuntador en la estructura ¿Cómo debería darle dimensión? ¿Sería darle dimensión con "malloc" a la variable "nombre" pero ya en el "main"? Me gustaría saber como lo harías, gracias por todo.

ERIK546

Cita de: ERIK546 en 18 Junio 2012, 04:46 AM
Hola gracias por responder, sobre lo que dijiste de usar una variable tipo apuntador en la estructura ¿Cómo debería darle dimensión? ¿Sería darle dimensión con "malloc" a la variable "nombre" pero ya en el "main"? Me gustaría saber como lo harías, gracias por todo.
Gracias he encontrado el error, de esta forma me ha corrido sin problemas:

struct alumno{
        char nombre[100];
        int calificacion;
        int lista;
    };

ERIK546

Hola a todos gracias por su ayuda, se ha logrado ejecutar el programa a la perfección. Sin embargo el programa que ocupo esta un tanto lejos de estar terminado, ya que aparte de esos datos que se han puesto; ocupo ingresar la fecha de nacimiento de estos alumnos. Para ello he decidido poner una nueva variable en la estructura llamada "fecha"; y a su vez una nueva variable de la estructura llamada "FECHA" como un arreglo de 3 dimensiones se podría decir. Para que al ingresar los datos que corresponden a la fecha los guarde en dicho arreglo en la variable de la estructura de la siguiente manera.

#include <stdio.h>
#include <stdlib.h>

struct alumno{
        char nombre[100];
        int calificacion;
        int lista;
        int fecha;
    };

int main(){
struct alumno ALUMNO[100];
struct alumno FECHA[100][100][100];
int n,l,i,j,k;
printf("Introduce el numero de alumnos que se tomaran los datos\n");
scanf("%d",&n);                                                                                                                   
for(l=0;l<n;l++){
                 printf("Introduce el nombre del alumno\n");
                 scanf("%s",ALUMNO[l].nombre);
                 printf("Introduce la calificacion del alumno\n");
                 scanf("%d",&ALUMNO[l].calificacion);
                 printf("Introduce el numero de lista del alumno\n");
                 scanf("%d",&ALUMNO[l].lista);
                 }
for(i=0;i<n;i++){
                 for(j=0;j<n;j++){
                                  for(k=0;k<n;k++){
                                                   printf("Inttoduce la fecha de nacimiento del alumno con el formato DD-MM-ANO");
                                                   scanf("%d-%d-%d",&FECHA[i][j][k].fecha);
                                                   }
                                  }
                 }
                                                                 
for(l=0;l<n;l++){
                   printf("El nombre del alumno es: %s\n",ALUMNO[l].nombre);
                   printf("La calificacion del alumno es: %d\n",ALUMNO[l].calificacion);
                   printf("El numero de lista es: %d\n",ALUMNO[l].lista);
                   }


system("PAUSE");

  return 0;
}


Tengo duda sobre la declaración de la variable "fecha" en la estructura ya que no se maneja como un arreglo. Agradecería su ayuda ya que lo compila pero al ejecutar marca un error ".exe".Gracias por todo.

STANHMAL

Holas, tu error esta acá :


...
struct alumno FECHA[100][100][100];
...
scanf("%d-%d-%d",&FECHA[i][j][k].fecha);
...


utilizas la struct de alumno la cual solo tiene 1 int destinado para la fecha y necesitas guardar 3, te recomiendo que hagas otra estructura especial para la fecha, algo así:


struct fecha{
    int dia;
    int mes;
    int año;
}


con eso podes eliminar esta parte del código :


for(i=0;i<n;i++){
                 for(j=0;j<n;j++){
                                  for(k=0;k<n;k++){
                                                   printf("Inttoduce la fecha de nacimiento del alumno con el formato DD-MM-ANO");
                                                   scanf("%d-%d-%d",&FECHA[i][j][k].fecha);
                                                   }
                                  }
                 }


y podes juntar la parte en la que se lee la fecha en el for donde pides los datos de alumno.


$4!u2
Power Metal vs Reggaeton



Que es mi ordenador mi tesoro que todo el mundo ha de temer. Mi ley, el ratón y el módem. Mi única patria, la red

ERIK546

Hola a todos, gracias por su ayuda en la realización de éste programa que tiene como objetivo pedir los datos de "n" personas; entre esos datos su fecha de nacimiento y ordenar los datos de acuerdo a su fecha de nacimiento. Les dejo ahora el código terminado para que sea de apoyo a la comunidad;


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
        char nombre[100];
        int calificacion;
        int lista;
        int c;
        int dia;
        int mes;
        int ano;
       } alumno;


int main(){
alumno *ALUMNO;
alumno aux;
int n,l,i,j,m;
printf("Introduce el numero de alumnos que se tomaran los datos\n");
scanf("%d",&n);
ALUMNO=(alumno *) malloc (sizeof(alumno)*n);                                                                                                                   
for(l=0;l<n;l++){
                 printf("Introduce el nombre del alumno %d\n",l+1);
                 scanf("%s",ALUMNO[l].nombre);
                 printf("Introduce la calificacion del alumno %d\n",l+1);
                 scanf("%d",&ALUMNO[l].calificacion);
                 printf("Introduce el numero de lista del alumno %d\n",l+1);
                 scanf("%d",&ALUMNO[l].lista);
                 printf("Introduce los datos de la fecha de nacimiento del alumno %d\n",l+1);
                 printf("Introduce el dia\n");
                 scanf("%d",&ALUMNO[l].dia);
                 printf("Introduce el mes\n");
                 scanf("%d",&ALUMNO[l].mes);
                 printf("Introduce el año\n");
                 scanf("%d",&ALUMNO[l].ano);
                 }
                 
                                                                 
for(l=0;l<n;l++){
                   printf("El nombre del alumno %d es: %s\n",l+1,ALUMNO[l].nombre);
                   printf("La calificacion del alumno %d es: %d\n",l+1,ALUMNO[l].calificacion);
                   printf("El numero de lista del alumno %d es: %d\n",l+1,ALUMNO[l].lista);
                   printf("La fecha de nacimiento del alumno %d es: %d-%d-%d\n",l+1,ALUMNO[l].dia,ALUMNO[l].mes,ALUMNO[l].ano);
                   }
for(l=0;l<n;l++){
                 ALUMNO[l].c=(ALUMNO[l].ano*10000)+(ALUMNO[l].mes*100)+(ALUMNO[l].dia*1);
                 }
for(l=0;l<n;l++){
                 for(m=l+1;m<=n;m++)
                                    {
                                    if(ALUMNO[l].c>ALUMNO[m].c){
                                               aux.c=ALUMNO[l].c;
                                               strcpy(aux.nombre,ALUMNO[l].nombre);
                                               aux.calificacion=ALUMNO[l].calificacion;
                                               aux.lista=ALUMNO[l].lista;
                                               aux.dia=ALUMNO[l].dia;
                                               aux.mes=ALUMNO[l].mes;
                                               aux.ano=ALUMNO[l].ano;
                                               
                                               ALUMNO[l].c=ALUMNO[m].c;
                                               strcpy(ALUMNO[l].nombre,ALUMNO[m].nombre);
                                               ALUMNO[l].calificacion=ALUMNO[m].calificacion;
                                               ALUMNO[l].lista=ALUMNO[m].lista;
                                               ALUMNO[l].dia=ALUMNO[m].dia;
                                               ALUMNO[l].mes=ALUMNO[m].mes;
                                               ALUMNO[l].ano=ALUMNO[m].ano;
                                               
                                               ALUMNO[m].c=aux.c;
                                               strcpy(ALUMNO[m].nombre,aux.nombre);
                                               ALUMNO[m].calificacion=aux.calificacion;
                                               ALUMNO[m].lista=aux.lista;
                                               ALUMNO[m].dia=aux.dia;
                                               ALUMNO[m].mes=aux.mes;
                                               ALUMNO[m].ano=aux.ano;
                                                                     }
                                               }
                 }
for(l=0;l<n;l++){
                 printf("\n%s:\n\tNo. de lista: %d\n\tCalificación: %d\n\tAño: %d\n\tMes: %d\n\tDia: %d\n",ALUMNO[l].nombre,ALUMNO[l].lista,ALUMNO[l].calificacion,ALUMNO[l].ano,ALUMNO[l].mes,ALUMNO[l].dia);
                 }

free(ALUMNO);

system("PAUSE");

return 0;
}