UFMG - ICEx - DCC

DCC003 --Algoritmos e Estruturas de Dados I -- AEDsI



Observe o programa baixo:

 

#include <stdio.h>

#include <stdlib.h>

 

int numLanc(){            //esta função simula lançamentos de

       int cntLanc=0;    //um dado de 6 faces e retorna quantas vezes ele foi

    do{cntLanc++;        //lançado ate aparecer uma das 6 faces fixadas

       }while(rand()%6!=0);

       return cntLanc;

}

int main(int argc, char *argv[]) {//este programa faz NumExp simulações

  srand(time(NULL));             //e escreve o numero médio de lançamentos

  int numeroLanc=0;       m     //de um dado de 6 faces até aparecer uma certa face

  double numeroMedioLanc=0;

  int NumExp=100;

  int cntLanc;

  int cntExp;

  for(cntExp=0; cntExp<NumExp; cntExp++){

      

       cntLanc=numLanc();

         numeroMedioLanc=numeroMedioLanc*cntExp/(cntExp+1)+(double)cntLanc/(cntExp+1);

  }

 

  printf("numero medio=%.1f\n", numeroMedioLanc);

       return 0;

}

 

O programa acima realiza um certo numero de simulações (NumExp). Cada simulação pode dar um número de um a infinito. O programa não trata o caso de um número infinito de lançamentos: a probabilidade de número infinito de lançamentos é praticamente zero.

(i)Modifique o programa para informar o percentual de vezes que o número de lançamentos foi exatamente igual ao número de faces.
(ii)Modifique o programa para interagir via teclado e console e perguntar o numero de faces do dado.

 

 

Observe o programa abaixo.

 

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

int main(int argc, char *argv[]){
#include <stdio.h>
#include <stdlib.h>
#define FALSO 0;
int main(int argc, char *argv[]){
    //este programa calcula o número médio de vezes
    //que um dado deve ser lançado até que saiam todas
    //as faces
    time_t timer;    //tipo aritmetico
    timer=time(NULL);//current time
    srand(timer);    //ajusta semente
    printf("Este programa simula o lancamento de um dado e\n"
           "calcula quantas vezes ele deve ser lancado ate\n"
           "que saiam todas as faces\n" );
    printf("Entre com o numero de vezes que o experimento deve\n"
           "ser executado:");
    int numExp;
    int cnt=scanf("%d", &numExp);
    if(cnt!=1|| numExp<0 ){
      printf("problema... fim de execução!\n");
      return 0;
    };
    int cntExp, cntLancamentos;
    int saiu1, saiu2, saiu3, saiu4, saiu5, saiu6;
    for(cntExp=0; cntExp<numExp; cntExp++){
      cntLancamentos=0;
      saiu1=saiu2=saiu3=saiu4=saiu5=saiu6=FALSO;
      do{
        cntLancamentos++;
        switch(rand()%6+1){
          case 1:saiu1=1; break;
          case 2:saiu2=1; break;
          case 3:saiu3=1; break;
          case 4:saiu4=1; break;
          case 5:saiu5=1; break;
          case 6:saiu6=1; break;
          default: printf("Computador com defeito!\n"); return 0;
        };
      }while(!saiu1||!saiu2||!saiu3||!saiu4||!saiu5||!saiu6);
      printf("fez %d lancamentos\n", cntLancamentos);
    };

  system("PAUSE");
  return 0;
}

O programa acima imprime para cada “experimento” quantas vezes um dado foi lançado até que todas as faces aparecessem.

 

(i) Utilize o programa acima como base para fazer um programa que calcula quantas vezes, em média, um dado de seis faces deve ser lançado até que saiam todas as faces.

(ii) modifique o programa acima para usar um arranjo no lugar das variáveis saiu1, saiu2, saiu3, saiu4, saiu5, saiu6;

(iii) modifique o programa acima para pedir ao usuário para fornecer o número de faces do dado.

[Este programa atende os itens (i), (ii) e (iii); não o leia antes de tentar fazer...]

(iv) Faça um programa que calcula quantas vezes em média devem ser lançados dois dados até que saiam todas as faces.

(v) Faça um programa que pede ao usuário o número de faces de cada dado e quantos dados devem ser lançados de cada vez.

 

 

Os dois programas acima são soluções do tipo “simulação”  para problemas resolvidos analiticamente na publicação:
A Collection of Dice Problems
disponível na Internet. Faça uma cópia da publicação e tente resolver no domínio de simulação os problemas que estão lá proposto e resolvidos analiticamente.

 

Alguns ensaios para discussão/inspiração.