Помощь - Поиск - Пользователи - Календарь
Полная версия: И снова системы счисления
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Страницы: 1, 2
Дымка
И снова я со своими глупыми вопросами...
Нужна помощь в сложении, вычитании, умножении и делении чисел в шестнадцатиричной с/с, сама как сделать это не понимаю... Вариант перевода сначала в другую систему не подходит. А еще перевод из двоичной с/с в шестнадцатеричную... Помогите. пожалуйста...

Добавлено: 11.07.05 17:03
и еще, как задать массив чисел, записанных в шестнадцатиричной с/с
volvo
Как ты хочешь их хранить? В каком виде? Строки, или обычные 10-ные числа?
Если строки, то так:
var hex_arr: array[1 .. 10] of string[8]; {максимум до $FFFFFFFF}
Guest
Цитата(Дымка @ 11.07.05 16:32)
Вариант перевода сначала в другую систему не подходит.

Не в другую, а из строки в число полюбому надо будет.
Дымка
Думалка отказывается работать....;( Помогите...
volvo
Цитата(Дымка @ 11.07.05 16:32)
Вариант перевода сначала в другую систему не подходит.

Это уже обсуждалось на форуме... Тогда пришли к заключению, что это нереализуемо. Все программы так или иначе работают через 10-ную с/с (хочешь что-то возразить? Возьми лист бумаги, и попробуй перемножить $438 и $54 НЕ переводя это в другую с/с. Не выходит? Как же ты хочешь объяснить это компьютеру?).
Дымка
и что мне делать? мне сначала надо реализовать набор подпрограмм, которые выполняют определенные действия, а потом использовать их для решения 2 задач...
Guest
Цитата(Дымка @ 11.07.05 17:52)
и что мне делать? мне сначала надо реализовать набор подпрограмм, которые выполняют определенные действия, а потом использовать их для решения 2 задач...


Тогда делаешь так:
Создаешь сперва 2 самые главные функции:
1. Из строки в число:

function from_(s:string;ss:byte):longint;
var q:longint;
begin
q:=0;
for i:=1 to length(s) do begin
s[i]:=char(ord(s[i]) or 32);
case s[i] of
'0'..'9': q:=q*ss+byte(s[i])-ord('0');
'a'..'z': q:=q*ss+byte(s[i])-ord('a')+10;
end; end;
from_:=q;
end;


2. из числа в строку

function to_(q:longint;ss:byte):string;
var s:string;
i:longint;
begin
s:='';
repeat
i:=q-trunc(q/ss)*ss;
if i>9 then i:=i+ord('A')-ord('9')-1;
s:=chr(i+ord('0'))+s;
q:=trunc(q/ss);
until q=0;
to_:=s;
end;



а потом реализуешь набор подпрограмм, типа этих:
function MulHexToHex(s1,s2:string):string;
begin MulHexToHex:=to_(from_(s1,16)*from_(s2,16),16); end;

function DivHexToHex(s1,s2:string):string;
begin DivHexToHex:=to_(from_(s1,16) div from_(s2,16),16); end;

function AddHexToHex(s1,s2:string):string;
begin addHexToHex:=to_(from_(s1,16) +from_(s2,16),16); end;

function HexToBin(s:string):string;
begin HexToBin:=to_(from_(s,16),2); end;

function BinToHex(s:string):string;
begin BinToHex:=to_(from_(s,2),16); end;


На сколько фантазии хватит :yes:
Дымка
function BinToHex(s:string):string;{iz 2 v 16} 
begin 
   BinToHex:=to_(from_(s,2),16);
end;

А если сделать то же самое с 10-ной?? Это будет работать??
function perevod(s:string):string;{iz 2 v 10} 
begin 
   BinToHex:=to_(from_(s,2),10);
end;
Guest
Цитата(Дымка @ 11.07.05 19:10)
А если сделать то же самое с 10-ной?? Это будет работать??
function perevod(s:string):string;{iz 2 v 10}
begin
  BinToHex:=to_(from_(s,2),10);
end;


Конечно, только результат будет в строковой переменной.
Если тебе просто напечатать результат, то лучше просто:
writeln(from_(s,2));
иначе to_(..,10) - тоже самое, что и Val.
Дымка
функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).
В смысле???что от меня хотят?
Guest
Цитата(Дымка @ 11.07.05 20:03)
функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).
В смысле???что от меня хотят?


function RavnoHEX(s1,s2:string):boolean;
begin
RavnoHEX:=from_(s1,16)=from_(s2,16);
end;

function NeRavnoHEX(s1,s2:string):boolean;
begin
NeRavnoHEX:=not(from_(s1,16)=from_(s2,16));
end;

function BolsheHEX(s1,s2:string):boolean;
begin
BolsheHEX:=not(from_(s1,16)>from_(s2,16));
end;


И в том же духе smile.gif

Теги не просто так на форуме введены, хотелось бы напомнить !!!
Дымка
functinon BolsheHEX(s1,s2:string):boolean;
begin
BolsheHEX:=not(from_(s1,16)>from_(s2,16));
end;


Наверное, BolsheHEX:=(from_(s1,16)>from_(s2,16)); или я совсем не понимаю?!:(

functinon menweHEX(s1,s2:string):boolean;
begin
menweHEX:=(from_(s1,16)<from_(s2,16));
end;

functinon menw_ili_ravn(s1,s2:string):boolean;
begin
menw_ili_ravn:=(from_(s1,16)<=from_(s2,16));
end;

functinon Bolsh_ili_ravn(s1,s2:string):boolean;
begin
BolsheHEX:=(from_(s1,16)>=from_(s2,16));
end;


Так?

Не забываем про теги !!!
mlc
Цитата(Дымка @ 11.07.05 20:18)
functinon BolsheHEX(s1,s2:string):boolean;
begin
BolsheHEX:=not(from_(s1,16)>from_(s2,16));
end;


Наверное, BolsheHEX:=(from_(s1,16)>from_(s2,16)); или я совсем не понимаю?!:(


Да, да, я копировал просто.. У тебе тоже самое в последней функции. smile.gif

>Так?
Ну да, вроде так.
Дымка
Так...Теперь меня запутали в самом задании!!!Может быть, я что-то неправильно понимаю.Но народ. у которых аналогичная постановка предлагают и пункты а-з и цифры 1,2 вынести в меню...и решать все как отдельные задачи...К тому же подпрограммы некоторые будут использоваться и в решении 1 и 2...Объясните, что от меня хотят.. unsure.gif
Цитата
Реализовать набор подпрограмм для выполнения следующих операций над натуральными числами в шестнадцатеричной системе счисления:  а) сложение; б) вычитание; в) умножение; г) деление; д) перевод из двоичной системы счисления в шестнадцатеричную; е) перевод из шестнадцатеричной системы счисления в десятичную; ж) функция проверки правильности записи числа в шестнадцатеричной системе счисления; з) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).
1) Возвести число в степень (основание и показатель степени записаны в шестнадцатеричной системе счисления). Ответ выдать в шестнадцатеричной и десятичной системах счисления.
2) Дан массив A - массив чисел, записанных в шестнадцатеричной системе счисления. Отсортировать его в порядке убывания. Ответ выдать в шестнадцатеричной и десятичной системах счисления.
volvo
Вот она - самая основная проблема !!! Сначала нужно было думать, что именно решается, как отдельная задача, а что - нет, а уж потом приступать к реализации. А если перед самой сдачей программы кто-нибудь еще что-нибудь придумает? Программа снова будет исправляться?
Дымка
<_< Поясните, а?? А исправлять еще особенно нечего...Эта задача продвигается очень медленными темпами...
mlc
Цитата(Дымка @ 11.07.05 21:33)
<_<  Поясните, а?? А исправлять еще особенно нечего...Эта задача продвигается очень медленными темпами...

Во-первых, правильно будет, так как захочет проверяющий, по-этому спроси лучше у преподователя. Тогда проблем не будет. А так вроде правильно, все в меню. Осталось только сортировку сделать и все, остальное у тебя уже есть.
Дымка
Объясните,пожалуйста, в чем ошибка...Не считывает 2 число из файла и первое после ошибки...
Код
begin
 clrscr;
 write('vvedite imya fajla: ');
 readln(name);
 assign(fl,name);
 {$I-} reset(fl); {$I+}
 if ioresult=0 then
   BEGIN
     repeat
       read(fl,s1);
       writeln('Pervoe 16-ri4noe 4islo: ',s1);
       res3_7:=check_hex(s1);
       if res3_7=false then
         begin
           textcolor(lightred);
           Writeln('Owibka!Povtorite vvod 4isla');
           textcolor(lightblue);
           writeln;
         end;
     until res3_7=true;
     repeat
       read(fl,s2);
       writeln('Vtoroe 16-ri4noe 4islo: ',s2);
       res3_7:=check_hex(s2);
       if res3_7=false then
         begin
           textcolor(lightred);
           Writeln('Owibka!Povtorite vvod 4isla');
           textcolor(lightblue);
           writeln;
         end;
     until res3_7=true;
     close(fl);
   end{if}
 else
   BEGIN
     writeln ('fajl ',name,' ne najden');
     goto vyx;
   end;
 end;

решение после метода случайных чисел, который я тоже еще не сделала...

Код
res3:=addHexToHex(s1,s2);
Writeln('Rezultat raven: ',res3);
writeln;
writeln;


Добавлено: 12.07.05 17:16
и еще один вопрос, можно ли random'ом вывести 16-ричные числа... и как?
volvo
Дымка, а файл какие значения содержит? Дело в том, что при ошибке ввода первого числа будет попытка считать следующее за ним число, то есть уже существует вероятность, что одного числа в файле будет не хватать...
Дымка
В файл написала случайные числа, их штук 10....ИЛи 16-ричные как-то по-особому писать надо?Если первое является 16-ричным, то выдает его, на месте второго ставит лишь пустоту...В качестве результата выдается 1 число...Если первое не 16-ричное, то выдает ошибку и на месте и первого, и второго пустота...результат-тоже пусто...(
volvo
Ну, ты бы хоть описания переменных-то дала, я же не знаю, как ты читаешь числа, в какие переменные, что за файл, ...

Заархивируй программу вместе с файлом данных, и прикрепи сюда, телепатов тут нет...
Дымка
прикрепила....А расскажите про random для 16-ричных
там целиком все меню...это 3 задача...
volvo
У тебя каждое значение в файле - на отдельной строке, так что используй вместо
read(fl,s1); вот это: readLn(fl,s1);
Ну, и для второй переменной - то же самое...
Дымка
Получилось, спасибо.. smile.gif А есть ли функция. которая проверяет, правильно ли написано 2-ное число??

Добавлено (12.07.05 19:23):
Еще один вопрос...Используя функцию

Код
function vi4(s1,s2:string):string;
begin
 addHexToHex:=to_(from_(s1,16) -from_(s2,16),16);
end;


в решении присваиваю:
Код
res3_2:=vich(s1,s2);


Паскаль выдает ошибку: 133 cannot evaluate this expression
что делать?
volvo
Ну, если функция называется vi4, то она должна везде так называться:
function vi4(s1,s2:string):string;
begin
  vi4 :=to_(from_(s1,16) -from_(s2,16),16); { <--- и здесь ... }
end;
...
res3_2:=vi4(s1,s2); { <--- ... и здесь }
Дымка
Она у меня так и называется....Это я случайно скопировала не так....Название точно одинаковое, проблема в чем-то другом...И я не понимаю в чем
volvo
Не может быть... У меня работает. А вообще-то ошибка 133 возникает при попытке присвоить НЕконстантное выражение в константу... Проверь, не вычисляется ли у тебя res3_2 в разделе Const...
Дымка
если не сложно, посмотрите, пожалуйста.....врроде все правильно...и в константах нет....

Добавлено: исправленная версия
Нажмите для просмотра прикрепленного файла
volvo
blink.gif Ты при добавлении новых функций полностью разрушила структуру программы (в частности - структуру Case ... Of ... End). Я насчитал 8 End-ов, которых у тебя не хватало... Например, после каждой строки
4:goto vyx;
должен быть End, иначе компилятор не понимает, к чему относится следующий оператор, и выдает Error #133: Cannot Evaluate This Expression

В предыдущий пост я добавил исправленную версию, она компилируется, но не знаю, правильно ли работает...
Дымка
функция вычитания считает неправильно...что делать???ошибки я опять не вижу...((
Romtek
Я бы выделил код каждой операции/подзадачи в виде процедуры. Так на порядок легче разбираться будет.
volvo
Что значит "неправильно"? Какие значения задаешь, и какой результат получаешь? У меня при
s := vi4('10', '8');

s равна '8', как и положено...
Дымка
у меня 5 выдает....

Добавлено:
Исправила, работает!!!!Помогите. пожалуйста с функцией проверки правильности записи 2-ного числа....
это правильно, нет?
function proverka(s: string): boolean;{funkciya pravilnosti zapisi}
var
   i: byte;
   flag: boolean;
begin
   i := 1;
   flag := true;
   while (i <= length(s)) and flag do
   begin
      flag := (upcase(s[i]) in ['0' .. '1']);
      i:=i+1;
   end;
   proverka := flag
end;
Guest
Дымка я так понимаю мы решаем что-то похожее.
Помогите, подскажите код перевода из 2-й в 10-ю.
Время поджимает. Заранее благодарен.
Дымка
Если только сначала из 2-ной в 16. а потом из 16 в 10...Это в моих заданиях. как сделать по-другому -я не знаю...

function BinToHex(s:string):string;{iz 2 v 16} 
begin 
   BinToHex:=to_(from_(s,2),16);
end;
Function Hex2Dec (s:string): longint;{iz 16 v 10}
var
  res,k: longint;
  r,i: word;
  c: char;
begin
       res := 0;
       k := 1;
       for i := length (s) downto 1 do
       begin
            c := UpCase (s[i]);
            case c of
            'A'..'F': r := ord( c ) - (ord('A') - 10);    { ord ( c ) - 55 }
            '0'..'9': r := ord( c ) - ord('0');           { ord ( c ) - 48 }
            else break
            end;
            res := res + r * k
            k := k * 16;
       end;
       Hex2Dec := res;
end;


volvo
Цитата(Дымка @ 12.07.05 22:37)
Если только сначала из 2-ной в 16.

Нет, это как раз совсем не обязательно... С 10-ной с/с можно работать с помощью этого: FAQ: Общие вопросы по математике.

Дымка, кстати:
function proverka(s: string): boolean;
var
   i: byte;
   flag: boolean;
begin
   i := 1; flag := true;
   while (i <= length(s)) and flag do
   begin
      flag := s[i] in ['0' .. '1']; { здесь UpCase не нужен }
     { на '0' или '1' он не влияет - влияет UpCase только на 'a' .. 'z' }
      i:=i+1;
   end;
   proverka := flag
end;
Romtek
Дымка, могла бы указать первоисточник: Системы счисления., Перевод чисел из одной в другую.
Причём, функцию Hex2Dec я сам писал для ЧАВО.
Здесь есть глюк в подсветке кода: вместо копирайтов должны быть ( с )
Дымка
прости...Так было удобнее!!В следующий раз исправлюсь....Ничего не хотела себе присвоить...Правда

Добавлено:
Несовпадение типов!!!!
При использовании функций получилось несовпадение типов.Что можно сделать??
Function Hex2Dec (s:string): longint;{iz 16 v 10}
var
   res,k: longint;
   r,i: integer;
   c: char;
begin
   res := 0;
   k := 1;
   for i := length (s) downto 1 do
   begin
      c := UpCase (s[i]);
      case c of
         'A'..'F': r := ord(c) - (ord('A') - 10);    { ord (c) - 55 }
         '0'..'9': r := ord(c) - ord('0');           { ord (c) - 48 }
      else break
      end;
      res := res + r * k;
      k := k * 16;
   end;
   Hex2Dec := res;
end;
function Dec2Hex(n: integer): string; {Perevod iz 10-oy v 16-uu}
var
   r: integer; {ostatok ot deleniya 4isla na osnovanie}
   buf: string[1];
begin
   s:='';
   repeat
      r:=n mod 16; {o4erednaya cifra}
      n:=n div 16; {celaya 4ast deleniya}
      if r< 10 then
         buf:=chr(r+48) {chr(48) = '0', chr(49)='1' i t.d}
      else
         buf:=chr(r+55);{chr(65)= 'A', chr(66)='b' i t.d}
      s:=buf+s;
   until (n<16);
   if n<>0 then
   begin
      if n<10 then
         buf:=chr(n+48)
      else
         buf:=chr(n+55);
      s:=buf+s;
   end;
   Dec2Hex:=s;
end;
function stepen(x,n:real):real; {vozvedenie v stepen}
begin
   stepen:=exp(n*ln(x));
end;

Значит так, что я делаю...Сначала ввожу число в 16-ричной с/с и степень в 16-ой с/с, перевожу все это в 10-ую, возвожу в степень, тип получается real , вывожу ответ в 10-ной. но мне еще нужен ответ и в 16-ричной, поэтому пытаюсь перевести...а для этого нужен integer, что делать?
volvo
Дымка, в Паскале есть очень полезная функция - Trunc. То есть, если где-то есть вещественный X, а нужен целый - вместо Х пишем Trunc(X)... Я бы сделал так:
function stepen(x,n:real):Integer; {vozvedenie v stepen}
begin
   stepen:=Trunc(exp(n*ln(x)));
end;

и никаких проблем... rolleyes.gif
Дымка
Можно ли сгенерировать случайные 16-ричные и 2 числа???? Они даны как строки....
Romtek
Желательно генерировать число функцией Random() ,а потом сконвертировать в 16-чное в виде строки.
Дымка
опять проблемы..((

{rewenie 4etvertoj zada4i}
            s_res := s4; prev := '';
            p4 := 1;
            repeat
               while not (s_res[p4] in abc) and (p4 <= length(s_res)) do
                  p4:=p4+1;
               while (s_res[p4] in abc) and (p4 <= length(s_res)) do
               begin
                  word := word + s_res[p4];
                  p4:=p4+1;
               end;
               if strUpper(word) = strUpper(prev) then
               begin
                  delete(s_res, p4 - length(word), length(word));
                  dec(p4, length(word));{umenwaet p na veli4inu=dline stroki word}
               end
               else
                  prev := word;
               word := '';
            until p4 > length(s_res);
            stnew:= stronespace(s_res);
            while stnew[1]=' ' do
            stnew:=copy(stnew,2,255);
            writeln('Poly4ennaya stroka: ');
            writeln(stnew);
            writeln;
            writeln;
            END; {4etvertaya zada4a}


Выдает ошибку . что строка слишком длинная, что мне сделать???Раньше этого не было(( Вот эта строка while (s_res[p4] in abc) and (p4 <= length(s_res)) do
Romtek
какой номер ошибки?
Romtek
Строку можно разбить на несколько...
while 
  (s_res[p4] in abc) 
  and (p4 <= length(s_res)) 
do
Дымка
теперь еще в одном месте 124 ошибка, а тауже не знаю(((
volvo
А вот это уже ГОРАЗДО хуже: "Statement Part Too Large" - Паскаль ограничивает размер одного блока операторов 24К, у тебя в каком-то блоке этот размер превзойден. Рекомендация: переработать структуру программы...

Например, разбить содержимое того блока операторов, в котором произошла ошибка, на 2 или более процедуры/функции, таким образом размер каждой из них будет меньше критического, и программа прододжит компилироваться.

P.S. Я надеюсь, следующей ошибкой не будет Error 48: Code Segment Too Large или Error 49: Data Segment Too Large ... blink.gif
Romtek
Цитата
еще в одном месте 124 ошибка
не говори загадками. В какой именно строке?

Если есть номер ICQ, свяжись со мной.
Romtek
Буду показывать как правильно писать такие программы...
Дымка
У меня из-за 3 задачи 10 пункта начались глюки..НЕ знаю, правильно ли я вообще делаю, давайте, я выставлю что есть, посмотрите . пожалуйста!!!!Мне кажется . я опять потеряла половину end...((
Я применяла к массиву функции перевода из 10 в 16 и наоборот...После этого начались проблемы
volvo
Здесь - то же самое, что и в теме 4 задачи и куча вопросов: полный балаган, это тоже кандидат на закрытие. НЕ пишутся программы такой сложности (4 задания и 20 подзадач - это довольно сложная программа) в подобном стиле. В таком коде ОЧЕНЬ сложно разбираться. При том, что параллельно обсуждаются десятки заданий - это вообще малореально.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.