Сишники и Паскалисты традиционно враждуют )
Язык Си для меня почти Брейнфак.
Да неправда! Во-первых, Паскаль изначально создавался для целей обучения и в нём изначально приняты меры, исключающие глупые ошибки программиста. А Си создавался как замена ассемблеру, поэтому в нём возможно создание как небезопасного кода, так и использование трюков для создания высокоэффективного кода. Который Паскаль просто не даст тебе создать (имеется ввиду компилятор). Во-вторых, у каждого из этих языков есть своя область, где они наиболее эффективны. В-третьих, настоящему программисту в принципе без разницы на каком языке программировать, ведь
главное - это алгоритм! Он ведь от языка ну никак не зависит. А в-четвёртых, если речь идёт о конкурсе, то
язык программирования выбираешь ты сам!Вот ПРИМЕР моего Кодинга в паскале, функция генерирующая случайный адрес-хэш в 36-ричной системе счисления.
Функцию эту я написал САМ. Нигде не заимствовал и не копипастил.
function GenINIB():string; //Генерация идентификационного номера ИБ
//ИНИБ состоит из десяти цифр в 36-ричной системе, что позволяет
//использовать порядка 3 656 158 440 062 976 комбинаций
//(3,6 Квадриллиона комбинаций)
//Это не гарантирует уникальность ИНИБа, но делает совпадение ИНИБов
//для разных ИБов крайне маловероятным.
//для хранения величины ИНИБа в двоичном коде достаточно 7 Байт
//Цифры 36-ричной системы счисления
const Base36:string='0123456789abcdefghijklmnopqrstuvwxyz';
var Xrnd,n:Byte;
INIB:string[10];
CN:Char;
begin
INIB:='';
for n:=0 to 9 do begin
Xrnd:=random(36)+1;
CN:=Base36[Xrnd];
INIB:=INIB+CN;
end;
GenINIB:=INIB;
end;
И сразу вопросы:
1. Чем хороша 36-ричная система счисления? Ты разве не в курсе, что наиболее эффективной системой счисления в плане экономного представления и операций с числами, является система с НЕ целым основанием -
е (2,71828...), поэтому чаще всего используются компьютеры с двоичной системой счисления (ближайшее меньшее целое). Которое к тому же достаточно просто реализуется технически. Тем не менее, существуют
компьютеры с троичной системой счисления, которая ближе к числу
е, и при прочих равных условиях компьютер, работающий в такой системе является более эффективным.
2. Для чего вообще можно использовать этот твой ИНИБ?
3. Почему его длина ограничивается именно 10-ю разрядами? Понимаешь в чём дело, если ты что-то делаешь, то должна быть чёткая цель - для чего всё это нужно? И всё используемые параметры должны быть определены разумным образом из каких-либо допущений либо напрямую из Технического задания.
4. Возможно, я чего-то не догоняю, но
как ты умудришься 10-ти разрядное 36-ричное число затолкать в 7 байт? Давай будем считать, что машина у нас - двоичная. Т.е. для представления одной 36-ричной цифры нам нужно 6 разрядов. Надеюсь, это очевидно: 5 разрядов - это только 32 различных комбинации, а нам нужно 36, т.е. необходим ещё один разряд, итого 6 разрядов. Сразу же видно, что
двоичное кодирование 36-ричных цифр неэффективно! Поскольку мы используем лишь 36 комбинаций из доступных 64. Идём дальше, с целью экономии, пусть шестёрки битов идут подряд, друг за дружкой, пересекая границы байт. Для записи 10-ти разрядного 36-ричного числа нам понадобится 10 х 6 = 60 бит, или 60 : 8 = 7,5 байт. Т.е. если считать байтами, то нам потребуется
восемь байт, а не семь. Кстати, поскольку у тебя в программе функция строковая, то она под каждый символ отводит один байт, таким образом, для твоего ИНИБ нужно
десять, а не семь байт! Ведь у тебя даже цикл для n от 0 до 9. Если я где-то ошибся - будь добр, поправь.
Ну, и самое главное, ведь программка и алгоритм соответственно,
крайне примитивны! Если словесно это описать, то будет:
1. Генерируем случайное число в диапазоне от 0 до 35, причём
используя встроенный стандартный алгоритм генерации случайного числа.
2. Присваиваем его символьный код соответствующему знакоместу выходного числа.
3. Повторяем с начала 10 раз.
END;
Естественно, что для столь примитивной программки не требуется какой-либо блок схемы, ведь по сути дела в этой программке всего лишь три оператора (если абстрагироваться от языка). На Си это можно сделать в два оператора, а если поизвращаться, то возможно и в один.
Так что на примере этой программки я не увидел квалификации "программиста с 20-ти летним стажем", извини.
P.S. А что, вопросов по поводу алгоритма, хотя бы укрупнённого, не подробного, не возникло?