const
MAX_STUDENTS: integer = 20; {Max. number of students}
NUM_ACTIVITIES: integer = 7; {Max. number of activities of the subject}
NUM_CAA_ACTIVITIES: integer = 4; {Number of CAA activities}
NUM_PR_ACTIVITIES: integer = 3; {Number of PR activities}
MIN_C_MINUS: real = 3.0; {Minimum mark for grade C-}
MIN_C_PLUS: real = 5.0; {Minimum mark for grade C+}
MIN_B: real = 7.0; {Minimum mark for grade B}
MIN_A: real = 9.0; {Minimum mark for grade A}
CAA1_WEIGHT: integer = 10; {Percent weight of CAA1 in EC grade}
CAA2_WEIGHT: integer = 20; {Percent weight of CAA2 in EC grade}
CAA3_WEIGHT: integer = 30; {Percent weight of CAA3 in EC grade}
CAA4_WEIGHT: integer = 40; {Percent weight of CAA4 in EC grade}
PR1_WEIGHT: integer = 20; {Percent weight of PR1 in PR grade}
PR2_WEIGHT: integer = 30; {Percent weight of PR2 in PR grade}
PR3_WEIGHT: integer = 50; {Percent weight of PR3 in PR grade}
end const
type
{User defined types}
tGrade = {A, B, C_PLUS, C_MINUS, D}
tActivityType = {CAA, PR}
tActivityName = {CAA1, CAA2, CAA3, CAA4, PR1, PR2, PR3}
tActivityState = {SUBMITTED, NOT_SUBMITTED, EXCLUDED}
tActivity = record
name: tActivityName; {Activity Name}
state: tActivityState; {Activity State}
mark: real; {Activity Mark}
end record
tStudent = record
studentId: integer; {Student ID}
name: string;{Student Name}
activities: vector[NUM_ACTIVITIES] of tActivity; {Student Activities}
end record
tStudentsTable = record
students: vector[MAX_STUDENTS] of tStudent; {Students info and grades}
nStudents: integer; {Number of students}
end record
end type
{Exercise 1}
{Acción parcialmente desarrollada. Hay que completarla, según las instrucciones del enunciado de la
PR3}
action studentsLoadDataFromFile(in filename: string, out studentsTable: tStudentsTable, out isRead:
boolean)
var
fileToRead : file;
newStudent: tStudent;
i: integer;
end var
fileToRead := openFile(filename);
if fileToRead ≠ NULL then
{Initializations}
[Link]:=0;
while not isEndOfFile(fileToRead) and [Link] <= MAX_STUDENTS do
[Link] := readIntegerFromFile(fileToRead);
[Link] := readStringFromFile(fileToRead);
for i := 1 to NUM_ACTIVITIES do
{Read mark and activity state}
[Link][i].mark := readRealFromFile(fileToRead);
[Link][i].state := readEnumFromFile(fileToRead);
{Assign activity name}
if i:= 1
[Link][i].name = 'CAA1';
else if i:=2
[Link][i].name = 'CAA2';
else if i := 3
[Link][i].name = 'CAA3';
else if i := 4
[Link][i].name = 'CAA4';
else if := 5
[Link][i].name = 'PR1';
else if i := 6
[Link][i].name = 'PR2';
else if i := 7
[Link][i].name = 'PR3';
end for
{Add newStudent to studentsTable }
[Link][nStudents] := newStudent
[Link] := [Link] + 1;
end while
closeFile(fileToRead);
isRead := true;
else
isRead := false;
end if
end action
{Exercise 2}
action calcularNotaFinal(in student: tStudent, out notaTotalCaa: real, out notaTotalPr: real )
var
i: integer;
notaTotalCaa: real;
notaTotalPr: real;
end var
i := 0
notaTotalCaa := 0.0;
notaTotalPr := 0.0;
{ Identificar si es SUBMITTED, ya que de lo contrario las notas no se suman }
for i := 1 to NUM_ACTIVITIES do
if [Link][i].state = SUBMITTED then
{identificar el tipo de actividad y acumular notas}
if [Link][i].name = CAA1 or [Link][i].name = CAA2 or
[Link][i].name = CAA3 or [Link][i].name = CAA4 then
notaTotalCaa := notaTotalCaa + [Link][i].mark
else
notaTotalPr := notaTotalPr + [Link][i].Mark
end if
end if
end for
{ calcular el promedio para CAA y PR }
notaTotalCaa := notaTotalCaa / 4;
notaTotalPr := notaTotalPr / 3;
end action
{Exercise 3}
action returnActivityTypeAndWeight(activity: tActivity, out activityType: tActivityType, out weight: integer)
if [Link] = CAA1 then
activityType := CAA;
weight := CAA1_WEIGHT;
else if activityType = CAA2 then
activityType := CAA;
weight := CAA2_WEIGHT;
else if activityType = CAA3 then
activityType := CAA;
weight := CAA3_WEIGHT;
else if activityType = CAA4 then
activityType := CAA;
weight := CAA4_WEIGHT;
else if activityType = PR1 then
activityType := PR;
weight := PR1_WEIGHT;
else if activityType = PR2 then
activityType := PR;
weight := PR2_WEIGHT;
else if activityType = PR3 then
activityType := PR;
weight := PR3_WEIGHT;
end if
end action
{Exercise 4}
action activitiesSubmittedByStudents(in student: tStudent, out nCaa: integer, out nPr)
var
i: integer
nCaa: integer;
nPr: integer;
end var
nCaa := 0;
nPr := 0;
{iterar sobre las actividades CAA (de la 1 a 4)}
for i := 1 to NUM_CAA_ACTIVITIES do
if [Link][i].name = CAA1 or if [Link][i].name = CAA2_WEIGHT
or if [Link][i].name = CAA3 or if [Link][i].name = CAA4 then
nCaa := nCaa + 1;
end if
end for
{iterar sobre las actividades PR (de la 5 a la 7)}
for i := NUM_CAA_ACTIVITIES to NUM_ACTIVITIES do
if [Link][i].name = PR1 or if [Link][i].name = PR2
or if [Link][i].name = PR3 then
nPr := nPr + 1;
end if
end ofr
end action
{Exercise 5}
{Acción parcialmente desarrollada. Hay que completarla, según las instrucciones del enunciado de la
PR3}
action writeStudentData(in student: tStudent, in markCaa: float, in markPr: float, in nCaa: integer, in nPr:
integer)
var
allPrSubmitted: boolean;
end var
allPrSubmitted := everythingSubmitted(student);
writeInteger([Link]);
writeString(" ");
writeString([Link]);
writeString(" ");
writeReal(markCaa);
writeString(" ");
writeReal(markPr);
writeString(" ");
writeInteger(nCaa);
writeString(" ");
writeInteger(nPr);
if allPrSubmitted then
writeInteger(1);
else
writeInteger(0);
end if
writeString("\n");
end action
{Exercise 6}
boolean everythingSubmitted(student: tStudent)
var
i: integer;
end var
i := 0;
for i := 1 to NUM_ACTIVITIES do
if [Link][i].name = PR and [Link][i].state != SUBMITTED then
return false;
end if
end for
return true;
end function;
algorithm UOCSubjectGrade
var
studentsTable: tStudentsTable;
i: integer;
filename: string;
isRead: boolean;
end var
{Load data from file}
writeString("LOAD DATA FROM FILE. ENTER FILE NAME >>");
filename := readString();
{Exercise 1}
studentsLoadDataFromFile(filename, studentsTable, isRead);
if isRead then
writeString(“RESULTS:”);
writeString(“ID NAME PEC_MARK PR_MARK N_PEC N_PR ALL_PR?(1=YES)”);
for i := 1 to MAX_STUDENTS do
{Exercise 2}
calcularNotaFinal([Link][i], notaTotalCaa, notaTotalPr)
{Exercise 4}
activitiesSubmittedByStudents([Link][i])
{Exercise 5}
writeStudentData([Link][i], notaTotalCaa, notaTotalPr, nCaa, nPr)
end for
else
writeString("NO STUDENTS RECOVERED");
end if
end algorithm