Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Особенности и примеры использования массивов при разработке программ (Способы описания алгоритмов)

Содержание:

ВВЕДЕНИЕ

Актуальность темы работы вызвана тем, что информационные технологии играют все более важную роль в современном обществе, проникая во все сферы деятельности. Чтобы обслуживать общественные потребности в автоматизации труда, хранения данных, связи и другие развивают языки программирования. Сегодня языки программирования используют для решения более разнообразных задач.

Изучение различных языков программирования и их особенностей помогает программистам в правильном выборе языка для решения определенных задач.

Программирование - это процесс создания инструкций для обработки информации центральным процессором. Существуют основные этапы при создании любой программы – разработка алгоритма, создание блок – схемы алгоритма, создание программы, компиляция и отладка.

Объект исследования - язык программирования Дельфи.

Предмет исследования – массивы данных в Дельфи.

Цель курсовой работы – изучение использования массивов данных в программировании, написание и отладка программ с использованием массивов на языке Дельфи 7.

При достижении цели курсовой работы решены задачи:

  • изучены основы алгоритмизации задач;
  • проведен обзор языков программирования высокого уровня, включая и язык Дельфи;
  • рассмотрено применение массивов одномерных и многомерных в Дельфи;
  • написана и отлажена программа massiv.pas, использующая одномерный массив;
  • написана и отлажена программа massiv2.pas, использующая двумерный массив.

При подготовке работы использовались учебное пособие «Основы алгоритмизации и программирования» Г.Р. Кадыровой; «Программирование и основы алгоритмизации» авторов А.Г. Аузяк, Ю.А. Богомолов, А.И. Маликов, Б.А. Старостин; учебники Фаронова В.В. «Delphi. Программирование на языках высокого уровня»; Осипова Д.Л. «Delphi. Программирование для Windows, OS X, iOS и Android» и другие.

Основы построения алгоритмов

Понятие алгоритмов

Алгоритм является точным предписанием, определяющим последовательность действий для получения нужного результата из исходных данных.

Данное определение алгоритма не считается строгим - не вполне ясно, что такое «точное предписание» или «последовательность действий, обеспечивающая получение требуемого результата». [5, с. 6-7]

Поэтому обычно формулируется несколько общих свойств алгоритмов, отличающих алгоритмы от других инструкций. Такие свойства представлены: [6, c. 8-9]

  • Дискретностью (прерывностью, раздельностью) - алгоритм должен быть процессом решения задачи в виде последовательного выполнения простых шагов. Каждое действие алгоритма выполняется только после конца исполнения предыдущего.
  • Определенностью - каждое правило алгоритма должно быть четко, однозначно и без произвола. Благодаря определенности выполнение алгоритма происходит механически и не нужны никакие дополнительные указания или сведения о решаемой задаче.
  • Результативностью (конечностью) - алгоритм должен решать задачу за конечное количество шагов.
  • Массовостью - алгоритм решения задачи разрабатывают в общем виде с целью применения для однотипного класса задач с различными исходными данными, выбираемыми из некой области, называемой областью применимости алгоритма. [1, c. 8-9]

Выражение «свойства алгоритма» является не совсем корректным. Свойствами обладают объективно существующие реальности. Алгоритм же является искусственной конструкцией, сооружаемой для достижения определенных целей. Для выполнения алгоритмом своего предназначения, он должен строиться по определенным правилам. Поэтому корректно говорить не о свойствах алгоритма, а о правилах построения алгоритма, или о требованиях, предъявляемых к алгоритму. [1, с. 8-9]

Итак, алгоритм – понятие теории алгоритмов, каждому определенному набору входных данных ставящий в соответствие некоторый набор выходных данных, т.е. вычисляющий (реализующий) функцию. Рассматривая конкретные вопросы в теории алгоритмов всегда имеют в виду какую-то конкретную модель алгоритма. [7, с. 4-7]

1.2. Способы описания алгоритмов

 Основные способы описания алгоритмов состоят из:

  • словесно-формульного (на естественном языке);
  • структурного или блок-схемного;
  • с использованием специальных алгоритмических языков.

При разработке программ чаще всего пользуются словесно-формульным и блок-схемным способами. [6, с. 9-10]

Словесно-формульный способ. При этом способе алгоритм записывают текстом с формулами по пунктам, определяющим последовательность действий. К примеру, нужно найти следующее значение:

с=(а+5)/(b+3). [7, с. 4-7]

Словесно-формульный способ записи алгоритма решения этой задачи может выглядеть так: 

1. Ввод значений а и b. 

2. Умножение а на 5. 

3. Умножение b на 3. 

4. Деление из (а+5)/(b+3). 

5. Вывод результата c.

Блок-схемы. Наиболее удобным для программиста является блок-схемное описание алгоритма, изображаемое геометрическими фигурами (блоками), связанными линиями со стрелками. В блоках записывают последовательность действий. [7, с. 4-7]

Данный способ в сравнении с другими способами записи алгоритма обладает рядом преимуществ. Он более нагляден: каждую операцию вычислительного процесса изображает отдельная геометрическая фигура. Кроме этого, графическим изображением алгоритма наглядно показываются разветвления путей решения задачи в зависимости от различных условий, повторение отдельных этапов вычислительного процесса и другое. [1, с. 8-10]

Программы должны быть оформлены в соответствии с определенными требованиями. В настоящее время действует единая система программной документации (ЕСПД), устанавливающая правила разработки, оформления программ и программной документации. ЕСПД определяет и правила оформления блок-схем алгоритмов (ГОСТ 10.002-80 ЕСПД, ГОСТ 10.003-80 ЕСПД).

Операции обработки данных и носители информации изображены на схемах соответствующими блоками. В одной схеме рекомендуется изображение блоков одинаковых размеров с их нумерацией. Линии соединений блоков и указывающие последовательность связей между ними, проводятся параллельно линиям рамки. Стрелку в конце линии можно не ставить, если линия направляется слева направо либо сверху вниз. В блок может входить несколько линий. Из блока (кроме логического) может выходить только одна линия. Из логического блока выходят две линии и может иметь один из двух блоков. [12]

Схема алгоритма должна выполняться как единое целое, однако при необходимости допускается обрыв линии, соединяющей блоки. Если при обрыве линии продолжение схемы находится на этом же листе, то на обоих концах линии изображается специальный символ соединитель — окружность диаметром 0,5 мм, внутри которых указывается один и тот же идентификатор. В качестве идентификатора, как правило, используют порядковый номер блока, к которому направляется соединительная линия. Если схема расположена на более чем одном листе, то при разрыве линии вместо окружности используют межстраничный соединитель. Внутри каждого соединителя указывают адрес — откуда и куда направляется соединительная линия. Запись адреса в две строки: в первой указывается номер листа, во второй — порядковый номер блока. Основные блоки схем алгоритмов даны в Приложении 1.

Блок-схема должна состоять из всех разветвлений, циклов и обращений к подпрограммам, содержащихся в программе. [9]

Основные алгоритмические структуры

По типу используемого вычислительного процесса алгоритмы бывают линейными (прямыми), разветвляющимися и циклическими.

Линейными алгоритмами описываются линейные вычислительные процессы, выполнение этапов которого однократно и последовательно. Линейный алгоритм включает последовательное выполнение этапов:

  • ввода исходных данных в память ЭВМ;
  • вычисления искомых величин по формулам;
  • вывода результатов из памяти ЭВМ на внешний носитель. [6, с. 12-13]

Пример 1. Разработать алгоритм определения площади круга по формуле S = πR2. Блок-схема алгоритма дана на рис. 1. [7, с. 15-16]

Начало

Ввод R

S=π R2

Вывод S

Конец

Рисунок 1 - Линейный алгоритм

Разветвляющимся алгоритмом описывается вычислительный процесс, реализуемый по одному из нескольких заранее предусмотренных направлений - ветвей. Выбор конкретной ветви вычисления зависим от результатов проверки выполнения некого логического условия. Результатом проверки является: "истина" (да) при выполнении условия, и "ложь" (нет), если не выполняется условие. [6, с. 13-14]

Пример 2. Разработать алгоритм определения функции

F(x) = 2x при x > 0 и

F(x) = х2 при x < 0.

Блок - схему разветвляющегося алгоритма представляет рисунок 2.

Начало

Начало

Ввод х

x>0

F=0

F=x*x

Конец

Вывод F

Рисунок 2 - Разветвляющийся алгоритм [7, с. 16]

Циклическим алгоритмом описывается вычислительный процесс, многократно повторяющийся. Существуют простые циклы, не содержащие внутри себя другие циклы, и сложные (вложенные), содержащие несколько вложенных циклов. Существуют циклы с известным числом повторений и циклы с неизвестным числом повторений. [1, с. 32]

Цикл с известным числом повторений состоит из последовательности:

  • подготовки первого выполнения цикла (присвоения счетчику цикла начального значения);
  • тела цикла, состоящего из блоков, выполняемых многократно;
  • изменения значения счетчика циклов и сравнения его с конечным значением. [1, с. 31-33]

Существуют структуры повторения "повторение ДО" (повторение до выполнения условия окончания цикла) или "повторение ПОКА" (повторение пока выполняется условие продолжения цикла). В первом случае проверка условий окончания цикла осуществляется в конце цикла (рис. 3, а), во втором - в начале цикла (рис. 3, б).

Как видно из блок-схем, цикл "повторение ДО " выполняется, по крайней мере, один раз, а цикл "повторение ПОКА" может сразу выйти из цикла.

Подготовка выполнения первого цикла

Подготовка выполнения первого цикла

Условие окончания

Тело цикла

нет

Тело цикла

Подготовка выполнения следующего цикла

Подготовка выполнения следующего цикла

Условие окончания

нет

да

а б

Рисунок 3 - Циклы с известным числом повторений [7, с. 17]

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

│Yi –Yi-1│<d, где d – допустимая точность вычисления. [6, с. 10-16]

Типовую структуру алгоритма итерационных вычислений демонстрирует рис. 4.

Y1=Y(0)

Задание начальных условий

Первая итерация

Y=f (Y1)

Вычисление текущей ошибки

D=│Y -Y1

Y1=Y

Переприсвоение

D≤d

Оценка точности

нет

да

Рисунок 4 - Циклы с неизвестным числом повторений [7, с. 19]

Сложные циклы. Вычислительные процессы, содержащие два и более включенных друг в друга циклов, называются сложные циклические процессы (алгоритмы). Цикл, содержащий внутри себя другой цикл, называется внешним, а содержащийся внутри цикл - внутренним (вложенным). Нужно учесть, что за одно выполнение внешнего цикла происходит многократное повторение внутреннего цикла. [1, с. 35-37]

Пример 5. Разработать алгоритм вычисления и вывода на печать функции y = x*z / (b + c) при изменении аргументов 1< x < 8 c шагом ∆x = 1 и 1< z<5 c шагом ∆z = 1. Алгоритм решения примера приведен на рис. 5.

Внутренний цикл организован по переменной z, а внешний - по переменной x. При каждом значении переменной x (переменной внешнего цикла) от 1 до 8 переменная z (переменная внутреннего цикла) изменяется от 1 до 5 с шагом 1.

Блок вывода на печать находится во внутреннем цикле, что позволяет отслеживать значения переменных на всем диапазоне их изменения. На рис. 6 эту же задачу решает модифицированная блок-схема алгоритма, в которой циклы представлены более компактными условными обозначениями, принципы организации которых проясняет рис. 7. [7, с. 21]

Ввод А,В

y=x*z/(A+B)

z=1

x=1

Ввод А,В

Х=1,10,1

Вывод x, y, z

z=1,4,1

z=z+1

да

y=x*z/(A+B)

z≤4

нет

Вывод x, y, z

x=x+1

x≤10

да

нет

Конец

Конец

Рисунок 5 - Алгоритм со сложным циклом

Рисунок 6 - Модифицированная блок-схема алгоритма

Вход в цикл

Х=1,10,2

Вход i+1 Выход из цикла

шага цикла

Выход i-го шага цикла

Рисунок 7 – Компактные условные обозначения

Первой цифрой внутри фигуры (рис. 7) задается начальное значение переменной, второй ее конечное значение, а третьей - шаг изменения переменной. При отсутствии последней цифры шаг изменения переменной по умолчанию равен 1. [7, с. 18-22]

2. Языки высокого уровня: понятие, достоинства

2.1. Обзор языков программирования высокого уровня

Со времени появления первых программируемых компьютеров было создано больше двух с половиной тысяч языков программирования, ежегодно их число увеличивается. Некоторые языки использует только небольшое число их собственных разработчиков, другими пользуются миллионы людей. Профессиональными программистами обычно применяется в своей работе несколько языков программирования. [13]

Языки программирования низкого уровня. На первых компьютерах программировали двоичными машинными кодами, что является достаточно трудоемкой и сложной задачей. Чтобы упростить эту задачу стали пользоваться языками программирования низкого уровня, задающими машинные команды в более понятном для человека виде. Преобразования их в двоичный код выполнялись специальными программами - трансляторами. [20]

Трансляторы подразделяются на:

  • компиляторы, превращающие текст программы в машинный код, сохраняемый и затем используемый уже без компилятора (к примеру, исполняемые файлы с расширением *. exe).
  • интерпретаторы, превращающие часть программы в машинный код, выполняющие его и затем переходящие к следующей части. Причем использование интерпретатора осуществляется каждый раз при выполнении программы. [19]

Пример языка низкого уровня - ассемблер. Языки низкого уровня ориентируются на конкретный тип процессора с учетом его особенностей, поэтому при переносе программы на ассемблере на другую аппаратную платформу ее нужно почти полностью переписывать. Синтаксис программ для разных компиляторов также различается. Правда, существует практическая совместимость центральных процессоров для компьютеров фирм AMD и Intel, отличия лишь в некоторых специфических командах. А вот специализированные процессоры для других устройств, например, видеокарт, телефонов существенно различаются.

Преимущество языков низкого уровня в том, что они позволяют создание эффективных и компактных программ, так как разработчик пользуется всеми возможностями процессора. [19]

Недостатки проявляются в том, что:

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

Языки высокого уровня (ЯВУ). Эти языки позволяют писать программы текстом, похожим на английский язык. Транслятор с языка высокого уровня переводит код на язык низкого уровня, затем Компилятор каждую команду преобразует в машинный код, создавая исполняемый файл. Программы, написанные на ЯВУ, более компактны, легче для понимания, а вероятность появления в них ошибок меньше, процесс отладки (поиска и исправления ошибок) легче. [17]

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

К языкам программирования высокого уровня относят: Фортран; Кобол; Алгол; Pascal; Basic; Java; DC, C++, C#; Objective C; Smalltalk; Delphi и другие. Перечислим достоинства языков высокого уровня:

  • aлфавит языка значительно шире машинного, чем достигается его большая выразительность и существенное повышение наглядности и понятности текста; 
  • набор используемых операций не зависит от набора машинных операций, их выбор определяется соображениями удобства составления алгоритма решения задач определенного класса; 
  • конструкциями команд (операторов) отражается содержательность видов обработки данных и задание в удобном для человека виде; 
  • использование аппарата переменных и действий с ними; 
  • поддержка широкого набора типов данных. 

Таким образом, языки программирования высокого уровня машинно-независимы и им необходимы соответствующие программы-переводчики (трансляторы) для представления программ на языке машин, на которых они будут выполняться. [14]

Недостаток ЯВУ в большом размере программ по сравнению с программами на языках низкого уровня. Поэтому в основном ЯВУ используют при разработках программного обеспечения компьютеров и устройств, имеющих большой объем памяти. А различные подвиды ассемблера применяют для программирования иных устройств, где имеет значение размер программ. [19]

Язык программирования высокого уровня (ЯПВУ) является инструментом, относящимся к категории машинно-независимых и позволяющим осуществление взаимодействия пользователя с ПК не зависимо от конкретного оборудования, установленного на компьютере. Поэтому он относится к машинно-независимым. При написании операционных систем чаще всего используется ЯПВУ, позволяющий писать программы текстом, схожим с английским языком. Программы, написанные на ЯПВУ, отличают большая компактность, легкость понимания, меньшая вероятность ошибок. [14]

Важнейшими элементами, входящими в ЯПВУ, являются трансляторы, функция которых может быть разной. Одно из ключевых применений трансляторов заключается в «переводе» команд на ЯПВУ, в машинный код, понятный компьютеру. Трансляторы с выполнением данной функции называют также компиляторами. Есть и иная разновидность— интерпретаторы, предназначенные для «перевода» высокоуровневых команд в понятные операционной системе или программам. [20]

Классификация высокоуровневых языков

Существует классификация высокоуровневых языков программирования по разным основаниям, наиболее распространенной является следующая:

- процедурно-ориентированные, задействуемые в качестве инструмента при обработке информации;

- проблемно-ориентированные, используемые для решения отраслевых и прикладных задач;

- объектно-ориентированные, являющиеся частным случаем языков первых двух видов, однако, адаптируемых к пользованию широким кругом разработчиков с различным уровнем подготовки. [16]

Рассмотрим некоторые исторические и современные ЯПВУ, входящие в каждую категорию данной классификации.

Процедурно-ориентированные языки

К таким можно отнести Фортран, считающийся первым ЯПВУ, созданным для широкого применения и характеризующимся простой структурой. К этому классу языков также относится Бейсик, один из наиболее часто используемых при обучении программированию. Пример другого языка этого класса — СИ, изначально созданный для ОС UNIX. На его основе впоследствии был создан язык C++, дополненный инструментами объектно-ориентированного программирования. Еще одним языком, относящимся к рассматриваемой категории является Паскаль, также часто используемым для обучения программированию, возможности которого позволяют его использование как очень мощного инструмента разработки профессиональных видов ПО. [16]

Проблемно-ориентированные языки

К таким относятся Лисп, Пролог. Лисп был разработан в 1962 г. через несколько лет после создания Фортрана и считается вторым в истории. Активно использовался как инструмент работы программистов со строками символов, на практике - в экспертных системах, а также для аналитических вычислений. Пролог широко применялся в области логического программирования, на практике чаще всего используется в алгоритмах искусственного интеллекта в соответствующих системах. [14]

Объектно-ориентированные языки

Изучим теперь примеры ЯПВУ, относящихся к объектно-ориентированным. К таковым относятся Visual Basic, Delphi, Visual Fortran, упомянутый выше C++, а также Prolog ++. Фактически все они основаны на процедурно-ориентированных языках. Однако необходимо существенно их дополнить визуальными элементами управления для последующего освоения необходимых алгоритмов разработчиками. Так, язык Фортран могут в оперативные сроки изучить IT-специалисты с помощью возможностей Visual Fortran. Аналогично возможно быстрое освоение Бейсика или Пролога. [20]

Универсальные высокоуровневые языки

Так, современными экспертами выделяются универсальные высокоуровневые языки, к которым относятся, в частности, разработанные в 60-е годы. Ключевые их характеристики заключаются в: - ориентации на широкий спектр задач (прежде всего, вычислительных); - большом количестве языковых конструкций и алгоритмов; - значимости для современного этапа развития компьютерной техники; - поддержке в соответствующих языках императивной методологии. [20]

Универсальные языки являются основополагающими в соответствующей отрасли IT-разработки. Отметим, что до сих пор у них нет прямых аналогов по внутренней структуре. Собственно, этим во многом объясняется актуальность задействования соответствующих языков в современных объектно-ориентированных интерфейсах. Также общим в отмеченных языках является тип данных. Этим фактором в значительной степени предопределяется их универсальность. Одно из наиболее примечательных свойств языков, относящихся к универсальным — в преемственности - исторически более поздние языки основаны на концепциях предшественников. [16]

Уникальные языки

Некоторыми IT-экспертами выделяются в самостоятельную категорию «уникальные языки», к которым относятся: APL, Cobol, Forth, SETL, а также CLU. Важнейшим аспектом APL является задействование массивов (векторов и матриц) как ключевого структурного типа. Спецификой языка Cobol является ориентированность на коммерческую сферу. Так, целесообразно его задействование для решения задач, связанных со стандартизированным форматом представления результатов.

Особенность языка Forth - использование постфиксной записи программ, а также задействование стековой нотации. В языке SETL одним из ключевых типов данных являются совокупности значений. ЯПВУ является также язык CLU, основной особенностью которого является работа с абстрактными типами данных. Многими IT-специалистами ожидаются появления новых решений, основанных на уникальных языках — таких как, к примеру, Object-Oriented Cobol. [19]

Средства параллельного программирования

Эта категория может состоять из огромного количества решений, которые могут классифицироваться по большому количеству оснований. К примеру, по методу организации процессов предполагается классификация средств параллельного программирования по наличию в них: сопрограмм; разветвлений; объединений; параллельных скобок; алгоритмов работы с процессами.

Другим основанием для классификации языков параллельного программирования являются методы синхронизации процессов. Соответствующие решения могут, таким образом, состоять из: семафоров; мониторов; «рандеву»; критических участков; дистанционного вызова процедур; транзакций, относящихся к категории атомарных. К языкам данного типа относятся Modula-2, BLISS, Concurrent Pascal, DP, Argus. [16]

2.2. Язык высокого уровня Delphi

Бурное развитие вычислительной техники, потребность в эффективных средствах разработки программного обеспечения привели к созданию систем "быстрой разработки", таких как Borland Delphi и Microsoft Visual Basic. Основа систем быстрой разработки (RAD-систем, Rapid Application Development) в технологии визуального проектирования и событийного программирования, суть которой в том, что среда разработки занимается большей частью рутинной работы, позволяя программисту работать над конструированием диалоговых окон и функциями обработки событий. Производительность программиста с использованием RAD-систем повышается в разы. [15]

Delphi представляет среду быстрой разработки с использованием языка программирования Delphi — строго типизированного объектно-ориентированного языка, основу которого составляет хорошо знакомый программистам Object Pascal. Рассмотрим такие конструкции языка Delphi, как операторы присваивания, ввода-вывода, безусловного и условного перехода, выбора, цикла. [8, c. 18-24]

Язык Delphi — строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal. Слово Delphi – это название города в древней Греции, в котором пророчествовали оракулы. Такое название выбрано разработчиками Delphi для того, чтобы подчеркнуть способность программ, создаваемых в Delphi, взаимодействовать с базами данных Oracle. Имя приобрело популярность, и коммерческий продукт под этим же названием был выпущен на рынок. [8, c. 18-24]

Версия Delphi 1 была выпущена в феврале 1995 г., Delphi 2 – в марте 1996г., а Delphi 3 – в мае 1997г. затем было решено интегрировать эту платформу программирования с CORBA (Common Object Request Broker Architecture – технология построения объектных приложений, предложенная компанией IBM), быстро развивающейся технологией создания распределенных приложений. Версия Delphi 4 со встроенными средствами CORBA появились на рынке в июне 1998г. Версия Delphi 5 была выпущена в августе 1999г., версия Delphi 6 выпущена в мае 2001г. и обновленная версия Delphi 7 выпущена в 2002 году. Система Delphi – ключевой программный продукт компании Borland. [11, c. 21-25]

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

Главное окно всегда присутствует на экране и предназначено для управления процессом создания программы. Основное меню содержит все необходимые средства для управления проектом. Пиктограммы облегчают доступ к наиболее часто применяемым командам основного меню. [15]

2.3. Использование массивов в Дельфи

В Турбо Паскале и Дельфи могут использоваться объекты, содержащие множество однотипных элементов. Это массивы — формальное объединение нескольких однотипных объектов (чисел, символов, строк и т.п.), рассматриваемое как единое целое. К необходимости применения массивов мы приходим всякий раз, когда требуется связать и использовать целый ряд родственных величин. Например, результаты многократных замеров температуры воздуха в течение года удобно рассматривать как совокупность вещественных чисел, объединенных в один сложный объект — массив измерений.

Массивом называют упорядоченные данные одного типа, состоящие из переменных (элементов массива). Каждый элемент массива имеет свой индекс и значение. Значение может быть присвоено отдельно каждому элементу массива, или сразу всем элементам массива (копированием одного массива в другой в случае массивов одного типа). Массив может быть многомерный (без ограничений), но должен занимать не больше 65520 байт. [8, c. 124-128]

Примеры описания:

VAR

P1: array[1..400] of integer;

D1: array[200..300] of real;

c1: array['A'..'Z'] of char;

c2: array[0..255] of char;

{ P1, D1 -одномерные массивы целых и вещественных чисел }

{ с1, c2 -одномерные массивы символов }

Примеры присвоения значения: [9, с. 40-42]

P1[1]:=5; P1[2]:=8; P1[3]:= P1[1]; P1[100]:=32;

D1[201]:=0.2; D1[202]:=2.31; c1['B']:='C'; c2[1]:='!'

Тип-диапазон и перечисляемый тип задают программисты. Примеры описания:

TYPE

Dat_M= 1..31; Rus_b= 'А..Я'; Lat_b= 'A..Z';{тип диапазон}

Oсenka= (2,3,4,5); Ball= (1,2,3,4,5,6,7,8,9,10); {перечисляемый тип}

VAR

d1,d2: Dat_M; cr1:Rus_b; cr2:Lat_b; o1,o2:Ocenka; b:Ball;

Примеры присвоения значения:

d1:= 10; cr1:= 'Л'; cr2:= 'F'; o1:=5; b:= 8;

Как видим, при описании массива используются зарезервированные слова array и OF (массив, из). За словом array в квадратных скобках указывается тип-диапазон, с помощью которого компилятор определяет общее число элементов массива. Тип-диапазон задается левой и правой границами изменения индекса массива, так что массив А1 состоит из 100 элементов, массив М1 — из 200, а массив сh2 — из 256 элементов. За словом OF указывается тип элементов, образующих массив. [11, c. 40-43]

Доступ к каждому элементу массива в программе осуществляется с помощью индекса — целого числа, служащего своеобразным именем элемента в массиве (если левая граница типа-диапазона равна 1, индекс элемента совпадает с его порядковым номером). При упоминании в программе любого элемента массива сразу за именем массива должен следовать индекс элемента в квадратных скобках, например: [8, с. 42-44]

var

a: array [1..10] of Integer;

b: array [0..40] of Char;

с: array [-2. .2] of Boolean;

k: Integer;

begin

b[17] := 'F-;

c[-2] := a[l] > 12];

for k .= 1 to 10 do

a[k] := 0,

end.

В правильно составленной программе индекс не должен выходить за пределы, определенные типом-диапазоном. Например, допустимыми являются элементы а[1], b[38], с[0], а ошибочными будут— а[0] или с[38].

При работе с массивами часто используется оператор цикла FOR.

Структура счетного оператора цикла FOR следующая:

FOR <парам_цикла> := <нач_значение> ТО <кон_значение> DO <оператор>

Здесь FOR/ TO, DO - зарезервированные слова (для/до, делать);

<парам_цикла> - параметр цикла в виде переменной типа INTEGER (может быть любой порядковый тип);

<нач_значение> - начальное значение - выражение такого же типа;

<кон_значение> - конечное значение - выражение такого же типа;

< оператор > - любой оператор.

При выполнении оператора FOR сначала вычисляется выражение <нач_значение> и присваивается <парам_цикла> : = <нач_значение>. После этого циклическое повторение:

  • проверки условия <парам_цикла <= <кон_значение>; при не выполнении условия завершается работа оператора FOR;
  • выполнения оператора <оператор>;
  • наращивания переменной <парам_цикла> на единицу. [10, с. 82-84]

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

Procedure Proc(Sender: TObject);

{Программа создает массив из N случайных целых чисел, равномерно распределенных в диапазоне от О до MAX_VALUE-1, подсчитывает среднее арифметическое этих чисел. }

const

N= 1000; {Количество элементов массива}

MAX_VALUE = 100+1; {Диапазон значений случайных чисел)

var

m : array [1..N] of Integer; {Массив чисел}

i : Integer; {Индекс массива)

s : Real; {Сумма чисел}

begin

{Наполняем массив случайными числами:}

for i := 1 to N do

m[i] := random(MAX.VALUE) ;

{Задаем начальные значения переменных: t

s := 0;

{цикл вычисления суммы всех случайных чисел }

for i := 1 to N do

s : = s+m [ i ] ;

{Вычисляем среднее значение и печатаем результат:)

WriteLn(' Среднее = ‘,s/N)

end. [7, с. 93]

Для создания массива используется встроенная функция RANDOM (MAX), которая возвращает случайное целое число, равномерно распределенное в диапазоне от 0 до max-1 (max — параметр обращения).

Для работы с массивом как с единым целым надо использовать имя массива (без указания индекса в квадратных скобках). Для доступа к элементу массива необходимо указать имя массива и в квадратных скобках порядковый номер элемента массива, например x[1], y[5], c[25], А[8]. В языке Delphi определена операция присваивания для массивов, идентичных по структуре (с одинаковыми типами индексов и компонентов). [11, c. 40-43]

Например, если массивы C и D описаны как

var C,D: array [0..30] of real;

то можно записать оператор

C:=D;

Такая операция сразу всем элементам массива C присвоит значения соответствующих им по номерам элементов массива D. Выполнение любой другой операции над массивом надо организовывать поэлементно, для чего необходимо организовать цикл, в котором последовательно обрабатывать элементы массива; сначала обрабатываем первый элемент массива, затем второй, третий,..., n-й. Для обработки элементов массива удобно использовать цикл for..do. [11, c. 40-43]

//Ввод элементов массива X с помощью цикла while.

var x: array [1..10] of real ;

i ,n: integer ;

begin

writeln ( ’введите␣размер␣массива’ );

readln(N);

i :=1;

while (i<=N) do

begin

write( ’x( ’ ,i , ’)= ’ );

readln(x[ i ]);

i:=i+1;

end;

end.

//Ввод элементов массива X с помощью цикла for.

var x: array [1..10] of real ;

i ,n: integer ;

begin

readln(N);

for i:=1 to N do

begin

write( ’x( ’ ,i , ’)= ’ );

readln(x[ i ])}

end; end.

Цикл for..do удобнее использовать для обработки всего массива. Вывод массива организуется аналогично вводу, только вместо блока ввода элемента массива будет блок вывода. [2, с. 189-191]

Массивы, рассмотренные выше, имеют элементы, упорядоченные по одному индексу и называются одномерными массивами или векторами. Массив может быть двумерным, трехмерным и т.д. Двумерные массивы имеют элементы, упорядоченные по двум индексам и часто называются матрицами. В Дельфи при описании многомерного массива диапазоны изменения индексов перечисляются через запятые, например: [2, c. 189-191]

Var A: array[1..30, 1..7] of byte;

Рассмотрим пример работы с двумерными массивами. В двумерном массиве (матрице) строки можно считать первым измерением, а столбцы вторым. Для доступа к данным, хранящимся в этом массиве, необходимо указать имя массива и два индекса: первый должен соответствовать номеру строки, а второй номеру столбца, в которых хранится необходимый элемент.

Для описания массива возможно использование предварительно определённых констант:

const m=10; n=12; var b: array [1.. m] of real ; c: array [0..n] of byte;

Константы должны быть определены до использования, так как массив не может быть переменной длины. Двумерный массив (матрицу) можно описать, применив в качестве базового типа (типа компонентов) одномерный:

type

massiv=array [1..200] of real ;

matrica=array [1..300] of massiv ;

var ab: matrica ;

При всех определениях мы получали матрицу вещественных чисел, состоящую из 300 строк и 200 столбцов. [2, с. 187-189]

3. Работа с массивами

3.1. Программа с одномерным массивом

Напишем программу, вводящую 5 элементов массива целых чисел и определяющую минимальный элемент массива и его номер. Блок – схема алгоритма представлена на рис. 1. [7, с. 37-83]

начало

Ввод а[5]

m=1; i=2;

да

m=i;

A[i]<a[m]

нет

i=i+1;

да

i<=5

нет

Вывод а[m] m

конец

Рисунок 1 – Блок – схема алгоритма программы massiv.pas

Ниже приведен листинг программы для работы с массивом данных massiv.pas. Выполняемый модель Рmassiv.ехе приложен к работе.

// поиск мин. числа из введенного массива 5 чисел, вывод его и его №

unit Massiv;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Memo1: TMemo;

Button1: TButton;

procedure VvodM(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.VvodM(Sender: TObject); [3]

var

a: array [1..5] of integer;

i,m: integer;

sa: string;

begin

//Memo1.Clear;

// ввод массива чисел

for i:=1 to 5 do begin

sa:=Memo1.Lines[i-1];

a[i]:=StrToInt(sa);

end;

// поиск min

m:=1;

for i:=2 to 5 do

if a[i]<a[m] then m:=i;

// вывод мин. элемента и его номера

sa:='min='+IntToStr(a[m])+' № min='+IntToStr(m);

ShowMessage(sa);

Application.Terminate;

end;

end.

На рисунке 2 приведен результат программы Рmassiv.ехе. [4]

Рисунок 2 – Результат работы программы Рmassiv.ехе

Программа вводит 5 элементов одномерного массива и выводит минимальный элемент массива и его номер. В 1-ом случае минимальный элемент массива – 5, его номер – 5; во 2-ом случае минимальный элемент массива – 4, его номер – 2.

3.2. Программа с двумерным массивом

Теперь составим программу с двумерным массивом, которая вводит все элементы двумерного массива (3х3), определяет и выводит максимальный элемент матрицы. Блок-схема алгоритма представлена на рис. 3.

начало

нет

I=1,n

да

Ввод mij а[m] m

j=1,n

да

нет

Max=m11;

нет

I=1,n

да

j=1,n

max=mij

mij>max

да нет

Вывод max

конец

Рисунок 3 – Блок – схема алгоритма программы massiv2.pas [5]

Листинг исходной программы Massiv2.pas приведен ниже. К работе приложен выполняемый модуль РMassiv2.ехе.

// ввод двумерного массива и поиск мах. числа массива, вывод его

unit Massiv2; [21]

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

procedure VvodM(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.VvodM(Sender: TObject); [11, с. 25-150]

var

M: array[0..9,0..9] of integer;

i,j,k,n: integer;

max: integer;

sa: string;

begin

n:=3;

// ввод массива чисел [17]

k:=1;

for i:=1 to n do

begin

for j:=1 to n do

begin

sa:=Memo1.Lines[k-1];

m[i,j]:=StrToInt(sa);

k:=k+1;

end;

end; [18]

// поиск max

max:=m[1,1];

for i:=1 to n do

for j:=1 to n do

if m[i,j]>max then max:=m[i,j];

// вывод мax. элемента

sa:='max='+IntToStr(max);

ShowMessage(sa);

Application.Terminate;

end;

end.

Результат работы программы приведен на рисунке 4.

Рисунок 4 – Результат работы программы Massiv2.pas

Программа вводит 9 элементов матрицы построчно (размерность квадратной матрицы 3х3) и выводит максимальный элемент матрицы. В 1-ом случае он равен 94, во 2-ом – 101.[4]

ЗАКЛЮЧЕНИЕ

Курсовая работа посвящена особенностям и примерам использования массивов при разработке программ.

Разработка программ начинается с составления алгоритма задачи. В первой теоретической главе рассмотрены основы алгоритмизации, даны основные определения, приведены основные формы записи алгоритмов – словесный и с помощью блок-схем, рассмотрены виды алгоритмов.

После создания блок-схемы алгоритма производится его программная реализация, в основном, на языках высокого уровня. Во второй главе проведен обзор языков высокого уровня, включая язык Delphi. Более подробно рассмотрена теория по работе с массивами в Delphi.

В третьей практической главе приведены листинги исходных модулей на языке Delphi 7. Первая программа Massiv.pas, выполнимый модуль РMassiv.ехе, - демонстрирует работу с одномерным массивом. Программа вводит 5 элементов одномерного массива и выводит минимальный элемент массива и его порядковый номер.

Вторая программа для работы с двумерным массивом, имя исходного модуля Massiv2.pas, выполнимый модуль РMassiv2.ехе, вводит элементы двумерного массива (3х3) построчно и выводит максимальный элемент массива.

Обе программы отлажены и проверены на нескольких наборах данных. Правильность работы программ проверена.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

Белов М.П. Основы алгоритмизации в информационных системах: учебное пособие. – СПб.: СЗТУ, 2015. – 85 с.

Библия для программиста в среде Delphi. Фленов М. - М., 2015.

Иллюстрированный самоучитель по Delphi 7. – М., 2015.

Осипов Д.Л. Delphi. Программирование для Windows, OS X, iOS и Android. – СПб.: БХВ-Петербург, 2014. – 464 с.

Основы алгоритмизации и программирования: учебное пособие / Г.Р. Кадырова. – Ульяновск: УлГТУ, 2014. – 95 с.

Основы алгоритмизации и программирования: учебное пособие / Т.А. Жданова, Ю.С. Бузыкова. – Хабаровск : Изд-во Тихоокеан. гос. ун-та, 2015. – 56 с.

Программирование и основы алгоритмизации: Для инженерных специальностей технических университетов и вузов. /А.Г. Аузяк, Ю.А. Богомолов, А.И. Маликов, Б.А. Старостин. - Казань: КНИТУ- КАИ, 2015, - 153 с.

Фаронов В.В. Delphi. Программирование на языках высокого уровня: учебник для вузов. – СПб.: Питер, 2013. – 640 с.

Федоренко Ю. Алгоритмы и программы на Turbo Pascal. Учебный курс. – СПб.: Питер, 2015. – 240 с.

100 компонентов общего назначения библиотеки Delphi. Архангельский А.Я. Bel&Chen Co, 2015.

Delphi 7. Учебный курс / С.И. Бобровский. — СПб.: Питер, 2015. — 736 С.

Лекции Интуит. Блок-схемы. Графическая реализация алгоритмов. 2017. URL: http://www.intuit.ru/studies/courses/19752/1301/lecture/25625 (Дата обращения: 01.05.2019).

Обзор языков программирования. 2016. URL: http://www.bourabai.kz/alg/classification04.htm (Дата обращения: 01.05.2019).

Программирование на языке высокого уровня. 2016. URL: http://pandia.ru/text/78/221/44162.php (Дата обращения: 02.05.2019).

Программирование на языке Delphi. А.Н. Вальвачев, К.А. Сурков, Д.А. Сурков, Ю.М. Четырько. 2015. URL: http://rsdn.ru/article/delphi/delphi_7_07.xml (Дата обращения: 05.05.2019).

Современный язык программирования высокого уровня: примеры и сравнения. D. Nessebar. 11.04.2015. URL: https://www.syl.ru/article/199389/new_sovremennyiy-yazyik-programmirovaniya-vyisokogo-urovnya-primeryi-i-sravneniya (Дата обращения: 04.05.2019).

Учебник по Delphi для начинающих. Борисов С. URL: http://delphidevelop.ru/publ/28-1-0-129 (Дата обращения: 04.05.2019).

Циклы в Delphi. Простейшие программы с циклами. 2019. URL: http://programmict.ru/cikly-v-delphi-prostejshie-programmy-s-ciklami/ (Дата обращения: 04.05.2019).

Чем отличаются языки низкого уровня от высокого? 2015. URL: http://bestanswer.ru/raznoe/chem-otlichayutsya-yazyki-programmirovaniya-nizkogo-urovnya-ot-yazykov-vysokogo-kakim-yavlyaetsya-delphi-a-kakim-c (Дата обращения: 02.05.2019).

Языки программирования. 2015. http://life-prog.ru/ (Дата обращения: 02.05.2019).

Язык программирования Delphi (Object Pascal). Лекции. 2016. URL: http://works.doklad.ru/view/unh62qqQkM8/14.html (Дата обращения: 03.05.2019).