Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инфрм отв.rtf
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
11.08 Mб
Скачать

2. Поиск минимального и максимального элементов в массиве

Задача поиска минимального и максимального элементов в неупорядоченном массиве является одной из самых распространенных задач, возникающей при работе с массивами. Для ее решения используется стандартный алгоритм, состоящий из следующих шагов (для случая поиска минимального элемента):

  1. Выбираем в качестве минимального значения первый элемент массива (min := V[1];)

  2. Сравниваем значение переменной min со вторым элементом массива. Если оказывается, что V[2] меньше чем min, т.е. если выполняется условие (V[2]<min), тогда в качестве min берем значение V[2]. В противном случае, значение переменной min оставляем без изменения.

  3. Циклически повторяем действия п.2 для третьего, четвертого и т.д. элементов. По завершению цикла переменная min будет содержать минимальный элемент массива.

Аналогично осуществляется поиск максимального элемента.

PROGRAM Min_Max; VAR    V : array [1..5] of Integer;   i, min, max : Integer; BEGIN   ...    ввод элементов массива V;   ...   min := V[1];   max := V[1];   FOR i:=2 TO 5 DO begin     IF V[i] < min THEN min := V[i];     IF V[i] > max THEN max := V[i];   end;   Writeln(‘min: ’, min);   Writeln(‘max: ’, max) END.

 

40) Индексирование

Чтобы задать смысл индексов для объектов класса используется функция operator[]. Второй параметр (индекс) функции operator[] может быть любого типа. Это позволяет определять ассоциативные массивы и т.п. В качестве примера давайте перепишем пример из #2.3.10, где при написании небольшой программы для подсчета числа вхождений слов в файле применялся ассоциативный массив. Там использовалась функция. Здесь определяется надлежащий тип ассоциативного массива:

struct pair {

char* name;

int val;

};

class assoc {

pair* vec;

int max;

int free;

public:

assoc(int);

int& operator[](char*);

void print_all();

};

В assoc хранится вектор пар pair длины max. Индекс первого неиспользованного элемента вектора находится в free. Конструктор выглядит так:

assoc::assoc(int s)

{

max = (s<16) ? s : 16;

free = 0;

vec = new pair[max];

}

При реализации применяется все тот же простой и неэффективный метод поиска, что использовался в#2.3.10. Однако при переполнении assoc увеличивается:

#include

int assoc::operator[](char* p)

/*

работа с множеством пар "pair":

поиск p,

возврат ссылки на целую часть его "pair"

делает новую "pair", если p не встречалось

*/

{

register pair* pp;

for (pp=&vec[free-1]; vec<=pp; pp--)

if (strcmp(p,pp->name)==0) return pp->val;

if (free==max) { // переполнение: вектор увеличивается

pair* nvec = new pair[max*2];

for ( int i=0; iname = new char[strlen(p)+1];

strcpy(pp->name,p);

pp->val = 0; // начальное значение: 0

return pp->val;

}

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

vouid assoc::print_all()

{

for (int i = 0; i>buf) vec[buf]++;

vec.print_all();

}