Построить график для движения нейтронов - Pascal ABC

Формулировка задачи:

Помогите, долго ломаю голову над этой задачей, ничего не получается. Только один момент: препод запрещает использовать константы Зависимость массы тела от его движения определяется уравнением где m0 - масса покоя; c = 298792 км/с - скорость света. Выполнить расчёты и построить графики m = f(v) для движения нейтрона m0 = 1.675∙10-24 г со скоростью v = 50, 100, 150, 200, 250, 260, 270, 280, и 290 тыс. км/с. Указание: множитель 10-24 в программе не записывать. Ответы:
v=50000.000    m=1.698
...            ...
290000.000     6.607

Код к задаче: «Построить график для движения нейтронов - Pascal ABC»

textual
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.
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.

8   голосов, оценка 4.250 из 5


СДЕЛАЙТЕ РЕПОСТ