по операционным системам
за 5 семестр
Выполнил: Горбылёв А.
Факультет: АВТ
Группа: Аи-42
Преподаватель: Еленычев С. В.
Вариант: 25
Новосибирск, 2006 г
Задание: Составить программу для вычисления операции вычитания двух целых чисел (со знаком). На экран выводить результат в следующем формате: «147 – 140 = 7». После завершения каждой операции вычитания результат сохранять в файле в том же виде, в котором он выводится на экран. Операции вычитания и вывода результата в файл реализовать в отдельных потоках.
1. Назначения функций
· void main () – главная функция исполняемой программы. Она также является основным потоком, в котором выполняется вычитание, создание нового потока и объекта синхронизации;
· CreateEvent – функция создания объекта синхронизации – события;
· SetEvent – после выполнения вычитания сбрасывает событие в сигнальное состояние;
· CreateThread – функция создания дополнительного потока;
· CloseHandle – функция закрытия объекта синхронизации – события;
· DWORD WINAPI save (LPVOID event) – функция записи результата вычитания в файл, которая выполняется в дополнительном потоке;
· WaitForSingleObject – функция ожидания сброса объекта синхронизации в сигнальное состояние
· fopen – функция открытия файла;
· fprintf – функция записи строки в файл.
2. Описание алгоритма.
В функции main сначала создаётся объект синхронизации – событие и дополнительный поток. После этого вводятся с клавиатуры значения переменных a, b и c; выполняется вычитание. Событие сбрасывается в сигнальное состояние, т.е. оно сигнализирует о том, что вычитание выполнено и второй поток может записать результаты в файл. Вывод результатов на экран. В дополнительном потоке открывается файл (если его нет, то он создаётся). Если открыть файл не удалось, программа выводит сообщение об ошибке и завершает своё выполнение. Если открыть файл удалось, то в него записывается та же строка результатов, что выводилась на экран. В конце программы выводится сообщение об окончании работы программы.
3. Информация, вводимая с клавиатуры, и записанная в файл.
a = 874 b = 358
Результат вычитания: 874 – 358 = 516.
В файл записана следующая информация: 874 – 358 = 516.
4. Блок-схема алгоритма
начало
a b c
начало создание потока
и события
событие
Ожидание сброса события Ввод с клавиатуры значений
в сигнальное состояние a и b, вычитание, сброс события
в сигнальное состояние
нет
открытие файла
да
запись в файл
результатов
конец
5. Листинг программы с комментариями
#include <stdio.h>
#include <iostream.h>
#include <windows.h>
int a, b, c; //глобальные переменные, в которых хранятся результаты вычитания
DWORD WINAPI save (LPVOID event) //функция записи в файл
{
if (WaitForSingleObject(event, INFINITE) == WAIT_OBJECT_0)//проверяется, сброшено ли событие
{ //в сигнальное состояние
FILE *f;
if ((f = fopen("file.txt", "w")) == NULL) //открытие файла
{
printf ("Error!/n");
return (0);
}
else
{
fprintf (f, "%d - %d = %d", a, b, c); //запись результата в файл
printf ("End program\n");
return (1);
}
}
}
void main ()
{
HANDLE event = CreateEvent(NULL, FALSE, FALSE, "event"); //создание события
DWORD dwThreadID;
HANDLE hThread;
hThread = CreateThread (NULL, 0, save, event, 0, &dwThreadID);
//создание дополнительного потока,
//который выполняет функцию записи в файл
printf ("Enter a: "); //|
scanf ("%d", &a); //|
printf ("\nEnter b: "); //> ввод чисел и само вычитание
scanf ("%d", &b); //|
c = a - b; //|
SetEvent (event); //сброс события в сигнальное состояние
printf ("\n%d - %d = %d\n", a, b, c); //вывод результата
_sleep (10);
CloseHandle(event); //закрытие события
}
6. Список литературы
1. Конспект лекций;
2. Керниган Ричи – Язык С. (электронный вариант).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.