Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методический комплекс ПЗ СППР 2011.doc
Скачиваний:
27
Добавлен:
16.02.2016
Размер:
1.27 Mб
Скачать

Упражнения по программированию по теме «Массивы»

Откройте новый файл с единственным рабочим листом и введите несколько чисел в диапазон А1.-В10. (Подойдут любые числа.) Напишите процедуру Main, которая содержит цикл For с итерациями от i=l до i = 10. В каждой итерации цикла должна вызываться процедура Process, которая принимает три аргумента: i, а также два числа из ячеек на пересечении строки i и столбцов А и В. Процедура Process должна добавить большее из этих двух чисел в строку i столбца С. Число должно отображаться красным цветом, если оно извлечено из столбца А. В противном случае число должно быть представлено синим цветом.

Файл CustLists.xls содержит список клиентов компании за 1999-2000 годы в столбцах А и В. Напишите процедуру FindMatch, которая принимает единственный аргумент CustName (строкового типа). Процедура должна определять наличие одних и тех же клиентов в обоих списках. Если это так, то на экран выводится сообщение, и оба экземпляра имени пользователя выделяются полужирным начертанием. В противном случае должно выводиться сообщение о том, что имя клиента не содержится в обоих списках. Напишите процедуру Main, которая использует окно ввода данных для запроса имени клиента. После получения имени клиента процедура Main должна вызывать процедуру FindMatch, передавая введенное имя клиента в качестве аргумента.

В файле Wal-Mart .xls представлены ежемесячные скорректированные цены на акции (коррекция с учетом дивидендов и дополнительных инвестиций) компании Wal-Mart за период с 1992 по 2000 годы.

а. Напишите процедуру, которая называется RecordHighl и принимает единственный аргумент Price. Эта процедура должна искать в списке первую цену, которая превышает значение, указанное в аргументе Price. Если такая цена найдена, то процедура должна выводить в окне сообщения соответствующую дату. Например, " В первый раз цена акции компании Wal-Mart была превышена в _ и составила _". Если цена никогда не превышала указанное в качестве аргумента Price значение, то эта информация также должна быть представлена на экране в виде сообщения. После этого напишите процедуру, которая называется Main и использует окно ввода данных для запроса у пользователя контрольной цены. Процедура Main должна вызывать процедуру RecordHighl, передавая полученную от пользователя цену в качестве аргумента.

б. Напишите еще одну процедуру RecordHigh2, которая принимает единственный аргумент Specif iedMonth. Эта процедура должна искать в списке цену с 1992 года до указанного месяца (включительно) и определить максимальную цену за этот период (т.е. цена должна превышать остальные цены за указанный период). После этого должно отображаться сообщение вида "За период до _ максимальная цена составила _ в _". (Обратите внимание, что исходно максимальной считается запись за январь 1992 года, поэтому как минимум одна запись всегда будет найдена.) Измените процедуру Main из п. а. так, чтобы поле ввода данных использовалось для запроса месяца, после чего будет вызвана процедура RecordHigh2 с месяцем в качестве аргумента.

4, В файле BoyGirlFinished. xls содержится рабочий лист с оценками, полученными мальчиками и девочками. Откройте его и щелкните на кнопке. Вам будет предложено выбрать пол: мальчики (1) или девочки (2). После этого диапазон с оценками выбранного пола будет назван DataRange, а заголовок и средний бал для выбранного пола (в виде формулы) — введен в ячейки D9 и Е9. Диапазон D9 : Е9 форматируется, опять-таки в соответствии с выбранным полом (синий шрифт для мальчиков и красный — для девочек). Код этого файла защищен паролем. Откройте файл BoyGirl.xls, который содержит только данные, и напишите собственный код, выполняющий ту же задачу. Код должен состоять из процедуры Main, которая последовательно вызывает следующие процедуры.

  • GetResponse (отображает окно ввода данных и запрашивает у пользователя значение).

  • NameGenderRange (присваивает имя DataRange соответствующему диапазону).

  • FormatOutputRange (форматирует соответствующим образом диапазон D9:E9).

  • • EnterOutput (вводит надпись в ячейку D9 и формулы в ячейку Е9).

Напишите собственные процедуры, которые не используют переменные уровня модуля. Вместо этого аргументом каждой вызываемой процедуры должна стать строковая переменная Gender. Переменная Gender может принимать значения "boys" или "girls". Кроме того, напишите процедуру, которая работает даже при расширении набора данных.

Откройте новую книгу и напишите процедуру, которая называется GetWorM bootlnf о и принимает аргумент FileName (строкового типа). Эта процедура будет открывать файл, имя которого хранится в переменной FileName. Если' открытие файла завершается успешно (т.е. файл существует), то выводим окно сообщения, в котором указывается имя создателя файла и количестве рабочих листов в книге. После этого файл закрывается. Напишите процедуру Main, которая использует окно ввода для запроса у пользователя имени файл (в том числе информацию о расположении файла). Далее имя файла передайте в качестве аргумента в процедуру GetWorkbootlnfo. (Процедура Get-Workbootlnfo имеет один серьезный недостаток— она аварийно заверши работу приложения, если указанный файл не существует в выбранной папке, На данном этапе не стоит расстраиваться по этому поводу. Проверка существования файла будет нами выполнена в главе 13.)

Программа в файле MergeLists.xls, который рассматривался в предыдущей главе (пример 9.4), написана в виде единственной процедуры.

• Разбейте ее на несколько более простых процедур, которые вызываются из процедуры Main.

а. ClearOld (очищает столбец D от старых данных, если такие данныесуществуют).

б. Get Data (размещает данные текущих списков в массивах).

в. CreateMergedList (создает объединенный список в столбце D). Непередавайте переменные в качестве аргументов, воспользуйтесь переменными уровня модуля.

• Повторите пункт а, но в этот раз передайте переменные в качестве аргументов функций. В частности, переменные LSI и LS2, а также массивы Listl и List2 должны быть аргументами процедур GetData и Create-MergedList. {Подсказка: обратитесь к соответствующему разделу в этой главе, в котором описывается передача массивов в качестве аргументов.)

7. Приложение в файле ProdSales .xls из предыдущей главы (пример 9.2) написано в виде единственной процедуры. Разбейте ее на три процедуры меньшего размера, которые вызываются из процедуры Main. Самостоятельно выберите место разбивки кода и определите необходимость использования аргументов и переменных уровня модуля.

8. В файле RecentSalesFinished.xls на рабочем листе SalesReps приведен список торговых представителей компании. Для всех штатов Среднего Запада созданы отдельные рабочие листы, в которых приведены объемы продаж каждого менеджера этого штата. Откройте файл и щелкните на кнопке, которая расположена на листе SalesReps. Приложение запросит имя менеджера и название штата. После этого показатели указанного менеджера будут отображены в окне сообщения. Запустите приложение несколько раз (протестируйте запросы для различных штатов и менеджеров, не входящих в список), чтобы ознакомиться с функциональностью приложения. Код в этом файле защищен паролем. Откройте файл RecentSales.xls, который содержит только данные и процедуру Main, вызывающую еще не написанные процедуры. Напишите процедуры, которые используют аргументы, передаваемые из процедуры Main. Приложение обеспечит описанную выше функциональность.

9. Файл TransactionsFinished.xls имеет два рабочих листа. Налисте Customers Products представлен список клиентов и товаров компании. Лист Transactions содержит информацию о последних транзакциях, в которых принимали участие указанные клиенты и были реализованы указанные товары. Откройте файл и щелкните на кнопке, расположенной на листе Custow-ersProducts. У вас будут запрошены имя и фамилия клиента. Если клиент найден в списке, то вам необходимо будет указать название товара. Если товар присутствует в списке, то выводится сообщение с данными о продажах указанного товара указанному клиенту. Попробуйте запустить приложение несколько раз (также для клиентов и товаров, отсутствующих в списке), чтобы разобраться, как работает приложение. Код в этом файле защищен паролем. Откройте файл Transactions.xls, который содержит только данные и процедуру Main, вызывающую еще не написанные процедуры. Напишите процедуры, принимающие аргументы, которые объявлены в процедуре Main. Приложение должно предоставлять ту же функциональность, что и приложение файлаTransactionsFinished.xls.

10. Файл Errorsl .xls содержит список ошибок прогнозирования в столбце А. Список получен на основе одного из методов предсказания. Напишите процедуру, которая называется мае и подсчитывает среднее абсолютных значений ошибок. Функция должна работать с любым диапазоном ошибок. Проверьте функцию, введя соответствующую формулу в ячейку Е1.

11. Файл Errors2.xls содержит последовательность ежемесячных объемов продаж в столбце А, а также последовательность прогнозов этих же объемов продаж в столбце в. Напишите функцию, которая называется МАРЕ и вычисляет среднюю относительную ошибку прогноза, т.е. среднее значение относительных ошибок. Например, ошибка во второй строке составляет [713 - 738|/713 = 0,035, или 3,5%. Напишите эту функцию таким образом, чтобы она работала с любыми двумя диапазонами наблюдений и соответствующими прогнозами. После этого проверьте работу функции, введя соответствующую формулу в ячейку Е1.

12. Треугольное распределение — это распределение вероятностей, которое часто применяется в бизнес-моделях. Такое распределение в буквальном понимании имеет треугольную форму и включает три параметра, которые в нашем случае будут называться a, b и с. Параметры а и с соответствуют минимальному и максимальному значениям, а параметр b является наиболее вероятным значением (верхняя точка треугольника). Такое распределение вероятности понятно многим, но генерация случайных чисел для подобного распределения оказывается достаточно сложной задачей. В основном, используется такой метод.

Подсчитывается d = (b -a)/(c - а).

Генерируется случайное число U в диапазоне от 0 до 1 с равномерным распределением (для этого используется функция VBA Rnd).

Если U <= d, то необходимое случайное число определяется по формуле a + (c-a)Sqr(dU).

Если U > d, то необходимое случайное число вычисляется по формуле a + (c-a)[l-Sqr((l-d)(l-U))].

(Для получения квадратного корня используется встроенная в VBA функция Sgr.) Напишите функцию, которая называется Triangular и принимает три аргумента, соответствующих параметрам a, b и с. Функция должна возвращать случайные числа для треугольного распределения вероятности. (Воспользуйтесь операторами Application.Volatile и Randomize, которые применялись в примере 10.4.) После этого испытайте генератор случайных чисел на листе, введя формулу и скопировав ее в диапазон для генерации большого количества случайных чисел. Кроме того, можно создать гистограмму распределения случайных чисел, чтобы убедиться в том, что она имеет треугольную форму.