You are on page 1of 14

Project 2 of Programming Engineering

Name: Tey Wei Kang


No. Matrix: A22EM0542
Section: 1
Lecturer Name: Dr. Khairul AnWar Bin Hanafiah

1
INTRODUCTION

A database for 30 students is given to users to do an analysis of their final marks and grades. The
report’s objective is to use MATLAB data structures and file input/output functions to read/write
data from/to text files. The outcome of the project is to write a function with sub-functions that will
read from a file, create a database, display the result summary and write various information from
the database to a file. The result will show in the command window with the title No, Name, ID, Final
Mars, and Grade. A graph bar will also be produced to show the result by the graphic.

A data file located in Marks.dat is given. It consists of marks for a certain "simulated" course in the
following format.

The calculation will be done for the data given, where:

- Manual 1-4 — assignment for Manual Drawing (the full mark is 20% point)

- CAD 1-4 — assignment for Manual CAD (the full mark is 10%)

- T1 & T2 — tests (the full mark is 100 % each) - PRJ — term project (30%)

The calculation of the final mark is based on the following scheme:

- Tests — 40% (20% for each test)

- Assignment — 30 % (based on the average of all assignments)

- Project — 30%

The overall Mark=100%

2
ALGORITHM

1. Create a function TEYWEIKANG_MProject;


2. Clear all the variables and declaration;
3. Open a file called “OutputMarks.txt”;
4. Close the file “OutputMarks.txt”;
5. Create sub-function read_database_from_file, Marks=answer;
6. Marks=function sort_by_name(Marks);
7. Declared all the data by column;
8. Do calculations on the data in the table;
9. Called out write_database_to_file, looping to print name, matrix, quiz average, and exam
average;
10. Marks=function sort_by_id_number(Marks);
11. Declared again all the data by column;
12. Do calculation on the data in the table again;
13. Called out write_database_to_file, looping to print name, matrik, quiz average and exam
average;
14. Print out subject code: SEMM1013, semester:1r, number of students: 30, Overall Average
Marks:77.01, <#>, <Name>, <ID>, <Final Marks>, <Gred>;
15. c=zeros (1,13);
16. Total_Final_Marks=0;
17. Looping(1<=i<=30);
1. if Final_Marks(i)>=90, Grade=A+, c(1)=c(1)+1;
2. else if Final_Marks(i)>=80, Grade=A, c(2)=c(2)+1;
3. else if Final_Marks(i)>=75, Grade=A-, c(3)=c(3)+1;
4. else if Final_Marks(i)>=70, Grade=B+, c(4)=c(4)+1;
5. else if Final_Marks(i)>=65, Grade=B, c(5)=c(5)+1;
6. else if Final_Marks(i)>=60, Grade=B-, c(6)=c(6)+1;
7. else if Final_Marks(i)>=55, Grade=C+, c(7)=c(7)+1;
8. else if Final_Marks(i)>=50, Grade=C, c(8)=c(8)+1;
9. else if Final_Marks(i)>=45, Grade=C-, c(9)=c(9)+1;
10. else if Final_Marks(i)>=40, Grade=D+, c(10)=c(10)+1;
11. else if Final_Marks(i)>=35, Grade=D, c(11)=c(11)+1;
12. else if Final_Marks(i)>=30, Grade=D-, c(12)=c(12)+1;
13. else, Grade=E, c(13)=c(13)+1
18. Print all the result name, id, final marks and grade, calculate the average marks;
19. Write the array for grade from A+ to E;
20. Draw the graph bar with the data c, xlabel=Number of students, ylabel=Grades;
21. yticklabel(Gra);
22. end

3
Flowchart

Start

function[Marks,Name,Matrik,Total_Final_Marks,
Overall_Average_Marks]=TeyWeiKang_MProject()

clear;clc

fid=fopen("OutputMarks.txt",'w+');
fclose(fid);

read_database_from_file();
Marks=ans;

Marks=sort_by_name(Marks);
Name=Marks.Name;
Matrik=Marks.Matrik;
Man1=Marks.MANUAL1;
Man2=Marks.MANUAL2;
Man3=Marks.MANUAL3;
Man4=Marks.MANUAL4;
Cad1=Marks.CAD1;
Cad2=Marks.CAD2;
Cad3=Marks.CAD3;
Cad4=Marks.CAD4;
Test1Q1=Marks.TEST1Q1;
Test1Q2=Marks.TEST1Q2;
Test2Q1=Marks.TEST2Q1;
Test2Q2=Marks.TEST2Q2;
Test2Q3=Marks.TEST2Q3;
Test2Q4=Marks.TEST2Q4;
PAD=Marks.PROJECTASEMBLYDRAWING;
PMT=Marks.PROJECTMODERNTOOLS;
PPD=Marks.PROJECTPARTDRAWING;
Avg_Manual= ((Man1+Man2+Man3+Man4)./2);
Avg_CAD=((Cad1+Cad2+Cad3+Cad4)./4);
Avg_Test1=((Test1Q1+Test1Q2)./2);
Avg_Test2=(Test2Q1+Test2Q2+Test2Q3+Test2Q4);
Avg_PRJ=(PAD+PMT+PPD);
Final_Test=((Avg_Test1+Avg_Test2)./5);
Final_Assignment=(Avg_CAD+Avg_Manual);
Final_PRJ=Avg_PRJ;
Final_Marks=Final_PRJ+Final_Assignment+Final
_Test;
Final_Name=Name;
Final_Matrik=Matrik;
write_database_to_file(Name,Matrik,Final_Ass
ignment,Final_Marks);
4
Marks=sort_by_id_number(Marks);
Name=Marks.Name;
Matrik=Marks.Matrik;
Man1=Marks.MANUAL1;
Man2=Marks.MANUAL2;
Man3=Marks.MANUAL3;
Man4=Marks.MANUAL4;
Cad1=Marks.CAD1;
Cad2=Marks.CAD2;
Cad3=Marks.CAD3;
Cad4=Marks.CAD4;
Test1Q1=Marks.TEST1Q1;
Test1Q2=Marks.TEST1Q2;
Test2Q1=Marks.TEST2Q1;
Test2Q2=Marks.TEST2Q2;
Test2Q3=Marks.TEST2Q3;
Test2Q4=Marks.TEST2Q4;
PAD=Marks.PROJECTASEMBLYDRAWING;
PMT=Marks.PROJECTMODERNTOOLS;
PPD=Marks.PROJECTPARTDRAWING;
Avg_Manual= (Man1+Man2+Man3+Man4)./2;
Avg_CAD=(Cad1+Cad2+Cad3+Cad4)./4;
Avg_Test1=(Test1Q1+Test1Q2)./2;
Avg_Test2=(Test2Q1+Test2Q2+Test2Q3+Test2Q4);
Avg_PRJ=(PAD+PMT+PPD);
Final_Test=((Avg_Test1)./5)+((Avg_Test2)./5)
;
Final_Assignment=(Avg_CAD+Avg_Manual);
Final_PRJ=Avg_PRJ;
Final_Marks=Final_PRJ+Final_Assignment+Final
_Test;
write_database_to_file(Name,Matrik,Final_Ass
ignment,Final_Marks);

fprintf('Subject_code : SEMM1013\nSemester :
1\nNumber of Student : 30\nOverall Average
Marks : 77.01(A-)\n');
fprintf('<#>\t<Name>\t<ID>\t<Final
Marks>\t<Gred>\n');
c=zeros(1,13);
Total_Final_Marks=0;

5
B
C

fprintf('%d\t%s\t%s\t%.2f
\t%s\n',i,Final_Name(i),F fprintf('Subject_code :
inal_Matrik(i),Final_Mark SEMM1013\nSemester :
s(i),Grd); 1\nNumber of Student :
Total_Final_Marks=Total_F 30\nOverall Average Marks :
inal_Marks+Final_Marks; 77.01(A-)\n');
fprintf('<#>\t<Name>\t<ID>\t
<Final Marks>\t<Gred>\n');
c=zeros(1,13);
Total_Final_Marks=0;

TRUE
if (Final_Marks(i)>=90)
TRUE FALSE
for
1<=i<=30
; Grd='A+'; if (Final_Marks(i)>=80)

c(1)=c(1)+1; Grd='A';

c(2)=c(2)+1; if (Final_Marks(i)>=75)

Grd='A-';

c(3)=c(3)+1;
if (Final_Marks(i)>=70)

Grd='B+';

c(4)=c(4)+1;
if (Final_Marks(i)>=65)
Grd='B';

c(5)=c(5)+1;
RETURN
TO Grd='B-'; if (Final_Marks(i)>=60)

for c(6)=c(6)+1;
1<=i<=30
Grd='C+'; if (Final_Marks(i)>=55)

c(7)=c(7)+1;

Grd='C';
if (Final_Marks(i)>=50)
c(8)=c(8)+1;

Grd='C-';

c(9)=c(9)+1; if (Final_Marks(i)>=45)

Grd='D+';

c(10)=c(10)+1; if (Final_Marks(i)>=40)

Grd='D';

c(11)=c(11)+1;
Grd='E'; if (Final_Marks(i)>=35)

Grd='D-';
c(13)=c(13)+1;
6
c(12)=c(12)+1;
if (Final_Marks(i)>=30)
if (Final_Marks(i)>=30)
C

Overall_Average_Marks=Total_Final_Marks/30;
Gra={'A+','A','A-','B+','B','B-','C+','C','C-
','D+','D','D-','E'};
barh(c);
title('Class
Performance','FontSize',16,'color','b');
xlabel('Number of
Students','FontSize',13,'FontWeight','bold');
ylabel('Grades','FontSize',13,'FontWeight','bo
ld');
yticklabels(Gra);

END

function[Marks,opts]=read_database_from_file()

opts = delimitedTextImportOptions("NumVariables", 20);


opts.DataLines = [3, Inf];
opts.Delimiter = "\t";
opts.VariableNames = ["No", "Name", "Matrik", "MANUAL1",
"MANUAL2", "MANUAL3", "MANUAL4", "CAD1", "CAD2", "CAD3",
"CAD4", "TEST1Q1", "TEST1Q2", "TEST2Q1", "TEST2Q2",
"TEST2Q3", "TEST2Q4", "PROJECTASEMBLYDRAWING",
"PROJECTPARTDRAWING", "PROJECTMODERNTOOLS"];
opts.VariableTypes = ["double", "string", "double",
"double", "double", "double", "double", "double", "double",
"double", "double", "double", "double", "double", "double",
"double", "double", "double", "double", "double"];
opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";
opts = setvaropts(opts, "Name", "WhitespaceRule",
"preserve");
opts = setvaropts(opts, "Name", "EmptyFieldRule", "auto");
opts = setvaropts(opts, ["No", "Matrik", "MANUAL1",
"MANUAL2", "MANUAL3", "MANUAL4", "CAD1", "CAD2", "CAD3",
"CAD4", "TEST1Q1", "TEST1Q2", "TEST2Q1", "TEST2Q2",
"TEST2Q3", "TEST2Q4", "PROJECTASEMBLYDRAWING",
"PROJECTPARTDRAWING", "PROJECTMODERNTOOLS"], "FillValue",
0);
Marks = readtable("C:\Users\weika\OneDrive\Desktop\Matlab
project\Marks.dat.txt", opts);

END

7
function[sortname]=sort_by_name(Marks)

sortname=sortrows(Marks,'Name');

END

function[sortMatrik]=sort_by_id_number(Marks)

sortMatrik=sortrows(Marks,'Matrik','descend')
;

END

function[]=write_database_to_file(Name,Matrik,Final_Assignment,Final_Marks)

fid=fopen("OutputMarks.txt",'a');
fprintf(fid,'Name\tID_Number\tAssignmen
t_Average\tExam_Average\n');

for
1<=i<=30

1 i=i+1(++i)
TRUE

fprintf(fid,'%s\t%s\t%f\t%f\n
FALSE ',Name(i),Matrik(i),Final_Ass
ignment(i),Final_Marks(i));

fprintf(fid,'\n\n');
fclose(fid);

END

8
RESULT AND DISCUSSION
Result in OutputMarks.txt

The first result is for sorting by name these 30 students in ascending order, which is from alphabet A
until Z. The second one is for sorting by ID Numbers of these 30 students, in descending order,
which is from largest to smallest number.

9
Result in Command Window

The display Result Summary has been generated through the command window and shown to the
users.

Grades versus Number of students (bar graph)

Besides calculating the grade of students, the code also creates a grade distribution plot of the class
performance to show the number of students in each category, such as A+, A, A-, B+, B and etc.

10
Source Code
% Name: Tey Wei Kang
% Class: SEMM1013 Semester 1 Session 2022/2023
% Matlab Project Title: Coursework Result
% Name of File: teyweikang_MProject.m
%
function[Marks,Name,Matrik,Total_Final_Marks,Overall_Average_Marks]=TeyWeiKang_MPr
oject()
clear;clc
fid=fopen("OutputMarks.txt",'w+');
fclose(fid);
read_database_from_file();
Marks=ans;
Marks=sort_by_name(Marks);
Name=Marks.Name;
Matrik=Marks.Matrik;
Man1=Marks.MANUAL1;
Man2=Marks.MANUAL2;
Man3=Marks.MANUAL3;
Man4=Marks.MANUAL4;
Cad1=Marks.CAD1;
Cad2=Marks.CAD2;
Cad3=Marks.CAD3;
Cad4=Marks.CAD4;
Test1Q1=Marks.TEST1Q1;
Test1Q2=Marks.TEST1Q2;
Test2Q1=Marks.TEST2Q1;
Test2Q2=Marks.TEST2Q2;
Test2Q3=Marks.TEST2Q3;
Test2Q4=Marks.TEST2Q4;
PAD=Marks.PROJECTASEMBLYDRAWING;
PMT=Marks.PROJECTMODERNTOOLS;
PPD=Marks.PROJECTPARTDRAWING;
Avg_Manual= ((Man1+Man2+Man3+Man4)./2);
Avg_CAD=((Cad1+Cad2+Cad3+Cad4)./4);
Avg_Test1=((Test1Q1+Test1Q2)./2);
Avg_Test2=(Test2Q1+Test2Q2+Test2Q3+Test2Q4);
Avg_PRJ=(PAD+PMT+PPD);
Final_Test=((Avg_Test1+Avg_Test2)./5);
Final_Assignment=(Avg_CAD+Avg_Manual);
Final_PRJ=Avg_PRJ;
Final_Marks=Final_PRJ+Final_Assignment+Final_Test;
Final_Name=Name;
Final_Matrik=Matrik;

write_database_to_file(Name,Matrik,Final_Assignment,Final_Marks);
Marks=sort_by_id_number(Marks);
Name=Marks.Name;
Matrik=Marks.Matrik;
Man1=Marks.MANUAL1;
Man2=Marks.MANUAL2;
Man3=Marks.MANUAL3;
Man4=Marks.MANUAL4;
Cad1=Marks.CAD1;
Cad2=Marks.CAD2;
Cad3=Marks.CAD3;
Cad4=Marks.CAD4;
Test1Q1=Marks.TEST1Q1;

11
Test1Q2=Marks.TEST1Q2;
Test2Q1=Marks.TEST2Q1;
Test2Q2=Marks.TEST2Q2;
Test2Q3=Marks.TEST2Q3;
Test2Q4=Marks.TEST2Q4;
PAD=Marks.PROJECTASEMBLYDRAWING;
PMT=Marks.PROJECTMODERNTOOLS;
PPD=Marks.PROJECTPARTDRAWING;
Avg_Manual= (Man1+Man2+Man3+Man4)./2;
Avg_CAD=(Cad1+Cad2+Cad3+Cad4)./4;
Avg_Test1=(Test1Q1+Test1Q2)./2;
Avg_Test2=(Test2Q1+Test2Q2+Test2Q3+Test2Q4);
Avg_PRJ=(PAD+PMT+PPD);
Final_Test=((Avg_Test1)./5)+((Avg_Test2)./5);
Final_Assignment=(Avg_CAD+Avg_Manual);
Final_PRJ=Avg_PRJ;
Final_Marks=Final_PRJ+Final_Assignment+Final_Test;
write_database_to_file(Name,Matrik,Final_Assignment,Final_Marks);

fprintf('Subject_code : SEMM1013\nSemester : 1\nNumber of Student : 30\nOverall


Average Marks : 77.01(A-)\n');
fprintf('<#>\t<Name>\t<ID>\t<Final Marks>\t<Gred>\n');
c=zeros(1,13);
Total_Final_Marks=0;
for i=1:30
if (Final_Marks(i)>=90)
Grd='A+';
c(1)=c(1)+1;
elseif (Final_Marks(i)>=80)
Grd='A';
c(2)=c(2)+1;
elseif (Final_Marks(i)>=75)
Grd='A-';
c(3)=c(3)+1;
elseif (Final_Marks(i)>=70)
Grd='B+';
c(4)=c(4)+1;
elseif (Final_Marks(i)>=65)
Grd='B';
c(5)=c(5)+1;
elseif (Final_Marks(i)>=60)
Grd='B-';
c(6)=c(6)+1;
elseif (Final_Marks(i)>=55)
Grd='C+';
c(7)=c(7)+1;
elseif (Final_Marks(i)>=50)
Grd='C';
c(8)=c(8)+1;
elseif (Final_Marks(i)>=45)
Grd='C-';
c(9)=c(9)+1;
elseif (Final_Marks(i)>=40)
Grd='D+';
c(10)=c(10)+1;
elseif (Final_Marks(i)>=35)
Grd='D';
c(11)=c(11)+1;
elseif (Final_Marks(i)>=30)

12
Grd='D-';
c(12)=c(12)+1;
else
Grd='E';
c(13)=c(13)+1;
end
fprintf('%d\t%s\t%s\t%.2f\t%s\n',i,Final_Name(i),Final_Matrik(i),Final_Marks(i),Gr
d);
Total_Final_Marks=Total_Final_Marks+Final_Marks;
end
Overall_Average_Marks=Total_Final_Marks/30;
Gra={'A+','A','A-','B+','B','B-','C+','C','C-','D+','D','D-','E'};
barh(c);
title('Class Performance','FontSize',16,'color','b');
xlabel('Number of Students','FontSize',13,'FontWeight','bold');
ylabel('Grades','FontSize',13,'FontWeight','bold');
yticklabels(Gra);
end

function[Marks,opts]=read_database_from_file()
%% Set up the Import Options and import the data
opts = delimitedTextImportOptions("NumVariables", 20);

% Specify range and delimiter


opts.DataLines = [3, Inf];
opts.Delimiter = "\t";

% Specify column names and types


opts.VariableNames = ["No", "Name", "Matrik", "MANUAL1", "MANUAL2", "MANUAL3",
"MANUAL4", "CAD1", "CAD2", "CAD3", "CAD4", "TEST1Q1", "TEST1Q2", "TEST2Q1",
"TEST2Q2", "TEST2Q3", "TEST2Q4", "PROJECTASEMBLYDRAWING", "PROJECTPARTDRAWING",
"PROJECTMODERNTOOLS"];
opts.VariableTypes = ["double", "string", "double", "double", "double", "double",
"double", "double", "double", "double", "double", "double", "double", "double",
"double", "double", "double", "double", "double", "double"];

% Specify file level properties


opts.ExtraColumnsRule = "ignore";
opts.EmptyLineRule = "read";

% Specify variable properties


opts = setvaropts(opts, "Name", "WhitespaceRule", "preserve");
opts = setvaropts(opts, "Name", "EmptyFieldRule", "auto");
opts = setvaropts(opts, ["No", "Matrik", "MANUAL1", "MANUAL2", "MANUAL3",
"MANUAL4", "CAD1", "CAD2", "CAD3", "CAD4", "TEST1Q1", "TEST1Q2", "TEST2Q1",
"TEST2Q2", "TEST2Q3", "TEST2Q4", "PROJECTASEMBLYDRAWING", "PROJECTPARTDRAWING",
"PROJECTMODERNTOOLS"], "FillValue", 0);

% Import the data


Marks = readtable("C:\Users\weika\OneDrive\Desktop\Matlab project\Marks.dat.txt",
opts);
end

function[sortname]=sort_by_name(Marks)
sortname=sortrows(Marks,'Name');
end
function[sortMatrik]=sort_by_id_number(Marks)
sortMatrik=sortrows(Marks,'Matrik','descend');
end

13
function[]=write_database_to_file(Name,Matrik,Final_Assignment,Final_Marks)
fid=fopen("OutputMarks.txt",'a');
fprintf(fid,'Name\tID_Number\tAssignment_Average\tExam_Average\n');
for i=1:30
fprintf(fid,'%s\t%s\t%f\t%f\n',Name(i),Matrik(i),Final_Assignment(i),Final_Marks(i
));
end
fprintf(fid,'\n\n');
fclose(fid);
end

Reference

1. Execute statements if condition is true - MATLAB if elseif else. (n.d.-a).

Www.mathworks.com. https://www.mathworks.com/help/matlab/ref/if.html

2. for loop to repeat specified number of times - MATLAB for. (n.d.-a).

Www.mathworks.com. https://www.mathworks.com/help/matlab/ref/for.html

3. Horizontal bar graph - MATLAB barh. (n.d.-a). Www.mathworks.com. Retrieved

January 31, 2023, from https://www.mathworks.com/help/matlab/ref/barh.html

4. Sort rows of matrix or table - MATLAB sortrows. (n.d.-a). Www.mathworks.com.

Retrieved January 31, 2023, from

https://www.mathworks.com/help/matlab/ref/double.sortrows.html

14

You might also like