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

Давайте вы всё же сами покопаетесь в настройках консоли, перед тем как задавать кучу вопросов.
Чтоб буква выводилась - нужно чтоб был шрифт, который описывает как её вывести. А он настраивается в консоли и никак к паскалю не относится.

Почему в паскале нет стандартной подпрограммы для вычисления корня? Предлагаю её добавить.

Я запутался в видах чисел, поэтому прошу решить, как лучше реализовать подпрограмму вычисления корня любого числа любой степени. Насколько я понял, в паскале возможно вычислить корень в области комплексных чисел, ведь так? Тогда как следует изменить или даже разделить на несколько представленную ниже подпрограмму, чтобы её результатом выполнения был корень в конкретной области чисел (комплексных, действительных и т. д.)?

///Корень степени n из x.
function Rt(x, n: real): real;
begin
  if (n <= 0) then raise new System.ArgumentOutOfRangeException('Степень корня должна быть положительной.'); // Стоит ли это вводить, ведь 2**(-1) = 0.5
  if (x < 0) then // if not (Int(n)=n) then else // Что делать, если число отрицательное, а степерь вещественная, ведь в таком случае y**n = NaN
    if (Int(n) = n) and (Trunc(n) mod 2 = 0) then raise new System.ArgumentException('Корень чётной степени из отрицательного числа не существует в области вещественных чисел.'); // А вдруг нужен корень в области комплексных чисел?
  Result := Sign(x) * Abs(x) ** (1 / n);
end;

Надо не изменить, а добавить перегрузку, у которой и параметры, и возвращаемое значение имеют тип Complex.

И делайте подпрограммам нормальные имена, хотя бы Root, но точно не Rt

  1. Int(n) может дать переполнение, потому что real.MaxValue > integer.MaxValue.
  2. А зачем, по вашему, real.NaN? Эти все проверки ни к чему.
  3. И Abs с Sign тоже лишние. Root(-4, 2) это не -2, это NaN.

В справке представлены математические подпрограммы только для действительных чисел?

То есть это оптимальный вариант для действительных чисел?

///Корень степени n из x.
function Root(x, n: real):= x ** (1 / n);

Не знаю, давно не смотрел. Только что толку?

  1. Берёте и применяете операцию типа real к Complex.
  2. Если не работает - ищете среди статичных методов типа Complex.

Я сам не представляю, какому из этих пунктов можно помочь справкой. С ней только медленнее будет.

Да. Только пробела перед := не хватает, а так всё по феншую.

Как сделать следующие функции максимально компактно, желательно не перебирая каждое значение?

///Определяет, возможно ли нажать клавишу с кодом keycode (а вдруг на современной клавиатуре нет соответствующей кнопки).
function CanBePressed(keycode: byte): boolean;

///Определяет, возможно ли ввести с клавиатуры символ, соответствуюшщий keycode. Shift — можно ли использовать shift.
function CanBeTyped(keycode: byte; shift: boolean := false): boolean;

///Определяет, возможно ли ввести с клавиатуры символ c нажатием клавиши с кодом keycode. Shift — можно ли использовать shift.
function CanBeTypedByPressing(c: char; keycode: byte; shift: boolean := false): boolean;

///Определяет, какие символы возможно ввести с клавиатуры нажатием клавиши с кодом keycode. Shift — можно ли использовать shift.
function WhatCharsCanBeTypedByPressing(keycode: byte; shift: boolean := false): array of char;

///Определяет, какие keycode имеют все клавиши на клавиатуре.
function GetKeycodesOfAllKeysThatCanBePressed: array of byte;

///Определяет, какие keycode у символов, которые возможно ввести с клавиатуры. Shift — можно ли использовать shift.
function GetKeycodesOfAllCharsThatCanBeTyped(shift: boolean := false): array of byte;

///Определяет, какие символы возможно ввести с клавиатуры. Shift — можно ли использовать shift.
function GetAllCharsThatCanBeTyped(shift: boolean := false): array of char;

Как сделать так, чтобы в подпрограмме можно было и выполнить желаемую стандартную подпрограмму вывода с параметрами (что-то вроде callback-вызова), и получить строку, которая будет выведена, причём независимо друг от друга?

Клавиши которые могут быть нажаты - это, считайте, все от 0 до 255. Существует ли кнопка на кливиатуре - это, конечно интересный вопрос, но чтоб такое выяснить, если вообще возможно - вам придётся лезть в драйверы.
К примеру, у меня украинская клавиатура, поэтому у неё часть места, обычно занимаемого левым шифтом, занято дополнительной буквой “гъ” с кодом 226.

Так же есть коды как 166,167,168. Их не бывает и не должно быть на клавиатуре. Но у меня умная мышка, с дополнительными кнопками, которые можно настраивать (по ним можно даже свои скрипты запускать, но я поставил эти 3 кода). Конкретно эти 3 кода управляют браузером: “Назад”, “вперёд” и “перезагрузить страницу” соответственно. Проводник и некоторые редакторы (как студия и np++) тоже обрабатывают эти кнопки. То есть, вам придётся лезть не только в список существующих кнопок, но ещё и в их настройки. В лучшем случае - для каждой марки мышки и клавиатуры отдельно. В худшем - для каждой модели.

А в связь кодов и символов лучше вообще не лезть, там всё зависит от раскладки, которой управляет система. У майкрософта есть своя утилита для их создания, и там на каждую кнопку можно забить вообще любой символ/цепочку символов (то есть даже :red_car:, состоящую из 2 символов юникода, не существующих в ANSI).

.

Можно наследовать от IOStandardSystem и менять self.tr на врайтер своего потока данных, но там далеко не все методы.

Как приостановить выполнение консольной программы в оболочке до нажатия клавиши, не изменяя содержимое буфера ввода?

Объясните подробнее.

Я видел, что используют Readln. Когда выполнение доходит до Readln, нужно нажать Enter, чтобы продолжить выполнение программы. Но это стирает данные из буфера ввода, что нежелательно для меня.

type
  КакНазвать = class(IOStandardSystem)
    //Что тут писать (как "менять self.tr на врайтер своего потока данных")?
  end;
  
begin
  //Как использовать?  
end.
##
var i := ReadInteger;
Console.ReadKey(true);
var i2 := ReadlnInteger;
Writeln(i2);
Readln;

Вводите:

123 456

Затем нажимаете Enter и ещё 1 любую кнопку. Этого поведения вы хотели?

А, стоп, tr это же чтение данных с клавиатуры. А вам вывод был нужен, да? Превращение объекта в string внутри всех write и print выполняет функция _ObjectToString. Остальное придётся реализовать ручками.

Ну а про tr - это поле (почему я, собственно, добавил self. перед ним) типа IOStandardSystem. Если вы наследуете от этого типа - вы можете перезаписать значение поля tr. К примеру, в конструкторе.

Ну, ещё раз, это позволит вам использовать подпрограммы чтения для всех основных типов, так чтоб они читали из произвольного потока или даже строки. Но это не то, что вы спрашивали.

Нет. Я хотел то же самое, что здесь, но чтобы это можно было запустить вне консольного окна, например, в IDE.

А, ну у окна ввода в IDE нет фич для работы с отдельными нажатиями, оно посылает программе введённые строки целиком.

Возможно ли нажать клавишу с кодом, которого нет в System.ConsoleKey?

Интересный вопрос. Можно начать отсюда:

##
Writeln('Коды кнопок в ConsoleKey:');
var key_codes := System.ConsoleKey.GetValues(typeof(System.ConsoleKey)).Cast&<System.ConsoleKey>.Select(key->integer(key)).PrintLines;
Writeln('Отсутствующие коды:');
(1..255).Except(key_codes).PrintLines;

Далее - зависит от того, для чего вам нужна проверка. Можно, к примеру, пройтись по всем НЕ приведённым в этом перечислении кодам и посмотреть, каким кнопкам они соответствуют.

То есть невозможно ли хотя бы сделать так, чтобы IDE пусть и не посылала клавишу программе, но приостановила выполнение программы до нажатия любой клавиши?

Только в Интернете и нажимая на все клавиши клавиатуры под руками?

Ну, это 2 способа которые и мне пришли в голову. Я бы начал с сайта майкрософта, перед тем как делать что то муторное (и не обязательно исчерпывающее) как перетыкивание всех кнопок клавиатуры.