Вы находитесь на странице: 1из 29

Министерство образования и науки, молодежи и спорта Украины

Технологический Институт

Восточноукраинского Национального Университета им. В. Даля

(г. Северодонецк)

Кафедра компьютерной инженерии

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОЙ РАБОТЕ ПО ПРОГРАММИРОВАНИЮ

на тему: Обработка массивов

Выполнил студент группы КИ-11д Хохлов Г.Б.(______)

Руководитель Семенова Н.С.(______)

Северодонецк 2012
2

РЕФЕРАТ

Документ содержит: 29 листов описания процесса разработки всех элементов программы, 8


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

Цель работы: создание, обработка и сортировка массивов вещественного типа.

В данной курсовой работе требуется составить последовательность из сумм элементов


строки квадратной матрицы. Разделить полученную последовательность на две части и
отсортировать их так, как описано в задании.

Программа разработана в среде визуального программирования LAZARUS на языке Object


Pascal.
3

СОДЕРЖАНИЕ

ВВЕДЕНИЕ..............................................................................................................................................................3
1 ПОСТАНОВКА ЗАДАЧИ..............................................................................................................................4
1.1 Основные понятия....................................................................................................................................5
1.2 Методы исследования..............................................................................................................................6
2 РАЗРАБОТКА АЛГОРИТМА......................................................................................................................7
3 СОСТАВЛЕНИЕ ПРОГРАММЫ. РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА......8
4 ИНСТРУКЦИЯ ОПЕРАТОРУ...................................................................................................................10
ВЫВОДЫ...............................................................................................................................................................13
ССЫЛКИ...............................................................................................................................................................14
ПРИЛОЖЕНИЕ А. СХЕМА АЛГОРИТМА....................................................................................................15
ПРИЛОЖЕНИЕ Б. ЛИСТИНГ ПРОГРАММЫ..............................................................................................19
4

ВВЕДЕНИЕ

Lazarus — свободная среда разработки программного обеспечения для компилятора Free


Pascal (часто используется сокращение FPC — свободно распространяемый компилятор языка
программирования Pascal) на языке Object Pascal. Интегрированная среда разработки
предоставляет возможность кроссплатформенной разработки приложений в Delphi-подобном
окружении. На данный момент является единственным инструментом быстрой разработки
приложений, позволяющим Delphi-программистам создавать приложения с графическим
интерфейсом для Linux (и других не-Windows) систем.

Вашему вниманию предоставляется курсовая работа по обработке массивов – написанная в


среде программирования Lazarus.

Особенности работы:

1. подробно документированы все шаги программирования;


2. приложен листинг программы;
3. работа содержит много дополнительной информации, позволяющей объяснить каждый
этап разработки;
5

1 ПОСТАНОВКА ЗАДАЧИ

Постановка задачи звучит следующим образом:

«Дана вещественная квадратная матрица порядка n. Построить последовательность a1,...,an


по правилу: если в i-ой строке матрицы элемент, принадлежащий главной диагонали, отрицателен,
то ai равно сумме элементов i-ой строки, предшествующих первому отрицательному элементу; в
противном случае ai равно сумме последних элементов i-ой строки начиная с первого по порядку
положительного элемента. В полученной последовательности a1,...,an найти наибольший элемент
(последний по порядку, если их несколько), который разделит последовательность на две части. В
большей части последовательности упорядочить элементы по убыванию, в меньшей- по
возрастанию; если обе части будут равными, то левую упорядочить по убыванию, а правую - по
возрастанию. Для ввода и вывода данных использовать компоненты Lazarus.»

На первом этапе выполнения необходимо проанализировать задание и определить перечень


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

1.1 Основные понятия

Дадим определения понятиям, которые используются в данной работе. Это такие


определения как: массив, сортировка.

Массив — упорядоченный набор данных, для хранения данных одного типа,


идентифицируемых с помощью одного или нескольких индексов. В простейшем случае массив
имеет постоянную длину и хранит единицы данных одного и того же типа.

Количество используемых индексов массива может быть различным. Массивы с одним


индексом называют одномерными, с двумя — двумерными и т. д. Одномерный массив нестрого
соответствует вектору в математике, двумерный — матрице. Чаще всего применяются массивы с
одним или двумя индексами.

Сортировка — упорядочивание элементов в списке. В случае, когда элемент списка имеет


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

1.2 Методы исследования

Для начала реализуется ввод квадратной матрицы и последующая ее обработка. Ввод


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

Выходными данными является последовательность отсортированных элементов.


8

2 РАЗРАБОТКА АЛГОРИТМА

Алгоритм — это последовательность действий, направленных на получение определённого


результата.

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

Алгоритм работы программы заключается в следующем:

1. Ввод размерности матрицы


2. Заполнение матрицы
3. Составление элементов последовательности
4. Нахождение максимального элемента последовательности
5. Сортировка частей последовательности
6. Вывод отсортированной последовательности
9

3 СОСТАВЛЕНИЕ ПРОГРАММЫ. РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО


ИНТЕРФЕЙСА

Данная программа состоит из процедур, которые выполняют задачи поставленные при


разработке алгоритма.

Описание процедур представлено ниже:

1. Button1Click (Sender: TObject) – Процедура перезаписи матрицы после того, как были
внесены изменения.
2. Button2Click (Sender: TObject) – Вывод на экран задания.
3. Input_matrixClick (Sender: TObject) – Реализует ввод размерности матрицы, а также
заполнение ее случайными значениями.
4. ResultClick (Sender: TObject) – Процедура построения последовательности с последующим
ее выводом на экран
5. Clear_allClick (Sender: TObject) – Очистка всех полей.
6. SortingClick (Sender: TObject) – Сортировка последовательности, вывод максимального
элемента, размерностей двух частей последовательности,

Из этого списка можно выделить процедуры более важные, так как они выполняют
основные действия написанные в задании. Это ResultClick (Sender: TObject) и SortingClick (Sender:
TObject).

ResultClick (Sender: TObject). В цикле for прохода по индексам строк сначала присваивается
переменной хранящей сумму элементов строки (A_i_) ноль. Далее во вложенных условных
операторах If проверяются элементы стоящие на главной диагонали, если он удовлетворяет
условию то отыскивается либо первый отрицательный элемент, либо первый положительный
элемент и запоминается его позиция (переменная Neg) далее цикл прерывается. После во
вложенном цикле for считается сумма, которая станет элементом последовательности R.

SortingClick (Sender: TObject). В начале процедуры наибольшим элементом (coa) считается


первый. Далее в цикле сравнивается значение имеющегося максимального элемента и остальных
элементов R[i], если максимальный элемент меньше i-го члена последовательности, то coa
присваивается значение текущего элемента последовательности и запоминается его позиция в
переменную cOFarray. Затем считается размер левой и правой части. Следует заметить что
10

наибольший элемент включен в левую часть. После того как посчитаны размеры они
сравниваются между собой. В зависимости какая часть больше происходит сортировка по
возрастанию (в меньшей) и по убыванию (в большей). Если части равны, то левая
упорядочивается по убыванию, а правая - по возрастанию. В данной программе использовалась
сортировка выбором. Можно было использовать другие сортировки, но я решил, что эта
сортировка более удобная.

Рассмотрим этапы сортировки выбором:

1. Находим номер минимального значения в текущем списке


2. Производим обмен этого значения со значением первой не отсортированной позиции
3. Сортируем оставшиеся элементы, исключив из рассмотрения уже отсортированные
элементы.

В конце процедуры выводится полученный отсортированный массив R.


11

4 ИНСТРУКЦИЯ ОПЕРАТОРУ

При запуске программы открывается окно показанное на рис 5.1.

Рисунок 5.1 – Окно программы

Чтобы начать работу программы ввести значение размерности и нажать кнопку «Заполнить
матрицу». Если не ввести размерность, то программа выдаст сообщение (рис 5.2). При повторном
нажатии данной кнопки поля «Последовательность», «Наибольший элемент», «Сортировка»
очищаются от старых значений.

Рисунок 5.2 – Сообщение


12

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


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

Рисунок 5.3 – Изменение матрицы

Чтобы получить последовательность необходимо нажить кнопку «Результат»,


отсортировать ее кнопку «Сортировка». Результат выполнения операций показан на рис 5.4.
13

Рисунок 5.4 – Операции над последовательностью

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

В программе имеется кнопка «Задание» предназначенная для просмотра текста задания. И


кнопка «Очистить все» (очищает поля ввода и вывода).
14

ВЫВОДЫ

В ходе выполнения курсовой работы убедился в возможностях программирования в среде


Lazarus. Язык Object Pascal удобен как для начинающих, так и опытных программистов.

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


Так же можно было упростить код использовать процедуры сортировки, а потом передавать
значения границ массива и сам массив. Но так как полученный объем кода не велик, то я решил не
составлять процедуры.

Данное приложение работает под управлением ОС Windows.


15

ССЫЛКИ

1. Семенова Н.С., Лекции Северодонецкого Технологического Института,


«Программирование», 2005.
2. http://lazarus.su/
3. http://ru.wikipedia.org/wiki/Lazarus
4. http://wiki.freepascal.org/Lazarus_Tutorial/ru
16

ПРИЛОЖЕНИЕ А. СХЕМА АЛГОРИТМА

Начало

Вывод
Конец i=1,n
посл-сти

Ai=0

Да M[i,i]>=0
Да M[i,i]<0 Нет

J=1,n
J=1,n

j=n,
Да M[i,j]<0 Neg-1, Нет
Нет Нет
Да M[i,j]>0 -1

Neg=j; Neg=j;
Break Ai=Ai+M[I,j]
Break

j=1,Neg R[i]=Ai
-1

Ai=Ai+M[I,j]

Рисунок А.1 Схема алгоритма процедуры ResultClick (Sender: TObject)


17

Начало А

CoA=R[1] Да Left<Right

Сортировка Left-
Поиск части по
максимального возрастанию
элемента СоА и его
позиции(cOFarray)

Нет
Сортировка Right-
Определение части по убыванию
размера (Left)
части послед-ти R

Определение
размера (Right) Да Left<Right
части послед-ти R

Сортировка Left-
части по
возрастанию
Да Left>Right

Нет
Сортировка Left- Сортировка Right-
части по убыванию части по убыванию

Нет
Сортировка Right-
части по
возрастанию Вывод MAX
элемента

А Вывод сорт-
ной посл-
сти

Конец

Рисунок А.2 Схема алгоритма процедуры SortingClick (Sender: TObject)


18

Начало

i=_begin,
Конец
_end

Max=i

j=i+1,n

Да R[j]<R[Max]

Max=j
Нет

Work=R[Max]

R[Max]=R[i]

R[i]=Work

Рисунок А.3 – Схема сортировки выбора по возрастанию


19

Начало

i=_begin,
Конец
_end

Max=i

j=i+1,n

Да R[j]>R[Max]

Max=j
Нет

Work=R[Max]

R[Max]=R[i]

R[i]=Work

Рисунок А.4 - Схема сортировки выбором по убыванию


20

ПРИЛОЖЕНИЕ Б. ЛИСТИНГ ПРОГРАММЫ

{Дана вещественная квадратная матрица порядка n. Построить последовательность a[1],...,a[n] по


правилу:

если в i-ой строке матрицы элемент, принадлежащий главной диагонали, отрицателен, то a[i]
равно сумме

элементов i-ой строки,предшествующих первому отрицательному элементу;в противном случае


a[i] равно сумме

последних элементов i-ой строки начиная с первого по порядку положительного элемента. в


полученной

последовательности a[1],...,a[n] найти наибольший элемент (последний по порядку, если их


несколько),

который разделит последовательность на две части. В большей части последовательности


упорядочить

элементы по убыванию, в меньшей- по возрастанию;если обе части будут равними, то левую


упорядочить

по убыванию, а правую - по возрастанию}

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,

Grids, ExtCtrls, CheckLst, ActnList, Buttons;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Edit2: TEdit;
21

Edit3: TEdit;

Label4: TLabel;

Memo1: TMemo;

Sorting: TButton;

Input_matrix: TButton;

Label5: TLabel;

Result: TButton;

Clear_all: TButton;

Edit1: TEdit;

SizeOfMatr: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

StringGrid1: TStringGrid;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Input_matrixClick(Sender: TObject);

procedure ResultClick(Sender: TObject);

procedure Clear_allClick(Sender: TObject);

procedure SortingClick(Sender: TObject);

procedure StringGrid1Click(Sender: TObject);

private

{ private declarations }

public

{ public declarations }

end;

var

Form1: TForm1;
22

M:array[1..100,1..100] of real;

R:array[1..100] of real;

i,j,n:integer;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Input_matrixClick(Sender: TObject);

begin

randomize;

Edit3.Clear;

Edit2.Clear;

Edit1.Clear;

Label4.Caption:='Наибольший элемент ';

if (SizeOfMatr.text='') then ShowMessage ('Введите размерность матрицы')

else begin

n:=StrToInt(SizeOfMatr.text);

StringGrid1.ColCount:=n;

StringGrid1.RowCount:=n;

for i:=1 to n do

for j:= 1 to n do

begin

M[i,j]:=(random(21)-10)*abs(cos(i));

StringGrid1.Cells[j-1,i-1]:=FloatToStrF(M[i,j],FFfixed,8,2);

end; end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

for i:=1 to n do
23

for j:= 1 to n do

M[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);

Label4.Caption:='Наибольший элемент ';

Edit1.Clear;

Edit2.Clear;

Edit3.Clear;

Button1.Visible:=false;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

if Memo1.Visible=false

then begin

Memo1.Visible:=true;

Button1.Visible:=false;

Edit2.Visible:=false;

Edit3.Visible:=false;

Label4.Visible:=false;

Sorting.Visible:=false;

Input_matrix.Visible:=false;

Label5.Visible:=false;

Result.Visible:=false;

Clear_all.Visible:=false;

Edit1.Visible:=false;

SizeOfMatr.Visible:=false;

Label1.Visible:=false;

Label2.Visible:=false;

Label3.Visible:=false;

StringGrid1.Visible:=false;end
24

else begin

Memo1.Visible:=false;

Edit2.Visible:=true;

Edit3.Visible:=true;

Label4.Visible:=true;

Sorting.Visible:=true;

Input_matrix.Visible:=true;

Label5.Visible:=true;

Result.Visible:=true;

Clear_all.Visible:=true;

Edit1.Visible:=true;

SizeOfMatr.Visible:=true;

Label1.Visible:=true;

Label2.Visible:=true;

Label3.Visible:=true;

StringGrid1.Visible:=true;end;

end;

procedure TForm1.ResultClick(Sender: TObject);

var A_i_:real;

Neg:integer;

begin

Edit3.Clear;

Edit1.Clear;

Label4.Caption:='Наибольший элемент ';

Edit2.Clear;

for i:=1 to n do

begin

A_i_:=0; //cумма
25

if M[i,i]<0

then

begin

for j:=1 to n do //цикл поиска первого отрицательного элемента

begin

if M[i,j]<0 then begin Neg:=j; break;end;

end;

for j:=1 to Neg-1 do

A_i_:=A_i_+M[i,j];

end;

if M[i,i]>=0

then

begin

for j:=1 to n do

begin

if M[i,j]>0 then begin Neg:=j; break;end;

end;

for j:=n downto Neg do

A_i_:=A_i_+M[i,j];

end;

Edit2.Text:=Edit2.Text+FloatToStrF(A_i_,FFfixed,8,2)+'; ';

R[i]:=A_i_;

end;

end;

procedure TForm1.Clear_allClick(Sender: TObject);

begin

Label4.Caption:='Наибольший элемент ';

Edit1.Clear;
26

Edit2.Clear;

Edit3.Clear;

SizeOfMatr.Clear;

for i:=0 to n-1 do

for j:=0 to n-1 do

StringGrid1.Cells[j,i]:=' ';

end;

procedure TForm1.SortingClick(Sender: TObject);

var cOa,work:real;

_left,_right,max,cOFarray:integer;

begin

Edit3.Clear;

Edit1.Clear;

Label4.Caption:='Наибольший элемент ';

cOa:=R[1];

for i:=2 to n do

if cOa<R[i] then begin cOa:=R[i]; cOFarray:=i;end;

_left:=0;

_right:=0;

for i:=1 to cOFarray do //в левую часть включаем наибольший элемент

inc (_left);

for i:=cOFarray+1 to n do

inc (_right);

if _left>_right

then

begin

for i:=1 to cOFarray-1 do

begin
27

max:=i;

for j:=i+1 to cOFarray do

if R[j]>R[max] then max:=j;

work:=R[max];

R[max]:=R[i];

R[i]:=work;

end;

for i:=cOFarray+1 to n-1 do

begin

max:=i;

for j:=i+1 to n do

if R[j]<R[max] then max:=j;

work:=R[max];

R[max]:=R[i];

R[i]:=work;

end;

end

else

begin

for i:=1 to cOFarray-1 do

begin

max:=i;

for j:=i+1 to cOFarray do

if R[j]<R[max] then max:=j;

work:=R[max];

R[max]:=R[i];

R[i]:=work;

end;
28

for i:=cOFarray+1 to n-1 do

begin

max:=i;

for j:=i+1 to n do

if R[j]>R[max] then max:=j;

work:=R[max];

R[max]:=R[i];

R[i]:=work;

end;

end;

if _left=_right

then

begin

for i:=1 to cOFarray-1 do

begin

max:=i;

for j:=i+1 to cOFarray do

if R[j]>R[max] then max:=j;

work:=R[max];

R[max]:=R[i];

R[i]:=work;

end;

for i:=cOFarray+1 to n-1 do

begin

max:=i;

for j:=i+1 to n do

if R[j]<R[max] then max:=j;

work:=R[max];
29

R[max]:=R[i];

R[i]:=work;

end;

end;

Label4.Caption:=Label4.Caption+FloatToStrF (cOa,FFfixed,8,2);

Edit1.Text:='Левая часть:'+FloatToStr (_left)+'; Правая часть:'+FloatToStr (_right);

for i:=1 to n do

Edit3.Text:=Edit3.Text+FloatToStrF(R[i],FFfixed,8,2)+'; ';

end;

procedure TForm1.StringGrid1Click(Sender: TObject);

begin

Button1.Visible:=true;

end;

end.