Я новичок в программировании, в настоящее время использую FreePascal для обучения. Я хочу сделать простой преобразователь температуры. я изо всех сил пытаюсь проверить ввод. потому что я использую «real» как var, и я не могу проверить ввод только для чисел и отрицательного знака. я хочу написать «ложный ввод» и повторить ввод температуры, если ввод содержит алфавит/буквенно-цифровой. но когда я ввожу температуру в алфавитно-цифровом формате, она просто выходит из программы. как это сделать правильно? есть ли решение?
проверка ввода с "реальным" в качестве переменной
вот мой текущий код
program Fahrenheit_to_Celsius;
uses crt;
function strtofloat (floatstring : string) : extended;
var F: string;
floatvalue: extended;
C: real;
exit: boolean;
decision: shortstring;
begin
clrscr;
textattr :=$3;
gotoxy (52,1);
writeln ('Fahrenheit to Celsius Converter');
repeat
write ('Input Fahrenheit: ');
readln (F);
begin
try
F := strtofloat ('10 E 2');
except
on exception : econverterror do
showmessage (exception.message);
end;
try
F := strtofloat ('$FF');
except
on exception : econverterror do
showmessage (exception.message);
end;
C := ((F-32)*(5/9));
writeln ('Temperature in Celsius: ', C:0:5);
begin
writeln;
gotoxy ((wherex () + 56), (wherey() - 0));
writeln ('Convert again or exit?');
gotoxy ((wherex () + 31), (wherey() - 0));
writeln ('Input e then press enter to exit or input anything else to convert again');
write ('Decision:');
readln (decision);
if (decision = 'e') then
exit := true
else
exit := false;
gotoxy ((wherex () + 0), (wherey() - 3));
delline;
gotoxy ((wherex () + 0), (wherey() - 0));
delline;
end;
until exit;
end.
Прошло много времени с тех пор, как я практиковал паскаль, но я дам вам идею, я думаю, вы не можете проверить это таким образом, потому что если вы объявите ввод как real
, как только программа получит недействительный input
, она выйдет, поэтому я предлагаю, чтобы вместо этого объявить переменную как string
, затем вы создаете функцию для ее проверки, наконец, если функция возвращает true
, вы конвертируете string
в float
.
Функция должна перебирать каждый символ в полученном string
и возвращать false
, если
.
.
(создайте переменную и увеличивайте ее каждый раз, когда вы поймаете символ, равный .
).
.
@DavidHeffernan Спрашивающий заявляет, что он новичок в программировании. Я думаю, что делать это вручную вполне оправданно, так как это довольно «осязаемо». Тем не менее, я согласен с вами, что в продакшене program
вы будете использовать sysUtils.tryStrToFloat.
люди обычно используют паскаль для изучения программирования и особенно циклов, лично я никогда не использовал библиотеку, когда программировал на паскале, и поэтому я не дал ему код, а дал несколько советов, как сделать это самостоятельно
@ahmed, как вы читаете ввод без библиотеки? Кроме того, прочитав строку и проверив ее, как преобразовать ее в тип с плавающей запятой, чтобы выполнить арифметику? Помните, что вы не используете библиотеки.
Я не говорю о базовых библиотеках
@DavidHeffernan readStr('+123.456E-78', x)
по существу равен x := +123.456E-78
. Процедура readStr
является частью языка, стандартизированного стандартом ISO 10206 «Extended Pascal».
@kai это был бы один из способов, но лучше выполнять проверку и преобразование вместе с TryStrToFloat. И в любом случае мой вопрос был риторическим. Ответчик не предлагает преобразовывать str в float в своем собственном ручном коде.
@ahmed SysUtils — это базовая библиотека, не так ли? Учитывая первое предложение вашего ответа, почему бы не прислушаться к опыту людей, у которых есть современный опыт.
Итак, первое, что я должен сделать, это изменить объявление (переменная F с вещественной на целочисленную). А затем добавьте другое объявление (создайте функцию для проверки целого числа), если функция верна, используйте strtofloat, а если ложь, снова создайте цикл для ввода по Фаренгейту. Итак, этот strtofloat необходим, потому что мы не можем выполнять арифметические действия со строкой, а?
Нет, не кодируйте это самостоятельно. Вызовите библиотечную функцию TryStrToFloat.