Помогите построить график
    
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    Помогите построить график
    
  | 
         
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          помогите построить график на любом языке программирования для  функции (см. прикрепленный файл - там уже график есть - в маткаде получила, надо такой же на паскале или в др. среде получить): 
        
      то есть даны промежутки и два значения Im=5.3 и Im=-5.37. Я пыталась построить - нашла пример для лазуруса и набрала, но он чего-то не хочет работать. Ну хоть схемку накидайте или саму программку, плиззз. Прикреплённый файл  задание_функции.jpg (26.45 Кбайт, скачиваний: 567)
		 | 
    
| 
         
         
         
          
           Сообщ.
           #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
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          У меня, почему-то, пишет ошибки  
        
         Я с функциями во фри паскале не работала раньше... Подскажите, что не так, пожалуйста. Прикреплённый файл  фри_паскаль.jpg (81 Кбайт, скачиваний: 516)
		 | 
    
| 
         
         
         
          
           Сообщ.
           #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, а он пишет ошибку...   И я написала, как Вы сказали - посмотрите, пожалуйста, так? Прикреплённый файл  глянь.jpg (40.88 Кбайт, скачиваний: 461)
		 | 
    
| 
         
         
         
          
           Сообщ.
           #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; что делать?)   
        
      Прикреплённый файл  плавл_вариант.rar (0.7 Кбайт, скачиваний: 170)
		 | 
    
| 
         
         
         
          
           Сообщ.
           #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 раза больше постов.  |