В GraphABC есть вроде, и вопросов особо не возникало )
Добрый день , Помогите пожалуйста сделать такую программу: В 2D пространстве нарисовать 3-4 3D фигуры кубы/параллелепипеды с возможностью перемещения по оси координат и так же приближения и отдаления. Прикреплю фотку , может так будет понятнее.
Помочь - это подсказать путь решения какой-то проблемы, указать место ошибки в алгоритме или в коде, разъяснить какую-то конструкцию языка, дать какую-то ссылку на литературу и т.п. Но не написать вместо Вас решение задания. Такие дела тут не проходят.
Да лучше пользуйтесь возможностями Graph3D, перемещение, поворот, кручение, …
Предложение разработчикам. В модуле GraphABC, процедура ARC, когда показывает сообщение, в Procedure отмечается, что а1 и а2 целые, это правильно. В самом тексте - действительное. По моему тут отпечатка.
Здравствуйте. Необходимо решать одну проблему. Массив создаётся в главной программе. Передаётся в процедуру. В теле процедуре меняем значение некоторых членов. Почему эти изменение влияет и на массив в главной программе. Пример:
Program Крамер;
Procedure Detr(a : array[,] of real; Var mdt : real);
Begin
a.Println;
mdt := a[0,0]*a[1,1]*a[2,2]+a[0,1]*a[2,0]*a[1,2]+a[0,2]*a[1,0]*a[2,1];
mdt := mdt - a[2,0]*a[1,1]*a[0,2]-a[0,0]*a[2,1]*a[1,2]-a[0,1]*a[1,0]*a[2,2];
(a[0,0],a[1,1]) := (2.2,3.3);
end;
Begin
Var mtr := MatrRandomReal(3,3,-6.37,6.37);
Var dtr : real; Detr(mtr,dtr); Println(dtr);
mtr.Println;
end.
Потому что mtr
- это ссылка на динамический массив. Вы передаёте её в процедуру, как параметр-значение, но по сути это всё равно ссылка, что позволяет менять значения элементов массива. А вот если вы захотите изменить размер массива в процедуре, тогда понадобится написать в заголовке var a : array[,] of real;
Нет, вставить Var или не ставить, роль не играет, безразлично. Все равно изменится значение членов массива и в главном программе.
Да, поскольку массив имеет ссылочный тип. Вы должны понимать, что передаете в подпрограмму ссылку на ваш объект, что делает содержащиеся в нем данные доступными для любых модификаций. Вы можете запретить модификацию объявлением параметра как const, но тогда компилятор не позволит в теле подпрограммы изменять значение данных. Так что в Вашем случае нужно предварительно снять с массива копию и передать ее. Например, так:
program Крамер;
procedure Detr(a: array[,] of real; var mdt: real);
begin
a.Println;
mdt := a[0, 0] * a[1, 1] * a[2, 2] + a[0, 1] * a[2, 0] * a[1, 2] + a[0, 2] * a[1, 0] * a[2, 1];
mdt := mdt - a[2, 0] * a[1, 1] * a[0, 2] - a[0, 0] * a[2, 1] * a[1, 2] - a[0, 1] * a[1, 0] * a[2, 2];
(a[0, 0], a[1, 1]) := (2.2, 3.3);
end;
begin
var mtr := MatrRandomReal(3, 3, -6.37, 6.37);
var dtr: real;
Detr(Copy(mtr), dtr);
Println(dtr);
mtr.Println;
end.
Да, спасибо Александр, получилось. Я различные методы поискал, подбирал, например присваивание на другом массиве, затем передать в процедуру. Но никак не получалось.А вот Copy помогло.
Возможно ли проверить, является ли число, сохранённое в переменной типа real, целым, не переводя его в строку?
Всегда ли следует сохранять результат вычисления, если его подразумевается использовать немедленно подряд 2 раза?
Frac(x) = 0
Пример приведите, пожалуйста.
##
var a := 1;
var b := 2;
var s: string;
// Так:
var c := a + b;
if (c > 0) then
s := c.ToString;
// или так:
if (a + b > 0) then
s := (a + b).ToString;
Нашёл ответ на другой вопрос: видимо, если Console.TreatControlCAsInput := true
, системой обрабатываются только эти нажатия: Windows и некоторые горячие клавиши с Windows, Control + Pause / Break, Print Screen, “светодиодные”.
И в чем проблема? Пишите, как Вам больше нравится. Или Вы ходите пару наносекунд сэкономить? Тогда Вам в Фортран, он умеет оптимизировать код.
Бывают вычисления посложнее или циклы. В общем, всегда сохранять?
Это к разработчикам. Я не знаю внутреннюю кухню JIT.
Возможно ли проверить, является ли число, сохранённое в переменной типа real, целым, не переводя его в строку?
В строку это как раз и не проверка, а костыль. А так - как и все остальные проверки с real
, надо проверять с какой то вразумительной для вашей ситуации точностью:
## var x := ReadReal;
Writeln(Abs(x-x.Round) < 0.001);
Хотя теоретически, в этом вопросе можно получить и идеальный результат, рассмотрев биты числа напрямую. Но в любой реальной ситуации кроме прямого ввода с клавиатуры - вам будет выдавать что числа которые выводит как целые - на самом деле не совсем целые.
Всегда ли следует сохранять результат вычисления, если его подразумевается использовать немедленно подряд 2 раза?
Смотря какое вычисление. Есть случаи вроде
.Select(x->(x*x) and (x*x*x))
Тут можно сохранить x*x
, но даже если оптимизатор это не сделает - не большая потеря. И всё равно обычно лучше чем что то типа:
.Select(x->
begin
var x_sq = x*x;
Result := x_sq and (x_sq*x);
end);
Потому что такая тонкая оптимизация имеет смысл только в самых напряжённых частях программы. А в них операции последовательностей, как .Select
, будет бОльшей проблемой для производительности, чем 1 лишнее умножение - то есть весь участок кода будет выглядеть по-другому.
При паузе после завершения консольной программы игнорируется выведенная верхняя часть суррогатных пар:
## Write(char(System.Convert.ToInt32('D800', 16)));
в отличие от
## Write(char(System.Convert.ToInt32('D800', 16)), ' ');
и результаты выполнения этих программ отличаются:
## Write(1);
Console.SetCursorPosition(10,0);
Write(2);
Console.ReadKey(true);
## Write(char(System.Convert.ToInt32('D800', 16)));
Console.SetCursorPosition(10, 0);
Write(2);
Console.ReadKey(true);
и результаты выполнения этой программы одинаковы вне зависимости от очистки буфера:
## Write(char(System.Convert.ToInt32('D800', 16)));
//Console.Clear;
Write(char(System.Convert.ToInt32('DC00', 16)));
Console.ReadKey(true);
Значит, верхняя часть суррогатных пар хранится вне буфера консоли до вывода следующего символа и выводится сразу перед ним. Но где именно она хранится?
$D800
, и без всяких строк.
Что касается всех суррогатных пар символов - попробуйте с Console.Write
вместо просто write
. Если продолжится - это так консоль работает, а не паскаль.
Какие символы занимают не одну позицию в консоли, кроме верхней части суррогатных пар, 7 и 8226, 8 и 9688, 9 и 9675, 10 и 9689, 13 и 9834?