Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Как сравнить два шестнацатеричных числа?

Автор: samec 20.06.2007 2:01

Привет, всем! Условие следующее: есть массив чисел, заданных в шестнадцатеричной системе счисления. Числа читаются из текстового файла. Необходимо упорядочить этот массив по неубыванию, не переводя числа в другую С.С.
Собственно вопрос: как реализовать сравнение двух чисел, заданных в шестнацатеричной С.С.

Автор: volvo 20.06.2007 2:18

Сорри, а какая разница, КАК ты описываешь числа? Если ты напишешь: A := $12, а потом сделаешь WriteLn(A), что получишь на экране? Однако, заметь, ты ж не переводил число в другую с/с ...

Автор: samec 20.06.2007 2:52

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

Автор: volvo 20.06.2007 3:06

Покажи, как ты читаешь числа из файла (а самое главное - КУДА? В массив строк или все-таки в массив чисел?)

Автор: Malice 20.06.2007 3:40

Цитата(samec @ 19.06.2007 23:01) *

Собственно вопрос: как реализовать сравнение двух чисел, заданных в шестнацатеричной С.С.

Сравнивай как обычные строки и все..

Автор: мисс_граффити 20.06.2007 5:45

хмм..
то есть ты считаешь, что

var s1,s2: string;

begin
s1:='F';
s2:='1AAF';
if s1>s2 then
writeln(s1,'>',s2)
else
writeln(s2,'>',s1);
readln;
end.



выводит правильный результат?

Автор: samec 20.06.2007 9:05

Цитата(volvo @ 20.06.2007 3:06) *

Покажи, как ты читаешь числа из файла (а самое главное - КУДА? В массив строк или все-таки в массив чисел?)

читаю в массив чисел, вот так:

var
f:text;
mas:array[1..100,1..100] of integer;
kol:integer;

procedure write_file;
var
ch:char;
i:integer;
begin
Assign(f,'data.txt');
Reset(f);
for i:=1 to 100 do
for kol:=1 to 100 do
mas[i,kol]:=-1;
i:=1;
kol:=0;
while not EOF(f) do
begin
read(f,ch);
case ch of
'0':begin mas[kol+1,i]:=0; inc(i); end;
'1':begin mas[kol+1,i]:=1; inc(i); end;
'2':begin mas[kol+1,i]:=2; inc(i); end;
'3':begin mas[kol+1,i]:=3; inc(i); end;
'4':begin mas[kol+1,i]:=4; inc(i); end;
'5':begin mas[kol+1,i]:=5; inc(i); end;
'6':begin mas[kol+1,i]:=6; inc(i); end;
'7':begin mas[kol+1,i]:=7; inc(i); end;
'8':begin mas[kol+1,i]:=8; inc(i); end;
'9':begin mas[kol+1,i]:=9; inc(i); end;
'A':begin mas[kol+1,i]:=10; inc(i); end;
'B':begin mas[kol+1,i]:=11; inc(i); end;
'C':begin mas[kol+1,i]:=12; inc(i); end;
'D':begin mas[kol+1,i]:=13; inc(i); end;
'E':begin mas[kol+1,i]:=14; inc(i); end;
'F':begin mas[kol+1,i]:=15; inc(i); end;
#13: begin inc(kol); i:=1; end;
end;
end;
Close(f);
end;



Добавлено через 5 мин.
Цитата(мисс_граффити @ 20.06.2007 5:45) *

выводит правильный результат?

если S1 дополнить фиктивными нулями, то результат будет правильным... но как то это уж слишком просто smile.gif

Автор: samec 20.06.2007 10:04

вот, наваял... читаю строки из файла в массив строк, дополняю их фиктивными нулями, сортирую, убираю фиктивные нули и делаю вывод... вроде работает...


program sistem;
uses crt;
var
f:text;
mas:array[1..100] of string;
kol:integer;

procedure write_file;
var
ch:char;
i:integer;
begin
Assign(f,'data.txt');
Reset(f);
i:=1;
kol:=1;
while not EOF(f) do
begin
read(f,ch);
if (ch=#13) then
inc(kol)
else
if (ch<>' ')and(ch<>#10) then
mas[kol]:=mas[kol]+ch;
end;
Close(f);
end;

procedure dopoln;
var
i,max:integer;
begin
max:=length(mas[1]);
for i:=2 to kol do
if (max<length(mas[i])) then
max:=length(mas[i]);
for i:=1 to kol do
while (length(mas[i])<max) do
mas[i]:='0'+mas[i];
end;

procedure sort;
var
st:string;
i,k:integer;
begin
for k:=1 to kol-1 do
for i:=1 to kol-k do
if(mas[i]>mas[i+1]) then
begin
st:=mas[i];
mas[i]:=mas[i+1];
mas[i+1]:=st;
end;
end;

procedure del;
var
i:integer;
begin
for i:=1 to kol do
while (mas[i,1]='0') do
delete(mas[i],1,1);
end;

procedure print;
var
i:integer;
begin
for i:=1 to kol do
writeln(mas[i]);
end;

begin
clrscr;
write_file;
dopoln;
sort;
del;
print;
readkey;
end.


Автор: Malice 20.06.2007 12:28

Цитата(мисс_граффити @ 20.06.2007 2:45) *

хмм..
то есть ты считаешь, что <skip>
выводит правильный результат?

Это мелочи жизни.. просто нулями добить и все перед сравнением.
while length (s1)<length (s2) do s1:='0'+s1;
while length (s2)<length (s1) do s2:='0'+s2;

Автор: samec 20.06.2007 13:26

так и сделал smile.gif