#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. Это может использовать дальнейшее объяснение того, почему/как это отвечает на вопрос ОП.