
- •Обработка одномерных массивов на языке программирования turbo pascal Учебное пособие для студентов
- •Оглавление
- •Введение
- •Теоретический материал по массивам Понятие массива
- •Индексы массива
- •Представление массива в памяти
- •Пользовательский тип – массив
- •Одномерные и n-мерные массивы
- •Двумерные массивы
- •Основные алгоритмы обработки массивов Общие замечания
- •Ввод/вывод массива
- •Вычисление суммы и среднего арифметического элементов массива
- •Поиск максимального/минимального элемента массива
- •Подсчет количества элементов, удовлетворяющих заданному условию
- •Удаление элемента из массива
- •Вставка новых элементов в массив
- •Удаление нескольких элементов массива
- •Обработка нескольких массивов
- •Проверка соседних элементов массива
- •Методы сортировок массивов Сортировка массивов
- •Сортировка методом вставки
- •Сортировка методом выбора
- •"Пузырьковая" сортировка
- •Быстрая сортировка
- •Примеры решения задач на сортировку массивов
- •Задания для самостоятельного решения Вариант №1
- •Вариант №2
- •Вариант №3
- •Вариант №4
- •Вариант №5
- •Вариант №6
- •Вариант №7
- •Вариант №8
- •Вариант №9
- •Вариант №10
- •Вариант №11
- •Вариант №12
- •Вариант №13
- •Вариант №14
- •Вариант №15
- •Список используемой литературы
- •420012, Казань, ул. Чехова, 36
Примеры решения задач на сортировку массивов
Пример 1. Дан одномерный массив. Каждый элемент содержит следующую информацию: фамилия и рост студента. Упорядочить студентов по возрастанию роста.
Входные данные – одномерный массив а, каждый элемент которого в качестве значения имеет пару данных различного типа. В языке Turbo Pascal такие элементы удобно описать с помощью типа запись, с двумя полями: типа string для фамилии и типа integer для роста. В программе этот тип назван student.
Выходные данные – отсортированный массив, который размещается в памяти в тех же ячейках, что и исходный, поэтому в программе обозначается тем же именем а.
Сортировка производится методом пузырька. При этом два соседних элемента упорядочиваются в порядке возрастания значений в поле rost. Для того, чтобы в случае необходимости поменять местами два элемента, нужна промежуточная переменная того же типа, что и элементы массива. Этой переменной в программе дано имя b. Так как при выводе на экран в списке вывода процедуры writeln могут быть лишь величины стандартного типа, а тип запись не является стандартным, приходится указывать каждое поле элемента массива по отдельности.
program m1;
const n=10;
type student=record
fam:string;
rost:integer;
end;
var a:array [1..n] of student;
b:student;
i,k:integer;
begin
for i:=1 to n do
begin write('Вводите фамилию');readln(a[i].fam);
write('вводите рост');readln(a[i].rost);
end;
{сортировка студентов по росту методом пузырька }
for k:=n downto 2 do
for i:=1 to k-1 do
if a[i].rost>a[i+1].rost then
begin
b:=a[i];
a[i]:=a[i+1];
a[i+1]:=b;
end;
for i:=1 to n do
writeln(a[i].fam,' ',a[i].rost);
end.
Пример 2. Дан массив A – массив целых чисел. Сформировать новый массив B из элементов массива A, кратных 5-ти, и отсортировать его по возрастанию.
Входные данные – одномерный массив а, элементами которого являются целые числа.
Выходные данные – отсортированный массив b, состоящий из тех элементов исходного массива a, которые кратны 5-ти.
Сортировка производится методом выбора. При этом элементы массива упорядочиваются в порядке возрастания. Для того, чтобы поменять местами два элемента, используются две переменные: min для сохранения самого элемента и imin для сохранения позиции этого элемента в массиве. Отсортированный массив выводится на экран в виде строки.
program m1;
const n=6;
type mas=array[1..n] of integer;
var a,b:mas;
s,min,imin,j,i:integer;
begin
writeln ('введите элементы массива');
for i:=1 to n do read(a[i]);
j:=1;
{формирование нового массива из элементов исходного массива, кратных 5-ти}
for i:=1 to n do
if a[i]mod 5=0 then begin b[j]:=a[i];j:=j+1; end;
j:=j-1;
{сортировка полученного массива методом выбора}
for s:=1 to j-1 do
begin
min:=b[s];
imin:=s;
for i:=s+1 to j do
if b[i]<min then
begin
min:=b[i];
imin:=i;
end;
b[imin]:=b[s];
b[s]:=min
end;
for i:=1 to j do write(b[i],' ');
end.
Пример 3. Дан одномерный массив размера n, состоящий из целых чисел. Упорядочить элементы этого массива так, чтобы расположить сначала четные, а потом нечетные элементы в порядке возрастания.
Входные данные – одномерный массив а, элементами которого являются целые числа. Выходные данные – отсортированный массив, в начале которого находятся отсортированные четные элементы, а затем отсортированные нечетные элементы. Элементы массива размещаются в памяти в тех же ячейках, что и исходный, поэтому в программе обозначаются тем же именем а.
Сортировка производится методом быстрой сортировки. Перед сортировкой четные элементы собираются в левую часть, а не четные элементы в правую часть массива. Для этого используется цикл repeat…until. А циклы while для переменных i и j используется для нахождения несоответствующих заданному условию четных и нечетных элементов соответственно. При сортировке элементы упорядочиваются по возрастанию. Отсортированный массив выводится на экран в одну строку.
program m1;
const n=6;
type mas=array[1..n] of integer;
var a:mas;
c,i,j,t:integer;
procedure sor(m,l:integer);
var i,j,x,t:integer;
begin
i:=m;j:=l;
x:=a[(m+l) div 2];
repeat
while a[i]<x do i:=i+1;
while a[j]>x do j:=j-1;
if i<=j then begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
i:=i+1;j:=j-1;
end;
until i>j;
if m<j then sor(m,j);
if i<l then sor(i,l);
end;
begin write('введите элементы массива');
for i:=1 to n do read(a[i]);
i:=1;j:=n;
{сбор четных элементов в правую часть массива, а нечетных в левую }
repeat
while a[i] mod 2=0 do i:=i+1;
while a[j] mod 2=1 do j:=j-1;
if i<=j then begin
c:=a[i];
a[i]:=a[j];
a[j]:=c;
i:=i+1;
j:=j-1;
end;
writeln('i=',i,' j=',j);
until i>j;
{сортировка элементов}
sor(1,j);
sor(i,n);
for i:=1 to n do write(a[i],' ');
end.
Пример 4. Дан массив А – массив чисел, записанных в 8-ой системе счисления. Отсортировать его в порядке убывания. Результат выдать в 8-ичной и 10-ичной системе счисления.
Входные данные – одномерный массив а, каждый элемент которого в качестве значения имеет целое число, заданное в 8-ичной системе счисления. Так как на языке Turbo Pascal для чисел 8-ичной системе отдельного типа не предусмотрено, поэтому числам присваиваем тип integer, а при вводе чисел вводим числа 8-ичной системы счисления.
Выходные данные – два отсортированных массива, один из которых размещается в памяти в тех же ячейках, что и исходный, поэтому в программе обозначается тем же именем а и состоит из чисел в 8-ичной системе счисления. Элементами второго массива, который в программе обозначается именем b, являются те же элементы массива а, только переведенные в 10-ичную систему счисления.
Сортировка производится методом вставки. При этом элементы массива упорядочиваются в порядке возрастания. При сортировке цикл while для переменной j используется для нахождения позиции элемента, который не соответствует заданному условию.
После того как массив a отсортирован, элементы массива переводятся в 10-ичную систему счисления с помощью цикла while по переменной k и записываются в массив b.
Массивы а и b выводятся в разные строки.
program m1;
const n=6;
type mas=array [1..n] of integer;
var a,b:mas;
k,i,j,p,c,t,f:integer;
begin writeln('введите элементы массива в 8-ичной системе счисления');
for i:=1 to n do read(a[i]);
{сортировка элементов массива методом вставки}
for i:=2 to n do
begin f:=a[i];
j:=1;
while (f>a[j]) do j:=j+1;
for k:=i-1 downto j do
a[k+1]:=a[k];
a[j]:=f;
end;
j:=1;
for i:=1 to n do
begin k:=a[i];t:=1;c:=0;
while abs(k)>=1 do begin
p:=k mod 10;
c:=c+p*t;
k:=k div 10;
t:=t*8;
end;
b[j]:=c; j:=j+1;
end;
for i:=1 to n do write(a[i],' '); writeln;
for i:=1 to n do write(b[i],' ');
end.
Пример 5. Дан одномерный массив, состоящий из слов. Отсортировать по возрастанию длины те элементы, в составе которых есть в знак "?".
Входные данные – одномерный массив а, каждый элемент которого строка состоящий из набора символов. Выходные данные – отсортированный массив, который размещается в памяти в тех же ячейках, что и исходный, поэтому в программе обозначается тем же именем а. Перед тем как начать сортировку массива, находим первую строку, в которой имеется знак "?". Если такого элемента в массиве не имеется, то на экран выводится сообщение об этом и выводится сам массив, а если есть такой элемент, начинается сортировка тех элементов массива, которые соответствуют данному условию. Сортировка производится методом выбора. При этом элементы упорядочиваются в порядке возрастания. Для того, чтобы в случае необходимости поменять местами два элемента, используются промежуточные величины: amin – переменная для временного размещения строки, min – для временного хранения длины слова, imin – для хранения позиции элемента в массиве. Элементы массива выводятся на экран в виде столбца.
program m1;
const n=5;
type mas=array [1..n] of string;
var a:mas; b:boolean;
k,i,s,t,imin,min:integer;
c,amin:string;
begin writeln('вводите элементы массива');
for i:=1 to n do readln(a[i]); b:=false;
i:=1;
while (i<=n) and not(b) do begin
c:=a[i];
for k:=1 to length(c) do
if c[k]='?' then b:=true;
i:=i+1;
end;
if not(b) then writeln('такого элемента в этом массиве нет') else begin
for s:=i-1 to n-1 do begin
b:=false;
c:=a[s];
for k:=1 to length(c) do
if c[k]='?' then b:=true;
if b then begin
amin:=a[s];
min:=length(a[s]);
imin:=s;
for t:=s+1 to n do begin
b:=false; c:=a[t];
for k:=1 to length(c) do
if c[k]='?' then b:=true;
if (length(a[t])<min) and b then begin
amin:=a[t];
min:=length(a[t]);
imin:=t;
end; end;
a[imin]:=a[s];
a[s]:=amin;
end; end; end;
writeln('массив результат');
for i:=1 to n do writeln(a[i]);
end.