Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 03.04.2011, 13:47   #1 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
Arrow Уравнения

Нашла код программки, хочу её изменить.
Подскажите пожалуйста как это сделать.
Заранее спасибо =)

1. В подобных программах всегда берут процедуру F и конкретное уравнение. Как изменить код так, чтобы я могла с клавиатуры вводить Любое уравнение?
Если я меняю строку -

Код:
function f(x:real):real;
begin { Нужная функция }
f:=sin(x/20)*20;
end;
на -

Код:
function f(x:real):real;
begin 
writeln('f=');
read(F);
end;
Паскаль ругается. Почему? =)

2. Именно в этой программе много строк

Код:
line(maxx2,0,maxx2,maxy);
line((maxx2)-4,10,maxx2,0);
line((maxx2)+4,10,maxx2,0);
Они будут изменятся при изменении уравнения или они нарисованы конкретно для этого уравнения?


Код программы:

Код:
uses crt, graph;

const
d1=-100; { Отрезок проверки }
d2=100;

var
x:real;
a:array [1..2, 1..255] of real;
b:boolean;
i,n:byte;
y1,y2,dr,md,maxx,maxy,maxx2,maxy2:integer;

function f(x:real):real;
begin { Нужная функция }
f:=sin(x/20)*20;
end;

procedure search(a,b:real; var x:real);
const e=0.0001; { e - Точность }
begin
repeat
x:=(a+b)/2;
if f(a)*f(x)>0 then a:=x else b:=x;
until abs(f(x))<e;
end;

begin
clrscr;
{
Определение отрезков в которых функция меняет знак
на противоположный, то есть отрезки где лежит корень
}
x:=d1;
if f(d1)>0 then b:=true;

repeat
if b=true then begin
if f(x)<0 then begin
n:=n+1;
a[2,n]:=x;

repeat
x:=x-0.1;
until f(x)>0;

a[1,n]:=x;
x:=a[2,n];
b:=false;
end;
end;

if b=false then begin
if f(x)>0 then begin
n:=n+1;
a[2,n]:=x;

repeat
x:=x-0.1;
until f(x)<0;
a[1,n]:=x;
x:=a[2,n];
b:=true;
end;
end;
x:=x+0.1;
until x>d2;

if n=0 then writeln('Корней нет !!!')
else begin
writeln('В уравнении F(x) на отрезке [',d1,',',d2,'] найдено ',
n,' корн(-ей/-я/-ь)');
for i:=1 to n do begin
search(a[1,i],a[2,i],x);
writeln('X',i,' = ',x:5:3);
end;
end;

writeln('Нажмите клавишу "Enter" для построения');
readln;
dr:=9;
md:=2;
initgraph(dr,md,'c:\bp\bgi');{c:\bp - папка куда установлен TP7.0}
setcolor(12);

maxx:=getmaxx;
maxy:=getmaxy;
maxx2:=maxx div 2;
maxy2:=maxy div 2;

{ось OY}
line(maxx2,0,maxx2,maxy);
line((maxx2)-4,10,maxx2,0);
line((maxx2)+4,10,maxx2,0);
line((maxx2)+10,5,maxx2+14,9);
line((maxx2)+14,9,maxx2+18,5);
line((maxx2)+14,9,maxx2+14,14);
{ось OX}
line(0,maxy2,maxx,maxy2);
line(maxx-10,maxy2-4,maxx,maxy2);
line(maxx-10,maxy2+4,maxx,maxy2);
line(maxx-15,maxy2-12,maxx-7,maxy2-20);
line(maxx-15,maxy2-20,maxx-7,maxy2-12);

{График уравнения}
x:=d1;
setcolor(15);
repeat
y1:=maxy2-round(f(x-1));
y2:=maxy2-round(f(x));
if (y1>0) and (y1<maxy) and (y2>0) and (y2<maxy) then
line((round(x-1)+maxx2),y1,round(x)+maxx2,y2);
x:=x+1;
until x>d2;
readln;
closegraph;
end.
Хелен вне форума   Ответить с цитированием

Старый 03.04.2011, 13:47
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Советую вам прочитать обсуждаемые темы, которые схожи с вашей

Отделение корней уравнения VBA или Pascal
Помогите решить линейные дифференциальные уравнения
Дифференциальные уравнения
Приближенное решение дифференциального уравнения методом Эйлера с уточнением.

Старый 03.04.2011, 13:49   #2 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Ой. я кажется поняла про Line. Это просто Оси координат рисуются?))
Хелен вне форума   Ответить с цитированием
Старый 03.04.2011, 15:41   #3 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

1) у вас в функцию f после считывания запихивается строка когда f объявлена real... при считывании функция не вычисляется!!!
kreol вне форума   Ответить с цитированием
Старый 03.04.2011, 15:47   #4 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

тут надо будет делать некий парсер...
kreol вне форума   Ответить с цитированием
Старый 03.04.2011, 19:24   #5 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

про real, я уже подумала... вот как бы так это всё красиво сделать?)
Хелен вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 03.04.2011, 20:29   #6 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

нужно делать разбор строк! например разбить всю введеную строку на подстроки разделенные пробелы. дальше вычленить арифметические знаки и скобки(относящиеся к арифметике) и построить дерево. дальше вычленить функции и подсчитать их значение.... например для функции
( x * x + sin(x + 1) - 1 ) / 4 дерево после разбоки будет таким

ну это приблизительно там нужно еще учитывать расположение чисел относительно операций(чтоб не получилось что вместо x - 1 получилось 1 - x)
ну и т.д.
а дальше сворачивать это дерево в обратном порядке(подсчитывать значение). но это даже если не очень сложно то муторно...
Миниатюры
aeadhaai.png  
kreol вне форума   Ответить с цитированием
Старый 03.04.2011, 21:06   #7 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

и всё-таки, я выбрала сложный путь. Может, если объяснить суть задания, будет проще помочь.
Нужна программа умеющая посчитать корни Любого уравнения. Будь то ax^2+bx+c или cos(x)-2x.
вот как-то так...
Хелен вне форума   Ответить с цитированием
Старый 03.04.2011, 21:24   #8 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

ну я уже написал что надо делать. а дальше есть метод половинного деления, метод Ньютона и еще какой-то....
kreol вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 04:05.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.