
- •Глава 6. Структурированные типы данных
- •6.1. Массивы
- •6.1.1. Одномерные массивы
- •6.1.2. Многомерные массивы
- •6.2. Сортировка массивов
- •6.2.1. Алгоритм сортировки выбором элемента
- •6.2.2. Алгоритм сортировки обменами (алгоритм “пузырька”)
- •6.2.3. Усовершенствованная "пузырьковая" сортировка
- •6.2.4. «Шейкер» - сортировка
- •6.2.5. Алгоритм сортировки вставками
Глава 6. Структурированные типы данных
К структурированным типам данных относятся массивы, множества, записи и файлы. Элементами структурированных типов могут быть простые типы, а также сложные типы.
В Турбо Паскале имеются еще два структурированных типа: строка типа string и строка типа PChar, являющиеся разновидностями массива.
6.1. Массивы
В математике, экономике, информатике часто используются упорядоченные наборы данных, например, последовательности чисел, таблицы, списки фамилий и т.д.
Массив представляет собой фиксированное количество упорядоченных компонент, снабженных индексами. Он может быть одномерным и многомерным (одномерный – вектор, двумерный – матрица).
Массив в программе должен быть описан: имя массива, тип индексов, тип элементов.
6.1.1. Одномерные массивы
Введя тип – массив, можно затем задать переменные или типизированные константы этого типа.
Формат записи одномерного массива.
type
<имя типа> = array [<тип индекса>] of <тип компонентов>;
var
<имя массива> : <имя типа>;
Переменную типа массив можно задать непосредственно:
var
<имя массива> : array [<тип индекса>] of <тип компонентов>;
Размерность массива может быть любой, компоненты массива могут быть любого (в том числе и структурированного) типа, индекс может быть любого порядкового типа, кроме типа longint.
Пример.
type
V10 = array [1..10] of integer;
var
R, A, B : V10;
Тип массива V10 введен формально, только в разделе описаний, и нигде в программе, в разделе операторов, имя V10 больше не встречается. В программе идет обработка переменных R, A, B – векторов, каждый из которых имеет по 10 элементов целого типа. Каждый элемент массива обозначается именем массива с индексом в квадратных скобках. Например, R[1], A[3], B[10]. Элементы массива упорядочены по значениям индекса. Над элементами массива можно производить те операции, которые допустимы для описанного типа компонент.
Нельзя путать понятия "индекс" и "тип индекса". Тип индекса используется только в разделе описания массива, а индекс указывается для конкретного элемента при его обработке. При этом индекс (или выражение, его задающее) должен быть того же типа, что и описанный тип индекса.
Пример. B[2*i+1], где i принимает значения 1, 2, 3, 4.
Пример.
type
color = (red, black, green, white);
mas = array [color] of char;
var
A : mas;
B : array [1..20] of integer;
Значения элементов массивов A и B могут быть, например, такими:
A[red] = 'r'; A[black] = 'b'; A[pred(black)] = 'r';
B[1] = –2; B[2] = 0; B[3] =4; B[succ(2)] = 4; B[2*i+1] = 4, если i=1.
Введя тип массив, можно описать типизированную константу этого типа. При задании типизированных констант типа массив компоненты указываются в круглых скобках и разделяются запятыми. Для введенных в примерах 1 и 3 типов массивов можно задать следующие типизированные константы:
const
C : V10 = (3, 4, –2, 0, 6, –1, 7, 10, 53, –123);
M : mas = ('r', 'b', 'g', 'w');
Одному массиву можно присвоить значение другого массива, но только идентичного типа. Так, если заданы массивы:
var
A, B : array [1..5] of integer;
C : array [1..5] of integer;
то допустим оператор: A:= B; с другой стороны, оператор C:= A; недопустим, так как массивы A и C не идентичных типов (массивы A и B идентичны, т.к. введены одним описанием; массивы C и A не идентичны, т.к. каждый из них вводится своим описанием).
Имеются некоторые отличия в работе с одномерными массивами символов (не путать с величинами типа string). Так типизированным константам этого вида можно присвоить значение как обычным строковым константам, указав строку символов в апострофах. Например, массив M1 и ранее описанный массив М, состоящие из компонент типа char, можно задать следующим образом:
const
M : mas = ('r', 'b', 'g', 'w');
M1 : array [1..5] of char = ('o', 'p', 'e', 'r', 'a');
или
const
M : mas = 'rbgw';
M1 : array [1..5] of char = 'opera';
Для массивов символов, как и для строк, можно использовать операции сравнения (даже если они не идентичных типов и даже если они имеют различный размер) и конкатенации (объединения). Например, для введенных выше массивов можно написать:
if M > M1 then Writeln(M)
else Writeln(M1);
Для ввода и вывода значений элементов массивов используются операторы циклов.
Задача 1. Найти сумму элементов массива.
Program massiv_1;
Const n=30;
Type Mas=Array[1..n] Of Integer;
Var A : Mas;
s,i: Integer;
Begin
Writeln('Введите ‘ ,n, ' чисел’);
For i:=l to n do Readln(A[i]);
s:=0;
For i:=l to n do s:=s+A[i];
WriteLn('сумма равна ',s);
Readln
End.
Задача 2. Вычислить сумму S=A1+B1B1+A2+B2B2+...+A10+B10B10.
program SUMMA;
const N=10;
type
mas = array [1..N] of real;
var A, B : mas;
i : integer; S : real;
begin S := 0;
for i := 1 to N do
begin
Writeln('Введите очередные элементы массивов A и B');
Readln(A[i], B[i]);
S:= S + A[i]+B[i]*B[i]
end;
Writeln('S = ', S:8:2)
end.
Задача 3. В массиве (введен с клавиатуры) из 15 символов все буквы 'b' замените на букву 't'. Выведите на печать полученный массив.
program SIMVOLI;
type
mas = array [1..15] of char;
var S1, S2 : mas;
i : integer;
begin {Ввод массива S1}
for i :=1 to 15 do
begin Write('Введите ', i, '– ый символ '); Readln (S1[i]); end;
{Получение массива S2}
for i := 1 to 15 do
if S1[i] = 'b' then S2[i]:= 't'
else S2[i]:= S1[i];
{Вывод массива S2}
for i := 1 to 15 do
Writeln(S2[i])
end.
Замечание 1. Вывод значений элементов массива S2 можно организовать с помощью оператора Writeln(S2).
Замечание 2. Можно обрабатывать русский шрифт.
Замечание 3. Переменная S2 должна содержать 15 символов, иначе выдается сообщение об ошибке.
Задача 4. Определить количество положительных, отрицательных и нулевых элементов в данном массиве.
Program massiv_4;
Const n=30;
Type Mas=Array[1..n] Of Integer;
Var A : Mas;
i: Integer;
pos, neg, zer:Integer;
Begin
Writeln('Введите ‘ ,n, ' чисел’);
pos:=0; neg:=0; zer:=0
For i:=l to n do Readln(A[i]);
For i:=l to n do If A[i]>0 Then Inc(pos)
Else If A[i]<0 Then Inc(neg) Else Inc(zer);
WriteLn(pos:4,neg:4, zer :4);
WriteLn('сумма равна ',s);
Readln
End.
Задача 5. В массив С записать номера четных элементов массива А.
Program Мassiv_5;
Const n=10;
Type Mas=Array[1..n] Of Integer;
Var А,C: Маs;
i,j: Integer;
Begin
Writeln('Введите ',n, ' чисел');
For i:=l to n do Readln(A[i]);
j:=0;
For i:=l to n do
If A[i] mod 2 =0 Then
Begin Inc(j) ;
C[j]:=i
End;
For i:=l to j do
Write(C[i] : 3); Writeln; Readln
End.
Задача 6. Найти номер первого отрицательного элемента массива.
Program Мassiv_6;
Const n=10;
Type Mas=Array[1..n] Of Integer;
Var А,C: Маs;
i,j: Integer;
Begin
Writeln('Введите ',n, ' чисел');
For i:=l to n do Readln(A[i]);
i:=l;
Flag:=FALSE;
While (i<=N) and not Flag do
If A[i]< 0 then
begin Flag:=TRUE; k:=i
end
else i:=i+l;
if Flag then writeln(‘последний отрицательный элемент имеет номер’, k)
else writeln(‘отрицательных нет’)
end.
Задача 7. Определить, является ли заданная последовательность чисел а1, a2 , an монотонно убывающей.
Program Decrease;
Uses Crt;
Var A : Array [1..10] of Real;
N, i : Integer;
Otvet: Boolean;
Begin
ClrScr;
Write(’Количество элементов - ’); ReadLn(N);
For i := 1 to N do
begin Write(’A[’ , i , ’] = ’);
ReadLn(A[i])
end; WriteLn;
WriteLn(’Заданная последовательность чисел’);
For i := 1 to N do Write(A[i] : 5 : 1);
WriteLn
{описание проверки на убывание элементов}
Otvet := TRUE; i:=1;
While (i<=N–1) and Otvet do
If (A[i]<A[i+1]) then Otvet := FALSE
else i := i+1;
{описание вывода результата}
If Otvet then Write(’образует ’)
else Write(’не образует ’);
WriteLn(’монотонно убывающую последовательность.’);
ReadLn
End.
Задача 8. В одномерном массиве целых чисел удалить элемент, равный заданному числу m, если он есть. Если таких элементов несколько, то удалить последний из найденных.
Program Udalen;
const n=10;
var a; array [l..n] of integer;
i, k, m : integer;
BEGIN
randomize;
for 1 :=1 to n do
begin
a[i]:=random(20)- 10;
write(a[1]:4)
end;
writeln;
write( 'Введите число ->'); readln(m);
for i : =1 to n do
if a[i]=m then k:=i ;
for i :=k to n-1 do
a[i]:=a[i+1];
for i :=1 to n-1 do
write(a[i]:4);
writeln
END.
Задача 9. Вставить на k-е место массива целых чисел элемент, равный наименьшему элементу массива.
Program Vstavka;
const n=10;
var a: array [l..n+l] of integer;
i, k,.min: integer;
begin
randomize;
for i :=1 to n do
begin
a[i]:=random(20) - 10;
write(a[i]:4)
end;
writeln;
min:=a[l];
for i :=2 to n do
if a[i]<min then min:=a[i];
write( 'Введите значение k (k < ',n,') ->');
readln(k);
for i : =n+l downto k +1 do
a [i]:=a[i-1];
a[k]:=min;
for i :=1 to n+1 do write(a[i]:4);
writeln
end.
Задачи для самостоятельного решения
Подсчитайте число и сумму положительных, число и произведение отрицательных элементов заданного массива A(N).
Элементы заданного массива B(N) перепишите в новый массив A(N) в обратном порядке.
Из заданного вектора A(3N) получите вектор B(N), очередная компонента которого равна среднему арифметическому очередной тройки компонент вектора А.
В заданном массиве A(N), все элементы которого попарно различны, найдите: а) наибольший элемент из отрицательных; б) наименьший элемент из положительных;
Проверьте, есть ли в заданной целочисленной последовательности a1 , a2 , ... , aN элементы, равные нулю. Если есть, найдите номер первого из них, если нет - выдайте соответствующий текст.
Выясните, имеются ли в заданном векторе A(N) два подряд идущих нулевых элемента.
Множество точек в пространстве задано своими целочисленными координатами. Определите, совпадает ли хотя бы одна из точек с началом координат.
Если у заданного вектора A(N) есть хотя бы один элемент, меньший, чем -5, то все отрицательные элементы замените их квадратами, оставив остальные элементы без изменения; в противном случае вектор домножьте на 0,1 .
Осуществите циклический сдвиг компонент заданного вектора A(N) влево на одну позицию, то есть получите вектор А = (a2 , a3 , ..., aN , a1 ).
Осуществите циклический сдвиг компонент заданного вектора A(N) вправо на две позиции, то есть получите вектор A = (aN-1 , aN , a1 , a2 , ... , aN-2 ).
Дан массив A(N). Получите массив B(N), i-й элемент которого равен среднему арифметическому первых i элементов массива А: bi = (a1 + a2 + ... + ai ) / i.
Сожмите заданный массив A(N) отбрасыванием нулевых элементов.
В заданном одномерном массиве удалите каждый третий положительный элемент.
Дана последовательность целых чисел (массив). Вставить в последовательность новый элемент перед первым элементом и новый элемент после последнего элемента. Значение первого вставленного элемента должно дублировать первый элемент в исходной последовательности, последний вставленный элемент должен дублировать последний элемент в исходной последовательности. Пример. Даны числа: 1,2,3,4,5. Получить: 1,1,2,3,4,5,5.
Дана последовательность целых чисел (массив). Продублировать все элементы с нулевым значением - после каждого нуля вставить еще один нуль. При этом добавленный нуль не дублируется.
Дана неубывающая последовательность целых чисел (массив). Вставить в последовательность новый элемент с нулевым значением так, чтобы упорядоченность элементов не нарушилась.
Дана последовательность целых чисел (массив). Удалить из последовательности каждый второй элемент. Значение номера определяется по положению в исходной последовательности, нумерация начинается с единицы.
Дана последовательность целых чисел (массив). Удалить из последовательности все неположительные элементы.
Дана последовательность целых чисел (массив). Удалить из последовательности все элементы с минимальным неотрицательным хзначением.
Дана последовательность натуральных чисел. Вставить в последовательность нулевые элементы после каждого числа Фибоначчи.