LINUX.ORG.RU

История изменений

Исправление bormant, (текущая версия) :

во втором и третьем случае какой делать?

А оно не во втором и третьем ;) оно заранее должно быть понятно, что там в потоке ожидается, потому как
10(2) = 2
10(10) = 10
10(16) = 16
...

Поэтому нужно заранее определиться с входящим потоком. Например, стандартный Read/ReadLn паскалевый, читая из потока число, полагает, что если оно начинается с цифры 0..9 — десятичное, с $ — 16-ричное, т.е. определение по необязательному префиксу. В псевдокоде:

repeat Read(c) until c>' ';
Base:=10;
if c='$' then begin
  Base:=16; Read(c);
end;

Соответственно, необходимо добавить контроль на допустимые цифры, '0'..'9' для 10-го числа, '0'..'9','A'..'F' — для 16-го.

Если есть желание, можно усложнять в ту или иную сторону, добавить префиксов по вкусу; соответственно придется контролировать и варианты ввода. Если префиксов ожидается больше одного, есть смысл цифру считать отдельно — проще контролировать:
d:={...}; // в зависимости от режима 10, 16, еще какой-то
if d<Base then
  Res:=Res*Base+d
else {ошибка}

В вариантах выше база числа известна до вычитывания его цифр...

Вероятно, на стандартную процедуру ввода возлагать лишнего не совсем правильно — если программисту нужно больше обычного, пусть читает строку и сам разбирает под любые нестандартные хотелки.

Исходная версия bormant, :

во втором и третьем случае какой делать?

А оно не во втором и третьем ;) оно заранее должно быть понятно, что там в потоке ожидается, потому как
10(2) = 2
10(10) = 10
10(16) = 16
...

Поэтому нужно заранее определиться с входящим потоком. Например, стандартный Read/ReadLn паскалевый, читая из потока число, полагает, что если оно начинается с цифры 0..9 — десятичное, с $ — 16-ричное, т.е. определение по необязательному префиксу. В псевдокоде:

Base:=10;
repeat Read(c) until c>' ';
if c='$' then begin
  Base:=16; Read(c);
end;

Соответственно, необходимо добавить контроль на допустимые цифры, '0'..'9' для 10-го числа, '0'..'9','A'..'F' — для 16-го.

Если есть желание, можно усложнять в ту или иную сторону, добавить префиксов по вкусу; соответственно придется контролировать и варианты ввода. Если префиксов ожидается больше одного, есть смысл цифру считать отдельно — проще контролировать:
d:={...}; // в зависимости от режима 10, 16, еще какой-то
if d<Base then
  Res:=Res*Base+d
else {ошибка}

В вариантах выше база числа известна до вычитывания его цифр...

Вероятно, на стандартную процедуру ввода возлагать лишнего не совсем правильно — если программисту нужно больше обычного, пусть читает строку и сам разбирает под любые нестандартные хотелки.