Помощь новичкам

В GraphABC есть вроде, и вопросов особо не возникало )

Добрый день , Помогите пожалуйста сделать такую программу: В 2D пространстве нарисовать 3-4 3D фигуры кубы/параллелепипеды с возможностью перемещения по оси координат и так же приближения и отдаления. Прикреплю фотку , может так будет понятнее. Exm

Помочь - это подсказать путь решения какой-то проблемы, указать место ошибки в алгоритме или в коде, разъяснить какую-то конструкцию языка, дать какую-то ссылку на литературу и т.п. Но не написать вместо Вас решение задания. Такие дела тут не проходят.

Да лучше пользуйтесь возможностями 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 помогло.

1 лайк

Возможно ли проверить, является ли число, сохранённое в переменной типа 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?