function [GRADES] = grade_generator(n, mood, fail, accuracy) %UNTITLED Summary of this function goes here % Detailed explanation goes here % % Variables used: % n: number of students % mood: [1 or 2] % fail: failing rate (0 1) % accuracy: Enter the desired accuracy of grades [0.5 0.25 0.1] if n>1000 | n<0 disp('**** *** You can impossibly teach so many students. n is set to 100.'); disp('****') n = 100; end if mood>2 | mood<1 disp('**** *** Your mood does not exist. I assume you have a sunny day.'); disp('****') mood=1; end if fail>1 | fail<0 disp('**** *** Focus! You cannot have a rate which is larger than one or smaller than zero! Fail is set to 0.25'); disp('****') fail=0.25; end skewlarge = 1.7; % skewness parameter skewsmall = 1.3; % skewness parameter n = round(n); nfail = round(fail*n); npass = n-nfail; GRADES = zeros(n,1); %%%%%%%%%%%%%%%%%%%% %%%% mood = 1 %%%% %%%%%%%%%%%%%%%%%%%% if mood==1 %%%%%%%% good mood for i=1:npass % passing part if accuracy==0.5 GRADES(i,1)=abs(randn)*skewlarge+3.751; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.25 GRADES(i,1)=abs(randn)*skewlarge+3.8751; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.1 GRADES(i,1)=abs(randn)*skewlarge+3.951; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if GRADES(i,1)>6 GRADES(i,1)=6; end if GRADES(i,1)<4 GRADES(i,1)=4; end end for i=npass+1:n %failing part if accuracy==0.5 GRADES(i,1)=-abs(randn)/skewsmall+3.74999; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.25 GRADES(i,1)=-abs(randn)/skewsmall+3.874999; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.1 GRADES(i,1)=-abs(randn)/skewsmall+3.94999; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if GRADES(i,1)<1 GRADES(i,1)=1; end end end %%%%%%%%%%%%%%%%%%%% %%%% mood = 2 %%%% %%%%%%%%%%%%%%%%%%%% if mood==2 % bad mood for i=1:npass % passing part if accuracy==0.5 GRADES(i,1)=abs(randn)/skewsmall+3.751; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.25 GRADES(i,1)=abs(randn)/skewsmall+3.8751; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.1 GRADES(i,1)=abs(randn)/skewsmall+3.951; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if GRADES(i,1)>6 GRADES(i,1)=6; end if GRADES(i,1)<4 GRADES(i,1)=4; end end for i=npass+1:n %failing part if accuracy==0.5 GRADES(i,1)=-abs(randn)*skewsmall+3.74999; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.25 GRADES(i,1)=-abs(randn)*skewsmall+3.874999; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if accuracy==0.1 GRADES(i,1)=-abs(randn)*skewsmall+3.94999; GRADES(i,1)=round(GRADES(i,1)/accuracy)*accuracy; end if GRADES(i,1)<1 GRADES(i,1)=1; end end end Mean_grade = sum(GRADES)/n; % somehow, the mean() command won't work here Failingrate = round(nfail/n/0.01)*0.01; disp('****') disp('**** HEUREKA! Your grades:') disp('****') disp('Mean:') disp(Mean_grade) disp('Failing rate:') disp(Failingrate) x=(1:accuracy:6); histo=hist(GRADES,x); scrsz = get(0,'ScreenSize'); f=figure('Position',[scrsz(3)*0.47 scrsz(4)*0.1 scrsz(3)/2 scrsz(4)/2],'Name','Histogram'); hist(GRADES,x) axis([1-accuracy/2 6+accuracy/2 0 max(histo)]); xlabel('Grade'); ylabel('Density'); title1=title('Distribution of Grades'); set(title1,'FontWeight','bold') saveas(f,'histogram.fig') saveas(f,'histogram.jpg') end