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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error al guardar muchos datos en arrays multidimensional (lenguaje C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error al guardar muchos datos en arrays multidimensional (lenguaje C)  (Leído 2,732 veces)
alejandrodiaz

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« 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
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <conio.h>
  6.  
  7. //Declarando variables globales para que el usuario establezca limites en los ciclos FOR//
  8. int cant_alum;
  9. int cant_mate;
  10. int cant_nota;
  11.  
  12. int main()
  13. {
  14.    //Arrays para nombres de alumnos y materias ---Arrays de caracteres---//
  15.    char nom_alum[cant_alum][30];
  16.    char nom_mate[cant_mate][40];
  17.  
  18.    //Arrays para notas de trayectos ---not_tra1 = notas del trayecto1--- //
  19.  
  20.    int  not_tra1[4][cant_nota];    
  21.    int  not_tra2[4][cant_nota];
  22.    int  not_tra3[4][cant_nota];
  23.  
  24.    //Llamando a las variables globales//
  25.    cant_alum;
  26.    cant_mate;
  27.    cant_nota;
  28.  
  29.    //Enteros usados en los ciclos FOR//
  30.    int i;
  31.    int j;
  32.    int k;
  33.  
  34.  
  35. //Inicia el programa//
  36.        printf("Cuantos alumnos desea registrar?: ");
  37.        fflush(stdin);
  38.        scanf("%d", &cant_alum);
  39.  
  40.            for (i=1; i<cant_alum+1; i++){
  41.                printf("Alumno nro %d: ",i);
  42.                fflush(stdin);
  43.                gets(nom_alum[i]);
  44.    }
  45.  
  46.        printf("\nCuantas materias desea registrar?: ");
  47.        fflush(stdin);
  48.        scanf("%d",&cant_mate);
  49.  
  50.            for(i=1; i<cant_alum+1; i++){
  51.                printf("Materia nro %d: ",i);
  52.                fflush(stdin);
  53.                gets(nom_mate[i]);
  54.            }
  55.  
  56.    printf("\nCuantas evaluaciones fueron por trayecto?: ");
  57.    fflush(stdin);
  58.    scanf("%d", &cant_nota);
  59.  
  60.  
  61. //PARTE 2: GUARDAR DATOS. MAL HECHO//
  62.  
  63.            for(i=1; i<cant_alum+1; i++){
  64.                printf("\n\n********** Alumno nro %d : %s **********\n" , i, nom_alum[i]);
  65.  
  66.                        for(j=1; j<cant_mate+1; j++){
  67.                            printf("\n\nIngrese las notas parciales de %s\n", nom_mate[j]);
  68.  
  69.                                printf("\n===== Trayecto 1 =====\n\n");
  70.                                    for (k=1; k<cant_nota+1; k++){
  71.                                        printf("Nota %d: ", k);
  72.                                        fflush(stdin);
  73.                                        scanf("%d",&not_tra1[k]);
  74.                            }
  75.                                printf("\n===== Trayecto 2 =====\n\n");
  76.                                    for (k=1; k<cant_nota+1; k++){
  77.                                        printf("Nota %d: ", k);
  78.                                        fflush(stdin);
  79.                                        scanf("%d",&not_tra2[k]);
  80.                            }
  81.                                printf("\n===== Trayecto 3 =====\n\n");
  82.                                    for (k=1; k<cant_nota+1; k++){
  83.                                        printf("Nota %d: ", k);
  84.                                        fflush(stdin);
  85.                                        scanf("%d",&not_tra3[k]);
  86.                            }
  87.                        }
  88.                    }
  89.  
  90. printf("Esto se muestra sin error");
  91.  
  92. //Aca si aplico ciclos FOR con printf para mostrar los valores guardados en los arreglos, todos los datos mostrados son erroneos//
  93.  
  94.  
  95. return 0;
  96. }
  97.  


Al analizar pienso que guardar las notas de la forma ejemplo:

 scanf("%d", &not_tra1 [k]);  no está bien hecho, creo que deberia ser &not_tra1
  •  ... donde "X" sea la variable pero no se como organizarlo, de las maneras que las he hecho todas malas.

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!


En línea

joecarl

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« Respuesta #1 en: 30 Julio 2015, 11:26 am »

Esta parte del código está mal:

Código
  1. //Arrays para nombres de alumnos y materias ---Arrays de caracteres---//
  2.    char nom_alum[cant_alum][30];
  3.    char nom_mate[cant_mate][40];
  4. //Arrays para notas de trayectos ---not_tra1 = notas del trayecto1--- //
  5.  
  6.    int  not_tra1[4][cant_nota];    
  7.    int  not_tra2[4][cant_nota];
  8.    int  not_tra3[4][cant_nota];
  9.  
  10.    //Llamando a las variables globales//
  11.    cant_alum;
  12.    cant_mate;
  13.    cant_nota;
  14.  

No puedes definir el tamaño de un array con una variable, es decir:
Código
  1. char nom_alum[cant_alum][30];
  2. char nom_mate[cant_mate][40];
  3. int not_tra1[4][cant_nota];

Deberia ser:
Código
  1. char nom_alum[10][30];
  2. char nom_mate[10][40];
  3. int not_tra1[4][10];

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
  1.    int  not_tra1[4][cant_nota];    
  2.    int  not_tra2[4][cant_nota];
  3.    int  not_tra3[4][cant_nota];
  4.  

Deberías poner:
Código
  1.    int  not_tra[4][10];    
  2.  

Luego esta parte:
Código
  1. //Llamando a las variables globales//
  2.    cant_alum;
  3.    cant_mate;
  4.    cant_nota;
  5.  
No sirve para nada, no tiene efecto, esas lineas las puedes eliminar directamente.

Cuando entiendas eso respónde al post y seguimos.


« Última modificación: 30 Julio 2015, 11:33 am por joecarl » En línea

alejandrodiaz

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« Respuesta #2 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
  1. char nom_alum[10][30];
  2. char nom_mate[10][40];
  3. int  not_tra[4][10];
  4.  

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.
« Última modificación: 30 Julio 2015, 11:45 am por alejandrodiaz » En línea

joecarl

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« Respuesta #3 en: 30 Julio 2015, 12:45 pm »

Perfecto, seguimos:

Código
  1. fflush(stdin);
  2.  
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
  1. int  not_tra[3][10];
  2.  

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
  1.                        for(j=1; j<cant_mate+1; j++){
  2.                            printf("\n\nIngrese las notas parciales de %s\n", nom_mate[j]);
  3.  
  4.                                printf("\n===== Trayecto 1 =====\n\n");
  5.                                    for (k=1; k<cant_nota+1; k++){
  6.                                        printf("Nota %d: ", k);
  7.                                        fflush(stdin);
  8.                                        scanf("%d",&not_tra1[k]);
  9.                            }
  10.                                printf("\n===== Trayecto 2 =====\n\n");
  11.                                    for (k=1; k<cant_nota+1; k++){
  12.                                        printf("Nota %d: ", k);
  13.                                        fflush(stdin);
  14.                                        scanf("%d",&not_tra2[k]);
  15.                            }
  16.                                printf("\n===== Trayecto 3 =====\n\n");
  17.                                    for (k=1; k<cant_nota+1; k++){
  18.                                        printf("Nota %d: ", k);
  19.                                        fflush(stdin);
  20.                                        scanf("%d",&not_tra3[k]);
  21.                            }
  22.                        }
  23.                    }
  24.  

Lo puedes sustituir por:

Código
  1.    int tra;//variable contadora para el bucle de trayectos, la puedes declarar en otro sitio si quieres.
  2.    for(j=1; j<cant_mate+1; j++){
  3.        printf("\n\nIngrese las notas parciales de %s\n", nom_mate[j]);
  4.        for(tra=0; tra<3; tra++){
  5.             printf("\n===== Trayecto %d =====\n\n",tra+1);
  6.             for (k=0; k<cant_nota; k++){
  7.                  printf("Nota %d: ", k+1);            
  8.                  scanf("%d",&not_tra[tra][k]);
  9.             }              
  10.        }
  11.   }
  12.  

Fijate en como cambia la forma de recorrer el array:
Código
  1. for (k=1; k<cant_nota+1; k++) //mal
  2. for (k=0; k<cant_nota; k++) //bien
  3.  



« Última modificación: 30 Julio 2015, 12:48 pm por joecarl » En línea

alejandrodiaz

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« Respuesta #4 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
  1.        printf("Cuantos alumnos desea registrar?: ");
  2.        fflush(stdin);
  3.        scanf("%d", &cant_alum);      // <=== aca tengo el scanf//
  4.  
  5.            for (i=1; i<cant_alum+1; i++){
  6.                printf("Alumno nro %d: ",i);  //<===y aqui al compilar en vez de "Alumno nro 1, me saltaba a Alumno nro 2"//
  7.                fflush(stdin);
  8.                gets(nom_alum[i]);    //<=== este el gets//
  9.  


Ya empiezo a corregir el resto.

Con esto podré ya imprimir todos los datos agregados o todavia falta?
En línea

joecarl

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« Respuesta #5 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.
En línea

alejandrodiaz

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« Respuesta #6 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.
En línea

joecarl

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: Error al guardar muchos datos en arrays multidimensional (lenguaje C)
« Respuesta #7 en: 30 Julio 2015, 20:56 pm »

La forma adecuada de leer enteros por teclado sin dar pie a problemas es así:

Código
  1. int num;
  2. char buffer[100];//cadena de texto auxiliar para copiar el buffer de entrada
  3. //------
  4. fgets(buffer,100,stdin); //copiamos el buffer de entrada a la cadena auxiliar
  5. sscanf(buffer, "%d", &num); //leemos el entero de la cadena auxiliar
  6.  
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
  1. int leerEntero(){
  2.    int num;
  3.    char buffer[100];//cadena de texto auxiliar para copiar el buffer de entrada
  4.    fgets(buffer,100,stdin); //copiamos el buffer de entrada a la cadena auxiliar
  5.    sscanf(buffer, "%d", &num); //leemos el entero de la cadena auxiliar
  6.    return num;
  7. }
  8.  

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
  1. gets(nom_alum[i]);
  2.  

Usa:

Código
  1. fgets(nom_alum[i],30,stdin);
  2.  

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
  1. #define MAX_CHARS 30 //esto arriba del todo
  2. int main(...){
  3. //.....
  4. char nom_alum[10][MAX_CHARS];
  5. //.....otras declaraciones....
  6. //.....hacer tareas.....
  7.  
  8. fgets(nom_alum[i], MAX_CHARS,stdin);
  9. //.....
  10. }
  11.  
« Última modificación: 30 Julio 2015, 21:07 pm por joecarl » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado] Error al guardar datos binarios
Programación Visual Basic
Sancho.Mazorka 3 2,826 Último mensaje 26 Octubre 2010, 04:12 am
por Sancho.Mazorka
Access 2007 y visual basic 2008, error ar guardar lo datos
Dudas Generales
01munrra 2 4,906 Último mensaje 11 Febrero 2012, 20:49 pm
por 01munrra
Error al guardar datos en MySQL con PHP :(
PHP
JonaLamper 1 2,173 Último mensaje 5 Diciembre 2015, 21:51 pm
por sebasgb
Error al devolver array multidimensional
Java
viher 0 1,863 Último mensaje 25 Diciembre 2014, 00:30 am
por viher
Guardar muchos datos en una sola linea de un txt para su lectura
.NET (C#, VB.NET, ASP)
cael1011 2 2,087 Último mensaje 1 Octubre 2016, 00:51 am
por cael1011
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines