Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2009, 14:53   #1
Frenki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию процедурки и функции для сложения простых дробей

Вот пиши процедурки и функции для сложения простых дробей,но блин чё-то не получается...емли кто мот то блин покажи текст программки,буду признателен...
Frenki вне форума Ответить с цитированием
Старый 29.04.2009, 14:58   #2
DM_bite
Участник клуба
 
Аватар для DM_bite
 
Регистрация: 29.07.2008
Сообщений: 1,091
По умолчанию

Выкладывай код, рассмотрим... И впредь: темы лучше называть по-правилам.
Кто бы ты ни был - не думай о себе слишком (с)
DM_bite вне форума Ответить с цитированием
Старый 30.04.2009, 09:11   #3
Frenki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

я вот никак не могу написать прогу для нока,если кто мот то киньте...а то проблемы с ноком))))
Frenki вне форума Ответить с цитированием
Старый 30.04.2009, 09:33   #4
Frenki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

program kursovaja;
var
a,b,c,d,e,g,q,t,z,w:longint;
NOK,k,p,m,r:real;
begin
writeln('vvediye_celuy_4ast_pervogo _4isla');
read(a);
writeln('vvediye_4islitel_pervogo_4 isla');
read(b);
writeln('vvediye_znamenatel_pervogo _4isla');
read(c);
writeln('polu4aem_pervoe_4islo');
if a=0 then writeln(b,'/',c) else
writeln(a,'_',b,'/',c);
writeln('vvediye_celuy_4ast_vtorogo _4isla');
read(d);
writeln('vvediye_4islitel_vtorogo_4 isla');
read(e);
writeln('vvediye_znamenatel_vtorogo _4isla');
read(g);
writeln('polu4aem_vtoroe_4islo');
if d=0 then writeln(e,'/',g) else
writeln(d,'_',e,'/',g);

begin
If c>g then
begin
r:=c;
q:=g;
end
else
begin
r:=g;
q:=c;
end;

begin
If r mod q=0 then
NOK:=r
else
begin
while q>0 do
t:=r mod q;
r:=q;
q:=t;
end;
NOK:=(c*g)/r ;
end;

begin
z:=NOK div c;
w:=NOK div g;
k:=a+d;
p:=b*z+e*w;
end;

begin
if p>=NOK then
m:=p div NOK;
k:=k+m;
p:=p-m*NOK;
end;
if p=0 then writeln(k) else
writeln(k,'_',p,'/',NOK);
end;
end.
Frenki вне форума Ответить с цитированием
Старый 30.04.2009, 11:20   #5
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Код:
uses crt;
var s1,s2,res:string;
    
function Summa(a,b:string):string;

function Tchisl(c:string):integer;
var i,code:integer;
    sub:string;
begin
  i:=1;
  sub:='';
  while c[i]<>'/' do
   begin
     if c[i]<>' ' then sub:=sub+c[i];
     inc(i);
   end;
   val(sub,i,code);
   TChisl:=i;
end;

function Znam(c:string):integer;
var i,code:integer;
    sub:string;
begin
  i:=pos('/',c)+1;
  sub:='';
  while i<=length(c) do
   begin
     if c[i]<>' ' then sub:=sub+c[i];
     inc(i);
   end;
   val(sub,i,code);
   Znam:=i;
end;

procedure IsSimple(var a,b:integer);
var i,n:integer;
    f:boolean;
begin
f:=true;
 while f do
  begin
   f:=false;
   for i:=2 to a do
    if a mod i =0 then
      begin
        if b mod i=0 then begin
                            a:=a div i;
                            b:=b div i;
                            f:=true;
                            break;
                          end;
      end;
  end;
end;

var x,x1,y,y1,ch,z,cc:integer;
    mn,temp:string;
begin
x:=Tchisl(a);
x1:=Znam(a);
y:=Tchisl(b);
y1:=Znam(b);
z:=x1*y1;
ch:=x*y1+y*x1;
if ch>z then begin
              cc:=ch div z;
              ch:=ch mod z;
              IsSimple(ch,z);
             end
   else if ch<z then IsSimple(ch,z);
if cc<>0 then begin
               str(cc,mn);
               mn:=mn+' ';
              end
   else mn:='';
str(ch,temp);
mn:=mn+temp+'/';
str(z,temp);
mn:=mn+temp;
Summa:=mn;
end;
    
begin
clrscr;
writeln('Input 1 fract');
repeat
readln(s1);
until pos('/',s1)<>0;
writeln('Input 2 fract');
repeat
readln(s2);
until pos('/',s2)<>0;
res:=Summa(s1,s2);
writeln(res);
readln;
end.
P.S. Если нужно "единицу"(100/100) представить как единицу(1) - подумайте сами
Нормальное состояние техники - нерабочее, все остальное частный случай.

Последний раз редактировалось alex_fcsm; 30.04.2009 в 11:24.
alex_fcsm вне форума Ответить с цитированием
Старый 01.05.2009, 00:53   #6
Frenki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от alex_fcsm Посмотреть сообщение
Код:
uses crt;
var s1,s2,res:string;
    
function Summa(a,b:string):string;

function Tchisl(c:string):integer;
var i,code:integer;
    sub:string;
begin
  i:=1;
  sub:='';
  while c[i]<>'/' do
   begin
     if c[i]<>' ' then sub:=sub+c[i];
     inc(i);
   end;
   val(sub,i,code);
   TChisl:=i;
end;

function Znam(c:string):integer;
var i,code:integer;
    sub:string;
begin
  i:=pos('/',c)+1;
  sub:='';
  while i<=length(c) do
   begin
     if c[i]<>' ' then sub:=sub+c[i];
     inc(i);
   end;
   val(sub,i,code);
   Znam:=i;
end;

procedure IsSimple(var a,b:integer);
var i,n:integer;
    f:boolean;
begin
f:=true;
 while f do
  begin
   f:=false;
   for i:=2 to a do
    if a mod i =0 then
      begin
        if b mod i=0 then begin
                            a:=a div i;
                            b:=b div i;
                            f:=true;
                            break;
                          end;
      end;
  end;
end;

var x,x1,y,y1,ch,z,cc:integer;
    mn,temp:string;
begin
x:=Tchisl(a);
x1:=Znam(a);
y:=Tchisl(b);
y1:=Znam(b);
z:=x1*y1;
ch:=x*y1+y*x1;
if ch>z then begin
              cc:=ch div z;
              ch:=ch mod z;
              IsSimple(ch,z);
             end
   else if ch<z then IsSimple(ch,z);
if cc<>0 then begin
               str(cc,mn);
               mn:=mn+' ';
              end
   else mn:='';
str(ch,temp);
mn:=mn+temp+'/';
str(z,temp);
mn:=mn+temp;
Summa:=mn;
end;
    
begin
clrscr;
writeln('Input 1 fract');
repeat
readln(s1);
until pos('/',s1)<>0;
writeln('Input 2 fract');
repeat
readln(s2);
until pos('/',s2)<>0;
res:=Summa(s1,s2);
writeln(res);
readln;
end.
P.S. Если нужно "единицу"(100/100) представить как единицу(1) - подумайте сами
Чво-то она делает не для всех дробей... У мя был похожий код,но чё-то как и тут не хватае...
Frenki вне форума Ответить с цитированием
Старый 01.05.2009, 15:41   #7
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Frenki Посмотреть сообщение
Чво-то она делает не для всех дробей... У мя был похожий код,но чё-то как и тут не хватае...
У меня все работает. Пример где не работает выкладывай
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 01.05.2009, 18:33   #8
Gongled
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 78
По умолчанию

Пример входных значений:

-1 1/25
-2 24/25

Ответ будет -4.
Программа выдаёт -5875/625. А это уже -9.4
Пишу глупости.
Gongled вне форума Ответить с цитированием
Старый 01.05.2009, 19:50   #9
Frenki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Frenki Посмотреть сообщение
if cc<>0 then begin
str(cc,mn);
mn:=mn+' ';
end
else mn:='';
str(ch,temp);
mn:=mn+temp+'/';
str(z,temp);
mn:=mn+temp;
Summa:=mn;
Меня вот смущает этот отрезок,просто я не полностью догоняю что на нем прога делает,если не трудно то плиз объясни.
Вот к примеру я пишу 1/3 и 1/6,должно вывести 1/2 а выводит 3 1/2,откуда береться эта 3. Плиз ответь,или кинь свою аську...Просто от этой программы завсисит в какой-то степени моя оценка на экзамене...
Frenki вне форума Ответить с цитированием
Старый 01.05.2009, 20:21   #10
Gongled
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 78
По умолчанию

Мой вариант программы. Старался некоторые моменты комментировать.
Естественно, не делал никаких проверок на правильность ввода. (Т.е. знаменатель не ноль. Если есть целая часть, то у дроби нет знака и.т.п)
Код:
program pr;
uses CRT;
var
a, b, c, d, e, f : integer;

{ Нахождение НОД }
function NOD(x, y : longint) : longint;
begin
     if x<>0 then NOD := NOD(y mod x,x) else NOD := y;
end;

{ Нахождение НОК }
function NOK(x, y : longint) : longint;
begin
     NOK := (x div NOD(x,y)) * y;
end;

{ Преобразовываем дробь в неправильную }
{*
  x - целая часть
  y - числитель
  z - знаменатель
*}
function big_numerator(x, z : longint; var y : longint) : longint;
begin
     y := (abs(x) * z) + y;
     if x < 0 then y := -y;
end;

{ Делаем одинаковый знаменатель }
{*
  x - числитель первой дроби
  y - знаменатель первой дроби
  z - числитель второй дроби
  m - знаменатель второй дроби
*}
procedure equal_denominator(var x, y, z : integer; m : integer);
begin
     x := round(nok(y,m) / y) * x;
     y := round(nok(y,m) / y) * y;
     z := round(nok(y,m) / m) * z;
end;

{ Вывод результата }
{*
  x - числитель первой дроби
  y - знаменатель обеих дробей
  z - числитель второй дроби
*}
procedure print_result(x, y, z : integer);
begin
     if (x + z) mod y = 0 then writeln('Результат: ', (x + z) div y)
     else if (x + z) div y <> 0 then writeln('Результат: ', (x + z) div y,' ',(x + z) mod y,'/',y)
     else if (x + z) div y = 0 then writeln('Результат: ', (x + z) mod y,'/',y);
end;

begin
clrscr;

writeln('Введите через пробел: ');
writeln('- Целую часть');
writeln('- Числитель первой дроби');
writeln('- Знаменатель первой дроби');
writeln;
write('Ввод: ');
readln(a, b, c);

{ Неправильная дробь }
big_numerator(a, c, b);

writeln('Первая дробь: ', b,'/',c);
writeln;

writeln('Введите через пробел: ');
writeln('- Целую часть второй дроби');
writeln('- Числитель второй дроби');
writeln('- Знаменатель второй дроби');
writeln;
write('Ввод: ');
readln(d, e, f);

{ Неправильная дробь }
big_numerator(d, f, e);

writeln('Вторая дробь: ', e,'/',f);
writeln;

{ Общий знаменатель }
equal_denominator(b, c, e, f);
{ Вывод результата }
print_result(b, c, e);

end.
P.S. Потестировал с разными значениями. Если будет где-то ошибка — просьба сообщить, исправлю.
Пишу глупости.

Последний раз редактировалось Gongled; 01.05.2009 в 20:32. Причина: Дописал условие. (чтобы ноль не вылезал)
Gongled вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ВЫчисление дробей по модулю целого числа Камикадзе Помощь студентам 0 18.04.2009 09:29
Как написать код для укорачивание дробей? Dinamovec Помощь студентам 9 16.03.2009 15:34
17 Составить программу, которая печатает таблицу умножения и сложения натуральных чисел в шестнадцатеричн OTLi4HO Общие вопросы C/C++ 1 16.01.2009 13:59
текст программы для решения нелинейного уравнения методом простых итераций Dyst Помощь студентам 2 14.05.2008 22:00