Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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