Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pasca1_09.DOC
Скачиваний:
4
Добавлен:
06.05.2019
Размер:
1.44 Mб
Скачать

5.Массивы

При описании массива (таблица) указывается число его компонент, и это число остается постоянным. Для реализации прямого доступа к любой компоненте массива используются специальные обозначения. Все компоненты массива имеют общее имя – имя массива. Указание на конкретный элемент массива осуществляется с помощью индексов. Обозначение компоненты массива имеет вид:

имя массива [индекс, индекс,..., индекс].

k[1,4,2].

Количество индексов в обозначении компонент массива определяет размерность массива. Массив описывается в разделе описания переменных. При этом описание массива включает описание типа массива и типа индексов. Для описания используется конструкция

имя массива: array [1..40] of тип;

k: array [1..50] of real;

Одномерный массив k. Индексы изменяются от 1 до 50. Элементы массива имеют вещественный тип и будут обозначаться k[8], k[14]. Для обозначения типа индекса в этом описании использован отрезочный тип данных. Этот тип не относится к стандартным, может образовываться непосредственно программистом. Описание этого типа задается с помощью констант, разделенных двумя точками: 1..50. Первая константа указывает нижнюю границу отрезка, а вторая – его верхнюю границу. Переменная, относящаяся к этому типу (в нашем случае переменная, обозначающая индекс массива), должна принимать значение того же типа, что и границы отрезка (integer). Причем эти значения должны принадлежать указанному отрезку. Если же значение переменной отрезочного типа выходит за пределы указанного отрезка, то возникает ошибка. Границы отрезка в описании переменной отрезочного типа не могут быть вещественного типа. Если компоненты массива имеют более одного индекса, то в описании массива должен быть описан тип каждого индекса.

matr:array [1..10,1..4] of real;

mat [1..4];

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

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

var

vector:array[1..50] of real;

Тогда ввод начальных значений компонент этого массива может быть представлен:

for k:=1 to 50 do read(vector[k]);

Приведенный фрагмент программы плох тем, что он годится только для ввода таких массивов, которые содержат ровно 50 компонент Если же программа должна быть написана для работы с массивом, который при каждом новом исполнении программы может иметь другое число компонент, то целесообразно описать этот массив в разделе описаний переменных как массив с максимально возможным кол-вом компонент. Предположим, что кол-во компонент массива не может быть больше 100. Это может быть записано так:

program wwod;

uses crt;

const m=100;

var vector:array [1..m] of real;

k:integer;

BEGIN

clrscr;

for k:=1 to m do read (vector[k]); {ввод массива с клавиатуры}

END.

или так:

program wwod;

uses crt;

const m=100;

var vector:array [1..m] of real;

k:integer;

BEGIN

clrscr;

randomize;

for k:=1 to m do vector[k]:=random(50)-20 ; { массив задан случайным образом}

writeln(‘задан массив’);

for k:=1 to m do write( vector[k]:8:2);writeln;

END.

Задача. Найти максимальный элемент одномерного массива и его номер. Число элементов массива меньше 100.

program maxelem;

const k=100;

var

x:array [1..k] of real ;

max:real;

n,i,jmax:1..k;

BEGIN

write ('введите размерность массива n ');

readln (n);

for i:=1 to n do

begin

write('введите х[',i,'] ');

readln (x[i]);

end;

max:=x[1];

jmax:=1;

for i:=2 to n do

if x[i]>max then

begin

max:=x[i];

jmax:=i;

end;

writeln('максимальный элемент', max:6:2);

writeln('индекс ', jmax);

END.

Задача. Определим количество элементов одномерного массива, больших среднего арифметического его положительных элементов (обязательно есть такие элементы).

program asd;

const n=20;

var x:array[1..n] of integer;

k,s,i:integer; u:real;

BEGIN

randomize;

for i:=1 to n do

begin x[i]:=random(40)-15; write(x[i]:7); end;

writeln;

s:=0; k:=0; for i:=1 to n do

if x[i]>0 then begin s:=s+x[i];k:=k+1 end;

u:=s/k;

writeln('cp=',u:7:2);

k:=0; for i:=1 to n do if x[i]>u then k:=k+1;

writeln('ответ ',k);

END.

Задача. Найти максимальный элемент матрицы и его индекс.

program maxelement;

const m=5;n=7;

var

x:array [1..m, 1..n] of real;

max:real;

i,j,c,d:integer;

BEGIN

writeln('размерность матрицы ',m,'x',n);

for i:=1 to m do

begin

writeln('введите через пробел элементы строки ',i);

for j:=1 to n do read (x[i,j]);

end;

max:=x[1,1];

c:=1; d:=1;

for i:=1 to m do

for j:=1 to n do

if x[i,j]> max then

begin

max:=x[i,j];

c:=i; d:=j;

end;

writeln('max строка столбец');

writeln (max:5:2,c:4,d:7)

END.

Дана символьная матрица размера . Требуется получить последовательность из нулей и единиц, в которой тогда и только тогда, когда в -м столбце число символов * не меньше числа "!".

program aaa;

const m=3;n=4;

type matr=array[1..m,1..n] of char;

var

s:matr;

i,j,k,c:integer;

b:array[1..n] of char;

BEGIN

for i:=1 to m do

for j:=1 to n do

begin

writeln ('ww s[',i,' ',j,']');

readln (s[i,j]);

end;

writeln; вывод в виде матрицы на экран

for i:=1 to m do

begin

for j:=1 to n do write (s[i,j]:3);

writeln;

end;

writeln;

for j:=1 to n do

begin

k:=0; c:=0;

for i:=1 to m do

if s[i,j]='*' then k:=k+1

else if s[i,j]='!' then c:=c+1;

if k>=c then b[j]:='1' else b[j]:='0';

end;

for j:=1 to n do write (b[j]:7);

writeln;

END.

Работа с массивами.Одномерные массивы

Задание 1. Составьте программу вычисления значения выражения:

где х может принимать следующие значения {1; 2.3;5;6.1}

По условию задачи х[1]=1, х[2]=2.3, х[3]=5, х[4]=6. Для вычисления выражения необходимо вначале ввести данные с клавиатуры и найти сумму синусов заданного значения х.

program zzz;

const n=4;

var x:array[1..n] of real;

i:integer; s,z:real;

BEGIN

for i:=1 to n do

begin

writeln('vvetite x[',i,']');

readln(x[i]);

end;

s:=0;

for i:=1 to n do s:=s+sin(x[i]);

z:=2+s;

writeln('z=',z:7:3);

end.

Задание 2. Определите среднее геометрическое элементов одномерного массива, предшествующих первому неположительному числу.

Элементы массива зададим случайным образом.

Средним геометрическим из n чисел называется корень n-ой степени из произведения всех n чисел.

Чтобы решить эту задачу необходимо знать номер первого неположительного элемента (т.е. элемента >=0). Есть много способов решения этой подзадачи, но мы рассмотрим один из простейших: поиск элемента с заданными свойствами будем осуществлять, рассматривая массив не с начала, а с конца.

program zzz1;

uses crt;

const n=10;

var x:array[1..n] of real;

i,c:integer; s,z:real;

BEGIN

clrscr;

randomize;

writeln('Здан массив:');

for i:=1 to n do

begin

x[i]:=random(20)-15;

write(x[i]:5);

end;

writerln;

c:=0;

for i:=n downto 1 do

if x[i]<=0 then c:=i-1;

if c=0 then writeln('неположительных элементов нет или этот элемент первый ')

else

begin

p:=1;

for i:=1 to c do p:=p*x[i];

z:=exp(1/c*ln(p));

writeln('z=',z:7:3);

end;

readln;

end.

Задание 3. Дано натуральное число n, целые числа а12, …, аn. Найти наименьшее из чисел кратных 3 в последовательности а12, …, аn.

program zzz1;

uses crt;

const n=10;

var a:array[1..n] of integer;

i,min:integer; p,z:real;

BEGIN

clrscr;

randomize;

writeln('dan massiv:');

for i:=1 to n do

begin

a[i]:=random(20)+4;

write(a[i]:5);

end;

writeln;

min:=0; \Находим любой элемент

for i:=1 to n do \ кратный 3, чтобы было с чем

if a[i] mod 3=0 then min:=a[i]; \ сравнивать для нахождения min

if min=0 then writeln('нет элементов кратных 3')

else

begin

for i:=1 to n do

if (a[i] mod 3=0) and (a[i]<min) then min:=a[i];

writeln('min=',min);

end;

readln;

end.

Матрицы

Задание 4. Определите сумму всех положительных элементов матрицы А, если

program zzz1;

uses crt;

const m=3; n=5;

var a:array[1..m,1..n] of real;

i,j:integer; s:real;

BEGIN

clrscr;

randomize;

writeln('dan massiv:');

for i:=1 to m do

begin

for j:=1 to n do

begin

a[i,j]:=5*sin(i)-j*j;

write(a[i,j]:9:2);

end;

writeln;

end;

s:=0;

for i:=1 to m do

for j:=1 to n do

if a[i,j]>0 then s:=s+a[i,j];

writeln('summa ', s:9:2);

readln;

end.

Задание 5. В каждой стоке данной квадратной целочисленной матрицы определите количество отрицательных элементов.

program zzz1;

uses crt;

const m=3; n=5;

var a:array[1..m,1..n] of integer;

b:array[1..m] of integer;

i,j,k:integer; p,z:real;

BEGIN

clrscr;

randomize;

writeln('dan massiv:');

for i:=1 to m do

begin

for j:=1 to n do

begin

a[i,j]:=random(100)-20;

write(a[i,j]:5);

end;

writeln;

end;

for i:=1 to m do

begin

k:=0;

for j:=1 to n do

if a[i,j]<0 then k:=k+1;

b[i]:=k;

writeln('в строке ', i, ' отрицательных элементов ', b[i]);

end;

readln;

ЕND.

Задание 6. В каждом столбце данной квадратной вещественной матрицы определите сумму модулей всех элементов.

program kk;

const n=2; m=3;

var A:array[1..n,1..m] of real;

B:array[1..m] of real;

i,j:integer;

BEGIN

for i:=1 to n do {ввод матрицы с клавиатуры}

for j:=1 to m do

begin

write('введите A[',i:2,',',j:2,'] ');

readln(A[i,j]);

end;

for i:=1 to n do {вывод матрицы}

begin

for j:=1 to m do write(A[i,j]:7:2);

writeln;

end;

for j:=1 to m do {если работаем со столбцами, то внешний }

begin { идет по переменной j}

D:=0;

for i:=1 to n do D:=D+abs(A[i,j]);

B[j]:=D;

writeln('сумма столбца',j,'=',B[j]:7:2);

end;

END.

Задание 7. Определите наибольший элемент в заштрихованной области:

Для решения задачи расмотрим следующие свойства матрицы.

i j

1 2 3 4

1

2

3

4

а11 а12 а13 а14

а21 а22 а23 а24

а31 а32 а33 а34

а41 а42 а43 а44

Составим две соответствующие таблицы: в первой разность индексов, а во второй сумму индексов элементов матрицы

i - j

i + j

0 -1 -2 -3

1 0 -1 -2

2 1 0 -1

3 2 1 0

2 3 4 5

3 4 5 6

4 5 6 7

5 6 7 8

Из анализа этих таблиц видно, что:

- если элемент матрицы на главной диагонали, то i-j=0

- если элемент матрицы выше главной диагонали, то i-j<0

- если элемент матрицы ниже главной диагонали, то i-j>0

- если элемент матрицы на побочной диагонали, то i+j=n+1

- если элемент матрицы выше побочной диагонали, то i+j<n+1

- если элемент матрицы ниже побочной диагонали, то i-j>n+1

(n – размерность матрицы, в нашем случае n=4)

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

левому треугольнику -- (i-j>=0) and (j+i<=n+1)

правому треугольнику -- (i-j<=0) and (j+i>=n+1)

Для примера рассмотрим матрицу А

1 11 4 7

5 9 2 10

7 6 4 2

3 1 4 5

program lo1;

{масcив описан как типизированная константа}

const a:array[1..4,1..4] of integer= ((1,11,4,7), (5,9,2,10), (7,6,4,2),

(3,1,4,5));

var i,j,s:integer;

BEGIN

{вывод матрицы на экран}

for i:=1 to n do

begin for j:=1 to n do write(a[i,j]:5); writeln; end;

s:=a[1,1];

for i:=1 to n do

for j:=1 to n do

if ((i-j>=0) and (j+i<=n+1)) or ((i-j<=0) and (j+i>=n+1))

then if a[i,j]>s then s:=a[i,j];

writeln(‘ответ',s);

END.

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