数组与向量的例程

掷骰子

问题描述: 通过统计1、2、3···、6出现的频率,分析骰子是否是一个公平的(fair)骰子。
输入为连续的骰子值,应该打印每个值的频次表

思考的步骤

  1. 分解任务,将一整个任务分解为各个步骤
    我们需要读入骰子值,但不一定需要存储,相反,我们可以为每个骰子值定义一个计数器
    以记录每个骰子值出现的次数

  2. 确定所需的算法
    初始化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;
}

  1. 使用函数构造程序
    我们将为每个步骤提供一个函数,这样就增加了程序的可读性
  • 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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值