You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
4.9 KiB
Plaintext

program login;
uses
md5, crt;
type
CONNECTION = record
hotel : string;
distance : integer;
end;
HOTEL = record
name : string;
conn : CONNECTION;
end;
USER = record
un: string;
pw: string;
l: boolean;
end;
const
users: array [0..4] of USER = (
(un: 'user1'; pw: '16d7a4fca7442dda3ad93c9a726597e4'; l: false),
(un: 'user2'; pw: 'ccd2fc33d2d423d7209035dbfff82b29'; l: false),
(un: 'user3'; pw: '57c2877c1d84c4b49f3289657deca65c'; l: false),
(un: 'user4'; pw: '4101bef8794fed986e95dfb54850c68b'; l: false),
(un: 'root'; pw: '63a9f0ea7bb98050796b649e85481845'; l: false)
);
hotels: array [0..4] of HOTEL = (
(name: 'Hotel 1'; conn: (hotel: 'Hotel 2'; distance: 11)),
(name: 'Hotel 2'; conn: (hotel: 'Hotel 3'; distance: 5)),
(name: 'Hotel 3'; conn: (hotel: 'Hotel 4'; distance: 11)),
(name: 'Hotel 4'; conn: (hotel: 'Hotel 5'; distance: 5)),
(name: 'Hotel 5'; conn: (hotel: ''; distance: 0))
);
var
readinput: string;
j, hnum1, hnum2: integer;
correct: boolean;
usersuccess: boolean = false;
time: real;
function distance_sum(hnum1, hnum2 :integer) : integer;
{ Calculate the total distance sum. }
var
distance_total : integer = 0;
i : integer;
begin
if (hnum1 > hnum2) then
for i := (hnum1-2) downto (hnum2-1) do
distance_total := distance_total + hotels[i].conn.distance
else
for i := (hnum1-1) to (hnum2-2) do
distance_total := distance_total + hotels[i].conn.distance;
distance_sum := distance_total;
end;
procedure calc_time(disttot : integer);
{ Calculate the time needed for the way and print it. }
var
velocity : integer;
begin
Write('Velocity (km/h): ');
ReadLn(velocity);
time := (disttot / velocity);
WriteLn('Estimated Time: ', time: 10: 2, ' hours');
end;
procedure printway(hnum1, hnum2 : integer);
{ Print the whole way to the console. }
var
i : integer;
begin
Writeln('Tour:');
if hnum1 > hnum2 then
for i := hnum1 downto hnum2 do
begin
if (i <> hnum1) then
Write(' -> ');
Write(hotels[i-1].name)
end
else
for i := hnum1 to hnum2 do
begin
if (i <> hnum1) then
Write(' -> ');
Write(hotels[i-1].name)
end;
Writeln;
end;
procedure calcway;
{ Calculate the sum of all distances and call functions
that use this value. }
var
i, distance_total : integer;
begin
distance_total := 0;
for i := 0 to 4 do
begin
distance_total += hotels[i].conn.distance
end;
Writeln('Total tour length: ', distance_total, ' km');
Write('First Hotel Number: ');
ReadLn(hnum1);
Writeln;
Write('Second Hotel Number: ');
ReadLn(hnum2);
printway(hnum1, hnum2);
If ((hnum1 <= 5) and (hnum2 <= 5)) then
begin
distance_total := distance_sum(hnum1, hnum2);
Writeln('Distance between hotels is ', distance_total, ' km');
calc_time(distance_total);
end;
end;
{ Calculates the total distance between hotels based on the hotel number input.
(Only numbers accepted!). After printing the total distance a velocity can be
input to calculate the estimated time. }
procedure hotelmain;
var
i : integer;
exit : boolean = false;
begin
while exit = false do
begin
calcway;
Write('Exit? (y/n)');
ReadLn(readinput);
if readinput = 'y' then
exit := true
else
exit := false;
end;
end;
procedure login;
var
i : integer;
begin
Write('User: ');
ReadLn(readinput);
usersuccess := false;
correct := false;
{ Iterate over all 5 user entries to find the one
that fits the input. set usersuccess to true if found
else it remains false and an user not found error
is printed to the console. }
for i := 0 to 4 do
if readinput = users[i].un then
begin
usersuccess := true;
if (users[i].l) then
begin
TextColor(Red);
Writeln('This user is locked.');
TextColor(White);
Break;
end;
{ 3 tries for password input. Return to the username
input after failure. correct is set to true if
the loggin was a success. }
for j := 0 to 2 do
begin
WriteLn('Password: ');
ReadLn(readinput);
if MD5Print(MD5String(readinput)) = users[i].pw then
begin
WriteLn('Login Successful!');
correct := true;
Break;
end
else
WriteLn('Wrong password! ', 2 - j, ' trys left.');
end;
{ @section userfunctions }
if correct = true then
hotelmain()
else
users[i].l := true;
end;
if usersuccess = false then
WriteLn('User not found');
end;
begin
TextColor(8);
Writeln('Tourplanner');
Writeln('Written by J.Riegel.');
TextColor(White);
{ endless loop/main loop of the program. Exit with CTRL-C }
while true do
login; { Login starts all the other functions }
end.