Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Nakkuu en 26 Noviembre 2016, 15:47 pm



Título: URGENTE - Ordenar fichero de reales de menor a mayor mirando la primera columna
Publicado por: Nakkuu en 26 Noviembre 2016, 15:47 pm
Hola a todos, disculpen ser tan directo, pero llevo semanas comiendome la cabeza.

Estoy trabajando con un proyecto en el que debo, en lenguaje .C NO en C++:

Disponemos de un archivo, "NOTAS.txt", con las notas de los alumnos (25 alumnos) de
todas las clases de un colegio (12 clases). En el archivo, en primer lugar se encuentra el
número de clases, a continuación, para cada clase, el identificativo de la clase (un
valor entero de 1 a 12), y las notas correspondientes a cada alumno (reales). Los datos de
las clases no están ordenados. Cada línea contiene los datos de una clase, con las
notas de cada alumno:

Me pide hacerlo sin usar procedimientos (funciones, acciones) más adelante si.
Esto es lo que necesito para empezar a hacer el programa, más adelante me pide calcular medias, desviación tipica, etc.

Este es el formato del .txt: y aquí el enlace al .txt --> http://ge.tt/6XjDLOh2 (http://ge.tt/6XjDLOh2)

12
(clase) (notas) (notas)......(notas)
1 nota1 nota2 nota3 ... nota25\n
4 nota1 nota2 nota3 ... nota25\n
2 nota1 nota2 nota3 ... nota25\n
... (hasta 12)

Leer el archivo y que me lo imprima bien por pantalla lo tengo hecho. Ahora solamente me faltaría ordenar (por filas) las clases, con sus notas respectivas,  las notas no hace falta ordenarlas, es decir, que me quede algo así:

12
(clase) (notas) (notas)......(notas)
1 nota1 nota2 nota3 ... nota25\n
2 nota1 nota2 nota3 ... nota25\n
3 nota1 nota2 nota3 ... nota25\n
... (hasta 12)

He probado utilizar el metodo de la burbuja pero no me lo ordena del todo. A continuación les muestro mi código hasta ahora:

Explico lo que he pensado. En primer lugar fijarme solamente en la primera columna de todas las filas, y comprobar si la posición 0,0 > a la posición [1][0] y así sucesivamente. En segundo lugar si la posición 0,0 es mayor a la [1][0] hacer que se intercambien usando una variable auxiliar de reales.

Les muestro el código hecho hasta ahora:

CÓDIGO:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define NOM_FITXER "notes.txt"
  5. #define CLASES 12
  6. #define ALUMNES 26
  7.  
  8. int main()
  9. {
  10.    FILE *f;
  11.    /* int classes[CLASES];*/
  12.    int i, j,k, total_classes=0;
  13.    float taula[CLASES][ALUMNES], aux=0;
  14.  
  15.    f=fopen(NOM_FITXER, "r");
  16.  
  17.    if (f!=NULL)
  18.    {
  19.        printf("El fitxer s'ha obert correctament.\n");
  20.        fscanf(f,"%d",&total_classes);
  21.        printf("%d\n",total_classes);
  22.        if (total_classes==EOF)
  23.        {
  24.            printf("Seq buida");
  25.        }
  26.        else
  27.        {
  28.            while (!feof(f))
  29.            {
  30.                for (i=0; i<12; i++)
  31.                {
  32.                    for (j=0; j<26; j++)
  33.                        fscanf(f,"%f ", &taula[i][j]);
  34.                }
  35.            }
  36.        }
  37.    }
  38.    for (i=0; i<CLASES; i++)
  39.    {
  40.        for (j=i+1; j<CLASES; j++)
  41.        {
  42.            for (k=0; k<ALUMNES; k++)
  43.            {
  44.                if (taula[i][0]>taula[j][0])
  45.                {
  46.                    aux = taula[i][k];
  47.                    taula[i][k]=taula[j][k];
  48.                    taula[j][k]=aux;
  49.                }
  50.            }
  51.  
  52.        }
  53.    }
  54.  
  55.  
  56.  
  57.    for (i=0; i<12; i++)
  58.    {
  59.        printf("%d ",(int)taula[i][0]);
  60.        for (j=1; j<26; j++)
  61.            printf("%.2f ",taula[i][j]);
  62.        printf("\n");
  63.    }
  64.    return 0;
  65. }
  66.  

Aclarar que debo intercambiar filas enteras mirando solamente la primera columna.

Ahora me ordena bien la primera columna, pero me sigue dejando  el resto de filas tal y como estan en el .txt, es decir, me intercambia solamente la primera columna, y quiero que intercambie la fila entera.

Pongo un ejemplo de mi .txt:

12
1 6.63 0.71 4.70 4.51 1.55 .....
3 2.34 7.60 1.17 3.03 3.83 .....
10 6.88 0.21 7.80 3.30 8.65 .....
2 9.27 2.01 4.76 0.18 0.69 .....
4 9.31 3.16 1.96 6.35 0.27 .....
12 1.09 3.51 2.03 2.85 1.33 .....
5 3.42 4.63 1.80 8.73 5.84 .....
8 5.15 1.50 9.06 2.29 5.15.....
9 4.73 0.77 2.06 4.73 4.78 .....
6 9.57 7.61 3.20 5.61 6.03 .....
7 3.62 5.56 8.85 6.03 3.50.....

Me devuelve esto:

12
1 6.63 0.71 4.70 4.51 1.55 .....
2 2.34 7.60 1.17 3.03 3.83 .....
3 6.88 0.21 7.80 3.30 8.65 .....
4 9.27 2.01 4.76 0.18 0.69 .....
5 9.31 3.16 1.96 6.35 0.27 .....
6 1.09 3.51 2.03 2.85 1.33 .....
7 3.42 4.63 1.80 8.73 5.84 .....
8 5.15 1.50 9.06 2.29 5.15.....
9 4.73 0.77 2.06 4.73 4.78 .....
10 9.57 7.61 3.20 5.61 6.03 .....
11 3.62 5.56 8.85 6.03 3.50.....
12 3.73 2.96 2.79 4.39 3.03....


Gracias por todos a los que intenten colaborar con esto.

He conseguido, tras multiples peleas con mi ordenador, solucionar mi ejercicio por completo. Una vez ordenado el fichero me calcula la mediana, la desviación tipica y lo escribo en un fichero resultados.txt donde en la segunda columna incluyo las desviaciones.

Si alguien está interesado en que cuelgue o le envie el código que tan solo responda en este post.

Tema concluido.