amp Posted December 6, 2009 at 11:09 AM Report Share #298894 Posted December 6, 2009 at 11:09 AM Bom dia, Eu tenho de fazer um programa que crie uma rede quadrada (matriz quadrada) de tamanho indicado pelo utilizador, em que cada elemento da rede vai ser preenchido com 0 ou 1. A probabilidade de cada elemento ser preenchido com 1 é também indicada pelo utilizador. Já o numero de redes geradas é indicado na shell. A minha dúvida é a seguinte: se, por exemplo, no lado da rede digitar "9e5", na altura em que vou pedir a probabilidade, como o buffer do teclado não está limpo, o scanf("%lf",&prob); vai buscar o 'e' que eu tinha digitado atrás e não aceita a probabilidade porque o valor real de 'e' é 0.0000. Como é que eu posso evitar isto? Já tentei a função fflush(stdin) e a __fpurge(stdin), mas a primeira apenas dá no Windows e a segunda no Linux. Alguém conhece uma forma eficiente de contornar isto? Outra coisa. Para eu fazer uma pausa no programa (+-1s) entre a impressão das redes, como é que eu o poderia fazer? Eu já fiz de uma maneira (está comentado no programa), mas gostava de saber se há alguma forma mais simples (uma função já definida?,compilação condicional?) de o fazer. Façam críticas ao programa se puderem Obrigado, ampat # include <stdio.h> # include <stdlib.h> # include <math.h> # include <string.h> //# include <time.h> //Funcao - Gera, aleatoriamente, uma configuracao de rede void gera_config (double prob, long int L, unsigned char *nodo) { long int i,vol=L*L; for(i=0;i<vol;++i) nodo[i]=( ( (double)rand()/(double)RAND_MAX ) < prob ? 1 : 0 ); } //Funcao - Imprime a configuracao da rede void printf_config ( long int L,unsigned char *nodo) { long int i,vol=(L*L); for(i=0;i<vol;++i) { if( (i%L)==0) printf("\n "); printf("%d ",nodo[i] ); } } //Funcao - Inicializa a rede de percolacao a zeros void inic_nodo (long int L,unsigned char *nodo) { long int i,vol=L*L; for (i=0;i<vol;++i) nodo [i]=0; } //Funcao - Mostra as mensagens de erro e procede à saida do programa void erro(int n) { switch(n) { case (-1): printf("\n *** Numero de argumentos invalido ***\n\n"); printf(" A entrada na linha de comando deve ser na forma:\n"); printf("\n\t<nome_programa> <numero_repeticoes>\n\n"); break; case (-2): printf("\n *** Erro: Valor invalido para o num. de repeticoes ***\n"); printf("\tEste numero deve ser um inteiro nao negativo \n\n"); break; case (-3): printf("\n\n *** Erro: Inseriu um tamanho para o lado invalido ***\n"); printf("\tO tamanho tem de ser um inteiro maior que 0\n\n"); break; case (-4): printf("\n *** Erro: Valor invalido para a probabilidade ***\n"); printf(" Este valor tem de ser um real entre 0 e 1\n\n"); break; } exit(n); } //Main int main(int argc, char **argv) { unsigned char *nodos; int i=0,num=0,L,teste=0; double prob; //double t0,t1; //verifica o num. de argumentos if(argc!=2) erro(-1); //Verifica o argumento inserido (num. de visualizacoes) if(sscanf(argv[1],"%d",&num)==0 || num<0) erro(-2); //Titulo e legenda printf("\n\t*** PERCOLACAO NUMA REDE QUADRADA ***\n\n"); printf("Legenda da rede:\n\n"); printf(" 1 - A celula da rede encontra-se ocupada\n"); printf(" 0 - A celula da rede encontra-se vazia\n\n"); //Pede o tamanho do lado da rede printf("\nEscolha o tamanho do lado da rede?\n"); printf("Res:"); teste=scanf("%d ",&L); if(teste==0 || L<1) erro(-3); //Pede a probabilidade de ocupacao printf("\nE qual a probabildade de ocupacao de cada celula?\n"); printf("Res: "); teste=scanf(" %lf",&prob); if( teste==0 || fabs(prob-0.5)>0.5) erro(-4); nodos=(unsigned char *)malloc( (L*L)*sizeof(unsigned char) ); //printf("\nValores inseridos:\n\n"); //printf(" Num. de visualizacoes : %d\n",num); //printf(" Tamanho do lado da rede: %d\n",L); //printf(" Prob. de ocupacao : %lf\n",p); for(i=1;i<=num;++i) { //t0=time(NULL)+1; //while(t1<t0) //t1=time(NULL); printf("\n\n** Visualizcao numero %d **",i); //Inicializa a rede a zeros e mostra-a no ecran inic_nodo(L,nodos); printf("\n\n Rede inicializada a zeros\n"); printf_config(L,nodos); //Gera uma configuracao da rede e mostra-a no ecran gera_config(prob,L,nodos); printf("\n\n Configuracao da rede preenchida \n"); printf_config(L,nodos); printf("\n"); } printf("\n\n"); return 0; } Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 6, 2009 at 01:42 PM Report Share #298902 Posted December 6, 2009 at 01:42 PM A solução pode passar por deixares sempre o buffer limpo. Por exemplo, depois do primeiro scanf podes fazer while(getchar()!='\n');. Isto deve eliminar todos os caracteres até encontrar um '\n'. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
amp Posted December 6, 2009 at 03:04 PM Author Report Share #298910 Posted December 6, 2009 at 03:04 PM Mas isso não resolve o problema. O programa não detecta quando é que getchar()=='\n' e continua sempre a ler. E quanto à pausa no programa, existem soluções? 😉 Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 6, 2009 at 03:11 PM Report Share #298911 Posted December 6, 2009 at 03:11 PM Quando acabas de introduzir um valor não carregas no ENTER? Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
amp Posted December 6, 2009 at 03:42 PM Author Report Share #298916 Posted December 6, 2009 at 03:42 PM Sim, mas eu testei e não deu ?. Vou ver outra vez.😉 Edit:Afinal deu. Devo ter feito algo de errado na tentativa anterior;) Link to comment Share on other sites More sharing options...
amp Posted December 6, 2009 at 04:58 PM Author Report Share #298925 Posted December 6, 2009 at 04:58 PM Há algum contra em usar o código que eu tenho a comentado no while() para pausar o programa? Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 6, 2009 at 10:52 PM Report Share #298994 Posted December 6, 2009 at 10:52 PM Há algum contra em usar o código que eu tenho a comentado no while() para pausar o programa? Desperdício de ciclos. O sleep não serve? Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now