![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Описание двумерных массивов.
Двумерный массив можно рассматривать как одномерный массив, каждый элемент которого сам является одномерным массивом. Поэтому для работы с элементами двумерного массива нужно организовать два цикла. Каждый из них отвечает за перебор значений соответствующего индекса. Для двумерного массива можно использовать те же схемы перебора, что и для одномерного, но комбинаций здесь будет в два раза больше. Рассмотрим один из способов ввода элементов двумерного массива. Будем использовать схему перебора по одному от начала массива к концу. Считаем что массив имеет размерность 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. Результаты работы:
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. Результаты работы:
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. Результаты работы:
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. Результаты работы:
Лабораторная работа № 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. Результаты работы:
Варианты заданий. 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; Просмотров: 1409; Нарушение авторского права страницы