На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> Помогите построить график
    помогите построить график на любом языке программирования для функции (см. прикрепленный файл - там уже график есть - в маткаде получила, надо такой же на паскале или в др. среде получить):

    то есть даны промежутки и два значения Im=5.3 и Im=-5.37.

    Я пыталась построить - нашла пример для лазуруса и набрала, но он чего-то не хочет работать.

    Ну хоть схемку накидайте или саму программку, плиззз.
    Прикреплённый файлПрикреплённый файлзадание_функции.jpg (26.45 Кбайт, скачиваний: 562)
      Цитата Prutvel @
      Я пыталась построить - нашла пример для лазуруса и набрала, но он чего-то не хочет работать.
      То есть, присоединить сюда проект для Лазаруса, который ты уже набрала - нельзя было, мы должны сделать ту же работу, с нуля набирать, тестировать, вместо того, чтобы (возможно) исправить один символ... Ну-ну... Подождем, может и найдется тот, у кого лишнего времени навалом...
        посмотрите, пожалуйста:


        ExpandedWrap disabled
          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.
        Сообщение отредактировано: volvo877 -
          Цитата Prutvel @
          посмотрите, пожалуйста:


          Это не проект. Это один модуль. А вас просили весь проект присоединить.
            В приведённом коде будто нарочно сделаны опечатки, которые видны невооружённым глазом. Проект, скорее всего, чужой.

            Добавлено
            Операция mod действует только на целых числах.
              Цитата Romtek @
              В приведённом коде будто нарочно сделаны опечатки,
              Добавлено

              а не подскажете конкретно - где.
                Цитата Prutvel @
                а не подскажете конкретно - где.

                Начиная со 2-й строки... :wacko:
                Далее смотреть лень.
                И незачем, я думаю... Проект вы не прикладываете, выложив какую-то мешанину. О чем с вами разговаривать? :blink:
                  если Вы знаете, как это делать, написали бы хотя бы алгоритм или примерчик какой-нибудь сбросили бы... пожалуйста :'(
                    Цитата Prutvel @
                    написали бы хотя бы алгоритм

                    Так вот как раз алгоритм хотелось бы от вас увидеть. А помочь с программой можно.
                      Цитата 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 @

                      ExpandedWrap disabled
                            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 @

                      ExpandedWrap disabled
                                     N:=300,t0:=40;y0:=40;tk:=40; yk:=40;
                                     s:=InputBox('введите левую границу',-1);
                                     val(s,a,kod=0;
                        Цитата Оззя @
                        Цитата 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), то есть получили точки.

                        Так вот, то есть у меня есть точки...А дальше - надо построить такой же график на языке высокого уровня :oops: ... Помогите, пожалуйста..., очень надо :(
                          Напиши функцию I(t), которая на входу получала бы необходимые параметры, а на выходе - некоторое значение. С графикой поможем.
                          Только функция должна быть правильной и компилироваться!
                            Цитата Romtek @
                            Напиши функцию I(t), которая на входу получала бы необходимые параметры, а на выходе - некоторое значение. С графикой поможем.
                            Только функция должна быть правильной и компилироваться!

                            Спасибо, сейчас попробую.
                              У меня, почему-то, пишет ошибки :'(

                              Я с функциями во фри паскале не работала раньше... Подскажите, что не так, пожалуйста.
                              Прикреплённый файлПрикреплённый файлфри_паскаль.jpg (81 Кбайт, скачиваний: 512)
                                Что делает mod в Маткаде?
                                Лучше прикладывайте не скриншот, а текст программы.

                                Добавлено
                                Заметьте, что:
                                Цитата Romtek @
                                Операция mod действует только на целых числах.
                                  Воспользуйся такой функцией вместо MOD:
                                  ExpandedWrap disabled
                                    function FMod (a, b: Double): Double;
                                    begin
                                       Result := a - b * Trunc(a / b)
                                    end;
                                  Это аналог функции fmod() на С.
                                    С этим, кажется, разобралась - недаром ведь по заданию провежуток дан в мс, а не в с, значит, периоды тоже можно в мс делать, тогда они - целые...

                                    Но он пишет ошибку - когда я пишу присвоить значению функции такое-то значение: I(t):=Im. Почему он это пишет? Как исправить?
                                      Потому что на Паскале так не пишут. Для этого есть зарезервированное слово Result.
                                        Цитата Romtek @
                                        Воспользуйся такой функцией вместо MOD:
                                        ExpandedWrap disabled
                                          function FMod (a, b: Double): Double;
                                          begin
                                             Result := a - b * Trunc(a / b)
                                          end;
                                        Это аналог функции fmod() на С.

                                        ясно. А что такое a,b и trunc?
                                          Пардон, пишется имя функции, а не Result.

                                          Result только в Делфи или в FreePascal в режиме ObjFPC.

                                          Добавлено
                                          Цитата Prutvel @
                                          А что такое a,b и trunc?

                                          Trunc отсекает мантиссу вещественного числа.
                                          Trunc(-5.3) = -5
                                          Trunc(5.3) = 5

                                          Добавлено
                                          a, b - входные параметры для функции. Вроде бы как... :wacko:
                                          В чём, собственно, вопрос?
                                            Цитата Romtek @
                                            Пардон, пишется имя функции, а не Result.

                                            Так вот я и писала I(t):=Im, а он пишет ошибку... :oops:

                                            И я написала, как Вы сказали - посмотрите, пожалуйста, так?
                                            Прикреплённый файлПрикреплённый файлглянь.jpg (40.88 Кбайт, скачиваний: 456)
                                              Prutvel
                                              Копируйте текст программы из FPC. Edit -> Copy to Windows
                                                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.
                                                  Цитата Prutvel @
                                                  Так вот я и писала I(t):=Im, а он пишет ошибку...
                                                  Я написал только про имя. Если передаём и параметр, то получаем рекурсивный вызов функции. Но так как можно только получить результат рекурсии, а не присвоить ему значени, то получаешь ошибку.

                                                  Убери параметр (t).
                                                    Так компилируется, насколько верно записано - не знаю.
                                                    ExpandedWrap disabled
                                                      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.
                                                      а как же мне тогда задавать интервалы? :blink:
                                                        Цитата Prutvel @
                                                        а как же мне тогда задавать интервалы?

                                                        Я подправил предыдущее сообщ. Проверьте.
                                                          пишет на последнем end ошибку Error while linking, подставляла readln, writeln - не помогает...
                                                            Это когда предыдущие скомпилированные и запущенные программы не были закрыты.

                                                            Если они закрыты, надо завершить их процессы в Task Manager.
                                                              а где это?
                                                                Диспетчер задач -> ctrl alt delete
                                                                  нет, что-то он все равно эту ошибку выводит :unsure:

                                                                  ...
                                                                  ну ладно, спасибо вам все равно большое... Ну предположим, ошибки нет и программа компилируется. Что делать дальше, как строить графики?
                                                                    Цитата Prutvel @
                                                                    Ну предположим,
                                                                    А дальше, предположим, что графики ты сама умеешь строить.
                                                                    Продвигаться дальше будем?
                                                                      ;) ладно. Начинать надо с этого?

                                                                      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: Построение графика функции.
                                                                        Сообщение отредактировано: Romtek -
                                                                          спасибо, сейчас попробую...

                                                                          Добавлено
                                                                          Цитата 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]

                                                                          а как их найти? :unsure:
                                                                            а так полагаю

                                                                            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;
                                                                              Цитата 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. Иначе будет ошибка.
                                                                                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;
                                                                                  Не стоит спрашивать по каждой мелочи.
                                                                                  Компилятор сам подсказывает где верно, а где нет.

                                                                                  Нужно на бумаге сначала свои мысли привести в порядок, тогда и на экране всё будет работать.

                                                                                  Удачи!
                                                                                    вы же обещали мне помочь с графикой...пожалуйста, помогите...
                                                                                      Я и помогаю. Или мне за тебя сделать задание?
                                                                                      С чем не справляешься - спрашивай.
                                                                                      Тут больше геометрии с математикой, чем программирования.
                                                                                        Спасибо Вам большое! А не подскажете, Вы в каком паскале загружали программу Free или Turbo: почему-то у меня на компьютере не запускаются программы вообще - пишет ошибку error while linking, причем даже на правильно написанную программу. Я так подумала, он ведь ни одну программу мне вообще не запустил с того времени, как я его (Free Pascal) установила. В чем дело, не подскажете?
                                                                                          Цитата Prutvel @
                                                                                          В чем дело, не подскажете?
                                                                                          Подскажем. Только для начала ты зайди в Options -> Compiler -> Verbose, поставь там крестики на Warnings, Notes, Hints и General Info, нажми Ok, пересобери программу (Compile -> Build или Compile -> Make), и если опять не слинкуется - то нажми на F12 и покажи нам все те сообщения, которые тебе выдал компилятор. Иногда в них содержится подсказка, почему не линкуется.

                                                                                          Кстати, какой компилятор у тебя? Версия, в смысле, какая?
                                                                                            я написала программу. Пожалуйста, помогите ее довести до ума, чтобы паскаль не выводил ошибок:

                                                                                            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.
                                                                                              Цитата
                                                                                              Error: Duplicate identifier "I"
                                                                                              Компилятор сообщает где ошибки и что они означают. Следуй его указаниям. Читай документацию, справочники.

                                                                                              РеГисТР бУКв в Паскале не имеет значения. I и i - одинаковые идентификаторы.

                                                                                              ExpandedWrap disabled
                                                                                                    Var I:   LongInt;
                                                                                                        i,t:   real;
                                                                                              Здесь 2 ошибки. Одна: повторение имён идентификаторов переменных. Вторая: повторение имён идентификаторов с именем функции I(t). Кроме i можно и нужно использовать другие имена. ;)

                                                                                              Приведёнными мною набросками построения функции так и не воспользовалась. Ну и ладно. Помучаешься со своим (если свой) кодом, может, поймёшь разницу. 8-)

                                                                                              Добавлено
                                                                                              Вдобавок:
                                                                                              не пользуйся чужими наработками, если в них ничего не понимаешь. Больше времени потратишь впустую, чем пользы получишь от самостоятельного обучения.
                                                                                                Цитата Romtek @
                                                                                                Приведёнными мною набросками построения функции так и не воспользовалась.

                                                                                                так Вы мне скажите, в ТУРБО паскале они будут действовать???
                                                                                                  Если изменить
                                                                                                  Result :=
                                                                                                  на
                                                                                                  FunctionName :=
                                                                                                  то да. Изменения, как видишь, минимальные.
                                                                                                    Цитата Prutvel @
                                                                                                    в ТУРБО паскале они будут действовать???

                                                                                                    Большая часть из того, что здесь написана будет работать и в Турбо Паскале (когда исправишь ошибки, на которые тебе уже указали и на которые указывает компилятор, разумеется). Но если тебе надо Турбо - ты так и говори, а то мечешься, как... <самоцензура>, то ей Лазарус, потом FPC, теперь TP подавай... На кой черт в Лазарусе, скажем, рисовать это все в ручную, кто-нибудь объяснит мне? Компонента Chart что, не существует? Добавить несколько линий с определенным периодом - вот тебе и график функции. Ты для себя сначала реши, что тебе надо, запутать всех постоянным изменением компиляторов, или выбрать что-то дно, и написать, наконец, работоспособный код... А то развели флуда на 50 сообщений. "Это правильно? А это - правильно?" Программа может быть признана правильной только тогда, когда она компилируется, запускается и делает то, что от нее требуется. Твоя программа не прошла ни один из этапов.

                                                                                                    А если прошла - то покажи в нормальном виде : заархивируй и прикрепи архив к сообщению (специально добавили кнопку "Обзор" прямо в форму быстрого ответа) тот код, который у тебя компилируется, а не тот бред, который ты пишешь постоянно - то лишние буквы, то повторяющиеся идентификаторы, то вообще запрещенные символы в исходнике. Чтоб БЕЗ ИЗМЕНЕНИЙ (открыл присоединенный файл, нажал F9. Я больше ничего делать не хочу. Это твое задание, ты его и решай, я могу только посмотреть, правильно ли оно работает) он прошел хотя бы этап компиляции и программа хоть как-то запустилась. Потом будем продолжать. Не скомпилировался? Извини, здесь не онлайн Pascal Compiler, тебе программа пишет где ошибка - будь добра разобраться, что не так, и исправить. А пока нет такого кода - говорить больше не о чем.
                                                                                                      вот этот компилируется в турбо:

                                                                                                      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.
                                                                                                        вот программа. Она почти работает. Но компиллятор выводит сразу 4 ошибки на одно выражение - function PixelCoordT(t: Double): Integer; что делать?)
                                                                                                        Прикреплённый файлПрикреплённый файлплавл_вариант.rar (0.7 Кбайт, скачиваний: 167)
                                                                                                          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
                                                                                                            Prutvel
                                                                                                            Извините, но Вы совершенно НЕ читаете того, что Вам пишут. Еще раз перечитайте посты Romtek'a и volvo877.
                                                                                                            Внимательно!
                                                                                                            Ну, не будет работать Ваш код, "отрисовывающий графику". Нигде. Ни в Лазарусе, ни в FP, ни в TP.
                                                                                                              Цитата Prutvel @
                                                                                                              Она почти работает.


                                                                                                              хоть немного код структурируйте
                                                                                                              ExpandedWrap disabled
                                                                                                                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?

                                                                                                              Вас уже просили привести полный код - этот обрезок

                                                                                                              Цитата Оззя @
                                                                                                              не будет работать
                                                                                                                ну помогите!!! пожалуйста, кто-нибудь, напишите работоспособный код. Я уже третью неделю и днем и ночью сижу :'( уже всю тетрадь исписала. помогите, пожалуйста!!!!! :'(
                                                                                                                  Прочти заново предыдущую страницу темы и попытайся написать сама, добавляя функциональность по малу.
                                                                                                                  Суп ведь также варится, поочерёдно добавляя продукты.
                                                                                                                    вы мне сказали, что через trunc надо функцию задавать. Паскаль не строит такой график - выводит координатную ось, и фиолетовый экран :wall: :wall: ПОМОГИТЕ!!!!!
                                                                                                                      Цитата
                                                                                                                      выводит координатную ось, и фиолетовый экран

                                                                                                                      Кто выводит? Где выводит?
                                                                                                                      :blink:
                                                                                                                      Предыдущая Ваша программа не должна НИЧЕГО выводить. В принципе. А новой версии Вы не предоставляете. <_<
                                                                                                                      А уроки телепатии я в школе прогуливал. :blink:
                                                                                                                        Спасибо большое ВСЕМ, кто принял участие в моем вопросе! График тока вроде бы получился. Не могли бы вы подсказать, как точки этого графика перекинуть в эксель?
                                                                                                                          Да и еще - если не затруднит, подскажите, пожалуйста, как лучше дифференцирование в паскале сделать: надо напряжение через ток найти:

                                                                                                                          U=L*(dI/dt)

                                                                                                                          я вот думала по точкам, а как их задавать-то - то есть прямо массив делать типа
                                                                                                                          for k:=1 to N do

                                                                                                                          U(k):=L*I(t(k)-I(t(k)-dt)/dt)

                                                                                                                          как это правильно сделать?)
                                                                                                                            хочется все же узнать под каким компилятором заработало?
                                                                                                                            Цитата Prutvel @
                                                                                                                            как точки этого графика перекинуть в эксель

                                                                                                                            сохранить в текстовый файл с разделителями .CSV
                                                                                                                            или курить Ole Automation сервер Excel

                                                                                                                            во втором случае лучше юзать Free Pascal
                                                                                                                              Цитата Prutvel @
                                                                                                                              дифференцирование в паскале сделать

                                                                                                                              Неотёсанные топики (сообщение #569392)
                                                                                                                                Спасибо!
                                                                                                                                  Цитата Light13 @
                                                                                                                                  хочется все же узнать под каким компилятором заработало?

                                                                                                                                  заработало в турбо паскале...А если я построила график, а через массив как-то можно вывести эти точки в эксель?)
                                                                                                                                    Цитата Prutvel @
                                                                                                                                    через массив как-то можно вывести эти точки в эксель?)

                                                                                                                                    Можно, в посте 61 упомянут формат CSV

                                                                                                                                    Почитай Википедию

                                                                                                                                    Пишешь данные согласно форматы, сохраняешь файл с расширением - CSV
                                                                                                                                      спасибо. ;)
                                                                                                                                        не могли бы вы подсказать еще одну вещь - как из паскаля картинку распечатывать? Когда нажимаем ctrl+F9 видим график, а принт скрином он не берется?)
                                                                                                                                          А Вы не могли бы перестать тему превращать в мусорку? Изначально речь была про 32-битные компиляторы, теперь оказалось что это 16-бит. Ладно... Потом понадобилось дифференцирование (в FAQ-е самой посмотреть нельзя, правда? Удобнее, когда за тебя ссылку найдут)... Теперь оказывается, надо еще и скриншот снять.

                                                                                                                                          В общем, вот ссылка: Скриншот проги (сообщение #1604071)
                                                                                                                                          Там рассказано, как и что делать.

                                                                                                                                          А эту тему я закрываю... Не закрою сейчас - через неделю здесь будет еще в 2 раза больше постов.
                                                                                                                                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                                                                                          0 пользователей:


                                                                                                                                          Рейтинг@Mail.ru
                                                                                                                                          [ Script execution time: 0,1369 ]   [ 15 queries used ]   [ Generated: 17.07.25, 22:53 GMT ]