INFORMATION TECHNOLOGY
PAPER ONE (P1)
GRADE 12
AMENDED SENIOR CERTIFICATE EXAM
PAST PAPERS AND MEMOS 2016
GENERAL INFORMATION:
ANNEXURE A:
SECTION A:
QUESTION 1: MARKING GRID- GENERAL PROGRAMMING SKILLS
CENTRE NUMBER: | EXAMINATION NUMBER: | |||
QUESTION | DESCRIPTION | MAX. MARKS | LEARNER'SMARKS | |
If a learner has a problem reading from a combobox, penalise only once for the error. | ||||
1.1 | Button - [Question 1.1] | 3 | ||
1.2 | Button - [Question 1.2] | 7 | ||
1.3 | Button - [Question 1.3] | 7 | ||
1.4 | Button - [Question 1.4] | 9 | ||
1.5 | Button - [Question 1.5] | 10 | ||
1.6 | Button - [Question 1.6] | 14 | ||
TOTAL: | 50 |
ANNEXURE B:
SECTION B:
QUESTION 2: MARKING GRID - OBJECT-ORIENTED PROGRAMMING
CENTRE NUMBER: | EXAMINATION NUMBER: | |||
QUESTION | DESCRIPTION | MAX. MARKS | LEARNER'S MARKS | |
2.1.1 | Declare attributes ✔ with the correct data types (String/Integer ✔; Boolean/double✔) | 3 | ||
2.1.2 | (a) Remove comment symbols from accessor methods✔ | 4 | ||
2.1.3 | Constructor: | 3 | ||
2.1.4 | calcAmount method: | 4 | ||
2.1.5 | calcDiscount method: | 5 | ||
2.1.6 | toString METHOD: | 4 | ||
2.2.1 | Button – [Quest2.2.1]: | 25 | ||
2.2.2 | Button – [Quest2.2.2]: | 10 | ||
2.2.3 | Button – [Quest2.2.3]: | 2 | ||
TOTAL | 60 |
ANNEXURE C:
SECTION C:
QUESTION 3: MARKING GRID–PROBLEM SOLVING
CENTRE NUMBER: | EXAMINATION NUMBER: | ||||
SECTION | DESCRIPTION | MAX. MARKS | LEARNER'S MARKS | ||
User input validation | Validate the month: Check if user entered a month ✔ Convert to numeric value ✔ Check range✔✔ Validate user input for event to remove duplicates: Convert the string entered to uppercase/lowercase ✔ or use equalsIgnoreCase method (Java) | 8 | |||
Display of output | Heading contains event selected or All ✔ and month entered or All✔ | 9 | |||
Sorting of arrays | Declare temporary string variables for event and date ✔ | 8 | |||
Remove duplicates | Input event ✔, ignore/set the case of the characters✔ | 10 | |||
Program techniques | Modular design – at least two procedures/methods ✔✔ Descriptive variable names✔; Proper indentation ✔; Suitable comments ✔ | 5 | |||
TOTAL | 40 |
SUMMARY OF LEARNER’S MARKS:
SECTION A | SECTION B | SECTION C | ||
QUESTION 1 | QUESTION 2 | QUESTION 3 | GRAND TOTAL | |
MAX. MARKS | 50 | 60 | 40 | 150 |
LEARNER'S MARKS |
ANNEXURE D: SOLUTION FOR QUESTION 1: JAVA
//A possible solution to Question 1
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import java.text.DecimalFormat;
import javax.swing.JOptionPane;
public class Question1_Solution extends javax.swing.JFrame {
DecimalFormat df = new DecimalFormat("0.00");
String activityType = "Quiz";
int numParticipants = 50;
public Question1_Solution() {
initComponents();
this.setLocationRelativeTo(this);
txfEvent.setText(activityType);
}
=========================================================================
// Question 1.1
=========================================================================
private void btnQues1_1ActionPerformed(java.awt.event.ActionEvent evt) {
String category = (String)cmbCategory.getSelectedItem();
lblOutput.setText(activityType + ":" + category);
}
=========================================================================
// Question 1.2
=========================================================================
private void btnQues1_2ActionPerformed(java.awt.event.ActionEvent evt) {
numParticipants = Integer.parseInt(txfNumParticipants.getText());
int cost = 0;
if(numParticipants <= 20){
cost = numParticipants * 25;
}
else {
cost = (20 * 25) + ((numParticipants - 20) * 30);
}
txfIncome.setText("R" + df.format(cost));
}
=========================================================================
// Question 1.3
=========================================================================
private void btnQues1_3ActionPerformed(java.awt.event.ActionEvent evt) {
int base = Integer.parseInt(JOptionPane.showInputDialog("Enter the base"));
int exponent = Integer.parseInt(JOptionPane.showInputDialog("Enter the exponent"));
int power = (int)(Math.pow(base, exponent));
double squareRoot = Math.sqrt(power);
txfAns_1_3.setText("x = " + df.format(squareRoot));
}
=========================================================================
// Question 1.4
=========================================================================
private void btnQues1_4ActionPerformed(java.awt.event.ActionEvent evt) {
int numberOfPieces = numParticipants * 3;
double numberOfPizzas = numberOfPieces / 8.0;
txaOutput_1_4.setText("Exact value = " + String.format("%- 6.4f",numberOfPizzas));
txaOutput_1_4.append("\nNumber of pizzas to order = ");
if(numberOfPizzas == (int)numberOfPizzas){
txaOutput_1_4.append("" + (int)numberOfPizzas);
}
else
{
txaOutput_1_4.append("" + (((int)(numberOfPizzas)) + 1));
}
}
=========================================================================
// Question 1.5
=========================================================================
private void btnQues1_5ActionPerformed(java.awt.event.ActionEvent evt) {
//Question 1.5.1
// Code to determine the number of questions
txaOutput_1_5.setText("");
int numQuestions = 0;
if(rbtRound1.isSelected()){
numQuestions = 5;
}
else
{
if(rbtRound2.isSelected())
numQuestions = 8;
if(chbBonus.isSelected())
numQuestions += 2;
}
// Question 1.5.2
txaOutput_1_5.setText("");
txaOutput_1_5.append("Questions to answer\n");
String output = "";
for (int i = 1; i <= numQuestions; i++) {
for (int j = numQuestions; j >= i; j--) {
output = output + (j + " ");
}
output = output + "\n";
}
txaOutput_1_5.append(output + "\nQuiz completed");
}
=========================================================================
// Question 1.6
=========================================================================
private void btnQues1_6ActionPerformed(java.awt.event.ActionEvent evt) {
int numSeats = 30;
double ticketPrice = 50;
double totalIncome = 0;
txaOutput_1_6.append(String.format("%-10s%-10s%-16s%- 10s\n","Row","Seats","Ticket price","Income"));
for (int i = 1; i <=20 ; i++) {
double rowIncome = numSeats * ticketPrice;
totalIncome = totalIncome + rowIncome;
txaOutput_1_6.append(String.format("%-10s%-10sR%-15.2fR%- 10.2f\n",i,numSeats,ticketPrice,rowIncome));
numSeats = numSeats + 2;
ticketPrice = ticketPrice - 2;
}
txaOutput_1_6.append("\nTotal income is: R" + df.format(totalIncome));
}
}
ANNEXURE E: SOLUTION FOR QUESTION 2: JAVA
//A possible solution for the object class
OBJECT CLASS: DETAILS
package Question2Package;
=========================================================================
// Question 2.1.1
=========================================================================
public class Order
{
private String name;
private int numGroup;
private int numSingle;
private char paid;
=========================================================================
// Question 2.1.2
=========================================================================
// Question 2.1.2 (a)
public String getName()
{
return name;
}
public int getNumGroup()
{
return numGroup;
}
public int getNumSingle()
{
return numSingle;
}
// Question 2.1.2 (b)
public String getPaid()
{
if (paid == 'Y')
return "Yes";
else
return "No";
}
=========================================================================
// Question 2.1.3
=========================================================================
public Order(String Name, int numGroup, int numSingle, char paid)
{
this.name = Name;
this.numGroup = numGroup;
this.numSingle = numSingle;
this.paid = paid;
}
=========================================================================
// Question 2.1.4
=========================================================================
public double calcAmount()
{
double total = (numGroup * 15.70) + (numSingle * 12.50); return total;
}
=========================================================================
// Question 2.1.5
=========================================================================
public double calcDiscount()
{
double discount = 0;
if ((numGroup >= 4 || numSingle >= 4) &&
getPaid().equalsIgnoreCase("Yes")){
discount = calcAmount() * 5 / 100.00;
}
return discount;
}
=========================================================================
// Question 2.1.6
=========================================================================
public String toString()
{
String data = "Name: " + name + "\nGroup: " + numGroup+"\nSingle: " + numSingle + "\nPaid: " + getPaid();
return data;
}
}
GUI CLASS: QUESTION2_SOLUTION
package Question2Package;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
public class Question2_Solution extends javax.swing.JFrame {
String nameOfSchool;
String name;
Details photoPackage;
public Question2_Solution() {
initComponents();
setLocationRelativeTo(this);
}
=========================================================================
// Question 2.2.1
=========================================================================
private void btnQues2_2_1ActionPerformed(java.awt.event.ActionEvent evt) {
boolean bFound;
txaOutput.setText("");
name = cmbNames.getSelectedItem().toString();
try
{
Scanner inFile = new Scanner(new FileReader("Photographs.txt")); nameOfSchool = inFile.nextLine();
lblSchoolName.setText(nameOfSchool);
bFound = false;
while (inFile.hasNext() && !bFound) {
String line = inFile.nextLine();
Scanner scLine = new Scanner(line).useDelimiter("#|;"); String newName = scLine.next();
if (newName.equalsIgnoreCase(name)) {
int group = scLine.nextInt();
int single = scLine.nextInt();
char paid = scLine.next().charAt(0);
photoPackage = new Order(name, group, single, paid); txaOutput.append(photoPackage.toString()); txaOutput.append(String.format("\n\nAmount: R%-5.2f",
photoPackage.calcAmount()));
bFound = true;
}
}
inFile.close();
if (bFound == false){
btnQues2_2_2.setEnabled(false);
btnQues2_2_3.setEnabled(false);
JOptionPane.showMessageDialog(null, name + " was not found in text file");
} else {
btnQues2_2_2.setEnabled(true);
btnQues2_2_3.setEnabled(true);
}
} catch (FileNotFoundException ex)
{
JOptionPane.showMessageDialog(null, "File does not exist");
System.exit(0);
}
}
=========================================================================
// Question 2.2.2
=========================================================================
private void btnQues2_2_2ActionPerformed(java.awt.event.ActionEvent evt) {
PrintWriter outFile;
if (!photoPackage.getPaid().equals("Yes")) {
try
{
outFile = new PrintWriter(photoPackage.getName() + ".txt");
outFile.println("Group: " + photoPackage.getNumGroup());
outFile.println("Single: " + photoPackage.getNumSingle());
outFile.println("Total amount: " + photoPackage.calcAmount());
txaOutput.append("\nText file created ");
outFile.close();
} catch (FileNotFoundException ex)
{
JOptionPane.showMessageDialog(null, "File not found");
System.exit(0);
}
} else
{
txaOutput.append("\nAccount paid ");
}
}
=========================================================================
// Question 2.2.3
=========================================================================
private void btnQues2_2_3ActionPerformed(java.awt.event.ActionEvent evt) {
txaOutput.append(String.format("\nDiscount: R%-5.2f",
photoPackage.calcDiscount()) + "\n");
}
}
ANNEXURE F: SOLUTION FOR QUESTION 3: JAVA
// A possible solution to Question 3
package Question3Package;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
public class Question3_Solution extends javax.swing.JFrame {
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
String arrEvents[] = {
"Hockey", "Chess", "Rugby", "Chess", "Debating", "Hockey", "Soccer", "Rugby", "Debating", "Chess", "Rugby", "Debating", "Swimming", "Rugby", "Soccer", "Rugby", "Chess", "Choir", "Tennis", "Debating", "Debating", "Rugby", "Tennis", "Tennis", "Tennis", "Soccer", "Chess", "Swimming", "Hockey", "Rugby", "Chess", "Hockey", "Soccer", "Swimming", "Chess", "Choir", "Soccer", "Tennis", "Debating", "Rugby", "Choir", "Chess", "Choir", "Debating", "Rugby"};
String arrDates[] = {
"2015/10/04", "2015/03/20", "2015/09/17", "2015/03/20", "2015/05/24", "2015/10/04", "2015/06/03", "2015/07/19", "2015/09/16", "2015/07/01", "2015/03/17", "2015/11/19", "2015/07/29", "2015/09/18", "2015/10/23", "2015/07/15", "2015/03/07", "2015/06/08", "2015/04/01", "2015/03/07", "2015/09/12", "2015/11/12", "2015/10/03", "2015/05/11", "2015/10/03", "2015/05/28", "2015/09/28", "2015/05/10", "2015/09/24", "2015/10/14", "2015/04/23", "2015/03/23", "2015/06/03", "2015/07/29", "2015/09/18", "2015/08/29", "2015/11/10", "2015/04/01", "2015/04/10", "2015/03/23", "2015/10/04", "2015/10/07", "2015/05/03", "2015/07/30", "2015/11/25"};
int monthNumber;
int count = 45;
String eventName, sMonth;
public Question3_Solution() {
initComponents();
setLocationRelativeTo(this);
cmbEvents.setSelectedIndex(0);
}
private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
//========================================================================
private void btnRemoveActionPerformed(java.awt.event.ActionEvent evt) {
sortArrays();
removeDuplicates();
display();
}
//========================================================================
private void btnDisplayActionPerformed(java.awt.event.ActionEvent evt) {
sortArrays();
display();
}
/∗∗
∗ @param args the command line arguments
∗/
public static void main(String args[]) {
/∗ Create and display the form ∗/
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Question3_Solution().setVisible(true);
}
});
}
//========================================================================
public void display(){
if (!txfMonthNumber.getText().equals("")) {
monthNumber = Integer.parseInt(txfMonthNumber.getText()); if (monthNumber < 1 || monthNumber > 12) {
JOptionPane.showMessageDialog(null, "Please enter a valid number in the range of 1 to 12");
txfMonthNumber.setText("");
}
}
if (txfMonthNumber.getText().equals("")) {
sMonth = "All";
}
else {
sMonth = "" + monthNumber;
}
//JOptionPane.showMessageDialog(null,eventName.equals("All"));
eventName = (String) (cmbEvents.getSelectedItem());
txaOutput.setText("List of " + eventName.toLowerCase() + " events for month: " + sMonth + "\n\n");
txaOutput.append(String.format("%-15s%-10s\n", "EVENTS", "DATES"));
for (int i = 0; i < count; i++) {
int testmonth = Integer.parseInt(arrDates[i].substring(5, 7)); if (((monthNumber == testmonth) || (sMonth.equals("All"))) && ((eventName.equalsIgnoreCase(arrEvents[i])) ||
(eventName.equals("All")))) {
txaOutput.append(String.format("%-15s%-10s\n", arrEvents[i], arrDates[i]));
}
}
}
}
//========================================================================
public void sortArrays()
{
String tempDate = "";
String tempEvent = "";
for (int i = 0; i < count - 1; i++)
for (int j = i + 1; j < count; j++) {
if (arrDates[i].compareTo(arrDates[j]) > 0) {
tempDate = arrDates[i];
arrDates[i] = arrDates[j];
arrDates[j] = tempDate;
tempEvent = arrEvents[i];
arrEvents[i] = arrEvents[j];
arrEvents[j] = tempEvent;
}
}
}
//========================================================================
public void removeDuplicates(){
String event = JOptionPane.showInputDialog(null, "Enter the event","");
int i = 0;
while (i < count) {
int j = i + 1;
while ((arrEvents[i].equalsIgnoreCase(event)) &&
(arrDates[i].equals(arrDates[j]) && j <= count)) {
for (int k = j; k < count - 1; k++){
arrDates[k] = arrDates[k + 1];
arrEvents[k] = arrEvents[k + 1];
}
count--;
}
i++;
}
}
ANNEXURE G: SOLUTION FOR QUESTION 1: DELPHI
unit Question1U_MEMO;
//A possible solution to Question 1
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls;
type
TfrmQuestion1 = class(TForm)
pnlButtons: TPanel;
bmbClose: TBitBtn;
grbQ1_1: TGroupBox;
lblOutput: TLabel;
lblCategory: TLabel;
lblEvent: TLabel;
edtEvent: TEdit;
cboCategory: TComboBox;
btnQuestion1_1: TButton;
grbQ1_2: TGroupBox;
lblNumParticipants: TLabel;
edtNumParticipants: TEdit;
btnQuestion1_2: TButton;
edtIncome: TEdit;
grbQ1_3: TGroupBox;
btnQuestion1_3: TButton;
edtAnswer: TEdit;
grbQ1_4: TGroupBox;
btnQuestion1_4: TButton;
grbQ1_5: TGroupBox;
btnQuestion1_5: TButton;
redQ14: TRichEdit;
redQ15: TRichEdit;
grbQ1_6: TGroupBox;
btnQuestion1_6: TButton;
redQ16: TRichEdit;
cbkBonus: TCheckBox;
rgpRound: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure btnQuestion1_1Click(Sender: TObject);
procedure btnQuestion1_2Click(Sender: TObject);
procedure btnQuestion1_3Click(Sender: TObject);
procedure btnQuestion1_4Click(Sender: TObject);
procedure btnQuestion1_6Click(Sender: TObject);
procedure btnQuestion1_5Click(Sender: TObject);
procedure rgpRoundClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmQuestion1: TfrmQuestion1;
implementation
{$R *.dfm}
{$R+}
uses Math, DateUtils;
var
sEvent : String = 'Quiz';
iNumParticipants : Integer = 50;
=========================================================================
// Question 1.1
=========================================================================
procedure TfrmQuestion1.btnQuestion1_1Click(Sender: TObject);
begin
lblOutput.Caption := edtEvent.Text + ':' +
cboCategory.Items[cboCategory.ItemIndex]; end;
=========================================================================
// Question 1.2
=========================================================================
procedure TfrmQuestion1.btnQuestion1_2Click(Sender: TObject);
var
rCost : real;
begin
rCost := 0;
iNumParticipants := StrToInt(edtNumParticipants.Text);
if iNumParticipants <= 20 then
begin
rCost := iNumParticipants * 25.00;
end
else
begin
rCost := (20 * 25.00) + ((iNumParticipants-20)* 30.00);
end;
edtIncome.Text := FloatToStrF(rCost, ffCurrency, 8, 2);
end;
=========================================================================
// Question 1.3
=========================================================================
procedure TfrmQuestion1.btnQuestion1_3Click(Sender: TObject);
var
iBase, iExp : integer;
rAnswer : real;
begin
iBase := StrToInt(InputBox('Base value', 'Enter the base', ' '));
iExp := StrToInt(InputBox('Exponent value',
'Enter the exponent', ' '));
rAnswer := Sqrt(Power(iBase, iExp));
edtAnswer.Text := 'x = ' + FloatToStrF(rAnswer, ffFixed, 8,2);
end;
=========================================================================
// Question 1.4
=========================================================================
procedure TfrmQuestion1.btnQuestion1_4Click(Sender: TObject);
var
rPizzas : real;
begin
rPizzas := (iNumParticipants * 3) / 8;
redQ14.Clear;
redQ14.Lines.Add('Exact value = ' + FloatToStrF(rPizzas, ffFixed, 8,4) +
13+ 'Number of pizzas to order = ' +
FloatToStrF(Round(rPizzas + 0.5), ffFixed, 8, 0));
end;
=========================================================================
// Question 1.5
=========================================================================
procedure TfrmQuestion1.btnQuestion1_5Click(Sender: TObject);
var
K,J,iNumQuestions : integer;
sOutput : String;
begin
//Question 1.5.1
// Code to determine the number of questions
if rgpRound.ItemIndex = 0 then
begin
iNumQuestions := 5;
cbkBonus.checked := false;
end
else
begin
if rgpRound.ItemIndex = 1 then
iNumQuestions := 8;
if cbkBonus.checked then
inc(iNumQuestions,2);
end;
//Question 1.5.2
//Correct incorrect code to display pattern
redQ15.Clear;
redQ15.Lines.Add('Questions to answer') ;
sOutput := '';
for I := 1 to iNumQuestions do
begin
for J:= iNumQuestions downto I do
sOutput := sOutput + IntToStr(J) + ' ';
sOutput := sOutput + #13;
end;
redQ15.Lines.Add(sOutput + #13 + 'Quiz completed');
end;
=========================================================================
// Question 1.6
=========================================================================
procedure TfrmQuestion1.btnQuestion1_6Click(Sender: TObject);
var
A, iRow, iNumSeats : integer;
rTotalIncome, rRowIncome, rTicketPrice : real;
begin
iNumSeats := 30;
rTotalIncome := 0.0;
rTicketPrice := 50.00;
redQ16.Clear;
redQ16.Paragraph.TabCount := 3;
redQ16.Paragraph.Tab[0] := 50;
redQ16.Paragraph.Tab[1] := 110;
redQ16.Paragraph.Tab[2] := 180;
redQ16.Lines.Add('Row' + #9 + 'Seats' + #9 + 'Ticket price' + #9 + 'Income');
for iRow := 1 to 20 do
begin
rRowIncome := (iNumSeats * rTicketPrice);
rTotalIncome := rTotalIncome + rRowIncome;
redQ16.Lines.Add(IntToStr(iRow) + #9 + IntToStr(iNumSeats) + #9 + FloatToStrF(rTicketPrice, ffCurrency, 8, 2) + #9 + FloatToStrF(rRowIncome, ffCurrency, 8, 2));
rTicketPrice := rTicketPrice - 2;
Inc(iNumSeats, 2);
end;
redQ16.Lines.Add(#13 + 'Total income: ' + FloatToStrF(rTotalIncome, ffCurrency, 8, 2));
end;
//====================================================================
procedure TfrmQuestion1.FormCreate(Sender: TObject);
begin
edtEvent.Text := sEvent;
CurrencyString := 'R';
end;
procedure TfrmQuestion1.rgpRoundClick(Sender: TObject);
begin
cbkBonus.Enabled := rgpRound.ItemIndex = 1;
end;
end.
ANNEXURE H: SOLUTION FOR QUESTION 2: DELPHI
OBJECT CLASS: DETAILS
unit OrderU;
//A possible solution for the object class
interface
=========================================================================
// Question 2.1.1
=========================================================================
type
TOrder = class(TObject)
private
fName : String;
fNumGroup,
fNumSingle : integer;
fPaid : Char;
public
function getName : String;
function getNumGroup : integer;
function getNumSingle: integer;
function getPaid : String;
constructor Create(Name : String; Group, Single : integer; Paid : Char);
function calcAmount : real;
function calcDisount : real;
function toString : String;
end;
implementation
uses SysUtils, Math, DateUtils;
{ TDetails }
=========================================================================
// Question 2.1.2
=========================================================================
// Question 2.1.2 (a)
function TOrder.getName: String;
begin
Result := fName;
end;
function TOrder.getNumGroup: integer;
begin
Result := fNumGroup;
end;
function TOrder.getNumSingle: integer;
begin
Result := fNumSingle;
end;
//Question 2.1.2 (b)
function TOrder.getPaid: String;
begin
if (fPaid = 'Y') then
Result := 'Yes'
else
Result := 'No';
end;
=========================================================================
// Question 2.1.3
=========================================================================
constructor TOrder.Create(Name: String; Group, Single: integer; Paid: char);
begin
fName := Name;
fNumGroup := Group;
fNumSingle:= Single;
fPaid := Paid;
end;
=========================================================================
// Question 2.1.4
=========================================================================
function TOrder.calcAmount: real;
begin
Result := (fNumGroup * 15.70) + (fNumSingle * 12.50);
end;
=========================================================================
// Question 2.1.5
=========================================================================
function TOrder.calcDisount: real;
var
rDiscount : real;
begin
if ((fNumGroup >= 4) OR (fNumSingle >= 4)) AND (fPaid = 'Y') then
begin
rDiscount := calcAmount * 5 / 100.00;
end;
Result := rDiscount;
end;
=========================================================================
// Question 2.1.6
=========================================================================
function TOrder.toString: String;
begin
Result :=
'Name: ' + fName + #13 +
'Group: ' + IntToStr(fNumGroup) + #13 +
'Single: ' + IntToStr(fNumSingle)+ #13 +
'Paid: ' + getPaid;
end;
end.
MAIN FORM UNIT: QUESTION2_U.PAS
unit Question2U_MEMO;
//==============================
// A possible solution for Question 2
//==============================
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls;
type
TfrmQuestionTwo = class(TForm)
pnlButtons: TPanel;
bmbClose: TBitBtn;
cboNames: TComboBox;
lblHeading: TLabel;
lblSelect: TLabel;
lblSchoolName: TLabel;
redQ2: TRichEdit;
btnQuestion2_2_1: TButton;
btnQuestion2_2_2: TButton;
btnQuestion2_2_3: TButton;
procedure btnQuestion2_2_1Click(Sender: TObject);
procedure btnQuestion2_2_2Click(Sender: TObject);
procedure btnQuestion2_2_3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmQuestionTwo: TfrmQuestionTwo;
implementation
uses DetailsU;
{$R *.dfm}
{$R+}
var
PhotoPackage: TOrder;
//======================================================================
procedure TfrmQuestionTwo.btnQuestion2_2_1Click(Sender: TObject);
var
tFile : TextFile;
sLine : String;
sSchool, sName: String;
bFound: boolean;
iGroup, iSingle: integer;
cPaid : Char;
begin
// =========================================================================
// Question 2.2.1
//=========================================================================
redQ2.Clear;
sName := cboNames.Items[cboNames.ItemIndex];
if NOT FileExists('Photographs.txt') then
begin
MessageDlg('File does not exists', mtError, [mbOk], 0);
Exit;
end;
AssignFile(tFile, 'Photographs.txt');
Reset(tFile);
readln(tFile, sSchool);
lblSchoolName.Caption := sSchool;
bFound := False;
while NOT EOF(tFile) AND NOT bFound do
begin
readln(tFile, sLine);
if pos(Uppercase(sName), Uppercase(sLine)) = 1 then
begin
Delete(sLine, 1, pos('#', sLine));
iGroup := StrToInt(Copy(sLine, 1, pos(';', sLine) - 1)); Delete(sLine, 1, pos(';', sLine));
iSingle := StrToInt(Copy(sLine, 1, pos(';', sLine) - 1)); Delete(sLine, 1, pos(';', sLine));
cPaid := sLine[1]; // true = Y / false = not Y
PhotoPackage := TOrder.Create(sName, iGroup, iSingle, cPaid);
redQ2.Lines.Add(PhotoPackage.toString + #13 + #13+ 'Amount: ' +
FloatToStrF(PhotoPackage.calcAmount, ffCurrency, 8, 2));
bFound := True;
end; // name found
end;
if NOT bFound then
begin
btnQuestion2_2_2.Enabled := False;
btnQuestion2_2_3.Enabled := False;
MessageDlg(sName + ' was not found in text file', mtError, [mbOk], 0); end
else
begin
btnQuestion2_2_2.Enabled := True;
btnQuestion2_2_3.Enabled := True;
end
end;
// ==========================================================================
procedure TfrmQuestionTwo.btnQuestion2_2_2Click(Sender: TObject);
var
tFile : TextFile;
sFileName : String;
begin
// =========================================================================
// Question 2.2.2
// ==========================================================================
if PhotoPackage.getPaid = 'Yes' then
begin
redQ2.Lines.Add('Account paid');
end
else
begin
sFileName := PhotoPackage.getName + '.txt';
AssignFile(tFile, sFileName);
Rewrite(tFile);
Writeln(tFile, 'Group: ' + IntToStr(PhotoPackage.getNumGroup));
Writeln(tFile, 'Single: ' + IntToStr(PhotoPackage.getNumSingle));
Writeln(tFile, 'Amount: ' + FloatToStrF(PhotoPackage.calcAmount,
ffCurrency, 8, 2));
CloseFile(tFile);
redQ2.Lines.Add('Text file created');
end;
end;
// ==========================================================================
procedure TfrmQuestionTwo.btnQuestion2_2_3Click(Sender: TObject);
begin
// =========================================================================
// Question 2.2.3
// ==========================================================================
redQ2.Lines.Add('Discount: ' + FloatToStrF(PhotoPackage.calcDisount, ffCurrency,8,2))
end;
// ==========================================================================
// Given Code
procedure TfrmQuestionTwo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if NOT(PhotoPackage = nil) then
begin
FreeAndNil(PhotoPackage);
end;
end;
procedure TfrmQuestionTwo.FormCreate(Sender: TObject);
begin
CurrencyString := 'R';
end;
// =========================================================================
end.
ANNEXURE I: SOLUTION FOR QUESTION 3: DELPHI
unit Question3U_Memo;
// A possible solution for Question 3
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls;
type
TfrmQuestion3 = class(TForm)
pnlButtons: TPanel;
bmbClose: TBitBtn;
lblHead: TLabel;
btnDisplay: TButton;
grbInput: TGroupBox;
cboEvent: TComboBox;
lblEvent: TLabel;
edtMonth: TEdit;
lblMonth: TLabel;
redQ3: TRichEdit;
btnRemoveDuplicates: TButton;
procedure btnDisplayClick(Sender: TObject);
procedure btnRemoveDuplicatesClick(Sender: TObject);
procedure Display;
procedure SortArrays;
Procedure RemoveDuplicates;
procedure bmbCloseClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
StringArray = Array [1 .. 45] of String;
var
frmQuestion3: TfrmQuestion3;
implementation
{$R *.dfm}
{$R+}
Uses DateUtils, Math;
var
arrEvents: array [1 .. 45] of String = (
'Hockey', 'Chess', 'Rugby', 'Chess', 'Debating', 'Hockey', 'Soccer', 'Rugby', 'Debating', 'Chess', 'Rugby', 'Debating', 'Swimming', 'Rugby', 'Soccer', 'Rugby', 'Chess', 'Choir', 'Tennis', 'Debating', 'Debating', 'Rugby', 'Tennis', 'Tennis', 'Tennis', 'Soccer', 'Chess', 'Swimming', 'Hockey', 'Rugby', 'Chess', 'Hockey', 'Soccer', 'Swimming', 'Chess', 'Choir', 'Soccer', 'Tennis', 'Debating', 'Rugby', 'Choir', 'Chess', 'Choir', 'Debating', 'Rugby');
arrDates: array [1 .. 45] of string = (
'2015/10/04', '2015/03/20', '2015/09/17', '2015/03/20', '2015/05/24', '2015/10/04', '2015/06/03', '2015/07/19', '2015/09/16', '2015/07/01', '2015/03/17', '2015/11/19', '2015/07/29', '2015/09/18', '2015/10/23', '2015/07/15', '2015/03/07', '2015/06/08', '2015/04/01', '2015/03/07', '2015/09/12', '2015/11/12', '2015/10/03', '2015/05/11', '2015/10/03', '2015/05/28', '2015/09/28', '2015/05/10', '2015/09/24', '2015/10/14', '2015/04/23', '2015/03/23', '2015/06/03', '2015/07/29', '2015/09/18', '2015/08/29', '2015/11/10', '2015/04/01', '2015/04/10', '2015/03/23', '2015/10/04', '2015/10/07', '2015/05/03', '2015/07/30', '2015/11/25');
iCount : Integer = 45;
// ==================================================================
procedure TfrmQuestion3.bmbCloseClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TfrmQuestion3.btnDisplayClick(Sender: TObject);
begin
SortArrays;
Display;
end;
//========================================================================
procedure TfrmQuestion3.btnRemoveDuplicatesClick(Sender: TObject);
begin
RemoveDuplicates;
SortArrays;
Display;
end;
//========================================================================
Procedure TfrmQuestion3.Display;
var
sEvent, sMonth: String;
iMonth,iTestMonth, A : Integer;
begin
redQ3.Clear;
redQ3.Paragraph.TabCount := 1;
redQ3.Paragraph.Tab[0] := 150;
sMonth := edtMonth.Text;
if sMonth <> '' then
begin
iMonth := StrToInt(sMonth);
if NOT(iMonth IN [1 .. 12]) then
begin
MessageDlg('Please enter a number in the range of 1 to 12', mtError, [mbOk], 0);
edtMonth.SetFocus;
Exit;
end;
end
else
sMonth := 'All';
// Display for selected event
sEvent := cboEvent.text;
redQ3.Lines.Add('List of ' + LowerCase(sEvent) + ' events for month: ' + sMonth + #13);
redQ3.Lines.Add('EVENTS ' + #9 + 'DATES');
for A := 1 to iCount do // or to high(arrEvents) do
begin
iTestMonth := StrToInt(copy(arrDates[A],6,2));
if ((iTestMonth = iMonth) OR (sMonth = 'All')) AND ((sEvent = arrEvents[A]) OR (sEvent = 'All')) then
redQ3.Lines.Add(arrEvents[A]+ #9 + arrDates[A]);
end;
end;
//========================================================================
Procedure TfrmQuestion3.SortArrays;
var
A, B : Integer;
sTempDate : String;
sTempEvent : String;
begin
// Sort arrays: arrDates & arrEvents
for A := 1 to iCount - 1 do
for B := A + 1 to iCount do
if arrDates[B] < arrDates[A] then
begin
sTempDate := arrDates[A];
arrDates[A] := arrDates[B];
arrDates[B] := sTempDate;
sTempEvent := arrEvents[A];
arrEvents[A] := arrEvents[B];
arrEvents[B] := sTempEvent;
end;
end;
//========================================================================
Procedure TfrmQuestion3.RemoveDuplicates;
var
i, j, indx : Integer;
sEvent : String;
begin
// Remove duplicates
indx := 0;
sEvent := Uppercase(InputBox('Event', 'Enter an event', '')); i := 1;
while i < iCount do
begin
j := i + 1;
While (Uppercase(arrEvents[i]) = sEvent) And (arrDates[j] = arrDates[i])
And (j <= iCount) do
begin
for indx := j to iCount-1 do
begin
arrdates[indx] := arrdates[indx+1];
arrEvents[indx] := arrevents[indx+1];
end;
Dec(iCount)
end;
inc(i);
end;
end;
end.