Помощь - Поиск - Пользователи - Календарь
Полная версия: Решалка кубических уравнений
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
lizhen
Программа для вычисления корней кубического уравнения:
reshalka kubicheskyh uravneniy;
var n,y,z,f:integer;
x,k:longint;
begin
clrscr;
writeln('Vvedite koeffichyenty uravneniya chiala:n,y,z,f');
readln(n,y,z,f);
k:=0;
for x:=-1000000 to 1000000 do
if n*x*x*x+y*x*x+z*x+f=0 then
begin
k:=k+1;
writeln('x',k,'=',x);
end;
if k=0 then write('Chelyh korney net');
readln;
end.

Заранее спасибо, за потраченное на мой вопрос время.
Krjuger
Ну полный перебор это конешно мощно.А теперь подумаем, что же делает ваша программа....Во первых,если она и найдет ,то она найдет только целые корни,это связано с тем что у вас цикл по х,и х принимает только целочисленные значения, даже для квадратного уравнения это ооочень малый процент от всех возможных решений,но дело ваше.
Теперь почему ваша программа не работает.
reshalka kubicheskyh uravneniy;

писать нельзя, кампилятор не поймет,но можно
program reshalka_kubicheskyh_uravneniy;
Пробелы тут тоже оставлять нельзя,а вот подчеркивания нормально.
Затем,вы делаете clrscr;, но ведь надо подключить библиотеку crt где собственно реализована эта функция. затем, у вас цикл 1000000,но простите,а вы подумали что вам в условии придется миллион умножить на миллион и еще раз на миллион, да еще и на коэффициент, это число ни в какой тип данных не влезет.... вот и получаеться,что ваше условие срабатывает всегда.
В итоге что мы имеем.

program reshalka_kubicheskyh_uravneniy;
uses crt;
var n,y,z,f:integer;
x,k:longint;
begin
clrscr;
writeln('Vvedite koeffichyenty uravneniya chiala:n,y,z,f');
readln(n,y,z,f);
k:=0;
for x:=-100 to 100 do
begin
if n*x*x*x+y*x*x+z*x+f=0 then
begin
k:=k+1;
writeln('x',k,'=',x);
end;
end;
if k=0 then write('Chelyh korney net');
readln;
end.


Что же способна сделать эта программа, из всех корней она выведет нам только целые,причем если корни одинаковые ,например уравнения вида (x-a)^3,где х=а будут все три корня, то она вывелет лишь 1 корень.Подобрать числа когда будут все 3 целых корня я не смог.
Мой вам совет,хотите сделать нормальную программу,возьмите один из методов и тут вам помогут его реализовать,если вы действительно хотите решить эту задачу.
Lapp
Крюгер, судя по строке
if k=0 then write('Chelyh korney net');
- Лизхен интерсесуют ТОЛЬКО целые решения (что, вообще-то, желательно было бы пояснить в условии, а не паззлить всех и не заставлять высмативать намеки в коде), так что метод вполне себе ничего.. ))
Далее, тип LongInt действительно переполнится (я только не понял, почему условие якобы выполнится всегда), но тип comp может стправиться с задачей (при не очень больших коэффициентах), так что я советую применять его..
TarasBer
> Затем,вы делаете clrscr;, но ведь надо подключить библиотеку crt

Лучше убрать вообще нафиг
Krjuger
Lapp,Чесно....Я не знаю почему условия срабатывает,но когда я запустил ее исходную программу,убрав все некомпилирующиеся моменты,я увидел следующее.введя обычное уравнение (х-1)^3 я увидел в интервале от -1000000 до 1000000 порядка 977 решений.....
Про тип comp я пока что ничего не знал.
Насчет очистки экрана,я лишь сделал так,чтобы оно работало, а уж использовать ли ее или нет,это не мое решение.
IUnknown
Цитата
(я только не понял, почему условие якобы выполнится всегда)
Не всегда, но гораздо чаще, чем оно должно выполняться в действительности. Уже при -999423 оно выполняется в первый раз (усечение результата при переполнении творит чудеса. Опять же, почему топикстартер не включает хотя бы контроль целочисленного переполнения в настройках - непонятно, получить аварийный вылет в данном случае намного лучше, чем результат, который заведомо не может быть верным)
lizhen
Большое спасибо. Да программа ищет только целые корни, но лишь потому что я действительно не знаю, как бытьь и писать иначе. В Паскале я ноль, но пытаюсь понять и разобраться.
Krjuger
Дело не в паскале,для начала нужно найти методы для полноценного решения кубического уравнения,а потом попытаться их реализовать.Например
Формула Кардано
Согласисть, ничего сложного нет, сначала вычисляешь 2 величины,через них находишь третью,дальше смотри условие, больше нюля,меньше или равно,ну или конкретно одно условие, например, тебе нужны только вещественные корни тогда Q=0, а остальные вообще не рассматриваешь.
lizhen
Большое спасибо, пошла реализовывать.
Если что то не пойму или на чем то застряну обращусь.
Спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.