Реализация целочисленного значения(«X») в Ada

#string #ada

Вопрос:

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

Например:

Введите строку, содержащую ровно 5 символов, и целое число: 12345 123

— Типы пользователей выделены жирным шрифтом

Они не одно и то же!

 with Ada.Text_IO; use Ada.Text_IO;  with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;    procedure Test2 is    function String_Integer_Check(  S : in String;  I : in Integer) return Boolean is   begin  if Integer'Value(S) = I then  return True;   else   return False;  end if;   end String_Integer_Check;    S : String(1..5);  I : Integer;   begin  Put("Type in a string containing exactly 5 characters, and an integer: ");  Get(S);  Get(I);  Put("They are ");    if String_Integer_Check(S, I) = False then  Put("not ");  end if;    Put("the same.");  end Test2;  

Моя программа работает, предполагая, что пользователь вводит строку из 5 символов. Если пользователь этого не сделает, моя программа не будет работать. Как мне это исправить?

Если я наберу 123 1234 (строка состоит из 3 символов, а целое число-из 4 чисел), я получу эту ошибку:

Они являются

повышенная ошибка CONTRAINT_ERROR : неверный ввод значения’: «123 1»

Комментарии:

1. Почему вы хотите сравнить строку с целым числом? Это разные типы. Символ » 1 » не совпадает по значению с целым числом 1. Вы пробовали читать эти два значения как целые числа? Если вы сделали это, у вас не будет проблем с вводом, и сравнение двух значений очень просто.

2. Задача состояла в том, чтобы сравнить строку с целым числом и посмотреть, совпадают ли они. Используя целочисленные значения, вы можете преобразовать строку в целое число. Однако вопрос все еще остается открытым, а что делать, если строка меньше 5

3. Они действительно ввели строку ровно из 5 символов, как вы и просили: 123 1 , за которой следует другая строка, 234 . Используя a . для представления пробела, что бы вы ожидали, если бы они набрали 123..123 ? или .123.123 ? Чего бы они ожидали? Кроме того, вы просто просите их ввести строку ровно из 5 символов ; о чем !@£$% ? Возможно, вам следует указать 5 цифр . И, возможно, проверьте, что входные данные соответствуют вашей спецификации, прежде чем звонить Integer’Value .

4. Ваша функция должна просто вернуться Integer'Value (S) = I , и ваш тест должен быть if not String_Integer_Check (S, I) then .

Ответ №1:

Убедитесь, что два входа находятся на разных линиях. Проблемы ввода-вывода, которые вы видите, возникают в результате смешивания строкового ввода-вывода и целочисленного ввода-вывода в одной и той же строке ввода. Это проблема, когда строковая часть входных данных содержит более или менее 5 символов.

 with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;  procedure value_compare is  str_num : String (1 .. 80);  length : Natural;  num : Integer; begin  Put ("Enter a 5 digit number: ");  Get_Line (Item =gt; str_num, Last =gt; length);  if length = 5 then  Put ("Enter a number: ");  Get (num);  if num = Integer'Value (str_num(1..Length)) then  Put_Line ("The two values are equal.");  else  Put_Line ("The two values are not equal.");  end if;  else  Put_Line  ("The input value " amp; str_num (1 .. length) amp;  " does not contain 5 exactly characters.");  end if; end value_compare;  

Комментарии:

1. Это может использовать дальнейшее объяснение того, почему/как это отвечает на вопрос ОП.