Título: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: alejandrodiaz en 30 Julio 2015, 10:14 am Buenas, estoy aprendiendo a programar en C y tengo muchas dudas con respecto a guardar datos en los arreglos multidimensionales.
// Tengo un ejercicio que dice: Un instituto desea controlar los resultados de los alumnos en las diferentes asignaturas de sus cursos de informatica, el programa debe leer las calificaciones obtenidas en las diferentes asignaturas y visualizar en pantalla el numero de cada estudiante seguipo por la media del estudiantes y una lista de las calificaiones parciales de ese estudiante. el programa visualizará tambien la calificacion media de todos los estudiantes en cada asignatura. // Es la primera vez que hago un ejercicio como este, siempre he hecho cosas sencillas, el caso es que mi codigo va bien hasta el punto en que tengo que guardar las notas en los arrays, ya que en el modo en que lo hago se me sobreescribe las notas de un alumno sobre otra. Para el instituto que lo hago no es por semestres sino por trimestres, tres trimestres en un año. Al final me da datos erroneos, de otras partes de la memoria. Se que deberia usar punteros y funciones pero como dije soy novato y me confundo. Quiero ver primero que funciona y luego darle orden. como seria la forma correcta de guardar las notas para cada alumno y materia? este es mi codigo Código
Al analizar pienso que guardar las notas de la forma ejemplo: scanf("%d", ¬_tra1 [k]); no está bien hecho, creo que deberia ser ¬_tra1
tambien para los arreglos de trayectos tengo not_tra1[4][cant_nota]; Donde 4 quise definir la cantidad de trayectos pero se ahora se que es un error porque no dejo crecer la matriz en filas, quisiera que sea automatica pero dejando [ ] vacio me tira error. Y por ultimo veo que guardar todas las notas de los mismos alumnos y materias de un trayecto en un solo arreglo es una cantidad de numeros desorganizada.. pero con tanto lio no se como avanzar Espero me puedan ayudar, soy muy novato como ven... Gracias! Título: Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: joecarl en 30 Julio 2015, 11:26 am Esta parte del código está mal:
Código
No puedes definir el tamaño de un array con una variable, es decir: Código
Deberia ser: Código
He puesto 10, pero eso no quiere decir que haya q usar las 10, sino que como maximo tenemos 10. Otra cosa es que si ya estas creando varios arrays para cada trayecto entonces el [4] sobra, aunque quedaria más organizado en un solo array, es decir, en lugar de: Código
Deberías poner: Código
Luego esta parte: Código No sirve para nada, no tiene efecto, esas lineas las puedes eliminar directamente. Cuando entiendas eso respónde al post y seguimos. Título: Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: alejandrodiaz en 30 Julio 2015, 11:38 am Perfecto, ya he modificado el arreglo de trayecto, y los char lo he puesto. voy a seguir con los valores de tu ejemplo y luego los modifico a los que requiera.
Código
habia puesto 4 porque en los FOR iniciaba con el i=1, para en el printf usar el "i" para ordenar los mensajes por el numero de alumnos ejemplo: alumno nro 1; igual veo que es un desperdicio de elemento. También quite las variables globales del main.. estaba apenas aprendiendo la diferencia entre variables locales y globales. Gracias por la aclaratoria. Título: Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: joecarl en 30 Julio 2015, 12:45 pm Perfecto, seguimos:
Código Esto tampoco tiene efecto, fflush sirve para vaciar los buffer de salida, los de entrada no puedes vaciarlos de esta manera. Asique elimina también estas líneas. Si solo quieres 3 trayectos pues declara solo 3: Código
Y el primer trayecto sera el 0 el segundo el 1 y el tercero el 2. Acostumbrate a reccorrer los arrays de esa manera, así es como se debe hacer siempre en C. Con respecto a esto: Código
Lo puedes sustituir por: Código
Fijate en como cambia la forma de recorrer el array: Código
Título: Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: alejandrodiaz en 30 Julio 2015, 13:06 pm Buenisimo, ya voy entendiendo amigo.
Lo de fflush(stdin) lo habia puesto porque al principio tengo un scanf y luego le sigue un gets, entonces al compilar me saltaba un ciclo en for, lei algo sobre que el scanf al finalizar agrega un salto de line \n y el gets lo leia y guardaba el espacio en un elemento del arreglo. Código
Ya empiezo a corregir el resto. Con esto podré ya imprimir todos los datos agregados o todavia falta? Título: Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: joecarl en 30 Julio 2015, 13:17 pm Sí lo del retorno del línea es cierto, pero es que fflush(stdin); no deberia solucionarlo. ¿A ti te funciona? Porque eso es muy raro que funcione, pero bueno si te va bien así déjalo, aunque ya te digo que a mi eso nunca me ha funcionado, la solucion correcta es otra más compleja, si quieres más adelante te la explico.
Y sí, yo creo que con eso ya estaría todo arreglado, si no te funciona y no encuentras el error pues coméntalo. Título: Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: alejandrodiaz en 30 Julio 2015, 13:26 pm Si bueno, en ese caso que mencione me funciono y no molesto mas, por eso lo puse en todos lados para prevenir.
Cuando tengas oportunidad explicas la solucion para no usar fflush(stdin) todo lo que ayude en mi aprendizaje es bienvenido. Y claro seguro seguire comentando, me toca aplicar funciones, punteros y sacar los promedios, estoy casi seguro que tendre muchos errores. Muchas gracias amigo por la ayuda, seguire editando el codigo. Título: Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C) Publicado por: joecarl en 30 Julio 2015, 20:56 pm La forma adecuada de leer enteros por teclado sin dar pie a problemas es así:
Código Esto se hace precisamente para quitar ese retorno de linea que nos está haciendo la puñeta, ya que con fgets estamos vaciando stdin por completo. EDIT: también puedes meter ese código en una función para no tener que andar repitiéndolo todo el rato: Código
También añado que leer una cadena de texto con gets es inseguro ya que gets no controla el numero máximo de caracteres que vas a leer, por tanto deberías usar fgets también. Es decir, en lugar de: Código
Usa: Código
Por ultimo, decirte que he puesto 30 pero lo correcto es usar un DEFINE arriba del todo para no tener que andar poniendo 30 por todas partes, es decir: Código
|