Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.43 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Threading;
  4.  
  5. /*
  6. * Попов Виталий Леонидович
  7. * БПИ1910[1]
  8. * Вариант 0
  9. */
  10.  
  11. namespace KR
  12. {
  13. class Program
  14. {
  15. //----------------------------------Требуемые методы по порядку.
  16. /// <summary>
  17. /// переменная, ответственная за рандом.
  18. /// </summary>
  19. static Random rnd = new Random();
  20. /// <summary>
  21. /// Создаёт строку случайных символов.
  22. /// </summary>
  23. /// <param name="N"></param>
  24. /// <returns></returns>
  25. static string MakeRndString(int N)
  26. {
  27. char[] str = new char[N];
  28. for (int i = 0; i < N; i++)
  29. {
  30. str[i] = (char)rnd.Next(97, 123);
  31. }
  32. Logging(string.Join("", str));
  33. return string.Join("", str);
  34. }
  35. /// <summary>
  36. /// Ищет самый частовстречающийся символ.
  37. /// </summary>
  38. /// <param name="arr"></param>
  39. /// <returns></returns>
  40. static char MostFrequentSearcher(char[] arr)
  41. {
  42. char[] buff = new char[arr.Length];
  43. Array.Copy(arr, 0, buff, 0, arr.Length);
  44. Array.Sort(buff);
  45.  
  46. int max = 1, counter = 0;
  47. char count = buff[0], maxChar = buff[0];
  48.  
  49. for (int i = 0; i < buff.Length; i++)
  50. {
  51. if (count == buff[i])
  52. {
  53. counter++;
  54. continue;
  55. }
  56. count = buff[i];
  57. if (max < counter)
  58. {
  59. maxChar = buff[i - 1];
  60. max = counter;
  61. }
  62. }
  63. return maxChar;
  64. //Альтернативное решение.
  65. //int[] amountLetters = CharCounter(arr);
  66.  
  67. //int max = 0;
  68. //for (int i = 0; i < amountLetters.Length; i++)
  69. //{
  70. // if (amountLetters[i] > max)
  71. // {
  72. // max = i;
  73. // }
  74. //}
  75.  
  76. //return (char)(97 + max);
  77. }
  78. /// <summary>
  79. /// Создаёт новую строку, которая состоит только из тех символов
  80. /// Которые кратны k
  81. /// </summary>
  82. /// <param name="arr"></param>
  83. /// <param name="k"></param>
  84. /// <returns></returns>
  85. static char[] MakeNewArrByK(char[] arr, int k)
  86. {
  87. string buff = "";
  88. //Во имя избежания деления на 0.
  89. k = k == 0 ? 1 : k;
  90.  
  91. for (int i = 0; i < arr.Length; i++)
  92. {
  93.  
  94. if ((arr[i] - 97) % k == 0)
  95. {
  96. buff += arr[i];
  97. }
  98.  
  99. }
  100. return buff.ToCharArray();
  101. }
  102. /// <summary>
  103. /// Подсчитывает количество, попадающих в интервал.
  104. /// </summary>
  105. /// <param name="ch1"></param>
  106. /// <param name="ch2"></param>
  107. /// <param name="chArr"></param>
  108. /// <returns></returns>
  109. static int AmountCharsInInterval(char ch1, char ch2, char[] chArr)
  110. {
  111. int result = 0;
  112. for (int i = 0; i < chArr.Length; i++)
  113. {
  114. if (ch1 <= chArr[i] && chArr[i] <= ch2)
  115. {
  116. result++;
  117. }
  118. }
  119. return result;
  120. }
  121. /// <summary>
  122. /// Подсчитывает количество каждого символа в массиве символов.
  123. /// </summary>
  124. /// <param name="arr"></param>
  125. /// <returns></returns>
  126. static int[] CharCounter(char[] arr)
  127. {
  128. int[] result = new int[26];
  129.  
  130. foreach (var item in arr)
  131. {
  132. result[item - 97]++;
  133. }
  134. return result;
  135. }
  136. //----------------------------------Методы для базовой работоспособности программы.
  137. /// <summary>
  138. /// Для циклической работы программы.
  139. /// </summary>
  140. /// <param name="pass"></param>
  141. /// <param name="gool"></param>
  142. /// <returns></returns>
  143. static bool Continue(ConsoleKey pass, string gool)
  144. {
  145. StyleOUTAndLog($"\nЕсли Вы хотите продолжить {gool},\nнажмите: [ {pass.ToString()} ]\n");
  146. ConsoleKey buff = Console.ReadKey().Key;
  147. Logging(buff.ToString());
  148. return buff == pass;
  149. }
  150. /// <summary>
  151. /// Для чтения символа.
  152. /// </summary>
  153. /// <param name="min"></param>
  154. /// <param name="max"></param>
  155. /// <returns></returns>
  156. static char ReadChar(int min, int max)
  157. {
  158. string buff = Console.ReadLine();
  159. Logging(buff);
  160.  
  161. while (buff.Length != 1 || buff[0] > 123 || buff[0] < 96)
  162. {
  163. StyleOUTAndLog("Это не буква алфавита.");
  164. buff = Console.ReadLine();
  165. Logging(buff);
  166. }
  167. return buff[0];
  168. }
  169. /// <summary>
  170. /// Для чтения целого числа в диапазоне.
  171. /// </summary>
  172. /// <param name="num"></param>
  173. /// <param name="min"></param>
  174. /// <param name="max"></param>
  175. static void ReadInt(out int num, int min, int max)
  176. {
  177. string buff = Console.ReadLine();
  178. Logging(buff);
  179. while (!int.TryParse(buff, out num)
  180. || num > max || num < min)
  181. {
  182. Logging(buff);
  183. if (num > max)
  184. {
  185. StyleOUTAndLog("Слишком большое число. Давай заново");
  186. }
  187. else if (num < min)
  188. {
  189. StyleOUTAndLog("Слишком маленькое число. Давай заново");
  190. }
  191. else
  192. {
  193. StyleOUTAndLog("Это и близко не int. Давай заново");
  194. }
  195. buff = Console.ReadLine();
  196. }
  197. }
  198. /// <summary>
  199. /// Выводит массив символов.
  200. /// </summary>
  201. /// <param name="arr"></param>
  202. static void WriteChArr(char[] arr)
  203. {
  204.  
  205. foreach (var item in arr)
  206. {
  207. Console.Write(item + " ");
  208. }
  209. Console.WriteLine();
  210.  
  211. Logging(new string(arr));
  212. }
  213. //----------------------------------Логгирование.
  214. /// <summary>
  215. /// Путь до файла.
  216. /// </summary>
  217. static string FilePath = "../../log.txt";
  218. /// <summary>
  219. /// Выписывает любые действия в файл.
  220. /// </summary>
  221. /// <param name="message"></param>
  222. static void Logging(string message)
  223. {
  224. try
  225. {
  226. File.AppendAllText(FilePath, message + "\n");
  227. }
  228. catch (UnauthorizedAccessException)
  229. {
  230. Console.WriteLine("::ERROR::ERROR::ERROR::ERROR::");
  231. Console.WriteLine("Нет доступа для записи файлов.");
  232. Console.WriteLine("Укажите другой файл.");
  233. Console.WriteLine("Новый путь:");
  234. FilePath = Console.ReadLine();
  235. File.AppendAllText(FilePath, message);
  236. }
  237. catch (DirectoryNotFoundException)
  238. {
  239. Console.WriteLine("::ERROR::ERROR::ERROR::ERROR::");
  240. Console.WriteLine("Нет доступа для записи файлов.");
  241. Console.WriteLine("Укажите другой файл.");
  242. Console.WriteLine("Новый путь:");
  243. FilePath = Console.ReadLine();
  244. File.AppendAllText(FilePath, message);
  245. }
  246. catch (Exception e)
  247. {
  248. Console.WriteLine("::ERROR::ERROR::ERROR::ERROR::ERROR::");
  249. Console.WriteLine("Невозможно записать информацию в файл");
  250. Console.WriteLine($"Из-за того, что {e.Message}");
  251. }
  252. }
  253. /// <summary>
  254. /// Для красивого вывода.
  255. /// </summary>
  256. /// <param name="message"></param>
  257. static void StyleOUTAndLog(string message)
  258. {
  259. foreach (var item in message)
  260. {
  261. Console.Write(item);
  262. Thread.Sleep(15);
  263. }
  264. Console.Write("\n");
  265. Logging(message);
  266. }
  267.  
  268. //----------------------------------Интерфейс и Main.
  269. /// <summary>
  270. /// Реализует диалог с пользователем.
  271. /// </summary>
  272. /// <param name="chArr"></param>
  273. static void Interface(char[] chArr)
  274. {
  275. do
  276. {
  277. Console.Write($"Полученный массив символов:\t");
  278. WriteChArr(chArr);
  279.  
  280. StyleOUTAndLog("\nВыберете то, что вы хотите делать со строкой:\n" +
  281. "1] Показать самый частовстречающийся элемент.\n\n" +
  282. "2] Создания нового массива, содержащего символы,\n коды которых кратны некоторому заданному числу k.\n" +
  283. "3] Нахождения в строке количества символов,\n которые находятся в интервале (ch1, ch2)\n" +
  284. "4] Количество встречающихся символов.\n\n");
  285. int choice;
  286. Console.Write("Ваш выбор: ");
  287. ReadInt(out choice, 0, 4);
  288. switch (choice)
  289. {
  290. case 1:
  291. StyleOUTAndLog($"\nСамый частый элемент:\t{MostFrequentSearcher(chArr)}\n");
  292. break;
  293. case 2:
  294. StyleOUTAndLog($"Введите число k в промежутке [0; 26)");
  295. int buffer;
  296. ReadInt(out buffer, 0, 26);
  297.  
  298. char[] newChArr = MakeNewArrByK(chArr, buffer);
  299. if (newChArr.Length == 0)
  300. {
  301. StyleOUTAndLog("Нет таких элементов.");
  302. }
  303. else WriteChArr(newChArr);
  304. break;
  305. case 3:
  306. StyleOUTAndLog("Введите букву для интервала [Минимум]");
  307. char ch1 = ReadChar(97, 123);
  308. StyleOUTAndLog("Введите букву для интервала [Максимум]");
  309. char ch2 = ReadChar(97, 123);
  310.  
  311. StyleOUTAndLog($"Количество символов в интервале: {AmountCharsInInterval(ch1, ch2, chArr)}");
  312. break;
  313. case 4:
  314. StyleOUTAndLog("Вывод количеств символов.");
  315. int[] amountLetters = CharCounter(chArr);
  316. for (int i = 97; i < 123; i++)
  317. {
  318. if (amountLetters[i - 97] != 0)
  319. {
  320. StyleOUTAndLog($"{(char)i} {amountLetters[i - 97]}");
  321. }
  322. }
  323. break;
  324. }
  325. } while (Continue(ConsoleKey.Enter, "работать с этой строкой"));
  326. }
  327. static void Main(string[] args)
  328. {
  329. do
  330. {
  331. Console.Clear();
  332. //Создание массива символов.
  333. int buffer;
  334. StyleOUTAndLog($"Введите размер строки (0; +бесконечность)");
  335. Console.Write("Размер строки: ");
  336. Logging("Размер строки: ");
  337. ReadInt(out buffer, 1, int.MaxValue);
  338. string str = MakeRndString(buffer);
  339.  
  340. //Выводим интерфейс.
  341. Interface(str.ToCharArray());
  342. StyleOUTAndLog("\nВы больше не работаете с этой строкой.\n");
  343. } while (Continue(ConsoleKey.Enter, "вводить строки"));
  344. }
  345. }
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement