Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vopr_1.doc
Скачиваний:
2
Добавлен:
26.09.2019
Размер:
151.04 Кб
Скачать
  1. Определение и вызов функций. Передача массивов и указателей на функции.

  1. Бинарный поиск в упорядоченном массиве.

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

Метод (алгоритм) бинарного поиска реализуется следующим образом:

1. Сначала образец сравнивается со средним (по номеру) элементом массива (рис. 5.10, а).

  • Если образец равен среднему элементу, то задача решена.

  • Если образец больше среднего элемента, то это значит, что искомый элемент расположен ниже среднего элемента (между элементами с номерами sred+1 и niz), и за новое значение verb принимается sred+i, а значение niz не меняется (рис. 5.10, б).

  • Если образец меньше среднего элемента, то это значит, что искомый элемент расположен выше среднего элемента (между элементами с номерами verh и sred-1), и за новое значение niz принимается sred-1, а значение verh не меняется (рис. 5.10, в).

а b

c

  1. Сортировка массива на примере одного из алгоритмов.

Здесь я так понимаю можно рассказать про сортировку по порядку, ну хули ниже код , компилируем и разбираемся что да как.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void main()

{

int k; // koli4estvo chifr

int a[100]; //massiv

int i; // indeks massiva

int p;

int min=a[0]; //min zna4

int max=a[0]; //max zna4

int t;

clrscr();

printf("\n vvedite kolichestvo chifr v massive \n");

scanf("%d", &k);

printf("vvedite chisla massiva \n");

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

{

scanf("%d", &a[i]);

}

printf(" massiv: ");

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

{

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

}

printf("\nchisla massiva poporyadku: ");

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

for(p=1;p<k;p++)

if(a[p-1]>a[p])

{

t=a[p-1];

a[p-1]=a[p];

a[p]=t;

}

for(t=0;t<k;t++)

{

printf("%d,",a[t]);

}

getch();

}

  1. Связанные списки: описание структуры, добавление и удаление элементов в односвязный линейный список.

  1. Виды линейных списков: стек, очередь, дек.

Линейные списки – структуры данных, в которых элементы (переменные) следуют друг за другом, и каждому можно поставить в соответствие порядковый номер.

Стек – это линейный список, в котором все операции вставки и удаления( и как правило операции доступа к данным) выполняются только на одном конце списка.

Очередь (или односторонняя очередь) – это линейный список, в котором все операции вставки выполняются на одном из концов списка, а все операции удаления(и как правило операции доступа к данным) – на другом.

Дек (или двусторонняя очередь) – это линейный список, в котором все операции вставки и удаления (и как правило операции доступа к данным) выполняются на обоих концах списка.

  1. Описание структуры на языке C++. Определение переменных структурного типа. Способы доступа к элементам структур.

  2. Описание объединения на языке C++. Определение переменных типа «объединение». Способы доступа к элементам объединений.

  3. Сущность методологии объектно-ориентированного программирования. Инкапсуляция. Наследование. Полиморфизм.

  4. Определение класса на языке C++. Ограничение доступа к членам класса.

  5. Дружественные функции класса.

  6. Определение конструктора. Форматы вызова конструктора. Перегрузка конструкторов.

  7. Наследование. Определение базового и производного классов.

  1. Полиморфизм. Виртуальные функции.

Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).

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

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

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

Виртуальные функции.

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

class Base

{

public:

virtual void Method ()

{

cout << "Базовый класс\n";

}

};

Вносить изменения в производные классы не нужно. Хотя можно и там добавить ключевое слово virtual (это не обязательно). Теперь посмотрим на наш код:

Base* b = new Derived;

Derived* d = new Derived;

b->Method();

d->Method();

//-------- Вывод:

Производный класс

Производный класс

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

BaseMonster* monsters[3];

monsters[0] = new MonsterA;

monsters[1] = new MonsterB;

monsters[2] = new MonsterC;

for (int i=0;i<3;++i)

monsters[i]->attack();

Несколько замечаний по виртуальным функциям:

  1. Виртуальные функции используются только в классах. Поэтому часто используется название - виртуальные методы.

  2. В массивах указателей на базовый класс можно хранить объекты только полиморфных типов (базовый и все производные).

  3. В массив нужно объединять только те объекты, которые обладают методами с одинаковыми названиями, но разной реализацией

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]