Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcija-12.pdf
Скачиваний:
26
Добавлен:
10.02.2016
Размер:
367.6 Кб
Скачать

return 0;

}

void Vvod (int *mas, int kol_а) {cout << " a:? ";

for(int j=0; j<kol_а; j++)

cin >> mas[j];

}

void Vyvod (int mas[], int kol_а) //функция вывода элементов

{int j;

for(j=0; j<kol_а; j++)

cout << setw(4) << mas[j]; }if ( !((j+1)% 5) ) cout << endl;

Пример нахождения среднего значения элементов динамического массива

#include <stdlib.h>

 

 

int mean (int array [], int n);

 

int main ()

int[10];

 

{static int *aptr= new

 

//создание массива

 

 

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

// или

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

cin >> aptr[i++];

int d=mean(aptr, 10);

//вызов функции

cout << d;

 

 

delete [ ] aptr; _getch();

return 0;

}

int mean (int array [], int n) {int index;

long sum; if (n>0)

{for (index=0, sum=0; index<n; index++) sum +=array[index];

return (int (sum/n));

}

else {cout << "not\n"; _getch();

return 0;

}

}

Перегрузка функций при работе с массивами

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

Первый раз – для целых параметров, второй – для вещественных.

int adder ( int [ ]); double adder ( double [ ]); int main()

{int iarray [ 7 ] = {5, 1, 6, 20, 15, 0, 12};

double darray [ 7] = {5.5, 1.6, 6.7, 20.2, 15.0, 0.2, 12.0}; double dsum;

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

16

int isum;

//выбор версии функции

isum= adder (iarray);

dsum= adder (darray);

//на основании типа аргументов

cout << "isum=" << isum <<

endl;

cout << "dsum=" << dsum <<

endl;

_getch();

 

return 0;

 

}

 

int adder (int iarray[ ])

 

{int i;

 

int ipartial;

 

ipartial = iarray[0];

 

for (i=1; i<7; i++)

 

ipartial +=iarray [ i ];

return (ipartial);

 

}

 

double adder (double darray[ ])

{int i;

 

double dpartial;

 

dpartial = darray[0];

 

for (i=1; i<7; i++)

 

dpartial +=darray [ i ];

return (dpartial);

 

}

 

Результаты работы:

 

isum=59

 

dsum=61.2

 

Шаблоны функций при работе с массивами

1. Определим шаблон функций для поиска в массиве максимального значения, причем функция определяет (возвращает) ссылку на элемент с максимальным значением:

#include <iomanip>

template <class type>

//прототип шаблона

type& rmax

(type d[ ], int n);

int main()

n=4;

 

{const int

 

static int xi[n ]= {10, 20, 30, 14};

cout << "\n rmax(xi, n)=" << rmax(xi, n) << endl;

rmax(xi,

n) =0; //обнуление макс. элемента

 

for (int

i=0; i<n; i++)

 

setw(3) << xi[i];

cout << setw(5) << "xi[" << i << "]=" <<

static float xf[3 ] = {10.3f, 20.4f, 10.5f};

 

cout << "\n rmax(xf, 3)=" << rmax(xf, 3) << endl;

rmax(xf,

3) =0;

// обнуление макс. элемента

 

for (int

i=0; i<3; i++)

 

 

cout

<< setw(5) << "xf[" << i << "]=" << setw(3)<< xf[i];

cout << endl;

 

 

 

_getch();

 

 

 

return 0

;

 

 

 

}

 

 

 

 

template <class type>

//определение шаблона

type& rmax (type d[ ], int n)

{int im=0

;

 

 

 

for (int

i=0; i<n; i++)

 

 

im =

d[im] > d[i] ? im : i;

 

 

return d[im];

 

 

17

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

 

}

2. Шаблон семейства функций для поиска в массиве заданного значения,

причем функция определяет (возвращает) индекс найденного элемента или -1, если элемент не найден:

template <class type>

int find(type* array, type value, int size);

char chrArr[] =

{1, 3, 5, 9, 11, 13};

// глобальный массив

char ch =

5;

 

//значение для поиска

int intArr[] =

{1, 3, 5, 9, 11, 13};

//глобальный массив

int in

= 6;

 

//значение для поиска

long lonArr[] =

{1L, 3L, 5L, 9L, 11L, 13L};

 

//глобальный массив

long lo =

11L;

 

 

//значение для поиска

double

dubArr[] = {1.0, 3.0, 5.0, 9.0, 11.0, 13.0};

//глобальный массив

double

db

= 4.0;

 

 

//значение для поиска

int main()

{

cout << "\n 5 in chrArray: index=" << find(chrArr, ch, 6); cout << "\n 6 in intArray: index=" << find(intArr, in, 6);

cout << "\n11 in lonArray: index=" << find(lonArr, lo, 6); cout << "\n 4 in dubArray: index=" << find(dubArr, db, 6); cout << endl;

_getch(); return 0;

}

template <class type>

int find(type* array, type value, int size)

{

for(int j=0; j<size; j++) if(array[j]==value)

return j;

return -1;

}

Результаты работы программы:

5 in chrArray: index=2

6 in intArray: index=-1

11 in lonArray: index=4

4 in dubArray: index=-1

3. Специализация шаблона функций для вычисления суммы элементов сегмента массива любого типа

// шаблон семейства функций

template < int N, typename T>

T sum (T ar[], int len=1) {

//функция вычисляет сумму элементов сегмента массива

…..

//любого типа

}

 

//явная специализация шаблонной функции

 

template < >

 

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

18

char sum <0, char>(char ar[], int len) {

//функция вычисляет сумму элементов сегмента массива

…..

// типа char

}

Такому определению шаблонной функции соответствует обращение sum <0, char>(mas, 8);

Поиск в массиве

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

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

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

Принцип двоичного поиска. Исходный массив делится пополам и для сравнения выбирается средний элемент. Если он совпадает с искомым, то поиск заканчивается. Если же средний элемент меньше искомого, то все элементы левее его также будут меньше искомого. Следовательно, их можно исключить из зоны дальнейшего поиска, оставив только правую часть массива. Аналогично, если средний элемент больше искомого, то отбрасывается правая часть, а остается левая. На втором этапе выполняются аналогичные действия над оставшейся половиной массива. В результате после второго этапа остается¼ часть массива. И так далее, пока или элемент будет найден, или длина зоны поиска станет равной нулю. В последнем случае искомый элемент найден не будет.

Алгоритм:

1.Положить left=0, right=n;

2.Пока left < right выполнять:

найти индекс среднего элемента в массиве mid = (left+right)/2;

если для элемента массива с индексом mid значение ключа > искомого, положить right =mid-1, иначе если значение ключа < искомого, положить left = mid+1, иначе выйти из цикла (элемент с индексом mid найден);

3.Если значение ключа элемента с индексом mid совпадает с заданным, поиск успешен, иначе – искомого элемента в массиве нет.

Программа:

#include <stdlib.h> #include <iomanip>

#include <stdlib.h>

int poisk(int *mas, int n, int find);

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

19

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