68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
1

Спутники Юпитера - просьба поругать/подсказать

18.08.2017, 12:48. Показов 1396. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Бодрого дня, господа.
Выкладываю свое позорище для всеобщего порицания/ругания и подсказания (по желанию) правильного решения какой-либо части этого "кода".
Приму любую критику. Заранее спасибо.
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
program jovi;
uses crt, math,sysutils;
type    sp=record
            x:real;
            n:integer;
            end;
const n=4;
var JD,Dd,ms : real;
        A,B,V,M,Nj,Jr,K,Rz,Rj,Xz_j,Psi,L,L_1,L_2,rab,De,Ds,
        u1,u2,u3,u4,G,H,r1,r2,r3,r4,y1,y2,y3,y4 : extended;
        i,j,c:integer;
        s:array[1..4] of sp;
        x:sp;
 
function mysin(x:extended):extended;
begin
    mysin:=sin(degtorad(x));
end;
    
function mycos(x:extended):extended;
begin
    mycos:=cos(degtorad(x));
end;
 
function MyArcSin(x:extended):extended;
begin
    MyArcSin:=radtodeg(arcsin(x));
end;
 
function adj360(deg:extended):extended;
begin
    while(deg<0)or(deg>360) do
        if deg<0 then deg:=deg+360
        else if deg>360 then deg:=deg-360;
    adj360:=deg;
end;
 
procedure julday;
var Y,M,D,H,min,sec,ms:word;
        A,B:real;
begin
    DeCodeDate (Date,Y,M,D);
    write('Сегодня: ',D);
    if M<10 then
        write('.0',M)
    else
        write('.',M);
    writeln(Y);
    DecodeTime(Time,H,min,sec,ms);
    writeln(H,' часов ',min,' минут');
    if M<2 then
        begin
            Y:=Y-1;
            M:=M+12;
        end;
    Dd:=D+(H+(M/60))/24;        // Часы и доли дня
    A:=trunc(Y/100);
    B:=2-A+trunc(A/4);
    JD:=trunc(365.25*Y)+trunc(30.6001*(M+1))+Dd+1720994.5+B;        // Юлианский день
    writeln('Юлианский день: ',JD:0:1);
    JD:=JD-2415020;
end;
 
 
begin
    G:=0;
    H:=0;
    julday;
    writeln('-------------');
    writeln;
    V:=0.00111587*JD+134.63;            // аргумент долгопериодического члена Юпитера
    M:=358.476+0.9856003*JD;            // средняя аномалия Земли
    M:=adj360(M);
    Nj:=225.328+0.0830853*JD+0.33*mysin(V); //средняя аномалия Юпитера
    Nj:=adj360(Nj);
    Jr:=221.647+0.9025179*JD+0.33*mysin(V); // разность средних гелиоцентрических долгот Земли и Юпитера
    A:=1.916*mysin(M)+0.020*mysin(2*M);     // уравнение центра Земли
    B:=5.552*mysin(Nj)+0.167*mysin(2*Nj);       // уравнение центра Юпитера
    K:=Jr+A-B;                                      // определяем угол
    K:=adj360(K);
    Rz:=1.00014-0.01672*mycos(M)-0.00014*mycos(2*M);    // радиус-вектор Земли
    Rj:=5.20867-0.25192*mycos(Nj)-0.00610*mycos(2*Nj);  // радиус-вектор Юпитера
    Xz_j:=sqrt(sqr(Rj)+sqr(Rz)-2*Rj*Rz*mycos(K));   // расстояние от Земли до Юпитера
    Psi:=MyArcSin((Rz/Xz_j)*mysin(K));      // фазовый угол Юпитера
    if K>0 then
        rab:=0-(57.3*sqr(mysin(Psi/2)))
    else
        rab:=57.3*sqr(mysin(Psi/2));
{ Долгота центрального меридиана Юпитера }
    L_1:=268.28+877.8169088*(JD-Xz_j/173)+Psi-B+rab;        // в системе долгот 1
    L_1:=adj360(L_1);
    L_2:=290.28+870.1869088*(JD-Xz_j/173)+Psi-B+rab;        // в системе долгот 2
    L_2:=adj360(L_2);
    L:=238.05+0.083091*JD+0.33*mysin(V)+B;
    L:=adj360(L);
    Ds:=3.07*mysin(L+44.5);
    De:=Ds-2.15*mysin(Psi)*mycos(L+24)-1.31*((Rj-Xz_j)/Xz_j)*mysin(L-99.4);
    rab:=JD-Xz_j/173;
{ угол, отсчитываемый от нижнего соединения спутников с Юпитером }
    u1:=adj360(84.5506+203.4058630*rab+Psi-B);
    u2:=adj360(41.5015+101.2916323*rab+Psi-B);
    u3:=adj360(109.9770+50.2345169*rab+Psi-B);
    u4:=adj360(176.3586+21.4879802*rab+Psi-B);
{ расстояние спутников от центра Юпитера в единицах его экваториального радиуса }
    r1:=5.9061-0.0244*mycos(2*(u1-u2));
    r2:=9.3972-0.0889*mycos(2*(u2-u3));
    r3:=14.9894-0.0227*mycos(G);
    r4:=26.3649-0.1944*mycos(H);
{ рассчитывам и прибавляем поправки }
    G:=adj360(187.3+50.310674*rab);
    H:=adj360(311.1+21.569229*rab);
    u1:=u1+0.472*mysin(2*(u1-u2));
    u2:=u2+1.073*mysin(2*(u2-u3));
    u3:=u3+0.174*mysin(G);
    u4:=u4+0.846*mysin(H);
{ видимые прямоугольные координаты спутников, взятые относительно центра диска
* Юпитера и выраженные в единицах его экваториального радиуса }
    s[1].x:=r1*mysin(u1);
    s[2].x:=r2*mysin(u2);
    s[3].x:=r3*mysin(u3);
    s[4].x:=r4*mysin(u4);
    y1:=0-r1*mycos(u1)*mysin(De);
    y2:=0-r2*mycos(u2)*mysin(De);
    y3:=0-r3*mycos(u3)*mysin(De);
    y4:=0-r4*mycos(u4)*mysin(De);
    writeln('(еэр) - единицы экваториального радиуса Юпитера');
    writeln('+-------------------------------------------------------------------+');
    writeln('|                         |    Ио   |  Европа  | Ганимед | Каллисто |');
    writeln('+-------------------------------------------------------------------+');
    writeln('| Расстояние спутников от |',r1:7:2,'|':3,r2:8:2,'|':3,r3:8:2,'|':2,r4:8:2,'|':3);
    writeln('| центра Юпитера (еэр)    |         |          |         |          |');
    writeln('+-------------------------------------------------------------------+');
    writeln('| Угол  от нижнего соеди- |',u1:7:2,'|':3,u2:8:2,'|':3,u3:8:2,'|':2,u4:8:2,'|':3);
    writeln('| спутников с Юпитером    |         |          |         |          |');
    writeln('+-------------------------------------------------------------------+');   
    writeln('| Видимые  прямоугольные  |',s[1].x:7:2,'|':3,s[2].x:8:2,'|':3,s[3].x:8:2,'|':2,s[4].x:8:2,'|':3);
    writeln('| координаты X (еэр)      |         |          |         |          |');
    writeln('+-------------------------------------------------------------------+');   
    writeln('| Видимые  прямоугольные  |',y1:7:2,'|':3,y2:8:2,'|':3,y3:8:2,'|':2,y4:8:2,'|':3);
    writeln('| координаты Y (еэр)      |         |          |         |          |');
    writeln('+-------------------------------------------------------------------+');   
//-----------------------------------------------------------
{Честно стырено с форума с согласия автора - Puporev'a}
    for i:=1 to n do
        begin
            s[i].n:=i;
        end;
    for i:=1 to n-1 do
for j:=i+1 to n do
if s[i].x>s[j].x then
 begin
  x:=s[i];
  s[i]:=s[j];
  s[j]:=x;
 end;
c:=40;
ms:=40/(s[n].x-s[1].x+1);
for i:=1 to n do
 begin
  gotoXY(c+round(s[i].x*ms),23);
  write(s[i].n);
 end;
writeln;
for i:=1 to n do
 begin
  gotoXY(c+round(s[i].x*ms),24);
  write('*');
 end;
writeln;
gotoXY(c,24);
write('O');
    
    readkey;
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2017, 12:48
Ответы с готовыми решениями:

Как (очень упрощенно) изобразить спутники Юпитера?
Бодрого дня, господа. На досуге для себя лично в качестве тренировки сваял программулинку,...

Просьба подсказать
Ребята у меня есть бизнес идея, которую я хочу продавать. Подскажите как мне обезопасить свой сайт...

Просьба подсказать по ListFragmen
Всем привет, я новичек и активно пытаюсь понять тему с ListFragmen, но есть вопросы,ответы на ...

Просьба подсказать по коду
Помогите с проблемой, ДАНО: 3 Edit' a + Button1 (см. ниже код на Button1) Не работает, подскажите...

15
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
18.08.2017, 13:07 2
Поскольку adj360 выполнена в виде функции, можно сразу использовать по назначению:
Pascal
72
73
    M:=adj360(358.476+0.9856003*JD);            // средняя аномалия Земли
    Nj:=adj360(225.328+0.0830853*JD+0.33*mysin(V)); //средняя аномалия Юпитера
Pascal
79
    K:=adj360(Jr+A-B);                                      // определяем угол
Pascal
90
91
92
    L_1:=adj360(268.28+877.8169088*(JD-Xz_j/173)+Psi-B+rab);        // в системе долгот 1
    L_2:=adj360(290.28+870.1869088*(JD-Xz_j/173)+Psi-B+rab);        // в системе долгот 2
    L:=adj360(238.05+0.083091*JD+0.33*mysin(V)+B);
1
606 / 926 / 149
Регистрация: 10.08.2015
Сообщений: 4,879
18.08.2017, 13:30 3
Тебе же написали, вся тригонометрия считается в радианах... а ты что сделал?
-0.50
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
18.08.2017, 13:50  [ТС] 4
Цитата Сообщение от bormant Посмотреть сообщение
Поскольку adj360 выполнена в виде функции, можно сразу использовать по назначению
Это я чуток прозевал. Исправил у себя а сюда сунул недоподправленную.
Цитата Сообщение от vlisp Посмотреть сообщение
Тебе же написали, вся тригонометрия считается в радианах... а ты что сделал?
Что бы каждый раз не морочиться с переводом градусов в радианы, я сварганил 2-е функции: mysin и mycos.
Вот эти функции:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function mysin(x:extended):extended;
begin
    mysin:=sin(degtorad(x));
end;
    
function mycos(x:extended):extended;
begin
    mycos:=cos(degtorad(x));
end;
 
function MyArcSin(x:extended):extended;
begin
    MyArcSin:=radtodeg(arcsin(x));
end;
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
18.08.2017, 14:20 5
Лучший ответ Сообщение было отмечено lartia как решение

Решение

Для случаев с более узким/широким низким/высоким окном консольки можно чуть поменять вывод схемы расположения:
Pascal
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
  for i:=1 to n do s[i].n:=i;
  for i:=1 to n-1 do
    for j:=i+1 to n do
      if s[i].x>s[j].x then begin
        x:=s[i]; s[i]:=s[j]; s[j]:=x;
      end;
  c:=WindMaxX-WindMinX;
  ms:=c/(s[n].x-s[1].x+1);
  for i:=1 to n do begin
    GotoXY(c+Round(s[i].x*ms),WhereY); Write(s[i].n);
  end;
  WriteLn;
  for i:=1 to n do begin
    GotoXY(c+Round(s[i].x*ms),WhereY); Write('*');
  end;
  GotoXY(c,WhereY); Write('O');
  ReadKey;
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
18.08.2017, 14:28  [ТС] 6
Спасибо.
Мне предыдущий вариант больше понравился - более компактно и нагляднее.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
18.08.2017, 14:37 7
Pascal
12
        s:array[1..n] of sp;
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
18.08.2017, 14:45  [ТС] 8
А
Цитата Сообщение от bormant Посмотреть сообщение
s:array[1..n] of sp;
А смысл? Так, как я написал тоже, ведь можно?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
18.08.2017, 15:01 9
Вывод схемы можно упростить:
Pascal
12
  s: array [0..n] of sp;
Pascal
144
145
146
147
148
149
150
151
152
153
  for i:=0 to n do s[i].n:=i;
  for i:=0 to n-1 do
    for j:=i+1 to n do
      if s[i].x>s[j].x then begin
        x:=s[i]; s[i]:=s[j]; s[j]:=x;
      end;
  ms:=71/(s[n].x-s[0].x+1);
  WriteLn('Схема расположения спутников:');
  Write(s[0].n); for i:=1 to n do Write('':Round((s[i].x-s[i-1].x)*ms),s[i].n);
  WriteLn; Write('Нажмите Enter для завершения...'); ReadLn;
Звёздочки убрал, достаточно номеров; сам Юпитер - 0.
Ширина -- как у таблички.
Crt из uses можно выкинуть.

Добавлено через 9 минут
Цитата Сообщение от lartia Посмотреть сообщение
А смысл? Так, как я написал тоже, ведь можно?
А смысл -- в консистентности:
Pascal
1
2
3
4
5
6
7
8
9
const n=4;
var s: array [1..n] of sp;
...
  for i:=1 to n do s[i].n:=i;
  for i:=1 to n-1 do
    for j:=i+1 to n do
      if s[i].x>s[j].x then begin
        x:=s[i]; s[i]:=s[j]; s[j]:=x;
      end;
Меняем n -- последующий код трогать не надо, он продолжает правильно работать. Правда это не совсем ваш случай :-) (из-за куска ручного вывода и специфичных индивидуальных расчетов).
Тем не менее, иначе не нужно было заводить константу n, раз ей не пользоваться. А если завели, то пользоваться везде, где она должна быть использована по смыслу.

Добавлено через 5 минут
Следующим шагом можно выкинуть adj360 для тех величин, что не выводятся на экран, но кормятся тригонометрическим функциям -- им красота ни к чему, они периодические, что Sin(0), что Sin(360), что Sin(720) -- одинаково.
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
18.08.2017, 15:04  [ТС] 10
Спасибо большое. Но есть некоторые нюансы. Без звездочек не так интересно (правда это вот "рисование" вообще необязательный элемент - просто так захотелось. Да и задачка для обучения).
Про ширину как у таблички - лучше воспринимается, если наоборот меньше (ИМХО).
Про выкидывание crt - в принципе можно. Хотя и есть она не просит.

Константу я забыл выбросить после экспериментов.
Про adj360 - я ее сую по привычке. Некоторые программируемые калькуляторы не "понимают" значения углов больше 360 градусов. Я думал про это.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
18.08.2017, 15:09 11
Pascal
107
108
109
110
111
    r3:=14.9894-0.0227*mycos(G);
    r4:=26.3649-0.1944*mycos(H);
{ рассчитывам и прибавляем поправки }
    G:=adj360(187.3+50.310674*rab);
    H:=adj360(311.1+21.569229*rab);
Ничего, что в 107 и 108 G и H всё еще равны нулю?
Может имелось в виду:
Pascal
107
108
109
110
    G:=adj360(187.3+50.310674*rab);
    H:=adj360(311.1+21.569229*rab);
    r3:=14.9894-0.0227*mycos(G);
    r4:=26.3649-0.1944*mycos(H);
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
18.08.2017, 15:10  [ТС] 12
Хотя про константу - решил по Вашему.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
18.08.2017, 15:16 13
Цитата Сообщение от lartia Посмотреть сообщение
Про ширину как у таблички - лучше воспринимается, если наоборот меньше (ИМХО).
В ответе #9 число в строке 150 позволяет рулить шириной вывода.
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
18.08.2017, 15:25  [ТС] 14
Вот спасибо. А то я думал, что где-то какая-то формула не так записана. Эти G и H надо раньше этих r вычислять.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,833
Записей в блоге: 1
18.08.2017, 15:39 15
Цитата Сообщение от lartia Посмотреть сообщение
Вот спасибо. А то я думал, что где-то какая-то формула не так записана. Эти G и H надо раньше этих r вычислять.
Если б вы непонятно зачем не написали
Pascal
66
67
    G:=0;
    H:=0;
то компилятор указал бы вам:
Код
a.pas(107,31) Warning: Variable "G" does not seem to be initialized
a.pas(108,31) Warning: Variable "H" does not seem to be initialized
Но строками 66 и 67 вы эти предупреждения задавили.
Позволяйте компилятору вам помочь, не зря в него встроены различные диагностики.
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
18.08.2017, 15:45  [ТС] 16
Я и сделал:
Pascal
1
2
G:=0;
H:=0;
т. к. он ругался. Сглупил, каюсь.
0
18.08.2017, 15:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2017, 15:45
Помогаю со студенческими работами здесь

Просьба подсказать ... по администрированию ....
Просьба подсказать ... Наша компания занимается торговлей. Пользуемся ms sql server`om и...

Доработка запроса, просьба подсказать
Здравствуйте уважаемые, имеется запрос выборки из 4х таблиц SELECT trm_out_shift_open.date AS...

Просьба посмотреть формулу, подсказать
Доброго времени суток, есть вот такие задачи: 1. Необходимо указать номер недели и значение...

Просьба подсказать название шрифта Фотошоп
Просьба подсказать название шрифта Фотошоп который на скрине.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru