Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
lpstrFilter
lpstrFile
nMaxFile
В элемент lpstrFilter помещается адрес строки, содержащей фильтр и имеющей, например, такой вид (если открываемый файл имеет расширение. DAT):
char str[]="Файлы данных (*.DAT)", "*.DAT",
"Все файлы (*.*)","*.*", "";
В каждой паре строк сначала определяется комментарий, который появится в соответствующем поле стандартного диалога, а затем соответствующий этому комментарию шаблон, по которому функция GetOpenFileName() будет отбирать файлы для вывода в создаваемый ею диалог.
Работа 11. Проецирование файла в память
Составьте программу, выполняющую проецирование созданного в работе 9 файла в память. Предусмотрите и в проекции файла, и в его отображении доступ для чтения и записи. Не забудьте преобразовать полученный вами указатель в тип, соответствующий тем данным, из которых составлен файл (int, short, BYTE и т. д.). Получив указатель на проекцию файла в памяти, модифицируйте последний элемент в файле, записав в него какое-либо легко идентифицируемое число (например, 0x для элементов типа int или 0xABCD для элементов типа short). С помощью программы NortonCommander убедитесь, что файл на диске модифицирован должным образом.
Работа 12. Потоки (индивидуальное задание D)
Создайте обычное приложение Windows с главным окном, покрашенным в какой-либо цвет. В оконную функцию включите обработку сообщений WM_CREATE и WM_DESTROY. В функции обработки сообщения WM_CREATE создайте с помощью функции CreateThread() два вторичных потока с индивидуальными рабочими функциями. В функции CreateThread() достаточно указать два параметра – имя рабочей функции потока и адрес переменной для возврата идентификатора потока; остальные параметры можно принять равными 0.
В каждой рабочей функции потока с помощью оператора while организуйте бесконечный цикл до перевода в состояние FALSE глобальной булевой переменной, которую установите в значение TRUE перед созданием потока, и в значение FALSE – в функции OnDestroy(). Эти действия обеспечат завершение обоих потоков при завершения всего приложения. Включите в цикл while вызов функции Sleep() для усыпления потока на некоторое время (0,5 – 1,5 с). В результате действия, составляющие содержание рабочих функций потоков, будут выполняться периодически и независимо с заданной для каждого потока частотой.
В рабочих функциях потоков в определенные участки главного окна приложения выводятся, в соответствии с индивидуальным заданием, некоторые символьные или графические данные. Для получения необходимого для этого контекста устройства воспользуйтесь функцией GetDC(); не забудьте, завершив вывод в окно, освободить контекст устройства вызовом функции ReleaseDC(). Вывод в окно в этом случае не сопровождается затиранием предыдущего изображения, поэтому перед выводом нового изображения старое необходимо явным образом затирать вызовом функции FillRect(). Поскольку каждый из двух потоков выводит изображение в свою область окна, то и затирать он должен только эту область. Обязательно предусмотрите закрашивание половин окна разными цветами, чтобы они наглядно различались. Координаты всей рабочей области окна можно получить посредством функции GetClientRect(); из этих данных нетрудно вычислить координаты требуемой половины окна (верхней, нижней, правой или левой).
Работа 13. Синхронизация потоков с помощью событий
Модифицируйте программу из предыдущей работы. Включите в проект файл ресурсов с описанием меню, состоящего из четырех пунктов для включения и выключения каждого из двух потоков.
В функции OnCreate(), наряду с двумя потоками, создайте два объекта событий, сохранив в глобальных переменных их дескрипторы. Оба события создаются со сбросом вручную, их начальное состояние лучше задать сброшенным, чтобы при запуске программы выполнение потоков было заблокировано.
В функции OnCommand() обработки сообщений WM_COMMAND от пунктов меню с помощью конструкции switch-case анализируйте код выбранного пункта и вызовом функций SetEvent() и ResetEvent() устанавливайте или сбрасывайте соответствующие события.
В начале фрагмента циклического выполнения каждого потока поместите функции WaitForSingleObject() ожидания “своего” события. Теперь выбором пунктов меню можно независимо запускать или останавливать оба ваших потока.
Работа 14. Защита данных с помощью критической секции
Составьте программу, наглядно иллюстрирующую использование критических секций для защиты данных общего пользования. Пусть такими данными является банковский счет, с которого два потока будут периодически и параллельно снимать суммы, равные одной денежной единице. Программа будет состоять из функции WinMain(), реализующей первичный поток приложения, а также двух вторичных потоков, имитирующих действия клиентов банка. Результаты работы программы достаточно выводить в окно сообщения, поэтому можно обойтись без главного окна.
Состав глобальных переменных:
· структурная переменная CritSect типа CRITICAL_SECTION;
· целочисленная переменная nBalance для остатка денег на счете;
· булева переменная bGo, управляющая выполнением потоков;
· две целочисленные переменные nDeals1 и nDeals2 для отсчета числа выполненных банковских операций (транзакций) первым и вторым потоками;
· два дескриптора создаваемых в программе файлов;
· переменная типа DWORD, требуемая для операций записи в файл.
Локальные переменные в главной функции WinMain():
· массив из двух переменных hThreads[2] типа HANDLE для хранения дескрипторов создаваемых потоков;
· две переменные типа DWORD для хранения идентификаторов создаваемых потоков;
· символьный массив достаточной длины для формирования итогового сообщения.
Состав главной функции WinMain():
· инициализация критической секции вызовом функции InitializeCriticalSection();
· создание двух файлов с произвольными именами для записи в них информации о произведенных транзакциях;
· создание двух вторичных потоков с рабочими функциями Thread1 и Thread2;
· установка переменной bGo, разрешающей выполнение обоим потокам;
· “пустой” цикл while(nBalance>=1), останавливающий выполнение первичного потока (функции WinMain()) до полного истощения денег на счете;
· после выхода из цикла while() сброс переменной bGo;
· ожидание завершения обоих потоков с помощью функции WaitForMultipleObjects();
· формирование в символьном массиве (с помощью функции wsprintf()) итогового сообщения, включающего исходную сумму счета, количество транзакций первого и второго потоков, остаток денег на счете, а также сумму, снятую со счета обоими потоками вместе;
· вывод сформированной символьной строки в окно сообщения и завершение программы;
· закрытие обоих потоков и удаление критической секции.
Рабочие функции потоков ничем не отличаются друг от друга за исключением того, что первый поток, выполнив транзакцию, инкрементирует переменную nDeals1, а второй – переменную nDeals2.
Состав рабочих функций потоков:
· цикл while(bGo), в который включается весь текст рабочей функции (за исключением последнего предложения return 0);
· вход в критическую секцию (функция EnterCriticalSection());
· чтение в локальную переменную потока nLocalBalance текущего содержимого глобальной переменной nBalance (суммы денег на счете);
· проверка с помощью предложения if(nLocalBalance >=1) наличия денег на счете (все дальнейшие операции выполняются в блоке if, т. е. лишь при положительном результате этого сравнения);
· уменьшение значения переменной nLocalBalance на единицу (снятие со счета);
· инкремент переменной nDeals или nDeals2;
· формирование символьной строки с текущей суммой на счете (значение переменной nLocalBalance);
· запись этой строки в файл, соответствующий данному потоку (эта операция введена для увеличения времени работы функции потока и повышения вероятности ее прерывания с передачей управления другому потоку);
· в качестве последней операции перенос значения переменной nLocalBalance в глобальную переменную nBalance;
· после закрытия блока if выход из критической секции вызовом функции LeaveCriticalSection()
· после закрытия блока while завершающий оператор return 0 и закрытие рабочей функции потока.
Программу необходимо сначала отладить при выключенных операциях с критической секцией. Возможный результат работы программы показан на приведенном ниже рисунке:

Видно, что при начальной сумме 100000 единиц со счета было снято в общей сложности 189580 единиц, причем на счете еще осталась некоторая сумма.
После того, как программа будет отлажена, ее следует запустить при включенных операциях с критической секцией. В этом случае сумма сделок должна в точности соответствовать сумме вклада, а остаток вклада должен быть равен 0.
Работа 15. Библиотеки динамической компоновки
a. Неявное (статическое) подключение. В этом случае DLL-библиотека автоматически проецируется на адресное пространство вызывающей программы еще в процессе ее запуска. Создайте проект с именем, например, DLL. IDE для подготовки выполнимого DLL-модуля. В окне Target Type укажите тип приложения Dynamic Library (.dll). Исключите из проекта файлы. RC и. DEF.
В исходный текст программы DLL-библиотеки включите две прикладные функции-подпрограммы с произвольными именами (например, Func1 и Func2), которые вызовом функции MessageBox() выводят в окно сообщения различающуюся информацию. Исходный текст библиотеки должен состоять только из этих функций (без функции WinMain()). В начале программы, как обычно, должны быть описаны прототипы этих функций, в которых перед типом возвращаемого значения следует указать описатель __declspec (dllexport) (заметьте, что этот описатель начинается с двух символов подчеркивания). Включите в текст программы директиву #include для подсоединения заголовочного файла Windows. h.
В результате компиляции и компоновки должны создаться файлы DLL. DLL и DLL. LIB. Удостоверьтесь в этом. Не запускайте полученный модуль DLL. DLL; он предназначен не для самостоятельной работы, а для вызова из программы. EXE.
Создайте второй проект с именем, например, CPP. IDE для подготовки выполнимого модуля вызывающей программы. В окне Target Type этого проекта укажите, как обычно, тип приложения Application (.exe).В состав проекта включите, помимо исходного файла CPP. CPP, еще и файл библиотеки импорта DLL. LIB, с помощью которой осуществляется поиск и привязка к выполнимому модулю вызываемых в нем DLL-библиотек.
В функцию WinMain() вызывающей программы включите сначала вывод в окно сообщения какой-либо информационной строки, чтобы при запуске программы удостовериться, что она начала работать, а затем – вызовы первой и второй функций DLL-библиотеки. Перед функцией WinMain() опишите прототипы вызываемых функций с описателем __declspec (dllimport).
Откомпилируйте программу CPP. EXE. Запустив программу на выполнение, убедитесь, что она вызывает обе функции созданной вами DLL-библиотеки. Просмотрите с помощью какого-либо текстового редактора содержимое файла библиотеки импорта DLL. LIB и найдите в нем “декорированные” компоновщиком имена ваших функций. Запишите эти имена, чтобы воспользоваться ими в следующем задании. Для определения “декорированных” имен можно также вызвать утилиту TDUMP в таком формате:
TDUMP имя_dll.DLL имя_dll.MAP.
b. Явное (динамическое) подключение. В этом случае загрузка (а также и выгрузка) DLL-библиотеки осуществляется программой по мере необходимости. Воспользуйтесь созданной в предыдущем задании динамической библиотекой DLL. DLL. Создайте новый проект для подготовки вызывающей программы с именем, например, CPP2.IDE. Не включайте в него библиотеку импорта. Не включайте в него прототипы вызываемых функций. Алгоритм программы CPP2.CPP должен содержать следующие элементы:
· вывод в окно сообщения информации о запуске программы;
· загрузка динамической библиотеки DLL. DLL вызовом функции Windows LoadLibrary() с сохранением полученного дескриптора;
· получение адресов вызываемых из DLL-библиотеки функций с помощью функции Windows GetProcAddress(). В качестве первого параметра этой функции следует указывать полученный ранее дескриптор загруженной библиотеки, а в качестве второго параметра – найденные в предыдущем задании “декорированные” имена вызываемых функций;
· последовательный вызов обеих функций из DLL-библиотеки посредством полученных на предыдущем этапе адресов;
· выгрузка библиотеки вызовом функции FreeLibrary().
Откомпилируйте программу CPP. EXE. Запустив программу на выполнение, убедитесь, что внешне она работает так же, как и предыдущая, хотя, возможно, вам удастся заметить задержку при ее выполнении на этапе поиска и загрузки DLL-библиотеки.
c. Динамическая загрузка с исходными именами вызываемых функций. Поскольку в этом задании DLL-библиотеку следует создавать не так, как в предыдущих заданиях, откройте новый проект для создания приложения типа Dynamic Library (.dll). Пусть этот проект носит имя DLL3.IDE. Включите в него имеющийся уже у вас исходный файл DLL3.CPP и, кроме того, файл определения модуля с именем DLL3.DEF. Этот файл будет состоять из трех строк (при наличии в DLL-библиотеке двух функций):
EXPORTS
имя_функции1_в_программе = “декорированное”_имя_функции
имя_функции2_в_программе = “декорированное”_имя_функции
Заново скомпилируйте DLL-библиотеку.
Создайте новый проект для подготовки вызывающей программы (CPP3.IDE). Скопируйте файл CPP2.CPP под именем CPP3.CPP и исправьте в нем имя загружаемой DLL-библиотеки на новое. Исправьте также “декорированные” имена вызываемых функций на те, которые использовались в исходном файле DLL-библиотеки. Получите загрузочный модуль основной программы и убедитесь в правильности его работы.
Работа 16. Передача параметров в функции DLL-библиотек
Воспользуйтесь заданием D (работа 8) из практикума предыдущего семестра, где в главное окно приложения выводился некоторый график. Оформите алгоритм рисования графика в виде программы DLL-библиотеки. Включите в библиотеку две функции рисования одного и того же графика, различающиеся, например, масштабом изображения или его положением относительно осей координат. Поскольку для вывода любого изображения в окно приложения необходимо использовать дескриптор контекста устройства, его значение придется передавать в функцию DLL-библиотеки в качестве параметра. Другим параметром может быть, например, цвет графика или дескриптор пера. Создайте соответствующую DLL-библиотеку и подключите ее к приложению любым из рассмотренных в предыдущей работе способом. В соответствующем месте основной программы (именно, в функции OnPaint()) осуществите последовательный вызов функций DLL-библиотеки. Запустите программу и убедитесь в правильном отображении графиков.
Индивидуальные задания лабораторного практикума
Задание A1. В середину главного окна голубого цвета выведите произвольный символ красного цвета. В каждом такте таймера, работающего с частотой 20 Гц, перемещайте символ на небольшой угол по образующей улитки Паскаля, уравнение которой в параметрической форме имеет вид x = a cos2 t + cos t, y = a cos t sin t +
+ sin t. Выберите значение a в пределах 1,5 – 2,0, эффективный радиус кривой 40 – 50 пикселов, шаг изменения параметра t 0,05 и такое число шагов, чтобы получить один полный период графика. Выполните задание в двух вариантах – с затиранием фона окна при его перерисовке и без затирания фона.
Задание B1. Фигура плавно перемещается по горизонтали от левого края окна до правого, скачком возвращается назад и повторяет плавное движение вправо. В каждом шаге x-координату фигуры изменяйте на 1 пиксел.
Задание C1. Массив записываемых в файл данных должен представлять собой последовательный ряд из 5000 целых чисел в убывающем порядке.
Задание D1. Первый поток выводит в левую половину окна цветными символами текущее время (часы, минуты и секунды), получаемое с помощью функции GetLocalTime().
Второй поток выводит в правую половину окна изображение круга, заливаемого попеременно то одним, то другим цветом.
Задание A2. У левого края достаточно широкого главного окна желтого цвета выведите горизонтальную зеленую ленточку длиной 10 пикселов. В каждом такте таймера, работающего с частотой 20 Гц, изменяйте ее длину на 4 – 5 пикселов так, чтобы она росла вправо. Остановите таймер, когда ленточка достигнет правого края экрана.
Задание B2. Фигура плавно перемещается по окружности, уравнение которой в параметрической форме имеет вид x = sin t, y =
= cos t. Шаг изменения параметра t задайте равным 0,02, значения x и y умножайте на 80.
Задание C2. Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 целых четных чисел.
Задание D2. Первый поток выводит в верхнюю половину окна цветными символами текущие экранные координаты курсора мыши, получаемые с помощью функции GetCursorPos().
Второй поток выводит в нижнюю половину окна изображение попеременно то левой, то правой половины цветного круга.
Перемещая по экрану курсор мыши, проанализируйте работу программы.
Задание A3. В середину главного окна серого цвета выведите толстую синюю линию длиной 50 – 100 пикселов под углом к вертикали. В каждом такте таймера, работающего с частотой 1 Гц, изменяйте ее положение так, чтобы она качалась вправо-влево вокруг нижней точки наподобие маятника метронома. Остановите таймер после 10 периодов качания.
Задание B3. Фигура плавно перемещается по вертикали от нижнего края окна до верхнего, скачком возвращается назад и повторяет движение вверх. В каждом шаге y-координату фигуры изменяйте на 1 пиксел.
Задание C3. Массив записываемых в файл данных должен представлять собой последовательный ряд из 1000 коротких (тип short) целых чисел.
Задание D3. Первый поток выводит в левую половину окна круг, залитый каким-либо цветом, и попеременно изменяет цвет фона под ней, т. е. цвет этой половины окна.
Второй поток выводит в правую половину окна цветными символами число миллисекунд, истекших от момента загрузки операционной системы, которое можно получить с помощью функции GetTickCount(). Оцените, когда была в последний раз загружена операционная система на вашем компьютере?
Задание A4. У левого края достаточно широкого главного окна желтого цвета выведите один произвольный символ синего цвета. В каждом такте таймера, работающего с частотой 10 Гц, перемещайте символ вправо на 4 – 5 пикселов. Остановите перемещение, когда символ дойдет до правого края окна. Выполните задание в двух вариантах – с затиранием фона окна при его перерисовке и без затирания фона.
Задание B4. Фигура плавно перемещается по эллипсу, уравнение которого в параметрической форме имеет вид x = sin (t + 1,0),
y = cos t. Шаг изменения параметра t задайте 0,02, значения x и y умножайте на 80.
Задание C4. Массив записываемых в файл данных должен представлять собой последовательный ряд из 1000 целых четных (тип unsigned int) чисел в убывающем порядке.
Задание D4. Первый поток выводит в верхнюю половину окна изображение цветного круга попеременно то большего, то меньшего диаметра.
Второй поток выводит в нижнюю половину окна цветными символами текущее время по Гринвичу (часы, минуты и секунды), получаемое с помощью функции GetSystemTime(). На сколько время по Гринвичу отличается от московского?
Задание A5. В нижней части достаточно высокого главного окна желтого цвета нарисуйте горизонтально лежащий коричневый брусок. В каждом такте таймера, работающего с частотой 20 Гц, увеличивайте высоту бруска на 4 – 5 пикселов так, чтобы он рос вверх. Остановите таймер, когда брусок достигнет верха окна.
Задание B5. Фигура плавно перемещается по синусоиде y = sin t вдоль горизонтали от левого края окна до правого, скачком возвращается назад и повторяет движение вправо. В каждом шаге
x-координату фигуры изменяйте на 1 пиксел, параметр t на 0,05; значения y умножайте на 80.
Задание C5. Массив записываемых в файл данных должен представлять собой последовательный ряд из 5000 коротких (тип short) целых нечетных чисел.
Задание D5. Первый поток выводит в случайные места левой половины окна небольшие цветные кружки. Для повышения наглядности не затирайте изображение в каждом такте вывода, накапливая выводимые фигуры на экране.
Второй поток выводит в правую половину окна изображение толстой цветной линии, которая попеременно отклоняется от вертикали то вправо, то влево (наподобие часового маятника).
Задание A6. С левой стороны достаточно широкого главного окна зеленого цвета выведите желтый круг диаметром 50 – 60 пикселов. В каждом такте таймера, работающего с частотой 20 Гц, перемещайте круг вправо на 4 – 5 пикселов. Остановите таймер, когда круг достигнет правого края окна. Выполните задание в двух вариантах – с затиранием фона окна при его перерисовке и без затирания фона.
Задание B6. Фигура плавно перемещается по образующей фигуры Лиссажу, уравнение которой в параметрической форме имеет вид x = sin t, y = cos(2t + π/2). В каждом шаге параметр t изменяйте на 0,02, значения x и y умножайте на 80. Для константы π/2 в языке С++ существует обозначение M_PI_2.
Задание C6. Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 целых четных чисел в убывающем порядке.
Задание D6. Первый поток выводит в верхнюю половину окна попеременно изображения то круга, то квадрата с общим центром. Фигуры должны быть залиты каким-либо цветом.
Второй поток выводит в нижнюю половину окна цветными символами время выполнения предыдущего такта этого потока (вместе с интервалом ожидания, задаваемым функцией Sleep()). Для определения длительности фрагмента программы воспользуйтесь функцией мультимедийного таймера timeGetTime().
Задание A7. В середину достаточно большого главного окна голубого цвета выведите небольшой розовый квадрат. В каждом такте таймера, работающего с частотой 10 Гц, увеличивайте размер квадрата на 5 – 10 пикселов, оставляя неизменным положение его центра. Остановите таймер, когда квадрат займет все окно.
Задание B7. Фигура плавно перемещается по диагонали от левого верхнего края окна до правого нижнего, скачком возвращается назад и повторяет движение по диагонали. В каждом шаге обе координаты фигуры изменяйте на 1 пиксел.
Задание C7. Массив записываемых в файл данных должен представлять собой последовательный ряд из 4000 целых (тип UINT) чисел, кратных 5.
Задание D7. Первый поток выводит в левую половину окна изображение желтого полумесяца, у которого попеременно то увеличивается, то уменьшается толщина.
Второй поток выводит в правую половину окна цветными символами полный объем физической памяти и объем свободной физической памяти. Вывод лучше организовать в две строки. Требуемую информацию можно получить с помощью функции GlobalMemoryStatus(). Запуская вместе с испытываемой программой другие приложения Windows (ваши или системные), пронаблюдайте за использованием физической памяти.
Задание A8. В середину достаточно большого главного окна голубого цвета выведите один произвольный символ темно-зеленого цвета. В каждом такте таймера, работающего с частотой 20 Гц, перемещайте символ на небольшой угол по образующей кардиоиды, уравнение которой в параметрической форме имеет вид x = cos t (1 + cos t), y = sin t (1 + cos t). Задайте эффективный радиус кривой 40 – 50 пикселов, шаг изменения параметра t 0,1 и такое число шагов, чтобы получить один полный период графика. Выполните задание в двух вариантах – с затиранием фона окна при его перерисовке и без затирания фона.
Задание B8. Фигура плавно перемещается по вертикали от верхнего края окна до нижнего, скачком возвращается назад и повторяет движение вниз. В каждом шаге y-координату фигуры изменяйте на 1 пиксел.
Задание C8. Массив записываемых в файл данных должен представлять собой последовательный ряд из 256 чисел типа BYTE в убывающем порядке.
Задание D8. Первый поток выводит в верхнюю половину окна изображение цветного треугольника, поворачивающийся вокруг своего основания попеременно вершиной то вверх, то вниз. Треугольник рисуется функцией Polygon().
Второй поток выводит в нижнюю половину окна цветными символами время в миллисекундах, истекшее от момента загрузки операционной системы, которое можно получить с помощью функции GetCurrentTime(). Оцените, когда в последний раз была загружена операционная система на вашем компьютере?
Задание A9. В середину главного окна темно-синего цвета выведите изображение полной желтой Луны. Надвигайте на нее с правой стороны тень Земли, изображая затмение Луны. В каждом такте таймера, работающего с частотой 10 Гц, перемещайте тень Земли влево на 4 – 5 пикселов до тех пор, пока Луна не закроется полностью.
Задание B9. Фигура плавно перемещается по образующей вырожденной фигуры Лиссажу, уравнение которой в параметрической форме имеет вид x = sin t, y = cos(t – π/2). В каждом шаге параметр t изменяйте на 0,02, значения x и y умножайте на 80. Для константы π/2 в языке С++ существует обозначение M_PI_2.
Задание C9. Массив записываемых в файл данных должен представлять собой последовательный ряд из 1000 коротких (тип short) целых четных чисел в убывающем порядке.
Задание D9. Первый поток выводит в левую половину окна цветными символами состояние клавиш Shift, которое можно получить с помощью функции GetAsyncKeyState(). Состояние анализируемых клавиш индицируйте, выводя на экран соответствующие надписи.
Второй поток выводит в правую половину окна две толстые цветные линии, расходящиеся из одной точки под некоторым углом к горизонтали, и периодически то увеличивает, то уменьшает угол между ними.
Задание A10. В левый нижний угол квадратного главного окна светло-зеленого цвета выведите один произвольный фиолетовый символ. В каждом такте таймера, работающего с частотой 10 Гц, перемещайте символ по диагонали вправо и вверх на 4 – 5 пикселов. Выполните задание в двух вариантах – с затиранием фона окна при его перерисовке и без затирания фона. Остановите таймер, когда изображение символа подойдет к правому верхнему углу окна.
Задание B10. Фигура плавно перемещается по дуге, уравнение которой в параметрической форме имеет вид x = sin2 t, y = cos t. Шаг изменения параметра t задайте равным 0,02, значения x и y умножайте на 80.
Задание C10. Массив записываемых в файл данных должен представлять собой последовательный ряд из 10000 целых чисел, кратных 4.
Задание D10. Первый поток выводит в верхнюю половину окна попеременно изображения то левой, то правой половины вытянутого цветного эллипса.
Второй поток выводит в нижнюю половину окна цветными символами ширину и высоту главного окна приложения, которые можно вычислить из данных, предоставляемых функцией GetWindowRect(). Изменяя размер главного окна приложения, проанализируйте работу программы.
Задание A11. В середине достаточно широкого главного окна светло-серого цвета нарисуйте длинный горизонтальный брусок, у которого небольшая часть слева закрашена красным цветом, а остальная поверхность – синим. В каждом такте таймера, работающего с частотой 5 Гц, перемещайте границу смены цвета на 4 – 5 пикселов вправо. Остановите таймер, когда весь брусок станет красным.
Задание B11. Фигура плавно перемещается по синусоиде
x = sin t вдоль вертикали от верхнего края окна до нижнего, скачком возвращается назад и повторяет движение вниз. В каждом шаге y-координату фигуры изменяйте на 1 пиксел, параметр t на 0,05; значения x умножайте на 80.
Задание C11. Массив записываемых в файл данных должен представлять собой последовательный ряд из 2000 коротких (тип short) нечетных целых чисел в убывающем порядке.
Задание D11. Первый поток выводит в левую половину окна цветными символами число целых секунд, истекших с момента загрузки операционной системы. Значение этого времени (в других единицах) можно получить с помощью функции GetCurrentTime().
Второй поток выводит в правую половину окна треугольник, заливаемый попеременно то синим, то зеленым цветом. Треугольник рисуется функцией Polygon().
Задание A12. В середину главного окна черного цвета выведите закрашенный белой кистью круг диаметром 150 – 200 пикселов. В каждом такте таймера, работающего с максимальной частотой (20 Гц), уменьшайте яркость зеленого компонента цвета кисти на 2 – 3 единицы интенсивности и наблюдайте изменение цвета круга. Остановите таймер после завершения двух периодов смены цвета.
Задание B12. Фигура плавно перемещается по дуге, уравнение которой в параметрической форме имеет вид x = sin t, y = cos2 t. Шаг изменения параметра t задайте равным 0,02, значения x и y умножайте на 80.
Задание C12. Массив записываемых в файл данных должен представлять собой последовательный ряд из 512 чисел типа BYTE.
Задание D12. Первый поток выводит в верхнюю половину окна цветными символами номер текущего такта данного потока.
Второй поток выводит в нижнюю половину окна толстую цветную линию, качающуюся вокруг своей середины наподобие детских качелей.
Задание A13. В середину главного окна синего цвета выведите прописную букву “А” красного цвета. В каждом такте таймера, работающего с частотой 10 Гц, превращайте ее в следующий по алфавиту символ. Остановите таймер после вывода всех символов символьной таблицы.
Задание B13. Фигура плавно перемещается по развертывающейся спирали, уравнение которой в параметрической форме имеет вид x = t sin t, y = t cos t. Параметр t изменяйте от 2 до 20 с шагом 0,05, значения x и y умножайте на 8.
Задание C13. Массив записываемых в файл данных должен представлять собой последовательный ряд из 500 коротких (тип short) целых чисел.
Задание D13. Первый поток выводит в левую половину окна квадрат, нарисованный толстым цветным пером, и попеременно изменяет цвет этой половины окна, в том числе и цвет внутри квадрата.
Второй поток выводит в правую половину состояние левой клавиши мыши. Состояние клавиш мыши или клавиатуры можно получить с помощью функции GetAsyncKeyState().Состояние анализируемой клавиши индицируйте, выводя на экран соответствующие надписи.
Задание A14. В середину главного окна зеленого цвета выведите светло-фиолетовый круг диаметром 100 – 120 пикселов, в правой части которого вырезан узкий сектор. В последовательных тактах таймера, работающего с частотой 2 Гц, сжимайте и раскрывайте этот сектор, получая стилизованное изображение закрывающегося и открывающегося рта. Остановите таймер после 10 периодов смены изображения. Круг с вырезанным сектором рисуется функцией Pie().
Задание B14. Фигура плавно перемещается по диагонали от левого нижнего края окна до правого верхнего, скачком возвращается назад и повторяет движение по диагонали. В каждом шаге обе координаты фигуры изменяйте на 1 пиксел.
Задание C14. Массив записываемых в файл данных должен представлять собой последовательный ряд из 10000 целых четных (тип unsigned int) чисел в убывающем порядке.
Задание D14. Первый поток выводит в верхнюю половину окна попеременно то два, то три концентрических круга.
Второй поток выводит в нижнюю половину окна цветными символами координаты рабочей области окна.
Изменяя размер окна приложения, проанализируйте работу программы.
Задание A15. В середину главного окна темно-синего цвета выведите толстую светло-голубую линию длиной 50 – 100 пикселов под углом к вертикали. В каждом такте таймера, работающего с частотой 5 Гц, изменяйте ее положение так, чтобы она качалась вправо-влево вокруг верхней точки наподобие маятника. Остановите таймер после 10 периодов качания.
Задание B15. Фигура плавно перемещается по дуге, уравнение которой в параметрической форме имеет вид x = – sin t, y = cos2 t. Шаг изменения параметра t задайте равным 0,02, значения x и y умножайте на 80.
Задание C15. Массив записываемых в файл данных должен представлять собой последовательный ряд из 4000 коротких (тип USHORT) целых нечетных чисел.
Задание D15. Первый поток выводит в левую половину окна черный квадрат и изменяет попеременно цвет фона под ним, т. е. цвет левой половины окна.
Второй поток выводит в правую половину окна произвольный цветной символ со случайными координатами.
Задание A16. В середине главного окна синего цвета нарисуйте тонкий серп старой луны желтого цвета. В каждом такте таймера, работающего с частотой 2 Гц, уменьшайте на 1 – 2 пиксела толщину полумесяца, чтобы он, пройдя через новолуние, превратился в изображение молодой луны, после чего остановите таймер.
Задание B16. Фигура плавно перемещается по горизонтали от правого края окна до левого, скачком возвращается назад и повторяет плавное движение влево. В каждом шаге x-координату фигуры изменяйте на 1 пиксел.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


