<< 2. Programmnoe obespechenie katalogov | Oglavlenie | 4. Postroenie raspredeleniya zvezd >>
Razdely
- 3.1. Chtenie polnoi versii kataloga
- 3.2. Postanovka zadachi
- 3.3. Ispol'zovanie sobstvennyh kriteriev otbora zvezd
- 3.4. Ispol'zovanie nomerov zvezd, sgenerirovannyh programmoi Celestia, v pol'zovatel'skih programmah
3. Rabota s ASCII versiei kataloga Hipparcos
3.1. Chtenie polnoi versii kataloga
Nesmotrya na bol'shie vozmozhnosti programmy Celestia 2000, sushestvuet bol'shoe chislo zadach, kotorye ne mogut byt' resheny s ee pomosh'yu. Naprimer, sbor razlichnyh statisticheskih harakteristik: raspredelenie po rasstoyaniyam, absolyutnoi zvezdnoi velichine i t. p.; postroenie diagrammy Gercshprunga-Ressela dlya razlichnyh vyborok zvezd; izuchenie raspredeleniya zvezd v prostranstve i raznoobraznye zvezdno-kinematicheskie issledovaniya. Dlya provedeniya takogo roda issledovanii pridetsya pribegnut' k programmirovaniyu na universal'nyh yazykah vysokogo urovnya (C/C++, Fortran, Pascal/Delphi i t. p.) s ispol'zovaniem polnyh versii katalogov.
Polnaya elektronnaya versiya katalogov vklyuchaet 6 kompakt-diskov. Glavnyi iz nih - pervyi, on soderzhit sobstvenno katalogi Hipparcos i Tycho ob'emom 53 i 373 Mbait sootvetstvenno. Ostal'nye kompakt-diski soderzhat informaciyu o dvoinyh i kratnyh zvezdah, krivye bleska peremennyh zvezd, fotometricheskie prilozheniya k Hipparcos i Tycho, vremena prohozhdeniya zvezd cherez reshetku apparata, a takzhe polnuyu dokumentaciyu. Eti diski postupili v biblioteku Astronomicheskogo instituta SPbGU, tak kak sotrudniki instituta prinimali uchastie v rabote nad proektom Hipparcos, i kopii ih dostupny vsem zhelayushim. Podrobno soderzhanie etih diskov izlozheno v [The Hipparcos/Tycho ASCII CDROMs and Access Software (H. Schrijver)].
Vmesto polnyh versii katalogov v kachestve ishodnyh dannyh programmy mogut figurirovat' i tekstovye faily, sozdavaemye programmoi Celestia 2000. Odnako etot put', veroyatno, ne ochen' udoben, poskol'ku format vyhodnyh failov Celestia zavisit ot polei, kotorye vyberet pol'zovatel', krome togo, pri provedenii bol'shogo chisla razlichnyh eksperimentov diskovaya sistema komp'yutera budet bystro zapolnena dostatochno bol'shimi failami s dannymi.
Mozhno predlozhit' kompromiss - v kachestve osnovnogo istochnika dannyh vse-taki ispol'zovat' polnuyu versiyu Hipparcos s pervogo ASCII CD-ROM (ee bez truda mozhno perenesti na lokal'nyi disk komp'yutera dlya bolee bystrogo dostupa), a dlya vybora zvezd, udovletvoryayushih kakomu-libo kriteriyu, ispol'zovat' fail s nomerami zvezd, sformirovannyi programmoi Celestia, kotoryi ves'ma kompakten po razmeru. S pomosh'yu programmy, napisannoi na lyubom yazyke vysokogo urovnya, kazhdyi pol'zovatel' smozhet sam vybrat' neobhodimye emu polya iz osnovnogo kataloga Hipparcos. Interpretaciya polnoi versii kataloga ne slozhnee, chem sintaksicheskii razbor failov, formiruemyh programmoi Celestia. Na nash vzglyad, samaya bol'shaya slozhnost' pri takom analize - uchet pustyh polei v zapisi zvezdy (v sluchae otsutstviya dannyh v pole pomeshayutsya probely - ris. 3.1), chto delaet nevozmozhnym pryamoe primenenie operatorov formatnogo vvoda, kotorye est' prakticheski v lyubom yazyke programmirovaniya, poskol'ku eto mozhet privesti k iskazhennym rezul'tatam (naprimer, v yazyke Fortran pole, sostoyashee celikom iz probelov, mozhet ponimat'sya kak imeyushee nulevoe znachenie). Nam sleduet dlya kazhdogo (ili pochti kazhdogo) polya zadat' kakoi-libo sposob, kotoryi pozvolil by ponyat', imeyutsya li v kataloge dannye dlya nego ili net.
3.2. Postanovka zadachi
Napishem programmnyi modul' (podprogrammu), chitayushuyu iz osnovnogo kataloga Hipparcos tol'ko te polya, kotorye naibolee chasto ispol'zuyutsya v zvezdno-kinematicheskih issledovaniyah (tabl. 3.1), i tol'ko dlya teh nomerov zvezd, kotorye hranyatsya v faile, sgenerirovannom programmoi Celestia 2000 pri ukazanii tol'ko pervogo flaga dlya sohranyaemoi informacii (ris. 3.2).
Ris. 3.1. Fragment polnoi versii kataloga Hipparcos. Obratite vnimanie na pustye polya u nekotoryh zvezd.
Fail nomerov zvezd (ris. 3.3) predvaryaetsya neskol'kimi strokami sluzhebnoi informacii, a dalee idut sobstvenno dannye v tri kolonki:
H0 - katalog H ili T;
H1 - nomer po Hipparcos;
H2 - Proximity flag - est' li blizhe 10? drugie ob'ekty.
Ris. 3.3. Fail nomerov zvezd, udovletvoryayushih zadannomu kriteriyu, sformirovannyi programmoi Celestia 2000.
Hranit' prochitannye iz polnoi versii kataloga Hipparcos dannye o zvezde my budem v strukture. Takoi sposob organizacii dannyh est' vo vseh sovremennyh yazykah programmirovaniya (vklyuchaya Fortran-77, 90). Eto pozvolit manipulirovat' prochitannoi zapis'yu o zvezde kak edinym celym. Dlya ucheta pustyh polei primenim standartnyi podhod - bitovuyu masku - celochislennuyu peremennuyu, ustanovka otdel'nyh bitov kotoroi oboznachaet nalichie teh ili inyh dannyh. S pomosh'yu logicheskoi operacii AND i nabora konstant budet legko osushestvit' kontrol' prochitannoi informacii. Zabegaya vpered, skazhem, chto "polnocennyh" zvezd, dlya kotoryh zapolneno bol'shinstvo polei v Hipparcos - 117955, dlya 263 zvezd net tochnoi astrometricheskoi informacii (sobstvennyh dvizhenii, parallaksa) i mnogih drugih parametrov. Eto v osnovnom slabye zvezdy, ispol'zovavshiesya dlya privyazki kataloga k sisteme kvazarov.
Osnovnoe izlozhenie provedem na yazyke Pascal, kak naibolee abstraktnom algoritmicheskom yazyke. V Prilozheniyah D i E dany teksty na yazykah Fortran-90 i ANSI C.
Rassmotrim ustroistvo modulya, realizuyushego proceduru chteniya polnoi versii kataloga Hipparcos (listing 3.1).
V nachale modulya opredeleny konstanty, opredelyayushie mestopolozhenie kataloga i
kolichestvo zvezd v nem. Dalee idut bitovye konstanty, kotorye budut
ispol'zovat'sya v uslovnyh operatorah dlya vyyasneniya nalichiya ili otsutstviya
dannyh o tochnyh koordinatah, zvezdnoi velichine, sobstvennyh dvizheniyah. Nizhe
privoditsya opisanie struktury (v terminah Pascal - zapisi) THipparcos. Ee
polya: nomer zvezdy, koordinaty, parallaks, sobstvennye dvizheniya, flag dlya
kratnyh sistem, zvezdnaya velichina i pokazatel' cveta, dannye o spektral'nom
klasse, a takzhe podstruktura sigma, soderzhashaya znacheniya oshibok
sootvetstvuyushih velichin. Pole info - celochislennaya peremennaya, ustanovka
otdel'nyh bitov kotoroi svidetel'stvuet ob otsutstvii v zapisi u zvezdy
opredelennyh dannyh.
Modul' eksportiruet tri funkcii: OpenHipparcosMain otkryvaet katalog,
CloseHipparcosMain zakryvaet, ReadHipparosName chitaet odnu zapis' iz
kataloga, zapolnyaya strukturu tipa THipparcos.
Izuchim ustroistvo funkcii ReadHipparcosMain. Funkciya vozvrashaet True v
sluchae uspeshnogo chteniya i False pri dostizhenii konca faila. Takoi sposob
pozvolyaet ispol'zovat' ee neposredstvenno v uslovii operatora cikla While.
Operator read schityvaet odnu zapis' kataloga (vklyuchaya simvoly konca stroki)
v bufer hs.
Osnovnaya chast' teksta sostoit iz operatorov, interpretiruyushih otdel'nye
kolonki v zapisi zvezdy. Rassmotrim podrobnee eti fragmenty koda na primere
chteniya zvezdnoi velichiny.
Val(StrLCopy(st,@hs[42],5),VMag,code);
if code<>0 then info :=
info or NoVMag;
V dannom primere funkciya StrLCopy kopiruet v bufer st 5 baitov, nachinaya s
42-go baita stroki hs. Funkciya vozvrashaet rezul'tat - adres pervogo
parametra, poetomu ona mozhet ispol'zovat'sya v kachestve argumenta funkcii
Val, kotoraya preobrazovyvaet tekst v svoem pervom argumente v chislovoe
znachenie peremennoi, kotoraya zadaetsya vtorym parametrom. Tretii parametr -
kod oshibki konvertacii. On ravnyaetsya nulyu v sluchae otsutstviya oshibok i
otlichen ot nulya, esli perevod simvol'noi stroki v chislovoe znachenie
nevozmozhen. V poslednem sluchae my s pomosh'yu logicheskoi operacii or
ustanavlivaem sootvetstvuyushii bit v pole info.
Listing 3.1. Modul' chteniya kataloga Hipparcos
Unit HipMain; { Chtenie
kataloga Hipparcos }
Interface { Interfeisnaya chast'
modulya }
{ Raspolozhenie polnoi versii kataloga Hipparcos
}
Const HipparcosName = 'D:/CATALOGS/HIPARCOS/hip_main.dat';
HipNumOfStars = 118218;
{ Bitovye konstanty flaga o nalichii
informacii }
Const NoRaDe = 1; { Net dannyh
o tochnyh koordinatah }
NoPlx = 2; { Net dannyh o parallakse
}
Nopm = 4; { Net dannyh o sobstvennyh
dvizheniyah }
NoVMag = 8; { Net dannyh o zvezdnoi
velichine }
NoB_V = 16; { Net dannyh o pokazatele
cveta }
Type THipparcos=record
{ Identifikatory }
HIP : longint; {
Nomer zvezdy po Hipparcos }
{ Astrometricheskaya informaciya }
RAdeg,DEdeg : double; {
Ekvatorial'nye koordinaty v gradusah }
Plx : double; {
Trigonometricheskii parallaks v mas }
pmRa,pmDE : double; {
Sobstv. dvizh. ma*cos(d) i md mas/god }
AstroRef : char; {
Flag dlya kratnyh sistem }
{ Fotometricheskaya infomaciya }
VMag : single; {
Zvezdnaya vel. po shkale Dzhonsona }
B_V : single; {
Pokazatel' cveta B-V po shkale Dzhonsona }
sigma : record {
oshibki sootv. velichin }
RAdeg,DEdeg : double;
Plx : double;
pmRa,pmDE : double;
end;
Sp : array [0..9] of
char; { Razvernutyi
spektral'nyi klass }
Info : integer; {
Bitovyi flag otsutstviya informacii }
end;
Procedure OpenHipparcosMain; {
Otkrytie faila kataloga }
Procedure CloseHipparcosMain; {
Zakrytie faila kataloga }
{ Chtenie odnoi strochki kataloga:Rezul'tat pomeshaetsya v s,
vozvrashaet false pri dostizhenii konca faila }
Function
ReadHipparcosMain(var s :
THipparcos):boolean;
Implementation { Ispolnitel'naya chast' modulya
}
Uses Strings;
Type
THipStr=array[1..452] of
char; { Tip strochki
kataloga }
Var f : file of
THipStr; { Failovaya peremennaya kataloga }
{ Otkrytie faila kataloga v rezhime "tol'ko
chtenie" }
Procedure OpenHipparcosMain;
begin
FileMode:=0; { Read only }
assign(f,HipparcosName);
reset(f);
end;
{ Zakrytie faila kataloga }
Procedure CloseHipparcosMain;
begin
close(f);
end;
{ Chtenie odnoi zapisi }
Function
ReadHipparcosMain(var s :
THipparcos):boolean;
{ Lokal'nye peremennye funkcii }
var hs : THipStr; { Strochka
kataloga }
st : array [0..15]
ofchar; {
vspomogatel'nyi bufer }
code : integer; { kod
oshibki pri preobrazovanii v chislo }
i : integer; {
vspomogatel'naya peremennaya }
begin
{ Esli dostignut konec faila, to vozvrashaem
False }
ifeof(f)
then
ReadHipparcosMain:=falseelse
begin
ReadHipparcosMain:=true; {
Rezul'tat funkcii - true }
read(f,hs); { Chtenie odnoi
strochki kataloga }
with s do {
Operacii s polyami struktury s }
begin
info:=0; { Obnulenie vseh bitov flaga
}
{ + Operaciya @ oboznachaet adres.
+ Procedura Val preobrazuet tekstovuyu stroku v chislo,
code otlichaetsya ot nulya v sluchae oshibki preobrazovaniya.
+ Funkciya StrLCopy kopiruet podstroku s ukazaniem
startovoi pozicii i kolichestva bait. }
{ Interpretaciya 12 bait, nachinaya s 3-go - eto nomer HIP. }
Val(StrLCopy(st,@hs[3],12),hip,code);
{ Chtenie koordinat: po 12 bait s 52 i s 65
pozicii. }
Val(StrLCopy(st,@hs[52],12),RAdeg,code);
if code<>0 then info :=
NoRaDe;
Val(StrLCopy(st,@hs[65],12),DEdeg,code);
if code<>0 then info :=
NoRaDe;
{ Chtenie parallaksa - 7 bait s 80-i
pozicii }
Val(StrLCopy(st,@hs[80],7),Plx,code);
if code<>0 then info :=
info or NoPlx;
{ Chteniesobstvennyh
dvizhenii: po 8 bait s 88 i s 97 pozicii }
Val(StrLCopy(st,@hs[88],8),pmRA,code);
if code<>0 then info :=
info or Nopm;
Val(StrLCopy(st,@hs[97],8),pmDE,code);
if code<>0 then info :=
info or Nopm;
s.AstroRef:=hs[78]; { Flag kratnoi zvezdy }
{ Chtenie zv.velichiny i pokazatelya cveta B-V po
shkale Dzhonsona }
Val(StrLCopy(st,@hs[42],5),VMag,code);
if code<>0 then info :=
info or NoVMag;
Val(StrLCopy(st,@hs[246],6),B_V,code);
if code<>0 then info :=
info or NoB_V;
{ Chtenie oshibok sootv. velichin }
with sigma dobegin
if (info and NoRADE) = 0 then
begin
{ Dannye ob oshibkah vsegda
prisutstvuyut, }
{ esli prisutstvuyut i sami koordinaty.
}
Val(StrLCopy(st,@hs[106],6),RAdeg,code);
Val(StrLCopy(st,@hs[113],6),DEdeg,code);
end;
if (info and NoPlx) = 0
then
begin
Val(StrLCopy(st,@hs[120],6),Plx ,code);
end;
if (info and Nopm) = 0
then
begin
Val(StrLCopy(st,@hs[127],6),pmRA,code);
Val(StrLCopy(st,@hs[134],6),pmDE,code);
end;
end; { with sigma }
{ Chtenie dannyh o spektral'nom klasse
}
for i:=0 to 9
do Sp[i]:=hs[436+i];
end; { with s }
end; { if eof(f)
}
end; { Function
}
end.
Funkciya ReadHipparcosMain chitaet daleko ne vse polya kataloga, odnako net nikakih trudnostei v dopolnenii zapisi THipparcos drugimi polyami i po privedennomu obrazcu prochitat' ih znacheniya iz tekstovogo bufera hs.
Listing 3.2 predstavlyaet primer ispol'zovaniya dannogo modulya. Programma TestHip podschityvaet: skol'ko zvezd v kataloge Hipparcos ne imeyut dannyh o tochnyh koordinatah, sobstvennyh dvizheniyah i parallaksah. Na ris. 3.4 mozhno videt' rezul'taty.
Listing 3.2. Podschet zvezd bez dannyh o koordinatah, sobstvennyh dvizheniyah i parallaksah
Program TestHip;
Uses HipMain; { Podklyuchenie
modulya raboty s katalogom }
var s : THipparcos; {
Struktura dannyh o zvezde }
NoCoord : longint; {Schetchik zvezd bez tochnyh
koordinat }
NoProp : longint; {Schetchik zvezd bez sobstv.
dvizhenii }
NoPar : longint; {Schetchik zvezd bez parallaksov
}
begin
NoCoord:=0; NoProp:=0; NoPar:=0; { Obnulenie
schetchikov }
OpenHipparcosMain; { Otkrytie kataloga
}
while ReadHipparcosMain(s) do {
Cikl chteniya kataloga }
begin
{ Sravnenie bitov v maske s
konstantami }
if (s.info and
NoRADE)<>0 then inc(NoCoord);
if (s.info and Nopm)
<>0 then inc(NoProp);
if (s.info and NoPlx)
<>0 then inc(NoPar);
end;
CloseHipparcosMain; { Zakrytie kataloga }
{ Vyvod rezul'tatov }
writeln('Zvezd bez tochnyh koordinat ',NoCoord);
writeln('Zvezd bez sobstvennyh dvizhenii ',NoProp);
writeln('Zvezd bez parallaksov ', NoPar);
end.
Kak my vidim, zvezd bez tochnyh astrometricheskih dannyh - 263. Putem nebol'shogo uslozhneniya programmy (sdelaite samostoyatel'no) mozhno pokazat', chto esli u zvezdy net dannyh o tochnyh koordinatah, to net dannyh ni o parallakse, ni o sobstvennyh dvizheniyah.
3.3. Ispol'zovanie sobstvennyh kriteriev otbora zvezd
Neslozhnye kriterii otbora zvezd legko mozhno realizovat' samostoyatel'no v programme, ne pribegaya k pomoshi Celestia. Naprimer, napishem programmu, kotoraya postroila by raspredelenie zvezd Hipparcos po absolyutnoi zvezdnoi velichine s shagom v odnu velichinu dlya zvezd, otnositel'naya tochnost' opredeleniya parallaksov kotoryh luchshe, chem 50% (sleduet otmetit', chto dazhe otbor zvezd po takomu kriteriyu ne vozmozhen v Celestia).
Programma na listinge 3.3 reshaet postavlennuyu zadachu.
Listing 3.3. Vychislenie raspredeleniya zvezd po absolyutnoi
zvezdnoi velichine
Program AbsMagDistrib;
Uses HipMain;
{ Realizaciya funkcii vychisleniya desyatichnogo
logarifma }
function log(x:double):double;
begin
log:=ln(x)/ln(10.0);
end;
var s : THipparcos;
a : array [-12..+12] of
longint; {
statistika }
i : integer; {
vspomogatel'nayaperemennaya }
r : double; {
rasstoyanie }
m : double; {
absolyutnayazvezdnayavelichina }
begin
for i:=low(a) to
high(a) do a[i]:=0;
{obnuleniestatistiki
}
OpenHipparcosMain;
while ReadHipparcosMain(s) do
begin
if (s.info and
NoPlx)<>0 thencontinue;{net dannyh o
parall.}
if s.plx<=0.0 thencontinue; { nepolozhitel'nyi
parallaks }
if s.sigma.plx/s.plx>0.5
thencontinue;
{tochnost' huzhe 50%}
r:=1000.0/s.plx; { Vychislenie rasstoyaniya v
pk }
m:=S.VMag-5.0*log(r)+5.0; {Vychisl. absolyutnoi
zvezd. velichiny }
i:=round(m); { Opredelenie indeksa yacheiki
massiva }
if (i>=low(a)) and
(i<=high(a)) then
inc(a[i]);{uv.na 1}
end;
CloseHipparcosMain;
for i:=low(a) to
high(a) do writeln(i:3,a[i]:7);
end.
Razberem strukturu programmy. Massiv sluzhit dlya nakopleniya statistiki raspredeleniya zvezd po absolyutnym zvezdnym velichinam. Element s indeksom soderzhit kolichestvo zvezd, popadayushih v diapazon zvezdnyh velichin ot - 0.5 do + 0.5. Naprimer, element s indeksom -3 soderzhit kolichestvo zvezd, u kotoryh zvezdnaya velichina v diapazone ot -3.5 do -2.5.
V cikle chteniya zvezd snachala my otbrasyvaem zvezdy, u kotoryh net dannyh o parallakse (operator continue privodit k propusku ostavshihsya operatorov tela cikla i nachinaet sleduyushuyu iteraciyu). Sleduyushii uslovnyi operator otbrasyvaet zvezdy s otricatel'nym i nulevym znacheniem parallaksa. Takih zvezd otnositel'no nemnogo - 4245, nepolozhitel'noe znachenie parallaksa svidetel'stvuet o tom, chto oshibka opredeleniya parallaksa okazalas' bol'she samoi velichiny, a reshenie dlya konkretnoi zvezdy dalo formal'noe znachenie velichiny.
Tretii uslovnyi operator propuskaet zvezdy, dlya kotoryh otnositel'naya tochnost' opredeleniya parallaksa okazalas' huzhe, chem 0.5 (50%).
Sleduyushie dva operatora vychislyayut rasstoyanie i absolyutnuyu zvezdnuyu velichinu.
Sleduyushaya stroka soderzhit operator, opredelyayushii indeks elementa massiva [], v kotoryi "popadaet" zvezda. Eto delaetsya s pomosh'yu vstroennoi funkcii okrugleniya veshestvennogo chisla do blizhaishego celogo round. Esli indeks nahoditsya v dopustimom diapazone, to sootvetstvuyushii element massiva uvelichivaetsya na edinicu operatorom inc.
Posle zaversheniya cikla chteniya kataloga v elementah massiva budet hranit'sya raspredelenie zvezd Hipparcos po absolyutnym zvezdnym velichinam. V cikle for rezul'taty vyvodyatsya na ekran (ili po zhelaniyu v fail). Eti dannye mogut byt' obrabotany drugimi programmami, naprimer, elektronnoi tablicei MS Excel v Windows ili OO Spread v Linux. Diagramma, poluchennaya takim sposobom, predstavlena na ris. 3.5.
3.4. Ispol'zovanie nomerov zvezd, sgenerirovannyh programmoi Celestia, v pol'zovatel'skih programmah
Postavim takuyu zadachu: "uznat' srednyuyu absolyutnuyu zvezdnuyu velichinu zvezd, klass svetimosti kotoryh ot Ia0-a do Ib".
S pomosh'yu programmy Celestia naidem nomera zvezd, udovletvoryayushih takomu kriteriyu, sformiruem vyborku (sample) i vyvedem ee v tekstovyi fail, otmetiv tol'ko pervyi flag v dialoge, izobrazhennomu na ris. 3.2. Nazovem formiruemyi fail lumin.txt. Nado skazat' chto, ispol'zuya tol'ko polnuyu versiyu kataloga Hipparcos, bez Celestia, etu zadachu reshit' nevozmozhno.
Sleduyushaya programma opredelit srednyuyu absolyutnuyu zvezdnuyu velichinu (listing 3.4). V programme poyavlyaetsya tri novyh imeni funkcii: InitCriteria, InCelestia, ClearCriteria. Pervaya iz nih chitaet spisok nomerov zvezd (ris. 3.3), peredannyi cherez edinstvennyi parametr i inicializiruet v pamyati massiv ih nomerov. Funkciya InCelestia proveryaet, nahoditsya li peredavaemyi v kachestve parametra nomer v spiske prochitannyh nomerov. Poslednyaya funkciya ochishaet massiv nomerov. Ee vsegda sleduet ispol'zovat', esli vy hotite opredelit' novyi spisok.
My dobavili tekst etih treh funkcii v modul' HipMain (listing 3.5). Davaite
poznakomimsya s nim.
Funkciya InitCriteria chitaet tekstovyi fail, sformirovannyi programmoi
Celestia i interpretiruet ego soderzhimoe. V tret'ei stroke nahoditsya chislo
zvezd NList, udovletvoryayushih zadannomu v programme Celestia kriteriyu.
Procedura GetMem vydelyaet pamyat' pod massiv List (kotoryi ob'yavlen kak
ssylka) v razmere NList*SizeOf(longint) bait.
Listing 3.4. Vychislenie srednei absolyutnoi zvezdnoi velichiny zvezd, spisok kotoryh nahoditsya v faile lumin.txt
Program Aver;
Uses HipMain;
{ Realizaciya funkcii vychisleniya desyatichnogo
logarifma }
function
log(x:double):double;
begin
log:=ln(x)/ln(10.0);
end;
var s : THipparcos;
r : double; { rasstoyanie }
m : double; { absolyutnaya zvezdnaya
velichina }
mav : double; { srednyaya absolyutnaya zvezdnaya
velichina }
n : longint; { kolichestvo podhodyashih
zvezd }
begin
n:=0; mav:=0;
OpenHipparcosMain;
{ Inicializaciya kriteriya }
writeln(InitCriteria('lumin.txt'),' zvezd v kriterii.');
while ReadHipparcosMain(s) do
begin
if (s.info and NoPlx)<>0
then continue; {net dannyh o
parall.}
if s.plx<=0.0 then
continue; { nepolozhitel'nyi parallaks }
r:=1000.0/s.plx; { Vychislenie rasstoyaniya v
pk }
m:=S.VMag-5.0*log(r)+5.0; { Vychisl. abs. zvezd.
velichiny }
if inCelestia(s.HIP)
then { Zvezda v spiske
Celestia }
begin
mav:=mav+m; { nakoplenie summy abs. zv.
velichin }
inc(n); { summirovanie chisla zvezd
}
end;
end; { while }
ClearCriteria; { Ochistka kriteriya }
CloseHipparcosMain;
mav:=mav/n; { Vychislenie srednego
znacheniya }
writeln('Srednyaya absolyutnaya zvezdnaya velichina ',mav:6:2);
writeln('Obrabotano ',n,' zvezd');
end.
Listing 3.5. Ishodnyi tekst funkcii InitCriteria, InCelestia, ClearCriteria
{ dobavleniya v interfeisnuyu chast' modulya }
{ Inicializaciya kriteriya s ispol'zovaniem
vyhodnogo faila
programmy Celestia 2000. name - imya faila.
Vozvrashaet chislo zvezd v spiske }
Function InitCriteria(name:string):longint;
{ Funkciya proveryaet, est' li zvezda v
spiske }
Function InCelestia(n:longint):boolean;
{ Ochistka kriteriya }
Procedure ClearCriteria;
{ dobavleniya v ispolnitel'nuyu chast' modulya }
{ Maksimal'no vozmozhnoe kolichestvo zvezd v
spiske v 16-razryadnyh
versiyah kompilyatora Pascal, v 32-razryadnyh - neogranichen }
Const MaxList = 16383;
{ Tip spiska zvezd }
Type PList = array [1..MaxList] of longint;
Var List : PList;
{Ukazatel' na nachalo spiska nomerov zvezd}
Const NList : Longint = 0; {
Kolichestvo zvezd v spiske }
{ Inicializaciya kriteriya s ispol'zovaniem
vyhodnogo faila
programmy Celestia 2000. name - imya faila.
Vozvrashaet chislo zvezd v spiske }
Function InitCriteria(name:string):longint;
var t : text; { failovaya
peremennaya }
s : string; { stroka-bufer }
i : longint; { indeks dlya cikla for
}
code : integer; { kod oshibki }
begin
assign(t,name); reset(t); { Otkryvaem
fail }
for i:=1 to 2
do readln(t); { Propusk dvuh
pervyh strok }
readln(t,NList); { V tret'ei stroke - kolichestvo
zvezd }
if NList>MaxList then
begin
writeln('Slishkom mnogo zvezd v spiske'); Halt;
end;
{ Vydelenie pamyati pod spisok }
GetMem(List,NList*SizeOf(longint));
for i:=4 to 12
do readln(t); { Propusk s 4
po 12 stroku }
for i:=1 to NList
do { chtenie s 3-go baita 12
bait nomera }
begin
readln(t,s);
Val(copy(s,3,12),List [i],code);
if code<>0 then
begin
writeln('Oshibka v formate faila. Stroka ',i+12); Halt;
end;
end;
close(t);
InitCriteria:=NList;
end; {Function}
{ Funkciya proveryaet, est' li zvezda v
spiske }
Function InCelestia(n:longint):boolean;
var i : longint;
begin
InCelestia:=False; { ob'ekt poka ne
naiden }
if NList=0 then exit;
{ esli kriterii ne ustanovlen - vyhod }
for i:=1 to NList
do { obhod zvezd v cikle
for }
if List [i]=n then
begin { esli zvezda naidena v
spiske }
InCelestia:=True;
break; { dosrochno prervat' cikl }
end;
end; {Function}
{ Ochistka kriteriya }
Procedure ClearCriteria;
begin
FreeMem(List,NList*SizeOf(longint));
NList:=0;
end; {Function}
Pri ispol'zovanii 16-razryadnoi versii Pascal, naprimer takoi populyarnoi, kak Borland Pascal 7.0, chislo zvezd v spiske, organizovannom v vide massiva, ne mozhet prevyshat' 2-1 (pri 4-baitnyh elementah), dazhe pri ispol'zovanii DPMI rezhima. Dlya preodoleniya etogo ogranicheniya my rekomenduem ispol'zovat' besplatnuyu versiyu Free Pascal 0.9.2 ili bolee pozdnyuyu, dostupnuyu dlya mnogih programmnyh platform, v tom chisle DOS, Windows, Linux, FreeBSD. V etih versiyah kompilyatora ob'em massiva mozhet dostigat' 2 Gbait.
Nachinaya s 13-i stroki, idut nomera zvezd, kotorye zanimayut s 3 po 14 pozicii. My izvlekaem iz nih chislo standartnym sposobom: proceduroi Val, podstroka izvlekaetsya funkciei copy, kotoruyu predpochtitel'nei ispol'zovat' dlya korotkih (<255 simvolov) strok.
Esli vse dannye uspeshno vvedeny, to funkciya InitCriteria vozvrashaet chislo zvezd v spiske.
Algoritm funkcii InCelestia ochen' prost. V cikle for posledovatel'no sravnivayutsya elementy spiska s peredannym znacheniem. V sluchae sovpadeniya cikl preryvaetsya, a funkciya vozvrashaet znachenie True.
Procedura ClearCriteria ochishaet pamyat', vydelennuyu ranee v funkcii InitCriteria, i obnulyaet znachenie peremennoi NList. Pri nulevom znachenii NList funkciya InCelestia nezavisimo ot znacheniya argumenta vozvrashaet False.
Rezul'tat raboty programmy Aver (listing 3.4) pokazan na ris. 3.6. Kak my vidim, tol'ko 754 iz 949 zvezd imeyut priemlemuyu tochnost' parallaksa. Takim obrazom, my imeem vozmozhnost' primenyat' i svoi sobstvennye kriterii k zvezdam, spisok kotoryh sostavlen programmoi Celestia.
<< 2. Programmnoe obespechenie katalogov | Oglavlenie | 4. Postroenie raspredeleniya zvezd >>
Publikacii s klyuchevymi slovami:
astrometriya - katalogi - Hipparcos
Publikacii so slovami: astrometriya - katalogi - Hipparcos | |
Sm. takzhe:
Vse publikacii na tu zhe temu >> |