Chapter 26 Answers
Chapter 26 Answers
MAXCARS = 10
class CarRecord:
def __init__(self):
self.VehicleID = "dummy"
self.Registration = ""
self.DateOfRegistration = date(1990,1,1)
self.EngineSize = 0
self.PurchasePrice = 0.00
def SaveData(Car):
# file channel for car records
CarFile = open('CarFile.DAT','wb') # open file for
binary write
for i in range(MAXCARS + 1): # loop for each array
element
# write a whole record to the binary file
pickle.dump(Car[i], CarFile)
CarFile.close() # close file
def LoadData():
CarFile = open('CarFile.DAT','rb') # open file for
binary read
Car = [] # start with empty list
EoF = False
while not EoF: # check for end of file
try :
Car.append(pickle.load(CarFile)) # append
record from file to end of list
except:
EoF = True
CarFile.close()
return Car
def OutputRecords(Car):
for i in range(1, MAXCARS + 1): # loop for each
def AddRecords(Car):
i = int(input('Record Number? '))
while i != 0:
Car[i].VehicleID = input('Vehicle ID: ')
Car[i].Registration = input('Registration: ')
Car[i].DateOfregistration = (input('Registration
Date: '));
Car[i].EngineSize = int(input('Engine size: '))
Car[i].PurchasePrice = float(input('Purchase
price: '))
i = int(input('next Record Number? '))
return Car
def main():
Car =[CarRecord() for i in range(MAXCARS + 1)] #
only run this 1st time
SaveData(Car) # only run this first time
Car = LoadData() # from existing file
OutputRecords(Car)
Car = AddRecords(Car)
OutputRecords(Car)
SaveData(Car)
main()
VB.NET ' sequential file handling Task 26.01
Option Explicit On
Imports System.IO
Module Module1
Structure CarRecord
Dim VehicleID As String
Dim Registration As String
Dim DateOfRegistration As Date
Dim EngineSize As Integer
Dim PurchasePrice As Decimal
End Structure
Const MAXCARS = 10
Dim CarFileWriter As BinaryWriter
Dim CarFileReader As BinaryReader
Dim CarFile As FileStream
Dim Car(MAXCARS) As CarRecord ' declare an array of
CarRecord type
Sub SaveData()
'link file to filename
CarFile = New FileStream("CarFile.DAT",
FileMode.Create)
' create a new file and open it for writing
CarFileWriter = New BinaryWriter(CarFile)
For i = 0 To MAXCARS ' loop for each array element
Sub LoadData()
Dim i As Integer
CarFile = New FileStream("CarFile.DAT",
FileMode.Open) 'link to filename
' create a new file and open it for reading
CarFileReader = New BinaryReader(CarFile)
i = 0
' loop until end of binary file reached
Do While CarFile.Position < CarFile.Length
' read fields from the binary file
Car(i).VehicleID = CarFileReader.ReadString()
Car(i).Registration = CarFileReader.ReadString()
Car(i).DateOfRegistration =
CarFileReader.ReadString()
Car(i).EngineSize = CarFileReader.ReadInt32()
Car(i).PurchasePrice =
CarFileReader.ReadDecimal()
i = i + 1
Loop
CarFileReader.Close() 'close file channel
CarFile.Close()
End Sub
Sub OutputRecords()
For i = 1 To MAXCARS
Console.WriteLine("Vehicle ID: " &
Car(i).VehicleID)
Console.WriteLine("Registration: " &
Car(i).Registration)
Console.WriteLine("Registration Date: " &
Car(i).DateOfRegistration)
Console.WriteLine("Engine Size: " &
Car(i).EngineSize)
Console.WriteLine("Purchase Price: " &
Car(i).PurchasePrice)
Next
End Sub
Sub InitialiseArray()
For i = 0 To MAXCARS
Car(i) = New CarRecord
Car(i).VehicleID = "dummy"
Car(i).Registration = "X"
Sub AddRecords()
Dim i As Integer
Console.Write("Record number? ")
i = Console.ReadLine()
Do While i <> 0
Console.Write("Vehicle ID: ")
Car(i).VehicleID = Console.ReadLine()
Console.Write("Registration: ")
Car(i).Registration = Console.ReadLine()
Console.Write("Registration Date: ")
Car(i).DateOfRegistration = Console.ReadLine()
Console.Write("Engine Size: ")
Car(i).EngineSize = Console.ReadLine()
Console.Write("Purchase Price: ")
Car(i).PurchasePrice = Console.ReadLine()
Console.Write("next Record Number: ") : i =
Console.ReadLine()
Loop
End Sub
Sub Main()
InitialiseArray()
LoadData()
OutputRecords()
AddRecords()
OutputRecords()
SaveData()
Console.ReadLine()
End Sub
End Module
oos.writeObject(Car[index].dateOfRegistration);
oos.writeObject(Car[index].purchasePrice);
}
oos.close();
}
catch (EOFException x)
{
System.out.println("End of file reached");
}
catch (IOException x)
{
System.out.println("This is the error: " + x);
}
}
Task 26.02
Python # random access file handling Task 26.02
# does not take into account collisions
# need to validate registration so it starts with an
uppercase letter
RECORDSIZE = 70 # 20 + 10 + 10 + 4 + 8
MAXCARS = 100
class CarRecord:
def __init__(self):
VehicleID = "dummy"
VehicleID = VehicleID.ljust(20)
self.VehicleID = VehicleID.encode('utf-8')
Registration = "X"
Registration = Registration.ljust(10)
self.Registration = Registration.encode('utf-8')
DateOfRegistration = "01/01/2010"
DateOfRegistration =
DateOfRegistration.ljust(10)
self.DateOfRegistration =
DateOfRegistration.encode('utf-8')
self.EngineSize = 0
def InitialiseFile():
CarFile = open('CarFileRandom.DAT','wb') # file
for car records
for i in range(MAXCARS): # loop for each dummy
record
NewCar = CarRecord()
Address = i * RECORDSIZE + 1
CarFile.seek(Address)
# write a whole record to the binary file
pickle.dump(NewCar, CarFile)
CarFile.close() # close file
def InputNewRecordData():
ThisCar = CarRecord()
VehicleID = input('Vehicle ID: ')
VehicleID = VehicleID.ljust(20)
ThisCar.VehicleID = VehicleID.encode('utf-8')
Registration = input('Registration: ')
Registration = Registration.ljust(10)
ThisCar.Registration = Registration.encode('utf-8')
DateOfRegistration = (input('Registration Date: '));
DateOfRegistration = DateOfRegistration.ljust(10)
ThisCar.DateOfRegistration =
DateOfRegistration.encode('utf-8')
ThisCar.EngineSize = int(input('Engine size: '))
ThisCar.PurchasePrice = float(input('Purchase
price: '))
return ThisCar
def Hash(reg):
result = (ord(reg[0]) - 65) * RECORDSIZE + 1
print('Hashed to ',result)
return result
def OpenFileForUpdate():
CarFile = open('CarFileRandom.DAT','rb+') # open
file for update
return CarFile
def OutputData(ThisCar):
print(ThisCar.VehicleID.decode('utf-8')) # write
one field
print(ThisCar.Registration.decode('utf-8'))
print(ThisCar.DateOfRegistration.decode('utf-8'))
print(ThisCar.EngineSize)
print(ThisCar.PurchasePrice)
def main():
InitialiseFile() # only run this procedure the
first time
ThisCar = CarRecord()
CarFile = OpenFileForUpdate()
# add records
Answer = input('add a record? (Y/N) ')
while Answer == 'Y':
ThisCar = CarRecord()
ThisCar = InputNewRecordData()
SaveToFile(ThisCar, CarFile)
Answer = input('add a record? (Y/N) ')
# find records
Answer = input('find a record? (Y/N) ')
while Answer == 'Y':
Reg = input('Give vehicle registration: ')
ThisCar = FindRecord(Reg, CarFile)
Answer = input('find a record? (Y/N) ')
CarFile.close()
main()
VB.NET ' random access file handling Task 26.02
Option Explicit On
Imports System.IO
Module Module1
Structure CarRecord
<VBFixedString(20)> Dim VehicleID As String
<VBFixedString(10)> Dim Registration As String
Dim DateOfRegistration As Date
Dim EngineSize As Integer
Dim PurchasePrice As Decimal
End Structure
Sub InitialiseFile()
' set up a dummy record and store in each record
position in file
ThisCar.VehicleID = "dummy"
ThisCar.Registration = "X"
ThisCar.DateOfRegistration = #1/1/1900#
ThisCar.EngineSize = 0
ThisCar.PurchasePrice = 0.0
For i = 1 To MAXCARS ' loop for each array
element
FilePut(1, ThisCar, i)
Next
End Sub
Sub InputNewRecordData()
Console.Write("Vehicle ID: ")
ThisCar.VehicleID = Console.ReadLine()
Console.Write("Registration: ")
ThisCar.Registration = Console.ReadLine()
Console.Write("Registration Date: ")
ThisCar.DateOfRegistration = Console.ReadLine()
Console.Write("Engine Size: ")
ThisCar.EngineSize = Console.ReadLine()
Console.Write("Purchase Price: ")
ThisCar.PurchasePrice = Console.ReadLine()
End Sub
Sub SaveToFile()
Dim Position As Integer
Position = Hash(ThisCar.Registration)
FilePut(1, ThisCar, Position)
End Sub
Sub OpenFileForUpdate()
'link the file to the filename
FileOpen(1, "CarFileRandom.DAT", OpenMode.Random,
, , RecordSize)
End Sub
Sub FindRecord(reg)
Dim Position As Integer
Position = Hash(reg)
FileGet(1, ThisCar, Position)
If reg <> ThisCar.Registration.TrimEnd Then
Console.WriteLine("Record not found")
Sub OutputData()
Console.WriteLine("Vehicle ID: " &
ThisCar.VehicleID)
Console.WriteLine("Registration: " &
ThisCar.Registration)
Console.WriteLine("Registration Date: " &
ThisCar.DateOfRegistration)
Console.WriteLine("Engine Size: " &
ThisCar.EngineSize)
Console.WriteLine("Purchase Price: " &
ThisCar.PurchasePrice)
End Sub
Sub Main()
Dim Answer, Reg As String
OpenFileForUpdate()
'InitialiseFile() ' only use this first time
round
'add records
Console.Write("add a record? (Y/N) ")
Answer = Console.ReadLine()
Do While Answer = "Y"
InputNewRecordData()
SaveToFile()
Console.Write("add a record: (Y/N) ")
Answer = Console.ReadLine()
Loop
' find records
Console.Write("find a record? (Y/N) ")
Answer = Console.ReadLine()
Do While Answer = "Y"
Console.Write("Give vehicle registration: ")
Reg = Console.ReadLine()
FindRecord(Reg)
Console.Write("find a record: (Y/N) ")
Answer = Console.ReadLine()
Loop
FileClose(1)
Console.ReadLine()
End Sub
End Module
public CarRecord()
{
vehicleID = "dummy";
registration = "X";
dateOfRegistration = "01/01/1990";
engineSize = 0;
purchasePrice = 0.00;
}
}
writer.writeUTF(thisCar.dateOfRegistration);
writer.writeInt(thisCar.engineSize);
writer.writeDouble(thisCar.purchasePrice);
}
writer.close();
}
catch (IOException x)
{
}
}
}
}
}
}
}
}
}
Task 26.03
Python EoF = False
while not EoF: # check for end of file
try :
Car.append(pickle.load(CarFile))
except:
EoF = True
Exam-style Questions
1 a i Python class CustomerRecord :
def __init__(self) :
self.CustomerID = 0
self.CustomerName = ''
self.TelNumber = ''
self.TotalOrders = 0.00
public CustomerRecord()
{
customerID = 0;
customerName = "";
telNumber = "";
totalOrders = 0.00;
}
}
Marking guidance:
1 mark for correct record heading
1 mark for each correct field with suitable data type/initial value
1 mark for correct end to record declaration
Marking guidance:
1 mark for correct declaration of array (name and size)
1 mark for correct data type
b i Python def Hash(CustomerID) :
Address = CustomerID % 1000
return(Address)
Marking guidance:
1 mark for correct function header including parameter
1 mark for correct calculation of Address
1 mark for returning Address
Marking guidance:
1 mark for correct procedure header including parameter
1 mark for correct call of Hash function with correct parameter
1 mark for a WHILE loop
1 mark for correct Boolean expression
1 mark for within WHILE loop checking if wrap-round required
1 mark for adjusting address when wrap-round required
1 mark for adding customer record in correct location in array after the loop
Marking guidance:
1 mark for correct function header including parameter
1 mark for correct call of Hash function with correct parameter
1 mark for a WHILE loop
1 mark for correct Boolean expression
1 mark for within WHILE loop checking if wrap-round required
1 mark for adjusting address when wrap-round required
1 mark for returning record address
c Python import pickle
def SaveData(CustomerData) :
CustomerFile = open('CustomerData.DAT','wb')
for i in range(1000) :
pickle.dump(CustomerData[i], CustomerFile)
CustomerFile.close()
CustomerFileWriter.Write(CustomerData(i).CustomerID)
CustomerFileWriter.Write(CustomerData(i).CustomerName)
CustomerFileWriter.Write(CustomerData(i).TelNumber)
CustomerFileWriter.Write(CustomerData(i).TotalOrders)
Next
CustomerFileWriter.Close() 'close file channel
CustomerFile.Close()
End Sub
}
}
Marking guidance:
1 mark for correct procedure header
1 mark for creating a binary file
1 mark for opening file for writing
1 mark for loop to work with each element
1 mark for writing record (or each field of the record) to the file within the loop
1 mark for closing the file
d Marking guidance:
1 mark per point:
Set up fixed-length dummy records
save dummy records to a random file
write a hashing function that gets to the beginning of the required record
AddRecord needs to update the correct record in the random file
FindRecord needs to read the random file
Don’t need the SaveData procedure at the end of program execution.
Marking guidance:
1 mark for output asking user to enter file name and input statement assigning file name
1 mark for adding TRY keyword in correct place
1 mark for opening file
1 mark for CATCH/EXCEPT in correct place
1 mark for suitable error message within CATCH/EXCEPT section of the code