C/Visual C - Arreglo de structs

 
Vista:

Arreglo de structs

Publicado por Juan (1 intervención) el 11/04/2014 21:48:11
Hola, les cuento mi problema. Tengo que hacer el siguiente problema con un arreglo de structs:
Desarrolle un programa que lea los datos de un conjunto de alumnos sobre un arreglo de structs y realice los siguientes procesos:
--Nombre del alumno con máximo promedio.
--Listado, nombres,matrículas y promedio de los alumnos con promedio inferior a x (dato).

Como es uno de los primeros programas que escribo, lo que hice en principio es hacer la lectura y la escritura, pero ingreando sólo una nota. Cuando agrego las 2 notas siguientes me devuelve mal los valores, me devuelve caracteres y numeros que parece que son direcciones de memoria. Acá les mando el código con el error que les cuento:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#define N 1
typedef struct lista {
char nom[40];
long mat[30];
int nota1[40];
int nota2[40];
int nota3[40];
 
} ALUM;
 
void lee_struct();
//float promedio();
void escribe();
 
 
 
void lee_struct(){
int i; ALUM alumnos[N];
for(i=0;i<N;i++){
fflush(stdin);
printf("\nIngrese el nombre del alumno %d: ",i+1);
gets(alumnos[i].nom);
fflush(stdin);
 
printf("\nIngrese la matricula del alumno %d: ",i+1);
scanf("%d",&alumnos[i].mat);
fflush(stdin);
 
printf("\nIngrese la nota del alumno %d: ",i+1);
scanf("%d",&alumnos[i].nota1);
fflush(stdin);
 
printf("\nIngrese la nota2 del alumno %d: ",i+1);
scanf("%d",&alumnos[i].nota2);
fflush(stdin);
 
printf("\nIngrese la nota3 del alumno %d: ",i+1);
scanf("%d",&alumnos[i].nota3);
fflush(stdin);
 
}
}
 
/*  float promedio (){
int i,j,suma; float prom,aux; ALUM alumnos[N];
for(i=0;i<N;i++){
 suma=alumnos[i].nota1 + alumnos[i].nota2 + alumnos[i].nota3;
 prom=suma/3;
 aux=prom;
 if (prom > aux){
    max=prom
     else
        prom=aux;

 }

}
printf("El mayor promedio es: %g , del alumno: %d",prom,i);



}   */
int main(){
 
lee_struct();
//promedio();
escribe();
 
return 0;
}
 
void escribe() {
int i; ALUM alumnos[N];
 
printf("\n\nMOSTRAR DATOS\n");
for(i=0;i<N;i++){
 
printf("\nNombre del alumno %d =========>  ",i+1);
puts(alumnos[i].nom);
 
printf("\nMatricula del alumno %d =========> %d ",i+1,*alumnos[i].mat);
 
 
printf("\nNota1 del alumno %d =========> %d ",i+1,*alumnos[i].nota1);
 
printf("\nNota2 del alumno %d =========> %d ",i+1,*alumnos[i].nota2);
 
printf("\nNota3 del alumno %d =========> %d ",i+1,*alumnos[i].nota3);
printf("\n\n");
}
}

De cualquier manera se me complica con el tema de los punteros, que no se donde usarlos, ya que hasta el momento no hemos visto memoria dinámica, y no se si es necesario usarlo en un programa usando memoria estática.
Tengo ese problema y con los parámetros que hay que pasa dentro de los paréntesis de las funciones. Ahí comente en el código la funcion promedio que creo que está mal.
A ver quien me puede dar una mano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Arreglo de structs

Publicado por UnoPorAhi (15 intervenciones) el 14/04/2014 21:11:59
Buenas,
Lo mejor es que te cojas un buen libro de C, aunque sea cortito, y lo leas con atención.

La función lee_struct es para enmarcar. Sobre todo, y como ya dice el compilador cuando tratas de compilar el programa, recuerda que la función gets es KK, es el mal, el apocalipsis, no usar bajo pena de muerte!

Te pongo esa función y la de escribe() un poco limpias para que al menos te funcione correctamente y no te de 50 warnings.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void lee_struct(){
	int i; ALUM alumnos[N];
	for(i=0;i<N;i++){
		printf("\nIngrese el nombre del alumno %d: ",i+1);
		scanf("%s",alumnos[i].nom);
 
 
		printf("\nIngrese la matricula del alumno %d: ",i+1);
		scanf("%li",alumnos[i].mat);
 
 
		printf("\nIngrese la nota del alumno %d: ",i+1);
		scanf("%i",alumnos[i].nota1);
 
 
		printf("\nIngrese la nota2 del alumno %d: ",i+1);
		scanf("%i",alumnos[i].nota2);
 
 
		printf("\nIngrese la nota3 del alumno %d: ",i+1);
		scanf("%i",alumnos[i].nota3);
	}
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void escribe() {
	int i; ALUM alumnos[N];
 
	printf("\n\nMOSTRAR DATOS\n");
	for(i=0;i<N;i++){
		printf("\nNombre del alumno %d =========> %s ",i+1,alumnos[i].nom);
 
		printf("\nMatricula del alumno %d =========> %li ",i+1,*alumnos[i].mat);
 
 
		printf("\nNota1 del alumno %d =========> %d ",i+1,*alumnos[i].nota1);
 
		printf("\nNota2 del alumno %d =========> %d ",i+1,*alumnos[i].nota2);
 
		printf("\nNota3 del alumno %d =========> %d ",i+1,*alumnos[i].nota3);
		printf("\n\n");
	}
}


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Arreglo de structs

Publicado por daN jkzz (2 intervenciones) el 03/05/2014 07:15:05
El problema esta en la estructura,
1
2
3
4
5
6
7
8
typedef struct lista
 {
    char nom[40];
    long mat[30];
    int nota1[40];   <---
    int nota2[40];   <---
    int nota3[40];   <---
} ALUM;

Estas declarando arrays de nota1, nota2, nota3..

Estructura corregida:

1
2
3
4
5
6
7
8
typedef struct lista
 {
    char nom[40];
    long mat[30];
    int nota1;
    int nota2;
    int nota3;
} ALUM;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar