Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Тема 18. Алгоритмизация процесса обработки табличной информации. Работа с числовыми массивами.Содержание книги
Поиск на нашем сайте
Массивы
Задача 1: Составить программу подсчета суммы и произведения элементов одномерного массива. Program sum-prois; uses crt; const n = 100; var a: array [1…n] of real; n, k, i: integer; p, s: real; begin clrscr; s: = 0; p: =1; writeln ('введите размер массива'); readln (nk); writeln ('введите элемент массива'); for i:=1 to nk do readln (a[i]); for i:=1 to nk do begin s:= s + a[ i ]; p:= p * a[ i ]; end; writeln ('Сум. = ', s, 'Произ. =', p); end. Необходимо подготовить ячейки: при накапливании суммы - s=0 при подсчете произведения - p=1. Задача рассчитана на обработку массива с максимальным размером 100 элементов (n=100). Конкретный размер массива вводится с клавиатуры (nk). При каждом прохождении через цикл с клавиатуры вводится только один элемент массива. Два цикла for можно было объединить в один. Двумерные массивы. Двумерный массив можно представить в виде матрицы. Описание двумерных массивов: a - имя массива; n, m - количество строк и столбцов в массиве. Размер массива - n m. a[i, j] - элемент стоящий на пересечении i-ой строки и j-го столбца. Каждый элемент определяется двумя индексами. a[i, i] - элементы главной диагонали. a[i, 2] - элементы второго стлбца. Задача 1. Составить программу подсчета суммы элементов над главной диагональю в двумерном массиве. Program matrix; const n=10; m=10; var a: array [1…n, 1…m] of real; i, j: integer; n, m: integer; s: real; begin s:=0; writeln (' введите размер массива m, n); readln (n, m); {Ввод массива:} for i:=1 to n do for j:=1 to m do readln (a[i, j]);
for i:=1 to n do for j:=i to m do s: s+a[i, j]; writeln('s=', s); end. Для ввода элементов массива используются вложенные циклы. i - параметр внешнего цикла; j - параметр внутреннего цикла; i - меняется медленнее j. Элементы массива необходимо вводить по строкам.
Сортировка массива Под сортировкой массива подразумевается процесс перестановки элементов с целью упорядочивания их в соответствии с каким-либо критерием. Например, если имеется массив целых а, то после сортировки по возрастанию должно выполняться условие: а[ 1 ] < а[ 2 ]<... а[SIZE], size - верхняя граница индекса массива. Так как можно сравнивать переменные типов INTEGER, REAL, CHAR и STRING, то можно сортировать массивы этих типов. Задача сортировки распространена в информационных системах и используется как предварительный этап задачи поиска, так как поиск в упорядоченном (отсортированном) массиве проводится намного быстрее, чем в неупорядоченном. Существует много методов (алгоритмов) сортировки массивов. Здесь мы рассмотрим два метода: метод прямого выбора; метод прямого обмена.
Сортировка методом прямого выбора Алгоритм сортировки массива по возрастанию методом прямого выбора может быть представлен так. 1. Просматривая массив от первого элемента, найти минимальный и поместить его на место первого элемента, а первый на место минимального. 2. Просматривая массив от второго элемента, найти минимальный и поместить его на место второго элемента, а второй на место минимального. 3. И так далее до предпоследнего элемента. Ниже представлена программа сортировки массива целых чисел по возрастанию. Для демонстрации процесса сортировки программа выводит массив после каждого обмена элементов. Program sort1; const SIZE=5; var a: array [1.. SIZE] of integer; i: integer; { номер элемента, от которого ведется поиск минимального элемента } min: integer; { номер минимального элемента в части массива от i до верхней границы массива } j: integer; { номер эл-та, сравниваемого с минимальным } buf: integer; {буфер, используемый при обмене элементов массива} k: integer; begin writeln (' Сортировка массива. '); write('Введите', SIZE:3,' целых в одной строке '); writeln ('через пробел и нажмите '); for k:=l to SIZE do read(a[k]); writeln (' Сортировка'); for i:=l to SIZE-1 do begin { поиск минимального эл-та в части массива от а[ i ] до a[SIZE]} min: =i; for j:=i+l to SIZE do begin if a[ j ] < a[min] then min:= j; { поменяем местами a[min] и a[i]) buf: =a [ i ]; а [ i ]: =a [min]; а [ min ]: =buf; { выведем массив } for k:= l to SIZE do write (a [k], ' '); writeln; end; end; writeln ('Массив отсортирован. '); end.
Сортировка методом прямого обмена В основе алгоритма лежит обмен соседних элементов массива. Каждый элемент массива, начиная с первого, сравнивается со следующим, и если он больше следующего, то элементы меняются местами. Таким образом, элементы с меньшим значением продвигаются к началу массива (всплывают), а элементы с большим значением - к концу массива (тонут), поэтому этот метод иногда называют "пузырьковым". Этот процесс повторяется на единицу меньше раз, чем элементов в массиве. Ниже представлена программа сортировки массива целых чисел по возрастанию. Для демонстрации процесса сортировки программа выводит массив после каждого цикла обменов. Program sort2; const SIZE=5; var a: array [1.. SIZE] of integer; i: integer; { счетчик циклов } k: integer; { текущий индекс элемента массива } buf: integer; begin writeln (' Сортировка массива пузырьковым методом. '); write('Введите', SIZE:3,' целых в одной строке через пробел '); writeln (' и нажмите '); for k:=l to SIZE do read(a[k]); writeln (' Сортировка.'); for i:=l to SIZE-1 do begin for k:= l to SIZE - 1 do begin if a[ k ] < a[ k+1] then begin { поменяем местами a[ k ] и a[k +1]) buf: =a [ k ]; а [ k ]: =a [ k + 1]; а [ k + 1 ]: =buf; end; end; for k:= l to SIZE do write (a [k], ' '); writeln; end; writeln ('Массив отсортирован. '); end.
Поиск в массиве При решении многих задач возникает необходимость установить, содержит массив определенную информацию или нет. Например, проверить, есть ли в массиве фамилий студентов фамилия "Петров". Задачи такого типа называются поиском в массиве. Для организации поиска в массиве могут быть использованы различные алгоритмы. Наиболее простой - это алгоритм простого перебора. Поиск осуществляется последовательным сравнением элементов массива с образцом до тех пор, пока не будет найден элемент, равный образцу, или не будут проверены все элементы. Алгоритм простого перебора применяется, если элементы массива не упорядочены. Ниже приведен текст программы поиска в массиве целых чисел. Перебор элементов массива осуществляет инструкция REPEAT, в теле которой инструкция IF сравнивает текущий элемент массива с образцом и присваивает переменной naiden значение TRUE, если текущий элемент равен образцу. Цикл завершается, если в массиве обнаружен элемент, равный образцу (naiden=TRUE), или если проверены все элементы массива. По завершении цикла по значению переменной found можно определить, успешен поиск или нет. Program poisk1; var massiv:array[l..10] of integer; { массив целых} obrazec: integer; { образец для поиска } naiden: boolean; { признак совпадения с образцом) i: integer; begin { ввод 10 целых чисел } writeln (' Поиск в массиве. '); write ('Введите 10 целых в одной строке через пробел '}; wrtteln (' и нажмите '); write (' ->'); for i:=l to 10 do read (massiv[ i ]); { числа введены в массив) write ('Введите образец для поиска (целое число) -> '); readln(obrazec); { поиск простым перебором } naiden:=FALSE; { совпадений нет } i:= l; { проверяем с первого элемента массива } repeat if massiv[ i] = obrazec then naiden:=TRUE { совпадение с образцом } else i:=i+l; { переход к следующему элементу} until (i>10) or (naiden); { завершим, если совпадение} { с образцом или проверен } { последний элемент массива } if naiden then writeln (' Совпадение с элементом номер', i:3,'. ','Поиск успешен.') else writeln (' Совпадений с образцом нет.'); end.
Поиск минимального (максимального) элемента массива Алгоритм поиска минимального (максимального) элемента массива довольно очевиден: делается предположение, что первый элемент массива является минимальным (максимальным), затем остальные элементы массива сравниваются с этим элементом. Если обнаруживается, что проверяемый элемент меньше (больше) принятого за минимальный (максимальный), то этот элемент принимается за минимальный (максимальный) и продолжается проверка оставшихся элементов. Ниже представлена программа поиска минимального элемента в массиве целых чисел. const GRAN I CA= 10; var a:array [I..GRANICA] of integer; { массив целых } min: integer; { номер минимального эл-та массива } i: integer; { номер эл-та сравниваемого с минимальным} begin { здесь инструкции ввода массива} min:=l;{ пусть первый элемент минимальный } for i:=2 to GRANICA do if a[i] < a[min] then min:=i; writeln ('Минимальный элемент массива: ', а [min]); writeln ('Номер элемента: ',min); end.
Многомерные массивы В программе для хранения и обработки табличных данных можно использовать совокупность одномерных массивов. Например, таблица результатов производственной деятельности нескольких филиалов фирмы может быть представлена так: zavodl: array [ I.. 4] of integer; zavod2: array [ I.. 4] of integer; zavod3: array [ I.. 4] of integer; Для подобных случаев Паскаль предоставляет более удобную структуру данных - двумерный массив. В общем виде описание двумерного массива выглядит так: Имя:array[НижняяГраницаИндекса1..ВерхняяГраницаИндекса1,НижняяГраницаИндекса2.. ВерхняяГраницаИндекса2] оf Тип, где Имя - имя массива, array - слово языка ТП, показывающее, что описываемый элемент данных - массив; НижняяГраницаИндекса1..ВерхняяГраницаИндекса1, НижняяГраницаИндекса2.. ВерхняяГраницаИндекса2 - константы или выражения типа INTEGER, определяющие диапазон изменения индексов и, следовательно, число элементов массива, Тип - тип элементов массива. Приведенная выше таблица может быть представлена в виде двумерного массива так: product: array[l..3,l..4] of integer Этот массив состоит из 12 элементов типа INTEGER. Чтобы использовать элемент массива, нужно указать имя массива и индексы элемента. Первый индекс обычно соответствует номеру строки таблицы, второй - номеру колонки. Так, элемент product [ 2, 3] содержит число продуктов третьего наименования, выпущенных вторым заводом. Значения элементов двумерных массивов выводят на экран и вводят с клавиатуры, как правило, по строкам, т. е. сначала все элементы первой строки, затем второй и т. д. Это удобно выполнять при помощи вложенных инструкций FOR. Следующий фрагмент программы выводит на экран значения элементов массива по строкам: for i:=l to 3 do begin for j:= 1 to 4 do write (product[i,j]); writeln; end; Каждый раз, когда внутренний цикл завершается, внешний цикл увеличивает i на единицу, и внутренний цикл выполняется вновь. Таким образом, выводятся все компоненты массива product: product [ 1, 1 ], product [ 1, 2 ], product [ 1, 4 ], product [ 2, 1 ], product [ 2, 2 1,... product [ 2, 4 ] и т. д. При описании массивов в программе удобно использовать именованные константы как значения верхних границ индексов массива.
|
||||
Последнее изменение этой страницы: 2016-12-10; просмотров: 298; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.22.241.228 (0.007 с.) |