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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2010, 11:15   #1
Nastyity
Пользователь
 
Аватар для Nastyity
 
Регистрация: 28.03.2010
Сообщений: 18
Злость Рациональные числа

Умножение рациональных чисел.
Ответ должен быть несократимой дробью. В Edit1 вводим 5/6 (пять шестых), в Edit2 3/2 (три вторых), в Memo1 получаем результат - 5/6 умноженное на 3/2. Получаем результат 5/4 который и выводим в Memo1.
Nastyity вне форума Ответить с цитированием
Старый 28.03.2010, 11:54   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Приводил подобный пример.
Код:
type
  drob = record//создадим дробный тип
    chisl: integer;
    znam: integer
  end;

function NOD(a, b: integer): integer;//наибольший общий делитель
begin
  if a = 0 then NOD := b
  else NOD := NOD(b mod a, a)
end;

function sekir(x: drob): drob;//сокращение дроби
var
  y: integer;
begin
  y := NOD(x.chisl, x.znam);//ищем НОД
  while y <> 1 do begin//если можно сокращать
    x.chisl := x.chisl div y;//то сокращаем числитель
    x.znam := x.znam div y;// и знаменатель на их НОД
    y := NOD(x.chisl, x.znam)
  end;
  sekir := x
end;

function PrDrob(a, b: drob): drob;//произведение дробей (школьная формула)
var
  y: drob;
begin
  y.znam := a.znam * b.znam;
  y.chisl := a.chisl * b.chisl;
  PrDrob := sekir(y);
end;

var
  a, b, c: drob;
begin
  a.chisl := 5; a.znam := 6; //первая дробь = 5/6
  b.chisl := 3; b.znam := 2; //вторая дробь = 3/2
  c := PrDrob(a, b); //произведение дробей
  write(c.chisl, '/', c.znam);
  readln
end.
Осталось чуть изменить под свои нужды.
eoln вне форума Ответить с цитированием
Старый 28.03.2010, 12:15   #3
Nastyity
Пользователь
 
Аватар для Nastyity
 
Регистрация: 28.03.2010
Сообщений: 18
По умолчанию

Что такое NOD, зачем while?
Не знаю что именно менять( Хотелось бы как можно проще всё это. Учусь на документоведа, зачем нам это программирование не понимаю
Nastyity вне форума Ответить с цитированием
Старый 28.03.2010, 14:14   #4
Nastyity
Пользователь
 
Аватар для Nastyity
 
Регистрация: 28.03.2010
Сообщений: 18
По умолчанию

Набрала задачу в программу , а она сплошные ошибки выводит(
что делать?
Nastyity вне форума Ответить с цитированием
Старый 28.03.2010, 15:01   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Что такое NOD, зачем while?
Цитата:
Набрала задачу в программу , а она сплошные ошибки выводит(
что делать?
NOD - наибольший общий делитель. В школе математику учили? Как дробь сократить?

1) Сокращаем на наибольший общий делитель , получаем новую дробь
2) Сокращаем на наибольший общий делитель , получаем новую дробь
3) Сокращаем на наибольший общий делитель 1, но так как это бессмыслено, то больше не будем сокращать.

Так вот, while это цикл, который сокращает дробь (числитель и знаменатель) на наибольший общий делитель пока это возможно.

Программа для консоли или для Паскаля. Но функции и тип подходят и для "форменного" приложения.

Код:
procedure TForm1.Button1Click(Sender: TObject);
type
  drob = record//создадим дробный тип
    chisl: integer;
    znam: integer
  end;

function NOD(a, b: integer): integer;//наибольший общий делитель
begin
  if a = 0 then NOD := b
  else NOD := NOD(b mod a, a)
end;

function sekir(x: drob): drob;//сокращение дроби
var
  y: integer;
begin
  y := NOD(x.chisl, x.znam);//ищем НОД
  while y <> 1 do begin//если можно сокращать
    x.chisl := x.chisl div y;//то сокращаем числитель
    x.znam := x.znam div y;// и знаменатель на их НОД
    y := NOD(x.chisl, x.znam)
  end;
  sekir := x
end;

function PrDrob(a, b: drob): drob;//произведение дробей (школьная формула)
var
  y: drob;
begin
  y.znam := a.znam * b.znam;
  y.chisl := a.chisl * b.chisl;
  PrDrob := sekir(y);
end;

var
  a, b, c: drob;
  s: string;
begin
  s := edit1.Text;
  a.chisl := strtoint(copy(s, 1, pos('/', s) - 1));
  delete(s, 1, pos('/', s));
  a.znam := strtoint(s);

  s := edit2.Text;
  b.chisl := strtoint(copy(s, 1, pos('/', s) - 1));
  delete(s, 1, pos('/', s));
  b.znam := strtoint(s);

  c := PrDrob(a, b); //произведение дробей
  memo1.Lines.Add(inttostr(c.chisl) + '/' + inttostr(c.znam));
end;

Последний раз редактировалось eoln; 28.03.2010 в 15:05.
eoln вне форума Ответить с цитированием
Старый 28.03.2010, 17:22   #6
Nastyity
Пользователь
 
Аватар для Nastyity
 
Регистрация: 28.03.2010
Сообщений: 18
По умолчанию

в каком компоненте нужно это все писать?
Nastyity вне форума Ответить с цитированием
Старый 28.03.2010, 23:53   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

В обработчике Button1Click
Инструкция с картинками
Вложения
Тип файла: rar 0.rar (546.6 Кб, 23 просмотров)
eoln вне форума Ответить с цитированием
Старый 29.03.2010, 08:12   #8
Nastyity
Пользователь
 
Аватар для Nastyity
 
Регистрация: 28.03.2010
Сообщений: 18
По умолчанию

Спасибо большое
Nastyity вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вводим два числа, получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m Sparky Помощь студентам 2 22.11.2009 21:59
Как числа в двоичном виде вывести в столбик по 4 числа? Equalizer Общие вопросы C/C++ 11 27.09.2009 14:15
2 столбец для того, чтобы автоматически создавались числа, которые позволяли уравнивать числа в 3 столбце ppv Microsoft Office Excel 37 05.08.2009 21:19
Даны натуральные числа m,n. Посчитать сумму m последнего числа n. лялька Паскаль, Turbo Pascal, PascalABC.NET 6 25.12.2008 15:22
ДАНЫ 4 ЧИСЛА X Y Z W составит программу найти произведение все положительные нечетные числа Woland-itn Паскаль, Turbo Pascal, PascalABC.NET 3 23.03.2008 21:49