На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Обнаружил очень странную ситуацию. Пример в задаче Hopper проходит on-line проверку при заведомо неправильной программе. Из-за этого пропустил ошибку в программе. Случайно переставил строку ввода данных до выделения памяти под массив данных. А тестовый пример прошел без проблем. Как такое может быть?
Поза форумом
Якщо я правильно все розумію, ви використовували С++ і написали щось типу такого:
int n; int *array = new int[n]; cin >> n;
Якщо все так і було, то ви зіткнулися з таким явищем, як невизначена поведінка (undefined behavior, UB). В С++ UB може виникнути у багатьох ситуаціях, наприклад при читанні неініціалізованої змінної. У даному конкретному випадку - змінної n.
jurij написав:
А тестовый пример прошел без проблем. Как такое может быть?
Програма після виникнення UB, за визначенням, може робити що завгодно. Буквально. Може працювати так, як і задумав програміст, може впасти з помилкою, а може показати мультик, або відформатувати жорсткий диск. Останні два приклади - це невелике художнє перебільшення, насправді жоден компілятор такого робити не стане, але формально якби компілятор згенерував код демонстрації nyan cat при UB, це було б абсолютно коректно. При чому, часто один і той самий код з UB може по-різному працювати при компіляції різними компіляторами, різними версіями одного компілятора, при запуску на різних машинах і т.п. (і зараз я вже говорив не про якісь гіпотетичні компілятори з мультиками, які роблять всякі веселі штуки назло програмісту просто тому що можуть, а про цілком реальні, такі як gcc, clang, чи VS C++). Почитайте Вікіпедію за посиланням вище, і/або ось цю статтю - знайдете більш докладний опис, що таке UB, що роблять компілятори, коли на нього натикаються і чим загрожує використання конструкцій з UB в своїй програмі.
Тому те, що програма була "завідомо неправильна" - це правда. Але через природу своєї "неправильності" (UB), той факт, що така неправильна програма пройшла один тест в онлайн-перевірці - це абсолютно нормально і нічого неочікуваного тут немає. Зрештою, програма, яка просто виводить 5 теж є завідомо неправильною, але при цьому вона так само пройшла б тест з умови.
Відредаговано Dim_ov (2017-01-30 05:18:37)
Поза форумом
Dim_ov написав:
Якщо я правильно все розумію, ви використовували С++ і написали щось типу такого:
Код:
int n; int *array = new int[n]; cin >> n;Якщо все так і було, то ви зіткнулися з таким явищем, як невизначена поведінка (undefined behavior, UB). В С++ UB може виникнути у багатьох ситуаціях, наприклад при читанні неініціалізованої змінної. У даному конкретному випадку - змінної n.
Трохи інакше
int n,*array; cin >> n; for (i=0;i<n;i++) cin >> array[i]; array = new int[n];
бо я спочатку статично виділяв array[1000] , а потім перейшов на дінамічне виділення, але принципово зрозуміло. Дякую.
Поза форумом