Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ignacio8550 en 30 Junio 2012, 08:53 am



Título: Ayuda con programa en C [Funciona y aveces se cae]
Publicado por: ignacio8550 en 30 Junio 2012, 08:53 am
Hola amigos estoy buscado el error al siguiente código que estoy haciendo, me funciona aveces pero en ocasiones se me cae y no le puedo encontrar el error, el programa recibe un txt cuyo contenido es:


4

10 30 4 10
80 90 110 1
0 40 50 60
70 85 200 35



#include<math.h>
#include<stdio.h>

#define TRUE 1
#define FALSE 0

void print_solution(int n,int x[])
{
      char c[n][n];
      int i,j;
      for(i=1;i<=n;i++)
     {
         for(j=1; j<=n; j++)
        {
            c[j]='-';
        }
     }

    for(i=1;i<=n;i++)
   {
         c[x]='Q';
    }

    for( i=1;i<=n;i++)
   {
         for(j=1;j<=n;j++)
        {
              printf("%c",c[j]);
         }
         printf("\n");
    }
}


int place(int x[],int k)
{   
    int i;
    for(i=1;i<k;i++)
   {
         if(x==x[k]||i-x==k-x[k]||i+x==k+x[k])
         {
             return FALSE;
          }
   }
    return TRUE;
}



int main()
{
     FILE *entrada;
     entrada = fopen("Entrada.txt","r");
     if (entrada == NULL){  
     printf("\nError de apertura del archivo. \n\n");
     }else{   
     if(!feof(entrada))
    {
         int n,i,j;
         fscanf(entrada,"%d",&n);fflush(stdin);
         printf("%d",n);
         for(i = 1; i <= n; i++)
         {
             printf("\n");
             for(j = 1; j<=n; j++)
            {
                 fscanf(entrada,"%d",&g[j]);fflush(stdin);
                 printf("%d ",g[j]);
             }
          }
           int g[n][n];
          
          for(i = 1; i <= n; i++)
         {
               for(j = 1; j<=n; j++)
               {
                   fscanf(entrada,"%d",&g[j]);fflush(stdin);
                   printf("%d ",g[j]);
                }
          }

           int x[n];
           int count=0;
           int k=1;
           int suma = 0;
           x[k]=0;
           i = 1;


          while(k!=0)
          {
               if(k == 1){suma = 0;}
               x[k]=x[k]+1;
              
               while((x[k]<=n)&&(!place(x,k)))
              {
                  x[k]=x[k]+1;
               }
               if(x[k]<=n)
              {
                  suma = suma + g[x[k]];
                  if(k==n)
                  {
                       printf("\n\n\n\t%d",suma);
                       count++;
                       printf("\n\nSolution %d  is : \n\n",count);
                       print_solution(n,x);
                   }
                   else
                  {
                       k++;     
                       i++;
                       x[k]=0;
                   }
                }
                else
                {
                     k--;
                     i--;
                     if(x[k]<=n)
                     {
                         suma = suma - g[x[k]];
                      }
                  }
            }
        }
    }
fclose(entrada);
return 0;
}


Título: Re: Ayuda con programa en C [Funciona y aveces se cae]
Publicado por: do-while en 30 Junio 2012, 09:19 am
¡Buenas!
Código
  1. for(i = 1; i <= n; i++)
  2. {
  3.    printf("\n");
  4.    for(j = 1; j<=n; j++)
  5.    {
  6.        fscanf(entrada,"%d",&g[i][j]);fflush(stdin);
  7.        printf("%d ",g[i][j]);
  8.    }
  9. }
  10.  
  11. int g[n][n];
  12.  
  13. for(i = 1; i <= n; i++)
  14. {
  15.    printf("\n");
  16.    for(j = 1; j<=n; j++)
  17.    {
  18.        fscanf(entrada,"%d",&g[i][j]);fflush(stdin);
  19.        printf("%d ",g[i][j]);
  20.    }
  21. }
  22.  

Varias cosas. Primero, utiliza las etiquetas GeSHi para poner codigos, sino esto es ilegible.

Utilizas g antes de declararla, y te estas saliendo de rango con los subindices.

fflush (http://www.cplusplus.com/reference/clibrary/cstdio/fflush/) solo se debe utilizar sobre flujos de salida. si sabes que alguna funcion de lectura puede dejar datos en stdin, limpialo a mano:

Código
  1. int c;
  2.  
  3. //lectura
  4. while((c = getchar()) != '\n' && c != EOF); //para limpiar la entrada
  5.  

No he seguido leyendo porque, como ya te he dicho, es horroroso tener que leer ese codigo sin tabulaciones ni las correspondientes etiquetas de codigo. Repasa el resto de codigo.

¡Saludos!