
- •Практикум по Турбо Паскалю
- •Первые занятия Первое знакомство с системой программирования Турбо Паскаль
- •Команды редактора
- •Задания
- •Режим помощи
- •Первая программа
- •Запуск программы
- •Сохранение программы
- •Выход из системы программирования Турбо Паскаль
- •Простейшие линейные программы
- •Арифметический квадрат. Абсолютная величина
- •Целый и логический типы данных Условный оператор
- •Логический тип данных
- •Условный оператор
- •Вложенные операторы условия
- •Целый тип данных. Цикл с параметром
- •Цикл с параметром (разбор на примере)
- •Работа с окнами. Метод пошагового выполнения программ
- •Работа с окнами
- •Решение задач с использованием цикла с параметром
- •Вопросы для обсуждения
- •Трассировка примера
- •Цикл с постусловием
- •Алгоритм Евклида
- •Вложенные циклы
- •Решение задач с использованием циклов с условием
- •Простые типы данных
- •Задания
- •Решение задач
- •Вещественный тип данных
- •Задание
- •Решение задач
- •Ограниченный, перечисляемый типы данных. Оператор варианта
- •Ограниченный тип данных
- •Оператор варианта
- •Перечисляемый тип данных
- •Решение задач
- •Описание переменных, констант и типов Раздел описания констант
- •Раздел описания переменных
- •Раздел описания типов
- •Решение задач
- •Преобразование типов. Совместимость типов
- •Задания
- •Решение задач
- •Решение задач
- •Контрольные работы Контрольная работа №1
- •Контрольная работа №2
- •Основы Паскаля
- •X y22m размер gamma alfa r15
- •Процедуры и функции
- •Описание процедур и функций
- •Файловый тип
- •Описание файлового типа
- •Подпрограммы
- •Процедура Assign
- •Процедура Reset
- •Процедура Rewrite
- •Процедура Write
- •Процедура Close
- •Функция FileSize
- •Функция FilePos
- •Текстовые файлы
- •Описание текстового файла
- •Консоль
- •Устройства
- •Соответствие текстовых файлов и логических устройств
- •Операции над текстовыми файлами
- •Процедура Assign
- •Процедура Reset
- •Процедура Rewrite
- •Процедура Append
- •Процедура Close
- •Функция Eof
- •Функция SeekEof
- •Блочные файлы Описание типа блочного файла
- •Процедура BlockRead
- •Процедура BlockWrite
- •Операции ввода-вывода
- •Регулярные типы данных Одномерные массивы. Работа с элементами
- •Способы задания одномерных массивов
- •Работа с элементами массива (разбор на примерах)
- •Методы работы с элементами одномерного массива Изменение значения некоторых элементов
- •Создание массива
- •Работа с несколькими массивами
- •Удаление элементов из одномерного массива Удаление элемента
- •Вставка элементов в одномерный массив Вставка одного элемента
- •Вставка нескольких элементов
- •Перестановка элементов массива
- •Перестановка части массива
- •Найти сумму элементов
- •Работа с несколькими массивами
- •Двумерный массив. Работа с элементами Изменение значений некоторых элементов, удовлетворяющих заданному свойству
- •Заполнение двумерного массива по правилу.
- •Вставка и удаление элементов двумерного массива
- •Перестановка элементов массива
- •Комбинированный тип данных (записи)
Вставка нескольких элементов
Предположим, что необходимо вставлять не один элемент в массив, а по одному элементу после всех элементов с заданным свойством. Рассмотрим эту вставку на примере вставки после всех элементов с заданным свойством.
Пример
Вставить число после всех элементов массива, кратных 3.
Решение
Первое, на что необходимо обратить внимание - это описание массива: на сколько элементов может увеличиться массив? Максимальное количество элементов, после которых будет вставлен новый элемент, совпадает с количеством элементов массива, так как может случиться, что все элементы массива отвечают заданному свойству. Поэтому массив может увеличиться в два раза (это его самая большая размерность), а значит, соответствующее ему описание будет следующим:
Type myarray = Array[1..2*n] Of Integer;
Второе. Если мы будем просматривать элементы массива с начала и вставлять новый после элемента заданным свойством, то номер последнего элемента каждый раз может меняться, кроме того, будем просматриваться и новый (вставленный) элемент и его необходимо будет пропускать ("перепрыгивать"), поэтому решение будет не очень эффективным.
Лучше всего просматривать массив, начиная с конца, тогда вставляемый элемент мешать не будет. Кроме того, номер последнего элемента можно будет знать (если знать, сколько элементов вставлено на данный момент), при этом просмотр будет последовательным от N-го до 1-го.
Составим программу.
Program Example-44; Const n = 10; dd = 51; Type myarray = Array[1.. 2*n] Of Integer; Var A : myarray; x, k, i :Integer; {x - вставляемое число, k - количество вставленных элементов}
Procedure Init2(Var m: myarray); {процедура заполнения (инициализации) массива случайными числами}
...
Procedure Print1(n1: Integer; m: myarray); {процедура вывода (распечатки) массива }
...
Procedure Insert3(k1, x1: Integer; Var m: myarray); Var i : Integer; Begin {сдвиг элементов на одну позицию назад, n+k- это номер последнего элемента в данный момент} For i:= n+k Downto k1+1 Do m[i+1]:= m[i]; m[k1+1]: = x1; {вставка элемента на место - после k1-го} Inc(k); {увеличение счётчика вставленных элементов } End;
Begin Init2 (A) Print1(n,A); Writeln(' Введите вставляемое число'); Readln(x); k: = 0; For i:= n Downto 1 Do If A[i] Mod 3=0 Then Insert3 (i,x,A); Print1 (n+k,A); {вывод массива после вставки в него всех элементов} Readln; End.
Рассмотрим выполнение программы в пошаговом режиме. Будем вставлять после всех элементов, кратных 3, число 100, то есть х = 100. Пусть дан массив из 10-ти элементов:
3, -12, 5, 14, 27, -6, 1, 34, 10, -15.
Пусть так же первый вывод массива сделан. Трассировка примера приведена в таблице 5.
Таким образом, массив увеличился на k элементов.
На экране всё это будет выглядеть следующим образом:
3 -12 5 14 27 -6 1 -34 10 -15
3 100 -12 100 5 14 27 100 -6 100 1 -34 10 -15 100
Таблица 5
Просмотр элементов массива |
|||
A[i] mod 3 = 0 |
k |
i |
массив |
да |
0 |
10 |
3, -12, 5, 14, 27, -6, 1, 34, 10, -15 |
вставляем 100 после i-го (десятого) |
|||
|
1 |
10 |
3, -12, 5, 14, 27, -6, 1, 34, 10, -15, 100 |
нет |
1 |
9 |
3, -12, 5, 14, 27, -6, 1, 34, 10, -15, 100 |
нет |
1 |
8 |
3, -12, 5, 14, 27, -6, 1, 34, 10, -15, 100 |
нет |
1 |
7 |
3, -12, 5, 14, 27, -6, 1, 34, 10, -15, 100 |
да |
1 |
6 |
3, -12, 5, 14, 27, -6, 1, 34, 10, -15, 100 |
вставляем 100 после i-го (шестого) |
|||
|
2 |
6 |
3, -12, 5, 14, 27, -6, 100, 1, 34, 10, -15, -15, 100 |
да |
2 |
5 |
3, -12, 5, 14, 27, -6, 100, 1, 34, 10, 10, -15, 100 |
вставляем 100 после i-го (пятого) |
|||
|
3 |
5 |
3, -12, 5, 14, 27, 100, -6, 100, 1, 34, 10, -15, 100 |
нет |
3 |
4 |
3, -12, 5, 14, 27, 100, -6, 100, 1, 34, 10, -15, 100 |
нет |
3 |
3 |
3, -12, 5, 14, 27, 100, -6, 100, 1, 34, 10, -15, 100 |
да |
3 |
2 |
3, -12, 5, 14, 27, 100, -6, 100, 1, 34, 10, -15, 100 |
вставляем 100 после i-го (второго) |
|||
|
4 |
2 |
3, -12, 100, 5, 14, 27, 100, -6, 100, 1, 34, 10, -15, 100 |
да |
4 |
1 |
3, -12, 100, 5, 14, 27, 100, -6, 100, 1, 34, 10, -15, 100 |
вставляем 100 после i-го (первого) элемента |
|||
да |
5 |
1 |
3, 100, -12, 100, 5, 14, 27, 100, -6, 100, 1, 34, 10, -15, 100 |