Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2010, 10:34   #1
Лесная Эльфийка
Пользователь
 
Аватар для Лесная Эльфийка
 
Регистрация: 03.12.2010
Сообщений: 35
По умолчанию Системы счисления ^^(Паскаль)

Шестнадцатеричное
число записано в строковой переменной. Написать программу, которая
переводит это число в десятичную систему счисления. (видела много подобных программ, но не додумаюсь как оставить только 16-10 ^^"")
Лесная Эльфийка вне форума Ответить с цитированием
Старый 03.12.2010, 12:20   #2
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Цитата:
видела много подобных программ, но не додумаюсь как оставить только 16-10 ^^""
А самы не пробовали сделать? вот я попробовал и сделал, держите
Код:
   uses crt;
   var hex: string;
   a: char;
   x,c,i,k: integer;
   s: real;
BEGIN
   clrscr;
   writeln('Vvedite hex-chislo');
   readln(hex);
   k:=0;
   for i:=length(hex) downto 1 do
     begin
       val(hex[i],x,c);
       if c=0 then s:=s+x*(exp(k*ln(16)))
                 else
                   begin
                      a:=hex[i];
                      case a of
                      'A': x:=10;
                      'B': x:=11;
                      'C': x:=12;
                      'D': x:=13;
                      'E': x:=14;
                      'F': x:=15;
                      end;
       s:=s+x*(exp(k*ln(16)));
                   end;
     k:=k+1;
     end;
   writeln('V dec system schislenia = ',s:0:0);
   readln;
END.
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.
Niro вне форума Ответить с цитированием
Старый 03.12.2010, 14:29   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

>> s:=s+x*(exp(k*ln(16)));
жуть то какая... зачем это?!

вот два решения.
первое.
Используется одна "хитрая" особенность стандартной паскалевской функции VAL()
Код:
var 
  s : string;
  d,err : integer;
begin
  WriteLn;
  Write('Введите число в шестнадцатеричной системе: ');
  ReadLn(s);
  Val('$'+s, d, err);
  if err<>0 then WriteLn('Ошибка ввода, число '+s+' не является верной записью шестнад/числа')
  else WriteLn('Десятичное значение числа равно ',d);
  readln;
end.
второе. "честное", по всем правилам перевода из одной системы счисления в другую.
Код:
function StrHexToInt(S :  string; var Err : integer) : Longint;
const  Digits : array[0..$F] of Char = '0123456789ABCDEF';
var
  D    : LongInt;
  i, k : integer;
begin
  D := 0;
  Err := 0;
  i := 1;
  while (i<=Length(S)) and (Err=0) do begin
    k := Pos(Upcase(S[i]), Digits);
    if k=0 then Err := i
    else
      D := D * 16 + (k-1);
    inc(i);
  end;
  StrHexToInt := D;
end;


var 
  s : string;
  d, err : integer;
begin
  WriteLn;
  Write('Введите число в шестнадцатеричной системе: ');
  ReadLn(s);
  d := StrHexToInt(s, err);
  if err<>0 then WriteLn('Ошибка ввода, число '+s+' не является верной записью шестнад/числа')
  else WriteLn('Десятичное значение числа равно ',d);
  readln;
end.
на форуме подобная задача решалась неоднократно,
думаю найти через поиск не составило бы особого труда...

Последний раз редактировалось Serge_Bliznykov; 03.12.2010 в 14:31.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2010, 14:51   #4
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Цитата:
жуть то какая... зачем это?!
Это риторический вопрос или нет? если нет, то чтобы перевести число из q-ичной сс в десятичную надо: над цифрами q-ичного числа подписать их порядковые номера, начиная с нуля и начиная с конца числа, затем... вообщем например:

номера 210
число 1С5=(5*16^0)+(C*16^1)+1*16^2)=5+192 +256=453

вот так, так что мой код хоть и не такой красивый как первый, но вполне понятный, зная алгоритм, и достаточно короткий
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.
Niro вне форума Ответить с цитированием
Старый 03.12.2010, 15:12   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Niro а что, мой пример недостаточно понятный или короткий?

я вообще-то другое имел в виду. Возведение в степень НЕ НУЖНО!! Совсем!
Достаточно операции умножения на 16.
и всё.

для вашего примера:
число 1С5= ((1*16) + C)*16 + 5 = 453
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.12.2010, 11:15   #6
Лесная Эльфийка
Пользователь
 
Аватар для Лесная Эльфийка
 
Регистрация: 03.12.2010
Сообщений: 35
По умолчанию

Благодарю. ^__^
Лесная Эльфийка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Системы счисления.10->5-7. Corpinccom Помощь студентам 0 22.09.2010 12:54
Системы Счисления amki6 Помощь студентам 0 11.03.2010 18:32
паскаль,программа для перевода чисел из 10-ой системы счисления в другую до10-ой Nikitaunett Помощь студентам 4 28.11.2009 20:06
Системы счисления To4H9IK Помощь студентам 2 02.10.2009 17:12
Системы счисления. glupayastudentka Помощь студентам 1 23.06.2009 22:00