Как проверить ввод с «реальным» в качестве переменной только для чисел?

Я новичок в программировании, в настоящее время использую 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.
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прошло много времени с тех пор, как я практиковал паскаль, но я дам вам идею, я думаю, вы не можете проверить это таким образом, потому что если вы объявите ввод как real, как только программа получит недействительный input, она выйдет, поэтому я предлагаю, чтобы вместо этого объявить переменную как string, затем вы создаете функцию для ее проверки, наконец, если функция возвращает true, вы конвертируете string в float.

Функция должна перебирать каждый символ в полученном string и возвращать false, если

  1. один символ не является числом или не является .
  2. строка содержит более одного . (создайте переменную и увеличивайте ее каждый раз, когда вы поймаете символ, равный .)
  3. первый символ .
  4. последний символ .

Нет, не кодируйте это самостоятельно. Вызовите библиотечную функцию TryStrToFloat.

David Heffernan 11.02.2023 09:02

@DavidHeffernan Спрашивающий заявляет, что он новичок в программировании. Я думаю, что делать это вручную вполне оправданно, так как это довольно «осязаемо». Тем не менее, я согласен с вами, что в продакшене program вы будете использовать sysUtils.tryStrToFloat.

Kai Burghardt 11.02.2023 12:54

люди обычно используют паскаль для изучения программирования и особенно циклов, лично я никогда не использовал библиотеку, когда программировал на паскале, и поэтому я не дал ему код, а дал несколько советов, как сделать это самостоятельно

Ahmed Sbai 11.02.2023 15:44

@ahmed, как вы читаете ввод без библиотеки? Кроме того, прочитав строку и проверив ее, как преобразовать ее в тип с плавающей запятой, чтобы выполнить арифметику? Помните, что вы не используете библиотеки.

David Heffernan 11.02.2023 21:18

Я не говорю о базовых библиотеках

Ahmed Sbai 11.02.2023 21:24

@DavidHeffernan readStr('+123.456E-78', x) по существу равен x := +123.456E-78. Процедура readStr является частью языка, стандартизированного стандартом ISO 10206 «Extended Pascal».

Kai Burghardt 12.02.2023 00:41

@kai это был бы один из способов, но лучше выполнять проверку и преобразование вместе с TryStrToFloat. И в любом случае мой вопрос был риторическим. Ответчик не предлагает преобразовывать str в float в своем собственном ручном коде.

David Heffernan 12.02.2023 07:44

@ahmed SysUtils — это базовая библиотека, не так ли? Учитывая первое предложение вашего ответа, почему бы не прислушаться к опыту людей, у которых есть современный опыт.

David Heffernan 12.02.2023 07:45

Итак, первое, что я должен сделать, это изменить объявление (переменная F с вещественной на целочисленную). А затем добавьте другое объявление (создайте функцию для проверки целого числа), если функция верна, используйте strtofloat, а если ложь, снова создайте цикл для ввода по Фаренгейту. Итак, этот strtofloat необходим, потому что мы не можем выполнять арифметические действия со строкой, а?

Reanz 14.02.2023 21:54

Другие вопросы по теме