И снова я со своими глупыми вопросами... Нужна помощь в сложении, вычитании, умножении и делении чисел в шестнадцатиричной с/с, сама как сделать это не понимаю... Вариант перевода сначала в другую систему не подходит. А еще перевод из двоичной с/с в шестнадцатеричную... Помогите. пожалуйста...
Добавлено: 11.07.05 17:03 и еще, как задать массив чисел, записанных в шестнадцатиричной с/с
volvo
11.07.2005 17:07
Как ты хочешь их хранить? В каком виде? Строки, или обычные 10-ные числа? Если строки, то так:
var hex_arr: array[1 .. 10] of string[8]; {максимум до $FFFFFFFF}
Guest
11.07.2005 17:13
Цитата(Дымка @ 11.07.05 16:32)
Вариант перевода сначала в другую систему не подходит.
Не в другую, а из строки в число полюбому надо будет.
Дымка
11.07.2005 17:23
Думалка отказывается работать....;( Помогите...
volvo
11.07.2005 17:48
Цитата(Дымка @ 11.07.05 16:32)
Вариант перевода сначала в другую систему не подходит.
Это уже обсуждалось на форуме... Тогда пришли к заключению, что это нереализуемо. Все программы так или иначе работают через 10-ную с/с (хочешь что-то возразить? Возьми лист бумаги, и попробуй перемножить $438 и $54 НЕ переводя это в другую с/с. Не выходит? Как же ты хочешь объяснить это компьютеру?).
Дымка
11.07.2005 17:52
и что мне делать? мне сначала надо реализовать набор подпрограмм, которые выполняют определенные действия, а потом использовать их для решения 2 задач...
Guest
11.07.2005 18:11
Цитата(Дымка @ 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:
Дымка
11.07.2005 19: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 19: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.
Дымка
11.07.2005 20:03
функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше). В смысле???что от меня хотят?
Guest
11.07.2005 20: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;
И в том же духе
Теги не просто так на форуме введены, хотелось бы напомнить !!!
Дымка
11.07.2005 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)); или я совсем не понимаю?!:(
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.2005 20: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)); или я совсем не понимаю?!:(
Да, да, я копировал просто.. У тебе тоже самое в последней функции.
>Так? Ну да, вроде так.
Дымка
11.07.2005 21:15
Так...Теперь меня запутали в самом задании!!!Может быть, я что-то неправильно понимаю.Но народ. у которых аналогичная постановка предлагают и пункты а-з и цифры 1,2 вынести в меню...и решать все как отдельные задачи...К тому же подпрограммы некоторые будут использоваться и в решении 1 и 2...Объясните, что от меня хотят..
Цитата
Реализовать набор подпрограмм для выполнения следующих операций над натуральными числами в шестнадцатеричной системе счисления: а) сложение; б) вычитание; в) умножение; г) деление; д) перевод из двоичной системы счисления в шестнадцатеричную; е) перевод из шестнадцатеричной системы счисления в десятичную; ж) функция проверки правильности записи числа в шестнадцатеричной системе счисления; з) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше). 1) Возвести число в степень (основание и показатель степени записаны в шестнадцатеричной системе счисления). Ответ выдать в шестнадцатеричной и десятичной системах счисления. 2) Дан массив A - массив чисел, записанных в шестнадцатеричной системе счисления. Отсортировать его в порядке убывания. Ответ выдать в шестнадцатеричной и десятичной системах счисления.
volvo
11.07.2005 21:25
Вот она - самая основная проблема !!! Сначала нужно было думать, что именно решается, как отдельная задача, а что - нет, а уж потом приступать к реализации. А если перед самой сдачей программы кто-нибудь еще что-нибудь придумает? Программа снова будет исправляться?
Дымка
11.07.2005 21:33
<_< Поясните, а?? А исправлять еще особенно нечего...Эта задача продвигается очень медленными темпами...
mlc
12.07.2005 7:23
Цитата(Дымка @ 11.07.05 21:33)
<_< Поясните, а?? А исправлять еще особенно нечего...Эта задача продвигается очень медленными темпами...
Во-первых, правильно будет, так как захочет проверяющий, по-этому спроси лучше у преподователя. Тогда проблем не будет. А так вроде правильно, все в меню. Осталось только сортировку сделать и все, остальное у тебя уже есть.
Дымка
12.07.2005 17: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 17:24
Дымка, а файл какие значения содержит? Дело в том, что при ошибке ввода первого числа будет попытка считать следующее за ним число, то есть уже существует вероятность, что одного числа в файле будет не хватать...
Дымка
12.07.2005 17:29
В файл написала случайные числа, их штук 10....ИЛи 16-ричные как-то по-особому писать надо?Если первое является 16-ричным, то выдает его, на месте второго ставит лишь пустоту...В качестве результата выдается 1 число...Если первое не 16-ричное, то выдает ошибку и на месте и первого, и второго пустота...результат-тоже пусто...(
volvo
12.07.2005 17:41
Ну, ты бы хоть описания переменных-то дала, я же не знаю, как ты читаешь числа, в какие переменные, что за файл, ...
Заархивируй программу вместе с файлом данных, и прикрепи сюда, телепатов тут нет...
Дымка
12.07.2005 18:05
прикрепила....А расскажите про random для 16-ричных там целиком все меню...это 3 задача...
volvo
12.07.2005 18:28
У тебя каждое значение в файле - на отдельной строке, так что используй вместо read(fl,s1); вот это: readLn(fl,s1); Ну, и для второй переменной - то же самое...
Дымка
12.07.2005 18: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 19: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 19:53
Она у меня так и называется....Это я случайно скопировала не так....Название точно одинаковое, проблема в чем-то другом...И я не понимаю в чем
volvo
12.07.2005 20:00
Не может быть... У меня работает. А вообще-то ошибка 133 возникает при попытке присвоить НЕконстантное выражение в константу... Проверь, не вычисляется ли у тебя res3_2 в разделе Const...
Дымка
12.07.2005 20:10
если не сложно, посмотрите, пожалуйста.....врроде все правильно...и в константах нет....
Ты при добавлении новых функций полностью разрушила структуру программы (в частности - структуру Case ... Of ... End). Я насчитал 8 End-ов, которых у тебя не хватало... Например, после каждой строки
4:goto vyx;
должен быть End, иначе компилятор не понимает, к чему относится следующий оператор, и выдает Error #133: Cannot Evaluate This Expression
В предыдущий пост я добавил исправленную версию, она компилируется, но не знаю, правильно ли работает...
Дымка
12.07.2005 20:35
функция вычитания считает неправильно...что делать???ошибки я опять не вижу...((
Romtek
12.07.2005 20:56
Я бы выделил код каждой операции/подзадачи в виде процедуры. Так на порядок легче разбираться будет.
volvo
12.07.2005 20:56
Что значит "неправильно"? Какие значения задаешь, и какой результат получаешь? У меня при
s := vi4('10', '8');
s равна '8', как и положено...
Дымка
12.07.2005 20: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 do begin flag := (upcase(s[i]) in ['0' .. '1']); i:=i+1; end; proverka := flag end;
Guest
12.07.2005 22:11
Дымка я так понимаю мы решаем что-то похожее. Помогите, подскажите код перевода из 2-й в 10-ю. Время поджимает. Заранее благодарен.
Дымка
12.07.2005 22: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) 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 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;
Значит так, что я делаю...Сначала ввожу число в 16-ричной с/с и степень в 16-ой с/с, перевожу все это в 10-ую, возвожу в степень, тип получается real , вывожу ответ в 10-ной. но мне еще нужен ответ и в 16-ричной, поэтому пытаюсь перевести...а для этого нужен integer, что делать?
volvo
13.07.2005 2: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 13:08
Можно ли сгенерировать случайные 16-ричные и 2 числа???? Они даны как строки....
Romtek
13.07.2005 13:28
Желательно генерировать число функцией Random() ,а потом сконвертировать в 16-чное в виде строки.
Дымка
13.07.2005 15:24
опять проблемы..((
{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
13.07.2005 15:31
какой номер ошибки?
Romtek
13.07.2005 15:36
Строку можно разбить на несколько...
while (s_res[p4] in abc) and (p4 <= length(s_res)) do
Дымка
13.07.2005 15:38
теперь еще в одном месте 124 ошибка, а тауже не знаю(((
volvo
13.07.2005 15: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 15:48
Цитата
еще в одном месте 124 ошибка
не говори загадками. В какой именно строке?
Если есть номер ICQ, свяжись со мной.
Romtek
13.07.2005 16:21
Буду показывать как правильно писать такие программы...
Дымка
13.07.2005 16:52
У меня из-за 3 задачи 10 пункта начались глюки..НЕ знаю, правильно ли я вообще делаю, давайте, я выставлю что есть, посмотрите . пожалуйста!!!!Мне кажется . я опять потеряла половину end...(( Я применяла к массиву функции перевода из 10 в 16 и наоборот...После этого начались проблемы
volvo
13.07.2005 17:33
Здесь - то же самое, что и в теме 4 задачи и куча вопросов: полный балаган, это тоже кандидат на закрытие. НЕ пишутся программы такой сложности (4 задания и 20 подзадач - это довольно сложная программа) в подобном стиле. В таком коде ОЧЕНЬ сложно разбираться. При том, что параллельно обсуждаются десятки заданий - это вообще малореально.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.