Onze maan vertoont zogenaamde schijngestalten, wat wil zeggen dat ze zich gedurende haar omloop rond de aarde in verschillende gedaanten laat zien. Dit fenomeen wordt veroorzaakt door het feit dat de maan vanuit een andere richting door de zon wordt bestraald dan de richting waarin ze wordt waargenomen. Hierdoor lijkt het alsof de terminator (de scheidingslijn tussen licht en donker) zich over de oppervlakte van de maan verplaatst, waardoor de maan te zien is als een sikkelvormig of rond lichaam.
De periode waarin de maan rond de aarde draait wordt over het algemeen onderverdeeld in vier maanfasen: nieuwe maan, eerste kwartier, volle maan en laatste kwartier. Als je voor een gegeven datum kunt bepalen hoeveel dagen er zijn verstreken sinds de laatste nieuwe maan, dan kan je de corresponderende maanfase bepalen door te kijken in welke vierde deel van de periode van de maanrotatie dit aantal dagen valt (zie onderstaande figuur).

De maan draait in een baan om de aarde met een periode van p = 29.530588853 dagen. Als we weten dat er een nieuwe maan voorkwam op 6 januari 2000, dan kunnen we op basis van onderstaande formule het aantal dagen sinds de laatste nieuwe maan bepalen. We noteren dit aantal dagen als \(d_n = d_r\!\!\!\mod{p}\).
Hierbij stelt \(d_r\) het aantal dagen voor sinds de referentiedatum van 6 januari 2000. Stel dat we bijvoorbeeld de maanfase willen bepalen voor de datum 21/06/2010. Er zijn op deze datum reeds 3819 dagen verstreken sinds 6 januari 2000, waardoor in dit geval \(d_n = 9.55\). Aangezien de waarde van \(d_n\) in het tweede deel van de vierdelige onderverdeling van de maanperiode valt, correspondeert deze datum dus met de maanfase eerste kwartier.
Schrijf een bash shell script maanfase waaraan twee gehele getallen moeten doorgegeven worden. Deze argumenten stellen respectievelijk het volgnummer van een maand en een jaartal voor. Het script moet naar standaard uitvoer één enkele regel uitschrijven (stdout) waarop de maanfasen voor de verschillende dagen van de maand zijn weergegeven. Hierbij mag verondersteld worden dat elke maand 31 dagen telt. Voorts wordt de maanfase nieuwe maan voorgesteld door @, eerste kwartier door ), volle maan door O en laatste kwartier door (.
Om te berekenen hoeveel dagen zijn verstreken sinds 6 januari 2000, kan het Juliaanse dagnummer jdn gebruikt worden. Voor een gegeven datum dd/mm/jjjj kan dit als volgt berekend worden:
a = (14 - mm) / 12
y = jjjj + 4800 - a
m = 12a - 3 + mm
jdn = dd + (153m + 2) / 5 + 365y + y / 4 - y / 100 + y / 400 - 32045
Alle delingen stellen hierbij gehele delingen (quotiënt) voor. Het dagnummer voor de datum 21/06/2010 is bijvoorbeeld 2455369.
Tip
Als je gebruikmaakt van het commando
bcom te rekenen met reële getallen, dan zal je merken dat het commando$ bc <<< "4 / 3" 1de waarde
1als resultaat teruggeeft. De waarde die je toekent aan debc-variabelescalegeeft aan hoeveel cijfers na de komma het resultaat moet bevatten. Deze waarde moet toegekend worden voor het uitvoeren van de berekening en is standaard ingesteld op nul. Het commando$ bc <<< "scale=2;4 / 3" 1.33zal dus de waarde
1.33teruggeven.
Tip
De GNU-versie van het commando
bckan ook booleaanse expressies evalueren. Het commando$ bc <<< "7 > 3" 1geeft de waarde
1terug. Het commando$ bc <<< "7 < 3" 0geeft de waarde
0terug.
Dit is hoe je het bash shell script maanfase moet kunnen gebruiken.
$ maanfase 6 2010
1O2O3O4O5(6(7(8(9(10(11(12@13@14@15@16@17@18@19)20)21)22)23)24)25)26)27O28O29O30O31O
$ maanfase 6 2009
1)2)3)4)5)6)7)8O9O10O11O12O13O14O15(16(17(18(19(20(21(22(23@24@25@26@27@28@29@30)31)
Hierbij geeft de uitvoer 1O2O3O4O5(6(... bijvoorbeeld aan dat er een volle maan voorkomt op de eerste dag van de maand, en dat de maan zich in het laatste kwartier bevindt op de zesde dag van de maand.