zoukankan      html  css  js  c++  java
  • 利用日期、经纬度求日出日落时间 C语言程序代码(zz)


    先贴在这了,后面应该用得着

    1. #define PI 3.1415926
    2. #include<math.h>
    3. #include<iostream>
    4. using namespace std;
    5. int days_of_month_1[]={31,28,31,30,31,30,31,31,30,31,30,31};
    6. int days_of_month_2[]={31,29,31,30,31,30,31,31,30,31,30,31};
    7. long double h=-0.833;
    8. //定义全局变量
    9. void input_date(int c[]){
    10. int i;
    11. cout<<"Enter the date (form: 2009 03 10):"<<endl;
    12. for(i=0;i<3;i++){
    13. cin>>c[i];
    14. }
    15. }
    16. //输入日期
    17. void input_glat(int c[]){
    18. int i;
    19. cout<<"Enter the degree of latitude(range: 0°- 60°,form: 40 40 40 (means 40°40′40″)):"<<endl;
    20. for(i=0;i<3;i++){
    21. cin>>c[i];
    22. }
    23. }
    24. //输入纬度
    25. void input_glong(int c[]){
    26. int i;
    27. cout<<"Enter the degree of longitude(west is negativ,form: 40 40 40 (means 40°40′40″)):"<<endl;
    28. for(i=0;i<3;i++){
    29. cin>>c[i];
    30. }
    31. }
    32. //输入经度
    33. int leap_year(int year){
    34. if(((year%400==0) || (year%100!=0) && (year%4==0))) return 1;
    35. else return 0;
    36. }
    37. //判断是否为闰年:若为闰年,返回1;若非闰年,返回0
    38. int days(int year, int month, int date){
    39. int i,a=0;
    40. for(i=2000;i<year;i++){
    41. if(leap_year(i)) a=a+366;
    42. else a=a+365;
    43. }
    44. if(leap_year(year)){
    45. for(i=0;i<month-1;i++){
    46. a=a+days_of_month_2[i];
    47. }
    48. }
    49. else {
    50. for(i=0;i<month-1;i++){
    51. a=a+days_of_month_1[i];
    52. }
    53. }
    54. a=a+date;
    55. return a;
    56. }
    57. //求从格林威治时间公元2000年1月1日到计算日天数days
    58. long double t_century(int days, long double UTo){
    59. return ((long double)days+UTo/360)/36525;
    60. }
    61. //求格林威治时间公元2000年1月1日到计算日的世纪数t
    62. long double L_sun(long double t_century){
    63. return (280.460+36000.770*t_century);
    64. }
    65. //求太阳的平黄径
    66. long double G_sun(long double t_century){
    67. return (357.528+35999.050*t_century);
    68. }
    69. //求太阳的平近点角
    70. long double ecliptic_longitude(long double L_sun,long double G_sun){
    71. return (L_sun+1.915*sin(G_sun*PI/180)+0.02*sin(2*G_sun*PI/180));
    72. }
    73. //求黄道经度
    74. long double earth_tilt(long double t_century){
    75. return (23.4393-0.0130*t_century);
    76. }
    77. //求地球倾角
    78. long double sun_deviation(long double earth_tilt, long double ecliptic_longitude){
    79. return (180/PI*asin(sin(PI/180*earth_tilt)*sin(PI/180*ecliptic_longitude)));
    80. }
    81. //求太阳偏差
    82. long double GHA(long double UTo, long double G_sun, long double ecliptic_longitude){
    83. return (UTo-180-1.915*sin(G_sun*PI/180)-0.02*sin(2*G_sun*PI/180)+2.466*sin(2*ecliptic_longitude*PI/180)-0.053*sin(4*ecliptic_longitude*PI/180));
    84. }
    85. //求格林威治时间的太阳时间角GHA
    86. long double e(long double h, long double glat, long double sun_deviation){
    87. return 180/PI*acos((sin(h*PI/180)-sin(glat*PI/180)*sin(sun_deviation*PI/180))/(cos(glat*PI/180)*cos(sun_deviation*PI/180)));
    88. }
    89. //求修正值e
    90. long double UT_rise(long double UTo, long double GHA, long double glong, long double e){
    91. return (UTo-(GHA+glong+e));
    92. }
    93. //求日出时间
    94. long double UT_set(long double UTo, long double GHA, long double glong, long double e){
    95. return (UTo-(GHA+glong-e));
    96. }
    97. //求日落时间
    98. long double result_rise(long double UT, long double UTo, long double glong, long double glat, int year, int month, int date){
    99. long double d;
    100. if(UT>=UTo) d=UT-UTo;
    101. else d=UTo-UT;
    102. if(d>=0.1) {
    103. UTo=UT;
    104. UT=UT_rise(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo))))));
    105. result_rise(UT,UTo,glong,glat,year,month,date);
    106. }
    107. return UT;
    108. }
    109. //判断并返回结果(日出)
    110. long double result_set(long double UT, long double UTo, long double glong, long double glat, int year, int month, int date){
    111. long double d;
    112. if(UT>=UTo) d=UT-UTo;
    113. else d=UTo-UT;
    114. if(d>=0.1){
    115. UTo=UT;
    116. UT=UT_set(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo))))));
    117. result_set(UT,UTo,glong,glat,year,month,date);
    118. }
    119. return UT;
    120. }
    121. //判断并返回结果(日落)
    122. int Zone(long double glong){
    123. if(glong>=0) return (int)((int)(glong/15.0)+1);
    124. else return (int)((int)(glong/15.0)-1);
    125. }
    126. //求时区
    127. void output(long double rise, long double set, long double glong){
    128. if((int)(60*(rise/15+Zone(glong)-(int)(rise/15+Zone(glong))))<10)
    129. cout<<"The time at which the sun rises is "<<(int)(rise/15+Zone(glong))<<":0"<<(int)(60*(rise/15+Zone(glong)-(int)(rise/15+Zone(glong))))<<" . ";
    130. else cout<<"The time at which the sun rises is "<<(int)(rise/15+Zone(glong))<<":"<<(int)(60*(rise/15+Zone(glong)-(int)(rise/15+Zone(glong))))<<" . ";
    131. if((int)(60*(set/15+Zone(glong)-(int)(set/15+Zone(glong))))<10)
    132. cout<<"The time at which the sun sets is "<<(int)(set/15+Zone(glong))<<": "<<(int)(60*(set/15+Zone(glong)-(int)(set/15+Zone(glong))))<<" . ";
    133. else cout<<"The time at which the sun sets is "<<(int)(set/15+Zone(glong))<<":"<<(int)(60*(set/15+Zone(glong)-(int)(set/15+Zone(glong))))<<" . ";
    134. }
    135. //打印结果
    136. int main(){
    137. long double UTo=180.0;
    138. int year,month,date;
    139. long double glat,glong;
    140. int c[3];
    141. input_date(c);
    142. year=c[0];
    143. month=c[1];
    144. date=c[2];
    145. input_glat(c);
    146. glat=c[0]+c[1]/60+c[2]/3600;
    147. input_glong(c);
    148. glong=c[0]+c[1]/60+c[2]/3600;
    149. long double rise,set;
    150. rise=result_rise(UT_rise(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))))),UTo,glong,glat,year,month,date);
    151. set=result_set(UT_set(UTo,GHA(UTo,G_sun(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))),glong,e(h,glat,sun_deviation(earth_tilt(t_century(days(year,month,date),UTo)),ecliptic_longitude(L_sun(t_century(days(year,month,date),UTo)),G_sun(t_century(days(year,month,date),UTo)))))),UTo,glong,glat,year,month,date);
    152. output(rise,set,glong);
    153. system("pause");
    154. return 0;
    155. }





  • 相关阅读:
    vs调试技巧
    ubuntu中安装Docker
    Docker的简单认知
    mysql笔记01
    5款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具绿色版
    怎么用HD Tune检测硬盘坏道
    Dreamweaver_CS6安装与破解
    Microsoft Office 2013 (64位) 免费完整版(安装 + 激活)
    Microsoft office2007免费版下载(安装 + 破解)
    OneNote如何使用
  • 原文地址:https://www.cnblogs.com/strinkbug/p/5942419.html
Copyright © 2011-2022 走看看