Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Нахождение количества элементов с данным свойством




 

Задачи на нахождение номеров элементов с задан­ными свойствами и на нахождение количества таких элементов во всем массиве решаются практически так же, как и для одномерных массивов. Необходимо лишь добавить второй цикл ко второму индексу.

Пример 1

Найти максимальный элемент массива и его индексы.

Решение

Так как элементы могут повторяться, то договорим­ся, что будем запоминать только индексы первого мак­симального элемента. Опишем процедуру, которой передается массив. Ее результатом являются значение мак­симального элемента и индексы первого элемента с мак­симальным значением.

Program Example_112;

Procedure Maximum(x: dmyarray;

Var max, maxi, maxj: Integer);

Var i, j: Integer;

Begin

max:=x[1,1]; maxi:=1; maxj:=1; {Начальные значения}

For i:=1 To n Do

For j:=1 To m Do If x[i,j]>max Then

Begin {Новые значения)

max: =x[i,j];

maxi:=i; maxj:=j;

End;

End;

Пример 2

Найти количество отрицательных элементов в каж­дой строке.

Решение

Рассмотрим несколько вариантов решения этой задачи. Можно хранить количество отрицательных элемен­тов каждой строки в одномерном массиве соответству­ющей размерности.

Program Example_113;

Procedure Q1(x: dmyarray; Var у: omyarray);

Var i, j: Integer;

Begin

For i:=1 To n Do

Begin

y[i]:=0;

For j:=1 To m Do

If x[i,j]<0 Then Inc (y[i]);

End;

End;

Можно использовать счетчик, находить количество отрицательных элементов строки и сразу выводить най­денное значение на экран.

Program Example_114;

Procedure Q_2(x: dmyarray);

Var i, j, k: Integer;

Begin

For i:=1 To n Do

Begin

k:=0;

For j:=1 To m Do

If x[i,j]<0 Then Inc(k);

Writeln (i,'-', k);

{Вывод номера строки и количества

отрицательных элементов}

End;

End;

Работа с несколькими массивами

 

Пример

Составить программу вычисления произведения двух квадратных целочисленных матриц − А и В − размером 5х5. Элементы результирующей, также целочисленной, матрицы С (размером 5х5) определяются по формуле

 где n − размерность.

Решение

Формировать матрицы будем с помощью генерато­ра случайных чисел, вычислять значения элементов ре­зультирующей матрицы С − посредством вложенных циклов. Во внутреннем цикле (по параметру k) будет накапливаться сумма, определяющая элемент с[i, j] .

Program Example_115;

Const n=5;

Type dmyarray=Array[1..n, 1..n] Of Integer;

Var А, В, С: dmyarray;

Procedure Init(Var x: dmyarray);

Procedure Print (x: dmyarray);

Procedure Mult(x,y: dmyarray;

Var z: dmyarray);

Var k, i, j: Integer;

Begin

For i:=1 To n Do

For j:=1 To n Do

Begin

z[i,j]:=0;

For k:=1 To n Do

z[i,j] :=z[i,j]+x[i,k]*y[k,j];

End;

End;

Begin

Writeln('матрица A:'); Init(A); Print(A);

Writeln('матрица В:'); Init(В); Print(В);

Mult(А, В, С);

Writeln('матрица С:'); Print(с);

Readln;

End.

Определить, отвечает ли заданный массив некоторым требованиям

 

Пример 1

Определить, есть ли в данном массиве элемент, рав­ный 0.

Решение

Опишем логическую функцию, значение которой рав­но "истина", если такой элемент есть, и "ложь" − в противном случае. Будем просматривать элементы мас­сива и, если найден искомый, то присвоим функции значение True, иначе − False.

Program Example_116;

Function Checkl(x: dmyarray): Boolean;

Var i, j: Integer;

t: Boolean;

Begin

t:=False; {Предполагаем, что искомого

элемента в массиве нет}

i:=1;

While (not t) And (i<=n) Do

Begin

j:=1;

While (j<=m) And (x[i, j]<>0) Do

Inc(j);

t:=(j<=m);

{Определяем, найден ли искомый элемент; если

просмотрена вся строка, то значение

j=m+1 и t:=False, иначе элемент найден

и t:=True}

Inc(i);

End;

check1:=t;

End;

Пример 2

Определить, является ли данная квадратная матрица симметричной относительно своей главной диагонали.

Решение

Если для всех i=1,..., n и j=1,...,n, i>j выполняется равенство a[i, j]=a[j, i], то матрица является симметричной. Поэтому можно составить следующую функцию:

Program Example_117;

Function Check2(x: dmyarray): Boolean;

Var i, j: Integer;

t: Boolean;

Begin

t:=True;

{Предположим, что матрица симметрична}

i:=2;

While t And (i<n) Do

Begin

j:=1;

While (j<i) And (x[i,j] =x[j,i])Do

Inc(j);

t:=(j=i);

Inc(i);

End;

Check2:=t;

End;

Таким образом, если встретится хотя бы одна такая пара, что соответствующие элементы не будут равны, то функция вернет значение "ложь" (False).

Изменение значений некоторых элементов, обладающих заданным

Свойством

Решение таких задач похоже на решение задач для одномерных массивов.

Пример 1

В массиве размерностью nxm к элементам четных столбцов прибавить элемент первого столбца соответст­вующей строки.

Program Example_118;

Procedure Substitution1 (Var x: dmyarray);

Var i, j: Integer;

Begin

For i:=1 To n Do

For j:=1 to m Div 2 Do

{рассмотрим четные столбцы матрицы}

Inc(x[i, 2*j], x[i, 1])

End;

Пример 2

Заменить все отрицательные элементы на противо­положные.

Program Example_119;

Procedure Substitution2 (Var x: dmyarray);

Var i, j: Integer;

Begin

For i:=1 To n Do

For j:=1 To m Do

x[i, j]:=abs(x[i, j]);

End;

Заполнение двухмерного массива по правилу

Пример

Составить программу, запрашивающую координаты ферзя на шахматной доске и показывающую поля дос­ки, находящиеся под боем (на доске нет других фигур).

Решение

Заметим, что шахматную доску удобно представить в виде двумерного массива размером 8х8. Координаты ферзя можно задать двумя числами (номером строки и номером столбца), но в шахматах принято указывать букву и число. Буква указывает номер строки, а число − номер столбца. Поэтому не будем отступать от тради­ций и введем координаты именно таким образом. В программе сделаем проверку правильности ввода, и если все правильно, то переведем букву в соответствующее ей число (a-1, b-2, c-3, d-4, е-5, f-6, g-7, h-8), тогда будет удобнее работать.

Для решения задачи полезно знать следующие свойст­ва шахматной доски. Все диагонали делятся на восходя­щие и нисходящие:

Каждая диагональ обладает следующими свойствами:

· для элементов любой восходящей диагонали сум­ма номеров строки и столбца постоянна, причем для разных диагоналей − разная, то есть i+j=const1;

· для элементов нисходящих диагоналей разность номеров строки и столбца тоже постоянна и для разных диагоналей разная, то есть i-j=const2.

Это необходимо знать для того, чтобы определить номера диагоналей, на которых находится ферзь. Вся программа будет такой:

Program Example_120;

Const n=8;

Type dmyarray=Array[1..n,1..n] Of Integer;

Var A: dmyarray;

c: Char;

str, stl: Integer;

{str - номер строки, stl - номер столбца}

Function Place(ch: Char): Integer;

Var k: Integer;

Begin

Case ch Of

'a': k:=1; 'b': k:=2; 'c': k:=3;

'd': k:=4; 'e': k:=5; 'f: k:=6; 

'g': k:=7; 'h': k:=8;

Place:=k;

End;

Procedure Init(k, l: Integer;

Var x: dmyarray);

{k - номер строки, l - номер столбца, где стоит ферзь}

Var i, j: Integer;

Begin

 For i:=1 To n Do

For j:=1 To n Do {Под боем клетки,

находящиеся с клеткой, на которой стоит

ферзь, на одной вертикали, горизонтали,

восходящей или нисходящей диагонали.

Клетки, находящиеся под боем, мы

помечаем 1, остальные помечаем 0.}

If (i=k) Or (j=1) Or (i+j=k+1)

Or (i-j=k-l)

Then x[i, j]:=1 Else x[i, j]:=0;

x[k, l]:=2;

{На этой клетке стоит ферзь}

End;

Procedure Print(x: dmyarray);

Var i, j: Integer;

Begin

For i:=1 To n Do

Begin

For j:=1 To n Do

Case x[i, j] Of

0: Write (' ':3);

1: Write ('*':3);

2: Write ('F':3);

End;

Writeln;

End;

Begin

Writeln('Введите координаты ферзя');

Readln(с, stl);

If (c<'a') Or (c>'h') Or (stl<1)

Or (stl>n) Then

Writeln('Некорректный ввод')

Else

Begin

str:=Place(с);

Init(str, stl, A);

Print(A);

End;

Readln;

End.

Можно функцию Place составить иначе:

Function Place(ch: Char): Integer;

Var k: Integer;

Begin

Place:=0rd(ch)-Ord('a')+1;

End;

В этом случае она будет более рациональна.

Пример 2

Заполнить массив А размером n×m следующим об­разом (по "змейке");

Например, при n=6 и m=8:

1     2     3     4     5     6     7     8

16   15   14   13   12   11   10   9

17   18   19   20   21   22   23   24

32   31   30   29   28   27   26   25

33   34   35   36   37   38   39   40

48   47   46   45   44   43   42   41

Решение

Для того чтобы заполнить массив указанным об­разом, надо вывести правило заполнения. В данном случае правило будет таким: если ряд нечетный (то есть когда номер строки − нечетное число), то А[i, j]=(i-1)*m+j, иначе (то есть когда строка чет­ная) A[i, j]=i*m-j+1. В соответствии с этим прави­лом составляем процедуру заполнения массива:

Program Example_121;

Procedure Fill (Varx: dmyarray);

Var i, j: Integer;

Begin

For i:=1 To n Do

For j:=1 To m Do

If i Mod 2=1 Then x[i, j]:=(i-1)*m+j

Else x[i, j]:=i*m-j+1;

End;










Последнее изменение этой страницы: 2018-05-31; просмотров: 185.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...