Программирование на языке ПАСКАЛЬ
Содержание
Введение______________________________________________________________3
1 Задание на курсовую работу ________________________________________3
2 Анализ задания ___________________________________________________3
3 Разработка структур данных ________________________________________4
4 Разработка алгоритмов_____________________________________________5
5 Текст программы__________________________________________________9
6 Тестирование программы___________________________________________20
7 Руководство пользователя __________________________________________22
Заключение____________________________________________________________26
Список использованных источников_______________________________________26
Введение
Система программирования Турбо Паскаль представляет собой единство двух в известной степени самостоятельных начал: компилятора с языка программирования Паскаль и некоторой инструментальной программной оболочки, способствующей повышению эффективности создания программ.
Процедуры и функции представляют собой важный инструмент Турбо Паскаля, позволяющий писать хорошо структурированные программы. В структурированных программах обычно легко прослеживается основной алгоритм, их нетрудно понять любому читателю, они проще в отладке и менее чувствительны к ошибкам программирования. Все эти свойства являются следствием важной особенности процедур (функций), каждая из которых представляет собой во многом самостоятельный фрагмент программы, связанный с основной программой лишь с помощью нескольких параметров.
Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модульного программирования. В Турбо Паскале имеется 8 стандартных модулей, в которых содержится большое число разнообразных типов, констант, процедур и функций.
1 Задание на курсовую работу
В прямоугольной матрице выявить все подматрицы, по периметру которых расположены элементы, из которых можно образовать геометрическую прогрессию.
2 Анализ задания
Задачей курсового проектирования является разработка программного продукта, который позволил бы выявить в прямоугольной матрице все подматрицы, по периметру которых расположены элементы, из которых можно образовать геометрическую прогрессию.
Должен быть разработан пользовательский интерфейс, который бы обеспечил более удобную и наглядную работу с программой. Данная программа должна выполнять следующие действия:
- ввод данных с клавиатуры и из файла;
- обработку данных в соответствии с заданием;
- вывод результата на экран и в файл;
- интерфейс пользователя в текстовом режиме, содержащий меню (с подменю) и окна;
- обеспечивать различные способы ввода и вывода данных;
- использовать возможности модуля CRT;
- использовать структуры данных;
- программный код в виде процедур и функций;
- использовать программирование клавиатуры;
- использовать манипулятор «мышь»;
- использовать динамические структуры данных;
- собственный модуль.
3 Разработка структур данных
Основные переменные:
Mxx – исходная целочисленная матрица (максимум 10х10);
Per – целочисленные элементы периметра;
N, M – количество строк и столбцов матрицы;
L – количество элементов по периметру подматрицы;
mf – флаг ввода исходной матрицы – true, false– матрица не введена;
fileresu, filework – текстовые файлы с исходной матрицей и с результатом соответственно;
fil – способ вывода результата true – в файл, false – на экране в окне;
f – способ получения результата false– все подматрицы или true– по условию.
Стандартные модули: crt, app, objects, menus, drivers, views, dialogs, msgbox, memory, dos, stddlg, editors и собственный модуль: mod_matr.
4Разработка алгоритмов
Опишем основные процедуры и функции программы.
Процедура GetRandomMatrix.
Процедура автоматического ввода матрицы со значениями.
Схема алгоритма данной процедуры представлена на рисунке 1.
Рисунок 1 – Схема алгоритма процедуры GetRandomMatrix.
3 блок – вводим количество строк n, количество столбцов m и максимальное predзначение элемента матрицы, 4-6 блоки – вводим случайные элемента матрица, не превышая pred, 7 блок – устанавливаем флаг в true, т. е. матрица введена, 8 блок – выводим матрицу в окне программы.
Процедура InputMatrix.
Процедура ввода матрицы со значениями вручную.
Схема алгоритма данной процедуры представлена на рисунке 2.
Рисунок 2 – Схема алгоритма процедуры InputMatrix.
3 блок – вводим количество строк n, количество столбцов m, 4-6 блоки – вводим элементы матрицы, 7 блок – устанавливаем флаг в true, т. е. матрица введена, 8 блок – выводим матрицу в окне программы.
Процедура Sort.
Процедура сортировки значений периметра подматрицы по возрастанию.
Схема алгоритма данной процедуры представлена на рисунке 3.
Рисунок 3 – Схема алгоритма процедуры Sort.
2, 3 блок – перебираем элементы периметра подматрицы, 4 блок – сравниваем текущее значение элемента матрицы меньше следующего, если да то переходим к 5 блоку, иначе к 3, 5 блок – меняем значения местами.
Процедура GetPerimetr.
Процедура определения элементов подматрицы по периметру.
Схема алгоритма данной процедуры представлена на рисунке 4.
Рисунок 4 – Схема алгоритма процедуры GetPerimetr.
2, 3 блок – обнуляем значения элементов периметра, 4 блок – количество элементов в перимерте = 1, 5, 6 блоки – перебираем элементы столбца периметра и заносим в массив per, 7, 8 блоки – перебираем элементы строки периметра и заносим в массив per, 9 блок – заносим в переменную l количество элементов в периметре подматрицы.
Функция GeomProg.
Функция определения геометрической прогрессии из элементов периметра подматрицы.
Схема алгоритма данной функции представлена на рисунке 5.
Рисунок 5 – Схема алгоритма процедуры GeomProg.
2 блок – вызов процедуры сортировки, 3 блок – флаг образования геометрической прогрессии, 4 блок – второе значение элемента массива периметра делим на первое, 5 блок – перебираем элементы массива периметра, 6 блок – следующее значение элемента массива делим на текущее и сравниваем с dv, 7 блок – не геометрическая прогрессия.
5Текст программы
programMTRKW; {программа}
uses
mod_matr;
begin
Randomize;
matrix_perim.init;
matrix_perim.run;
matrix_perim.done;
end.
Unit mod_matr; {модуль программы}
interface
uses
crt,app,objects,menus,drivers,views,dialogs,msgbox,memory,dos,stddlg,editors;
const
cmwork=203; cmvvod=206; cmvval=207; cmvvse=204; cmvusl=205; cmvhel=257; cmisfl=208;
cmfilv=209; cmfilu=210;
wincoml:Tcommandset=[cmvvse,cmvusl,cmwork,cmfilv,cmfilu]; {меню результат}
wincom2:tcommandset=[cmvvod,cmvval,cmisfl]; {меню ввод}
type
pinputwindow=^tinputwindow;
tinputwindow=object(tdialog)
procedure handleevent(var event:tevent);virtual;
end;
pwind=^twin;
twin=object(twindow)
constructor init(bounds:trect);
end;
pinterior=^tinterior;
tinterior=object(tscroller)
constructor init(var bounds:trect; hs,vs:pscrollbar);
procedure handleevent(var event:tevent);virtual;
end;
tmatrix=object(tapplication)
procedure initstatusline; virtual;
procedure initmenubar; virtual;
procedure handleevent(var event:tevent); virtual;
procedure inputmatrix;
procedure getrandommatrix;
procedure main(f:boolean);
procedure PrintMatrix ;
procedure fileinput;
procedure fileoutputv(f:boolean);
end;
tdata=record
col:string[4];
row:string[4];
max:string[4];
end;
var
matrix_perim:Tmatrix;
x,y:integer;
const
MAX = 10; {максимально матрица 10 на 10}
type
Matrix = array [1..MAX,1..MAX] of integer;
Perim = array [1..MAX*4] of integer;
var
wind:pwind;
Mxx:Matrix; {исходная матрица}
N,M:integer; {количество строк и столбцов}
l:integer; {количество элементов по периметру подматрицы}
per:Perim; {элементы периметра}
mf:boolean; {флаг ввода исходной матрицы - true}
data:tdata;
matr_v:array[1..10] of string;
fileresu,filework:text; {текстовые файлы с исходной матрицей и с результатом}
fil:boolean; {способ вывода результата true – в файл, false– на экране в окне}
implementation
procedure readmas; {очистка матрицы}
var
i,j:integer;
s:string;
sr:string[3];
begin
s:='';
for i:=1 to n do
begin
for j:=1 to m do
begin
str(mxx[i,j],sr);
s:=s+sr+' ';
end;
matr_v[i]:=s;
s:='';
end;
end;
{_______________________________________________}
constructor tinterior.init;{инициализация}
begin
tscroller.init(bounds,hs,vs);
growmode:=gfgrowhix+gfgrowhiy;
setlimit(8000,7000);
end;
{_______________________________________________}
procedure tinterior.handleevent(var event:tevent); {движение мыши}
var
r:tpoint;
location:word;
begin
location:=0;
tscroller.handleevent(event);
case event.what of
evmousedown:
begin
makelocal(mousewhere,r);
location:=delta.y+r.y;
scrolldraw
end;
evkeydown:
case event.keycode of
kbgrayminus:if location>delta.y then
begin
dec(location); scrolldraw
end;
kbgrayplus:if location<delta.y+pred(size.y) then
begin
inc(location);
scrolldraw
end;
end;
end;
end;
{_______________________________________________}
constructor twin.init(bounds:trect); {инициализация прокрутки}
var
hs,vs:pscrollbar;
interior:pinterior;
begin
twindow.init(bounds,'',0);
getcliprect(bounds);
bounds.grow(-1,-1);
vs:=standardscrollbar(sbvertical+sbhandlekeyboard); hs:=standardscrollbar(sbhorizontal+sbhandlekeyboard);
interior:=new(pinterior,init(bounds,hs,vs));
insert(interior);
readmas;
end;
{_______________________________________________}
procedure tinputwindow.handleevent;
begin
inherited handleevent(event);
if event.what=evcommand then
endmodal(event.command);
end;
{_______________________________________________}
procedure tmatrix.PrintMatrix; {Вывод рабочей матрицы в окне}
var
i,j:integer; {счётчики}
sr:string;
r:trect;
begin
r.assign(0,0,80,23);
wind:=new(pwind,init(r));
desktop^.insert(wind);
with wind^ do
begin
r.assign(2,1,70,3);
insert(new(pstatictext,init(r,'Рабочая матрица:')));
for i:=1 to n do
begin
for j:=1 to m do
begin
str(mxx[i,j],sr);
r.assign(1+j*4,1+i,4+j*4,3+i);