生日巧合计划C ++

时间:2019-02-27 05:35:46

标签: c++ loops

此问题的代码有什么问题?

假设人们进入一个空房间,直到一对人分享生日。编写程序BirthdayCoincidence来模拟一个实验。该程序的输出是直到一对具有相匹配的生日之前被添加的人数。

#include <iostream>
#include <cstdlib>
#include <ctime>
 using namespace std;

 int main(){
  srand(time(0));
  int year = 365;
  int people = 0;
  int daycnt = 0;

  bool found[year];

  while(daycnt<year){
    people++;
    int birthday = (int)(rand() % year+1);
    cout<<birthday<<endl;
    if (found[birthday] == true){
      daycnt++;
      cout<<people<<endl;
      break;}
    found[birthday] = true;
  }
}

1 个答案:

答案 0 :(得分:1)

您尚未初始化布尔数组found。访问未初始化的变量将导致未定义的行为。

您应该这样做:

bool found[year] = {false};

这会将数组的所有成员初始化为false

可变长度数组不是标准的一部分。尽管GCC支持它们作为扩展,但并非每个编译器都支持。因此,您应该将编译时常数作为数组的大小。

constexpr int year = 365;

未定义行为的另一个来源是以下检查:

if (found[birthday] == true)

由于birthday的范围从1365,因此found[365]将导致越界访问,因为有效的索引范围是从0到{{ 1}}。因此,您可以改用此检查:

364