Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
220.16 Кб
Скачать

111

Глава 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+B1B1+A2+B2B2+...+A10+B10B10.

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.

Задачи для самостоятельного решения

  1. Подсчитайте число и сумму положительных, число и произведение отрицательных элементов заданного массива A(N).

  2. Элементы заданного массива B(N) перепишите в новый массив A(N) в обратном порядке.

  3. Из заданного вектора A(3N) получите вектор B(N), очередная компонента которого равна среднему арифметическому очередной тройки компонент вектора А.

  4. В заданном массиве A(N), все элементы которого попарно различны, найдите:    а) наибольший элемент из отрицательных;    б) наименьший элемент из положительных;

  5. Проверьте, есть ли в заданной целочисленной последовательности a1  , a2 ,  ... ,  a  элементы, равные нулю. Если есть, найдите номер первого из них, если нет - выдайте соответствующий текст.

  6. Выясните, имеются ли в заданном векторе A(N) два подряд идущих нулевых элемента.

  7. Множество точек в пространстве задано своими целочисленными координатами. Определите, совпадает ли хотя бы одна из точек с началом координат.

  8. Если у заданного вектора A(N) есть хотя бы один элемент, меньший, чем  -5, то все отрицательные элементы замените их квадратами, оставив остальные элементы без изменения; в противном случае вектор домножьте на 0,1 .

  9. Осуществите циклический сдвиг компонент заданного вектора  A(N)  влево на одну позицию, то есть получите вектор А  =  (a2 ,  a3 ,  ...,  aN ,  a1 ).

  10. Осуществите циклический сдвиг компонент заданного вектора  A(N)  вправо  на две позиции, то есть получите вектор A  =  (aN-1 ,  aN  ,  a1  ,  a  ,  ...  ,  aN-2 ).

  11. Дан массив A(N). Получите массив B(N)i-й элемент которого равен среднему арифметическому первых  элементов массива А:   bi =  (a1  +  a2  +  ...  +  a ) / i.

  12. Сожмите заданный массив A(N) отбрасыванием нулевых элементов.

  13. В заданном одномерном массиве удалите каждый третий положительный элемент.

  14. Дана последовательность целых чисел (массив). Вставить в последовательность новый элемент перед первым элементом и но­вый элемент после последнего элемента. Значение первого встав­ленного элемента должно дублировать первый элемент в исходной последовательности, последний вставленный элемент должен дубли­ровать последний элемент в исходной последовательности. Пример. Даны числа: 1,2,3,4,5. Получить: 1,1,2,3,4,5,5.

  15. Дана последовательность целых чисел (массив). Продублиро­вать все элементы с нулевым значением - после каждого нуля вста­вить еще один нуль. При этом добавленный нуль не дублируется.

  16. Дана неубывающая последовательность целых чисел (мас­сив). Вставить в последовательность новый элемент с нулевым значе­нием так, чтобы упорядоченность элементов не нарушилась.

  17. Дана последовательность целых чисел (массив). Удалить из последовательности каждый второй элемент. Значение номера опре­деляется по положению в исходной последовательности, нумерация начинается с единицы.

  18. Дана последовательность целых чисел (массив). Удалить из последовательности все неположительные элементы.

  19. Дана последовательность целых чисел (массив). Удалить из последовательности все элементы с минимальным неотрицательным хзначением.

  20. Дана последовательность натуральных чисел. Вставить в последовательность нулевые элементы после каждого числа Фибоначчи.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]