Ir ao conteúdo

Posts recomendados

Postado

Ola fiz um programa que simula uma percolação em redes quadradas em que ele faz varias simulações de uma vez,o problema esta em quando eu coloco para fazer uma simulação de rede quadrada maior que 13x13 e o programa da erro na execução,fiz alguns testes de por ex fazer 10000 redes 13x13 diferentes e não teve problema nenhuma agora quando eu só coloco uma rede 14x14 ja da o problema.Não sei organizar um codigo por isso ele vai ficar muito ruim para ler mas vou mardar mesmo assim

 

 

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

int main()
{
    int i,j,k,n,l,i2,j2,cnt,sitio,groupn,p,sitioperco,npercol;  // Definção de variaveis
    srand(time(NULL));      //Comando utilizado para ser realmente randomico
    k = 2;                          //Numero do grupo
    npercol = 0;
    sitioperco = 0;
    p = 500;                     //Probabilidade de ser verdadeiro
    sitio = 0;                   //Numero de sitios ocupado
    n = 15;                     // tamanho da matriz quadrada
    int matriz[n+1][n+1];         // Definição da matriz quadrada
    for (cnt=0;cnt<1;cnt++){
    for (i=0;i<n;i++)        //mudar as linhas
        for (j=0;j<n;j++)     //mudar as colunas
            {
            matriz[j] = rand() % 1001;  //Alimentando a matriz com os numeros aleatorios
                if(matriz[j] < p)        //Vendo se surgira uma passagem ou não
                {

                    matriz[j] = 1;   //Tem um sitio ocupado
                }
                else
                    matriz [j] = 0;   //Não tem sitio ocupado
            }
    matriz [0][0] = 0;

    for (j=0;j<n+1;j++){
        matriz [j][n+1] = 0;
    }
    for (j=0;j<n+1;j++){
        matriz [n+1][j] = 0;
    }
    for (i=1;i<n;i++){
        for (j=1;j<n;j++){
            if (matriz [j] == 1)
            {
                sitio = sitio +1;
            }
        }
    }
  //  printf("numero de sitios ocupados:%.2d\n",sitio);   // imprime o numero de sitios ocupados
    k = 1;
  /*  for (i=0;i<n+1;i++){
        for (j=0;j<n+1;j++)
            {
            printf ("(%d)",matriz[j]);
            }
        printf("\n");
    } */
    for (i=1;i<n+1;i++){
        for (j=1;j<n+1;j++){
            if (matriz [j] == 1)
            {
                matriz [j] = k;

            }

           /* if (matriz [0][j] == 1){
                matriz [0][j] = k+1;
            }*/
            else{
                k = k+1;
                matriz [j] = 0;
            }

        }
    }
 /* printf(" \n matriz \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf ("(%d)",matriz[j]);
    }
    printf ("\n");
  }
  printf ("nova matriz \n"); */
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        if (matriz [j] != 0 && matriz [i+1][j] != 0){  // ta certo;(troca os numeros para baixo)
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i+1][j]){
                        matriz [i2][j2] = matriz [j];
                        matriz [i+1][j] = matriz [j];
                    }
                }
            }
        }
    }
  }
  /* for (i=1;i<n;i++){
     for (j=1;j<n;j++)
        {
        printf ("(%d)",matriz[j]);
        }
    printf("\n");
    } */
  for (j=1;j<n;j++){   // troca os numeros para direita
    for(i=1;i<n;i++){
        if (matriz [j] != 0 && matriz [j+1] != 0){
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [j+1]){
                        matriz [i2][j2] = matriz [j];
                        matriz [j+1] = matriz [j];
                    }
                }
            }
        }
    }
  }
  /*printf ("\n pos primeira mudança \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf("(%d)",matriz[j]);
    }
    printf ("\n");
  } */
   for (i=1;i<n;i++){
      for(j=1;j<n;j++){
        if (matriz [j] != 0 && matriz [i+1][j] != 0){  // ta certo;(troca os numeros para baixo)
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i+1][j]){
                        matriz [i2][j2] = matriz [j];
                        matriz [i+1][j] = matriz [j];
                    }
                }
            }
        }
    }
  }
   for (j=1;j<n;j++){   // troca os numeros para direita
      for(i=1;i<n;i++){
        if (matriz [j] != 0 && matriz [j+1] != 0){
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [j+1]){
                        matriz [i2][j2] = matriz [j];
                        matriz [j+1] = matriz [j];
                    }
                }
            }
        }
    }
  }
/* printf ("\n pos primeira mudança \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf("(%d)",matriz[j]);
    }
    printf ("\n");
  } */
  groupn = 0;
  for (l=1;l<k;l++){
        for (i=1;i<n;i++){
            for (j=1;j<n;j++){
                if((matriz [1] == l) && (matriz [n-1][j] == l)){
                    groupn = l;
                                }

                if ((matriz [1] == l) && (matriz [j][n-1] == l)){
                    groupn = l;
                                      }
                                    }
                            }
        if (groupn == l){
            for (i2=1;i2<n;i2++){
                for (j2=1;j2<n;j2++){
                    if (matriz[i2][j2] == groupn){
                        sitioperco = sitioperco +1;
                                             }
                                }
                        }
        }}

// printf("\n %d",groupn);
if (groupn !=0 ){
        npercol = npercol +1;
}
    }
printf ("\n quantidade de percolações %d",npercol);
printf ("\n quantidade de sitios na percolação %d",sitioperco);
    return 0;
}

Postado

 

A brigado ta ai agora.

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

int main()
{
    int i,j,k,n,l,i2,j2,cnt,sitio,groupn,p,sitioperco,npercol;  // Definção de variaveis
    srand(time(NULL));      //Comando utilizado para ser realmente randomico
    k = 2;                          //Numero do grupo
    npercol = 0;
    sitioperco = 0;
    p = 500;                     //Probabilidade de ser verdadeiro
    sitio = 0;                   //Numero de sitios ocupado
    n = 15;                     // tamanho da matriz quadrada
    int matriz[n+1][n+1];         // Definição da matriz quadrada
    for (cnt=0;cnt<1;cnt++){
    for (i=0;i<n;i++)        //mudar as linhas
        for (j=0;j<n;j++)     //mudar as colunas
            {
            matriz[j] = rand() % 1001;  //Alimentando a matriz com os numeros aleatorios
                if(matriz[j] < p)        //Vendo se surgira uma passagem ou não
                {

                    matriz[j] = 1;   //Tem um sitio ocupado
                }
                else
                    matriz [j] = 0;   //Não tem sitio ocupado
            }
    matriz [0][0] = 0;

    for (j=0;j<n+1;j++){
        matriz [j][n+1] = 0;
    }
    for (j=0;j<n+1;j++){
        matriz [n+1][j] = 0;
    }
    for (i=1;i<n;i++){
        for (j=1;j<n;j++){
            if (matriz [j] == 1)
            {
                sitio = sitio +1;
            }
        }
    }
  //  printf("numero de sitios ocupados:%.2d\n",sitio);   // imprime o numero de sitios ocupados
    k = 1;
  /*  for (i=0;i<n+1;i++){
        for (j=0;j<n+1;j++)
            {
            printf ("(%d)",matriz[j]);
            }
        printf("\n");
    } */
    for (i=1;i<n+1;i++){
        for (j=1;j<n+1;j++){
            if (matriz [j] == 1)
            {
                matriz [j] = k;

            }

           /* if (matriz [0][j] == 1){
                matriz [0][j] = k+1;
            }*/
            else{
                k = k+1;
                matriz [j] = 0;
            }

        }
    }
 /* printf(" \n matriz \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf ("(%d)",matriz[j]);
    }
    printf ("\n");
  }
  printf ("nova matriz \n"); */
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        if (matriz [j] != 0 && matriz [i+1][j] != 0){  // ta certo;(troca os numeros para baixo)
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i+1][j]){
                        matriz [i2][j2] = matriz [j];
                        matriz [i+1][j] = matriz [j];
                    }
                }
            }
        }
    }
  }
  /* for (i=1;i<n;i++){
     for (j=1;j<n;j++)
        {
        printf ("(%d)",matriz[j]);
        }
    printf("\n");
    } */
  for (j=1;j<n;j++){   // troca os numeros para direita
    for(i=1;i<n;i++){
        if (matriz [j] != 0 && matriz [j+1] != 0){
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [j+1]){
                        matriz [i2][j2] = matriz [j];
                        matriz [j+1] = matriz [j];
                    }
                }
            }
        }
    }
  }
  /*printf ("\n pos primeira mudança \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf("(%d)",matriz[j]);
    }
    printf ("\n");
  } */
   for (i=1;i<n;i++){
      for(j=1;j<n;j++){
        if (matriz [j] != 0 && matriz [i+1][j] != 0){  // ta certo;(troca os numeros para baixo)
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i+1][j]){
                        matriz [i2][j2] = matriz [j];
                        matriz [i+1][j] = matriz [j];
                    }
                }
            }
        }
    }
  }
   for (j=1;j<n;j++){   // troca os numeros para direita
      for(i=1;i<n;i++){
        if (matriz [j] != 0 && matriz [j+1] != 0){
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [j+1]){
                        matriz [i2][j2] = matriz [j];
                        matriz [j+1] = matriz [j];
                    }
                }
            }
        }
    }
  }
/* printf ("\n pos primeira mudança \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf("(%d)",matriz[j]);
    }
    printf ("\n");
  } */
  groupn = 0;
  for (l=1;l<k;l++){
        for (i=1;i<n;i++){
            for (j=1;j<n;j++){
                if((matriz [1] == l) && (matriz [n-1][j] == l)){
                    groupn = l;
                                }

                if ((matriz [1] == l) && (matriz [j][n-1] == l)){
                    groupn = l;
                                      }
                                    }
                            }
        if (groupn == l){
            for (i2=1;i2<n;i2++){
                for (j2=1;j2<n;j2++){
                    if (matriz[i2][j2] == groupn){
                        sitioperco = sitioperco +1;
                                             }
                                }
                        }
        }}

// printf("\n %d",groupn);
if (groupn !=0 ){
        npercol = npercol +1;
}
    }
printf ("\n quantidade de percolações %d",npercol);
printf ("\n quantidade de sitios na percolação %d",sitioperco);
    return 0;
} 

 

Postado

 

Pronto ai esta o programa ,uma rede quadrada é como se fosse uma matriz de tamanho NxN e quando fazemos a percolação queremos que um sitio dessa matriz seja ocupada com um certa probabilidade que no programa é representada por p, ai se tiver um caminho que va de uma extremidade a outra da rede dizemos q percolou quando a sitios ocupados de forma q você possa ver eles formando um grupo q va de um lado até o outro.

Segue em anexo um material bem completo sobre percolação

 

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



int main()
{
    int i,j,k,n,l,i2,j2,sitio,groupn,p,sitioperco,npercol;  // Definção de variaveis
    srand(time(NULL));      //Comando utilizado para ser realmente randomico
    k = 2;                          //Numero do grupo
    npercol = 0;
    sitioperco = 0;
    p = 600;                     //Probabilidade de ser verdadeiro
    sitio = 0;                   //Numero de sitios ocupado
    n = 6;                     // tamanho da matriz quadrada
    int matriz[n+1][n+1];         // Definição da matriz quadrada
    for (i=0;i<n;i++)        //mudar as linhas
        for (j=0;j<n;j++)     //mudar as colunas
            {
            matriz[i][j] = rand() % 1001;  //Alimentando a matriz com os numeros aleatorios
                if(matriz[i][j] < p)        //Vendo se surgira uma passagem ou não
                {

                    matriz[i][j] = 1;   //Tem um sitio ocupado
                }
                else
                    matriz [i][j] = 0;   //Não tem sitio ocupado
            }
    matriz [0][0] = 0;

    for (j=0;j<n+1;j++){
        matriz [j][n+1] = 0;
    }
    for (j=0;j<n+1;j++){
        matriz [n+1][j] = 0;
    }
    for (i=1;i<n;i++){
        for (j=1;j<n;j++){
            if (matriz [i][j] == 1)
            {
                sitio = sitio +1;
            }
        }
    }
    printf("numero de sitios ocupados:%.2d\n",sitio);   // imprime o numero de sitios ocupados
    k = 1;
  /*  for (i=0;i<n+1;i++){
        for (j=0;j<n+1;j++)
            {
            printf ("(%d)",matriz[i][j]);
            }
        printf("\n");
    } */
    for (i=1;i<n+1;i++){
        for (j=1;j<n+1;j++){
            if (matriz [i][j] == 1)
            {
                matriz [i][j] = k;

            }

           /* if (matriz [0][j] == 1){
                matriz [0][j] = k+1;
            }*/
            else{
                k = k+1;
                matriz [i][j] = 0;
            }

        }
    }
 /* printf(" \n matriz \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf ("(%d)",matriz[i][j]);
    }
    printf ("\n");
  }
  printf ("nova matriz \n"); */
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        if (matriz [i][j] != 0 && matriz [i+1][j] != 0){  // ta certo;(troca os numeros para baixo)
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i+1][j]){
                        matriz [i2][j2] = matriz [i][j];
                        matriz [i+1][j] = matriz [i][j];
                    }
                }
            }
        }
    }
  }
  /* for (i=1;i<n;i++){
     for (j=1;j<n;j++)
        {
        printf ("(%d)",matriz[i][j]);
        }
    printf("\n");
    } */
  for (j=1;j<n;j++){   // troca os numeros para direita
    for(i=1;i<n;i++){
        if (matriz [i][j] != 0 && matriz [i][j+1] != 0){
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i][j+1]){
                        matriz [i2][j2] = matriz [i][j];
                        matriz [i][j+1] = matriz [i][j];
                    }
                }
            }
        }
    }
  }
  /*printf ("\n pos primeira mudança \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf("(%d)",matriz[i][j]);
    }
    printf ("\n");
  } */
   for (i=1;i<n;i++){
      for(j=1;j<n;j++){
        if (matriz [i][j] != 0 && matriz [i+1][j] != 0){  // ta certo;(troca os numeros para baixo)
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i+1][j]){
                        matriz [i2][j2] = matriz [i][j];
                        matriz [i+1][j] = matriz [i][j];
                    }
                }
            }
        }
    }
  }
   for (j=1;j<n;j++){   // troca os numeros para direita
      for(i=1;i<n;i++){
        if (matriz [i][j] != 0 && matriz [i][j+1] != 0){
            for(i2=0;i2<n;i2++){
                for(j2=0;j2<n;j2++){
                    if(matriz [i2][j2] == matriz [i][j+1]){
                        matriz [i2][j2] = matriz [i][j];
                        matriz [i][j+1] = matriz [i][j];
                    }
                }
            }
        }
    }
  }
  printf ("\n pos primeira mudança \n");
  for (i=1;i<n;i++){
    for(j=1;j<n;j++){
        printf("(%d)",matriz[i][j]);
    }
    printf ("\n");
  }
  groupn = 0;
  for (l=1;l<k;l++){
        for (i=1;i<n;i++){
            for (j=1;j<n;j++){
                if((matriz [1][i] == l) && (matriz [n-1][j] == l)){
                    groupn = l;
                                }

                if ((matriz [i][1] == l) && (matriz [j][n-1] == l)){
                    groupn = l;
                                      }
                                    }
                            }
        if (groupn == l){
            for (i2=1;i2<n;i2++){
                for (j2=1;j2<n;j2++){
                    if (matriz[i2][j2] == groupn){
                        sitioperco = sitioperco +1;
                                             }
                                }
                        }
        }}

printf("\n %d",groupn);
if (groupn !=0 ){
        npercol = npercol +1;
}
printf ("\n %d",npercol);
printf ("\n %d",sitioperco);
    return 0;
}

 

 

percolation_Christesen-1.pdf

Postado

Mas ve se defini a matriz como sendo n+1 e o n = 6 ela seria na verdade uma matriz 8x8 não? ja que ela teria as linhas e colunas 0,1,2,3,4,5,6,7;O meu programa esta funcionando normalmente quando o n =6 o problema dele é q ele da crash segue uma simulação do programa no ideone em que ele funciona normal com n = 6 n = 7 mas n > 7 ele da crash;

Ps: Eu tive que definir esse n +1 por que tava dando um bug na hora das variaveis aleatorias mas depois disso o programa ficou certo,no code blocks ele vai até o n = 13 e n > 14 da crash

n = 6  http://ideone.com/HqPRhh

n = 7  http://ideone.com/gZ2bQ4

n = 8  http://ideone.com/alBIQC

e a unica coisa q tem de diferente entre os programas são os comentarios.

 

Postado

Quando você define um vetor ou uma matriz o número colocado entre os colchetes indica o comprimento ou número de itens em dada dimensão na matriz.

 

Ex:

int vetor[10];  //Define uma vetor de 10 posições.

 

Entretanto quando você acessa as respectivas posições de um vetor a contagem começa em 0, logo no caso acima as 10 posições seriam.

1ª  - vetor[0]
2ª  - vetor[1]
3ª  - vetor[2]
4ª  - vetor[3]
5ª  - vetor[4]
6ª  - vetor[5]
7ª  - vetor[6]
8ª  - vetor[7]
9ª  - vetor[8]
10ª - vetor[9]

 

Logo, as posições de vetor de comprimento n serão acessadas por índices indo de 0 até n-1. E logicamente o mesmo é válido para cada dimensão das matrizes.

 

Logo, se n=6 e a matriz foi declarada como matriz[n+1][n+1] você terá uma matriz de dimensão 7x7, com índices indo de 0 até 6 para acessar essas posições da matriz. Se no entanto seu programa tentar acessar a posição matriz[7][7] estará tentando acessar uma posição que não existe resultando em um "crash" ou resultados inesperados.

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!