Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 467

/ вопрос решён /

Приветствую, уважаемые эксперты!
Очень нужен Ваш совет!
Мне необходимо составить программу, которая будет делить два многочлена и выводить ответ с остатком от деления. (К примеру: 3х^3+2x^2+4x-5 / 5x^2+6x+7)
При помощи каких операторов я смогла бы её составить?

Crystal_Maiden Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Crystal_Maiden (статус: Посетитель)
Вопрос отправлен: 27 февраля 2009, 20:49
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: Ученый

Здравствуйте, Crystal_Maiden! Предложу такое решение:
Кидаем на форму Edit, label и button и пишем:

procedure TForm1.Button1Click(Sender: TObject);
var
X,Y,b:real;
begin
x:=strtofloat(edit1.text);
Y:= (3*exp(ln(X) * x)+ 2*Sqr(X)+4*X-5)/(5*Sqr(X)+6*X+7);
Label1.Caption:=floattostr(y);
end;

в едит вводим значение X и нажимаем на кнопку...

Ответ отправил: Ученый (статус: 8-ой класс)
Время отправки: 27 февраля 2009, 21:40
Оценка за ответ: 4

Комментарий к оценке: Спасибо большое, но мне кажется, это немного не то...
Тут же для Y уже прописывается значение, а мне нужно, что бы каждый раз вводилось новое выражение и программа выщитывала деление , ну тоесть - сам многочлен-результат и многочлен-остаток.

Ответ #2. Отвечает эксперт: Паровоз

Здравствуйте, Crystal_Maiden!
Нужно построить последовательность многочленов P[k], S[k] следующим образом. На первом шаге полагаем P[1] равным делимому, а S[1]=0. Очередной шаг делается следующим образом. Пусть построены многочлены P[k-1] и S[k-1], причем P[k-1]=a[n]x^n+... , а делитель Q=b[m]x^m+... . Вычисляем R[k]=a[n]x^(n-m)/b[m] и полагаем P[k]=P[k-1]-Q*R[k], S[k]=S[k-1]+R[k]. Процесс заканчивается когда степень P[k] стала меньше m. Последний многочлен P[k] есть остаток, а последний многочлен S[k] есть частное.

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 28 февраля 2009, 10:51
Оценка за ответ: 5

Комментарий к оценке: о, спс за мысль ;)
Только я немного не поняла, почему мы S[1] приравниваем к нулю? Там же нужно тоде вводить определённый многочлен...

Ответ #3. Отвечает эксперт: min@y™

В пакете RxLib есть такой класс - TRxMathParser. Он вычисляет результаты формул, которые ему задаются в виде строки.
На основе этого класса я написал тебе демо-программу. Прицепляю её к ответу.
У этого класса есть недостаток: в подставляемых формулах конструкции с возведением в степень, такие как "x^2", "x^3" и т.п. надо ставить в скобки, например, 3*(x^3)+2*(x^2)+4*x-5, иначе он неправильно расставляет приоритеты действий. А в остальном, нормально.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 28 февраля 2009, 11:14
Оценка за ответ: 5

Комментарий к оценке: Спасибо за программу =)
А как сделать так, чтобы не нужно было вводить значения "х"? Чтобы прога выдавала ответы с "х". Ну...там ,к примеру: Многочлен-результат = 3х+7, а многочлен-остаток = 2х-5

Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 2 марта 2009, 12:38; участников в обсуждении: 6.
Вадим К

Вадим К (статус: Академик), 27 февраля 2009, 21:23 [#1]:

М... операторов? Крайне неверный вопрос. Надо спрашивать, какие алгоритмы надо.
А надо будет как минимум парсер, который сможет вычитывать выражения и превращать в более удобную для обработки форму.
А потом надо вспоминать математику и понять как сам алгоритм деления.
Галочка "подтверждения прочтения" - вселенское зло.
Ученый

Ученый (статус: 8-ой класс), 27 февраля 2009, 21:44 [#2]:

опс, опечаточка....
надо Y:= (3*exp(ln(X) * 3)+ 2*Sqr(X)+4*X-5)/(5*Sqr(X)+6*X+7);
Паровоз

Паровоз (статус: 10-ый класс), 27 февраля 2009, 22:51 [#3]:

"Y:= (3*exp(ln(X) * x)+ 2*Sqr(X)+4*X-5)/(5*Sqr(X)+6*X+7);"
"опс, опечаточка...."

Никакого отношения это к делению с остатком не имеет.
Crystal_Maiden

Crystal_Maiden (статус: Посетитель), 27 февраля 2009, 23:13 [#4]:

Вадим, а вы бы не могли по подробнее мне объяснить, что такое парсер, а то я новичок в Delphi, да и вообще в программировании...
Ну с математикой вроде проблем нет, это нужно делить уголком, а вот как это прописать, я в затруднении...
Вадим К

Вадим К (статус: Академик), 27 февраля 2009, 23:29 [#5]:

парсер - это кусок кода, который преобразует строку в виде 3х^3+2x^2+4x-5 и преобразовывала в какое то внутренее, более удобное для работы. Но если вы новичек, то слишком уж резко взялись. Думаю, что даже если я это напишу - не поможет. И мне прийдётся писать и деление. а мне честно, не хочеться связиваться с этим.
Галочка "подтверждения прочтения" - вселенское зло.
Crystal_Maiden

Crystal_Maiden (статус: Посетитель), 27 февраля 2009, 23:52 [#6]:

Эх...ну мне нужно вот именно это сделать, если бы был выбор, то конечно бы с такого не стала начинать.
А не могли бы вы как то подтолкнуть, навести на правильную мысль с этим парсером, ну или посоветовать литературу, где про это будет хоть что то написано... Я очень хочу научиться работать в Делфи, но конечно опыта пока - полный ноль... =(
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 28 февраля 2009, 05:33 [#7]:

to Crystal_Maiden
Вы уверены, что правильно поняли условие задачи? Или это задача с какой-то олимпиады по программированию? Если не сложно - приведите текст задачи дословно
Crystal_Maiden

Crystal_Maiden (статус: Посетитель), 28 февраля 2009, 10:40 [#8]:

Та вроде да...
Вот условие:
Вид данных - Выражения для двух многочленов; Опперации - Деление двух многочленов.

С интерфейсом проблем нет, а вот с самим кодом...
на первой строке ввод - многочлен делимое, на второй - многочлен-делитель, справа от ник кнопки "Ввести". после этого снизу кнопка "Разделить" и 2 строки: "Многочлен-результат" и "многочлен-остаток"
Паровоз

Паровоз (статус: 10-ый класс), 28 февраля 2009, 16:18 [#9]:

"Только я немного не поняла, почему мы S[1] приравниваем к нулю?"
S[k] это текущее частное на k шаге, которое получается суммированием и для того. чтобы считать его по формуле S[k]=S[k-1]+R[k] нужно считать, что S[1]=0.
min@y™

min@y™ (статус: Доктор наук), 1 марта 2009, 10:47 [#10]:

Цитата:


А как сделать так, чтобы не нужно было вводить значения "х"? Чтобы прога выдавала ответы с "х". Ну...там ,к примеру: Многочлен-результат = 3х+7, а многочлен-остаток = 2х-5


Это кто ж придумал такое задание, интересно? Этот человек фантастику не пишет, случайно?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 1 марта 2009, 11:53 [#11]:

to min@y™
Вполне нормальное задание для человека, который знает математику и начала теории парсеров. Я более чем уверен, что я её могу решить.
Конечно, если выражения будут задаваться в хитром виде, а не нормализированом, то тогда сильно усложняется.
Галочка "подтверждения прочтения" - вселенское зло.
Crystal_Maiden

Crystal_Maiden (статус: Посетитель), 1 марта 2009, 12:32 [#12]:

to min@y™
Та вот...добрый дядя постарался ^^...
min@y™

min@y™ (статус: Доктор наук), 2 марта 2009, 12:35 [#13]:

Цитата:

Я более чем уверен, что я её могу решить.

Теоретически, конечно, это возможно. Но это отнюдь не учебная задача. Желаю удачи.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 2 марта 2009, 12:38 [#14]:

если установить ограничения на формат входных данных (ну тоесть что многочлены вводяться ручками покоэффициентно в табличку либо записаны в строгом формате, который парсить просто), то задача - учебная!
другое дело, если входной многочлен задан достаточно в произвольном формате.
Галочка "подтверждения прочтения" - вселенское зло.

31 января 2011, 20:03: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.03 сек.