Преобразование элементов массива реферат

Обновлено: 02.07.2024

Познакомить учащихся с преобразованием элементов массива: замена элементов, удовлетворяющих определенному условию, перестановка (обмен местами) двух элементов; формировать умение выполнять преобразование элементов массива

Развивать у учащихся логико-алгоритмическое мышление, умение выделять главное в изученном материале, сравнивать, обобщать

Воспитывать дисциплинированность, собранность, сознательность, ответственность за сохранность школьного имущества

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

Организационный момент (1 - 2 минуты)

Этап повторения изученного материала (5 - 7 минут)

Этап изучения нового материала (15 - 20 минут)

Домашнее задание (1 - 2 минуты)

Закрепление изученного материала (15 минут)

Подведение итогов (2 - 3 минут)

Здороваюсь. Концентрирую внимание учащихся, предлагаю им сесть, проверяю отсутствующих.

Выполняют тестовое задание (до 3 мин.) Правильно выполненный тест оценивается в 3 балла. Одно правильно выполненное задание оценивается в 0,6 балла.

Что называют массивом?

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

Обозначаемая одним именем последовательность однотипных элементов

Диапазон индексов, определяющий максимально возможное количество элементов

Сколько элементов содержится в массиве var c: array [3..10] of integer;

Как правильно сгенерировать целые случайные числа из промежутка [10,25]?

Random ( 10 )+random( 25 )

Из предложенного списка, выберите функцию округления, которая возвращает значения целого типа:

После выполнения программы с использованием функции round () в какой из предложенных массивов могут быть записаны полученные 9 элементов?

C: array [1..9] of integer

C: array [1…9] of integer

C : array [-1. .6 ] of integer

C : array [1. .9 ] of real

C : array [1… 9 ] of real

После выполнения разбираем написанный тест и указываем правильные ответы(3 мин.)

Давайте рассмотрим задачу: Составить программу, которая формирует массив из 15 случайных чисел, принадлежащих промежутку [-8; 16], заменяет положительные числа на 17 и выводит значения элементов массива до и после замены.

Давайте составим код программы этой задачи на доске. С чего начинается любая программа, составленная на языке программирования Pascal ABC ? (с служебного слова program и имени программы). Какие ограничения мы накладываем на имя программы? (не должно начинаться с цифры и должно содержать латинские символы).

Program zamena ;

Далее рассуждаем по условию программы. Что мы делаем следующим шагом? (задаем массив) В каком блоке мы его задаем? (в блоке описания). Как мы его задаем?

Var C : array [1..15] of integer

Так как у нас 15 элементов массива, то что нам еще нужно? (счетчик). Где и как мы ее зададим? (так же в блоке описания)

i : integer ;

Хорошо, что мы делаем дальше? (пишем операторные скобки begin end .) что дальше нам нужно сделать? (заполнить массив случайными числами) С помощью какого цикла мы будем заполнять массив? (с помощью цикла for ). При помощи какой функции мы будем заполнять массив случайными числами? ( random )

For i:=1 to 15 do C[i] := random(25)-8;

Теперь что нам надо сделать? (вывести элементы массива) как мы это будем делать? (при помощи процедуры write (чем отличается write от writeln ? – writeln каждый символ выводит с новой строчки))

For i :=1 to 15 do write ( C [ i ]:4); (означает, что между символами будет отступ на 4 отступа)

Далее мы заменяем положительные числа на 17. Как мы это будем делать? (при помощи оператора if )

If C [ i ]0 then C [ i ]:=17; а теперь выводим полученный массив.

For i:=1 to 15 do write(C[i]:4);

(полный код программы)

Program zamena ;

Var C: array [1..15] of integer

For i:=1 to 15 do C[i] := random(25)-8;

For i:=1 to 15 do write(C[i]:4);

If C[i]0 then C[i]:=17;

For i:=1 to 15 do write(C[i]:4);

Может теперь вы приведете условие задачи с подобной заменой? (приводят примеры)

Аналогичным способом производится замена элементов массива по иным условиям, например:

Замена всех нечетных значений элементов массива квадратами их номеров: if A [ i ] mod 2 = 1 then A [ i ]:= sqr ( i );

Замена всех отрицательных чисел их квадратами, а неотрицательных – значениями квадратного корня: if A [ i ] then A [ i ]:= sqr ( A [ i ]) else A [ i ]:= sqrt ( A [ i ]); но при использовании функции sqrt () какие значения получаются? (вещественные) Какой требуется для них тип массива? (требуется тип массива real ). Что нужно сделать, чтобы можно было использовать тип integer ? (использовать функцию округления round ()).

Элементы массива мы можем не только заменять по определенному условию, но и переставлять. Как вы думаете, как мы будем переставлять (обменивать местами) 1 и 2-й элементы массива? (второму присваиваем значение первого, а первому присваиваем значение второго)

Тут привожу пример по их предложению, и показываю что это не правильно.

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

Рассмотрим нашу задачу, только немного поменяем условие: Составить программу, которая формирует массив из 15 случайных чисел, принадлежащих промежутку [-8; 16], меняет местами 4 и 11 элементы и выводит значения элементов массива на экран до и после обмена.

Что в нашей задаче нужно поменять, чтобы выполнялось новое условие? ( If C [ i ]0 then C [ i ]:=17; заменить на B := C [1]; C [1]:= C [2]; C [2]:= B и добавить в блок описания переменной В: integer ;)

Домашнее задание: задание №3 в тетрадях написать программу (раздаю номера каждому отдельно)

А теперь давайте закрепим изученный нами материал. Я раздаю вам карточки, на которых написаны условия задач. Первую задачу нужно выполнить обязательно. Пока не выполнена первая задача, к следующей переходить нельзя. За полностью правильный выполненный в начале урока тест и правильно выполненную первую задачу вы можете получить 5 баллов, далее, если вы решаете следующую задачу вы можете получить +1,3 балла. В сумме, если вы правильно выполнили тест, и правильно решили задачи вы можете получит 9 баллов за урок. Кто претендует на 10 баллов, должен решить еще и дополнительную задачу.

Наберите программу н компьютере и заполните пропуски ввода и вывода 10 целочисленных элементов массива, заданных случайным образом на промежутке [10;30]:

Var D : array [1..__] of ______________;

for i:=1 to ____ do

D[i]:=random(___)+____;

end __

Составить программу, которая формирует массив из 20 случайных чисел от -15 до 11 и отрицательные числа заменяет на положительные, а из положительных извлекает квадратный корень.

Решение :

var A: array [1..20] of integer;

for i:=1 to 20 do A[i]:=random(27)-15;

for i:=1 to 20 do write(A[i]:7);

for i:=1 to 20 do

for i:=1 to 20 do write(A[i]:7);

Составить программу, которая формирует массив из 16 случайных чисел от -18 до 12 и числа, кратные 3 увеличивает в 2 раза, а остальные возводит в квадрат.

var A: array [1..16] of integer;

for i:=1 to 16 do A[i]:=random(31)-18;

for i:=1 to 16 do write(A[i]:7);

for i:=1 to 16 do

if A[i] mod 3=0 then A[i]:=A[i]*2 else A[i]:=round(sqr(A[i]));

for i:=1 to 16 do write(A[i]:7);

Составить программу, которая формирует массив из 6 случайных чисел от 7 до 32 и меняет местами 2-й и 3-й элементы массива.

Решение :

var A: array [1..6] of integer;

for i:=1 to 6 do write(A[i]:7);

for i:=1 to 6 do write(A[i]:7);

(дополнительная) Составить программу, которая формирует массив из 20 случайных чисел от -100 до 110 и меняет местами 5-й и 19-й элементы массива.

var A: array [1..20] of integer;

for i:=1 to 20 do A[i]:=random(221)-100;

for i:=1 to 20 do write(A[i]:7);

for i:=1 to 20 do write(A[i]:7);

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

2. С какой целью используют дополнительную переменную (буфер) при обмене местами элементов массива? (в буфер помещают значение заменяемого элемента, затем элементу присваивают значение второго(заменяющего его) элемента, которому в свою очередь присваивают значение буфера обмена)

Часто бывает необходимо представить таблицы данных в формате строк и столбцов. Для этого используют многомерные массивы.

Доступ к элементам, например, двухмерного массива (матрицы) осуществляется с помощью двух индексов. Первый индекс отвечает за строку, второй – за столбец: а[1,3],а[0,4] и т.д., например:

Формат описания двумерного массива в разделе объявления переменных:

Var
A : array [1..10, 1..10] of real;

Описывается двухмерный массив вещественных чисел A, который максимально может состоять из 10 строк и 10 столбцов. Нижняя граница индексов по обоим измерениям равна 1, верхняя – 10.

В среде Delphi для ввода и вывода массивов используется компонент StringGrid, поэтому работа с массивами в Delphi сильно отличается от работы в Pascal.

Краткая характеристика компонента StringGrid

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

Свойства компонента StringGrid

В этом свойстве хранятся все элементы таблицы. Имеет тип String.

Задает фиксированное количество столбцов в таблице

Задает фиксированное количество строк в таблице

По умолчанию данные в таблицу вводить нельзя. Чтобы снять это запрет в этом свойстве надо задать True.

Задает общее количество столбцов таблицы

Задает общее количество строк таблицы

Пример использования в программе компонента StringGrid для вывода двумерного массива

Окно формы приложения

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

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

Схема вложенного цикла с параметром

For i := a1 to b1 do
begin . . . . . .
For j := a2 to b2 do
begin
. . . . . .
end;
end;

Цикл, который содержит другой цикл называют внешним циклом, а цикл, содержащийся в теле другого цикла, называют внутренним . Все операторы внутреннего цикла должны полностью располагаться в теле внешнего цикла.

Всякий раз, когда внутренний цикл завершается, внешний цикл увеличивает значение своего счетчика цикла на 1, и внутренний цикл выполняется вновь.

Поэтому, если за счетчик внешнего цикла взять индекс строки, а за счетчик внутреннего – номер столбца, то обработка двухмерного массива будет идти по строкам, а если наоборот, то по столбцам.

Пример. Заполнить двухмерный массив M * N случайными целыми числами из диапазона [-40,40]. Определить:

1. сумму элементов каждой строки;

2. максимальные значения для каждого столбца;

3. произведение элементов k-ой строки, значения которых лежат в диапазоне от 20 до 40.

Окно формы приложения

Преобразование двухмерных массивов

Преобразование матриц заключается, как правило, в изменении порядка следования его элементов без изменения значений самих элементов.

Поворот матрицы на 90 и 180 градусов

Пример. Сформировать массив из M x N элементов. Получить новый массив, повернув исходный на:

2. 90 0 по часовой стрелке;

3. 90 0 против часовой стрелки.

Зеркальное отображение (поворот) массивов относительно горизонтальной и вертикальной осей

Пример. Сформировать массив из M * N элементов. Зеркально отразить (повернуть) его относительно:

1. горизонтальной оси;

2. вертикальной оси.

Дополнительных массивов не создавать.

Важно! В первой задаче поворота массива относительно горизонтальной оси внешний цикл по строкам организуется только до ( n -1) div 2 (горизонтальной оси массива). Во второй задаче поворота массива относительно вертикальной оси внутренний цикл по столбцам организуется только до ( m -1) div 2 (вертикальной оси массива).

Преобразование двухмерного массива в одномерный

Пример. Сформировать массив A, содержащий N строк и M столбцов. Преобразовать его в одномерный массив B.

Существуют два способа решения этой задачи:

1. задать независимый счетчик k для результирующего одномерного массива;

2. вычислять значение очередного элемента массива по формуле B ( M * i + j ) = A ( i , j ).

Фрагменты кодов программы

Типовые задачи с квадратными матрицами

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

Способ отбора нужных элементов для решения такого рода задач заключается в следующем:

для элементов, расположенных на главной диагонали, справедливо i = j ( i – индекс строки, j – индекс столбца), ниже i > j , выше i j .

для элементов, расположенных на побочной диагонали, справедливо i = N - j - 1 (I – индекс строки, j – индекс столбца), ниже i > N - j -1, выше i N - j – 1 (индексы элементов начинаются с 0!).

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

Пример Заполнить двухмерный массив N * N случайными целыми числами из диапазона [-40,40]. Определить:

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

2. произведение элементов, расположенных выше побочной диагонали;

3. среднее арифметическое элементов, расположенных ниже главной диагонали.

Окно формы приложения

Пример. Сформировать массив из N * N элементов. Зеркально отразить (повернуть) его относительно:

Важно! При решении задачи внешний и внутренний циклы организуются так, чтобы проход элементов осуществлялся только до нужной диагонали (до i-1 при повороте относительно главной диагонали и n - i -1 при повороте относительно побочной), иначе, смена произойдет дважды и все останется на своих местах.

Фрагменты кодов программы

Похожие страницы:

Технологии и методы программирования. Конспект лекций

. Понятия технологии программирования 1.1. Термин технологии программирования Термин «техноло́ . может выступать имя переменной, массива, структуры, строкового литерала). . */ Преобразования типов: преобразования по умолчанию, явные преобразования При выполнении .

Язык СИ++ Учебное пособие

. данных и обеспечить объектно-ориентированное программирование. Настоящая работа посвящена синтаксису . фигурных скобках при определении массива. В массиве IN шесть элементов, но . функции qsort (). Необходимые преобразования для наглядности выполнены в .

Основные принципы работы с статическими структурами данных, реализованными в языке Delphi

. языках программирования соответствуют . массивы разделяются на одномерные массивы (векторы), двухмерные (матрицы) и многомерные (трех-, четырехмерные и т.д.); по типу элементов массивы . Получится Hariends Str(X[:W[:D]],S); Преобразование численного значения в .

Типы и структуры данных

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

Среди задач преобразования элементов массива можно выделить задачи следующих типов:

1. Изменение элементов массива в зависимости от условий.
2. Обмен местами элементов в массиве.
3. Удаление элемента из массива.
4. Вставка элемента в массив.

Некоторые из задач преобразования массивов встречаются очень часто. Поэтому в класс vector были добавлены функции, позволяющие преобразовывать массивы.

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

14.2. Изменение элементов массива в зависимости от условий

Пример 14.1. Задан одномерный массив целых чисел. Преобразовать его элементы по следующему правилу: положительные элементы заменить значением 2, а отрицательные — увеличить на 5.

Этапы выполнения задания

I. Исходные данные: одномерный массив а , количество элементов n .

II. Результат: преобразованный массив a .

III. Алгоритм решения задачи.

using namespace std ;

vector int > a ( n );

for ( int i = 0 ; i n ; i ++)

for ( int i = 0 ; i n ; i ++)

if ( a [ i ] > 0 )

if ( a [ i ] 0 )

for ( int i = 0 ; i n ; i ++)


VII. Анализ результатов. Элементы 3 и 5 заменены на 2, элементы -2 и -1 увеличены на 5, элемент 0 остался неизмененным, что соответствует условию задачи.

14.3. Обмен местами элементов в массиве

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

Для обмена элементов можно использовать встроенную функцию swap: swap(a[i], a[k] ).

Пример 14.2. Задан одномерный массив целых чисел. Поменять местами максимальный и минимальный элементы массива. Предполагается, что каждый из них встречается в массиве только один раз.

Этапы выполнения задания

I. Исходные данные: одномерный массив а , количество элементов n .

II. Результат: преобразованный массив a .

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. Найдем максимальный элемент массива и его индекс (n_max) .
3. Найдем минимальный элемент массива и его индекс (n_min) .
4. Поменяем местами элементы, стоящие на местах n_max и n_min .
5. Вывод результата.

IV. Описание переменных: n, n_min, n_max – int, а – vector > .

Пример 14.3. Задан одномерный массив целых чисел. Циклически сдвинуть все элементы массива влево на 1, первый на последнее место. Например, массив 1 2 3 4 5 будет преобразован в 2 3 4 5 1.

Этапы выполнения задания

I. Исходные данные: одномерный массив а , количество элементов n .

II. Результат: преобразованный массив a .

III. Алгоритм решения задачи.Описание переменных: n – int, а – vector .

1. Ввод исходных данных.
2. В цикле осуществим обмен соседних элементов.
3. Вывод результата.

Решением задачи 14.3 может быть также следующий алгоритм (пример 14.4):

1. Сохраним значение первого элемента в буферной переменной.
2. В цикле сдвинем все элементы на 1 влево.
3. Запишем значение буфера на последнее место в массиве.

Если в массив добавить еще один элемент в конце, то его можно использовать в качестве буферной переменной. В этом случае в цикле нужно будет сделать на 1 сдвиг больше. Затем удалить последний элемент. Удалить последний элемент можно с помощью команды pop_back() .

Осуществим обмен элементов следующим образом:

Тогда мы потеряем значение элемента, стоящего изначально на месте a[i] , и получим два элемента со значением, равным a[k] .

using namespace std ;

vector int > a ( n );

for ( int i = 0 ; i n ; i ++)

//поиск минимального элемента

int n_min = 0 ;

for ( int i = 1 ; i n ; i ++)

if ( a [ i ] a [ n_min ])

//поиск максимального элемента

int n_max = 0 ;

for ( int i = 1 ; i n ; i ++)

if ( a [ i ] > a [ n_max ])

swap ( a [ n_min ], a [ n_max ]);

for ( int i = 0 ; i n ; i ++)


using namespace std ;

vector int > a ( n );

for ( int i = 0 ; i n ; i ++)

for ( int i = 0 ; i n - 1 ; i ++)

swap ( a [ i ], a [ i + 1 ]);

for ( int i = 0 ; i n ; i ++)


using namespace std ;

vector int > a ( n );

for ( int i = 0 ; i n ; i ++)

a . push_back ( a [ 0 ]);

for ( int i = 0 ; i n ; i ++)

for ( int i = 0 ; i n ; i ++)

Пример 14.5. Циклический сдвиг вправо на 1. Фрагменты программ:

for ( int i = n - 1 ; i > 0 ; i --)

swap ( a [ i ], a [ i - 1 ]);

a . push_back ( a . back ());

for ( int i = n - 1 ; i > 0 ; i --)

a . front () = a . back ();


14.4. Понятие итератора

Итератор — обобщенный указатель [ 1 ] , который позволяет пользователю перебирать элементы контейнера, без необходимости знать, как реализован сам контейнер.

Вектор является контейнером, в котором реализован последовательный доступ к элементам, итератор позволяет обойти все элементы вектора, перемещение происходит элемент за элементом. Итераторы позволяют обращаться к элементам вектора без использования индексов.

Для вектора определены стандартные итераторы begin() и end() . Итератор begin() указывает на первый элемент в векторе. Итератор end() – на место после последнего элемента вектора.

Для любого итератора (it) доступны следующие операции (пример 14.6):

  • инкремент (it++) — для доступа к следующему элементу;
  • разыменование (*it) — для получения значения элемента;
  • операторы равенства (it1 = = it2) и неравенства (it1 != it2) для определения того, совпадают ли два итератора.

Для вектора итератор обеспечивает дополнительную функциональность:

  • добавление константы ( it += 20 сдвинуться на 20 элементов вперед);
  • расстояние между итераторами
    ( int dist = it2 - it1 ).

Начиная со стандарта C++11, обход вектора с помощью итератора может происходить следующим образом:

vector int > a ( n );

for ( auto i: a )

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

[ 1 ] Указатель — переменная, обозначающая адрес памяти. Указатель предназначен для прямого обращения по адресу памяти к объекту, который расположен по этому адресу.

Для вектора определены также реверсивные (обратные) итераторы, которые позволяют перебирать элементы контейнера в обратном направлении. Для получения реверсивного итератора применяются функции rbegin() и rend() . Итератор rbegin() указывает на конец текущего вектора, а итератор rend() — на начало вектора.

Пример 14.6. Операции с итератором

vector int > a = < 1 , 2 , 3 , 5 , 9 >;

Итератор it указывает на начало вектора. Значение переменной x — значение элемента вектора, на который указывает итератор. Будет выведено значение 1.

Итератор сместился на один элемент и теперь указывает на элемент с индексом 1, будет выведено значение 2.

it = a . begin () + 3 ;

Итератор сместился на 3 элемента от начала и указывает на элемент с индексом 3, будет выведено значение 5.

if ( it == a . begin ())

cout boolalpha true ;

После предыдущей операции итератор указывает на элемент с индексом 3, поэтому будет выведено false .

int dist1 = it - a . begin ();

int dist2 = a . end () - a . begin ();

cout dist1 endl ;

cout dist2 endl ;

Будут выведены значения 3 и 5. Значение 5 — количество элементов в векторе.

Циклу foreach соответствует следующая запись цикла for :

vector int > :: iterator i ;

for ( i = a . begin ();

cout "a % b = " d endl ;

cout "a % b = " d endl ;

for ( auto i = a . begin ();

cout "a % b = " d endl ;

14.5. Удаление элемента из массива

Для удаления массива из элемента, стоящего на месте k , нужно сдвинуть на одну позицию влево все элементы, стоящие после него. Количество элементов при этом уменьшается на 1. Эти действия реализованы в функции erase , которая принадлежит классу vector . Доступны два варианта вызова этой функции:

Удаляет один элемент

Удаляет элементы в диапазоне [first ; last)

Параметрами функции erase являются итераторы. Если нужно удалить, например пятый элемент, то параметр функции может быть записан так: a . begin () + 5 .

Пример 14.7. Задан одномерный массив целых чисел. Удалить из него все числа кратные 5. Сколько чисел удалили?

Этапы выполнения задания

I. Исходные данные: одномерный массив а , количество элементов n .

II. Результат: преобразованный массив a и количество удаленных чисел k .

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. Будем последовательно просматривать элементы массива. Если найдем число, кратное 5, то удалим его из массива, используя функцию erase . Так как количество удаляемых элементов заранее не известно, то применим цикл while .
3. При удалении элемента счетчик k будем увеличивать на 1.
4. Вывод результата.

IV. Описание переменных: n, k – int, а – vector .

using namespace std ;

vector int > a ( n );

for ( int i = 0 ; i n ; i ++)

int i = 0 , k = 0 ;

while ( i a . size ())

if ( a [ i ] % 5 == 0 )

a . erase ( a . begin () + i );

for ( int i = 0 ; i a . size (); i ++)

cout endl "udalili " ;

cout k " elementov" endl ;


VII. Анализ результатов. Элементы 5, 15, 35, 10 и 30 кратны 5, поэтому их удалили из массива. Элементы 3 и 4 не кратны 5, поэтому они остались в массиве и сдвинулись в начало.

Пример 14.8. Фрагмент программы:

for ( int i = n - 1 ; i >= 0 ; i -- )

if ( a [ i ] % 5 == 0 )

a . erase ( a . begin () + i );

for ( int i = 0 ; i a . size (); i ++)

cout endl "udalili " ;

cout n - a . size ();

Счетчик k можно не использовать, количество удаленных элементов можно найти как разность между начальным количеством элементов n и длиной вектора после удаления элементов:

14.6. Вставка элемента в массив

Для вставки элемента на место k необходимо освободить это место в массиве. Для этого нужно сдвинуть на одну позицию вправо все элементы массива, стоящие после k - 1 . Сдвиг начинаем с последнего элемента. Количество элементов в массиве увеличиться на 1. Эти действия реализованы в функции insert . Имеются следующие возможности вызова функции insert :

Вставляет value перед элементом, на который указывает pos

insert(pos, value, count)

Вставляет count копий значения value перед элементом, на который указывает pos

insert(pos, first, last)

Вставляет элементы из диапазона [first, last) перед элементом, на который указывает pos

Параметры pos, first, last являются итераторами.

Пример 14.9. Задан массив целых чисел. Вставить число x на k -е место, если элемент a[k] кратен x .

Этапы выполнения задания

I. Исходные данные: одномерный массив а , количество элементов n , число, которое нужно вставить в массив x.

II. Результат: преобразованный массив a .

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. В цикле проверяем элементы массива.
3. Если текущий элемент кратен x , то вставляем число x в массив.
4. Вывод результата.

Пример 14.9.

using namespace std ;

vector int > a ( n );

for ( int i = 0 ; i n ; i ++)

for ( int i = n - 1 ; i >= 0 ; i --)

if ( a [ i ] % x == 0 )

a . insert ( a . begin () + i , x );

for ( int i = 0 ; i a . size (); i ++)


VI. Анализ результатов. Число 5 вставлено перед значениями 10, 15, 30, 20, 45.

В программе используется обход массива с конца. Если в программе записать такой цикл:

for ( int i = 0 ; i a . size (); i ++)

if ( a [ i ] % x == 0 )

a . insert ( a . begin () + i , x );

то программа может зациклиться. Например, на нулевом месте стоит число 10, удовлетворяющее условию задачи. На его место вставили число 5. Число 10 сдвинулось на позицию 1 и будет опять проверяться на следующей итерации цикла, и опять сдвинется вправо.

Вопросы к параграфу

1. Какие типы задач преобразования массивов вы можете назвать?

2. Как можно поменять местами два элемента в массиве?

3. Как удалить элемент из массива?

4. Как вставить элемент в массив?

Упражнения




1. Можно ли в примере 14.1 заменить команды под № 1 командами под № 2?

1. if ( a [ i ] > 0 )

if ( a [ i ] 0 )

2. if ( a [ i ] 0 )

if ( a [ i ] > 0 )

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

2. Задан одномерный массив. Преобразуйте его элементы по следующему правилу: из всех положительных элементов вычесть элемент с номером k , ко всем отрицательным добавить введенное число x . Нулевые элементы оставьте без изменения.

4. В массиве записана информация об учащихся класса (фамилия и имя). Из класса выбыли два учащихся. Известны номера выбывших учащихся. Исключите их данные из массива.

5. Переставьте первый элемент массива на последнее место, второй — на первое, третий — на второе и т. д. 1 2 3 4 5 6 → 6 5 4 3 2 1.

6. Осуществите циклические сдвиги элементов в массиве.

1. На два элемента вправо 1 2 3 4 5 6 → 5 6 1 2 3 4.
2. На два элемента влево 1 2 3 4 5 6 → 3 4 5 6 1 2.
3. На k элементов вправо. Число k вводится.
4. На k элементов влево. Число k вводится.

7. Разбить элементы массива на группы по 4. В каждой четверке осуществить циклический сдвиг влево на 1. Первый на 4-е место. Если количество элементов в массиве не кратно 4, то для последней группы сдвиг осуществляется для того количества элементов, которое осталось.

8. Удалить из массива все отрицательные элементы. Вывести преобразованный массив.

9. Удалить из массива все элементы, которые являются полными квадратами (например, 9, 25, 64).

10. Удалить из массива все элементы, которые являются степенью 2.

11. Задан линейный массив, элементами которого являются слова. Удалите из него указанные слова.

1. Слова, начинающиеся на согласную букву.
2. Слова, в которых менее 5 согласных.
3. Слова, которые являются палиндромами.

12. Вставить элемент x в позицию x . Если x ≤ 0 или x ≥ n , вставить его на первое или последнее место соответственно.

13. Прочитайте числа из файла в массив. Если два соседних числа имеют разные знаки (одно положительное, а другое отрицательное), вставьте между ними число 0. Запишите полученный массив в файл.

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

Содержание работы

2. Сортировка, параметры-массивы и параметры–строки …………………. 17

2.1. Метод простых обменов (Пузырьковая сортировка)……………………17

2.2. Сортировка простым выбором……………………………………………18

2.3. Сортировка простым включением (Метод вставки и сдвига)…………..19

2.4. Параметры-массивы и параметры-строки………………………………20

Список использованных источников

Содержимое работы - 1 файл

Курбанов Д.Н., КР, Программирование на языках высокого уровня.doc

Версия шаблона 2.1
Филиал ЦДОТ г. Дущанбе
Вид работы Курсовая работа
Название дисциплины Программирование на языках высокого уровня
Тема Массивы
Фамилия студента Курбанов
Имя студента Дилшод
Отчество студента Нарзуллоевич
№ контракта 23200100601016

2. Сортировка, параметры-массивы и параметры–строки …………………. 17

2.1. Метод простых обменов (Пузырьковая сортировка)……………………17

2.2. Сортировка простым выбором……………………………………………18

2.3. Сортировка простым включением (Метод вставки и сдвига)…………..19

2.4. Параметры-массивы и параметры-строки………………………………20

Список использованных источников

Существуют различные типы данных в языке Паскаль. Рассмотрим производные типы. Каждое значение любого из этих типов в общем случае представляет собой уже нетривиальную структуру, т.е. обычно это значение имеет более чем одну компоненту. При этом каждая компонента структуры может быть как отдельным данным, так и в свою очередь нетривиальной структурой, т.е, значением любого из производных типов. Таким образом, значения производных типов в общем случае имеют иерархическую структуру, на самом нижнем уровне которой фигурируют только отдельные данные. Этим компонентам нижнего уровня могут присваиваться значения и они могут присутствовать в выражениях, как и значения переменных скалярного типа. Данные, являющиеся значениями скалярных типов, занимают сравнительно мало места в памяти ЭВМ. Отдельная литера, например, обычно представляется одним байтом (8 двоичных разрядов). Для чисел различны типов в зависимости от реализации отводят несколько байтов. Данные же, составляющие значение производного типа, обычно занимают значительный объем памяти ЭВМ. В связи с этим при написании программ для ЭВМ, имеющих сравнительно небольшой объем памяти, встает проблема экономного ее использования. В паскале предусмотрена возможность указания транслятору на необходимость экономного представления значений производных типов. Для этого задание производного типа необходимо начать со служебного слова packed , что означает упакованный. Но введя требование на упакованность данных, необходимо четко представлять себе, что, с одной стороны, это требование не всегда может быть выполнено транслятором (если, например, более экономного представления, чем обычное неупакованное представление для данных этого типа, в ЭВМ просто не существует). А с другой стороны, если оно выполнимо, то приводит к увеличению времени исполнения программы. Поясним на примере, за счет чего это происходит. Как уже указывалось ранее, одна литера занимает один байт. Машинная ячейка памяти, с которой работают команды ЭВМ, в общем случае состоит из нескольких байтов. Поэтому, если в ячейку поместить одну литеру, го большая ее часть не будет использована. На самом деле в одну ячейку можно поместить несколько литер (упакованное представление). Но тогда каждый раз, когда необходимо выполнить действие над отдельной литерой, придется производить выделение этой литеры из ячейки (распаковку литеры из ячейки). Аналогично, при записи отдельной литеры в память машины придется определять то место в ячейке, куда ее необходимо поместить, и заносить литеру именно туда, не изменяя содержимое остальных разрядов (запаковка литеры в ячейку). Такие дополнительные действия могут занимать значительную часть общего времени работы программы. Поэтому принимать решение об использовании упакованного представления данных должен всегда программист, в зависимости от конкретных условий и целей, которые он преследует. Итак, значения производных типов могут быть представлены в памяти ЭВМ в упакованном и неупакованном виде. Упакованное представление требует, вообще говоря, меньшего объема памяти, но замедляет процесс выполнения программы. Мы рассмотрим наиболее употребительный производный тип, а именно регулярный тип. Значение регулярного типа обычно называют массивом. Итак, массив — это упорядоченный набор фиксированного количества некоторых значений (компонент массива). Все компоненты должны быть одного и того же типа, который называют типом компонент или базовым (для массива) типом.

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

Пример описания и заполнения элементов массива.

M: array [1..5] of integer;

M1: array [2..3,11..15] of char;

1. Виды массивов

1.1 Одномерные массивы

Каждому используемому в программе конкретному массиву должно быть дано свое имя. Это имя будем называть полной переменной, поскольку ее значение есть весь массив. Каждая компонента массива может быть явно обозначена путем указания имени массива, за которым следует селектор компоненты — взятый в квадратные скобки индекс, задающий правило вычисления номера нужной компоненты. Это отличие от привычной записи индекса в математике, когда он указывается справа в нижней позиции, объясняется необходимостью использования линейной записи программы, так что многоуровневая запись должна быть исключена. При ссылке на компоненты массива индекс записывается на одном уровне с именем и заключается в квадратные скобки. Таким образом, для ссылки на отдельные компоненты используется запись вида (имя массива) [ ] которую будем называть частичной переменной (поскольку ее значением является не весь массив, а отдельная его компонента, номер которой задается индексом) — применительно к массивам она называется переменной с индексом. В нашем примере массив получит имя v, а ссылки на отдельные его компоненты производятся с помощью частичных переменных v[ 1], v[2], . v[1ОО]. В общем случае в качестве индекса может, быть использовано выражение, значение которого и определяет номер компоненты массива. При этом важно, что в индексное выражение могут входить переменные, так что при изменении их значений меняется и значение индекса, которое определяет номер компоненты массива. Таким образом, одна и та же переменная с индексом в процессе выполнения программы может обозначать различные компоненты массива. Тип значения индексного выражения называют типом индекса. Множество значений типа индекса должно быть перенумерованным множеством, тем самым определяя количество компонент и их упорядоченность. При задании регулярного типа кроме типа индекса необходимо задать тип компонент. Задание такого регулярного типа, как одномерный массив, т.е. вектор, имеет вид:

аrrау [(тип индекса)] оf ,где — имя или задание типа.

1.2 Пример задачи

Дан линейный массив целых чисел. Подсчитать, сколько в нем различных чисел.

ИДЕЯ РЕШЕНИЯ: заводим вспомогательный массив, элементами которого являются логические величины (False - если элемент уже встречался ранее, True - иначе)>

Читайте также: