Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Lab_16_17.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
14.46 Mб
Скачать

Листинг файла mAgency.Cpp (с главной функцией)

Это приложение запрашивает у пользователя имя файла с данными по клиентам, читает записанные в нем данные в массив структур, выводит считанные данные на экран и далее отыскивает в таблице самого бедного жениха, т.е. особь мужского рода, и самую богатую невесту – женщину. Вам остается только самая малость: добавить в текст программы решение своей задачи.

Листинг файла Lib.H

Листинг файла Lib.Cpp

4.Задача «куча камней»

Любая найденная в программе ошибка – не последняя

Закон Мерфи

Цель работы – попробовать реализовать свой алгоритм решения известной «задачи о камнях» как пример оптимизационной задачи (4 час.).

4.1.Постановка задачи.

Из Википедии: Полный перебор (или метод «грубой силы», англ. brute force) относится к классу методов поиска решения исчерпыванием всевозможных вариантов. Сложность полного перебора зависит от количества всех возможных решений задачи. Если пространство решений очень велико, то полный перебор может не дать результатов в течение нескольких лет или даже столетий. (Другими словами, если вы хотите получать зарплату еще при жизни, то, возможно, вам следует поискать более «быстрое» решение?)

Возьмем в качестве иллюстрации известную «олимпиадную» задачу о куче камней, которая заключается в следующем. Имеется произвольное число камней N>1, вес каждого из которых известен и равен Wi, i=1..N, причем 0<Wi <100000, N и W – целые числа. Требуется распределить камни на две кучи таким образом, чтобы разность весов этих двух куч была минимальной. Например, пусть есть N=5 камней с весами: 5, 8, 13, 27, 14. Очевидно, что в одну кучу надо поместить камни 5 и 27 (вес 32), а в другую – 8, 13 и 14 (вес 35). Тогда разность весов будет минимальна и равна 3 (по абсолютной величине).

Надо написать (точнее, разработать) алгоритм и программу, которая бы решала поставленную задачу. Учтите, что программа должна запросить у пользователя N и Wi , или, еще лучше, сгенерировать их как псевдослучайные числа из заданного диапазона.

Задание. Разработайте алгоритм и программу в соответствии с приведенными ниже (очень ценными) методическими указаниями, выполните отладку и тестирование разработанной программы. Используйте функции, чтобы структурировать программу и повысить ее наглядность и надежность. Разработайте тесты для контроля корректности программы и докажите преподавателю ее работоспособность.

Оживите интерфейс своего приложения с помощью класса CConsole (файлы Console.h, Console.cpp в каталоге Labprakt\OP\), информацию о котором можно найти в сценарии л.р. «Рамка» (файл Labprakt\OP\OP_Lab_16_17.doc).

4.2.Методические указания.

Шаг 1. Генерация каркаса приложения.

С помощью мастера ИС MVS создайте консольное приложение и включите в него поддержку библиотеки MFC (как и в предыдущих работах). В приведенных ниже листингах предполагается, что проекту присвоено имя StonesHeap, но вы вправе присвоить ему другое имя, например, Lab4, и тогда в вашем проекте у вас будет имя Lab4 там, где в приведенных листингах присутствует идентификатор StonesHeap.

Шаг 2. Добавление заголовочных файлов.

В начало файла StonesHeap.cpp (а у вас будет, возможно, имя файла Lab4.cpp), содержащего функцию _tmain(), добавьте директивы include для подключения необходимых заголовочных файлов (добавления выделены курсивом):

Заголовочный файл Limits.h содержит, в частности, предельные значения для интегральных типов данных и их рекомендуется использовать вместо непосредственно заданных «своих» констант.

Шаг 3. Примитивнейшая версия программы.

Автор этой работы не смог придумать более совершенную программу, чем в приведенном ниже листинге. Помимо отсутствия достоинств, главными ее недостатками являются:

  • возможность нахождения решения задачи только для такого случая, когда исходную кучу достаточно разбить на две такие, одна из которых содержит всего один камень, а в другой, соответственно, находятся все остальные;

  • в программе не предусмотрен ввод числа камней в куче и их весов, так как автору было лень в процессе отладки программы всякий раз их вводить;

  • в программе использовано так называемое «магическое» число 5, что в процессе дальнейшего развития программы сулит неприятности. Очевидно, что максимально возможное число камней в куче (20) лучше бы сделать константой. Если вы по натуре человек бесстрашный, то можете вместо 20 использовать 200, 2000, 20000 и т.д;

  • программу надо повторно запускать для того, чтобы решать задачу с другими исходными данными, что, конечно, неудобно, т.е. «по-дебильному».

Вы, естественно, не можете принять такую примитивную программулину и с легкостью разработаете совершенную, лишенную перечисленных недостатков.

Русифицировать (консольное) приложение можно и путем вызова функции setlocale(LC_ALL,"rus");, которая, упрощенно говоря, устанавливает русский язык в качестве языка ввода/вывода. Эту функцию достаточно вызвать один раз при запуске программы на выполнение – проще всего в начале функции main().

Шаг 4. Вперед на мины! Для проверки корректности алгоритма и собственно программы рекомендуется заранее придумать несколько тестов с известными решениями. В частности, некоторые тестовые задания приведены в этой табл..

Таблица

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]