Помощь - Поиск - Пользователи - Календарь
Полная версия: И снова системы счисления
Форум «Всё о Паскале» > 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© - (ord('A') - 10); { ord © - 55 }
'0'..'9': r := ord© - ord('0'); { ord © - 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 подзадач - это довольно сложная программа) в подобном стиле. В таком коде ОЧЕНЬ сложно разбираться. При том, что параллельно обсуждаются десятки заданий - это вообще малореально.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.