[Ayuda] Estructuras anidadas, registro. Lenguaje C

Iniciado por neron991, 8 Julio 2015, 19:51 PM

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

neron991

Hola de nuevo aqui pidiendo ayuda con el siguiente enunciado:

En una escuela se almacena informacion sobre los alumnos, este se almacena en un arreglo unidimensional de registros, por cada alumno se almacena la siguiente informacion: cedula, nombre, sexo, edad, carrera, semestre, calificacion_promedio; por materia se almacena: codigo, nombre_materia, unidad de credito y calificacion. (cada alumno solo puede cursar 4 materias). Realice un programa en C que:

A)Listado General.
B) Liste todos los alumnos mostrando el nombre de las materias que cursa.
C)Muestre la cantidad de alumnos reprobados, y liste los datos personales de cada alumno.
D) Muestre la cantidad de alumno que hayan inscrito una amteria especifica.

esto es lo que llevo hasta ahora, corre pero me tira unos warning y algunas incoherencias, no tengo idea como empezar lo demas para poder terminar el codigo si me pudieran ayudar con  este les agradeceria mucho T_T:


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#define tam 2
struct alumno {
    char nombre[30];
    char cedula [13];
char carrera [30];
char semestre[13];
char sexo[13];
};

struct materias{
int codigo;
char materia[30];
int unidaddecredito;
int calificacion;
};

  struct alumnos
  {
  struct alumno datos;
  struct materias mis_materias;
  };
 
  struct alumnos escuela;
 
int main()
{
   
    int i,opcion=1;
    float sum=0,cont=0,peor;
   

    for (i=0;i<tam;i++)
    {
    printf ("\n\t\tDatos de los alumnos. ");
        printf("\nIntroduzca nombre alumno: ");
        fgets(escuela.datos.nombre,30,stdin);
        fgets(escuela.datos.nombre,30,stdin);
        printf("Introduzca Cedula del alumno V-.");
        fgets(escuela.datos.cedula,13,stdin);
        printf("Introduzca Sexo: ");
        fgets(escuela.datos.sexo,13,stdin);
        printf("Introduzca la Carrera que cursa el alumno: ");
        fgets(escuela.datos.carrera,30,stdin);
        printf("Introduzca Semestre del alumno: ");
        fgets(escuela.datos.semestre,30,stdin);
       
        printf ("\t\tINFORMACION DE MATERIAS: \n");
       
        for (i=0;i<4;i++)
    {

        printf("Introduzca Codigo: ");
        scanf ("%d",&escuela.mis_materias.codigo,tam,stdin);
        printf("Introduzca nombre de la materia: ");
        scanf ("%s",escuela.mis_materias.materia);
        printf("Introduzca unidad de credito ");
        scanf ("%d",&escuela.mis_materias.unidaddecredito);
        printf("Introduzca nota: ");
        scanf("%d",&escuela.mis_materias.calificacion);
    }
}
   
    while ((opcion==1 || opcion==2 || opcion==3) || (opcion!=4))
    {
   
        printf("1- Buscar un alumno\n");
        printf("2- Media de todas las notas\n");
        printf("3- Alumno con peores notas\n");
        printf("4- Salir\n");
        printf("Introduzca una opción: ");
        scanf("%d",&opcion);
        switch (opcion)
         {
          case 1:
         
          printf("Introduzca un nombre: ");
             scanf ("%d",&escuela.datos.nombre);
           for(i = 0; i < tam;i++)
           {
             if (strcmp(escuela.datos.nombre[i],escuela.datos.nombre)==0)
             {
               printf("\nNombre: %s\n",escuela.datos.nombre[i]);
               printf("Nota: %d\n",escuela.mis_materias.calificacion);
               printf("\nCedula: %s\n",escuela.datos.cedula);
               printf("\nSexo: %s\n",escuela.datos.sexo);
               printf("\nCarrera: %s\n",escuela.datos.carrera);
               printf("\nSemestre: %s\n",escuela.datos.semestre);
             }
         }
       
           printf("\n\n");
           break;
        }
   
}
   while (getchar()!='\n');     
    return 0;
}

engel lex

Cita de: neron991 en  8 Julio 2015, 19:51 PM
esto es lo que llevo hasta ahora, corre pero me tira unos warning y algunas incoherencias, no tengo idea como empezar lo demas para poder terminar el codigo si me pudieran ayudar con  este les agradeceria mucho T_T:

Cuales warnings e incoherencias?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

neron991

C:\Users\ronald\Desktop\Sin Nombre1.c In function 'main':
50 16 C:\Users\ronald\Desktop\Sin Nombre1.c [Warning] passing argument 1 of 'fgets' makes pointer from integer without a cast
1 0 C:\Users\ronald\Desktop\Sin Nombre1.c In file included from C:\Users\ronald\Desktop\Sin Nombre1.c
442 17 C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include\stdio.h [Note] expected 'char * __restrict__' but argument is of type 'int'
52 16 C:\Users\ronald\Desktop\Sin Nombre1.c [Warning] passing argument 1 of 'fgets' makes pointer from integer without a cast
1 0 C:\Users\ronald\Desktop\Sin Nombre1.c In file included from C:\Users\ronald\Desktop\Sin Nombre1.c
442 17 C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include\stdio.h [Note] expected 'char * __restrict__' but argument is of type 'char'


esos!!

ivancea96

No puedes pasarle un int a fgets. fgets() guarda datos en char*. Si le pasas el int, estás convirtiendo el int a char*.

neron991

wuao ._: esa parte se me paso por alto, no sabia ese pequeño detalle xD, otro detalle es que al buscar el nombre al querer usar esa opcion se me sale del programa D: al querer comparar con los otros nombres..

mester

#5
Yo lo haría con ficheros binarios y así puedes guardar el registro y no trabajas con la memoria, así no introducirás los datos todo el rato. Usa las funciones fread y fwrite. Te costará más, pero seguro que te aprueban jeje. EJEMPLO:

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

int main(){
FILE *fd;
int edadLeida;
char nomLeido[100];
char dniLeido[15];
struct TBinario
{
int edad;
char nom[100];
char dni[15];
}persona[10];

persona[0].edad=20;
strcpy(persona[0].nom,"Borja");
strcpy(persona[0].dni,"454887965U");

fd=fopen("datosbin.dat","wb+");
//fwrite (direcc_dato, tamaño_dato, numero_datos, punt_fichero);
fwrite(&persona[0].edad,sizeof(int),1,fd);
fwrite(&persona[0].nom,sizeof(char)*100,1,fd);
fwrite(&persona[0].dni,sizeof(char)*15,1,fd);
fclose(fd);

//fread (direcc_dato, tamaño_dato, numero_datos,punt_fichero);
fd=fopen("datosbin.dat","rb+");
fread(&edadLeida, sizeof(int),1,fd);
fread(&nomLeido, sizeof(char)*100,1,fd);
fread(&dniLeido, sizeof(char)*15,1,fd);

printf("\nLa edad leída es: %d y el nombre: %s y el DNI: %s\n",edadLeida,nomLeido,dniLeido);

fclose(fd);
return 0;

}
Justicia es dar a cada uno lo que se merece

neron991

Cita de: nonpromisc en  9 Julio 2015, 00:06 AM
Yo lo haría con ficheros binarios y así puedes guardar el registro y no trabajas con la memoria, así no introducirás los datos todo el rato. Usa las funciones fread y fwrite. Te costará más, pero seguro que te aprueban jeje. EJEMPLO:

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

int main(){
FILE *fd;
int edadLeida;
char nomLeido[100];
char dniLeido[15];
struct TBinario
{
int edad;
char nom[100];
char dni[15];
}persona[10];

persona[0].edad=20;
strcpy(persona[0].nom,"Borja");
strcpy(persona[0].dni,"454887965U");

fd=fopen("datosbin.dat","wb+");
//fwrite (direcc_dato, tamaño_dato, numero_datos, punt_fichero);
fwrite(&persona[0].edad,sizeof(int),1,fd);
fwrite(&persona[0].nom,sizeof(char)*100,1,fd);
fwrite(&persona[0].dni,sizeof(char)*15,1,fd);
fclose(fd);

//fread (direcc_dato, tamaño_dato, numero_datos,punt_fichero);
fd=fopen("datosbin.dat","rb+");
fread(&edadLeida, sizeof(int),1,fd);
fread(&nomLeido, sizeof(char)*100,1,fd);
fread(&dniLeido, sizeof(char)*15,1,fd);

printf("\nLa edad leída es: %d y el nombre: %s y el DNI: %s\n",edadLeida,nomLeido,dniLeido);

fclose(fd);
return 0;

}


lo que pasa es que la profesora guardara todo cuando el programa este en ejecucion, si no usaria eso xD pero es algo complicado este programa que nos mando ._.'

mester

No es complicado, es largo de hacer sobretodo con ficheros. Mañana lo tendré terminado, si quieres te paso el codigo con comentarios y tal, no me importa que lo uses para aprobar, te veo con ganas de aprender y además, no me importa compartir mi conocimiento, aunque sea poco, con los demas.
Justicia es dar a cada uno lo que se merece

neron991

Cita de: nonpromisc en  9 Julio 2015, 00:50 AM
No es complicado, es largo de hacer sobretodo con ficheros. Mañana lo tendré terminado, si quieres te paso el codigo con comentarios y tal, no me importa que lo uses para aprobar, te veo con ganas de aprender y además, no me importa compartir mi conocimiento, aunque sea poco, con los demas.

gracias, si es muy largo T_T ya estoy tratando de hacer el case 2 gracias por tu ayuda me sirvio la parte que me pasaste y estoy completando lo otro, si quiero aprender lo que pasa es que fue mucha irresponsabilidad mia que deje esto para ultima hora ._., gracias muchas gracias!!

neron991

Otra duda para colocar contraseña al programa es asi:


char contra='abc123';
   char clave;
printf ("\nIngrese la contraseña: ");
    scanf ("%s",&clave);
    if (clave == contra)



pero al querer compilar me sale dos warning en el char contra='abc123';;
y al ejecutar el programa no me agarra la clave me salen estos dos warning:

27 21 C:\Users\ronald\Desktop\Sin Nombre1.c [Warning] character constant too long for its type
27 21 C:\Users\ronald\Desktop\Sin Nombre1.c [Warning] overflow in implicit constant conversion [-Woverflow]