Построить график для движения нейтронов - Pascal ABC
Формулировка задачи:
Решение задачи: «Построить график для движения нейтронов»
uses graphABC; const c=298792;//надеюсь скорость света у всех одна и вводить ее не нужно function f(m0,vi:real ):real; begin f:=m0/sqrt(1-sqr(vi/c)); end; var v,m:array of real; n,i,x0,y0,k:integer; m0,mx,my,max:real; s:string; begin repeat writeln('Введите массу покоя m>0 m0=');//1.675 readln(m0); until m0>0; repeat writeln('Количество значений скорости для расчетов n>3 n=');//9 readln(n); until n>3; setlength(v,n); writeln('Введите ',n,' значений скорости в тыс. км/с в возрастающем порядке'); repeat writeln('v[1]=');//50 readln(v[0]); v[0]:=v[0]*1000;//перевелем в км/с until v[0]>0; for i:=1 to n-1 do begin repeat writeln('v[',i+1,']=');//100,150,200,250,260,270,280,290 readln(v[i]); v[i]:=v[i]*1000; until v[i]>v[i-1]; end; //заполнение таблицы значений setlength(m,n); max:=0; for i:=0 to n-1 do begin m[i]:=f(m0,v[i]); if m[i]>max then max:=m[i]; end; setwindowsize(800,400); centerwindow; clearwindow; x0:=windowwidth div 4;//начало координат y0:=windowheight-50; k:=trunc(v[n-1]/10000);//количество точек на оси Х while k mod 10<>0 do inc(k);//доводим до круглого значения //масштабы по осям mx:=(windowwidth-x0-20)/k;//делим на 30 частей от 0 до правого конца my:=(y0-60)/max;//делим на макс. выше y0 //координатная сетка setfontsize(8);//уменьшим шрифт line(x0,y0,windowwidth,y0);//ось скорости textout(windowwidth-60,y0-20,'V тыс. км/с'); line(x0,y0,x0,0);//ось массы textout(x0+10,5,'Масса'); for i:=0 to k do begin line(x0+round(mx*i),y0+3,x0+round(mx*i),y0-3); textout(x0+round(mx*i),y0+10,inttostr(i*10));//выводим не 1,2,3.., а 10,20,30.. line(x0+3,y0-round(my*i),x0-3,y0-round(my*i)); textout(x0-20,y0-round(my*i)-5,inttostr(i)); end; //график setpencolor(clBlue); setpenwidth(2); circle(x0+round(v[0]*mx/10000),y0-round(m[0]*my),2);//делим значения на 1000 moveto(x0+round(v[0]*mx/10000),y0-round(m[0]*my));//в тыс.км/с и на 10 //что увеличили при выборе масштаба for i:=0 to n-1 do begin setpencolor(clRed); lineto(x0+round(v[i]*mx/10000),y0-round(m[i]*my)); setpencolor(clBlue); circle(x0+round(v[i]*mx/10000),y0-round(m[i]*my),2); end; //построение таблицы setpencolor(clBlack); setpenwidth(1); textout(40,0,'Значения аргумента'); textout(60,20,'и функции'); line(40,50,40,50+(n+1)*18); line(90,50,90,50+(n+1)*18); line(140,50,140,50+(n+1)*18); for i:=0 to n+1 do line(40,50+i*18,140,50+i*18); textout(65,55,'X'); textout(115,55,'Y'); for i:=0 to n-1 do begin str(v[i]:6,s); textout(45,55+18*(i+1),s); str(m[i]:0:3,s); textout(95,55+18*(i+1),s); end; end.
Объяснение кода листинга программы
Этот код написан на языке Pascal ABC и предназначен для построения графика движения нейтронов.
В первой строке используется функция f(m0,vi)
, которая вычисляет скорость нейтрона с учетом скорости света и массы покоя. Значение m0
- это масса покоя нейтрона, которую пользователь должен ввести.
Далее идет цикл repeat
, который продолжается до тех пор, пока введенная масса покоя m0
больше нуля. В каждой итерации цикла пользователю предлагается ввести количество значений скорости для расчетов и вводится массив v
с этими значениями. Затем происходит проверка, что все значения в массиве v
больше нуля. Если это условие не выполняется, то программа повторяется.
После этого происходит заполнение массива m
с помощью функции f(m0,vi)
. Значение max
инициализируется нулем и используется для отслеживания максимального значения скорости, которое встречается в массиве v
. Затем происходит создание окна графического интерфейса и установка его размеров.
Далее идет цикл for
, который повторяется для каждого значения скорости в массиве v
. Внутри цикла происходит построение графика с использованием функций line
и textout
. Оси координат и метки осей настраиваются с помощью функций setfontsize
, line
и textout
.
В конце кода происходит построение таблицы с значениями аргумента и функции, а также вывод значений скорости и массы для каждого нейтрона.