#ada
#ada
Вопрос:
Вопрос для начинающих!. Я хочу попросить пользователя написать свой день рождения (например: 19980231), а затем распечатать его следующим образом: 1998-02-31. Может показаться простым добавить тире между числами в Ada, но я не мог понять это. Есть предложения? Вот как далеко я продвинулся
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
procedure Dugga is
N, M,Z,Y,X:Integer;
begin
Put("Write ur date of birth: ");
Get(X);
Y:= X/10000;
Put(Y); Put("-");
Z:= X - (Y*10000);
M:= Z/100;
if 9 < M then
Put(M,width=>0); Put("-");
elsif 9 >= M then
Put("0"); Put(M, width=>0); Put("-");
end if;
Put(M,width=>0); Put("-");
N:= Z - (M*100);
Put(N, width=>0);
end Dugga;
Комментарии:
1. Да, мы даже не знаем, как вы использовали Width или что вы ожидали от него или что он сделал по-другому.
2. Я только что обновил свой код. Это выглядит лучше, но я все еще не знаю, как правильно его написать.
3. Вы предполагаете
Integer
, что можете содержать 8-значное число, это очень часто верно, но это не гарантировано. (Альтернативой может быть чтение информации в виде строки.) Это:W:= X-X;
вероятно, была опечатка; он равенW
нулю.4. Да. Теперь я использовал оператор if, чтобы исправить это, и все работает нормально :). Это должен быть лучший способ написать этот код, и мне интересно, как?
5. Рассматривали ли вы возможность чтения входного значения в виде строки вместо целого числа? Нет причин преобразовывать целое число в строку.
Ответ №1:
Следующая программа считывает входные данные в виде строки, проверяя, введено ли правильное количество символов.
with Ada.Text_IO; use Ada.Text_IO;
procedure Birthday is
Raw : String (1 .. 8);
Length : Natural := 0;
begin
loop
Put ("Enter a date in the format YYYYMMDD: ");
Get_Line (Raw, Length);
exit when Length = 8;
Put_Line ("Wrong input format. Try again.");
end loop;
Put_Line (Raw (1 .. 4) amp; "-" amp; Raw (5 .. 6) amp; "-" amp; Raw (7 .. 8));
end Birthday;
Комментарии:
1. Это позволяет вводить более 8 символов.
2. Раздел A.10.7 LRM описывает процедуру Get_Line следующим образом: «Считывает последовательные символы из указанного входного файла и присваивает их последовательным символам указанной строки. Чтение останавливается, если встречается конец строки. Чтение также останавливается, если встречен конец строки до встречи с концом строки; в этом случае Skip_Line (фактически) вызывается с интервалом 1. Значения не присвоенных символов не указаны.» Поэтому из входных данных будет считываться максимум 8 символов.
3. Верно, но что, если я, например, дважды набрал один из ранних символов? Код будет «работать», но даст неверный ответ, и во входном буфере останется дополнительный символ. Было бы безопаснее использовать функциональную форму
Get_Line
4. Если вы используете функциональную форму Get_Line, вы рискуете вернуть строку, размер которой превышает требуемые 8 символов, без устранения проблемы двойного ввода раннего символа. У вас все равно будет неправильный ответ. Если в требованиях к программе не указан правильный диапазон значений года, месяца и дня, вы не сможете редактировать ввод в программе.