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.