Поиск экстремумов с ограничениями или «Брачное агенство»
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Если отладка - процесс удаления ошибок, то программирование должно быть процессом их внесения

           Закон Мерфи

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

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

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

Таблица 1

Клиенты брачного агентства

Имя Пол Рост Возраст Характер Цвет кожи Доход Число разводов
Джон м 150 20 Пакостный Белый 198 0
Барбара ж 178 23 Зловредный Черный 567 5
Майкл м 165 45 Нежный Желтый 987 2
Инесса ж 189 43 Отвратительный Белый 3544 5
Стивен м 201 21 Хороший Желтый 1234 4
Деннис м 172 18 Ласковый Черный 987 3
Смит м 168 19 Твердый Черный 7463 1
Джоан ж 153 33 Пакостный Белый 873 2
Джейла ж 178 44 Зловредный Желтый 368 2
Рейчел ж 178 23 Зловредный Черный 567 7
Лайла ж 153 33 Пакостный Коричневый 873 3
Тильда ж 166 43 Отвратительный Белый 3454 7
Льюис м 168 23 Твердый Белый 463 5
Керол ж 165 32 Нежный Желтый 876 4
Гликерия ж 198 44 Пакостный Белый 2340 5
Пафнутий м 178 25 Отвратительный Белый 567 2
Зазноба ж 189 43 Пакостный Желтый 999 0
Отморозок м 187 25 Отвратительный Черный 657 2

 

Характеры клиентов разбиты на категории в соответствии с табл. 2 для того, чтобы можно было не только указывать в запросах конкретный характер, но и делать более общие запросы путем указания категории характера, в том числе и в числовой форме. Подобным образом введены категории клиентов по величине доходов и цвету кожи (см. табл.3 и табл.4).

Таблица 2

Классификация характеров клиентов

Характер Категория характера
Пакостный -1 Плохой
Отвратительный -1 Плохой
Твердый 0 Умеренный
Нежный 0 Умеренный
Зловредный 0 Умеренный
Хороший +1 Подходящий
Ласковый +1 Подходящий

 

 

Таблица 3

Классификация клиентов по величине их месячного дохода

Доход Категория клиента по величине дохода
менее 200 -2 Нищий
200-500 -1 Бедный
501-1000 0 Средний
1001-2000 +1 Богатый
более 2000 +2 Жадный

Таблица 4

Классификация клиентов по цвету кожи

Цвет кожи Категория цвета кожи
Белый 0 Белый
Черный 1 Черный
Желтый 2 Цветной
Коричневый 2 Цветной

 

Задание

1. Внимательно изучите листинги файлов проекта MAgency, которые приведены ниже. Каркас приложения – консольное приложение с поддержкой MFC.

2. Наберите текст приведенной программы или разработайте свой вариант. Файл с исходными данными вы можете создать элементарно путем копирования содержимого табл.1 в блокнот или в другой текстовый редактор, в том числе и в редактор MVS. Приветствуется увеличение объема табл.1 в любых направлениях: как увеличение числа строк, так и увеличение числа столбцов. Категорически возбраняется уменьшать размеры таблицы. Таблицы 2-4, как вы понимаете, предназначены для другой цели, а именно для формулировки запросов к программе и реализации алгоритмов удовлетворения запросов придирчивых клиентов.

3. Разработайте свое приложение в соответствии с вариантом, ниспосланным вам судьбой. Приложение должно выводить результат в понятной даже клиенту-дебилу форме, т.е. со всеми необходимыми сопроводительными и поясняющими текстами.

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

 

Таблица 5

Варианты заданий

№ комп. Задание
1 Найти все имеющиеся пары клиентов противоположного пола, имена которых начинаются с одинаковых символов и чей совокупный доход не меньше заданного пользователем значения
2 Найти пару клиентов противоположного пола, совокупный доход которых максимален и у них одинаковая категория характера
3 Найти все имеющиеся пары клиентов противоположного пола, которые имеют характер одной и той же категории
4 Найти пару клиентов одного пола, совокупный доход которых максимален и которые относятся к одной и той же категории цвета кожи. Поиск выполнять отдельно для клиентов обоих полов; сие значит, что вы обязаны найти двух особей мужеского рода и двух особей – женского.
5 Найти все имеющиеся пары клиентов одного пола, которые имеют характер одной и той же категории. Поиск выполнять отдельно для клиентов обоих полов.
6 Найти пару разнополых клиентов с диаметрально противоположными категориями характера, но с одинаковой категорией цвета кожи.
7 Сформировать пару из разнополых клиентов с заданными для каждого из них доходами (в числовой форме) при условии, что клиенты имеют одинаковую (заданную) категорию характера
8 Заданному (по имени) клиенту подобрать всех подходящих клиентов противоположного пола, вес которых и рост находится в заданных в процентном отношении пределах относительно его собственных. Разжевываю: ежели, например, рост клиента равен 150см и задан процент 20, то рост подходящих клиентов должен находиться в диапазоне 120..180см.
9 Найти две пары клиентов противоположного пола, которые имеют диаметрально противоположный рост, т.е. «самый высокий мужчина + самая невысокая женщина» и «самый короткий мужчина + самая высокая женщина»
10 Сформировать все возможные пары противоположного пола с одинаковой категорией цвета кожи и одинаковым числом разводов
11 Найти пару противоположного пола, у которых минимальное число разводов и одинаковая категория характера
12 Сформировать все возможные пары из разнополых клиентов с заданными для каждого из них доходами (в числовой форме в виде интервала) при условии, что клиенты имеют одинаковое число разводов

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

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

 

 

 

 




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

 

 


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

 

 

 

 

 

 

 









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

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

 Закон Мерфи

 

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

 

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

Из Википедии: Полный перебор (или метод «грубой силы», англ. 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).

 

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

Шаг 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. Вперед на мины! Для проверки корректности алгоритма и собственно программы рекомендуется заранее придумать несколько тестов с известными решениями. В частности, некоторые тестовые задания приведены в этой табл..

Таблица

Некоторые примеры разделения камней на две кучи, которые должна решать ваша программа

Камни Решение
7 10, 20, 30, 15, 25, 35, 15 10+30+35  =75  20+15+25+15=75
7 1, 5, 11, 16, 18, 21, 21 5+21+21   =47 1+11+16+18=46
6 1, 4, 5, 6, 7, 9 1+4+5+6 = 16 7+9     = 16
5 4, 4, 5, 6, 7 4+4+5 =13 6+7 =13
5 6, 1, 1, 1, 1 6         =6 1+1+1+1 =4

 

 



Разработка простого класса

Чтобы получить реальное время разработки программы, надо прогнозируемое время увеличить вдвое и перейти к следующей единице измерения времени. Например, если вы помышляете написать программу за 2 часа, то вы ее будете писать 4 дня

Закон Мерфи

 

Цель работы – освоить программирование и применение простого класса, включающего конструктор, деструктор, член-данные и член-функции (4 час.).

 

Задание

1. Создайте консольное приложение с поддержкой MFC.

2. Добавьте в проект новый класс.

3. Спроектируйте собственный класс в соответствии с вашим вариантом задания, добавьте в заголовочный файл описание тела класса, а в файл реализации – реализацию его конструктора, деструктора и член-функций.

4. Во всех заданиях дату определить как структуру, включающую день, месяц и год в формате целых чисел.

5. Все член-данные классов должны быть объявлены в секции с ключом доступа protected и для чтения и записи их значений надо написать соответствующие функции, называемые иногда аксессорами (от англ. accessor – средство доступа). Функции записи значений член-данных должны проверять их корректность и, как правило, возвращать значение булевского типа, указывающее на наличие ошибки. Ясное дело, что эти функции должны быть объявлены в секции public.

6. Значения член-данных строкового типа должны сохраняться в указателях char *. Выделение памяти для указателей должно выполняться в конструкторе или в методах класса, предназначенных для записи значений член-данных. Освобождение памяти надо выполнять в деструкторе класса.

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

8. «По умолчанию» предполагается, что пользователь должен иметь возможность просмотреть (вывести на экран) значения всех объектов в форме таблицы как до их модификации, так и после.

5.2. Описание вариантов заданий

Таблица 2.1.

Варианты заданий

№ вар. Задание
1 Класс Студент с член-данными: фамилия, номер зачетки, массив из 5 отметок, средний балл. Разработать метод вычисления среднего балла по массиву объектов. Сортировка студентов в порядке убывания среднего балла.
2 Класс Клиент банка с член-данными: фамилия, имя, № счета, сумма вклада, дата внесения депозита. Реализовать метод пересчета суммы вклада по заданной ставке годовых (например, 15%) в зависимости от срока хранения вклада (текущей даты).
3 Класс Автовладельцы с член-данными: марка авто, номер, цвет авто, фамилия и адрес владельца. Реализовать поиск владельцев авто с заданной маркой, цветом и номером, который заканчивается на две заданные цифры.
4 Класс Мотовладельцы с член-данными: марка мотоцикла, номер, цвет, фамилия и адрес владельца, отметка о техосмотре и дата его прохождения. Вывести информацию о владельцах тех мотоциклов, которые проходили техосмотр до заданной даты.
5 Класс Книголюб с член-данными: автор книги, название, издательство, год издания, число страниц. Найти книги заданного автора, изданные после заданного года и имеющие число страниц не более заданного.
6 Класс Рабочий с член-данными: фамилия, величина почасовой оплаты, дата последней выплаты зарплаты. Разработать функцию вычисления суммы заработка, причитающегося работнику. Заработок начислять за целое число недель, прошедшее с момента последней выплаты зарплаты до заданной даты. Считать, что число отработанных часов в неделе равно 40.
7 Класс Погода с член-данными: дата, средние температура (градусы) и скорость ветра (м/сек), величина осадков (мм), балл жесткости. Разработать метод вычисления балла жесткости по такому правилу: если температура ниже нуля, то балл жесткости равен температуре плюс удвоенная скорость ветра; в противном случае балл жесткости принимать равным нулю. Отсортировать объекты в порядке убывания баллов жесткости.
8 Класс Товары с член-данными: название товара, код товара, цена одной единицы товара, количество единиц товара. Разработать метод вычисления суммарной стоимости товаров (одного объекта). Найти объекты с максимальной и минимальной стоимостью товаров.
9 Класс Файл с член-данными: имя файла, тип файла, размер в байтах, дата создания, число кластеров, необходимое для хранения файла на диске. Разработать метод вычисления числа кластеров, приняв размер кластера равным 4096 байт. Если размер файла равен, например, 4097 байт, то для его хранения потребуется 2 кластера и в этом случае 4095 байт на диске не используются. Отсортировать файлы в порядке убывания такой «неиспользуемой» памяти.
10 Класс Преступник с член-данными: фамилия, рост, ширина и высота головы, длина руки, расстояние между глазами. Разработать метод вычисления близости заданных параметров подозреваемого к преступнику как сумма процентов отклонения физических параметров. По заданным физическим параметрам подозреваемого найти в базе наиболее близкого по параметрам преступника.
11 Класс Заготовки с член-данными: материал, номер, длина, высота. Заготовка прямоугольной формы, причем длина всегда не меньше высоты. Разработать метод, который получает в качестве параметров материал, длину и высоту детали и возвращает процент остатка площади материала, если деталь можно выкроить из данной заготовки. Метод должен вернуть отрицательное значение, если деталь выкроить не удается или если материал детали не совпадает с материалом заготовки.
12 Класс Абонент библиотеки с член-данными: фамилия, номер читательского билета, дата получения книги, число дней, на которое выдана книга. Разработать метод, который по заданной дате вычисляет «задолженность» (число дней) по несвоевременному возврату книги. Найти всех должников и их степень задолженности.
13 Класс Событие с член-данными: описание события, дата, время напоминания. Описание события – строка символов, например, «день рождения мамы». Время напоминания задается в часах в виде двух чисел: начало и конец (от 0 до 24). Написать метод, который получает в качестве параметров заданную дату и время суток (в часах) и возвращает значение true, если надо напоминать о событии. По заданной дате и времени суток проанализировать все объекты и вывести соответствующие напоминания
14 А здеся могет быть ваш варьянт

 

Во всех заданиях дату определить как структуру, включающую день, месяц и год в целочисленном формате.


 


Дата: 2019-07-30, просмотров: 237.