воскресенье, 5 декабря 2010 г.

Подпрограммы. Практическое занятие 1.

 Программа для работы с дробями, написанная с использованием процедур и функций


program Drob;
var a_ch, a_zn, b_ch, b_zn, res_ch, res_zn:integer; //Переменные описывающие числитель и знаменатель


//Функция для нахождения наибольшего общего делителя двух чисел - a и b
function NOD(a,b:integer):integer;
begin
    while a<>b do //Вычисляем значени НОД по алгоритму Евклида
    begin
        if a>b then a:=a-b
        else b:=b-a;
    end;
    NOD:=a;
end;


// Процедура сокращения дроби ch/zn
procedure dSokr(var ch,zn:integer);
var t:integer; //объявим локальную переменную
begin
    t:=NOD(ch,zn);
    ch:=ch div t;
    zn:=zn div t;
end;


// Процедура сложения двух дробей ch1/zn1 + ch2/zn2
procedure dSum(ch1,zn1,ch2,zn2:integer; var res_ch,res_zn:integer);
begin
    res_ch:=ch1*zn2+ch2*zn1;
    res_zn:=zn1*zn2;
    dSokr(res_ch,res_zn); // Сокращаем полученную дробь
end;


// Процедура умножения  дробей ch1/zn1 * ch2/zn2
procedure dMult(ch1,zn1,ch2,zn2:integer; var res_ch,res_zn:integer);
begin
    res_ch:=ch1*ch2;
    res_zn:=zn1*zn2;
    dSokr(res_ch,res_zn); // Сокращаем полученную дробь
end;


// Процедура вычитания  дробей ch1/zn1 - ch2/zn2
procedure dMinus(ch1,zn1,ch2,zn2:integer; var res_ch,res_zn:integer);
begin
    res_ch:=ch1*zn2-ch2*zn1;
    res_zn:=zn1*zn2;
    dSokr(res_ch,res_zn); // Сокращаем полученную дробь
end;


// Процедура деления  дробей ch1/zn1 : ch2/zn2
procedure dDiv(ch1,zn1,ch2,zn2:integer; var res_ch,res_zn:integer);
begin
    res_ch:=ch1*ch2;
    res_zn:=zn1*zn2;
    dSokr(res_ch,res_zn); // Сокращаем полученную дробь
end;


// Проверка дроби - правильная или нет
function IsCorrect(ch,zn:integer):boolean;
begin
    if ch>=zn then IsCorrect:=false
    else IsCorrect:=true;
end;


// Функция возвращает целую часть дроби
function GetIntPart(ch,zn:integer):integer;
begin
    GetIntPart:=ch div zn;
end;


// Начинается главная часть програмы
// Вычислим значение выражения
// a_ch/a_zn = 2/3 + 5/7 * 4/6
// b_ch/b_zn = 5/6 * 7/8 - 1/12
// res = a:b
begin
   dMult(5,7, 4,6, a_ch,a_zn);
   dSum(2,3, a_ch,a_zn, a_ch,a_zn);
   dMult(5,6, 7,8, b_ch,b_zn);
   dMinus(b_ch,b_zn, 1,12, b_ch,b_zn);
   dDiv(a_ch,a_zn, b_ch,b_zn, res_ch,res_zn);


   writeln('Результат вычисления: ', res_ch,'/',res_zn);
end.

Комментариев нет:

Отправить комментарий