Помощь - Поиск - Пользователи - Календарь
Полная версия: Как сравнить два шестнацатеричных числа?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
samec
Привет, всем! Условие следующее: есть массив чисел, заданных в шестнадцатеричной системе счисления. Числа читаются из текстового файла. Необходимо упорядочить этот массив по неубыванию, не переводя числа в другую С.С.
Собственно вопрос: как реализовать сравнение двух чисел, заданных в шестнацатеричной С.С.
volvo
Сорри, а какая разница, КАК ты описываешь числа? Если ты напишешь: A := $12, а потом сделаешь WriteLn(A), что получишь на экране? Однако, заметь, ты ж не переводил число в другую с/с ...
samec
что то я не пойму, как мне это может помочь?
По условию, числа записаны в файле следующим образом: по одному числу в строке, цифры разделены пробелами.
volvo
Покажи, как ты читаешь числа из файла (а самое главное - КУДА? В массив строк или все-таки в массив чисел?)
Malice
Цитата(samec @ 19.06.2007 23:01) *

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

Сравнивай как обычные строки и все..
мисс_граффити
хмм..
то есть ты считаешь, что
var s1,s2: string;

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



выводит правильный результат?
samec
Цитата(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
вот, наваял... читаю строки из файла в массив строк, дополняю их фиктивными нулями, сортирую, убираю фиктивные нули и делаю вывод... вроде работает...


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 2:45) *

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

Это мелочи жизни.. просто нулями добить и все перед сравнением.
while length (s1)<length (s2) do s1:='0'+s1;
while length (s2)<length (s1) do s2:='0'+s2;
samec
так и сделал smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.