Fundamentos de Programación
PR2 - 20241
Fecha límite de entrega: 27/11/2024 a las 23:59
Enunciado
Esta práctica tiene tres partes (algoritmo, programa y proceso). Las tres son obligatorias.
1a. parte. Algoritmo.[70%].
Dadas las notas de las actividades de evaluación continua de los estudiantes de una
asignatura (cuatro PEC (CAA en inglés) y tres PR), completar el diseño de un algoritmo
en pseudocódigo que calcula su calificación final de la asignatura. Y que, además,
muestra el detalle de las notas de un estudiante en concreto. El algoritmo:
● Lee por teclado el nombre del fichero donde están las notas de las actividades de
cada estudiante. Se han entregado todas las PEC y tienen nota.
● Lee los datos del fichero de notas. Utilizar la acción predefinida
studentsLoadDataFromFile (no hay que diseñarla ni implementarla, se puede usar
igual que se utiliza sin diseñar ni implementar, por ejemplo, readChar()). En este
caso, recibe como parámetro de entrada el nombre del fichero (que le pasamos en
la variable filename) y devuelve un vector (variable students) con las notas de los
estudiantes, el número de estudiantes (variable studentCount) y un booleano
(variable isRead) que indica si se ha producido un error al leer el fichero o no. El
algoritmo de partida incluye la llamada: studentsLoadDataFromFile(filename,
students, studentCount, isRead);
● Para cada estudiante:
○ [Ejercicio 1] Calcula su nota final numérica de EC con una precisión de dos
decimales (media ponderada de las notas de cada una de las siete
actividades) teniendo en cuenta que cada PEC tiene un peso del 10% en la
nota final y cada PR un peso del 20%. Para hacerlo hay que diseñar y
utilizar una nueva función.
○ [Ejercicio 2] Convierte la nota numérica final de EC a la correspondiente nota
cualitativa (letra A, B, C+, C- o D). Para hacerlo hay que diseñar y utilizar
una nueva función.
○ [Ejercicio 3] Muestra por pantalla, el identificador del estudiante, su nombre y
su calificación final de la asignatura (nota numérica y la correspondiente
nota cualitativa). Utilizar la acción predefinida writeStudentData (no hace
falta diseñarla ni implementarla). En este caso, recibe como parámetro de
1
entrada una variable de tipo tStudent, su nota final numérica (variable mark)
y su nota final en letra (variable grade) y escribe por pantalla el identificador,
el nombre del estudiante, su nota final numérica y en letra). La llamada a la
acción se realiza así: writeStudentData(students[i], mark, grade);
● Lee por teclado el identificador de un estudiante en concreto.
● [Ejercicio 4] Muestra por pantalla la nota numérica de cada una de las actividades
de ese estudiante, indicando en cada caso si se trata de una PEC o una PR.
Utilizar la acción predefinida writeStudentActivities (no hay que diseñarla ni
implementarla). Recibe como parámetro de entrada una variable de tipo tStudent y
como resultado escribe por pantalla la nota numérica con dos decimales de cada
una de sus actividades junto con el tipo de actividad (1 si se trata de una PEC y 2 si
es una PR). La llamada a la acción se realiza así:
writeStudentActivities(students[i]);
Si el estudiante introducido no está en el fichero, debe mostrarse por pantalla el
mensaje “STUDENT NOT FOUND”.
La estructura del algoritmo, así como algunas de las funciones y acciones, ya están
declaradas y deben ser el punto de partida para la resolución.
Pseudocódigo de partida
const
MAX_STUDENTS: integer = 20; {Max. number of students}
NUM_ACTIVITIES: integer = 7; {Max. number of activities of the subject}
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}
CAA_WEIGHT: integer = 10; {Percent weight of each CAA in the final grade}
PR_WEIGHT: integer = 20; {Percent weight of each PR in the final grade}
end const
type
{User defined types}
tGrade = {A, B, C_PLUS, C_MINUS, D}
tActivityType = {CAA, PR}
tActivity = record
activityMark: real; {Activity Mark}
activityType: tActivityType; {Activity Type}
end record
tStudent = record
studentId: integer; {Student ID}
name: string; {Student Name}
activities: vector [NUM_ACTIVITIES] of tActivity; {Student Activities}
end record
2
end type
{Exercise 1}
{...}
{Exercise 2}
{...}
algorithm UOCSubjectGrade
var
students: vector [MAX_STUDENTS] of tStudent;
studentCount, i, studentId: integer;
filename: string;
mark: real;
grade: tGrade;
isRead, found: boolean;
end var
{Load data from file}
writeString("LOAD DATA FROM FILE. ENTER FILE NAME >>");
filename := readString();
studentsLoadDataFromFile(filename, students, studentCount, isRead);
if isRead then
{Exercise 3}
writeString("RESULTS:");
{...}
{Exercise 4}
writeString("SELECT STUDENT BY ID >>");
studentId := readInteger();
{Search student by ID}
{...}
else
writeString("NO STUDENTS RECOVERED");
end if
end algorithm
Ejemplos de ejecución
Ejemplo 1
LOAD DATA FROM FILE. ENTER FILE NAME >>
[Link]
RESULTS:
14 ALAN_TURING 10.00 A
7 ADA_LOVELACE 6.27 C+
9 ANDREW_TANENBAUM 8.15 B
17 BRIAN_KERNIGHAN 7.20 B
13 DENNIS_RITCHIE 5.09 C+
1 DONALD_KNUTH 5.46 C+
4 GRACE_HOPPER 7.35 B
3 JEAN_LAURENT 5.87 C+
6 JOHN_VON_NEUMANN 5.92 C+
3
8 KATHERINE_JOHNSON 2.66 D
15 LARRY_PAGE 5.68 C+
19 LINUS_TORVALDS 3.87 C-
18 MARISSA_MAYER 5.23 C+
10 RADIA_PERLMAN 5.59 C+
2 RICHARD_STALLMAN 6.56 C+
11 SERGEY_BRIN 6.40 C+
5 SHERYL_SANDERG 3.49 C-
20 SUNDAR_PICHAI 5.47 C+
16 TIM_BERNERS_LEE 8.01 B
12 VINT_CERF 5.00 C+
SELECT STUDENT BY ID >>
7
GRADE ACTIVITY (1-CAA, 2-PR)
9.40 1
4.30 2
8.80 1
8.40 2
9.60 1
0.40 2
8.70 1
Ejemplo 2
LOAD DATA FROM FILE. ENTER FILE NAME >>
[Link]
RESULTS:
1 DONALD_KNUTH 5.46 C+
2 RICHARD_STALLMAN 6.56 C+
3 JEAN_LAURENT 5.87 C+
4 GRACE_HOPPER 7.35 B
5 SHERYL_SANDERG 3.49 C-
6 JOHN_VON_NEUMANN 5.92 C+
7 ADA_LOVELACE 6.27 C+
8 KATHERINE_JOHNSON 2.66 D
9 ANDREW_TANENBAUM 8.15 B
10 RADIA_PERLMAN 5.59 C+
11 SERGEY_BRIN 6.40 C+
12 VINT_CERF 5.00 C+
13 DENNIS_RITCHIE 5.09 C+
14 ALAN_TURING 10.00 A
15 LARRY_PAGE 5.68 C+
16 TIM_BERNERS_LEE 8.01 B
17 BRIAN_KERNIGHAN 7.20 B
18 MARISSA_MAYER 5.23 C+
19 LINUS_TORVALDS 3.87 C-
20 SUNDAR_PICHAI 5.47 C+
SELECT STUDENT BY ID >>
22
STUDENT NOT FOUND
2a. parte. Código y pruebas. [30%].
Codificar en lenguaje C el algoritmo diseñado anteriormente, ejecutarlo y probarlo hasta
asegurar que funciona correctamente diseñando los casos de prueba necesarios.
4
Ejecutar y superar los juegos de prueba automáticos disponibles en la herramienta DSLab.
3a. parte. Proceso de resolución.
Explicar el proceso seguido para solucionar la PR2, mediante la grabación de un vídeo
corto (máximo 2 minutos, pero menos de un minuto sería ideal) en el que documentéis cómo
habéis resuelto esta práctica.
Este vídeo es una prueba de la autoría de vuestro ejercicio, y lo revisaremos solo en
caso de que haya dudas al respecto. Por lo tanto, el vídeo debe mostraros a vosotros
explicando cómo habéis seguido el proceso que os sugerimos: primero diseñar el
algoritmo en pseudocódigo, después codificar el programa y probarlo e iterar estos pasos
hasta que el resultado sea correcto y responda al problema que plantea el enunciado.
Queremos que nos expliquéis cómo habéis pensado en el esquema de la solución. ¿Ha
habido algo que os ha costado entender o que no teníais claro cómo resolver? ¿Qué
pasos habéis hecho para convertir el algoritmo en un código C, con qué dificultades os
habéis encontrado, y cómo las habéis resuelto? Y también qué herramientas habéis
usado para codificar el algoritmo y probar el programa, qué pruebas habéis hecho, cómo
las habéis pensado, qué tipo de errores habéis encontrado al compilar y cómo los habéis
resuelto. Y finalmente, qué es lo que os ha costado más, qué unidades de los recursos
habéis consultado en cada paso, si habéis consultado al profesorado, en los foros, etc. No
se trata de que leáis y expliquéis el código, esto ya lo podemos ver en el algoritmo y el
programa. Queremos que nos dejéis claro que el ejercicio lo habéis hecho vosotros.
Es imprescindible entregar las tres partes de la práctica para que se corrija.