Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
11
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

16.4 Представить многочлен в виде линейного списка. Написать прогу кот выполняет сложение многочленов

//будем считать что списки упорядочены по возрастанию степеней элементов многочленов

list* add(list *t1,list *t2)

{

list * new_list,*tek;

list *l1 = t1;

list *l2 = t2;

bool flg = false;

while((l1!=NULL)&&(l2!=NULL))

{//пока не кончится один из двух многочленов

if(l1->s!=l2->s)//если степени не равны

{

if(l1->s>l2->s)//если степень 1-го больше чем 2-го

{

while((l1->s!=l2->s)&&(l2!=NULL))//пока степени не выровняются

{

list *h = new list;//создаем 1-й элемент

h->k=l2->k;

h->s=l2->s;

h->next=NULL;

if(!flg)//если это первый элемент

{//создаем начало списка

flg = true;

new_list = h;

tek = h;

}else{//иначе добавляем в очередь

tek->next = h;

tek = h;

}

l2 = l2->next;//перходим к след эл-ту

}}else{//если степень 2-го больше чем 1-го

while((l1->s!=l2->s)&&(l1!=NULL)){ //пока степени не выровняются

list *h = new list;//созд новый эл-т очереди

h->k=l1->k;

h->s=l1->s;

h->next=NULL;

if(!flg) //если это первый элемент

{//создаем начало списка

flg = true;

new_list = h;

tek = h;

}else{//иначе добавляем в очереь

tek->next = h;

tek = h;

}

l1=l1->next; //перходим к след эл-ту

}}

}else{//если степени равны

list *temp = new list; //созд новый эл-т очереди

temp->k = l1->k+l2->k;//коэф складываем

temp->s = l1->s;

temp->next = NULL;

if(!flg) {

new_list = temp;

tek = temp;

flg = true;

}else

{

tek ->next = temp;

tek = temp;

}

}

l1=l1->next;

l2=l2->next;

}

//проверяем который многочлен не окончился и дописываем в конец резельтирующего многочлена

if((l1!=NULL)&&(l2==NULL))//незакончился 1-ый

while(l1!=NULL){

list *tt = new list;

tt->s = l1->s;

tt->k= l1->k;

tt->next= NULL;

tek->next = tt;

tek = tt;

l1=l1->next;

}else

if((l1==NULL)&&(l2!=NULL))//незакончился 2-ой

while(l2!=NULL){

list *tt = new list;

tt->s = l2->s;

tt->k= l2->k;

tt->next= NULL;

tek->next = tt;

tek = tt;

l2=l2->next;

}

return new_list;

}

--16.5 Создать хранимую процедуру, которая возвращает список ПО на указанном ПК

--Программа(КодПрограммы,Область,Размер,Носитель,Требования)

--ПК(N_ПК,Процессор,ОЗУ,HDD,CD,Монитор,Назначение)

--ПЗПК(N_записи,Код_ПО,N_ПК)

CREATE PROC PO

@pk varchar(20)

AS

SELECT pr.КодПрограммы,pr.Область,pr.Размер,pr.Носитель,pr.Требования

FROM Программа pr INNER JOIN ПЗПК pz ON pr.КодПрограммы=pz.Код_ПО

INNER JOIN ПК p ON p.N_ПК=pz.N_ПК

WHERE N_ПК=@pk

17.1 Файлы, проецируемые в память.

Для того, чтобы отобразить (спроецировать) файл в память, необходимо:

  1. создать или открыть файл, который необходимо спроецировать в память;

  2. создать объект ядра "проецируемый файл" mapping file;

  3. указать системе, что необходимо сделать: загрузить файл в память целиком или частично.

После того, как завершить работу с файлом, необходимо:

  1. отменить проецирование файла в память (т.е. закрыть объект);

  2. закрыть сам проецируемый файл.

Создание объекта "проецируемый файл".

HANDLE CreateFileMapping( HANDLE hFile,                          LPSECURITY_ATTRIBUTES lpFileMappingAttributes,                          DWORD flProtect,                           DWORD dwMaximumSizeHigh,                           DWORD dwMaximumSizeLow,                           LPCTSTR lpName  );

flProtect - определяет, какой атрибут защиты будет присвоен странице физической памяти, на которую проецируется файл.       PAGE_READONLY - страница только для чтения;       PAGE_READWRITE - страгица допускает как чтение, так и запись;       PAGE_WRITECOPY - при записи на страницу делается копия. Кроме того, через этот аргумент передаются и атрибуты разделов:       SEC_IMAGE - используется, когда проецируемый файл является PE-файлом;       SEC_NOCACHE - указывает на то, что данные кэшироваться не будут.

dwMaximumSizeHigh, dwMaximumSizeLow - определяет максимальный размер в байтах проецируемого файла. lpName - имя объекта "прецируемый файл";

Данная функция возвращает Handle проецируемого файла.

Проецирование данных файла на адресное пространство процесса.

Необходимо, чтобы ОС зарезервировала регион адресного пространства и передала его как физ память. LPVOID MapViewOfFile( HANDLE hFileMappingObject,                      DWORD dwDesiredAccess,                       DWORD dwFileOffsetHigh,                       DWORD dwFileOffsetLow,                      DWORD dwNumberOfBytesToMap );

dwDesiredAccess - флаги желаемого доступа (FILE_MAP_WRITE, FILE_MAP_READ и т.д.) dwFileOffsetHigh, dwFileOffsetLow - указывают системе, какой байт файла необходимо считать первым, т.е. с какого места начать отображение файла. dwNumberOfBytesToMap - количество байт файла, который необходимо спроецировать.

Отмена отображения файла:

BOOL UnmapViewOfFile( LPCVOID lpBaseAddress  );

lpBaseAddress - указатель на базовый адрес отображения файла, для которого необходимо отменить проецирование.