03.04.2011, 13:47 | #1 (permalink) |
Sparkling
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
|
Уравнения
Подскажите пожалуйста как это сделать. Заранее спасибо =) 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
Регистрация: 08.03.2016
Сообщений: 0
|
Советую вам прочитать обсуждаемые темы, которые схожи с вашей Отделение корней уравнения VBA или Pascal Помогите решить линейные дифференциальные уравнения Дифференциальные уравнения Приближенное решение дифференциального уравнения методом Эйлера с уточнением. |
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) |
Member
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
|
нужно делать разбор строк! например разбить всю введеную строку на подстроки разделенные пробелы. дальше вычленить арифметические знаки и скобки(относящиеся к арифметике) и построить дерево. дальше вычленить функции и подсчитать их значение.... например для функции
( x * x + sin(x + 1) - 1 ) / 4 дерево после разбоки будет таким ну это приблизительно там нужно еще учитывать расположение чисел относительно операций(чтоб не получилось что вместо x - 1 получилось 1 - x) ну и т.д. а дальше сворачивать это дерево в обратном порядке(подсчитывать значение). но это даже если не очень сложно то муторно... |
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) |
Member
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
|
ну я уже написал что надо делать. а дальше есть метод половинного деления, метод Ньютона и еще какой-то....
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|