Другие языки программирования и технологии
Каким циклом можно заменить оператор UpCase в pascale
Вообщем есть строка, обработку символов сделал через upcase. Препод попросил заменить оператор upcase на цикл.вот кусок кода, который надо переделать:for I := 1 to Length(hex) do begincase UpCase(hex) of'0': BIN := BIN + '0000';'1': BIN := BIN + '0001';'2': BIN := BIN + '0010';{ну тут идет длинное перечисление}'F': BIN := BIN + '1111';end;hex и bin - переменные строкого типа, то бишь строки.I - элемент строки.общая цель задачи -перевод шестнадцатеричного число в двоичное.
Доброго времени суток.
Вы этот вопрос мучаете не первую неделю. "Вам шашечки или ехать? " (с) Это я по поводу общей цели. Чем вас не устраивает такое решение, которое я уже давал? На этот раз дополню его комментариями.
uses Crt;
const arrHex : array[0..15] of String[4] = (
'0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111'); {массив двоичных эквивалентов 16-ричных цифр}
var
S, S1 : String;
j, n : Integer;
begin
ClrScr;
ReadLn(S); {получаем входную строку}
for j:=1 to Length(S) do begin {для каждой 16-ричной цифры}
S[j] := UpCase(S[j]); {преобразуем ее к верхнему регистру (эту строчку можно опустить - см. дальше) }
{а дальше с помощью функции Ord получаем числовое значение для 16-ричной цифры ( '0' 0,'1'=1, ..'A'=10, 'B'=11... 'F'=15)}
case S[j] of
'0'..'9' : n := Ord(S[j]) - Ord('0');
'A'..'F' : n := Ord(S[j]) - Ord('A') + 10;
end;
S1 := S1 + arrHex[n]; {по полученному числовому значению, используя его в качестве индекса, из массива выбирается двоичный эквивалент 16-ричной цифры и накапливается в выходной строке}
end;
WriteLn(S1); {вывод результата на экран}
ReadLn;
end.
Все.
Вы решили расписать в Case каждую из 16 цифр. Можно и так, но не рационально.
Теперь по поводу UpCase. Эта функция применена здесь исключительно для того, чтобы перевод работат как для чисел, набранных в верхнем регистре (12A2FC), так и для нижнего (12a2fc). Ее можно совершенно безболезненно исключить, если список селекторов в Case сделать таким
'A'..'F', 'a'..'f' : n := Ord(S[j]) - Ord('A') + 10; Для моего варианта программы, и
'F', 'f': BIN := BIN + '1111'; для вашего.
Что же касается замены UpCase на цикл, то сдается мне, что препод просто проверяет ваши знания языка и понимание кода программы, которых у вас, увы, не наблюдается. Либо имеет место другой вариант: их не наблюдается у препода, правда вероятность такого меньше.
Удачи!
Вы этот вопрос мучаете не первую неделю. "Вам шашечки или ехать? " (с) Это я по поводу общей цели. Чем вас не устраивает такое решение, которое я уже давал? На этот раз дополню его комментариями.
uses Crt;
const arrHex : array[0..15] of String[4] = (
'0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111'); {массив двоичных эквивалентов 16-ричных цифр}
var
S, S1 : String;
j, n : Integer;
begin
ClrScr;
ReadLn(S); {получаем входную строку}
for j:=1 to Length(S) do begin {для каждой 16-ричной цифры}
S[j] := UpCase(S[j]); {преобразуем ее к верхнему регистру (эту строчку можно опустить - см. дальше) }
{а дальше с помощью функции Ord получаем числовое значение для 16-ричной цифры ( '0' 0,'1'=1, ..'A'=10, 'B'=11... 'F'=15)}
case S[j] of
'0'..'9' : n := Ord(S[j]) - Ord('0');
'A'..'F' : n := Ord(S[j]) - Ord('A') + 10;
end;
S1 := S1 + arrHex[n]; {по полученному числовому значению, используя его в качестве индекса, из массива выбирается двоичный эквивалент 16-ричной цифры и накапливается в выходной строке}
end;
WriteLn(S1); {вывод результата на экран}
ReadLn;
end.
Все.
Вы решили расписать в Case каждую из 16 цифр. Можно и так, но не рационально.
Теперь по поводу UpCase. Эта функция применена здесь исключительно для того, чтобы перевод работат как для чисел, набранных в верхнем регистре (12A2FC), так и для нижнего (12a2fc). Ее можно совершенно безболезненно исключить, если список селекторов в Case сделать таким
'A'..'F', 'a'..'f' : n := Ord(S[j]) - Ord('A') + 10; Для моего варианта программы, и
'F', 'f': BIN := BIN + '1111'; для вашего.
Что же касается замены UpCase на цикл, то сдается мне, что препод просто проверяет ваши знания языка и понимание кода программы, которых у вас, увы, не наблюдается. Либо имеет место другой вариант: их не наблюдается у препода, правда вероятность такого меньше.
Удачи!
for i:=1 to 16 do if UpCase(hex)=num then Bin:=Bin+hexbin;
массивы num и hexbin сам догадайся, чем заполнить
массивы num и hexbin сам догадайся, чем заполнить
Похожие вопросы
- Как архитектура фон Неймана позволяет заменить оператор - перемычки в "железе" - числами? Как это может работать?
- Написал небольшую программу, не могу понять почему не работает цикл while и оператор else
- Заменить цикл условным оператором if
- Какой оператор в Си позволяет досрочно завершить ВСЕ циклы (например если цикл в цикле) или как это вообще можно сделать
- C++. В операторе switch нельзя разве использовать case x? а x пробежать в цикле for?
- Помогите пожалуйста. Нужен в программе цикл или можно обойтись оператором if? (прога внутри)
- Как правильно использовать операторы цикла?
- напишите програму на с++ не используя оператор цикла
- Почему goto считается неправильным оператором? И как предлагается "правильно" выйти из третьего вложенного цикла?
- Вычислить выражение с помощью оператора цикла. Turbo Pascal.