Monday, June 7, 2010

Задания на вакансию С# Developer

В общем, получил я список тестовых заданий на вакансию программиста. Поэтому привожу первое задание на алгоритмы, может, кому пригодится…
Написать класс, преобразующий числа из одной позиционной системы счисления в другую.
Класс должен реализовать следующий интерфейс
interface IConvert
{
///
/// Преобразование числа из одной позицонной системы счисления в другую
///

/// строковое предствление числа в базовой системе счисления
/// строка представляющая основание базовой системы счисления
/// строка представлюща основание системы счиления в которую надо перевести
/// строковое предстваление числа в новой системе счисления
/// Исключание если конвертируемое значение не представлет из себя число в базовой сисеме счисления
string Convert(string value, string fromBase, string toBase);
}

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

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

Первым приведу «тестовую» программку. Обращаю внимание, в техническом задание не упоминается возможность использование дробных чисел, поэтому программа работает только с целыми.

static void Main(string[] args)
{

PositionSystemConverter PSC = new PositionSystemConverter();
Console.WriteLine("Пример работы программы (из 4-ой сист. счисл. в 10-ю):");
//Фактически конвертируем из 4-ой сист. счисл. в 10-ю
string rez_str = PSC.Convert("ASGK", "GSAK", "0,1,2,3,4,5,6,7,8,9");
Console.WriteLine(rez_str);
//Конвертируем из 4-й сист. счисления в 16-ю
string rez_str2 = PSC.Convert("ASGK", "GSAK", "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f");
Console.WriteLine("Работа алгоритма(из 4-й сист. счисления в 16-ю): "+rez_str2);
//Осуществим проверку стандартными средствами библиотеки классов
Console.WriteLine("Проверка: "+ Convert.ToString(Convert.ToInt32(rez_str), 16));
//Конвертируем из 4-й сист. счисления в 2-ю
string rez_str3 = PSC.Convert("ASGK", "GSAK", "0,1");
Console.WriteLine("Работа алгоритма(из 4-й сист. счисления в 2-ю): "+rez_str3);
Console.WriteLine("Проверка: " + Convert.ToString(Convert.ToInt32(rez_str), 2));
//Конвертируем из 4-й сист. счисления в 16-ю
string rez_str4 = PSC.Convert("ASGKS", "GSAK", "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f");
Console.WriteLine("Работа алгоритма(из 4-й сист. счисления в 16-ю): " + rez_str4);
}

Рис. 1 Результат работы
Судя по рис.1 работает как надо (147 получатся).
И вот реализация интерфейса.
Следует сказать про программу. Первым делом анализируется fromBase – составляется словарь (символ - соответствующее десятичное число). Потом используя строку Value и словарь определяем число в 10й системе. И в конце, анализируя строку toBase – определяем необходимую систему счисления, осуществляем перевод. Задача легко раскладывается «по полочкам».
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TZ_project
{
interface IConvert
{
///
/// Преобразование числа из одной позицонной системы счисления в другую
///

/// строковое предствление числа в базовой системе счисления
/// строка представляющая основание базовой системы счисления
/// строка представлюща основание системы счиления в которую надо перевести
/// строковое предстваление числа в новой системе счисления
/// Исключание если конвертируемое значение не представлет из себя число в базовой сисеме счисления
string Convert(string value, string fromBase, string toBase);
}

class PositionSystemConverter : IConvert
{
public string Convert(string value, string fromBase, string toBase)
{
//Конвертируем в Десятичное значение число value
int ValueInDec = ConvertfromBaseToDec(fromBase,value);
// Теперь есть необходимость узнать основание системы отсчета в которую надо конвертировать
int Osnovanije = OsnovanieToBase(toBase);
// Теперь конвертируем из десятичной в систему toBase
// Получаем массив разрядов соответствующее сиситеме ToBase
// Разряды в массиве заданы десятичными значениями, поэтому надобудет заменить эти значения
// на соответствующие символы (см. парам. ToBase)
int[] rezDec = convertFromDec(ValueInDec, Osnovanije);
// Формируем строку в формате строки toBase
string ValueToBase = writeInFormatToBase(toBase,rezDec);

return ValueToBase;
}
private int ConvertfromBaseToDec(string fromBase, string value)
{
// Определяем длины входных параметров метода
int fromBase_len = fromBase.Length;
int value_len = value.Length;
// Создаем массивы под алфавит и масив разрядов
baseVocabular[] ABC = new baseVocabular[fromBase_len];
int[] razr_dec = new int[value_len];
//Заполним алфавит буквами из строки fromBase
// После выполнения цикла переменная Osnovanije будет содержать основание системы
int Osnovanije;
for (Osnovanije = 0; Osnovanije < valuechararray =" value.ToCharArray();" j =" 0;" n =" 0;" rez =" 0;//Заранее" razr_len =" razr_dec.Length;//Определяем" shag =" razr_len" j =" 0;" razradcol =" (int)Math.Ceiling(Math.Log(rez)" rezrazrad =" new" i =" razradCol" ostatok =" rez" rez =" rez" tobaseelements =" toBase.Split(',');" elements_len =" ToBaseElements.Length;" tobaseabc =" new" tobaseosn =" 0;" numberrazr_len =" numberRazr.Length;" rezultstr = "" i =" 0;" n =" 0;" charindex =" charIndex;" ch =" simbol;" ch ="="" charindex ="="">
select * from #t

В результате выполнения <запрос> должен получиться следующий результат

8 qwe 100.00
10 asd 100.00
12 zxc 100.00

Решение:
with c as
(
select row_id, sum(case when _key='asd' then _total end) as asd
,sum(case when _key='qwe' then _total end) as qwe,
sum(case when _key='zxc' then _total end) as zxc
from #t
group by row_id
)
--select * from c
delete from #t where row_id not in(
select MAX(row_id) from c where asd=(select MAX(asd) from c)
union all
select MAX(row_id) from c where qwe=(select MAX(qwe) from c)
union all
select MAX(row_id) from c where zxc=(select MAX(zxc) from c)
)
select * from #t
Задачка непростая, первое что пришло в голову это развернуть таблицу по колонке _key. Недостаток решения, в том, что используются значения из таблицы. Эти же значения можно было бы получить запросом: “select distinct _key from #t”, но нет в T-SQL поддержки «классических» массивов, которые здесь бы пригодились…

Рис. 2 Результат Select-запроса С

Рис. 3 Результат запроса

No comments:

Post a Comment