Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: luis456 en 13 Febrero 2014, 08:51 am



Título: modificacion codigo ???
Publicado por: luis456 en 13 Febrero 2014, 08:51 am
Hola
este código me calcula o compara números y dice la distancia entre estos pero lo hace de izquierda a derechas o sea en horizontal

ejemplo

1 2 3 5 8 y me calcula que entre el 1 y  2  hay 1 entre 2 y 3 hay 1 entre 3 y 5 hay 2 y entre 5 y 8 hay 3

resultado
1  2  3  5  8 <--- muestra
  1  1  3   3 <----resultado


Bien lo que ahora busco es hacerlo pero en vertical  con los números hacia abajo

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.    int i,x1=0, x2=0,x3=0,x4=0,x5=0,x6=0;
  5.    FILE* fichero,*fich;
  6.    fichero = fopen("combiLuis.txt", "r");
  7.    if (fichero == NULL)
  8.        {
  9.        printf("No existe el fichero!\n");
  10.        return 1;
  11.        }
  12.   fich = fopen("CombiDiferanciasLuis.txt", "wt");
  13.    if (fich == NULL)
  14.        {
  15.        printf("No existe el fichero!\n");
  16.        return 1;
  17.        }
  18.   while (! feof(fichero))
  19.            {
  20.                fscanf(fichero,"%d %d %d %d %d %d ", &x1,&x2,&x3,&x4,&x5,&x6);
  21.                fprintf(fich,"%d %d %d %d %d \n",x2- x1,x3-x2,x4-x3,x5-x4,x6-x5);
  22.            }
  23.    fclose(fichero);
  24.    fclose(fich);
  25.    return 0;
  26. }

Luis


se me olvido up
seria hacer lo mismo pero hacia abajo

1 2 3 4 5
2 5 4 7 8
4 2 1 8 9






Título: Re: modificacion codigo ???
Publicado por: eferion en 13 Febrero 2014, 09:56 am
Pasos a seguir:

guarda x2-x1 en x1
guarda x3-x2 en x2
guarda x4-x3 en x3
...

tienes que tener en cuenta que en cada iteración vas a perder el último número, en tu caso, no puedes comparar la diferencia del 8 con el siguiente porque, directamente, no existe... ahí no se si vas a usar un número por defecto o directamente, a diezmar la secuencia.

Si eliminas el último número en cada paso deberías pasar a usar un vector en vez de variables sueltas, así te puedes permitir el lujo de gestionar los accesos de forma dinámica:

Código
  1. int x[6] = { 0, 0, 0 ,0, 0, 0 };
  2.  
  3. // ...
  4.  
  5. fscanf(fichero,"%d %d %d %d %d %d ", &x[0], &x[1], &x[2], &x[3], &x[4], &x[5] );
  6.  
  7. int tope = 5;
  8.  
  9. while ( tope > 0 )
  10. {
  11.  int i = 0;
  12.  for ( i=0; i<tope; i++ )
  13.  {
  14.    x[ i ] = x[ i + 1 ] - x[ i ];
  15.    fprintf( fich, "%d ", x[ i ] );
  16.  }
  17.  fprintf( fich, "\n" ); // Salto de linea al finalizar cada secuencia.
  18.  tope--;
  19. }
  20.  


Título: Re: modificacion codigo ???
Publicado por: leosansan en 13 Febrero 2014, 20:57 pm
Es decir, amigo Luis, además de las diferencias, digamos en horizontal de una línea, quieres las diferencias de una línea con la siguiente. Esto si sale nos forramos y no olvides que voy a un porcentaje en los beneficios de tu Empresa. ;)

Por si no lo he tenido claro te pongo lo que creo que pides.

En un texto están las líneas de números:


Código
  1. 17 21 23 32 39 40
  2. 13 16 21 22 25 34
  3. 19 20 25 27 39 49
  4. 15 24 33 37 45 46
  5. 13 21 22 30 32 49
  6. 11 17 21 24 25 26
  7. 10 14 18 20 27 43
  8. 13 14 25 36 43 49
  9. 10 12 20 21 28 32
  10. 13 19 20 27 28 32

y lo que tú quieres es ...¡¡¡tachán, tachán!!!:

Citar
* 17 21 23 32 39 40 * [1]
    1  1  1  1  1"  ==>dif_horizontal

* 13 16 21 22 25 34* [2]
    3  5  1  3  9  ==>dif_horizontal
 -4 -5 -2-10-14 -6  ==>dif_vertical

* 19 20 25 27 39 49* [3]
    1  5  2 12 10  ==>dif_horizontal
  6  4  4  5 14 15  ==>dif_vertical

* 15 24 33 37 45 46* [4]
    9  9  4  8  1  ==>dif_horizontal
 -4  4  8 10  6 -3  ==>dif_vertical

* 13 21 22 30 32 49* [5]
    8  1  8  2 17  ==>dif_horizontal
 -2 -3-11 -7-13  3  ==>dif_vertical

* 11 17 21 24 25 26* [6]
    6  4  3  1  1  ==>dif_horizontal
 -2 -4 -1 -6 -7-23  ==>dif_vertical

* 10 14 18 20 27 43* [7]
    4  4  2  7 16  ==>dif_horizontal
 -1 -3 -3 -4  2 17  ==>dif_vertical

* 13 14 25 36 43 49* [8]
    1 11 11  7  6  ==>dif_horizontal
  3  0  7 16 16  6  ==>dif_vertical

* 10 12 20 21 28 32* [9]
    2  8  1  7  4  ==>dif_horizontal
 -3 -2 -5-15-15-17  ==>dif_vertical

* 13 19 20 27 28 32* [10]
    6  1  7  1  4  ==>dif_horizontal
  3  7  0  6  0  0  ==>dif_vertical

Está visto que el destino no deja que nos separemos. :rolleyes: :rolleyes: :rolleyes:

Te recuerdo que el tema de ficheros no es mi fuerte así que espero que algún erudito en el tema lo mejore.

Lo que si te he dejado en el código son tanto los printf, para ver el resultado en pantalla, como los fprintf, para grabar el fichero. Por cierto, fíjate que los he renombrado con un cero al final de los mismos, así no perdía los anteriores.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.  int i=0,j=0,k=0,y[2][6];
  7.  FILE* fichero,*fich;
  8.  fichero = fopen("combiLuis0.txt", "r");
  9.  if ((fichero = fopen("combiLuis0.txt", "r")) == NULL){
  10.    perror("combiLuis0.txt");
  11.    return EXIT_FAILURE;
  12.  }
  13.  fich = fopen("CombiDiferanciasLuis0.txt", "w");
  14.  if ((fich = fopen("CombiDiferanciasLuis0.txt", "w")) == NULL){
  15.    perror("CombiDiferanciasLuis0.txt");
  16.    return EXIT_FAILURE;
  17.  }
  18.  while (fscanf(fichero,"%d %d %d %d %d %d ", &y[i][0], &y[i][1], &y[i][2], &y[i][3], &y[i][4], &y[i][5] )==6){
  19.    i++;k++;
  20.    if (i==1){
  21.      printf("\n*");
  22.      fprintf(fich,"\n*");
  23.      for (j=0;j<6;j++){
  24.        printf ("%3d",y[0][j]) ;
  25.        fprintf (fich,"%3d",y[0][j]) ;
  26.      }
  27.      printf(" * [%d]\n  ",k);
  28.      fprintf(fich," * [%d]\n  ",k);
  29.      for (j=0;j<5;j++){
  30.        printf ("%3i",y[0][j+1]-y[0][j]);
  31.        fprintf (fich,"%3i",y[0][j]+1-y[0][j]);
  32.      }
  33.      printf("  ==>dif_horizontal\n");
  34.      fprintf(fich,"\"  ==>dif_horizontal\n");
  35.    }
  36.    else {
  37.      printf("\n*");
  38.      fprintf(fich,"\n*");
  39.      for (j=0;j<6;j++){
  40.        printf ("%3d",y[1][j]);
  41.        fprintf (fich,"%3d",y[1][j]);
  42.      }
  43.      printf("* [%d]\n  ",k);
  44.      fprintf(fich,"* [%d]\n  ",k);
  45.      for (j=0;j<5;j++){
  46.        printf ("%3i",y[1][j+1]-y[1][j]) ;
  47.        fprintf (fich,"%3i",y[1][j+1]-y[1][j]) ;
  48.      }
  49.      printf("  ==>dif_horizontal\n");
  50.      fprintf(fich,"  ==>dif_horizontal\n");
  51.      for (j=0;j<6;j++){
  52.        printf ("%3i",y[1][j]-y[0][j]);
  53.        fprintf (fich,"%3i",y[1][j]-y[0][j]);
  54.      }
  55.      printf("  ==>dif_vertical\n");
  56.      fprintf(fich,"  ==>dif_vertical\n");
  57.      for (j=0;j<6;j++){
  58.        y[0][j]=y[1][j];
  59.      }
  60.      i=1;
  61.    }
  62.  }
  63.  fclose(fichero);
  64.  fclose(fich);
  65.  return EXIT_SUCCESS;
  66. }

Espero que esto te de "vidilla" y sigas profundizando en el tema.

No obstante, te recuerdo que todos estos resultados parciales que vas obteniendo los tendrías que pasar por un programa estadístico que te de las medias, varianzas, desviaciones, intervalos de confianza, etc. Yo en particular te aconsejo el SPSS, es potente y relativamente claro ..... ¡¡¡pero no me lo pidas a mí!!!....., consulta con tus amigos matemáticos. ;)

Un fuerte abrazo de tu amigo León.


(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones/leonpersonaje_zpse49b56da.jpg)

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

EDITO:Corregido. ;)


Título: Re: modificacion codigo ???
Publicado por: luis456 en 14 Febrero 2014, 09:35 am
Es decir, amigo Luis, además de las diferencias, digamos en horizontal de una línea, quieres las diferencias de una línea con la siguiente. Esto si sale nos forramos y no olvides que voy a un porcentaje en los beneficios de tu Empresa. ;)

Por si no lo he tenido claro te pongo lo que creo que pides.

Si creo que te has metido en mi mente jejejej ni yo hubiera pensado en hacerlo de estas dos formas " FUNCIONA " mejor de lo que esperaba


Y si estamos y estaremos unidos jejejej y gracias por aparecer de nuevo ya sabes :)

Luis
gracias también a los que respondieron al tema




Título: Re: modificacion codigo ???
Publicado por: leosansan en 14 Febrero 2014, 21:25 pm

Y si sólo se quieren las diferencias entre líneas sucesivas, tipo:

Citar
  4  5  2 10 14  6
 -6 -4 -4 -5-14-15
  4 -4 -8-10 -6  3
  2  3 11  7 13 -3
  2  4  1  6  7 23
  1  3  3  4 -2-17
 -3  0 -7-16-16 -6
  3  2  5 15 15 17
 -3 -7  0 -6  0  0

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.  int i=0,j=0,k=0,y[2][6];
  7.  FILE* fichero,*fich;
  8.  fichero = fopen("combiLuis0.txt", "r");
  9.  if ((fichero = fopen("combiLuis0.txt", "r")) == NULL){
  10.    perror("combiLuis0.txt");
  11.    return EXIT_FAILURE;
  12.  }
  13.  fich = fopen("CombiDiferanciasLuis01.txt", "w");
  14.  if ((fich = fopen("CombiDiferanciasLuis01.txt", "w")) == NULL){
  15.    perror("CombiDiferanciasLuis01.txt");
  16.    return EXIT_FAILURE;
  17.  }
  18.  i = 0;
  19.  while (fscanf(fichero,"%d %d %d %d %d %d ", &y[i][0], &y[i][1], &y[i][2], &y[i][3], &y[i][4], &y[i][5] )==6){
  20.  
  21.    i++;k++;
  22.    if (i>1){
  23.      printf("\n");
  24.      fprintf(fich,"\n");
  25.      for (j=0;j<6;j++){
  26.        printf ("%3i",y[0][j]-y[1][j]);
  27.        fprintf (fich,"%3i",y[0][j]-y[1][j]);
  28.      }
  29.      for (j=0;j<6;j++)
  30.        y[0][j]=y[1][j];
  31.      i=1;
  32.    }
  33.  }
  34.  fclose(fichero);
  35.  fclose(fich);
  36.  return EXIT_SUCCESS;
  37. }
  38.  

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)