Está en la página 1de 10

Ejercicio resuelto

Instituto de enseñanza
Un instituto de enseñanza, enfocado a cursos de capacitación de diferentes
especialidades, nos ha convocado para desarrollar un sistema que gestione los
mismos.

El instituto cuenta con un plantel de docentes de los cuales se conoce: dni, nombre,
apellido, telefono y una especialidad.

De los alumnos que asisten al instituto se conoce: dni, nombre, apellido, telefono y
fecha de inscripcion al instituto.

El instituto dicta cursos de capacitación que pueden ser presenciales o on-line. Los
cursos tienen los siguientes datos:

● Identificador. (Número entero autoincremental asignado por el sistema)


● Titulo.
● Descripción.
● Especialidad.
● Día cursado. (cada curso se dicta en un único día a la semana)
● Costo.
● Docente (cada curso tiene un único docente asignado)
● Alumnos

Los cursos presenciales tienen un costo extra por materiales, diferente para cada
curso. En cada clase el docente entrega los materiales a utilizar a los alumnos. Este
costo extra se cobra una única vez al inscribirse el alumno al curso. De esta manera el
total del costo de los cursos presenciales se compone de la suma del costo del curso
más el costo de los materiales.

Los cursos on-line tienen una cantidad de entregas que realizar. Cada entrega tiene un
costo adicional que es igual para todos los cursos on-line. El costo por entrega se
calcula multiplicando la cantidad de entregas que tiene el curso por el costo adicional.
De esta manera el total del costo de los cursos on-line se compone de la suma del
costo del curso más el monto por la cantidad de entregas que haya que realizar en el
curso.

Cuando un alumno se inscribe a un curso, se le pregunta en que especialidad quiere


capacitarse y se le muestran los diferentes cursos que hay disponibles, junto con el
costo total que tiene. Si está de acuerdo con alguno de los cursos mostrados, el
alumno proporciona su dni, si no existe en el sistema debe ser dado de alta en ese
momento.

Se pide:

1. Desarrollar el diagrama de clases completo indicando: clases, subclases,


variables de instancia, variables de clase, métodos de instancia, métodos de
clase, relaciones de ensamble y de herencia que considere necesarios para
resolver el problema.
2. Codificar en lenguaje Smalltalk el programa principal y los métodos necesarios
para:
1. Creación de un curso. Se debe tener en cuenta que el docente asignado
al mismo debe poseer la misma especialidad que la del curso.
2. Inscripción de un alumno a un curso.
Diagrama de Clases
Browser de Clases
Object subclass: #Persona
instanceVariableNames: 'dni nombre apellido telefono'
classVariableNames: ''
poolDictionaries: ''
category: ''

Browser de Clases
Persona subclass: #Docente
instanceVariableNames: 'especialidad'
classVariableNames: ''
poolDictionaries: ''
category: ''

Browser de Clases
Persona subclass: #Alumno
instanceVariableNames: 'fechaInscripcion'
classVariableNames: ''
poolDictionaries: ''
category: ''

Browser de Clases
Object subclass: #Curso
instanceVariableNames: 'id titulo descripcion especialidad
diaCursado costo docente alumnos'
classVariableNames: 'UltimoId'
poolDictionaries: ''
category: ''

Browser de Clases
Curso subclass: #CursoPresencial
instanceVariableNames: 'costoMateriales'
classVariableNames: ''
poolDictionaries: ''
category: ''
Browser de Clases
Curso subclass: #CursoOnline
instanceVariableNames: 'cantidadEntregas'
classVariableNames: 'CostoEntrega'
poolDictionaries: ''
category: ''

Browser de Clases
Cliente subclass: #Instituto
instanceVariableNames: 'docentes alumnos cursos'
classVariableNames: ''
poolDictionaries: ''
category: ''
#Instituto

Métodos de instancia

#altaCurso
| tipo curso |
[ curso isNil ] whileTrue: [
tipo := Prompter prompt: ‘Ingrese el tipo de curso a crear (1) Presencial,
(2) Online’.
tipo = ‘1’ ifTrue: [ curso := CursoPresencial new].
tipo = ‘2’ ifTrue: [ curso := CursoOnline new].
].
curso cargaDatos.

[ doc := self buscaDocente.


doc isNil or: [doc especialidad =~ curso especialidad] whileTrue.

curso docente: doc.


cursos add: curso.

#buscaDocente
|dni doc |
dni := Prompter prompt: ‘Ingrese dni del docente’.
doc := docentes detect: [:unDocente | unDocente dni = dni ] ifNone: [nil].
^ doc

#inscripcionCurso
| esp cursosEncontrados |
esp := Prompter prompt: ‘Ingrese la especialidad del curso a inscribirse’.
cursosEncontrados = cursos select: [:unCurso | unCurso especialidad = esp ].

Transcript show: ‘Cursos para la especialidad: ‘, esp; cr.


Transcript
show: ‘Identificador’; tab;
show: ‘Titulo’; tab;
show: ‘Dia Cursado’; tab;
show: ‘Costo’; tab;
show: ‘Docente’; tab;
show: ‘Tipo curso’; cr.
cursosEncontrados do: [:unCurso |
Transcript
show: unCurso id printString; tab;
show: unCurso titulo; tab;
show: unCurso diaCursado; tab;
show: unCurso costoTotal printString; tab;
show: unCurso docente nombreYApellido; tab;
show: unCurso tipo; cr.
],
cur := self buscarCurso.
alu := self buscarOCrearAlumno.
cur inscribirAlumno: alu.

#buscarCurso
| cur id
[ cur isNil ] whileTrue: [
id := (Prompter prompt: ‘Ingrese Identificador del curso) asNumber.
cur := cursos detect: [:unCurso | unCurso id = id ] ifNone: [ nil ]
].
^ cur

#buscarOCrearAlumno
|dni alu |
dni := (Prompter prompt: ‘Ingrese DNI del alumno’) asNumber.
alu := alumnos detect: [:unAlumno | unAlumno dni = dni ] ifNone: [nil].
alu isNil ifTrue: [ alu := self nuevoAlumno ].
^ alu

#nuevoAlumno
|alu|
alu := Alumno new.
alu cargaDatos.
alumnos add: alu.
^ alu
#Curso

Métodos de clase
#incrementaUltimoId
UltimoId := UltimoId + 1

Métodos de instancia
#inicializa
alumnos := OrderedCollection new.

#cargaDatos
id := UltimoId.
Curso incrementaUltimoId.
titulo := Prompter prompt: ‘Ingrese titulo’.
descipcion := Prompter prompt: ‘Ingrese descripcion’.
especialidad := Prompter prompt: ‘Ingrese la especialidad’.
diaCursado := Prompter prompt: ‘Ingrese el dia de cursado’.
costo := (Prompter prompt: ‘Ingrese el costo’) asNumber.

#docente: unDocente
docente := unDocente

#inscribirAlumno: unAlumno
alumnos add: unAlumno

#especialidad
^ especialidad

#titulo
^ titulo

#diaCursado
^ diaCursado

#id
^ id

#docente
^ docente
#CursoPresencial

Métodos de instancia
#cargaDatos
super cargaDatos.
costoMateriales := (Prompter prompt: ‘Ingrese el costo por materiales’)
asNumber.

#tipo
^ ‘Curso presencial’

#costoTotal
^ costo + costoMateriales

#CursoOnline

Métodos de instancia
#cargaDatos
super cargaDatos.
cantidadEntregas := (Prompter prompt: ‘Ingrese la cantidad de entregas a
realizar’) asNumber.

#tipo
^ ‘Curso on-line’

#costoTotal
^ costo + (cantidadEntregas * CostoEntregas)
#Persona

Métodos de instancia
#cargaDatos
dni := Prompter prompt: ‘Ingrese el DNI.
nombre := Prompter prompt: ‘Ingrese nombre’.
apellido := Prompter prompt: ‘Ingrese apellildo’.
telefono := Prompter prompt: ‘Ingrese telefono’.

#dni
^ dni

#nombreYApellido
^ nombre, ‘ ‘, apellido

#Docente

Métodos de instancia
#cargaDatos
super cargaDatos.
especialidad := Prompter prompt: ‘Ingrese especialidad’.

#especialidad
^ especialidad

#Alumno

Métodos de instancia
#cargaDatos
super cargaDatos.
fechaInscripcion := Date today.

#fechaInscripcion
^ fechaInscripcion

También podría gustarte