Добрый день, Lucifer! "хода канём" - а это что такое? Японец? :)) Ответ отправлен: 01.12.2003, 15:30 Отправитель: sir henry Отвечает Boriss
Доброе время суток, Lucifer! Не совсем понял, что надо именно. Если нужно заполнить , то по-простому: двумерный массив 8х8 и ... var x, y: Integer; desk: array[1..8, 1..8] of integer; {номер хода} count: Integer; BEGIN ... if (x + 2 <= 8) and (y + 1 <=8) then begin x:=x+2; y:=y+1; count:=count+1; desk[x,y]:=count end; ... END. Ответ отправлен: 01.12.2003, 13:47 Отправитель: Boriss
Вопрос № 352
Здравствуйте. У меня такой вопрос: как вычислить 2^n, где 0<= n >= 2*10^9 ?
Добрый день, Serega! 2^n = exp(n*ln(2)). Ну если НЕ ошибка, я не понимаю зачем n => 0, когда мы искаем куда более сильное n>=2*10^9, разве если это выполнено то n небудет больше или равно 0!Другое дело зачем нам такое болшое n и куда мы будем его девать. В приложении дан пример когда n "разумное"!
Приложение: Ответ отправлен: 02.12.2003, 17:42 Отправитель: Tancho Отвечает vitya
Приветствую Вас, Serega! по-моему в Паскале этот тип называется extended, но для его включения нужна какая-то директива. Итак, extended ePower = exp(n * ln(2));, правда я все же не уверен, что в extended поместитя такое число, как 2 ^ (2*10^9).... вообще таких больших чисел не бывает :) Ответ отправлен: 02.12.2003, 08:41 Отправитель: vitya Отвечает sir henry
Приветствую Вас, Serega! 1. Можно 2 умножать на себя n раз, 2. Я пользуюсь FreePascal и там, в модуле Math, есть функции Power(base, exponent: float) и IntPower(base: float; exponent: longint), соответственно возведение в ЛЮБУЮ степень и возведение в ЦЕЛОЧИСЛЕННУЮ степень, 3. Можно воспользоваться формулой: Result:=Exp(exponent * Ln(base)); Ответ отправлен: 02.12.2003, 08:51 Отправитель: sir henry Отвечает Vitally
Здравствуй, Serega! Если это не опечатка, и n действительно >=2*10^9 то... Вобщем, моя программа позволит тебе вычеслить степень 2 вплоть до 2 147 483 647. Если нужно больше, придется зацикливать все еще раз, либо вставлять переменную, которая будет уменьшать значения для j непосредственно в цикле. И, скорее всего придется подключать еще массив/вы для хранения значений. При значении степени = 30000 экран был заполнен почти полностью. Т.е нужно будет делать паузу вывода если ты хочешь записать результат. :-) Это, конечно, не идеальный вариант. Можно сделать ее более удобной и более быстрой... Удачи!
Приложение: Ответ отправлен: 02.12.2003, 14:29 Отправитель: Vitally
Вопрос № 353
Здраствуйте эксперты! У меня возник такой вопрос: В написанном в приложении коде выдается ошибка Error 133: Cannot evaluate this expression. Что делать?
Приветствую Вас, matrixand! Паскаль это СТРОГО типизированный язык. В нем нет места неопределенностям такого типа, как определили Вы. То есть к моменту вызова процедуры размер массива в памяти должен быть точно известен. Динамические массивы стали поддерживаться только в Delphi. Некотроый выход в использовании открытых параметов. См пример: работает с ОДНОМЕРНЫМИ массивами "любого" размера:
Приложение: Ответ отправлен: 01.12.2003, 19:24 Отправитель: Boriss Отвечает Tancho
Доброе время суток, matrixand! В Pascal'е директно такая вещ невозможна!Ты пробуеш описать массив с переменная(неопределеная) верхная граница, а для это надо пофукисничить. Есть нескольках вариантов, все это уже было разыскивано в эту рассылку - смотри выпусках 188 и 193 этой рассылки!Там было раззыскивано о создании динамических массивов, разные вариантов, их предимствах и недостатках.Я не могу добавить ничего больше к этом.
Ответ отправлен: 02.12.2003, 17:11 Отправитель: Tancho Отвечает Vitally
Доброе время суток, matrixand! Дело в том, что Паскаль не поддерживает работу с массивами переменной длинны. т.е. выражение ARRAY[1..X] где Х неопределено - недопустимо. Есть два варианта решения данной проблемы: 1)Указать максимально возможное значение для Х, но в процедуре использовать массив не полностью, а до определенного значения. 2)"Обмануть машину" так: type XArray=array[1..1]of integer; XArrayPTR=^XArray; Var mas:XArrayPTR; Procedure abs(x:integer); Begin GetMem(mas,x*SizeOf(Integer));{Выделяем память} for i:=1 to x do mas^[i]:=i; ... ... FreeMem(x*SizeOf(Integer));{Освобождаем память} end; P.S. Нужно отключить проверку индексов массивов (Range Checking)- Options>Compiler или {$R-}. Т.к. мы создали массив длинной в один элемент но, тянем руки гораздо дальше. Ответ отправлен: 01.12.2003, 20:52 Отправитель: Vitally Отвечает hobit
Доброе время суток, matrixand! Дело в том, что в паскале нельзя динамически менять границы массива. Ведь ты можешь описать таким образом и 64000-элементный массив из integer'ов (по 2 байта). Так тебе никакого стека не хватит. Все структуры данных должны в сумме помещаться в 64 кило.
Ответ отправлен: 01.12.2003, 20:49 Отправитель: hobit Отвечает Duncan MacLeod
Доброе время суток, matrixand! Не, так дело у тебя не пойдет! Размерность массива должна быть определена до компиляции программы. А если тебе необходимо сделать именно так, то прочитай про динамическое выделение памяти! Ответ отправлен: 01.12.2003, 23:49 Отправитель: Duncan MacLeod Отвечает vitya
Доброе время суток, matrixand! в объявлении типа не может быть использована переменная. Поэтому и не компилируется код. Тут : type t=array[1..x]... Ответ отправлен: 02.12.2003, 08:39 Отправитель: vitya Отвечает sir henry
Добрый день, matrixand! "type t=array[1..x] of integer;" - ошибка наверняка здесь. Чтобы выделить память от 1 до х ячеек, х должно быть заранее известно. Ответ отправлен: 02.12.2003, 08:54 Отправитель: sir henry Отвечает URiS
Добрый день, matrixand! Это тебе не Си++.... Используй константу вместо X.
>>> comp.soft.prog.urisprog - Рассылка про Delphi! Все статьи -> ВАМ в почтовый ящик еженедельно.
Ответ отправлен: 02.12.2003, 15:57 Отправитель: URiS
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.