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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2007, 15:27   #1
ИгорьОК
Новичок
Джуниор
 
Регистрация: 03.04.2007
Сообщений: 2
По умолчанию преобразование десятичной дроби в обыкновенную и обратно, Delphi

Доброго вам времени суток. Пришла к студенту беда страшная - курсовая. Вроде все ее написал, а вот с вот этим действием не могу справиться, нужен калькулятор, который переводил десятичную дробь в обычную и обратно, подскажите пожалуйста как это зделать и если возможно на примерах, ибо в програмировании я пока почти 0.
ИгорьОК вне форума Ответить с цитированием
Старый 04.04.2007, 04:34   #2
RSLoader
_________
Пользователь
 
Аватар для RSLoader
 
Регистрация: 27.03.2007
Сообщений: 69
По умолчанию

Попробуй этот вариант - вроде, работает:
Код:
// Преобразование из десятичной дроби в обычную
// fl - десятичная дробь. Результат - строка
// вида 'm/n', где m - числитель, а n - знаменатель.
function FloatToFrac(fl:Extended):string;
var
  i,f:Extended;
  k,m,n,l,nod:Integer;
  s:string;
begin
  i:=Int(fl); // целая часть
  f:=Frac(fl);// дробная часть
  s:=FloatToStr(f); // отсекаем '0,'
  Delete(s,1,2);
  f:=StrToFloat(s);
  m:=StrToInt(FloatToStr(i*length(FloatToStr(f))*10+f)); // числитель
  n:=Length(FloatToStr(f))*10;                           // знаменатель
  if n>m then k:=m else k:=n;                            // находим НОД и упрощаем дробь
  for l:=1 to k do
  if (n mod l = 0) and (m mod l = 0) then nod:=l;
  m:=m div nod;
  n:=n div nod;
  Result:=IntToStr(m)+'/'+IntToStr(n);
end;
// Преобразование из обычной дроби в десятичную
function FracToFloat(fr:string):Extended;
begin
  // Числитель - это часть строки до / а знаменатель - после.
  // Просто делим числитель на знаменатель
  Result:=StrToFloat(Copy(fr,1,Pos('/',fr)-1)) / StrToFloat(Copy(fr,Pos('/',fr)+1,Length(fr)-Pos('/',fr)));
end;
RSLoader вне форума Ответить с цитированием
Старый 04.04.2007, 16:30   #3
ИгорьОК
Новичок
Джуниор
 
Регистрация: 03.04.2007
Сообщений: 2
По умолчанию

а для нахождения НОД, ты использовал алгоритм Эвклида
ИгорьОК вне форума Ответить с цитированием
Старый 04.04.2007, 20:15   #4
RSLoader
_________
Пользователь
 
Аватар для RSLoader
 
Регистрация: 27.03.2007
Сообщений: 69
По умолчанию

А по-моему нет. Здесь принцип в том, чтобы в цикле l от 1 до k=min(m,n) проверять, является ли l одновременно делителем m и n
RSLoader вне форума Ответить с цитированием
Старый 04.04.2007, 21:12   #5
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

у меня есть алгоритм последовательного уточнения.

случаи
0<|a/b|<=1 и
|a/b|>1 нужно рассматривать отдельно ..

может найду свою реализацию, как повезет %)
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. перевод из десятичной системы счисления в двоичную Xeon332 Помощь студентам 3 24.01.2011 13:54
Помогите перевести число из десятичной в шестнадцатиричную систему TAUREN Помощь студентам 5 06.10.2007 14:06
как перевести из integer в real(и обратно), и из real в string(и обратно) Ga-sergey Общие вопросы Delphi 2 08.06.2007 21:13
Простые дроби 4aineg Паскаль, Turbo Pascal, PascalABC.NET 5 09.12.2006 15:01