Цикл с постусловием (dowhile)




Цикл с постусловием реализует структурную схему, приведенную на рис. 3.3 (б), и имеет вид:

do оператор while выражение;

Сначала выполняется простой или составной оператор, составляющий тело цикла, а затем вычисляется выражение. Если оно не равно 0 (истинно), тело цикла выполняется еще раз, и так далее, пока выражение не станет равным нулю или в теле цикла не будет выполнен какой-либо оператор передачи управления. Тип выражения должен быть арифметическим или приводимым к нему.

 

do{

cout << "\nКупи слоника! ";

cin >> answer;

}while (answer!= 'y');}

 

Цикл с параметром имеет следующий формат:

for (инициализация; выражение; модификации) оператор;

 

Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой.

Выражение определяет условие выполнения цикла: если оно не равно 0 (истинно), цикл выполняется.

Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую.

Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!). В любой части можно использовать операцию "запятая" (последовательное вычисление), например:

for (int i = 1, s = 0; i<=100; i++)

s += i; // сумма чисел от 1 до 100

 

Процессы в Windows

 

Все программы и действия на компьютере выполняются в определенных процессах. Некоторые приложения используют собственные, некоторые - системные. Задачи одной и той же программы могут выполняться в разных процессах, в зависимости от характера самой задачи. Увидеть весь список запущенных процессов можно, нажав правый клик на панели задач и выбрав "Запустить диспетчер задач" (Вкладка "Процессы")

Поскольку каждый запущенный процесс потребляет определенное количество системных ресурсов, теоретически можно предположить, что чем меньше их работает - тем лучше. На практике все не так просто. Многие процессы по умолчанию стартуют вместе с компьютером независимо от того, будем мы их использовать, или нет. Это сделано разработчиками операционной системы для того, чтоб улучшить стабильность ее работы на большинстве пользовательских компьютеров (Предугадать предпочтения и характер использования ПК каждым пользователем - невозможно). Работа многих процессов критически необходима для нормального функционирования ОС.

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

 

2. Задача. Сформировать новый массив B, включив в него все положительные элементы исходного массива A, и вывести его на экран.

 

#include <iostream>

#include <stdio.h>

const int N=10;

 

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

 

int i, A[N]={1,7,8,-9,6,8,5,3,-2,5},B[N], count = 0;

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

if (A[i]>0) {

B[count]=A[i];

count ++; }

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

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

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

return 0;}

 

Билет № 6

Объектно-ориентированное программирование

 

Свойства ООП

Основными свойствами ООП являются инкапсуляция, наследование и полиморфизм. Ниже кратко поясняется их смысл, а полное представление о них можно получить после изучения этой и следующей лекций.

Объединение данных с функциями их обработки в сочетании со скрытием ненужной для использования этих данных информации называется инкапсуляцией (encapsulation). Инкапсуляция повышает степень абстракции программы: данные класса и реализация его функций находятся ниже уровня абстракции, и при написании программы информация о них не нужна. Кроме того, инкапсуляция позволяет изменить реализацию класса без модификации основной части программы, если интерфейс остался прежним (например, при необходимости сменить способ хранения данных с массива на стек).

Инкапсуляция позволяет использовать класс в другом окружении и быть уверенным, что класс не испортит не принадлежащие ему области памяти, а также создавать библиотеки классов для применения во многих программах.

Наследование - возможность создания иерархии классов, когда потомки наследуют все свойства своих предков, могут их изменять и добавлять новые. Свойства при наследовании повторно не описываются, что сокращает объем программы. Выделение общих черт различных классов в один класс-предок является мощным механизмом абстракции - ведь и любая наука начинается с абстрагирования и классификации, которые помогают справиться со сложностью рассматриваемой предметной области.

Иерархия классов представляется в виде древовидной структуры, в которой более общие классы располагаются ближе к корню, а более специализированные - на ветвях и листьях. В С++ каждый класс может иметь сколько угодно потомков и предков. Иногда предки называются надклассами или суперклассами, а потомки - подклассами или субклассами.

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

Понятие полиморфизма используется в С++ весьма широко. Простым примером полиморфизма может служить перегрузка функций, когда из нескольких вариантов выбирается наиболее подходящая функция по соответствию ее прототипа передаваемым параметрам. Другой пример - использование шаблонов функций, когда один и тот же код видоизменяется в соответствии с типом, переданным в качестве параметра. Чаще всего понятие полиморфизма связывают с механизмом виртуальных методов.

Использование при программировании понятий, более близких к предметной области, благодаря представлению программы в терминах поведения объектов является большим преимуществом ООП. Однако проектирование такой программы представляет собой весьма сложную задачу, поскольку в процесс добавляется еще один важный этап - разработка иерархии классов.

Плохо спроектированная иерархия приводит к созданию сложных и запутанных программ. Важно до начала проектирования правильно определить, требуется ли вообще применять объектно-ориентированный подход. Если в иерархии классов нет необходимости, то, как правило, достаточно ограничиться модульной технологией.

 

 

Критические секции

 

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

// инициализация критической секции

VOIDInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); // вход в критическую секцию

VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

// попыткавойтивкритическуюсекцию

BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

// выходизкритическойсекции

VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

// разрушениеобъектакритическаясекция

VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

Каждая из этих функций имеет единственный параметр, указатель на объект типа CRIТ 1CAL_SЕС ТION. Все ЭТИ фуНКЦИИ, за исключением TryEnterCriticalSection, не возвращают значения. Функция TryEnterCriticalSectionвозвращает ненулевое значение, если поток вошел в критическую секцию или уже на­ходится в ней, в противном случае функция возвращает значение false. Отметим также, ЧТО функция TryEnterCriticalSectionподдерживается только операционной системой Windows2000.

 

Пример работы несинхронизированных потоков

#include<windows.h>

#include <iostream.h>

DWORD WINAPI thread(LPVOID)

{

int i,j;

for (j = 0; j < 10; ++j)

{

// выводимстрокучиселj for (i = 0; i < 10; ++i)

{

cout «j «' ' «flush;

Sleep(17);

}

cout «endl;

return 0;

}

int main()

{

int i, j;

HANDLE hThread;

DWORD IDThread;

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

for (j = 10; j < 20; ++j)

{

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

{

// выводим строку чисел jcout«j«' ' «flush;

Sleep(17);

}

cout«endl;

}

// ждем, пока поток threadзакончит свою работу WaitForSingleObject(hThread, INFINITE);

return 0;

}

 



Поделиться:




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

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


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