Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНые РАБОТАы с 9.doc
Скачиваний:
29
Добавлен:
10.05.2015
Размер:
545.28 Кб
Скачать

Пример разработки одномодульного приложения.

Разработать приложение, выполняющее арифметические операции с обыкновенной дробью, состоящей из числителя и знаменателя. Числитель и знаменатель представлены целыми числами.

Пример кода одномодульного приложения

Program PrimRec;

Uses

sysutils;

type

TDroby=record

a:integer;

b:integer;

end;

TDar=array of Tdroby;

//Добавление записи в массив

procedure Add_to_Array(var Mass:TDar;r:TDroby);

var

i:word;

begin

i:=high(Mass);

setlength(Mass,i+1);

Mass[i]:=r;

end;

//Сложение двух дробей

function ADD(r1,r2:TDroby):TDroby;

begin

result.a:=r1.a*r2.b+r1.b*r2.a;

result.b:=r1.b*r2.b;

sokrashenye_droby(result);

end;

//наибольший общий делитель числителя и знаменателя дроби //для сокращения дроби

function NOD_a_b(r:TDroby):integer;

var

n,m,modr:integer;

begin

n:=r.a;

m:=r.b;

modr:= n mod m;

while modr<>0 do

begin

n:=m;

m:=modr;

modr:=n mod m;

end;

result:=m;

end;

//Сокращение дроби

procedure sokrashenye_droby(var r:Tdroby);

var

del:integer;

begin

del:=NOD_a_b(r);

r.a:=r.a div del;

r.b:=r.b div del;

end;

//Нахождение суммы дробей массива

function Add_Mass(Var Mass:TDar):Tdroby;

var

i:integer;

sum:Tdroby;

begin

if length(Mass)=0 then showMessage('Массив дробей не создан')

else

begin

sum.a:=Mass[0].a;

sum.b:=Mass[0].b;

for i:=1 to high(Mass) do

begin

sum:=ADD(sum,Mass[i])

end;

end;

result:=sum;

end;

//Ввод дроби

procedure input_record(var r:Tdroby;var p:boolean);

begin

p:=true;

MY_writeln('Введите дробь');

MY_writeln('Числитель');readln(r.a);

MY_writeln('Знаменатель');readln(r.b);

if (r.a=0) or (r.b=0) then p:=false

else

sokrashenye_droby(r);

end;

//Ввод данных в массив записей (дробей)

procedure input_Array(var mass:Tdar;var p:boolean);

var

otvet:char;

r:TDroby;

i:integer;

begin

i:=0;

MY_writeln('Создание массива завершается по требованию пользователя');

repeat

input_record(r); p:=true;

Add_to_Array(Mass,r);

MY_writeln('Продолжить ввод дробей Y/N');

readln(otvet)

until (otvet='N') or (otvet='n');

end;

//вывод записи

procedure out_record(var r:Tdroby);

begin

my_write('Дробь=');

writeln(r.a,'/',r.b);

end;

//Вывод массива записей

procedure out_Array(var mass:Tdar);

var

i:integer;

begin

for i:=0 to high(mass) do

with mass[i] do

write(a,'/', b,' ');

end;

procedure my_writeln(const s:string);

begin

writeln(RUSANSI1251_ASCII866(s));

end;

procedure my_write(const s:string);

begin

writeln(RUSANSI1251_ASCII866(s));

end;

//ОСНОВНАЯ ПРОГРАММА

var

r1,r2:TDroby;

mass:TDar;

n,num:byte;

p1,p2:boolean; //признаки заполнения массива

otvet:char;

sum:Tdroby;

begin

P1:=false;P2:=false;

while true do

begin

My_writeln('Набор операций');

My_writeln('1.Формирование одной дроби');

My_writeln('2.Вывод дроби');

My_writeln('3.Создание массива дробей');

MY_writeln('4.Вывод массива');

MY_writeln('5.Сложение всех дробей массива');

MY_writeln('6.Выход');

MY_writeln('Введите номер операции');

Readln(num);

case num of

1: begin

input_record(r1,p1); //p1 - признак заполнения записи

end;

2: begin

if p1 then

out_record(r1)

else

My_writeln('Дробь не введена');

end;

3: begin

input_Array(mass,p2);

end;

4:

if p2 then

out_Array( mass)

else

MY_writeln('Масcив не создан');

5:if p2 then

begin

sum:=ADD_Mass( mass);

MY_write(' Сумма=');

out_record(sum);

end

else

MY_writeln('Масcив не создан');

6:halt(0);

end

end;

end.

Разработка многомодульного проекта

Разработка модулей проекта

Модуль MY_Unit_Def

Содержит определение типа записи и типа массива записей.

unit MY_Unit_Def;

interface

type

TDroby=record

a:integer;

b:integer;

end;

TDar=array of Tdroby;

implementation

end.

Модуль MY_Unit_Input_Output

Содержит операции ввода и вывода записей и массива записей, организованные с помощью процедур стандартного ввода-вывода.

Для выполнения стандартного ввода-вывода требуется включить в интерфейсную часть модуля оператор uses и подключить модули с функциями конвертирования и определения структуры записи и массива.

Unit MY_Unit_Input_Output;

interface

Uses convertor, MY_Unit_Def;

procedure input_record(var r:Tdroby;var p:boolean);//ввод записи

procedure out_record(var r:Tdroby); //вывод записи

procedure out_Array(var mass:Tdar); //вывод массива дробей

//отображение текстовых значений в формате ASCII

procedure my_writeln(const s:string);

procedure my_write(const s:string);

//заполнение массива

procedure input_Array(var mass:Tdar;var p:boolean);

implementation

//реализация всех подпрограмм интерфейсной части

procedure input_record(var r:Tdroby;var p:boolean);

begin

p:=true;

MY_writeln('Введите дробь');

MY_writeln('Числитель');readln(r.a);

MY_writeln('Знаменатель');readln(r.b);

if (r.a=0) or (r.b=0) then p:=false

else

sokrashenye_droby(r);

end;

procedure input_Array(var mass:Tdar;var p:boolean);

var

otvet:char;

r:TDroby;

i:integer;

begin

i:=0;

MY_writeln('Создание массива завершается по требованию пользователя');

repeat

input_record(r); p:=true;

Add_to_Array(Mass,r);

MY_writeln('Продолжить ввод дробей Y/N');

readln(otvet)

until (otvet='N') or (otvet='n');

end;

procedure out_record(var r:Tdroby);

begin

my_write('Дробь=');

writeln(r.a,'/',r.b);

end;

procedure out_Array(var mass:Tdar);

var

i:integer;

begin

for i:=0 to high(mass) do

with mass[i] do

write(a,'/', b,' ');

end;

procedure my_writeln(const s:string);

begin

writeln(RUSANSI1251_ASCII866(s));

end;

procedure my_write(const s:string);

begin

writeln(RUSANSI1251_ASCII866(s));

end;

Модуль MY_Unit_Operation

Содержит подпрограммы, которые реализуют операции над массивом записей.

Необходимо включить в интерфейсную часть модуля оператор uses и подключить модули с функциями конвертирования и определения структуры записи и массива.

Unit MY_Unit_Input_Output;

interface

Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Rec_droby, MY_Unit_Def;

//сложение двух дробей

function ADD(r1,r2:TDroby):TDroby;

//НОД числ. И знам.

function NOD_a_b(r:TDroby):integer;

//создание дин.масс

procedure Add_to_Array(var Mass:TDar;r:TDroby);

//сложение всех дробей массива

function Add_Mass(Var Mass:TDar):Tdroby;

procedure sokrashenye_droby(var r:Tdroby); //сокращение дроби

implementation

procedure Add_to_Array(var Mass:TDar;r:TDroby);

var

i:word;

begin

i:=high(Mass);

setlength(Mass,i+1);

Mass[i]:=r;

end;

function ADD(r1,r2:TDroby):TDroby;

begin

result.a:=r1.a*r2.b+r1.b*r2.a;

result.b:=r1.b*r2.b;

sokrashenye_droby(result);

end;

function NOD_a_b(r:TDroby):integer;

var

n,m,modr:integer;

begin

n:=r.a;

m:=r.b;

modr:= n mod m;

while modr<>0 do

begin

n:=m;

m:=modr;

modr:=n mod m;

end;

result:=m;

end;

procedure sokrashenye_droby(var r:Tdroby);

var

del:integer;

begin

del:=NOD_a_b(r);

r.a:=r.a div del;

r.b:=r.b div del;

end;

function Add_Mass(Var Mass:TDar):Tdroby;

var

i:integer;

sum:Tdroby;

begin

if length(Mass)=0 then showMessage('Массив дробей не создан')

else

begin

sum.a:=Mass[0].a;

sum.b:=Mass[0].b;

for i:=1 to high(Mass) do

begin

sum:=ADD(sum,Mass[i])

end;

end;

result:=sum;

end;

end.

Пример кода созданного многомодульного проекта

program Drody;

{$APPTYPE CONSOLE}

Uses SysUtils, MY_Unit_Def, Convertor, MY_Unit_Input_Output in MY_Unit_Input_Output.pas, MY_Unit_Operation;

var

r1,r2:TDroby;

mass:TDar;

n,num:byte;

p1,p2:boolean; //признаки заполнения массива

otvet:char;

sum:Tdroby;

begin

P1:=false;P2:=false;

while true do

begin

My_writeln('Набор операций');

My_writeln('1.Формирование одной дроби');

My_writeln('2.Вывод дроби');

My_writeln('3.Создание массива дробей');

MY_writeln('4.Вывод массива');

MY_writeln('5.Сложение всех дробей массива');

MY_writeln('6.Выход');

MY_writeln('Введите номер операции');

Readln(num);

case num of

1: begin

input_record(r1,p1); //p1 - признак заполнения записи

end;

2: begin

if p1 then

out_record(r1)

else

My_writeln('Дробь не введена');

end;

3: begin

input_Array(mass,p2);

end;

4:

if p2 then

out_Array( mass)

else

MY_writeln('Масcив не создан');

5:if p2 then

begin

sum:=ADD_Mass( mass);

MY_write(' Сумма=');

out_record(sum);

end

else

MY_writeln('Масcив не создан');

6:halt(0); end end;end.