Програмирование на языке Паскаль
Программирование на языке ПАСКАЛЬ
Содержание
Введение______________________
- Задание на
курсовую работу ______________________________
__________3 - Анализ задания
______________________________
_____________________3 - Разработка
структур данных ______________________________
__________4 - Разработка
алгоритмов____________________
_________________________5 - Текст программы_____________________
_____________________________9 - Тестирование
программы_____________________
______________________20 - Руководство
пользователя ______________________________
____________22
Заключение____________________
Список использованных
источников____________________
Введение
Система
программирования Турбо Паскаль
представляет собой единство двух в
известной степени
Процедуры и функции представляют собой важный инструмент Турбо Паскаля, позволяющий писать хорошо структурированные программы. В структурированных программах обычно легко прослеживается основной алгоритм, их нетрудно понять любому читателю, они проще в отладке и менее чувствительны к ошибкам программирования. Все эти свойства являются следствием важной особенности процедур (функций), каждая из которых представляет собой во многом самостоятельный фрагмент программы, связанный с основной программой лишь с помощью нескольких параметров.
Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модульного программирования. В Турбо Паскале имеется 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
блок – вводим количество
Процедура 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 Текст программы
program MTRKW; {программа}
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,
const
cmwork=203; cmvvod=206; cmvval=207; cmvvse=204; cmvusl=205; cmvhel=257; cmisfl=208;
cmfilv=209; cmfilu=210;
wincoml:Tcommandset=[cmvvse,
wincom2:tcommandset=[cmvvod,
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(
interior:=new(pinterior,init(
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);
insert(new(pstatictext,init(r,
end;
end;
r.assign(2,i+2,70,4+i); insert(new(pstatictext,init(r,
end;
end;
{_____________________________
procedure tmatrix.initmenubar; {Инициализация панели меню}
var
r:trect;
begin
getextent(r);
r.b.y:=succ(r.a.y);
menubar:=new(pmenubar,init(r,
newsubmenu('Ввод',hcnocontext,
newmenu(
newitem('Ручной','F3', kbf3,cmvvod,hcnocontext,
newitem('Автоматический','F4',
newitem('Из файла','F7',kbf7,cmisfl,
newline(
newitem('Выход','Alt+X',
newsubmenu('Результат',
newmenu(
newitem('Все подматрицы','F5', kbf5,cmvvse,hcnocontext,
newitem('По условию','F6',kbf6,cmvusl,
newline(
newitem('Записать все','F7', kbf7,cmfilv,hcnocontext,
newitem('Записать по
условию','F8',kbf8,cmfilu,
nil)))))),
newitem('О программе','F1', kbf1,cmvhel,hcnocontext,nil))) )))
end;
{_____________________________
procedure tmatrix.initstatusline; {Инициализация строки состояния}
var
r:trect;
begin
getextent(r);
r.a.y:=pred(r.b.y);
statusline:=new(pstatusline,
disablecommands(wincoml);
enablecommands(wincom2)
end;
{_____________________________
procedure tmatrix.GetRandomMatrix; {Автоматический ввод матрицы}
var
i,j:integer; {счётчики}
a,pred,s_i,s_j,s_pred:integer;
r:trect; col,row,max: PInputLine;
inputwindow,inputw:
begin
r.assign(15,5,65,16);
inputwindow:=new(pinputwindow, Init(r, 'Автоматический ввод'));
with inputwindow^ do
begin {выводим модальное окно, в котором вводим количество строк, столбцов и мак. значение}
r.Assign(37,2,45,3);
col:=New(PInputLine, Init(r,4));
Insert(col); r.Assign(2,2 , 35,3);
Insert(New(PLabel, Init(r, 'Количество строк матрицы', col)));
r.Assign(37,4,45,5);
row:=New(PInputLine, Init(r,4));
Insert(row); r.Assign(2,4,35,5);
Insert(New(PLabel, Init(r, 'Количество столбцов матрицы', row)));
r.Assign(37,6,45,7);
max:=New(PInputLine, Init(r,4)) ;
Insert(max); r.Assign(2,6,35,7);
Insert(New(PLabel, Init(r, 'Максимальное значение элемента', max)));
r.Assign(19,8,32,10);
Insert(New(PButton, Init(r, 'OK', cmOk, bfdefault)));
end;
if desktop^.execview(inputwindow)
begin {вводим элементы в матрицу}
inputwindow^.getdata(data);
val(data.col,n,s_i);
val( data.row,m,s_j) ;
val(data.max,pred,s_pred) ;
for i:=1 to N do
for j:=1 to M do
begin
a:=random(pred)+1;
Mxx[i,j]:=a;
end;
mf:=true; {флаг ввода исходной матрицы}
dispose(inputwindow,done);
enablecommands(wincoml);
tmatrix.printmatrix; {выводим рабочую матрицу}
end;
end;
{_____________________________
procedure tmatrix.InputMatrix; {Ручной ввод матрицы}
var
i,j,s_i,s_j:integer; {счётчики}
a:integer;
r:trect;
col,row,c: PInputLine;
inputwindow,inputw:
s,t:string;
begin
r.assign(15,5,65,16);
inputwindow:=new(pinputwindow, Init(r, 'Ручной ввод'));
with inputwindow^ do
begin {выводим модальное окно, в котором вводим количество строк, столбцов}
r.Assign(37,2,45,3);
col:=New(PInputLine, Init(r,4));
Insert(col);
r.Assign(2,2 , 35,3);
Insert(New(PLabel, Init(r, 'Количество строк матрицы', col)));
r.Assign(37,4,45,5);
row:=New(PInputLine, Init(r,4));
Insert(row);
r.Assign(2,4,35,5);
Insert(New(PLabel, Init(r, 'Количество столбцов матрицы', row)));
r.Assign(19,8,32,10);
Insert(New(PButton, Init(r, 'OK', cmOk, bfdefault)));
end;
if desktop^.execview(inputwindow)
begin {водим элементы матрицы в окне}
inputwindow^.getdata(data);
val(data.col,n,s_i);
val( data.row,m,s_j);
dispose(inputwindow,done);
for i:=1 to N do
for j:=1 to M do
begin
str(i,t);
str(j,s);
r.assign(15,5,65,16);
inputwindow:=new(pinputwindow, Init(r, 'Ввод элемента матрицы'));
with inputwindow^ do
begin
r.Assign(2,4,35,5);
Insert(New(PLabel, Init(r, 'Элемент матрицы'+'['+t+','+s+']', c)));
r.Assign(37,4,45,5);
Insert(New(PInputLine, Init(r,4)));
r.Assign(19,8,32,10);
Insert(New(PButton, Init(r, 'OK', cmOk, bfdefault)));
end;
if desktop^.execview(inputwindow)
begin {заносим в матрицу Mxx значения}
inputwindow^.getdata(data);
val(data.col,a,s_i);
Mxx[i,j]:=a;
dispose(inputwindow,done);
end;
end;
mf:=true; {флаг ввода исходной матрицы}
enablecommands(wincoml);
tmatrix.printmatrix; {выводим рабочую матрицу}
end;
end;
{_____________________________
procedure tmatrix.fileinput; {ввод данных из файла}
var
pf:pfiledialog;
s:pathstr;
x:char;
i,j:integer; {счётчики}
begin
new(pf,init('*.txt','Выберите нужный файл:','Имя файла',fdopenbutton,0));
if desktop^.execview(pf)=stddlg.
begin {считывание матрицы из файла}
pf^.getfilename(s);
assign(filework,s);
reset(filework); {открываем файл для чтения}
enablecommands(wincoml);
dispose(pf,done);
i:=1;
j:=1;
while not eof(filework ) do
begin
while not eoln(filework) do
begin
read(filework,mxx[i,j]); {заносим в матрицу значения}
read(filework,x);
j:=j+1;
n:=i;
m:=j-1;
end;
j:=1;
i:=i+1;
readln(filework);
end;
close(filework); {закрываем файл}
tmatrix.printmatrix; {выводим рабочую матрицу}
end;
end;
{_____________________________
procedure Sort; {сортируем элементы периметра по возрастанию}
var
i,j:integer; {счётчики}
p:integer; {вспомогательная переменная для обмена значениями}
begin
for i:=2 to l do
for j:=l downto i do
if per[j-1]>per[j] then
begin {меняем местами элементы}
p:=per[j-1];
per[j-1]:=per[j];
per[j]:=p;
end;
end;
{_____________________________
procedure GetPerimetr(n_1,m_1,n_2,m_2:
var
i:integer; {счётчик}
k:integer;
begin {обнуляем массив}
for i:=1 to 2*N+2*M do
per[i]:=0;
k:=1;
for i:=m_1 to m_2 do {выбираем элементы столбца периметра}
begin
per[k]:=Mxx[n_1,i];
per[k+1]:=Mxx[n_2,i];
inc(k,2)
end;
for i:=(n_1+1) to (n_2-1) do {выбираем элементы строк периметра}
begin
per[k]:=Mxx[i,m_1];
per[k+1]:=Mxx[i,m_2];
inc(k,2)
end;
dec(k,2);
l:=k;