Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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

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

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

 

Последнее изменение этой страницы: 2016-03-15; Просмотров: 83; Нарушение авторского права страницы


lektsia.com 2007 - 2017 год. Все права принадлежат их авторам! (0.084 с.) Главная | Обратная связь