Задача. Отсортировать массив методом выбора минимального элемента



#include <iostream>

#include <stdio.h>

 

const int N = 10;

 

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

     

int i, j, nMin, A[N]={1,3,5,7,4,6,9,8,2}, c;

printf("\n unsorted array:\n");

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

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

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

{

nMin = i;

  for ( j = i+1; j < N; j ++ )

  if ( A[j] < A[nMin] )

nMin = j;

if ( nMin != i )

   {

c = A[i]; A[i] = A[nMin];

       A[nMin] = c;

   }

}

printf("\n sorted array:\n");

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

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

return 0;

}

 

Билет № 12

Абстрактные классы

 

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

Абстрактной виртуальной называется функция, объявленная в базовом классе каквиртуальная, но не содержащая описания выполняемых действий. Для объявленияабстрактной виртуальной функции используется следующая форма:

virtual<Тип><Имя_функции>(<Список параметров>) =0;

Здесь присваивание нулю – признак абстрактной виртуальной функции. При этомпроизводный класс должен определить свою собственную версию функции, так как вбазовом классе не существует версии, которую можно было бы использовать впроизводном.

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

Создание объектов абстрактного класса запрещено. Однако можно создаватьуказатели на объект абстрактного базового класса и ссылки того же типа и применять ихдля реализации механизма полиморфизма.

Пример иерархии с абстрактным классом

Класс TPole – общий базовый, его существование позволит нам объявить массивуказателей на объекты этого класса. Сами объекты создавать не будем: в процессе работыв этот массив будут помещены указатели на объекты класса Число или на объекты классаСтрока.

Для вывода на экран содержимого хранимых объектов в программе должен бытьорганизован цикл, в котором для каждого объекта вызывается метод Print(). При этомвызов метода происходит через указатель на объекты базового класса. Если бы такойметод в базовом классе отсутсвовал, то для вызова этого метода объектами производныхклассов тип указателя пришлось бы явно переопределять. Это связано с тем, что указательна объекты базового класса «не видит» полей и методов, появившихся впереопределенном классе. При наличии абстрактного метода Print() в базовом классеэтой проблемы не возникает.

Естественно в базовом класса метод Print() объявляется виртуальнымабстрактным, поскольку в объектах базового класса на экран выводить нечего.

Соответственно и класс Tpole получается абстрактным.

#include <locale.h>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

class Tpole // абстрактный класс Поле

{

public: Tpole() {}

virtual void Print(void)=0; // абстрактная функция

};

class Tnumpole:public Tpole // класс Число

{

private: int num;

public:

Tnumpole(int n):num(n){}

voidPrint(void) /* аспект виртуальной функции*/

{ printf("Число = %5d\n",num); }

};

class Tstrpole:public Tpole // класс Строка

{

private: char str[10];

public :

Tstrpole(char *st) { strcpy(str,st); }

voidPrint(void) /* аспект виртуальной функции*/

{ printf("Строка = %s\n",str); }

};

void main()

{

setlocale(0,"russian"); int n,i; char st[80];

Tpole *a[10]; // массив указателей на объекты класса Tpole

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

{

printf("\nВведите целое число или строку: ");

scanf_s("%s",st,80);

if ((n=atoi(st))!=0||(strlen(st)==1 && st[0]=='0'))

a[i]=new Tnumpole(n); // Число

else

a[i]=new Tstrpole(st); // Строка

}

for(i=0;i<10;i++) a[i]->Print();

for(i=0;i<10;i++) delete a[i];

_getch();

}

 

Исключения и их обработчики

 

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

В операционных системах Windowsдля этой цели предназначен механизм структурной обработки исключений(structuredexceptionhandling, SEH). Смысл механизма структурной обработки исключений заключается в следующем. В программе выделяется блок программного кода, в котором может прои­зойти исключение. Такой блок кода называется фреймом, а сам код называ­ется охраняемым кодом. Затем, после фрейма вставляется программный блок, который обрабатывает происшедшее исключение. Этот блок называется обработчиком исключения. После обработки исключения управление передает­ся первой инструкции, следующей за обработчиком исключения.

Очевидно, что для того чтобы использовать этот механизм в программе, в язык программирования C++ нужно ввести новые ключевые слова. Такими ключевыми словами являются tryи except, которые расширяют спи­сок стандартных ключевых слов языка программирования C++ и различа­ются только компилятором фирмы Microsoft. Ключевое слово tryотмечает

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

 

{

// охраняемый код

}

except(выражение-фильтр)

{

// код обработки исключения

}

 

 

Обработка исключения

# include<windows.h>

#include <iostream.h>

 

{

intа = 10;

int*р = NULL; // пустой указатель на целое число

—tin/

{

cout« "а = " « *р « endl; // ошибка, так как р = NULL

}

except(EXCEPTION_EXECUTE_HANDLER)

{

cout « "There was some exception." « endl;

p = &a;

}

cout « "a = " « *p « endl; // нормально

return 0;

}

 


Дата добавления: 2018-02-28; просмотров: 528; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!