Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace RGZ
- {
- class Program
- {
- const int b = 9; // переменная, где храниться система исчисления в которую ты переводишь
- static string string10ToString9(string number)
- {
- /*
- * получив строку в 10-ичном формате
- * тебе надо ее разбить на целую часть
- * и дробную
- * Split(,) - это значит разделить строку
- * по запятой ТОЕСТЬ:
- * для "12,241" получишь массив
- * состоящий из 2х элементов
- * "12" и "241".
- * "" - стоят, потомучто это не числа, а строки!
- * пока что.
- * ЕСЛИ ввели просто 12 тогда сплит вернет тебе
- * один элемент массива 12, тоесть дробной части нет
- */
- string[] double_num = number.Split(',');
- /*
- * Теперь когда у тебя есть целая часть
- * и дробная ты переводишь их из строк ""
- * в циферки при помощи int.Parse
- */
- int num = int.Parse(double_num[0]);
- /*
- * так как дробного остатка может и не быть
- * мы изначально ставим дробную часть в 0
- * rem = 0 - остатка нет
- *
- * num - целая часть числа
- * rem - дробная часть числа
- * с - количество знаков после запятой
- * изначально тоже ноль, т.к. если нет остатка
- * то никаких запятых тоже нет
- */
- int rem = 0;
- int c = 0;
- /*
- * этот if проверяет есть ли остаток от числа
- * тоесть если в массиве double_num есть 2 элемента
- * значит есть остаток! если там не 2 элемента
- * значит остатка нет.
- */
- if (double_num.Length == 2)
- {
- /*
- * Если же остаток есть то мы записываем в
- * rem его значение путем int.Parse
- * а в с записываем количество знаков
- * например если число "12235" то знаков 5
- */
- rem = int.Parse(double_num[1]);
- c = double_num.Length;
- }
- string result = "";
- /*
- * Так же число могут ввести отрицательным
- * -12,241... дак вот если целая часть числа
- * у тебя получилась меньше 0, тогда мы ВРЕМЕННО
- * убираем минус, что бы он не мешал расчетам
- * в конце мы его добавим если он был.
- */
- int reverseIndex = 0;
- if (num < 0)
- {
- result += '-';
- reverseIndex = 1;
- num *= -1;
- }
- /*
- * нуу это математический перовод из 10чной
- * в любую... тоесть пока число в 10чиной, которое
- * ты переводишь, не стало меньше либо равно 10
- * будем его делить на твою систему счисления
- * и получать определенный набор чисел
- * ну если этого не помнишь то лучше в гугл...
- */
- while (num / b >= 1)
- {
- result += (intToChar(num % b));
- num /= b;
- }
- /*
- * когда число стало меньше либо равно 1
- * цикл завершается, но перевод до конца не закончен
- * нам надо добавить последнюю цифру, что мы и делаем
- */
- result += intToChar(num);
- /*
- * Так как по алгоритму перевода, числа записываются в
- * обратном порядке, нам надо перевернуть эту строку, что
- * бы получить правилное значение, тоесть если после
- * алгоритма деления получили 2842 то это перевернутая строка
- * на самом деле правильное число 2482
- */
- char[] tmp = result.ToCharArray();
- if (reverseIndex == 1)
- Array.Reverse(tmp, reverseIndex, tmp.Length - 1);
- else
- Array.Reverse(tmp);
- /*
- * Добавляем после целой части часла знак запятую
- */
- result = new string(tmp) + ',';
- /*
- * Если остаток равен нулю, тогда
- * мы после запятой добавляем ноль
- * ЕСли остаток не равен нулю тогда высчитываем
- * остаток по алгоритму, это все лучше в гугле смотреть...
- *
- * Ну и в итоге получаем результат в нужной системе счисления
- */
- if (rem == 0)
- result += '0';
- else
- for (int i = 0; i < c; i++)
- {
- int temp = (int)((rem * b) / (int)(Math.Pow(10, double_num[1].ToString().Length)));
- rem = (int)((rem * b) % (int)(Math.Pow(10, double_num[1].ToString().Length)));
- result += intToChar(temp);
- }
- /*
- * Возвращаем результат в главную функцию Main...
- * там где мы вызвали функцию string10ToString9
- */
- return result;
- }
- /*
- * Эта функция нужна просто для перевода из
- * "0","1","2","3"..... в
- * 0 , 1 , 2 , 3
- */
- static char intToChar(int num)
- {
- return num.ToString().ToCharArray()[0];
- }
- /*
- * Эта функция, для проверки правильности ввода числа в 10чной системе
- * Ее вызывает главная функция main после каждого нажатия Enter, тоесть
- * после каждого ввода числа :) если число введено не корректно то возвращает
- * место на котором при вводе совершена ошибка
- * НАПРИМЕР:
- * 12,,2312 программа сообщит, что на позиции 4 совершена ошибка!
- * ну потому что 2 запятых в числе это как атата
- */
- static bool checkInput(string input)
- {
- /*
- * Переменная isCorrect будует возвращаться
- * и сообщать корректно ли введено число
- * если false то число введено не корректно
- * если true то все хорошо
- */
- bool isCorrect = false;
- /*
- * Если длина введенного числа равна 0
- * то число введено не корентно ибо ничего
- * не введено тоесть ""
- */
- if (input.Length == 0)
- isCorrect = false;
- else
- {
- /*
- * Если же что-то введено то идем и проверяем
- * pointCounter хранит в себе количество запятых в строке
- */
- int pointCounter = 0;
- /*
- * Это цикл по всем элементам строки, тоесть
- * если число 12,55 то сначала возьмет 1 и проверит в корректном
- * ли месте она стоит, потом возьмет 2, потом , и т.д.
- */
- for (int i = 0; i < input.Length; i++)
- {
- /*
- * Если встретилась запятая, то в переменную pointCounter
- * значение увеличивается на 1, если запятых больше 1, то атата
- * плохой пользователь фифи, говорим что ошбка на месте номер х
- */
- if (input[i] == ',')
- pointCounter++;
- /*
- * Этот огромный ифище, проверяет, что в числе нет БУКАВОК
- * что запятая стоит не на первом месте, тоесть ",213" атата плохо
- * Что минусик стоит только на первом месте, тоесть "1-21,23" не прокатит
- * атата плохо
- */
- 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))
- isCorrect = true;
- else
- {
- /*
- * Если хоть что-то не такак и атата, тогда выведется строка
- * что ошибка ввода исходного числа на позиции номер и укажет
- * номер символа на котором есть ошибка :)
- */
- isCorrect = false;
- Console.WriteLine("Ошибка ввода исходного числа: позция номер {0}", i + 1);
- break;
- }
- }
- }
- /*
- * Возвращаем в главное окошечко true или false
- * если true то число хорошее можем считать
- * если false то атата, считать низя :(
- */
- return isCorrect;
- }
- static void Main(string[] args)
- {
- Console.WriteLine("Пожалуйста введите число в десятичном формате!");
- string number = "";
- /*
- * Бесконечный цикл, до момента пока не будет введено корректное число :)
- */
- while (checkInput(number) != true)
- /*
- * Считываем то что ввел пользователь
- */
- number = Console.ReadLine();
- /*
- * Если пользователь ввел все правильно вызываем функцию расчета для его числа и выводим значение
- */
- Console.WriteLine("9-ичное представление: " + string10ToString9(number) + " десятичного числа: " + number);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement