Программа совпадения дня рождения c++

Что не так с моим кодом для этого вопроса?

Предположим, что люди входят в пустую комнату до тех пор, пока у пары людей не совпадет день рождения. Напишите программу 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;
  }
}

Читать Как отлаживать небольшие программы. Скомпилируйте свой код со всеми предупреждениями и отладочной информацией, поэтому g++ -Wall -Wextra -g при использовании ССАГПЗ

Basile Starynkevitch 27.02.2019 08:17

Другой парадокс заключается в том, что в году не 365 дней. У четырех миллионов человек день рождения 29 февраля.

Hans Passant 27.02.2019 08:48

Вы генерируете числа от 1 до 365 (включительно), а 365 является недопустимым индексом для вашего массива. Потерять + 1.

molbdnilo 27.02.2019 09:19
bool found[year]; является недопустимым C++, так как const отсутствует для year.
Jarod42 27.02.2019 10:29

@HansPassant Это было бы сложно принять во внимание. Может быть, отбросить 366 три раза вместо четырех.

Bob__ 27.02.2019 12:02

@ Ганс, ты имеешь в виду двадцать миллионов человек? (*4000000 365,25) дает всего 1,4 миллиарда.

Toby Speight 27.02.2019 19:10

Добро пожаловать в Stack Overflow! Пожалуйста, редактировать свой вопрос, чтобы показать нам, какую отладку вы выполнили. Я ожидаю, что вы запустили свой минимальный воспроизводимый пример в Valgrind или аналогичном средстве проверки и исследовали его с помощью отладчика, такого как, например, GDB. Убедитесь, что вы также включили полный набор предупреждений компилятора. Что инструменты сказали вам, и какую информацию они упускают? И прочтите Как отлаживать небольшие программы Эрика Липперта.

Toby Speight 27.02.2019 19:11

@Bob__, это достаточно просто: сгенерируйте случайное число в [0,1460], а затем разделите на 4. Результат 365 будет равен ¼ от других значений (при условии, что вы используете std::uniform_distribution для генерации чисел).

Toby Speight 27.02.2019 19:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
369
1

Ответы 1

Вы не инициализировали логический массив found. Доступ к неинициализированным переменным приведет к неопределенному поведению.

Вы должны сделать это:

bool found[year] = {false};

Это инициализирует все элементы массива как false.

массивы переменной длины не являются частью стандарта. Хотя GCC поддерживает их как расширение, не каждый компилятор поддерживает их. Таким образом, вы должны иметь константу времени компиляции в качестве размера массива.

constexpr int year = 365;

Еще одним источником неопределенного поведения является следующая проверка:

if (found[birthday] == true)

Поскольку birthday находится в диапазоне от 1 до 365, found[365] вызовет доступ за пределами допустимого диапазона, поскольку допустимый диапазон индекса — от 0 до 364. Таким образом, вы можете использовать эту проверку вместо:

if (found[birthday-1] == true)

Технически вам нужно только bool found[year] = {}; для инициализации всех элементов по умолчанию. Предоставление значения false влияет только на первый элемент. Если бы вы написали bool found[year] = {true};, то found[0] == true, а остальное было бы false.

Tas 27.02.2019 07:01

да. Я не хотел объяснять новичку инициализацию значений, инициализацию по умолчанию и т.д.

P.W 27.02.2019 07:02

Я сделал это, но теперь в моем выводе есть ошибка. он говорит, что "объект переменного размера не может быть инициализирован" в течение года

Francie Akins 27.02.2019 08:02

@FrancieAkins: у меня это работает. См. эту ссылку: godbolt.org/z/bY7_Mw

P.W 27.02.2019 08:04

@PW Эта конструкция bool found[year]; называется массив переменной длины или VLA. VLA являются нет допустимыми C++, поскольку в C++ размер массива должен быть постоянным. Некоторые компиляторы разрешают их в качестве расширения, но многие компиляторы не разрешают их вообще. Поэтому я боюсь, что сложно спросить о них на форуме C++, поскольку они не являются законными C++.

john 27.02.2019 08:11

@PW Способ написания этого кода на С++ - использовать вектор. #include <vector> затем объявите вектор как std::vector<bool> found(year, false); никаких других изменений, необходимых для вашего кода.

john 27.02.2019 08:12

@john: я согласен. Не знаю, какие ограничения есть у ОП. Так что вектор я не предлагал.

P.W 27.02.2019 08:13

@FrancieAkins: Похоже, ваш компилятор не поддерживает VLA. Итак, вы можете: constexpr int year = 365; Обновить ответ.

P.W 27.02.2019 08:15

Другие вопросы по теме