Project 2 of Programming Engineering
Project 2 of Programming Engineering
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.
- 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%)
- Project — 30%
2
ALGORITHM
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()
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.
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);
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);
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
Www.mathworks.com. https://www.mathworks.com/help/matlab/ref/if.html
Www.mathworks.com. https://www.mathworks.com/help/matlab/ref/for.html
https://www.mathworks.com/help/matlab/ref/double.sortrows.html
14