comp.lang.ada
 help / color / mirror / Atom feed
From: Jeffrey Carter <jrcarter@acm.org>
Subject: Re: Newbie question on Ada TExt_IO
Date: Fri, 04 Oct 2002 20:07:07 GMT
Date: 2002-10-04T20:07:07+00:00	[thread overview]
Message-ID: <3D9DF4DC.4000105@acm.org> (raw)
In-Reply-To: Sikn9.1513$Mw4.1034@nwrddc01.gnilink.net

Justin Birtwell wrote:
> Accept entire line using Get_Line into string(1..256);
> Check if first character is a digit
> Check if digit is between 1 and 6
> error handling
> 
> Here's the code:
> 
> with Text_Io;use Text_Io;
> with StringFunctions;use StringFunctions;
> 
> procedure Test_IO_2 is
>    Input: String(1..256);
>    N:Integer;
>    Success:Boolean:=false;
>    Last:Integer;
> begin
>       while success /=true loop

Constructs like this frequently indicate a lack of understanding of what 
a Boolean value is. This could be

while not Success loop

That's kind of hard to understand when you go around the loop and when 
you stop. It's easier to understand if written

loop
    exit when Success;

However, Success is an unnecessary flag. It would be better to eliminate 
it, as shown below.

>       Put("PLease enter a number between 1 and 6");
>       Get_Line(Item=>Input,Last=>Last);
>          if Is_Digit(Input(1..1)) then

You could write

if Ada.Characters.Handling.Is_Digit (Input (Input'First) ) then

rather than writing your own function.

>             N:=Integer'Value(Input(1..1));
>             if N>=1 and N<=6 then

if N in 1 .. 6 then

>                Success:=True;
>             end if;
>          else
>             success:=false;
>             Put_Line("Invalid entry, try again.");
>          end if;
>        end loop;
>       Put_Line("Thank you");
>      exception
>       when others=>
>          Put_Line("Error, Invalid data.");
> end;

If the user enters "60" you're going to interpret it as 6, and if " 1" 
will be an error. Is that really what you want? Doing

subtype Valid_Number is Integer range 1 .. 6;
N : Valid_Number;
...
N := Integer'Value (Input (Input'First .. Last) );

will reject "60" (not in range) and interpret " 1" as 1.

You can write what you have as:

subtype Valid_Number is Integer range 1 .. 6;

N : Valid_Number;
...
Get_Number : loop
    -- Get_Line

    Check : begin
       N := Integer'Value (Input (Input'First .. Last) );

       exit Get_Number;
    exception -- Check
    when others =>
       -- Error message
    end Check;
end loop Get_Number;

which seems a lot shorter and clearer (though admittedly some of the 
simplification comes from changing how the input is interpreted). It may 
take you a little while to become comfortable with Ada to the point that 
you come up with things like the above rather than the more complicated 
version you have, so don't get discouraged.

> 
> Is_Digit a hack of a procedure that compares the 1 character string to all
> 10 digits characters.  I really have a lot to learn.   What's giving me the
> hardest time is working within the confines of strict/strong typing.  The
> Ada.Characters.Handling  package already has an Is_Digit function, but it's
> expecting a character not a single item String array!  How can I convert
> from one into the other?  I have the distinct feelling like I'm reinventing
> the wheel.  Aren't packages aready made to do alot of this
> converting/validation?  If so where are they?  How can one access them?

Type String is an array of type Character, so Input (N) is of type 
Character. See my suggestion above.

> Does the RM list all the packages provided by Ada or are there more to be
> discovered?

The ARM lists all the standard packages that come with all compilers. 
There are lots of other packages available. www.adapower.com is probably 
a good place to start if you want to find others.

-- 
Jeff Carter
"I wave my private parts at your aunties."
Monty Python & the Holy Grail




  parent reply	other threads:[~2002-10-04 20:07 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-10-03 18:20 Newbie question on Ada TExt_IO Justin
2002-10-03 18:50 ` Matthew Heaney
2002-10-03 19:05 ` Jeffrey Carter
2002-10-03 19:35 ` David C. Hoos
2002-10-03 19:35 ` tmoran
2002-10-03 19:43 ` Preben Randhol
2002-10-03 19:55   ` Matthew Heaney
2002-10-03 20:07     ` Preben Randhol
2002-10-04  2:42 ` SteveD
2002-10-04 17:49   ` Justin Birtwell
2002-10-04 18:00     ` David C. Hoos
2002-10-04 18:04       ` Preben Randhol
2002-10-04 18:00     ` Preben Randhol
2002-10-04 18:02       ` Preben Randhol
2002-10-04 18:34     ` tmoran
2002-10-04 17:34 ` Justin Birtwell
2002-10-04 17:58   ` Preben Randhol
2002-10-04 18:13   ` tmoran
2002-10-04 20:07   ` Jeffrey Carter [this message]
2002-10-07  8:26     ` Fraser Wilson
2002-10-07 19:44       ` Jeffrey Carter
2002-10-05  2:43   ` SteveD
2002-10-05  5:25     ` tmoran
  -- strict thread matches above, loose matches on Subject: below --
2002-10-07  6:01 Grein, Christoph
2002-10-07  8:27 Grein, Christoph
2002-10-07 11:48 ` Fraser Wilson
2002-10-07 12:46   ` Robert A Duff
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox