- All examples are fully functional with all the needed input and output operations. However, only the code needed to outline the algorithms at hand is copied into the text - the full samples are available via the download links. (Note: It can take up to 48 hours until the cvs is updated).
- We seldom use predefined types in the sample code but define special types suitable for the algorithms at hand.
- Ada allows for default function parameters; however, we always fill in and name all parameters, so the reader can see which options are available.
- We seldom use shortcuts - like using the attributes Image or Value for String <=> Integer conversions.
All these rules make the code more elaborate than perhaps needed. However, we also hope it makes the code easier to understand
Chapter 1: IntroductionEdit
The following subprograms are implementations of the Inventing an Algorithm examples.
The Ada example code does not append to the array as the algorithms. Instead we create an empty array of the desired length and then replace the characters inside.
functionTo_Lower (C : Character)
renamesAda.Characters.Handling.To_Lower; -- tolower - translates all alphabetic, uppercase characters -- in str to lowercase
functionTo_Lower (Str : String)
isResult : String (Str'Range);
loopResult (C) := To_Lower (Str (C));
Would the append approach be impossible with Ada? No, but it would be significantly more complex and slower.
Equal Ignore CaseEdit
-- equal-ignore-case -- returns true if s or t are equal, -- ignoring case
functionEqual_Ignore_Case (S : String; T : String)
constantInteger := S'First - T'First;
ifT'Length /= S'Length
returnFalse; -- if they aren't the same length, they -- aren't equal
ifTo_Lower (S (I)) /= To_Lower (T (I + O))
Chapter 6: Dynamic ProgrammingEdit
The following codes are implementations of the Fibonacci-Numbers examples.
To calculate Fibonacci numbers negative values are not needed so we define an integer type which starts at 0. With the integer type defined you can calculate up until
Fib (88) will result in an
You might notice that there is not equivalence for the
assert (n >= 0) from the original example. Ada will test the correctness of the parameter before the function is called.
functionFib (n : Integer_Type)
ifn = 0
elsifn = 1
returnFib (n - 1) + Fib (n - 2);
For this implementation we need a special cache type can also store a -1 as "not calculated" marker
The actual type for calculating the fibonacci numbers continues to start at 0. As it is a
subtype of the cache type Ada will automatically convert between the two. (the conversion is - of course - checked for validity)
In order to know how large the cache need to be we first read the actual value from the command line.
constantInteger_Type := Integer_Type'Value (Ada.Command_Line.Argument (1));
The Cache array starts with element 2 since Fib (0) and Fib (1) are constants and ends with the value we want to calculate.
The Cache is initialized to the first valid value of the cache type — this is
F : Cache_Array := (
What follows is the actual algorithm.
functionFib (N : Integer_Type)
ifN = 0
elseN = 1
elsifF (N) /= Cache_Type'First
elseF (N) := Fib (N - 1) + Fib (N - 2);
This implementation is faithful to the original from the Algorithms book. However, in Ada you would normally do it a little different:
when you use a slightly larger array which also stores the elements 0 and 1 and initializes them to the correct values
range0 .. Value)
ofCache_Type; F : Cache_Array := (0 => 0, 1 => 1,
and then you can remove the first
This will save about 45% of the execution-time (measured on Linux i686) while needing only two more elements in the cache array.
Memory Optimized ImplementationEdit
This version looks just like the original in WikiCode.
range0 .. 999_999_999_999_999_999;
functionFib (N : Integer_Type)
isU : Integer_Type := 0; V : Integer_Type := 1;
in2 .. N
constantInteger_Type := U + V;
beginU := V; V := T;
No 64 bit integersEdit
Your Ada compiler does not support 64 bit integer numbers? Then you could try to use decimal numbers instead. Using decimal numbers results in a slower program (takes about three times as long) but the result will be the same.
You should know that floating point numbers are unsuitable for the calculation of fibonacci numbers. They will not report an error condition when the number calculated becomes too large — instead they will lose in precision which makes the result meaningless.