#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;
}