sonic007 » 23 июн 2008, 04:27
Вот мне помог товарищ Humanoid с cyberforum за что ему большой респект.
привожу код.. может кому то понадобится
[syntax='Delphi']
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 in['a'..'f'] then Dec(V,32); { Если этот симвл - маленькая буква, то уменьшаем ее значение на 32 (переводим в верхний регистр) }
If not(V 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>'9' then
A := Ord(V)-48-7
else
A := Ord(V)-48;
PosR := 100-Length(V)+I; { Выщитываем текущую позицию в массиве Res }
Res[PosR] := Res[PosR] + A; { Прибавляем значение к текущей позиции }
If Res[PosR]>15 then { ГДе то в этой части кода находится баг }
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 := 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]; { Перевести из вида целого числа 0..15 в строковый вид '0'..'F' }
End;
While (S<>'') and (S[1]='0') do Delete(S,1,1); { Убираем все нули из начала }
WriteLn(S); { Выводим на экран полученный результат в шестнадцатиричном виде }
End.
[/syntax]
в проге есть небольшая бага : если слаживать числа типа fff + число (т.е. при необходимости ввести новый разряд) , то перенос не работает.. в символе сохраняется значение "16" и дальше идет неправильное суммирование..
в общем посмотрю завтра что нужно подправить.
Вот мне помог товарищ Humanoid с cyberforum за что ему большой респект.
привожу код.. может кому то понадобится
[syntax='Delphi']
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
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 { ГДе то в этой части кода находится баг }
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.
[/syntax]
в проге есть небольшая бага : если слаживать числа типа fff + число (т.е. при необходимости ввести новый разряд) , то перенос не работает.. в символе сохраняется значение "16" и дальше идет неправильное суммирование..
в общем посмотрю завтра что нужно подправить.