- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

Описание двумерных массивов.



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

Рассмотрим один из способов ввода элементов двумерного массива. Будем использовать схему перебора по одному от начала массива к концу. Считаем что массив имеет размерность n * m

For i : = 1 to n do {перебираем строки двумерного массива}

For j: = 1 to m do {перебираем столбцы двумерного массива}

Read (a [i,j]).

Транспонирование двумерного массива, значит переставить местами его стоки и столбцы. Например для исходного массива:

2 3 получить: 1 4 7

4 5 6 2 5 8

7 8 9 3 6 9

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

For i: = 1 to n do{перебираем все строки массива}

For j: = 1 to i-1 do {перебираем элементы до главной диагонали}

Begin r: = a [i, j]; a [i, j]: = a [j, i]; a [j,i]: = r ; end.

Нахождение максимального (минимального) элемента двумерного массива. Эта задача совпадает с решением задачи для одномерного массива. Отличие заключается в необходимости для двумерного массива вложенных циклов перебора. Фрагмент программы приведен ниже:

i max: =1; j max: = 1;{предлагаем максимальный первый элемент}

for i: = 1 to n do

for j: = 1 to n do

if a [i max, j max] < a [i, j]

then begin i max: = i; jmax = j; end.

 

Сортировка двумерных массивов

Отсортировать элементы двумерного массива по элементам второй строки.

Исходный массив. Результат

1 2 3 4 5 5 2 4 3 1

9 3 7 3 1 1 3 3 7 9

6 7 8 9 1 1 7 9 8 6

От сортировки одномерного массива этот случай отличается только тем, что переставлять нужно не два сравниваемых элемента, а два столбца:

for i: = 1 to n – 1 do

for j: = i+1 to n do

if a [2, i] > a [2, j]

then for k: = 1 to n do

begin r: = a [k, i]; a [k, i]; = a[k, j]; a [k, j]: =r

end.

{Сортировка массивов}

{ 1. Вставками }

{ 2. Обменом }

{ 3. Выбором }

{ 4. Фон Неймана (Слияние двух отсортированных массивов)}

 

program sor1;

uses crt;

const n=4;

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

buf,l,i,j,a,c,nextmas:integer;

quit:boolean;

procedure print;

begin

for i:=1 to n do

begin

for j:=1 to n do

write(' ',mas[i,j],' ');

writeln;

end;

writeln;writeln('Ќ ¦ЁвҐ Enter ¤«п Їа®¤®«¦Ґ­Ёп !');

readln;

end;

procedure next;

begin

j:=j+1;

if j=n+1 then begin j:=1;i:=i+1;end;

end;

procedure last;

begin

j:=j-1;

if j=0 then begin j:=n;i:=i-1;end;

end;

begin

clrscr;

for i:=1 to n do

for j:=1 to n do

mas[i,j]:=round(random*(9));

print;

i:=1;j:=1;

for l:=2 to (n*n) do

begin

next;buf:=mas[i,j];a:=i;c:=j;

last;quit:=true;

while (buf<mas[i,j])and(quit) do

begin

nextmas:=mas[i,j];

mas[i,j]:=buf;

next;mas[i,j]:=nextmas;last;last;

if j=0 then quit:=false;

end;

i:=a;j:=c;

end;

print;

end.

Результаты работы:

0 0 8 2 2 6 3 1 3 4 1 4 1 8 1 3   Нажмите Enter для продолжения !   0 0 1 1 1 1 2 2 3 3 3 4 4 6 8 8   Нажмите Enter для продолжения !  

 

 

program sor2;

uses crt;

const n=4;

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

buf,l,units,i,j,nextmas:integer;

quit:boolean;

procedure print;

begin

for i:=1 to n do

begin

for j:=1 to n do

write(' ',mas[i,j],' ');

writeln;

end;

writeln;writeln('Ќ ¦ЁвҐ Enter ¤«п Їа®¤®«¦Ґ­Ёп !');

readln;

end;

procedure next;

begin

j:=j+1;

if j=n+1 then begin j:=1;i:=i+1;end;

end;

procedure last;

begin

j:=j-1;

if j=0 then begin j:=n;i:=i-1;end;

end;

begin

clrscr;

units:=n*n;

for i:=1 to n do

for j:=1 to n do

mas[i,j]:=round(random*9);

print;

repeat

i:=1;j:=1;

quit:=true;

units:=units-1;

for l:=1 to units do

begin

next;nextmas:=mas[i,j];last;

if mas[i,j]>nextmas

then begin buf:=mas[i,j];mas[i,j]:=nextmas;next;mas[i,j]:=buf;quit:=false;end

else next;

end;

until quit or (units=1);

print;

end.

Результаты работы:

0 0 8 2 2 6 3 1 3 4 1 4 1 8 1 3   Нажмите Enter для продолжения !   0 0 1 1 1 1 2 2 3 3 3 4 4 6 8 8   Нажмите Enter для продолжения !  

 

 

program sor3;

uses crt;

const n=4;

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

min,buf,l,l1,i,j,i1,j1,a,c:integer;

procedure print;

begin

for i:=1 to n do

begin

for j:=1 to n do

write(' ',mas[i,j],' ');

writeln;

end;

writeln;writeln('Ќ ¦ЁвҐ Enter ¤«п Їа®¤®«¦Ґ­Ёп !');

readln;

end;

begin

clrscr;

for i:=1 to n do

for j:=1 to n do

mas[i,j]:=round(random*9);

print;

a:=1;c:=1;i:=1;j:=1;

for l:=1 to (n*n) do

begin

min:=mas[a,c];i:=a;j:=c;i1:=a;j1:=c;

for l1:=1 to (n*n+1)-l do

begin

if min>mas[i1,j1] then begin min:=mas[i1,j1];i:=i1;j:=j1;end;

j1:=j1+1;if j1=(n+1) then begin j1:=1;i1:=i1+1;end;

end;

buf:=mas[i,j];

mas[i,j]:=mas[a,c];

mas[a,c]:=buf;

c:=c+1;if c=(n+1) then begin c:=1;a:=a+1;end;

end;

print;

end.

Результаты работы:

0 0 8 2 2 6 3 1 3 4 1 4 1 8 1 3   Нажмите Enter для продолжения !   0 0 1 1 1 1 2 2 3 3 3 4 4 6 8 8   Нажмите Enter для продолжения !  

 

 

program sor4;

uses crt;

const n=4;

type mas=array[1..n,1..n]of integer;

var mas1,mas2:mas;

mas3:array[1..2*n,1..n]of integer;

buf,i,j,i1,j1,a,c:integer;

procedure next(t:integer);

begin

if t=1 then begin

j:=j+1;if j=n+1 then begin j:=1;i:=i+1;end;

end;

if t=2 then begin

j1:=j1+1;if j1=n+1 then begin j1:=1;i1:=i1+1;end;

end;

if t=3 then begin

c:=c+1;if c=n+1 then begin c:=1;a:=a+1;end;

end;

end;

procedure print(pr:mas);

begin

for a:=1 to n do

begin

for c:=1 to n do

write(' ',pr[a,c],' ');

writeln;

end;

writeln;writeln('Ќ ¦ЁвҐ Enter ¤«п Їа®¤®«¦Ґ­Ёп !');

readln;

end;

begin

clrscr;

buf:=10;

for a:=1 to n do

for c:=1 to n do

begin

mas1[a,c]:=buf;

buf:=buf+1;

mas2[a,c]:=buf;

buf:=buf+1;

end;

print(mas1);print(mas2);

a:=1;c:=1;i:=1;j:=1;i1:=1;j1:=1;

while (i<>n+1)and(i1<>n+1) do

begin

if mas1[i,j]<mas2[i1,j1] then begin mas3[a,c]:=mas1[i,j];next(1);end

else begin mas3[a,c]:=mas2[i1,j1];next(2);end;

next(3);

end;

if i=n+1 then while not(i1=n+1)do

begin

mas3[a,c]:=mas2[i1,j1];

next(3);next(2);

end;

if i1=n+1 then while not(i=n+1)do

begin

mas3[a,c]:=mas2[i,j];

next(3);next(1);

end;

for a:=1 to n*2 do

begin

for c:=1 to n do

write(' ',mas3[a,c],' ');

writeln;

end;

writeln;writeln('Ќ ¦ЁвҐ Enter ¤«п Їа®¤®«¦Ґ­Ёп !');

readln;

end.

Результаты работы:

10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40   Нажмите Enter для продолжения !   11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41   Нажмите Enter для продолжения !   10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41   Нажмите Enter для продолжения !

 

Лабораторная работа № 4.

Работа с массивами чисел.

Цель задания:

1. Получение практических навыков при работе с массивами.

2. Знакомство с алгоритмами упорядочения.

Постановка задачи:

1. Написать программу, которая для введенного числа N формирует двумерный массив заданного в варианте вида. В задании дан массив для N = 4.

2. Выполнить конкретное задание. Программа должна работать с массивами для любого N.

Содержание отчета:

1. Постановка задачи для конкретного варианта.

2. Текст программы.

3. Результаты тестов.

4. Распечатка результатов работы программы.

Образец выполнения задания.

Лабораторная работа № 4.

Работа с массивами чисел.

Постановка задачи:

Написать программу, которая для введенного числа N формирует двумерный массив заданного в варианте вида. В задании дан массив для N = 4.

Выполнить конкретное задание. Программа должна работать с массивами для любого N.

Вид массива:

Полученный массив напечатать.

Найти количество чисел, входящих в массив больше одного раза. Результат напечатать.

Печать и задание оформить в виде процедур.

 

Текст программы:

program 2D_Array;

uses crt;

label sle;

const n=4;

par=(n*4);

type matriz=array[1..n,1..n] of integer;

var i,j,i1,j1,kol,kolo,l,k:integer;

mas:matriz;

im:array[1..par] of integer;

procedure vvod(var vmas:matriz);

begin

clrscr;

writeln('Вводим элементы массива , размерность [',n,',',n,']');

for i:=1 to n do

for j:=1 to n do

begin

write('Введите элемент [',i,',',j,']=');

readln(vmas[i,j]);

end;

end;

procedure print(vmas:matriz);

begin

writeln('Ваш массив имеет вид.');

for i:=1 to n do

begin

for j:=1 to n do

begin

write(' ',vmas[i,j],' ');

end;

writeln;

end;

end;

begin

vvod(mas);

print(mas);

for i:=1 to par do im[i]:=0;

k:=1;

kolo:=0;

for i:=1 to n do

for j:=1 to n do

begin

for l:=1 to par do if im[l]=mas[i,j] then goto sle;

kol:=0;

for i1:=1 to n do for j1:=1 to n do if mas[i,j]=mas[i1,j1] then kol:=kol+1;

if kol>1 then

begin

kolo:=kolo+kol;

im[k]:=mas[i,j];

k:=k+1;

end;

sle:end;

writeln('Количество чисел, входящих в массив больше одного раза(без нулей) =',kolo);

writeln('Программа закончена , нажмите Enter.');

readln;

end.

Результаты работы:

Ваш массив имеет вид. 0 0 0 4 0 0 3 4 0 2 3 4 1 2 3 4 Количество чисел, входящих в массив больше одного раза (без нулей) =9 Программа закончена, нажмите Enter.  

 

Варианты заданий.

1) Вид массива:

Полученный массив напечатать.

Найти суммы чисел в первом и последнем столбцах и сравнить их.

Вывести результаты на печать с соответствующим сообщением.

Задания и печать оформить в виде процедур (функций).

2) Вид массива:

Полученный массив напечатать.

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

Печать и задания оформить в виде процедур (функций).

3) Вид массива:

Полученный массив напечатать.

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

Задания и печать оформить в виде процедур или функций.

4) Вид массива:

Полученный массив напечатать.

Упорядочить массив по убыванию элементов в каждом столбце. Результат напечатать.

Печать и задания оформить в виде процедур.

5) Вид массива:

Полученный массив напечатать.

Упорядочить массив по возрастанию элементов в каждой строке.

Печать и задание оформить в виде процедур (функций).

6) Вид массива:

Полученный массив напечатать.

Найти произведение индексов элементов в первой строке, а затем в последней, и сравнить их. Результаты напечатать с соответствующими заголовками.

Печать и задание оформить в виде процедур.

7) Вид массива:

Полученный массив напечатать.

Найти количество чисел, входящих в массив только один раз. Результат напечатать.

Печать и задание оформить в виде процедур (функций).

8) Вид массива:

Полученный массив напечатать.

Найти сумму максимального и минимального элементов. Полученное значение увеличить на 10. Результат напечатать.

Печать и задание оформить в виде процедур.

9) Вид массива:

Полученный массив напечатать.

В каждой строке найти наибольший элемент, затем получить их сумму. Результат напечатать.

Печать и задание оформить в виде процедур.

10) Вид массива:

Полученный массив напечатать.

Выяснить, есть ли в массиве хотя бы одна пара совпадающих по величине чисел. Результат напечатать.

Печать и задание оформить в виде процедур.

11)Вид массива:

Полученный массив напечатать.

В каждом столбце найти наименьший элемент, затем найти их произведение. Результат напечатать.

Печать и задание оформить в виде процедур (функций).

12) Вид массива:

Полученный массив напечатать.

Переставить элементы массива так, чтобы все нули оказались в конце. Преобразованный массив напечатать.

Печать и задание оформить в виде процедур.

13) Вид массива:

Полученный массив напечатать.

Найти произведение последних элементов строк. Результат напечатать.

Печать и задание оформить в виде процедур (функций).

14) Вид массива:

Полученный массив напечатать.

Найти сумму элементов, расположенных ниже главной диагонали, и количество элементов, расположенных выше главной диагонали. Результаты напечатать.

Печать и задание оформить в виде процедур (функций).

15) Вид массива:

Полученный массив напечатать.

Перевернуть строку, содержащую максимальное число нулей, и столбец, содержащий минимальное число нулей. Преобразованный массив напечатать.

Печать и задание оформить в виде процедур.

16) Вид массива:

Полученный массив напечатать.

Найти сумму элементов, расположенных на главной диагонали в строках, начинающихся с нуля. Результат напечатать.

Печать и задание оформить в виде процедур.

17) Вид массива:

Полученный массив напечатать.

Упорядочить элементы, находящиеся выше главной диагонали, по убыванию. Преобразованный массив напечатать.

Печать и задание оформить в виде процедур.

18) Вид массива:

Полученный массив напечатать.

Перевернуть все четные строки массива. Преобразованный массив напечатать.

Печать и задание оформить в виде процедур.

19) Вид массива:

Полученный массив напечатать.

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

Печать и задание оформить в виде процедур.

20) Вид массива:

Полученный массив напечатать.

Перевернуть все нечетные столбцы массива. Преобразованный массив напечатать.

Печать и задание оформить в виде процедур.

21) Вид массива:

Полученный массив напечатать.

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

Печать и задание оформить в виде процедур.

22) Вид массива:

Полученный массив напечатать.

Найти третий по величине элемент массива. Результат напечатать.

Печать и задание оформить в виде процедур (функций).

23) Вид массива:

Полученный массив напечатать.

Поставить последнюю строку массива на первое место, не меняя порядок остальных. Результат напечатать.

Печать и задание оформить в виде процедур.

24) Вид массива:

Полученный массив напечатать.

Поставить последний столбец на первое место, не меняя порядок остальных. Результат напечатать.

Печать и задание оформить в виде процедур.

Обработка строк.

Для обработки текстовых данных используется строковой тип данных String. Строка –это последовательность символов из кодовой таблицы, заключённая в апострофы. Каждая строка характеризуется своей текущей длинною ( количеством символов, имеющихся в строке в данный момент), порядком расположения символов. По умолчанию для строк определена максимальная длинна, равная 255 символам, но её можно изменить, указав при описании: string [ число символов ]. Если строка длиннее максимальной длинны, то не поместившиеся символы отбрасываются

Символьным константам можно присваивать имена.

Const st=’строка’;

Символьные переменные описываются в разделе описания переменных с описателем String.

Var st1,st2:string[10];

st3:string;

Begin

st1:=’строка’;

End.

К любому символу в строке можно обратится точно так же, как к элементу одномерного массива, т.е. указав имя строки и индекс символа в этой строке.

Например:st[3]=’р’. При этом для элемента строки разрешены те же операции и функции, что и для типа char.

Строки выводятся и вводятся с помощью операторов read, readln, write, writeln без организации циклов.

Над строками выполняется операция сцепления, которая позволяет соединить две или более строк в одну без разделителей.

Пример:st1:=’Кро’;

st2:=’ил’;

st3:=st1+’код’+st2;

Результат:st3=’Крокодил’;

Над строками выполняются операции сравнения:

= , < , > , <= , >= , <>. Строки сравниваются посимвольно слева направо до первого результата или до исчерпания символов строки.

 

Например: ’азбука’=’азбука’, т.к. все символы поэлементно совпадают.

 

Например: ’школа’<’школьник’. Результат сравнения (true) , т.к.

 

‘ш’=’ш’, ’к’=’к’, ’о’=’о’, ’л’=’л’, ’а’<’ь’ (символ ‘а’ расположен в кодовой таблице раньше символа ‘ь’).

 

 

Функции обработки строк.

Сцеплениеconcat(строка1, строка2,….), Аналогична операции сцепления.

Пример: Исходные данные: a=’код’, b=’ил’.

Оператор: s:=concat(‘кро’,a,b).

Результат: s=’крокодил’.

 

Копироватьcopy(строка, число1, число2). Из указанной строки выделяется подстрока, начиная с позиции, заданной числом1, длиной, заданной числом2.

Пример: Исходные данные: s=’крокодил’.

Оператор: b:=copy(s,2,3).

Результат: b=’рок’.

 

Позиция - Pos(строка1, строка2). Отыскивает первое вхождение строки1 в строке2 и возвращает номер начальной позиции вхождения или ноль, если строка1 не входит в строку2.

Пример: Исходные данные: s=’крокодил’.

Оператор: i:=pos(‘око’,s).

Результат: i=3.

Оператор: i:=pos(‘я’,’крокодил’).

Результат: i=0.

 

Длина - length(строка). Возвращает длину строки – аргумента.

Пример: Исходные данные: s=’крокодил’.

Оператор: j:=length(s).

Результат: j=8.

Процедуры обработки строк.

Вставитьinsert(строка1, строка2, число). Вставляет строку1 в строку2, начиная с позиции, заданной числом. Если в результате получается строка длины больше максимальной, то она усекается справа.

Пример: Исходные данные: S=’крокодил’.

Оператор: d:=copy(s,3,3).

Результат: d=’око’.

Оператор: insert(‘h’,d,3).

Результат: d=’окно’.

 

Удалитьdelete(строка, число1, число2). Удаляет из строки подстроку, начиная с позиции, заданной числом1, длиною, заданной числом2. Если число1 больше размера строки, то подстрока не удаляется. Если число2 больше имевшегося количества, то удаляются символы до конца строки.

Пример: Исходные данные: S=’крокодил’.

Оператор: delete(s,4,3).

Результат: =’кроил’.

Оператор: delete(s,1,1).

Результат: s=’роил’.

 

Преобразовать число в строкуstr(число[:M[:N]],строка). Преобразует число в строку. M задаёт общее количество символов, получаемых в строке, N – для вещественных чисел (типа real) задаёт количество цифр в дробной части.

Пример:

Оператор: str(123,s).

Результат: s=’123’.

 

Преобразовать строку в числоval(строка, число, код). Преобразует строку символов во внутреннее представления числа. Код указывает номер неправильного символа или равен 0 в случае успешного преобразования.

Пример:

Оператор: val(‘+12.3’,v,k).

Результат: v=12.3, k=0 {преобразование прошло успешно}

Оператор: val(‘23+5’,v,k).

Результат: v=неправильно, k=3 {ошибка при попытке преобразовать третий символ}

 

 

Лабораторная работа № 7.

Обработка строк.

Цель задания:

1. Получение практических навыков в работе со строками.

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

Постановка задачи:

1. Для решения конкретного варианта составить программу.

2. Вывести на печать результат выполнения программы.

Содержание отчета:

1. Постановка задачи для конкретного варианта.

2. Текст программы.

3. Результаты выполнения программы.

 

Образец выполнения задания.

Лабораторная работа № 7, вариант № 8.

Обработка строк.

Постановка задачи для конкретного варианта:

Задана строка, состоящая из слов, разделённых одним или несколькими пробелами. Удалить повторные вхождения каждого слова.

Выделяем слова, переписываем их в первую строку двумерного массива, во вторую записываем ‘0’ для уникального слова и ‘1’- для повторяющегося слова. Затем формируем строку, состоящую из элементов первой строки массива, у которых во второй строке записано '0‘ и распечатываем строку.

 

 

Текст программы:

 

program lab7{вариант № 8};

const nn=10;

type mas=array [1..2,1..nn] of string;

var a:mas;

n:integer;

s,ss:string; {исходная и вспомогательная строки}

i, j, k:integer;

begin

write(‘Введите строку : ’);readln(s);

s:=s+’ ’;

j:=0; ss:=’ ’;

for i:=1 to length(s)-1 do

if (s[i]<>’ ’)and(s[i+1]=’ ’) {выделение слов}

then begin

ss:=ss+s[i];

j:=j+1;a[1, j]:=ss;a[2, j]:=’0’; {в первую строку}

ss:=’ ’; {записываем слово}

end; {‘0’ во второй строке означает, что слово встретилось впервые}

else if s[i]<>’ ’ then ss:=ss+s[i];

for i:=1 to j-1 do

for k:=i+1 to j do

if (a[2,i]<>’1’)and(a[2,k]<>’1’)and(a[1,i]=a[1,k]) then a[2,k]=’1’; {нашли совпавшие слова}

s:=’ ’;

for i:=1 to j do

if a[2,i]<>’1’ then s:=s+a[1,i]+’ ’;

writeln(‘Результат : ’,s);

end.

Результаты выполнения программы:

  Введите строку: жили были жили Результат: жили были

Варианты заданий.

1. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Упорядочить слова предложения в алфавитном порядке.

 

2. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Найти самое длинное слово в предложении.

 

3. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Подсчитать количество гласных русских букв в предложении.

 

 

4. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Вывести на экран все слова, преобразовав каждое при этом следующим образом: первую букву слова заменить последней.

 

5. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Выяснить какая буква встречается чаще всего.