И снова я со своими глупыми вопросами... Нужна помощь в сложении, вычитании, умножении и делении чисел в шестнадцатиричной с/с, сама как сделать это не понимаю... Вариант перевода сначала в другую систему не подходит. А еще перевод из двоичной с/с в шестнадцатеричную... Помогите. пожалуйста...
Добавлено: 11.07.05 17:03 и еще, как задать массив чисел, записанных в шестнадцатиричной с/с
volvo
11.07.2005 21:07
Как ты хочешь их хранить? В каком виде? Строки, или обычные 10-ные числа? Если строки, то так:
var hex_arr: array[1 .. 10] ofstring[8]; {максимум до $FFFFFFFF}
Guest
11.07.2005 21:13
Цитата(Дымка @ 11.07.05 16:32)
Вариант перевода сначала в другую систему не подходит.
Не в другую, а из строки в число полюбому надо будет.
Дымка
11.07.2005 21:23
Думалка отказывается работать....;( Помогите...
volvo
11.07.2005 21:48
Цитата(Дымка @ 11.07.05 16:32)
Вариант перевода сначала в другую систему не подходит.
Это уже обсуждалось на форуме... Тогда пришли к заключению, что это нереализуемо. Все программы так или иначе работают через 10-ную с/с (хочешь что-то возразить? Возьми лист бумаги, и попробуй перемножить $438 и $54 НЕ переводя это в другую с/с. Не выходит? Как же ты хочешь объяснить это компьютеру?).
Дымка
11.07.2005 21:52
и что мне делать? мне сначала надо реализовать набор подпрограмм, которые выполняют определенные действия, а потом использовать их для решения 2 задач...
Guest
11.07.2005 22:11
Цитата(Дымка @ 11.07.05 17:52)
и что мне делать? мне сначала надо реализовать набор подпрограмм, которые выполняют определенные действия, а потом использовать их для решения 2 задач...
Тогда делаешь так: Создаешь сперва 2 самые главные функции: 1. Из строки в число:
function from_(s:string;ss:byte):longint;
var q:longint;
begin
q:=0;
for i:=1to length(s) dobegin
s[i]:=char(ord(s[i]) or32);
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>9then 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:
Дымка
11.07.2005 23:10
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.2005 23:21
Цитата(Дымка @ 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.
Дымка
12.07.2005 0:03
функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше). В смысле???что от меня хотят?
Guest
12.07.2005 0:06
Цитата(Дымка @ 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;
И в том же духе
Теги не просто так на форуме введены, хотелось бы напомнить !!!
Дымка
12.07.2005 0:18
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
12.07.2005 0:24
Цитата(Дымка @ 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)); или я совсем не понимаю?!:(
Да, да, я копировал просто.. У тебе тоже самое в последней функции.
>Так? Ну да, вроде так.
Дымка
12.07.2005 1:15
Так...Теперь меня запутали в самом задании!!!Может быть, я что-то неправильно понимаю.Но народ. у которых аналогичная постановка предлагают и пункты а-з и цифры 1,2 вынести в меню...и решать все как отдельные задачи...К тому же подпрограммы некоторые будут использоваться и в решении 1 и 2...Объясните, что от меня хотят..
Цитата
Реализовать набор подпрограмм для выполнения следующих операций над натуральными числами в шестнадцатеричной системе счисления: а) сложение; б) вычитание; в) умножение; г) деление; д) перевод из двоичной системы счисления в шестнадцатеричную; е) перевод из шестнадцатеричной системы счисления в десятичную; ж) функция проверки правильности записи числа в шестнадцатеричной системе счисления; з) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше). 1) Возвести число в степень (основание и показатель степени записаны в шестнадцатеричной системе счисления). Ответ выдать в шестнадцатеричной и десятичной системах счисления. 2) Дан массив A - массив чисел, записанных в шестнадцатеричной системе счисления. Отсортировать его в порядке убывания. Ответ выдать в шестнадцатеричной и десятичной системах счисления.
volvo
12.07.2005 1:25
Вот она - самая основная проблема !!! Сначала нужно было думать, что именно решается, как отдельная задача, а что - нет, а уж потом приступать к реализации. А если перед самой сдачей программы кто-нибудь еще что-нибудь придумает? Программа снова будет исправляться?
Дымка
12.07.2005 1:33
<_< Поясните, а?? А исправлять еще особенно нечего...Эта задача продвигается очень медленными темпами...
mlc
12.07.2005 11:23
Цитата(Дымка @ 11.07.05 21:33)
<_< Поясните, а?? А исправлять еще особенно нечего...Эта задача продвигается очень медленными темпами...
Во-первых, правильно будет, так как захочет проверяющий, по-этому спроси лучше у преподователя. Тогда проблем не будет. А так вроде правильно, все в меню. Осталось только сортировку сделать и все, остальное у тебя уже есть.
Дымка
12.07.2005 21:14
Объясните,пожалуйста, в чем ошибка...Не считывает 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;
решение после метода случайных чисел, который я тоже еще не сделала...
Добавлено: 12.07.05 17:16 и еще один вопрос, можно ли random'ом вывести 16-ричные числа... и как?
volvo
12.07.2005 21:24
Дымка, а файл какие значения содержит? Дело в том, что при ошибке ввода первого числа будет попытка считать следующее за ним число, то есть уже существует вероятность, что одного числа в файле будет не хватать...
Дымка
12.07.2005 21:29
В файл написала случайные числа, их штук 10....ИЛи 16-ричные как-то по-особому писать надо?Если первое является 16-ричным, то выдает его, на месте второго ставит лишь пустоту...В качестве результата выдается 1 число...Если первое не 16-ричное, то выдает ошибку и на месте и первого, и второго пустота...результат-тоже пусто...(
volvo
12.07.2005 21:41
Ну, ты бы хоть описания переменных-то дала, я же не знаю, как ты читаешь числа, в какие переменные, что за файл, ...
Заархивируй программу вместе с файлом данных, и прикрепи сюда, телепатов тут нет...
Дымка
12.07.2005 22:05
прикрепила....А расскажите про random для 16-ричных там целиком все меню...это 3 задача...
volvo
12.07.2005 22:28
У тебя каждое значение в файле - на отдельной строке, так что используй вместо read(fl,s1); вот это: readLn(fl,s1); Ну, и для второй переменной - то же самое...
Дымка
12.07.2005 22:45
Получилось, спасибо.. А есть ли функция. которая проверяет, правильно ли написано 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
12.07.2005 23:39
Ну, если функция называется vi4, то она должна везде так называться:
function vi4(s1,s2:string):string;
begin
vi4 :=to_(from_(s1,16) -from_(s2,16),16); { <--- и здесь ... }end;
...
res3_2:=vi4(s1,s2); { <--- ... и здесь }
Дымка
12.07.2005 23:53
Она у меня так и называется....Это я случайно скопировала не так....Название точно одинаковое, проблема в чем-то другом...И я не понимаю в чем
volvo
13.07.2005 0:00
Не может быть... У меня работает. А вообще-то ошибка 133 возникает при попытке присвоить НЕконстантное выражение в константу... Проверь, не вычисляется ли у тебя res3_2 в разделе Const...
Дымка
13.07.2005 0:10
если не сложно, посмотрите, пожалуйста.....врроде все правильно...и в константах нет....
Ты при добавлении новых функций полностью разрушила структуру программы (в частности - структуру Case ... Of ... End). Я насчитал 8 End-ов, которых у тебя не хватало... Например, после каждой строки
4:goto vyx;
должен быть End, иначе компилятор не понимает, к чему относится следующий оператор, и выдает Error #133: Cannot Evaluate This Expression
В предыдущий пост я добавил исправленную версию, она компилируется, но не знаю, правильно ли работает...
Дымка
13.07.2005 0:35
функция вычитания считает неправильно...что делать???ошибки я опять не вижу...((
Romtek
13.07.2005 0:56
Я бы выделил код каждой операции/подзадачи в виде процедуры. Так на порядок легче разбираться будет.
volvo
13.07.2005 0:56
Что значит "неправильно"? Какие значения задаешь, и какой результат получаешь? У меня при
s := vi4('10', '8');
s равна '8', как и положено...
Дымка
13.07.2005 0:59
у меня 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 dobegin
flag := (upcase(s[i]) in ['0' .. '1']);
i:=i+1;
end;
proverka := flag
end;
Guest
13.07.2005 2:11
Дымка я так понимаю мы решаем что-то похожее. Помогите, подскажите код перевода из 2-й в 10-ю. Время поджимает. Заранее благодарен.
Дымка
13.07.2005 2:37
Если только сначала из 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) downto1dobegin
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 proverka(s: string): boolean;
var
i: byte;
flag: boolean;
begin
i := 1; flag := true;
while (i <= length(s)) and flag dobegin
flag := s[i] in ['0' .. '1']; { здесь UpCase не нужен }{ на '0' или '1' он не влияет - влияет UpCase только на 'a' .. 'z' }
i:=i+1;
end;
proverka := flag
end;
прости...Так было удобнее!!В следующий раз исправлюсь....Ничего не хотела себе присвоить...Правда
Добавлено: Несовпадение типов!!!! При использовании функций получилось несовпадение типов.Что можно сделать??
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) downto1dobegin
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 mod16; {o4erednaya cifra}
n:=n div16; {celaya 4ast deleniya}if r< 10then
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<>0thenbeginif n<10then
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
13.07.2005 6:08
Дымка, в Паскале есть очень полезная функция - Trunc. То есть, если где-то есть вещественный X, а нужен целый - вместо Х пишем Trunc(X)... Я бы сделал так:
function stepen(x,n:real):Integer; {vozvedenie v stepen}begin
stepen:=Trunc(exp(n*ln(x)));
end;
и никаких проблем...
Дымка
13.07.2005 17:08
Можно ли сгенерировать случайные 16-ричные и 2 числа???? Они даны как строки....
Romtek
13.07.2005 17:28
Желательно генерировать число функцией Random() ,а потом сконвертировать в 16-чное в виде строки.
Дымка
13.07.2005 19:24
опять проблемы..((
{rewenie 4etvertoj zada4i}
s_res := s4; prev := '';
p4 := 1;
repeatwhilenot (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)) dobegin
word := word + s_res[p4];
p4:=p4+1;
end;
if strUpper(word) = strUpper(prev) thenbegin
delete(s_res, p4 - length(word), length(word));
dec(p4, length(word));{umenwaet p na veli4inu=dline stroki word}endelse
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
13.07.2005 19:31
какой номер ошибки?
Romtek
13.07.2005 19:36
Строку можно разбить на несколько...
while
(s_res[p4] in abc)
and (p4 <= length(s_res))
do
Дымка
13.07.2005 19:38
теперь еще в одном месте 124 ошибка, а тауже не знаю(((
volvo
13.07.2005 19:43
А вот это уже ГОРАЗДО хуже: "Statement Part Too Large" - Паскаль ограничивает размер одного блока операторов 24К, у тебя в каком-то блоке этот размер превзойден. Рекомендация: переработать структуру программы...
Например, разбить содержимое того блока операторов, в котором произошла ошибка, на 2 или более процедуры/функции, таким образом размер каждой из них будет меньше критического, и программа прододжит компилироваться.
P.S. Я надеюсь, следующей ошибкой не будет Error 48: Code Segment Too Large или Error 49: Data Segment Too Large ...
Romtek
13.07.2005 19:48
Цитата
еще в одном месте 124 ошибка
не говори загадками. В какой именно строке?
Если есть номер ICQ, свяжись со мной.
Romtek
13.07.2005 20:21
Буду показывать как правильно писать такие программы...
Дымка
13.07.2005 20:52
У меня из-за 3 задачи 10 пункта начались глюки..НЕ знаю, правильно ли я вообще делаю, давайте, я выставлю что есть, посмотрите . пожалуйста!!!!Мне кажется . я опять потеряла половину end...(( Я применяла к массиву функции перевода из 10 в 16 и наоборот...После этого начались проблемы
volvo
13.07.2005 21:33
Здесь - то же самое, что и в теме 4 задачи и куча вопросов: полный балаган, это тоже кандидат на закрытие. НЕ пишутся программы такой сложности (4 задания и 20 подзадач - это довольно сложная программа) в подобном стиле. В таком коде ОЧЕНЬ сложно разбираться. При том, что параллельно обсуждаются десятки заданий - это вообще малореально.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.