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