2
I made a code to simulate the Monty Hall paradox, so that I can simulate 1000 times the results and write the statistics. However, I cannot divide an element of an int array by an int, every time I run the program, when it reaches the division, the program crashes and has to be closed:
void main(){
int PORTAS [] = {0, 0, 0};
int CAR, ESC, NUM, DECISAO, AUX;
float VIT, DER;
int ESTAT [] = {0, 0, 0}; // {Tentativas, vitórias, derrotas}
VIT = ( ESTAT[2] / NUM ) * 100; // Porcentagem de vitórias *ERRO*
DER = ( ESTAT[3] / NUM ) * 100; // Porcentagem de derrotas *ERRO*
}
I also tried to write how:
VIT = ESTAT[2]/ESTAT[1]*100;
DER = ESTAT[3]/ESTAT[1]*100;
But in this way, the result is always 0.
If necessary to help me, I will put the full code, which includes at the beginning a brief explanation of the game. If you don’t think it’s necessary, ignore the code below:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>
/*Paradoxo de Monty Hall
*Atrás de uma porta, de três no total, é escondido um carro
*e nas outras duas, uma cabra. No jogo, o jogador escolhe uma
*porta e então é revelada outra porta que contenha uma cabra.
*O jogador tem então a opção de escolher entre manter a escolha
*ou trocar de porta. Esse programa simula esse jogo, de modo que
*a porta seja mantida ou trocada em todas as tentativas, para
*motivos estatísticos.*/
void main(){
setlocale (LC_ALL, "");
int PORTAS [] = {0, 0, 0}; // 0 - a porta contém uma cabra; 1 - a porta contém o carro
int CAR, ESC, NUM, DECISAO, AUX;
float VIT, DER;
int ESTAT [] = {0, 0, 0}; // {Tentativas, vitórias, derrotas}
printf("1 para trocar todas, 0 para manter todas: ");
scanf ("%d", &DECISAO);
printf ("Digite o número de repetições: "); // Recomendável 10, 100 ou 1000.
scanf ("%d", &NUM);
do{
CAR = rand () %3; // Randomiza a porta que recebe o carro.
PORTAS [CAR] = 1;
ESC = rand () %3; // Randomiza a escolha da porta.
if ( DECISAO == 1 ){ // Se foi escolhido trocar todas as vezes.
if ( PORTAS [ESC] == 1 ){ // Porta escolhida contém o carro.
for ( AUX = 0; AUX < 3 ; AUX++ ){
if ( PORTAS [AUX] != 1 && AUX != ESC ){
ESC = AUX; //Mudança de porta
AUX = 3; // Para quebrar o 'For'
ESTAT [3] += 1;
}
}
}
if ( PORTAS [ESC] == 0){ //Porta escolhida contém uma cabra.
ESC = CAR; // Pois sendo a porta errada, e tendo a outra errada sido revelada, só sobrou a correta.
ESTAT [2] += 1;
}
}
if ( DECISAO == 0){ //Caso tenha sido escolhido manter todas as vezes.
if ( ESC = CAR ){
ESTAT [2] += 1;
}
else{
ESTAT [3] += 1;
}
}
NUM--;
ESTAT [1] += 1;
} while ( NUM > 0);
VIT = ( ESTAT[2] / NUM ) * 100; // Porcentagem de vitórias *ERRO*
DER = ( ESTAT[3] / NUM ) * 100; // Porcentagem de derrotas *ERRO*
( DECISAO == 1 ) ? printf ("\n\n\n\tTrocando de porta todas as vezes: \n\n") : printf ("\n\n\n\tMantendo a porta todas as vezes: \n\n");
printf ("Número de tentativas: %d\n", ESTAT [1]);
printf ("Número de vitórias: %d, %d%% do total.\n", ESTAT [2], VIT);
printf ("Número de derrotas: %d, %d%% do total.", ESTAT [3], DER);
getch();
}
And what’s the problem? It’s giving division error by 0?
– Maniero
I forgot to include the error, it was bad. In the first mode, the program simply crashes, and in the second, the result is always 0. I will include in the question.
– user36125
Initializes all elements of
PORTAS
with0
And then, inside the loop, you’re putting1
... but you never go back0
and so behind every door there’s always a car. Oh! and stop using more!– pmg
Thanks, I hadn’t noticed this. And isn’t it recommended to use uppercase? I started using because I thought it best to visually identify the variables.
– user36125
@Douglasmarques It is usually agreed that
minusculas
are for methods/variables,MAIUSCULAS
for constants andPrimeirasLetrasMaiusculas
for types (struct
,typedef
, or in the languages that support, classes). You can escape the convention, but it makes it difficult for other people to understand your code, so I don’t recommend.– mgibsonbr
@Douglasmarques Take a look at [tour]. You can accept an answer if it solved your problem. You can vote for every post on the site as well. Did any help you more? You need something to be improved?
– Maniero
Note that as you have declared integer variables the operations will be done with integer mathematics and only in the assignment the result will be converted to real. Use a cast to force floating point operation.
– anonimo