Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 8509
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Советник
Рейтинг: 5909
∙ повысить рейтинг »
lamed
Статус: Академик
Рейтинг: 5541
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1206
Дата выхода:27.09.2011, 16:00
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:162 / 171
Вопросов / ответов:1 / 1

Консультация # 184065: Уважаемые эксперты! Помогите пожалуйста выполнить задание: Вот имеется модуль

Код :
unit droby;
interface
 type
  natur = 1..high(longint);
  frac = record
   p : longint; {числитель дроби}
   q : natur {знаменатель дроби}
...

Консультация # 184065:

Уважаемые эксперты!
Помогите пожалуйста выполнить задание:

Вот имеется модуль

Код :
unit droby;
interface
 type
  natur = 1..high(longint);
  frac = record
   p : longint; {числитель дроби}
   q : natur {знаменатель дроби}
  end;

procedure sokr(var a: frac);
procedure summa(a, b: frac; var c: frac);
procedure raznost(a, b: frac; var c: frac);
procedure proizvedenue(a, b: frac; var c: frac);
procedure chastnoe(a, b: frac; var c: frac);
procedure stepen(a: frac; n : natur; var c: frac);

{раздел реализации модуля}
implementation

{нахождение наибольшего общего делителя (нод) двух чисел - вспомогательная функция}
function nodevklid(a, b: natur): natur;
begin
  while (a <> b) do
    if (a > b) then
   if (a mod b <> 0)
    then
     a := (a mod b)
    else
     a := b
  else
   if (b mod a <> 0)
   then
    b := (b mod a)
   else
    b := a;
    nodevklid := a
end;

procedure sokr; {сокращение дроби}
var m, n : natur;
begin
   if (a.p <> 0)
   then begin
  if (a.p < 0)
   then
    m := abs(a.p)
   else
    m := a.p; {совмещение типов, т.к. a.p - longint}
  n := nodevklid(m, a.q);
  a.p := a.p div n;
  a.q := a.q div n
   end
end;

procedure summa; {сумма дробей}
begin
 c.q := (a.q * b.q) div nod(a.q, b.q);
 c.p := a.p * c.q div a.q + b.p * c.q div b.q;
 sokr(c)
end;

procedure raznost; {разность дробей}
begin
 c.q := (a.q * b.q) div nod(a.q, b.q);
 c.p := a.p * c.q div a.q - b.p * c.q div b.q;
 sokr(c)
end;

procedure proizvedenue; {умножение дробей}
begin
 c.q := a.q * b.q;
 c.p := a.p * b.p;
 sokr(c)
end;

procedure chastnoe; {деление дробей}
begin
 c.q := a.q * b.p;
 c.p := a.p * b.q;
 sokr(c)
end;

procedure stepen; {возведение в степень}
var i : natur;
begin
    c.q := 1;
 c.p := 1;
 sokr(a);
    for i := 1 to n do
  proizvedenue(a, c, c)
end;

{раздел инициализации модуля}
begin
end.


Нужно сделать программу:
Ввести арифметическое выражение с простыми дробями и выполнить действия.

Дата отправки: 22.09.2011, 15:19
Вопрос задал: Посетитель - 372181 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Асмик Гаряка (Академик):

Здравствуйте, Посетитель - 372181!
Эта программа использует данный модуль.
Это рекурсивный парсер арифметических выражений со скобками.
drobtostr получает строковую запись дроби.
alltrim удаляет пробелы.
parentheses находит выражение внутри скобок.
eval вычисляет значение выражения.

Код :
program drob;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  droby in 'Projects\droby.pas';

function drobtostr(a:frac):string;
var s,s1:string;
  begin
  str(a.p,s);
  s:=s+'/';
 str(a.q,s1);
  drobtostr:=s+s1;
  end;

  procedure printdrob(a:frac);
  begin
  write(drobtostr(a));
  end;


function alltrim (s:string):string; {?????? ???????}
  var p:integer;
begin
  repeat
    p:=pos(' ',s);
    if p>0 then delete (s,p,1);
  until p=0;
  alltrim:=s;
end;

function parentheses(s:string):string;
var k,bracketcount,open,close:integer;
begin
  k:=pos('(',s);
  bracketcount:=0;

  if k=0 then begin parentheses:='' ;exit end
  else
  begin
    open:=k;
    while k<=Length(s) do
    begin
      if s[k]='('  then inc(bracketcount);//otryvayuwaya
      if s[k]=')'  then begin dec(bracketcount); close:=k; end; //zakryvayuwaya
      inc(k);
    end;
    if bracketcount<>0 then begin write('wrong expression');parentheses:='';exit end;
    parentheses:=copy(s,open+1,close-open-1);
  end;
end;



function eval(s:string):frac;
var simple:boolean;
  k,c:integer;
  p:longint;
  q : natur;
  r1, r2,r3:frac;
  sub,sub1:string;
begin
   k:=pos('(',s);
   sub:=parentheses(s);
   if sub<>'' then
   begin
     r1:=eval(sub);
     sub1:=drobtostr(r1);
     Delete(s,k,Length(sub)+2);
     Insert(sub1,s,k);
     eval:=eval(s);
     exit;
   end;
   k:=pos('+',s)+pos('-',s)+pos('*',s);
   if k=0 then
   begin
   simple:=true;
   end;
   if simple then
   begin
     k:=pos('/',s);
     if k=0 then
     begin
     writeln('wrong expression');
      eval.p:=0;
      eval.q:=1;
     end
     else
     begin
      Val(copy(s,1,k-1),p,c);
      eval.p:=p;
      Val(copy(s,k+1,Length(s)-k),q,c);
      if (q>0) then
      eval.q:=q
      else
        writeln('wrong expression');
     end
   end
   else
   begin
     k:=pos('+',s);
     if (k>1) then
     begin
     r1:=eval(copy(s,1,k-1));
     r2:=eval(copy(s,k+1,Length(s)-k));
     summa(r1,r2,r3);
     eval:=r3;
     exit;
     end;
     k:=pos('-',s);
     if (k>1) then
     begin
     r1:=eval(copy(s,1,k-1));
     r2:=eval(copy(s,k+1,Length(s)-k));
     raznost(r1,r2,r3);
     eval:=r3;
     exit;
     end;
     k:=pos('*',s);
     if (k>1) then
     begin
     r1:=eval(copy(s,1,k-1));
     r2:=eval(copy(s,k+1,Length(s)-k));
     proizvedenue(r1,r2,r3);
     eval:=r3;
     exit;
     end;
     k:=pos('/',s);
     if (k>1) then
     begin
     r1:=eval(copy(s,1,k-1));
     r2:=eval(copy(s,k+1,Length(s)-k));
     chastnoe(r1,r2,r3);
     eval:=r3;
     exit;
     end;
   end;

end;

  var r:frac;
  v1:string;

  begin
   write('vvedite vyrazhenie');
   readln (v1);
   v1:=alltrim(v1);
   r:=eval(v1);
   printdrob(r);
   readln;
end.

Консультировал: Асмик Гаряка (Академик)
Дата отправки: 22.09.2011, 16:14
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное