Рассматриваем движение тела, брошенного под углом к горизонту без начального ускорения. Уравнения движения тела в осях координат известны из физики: Также известна формула для определения времени движения тела до его падения (т.е. возвращения на исходную высоту, которая совпадает с осью X): Считаем, что в начальных условиях задается количество точек, в которых нужно найти значения пути пройденного в осях координат.
uses Crt; const g=9.81; pi=3.14; var alpha,ar,v0,t,x,y,tmax,ht,v0x,v0y:real; n:integer; begin ClrScr; Write('Vvedite alpha, v0: '); Read(alpha,v0); Write('Chislo tochek= '); Read(n); ar:=pi*alpha/180; v0x:=v0*cos(ar); v0y:=v0*sin(ar); tmax:=2*v0*sin(ar)/g; ht:=tmax/n; t:=ht; while t<=tmax do begin x:=v0x*t; y:=v0y*t-g*sqr(t)/2; Writeln('t=',t:6:3,' x=',x:8:3,' y=',y:8:3); t:=t+ht end; ReadKey end.
Общее решение, позволяющее удалять из строк любой "мусор"
// PascalABC.Net 3.0, сборка 1066 procedure CheckString(var s:string; var n:integer); var i:integer; begin i:=Length(s); while i>0 do begin if not(s[i] in ['a'..'z']) then Delete(s,i,1); Dec(i) end; n:=Length(s) end;
var s1,s2:string; i,p,n1,n2:integer; begin Write('Введите первую строку: '); Readln(s1); CheckString(s1,n1); if n1=0 then Writeln('Введенная строка не содержит допустимых символов') else begin Write('Введите вторую строку: '); Readln(s2); CheckString(s2,n2); if n2=0 then Writeln('Введенная строка не содержит допустимых символов') else { теперь обе строки содержат только маленькие латинские буквы } if n1=n2 then begin for i:=1 to n1 do begin p:=Pos(s1[i],s2); if p=0 then Break else Delete(s2,p,1) end; if Length(s2)=0 then Writeln('Решение имеется') else Writeln('Решения нет') end else Writeln('Решения нет'); end end.
Тестовое решение: Введите первую строку: this is my own deal! Введите вторую строку: Тест: *is now=l2ead my sthi? Решение имеется
Также имеется современное решение, которому пока что в школах не учат: // PascalABC.Net 3.0, сборка 1066 begin var s1:=ReadString('Введите первую строку: ').Where(x->x in ['a'..'z']); if s1.Count=0 then Writeln('Введенная строка не содержит допустимых символов') else begin var s2:=ReadString('Введите вторую строку: ').Where(x->x in ['a'..'z']); if s2.Count=0 then Writeln('Введенная строка не содержит допустимых символов') else if s1.Except(s2).Count>0 then Writeln('Решения нет') else Writeln('Решение имеется') end end.
Также известна формула для определения времени движения тела до его падения (т.е. возвращения на исходную высоту, которая совпадает с осью X):
Считаем, что в начальных условиях задается количество точек, в которых нужно найти значения пути пройденного в осях координат.
uses Crt;
const
g=9.81;
pi=3.14;
var
alpha,ar,v0,t,x,y,tmax,ht,v0x,v0y:real;
n:integer;
begin
ClrScr;
Write('Vvedite alpha, v0: ');
Read(alpha,v0);
Write('Chislo tochek= ');
Read(n);
ar:=pi*alpha/180;
v0x:=v0*cos(ar);
v0y:=v0*sin(ar);
tmax:=2*v0*sin(ar)/g;
ht:=tmax/n;
t:=ht;
while t<=tmax do
begin
x:=v0x*t; y:=v0y*t-g*sqr(t)/2;
Writeln('t=',t:6:3,' x=',x:8:3,' y=',y:8:3);
t:=t+ht
end;
ReadKey
end.
Тестовое решение:
Vvedite alpha, v0: 45 126.4
Chislo tochek= 10
t= 1.821 x= 162.864 y= 146.461
t= 3.643 x= 325.728 y= 260.375
t= 5.464 x= 488.592 y= 341.742
t= 7.286 x= 651.456 y= 390.562
t= 9.107 x= 814.320 y= 406.836
t=10.929 x= 977.184 y= 390.562
t=12.750 x=1140.048 y= 341.742
t=14.572 x=1302.912 y= 260.375
t=16.393 x=1465.776 y= 146.461
t=18.215 x=1628.640 y= 0.000
// PascalABC.Net 3.0, сборка 1066
procedure CheckString(var s:string; var n:integer);
var
i:integer;
begin
i:=Length(s);
while i>0 do begin
if not(s[i] in ['a'..'z']) then Delete(s,i,1);
Dec(i)
end;
n:=Length(s)
end;
var
s1,s2:string;
i,p,n1,n2:integer;
begin
Write('Введите первую строку: '); Readln(s1);
CheckString(s1,n1);
if n1=0 then Writeln('Введенная строка не содержит допустимых символов')
else begin
Write('Введите вторую строку: '); Readln(s2);
CheckString(s2,n2);
if n2=0 then Writeln('Введенная строка не содержит допустимых символов')
else
{ теперь обе строки содержат только маленькие латинские буквы }
if n1=n2 then begin
for i:=1 to n1 do begin
p:=Pos(s1[i],s2);
if p=0 then Break
else Delete(s2,p,1)
end;
if Length(s2)=0 then Writeln('Решение имеется')
else Writeln('Решения нет')
end
else
Writeln('Решения нет');
end
end.
Тестовое решение:
Введите первую строку: this is my own deal!
Введите вторую строку: Тест: *is now=l2ead my sthi?
Решение имеется
Также имеется современное решение, которому пока что в школах не учат:
// PascalABC.Net 3.0, сборка 1066
begin
var s1:=ReadString('Введите первую строку: ').Where(x->x in ['a'..'z']);
if s1.Count=0 then
Writeln('Введенная строка не содержит допустимых символов')
else begin
var s2:=ReadString('Введите вторую строку: ').Where(x->x in ['a'..'z']);
if s2.Count=0 then
Writeln('Введенная строка не содержит допустимых символов')
else
if s1.Except(s2).Count>0 then Writeln('Решения нет')
else Writeln('Решение имеется')
end
end.