Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/41: Рейтинг темы: голосов - 41, средняя оценка - 4.76
sonic007
1

Сложение шестнадцатеричных чисел

21.06.2008, 20:45. Показов 8320. Ответов 10
Метки нет (Все метки)

помогите реализовать задачу

в общем имеется текстовый файл. в котором каждая строчка - шестнадцатеричное число.
задача - сложение всех чисел файла и вывод результата на экран.. язык - паскаль..

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

program a1;
uses crt;
var a,b:string;
i,j,k,m:integer; c,d,x:array[1..253] of integer;
begin
clrscr;
readln(a);
readln(b);
j:=length(a);
for i:=1 to length(a) do
begin
val(a[i],c[j],m); j:=j-1;
end;
j:=length(b);
for i:=1 to length(b) do
begin
val(b[i],d[j],m); j:=j-1;
end;
if length(a)<length(b) then k:=length(b) else k:=length(a);
k:=k+1;
for i:=1 to k do
x[i]:=0;
for i:=1 to k do
begin
x[i]:=c[i]+d[i]+x[i];
if x[i]>=10 then
begin
x[i+1]:=x[i+1]+1;
x[i]:=x[i] mod 10;
end;
end;
if x[k]=0 then k:=k-1;
for i:=k downto 1 do write(x[i]);
readkey;
end.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2008, 20:45
Ответы с готовыми решениями:

Подсчет суммы шестнадцатеричных чисел
напишите программу которая получает 2 шестнадцатеричных числа, считает их сумму и выводит ответ в...

Вывод таблицы умножения шестнадцатеричных чисел
Программа выводит на экран таблицу умножения шестнадцатеричных чисел в пределах от 1h до Fh (h...

Получить множество всех общих шестнадцатеричных цифр трех натуральных чисел А, В, С
Составить программу, получает множество всех общих шестнадцатеричных цифр трех натуральных чисел А...

Напишите программу, которая печатает таблицу двоичных, восьмеричных и шестнадцатеричных эквивалентов десятичных чисел
Напишите программу, которая печатает таблицу двоичных, восьмеричных и шестнадцатеричных...

10
Почетный модератор
11253 / 4205 / 425
Регистрация: 12.06.2008
Сообщений: 12,135
21.06.2008, 22:13 2
Этот пример ничего из файлов не читает. Если я правильно понял задание, то что-то вроде этого:
Код
Uses Crt;
Var F : Text;
    S : String;
   Value, Res, C : Integer;
Begin
  Assign(F,'a.txt');  { Выбираем файл }
  Reset(F);   { Открываем для чтения }
  Res := 0;   { Обнуляем результат }
  While not Eof(F) do   { До тех пор, пока не дойдем до конца файла... }
  Begin
    ReadLn(T,S);   { Читаем очередную строку }
    S := '$'+S;   { В начало строки добавляем $ что бы считать ее как hex }
    Val(S,Value,C);  { Переводим из строки в число... если получится, то Value примет значение числа, а C станет равно 0 }
    If C=0 then Res := Res + Value; { Если ошибок небыло, то прибавляем очередное значение }
  End;
  Close(F);   { Закрываем файл }
  WriteLn('Сумма=',Res);  { Выводим результат на экран (в десятичном формате) }
End.
0
sonic007
22.06.2008, 04:02 3
забыл сказать самое главное: программа должна работать со сверхбольшими шестнадцатеричными числами типа fffffffffffffffffffffffffffffffffffffff

тип данных real, extended не использовать..

поэтому алгоритм, как мне кажется, должен быть следующим.
считываем строку ( число).
переводим число в десятичную систему.
алгоритмом, который задан в примере, суммируем все числа.
переводим обратно результат в шестнадцатеричную.
Почетный модератор
7385 / 2629 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
22.06.2008, 04:10 4
хм...переведи-ка число, что выше написал в десятичную. В какой переменной ты такие данные хранить собираешься? Да еще с суммированием...
По-моему, алгоритм должен быть такой же, как и при расчете столбиком на бумажке.
0
sonic007
22.06.2008, 14:18 5
да )) выглядит проще..
не поможешь организовать этот алгоритм ?
Почетный модератор
11253 / 4205 / 425
Регистрация: 12.06.2008
Сообщений: 12,135
22.06.2008, 20:07 6
Согласен с Vourhey - наверное только в столбик можно посчитать. Как-то громоздко получилось, но работает:
Код
Const HexTab : array[0..15] of char = ('0','1','2','3','4','5','6','7',
                                       '8','9','A','B','C','D','E','F');
Var Res : Array[1..100] of byte;
    I : Integer;
    S : String;
    F : Text;

  Procedure Sum(V : String);  { Процедура, которая прибавляет к результату новое значение }
  Var A : Byte;
      PosR : Integer;
  Begin
    For I := 1 to Length(V) do  { Переводим все буквы в верхний регистр и ищем ошибки }
    Begin
      If V[I] in['a'..'f'] then Dec(V[I],32); { Если этот симвл - маленькая буква, то уменьшаем ее значение на 32 (переводим в верхний регистр) }
      If not(V[I] in['0'..'9','A'..'F']) then  { Если это не шестнадцатиричное значение, то ошибка }
      Begin
        WriteLn(V,' is not hex!');
        Exit;
      End;
    End;
    For I := Length(V) downto 1 do
    Begin
      If V[I]>'9' then  { Переводим символ '0'..'F' в целое число 0..15... для этих целей можно использовать процедуру Val как в прошлом примере }
        A := Ord(V[I])-48-7
      else
        A := Ord(V[I])-48;
      PosR := 100-Length(V)+I;  { Выщитываем текущую позицию в массиве Res }
      Res[PosR] := Res[PosR] + A;  { Прибавляем значение к текущей позиции }
      If Res[PosR]>15 then    { Если значение слишком большое, то в этой позиции оставляем только остаток и переносим 1 в старшую позицию (сам потом не пойму, что тут написал :) ) }
      Begin
        Res[PosR-1] := Res[PosR-1] + 1; { Увеличиваем на 1 старшую позицию }
        Res[PosR] := Res[PosR] - 16;  { А в этой оставляем только остаток }
      End;
    End;
  End;

Begin
  For I := 1 to 100 do Res[I] := 0;  { Обнуляем результат }

  Assign(F,'a.txt');
  Reset(F);
  While not Eof(F) do
  Begin
    ReadLn(F,S);   { Читаем очередное значение }
    If S='' then Continue;  { Нефиг обрабатывать пустые строки }
    Sum(S);  { Прибавляем очередную строку к результату }
  End;
  Close(F);

{ Готовим значение, что бы вывести на экран }
  S := '';
  For I := 1 to 100 do
  Begin
    S := S + HexTab[Res[I]];  { Перевести из вида целого числа 0..15 в строковый вид '0'..'F' }
  End;
  While (S<>'') and (S[1]='0') do Delete(S,1,1);  { Убираем все нули из начала }
  WriteLn(S);  { Выводим на экран полученный результат в шестнадцатиричном виде }
End.
0
sonic007
23.06.2008, 03:41 7
Спасибо огромное за помощь!!!



замечена небольная бага при суммировании чисел вида
FFFFF + любое число..

прога во втором символе справа сохраняет 16 и не идет на перенос.. но это уже мелочи.. завтра посмотрю, а то глаза сейчас слипаются..
Почетный модератор
11253 / 4205 / 425
Регистрация: 12.06.2008
Сообщений: 12,135
23.06.2008, 08:07 8
хм... я сейчас попробовал, все правильно получилось... с калькулятором сходится
0
sonic007
23.06.2008, 11:45 9
сложи

fff+a или fff+b

и посмотри на результат

у меня получается F 9 и F A вместо нужных 1009 и 100А
Почетный модератор
11253 / 4205 / 425
Регистрация: 12.06.2008
Сообщений: 12,135
23.06.2008, 18:23 10
И правда... в процедуре Sum он проверяет переменную Res только последние n символов... где n = Length(V)
На скорую руку можно исправить, если к концу процедуры Sum добавить:
Код
    For I := 100 downto 2 do
    Begin
      If Res[I]>15 then
      Begin
        Res[I-1] := Res[I-1] + 1;
        Res[I] := Res[I] - 16;
      End;
    End;
0
sonic007
23.06.2008, 20:09 11
Спасибо огромное Humanoid-у. Век не забуду.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2008, 20:09

Создать программу кторое получает множество всех общих шестнадцатеричных цифр, трех наутральных чисел А,В,С
Помогите написать исходник , с использованием множества! Создать программу кторое получает...

Сложение шестнадцатеричных чисел
Здравствуйте. Начал изучать язык. Сейчас пытаюсь складывать шестнадцатеричные числа. Подскажите,...

Сложение шестнадцатеричных чисел
Здравствуйте,напишите пожалуйста учебники где можно бы было научится...

Написать программу ввода двух шестнадцатеричных чисел и вывода на экран этих чисел в двоичном виде
Помоги разобраться. Как исправить код так, чтобы выводило верно для двух цифр? У меня верно...

Сумма шестнадцатеричных чисел
Допустим есть текстовая строка, в которой находится 16ричное число. К нему нужно прибавить другое...

Ввод шестнадцатеричных чисел
Здорово, парни. А вот делаю проект на Visual Studio 2017 Community. Перенес его в C++Builder 6. И...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru