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
Ну во-первых посмотреть реализацию класса Convert.
Как это сделать?
1) Установить Resharper;
2) Написать Convert;
3) Зажать <Ctr> и навести указатель мыши на Convert;
4) Когда Convert просветиться синий линией, нажать на подчеркнутый Convert;
5) Затем выбрать пункт из всплывающего меню "Download Source" (вроде такой пункт, могу ошибаться);
6) Смотрим исходники, понимаем и пишем свой класс.
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);
Здравствуйте, 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 не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов. Как реализовано — не узнать. Только если дисассемблировать.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Darooma, Вы писали:
D>>Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов.
N>Показывает, если удается их скачать с серверов Microsoft.
значит, у меня не удалось.
Здравствуйте, Darooma, Вы писали:
D>>>Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов.
N>>Показывает, если удается их скачать с серверов Microsoft. D>значит, у меня не удалось.
Ещё может быть в настройках отключено — в разделе External Sources.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Darooma, Вы писали:
D>>>>Resharper не показывает исходники, он показывает лишь метаданные, то есть сигнатуру методов.
N>>>Показывает, если удается их скачать с серверов Microsoft. D>>значит, у меня не удалось.
N>Ещё может быть в настройках отключено — в разделе External Sources.
это не столь важно
Здравствуйте, 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.