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