Strict Standards: Declaration of action_plugin_importoldindex::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/lib/plugins/importoldindex/action.php on line 8
Strict Standards: Declaration of action_plugin_include::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/lib/plugins/include/action.php on line 140
Strict Standards: Declaration of action_plugin_discussion::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/lib/plugins/discussion/action.php on line 955
Strict Standards: Declaration of action_plugin_blog::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/lib/plugins/blog/action.php on line 154
Strict Standards: Declaration of action_plugin_importoldchangelog::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/lib/plugins/importoldchangelog/action.php on line 157
Deprecated: Assigning the return value of new by reference is deprecated in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/inc/parserutils.php on line 205
Deprecated: Assigning the return value of new by reference is deprecated in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/inc/parserutils.php on line 208
Deprecated: Assigning the return value of new by reference is deprecated in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/inc/parserutils.php on line 389
Deprecated: Assigning the return value of new by reference is deprecated in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/inc/parserutils.php on line 530
Strict Standards: Declaration of cache_instructions::retrieveCache() should be compatible with cache::retrieveCache($clean = true) in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/inc/cache.php on line 291
Deprecated: Function split() is deprecated in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/inc/auth.php on line 154
Strict Standards: Only variables should be passed by reference in /freeola/users/0/0/sr0193000/htdocs/dokuwiki/doku.php on line 71
====== DSA Warm-Up Exercise 2003 ======
This was the warm-up exercise for my Data Structure and Algorithms course in second year at the University of Glasgow. It is a short program written in the programming language Ada. It's not particularly complicated, interesting or impressive, but I got 10/10 for it. I don't see much Ada code on the net to be honest, so a budding young programmer from the American Military might find it useful :-P (that was a little Ada in-joke there).
===== Description =====
This program takes in an integer followed by a list of names, equal in number to the value of the integer. The names are then sorted in ascending alphabetical order and displayed to standard output.
===== The Source Code =====
You can download the source [[http://www.n-e-x.co.uk/files/ex0.adb|here]] or view it below.
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- --
-- DSA 2 Warm-up exercise (ex0) --
-- Program Title : NameSorter Version 1.0.0 --
-- Author : nex --
-- Group : L --
-- Matriculation Number : ***REMOVED FROM ONLINE VERSION*** --
-- Date Last Modified : 20th October 2003 --
-- --
-- Description : This program takes in an integer followed by a list --
-- of names, equal in number to the value of the --
-- integer. The names are then sorted in ascending --
-- alphabetical order and displayed to standard output. --
-- --
-- Assumptions : Number of names < 100, --
-- Name length < 21, --
-- All User input is valid and correct. --
-- --
----------------------------------------------------------------------------
----------------------------------------------------------------------------
with Ada.Text_Io; use Ada.Text_Io;
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
procedure Ex0 is
-- Constants
String_Length : constant Integer := 20;
Array_Length : constant Integer := 99;
-- Tester is used to find the length of names
Tester : constant Character := ' ';
-- Types
subtype Nametype is String (1..String_Length);
type Person_Type is record
First_Name : Nametype;
Last_Name : Nametype;
-- The length variable is required when assigning the value of Last_Name.
Length : Integer;
end record;
type Full_Names is array (1..(Array_Length + 1)) of Person_Type;
-- Variables
Name_List_Length : Integer;
Names : Full_Names;
----------------------------------------------------------------------------
-- Clear_Data
-- is used to make sure that there is no data stored in the
-- Names arrays before the program puts its own data in them.
procedure Clear_Data (Names : in out Full_Names;
Array_Length : in Integer;
String_Length : in Integer ) is
begin
-- Clear variables of inherited data
for H in 1..(Array_Length + 1) loop
for I in 1..String_Length loop
Names(H).First_Name(I) := ' ';
Names(H).Last_Name(I) := ' ';
end loop;
Names(H).Length := 0;
end loop;
end Clear_Data;
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Read_Names
-- is used to read in the names that are to be sorted and then
-- assign the First_Name and Last_Name values to the correct variables.
procedure Read_Names (Name_List_Length : out Integer;
Names : in out Full_Names;
Tester : in Character ) is
-- Counter is a local variable required for loops
Counter : Integer;
begin
-- Get number of names
Get (Item => Name_List_Length);
Skip_Line;
--Read in names
for I in 1..Name_List_Length loop
Get_Line (Item => Names(I).First_Name,
Last => Names(I).Length );
-- Find end of First_Name and start of Last_Name
Counter := 1;
while Names(I).First_Name(Counter) /= Tester loop
Counter := Counter + 1;
end loop;
while Names(I).First_Name(Counter) = Tester loop
Counter := Counter + 1;
end loop;
-- Assign values to last names
for H in Counter..Names(I).Length loop
Names(I).Last_Name(H - (Counter - 1)) := Names(I).First_Name(H);
Names(I).First_Name(H) := ' ';
end loop;
end loop;
end Read_Names;
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Sort_Names
-- is used to re-arrange the records in the Full_Names array
-- such that the order in which they appear in the array is ascending
-- alphabetical order.
procedure Sort_Names (Name_List_Length : in Integer;
Names : in out Full_Names;
Array_Length : in Integer ) is
begin
for I in 1..Name_List_Length loop
for H in 1..Name_List_Length loop
if Names(H).Last_Name > Names(I).Last_Name then
-- Names(Array_Length + 1) should always be unused by input
-- as Number of names is defined as equal to Array_Length,
-- thus it can be used as a temporary store.
Names(Array_Length + 1) := Names(I);
Names(I) := Names(H);
Names(H) := Names(Array_Length + 1);
end if;
end loop;
end loop;
end Sort_Names;
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-- Display_List
-- displays the list of names in the Full_Names array.
-- It also takes out unnecessary 'blanks' so that the output is neater.
procedure Display_List (Name_List_Length : in Integer;
Names : in Full_Names;
Tester : in Character ) is
-- Counter is a local variable required for loops
Counter : Integer;
begin
-- Output to the screen
for I in 1..Name_List_Length loop
-- Find end of First_Name to make output neater
Counter := 1;
while Names(I).First_Name(Counter) /= Tester loop
Counter := Counter + 1;
end loop;
for H in 1..Counter loop
Put (Item => Names(I).First_Name(H));
end loop;
-- Last_Name already neat, so just output
Put (Item => Names(I).Last_Name);
New_Line;
end loop;
end Display_List;
----------------------------------------------------------------------------
-- Start of main program execution --
begin
-- Clear arrays of any un-erased data
Clear_Data (Names => Names,
Array_Length => Array_Length,
String_Length => String_Length);
-- Read the list of names from standard input and store in the 'Names' variable
Read_Names (Name_List_Length => Name_List_Length,
Names => Names,
Tester => Tester );
-- Sort the names in the 'Names' variable in ascending alphabetical order
Sort_Names (Name_List_Length => Name_List_Length,
Names => Names,
Array_Length => Array_Length );
-- Display to standard output the contents of the 'Names' variable
Display_List (Name_List_Length => Name_List_Length,
Names => Names,
Tester => Tester );
end Ex0;
===== Example of Use =====
//Input (each end of line is an 'enter')//:\\
''
3\\
Alex Stevens\\
Fergus Urquhart\\
Lexie Hart\\
''
//Output//:\\
''
Lexie Hart\\
Alex Stevens\\
Fergus Urquhart\\
''
===== Assumptions =====
Number of names < 100,\\
Name length < 21,\\
All User input is valid and correct.\\
And for those of you using windows who want to see it run and just don't know what to do, here is a windows executable: [[http://www.n-e-x.co.uk/files/ex0.exe|ex0.exe]]
--- //[[nex@n-e-x.co.uk|Nexami Engeo]] 2007/07/05 17:12//
~~DISCUSSION~~