Program S6C30_ICTSBA; Type GuestRecordType = Record GName : String[30]; GradYear : integer; {add setting} Sex : char; age : integer; ReservedSeats : 0..15; IDNum : String; FamilyMember : integer; Pair : string; TableNum : integer; end; var GDataFile : text; Guest : array[1..480] of GuestRecordType; DPGuest:array[1..480] of GuestRecordType;{Display} count,i,e : integer; choice : 1..5; Table,ExistGuest : integer; Procedure RecallData(var count : integer); begin assign(GDataFile, 'GuestData.txt'); reset(GDataFile); while not eof(GDataFile) do begin count:= count+1; {Miss} with Guest[count] do begin readln(GDataFile, GName); readln(GDataFile, GradYear); readln(GDataFile, Sex); readln(GDataFile, age); readln(GDataFile, IDNum); readln(GDataFile, FamilyMember); readln(GDataFile, ReservedSeats); readln(GDataFile, Pair); readln(GDataFile, TableNum); end; end; close(GDataFile); end; Procedure AddRecord(var count : integer); var i,e : integer; Wrong : boolean; IDNum2:String; begin if count<480 then begin{Not fulled yet} Wrong := false; writeln('---Enter your information---'); count := count + 1; Repeat write('Enter your Name:'); readln(Guest[count].GName); For i:=1 to count-1 do if (Guest[i].GName = Guest[count].GName)or((length(Guest[count].GName) > 50)and(length(Guest[count].GName) <= 0)) then Wrong := true else Wrong := false; If Wrong = true then writeln('Wrong Input or Repeated'); Until Wrong = false; With Guest[count] do begin e:=0; Repeat If e>0 then writeln('Wrong Input'); write('Enter your Graduation year:'); readln(GradYear); e:=e+1; Until (GradYear >=1930) and (GradYear <=2017); end; with Guest[count] do begin e:=0; Repeat If e>0 then writeln('Wrong Input'); write('Enter your sex (M/F):'); readln(Sex); e:=e+1; Until (Sex='M') or (Sex='F'); end; with Guest[count] do begin e:=0; Repeat If e>0 then writeln('Wrong Input'); write('Enter your age:'); readln(age); e:=e+1; Until (age>=18) and (age<=120); end; Repeat e:=0; write('Enter your ID number(e.g.X123456(7)):'); readln(Guest[count].IDNum); write('Enter your ID number again(e.g.X123456(7)):'); readln(IDNum2); for i:=1 to count-1 do if (IDNum2<>Guest[count].IDNum) or (Guest[count].IDNum=Guest[i].IDNum) then e:=e+1; If e>0 then writeln('Wrong Input or IDNum used'); Until e=0; with Guest[count] do begin e:=0; Repeat If e>0 then writeln('Wrong Input'); write('Enter how many family member(s) will attend:'); readln(FamilyMember); e:=e+1; Until (FamilyMember >= 0) and (FamilyMember <= 15); end; with Guest[count] do begin e:=0; Repeat If e>0 then writeln('Wrong Input'); write('Enter you reserve 1~15 seat(s):'); readln(ReservedSeats); e:= e+1; Until {(ReservedSeats>0) and (ReservedSeats<16)and} (ReservedSeats>=FamilyMember); end; with Guest[count] do begin Pair:= 'NotPaired'; TableNum:=0; end; Writeln('New Record Added'); end else writeln('Seat fulled or Time out'); end; Procedure DelRecord(count : integer); var IDNumb : String; i,j : integer; found : boolean; begin if count<480 then begin found := false; write('Enter your ID number(e.g.X123456(7)):'); readln(IDNumb); For i:= 1 to count do begin if Guest[i].IDNum = IDNumb then begin Guest[i].GName := 'xxx'; Guest[i].IDNum := 'xxx'; found := true; for j:=1 to count do if (Guest[i].TableNum = Guest[j].TableNum) then begin Guest[i].TableNum:=0; Guest[i].Pair := 'NotPaired'; Guest[j].TableNum:=0; Guest[j].Pair := 'NotPaired'; end; end end; if found = false then writeln('Wrong Input'); end else writeln('Seat fulled or Time out'); end; Procedure DisplayRecord(var count : integer); var IDnumb : String; i, alignN: integer; found : Boolean; begin found := false; write('Enter your ID number(e.g.X123456(7)):'); readln(IDnumb); For i := 1 to count do begin if Guest[i].IDNum = IDnumb then begin found := true; alignN := length(Guest[i].GName)-4; If found = true then begin writeln; writeln('Name',' ':alignN, 'GradYear',' ':2, 'Sex',' ':2, 'ReservedSeats',' ':2,'TableNumber'); with guest[i] do if TableNum = 0 then writeln(GName, ' ':2, GradYear,' ':6, Sex,' ':8, ReservedSeats,' ':8,'Not Matched yet') else writeln(GName, ' ':2, GradYear,' ':6, Sex,' ':8, ReservedSeats,' ':13,TableNum); end end end; if found = false then writeln('Wrong Input'); end; Procedure SaveRecord(count : integer;var ExistGuest:integer); var i : integer; begin assign(GDataFile, 'GuestData.txt'); rewrite(GDataFile); for i := 1 to count do begin with Guest[i] do if gname <> 'xxx' then begin ExistGuest := ExistGuest+1; writeln(GDataFile, GName); writeln(GDataFile, GradYear); writeln(GDataFile, Sex); writeln(GDataFile, age); writeln(GDataFile, IDNum); writeln(GDataFile, FamilyMember); writeln(GDataFile, ReservedSeats); writeln(GDataFile, Pair); writeln(GDataFile,TableNum); end; end; close(GDataFile); end; Procedure PairBySex(count:integer; var Table :integer); {FamilyPair Procedure Run First} var i,j,s,cal,a : integer; begin a := 70; for s:=1 to 2 do begin For i:=1 to count do Begin cal :=0; if (Guest[i].Sex = chr(a)) and (Guest[i].Pair = 'NotPaired') then if Guest[i].ReservedSeats <> 15 then begin Guest[i].Pair := 'Paired'; Guest[i].TableNum := Table; cal := 15-Guest[i].ReservedSeats; Repeat For j:=1 to count do if (Guest[j].Pair = 'NotPaired') and (Guest[j].FamilyMember >=1) and (Guest[j].ReservedSeats <= cal) then Begin Guest[j].Pair := 'Paired'; Guest[j].TableNum := Table; cal:=cal-Guest[j].ReservedSeats; end; Until ((cal>=15) and (cal<=15))or (j=count); end else begin Guest[i].Pair := 'Paired'; Guest[i].TableNum := Table; Table := Table +1; end; end; a:=a+7; end; end; Procedure PairByFamily(count : integer;var Table :integer); {Mistake : wrong to use With ..do} var cal,i,j:integer; begin For i:=1 to count do Begin cal :=0; if (Guest[i].Pair = 'NotPaired') and (Guest[i].FamilyMember >=1) then if Guest[i].ReservedSeats <> 15 then begin cal := 15-Guest[i].ReservedSeats; Guest[i].Pair := 'Paired'; Guest[i].TableNum := Table; Repeat For j:=1 to count do if (Guest[j].Pair = 'NotPaired') and (Guest[j].FamilyMember >=1) and (Guest[j].ReservedSeats <= cal) then Begin Guest[j].Pair := 'Paired'; Guest[j].TableNum := Table; cal:=cal-Guest[j].ReservedSeats; end; Until ((cal>=15) and (cal<=15))or (j=count); Table := Table+1; end else begin Guest[i].Pair := 'Paired'; Guest[i].TableNum := Table; Table := Table+1; end; end; end; Procedure Sorting(count,Table:integer);{bubble sort} var j,a:integer; begin For a:=1 to count-1 do for j:= 1 to Count-a do if Guest[j].GName > Guest[j+1].GName then begin DPGuest[1].GName := Guest[j].GName; DPGuest[1].GradYear := Guest[j].GradYear; DPGuest[1].Sex := Guest[j].Sex; DPGuest[1].age := Guest[j].age; DPGuest[1].IDNum := Guest[j].IDNum; DPGuest[1].FamilyMember := Guest[j].FamilyMember; DPGuest[1].ReservedSeats := Guest[j].ReservedSeats; DPGuest[1].Pair := Guest[j].Pair; DPGuest[1].TableNum := Guest[j].TableNum; Guest[j].GName := Guest[j+1].GName; Guest[j].GradYear := Guest[j+1].GradYear; Guest[j].Sex := Guest[j+1].Sex; Guest[j].age := Guest[j+1].age; Guest[j].IDNum := Guest[j+1].IDNum; Guest[j].FamilyMember := Guest[j+1].FamilyMember; Guest[j].ReservedSeats := Guest[j+1].ReservedSeats; Guest[j].Pair := Guest[j+1].Pair; Guest[j].TableNum := Guest[j+1].TableNum; Guest[j+1].GName := DPGuest[1].GName; Guest[j+1].GradYear := DPGuest[1].GradYear; Guest[j+1].Sex := DPGuest[1].Sex; Guest[j+1].age := DPGuest[1].age; Guest[j+1].IDNum := DPGuest[1].IDNum; Guest[j+1].FamilyMember := DPGuest[1].FamilyMember; Guest[j+1].ReservedSeats := DPGuest[1].ReservedSeats; Guest[j+1].Pair := DPGuest[1].Pair; Guest[j+1].TableNum := DPGuest[1].TableNum; end; end; Procedure AdminFunctions; Var password:string; ans,ans2:char; alignN:integer; begin write('Enter the password:'); readln(password); if password = 'raymond123' then begin Repeat write('Do matching?(Y/N) : '); readln(ans); Until (ans = 'Y') or (ans='N'); if ans = 'Y' then begin PairByFamily(count,Table); PairBySex(count,Table); Sorting(count, Table); Repeat write('Display result?(Y/N) : '); readln(ans2); Until (ans = 'Y') or (ans='N'); If ans2 = 'Y' then for i :=1 to count do begin alignN := 30-length(Guest[i].GName); writeln(Guest[i].GName,' ':alignN,'Table No.',Guest[i].TableNum) ; end; end; end else writeln('Wrong Input!'); end; Begin {Main Program} count := 0;{added} ExistGuest :=0; Table:=1; RecallData(count); Repeat writeln('=============================='); writeln('Guest Record:'); writeln('=============================='); writeln('1. Add New Record'); writeln('2. Delete Record'); writeln('3. Display Record'); writeln('4. AdminFunctions'); writeln('5. Quit'); E:=0; repeat if e>0 then writeln('Wrong Input'); write('Enter your choice(1-5):'); readln(choice); e:=e+1; until choice in [1..5]; case choice of 1 : AddRecord(count); 2 : DelRecord(count); 3 : DisplayRecord(count); 4 : AdminFunctions; end; Until choice = 5; SaveRecord(count,ExistGuest); Writeln(ExistGuest,' Guest(s)'); end.
We use cookies to provide and improve our services. By using our site, you consent to our Cookies Policy. Accept Learn more