Преобразование чисел из одной сс в другую
От: Darooma Россия  
Дата: 20.08.10 17:13
Оценка:
Пусть есть интерфейс


 interface IConvert
{
/// <summary>
/// Преобразование числа из одной позицонной сисемы счисления в другую
   /// </summary>
/// <param name="value">строковое предствление числа в базовой сисеме счисления</param>
/// <param name="fromBase">строка представляющая основание базовой системы счисления</param>
   /// <param name="toBase">строка представлюща основание системы счиления в которую надо перевести</param>
/// <returns>строковое предстваление числа в новой системе счисления</returns>
/// <exception cref="ArgumentException">Исключание если конвертируемое значение не представлет из себя число в базовой сисеме счисления</exception>
      string Convert(string value, string fromBase, string toBase);
  }







Как сделать класс, реализующий этот интерфейс?


Value = “GSAK”
fromBase = “A,S,G,K” – основание системы равно 4 (если записать арабскими то 0,1,2,3)
toBase= “0,1,2,3,4,5,6,7,8,9” – основние сисемы равно 10
return value = “147”








Строки, представляющие основание позиционной системы, содержат любые символы для предстваления цифры в порядке возрастания

22.08.10 12:37: Перенесено модератором из '.NET' — TK
система счисления
Re: Преобразование чисел из одной сс в другую
От: xobotik Россия  
Дата: 20.08.10 18:58
Оценка:
Здравствуйте, Darooma, Вы писали:

Ну во-первых посмотреть реализацию класса Convert.
Как это сделать?
1) Установить Resharper;
2) Написать Convert;
3) Зажать <Ctr> и навести указатель мыши на Convert;
4) Когда Convert просветиться синий линией, нажать на подчеркнутый Convert;
5) Затем выбрать пункт из всплывающего меню "Download Source" (вроде такой пункт, могу ошибаться);
6) Смотрим исходники, понимаем и пишем свой класс.
С уважением!
Re: Преобразование чисел из одной сс в другую
От: xobotik Россия  
Дата: 20.08.10 21:02
Оценка:
Здравствуйте, Darooma, Вы писали:
D> interface IConvert
D>{
D>/// <summary>
D>/// Преобразование числа из одной позицонной сисемы счисления в другую

Надо любые числа преобразовывать?
Если да, то можно собственно реализовывать таким подходом:
    public class Convert
    {
        // опишем позиционные системы счисления, которые поддерживаются нашим классом.
        protected static readonly int[] ConvertSystemsNotations = 
        {
            2, 3, 4, 5, 8, 10, 12, 16, 
        };
        // наш публичный метод
        public string ConvertTo(string value, string fromBase, string toBase)
        {
            if (!(IsSystemNotationsCorrect(System.Convert.ToInt32(fromBase)) || 
                IsSystemNotationsCorrect(System.Convert.ToInt32(toBase))))
            {
                throw new ArgumentException("Введенные системы счиления не поддерживаются!");
            }
            // TODO: определить какие private методы нам надо использовать в преобразовании позиционных систем счисления 
        }
        // проверка поддерживаемых методов
        protected static bool IsSystemNotationsCorrect(int currentSystemNotations)
        {
            return ConvertSystemsNotations.Contains(currentSystemNotations);
            // если сделать поддерживаемые системы счисления следующего характера: 
            // 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ... , 16
            // то проверку можно сделать следующим образом
            // return (ConvertSystemsNotations[0] >= currentSystemNotations || 
            //         currentSystemNotations <= ConvertSystemsNotations[ConvertSystemsNotations.Length - 1]);
            // проще говоря, проверить входит ли в диапазон. 
        }
        // примеры реализации методов преобразования
        protected static string ConvertTo2(int value)
        {
            return System.Convert.ToString(value, 2);
        }
        protected static string ConvertTo16(int value)
        {
            return value.ToString("X");
        }
        // TODO: Реализуем остальные методы преобразования.
    }

Многие методы преобразования из одной системы счисления в другую находятся в классе Convert. Также преобразования можно выполнить через метод Parse
Example:
string hex = "FFFF";
int res = int.Parse(hex, System.Globalization.NumberStyles.HexNumber);

Рекомендую еще посмотреть класс String.
С уважением!
Re[2]: Преобразование чисел из одной сс в другую
От: Darooma Россия  
Дата: 21.08.10 09:26
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Здравствуйте, Darooma, Вы писали:


X>Ну во-первых посмотреть реализацию класса Convert.

X>Как это сделать?
X>1) Установить Resharper;
X>2) Написать Convert;
X>3) Зажать <Ctr> и навести указатель мыши на Convert;
X>4) Когда Convert просветиться синий линией, нажать на подчеркнутый Convert;
X>5) Затем выбрать пункт из всплывающего меню "Download Source" (вроде такой пункт, могу ошибаться);
X>6) Смотрим исходники, понимаем и пишем свой класс.
X>

Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов. Как реализовано — не узнать. Только если дисассемблировать.
Re[2]: Преобразование чисел из одной сс в другую
От: Darooma Россия  
Дата: 21.08.10 09:28
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Здравствуйте, Darooma, Вы писали:

X>
D>> interface IConvert
D>>{
D>>/// <summary>
D>>/// Преобразование числа из одной позицонной сисемы счисления в другую
X>

X>Надо любые числа преобразовывать?

Что значит любые? Возможно, задание мне дано для теста.
Re[3]: Преобразование чисел из одной сс в другую
От: nikov США http://www.linkedin.com/in/nikov
Дата: 21.08.10 10:43
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов.


Показывает, если удается их скачать с серверов Microsoft.
Re[4]: Преобразование чисел из одной сс в другую
От: Darooma Россия  
Дата: 21.08.10 10:51
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Darooma, Вы писали:


D>>Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов.


N>Показывает, если удается их скачать с серверов Microsoft.

значит, у меня не удалось.
Re[5]: Преобразование чисел из одной сс в другую
От: nikov США http://www.linkedin.com/in/nikov
Дата: 21.08.10 10:53
Оценка:
Здравствуйте, Darooma, Вы писали:

D>>>Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов.


N>>Показывает, если удается их скачать с серверов Microsoft.

D>значит, у меня не удалось.

Ещё может быть в настройках отключено — в разделе External Sources.
Re[6]: Преобразование чисел из одной сс в другую
От: Darooma Россия  
Дата: 21.08.10 11:53
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Darooma, Вы писали:


D>>>>Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов.


N>>>Показывает, если удается их скачать с серверов Microsoft.

D>>значит, у меня не удалось.

N>Ещё может быть в настройках отключено — в разделе External Sources.

это не столь важно
Re[3]: Преобразование чисел из одной сс в другую
От: avpavlov  
Дата: 21.08.10 13:33
Оценка: +2 -1
D>Что значит любые? Возможно, задание мне дано для теста.

Ну так и выполни его. А ещё лучше вон из профессии.
Re: Преобразование чисел из одной сс в другую
От: Кодт Россия  
Дата: 23.08.10 09:26
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>Как сделать класс, реализующий этот интерфейс?

D>

D> Value = “GSAK”
D>fromBase = “A,S,G,K” – основание системы равно 4 (если записать арабскими то 0,1,2,3)
D>toBase= “0,1,2,3,4,5,6,7,8,9” – основние сисемы равно 10
D>return value = “147”

D>Строки, представляющие основание позиционной системы, содержат любые символы для предстваления цифры в порядке возрастания

Детская задачка о переводе чисел из одной системы в другую плюс ещё одна детская задачка о замене символов.
Поскольку задание тестовое — то было бы странно, если бы народ сейчас взял да и дал готовый ответ.

Есть три подхода
1) char[] -> BigInt -> char[] — т.е. получить число из кода и затем восстановить в другой код
2) char[] -> int[] -> int[] -> char[] — т.е. получить позиционную запись в from-ричной системе, перевести в to-ричную и подставить нужные символы цифр
3) char[] -> char[] — то же, что и (2), но получать номера цифр исключительно в уме, без промежуточных массивов
Первый способ читерский, третий — самый щадящий

Кстати, не раскрыта тема: little- или big-endian записи?
GSAK = 3102[4] = E2[16 = 147[10] — похоже, что big-endian.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.