Страница 1 из 1
Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 12 фев 2009, 00:48
fareng8
Вообщем есть строка, обработку символов сделал через upcase. Препод попросил заменить оператор upcase на цикл.
вот кусок кода, который надо переделать:
Код: Выделить всё
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;
bin, hex - строки
i - элемент строки
.
Добавлено: 12 фев 2009, 09:52
BBB
Судя по оператору Length (hex), переменная hex имеет тип string.
Как при этом Вы умудряетесь брать Upcase от целой строки, а потом использовать это в case????
Возможно, препод хочет цикл (если он хочет именно цикл): от '0' до 'F'. И все было бы хорошо, то между группой символом '0'..'9' и 'A'..'F' находится еще прорва символов. Так что одним циклом тут не обойтись.
Re: Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 12 фев 2009, 14:23
Хыиуду
Может, он хочет, чтобы 16ричные цифры в двоичные переводились в цикле?
.
Добавлено: 12 фев 2009, 16:22
BBB
Хыиуду писал(а):Может, он хочет, чтобы 16ричные цифры в двоичные переводились в цикле?
Так у него там и так стоит цикл:
for I := 1 to Length(hex) do
Re: Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 12 фев 2009, 18:18
fareng8
Хыиуду, они и так циклом передибаются.
Надо еще и циклом заменить upcase
Re: Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 12 фев 2009, 20:06
BHy4ok
Цель задачи какая? Я допустим не телепат чтобы додумать, что вы пытаетесь сделать. Я могу предположить несколько вариантов: 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]
Re: Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 13 фев 2009, 00:39
fareng8
BHy4ok, спасибо, но вариант с массивом уже применялся и был отпавлнен на исправление с использованием Case.
Теперь необходимо заменить опреатор upcase на цикл.
зы: да, цель задачи - перевод числа из шестнадцатеричного в двоичное.
Re: Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 15 фев 2009, 13:14
Naeel Maqsudov
да Вы вдумайтесь в суть вопроса! Апкейс никаким рациональным способом на цикл заменить нельзя. Апкейс - это сдвиг по таблице соответствия. Т.е. максимум можно говорить о замене апкейс на оператор case
Re: Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 16 фев 2009, 05:54
atavin-ta
" писал(а):Апкейс никаким рациональным способом на цикл заменить нельзя. Апкейс - это сдвиг по таблице соответствия. Т.е. максимум можно говорить о замене апкейс на оператор case
Можно. Пиши сдвиг за ord('a')-ord('A') шагов в цикле, пока не переведёшь символ нижнего регистра в такой же, но верхний. И всё это безобразие будет называться: как на элементарной задаче израсходовать побольше ресурсов? Сам преподаю информатику, но этого колегу абсолютно не понимаю. То есть не саму задачу (её ещё можно понять), а зачем это задано? Я бы задал как раз наоборот.
Re: Каким циклом можно заменить оператор UpCase в pascale.
Добавлено: 16 фев 2009, 06:02
atavin-ta
" писал(а):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
, то есть отдельный символ, а не строка, так как ветви соотвествуют вариантам именно символа, а соотвествовать вариантам строки вё равно не могут, так как заранеее предсказать на этапе разрабоки варианты целой строки нельзя.