Позвольте мне начать с того, что это первая программа ada, которую я когда-либо создавал. Понятия не имею, как это работает, и мое задание невероятно простое. Однако вывод работает некорректно. Он работает с первой переменной, но не со следующими двумя. Он также странно печатает первую переменную. Вот мой код:
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
Author, Title, Pages: String := " ";
begin
Put("Enter Author: ");
Get(Author);
Put("Enter Title: ");
Get(Title);
Put("Enter number of pages: ");
Get(Pages);
Put("Author: ");
Put(Author);
New_Line;
Put("Title: ");
Put(Title);
New_Line;
Put("Number of pages: ");
Put(Pages);
end Main;
Цель состоит в том, чтобы просто ввести информацию о книге, и программа прочитает ее вам. Это результат:
Enter Author: john
Enter Title: Enter number of pages: Author: j
Title: o
Number of pages: h
Боковое примечание, я не мог заставить номера страниц работать как целое число. Методы get
и put
просто выдавали ошибки. Это не важно, но если кто-то может помочь сделать это целым числом, я был бы признателен.
Вы случайно не выбрали "CS 3304 - структуры данных"?
Тип String
в Ada имеет особое свойство, то есть количество символов в точности соответствует заданному типом. В вашем примере все переменные инициализируются длиной в один (1) символ. Таким образом, когда вы вводите 4-символьную строку, это распределен среди всех 4-х строковых переменных. Если вам нужна строка переменной длины, выберите Ada.Unbounded_Strings
или Ada.Fixed_Strings
. Первые, как следует из названия, не имеют определенной верхней границы, тогда как вторая позволяет вам указать ее (в этом случае строка находится на пределе).
Вот возможное решение:
with Ada.Text_IO;
procedure Text_Input is
type Page_Count is range 1 .. 10_000;
package Page_Count_Text_IO is new Ada.Text_IO.Integer_IO (Page_Count);
function Get_Line (Message : in String) return String;
function Get_Line (Message : in String) return Page_Count;
function Get_Line (Message : in String) return String is
begin
Ada.Text_IO.Put (Message);
return Ada.Text_IO.Get_Line;
end Get_Line;
function Get_Line (Message : in String) return Page_Count is
begin
return Result : Page_Count do
Ada.Text_IO.Put (Message);
Page_Count_Text_IO.Get (Result);
if Ada.Text_IO.Get_Line /= "" then
raise Constraint_Error
with "Page count followed by extra characters.";
end if;
end return;
end Get_Line;
Author : constant String := Get_Line ("Enter author: ");
Title : constant String := Get_Line ("Enter title: ");
Pages : constant Page_Count := Get_Line ("Enter number of pages: ");
begin
Ada.Text_IO.Put_Line ("Author: " & Author);
Ada.Text_IO.Put_Line ("Title: " & Title);
Ada.Text_IO.Put_Line ("Number of pages:" & Page_Count'Image (Pages));
end Text_Input;
Обратите внимание, что я сделал функцию Get_Line
для Page_Count
, чтобы убедиться, что у вас нет конечного мусора в строке, где вы вводите количество страниц.
Надеюсь, вы не согласитесь с моей оценкой, что Джон никогда не напишет ни одной книги объемом более 10 000 страниц. :-)
Решение также доступно как часть моего репозитория примеров Ada 2012: bitbucket.org/sparre/ada-2012-examples
Большое спасибо!
Джейкоб, я подозреваю, что ты сделал для него домашнее задание («мое задание невероятно простое»), а он ничему не научился.
Но если он отдаст его, его профессор подведет, потому что он был загружен из Интернета.
Программа делает именно то, о чем вы ее просили. Возможно, вы захотите прочитать, как тип
String
объявлен в Ada. Также может помочь чтение раздела о вводе-выводе текста в справочном руководстве. Обратите внимание на логическое различие междуGet
иGet_Line
.