Тестирование программы
12 Программирование на языке ПАСКАЛЬ Содержание
Введение______________________________________________________________3 1 Задание на курсовую работу ________________________________________3 2 Анализ задания ___________________________________________________3 3 Разработка структур данных ________________________________________4 4 Разработка алгоритмов_____________________________________________5 5 Текст программы__________________________________________________9 6 Тестирование программы___________________________________________20 7 Руководство пользователя __________________________________________22 Заключение____________________________________________________________26 Список использованных источников_______________________________________26 Введение Система программирования Турбо Паскаль представляет собой единство двух в известной степени самостоятельных начал: компилятора с языка программирования Паскаль и некоторой инструментальной программной оболочки, способствующей повышению эффективности создания программ. Процедуры и функции представляют собой важный инструмент Турбо Паскаля, позволяющий писать хорошо структурированные программы. В структурированных программах обычно легко прослеживается основной алгоритм, их нетрудно понять любому читателю, они проще в отладке и менее чувствительны к ошибкам программирования. Все эти свойства являются следствием важной особенности процедур (функций), каждая из которых представляет собой во многом самостоятельный фрагмент программы, связанный с основной программой лишь с помощью нескольких параметров. Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модульного программирования. В Турбо Паскале имеется 8 стандартных модулей, в которых содержится большое число разнообразных типов, констант, процедур и функций. Задание на курсовую работу В прямоугольной матрице выявить все подматрицы, по периметру которых расположены элементы, из которых можно образовать геометрическую прогрессию. Анализ задания Задачей курсового проектирования является разработка программного продукта, который позволил бы выявить в прямоугольной матрице все подматрицы, по периметру которых расположены элементы, из которых можно образовать геометрическую прогрессию. Должен быть разработан пользовательский интерфейс, который бы обеспечил более удобную и наглядную работу с программой. Данная программа должна выполнять следующие действия: - ввод данных с клавиатуры и из файла; - обработку данных в соответствии с заданием; - вывод результата на экран и в файл; - интерфейс пользователя в текстовом режиме, содержащий меню (с подменю) и окна; - обеспечивать различные способы ввода и вывода данных; - использовать возможности модуля CRT; - использовать структуры данных; - программный код в виде процедур и функций; - использовать программирование клавиатуры; - использовать манипулятор «мышь»; - использовать динамические структуры данных; - собственный модуль. Разработка структур данных Основные переменные: 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.
Разработка алгоритмов Опишем основные процедуры и функции программы. Процедура 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 блок – не геометрическая прогрессия. Текст программы 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,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); insert(new(pstatictext,init(r,sr))); {выводим матрицу} 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,newmenu( newsubmenu('Ввод',hcnocontext, newmenu( newitem('Ручной','F3', kbf3,cmvvod,hcnocontext, newitem('Автоматический','F4',kbf4,cmvval,hcnocontext, newitem('Из файла','F7',kbf7,cmisfl,hcnocontext, newline( newitem('Выход','Alt+X',kbaltx,cmquit,hcnocontext,nil)))))), newsubmenu('Результат',hcnocontext, newmenu( newitem('Все подматрицы','F5', kbf5,cmvvse,hcnocontext, newitem('По условию','F6',kbf6,cmvusl,hcnocontext, newline( newitem('Записать все','F7', kbf7,cmfilv,hcnocontext, newitem('Записать по условию','F8',kbf8,cmfilu,hcnocontext, 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,init(r,newstatusdef(0,$ffff,newstatuskey('Alt+X-Выход',kbAltX, cmQuit,nil),nil))); 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:pinputwindow; 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)=cmok then 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:pinputwindow; 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)=cmok then 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)=cmok then 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.cmfileopen then 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:integer); {определение элементов по периметру} 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; inc(l); end; {_______________________________________________} procedure PrintSubMatrix(n_1,m_1,n_2,m_2:integer); {выводим в окно результирующую матрицу} var i,j,k,l:integer; r:trect; s,sr:string; begin with wind^ do begin r.assign(2,n+4,70,n+20); insert(new(pstatictext,init(r,' '))); end; for i:=n_1 to n_2 do begin for j:=m_1 to m_2 do begin str(mxx[i,j],sr); with wind^ do begin r.assign(1+j*4,1+i+n+6,4+j*4,n+3+i+7); insert(new(pstatictext,init(r,sr))); end; end; end; readkey; end; {_______________________________________________} procedure PrintSubMatrixfile(n_1,m_1,n_2,m_2:integer); {выводим в файл результ -щую матрицу} var i,j,k,l:integer; begin for i:=n_1 to n_2 do begin for j:=m_1 to m_2 do write(fileresu,mxx[i,j]:3,' '); writeln(fileresu); end; writeln(fileresu); writeln(fileresu); end; {_______________________________________________} function GeomProg:boolean; {функция вычисления геометрической прогрессии} var i:integer; dv:real; begin Sort; {сортируем по возрастанию} GeomProg:=true; {образует геометрическую прогрессию} dv:=per[2]/per[1]; for i:= 2 to l-1 do if per[i+1]/per[i]<>dv then begin GeomProg:=false; {не образует геометрическую прогрессию} break; end; end; {_______________________________________________} procedure tmatrix.Main(f:boolean); {вывод результата} var Sn,Sm,Snn,Smm:integer; {угловые счётчики периметра} begin Sn:=2; Sm:=2; Snn:=1; Smm:=1; while (Sn<>N) or (Sm<>M) do {перебираем подматрицы} begin GetPerimetr(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1); {определение эл -ов по периметру подматриц} if f then {по условию} begin if GeomProg then {геометрическая прогрессия} if fil then {в файл} PrintSubMatrixfile(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1) else {в окно} PrintSubMatrix(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1); end else {все подматрицы} if fil then {в файл} PrintSubMatrixfile(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1) else {в окно} PrintSubMatrix(Snn,Smm,(Snn+Sn)-1,(Smm+Sm)-1); if (Smm+Sm)<=M then inc(Smm) else begin if (Snn+Sn)<=N then begin inc(Snn); Smm:=1; end else begin if Sm = M then begin Sm:=2; inc(Sn); snn:=1; smm:=1; end else begin snn:=1; smm:=1; inc(sm) end; end; end; end; GetPerimetr(1,1,N,M); {определение элементов по периметру матрицы} if f then {по условию} begin if GeomProg then {геометрическая прогрессия} if fil then {в файл} PrintSubMatrixfile(1,1,n,m) else {в окно} PrintSubMatrix(1,1,N,M); end else {все подматрицы} if fil then {в файл} PrintSubMatrixfile(1,1,n,m) Else {в окно} begin PrintSubMatrix(1,1,N,M); readkey; end; end; {_______________________________________________} procedure tmatrix.fileoutputv(f:boolean); {окно записи в файл результатов} var pf:pfiledialog; s:pathstr; x:char; i,j:integer; begin new(pf,init('*.txt','Выберите нужный файл:','Имя файла',fdopenbutton,0)); if desktop^.execview(pf)=stddlg.cmfileopen then begin pf^.getfilename(s); assign(fileresu,s); rewrite(fileresu); {открываем файл для записи} fil:=true; if f then {по условию} tmatrix.main(true) else {все подматрицы} tmatrix.main(false); dispose(pf,done); close (fileresu); {закрываем файл} end; fil:=false; end; {_______________________________________________} procedure tmatrix.handleevent(var event:tevent); var r:trect; i:integer; begin if event.what=evcommand then case event.command of cmisfl:tmatrix.fileinput; cmfilu:tmatrix.fileoutputv(true); cmfilv: tmatrix.fileoutputv(false); cmvvod:tmatrix.inputmatrix; cmvval:tmatrix.getrandommatrix; cmvhel:messagebox(#3'Вывод подматриц,'#13+#3'периметр которых -'#13+#3'геометрическая прогрессия'#13+ #3'Алексей 2010',nil,mfinformation or mfokbutton); cmvvse: begin with wind^ do begin r.assign(2,n+3,70,n+5); insert(new(pstatictext,init(r,'Все подматрицы:'))); end; tmatrix.main(false); end; cmvusl: begin with wind^ do begin r.assign(2,n+3,70,n+5 ); insert(new(pstatictext,init(r,'Подматрицы, у которых периметр - геометрическая прогрессия: '))); end; tmatrix.main(true); end; cmQuit: if messagebox(#3'Завершить работу?',nil,mfconfirmation or mfokcancel)=cmcancel then clearevent(event); else exit end; inherited handleevent(event); end; {_______________________________________________} end. Тестирование программы Объектом испытаний является разработанная программа. Целью испытаний является проверка соответствия программного продукта поставленным требованиям. Для проведения испытаний данные вводились с клавиатуры. Размерность тестируемой матрицы 3 – строки, 4 – столбца. Исходная матрица (рисунок 6): Рисунок 6 – Исходная рабочая матрица На рисунке 7 представлен результат работы программы по условию (рисунок 2). Рисунок 7 – Результат работы программы в текстовом виде Также, проводилось тестирование с различными примерами, которые здесь не приведены, но которые также показали верный результат. Таким образом, тестирование прошло успешно.
12
Популярное: Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (185)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |