Rambler's Top100Astronet    
  po tekstam   po klyuchevym slovam   v glossarii   po saitam   perevod   po katalogu
 

Na pervuyu stranicu << 2. Programmnoe obespechenie katalogov | Oglavlenie | 4. Postroenie raspredeleniya zvezd >>

Razdely


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.

Ris. 3.2. Ustanovlennye flagi pri sohranenii vyborki 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.


Ris. 3.4. Rezul'tat raboty programmy TestHip.

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.


Ris. 3.5. Raspredelenie zvezd Hipparcos po absolyutnoi zvezdnoi velichine.

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.


Ris. 3.6. Rezul'tat raboty programmy Aver.



<< 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 >>

Ocenka: 3.0 [golosov: 99]
 
O reitinge
Versiya dlya pechati Raspechatat'

Astrometriya - Astronomicheskie instrumenty - Astronomicheskoe obrazovanie - Astrofizika - Istoriya astronomii - Kosmonavtika, issledovanie kosmosa - Lyubitel'skaya astronomiya - Planety i Solnechnaya sistema - Solnce


Astronet | Nauchnaya set' | GAISh MGU | Poisk po MGU | O proekte | Avtoram

Kommentarii, voprosy? Pishite: info@astronet.ru ili syuda

Rambler's Top100 Yandeks citirovaniya