Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.76 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace RGZ
  8. {
  9. class Program
  10. {
  11. const int b = 9; // переменная, где храниться система исчисления в которую ты переводишь
  12. static string string10ToString9(string number)
  13. {
  14. /*
  15. * получив строку в 10-ичном формате
  16. * тебе надо ее разбить на целую часть
  17. * и дробную
  18. * Split(,) - это значит разделить строку
  19. * по запятой ТОЕСТЬ:
  20. * для "12,241" получишь массив
  21. * состоящий из 2х элементов
  22. * "12" и "241".
  23. * "" - стоят, потомучто это не числа, а строки!
  24. * пока что.
  25. * ЕСЛИ ввели просто 12 тогда сплит вернет тебе
  26. * один элемент массива 12, тоесть дробной части нет
  27. */
  28. string[] double_num = number.Split(',');
  29. /*
  30. * Теперь когда у тебя есть целая часть
  31. * и дробная ты переводишь их из строк ""
  32. * в циферки при помощи int.Parse
  33. */
  34. int num = int.Parse(double_num[0]);
  35. /*
  36. * так как дробного остатка может и не быть
  37. * мы изначально ставим дробную часть в 0
  38. * rem = 0 - остатка нет
  39. *
  40. * num - целая часть числа
  41. * rem - дробная часть числа
  42. * с - количество знаков после запятой
  43. * изначально тоже ноль, т.к. если нет остатка
  44. * то никаких запятых тоже нет
  45. */
  46. int rem = 0;
  47. int c = 0;
  48. /*
  49. * этот if проверяет есть ли остаток от числа
  50. * тоесть если в массиве double_num есть 2 элемента
  51. * значит есть остаток! если там не 2 элемента
  52. * значит остатка нет.
  53. */
  54. if (double_num.Length == 2)
  55. {
  56. /*
  57. * Если же остаток есть то мы записываем в
  58. * rem его значение путем int.Parse
  59. * а в с записываем количество знаков
  60. * например если число "12235" то знаков 5
  61. */
  62. rem = int.Parse(double_num[1]);
  63. c = double_num.Length;
  64. }
  65. string result = "";
  66. /*
  67. * Так же число могут ввести отрицательным
  68. * -12,241... дак вот если целая часть числа
  69. * у тебя получилась меньше 0, тогда мы ВРЕМЕННО
  70. * убираем минус, что бы он не мешал расчетам
  71. * в конце мы его добавим если он был.
  72. */
  73. int reverseIndex = 0;
  74. if (num < 0)
  75. {
  76. result += '-';
  77. reverseIndex = 1;
  78. num *= -1;
  79. }
  80. /*
  81. * нуу это математический перовод из 10чной
  82. * в любую... тоесть пока число в 10чиной, которое
  83. * ты переводишь, не стало меньше либо равно 10
  84. * будем его делить на твою систему счисления
  85. * и получать определенный набор чисел
  86. * ну если этого не помнишь то лучше в гугл...
  87. */
  88. while (num / b >= 1)
  89. {
  90. result += (intToChar(num % b));
  91. num /= b;
  92. }
  93. /*
  94. * когда число стало меньше либо равно 1
  95. * цикл завершается, но перевод до конца не закончен
  96. * нам надо добавить последнюю цифру, что мы и делаем
  97. */
  98. result += intToChar(num);
  99. /*
  100. * Так как по алгоритму перевода, числа записываются в
  101. * обратном порядке, нам надо перевернуть эту строку, что
  102. * бы получить правилное значение, тоесть если после
  103. * алгоритма деления получили 2842 то это перевернутая строка
  104. * на самом деле правильное число 2482
  105. */
  106. char[] tmp = result.ToCharArray();
  107. if (reverseIndex == 1)
  108. Array.Reverse(tmp, reverseIndex, tmp.Length - 1);
  109. else
  110. Array.Reverse(tmp);
  111. /*
  112. * Добавляем после целой части часла знак запятую
  113. */
  114. result = new string(tmp) + ',';
  115. /*
  116. * Если остаток равен нулю, тогда
  117. * мы после запятой добавляем ноль
  118. * ЕСли остаток не равен нулю тогда высчитываем
  119. * остаток по алгоритму, это все лучше в гугле смотреть...
  120. *
  121. * Ну и в итоге получаем результат в нужной системе счисления
  122. */
  123. if (rem == 0)
  124. result += '0';
  125. else
  126. for (int i = 0; i < c; i++)
  127. {
  128. int temp = (int)((rem * b) / (int)(Math.Pow(10, double_num[1].ToString().Length)));
  129. rem = (int)((rem * b) % (int)(Math.Pow(10, double_num[1].ToString().Length)));
  130. result += intToChar(temp);
  131. }
  132. /*
  133. * Возвращаем результат в главную функцию Main...
  134. * там где мы вызвали функцию string10ToString9
  135. */
  136. return result;
  137. }
  138.  
  139. /*
  140. * Эта функция нужна просто для перевода из
  141. * "0","1","2","3"..... в
  142. * 0 , 1 , 2 , 3
  143. */
  144. static char intToChar(int num)
  145. {
  146. return num.ToString().ToCharArray()[0];
  147. }
  148.  
  149. /*
  150. * Эта функция, для проверки правильности ввода числа в 10чной системе
  151. * Ее вызывает главная функция main после каждого нажатия Enter, тоесть
  152. * после каждого ввода числа :) если число введено не корректно то возвращает
  153. * место на котором при вводе совершена ошибка
  154. * НАПРИМЕР:
  155. * 12,,2312 программа сообщит, что на позиции 4 совершена ошибка!
  156. * ну потому что 2 запятых в числе это как атата
  157. */
  158. static bool checkInput(string input)
  159. {
  160. /*
  161. * Переменная isCorrect будует возвращаться
  162. * и сообщать корректно ли введено число
  163. * если false то число введено не корректно
  164. * если true то все хорошо
  165. */
  166. bool isCorrect = false;
  167. /*
  168. * Если длина введенного числа равна 0
  169. * то число введено не корентно ибо ничего
  170. * не введено тоесть ""
  171. */
  172. if (input.Length == 0)
  173. isCorrect = false;
  174. else
  175. {
  176. /*
  177. * Если же что-то введено то идем и проверяем
  178. * pointCounter хранит в себе количество запятых в строке
  179. */
  180. int pointCounter = 0;
  181. /*
  182. * Это цикл по всем элементам строки, тоесть
  183. * если число 12,55 то сначала возьмет 1 и проверит в корректном
  184. * ли месте она стоит, потом возьмет 2, потом , и т.д.
  185. */
  186. for (int i = 0; i < input.Length; i++)
  187. {
  188. /*
  189. * Если встретилась запятая, то в переменную pointCounter
  190. * значение увеличивается на 1, если запятых больше 1, то атата
  191. * плохой пользователь фифи, говорим что ошбка на месте номер х
  192. */
  193. if (input[i] == ',')
  194. pointCounter++;
  195. /*
  196. * Этот огромный ифище, проверяет, что в числе нет БУКАВОК
  197. * что запятая стоит не на первом месте, тоесть ",213" атата плохо
  198. * Что минусик стоит только на первом месте, тоесть "1-21,23" не прокатит
  199. * атата плохо
  200. */
  201. if ((input[i] >= '0' && input[i] <= '9') || (input[i] == ',' && (i != 0 && i != input.Length - 1 && ((input[0] == '-' && i != 1)) || (input[0] != '-' && i != 0)) && pointCounter <= 1) || (input[i] == '-' && i == 0))
  202. isCorrect = true;
  203. else
  204. {
  205. /*
  206. * Если хоть что-то не такак и атата, тогда выведется строка
  207. * что ошибка ввода исходного числа на позиции номер и укажет
  208. * номер символа на котором есть ошибка :)
  209. */
  210. isCorrect = false;
  211. Console.WriteLine("Ошибка ввода исходного числа: позция номер {0}", i + 1);
  212. break;
  213. }
  214. }
  215. }
  216. /*
  217. * Возвращаем в главное окошечко true или false
  218. * если true то число хорошее можем считать
  219. * если false то атата, считать низя :(
  220. */
  221. return isCorrect;
  222. }
  223.  
  224. static void Main(string[] args)
  225. {
  226. Console.WriteLine("Пожалуйста введите число в десятичном формате!");
  227. string number = "";
  228. /*
  229. * Бесконечный цикл, до момента пока не будет введено корректное число :)
  230. */
  231. while (checkInput(number) != true)
  232. /*
  233. * Считываем то что ввел пользователь
  234. */
  235. number = Console.ReadLine();
  236. /*
  237. * Если пользователь ввел все правильно вызываем функцию расчета для его числа и выводим значение
  238. */
  239. Console.WriteLine("9-ичное представление: " + string10ToString9(number) + " десятичного числа: " + number);
  240. }
  241. }
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement