Почему моя программа на аде не работает правильно?

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

Программа делает именно то, о чем вы ее просили. Возможно, вы захотите прочитать, как тип String объявлен в Ada. Также может помочь чтение раздела о вводе-выводе текста в справочном руководстве. Обратите внимание на логическое различие между Get и Get_Line.

Jacob Sparre Andersen 11.04.2018 12:45

Вы случайно не выбрали "CS 3304 - структуры данных"?

Jacob Sparre Andersen 12.04.2018 16:14

Тип String в Ada имеет особое свойство, то есть количество символов в точности соответствует заданному типом. В вашем примере все переменные инициализируются длиной в один (1) символ. Таким образом, когда вы вводите 4-символьную строку, это распределен среди всех 4-х строковых переменных. Если вам нужна строка переменной длины, выберите Ada.Unbounded_Strings или Ada.Fixed_Strings. Первые, как следует из названия, не имеют определенной верхней границы, тогда как вторая позволяет вам указать ее (в этом случае строка находится на пределе).

NeoSer 16.04.2018 16:37
0
3
88
1

Ответы 1

Вот возможное решение:

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

Jacob Sparre Andersen 11.04.2018 13:13

Большое спасибо!

Still In College 11.04.2018 13:26

Джейкоб, я подозреваю, что ты сделал для него домашнее задание («мое задание невероятно простое»), а он ничему не научился.

Jeffrey R. Carter 12.04.2018 09:59

Но если он отдаст его, его профессор подведет, потому что он был загружен из Интернета.

Jacob Sparre Andersen 12.04.2018 12:51

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