掷骰子
问题描述: 通过统计1、2、3···、6出现的频率,分析骰子是否是一个公平的(fair)骰子。
输入为连续的骰子值,应该打印每个值的频次表
思考的步骤
-
分解任务,将一整个任务分解为各个步骤
我们需要读入骰子值,但不一定需要存储,相反,我们可以为每个骰子值定义一个计数器
以记录每个骰子值出现的次数 -
确定所需的算法
初始化counter[6] = {0,0,0,0,0,0}
counter[(value-1)] ++;
增加transplantality
const int FACES
int counter[FACES+1]
for(int i = 1;i<=FACES;i++){
//输出频次表
cout<< i << counter[i]<< endl;
}
- 使用函数构造程序
我们将为每个步骤提供一个函数,这样就增加了程序的可读性
- generate_test_values
- count_values
- print_counters
要有写注释的好习惯,同时注释也要注重排版和格式,不同的注释对应不同的信息
对函数的注释、对变量的注释,应采用不同的注释风格
同时,注释要保持风格上的一致性
在C++中,如果要给一个函数传入一个数组,一般都是传入两个参数一个数组指针和一个数组大小。
单独传递一个数组或者指针进去,会导致数组不完整。
当然,上面的描述不是完全正确,比如我们想实现一个动态的顺序表,
函数generate_test_values 用测试值(仿真掷骰子的结果)填充数组,这个数组就是我们做实验后的outcomes
/**
生成一组用于测试的骰子值
@parameter values:待填充的数组
*/
void generate_test_values(int *values, int size);
函数count_values读取装有测试结果的数组,同时需要接受一个计数器数组,以便记录各个值出现的频次
/**
统计在一组骰子值中,各个骰子值出现的次数
@parameter values:骰子值数组
@parameter size:骰子值数组的大小
@parameter faces:骰子的面数
@parameter counters: 长度为faces+1的数组,counters[j]装的是j这个骰子值出现的次数
*/
void count_values(int values[], int size, int faces, int counters[]);
最后最简单的就是函数print_counters 打印计数器的值
/**
以表格形式 打印骰子值计数器
@parameter faces:骰子的面数
@parameter counters: 长度为faces+1的数组,counters[j]装的是j这个骰子值出现的次数
*/
void print_counters(int faces,int counters[]);
以下为完整程序
#include <iostream>
#include <cstdlib>
using namespace std;
//函数generate_test_values 用测试值(仿真掷骰子的结果)填充数组,这个数组就是我们做实验后的outcomes
/**
生成一组用于测试的骰子值
@parameter values:待填充的数组
*/
void generate_test_values(int *values, int size)
{
for (int i = 0;i<size;i++){
values[i] = (rand()%6+1);
}
}
//函数count_values读取装有测试结果的数组,同时需要接受一个计数器数组,以便记录各个值出现的频次
/**
统计在一组骰子值中,各个骰子值出现的次数
@parameter values:骰子值数组
@parameter size:骰子值数组的大小
@parameter faces:骰子的面数
@parameter counters: 长度为faces+1的数组,counters[j]装的是j这个骰子值出现的次数
*/
void count_values(int values[], int size, int faces, int counters[])
{
for(int i = 1;i<=faces;i++)
{
counters[i] = 0;
}
for (int j = 0;j<size;j++)
{
int Current_Value;
Current_Value = values[j];
counters[Current_Value] ++;
}
}
//最后最简单的就是函数print_counters 打印计数器的值
/**
以表格形式 打印骰子值计数器
@parameter faces:骰子的面数
@parameter counters: 长度为faces+1的数组,counters[j]装的是j这个骰子值出现的次数
*/
void print_counters(int faces,int counters[])
{
for(int i = 1;i<=faces;i++){
cout<<i<<": "<<counters[i]<<endl;
}
}
int main(){
int seed = 100;
srand(seed);
const int FACES = 6;
int counters[FACES+1];
const int NUMBERS_OF_TOSSES = 100;
int Outcomes[NUMBERS_OF_TOSSES];
// cout<<Outcomes;
generate_test_values(Outcomes, NUMBERS_OF_TOSSES);
count_values(Outcomes,NUMBERS_OF_TOSSES, FACES,counters);
print_counters(FACES,counters);
return 0;
}