Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Insertionsort compila pero no funca

Estas en el tema de Insertionsort compila pero no funca en el foro de C/C++ en Foros del Web. Explico: Leo el tamaño del arreglo desde un archivo con numeros aleatorios ejem.txt 4 2 1 4 2 el tam del arr es 4 y ...
  #1 (permalink)  
Antiguo 04/05/2010, 00:01
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 0
Insertionsort compila pero no funca

Explico: Leo el tamaño del arreglo desde un archivo con numeros aleatorios
ejem.txt
4
2
1
4
2
el tam del arr es 4 y genera 4 nº aleatorios leo el archivo y creo uno nuevo e aqui el cod.


Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<string.h>
  5.  
  6. void insertion_sort(int x[],int length)
  7. {
  8.   int key,i, j;
  9.   for(j=1 ;j<length; j++)
  10.   {
  11.      key=x[j];
  12.      i=j-1;
  13.      while(x[i]>key && i>=0)
  14.      {
  15.          x[i]=x[i+1];
  16.          i--;
  17.      }
  18.          x[i+1]=key;
  19.   }
  20. }
  21.  
  22. int main()
  23. {
  24.  
  25.   float total,inicio, final;
  26.   inicio=clock();
  27.   FILE *ARCH, *ARCHI;
  28.  
  29.     int N, aux, i;
  30.     ARCH = fopen("aleatorio.txt","r");
  31.  
  32.     fscanf(ARCH,"%i", &N);
  33.     int d[N];
  34.  
  35.     ARCHI = fopen("insertionsort.txt","w");
  36.     i=0;
  37.     for(i=0;i<N;i++)
  38.       {
  39.       fscanf(ARCHI,"%i", &d[i]);
  40.       }
  41.    insertion_sort(d,N);
  42.  
  43.   for(i=0;i<N;i++)
  44.   {
  45.  
  46.    fprintf(ARCHI,"%i \n",d[i]);
  47.   }
  48.  
  49.  
  50.   final=clock();
  51.   total=(final-inicio)/(double) CLOCKS_PER_SEC;
  52.   printf("%f\n",total);
  53.  
  54.   fclose(ARCH);  
  55.   fclose(ARCHI);
  56. return 0;
  57. }


mi archivo de salida arroja esto:

-1217354048
-1217354048
-1217354048
-1217354048

que puede fallar? saludos
  #2 (permalink)  
Antiguo 04/05/2010, 00:46
Avatar de gvite666  
Fecha de Ingreso: abril-2010
Mensajes: 65
Antigüedad: 14 años
Puntos: 4
Respuesta: Insertionsort compila pero no funca

pues mira en este pedazo de codigo esta tue "error"

for(i=0;i<N;i++)

{

fscanf(ARCHI,"%i", &d[i]);

}
¿por que? porque estas creando el archivo "insertionsort.txt" ¿y que pasa? q el archivo esta vacio, entonces al momento de intentar leer una dato fscanf te retorna un -1 que indica que no se pudo realizar la lectura y deja el valor que tenga d[i] en este caso como no las has utilizado te deja a lo que se le llama basura que te da por default "-1217354048 ".

otra cosa importante, tu compilador no deberia dejarte correr la instruccion "int d[N];" ya que esto es una, por llamarlo asi, "falta de programacion" ya que no es estandar y podria fallar tu aplicacion al momento de querer correr tus programas en otro equipo, por decir, los buenos programas y compiladores se les debe decir el tamaño del arreglo al definirlo.
Espero te sirva.
Saludos
  #3 (permalink)  
Antiguo 04/05/2010, 10:47
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 0
Respuesta: Insertionsort compila pero no funca

me parece que no es eso ya que en esa parte lee el N total del archivo que es el primer numero que aparece en el archivo y lo guarda. por ejemplo el archivo generador antes de crearlo
me pide N yo ingreso 5 y luego guarda en un aleatorio.txt lo siguiente

5 //este es el total que toma en fscanf
3 //de este numero hacia abajo son los 5 aleatorios que debe recorrer
4
2
5
1

=/
  #4 (permalink)  
Antiguo 04/05/2010, 15:50
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Insertionsort compila pero no funca

Fiajte que lees de un archivo que esta abierto para escribir.... Proba imprimiendo lo que lees y te vas a dar cuenta.
  #5 (permalink)  
Antiguo 05/05/2010, 00:47
Avatar de gvite666  
Fecha de Ingreso: abril-2010
Mensajes: 65
Antigüedad: 14 años
Puntos: 4
Respuesta: Insertionsort compila pero no funca

por eso, mira te lo explico con mas detalle
int main(){
float total,inicio, final;
inicio=clock();
FILE *ARCH, *ARCHI;
int N, aux, i;
ARCH = fopen("aleatorio.txt","r"); //abres el archivo "aleatorio.txt", que supongo ya existe y que tiene tu "N".
fscanf(ARCH,"%i", &N); int d[N]; //lees tu "N" hasta aqui na hay porque tener problema
ARCHI = fopen("insertionsort.txt","w"); //Creas un nuevo archivo "insertionsort.txt" el cual esta vacio, aqui puedes poner "w+" esto te permite leer y escribir
i=0;
for(i=0;i<N;i++)
{
fscanf(ARCHI,"%i", &d[i]); //aqui es donde esta el error ya que tu archivo esta vacio y al momento de intentar leer algo, pues no se puede. y te deja la variable con el valor por default
}
insertion_sort(d,N); //todo lo demas, ya no tiene que ver con este problema.
for(i=0;i<N;i++)
{
fprintf(ARCHI,"%i \n",d[i]);
}
final=clock();
total=(final-inicio)/(double) CLOCKS_PER_SEC;
printf("%f\n",total);
fclose(ARCH);
fclose(ARCHI);
return 0;
}
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:42.