- •Оглавление
- •Введение
- •Глава 1. Техническое задание. Требования к оформлению
- •Глава 2. Программа и методика испытаний. Требования к содержанию и оформлению
- •Глава 3. Руководство системного программиста. Требования к содержанию и оформлению
- •Глава 4. Руководство оператора. Требования к содержанию и оформлению
- •Глава 5. Риски
- •Заключение
- •Список использованной литературы
- •Приложение а
Заключение
В данной работе была описана спецификация программы преобразователь действительных (конвертор р_10) чисел, осуществляющая перевод из p-ичной системы исчисления в десятичную. В разделе «Техническое задание» были прописаны основные требования, предъявляемые к приложению, к программной документации. Были перечислены требования к техническим средствам, на которых будет запущена данная программа. Также были перечислены основные этапы разработки. В разделе «Программа и методика испытаний» были описаны проведенные испытания над программным продуктом и соотнесены с ранее установленными к нему функциональными требованиями. В разделах «Руководство системного программиста» и «Руководство пользователя» были перечислены необходимые программные средства и оборудование, необходимые системному программисту и пользователя соответственно.
Программа «Конвертор p_10» работает согласно приведенной спецификации, без каких-либо сбоев и удовлетворяет заявленным требованиям.
Список использованной литературы
-
ГОСТ 19.201 – 78. Техническое задание. Требования к содержанию и оформлению [Текст]. – Москва: Изд-во стандартов, 1980. – 2 с.
-
ГОСТ 19.301– 79. Программа и методика испытаний. Требования к содержанию и оформлению [Текст]. – Москва: Изд-во стандартов, 1980. – 2 с.
-
ГОСТ 19.503– 79. Текст программы. Требования к содержанию и оформлению [Текст]. – Москва: Изд-во стандартов, 1980. – 1 с.
-
ГОСТ 19.503– 79. Руководство системного программиста. Требования к содержанию и оформлению [Текст]. – Москва: Изд-во стандартов, 1980. – 2 с.
-
ГОСТ 19.505– 79. Руководство оператора. Требования к содержанию и оформлению [Текст]. – Москва: Изд-во стандартов, 1980. – 2 с.
Приложение а
Код программы
program Project1;
uses
Forms,
Unit1 in '..\Конвертор25.10.14\Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
//-----------------------------------------------------------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls,Ucontrol,UEdit,UHistory,Utp_to_10;
type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
Button14: TButton;
Button15: TButton;
Button16: TButton;
Button17: TButton;
Button18: TButton;
Button19: TButton;
Button20: TButton;
Button21: TButton;
procedure TrackBar1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button15Click(Sender: TObject);
procedure Button16Click(Sender: TObject);
procedure Button17Click(Sender: TObject);
procedure Button18Click(Sender: TObject);
procedure Button19Click(Sender: TObject);
procedure Button14Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button20Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button21Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
H: THistory;
E: TEditor;
implementation
{$R *.dfm}
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Label4.Caption:=IntToStr(TrackBar1.Position);
end;
function DoConvert(digit: String;FC: Tp_10; H:THistory): extended;
begin
H.add(TRecord.Create(digit,Fc.p,Fc.DoTransfer(digit)));
DoConvert:=Fc.DoTransfer(digit);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Edit2.Text:=FloatToStr(DoConvert(Edit1.Text,Tp_10.Create(TrackBar1.Position),H));
Memo1.Clear;
for i:=0 to H.Count-1 do Memo1.Lines.Add(H.readH(i));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
H:=THistory.Create;
E:=TEditor.Create;
Edit1.Text:=E.Number;
end;
procedure TForm1.Button15Click(Sender: TObject);
begin
E.Digits(10);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button16Click(Sender: TObject);
begin
E.Digits(11);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button17Click(Sender: TObject);
begin
E.Digits(12);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button18Click(Sender: TObject);
begin
E.Digits(13);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button19Click(Sender: TObject);
begin
E.Digits(14);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button14Click(Sender: TObject);
begin
E.Digits(15);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
E.Digits(1);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
E.Digits(2);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
E.Digits(3);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
E.Digits(4);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
E.Digits(5);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
E.Digits(6);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
E.Digits(7);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
E.Digits(8);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
E.Digits(9);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
E.Digits(0);
Edit1.Text:=E.Number;
end;
procedure TForm1.Button20Click(Sender: TObject);
begin
E.Sign;
Edit1.Text:=E.Number;
end;
procedure TForm1.Button13Click(Sender: TObject);
begin
E.Clear;
Edit1.Text:=E.Number;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
E.Backspace;
Edit1.Text:=E.Number;
end;
procedure TForm1.Button21Click(Sender: TObject);
begin
E.Comma(Length(E.Number));
Edit1.Text:=E.Number;
end;
end.
//-----------------------------------------------------------------------------------------------------------------------------
unit Utp_to_10;
//------------------------------------------------------------
interface
Uses SysUtils,Dialogs;
//------------------------------------------------------------------------------
type
//------------------------------------------------------------------------------
TBase=2..16;
Tp_10 = class//Преобразователь числа из с.сч.с основанием р в десятичное
private
Fp: TBase; // основание системы счисления
function PCharToInt(d: char):Integer; //переводит символ в его числовое представление //в системах счислени с основаниями от 2 до 16
function PFracTo10(f: String):real; //переводит p-ичную дробь в число
function PIntTo10(r: String):comp; //переводит р-ичное целое в число
procedure SetP(new: TBase); //устанавливает основание системы счисления
public
property p: TBase read Fp write SetP; //чтение/запись основания с.сч.
function DoTransfer(r: String):extended ; //Управляет переводом числа//вычисляет результат
constructor Create(p: TBase); //создаёт объект и нициирует поле Fp
end;
implementation
//------------------------------------------------------------------------------
constructor Tp_10.Create(p: TBase);
begin
Fp:=p;
end;
//------------------------------------------------------------------------------
function Tp_10.PCharToInt(d: char):Integer; // получить числовое представление разряда в 10 системе
begin
if ((Ord(d)-48)<=9) and ((Ord(d)-48>=0)) then // если код символа d лежит в интервале от 0 до 9 то
result:=Ord(d)-48; // результат равен код символа d - код символа 0
if (Ord(d)<=70) and (Ord(d)>=65) then // если код символа d лежит в интервале от кодов от кода A до F то
result:=Ord(d)-55; // получаем 10-ное представление буквы
end;
//------------------------------------------------------------------------------
function Tp_10.PIntTo10(r: String):comp; // получить целую часть числа r
var
i,n,p:integer;
begin
result:=0; // зануляем результат
p:=1; // текущий множитель равен 1
n:=length(r); // получаем количество разрядов
for i:=1 to n do // для всех разрядов (всех символов строки)
begin
result:=result+PCharToInt(r[n])*p; // прибавляем в сумму текущий разряд * множитель
p:=p*Fp; // получаем след множитель
n:=n-1; // переход к след разряду
end;
end;
//------------------------------------------------------------------------------
function Tp_10.PFracTo10(f: String):real; // получить дробную часть
var
i,n:integer;
p:extended;
begin
result:=0;
p:=1/Fp; // в -1 степени
n:=length(f);
for i:=1 to n do
begin
result:=result+PCharToInt(f[i])*p;
p:=p/Fp; // переход к след множителю
end;
end;
//------------------------------------------------------------------------------
procedure Tp_10.SetP(new: TBase);
begin
Fp:=new;
end;
//------------------------------------------------------------------------------
function Tp_10.DoTransfer(r: String):extended; // получает строку с числом по основанию p, возвращает число в десятичной системе
var
m:integer; // отрицательность числа
n:integer; // номер текущего символа
l:integer; // длина входной стоки
t:integer; // была ли обнаружена точка
g:string;
f:string;
z:string; // рабочая строка (копия входной)
begin
z:=r; // копируем входную строку в строку z
l:=length(r); // длина строки r
t:=0; // точка не обнаружена
f:=r;
n:=1;
result:=0; // зануляем результат (сумму)
m:=0; // говорим что число неотрицательное
// обработка отрицательности
if r[1] = '-' then // если число отрицательное то
begin
m:=1; // запоминаем, что оно отрицательное
delete(r,1,1); // удаляем 1 символ -
end;
// поиск точки
while (n<>l) do // пока не дошли до конца строки
begin // делаем алгоритм анализа 1 символа(текущего) и убираем его из строки z
if z[1]='.' then t:=1; // если обнаружена точка то запоминаем эту ситуацию
delete(z,1,1); // убираем из z певый символ
n:=n+1; // переход к след символу
end;
// получаем модуль числа
g:=''; // зануяем строку
if t=1 then // если точка была обнаружена то
begin
// копирыем в g всю входную строку до точки
while r[1]<>'.' do // пока первый символ(текущий) не будет точкой
begin
g:=g+r[1]; // приклеиваем в g текущий символ
delete(r,1,1); // удаляем из входной строки 1 символ
end;
delete(r,1,1); // удаляем точку
result:=PIntTo10(g); // в результат пишем целую часть числа
result:=result+PFracTo10(r); // в результат прибавляем дробную часть
end
else // если число не дробное (те целое)
begin
result:=PIntTo10(r); // в результат пишем целую часть
end;
// учитываем знак
if m=1 then result:=result*(-1); // если число отрицательное то учитываем это
end;
end.
//------------------------------------------------------------------------------
unit Ucontrol;
interface
uses SysUtils, Utp_to_10, UEdit,UHistory;
//------------------------------------------------------------------------------
type
TState = (cEditing,cEndEditing);//Редактирование,РедактированиеЗавершено
TCtrl = class // класс управления для конвертора
private
FE: TEditor; // Редактор
FState: TState; // Состояние
FC: Tp_10; // Конвертор
H:THistory; // история
procedure SetP(new: TBase);//Установить основание с.сч.
public
property State: TState read FState write FState;//Свойство Состояние
property P: TBase write SetP;//Свойство Основание. Запись основания с.сч.
constructor Create;//Создание объекта Управление класса TCtrl
function DoCommand: String;//Выполнить команду
destructor Destroy;override;//Удаление объекта из памяти
end;
//------------------------------------------------------------------------------
var Control: TCtrl;
implementation
//------------------------------------------------------------------------------
constructor TCtrl.Create;
begin
FE:=TEditor.Create;
FState:=cEditing;
FC:=Tp_10.Create(2);
H:=THistory.Create;
end;
//------------------------------------------------------------------------------
procedure TCtrl.SetP(new: TBase);
//устанавливает основание системы счисления
begin
FC.p:=new;
end;
//------------------------------------------------------------------------------
function TCtrl.DoCommand: String;
var
i, j, k : integer; //fc(tp_10), fe(TEditor)
m, r, s, v: string;
g:TBase;
begin
m:='0';
while m<>'exit1' do
begin
writeln('1 - Edit number');
writeln('2 - Transfer number to decimal system');
writeln('3 - Change numerical system');
writeln('4 - History');
writeln('5 - Exit');
readln(i);
case i of
1 : FE.Edit;
2 :
begin
v:= FE.Number;
FC.DoTransfer(FE.Number);
writeln('chislo ',v,' s osnovaniem ',FC.p,' = ',FC.DoTransfer(FE.Number));//,FE.Number);
// модифицируем историю
H.add(TRecord.Create(FE.Number,FC.p,FC.DoTransfer(FE.Number)));
end;
3 :
begin
write('vvedite osnovanie sistemi schisleniya ');
readln(g);
FC.p:=g;
end;
4:
begin
for i:=0 to H.Count-1 do Writeln(H.readH(i));
end;
5 : m:='exit1';
end;
end;
end;
//------------------------------------------------------------------------------
destructor TCtrl.Destroy;
begin
end;
initialization
Control:= TCtrl.Create;
finalization
Control.Free;
end.
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
unit UEdit;//редактор
interface
uses SysUtils;
//------------------------------------------------------------------------------
const
//------------------------------------------------------------------------------
cBegString = '0,';//начальная строка
//------------------------------------------------------------------------------
type
//------------------------------------------------------------------------------
EOverSizingIn = class(Exception);//превышение допустимой длины числа
//-------------------------------------------------------------------------------
TEditor = class//Редактор чисел представленных в с.сч с основанием от 2..16
private
public
FNumber: String;//вводимая и редактируемая строка - р-ичное число
function Backspace(): String;//удаляет символ справа
function Clear: String;//удаляет введённое значение - очистка строки
function Comma(p:integer): String;//добавить запятую к вводимому числу
function IsComma():boolean;//определяет, есть ли точка
function Sign(): String;//добавить знак к вводимому числу
procedure AddZero;//добавить '0' к вводимому числу
function IntToChar(p: integer): Char;// число в р-ичный символ
function Digits(p: integer): String;//добавить символ к вводимому числу
function LenNum(): Cardinal;//количество разрядов для представления числа
function Edit(): String;//управляет вводом и редактированием
function Get(): String;//Читает число
property Number: String read Get write FNumber;
constructor Create;//инициирует строку начальным значением
end;
//------------------------------------------------------------------------------
implementation
//------------------------------------------------------------
procedure TEditor.AddZero; //добавить '0' к вводимому числу
begin
Fnumber:=Fnumber+'0';
end;
//------------------------------------------------------------
function TEditor.Backspace(): String; //удаляет символ справа
begin
delete(FNumber,Length(FNumber),1);
result:=Fnumber;
end;
//------------------------------------------------------------
function TEditor.Clear: String; //удаляет введённое значение - очистка строки
begin
FNumber:='';
result:=FNumber;
end;
//------------------------------------------------------------
function TEditor.Comma(p:integer): String; //добавить запятую к вводимому числу
var
m,i:integer;
r,l:string;
begin
if IsComma then
begin
writeln('tochka uzhe est!');
exit;
end;
if (length(FNumber)<p)then
begin
result:=FNumber;
exit;
end;
r:=FNumber;
if r[1] = '-' then
begin
m:=1;
delete(r,1,1);
end;
if p=1 then
result:='0.'+Number else
begin
for i:=1 to p-1 do
begin
l:=l+r[1];
delete(r,1,1)
end;
result:=l+'.'+r;
end;
if m=1 then
result:='-'+result;
Number:=result;
end;
//------------------------------------------------------------
function TEditor.IsComma():boolean; //определяет, есть ли точка
var
l:string;
i:integer;
begin
l:=FNumber;
result:=false;
for i:=1 to length(l) do
begin
if l[1]='.' then
result:=true;
delete(l,1,1);
end;
end;
//------------------------------------------------------------
constructor TEditor.Create; // конструктор
begin
FNumber:='';
end;
//------------------------------------------------------------
function TEditor.Digits(p: integer): String; //добавить символ к вводимому числу
begin
Fnumber:=Fnumber+IntToChar(p);
result:=Fnumber;
end;
//------------------------------------------------------------
function TEditor.IntToChar(p: integer):Char; // получить представление разряда в виде символа
begin
if (p<=9) and (p>=0) then
result:=Chr(p+48);
if (p<=15) and (p>=10) then
result:=Chr(p+55);
end;
//------------------------------------------------------------
function TEditor.LenNum(): Cardinal; //количество разрядов для представления числа
var
r,t,i:integer;
s:string;
begin
t:=0;
s:=FNumber;
r:=length(FNumber);
// получаем информацию о том, есть ли точка в числе
for i:=1 to r do
begin
if s[1]='.' then
t:=1;
delete(s,1,1);
end;
// определяем длину строки без учера знака
if FNumber[1]='-' then
result:=length(FNumber)-1
else
result:=length(FNumber);
// учитываем точку
if t <> 0 then result:=result-1; // если точка есть то от результата отнимаем 1 (чтобы точку не учесть)
end;
//------------------------------------------------------------
function TEditor.sign:String;
begin
if FNumber[1]='-' then
delete(FNumber,1,1) else
FNumber:='-'+FNumber;
end;
//------------------------------------------------------------
function TEditor.Get(): String; // получить результирующую строку
begin
result:=FNumber;
end;
//------------------------------------------------------------
function TEditor.Edit(): String; // функция выбора команды
var
s,j:string;
i, p,l:integer;
begin
while j<>'exit' do
begin
j:='0';
// выводим меню
writeln('Vibirete nujnoe deystvie');
writeln('-----------------------------------------');
writeln('1 - vvesti chislo');
writeln('2 - dobavit znak(Sign)');
writeln('3 - dobavit 0(AddZero');
writeln('4 - dobavit simvol(Digits)');
writeln('5 - kol-vo razryadov(LenNum)');
writeln('6 - udalit znachenie(Clear)');
writeln('7 - udalit simvol sprava(BackSpace)');
writeln('8 - dobavit zapyatuu(Comma)');
writeln('9 - Vihod');
// читаем команду
readln(i);
// обработка команды
case i of
1 :
begin
write('chislo = ');
readln(s); Number:=s;
writeln('chislo posle vvoda = ', number);
end;
2 :
begin
Sign;
writeln('Chislo posle izmeneniya znaka=', Number);
end;
3 :
begin
AddZero;
writeln(' chislo posle dobavleniya nulya = ', Number);
end;
4 :
begin
write('vvedite chislo =');
readln(p);
writeln('chislo posle dobavleniya 5 =', Digits(p));
end;
5 : writeln('kol-vo razryadov =', LenNum);
6 : writeln('Clear =', Clear);
7 : writeln('chislo posle udaleniya sprava =', BackSpace);
8 :
begin
write('pered kakim razryadom postavit tochku? = ');
readln(l);
Comma(l);
writeln('Chislo posle dobavleniya zapyatoy=', Number);
end;
9 : j:='exit';
else writeln('takoy komandi net');
end;
readln;
end;
end;
end.
//------------------------------------------------------------
unit UHistory;
interface
uses SysUtils, Classes;
//------------------------------------------------------------------------------
type
TBase=2..16; // тип основания системы счисления
TRecord = class //Запись в историю
CH: string; //Число в с.сч. с основнием OSN
OSN: TBase; //Основание системы счисления представления числа
RES: real; //Число в с.сч. с основнием 10
constructor Create(a:string; b:TBase; c:real); // конструктор
function TRecToStr:string; // преобразовать в строку
end;
THistory = class(TList) //История работы приложения за сеанс (наследник от TList)
procedure add(R:TRecord); // вставка записи
procedure ClearRec; // очистка истории
function readH(i:integer):string; // получить i-ю запись истории
end;
//------------------------------------------------------------------------------
implementation
//------------------------------------------------------------------------------
constructor TRecord.Create(a:string; b:TBase; c:real); // конструктор класса одной записи
begin
CH:=a;
OSN:=b;
RES:=c;
end;
function TRecord.TRecToStr:string; // получить строку записи
begin
result:='osn='+IntToStr(Osn)+'; ish. chislo='+CH+'; result='+FloatToStr(RES)+';';
end;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
procedure THistory.add(R:TRecord);
begin
inherited add(R); // вызываем унаследованный метод add
end;
//------------------------------------------------------------------------------
function THistory.readH(i:integer):string; // получить строку i-й записи истории
begin
result:=TRecord(Items[i]).TRecToStr; // берем неопределенный указатель Items[i], потом уточняем его тип, говорим что он указывает на нашу запись TRecord(Items[i])
end;
//------------------------------------------------------------------------------
procedure THistory.ClearRec;
var
i:integer;
begin
for i:=0 to count do // для всех указателей списка Items (Items,count - унаследовано)
TRecord(Items[i]).Free; // удаляем элемент на который указывает i-й указатель списка
Clear; // очищаем список (унаследованый метод)
end;
end.
//------------------------------------------------------------------------------