modificacion codigo ???

Iniciado por luis456, 13 Febrero 2014, 08:51 AM

0 Miembros y 1 Visitante están viendo este tema.

luis456

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

#include <stdio.h>
int main()
{
   int i,x1=0, x2=0,x3=0,x4=0,x5=0,x6=0;
   FILE* fichero,*fich;
   fichero = fopen("combiLuis.txt", "r");
   if (fichero == NULL)
       {
       printf("No existe el fichero!\n");
       return 1;
       }
  fich = fopen("CombiDiferanciasLuis.txt", "wt");
   if (fich == NULL)
       {
       printf("No existe el fichero!\n");
       return 1;
       }
  while (! feof(fichero))
           {
               fscanf(fichero,"%d %d %d %d %d %d ", &x1,&x2,&x3,&x4,&x5,&x6);
               fprintf(fich,"%d %d %d %d %d \n",x2- x1,x3-x2,x4-x3,x5-x4,x6-x5);
           }
   fclose(fichero);
   fclose(fich);
   return 0;
}


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




Que tu sabiduria no sea motivo de Humillacion para los demas

eferion

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:


int x[6] = { 0, 0, 0 ,0, 0, 0 };

// ...

fscanf(fichero,"%d %d %d %d %d %d ", &x[0], &x[1], &x[2], &x[3], &x[4], &x[5] );

int tope = 5;

while ( tope > 0 )
{
 int i = 0;
 for ( i=0; i<tope; i++ )
 {
   x[ i ] = x[ i + 1 ] - x[ i ];
   fprintf( fich, "%d ", x[ i ] );
 }
 fprintf( fich, "\n" ); // Salto de linea al finalizar cada secuencia.
  tope--;
}

leosansan

#2
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 (cpp) [Seleccionar]
17 21 23 32 39 40
13 16 21 22 25 34
19 20 25 27 39 49
15 24 33 37 45 46
13 21 22 30 32 49
11 17 21 24 25 26
10 14 18 20 27 43
13 14 25 36 43 49
10 12 20 21 28 32
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 (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
 int i=0,j=0,k=0,y[2][6];
 FILE* fichero,*fich;
 fichero = fopen("combiLuis0.txt", "r");
 if ((fichero = fopen("combiLuis0.txt", "r")) == NULL){
   perror("combiLuis0.txt");
   return EXIT_FAILURE;
 }
 fich = fopen("CombiDiferanciasLuis0.txt", "w");
 if ((fich = fopen("CombiDiferanciasLuis0.txt", "w")) == NULL){
   perror("CombiDiferanciasLuis0.txt");
   return EXIT_FAILURE;
 }
 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){
   i++;k++;
   if (i==1){
     printf("\n*");
     fprintf(fich,"\n*");
     for (j=0;j<6;j++){
       printf ("%3d",y[0][j]) ;
       fprintf (fich,"%3d",y[0][j]) ;
     }
     printf(" * [%d]\n  ",k);
     fprintf(fich," * [%d]\n  ",k);
     for (j=0;j<5;j++){
       printf ("%3i",y[0][j+1]-y[0][j]);
       fprintf (fich,"%3i",y[0][j]+1-y[0][j]);
     }
     printf("  ==>dif_horizontal\n");
     fprintf(fich,"\"  ==>dif_horizontal\n");
   }
   else {
     printf("\n*");
     fprintf(fich,"\n*");
     for (j=0;j<6;j++){
       printf ("%3d",y[1][j]);
       fprintf (fich,"%3d",y[1][j]);
     }
     printf("* [%d]\n  ",k);
     fprintf(fich,"* [%d]\n  ",k);
     for (j=0;j<5;j++){
       printf ("%3i",y[1][j+1]-y[1][j]) ;
       fprintf (fich,"%3i",y[1][j+1]-y[1][j]) ;
     }
     printf("  ==>dif_horizontal\n");
     fprintf(fich,"  ==>dif_horizontal\n");
     for (j=0;j<6;j++){
       printf ("%3i",y[1][j]-y[0][j]);
       fprintf (fich,"%3i",y[1][j]-y[0][j]);
     }
     printf("  ==>dif_vertical\n");
     fprintf(fich,"  ==>dif_vertical\n");
     for (j=0;j<6;j++){
       y[0][j]=y[1][j];
     }
     i=1;
   }
 }
 fclose(fichero);
 fclose(fich);
 return EXIT_SUCCESS;
}


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.



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



EDITO:Corregido. ;)

luis456

Cita de: 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.

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


Que tu sabiduria no sea motivo de Humillacion para los demas

leosansan


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 (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int i=0,j=0,k=0,y[2][6];
  FILE* fichero,*fich;
  fichero = fopen("combiLuis0.txt", "r");
  if ((fichero = fopen("combiLuis0.txt", "r")) == NULL){
    perror("combiLuis0.txt");
    return EXIT_FAILURE;
  }
  fich = fopen("CombiDiferanciasLuis01.txt", "w");
  if ((fich = fopen("CombiDiferanciasLuis01.txt", "w")) == NULL){
    perror("CombiDiferanciasLuis01.txt");
    return EXIT_FAILURE;
  }
  i = 0;
  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){

    i++;k++;
    if (i>1){
      printf("\n");
      fprintf(fich,"\n");
      for (j=0;j<6;j++){
        printf ("%3i",y[0][j]-y[1][j]);
        fprintf (fich,"%3i",y[0][j]-y[1][j]);
      }
      for (j=0;j<6;j++)
        y[0][j]=y[1][j];
      i=1;
    }
  }
  fclose(fichero);
  fclose(fich);
  return EXIT_SUCCESS;
}


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