for I := 1 to Length(hex) do begin
case UpCase(hex) of
'0': BIN := BIN + '0000';
'1': BIN := BIN + '0001';
'2': BIN := BIN + '0010';
{ну тут идет длинное перечисление}
'F': BIN := BIN + '1111';
end;
Судя по оператору Length (hex), переменная hex имеет тип string.
Как при этом Вы умудряетесь брать Upcase от целой строки, а потом использовать это в case????
Возможно, препод хочет цикл (если он хочет именно цикл): от '0' до 'F'. И все было бы хорошо, то между группой символом '0'..'9' и 'A'..'F' находится еще прорва символов. Так что одним циклом тут не обойтись.
Может, он хочет, чтобы 16ричные цифры в двоичные переводились в цикле?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Цель задачи какая? Я допустим не телепат чтобы додумать, что вы пытаетесь сделать. Я могу предположить несколько вариантов: 1) Вам дали задание с точной формулировкой. Вы сделали по своему и препода это не устраивает. Он указал вам пальцем то место где надо сделать как он просит. 2) Вам дали готовый код и указали пальцем где переделать.
Заменить кусок ? хммм...
Цель перевода чисел или что-то иное?
судя по коду вы вводите с клавиатуры число(подразумеваю строку hex с числами) и он должен перевести его в двоичный формат? То как сделали вы да.. вариант, но слишком громоздко поэтому от вас и требуют упрощения.
Могу предложить сделать так:
[syntax=delphi]
function HexToBin(Hexadecimal: string): string;
const
BCD: array [0..15] of string =
('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
var
i: integer;
begin
for i := Length(Hexadecimal) downto 1 do
Result := BCD[StrToInt('$' + Hexadecimal)] + Result;
end;
[/syntax]
Вот вам и получится цикл:
[syntax=delphi]
var
S:string;
j:integer;
begin
for j := 1 to Length(hex) do
begin
S:=HexToBin(hex[j]); { где hex[j] - ваше число в шеснадцатиричной системе.}
writeln(S);
end;
end.
[/syntax]
BHy4ok, спасибо, но вариант с массивом уже применялся и был отпавлнен на исправление с использованием Case.
Теперь необходимо заменить опреатор upcase на цикл.
зы: да, цель задачи - перевод числа из шестнадцатеричного в двоичное.
да Вы вдумайтесь в суть вопроса! Апкейс никаким рациональным способом на цикл заменить нельзя. Апкейс - это сдвиг по таблице соответствия. Т.е. максимум можно говорить о замене апкейс на оператор case
" писал(а):Апкейс никаким рациональным способом на цикл заменить нельзя. Апкейс - это сдвиг по таблице соответствия. Т.е. максимум можно говорить о замене апкейс на оператор case
Можно. Пиши сдвиг за ord('a')-ord('A') шагов в цикле, пока не переведёшь символ нижнего регистра в такой же, но верхний. И всё это безобразие будет называться: как на элементарной задаче израсходовать побольше ресурсов? Сам преподаю информатику, но этого колегу абсолютно не понимаю. То есть не саму задачу (её ещё можно понять), а зачем это задано? Я бы задал как раз наоборот.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
" писал(а):for I := 1 to Length(hex) do begin
case UpCase(hex) of
'0': BIN := BIN + '0000';
'1': BIN := BIN + '0001';
'2': BIN := BIN + '0010';
{ну тут идет длинное перечисление}
'F': BIN := BIN + '1111';
end;
Ошибка во второй строке, аргумент должне быть hex, то есть отдельный символ, а не строка, так как ветви соотвествуют вариантам именно символа, а соотвествовать вариантам строки вё равно не могут, так как заранеее предсказать на этапе разрабоки варианты целой строки нельзя.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".