Зайцев М. Г. / 5
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ
Новосибирский государственный технический университет
Практическое задание №5
по дисциплине информатика и программирование
на тему: «Модульное программирование»
Факультет бизнеса
Группа: ФБИ-11
Студенты: Рыбаченко А.А.
Преподаватель: Зайцев М.Г.
Новосибирск
2012г.
Цель: Сформировать практические навыки использования модулей Object Pascal (unit) для создания библиотек пользователей и разработки абстрактных типов данных.
Задание:
-
Разработайте тип данных «простая дробь» (Frac) для выполнения операций над простыми дробями. Предусмотрите возможность выполнения операций: сложение, умножение, деление, вычитание. Включите в состав подпрограмм для работы с простыми дробями: процедуру ввода значений в переменную типа «простая дробь» с клавиатуры терминала, функцию для формирования строкового представления простой дроби, функцию для сокращения простых дробей, поиска наибольшего общего делителя.
-
Разработайте тестовый набор и выполните тестирование разработанного типа данных.
Текст программы:
unit UFrac;
//тип данных простая дробь с операцией сложения
interface
//--------------------------------------------
type
//--------------------------------------------
PrtFrac=^Frac;
Frac = record//простая дробь
num: integer;//числитель
denom: integer;//знаменатель
end;
//--------------------------------------------
function Add(a,b: Frac): frac;//сложение простых дробей
function Minus(a,b: frac): frac;//разность простых дробей
function Mult(a,b: frac): frac;//произведение простых дробей
function Divis(a,b: frac): frac;//деление простых дробей
function FracToStr(a: frac): string;//перевод в строку
function NOD(a,b:integer): integer;//наименьший общий делитель
procedure CutFrac(var a: frac);
procedure InputFrac(var a:frac);
procedure prov(var a: frac);//смена знака
//--------------------------------------------
implementation
uses
SysUtils;
//--------------------------------------------
function Add(a,b: Frac): Frac;
begin
result.num:= a.num*b.denom + b.num*a.denom;
result.denom:= a.denom*b.denom;
prov(result);
CutFrac(result);
end;
//--------------------------------------------
function Minus(a,b: frac): frac;
begin
result.num:= a.num*b.denom - b.num*a.denom;
result.denom:= a.denom*b.denom;
prov(result);
CutFrac(result);
end;
//--------------------------------------------
function Mult(a,b: frac): frac;
begin
prov(a);
result.num:=a.num*b.num;
result.denom:=a.denom*b.denom;
CutFrac(result);
end;
//--------------------------------------------
function Divis(a,b: frac): frac;
begin
result.num:=a.num*b.denom;
result.denom:=a.denom*b.num;
prov(result);
CutFrac(result);
end;
//--------------------------------------------
function NOD(a,b:integer):Integer;
begin
a:=abs(a);
b:= abs(b);
while a<>b do
if a>b then
a:=a-b
else if a<abs(b) then b:=b-a;
result:=a;
end;
//--------------------------------------------
procedure CutFrac(var a:frac);
var c:integer;
begin
c:=nod(a.num,a.denom);
a.num:=a.num div c;
a.denom:=a.denom div c;
end;
//--------------------------------------------
procedure InputFrac(var a:frac);
begin
write('Frac.num= ');readln(a.num);
write('Frac.denom= ');readln(a.denom);
CutFrac(a);
end;
//--------------------------------------------
procedure prov(var a:frac);
begin
if a.denom<0 then
begin
a.denom:=(-1)*a.denom;
a.num:=(-1)*a.num;
end;
end;
//--------------------------------------------
function FracToStr(a:frac):string;
begin
result:=inttostr(a.num)+'/'+inttostr(a.denom);
end;
end.
program PFrac;
{$APPTYPE CONSOLE}
//--------------------------------------------
uses
SysUtils,
UFrac in 'UFrac.pas';
//--------------------------------------------
var
a: PrtFrac;
b: PrtFrac;
c: PrtFrac;
//--------------------------------------------
begin
new(a);
new(b);
new(c);
InputFrac(a^);
InputFrac(b^);
c^:= Add(a^,b^);//сложение простых дробей
writeln('Add= ',FracToStr(c^));
c^:= Minus(a^,b^);//разность простых дробей
writeln('Minus= ',FracToStr(c^));
c^:= Mult(a^,b^);//произведение простых дробей
writeln('Multiplication= ',FracToStr(c^));
c^:= Divis(a^,b^);//деление простых дробей
writeln('Division= ',FracToStr(c^));
readln;
end.
Тестовые наборы:
Тестовый набор |
|||
Номер теста |
Исходные данные |
Ожидаемый результат |
|
1 |
A=3/4 |
B=1/2 |
Add=5/4 Minus=1/4 Multiplication=3/8 Division=6/4
|