
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.128] |
![]() |
|
Сообщ.
#1
,
|
|
|
помогите построить график на любом языке программирования для функции (см. прикрепленный файл - там уже график есть - в маткаде получила, надо такой же на паскале или в др. среде получить):
то есть даны промежутки и два значения Im=5.3 и Im=-5.37. Я пыталась построить - нашла пример для лазуруса и набрала, но он чего-то не хочет работать. Ну хоть схемку накидайте или саму программку, плиззз. Прикреплённый файл ![]() |
![]() |
Сообщ.
#2
,
|
|
Цитата Prutvel @ То есть, присоединить сюда проект для Лазаруса, который ты уже набрала - нельзя было, мы должны сделать ту же работу, с нуля набирать, тестировать, вместо того, чтобы (возможно) исправить один символ... Ну-ну... Подождем, может и найдется тот, у кого лишнего времени навалом... Я пыталась построить - нашла пример для лазуруса и набрала, но он чего-то не хочет работать. |
Сообщ.
#3
,
|
|
|
посмотрите, пожалуйста:
![]() ![]() unit Unit1; interfaceace uses Classes,SysUtils,LResources,Forms,Graphics,Dialogs,Extctrls,Stdctrls; function I(t:real):real; procedure Graphica (a,b:real); type TForm1=class(TForm); Button1: TButton; Image1: TImage; procedure ButtonClick(Sender:TObject); procedure FormCreate(Sender:TObject); private public end; const Im=0.57,tau=0.062; L=0.1; f1=5.37; f2=8.06; var Form1: TForm1; t0,y0,tk,yk,a,b:real; t,y:array[0..1000] of real; u,v:array [0..1000] of integer; N:integer; implementation functiion I(t:real):real; begin T1:=1/f1; T2:=1/f2; T:=T1+T2; if mod(t,T)<tau then Result:=Im; if (mod(t,T)>=tau) and (mod(t,T)<T1) then Result:=-Im; if (mod(t,T)>=T1) and (mod(t,T)<(T1+tau)) then Result:=Im; if (mod(t,T)>=(T1+tau) and (mod(t,T)<T) then Result:=-Im; end; procedure Graphica(a,b:real); const kt=5;ky=5; var dt,dy,c,d,g,h,max,min:real; i,tempt,tempy:integer; s:string; begin h:=(b-a)/(N-1); t[0]:=a;y[0]:=I(t[0]); for i:=1 to N do begin t[i]:=t[i-1]+h; y[i]:=I(t[i]); end; max:=y[0]; min:=y[0]; for i:=1 to N do begin if y[i]>max then max:=y[i]; if y[i]<min then min:=y[i]; end; c:=(Form1.Image1.ClientWidth-t0-tk)/(b-a); d:=t0-c*t[0]; g:=(Form1.Image1.ClientHeight-y0-yk)/(min-max); h:=yk-g*max; for i:=1 to N do begin u[i]:=trunc(c*x[i]+d); v[i]:=trunc(g*y[i]+h); end; Form1.Image1.Canvas.Color:=clGray; Form1.Image1.Canvas.Pen.Mode:=pmNot; Form1.Image1.Canvas.MoveTo(u[0],v[0]); Form1.Image1.Canvas.Pen.Width:=2; Form1.Image1.Canvas.Pen.Color:=clGreen; for i:=1 to N do Form1.Image1.Canvas.LineTo(u[i],v[i]); Form1.Image1.Canvas.Pen.Width:=1; Form1.Image1.Canvas.Pen.Color:=clBlack Form1.Image1.Canvas.MoveTo(trunc(t0),trunc(h)); if (trunc(h)>yk) and (trunc(h)<trunc(Form1.Image.ClientHeight-y0)) then Form1.Image1.Canvas.LineTo(trunc(Form1.Image1.ClientWidth-tk),trunc(h)); Form1.Image1.Canvas.MoveTo(trunc(d),trunc(yk)); if (trunc(d)>0) and (trunc (trunc(d),trunc(Form1.Im ag1.ClientHeight-y0)); dt:=(Form1.Im age1.ClientWidth-t0-tk)/KT3; for i:=0 to KT3 do begin if (i=0) or (i=KT3) then Form1.Image1.‘anvas.Pen.Style:=psSolid else Ferm1.Image1.Canvas.Pen.Style:=psDash; Form1.Image1.Canvas.MoveTo(trunc(t0+i*dt),trunc(yk)); Form1.Image1.Canvas.LineTo(trunc(t0+i*dt),trunc(Form1.Image1.ClientHeight-y0)); end; dy:=(Form1.Image1.ClientHeight-y0-yk)/KY; for i:=0 to KY do begin if (i=0) or (i=KY) then Form1.Image1.‘anvas.Pen.Style:=psSolid else Form1.Image1.‘anvas.Pen.Style:=psDash; Form1.Image1.‘anvas.MoveTo(trunc(t0),trunc(yk+i*dy)); Form1.Image1.‘anvas.LineTo(trunc(Form1.Image1.ClientWidth-tk),trunc(yk+i*dy));end; Form1.Image1.‘anvas.Pen.Style:=psSolid; dt:=(b-a)/KT3; tempy:=trunc(Form1.Image1.ClientHeight-y0+1); for i:=0 to KT3 do begin str(a+i*dt:5:2,s); tmpt:=trunc(t0+i*(Form1.Image1.ClientWidtg-t0-tk)/KT3-1; Form1.Image1.‘anvas.TextOut(trunc(d)-5,tempy,'0'); dy:=(max-min)/KY; tempt:=5; for i:=1 to KY do begin str(ma x-i*dy:5:2,s); tempy:=trunc(yk-5+i*( Form1.Image1.ClientHeight-y0-yk)/KY); Form1.Image1.‘anvas.TextOut(tempt,tempy,s);end; if (trunc(h)>yk) and trunc(h)<Form1.Image1.ClientHeight-1) then Form1.Image1.‘anvas.TextOut(tempt+1,trunc(h)-5,'0'); tempt:=trunc(t0+i*( Form1.Image1.ClientWidth-t0-tk)/2); Form1.Image1.‘anvas.TextOut(temp1,'График');end; procedure TForm1.FormCreate(Sender:TObject); var s:string; kod:integer; begin N:=300,t0:=40;y0:=40;tk:=40; yk:=40; s:=InputBox('введите левую границу',-1); val(s,a,kod=0; until kod=0 repeat s:=InputBox('Введите правую границу','1') val(s,b,kod) until kod=0; end; procedure TForm1.ButtonClick(Sender:YObject); begin Graphica(a,b); end; Initialization; end. |
Сообщ.
#4
,
|
|
|
Цитата Prutvel @ посмотрите, пожалуйста: Это не проект. Это один модуль. А вас просили весь проект присоединить. |
![]() |
Сообщ.
#5
,
|
|
В приведённом коде будто нарочно сделаны опечатки, которые видны невооружённым глазом. Проект, скорее всего, чужой.
Добавлено Операция mod действует только на целых числах. |
Сообщ.
#6
,
|
|
|
Цитата Romtek @ В приведённом коде будто нарочно сделаны опечатки, Добавлено а не подскажете конкретно - где. |
Сообщ.
#7
,
|
|
|
Цитата Prutvel @ а не подскажете конкретно - где. Начиная со 2-й строки... ![]() Далее смотреть лень. И незачем, я думаю... Проект вы не прикладываете, выложив какую-то мешанину. О чем с вами разговаривать? ![]() |
Сообщ.
#8
,
|
|
|
если Вы знаете, как это делать, написали бы хотя бы алгоритм или примерчик какой-нибудь сбросили бы... пожалуйста
![]() |
Сообщ.
#9
,
|
|
|
Цитата Prutvel @ написали бы хотя бы алгоритм Так вот как раз алгоритм хотелось бы от вас увидеть. А помочь с программой можно. |
![]() |
Сообщ.
#10
,
|
|
Цитата Prutvel @ Да, пожалуйста!а не подскажете конкретно - где. 1. Цитата Prutvel @ interfaceace 2. Цитата Prutvel @ functiion I(t:real): real; 3. Цитата Prutvel @ Form1.Image1.‘anvas.Pen.Style:=psSolid else Ferm1.Image1.Canvas.Pen.Style:=psDash; Добавлено Prutvel, прости, а ты синтаксис Паскаля знаешь? Сложилось впечатление, что вовсе нет. Добавлено Цитата Prutvel @ Такую чушь может написать только человек, ничего не понимающий в Паскале. За Делфи даже и речи нет.![]() ![]() functiion I(t:real):real; begin T1:=1/f1; T2:=1/f2; T:=T1+T2; if mod(t,T)<tau then Result:=Im; if (mod(t,T)>=tau) and (mod(t,T)<T1) then Result:=-Im; if (mod(t,T)>=T1) and (mod(t,T)<(T1+tau)) then Result:=Im; if (mod(t,T)>=(T1+tau) and (mod(t,T)<T) then Result:=-Im; end; Начиная от синтасиса и заканчивая знанием базовых понятий. Цитата Prutvel @ ![]() ![]() N:=300,t0:=40;y0:=40;tk:=40; yk:=40; s:=InputBox('введите левую границу',-1); val(s,a,kod=0; |
Сообщ.
#11
,
|
|
|
Цитата Оззя @ Цитата Prutvel @ написали бы хотя бы алгоритм Так вот как раз алгоритм хотелось бы от вас увидеть. А помочь с программой можно. Дело в том, что по заданию, надо сделать численный расчет напряжения на катушке идуктивности в цепи переменного тока прямоугольной формы, где L=0.1 Гн - индуктивность, Im=0.57 А - амплитуда тока, tau=62 мс - длительность импульса. Частота на четных периодах f1=5.37 Гц, на нечетных периодах f2=8.06 Гц. Периоды T1 и T2 равны. Я сделала это в маткаде, получилось, что сам график-то задается как система: то есть функция I(t) принимает вообще говоря 2 значения, это Im и -Im, но при разных промежутках времени, то есть получается так: Im if mod(t,T)<tau -Im if (mod(t,T)>=tau) and (mod(t,T)<T1) I(t):= Im if (mod(t,T)>=T1) and (mod(t,T)<T1+tau) -Im if (mod(t,T)>=T1+tau) and (mod(t,T)<T) Так мы задали в маткаде этот ток, а потом приняли, что i:=0..300, dt:=T/100, t1:=i*dt; И, следовательно, получили отсюда график по точкам: написали Ii(ti), то есть получили точки. Так вот, то есть у меня есть точки...А дальше - надо построить такой же график на языке высокого уровня ![]() ![]() |
![]() |
Сообщ.
#12
,
|
|
Напиши функцию I(t), которая на входу получала бы необходимые параметры, а на выходе - некоторое значение. С графикой поможем.
Только функция должна быть правильной и компилироваться! |
Сообщ.
#13
,
|
|
|
Цитата Romtek @ Напиши функцию I(t), которая на входу получала бы необходимые параметры, а на выходе - некоторое значение. С графикой поможем. Только функция должна быть правильной и компилироваться! Спасибо, сейчас попробую. |
Сообщ.
#14
,
|
|
|
У меня, почему-то, пишет ошибки
![]() Я с функциями во фри паскале не работала раньше... Подскажите, что не так, пожалуйста. Прикреплённый файл ![]() |
Сообщ.
#15
,
|
|
|
Что делает mod в Маткаде?
Лучше прикладывайте не скриншот, а текст программы. Добавлено Заметьте, что: Цитата Romtek @ Операция mod действует только на целых числах. |
![]() |
Сообщ.
#16
,
|
|
Воспользуйся такой функцией вместо MOD:
![]() ![]() function FMod (a, b: Double): Double; begin Result := a - b * Trunc(a / b) end; |
Сообщ.
#17
,
|
|
|
С этим, кажется, разобралась - недаром ведь по заданию провежуток дан в мс, а не в с, значит, периоды тоже можно в мс делать, тогда они - целые...
Но он пишет ошибку - когда я пишу присвоить значению функции такое-то значение: I(t):=Im. Почему он это пишет? Как исправить? |
![]() |
Сообщ.
#18
,
|
|
Потому что на Паскале так не пишут. Для этого есть зарезервированное слово Result.
|
Сообщ.
#19
,
|
|
|
Цитата Romtek @ Воспользуйся такой функцией вместо MOD: ![]() ![]() function FMod (a, b: Double): Double; begin Result := a - b * Trunc(a / b) end; ясно. А что такое a,b и trunc? |
![]() |
Сообщ.
#20
,
|
|
Пардон, пишется имя функции, а не Result.
Result только в Делфи или в FreePascal в режиме ObjFPC. Добавлено Цитата Prutvel @ А что такое a,b и trunc? Trunc отсекает мантиссу вещественного числа. Trunc(-5.3) = -5 Trunc(5.3) = 5 Добавлено a, b - входные параметры для функции. Вроде бы как... ![]() В чём, собственно, вопрос? |
Сообщ.
#21
,
|
|
|
Цитата Romtek @ Пардон, пишется имя функции, а не Result. Так вот я и писала I(t):=Im, а он пишет ошибку... ![]() И я написала, как Вы сказали - посмотрите, пожалуйста, так? Прикреплённый файл ![]() |
Сообщ.
#22
,
|
|
|
Prutvel
Копируйте текст программы из FPC. Edit -> Copy to Windows |
Сообщ.
#23
,
|
|
|
function FMod (t,T3: double):double;
Const Im=0.57; L=0.1; tau=62; f1=5.37; f2=8.06; T1=186;T2=124; T3=310; begin if (t-T3*Trunc(t/T3))<tau then I(t):=Im; if ((t-T3*Trunc(t/T3))>=tau) and ((t-T3*Trunc(t/T3))<T1) then I(t):=-Im; if ((t-T3*Trunc(t/T3))>=T1) and ((t-T3*Trunc(t/T3))<(T1+tau)) then I(t):=Im; if (t-T3*Trunc(t/T3))>=(T1+tau)) and ((t-T3*Trunc(t/T3))<T3) then I(t):=-Im; end. |
![]() |
Сообщ.
#24
,
|
|
Цитата Prutvel @ Я написал только про имя. Если передаём и параметр, то получаем рекурсивный вызов функции. Но так как можно только получить результат рекурсии, а не присвоить ему значени, то получаешь ошибку.Так вот я и писала I(t):=Im, а он пишет ошибку... Убери параметр (t). |
Сообщ.
#25
,
|
|
|
Так компилируется, насколько верно записано - не знаю.
![]() ![]() function FMod (a, b: Double): Double; begin FMOD:= a - b * Trunc(a / b); end; Function i(t:Double): Double; Const Im=0.57; L=0.1; tau=62; f1=5.37; f2=8.06; T1=186;T2=124; T3=310; begin if fmod(t,T3)<tau then i:=Im; if (fmod(t,T3)>=tau) and (fmod(t,T3)<T1) then I:=-Im; if (fmod(t,T3)>=T1) and (fmod(t,T3)<(T1+tau)) then I:=Im; if (fmod(t,T3)>=T1+tau) and (fmod(t,T3)<T3) then I:=-Im; end; begin end. |
Сообщ.
#26
,
|
|
|
а как же мне тогда задавать интервалы?
![]() |
Сообщ.
#27
,
|
|
|
Цитата Prutvel @ а как же мне тогда задавать интервалы? Я подправил предыдущее сообщ. Проверьте. |
Сообщ.
#28
,
|
|
|
пишет на последнем end ошибку Error while linking, подставляла readln, writeln - не помогает...
|
![]() |
Сообщ.
#29
,
|
|
Это когда предыдущие скомпилированные и запущенные программы не были закрыты.
Если они закрыты, надо завершить их процессы в Task Manager. |
Сообщ.
#30
,
|
|
|
а где это?
|
Сообщ.
#31
,
|
|
|
Диспетчер задач -> ctrl alt delete
|
Сообщ.
#32
,
|
|
|
нет, что-то он все равно эту ошибку выводит
![]() ... ну ладно, спасибо вам все равно большое... Ну предположим, ошибки нет и программа компилируется. Что делать дальше, как строить графики? |
![]() |
Сообщ.
#33
,
|
|
Цитата Prutvel @ А дальше, предположим, что графики ты сама умеешь строить.Ну предположим, Продвигаться дальше будем? |
Сообщ.
#34
,
|
|
|
![]() unit Unit1; interfaceace uses Classes,SysUtils,LResources,Forms,Graphics,Dialogs,Extctrls,Stdctrls; function I(t:real):real; procedure Graphica (a,b:real); type TForm1=class(TForm); Button1: TButton; Image1: TImage; procedure ButtonClick(Sender:TObject); procedure FormCreate(Sender:TObject); private public end; const Im=0.57,tau=0.062; L=0.1; f1=5.37; f2=8.06; var |
![]() |
![]() |
|
Перенёс сообщение в Wiki: Построение графика функции.
|
Сообщ.
#36
,
|
|
|
спасибо, сейчас попробую...
Добавлено Цитата Romtek @ Набросок порядка действий такой: Пусть график вида y = f(x) должен размещаться на поверхности холста с размерами CanvasWidth на CanvasHeight. Тогда перед его построением надо: 1. Определить граничные значения входных параметров (ось X): DataXmax, DataXmin. 2. Определить граничные значения выходных параметров (ось Y): DataYmax, DataYmin. 3. Найти коэффициент масштабирования данных для оси X по формуле: Kx = CanvasWidth / (DataXmax - DataXmin) 4. Найти коэффициент масштабирования данных для оси Y по формуле: Ky = CanvasHeight / (DataYmax - DataYmin) WHILE x < DataXmax DO BEGIN y := f(x); px := PixelCoordX(x); py := PixelCoordX(y); LineTo(px, py); (* проводим линию до заданной точки от установленного ранее курсора (процедурами MoveTo/LineTo) *) x := x + deltaX END;[/CODE] а как их найти? ![]() |
Сообщ.
#37
,
|
|
|
а так полагаю
max:=y[0]; min:=y[0]; for i:=1 to N do begin if y[i]>max then max:=y[i]; if y[i]<min then min:=y[i]; end; |
![]() |
Сообщ.
#38
,
|
|
Цитата Prutvel @ max:=y[0]; min:=y[0]; for i:=1 to N do begin if y[i]>max then max:=y[i]; if y[i]<min then min:=y[i]; end; только границы надо соблюдать. Или от 1 до N, или от 0 до N-1. Иначе будет ошибка. |
Сообщ.
#39
,
|
|
|
Function i(t:Double): Double;
скажите пожалуйста, так правильно? Const Im=0.57; L=0.1; tau=62; f1=5.37; f2=8.06; T1=186;T2=124; T3=310; var t,I:array[0..1000] of real; begin if fmod(t,T3)<tau then i:=Im; if (fmod(t,T3)>=tau) and (fmod(t,T3)<T1) then I:=-Im; if (fmod(t,T3)>=T1) and (fmod(t,T3)<(T1+tau)) then I:=Im; if (fmod(t,T3)>=T1+tau) and (fmod(t,T3)<T3) then I:=-Im; end; max:=i[0]; min:=i[0]; for k:=1 to N do begin if i[k]>max then max:=y[k]; if i[k]<min then min:=y[k]; end; |
![]() |
Сообщ.
#40
,
|
|
Не стоит спрашивать по каждой мелочи.
Компилятор сам подсказывает где верно, а где нет. Нужно на бумаге сначала свои мысли привести в порядок, тогда и на экране всё будет работать. Удачи! |
Сообщ.
#41
,
|
|
|
вы же обещали мне помочь с графикой...пожалуйста, помогите...
|
![]() |
Сообщ.
#42
,
|
|
Я и помогаю. Или мне за тебя сделать задание?
С чем не справляешься - спрашивай. Тут больше геометрии с математикой, чем программирования. |
Сообщ.
#43
,
|
|
|
Спасибо Вам большое! А не подскажете, Вы в каком паскале загружали программу Free или Turbo: почему-то у меня на компьютере не запускаются программы вообще - пишет ошибку error while linking, причем даже на правильно написанную программу. Я так подумала, он ведь ни одну программу мне вообще не запустил с того времени, как я его (Free Pascal) установила. В чем дело, не подскажете?
|
![]() |
Сообщ.
#44
,
|
|
Цитата Prutvel @ Подскажем. Только для начала ты зайди в Options -> Compiler -> Verbose, поставь там крестики на Warnings, Notes, Hints и General Info, нажми Ok, пересобери программу (Compile -> Build или Compile -> Make), и если опять не слинкуется - то нажми на F12 и покажи нам все те сообщения, которые тебе выдал компилятор. Иногда в них содержится подсказка, почему не линкуется.В чем дело, не подскажете? Кстати, какой компилятор у тебя? Версия, в смысле, какая? |
Сообщ.
#45
,
|
|
|
я написала программу. Пожалуйста, помогите ее довести до ума, чтобы паскаль не выводил ошибок:
program r6; Uses graph; Const GlColor=5; MtCount=5; MiCount=5; Dl:real=-2; Dr:Real=2; function FMod (a, b: real): real; begin FMOD:= a - b * Trunc(a / b); end; function i(t:real): real; Const Im=0.57; L=0.1; tau=62; f1=5.37; f2=8.06; T1=186;T2=124; T3=310; begin if fmod(t,T3)<tau then i:=Im; if (fmod(t,T3)>=tau) and (fmod(t,T3)<T1) then I:=-Im; if (fmod(t,T3)>=T1) and (fmod(t,T3)<(T1+tau)) then I:=Im; if (fmod(t,T3)>=T1+tau) and (fmod(t,T3)<T3) then I:=-Im; end; Var D,R:integer; iU,iD:real; begin Procedure CalciRange; Var I:LongInt; i,t:real; Begin iU:=f(Dl); iD:=iU; for k:=1 to GetMaxt begin t:=k*(Dr-Dl)/GetMaxt+Dl; i:=f(t); if iU<i then iU:=i; if iD>i then iD:=i; end; end; Procedure DrawKoord; var I:integer; t,i:integer; temp:string; Maxt,Maxi:integer; begin Maxt:=MtCount-1; Maxi:=MiCount-1; if (iU>0) and (iD<0) then begin i:=round(GetMaxi-GetMaxi*(-iD)/(iU-iD)); Line (0,i,GetMaxt,i); Line (GetMaxt-5,i-5,GetMaxt,i); Line (GetMaxt-5,i+5,GetMaxt,i); OutTextti(GetMaxt-10,i+10,'t'); i:=i+TextHeight('t'); end else if (iU>0) then i:=GetMaxi-TextHeight('1') else i:=0; for k:=0 to Maxt do begin str((k*(Dr-Dl)/Maxt+Dl):5:2,Temp); t:=Round (k*GetMaxt/Maxt); if (t+TextWidth(Temp)>GetMaxt) then x:=GetMaxt-TextWidth(Temp); OutTextti(t,i,Temp); end; if (Dl<=0) and (Dr>0) then begin t:=Round(GetMaxt*(-Dl/(Dr-Dl))); Line(t,0,t,GetMaxi); Line(t-5,5,t,0); Line(t+5,5,t,0); OutTextti(t+10,10,'i'); end else if (Dl<0) then begin if (Abs(iU)>Abs(iD)) then str(iU:5:2,Temp) else str (iD:5:2,Temp); t:=GetMaxt-TextWidth(Temp); end else t:=0; for k:=0 to Maxi do begin str((k*(iU-iD)/Maxi+iD):5:2,Temp); i:=GetMaxi-Round(k*GetMaxi/Maxi); if (i+TextHeight(Temp)>GetMaxi) then i:=GetMaxi-TextHeight(Temp); OutTextti(t,i,Temp); end; end; Procedure DrawGr; var I,i:LongInt; Temp:Real; Ot,Oi:Integeer; begin Ot:=1; Temp:=func((Dr-Dl)/GetMaxt+Dl)-iD; i:=Round(Temp*GetMaxi/(iU-iD)); Oi:=GetMaxi-i; SetColor(GlColor); for k:=1 to GetMaxt do begin Temp:=Func(k*(Dr-Dl)/GetMaxt+Dl)-iD; i:=Round(Temp*GetMaxi/(iU-iD)); i:=GetMaxi-i; Line(Ot,Oi,k,i); Ot:=k; Oi:=i; end; end; begin D:=Detect; InitGraph(D,R,'D:\BP\BGI'); CalciRange; DrawKoord; DrawGr; Readln; CloseGraph; end. |
![]() |
Сообщ.
#46
,
|
|
Цитата Компилятор сообщает где ошибки и что они означают. Следуй его указаниям. Читай документацию, справочники.Error: Duplicate identifier "I" РеГисТР бУКв в Паскале не имеет значения. I и i - одинаковые идентификаторы. ![]() ![]() Var I: LongInt; i,t: real; ![]() Приведёнными мною набросками построения функции так и не воспользовалась. Ну и ладно. Помучаешься со своим (если свой) кодом, может, поймёшь разницу. ![]() Добавлено Вдобавок: не пользуйся чужими наработками, если в них ничего не понимаешь. Больше времени потратишь впустую, чем пользы получишь от самостоятельного обучения. |
Сообщ.
#47
,
|
|
|
Цитата Romtek @ Приведёнными мною набросками построения функции так и не воспользовалась. так Вы мне скажите, в ТУРБО паскале они будут действовать??? |
![]() |
Сообщ.
#48
,
|
|
Если изменить
Result := на FunctionName := то да. Изменения, как видишь, минимальные. |
![]() |
Сообщ.
#49
,
|
|
Цитата Prutvel @ в ТУРБО паскале они будут действовать??? Большая часть из того, что здесь написана будет работать и в Турбо Паскале (когда исправишь ошибки, на которые тебе уже указали и на которые указывает компилятор, разумеется). Но если тебе надо Турбо - ты так и говори, а то мечешься, как... <самоцензура>, то ей Лазарус, потом FPC, теперь TP подавай... На кой черт в Лазарусе, скажем, рисовать это все в ручную, кто-нибудь объяснит мне? Компонента Chart что, не существует? Добавить несколько линий с определенным периодом - вот тебе и график функции. Ты для себя сначала реши, что тебе надо, запутать всех постоянным изменением компиляторов, или выбрать что-то дно, и написать, наконец, работоспособный код... А то развели флуда на 50 сообщений. "Это правильно? А это - правильно?" Программа может быть признана правильной только тогда, когда она компилируется, запускается и делает то, что от нее требуется. Твоя программа не прошла ни один из этапов. А если прошла - то покажи в нормальном виде : заархивируй и прикрепи архив к сообщению (специально добавили кнопку "Обзор" прямо в форму быстрого ответа) тот код, который у тебя компилируется, а не тот бред, который ты пишешь постоянно - то лишние буквы, то повторяющиеся идентификаторы, то вообще запрещенные символы в исходнике. Чтоб БЕЗ ИЗМЕНЕНИЙ (открыл присоединенный файл, нажал F9. Я больше ничего делать не хочу. Это твое задание, ты его и решай, я могу только посмотреть, правильно ли оно работает) он прошел хотя бы этап компиляции и программа хоть как-то запустилась. Потом будем продолжать. Не скомпилировался? Извини, здесь не онлайн Pascal Compiler, тебе программа пишет где ошибка - будь добра разобраться, что не так, и исправить. А пока нет такого кода - говорить больше не о чем. |
Сообщ.
#50
,
|
|
|
вот этот компилируется в турбо:
function FMod (a, b: real): real; begin FMOD:= a - b * Trunc(a / b); end; Function i(t:real): real; Const Im=0.57; L=0.1; tau=62; f1=5.37; f2=8.06; T1=186;T2=124; T3=310; begin if fmod(t,T3)<tau then i:=Im; if (fmod(t,T3)>=tau) and (fmod(t,T3)<T1) then I:=-Im; if (fmod(t,T3)>=T1) and (fmod(t,T3)<(T1+tau)) then I:=Im; if (fmod(t,T3)>=T1+tau) and (fmod(t,T3)<T3) then I:=-Im; end; begin end. |
Сообщ.
#51
,
|
|
|
вот программа. Она почти работает. Но компиллятор выводит сразу 4 ошибки на одно выражение - function PixelCoordT(t: Double): Integer; что делать?)
Прикреплённый файл ![]() |
Сообщ.
#52
,
|
|
|
function FMod (a, b: double): double;
begin FMOD:= a - b * Trunc(a / b); end; Function i(t:double): Double; Const Im=0.57; L=0.1; tau=62; f1=5.37; f2=8.06; T1=186;T2=124; T3=310; begin if fmod(t,T3)<tau then i:=Im; if (fmod(t,T3)>=tau) and (fmod(t,T3)<T1) then I:=-Im; if (fmod(t,T3)>=T1) and (fmod(t,T3)<(T1+tau)) then I:=Im; if (fmod(t,T3)>=T1+tau) and (fmod(t,T3)<T3) then I:=-Im; end; var k,N:integer;DataTmax,DataTmin, DataImax,DataImin: real; t,i1: array[0..300] of real; begin DataTmax:=t[0]; DataTmin:=t[0]; for k:=1 to N do begin if t[k]>DataTmax then DataTmax:=t[k]; if t[k]<DataTmin then DataTmin:=t[k]; end; DataImax:=i1[0]; DataImin:=i1[0]; for k:=1 to N do begin if i1[k]>DataImax then DataImax:=i1[k]; if i1[k]<DataImin then DataImin:=i1[k]; end; function PixelCoordT(t:double): Integer; begin (* прибавляем половину ширины холста, чтобы центр осей был в центре экрана *) i := Round( CanvasWidth / 2.0 + t * Kt) end; function PixelCoordI (i: Double): Integer; begin (* вычитаем из половины высоты холста, иначе график будет перевёрнутым*) i := Round( CanvasHeight / 2.0 - f(t) * Ki) end; begin end |
Сообщ.
#53
,
|
|
|
Prutvel
Извините, но Вы совершенно НЕ читаете того, что Вам пишут. Еще раз перечитайте посты Romtek'a и volvo877. Внимательно! Ну, не будет работать Ваш код, "отрисовывающий графику". Нигде. Ни в Лазарусе, ни в FP, ни в TP. |
Сообщ.
#54
,
|
|
|
Цитата Prutvel @ Она почти работает. хоть немного код структурируйте ![]() ![]() function FMod (a, b: double): double; begin FMOD:= a - b * Trunc(a / b); end; Function i(t:double): Double; Const Im=0.57; L=0.1; tau=62; f1=5.37; f2=8.06; T1=186;T2=124; T3=310; begin if fmod(t,T3)<tau then i:=Im; if (fmod(t,T3)>=tau) and (fmod(t,T3)<T1) then I:=-Im; if (fmod(t,T3)>=T1) and (fmod(t,T3)<(T1+tau)) then I:=Im; if (fmod(t,T3)>=T1+tau) and (fmod(t,T3)<T3) then I:=-Im; end; var k, N:integer; DataTmax, DataTmin, DataImax, DataImin: real; t, i1: array[0..300] of real; begin DataTmax:=t[0]; DataTmin:=t[0]; for k:=1 to N do begin if t[k]>DataTmax then DataTmax:=t[k]; if t[k]<DataTmin then DataTmin:=t[k]; end; DataImax:=i1[0]; DataImin:=i1[0]; for k:=1 to N do begin if i1[k]>DataImax then DataImax:=i1[k]; if i1[k]<DataImin then DataImin:=i1[k]; end; function PixelCoordT(t: Double): Integer; begin (* ЇаЁЎ ў«пҐ¬ Ї®«®ўЁг иЁаЁл е®«бв , зв®Ўл жҐва ®бҐ© Ўл« ў жҐвॠнЄа *) i := Round( CanvasWidth / 2.0 + t * Kt) end; function PixelCoordI (i: Double): Integer; begin (* ўлзЁв Ґ¬ Ё§ Ї®«®ўЁл ўлб®вл е®«бв , Ё зҐ Ја дЁЄ Ўг¤Ґв ЇҐаҐўсагвл¬*) i := Round( CanvasHeight / 2.0 - f(t) * Ki) end; begin end. почему PixelCoordT и PixelCoordI оказались внутри основного блока программы и зачем последний begin? Вас уже просили привести полный код - этот обрезок Цитата Оззя @ не будет работать |
Сообщ.
#55
,
|
|
|
ну помогите!!! пожалуйста, кто-нибудь, напишите работоспособный код. Я уже третью неделю и днем и ночью сижу
![]() ![]() |
![]() |
Сообщ.
#56
,
|
|
Прочти заново предыдущую страницу темы и попытайся написать сама, добавляя функциональность по малу.
Суп ведь также варится, поочерёдно добавляя продукты. |
Сообщ.
#57
,
|
|
|
вы мне сказали, что через trunc надо функцию задавать. Паскаль не строит такой график - выводит координатную ось, и фиолетовый экран
![]() ![]() |
Сообщ.
#58
,
|
|
|
Цитата выводит координатную ось, и фиолетовый экран Кто выводит? Где выводит? ![]() Предыдущая Ваша программа не должна НИЧЕГО выводить. В принципе. А новой версии Вы не предоставляете. ![]() А уроки телепатии я в школе прогуливал. ![]() |
Сообщ.
#59
,
|
|
|
Спасибо большое ВСЕМ, кто принял участие в моем вопросе! График тока вроде бы получился. Не могли бы вы подсказать, как точки этого графика перекинуть в эксель?
|
Сообщ.
#60
,
|
|
|
Да и еще - если не затруднит, подскажите, пожалуйста, как лучше дифференцирование в паскале сделать: надо напряжение через ток найти:
U=L*(dI/dt) я вот думала по точкам, а как их задавать-то - то есть прямо массив делать типа for k:=1 to N do U(k):=L*I(t(k)-I(t(k)-dt)/dt) как это правильно сделать?) |
Сообщ.
#61
,
|
|
|
хочется все же узнать под каким компилятором заработало?
Цитата Prutvel @ как точки этого графика перекинуть в эксель сохранить в текстовый файл с разделителями .CSV или курить Ole Automation сервер Excel во втором случае лучше юзать Free Pascal |
Сообщ.
#62
,
|
|
|
Сообщ.
#63
,
|
|
|
Спасибо!
|
Сообщ.
#64
,
|
|
|
Цитата Light13 @ хочется все же узнать под каким компилятором заработало? заработало в турбо паскале...А если я построила график, а через массив как-то можно вывести эти точки в эксель?) |
Сообщ.
#65
,
|
|
|
Цитата Prutvel @ через массив как-то можно вывести эти точки в эксель?) Можно, в посте 61 упомянут формат CSV Почитай Википедию Пишешь данные согласно форматы, сохраняешь файл с расширением - CSV |
Сообщ.
#66
,
|
|
|
спасибо.
![]() |
Сообщ.
#67
,
|
|
|
не могли бы вы подсказать еще одну вещь - как из паскаля картинку распечатывать? Когда нажимаем ctrl+F9 видим график, а принт скрином он не берется?)
|
![]() |
Сообщ.
#68
,
|
|
А Вы не могли бы перестать тему превращать в мусорку? Изначально речь была про 32-битные компиляторы, теперь оказалось что это 16-бит. Ладно... Потом понадобилось дифференцирование (в FAQ-е самой посмотреть нельзя, правда? Удобнее, когда за тебя ссылку найдут)... Теперь оказывается, надо еще и скриншот снять.
В общем, вот ссылка: Скриншот проги (сообщение #1604071) Там рассказано, как и что делать. А эту тему я закрываю... Не закрою сейчас - через неделю здесь будет еще в 2 раза больше постов. |