Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie(1 семестр).docx
Скачиваний:
31
Добавлен:
15.05.2015
Размер:
163.75 Кб
Скачать
  1. Последовательный поиск заданного элемента в массиве

  • Заключается в поочередном сравнивании элементов массива с заданным элементом, при нахождении подходящего элемента поиск прекращается.

  • Бинарный поиск

    • Если массив a упорядочен, то можно использовать более эффективный алгоритм поиска, например бинарный (метод деления пополам), обозначим через l левую границу поиска, через r-правую, через Sr индекс центрального элемента. Сравним k(заданный эл-т) с центральным элементом массива, если совпдают, то поиск завершён, если k>Sr, то берем диапазон поиска от Sr+1 до r, если k<Sr, то от l до Sr-1. Процесс повторяется до тех пор, пока не найдётся нужный элемент или диапазон не будет исчерпан

  • Сортировка одномерных массивов

    • Сортировка-размещение данных в порядке убывания или возрастания.

    • Метод выбора:

    Алгоритм состоит в следующем. Среди элементов массива выбирается

    наименьший и меняется местами с первым. Далее рассматриваются

    элементы, начиная со второго, и наименьший из них меняется местами со

    вторым элементом. Так продолжается N-1 раз. При последнем проходе

    цикла при необходимости меняются местами предпоследний и последний

    элементы массива.

    • Метод пузырька

    Метод «пузырька» (или метод простого обмена) заключается в

    сравнении пары соседних элементов и замене их местами, если первый

    оказался больше второго. После этого сравнивается следующая пара и т.д.

    При выполнении этой последовательности действий элементы с большими

    значениями будут продвигаться (“всплывать” как пузырьки) в конец массива.

    • Метод простых вставок

    Пусть существующие m из N элементов массива уже упорядочены, т.е.

    mas*0+ ≤ mas*1+ ≤ … ≤ mas[m-1],

    а элементы mas[m], mas[m+1+, …, mas[N-1+ не известны. Метод сортировки

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

    после вставки каждого нового элемента сохранилась его упорядоченность.

    Для этого осуществляется поиск подходящего для вставки места в уже

    заполненной части массива. Место для нового элемента освобождается

    путем сдвига больших элементов к концу массива.

    • Описания методов взято из методички, на лекции она оттуда же давала описание

  • Многомерные массивы. Атрибуты, объявление, инициализация.

    Двумерный массив соответствует математическому понятию прямоугольной матрицы.

    • В С++ двумерные массивы распологаются по строкам в памяти

    • Обьявление: тип идентификатор[размер1] [размер2]

    • Инициализация осуществляется по строкам, например int a[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

    1,2,3,4,5 -1 строка

    6,7,8,9,10 -2 строка

    11,12,13,14,15 -3 строка

    1. Обращение к элементам многомерного массива

    • Обращение: имя массива[индекс строки эл-та][индекс столбца эл-та]

  • Ввод-вывод элементов двумерного массива

    • Ввод элементов двумерного массива осуществляется с помощью вложенного цикла, где параметр внешнего цикла определяет индекс строки(столбца), а параметр внутреннего цикла определяет индекс столбца(строки)

  • Примеры обработки двумерных массивов

    • Вычисление суммы определённых элементов в матрице

  • Указатели и операции с адресами

    • Указатели-переменные, содержащие адреса других переменных. int *y

    • Т.к указатель-адрес переменной, то через него можно обращаться к этому объекту. &-унарная операция y=&x, операцию & можно применить только к переменным и элементам массива

    • * воспринимает свой операнд как адрес некоторого объекта и использует этот адрес для выборки содержимого z=*y , z-значение переменной, записанной по адресу y.

    • Указатели могут встречаться в выражениях, также их можно использовать как операнды в арифметических операциях, если y-указатель, то у—уменьшает его значение.

    • у-- -предыдущее значение, у++ -последующее, *y+m на m значений вперед, где m-целое число

    • Транслятор масштабирует приращение адреса в соответствии с типом в объявлении

  • Связь между указателями и массивами

    • Любое действие с массивами можно выполнять через указатели

    int a[10];

    int *y;

    y=&a[0];

    y+1-адрес последующего элемента

    у-1-адрес предыдущего

    y=&a[0] == y=a

    • *(a+i)-обращение к элементу массива

    • Указатель-это переменная, имя массива-константа, поэтому а=у, а++, z=&a использовать нельзя

    • Сравнивать указатели на разные массивы нельзя

    • Указатели на элементы одного массива можно вычитать, поолучится число элементов между объектами.

    • Можно осуществлять ввод-вывод с помощью указателей.

    • В С++ допускаются массивы-указатели char *b[5]; занимает на 1 байт больше памяти, внутри строки должно стоять “\” перед кавычками.

    • Имя двумерного массива является указателем на первую строку **a==a[0][0]

    • Обращение к элементу двумерного массива *(*(a+i)+j)==a[i][j]

  • Динамические массивы, оператор new

    • Динамический массив-массив, число элементов которого неизвестно изначально.

    • Память под динамические массивы выделяется с помощью оператора new(либо функции malloc)

    int n=10;

    int *a=new int[n];

    • double *b=(double*) malloc (n*sizof(double));

    • Под динамический массив выделяется столько памяти, сколько нужно для хранения величины типа int, величина n может быть переменной

    • Область действия динамического массива зависит от места описания указателя через который производится работа с массивами

    • Локальная переменная при выходе из блока теряется

    • Если переменная-указатель, то при выходе из блока, динамическая память перестаёт быть доступна, однако она не помечается, как свободная и не может быть использована в дальнейшем, это называется утечкой памяти и является распространённой ошибкой.

    • Ф-я malloc унаследована из библиотеки С, желательно использовать new

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

    int n;

    const int m=5;

    cin>>n;

    int (*a)[m]=mew int [n][m];

    int **b=(int**) new int [n][m];

    • Для того, чтобы понять почему динамические массивы объявляются именно так, нужно разобраться в индексации: поскольку для доступа к элементу массива применяются 2 операции разадресации, переменная в которой хранится адрес начала массива должна быть указателем к указателю.

    • Более универсальный способ:

    int nrow,ncol;

    cout<<”Введите n, m”<<endl;

    cin>>nrow>>ncol;

    int **a=new int *[nrow]; //1

    for (int i=0; i<nrow; i++) //2

    a[i]=new int [ncol]; //3

    В 1 объявляется переменная типа указатель на указатель на int и выделяется память под массив указателей на строки массива

    В 2 организуется цикл для выделения памяти под каждую строку массива

    В 3 каждому элементу массива указателя на строки присваивается адрес начала участка памяти, выделенной под строку двумерного массива

    • Схема динамической области памяти, выделяемой под массивы:

    int **a

    int *a [nrow];