Records and sorting
This is a simple example of using arrays to store values, sort, check for
duplicates and display result in formatted form.
------------------------------------------------------
with Ada.Text_Io;
with Ada.Integer_Text_Io;
use Ada.Text_Io;
use Ada.Integer_Text_Io;
procedure Studentlist is
-------------------------Samir---------------------------------------------
subtype Nametype is String(1..30);
subtype Idtype is Natural range 0..99999;
subtype Extensiontype is Natural range 0..9999;
---------------------------------------------------------------------------
type Studentrecord is
record
Name : Nametype := (others => ' ');
Id : Idtype;
Extension : Extensiontype;
end record;
---------------------------------------------------------------------------
subtype Studentindex is Integer range 1..100;
type Studentarraytype is array (Studentindex) of Studentrecord;
---------------------------------------------------------------------------
Studentlist : Studentarraytype; -- our array of students
Currentindex : Natural := 0;
-- the index to the current array item
Currentstudent : Studentrecord; -- the current student
Countrecords : Integer := 0;
Length : Integer := 0;
-- Specification of input procedure. You are to write the body.
procedure Getstudent (Item : in out Studentrecord) is
begin -- GetStudent
Item.Name := (Others => ' ');
Ada.Text_Io.Put("GetStudent() Please enter Student ID: ");
Get(Item.Id);
Skip_Line;
Put("Please enter student Name: ");
Get_Line(Item.Name,Length);
Put("Please enter Extension: ");
Get(Item.Extension);
Skip_Line;
New_Line;
end Getstudent;
-------------------------------------------------------------
-- Procedure for swapping
procedure Swap (X,Y : in out StudentRecord) is
Temp : StudentRecord;
begin -- Swap
Temp := X;
X := Y;
Y := Temp;
end Swap;
--------------------------------------------------------------------------
-- Procedure for sorting the students by name
procedure Selectionsort (Studentarray : in out Studentarraytype;
Arraysize : in Integer) is
Indexofmin : Integer;
begin
for Positiontofill in 1 .. Arraysize-1 loop
Indexofmin := Positiontofill;
for Itemtocompare in Positiontofill+1 .. Arraysize loop
if Studentarray(Itemtocompare).Name <
Studentarray(Indexofmin).
Name then
Indexofmin := Itemtocompare;
end if;
end loop;
if Indexofmin /= Positiontofill then
Swap(Studentarray(Positiontofill),Studentarray(
Indexofmin));
end if;
end loop;
end Selectionsort;
---------------------------------------------------------------------------
CurrentI : Integer := 0;
begin -- StudentList
Put_Line(Item => "Welcome to the Student Information Program.");
loop
-- Get the next student
GetStudent(CurrentStudent);
-- Sentiniel that tells the loop to exit
-- when the ID number is zero
exit when Currentstudent.Id = 0;
-- LocalLoopCounter
-- Loop that checks the current id with all the IDs
-- in the array to find duplicates
CurrentI := 0;
for I in 1..CurrentIndex loop
If StudentList(I).ID = CurrentStudent.ID then
CurrentI := I;
end if;
end loop;
If CurrentI = 0 then
CurrentIndex := CurrentIndex + 1;
StudentList(CurrentIndex) := CurrentStudent;
else
StudentList(CurrentI) := CurrentStudent;
end if;
end loop;
---------------------------------------------------------------------------
-- Output the header for the nicely formatted output.
Put("NAME ID EXTENSION");
New_Line;
Put("---------------------------------------------------------");
New_Line;
---------------------------------------------------------------------------
Selectionsort(Studentarray => Studentlist, Arraysize=>
Currentindex);
-- Loop for outputting all the student records stored in the array
while CurrentIndex /= CountRecords loop
Countrecords := Countrecords + 1;
Put(Studentlist(Countrecords).Name);
Put(Studentlist(Countrecords).Id);
Put(Studentlist(Countrecords).Extension);
New_Line;
end loop;
end Studentlist;
Contributed by: Samir
Contributed on: December 7, 2001
License: Public Domain
Back