Задача. Произвести инверсию (перестановка наоборот) массива




#include <iostream>

#include <time.h>

#include <stdlib.h>

 

const int N = 10;

 

int main(int argc, char** argv) {

srand(time(0));

int i, A[N], c;

for (i = 0; i < N; i ++){

 

A[i] = rand()%100;

printf("%d ", A[i]);

}

printf("\n ");

for (i = 0; i < N/2; i ++)

{

c = A[i];

A[i] = A[N-1-i];

A[N-1-i] = c;

}

printf("\n Result:\n");

for (i = 0; i <N; i ++)

printf("%d ", A[i]);

 

return 0;

}

 

Билет № 9

Простое наследование

Наследованием называют конструирование новых более сложных производных классов (классов-потомков) из уже имеющихся базовых классов (классов-родителей)посредством добавления полей и методов. Это – эффективное средство расширенияфункциональных возможностей существующих классов без их перепрограммирования иповторной компиляции существующих программ.

По определению компонентами производного класса являются:

· компоненты базового класса, за исключением конструктора, деструктора икомпонентной функции, переопределяющей операцию «присваивания» (=);

· компоненты, добавляемые в теле производного класса.

В функциональном смысле производные классы являются более мощными поотношению к базовым классам, так как, включая поля и методы базового класса, ониобладают еще и своими компонентами.

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

class<Имя производного класса >:

<Вид наследования><Имя базового класса>{<Тело класса>};

Где вид наследования определяется ключевыми словами: private, protected,

Public.

Видимость полей и функций базового класса из производного определяется секцией,в которой находится объявление компонента и видом наследования.Если вид наследования явно не указан, то по умолчанию принимается private.

Однако хороший стиль программирования требует, чтобы в любом случае виднаследования был задан явно.

самым простым является наследование вида public(общедоступное), однако при его применении следует помнить, что скрытые в секцииprivate компоненты базового класса в производном все равно недоступны.Соттветственно для обращения к скрытым полям базового класса должны использоватьсяметоды общедоступной или защищенных секций базового класса, например:

Class A

{

int x;

public:

void set_a(int ax){x=ax;}

print_a(){cout<<x;}

};

class B:public A

{

int y;

public:

void set_b(int ax,int bx)

{

set_a(ax); // доступ к скрытому полю x

b=bx;

}

print_b()

{

print_a(); // доступ к скрытому полю x

cout<<y;

}

};

 

События

 

Событием называется оповещение о некотором выполненном действии. В программировании события используются для оповещения одного потока о том, что другой поток выполнил некоторое действие. Сама же задача опо­вещения одного потока о некотором действии, которое совершил другой поток, называется задачей условной синхронизации или иногда задачей опове­щения. В операционных системах Windowsсобытия описываются объектами ядра Events. При этом различают два типа событий:

□ события с ручным сбросом;

□ события с автоматическим сбросом.

Различие между этими типами событий заключается в том, что событие с ручным сбросом можно перевести в несигнальное состояние только по­средством вызова функции ResetEvent, а событие с автоматическим сбро­сом переходит в несигнальное состояние как при помощи функции ResetEvent, так и при помощи функции ожидания. При этом отметим, что если события с автоматическим сбросом ждут несколько потоков, используя функцию WaitForSingleObject, то из состояния ожидания освобождается только один из этих потоков.

Создаются события вызовом функции CreateEvent, которая имеет следую­щий прототип:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES IpSecurityAttributes, // атрибуты защиты

BOOL bManualReset, // типсобытия

BOOL blnitialState, // начальноесостояние события

LPCTSTR lpName // имя события

);

 

Синхронизации потоков при помощи событий с автоматическим! сбросом

#include <windows.h>

#include <iostream.h>

HANDLE hOutEvent, hAddEvent;

DWORD WINAPI thread (LPVOID)

{

for (int i = 0; i < 10; ++i) if (i == 4)

{

SetEvent(hOutEvent);

WaitForSingleObject(hAddEvent, INFINITE);

}

return 0;

}

int main()

{

HANDLE hThread;

DWORD IDThread;

// создаемсобытиясавтоматическимсбросомhOutEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hOutEvent == NULL) return GetLastError(); hAddEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hAddEvent == NULL) return GetLastError();

// создаемпотокthread

hThread = CreateThread(NULL, 0, thread, NULL, 0, &IDThread); if (hThread == NULL) return GetLastError();

// ждем, покапотокthread выполнитполовинуработыWaitForSingleObject(hOutEvent, INFINITE);

// выводимзначениепеременнойcout «"A half of the work is done." «endl; cout «"Press any key to continue." «endl; cin.get();

// разрешаем дальше работать потоку threadSetEvent (hAddEvent);

WaitForsingieObject(hThread, INFINITE);

CloseHandle(hThread);

CloseHandle(hOutEvent);

CloseHandle(hAddEvent);

cout «"The work is done." «endl;

return 0;

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: