MainWindow.axaml.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. using Avalonia.Controls;
  2. using Avalonia.Interactivity;
  3. using Avalonia.Media.TextFormatting;
  4. using ColorTextBlock.Avalonia;
  5. using MsBox.Avalonia;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Globalization;
  9. using System.IO;
  10. using System.Runtime.Intrinsics.Arm;
  11. using System.Xml.Linq;
  12. using Tmds.DBus.Protocol;
  13. namespace task4_styles_second
  14. {
  15. public partial class MainWindow : Window
  16. {
  17. public MainWindow()
  18. {
  19. try
  20. {
  21. InitializeComponent();
  22. dpBirthday.MaxYear = maxDate;
  23. checkBD.IsVisible = false;
  24. sign.IsVisible = false;
  25. }
  26. catch(Exception ex)
  27. {
  28. Console.WriteLine(ex.Message);
  29. Console.WriteLine(ex.StackTrace);
  30. }
  31. }
  32. public DateTime maxDate = System.DateTime.Now;
  33. /// <summary>
  34. /// Вычисление знака зодиака и животного по восточному гороскопу (вызов функций и вывод на экран)
  35. /// </summary>
  36. /// <param name="sender"></param>
  37. /// <param name="e"></param>
  38. private void DoHoroskope(object sender, RoutedEventArgs e)
  39. {
  40. sign.Text = ""; //каждый раз при выборе одного из вариантов гороскопа поле со значением гороскопа очищается
  41. if ((rb1.IsChecked == true || rb2.IsChecked == true) && dpBirthday.SelectedDate is null) checkBD.IsVisible = true; //вывод предупреждения если дата рождения не заполнена
  42. else if (rb1.IsChecked == true)
  43. {
  44. sign.Text = ZodiakSign(DateTime.Parse(dpBirthday.SelectedDate.ToString()));
  45. sign.IsVisible = true;
  46. }
  47. else
  48. {
  49. sign.Text = ChineseHoroskope(DateTime.Parse(dpBirthday.SelectedDate.ToString()));
  50. sign.IsVisible = true;
  51. }
  52. }
  53. /// <summary>
  54. /// Метод с вычислением части 1 задания
  55. /// </summary>
  56. /// <param name="sender"></param>
  57. /// <param name="e"></param>
  58. private void TimeCount(object sender, RoutedEventArgs e)
  59. {
  60. rb1.IsChecked = false;
  61. rb2.IsChecked = false;
  62. sign.Text = "";
  63. tbLeapYears.Text = "";
  64. checkBD.IsVisible = false;
  65. string date = dpBirthday.SelectedDate.ToString();
  66. int days = 1, months = 1, years = 1;
  67. DateTime birthdayDate = DateTime.MinValue;
  68. if (date != "")
  69. {
  70. birthdayDate = Convert.ToDateTime(date);
  71. years = DateTime.Now.Year - birthdayDate.Year;
  72. months = DateTime.Now.Month - birthdayDate.Month;
  73. days = DateTime.Now.Day - birthdayDate.Day;
  74. }
  75. else
  76. {
  77. checkBD.IsVisible = true;
  78. return;
  79. }
  80. if (days < 0)
  81. {
  82. months--;
  83. if (DateTime.Now.Month > 1) days += DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month - 1);
  84. else days += DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
  85. }
  86. if (months < 0)
  87. {
  88. years--;
  89. months += 12;
  90. }
  91. tbCount.Text = years + " лет, " + months + " месяцев, " + days + " дней";
  92. tbDayWeek.Text = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[Convert.ToInt32(birthdayDate.DayOfWeek)]
  93. + ", \nтакие же дни недели выпадали\n " + CountDaysWeek(birthdayDate) + " раз";
  94. tbLeapYearsCount.Text = " " + LeapYears(birthdayDate).Count;
  95. if (LeapYears(birthdayDate).Count == 0) tbLeapYears.Text += "Високосные года отсутствуют";
  96. else
  97. {
  98. for (int i = 0; i < LeapYears(birthdayDate).Count; i++)
  99. {
  100. if (i != 0 && i % 5 == 0)
  101. {
  102. tbLeapYears.Text += "\n";
  103. }
  104. tbLeapYears.Text += LeapYears(birthdayDate)[i] + " ";
  105. }
  106. }
  107. Console.WriteLine();
  108. }
  109. /// <summary>
  110. /// Метод определения животного (и стихии) по восточному гороскопу
  111. /// </summary>
  112. /// <param name="birthdayDate">Дата рождения</param>
  113. /// <returns>Животное определенной стихии</returns>
  114. string ChineseHoroskope(DateTime birthdayDate)
  115. {
  116. string[] animals =
  117. {
  118. "Крыса", // 0
  119. "Бык", // 1
  120. "Тигр", // 2
  121. "Кролик", // 3
  122. "Дракон", // 4
  123. "Змея", // 5
  124. "Лошадь", // 6
  125. "Коза", // 7
  126. "Обезьяна", // 8
  127. "Петух", // 9
  128. "Собака", // 10
  129. "Свинья" // 11
  130. };
  131. string[] elements =
  132. {
  133. " стихии металл", // 0 или 1
  134. " стихии вода", // 2 или 3
  135. " стихии дерево", // 4 или 5
  136. " стихии огонь", // 6 или 7
  137. " стихии земля" // 8 или 9
  138. };
  139. int indexAnimal = (birthdayDate.Year - 4) % 12;
  140. int indexElement = (birthdayDate.Year % 10) / 2;
  141. return animals[indexAnimal] + elements[indexElement];
  142. }
  143. /// <summary>
  144. /// Определение знака зодиака
  145. /// </summary>
  146. /// <param name="birthdayDate">Дата рождения</param>
  147. /// <returns>Знак зодиака</returns>
  148. string ZodiakSign(DateTime birthdayDate)
  149. {
  150. int month = birthdayDate.Month;
  151. int day = birthdayDate.Day;
  152. if ((month == 3 && day >= 21) || (month == 4 && day <= 19))
  153. return "Овен";
  154. else if ((month == 4 && day >= 20) || (month == 5 && day <= 20))
  155. return "Телец";
  156. else if ((month == 5 && day >= 21) || (month == 6 && day <= 20))
  157. return "Близнецы";
  158. else if ((month == 6 && day >= 21) || (month == 7 && day <= 22))
  159. return "Рак";
  160. else if ((month == 7 && day >= 23) || (month == 8 && day <= 22))
  161. return "Лев";
  162. else if ((month == 8 && day >= 23) || (month == 9 && day <= 22))
  163. return "Дева";
  164. else if ((month == 9 && day >= 23) || (month == 10 && day <= 22))
  165. return "Весы";
  166. else if ((month == 10 && day >= 23) || (month == 11 && day <= 21))
  167. return "Скорпион";
  168. else if ((month == 11 && day >= 22) || (month == 12 && day <= 21))
  169. return "Стрелец";
  170. else if ((month == 12 && day >= 22) || (month == 1 && day <= 19))
  171. return "Козерог";
  172. else if ((month == 1 && day >= 20) || (month == 2 && day <= 18))
  173. return "Водолей";
  174. else if ((month == 2 && day >= 19) || (month == 3 && day <= 20))
  175. return "Рыбы";
  176. else
  177. return "Неверная дата";
  178. }
  179. /// <summary>
  180. /// Метод определения количества дня рождений, которые человек отпраздновал в тот же день недели за всю жизнь
  181. /// </summary>
  182. /// <param name="birthdayDate">Дата рождения</param>
  183. /// <returns>Количество дней</returns>
  184. int CountDaysWeek(DateTime birthdayDate)
  185. {
  186. int numDays = 0;
  187. for (int i = birthdayDate.Year + 1; i <= DateTime.Now.Year; i++)
  188. {
  189. if (new DateTime(i, birthdayDate.Month, birthdayDate.Day).DayOfWeek == birthdayDate.DayOfWeek) numDays++;
  190. }
  191. return numDays;
  192. }
  193. /// <summary>
  194. /// Метод определения списка високосных лет, прошедших со дня рождения человека
  195. /// </summary>
  196. /// <param name="birthdayDate">Дата рождения</param>
  197. /// <returns>Лист с високосными годами</returns>
  198. List<int> LeapYears(DateTime birthdayDate)
  199. {
  200. int numYears = 0;
  201. List<int> listYears = new();
  202. listYears.Clear();
  203. for (int i = birthdayDate.Year + 1; i <= DateTime.Now.Year; i++)
  204. {
  205. if (DateTime.IsLeapYear(i))
  206. {
  207. numYears++;
  208. listYears.Add(i);
  209. }
  210. }
  211. return listYears;
  212. }
  213. }
  214. }