Полный текст:
Содержание
Введение. 4
Глава
1. Теоретические основы работы в Delphi. Основные структуры, использованные при реализации задач. 5
Глава
2. Программная реализация задач на обработку массивов. 9
2.1.
Составление алгоритмов отдельных функций и процедур. 9
2.2.
Тестирование программы.. 13
Заключение. 15
Список
использованных источников. 16
Приложения. 17
РЕФЕРАТ
Пояснительная записка к курсовой работе содержит:
страниц - 24;
рисунков - 5;
приложений – 1.
Цель работы: разработать программу на языке Delphi, которая
а) вычисляет сумму модулей элементов матрицы выше
главной диагонали – оформить в виде функции;
б) подсчитывает сумму отрицательных элементов в соответствующем
столбце матрицы и формирует вектор значений, оформить в виде процедуры
В курсовой работе создана программа со всеми
вышеуказанными требованиями.
В первом разделе курсовой работы рассмотрены
теоретические вопросы по использованию среды программирования Delphi и основные компоненты, использованные при разработке
программы.
Во втором разделе выполняется анализ исходных данных, приводятся
блок-схемы отдельных программных модулей, словесный алгоритм работы программы.
Листинг программы содержится в приложении А.
Программа разработана с использованием языка Delphi.
Введение
Данный
курсовой проект был разработан в среде Delphi 7 с базовым языком
программирования Delphi. Среди множества языков Delphi является наиболее
универсальным и легко изучаемым языком. На сегодня Delphi поддерживает все
современные возможности объектно-ориентированного программирования в такой
мощной системе проектирования как Delphi 7.
Цель
курсовой работы – закрепление и демонстрация знаний, полученных при изучении
курса.
Задача работы
заключается в том, чтобы правильно составить алгоритм поставленной задачи по
обработке текстовой информации, разработать и отладить программу, реализующую
разработанный алгоритм.
В ходе выполнения
курсового проекта необходимо выполнить следующие этапы:
-
разработка алгоритма программы, предназначенной для выполнения поставленных
задач;
-
составление программы согласно разработанным алгоритмам на языке Delphi;
- отладка
программы на тестовых наборах данных;
-
составление и оформление пояснительной записки.
Теоретическая
и практическая значимость заключается в закреплении навыков составления
алгоритмов поставленных задач и программирования на языке Delphi.
Глава 1. Теоретические основы работы в Delphi. Основные структуры,
использованные при реализации задач.
1.1 Одномерные массивы
Массив представляет собой набор
однотипных переменных, заключенных в одну переменную. Каждая однотипная
переменная в массиве называется элементом массива и имеет свой собственный
числовой индекс в массиве. Чтобы создать массив, вначале необходимо создать
переменную массива требуемого типа.
Массивы
могут содержать определенное кол-во любой но однотипной информации. Теперь
посмотрим на реализацию массивов в Delphi (Pascal). Как и любую обыкновенную
переменную, массив тоже необходимо объявить в разделе var. Делается это
следующим образом:
1
2
3
var
a: array [0..100] of integer;
Сначала
мы, как и обычно, указываем название нашего массива. Затем, после «array», мы
указываем диапазон индексов в массиве, т.е. в данном случае мы создали 101
элементов массива с заданными индексами. И затем естественно указываем тип
элементов массива, а именно пишем после «of» тип «integer», т.е. элементы
массива целочисленные.
Теперь
как же обратиться к элементам массива непосредственно из кода, т.е. работать с
этими элементами как с обыкновенными переменными? Делается это предельно
просто. Обратиться к любому элементу массива можно следующим образом:
1
2
3
a[1]:=100;
a[99]:=200;
В
квадратных скобках мы указываем индекс самого элемента массива. Очень важно
учитывать, что введенный индекс, по которому мы хотим обратиться к элементу
массива, должен быть в указанном при объявлении массива диапазоне, иначе
программа во время своей работы выдаст нам ошибку. Также, в качестве индекса
может выступать и другая любая переменная типа integer (а также и различные
примитивные математические операции), например так:
1
2
3
a[i]:=100;
a[i+10]:=200;
1.2. Вложенные циклы и двумерные
массивы – матрицы.
Существует
возможность организовать цикл внутри тела другого цикла. Такой цикл будет
называться вложенным циклом. Вложенный цикл по отношению к циклу, в тело
которого он вложен, будет именоваться внутренним циклом, и наоборот цикл, в
теле которого существует вложенный цикл, будет именоваться внешним по отношению
к вложенному. Внутри вложенного цикла в свою очередь может быть вложен еще один
цикл, образуя следующий уровень вложенности и так далее. Количество уровней
вложенности, как правило, не ограничивается.
Полное
число исполнений тела внутреннего цикла не превышает произведения числа
итераций внутреннего и всех внешних циклов. Например взяв три вложенных друг в
друга цикла, каждый по 10 итераций, получим 10 исполнений тела для внешнего
цикла, 100 для цикла второго уровня и 1000 в самом внутреннем цикле.
В
данной работе использовалось количество вложений – 2, для организации работы с
матрицами – двумерными массивами.
Двумерный
массив в Паскале трактуется как одномерный массив, тип элементов которого также
является массивом (массив массивов). Положение элементов в двумерных массивах
Паскаля описывается двумя индексами. Их можно представить в виде прямоугольной
таблицы или матрицы.
Рассмотрим
двумерный массив Паскаля размерностью 3*3, то есть в ней будет три строки, а в
каждой строке по три элемента: каждый элемент имеет свой номер, как у
одномерных массивов, но сейчас номер уже состоит из двух чисел – номера строки,
в которой находится элемент, и номера столбца. Таким образом, номер элемента
определяется пересечением строки и столбца. Например, a21 – это элемент,
стоящий во второй строке и в первом столбце.
Описание
двумерного массива Паскаля.
Существует
несколько способов объявления двумерного массива Паскаля.
Одномерные
массивы, элементы которых могут иметь любой тип, могут быть элементами массива.
Рассмотрим следующее описание типов и переменных:
Пример
описания двумерного массива Паскаля
Type
Vector = array [1..5] of <тип_элементов>;
Matrix= array [1..10] of vector;
Var m: matrix;
Здесь
объявлен двумерный массив Паскаля m, состоящий из 10 строк, в каждой из которых
5 столбцов. При этом к каждой i -й строке можно обращаться m [ i ], а каждому j
-му элементу внутри i -й строки – m [ i , j ].
Определение
типов для двумерных массивов Паскаля можно задавать и в одной строке:
Type
Matrix= array [1..5] of array [1..10] of < тип элементов >;
или
еще проще:
type
matrix
= array [1..5, 1..10] of <тип элементов>;
Обращение
к элементам двумерного массива имеет вид: M [ i , j ]. Это означает, что мы
хотим получить элемент, расположенный в i -й строке и j -м столбце. Тут главное
не перепутать строки со столбцами, а то мы можем снова получить обращение к
несуществующему элементу. Например, обращение к элементу M [10, 5] имеет
правильную форму записи, но может вызвать ошибку в работе программы.
Основные
действия с двумерными массивами Паскаля
Все,
что было сказано об основных действиях с одномерными массивами, справедливо и
для матриц. Единственное действие, которое можно осуществить над однотипными
матрицами целиком – это присваивание. Т.е., если в программе у нас описаны две
матрицы одного типа, например,
type
matrix= array [1..5, 1..10] of integer;
var
a , b
: matrix ;
то в
ходе выполнения программы можно присвоить матрице a значение матрицы b ( a := b
). Все остальные действия выполняются поэлементно, при этом над элементами
можно выполнять все допустимые операции, которые определены для типа данных
элементов массива. Это означает, что если массив состоит из целых чисел, то над
его элементами можно выполнять операции, определенные для целых чисел, если же
массив состоит из символов, то к ним применимы операции, определенные для
работы с символами.
Ввод
двумерного массива Паскаля.
Для
последовательного ввода элементов одномерного массива мы использовали цикл for,
в котором изменяли значение индекса с 1-го до последнего. Но положение элемента
в двумерном массиве Паскаля определяется двумя индексами: номером строки и
номером столбца. Это значит, что нам нужно последовательно изменять номер
строки с 1-й до последней и в каждой строке перебирать элементы столбцов с 1-го
до последнего. Значит, нам потребуется два цикла for, причем один из них будет
вложен в другой.
Глава
2. Программная реализация задач на обработку массивов.
2.1. Составление алгоритмов отдельных функций и
процедур.
Проект Delphi
Любой проект
имеет, по-крайней мере, шесть файлов, связанных с ним. Три из них относятся к
управлению проектом из среды и напрямую программистом не меняются. Вот эти
файлы:
Главный
файл проекта, изначально называется PROJECT1.DPR. Первый
модуль программы /unit/, который автоматически появляется в начале работы. Файл
называется UNIT1.PAS по умолчанию, но его можно назвать любым другим именем,
вроде MAIN.PAS. Файл
главной формы, который по умолчанию называется UNIT1.DFM, используется для
сохранения информации о внешнем виде главной формы.
Файл PROJECT1.RES содержит иконку для проекта, создается автоматически. Файл,
который называется PROJECT1.OPT по умолчанию, является текстовым файлом для
сохранения установок, связанных с данным проектом. Например, установленные Вами
директивы компилятора сохраняются здесь.
Файл PROJECT1.DSK содержит информацию о состоянии рабочего пространства.
Разумеется,
если сохранить проект под другим именем, то изменят название и файлы с
расширением RES, OPT и DSK.
После
компиляции программы получаются файлы с расширениями:
DCU -
скомпилированные модули
EXE -
исполняемый файл
DSM -
служебный файл для запуска программы в среде, очень большой, рекомендуется
стирать его при окончании работы.
~PA, ~DP -
backup файлы Редактора.
Для ввода и вывода данных
на форме были использованы компоненты StringGrid, причем
для ввода данных в компоненту необходимо было изменить параметр goEditing с False на True. Интерфейс программы (приложение А) должен быть следующим. Сначала
пользователь вводит размерность матрицы, это реализуется с помощью компоненты SpinEdit.
Затем, вводит элементы самой матрицы.
Процедуры, использованные
при выполнении задач, реализованы под соответствующие кнопки.
Вывод данных
осуществляется в компоненту Edit – значение суммы, и в компоненту StringGrid – элементы вектора – одномерного
массива.
Общая структура программы
представлена на рисунке 1.
Для решения первой задачи
был составлен алгоритм работы функции Summ (Рис.2). Решение второй задачи было
реализовано с помощью процедуры Button2Click, для которой был составлен
алгоритм (Рис.3).
Рис.1 Алгоритм программы
Рис.2 Блок-схема
вычисления функции подсчета суммы модулей элементов матрицы, расположенных выше
главной диагонали.
Рис. 3 Блок-схема
вычисления суммы отрицательных элементов в соответствующем столбце матрицы и
формирование вектора значений.
2.2. Тестирование программы
Тестирование программы
проводилось на самых разных вариантах матриц. В процессе тестирования ошибок не
обнаружено.
Программа тестировалась
на следующих примерах:
Матрица n=3
1
2
3
1
1
2
2
2
3
Выдан результат
Рис.4
Матрица n=4
-4
-7
-8
5
13
11
-2
3
-9
15
-1
4
11
-8
-1
-3
Выдан результат
Рис.5
Заключение
Данная курсовая работа
была выполнена в полном соответствии поставленному заданию и отлажена в среде
Delphi 7.0. В ходе выполнения курсовой работы была разработана программа, на
языке Delphi (Object Pascal), которая:
а) вычисляет сумму
модулей элементов матрицы выше главной диагонали – оформить в виде функции;
б) подсчитывает сумму
отрицательных элементов в соответствующем столбце матрицы и формирует вектор
значений, оформить в виде процедуры.
В программе предусмотрен
ввод непосредственно в форму.
В ходе выполнения
курсового проекта были разработаны алгоритмы отдельных процедур и программы в
целом, программы, предназначенной для выполнения сформированных функций и
процедур.
Согласно разработанному
алгоритму была составлена и отлажена программа на языке программирования
Delphi. В ходе разработки программы проводилось ее тестирование и отладка на
тестовых наборах. Результаты работы оформлены в виде пояснительной записки.
В ходе разработки
программы были закреплены навыки работы:
- командами ввода-вывода
как на экран, так и в текстовые файлы,
- использования процедур,
- команды обработки
массивов,
- команды для реализации
циклов с заданным числом повторений;
- команды проверки
условий и реализации ветвлений.
В результате выполнения
данной курсовой работы, мы убедились в широких возможностях языка
программирования Delphi, закрепили практические навыки программирования в cреде
Delphi.
Список использованных источников
1.
Ахо А., Хопкрофт Дж., Ульман Дж. Структуры данных и
алгоритмы. — М.: Видавничий будинок Вільямс, 2001. – 286 с.
2.
Зуев Е.А. Программирование на языке Delphi 6.0,7.0. – М.: Радио и
связь, Веста, 1993. – 186 с.
3.
Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и
анализ. — М.: МЦНМО, 2001. – 563 с.
4.
Фаронов В.В. Delphi 7.0. Начальный курс. - М.: Нолидж, 2000. – 684 с.
Приложения
Приложение
А
unit Unit1;
interface
uses
Windows,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls, Grids, Spin;
type
mass=
array[1..100,1..100] of real;
TForm1 =
class(TForm)
Label1:
TLabel;
Label2:
TLabel;
Label3:
TLabel;
StringGrid1:
TStringGrid;
Edit2:
TEdit;
Label4:
TLabel;
Button2:
TButton;
StringGrid2:
TStringGrid;
Button4:
TButton;
SpinEdit1:
TSpinEdit;
Button1:
TButton;
procedure
FormCreate(Sender: TObject);
procedure
SpinEdit1Change(Sender: TObject);
procedure
Button4Click(Sender: TObject);
function
Summ(n:integer;Y:mass):real;
procedure
Button2Click(Sender: TObject);
procedure
Button1Click(Sender: TObject);
private
{ Private
declarations }
public
{ Public
declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
A:mass;// объявление двумерного массива A
X:array[1..100] of real; // объявление одномерного массива X
// объявление глобальных
переменных
S:real;
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Text:='4'; // начальное значение n
Edit2.Text:='0'; // начальное значение суммы
StringGrid1.RowCount:=4; // количество строк массива A
StringGrid1.ColCount:=4; // количество столбцов массива A
StringGrid2.RowCount:=4; // количество строк массива X
end;
//Суммируем элементы выше диагонали
function
TForm1.Summ(n:integer;Y:mass):real;
var
i,j:integer;
begin
S:=0;
for i:=1 to n do
if j>i then
for j:=i+1 to n do
S:=S+abs(y[i,j]);
Summ:=S;
end;
//
Отрабатываем изменение размерности матрицы
procedure TForm1.SpinEdit1Change(Sender: TObject);
var iTopCount: Integer;
begin
if
SpinEdit1.Text<>'' then begin
if
Length(SpinEdit1.Text)<=2 then begin
try
iTopCount
:= StrToInt(SpinEdit1.Text);
StringGrid1.RowCount := iTopCount;
StringGrid2.RowCount := iTopCount;
StringGrid1.ColCount := StringGrid1.RowCount;
except
ShowMessage('Введено некорректное число');
end;
end else begin
ShowMessage('Число не должно быть больше 99');
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
// объявление локальных переменных
sum:real;
n,i,j:integer;
begin
n:=StrToInt(SpinEdit1.Text);
with
StringGrid2 do
begin
Sum:=0; {обнулить сумму перед суммированиемэлементов}
for j:=1 to n do
begin
Sum:=0;
for i:=1 to n do
if
a[i,j]<0 then
{если
значение ячейки отрицательно, то суммировать ее значение}
Sum:=Sum+a[i,j];
X[j]:=Sum;
Cells[0,j-1]:=FloatToStr(X[j])
end;
end;
end;
//Закрытие формы
procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;
// Сумма модулей элементов выше главной
диагонали
procedure TForm1.Button1Click(Sender: TObject);
var i, j,n: Integer;
begin
n:=StrToInt(SpinEdit1.Text);
StringGrid1.RowCount:=n;
StringGrid2.RowCount:=n;
StringGrid1.ColCount:=n;
// Ввод
значений из таблицы в массив A
with StringGrid1 do
for i:=1 to n
do
for j:=1 to n
do
A[i,j]:=StrToFloat(Cells[j-1,i-1]);
Edit2.Text:=FloatToStr(Summ(n,A));
end;
end.