Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Интересные и занимательные задачи по программированию > [VB/VBA] Получить "всегда True" |
Автор: Akina 19.3.2009, 23:54 | ||||
Постановка задачи: Необходимо дописать программу так, чтобы она при запуске ВСЕГДА давала сообщение "True". Программа должна состоять из двух модулей и запускаться процедурой Main(). Текст первого модуля дан, и его изменять нельзя. Необходимо написать текст второго модуля. В чём суть программы: В программе создаётся массив элементов логического типа случайного (от 100 до 1000) размера. Он заполняется случайным образом. Затем процедуре (которую следует написать) сообщается количество элементов (нижняя и верхняя границы) и количество элементов True в массиве. Процедура может инвертировать любые элементы массива, но не может узнать значения элементов массива либо иные не переданные ей явно значения. В результате своей работы она должна вернуть место, где следует поделить массив (некоторые или все элементы которого ею инвертированы) на две части. В получившихся частях должно быть равно либо количество значений True (справа и слева одинаковое), либо количество значений False. В этом случае программа выводит сообщение "True". Если равенства нет, или сообщённая точка деления массива на части находится за границами массива, программа выводит "False". Вот текст Module1.BAS
Вот заготовка текста второго модуля Module2.BAS
Задача ориентирована на решение в среде VB6, но может быть решена и на VBA в любом Офисном приложении. PS. Кратчайшее известное мне решение содержит 5 строк кода. |
Автор: maxdiver 21.3.2009, 20:04 |
1) зачем вообще VB? решение вообще от языка не зависит. для разнообразия что ле? ![]() 2) код местами довольно забавный: Not (Arr(i) Xor CheckValue) - а почему не просто = ? ![]() 3) здесь, я так понимаю, варианты решения публиковать не надо, т.к. это разрушит интригу для других решателей? |
Автор: Akina 21.3.2009, 22:43 |
1) В каком виде оно ко мне попало, в таком и выложил. Только дополнил несколько комментов. 2) См. п. 1. 3) Не знаю... кто-то же должен когда-нить запостить решение... PS. Решение в 5 строк кода я всё-таки нашёл... сам... не смотря в подсказку. |
Автор: maxdiver 27.3.2009, 18:02 |
Я не понял, заакцептил Akina моё решение или нет, но вроде есть в 4 строчки ![]() |
Автор: Akina 27.3.2009, 18:11 |
Да, частично. Потому что у тебя в ответе использована не определённая переменная. Её определение даст пятую строку. |
Автор: maxdiver 27.3.2009, 21:58 |
Akina Хм, а в VB обязательно объявлять переменные? В том Бейсике, который я изучал в дремучем детстве, переменные сами создавались при первом использовании ![]() |
Автор: Akina 27.3.2009, 22:53 |
См. строку 2 первого модуля. |
Автор: LOD77 2.5.2009, 14:10 |
Может быть я чего-то не понял, но это же классическая задача про фишки "реверси" на столе. В таком случае получается 4 строки: FOR i=Low TO Low+Count-1 Call Invert(i) NEXT i GetBound = Low+Count-1 Вроде бы все. Массив делим на 2 части от эл-та Low до Low+Count-1 включительно и оставшаяся часть от Low+Count до High Или я чего-то недопонял? |