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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2009, 20:14   #1
Dinamovec
 
Регистрация: 15.03.2009
Сообщений: 5
По умолчанию Как написать код для укорачивание дробей?

Мне задали задачку. Есть кнопка Button1 и две строки Edit1 и Edit2. Edit1 и Edit2 ето числитель и знаменатель. Нужно зделать так, что б при нажатии на кнопку Button1 дробь скорачивался. На пример есть 6/8, после нажатия на Button1 должно выйти 3/4. Моя проблема в том, что я не могу догнать что писать в коде!
Dinamovec вне форума Ответить с цитированием
Старый 15.03.2009, 20:30   #2
eskander
Пользователь
 
Аватар для eskander
 
Регистрация: 01.03.2009
Сообщений: 29
По умолчанию

к сожалению нет под рукой дельфи, опишу алгоритм на словах:
берете наименьшее из чисел (в вашем примере это 6)
в цикле downto от 6 до 1 делим первое число (6) и второе (8) на 6,5,4,3,2,... соответственно
когда mod первого и mod второго будут равноы нулю - мы нашли наибольший общий делитель, на него и надо разделить первое и второе числа.
eskander вне форума Ответить с цитированием
Старый 15.03.2009, 20:43   #3
Dinamovec
 
Регистрация: 15.03.2009
Сообщений: 5
По умолчанию

Так как я совсем не силен в етом, то мне бы сам код не помешал.
Все что мне нужно зделать, ето прописать ето вот здесь:
http://www.bikeways.com.ua/assets/00...__________.bmp
Dinamovec вне форума Ответить с цитированием
Старый 15.03.2009, 20:44   #4
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
По умолчанию

Ой, ой, зачем, eskander? Поиск наибольшего общего делителя легко и изящно ведется через алгоритм Эвклида.
Silence is of great value...
Jean-Esther вне форума Ответить с цитированием
Старый 15.03.2009, 20:48   #5
Dinamovec
 
Регистрация: 15.03.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Jean-Esther Посмотреть сообщение
Ой, ой, зачем, eskander? Поиск наибольшего общего делителя легко и изящно ведется через алгоритм Эвклида.
Да... лазивши в гугле я видел что-то подобное!
http://ru.wikipedia.org/wiki/Алгорит...BA.D0.B6.D0.B5

Но я не знаю что с ним делать!
Dinamovec вне форума Ответить с цитированием
Старый 15.03.2009, 20:51   #6
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
Счастье

Код:
 function nod(a, b:longint):longint; 
 begin
  while (a<>0) and (b<>0) do 
  if a >= b then a := a mod b 
            else b := b mod a;  
  nod:=a+b; 
 end;

procedure TForm1.Button6Click(Sender:Tobject);
var a,b,n:integer;
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
n:=nod(a,b);
Edit1.Text:=IntToStr(a div n);
Edit2.Text:=IntToStr(b div n);
end;
Silence is of great value...
Jean-Esther вне форума Ответить с цитированием
Старый 15.03.2009, 22:30   #7
Dinamovec
 
Регистрация: 15.03.2009
Сообщений: 5
По умолчанию

О! Спасиб, работает! Вот только еще один вопросик: при укорачивении числителя со знаком "+" , а знаменателя со знаком "-" - прога перестает пахать. Что ето?
Dinamovec вне форума Ответить с цитированием
Старый 15.03.2009, 23:38   #8
eskander
Пользователь
 
Аватар для eskander
 
Регистрация: 01.03.2009
Сообщений: 29
По умолчанию

надо брать значения по модулю ( abs() )
eskander вне форума Ответить с цитированием
Старый 16.03.2009, 00:22   #9
Dinamovec
 
Регистрация: 15.03.2009
Сообщений: 5
По умолчанию

если можешь, то отредактируй пожалуйста код написаный выше!
Dinamovec вне форума Ответить с цитированием
Старый 16.03.2009, 15:34   #10
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
Счастье Solve

Код:
 function nod(a, b:longint):longint; 
 begin
  while (a<>0) and (b<>0) do 
  if a >= b then a := a mod b 
            else b := b mod a;  
  nod:=a+b; 
 end;

procedure TForm1.Button6Click(Sender:Tobject);
var a,b,n:integer;
var sign:boolean;
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
sign:=true;
if a<0 then sign:=not sign;
if b<0 then sign:=not sign;
a:=abs(a); b:=abs(b);
n:=nod(a,b);
if not sign then Edit1.Text:='-'+IntToStr(a div n);
Edit2.Text:=IntToStr(b div n);
end;
Silence is of great value...
Jean-Esther вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Никак не могу написать код для..... PayBack Общие вопросы C/C++ 2 07.07.2008 13:55
как написать код на вывод оценки в тестирующей проге Флеонова KaufMaNN Помощь студентам 0 31.05.2008 07:39
Как написать код для блокировки Михаил Юрьевич Общие вопросы Delphi 6 19.01.2008 09:50
Help! Немогу написать код для посчета и вывода результатов. Руслан БД в Delphi 2 22.12.2006 13:29