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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2009, 01:52   #11
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Gongled Посмотреть сообщение
Пример входных значений:

-1 1/25
-2 24/25

Ответ будет -4.
Программа выдаёт -5875/625. А это уже -9.4
1. Тема - сложение простых дробей (1 1/15) - смешаное число, а не простая дробь. Учи матчасть
2. Программа действительно не обрабатывала корректно отрицательные значения

Код:
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,mn:integer;
    f:boolean;
begin
f:=true;
mn:=1;
if a<0 then mn:=-1;
a:=abs(a);
 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;
a:=a*mn;
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;
if ch=z then Summa:='1';
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. При желании можно переделать под любые числа
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 02.05.2009, 02:01   #12
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Frenki Посмотреть сообщение
Меня вот смущает этот отрезок,просто я не полностью догоняю что на нем прога делает,если не трудно то плиз объясни.
Вот к примеру я пишу 1/3 и 1/6,должно вывести 1/2 а выводит 3 1/2,откуда береться эта 3. Плиз ответь,или кинь свою аську...Просто от этой программы завсисит в какой-то степени моя оценка на экзамене...
Код:
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;
if ch=z then Summa:='1'; // если дробная часть представляет собой единицу
P.S. Вводил 1/6 и 1/3 - получал 1/2

Должно было быть что-то такое
Input 1 fract
1/6
Input 2 fract
1/3
1/2
Нормальное состояние техники - нерабочее, все остальное частный случай.

Последний раз редактировалось alex_fcsm; 02.05.2009 в 02:03.
alex_fcsm вне форума Ответить с цитированием
Старый 02.05.2009, 11:45   #13
Gongled
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 78
По умолчанию

Цитата:
Сообщение от alex_fcsm Посмотреть сообщение
1. Тема - сложение простых дробей (1 1/15) - смешаное число, а не простая дробь. Учи матчасть
При прочтении не уловил, что задача требует сложения простых дробей. Отличие смешанных от простых я прекрасно знаю. Спасибо за комментарий.

P.S. Если вдруг пригодится моё решение, то вместо целой части достаточно писать 0.
Пишу глупости.
Gongled вне форума Ответить с цитированием
Старый 02.05.2009, 17:59   #14
Frenki
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию

прога.rar
Вот я кинул скрины,получается прога работает для дробей сумма которых больше 1,а для тех которые меньше,выдавет в начале лишнюю 2,3 или 4. Незнаю,мот глюки с Паскалем,ешё вопрос,хотелось бы сделать если числитель равен 0,то пусть выдает только целую часть...Признателен за все,что ты сделал...И вот ещё вопросик:ты на каком паскале эту прогу писал,мот нестыковочки в версиях,ато у меня бывает пишу на турбо паскале,а на фри не работает...

Последний раз редактировалось Frenki; 02.05.2009 в 18:11.
Frenki вне форума Ответить с цитированием
Старый 04.05.2009, 08:45   #15
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Frenki Посмотреть сообщение
Вложение 11194
Вот я кинул скрины,получается прога работает для дробей сумма которых больше 1,а для тех которые меньше,выдавет в начале лишнюю 2,3 или 4. Незнаю,мот глюки с Паскалем,ешё вопрос,хотелось бы сделать если числитель равен 0,то пусть выдает только целую часть...Признателен за все,что ты сделал...И вот ещё вопросик:ты на каком паскале эту прогу писал,мот нестыковочки в версиях,ато у меня бывает пишу на турбо паскале,а на фри не работает...
Поправил.
Я пишу в PascalABC и там все работает. Значит именно дело во FreePascal.
Код:
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,mn:integer;
    f:boolean;
begin
f:=true;
mn:=1;
if a<0 then mn:=-1;
a:=abs(a);
 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;
a:=a*mn;
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:='';
   if ch<>0 then begin
str(ch,temp);
mn:=mn+temp+'/';
str(z,temp);
mn:=mn+temp;
end;
Summa:=mn;
if ch=z then Summa:='1';
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.
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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