Двумерный массив можно рассматривать как одномерный массив, каждый элемент которого сам является одномерным массивом. Поэтому для работы с элементами двумерного массива нужно организовать два цикла. Каждый из них отвечает за перебор значений соответствующего индекса. Для двумерного массива можно использовать те же схемы перебора, что и для одномерного, но комбинаций здесь будет в два раза больше.
Рассмотрим один из способов ввода элементов двумерного массива. Будем использовать схему перебора по одному от начала массива к концу. Считаем что массив имеет размерность 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. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Выяснить какая буква встречается чаще всего.