А чтобы не получить его при real(a)/b
, нужно, чтобы MinReal
<=a
<=MaxReal
и MinReal
<=b
<=MaxReal
? Есть ли способы избежать real.Infinity
без ограничения диапазона значений переменных a
и b
(включая способы, подразумевающие обход переведения BigInteger
в Real
)?
А у меня другой вопрос: какой реальной задачей надо заниматься, чтобы для представления результатов не хватало 10^308 ? Или это вопрос из разряда “А что, уже просто так спросить нельзя?”
В моей программе есть код типа
var
a, b, c, d: BigInteger;
begin
var s:BigInteger:=a*5+b*4+c*3+d*2;
var already:BigInteger:=a+b+c+d;
var СреднееАрифметическое:real:=real(s)/real(already);
end.
где переменные s
и already
могут принимать значение (потому что они не ограничены), при котором выйдет ошибка, связанная с real.Infinity
.
Кстати, второй раз заметил, что (когда я держу открытой вкладку браузера с этим форумом, прикрываю, а после снова открываю окно браузера) если серый счётчик времени от момента написания сообщения в правом верхнем углу равен 21 минуте, то он показывается как “1мин”, вместо “21мин”.
Я не задавал вопроса, какой конкретно код Вы написали, я спросил, В КАКОЙ РЕАЛЬНОЙ ЗАДАЧЕ может возникнуть нужда работать с величинами, значение которых неограниченно? Вы вычисляете нечто, где в формуле указана “бесконечность”? Но тогда это не вычислительный алгоритм. Поймите, всегда будет актуальной фраза профессора Преображенского
Разруха не в клозетах, а в головах
На бедного везде каплет (народное)
Пытаюсь сделать, чтобы, если значение слишком большое, запрашивало повторный ввод в переменные a
, b
, c
и d
:
if ((a*5+b*4+c*3+d*2)>MaxReal) then
begin
Writeln('Ошибка. Сумма a, b, c и d больше ', MaxReal, '. Введите значения поменьше.');
goto ВыборTrue;
end;
но выходит ошибка:
Операция '>' не применима к типам System.Numerics.BigInteger и real
Как исправить?
Я сам решил:
if real.IsInfinity(real(a*5+b*4+c*3+d*2)) then
begin
Writeln('Ошибка. Сумма оценок больше ', MaxReal, '. Введите значения поменьше.');
end;
Это, конечно, просто финиш! goto в PascalАВС.NЕТ в 2020 году! Нет, это пя-я-я-я-я-ть!
А что-нибудь в стиле
repeat
...
until not real.IsInfinity(real(a*5+b*4+c*3+d*2));
никак нельзя?
Что делать (только ждать, пока добавят поддержку TryRead для типа Boolean?), если выходит ошибка “Нет перегруженной подпрограммы с такими типами параметров”, когда я пытаюсь выполнить
var
Выбор: boolean;
begin
while not TryRead(Выбор) do Writeln('Ошибка. Неподходящее значение.');
end.
Какие, по вашем, строки должны вводиться? И при чём тут ожидание, вы не можете сами такую подпрограмму реализовать?
Не понял Вас.
Готово.
Как написать длинное название программы в строке с program
, например,
program Программа с длинным названием v1.0;
Какие строчки надо подать на ввод чтоб её прочитало как boolean
, и каким значениям они будут соответствовать?
А, стоп, ну да…
procedure IOStandardSystem.read(var x: boolean);
begin
var s := ReadLexem.ToLower;
if s = 'true' then
x := True
else if s = 'false' then
x := False
else raise new System.FormatException('Входная строка имела неверный формат');
end;
Но вообще тогда уж лучше…
begin
var b: boolean;
while not boolean.TryParse(ReadString, b) do
Writeln(new System.FormatException);
b.Println;
end.
Хотя это бред, обычно для нормального консольного интерфейса надо ожидать на ввод что то типа t
/f
, а не целое слово. Это не юзабельно.
Но что я пытался донести - что подавать на ввод можно долго думать, странно было бы отдавать предпочтение 1 из вариантов в стандартном модуле.
Всё равно не понимаю. С моей степенью понимания на данный момент я могу ответить следующим образом:
Если написать в поле ввода True
или true
, то переменная типа boolean
примет значение True
. Если написать в поле ввода False
или false
, то переменная типа boolean
примет значение False
.
Пока это писал, заметил новое сообщение, следовательно, возможно, что написанное выше уже не актуально. Кроме того, сообщение, начинающееся со слов
я тоже не понял, кроме части
В общем, я решил вопрос с отсутствием подпрограммы для случая
begin
var x:boolean;
TryRead(x);
end.
добавив в свою программу подпрограмму наподобие уже существующих и отправив предложение на её добавление в этом сообщении: Замечания и предложения.
Теперь мне нужно узнать
поскольку при таком написании Pascal не принимает пробелы и точки в названии программы.
IOStandardSystem
это тип из PABCSystem
отвечающий за парсинг значений различных типов при вводе.
Зачем вам вообще строчка с program
? Она практически ничего не делает. С тем же успехом можно добавить комментарий.
А что же она делает? (Она только делает так, чтобы заголовок окна программы не зависел от имени файла, с помощью которого она запускается?) И всё-таки,
Изменяет внутреннее представление. В .Net-овских .exe бывают только классы. Ваши глобальные переменные - это статические поля классов (поэтому и медленнее локальных). Ваши глобальные подпрограммы - на самом деле статические методы классов.
Строчки program
, unit
и library
изменяют название класса, в который будет сувать глобальные подпрограммы и поля текущего файла.
Видеть это можно только в стеках исключений:
//program abc;
begin
try
raise new Exception;
except
on e: Exception do
Writeln(e);
end;
end.
Посмотрите что выводит так и если разкомментировать первую строчку.
Вы имеете в виду консольное окно? Так оно показывает имя .exe
файла. То есть оно поменяется если вы готовый бинарник переименуете. Но по моему проще поменять Console.Title
.
Здравствуйте, @Just_name . Вы можете использовать ABCNET
вместо PABCSystem
. Что Вы получите при данном выборе:
- Независимость от
PascalABC.NET
- работает на всехNET
языках - Высокая структурированность
- Большее количество функционала
- Высокий уровень стандартизации
Более того - установка библиотеки достаточно удобна благодаря наличию соответствующего NuGet-пакета
. Более подробно об этом можно узнать на главной странице проекта, на которую ссылка ниже.
Посмотреть возможности библиотеки Вы можете без скачивания примеров - в разделе Wiki
проекта имеются ссылки на примеры для запуска online.
Если Вам понравится продукт - Вы можете стать частью нашей команды разработчиков, но для этого - просьба обратиться ко мне лично, чтобы я выдал Вам соответствующие права разработчика на GitHub
и группе поддержки.
Некоторые полезные инструменты, которые могут пригодится и в повседневной жизни:
– NETMouse projects ©
Давайте-ка я Вас отсюда уберу. Вот за эту фразу на вашем ресурсе:
“PascalABC. NET (нестабильная IDE со слабым компилятором)”
Мы думали, Вы исправились после той истории с Хабром, но видимо нет.
Здесь на страницах форума мы не будем рекламировать ничей продукт, который содержит подобные строки.
Кроме того, мы просим вас не регистрироваться на форуме под разными аккаунтами и использовать свой основной аккаунт MrFresnel, под которым здесь вас хорошо знают