Ayuda con programa en C [Funciona y aveces se cae]

Iniciado por ignacio8550, 30 Junio 2012, 08:53 AM

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

ignacio8550

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;
}

do-while

¡Buenas!

for(i = 1; i <= n; i++)
{
    printf("\n");
    for(j = 1; j<=n; j++)
    {
        fscanf(entrada,"%d",&g[i][j]);fflush(stdin);
        printf("%d ",g[i][j]);
    }
}

int g[n][n];

for(i = 1; i <= n; i++)
{
    printf("\n");
    for(j = 1; j<=n; j++)
    {
        fscanf(entrada,"%d",&g[i][j]);fflush(stdin);
        printf("%d ",g[i][j]);
    }
}


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 solo se debe utilizar sobre flujos de salida. si sabes que alguna funcion de lectura puede dejar datos en stdin, limpialo a mano:


int c;

//lectura
while((c = getchar()) != '\n' && c != EOF); //para limpiar la entrada


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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!