moon.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // moon.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3. #include <iostream>
  4. #include <fstream>
  5. #include "datetime.h"
  6. using namespace std;
  7. int skip_col(string, int);
  8. void take_moon_survey(date);
  9. double get_EL(string, int);
  10. int main()
  11. {
  12. date examp(2023, 03, 9);
  13. take_moon_survey(examp);
  14. }
  15. void take_moon_survey(date some_date){
  16. ifstream data_file;
  17. data_file.open("./Moon/moon2023.dat");
  18. if (!data_file.is_open()) {
  19. cout << "not opened\n";
  20. return;
  21. }
  22. string line;
  23. date line_date;
  24. date prev_date;
  25. prev_date = date(some_date.year,01,01);
  26. string rise_set = "Moon rising: ";
  27. unsigned long long length_day=0,cur_length;
  28. bool flag = 1;
  29. cout << "date: " << some_date << endl;
  30. getline(data_file, line);
  31. double prev_val = -100.0;
  32. while (getline(data_file, line)) {
  33. int year, month, day;
  34. year = (line[0] - 48) * 1000 + (line[1] - 48) * 100 + (line[2] - 48) * 10 + (line[3] - 48);
  35. month = (line[4] - 48) * 10 + (line[5] - 48);
  36. day = (line[6] - 48) * 10 + (line[7] - 48);
  37. line_date = date(year, month, day);
  38. if (line_date == some_date)
  39. {
  40. int el = skip_col(line, 4);
  41. double EL_val = get_EL(line, el);
  42. if (prev_val > 0 && EL_val < 0)
  43. {
  44. cout << "Moon sets: " << line << endl;
  45. }
  46. if (prev_val < 0 && EL_val > 0)
  47. {
  48. cout << "Moon rises: " << line << endl;
  49. }
  50. prev_val = EL_val;
  51. //cout << line << '\t' << line_date << '\t' << EL_val << endl;
  52. }
  53. else if (flag) {
  54. length_day++;
  55. flag = (line_date == prev_date);
  56. }
  57. else {
  58. for (unsigned long long i = 1; i < length_day; i++)
  59. getline(data_file, line);
  60. }
  61. }
  62. data_file.close();
  63. }
  64. double get_EL(string line, int index)
  65. {
  66. double res = 0.0;
  67. bool neg = (line[index] == 45);
  68. int dot = neg ? index + 1 : index;
  69. double dec_post_dot=1.0;
  70. while (line[dot] !=46) {
  71. dot++;
  72. }
  73. int start = dot + 1;
  74. for ( start; line[start] < 58 && line[start]>45; start++) {
  75. dec_post_dot /= 10;
  76. }
  77. start--;
  78. for (start; line[start] < 58 && line[start] > 47; start--) {
  79. res =res+ (line[start] - 48) * dec_post_dot;
  80. dec_post_dot *= 10;
  81. }
  82. start--;
  83. for (start; line[start] < 58 && line[start] > 47; start--) {
  84. res += (line[start] - 48) * dec_post_dot;
  85. dec_post_dot *= 10;
  86. }
  87. return neg? -1.0*res:res;
  88. }
  89. int skip_col(string line, int amount) {
  90. int i = 0;
  91. for (int j = 0; j < amount; j++) {
  92. while (line[i] >= 45 && line[i] <= 57)
  93. i++;
  94. while (!(line[i] >= 45 && line[i] <= 57)) {
  95. i++;
  96. }
  97. }
  98. return i;
  99. }
  100. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  101. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  102. // Советы по началу работы
  103. // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  104. // 2. В окне Team Explorer можно подключиться к системе управления версиями.
  105. // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  106. // 4. В окне "Список ошибок" можно просматривать ошибки.
  107. // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  108. // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.