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

Позвольте мне начать с того, что это первая программа 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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