Каким циклом можно заменить оператор UpCase в pascale.

Ответить
fareng8
Сообщения: 12
Зарегистрирован: 14 янв 2009, 21:33

Вообщем есть строка, обработку символов сделал через 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 - элемент строки
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Судя по оператору Length (hex), переменная hex имеет тип string.
Как при этом Вы умудряетесь брать Upcase от целой строки, а потом использовать это в case????

Возможно, препод хочет цикл (если он хочет именно цикл): от '0' до 'F'. И все было бы хорошо, то между группой символом '0'..'9' и 'A'..'F' находится еще прорва символов. Так что одним циклом тут не обойтись.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Может, он хочет, чтобы 16ричные цифры в двоичные переводились в цикле?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Хыиуду писал(а):Может, он хочет, чтобы 16ричные цифры в двоичные переводились в цикле?
Так у него там и так стоит цикл:
for I := 1 to Length(hex) do
fareng8
Сообщения: 12
Зарегистрирован: 14 янв 2009, 21:33

Хыиуду, они и так циклом передибаются.
Надо еще и циклом заменить upcase
BHy4ok
Сообщения: 237
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

Цель задачи какая? Я допустим не телепат чтобы додумать, что вы пытаетесь сделать. Я могу предположить несколько вариантов: 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]
< L3X. (ICQ: 8721378, Mail - l3x@list.ru)
fareng8
Сообщения: 12
Зарегистрирован: 14 янв 2009, 21:33

BHy4ok, спасибо, но вариант с массивом уже применялся и был отпавлнен на исправление с использованием Case.
Теперь необходимо заменить опреатор upcase на цикл.

зы: да, цель задачи - перевод числа из шестнадцатеричного в двоичное.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

да Вы вдумайтесь в суть вопроса! Апкейс никаким рациональным способом на цикл заменить нельзя. Апкейс - это сдвиг по таблице соответствия. Т.е. максимум можно говорить о замене апкейс на оператор case
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):Апкейс никаким рациональным способом на цикл заменить нельзя. Апкейс - это сдвиг по таблице соответствия. Т.е. максимум можно говорить о замене апкейс на оператор case
Можно. Пиши сдвиг за ord('a')-ord('A') шагов в цикле, пока не переведёшь символ нижнего регистра в такой же, но верхний. И всё это безобразие будет называться: как на элементарной задаче израсходовать побольше ресурсов? Сам преподаю информатику, но этого колегу абсолютно не понимаю. То есть не саму задачу (её ещё можно понять), а зачем это задано? Я бы задал как раз наоборот.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):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, то есть отдельный символ, а не строка, так как ветви соотвествуют вариантам именно символа, а соотвествовать вариантам строки вё равно не могут, так как заранеее предсказать на этапе разрабоки варианты целой строки нельзя.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить