Vous êtes sur la page 1sur 10

Enseando programacin con C++: una propuesta didctica

Jorge Daz
Universidad de Oriente, Departamento de Computacin, Santiago de Cuba 90500, Cuba
jdiaz@csd.uo.edu.cu

Resumen: Se hace un anlisis crtico acerca de las caractersticas del lenguaje C++ con vistas a su utilizacin como
lenguaje en una primera asignatura de programacin de alto nivel orientada a objetos y se expone una metodologa
para impartir tal asignatura, la cual incluye una seleccin y secuencia de los contenidos que hacen ms viable el uso
del lenguaje en la enseanza de la programacin y que ha arrojado resultados superiores en cuanto al aprendizaje de
los estudiantes.
Palabras clave: lenguajes de programacin, orientacin a objetos, enseanza de la programacin
Abstract: A critical analysis about the characteristics of the programming language C++, regarding its use in a first
course of high level programming, is made. It is exposed a methodology for teaching this course using of a fruitful
way this language.
Key words: programming languages, object oriented, programming teaching.
1. Introduccin
Siempre ha resultado un dilema la seleccin de cul
debe ser el lenguaje que de entrada usaremos para
ensear a los estudiantes sus primeros conceptos de
programacin, mxime cuando el proceso evolutivo
de la rama es extremadamente rico y rpido.
Diferentes lenguajes se han usado en un primer
curso de programacin, podemos citar Pascal, Ada,
Modula, C, C++, C#, Java.
Los criterios de seleccin no se desligan de las
necesidades de programacin del sector industrial,
cientfico y empresarial, los cuales, en muchos
casos, gravitan en aplicaciones que usan el C/C++
como lenguaje de trabajo, lo cual tiene su influencia
a la hora de decidir cul ser el lenguaje bsico de

partida, con vistas a acortar el trayecto entre


aprendizaje y empleo. De hecho, en (Tonella, 2002)
se expresa la conveniencia de adoptar ciertas reglas
que permitan continuar usando el lenguaje C++ en
el desarrollo de sistemas, fundamentalmente donde
la introduccin del Java an no parece adecuada.
Es bien sabido que el lenguaje C++ presenta ciertos
problemas que de entrada no lo hacen aparecer un
buen candidato para comenzar los estudios de la
programacin, tal y como se analiza en (Kolling,
1999), an as es elegido en una parte no
despreciable de cursos universitarios del rea
informtica.

__________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

12

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

Los propsitos de un primer curso de programacin


deben concentrarse en ofrecer a los estudiantes:
Conocimientos
de
los
conceptos
de
programacin y un vocabulario para discutirlos;
Habilidades de anlisis y de programacin;
Un marco de referencia para la teora y
disciplina de la programacin.
Debemos asegurarnos que los estudiantes aprenden
a programar, en vez de aprender un lenguaje de
programacin.
De otro lado, la mayora de los textos de
programacin prestan en general poca atencin a
principios didcticos, presentando los contenidos en
un orden conceptual y prestando poca atencin a los
principios metodolgicos de solucin de problemas
o cuestiones de depuracin de los errores, que son
reas probadamente problemticas para los novicios
en la programacin.
Es por ello que nos proponemos hacer una reflexin
crtica de cmo emplear en lenguaje de
programacin C++ dentro de un primer curso de
programacin en ambientes donde por cuestiones de
diversa ndole se insista o aconseje su empleo y
consecuentemente dar una metodologa de
enseanza en que an empleando el lenguaje C++
podamos alcanzar los objetivos formativos de
programacin para los estudiantes que reciben por
primera vez la asignatura de programacin, basada
en el enfoque orientado a objetos, de tal forma que
podamos usar de una manera didctica y sistmica
los libros de textos del lenguaje existentes.

2. Requerimientos para un primer


lenguaje de programacin orientado a
objetos
Presentamos a continuacin algunas caractersticas
que son deseables en un lenguaje usado en un
primer curso de programacin, siguiendo las ideas
de (Kolling, 1999), junto con un anlisis crtico de
la caracterstica para el lenguaje C++:
1. Claridad conceptual: Los conceptos del lenguaje
deben ser claros, fciles de comprender y bien
definidos. Esos conceptos deben ser representados
de la misma manera en que queremos expresarlos
cuando los enseamos. La implementacin del
lenguaje debe reflejar el nivel de abstraccin que
queremos usar en nuestros modelos conceptuales.
Un lenguaje de programacin proporciona a la vez
un marco conceptual para pensar acerca de los

algoritmos y un medio de expresar esos algoritmos.


El lenguaje debe constituir una ayuda para el
programador incluso antes de la etapa misma de
codificacin. Debe proveer un conjunto claro,
sencillo y unificado de conceptos que se puedan
usar como primitivas en el desarrollo de algoritmos.
2. Modelo puro de objetos: El lenguaje debe exhibir
orientacin a objetos pura, en el sentido de no
poseer estructuras alternativas para construir
objetos, sino slo la abstraccin bsica usada para la
programacin, en contraposicin con lenguajes
hbridos, o sea, lenguajes que soportan la
orientacin a objetos junto con otros paradigmas no
orientados a objetos.
3. Seguridad: Los errores deben ser fcilmente
detectables lo ms tempranamente posible por el
compilador o el sistema de tiempo de ejecucin y
ser reflejados con mensajes que ilustren su causa.
Deben evitarse conceptos conducentes a la escritura
de programas errneos. Debe tener un sistema de
tipos con chequeo fuertemente esttico, evitar
punteros explcitos, hacer chequeos de lmites de los
ndices de los arreglos y uso de variables no
inicializadas.
4. Alto nivel: El lenguaje no debe contener
informacin concerniente al bajo nivel de mquina,
como por ejemplo, administracin explcita de
almacenamiento dinmico y debe proveer una
coleccin de basura automtica.
5. Modelo sencillo de ejecucin y de representacin
de los objetos de datos: Debe poseer un modelo de
ejecucin bien definido y fcilmente comprensible.
Debe ser transparente al programador el modelo de
memoria adoptado para los objetos de datos que se
manipulan, sean del stack o del heap.
6. Sintaxis legible: El lenguaje debe poseer una
sintaxis consistente y fcilmente legible. Un
programa legible es ms fcil de corregir. Las
palabras son ms intuitivas, en muchos casos, que
los smbolos para expresar las construcciones del
lenguaje.
7. No ser redundante: El lenguaje debe constar de
pocas construcciones, debe ser claro y evitar
redundancias. Para los principiantes la flexibilidad
que puede aportar la redundancia se convierte a
menudo en confusin, ms que en eficiencia.
8. Pocas construcciones: El lenguaje debe ser tan
corto como sea posible, siempre que incluya todas

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

13

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

las caractersticas importantes que desean ensearse


en un curso de programacin para un primer ao.

una construccin del lenguaje, como, por ejemplo,


cuando se manipula la aritmtica de punteros.

9. Fcil transicin a otros lenguajes: El aprendizaje


del lenguaje debe facilitar una fcil transicin a
otros lenguajes ampliamente usados, como C/C++.

Modelo puro de objetos: En el lenguaje coexisten


construcciones que facilitan tanto la programacin
procedural como la orientada a objetos, pues en
realidad C++ representa un paradigma hbrido entre
ellos.

10. Facilidades de correccin: El lenguaje debe


suministrar recursos para facilitar la correccin del
programa, como prueba de aserciones, pre y
postcondiciones, depuracin de errores y
manipulador de excepciones.
11. Ambiente de trabajo amigable: El lenguaje debe
poseer un ambiente de desarrollo de fcil uso, que
permita al estudiante concentrarse en las tareas de
aprender los conceptos de programacin en vez del
propio ambiente. La presencia de un ambiente de
programacin adecuado puede facilitar el trabajo
con un lenguaje tcnicamente dbil en comparacin
con un lenguaje ms fuerte con poco apoyo externo.
Estos ambientes deben contar, al menos con
poderosos medios de edicin y desarrollo de
aplicaciones, de una implementacin confiable,
eficiente y bien documentada del lenguaje, as como
recursos para una adecuada depuracin de los
errores en los programas.
Caractersticas como la eficiencia, que es
extremadamente importante para un lenguaje de
programacin en un entorno de produccin de
software, tienen poca significacin en la enseanza.
Tampoco se considera la flexibilidad del lenguaje
para el desarrollo de aplicaciones en tiempo real
(por ejemplo, con operaciones de manipulacin de
bits).

3. Evaluacin crtica del C++


El lenguaje C++ viola casi todos los requerimientos
de la lista anterior. Es un lenguaje hbrido que no
presenta los conceptos de una manera clara, posee
un conjunto de construcciones altamente redundante
y un sistema de tipos inseguro. Analizamos para el
lenguaje cada una de las caractersticas enunciadas
en el epgrafe 2:
Claridad conceptual: Los propsitos principales en
la creacin del C++ fueron mantener una
compatibilidad completa con C y considera la
eficiencia en tiempo y espacio como su meta
principal. De ah que el lenguaje se vea influenciado
por consideraciones de bajo nivel, que separan el
concepto abstracto de su representacin concreta.
En ocasiones es necesario comprender ciertos
detalles de implementacin para usar correctamente

Tratar de introducir la orientacin a objetos usando


lenguajes hbridos tiene el peligro de que los
estudiantes con experiencias anteriores en
programacin en un lenguaje procedural no se
sienten comprometidos con el cambio a un nuevo
estilo.
Seguridad: Una de las crticas ms fuertes que se
hacen al C++ es la falta de un sistema de tipos
seguro. La asignacin de memoria dinmica
explcita, junto con la falta de coleccin de basura,
incrementan los riesgos de errores, tales como
referencias nulas o basura.
Alto nivel: C++ incluye algunos constructores de
bajo nivel, entre ellos las operaciones de
manipulacin de bits, la aritmtica de punteros y la
administracin de almacenamiento dinmico
explcito. Tiene un elemento importante a su favor
para la programacin de alto nivel, que es el soporte
de genericidad, con un chequeo de los tipos
parametrizados en tiempo de compilacin.
Modelo sencillo de representacin y ejecucin de
objetos de datos: El modelo de objetos de datos de
C++ es uno de los ms complejos entre los
lenguajes de programacin que soportan orientacin
a objetos. Ello est motivado en el hecho de que en
C++ aparecen variables dinmicas (usando
punteros) y no dinmicas (automticas), lo que
tambin se refleja en la semntica de algunas
construcciones importantes del lenguaje.
Sintaxis legible: En C++ se favorece el uso de
smbolos en vez de palabras, por ejemplo, empleo
de la llave { en vez de begin, el uso de la misma
palabra clave u operador para diferentes fines, como
la sintaxis de una funcin abstracta virtual void f() =
0; que emplea el operador de asignacin. Todo esto
redunda en una falta de legibilidad de los programas
escritos en el lenguaje.
No redundancia: El hecho de mantener C++ la
compatibilidad con C hace que arrastre ciertos
aspectos redundantes e interacciones de conceptos
que aquejan a este ltimo, lo que incrementa la
complejidad del lenguaje.

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

14

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

Facilidad de transicin a otros lenguajes:


Consideramos que el aprendizaje del lenguaje C++
facilita la comprensin rpida de otros lenguajes de
amplio uso, como el Java. De otro lado, aprender el
lenguaje C++ puede reportar beneficios en el caso
de realizacin de prcticas profesionales
simultneas por parte de los estudiantes en el sector
industrial, que an emplea con frecuencia esquemas
basados en C/C++.
Ayuda a la correccin: No hay en C++ soporte para
pre ni postcondiciones, existiendo una forma de
prueba con aserciones (a travs del assert). Posee un
sistema de manipulacin de excepciones.
Ambiente de trabajo amigable: Para C++ se han
desarrollado muy buenos ambientes de trabajo, que
incluyen herramientas para el desarrollo de
aplicaciones, tales como Visual C++ y Borland C++
Builder.

4. Estrategia pedaggica en el uso de


C++ para la orientacin a objetos en una
primera asignatura de programacin

An cuando un lenguaje hbrido sea una seleccin


de orden prctica, los estudiantes probablemente se
sentirn algo confundidos en el intervalo de tiempo
en que aprenden los conceptos asociados a objetos.
Tomando en cuenta lo arriba planteado y adems el
hecho de que una asignatura de Programacin tiene
otras subsiguientes que complementan lo aprendido
en ella, como lo puede hacer una asignatura de
Estructura
de
Datos,
brindamos
algunas
orientaciones metodolgicas que pueden ser tenidas
en cuenta al momento de impartir la asignatura de
Programacin, a partir de nuestras propias
experiencias (Daz, 2002) y de recomendaciones,
como las encontradas en (Tonella, 2002) para
definir un subconjunto de C++ que se acerque a las
caractersticas de Java. En estas orientaciones
sugerimos un orden en que puede ser impartida la
asignatura.
1.

En lenguajes hbridos para la orientacin a objetos,


como lo es el caso de C++, con la coexistencia para
la programacin estructurada, es comn el uso de
una estrategia pedaggica en la que el concepto de
objeto no se ensee como el primer concepto de la
programacin, sino que algunos otros conceptos,
tales como expresiones e instrucciones del lenguaje
hasta el concepto de tipo de dato abstracto sean
trabajados antes de introducir el concepto de clases
como desarrollo de los tipos de datos abstractos
(TDA).
Este esquema tiene como ventaja que da
continuidad a una forma de aprendizaje que
normalmente traen los estudiantes de la enseanza
media, basado en el desarrollo de algoritmos y la
programacin estructurada. Sin embargo, pueden
sealrsele algunas desventajas:

Uso simultneo de tipos de datos bsicos y de


tipos de objetos y sus incompatibilidades.

Uso de punteros en muchos de los lenguajes


candidatos para ser usados en la enseanza, con
necesidad de derreferenciacin explcita y sin
uso de colectores de basura.

El concepto de tipo de dato abstracto se vuelve


de difcil comprensin, en vez de inmediato y
concreto.

No abandonar a lo largo del curso un estilo de


enseanza de la programacin basada en la
resolucin de problemas, o sea, del problema a
la bsqueda de los algoritmos que le brinden
solucin y de ah a la codificacin del algoritmo
en un lenguaje de alto nivel.
El estudiante debe quedar convencido, desde
que comienza la asignatura, de que su eficacia
como programador no est precisamente en
dominar la herramienta de programacin, cosa
evidentemente necesaria, sino en saber resolver
problemas con la computadora para lo cual se
requiere dominar una metodologa de la
programacin cuyo eje central es el algoritmo.

2.

Continuando la idea de la primera orientacin,


dedicar las primeras semanas de clase al
desarrollo de algoritmos, usando para su
expresin alguna forma de seudocdigo
prxima al lenguaje natural. Cuando se
introduzcan en las caractersticas de un
lenguajes de programacin y se enuncien sus
principales estructuras de control (secuencia,
alternativa y ciclos) y algunos de sus
principales operadores (aritmticos, asignacin,
etc), podemos entonces, adicionalmente,
comenzar a introducirlos en la expresin del
algoritmo usando la forma de codificacin
propia del C++.

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

15

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

3.

Se sugiere usar solamente las operaciones


imprescindibles de estrada/salida, segn el
formato de C++, o sea, usando la clase
<iostream>.

Despus se puede pasar a estudiar la estructura


del programa en C++, donde se introducen las
declaraciones de constantes, definiciones de
variables, caractersticas de algunos tipos
primitivos y se estudian con mayor grado de
formalizacin sintctica y semntica los
operadores y las estructuras de control bsicas
del lenguaje.

Ya en estos momentos deben dedicarse una


cantidad de clases prcticas en laboratorios de
computadoras, de tal forma que los estudiantes
se familiaricen con el ambiente de trabajo del
lenguaje y puedan correr algunos de los
problemas, cuya expresin algortmica dio en
clases anteriores.

Es importante adems estudian los conceptos de


alcance de identificadores y tiempo de vida de
las variables, as como la definicin de espacios
de nombres.
4.
El empleo de los operadores en estas primeras
semanas debe ser lo ms prximo al
conocimiento matemtico previo del estudiante,
por ejemplo, no sera conveniente usar la
asignacin mltiple v = a = b, sino a = b y
despus v = a. Tampoco es recomendable usar
formas de composicin de operadores que sean
oscuras, tales como
x = (y=5) + (z=4),
siendo mejor emplear
y = 5; z = 4; x = y + z.
Aqu ya hay un espacio para las operaciones de
incremento y decremento, los operadores de
asignacin mltiple y compuestos.

Como inmediatamente vamos a proponer el


estudio del concepto de clases, entonces resulta
aconsejable ensear parmetros con valores por
defecto y sobrecarga de funciones.

Sin embargo, no resulta recomendable ensear


en este momento las operaciones de
manipulacin de bits que ofrece en lenguaje, ni
los moldes (casting).
Tampoco es recomendable usar valores
numricos como expresiones lgicas para las
condiciones que controlan las instrucciones de
alternativa (if) o de ciclos. Es sabido que una
expresin aritmtica puede ser considerada en
el lenguaje como un caso particular de una
expresin lgica, que se interpreta como
verdadera si es diferente de cero, o falsa si es
cero, interpretacin que debe evitarse en estos
primeros momentos que se aprenden las
instrucciones arriba citadas. En vez de escribir
if (a) ..
escribir
if (a != 0)..

El concepto de funcin se introduce como es


usual, tambin desde un punto de vista
algortmico, en que se definan los parmetros
de entrada, de salida, de entrada/salida y formas
que eventualmente usar la funcin para
retornar valores que calcula.
El uso del operador & para el traspaso de
parmetro por referencia debe quedar en este
momento a un nivel de definicin, para luego
ser explicado el concepto en el captulo
dedicado a los punteros y las referencias. Se
puede comenzar con el estudio de funciones
recursivas, el cual se puede retomar ms
adelante con un mejor aparato conceptual, por
ejemplo, una vez se hayan estudiado estructuras
de datos lineales.

En este momento es mejor evitar impartirles


funciones genricas (template de funciones) y
funciones con cantidad de parmetros
indeterminada. Debe evitarse tambin la
declaracin global de constantes y variables.
5.

Llega el momento de introducir el concepto de


clase. El punto de partida es la definicin de
tipos de datos abstractos que nos ayuden en la
representacin de un problema, por ejemplo, la
definicin de alguna clase para datos numricos
(nmeros fraccionarios, nmeros complejos)
donde se implementen algunas operaciones, que
para la clase de los nmeros fraccionarios
puede ser sumar, multiplicar, simplificar, leer,
mostrar, etc.
A partir de ah definimos sus rasgos distintivos
(en atributos y operaciones necesarias para el
tipo) y presentamos al concepto de clase como
una herramienta eficaz para codificar en el

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

16

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

punteros y cadenas de caracteres, sin embargo


en la quinta edicin ya se introduce un primer
momento del estudio de las clases una vez
dados elementos bsicos del lenguaje y antes de
las estructuras de control.

lenguaje de programacin la definicin de tal


tipo y su empleo en el problema.
Deben ser estudiadas las formas de visibilidad
que implementa C++ para las componentes de
clase, las partes de la clase (interfase e
implementacin), constructores simples y
destructor.

6.

Al tratar con this, debe ser a un nivel muy


simple, que nos evite mezclarnos con los
punteros y lograr que en este momento sea
aceptado por definicin que *this es el objeto
actual que enva el mensaje en proceso.
Debe explicarse el concepto de estado de un
objeto y a partir de aqu las funciones de acceso
a un objeto (las que retornan el valor del estado
o parte del estado del objeto), su importancia y
porqu comnmente se les declara como
funciones const. Pueden ser empleados
ejemplos de objetos compuestos.

class Valor
{ private:
float elem[100];
int cant;
..............
};
Deben estudiarse las cadenas de caracteres,
tanto al estilo de C como de C++ (objetos
string).

Cuando se emplea un lenguaje hbrido en la


orientacin a objetos para ensear, como lo es
C++, hay criterios divididos en cuanto a:

introducir el concepto de clase en este


punto del programa de la asignatura, en que
otras construcciones de datos propias del
paradigma procedural an no se han
estudiado,

hacer un estudio del lenguaje primeramente


desde
una
ptica
completamente
procedural y luego introducir los conceptos
de clase y otros propios de la orientacin a
objetos.

7.

Estudiamos una primera parte del concepto de


herencia. Aqu se introducen el concepto bsico
de herencia, los conceptos de clases y
superclases, las formas en que se heredan
atributos y mtodos, la visibilidad protected,
todo a travs de un ejemplo introductorio.
Se estudian las caractersticas de los
constructores y destructores de las clases
derivadas. Recordemos que hasta este punto del
curso las operaciones que estos mtodos
realizan son triviales, dado que an no hemos
trabajado con variables dinmicas.
Se demuestra, en una prctica de laboratorio a
partir del ejemplo de entrada, la importancia de
definir mtodos virtuales aquellos que se
redefinen en diferentes niveles de la jerarqua
de clases, denotando adems que esta definicin
constituye una forma de polimorfismo.

De nuestra propia experiencia, consistente en


emplear el primer enfoque los ltimos cursos en
tanto que el segundo enfoque en cursos
anteriores, defendemos el primero, que ha
mostrado una mejor apropiacin de los
conceptos de la programacin orientada a
objetos.
Ese propio enfoque que escogemos se refleja en
la propia evolucin de los textos dedicados a la
enseanza del lenguaje C++. Si comparamos la
cuarta y la quinta edicin del texto de Deitel
C++ How to Program (Deitel, 2002), (Deitel,
2005) notamos que hasta la cuarta edicin el
primer estudio del concepto de clases se dejaba
hasta despus del estudio de los conceptos de
estructuras de control, funciones, arreglos y

A
continuacin
se
introducen
tipos
enumerativos y fundamentalmente tipos de
arreglos. Una vez explicados los principales
conceptos sobre arreglos, se introducen las
formas en que los arreglos se operan o
transforman (lecturas, escrituras, clculos,
bsquedas, etc) construyendo clases en que sus
atributos sean la cantidad real de elementos que
tiene el arreglo y la definicin de los elementos
del arreglo, usando el constructor por defecto
de un arreglo, por ejemplo:

8.

Llegamos al momento de introducir los


punteros. Sera deseable no tener que ensear a
los estudiantes el concepto de puntero en un
primer curso de programacin. Esto sera
posible si el lenguaje manipulara sus objetos de
datos de forma dinmica por defecto, lo cual no
es el caso de C++. Siendo entonces
imprescindible el uso de los punteros para

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

17

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

definir variables dinmicas y todos los


conceptos subsecuentes relacionados, se
recomiendan las siguientes acciones en un
primer momento:

Ensear el concepto de puntero,


fundamentalmente como va de definir
variables dinmicas, con new y dispose.

No ensear aritmtica de punteros.

Definir la relacin entre punteros y


arreglos, pero insistiendo en el uso del
indizado [] como base del acceso a las
componentes del arreglo.

Disciplinar a los estudiantes en el chequeo


del rango de los ndices de sus arreglos.

Dar
herramientas
didcticas
de
programacin para evitar la aparicin de
referencias nulas o basura.

Hacer un estudio ms detallado de los tipos


de cadenas de caracteres definidas a travs
de punteros y de la biblioteca <string> de
C++.

Crear objetos dinmicos.

Explicar qu es el puntero this.

Usando la definicin de una clase para


manipular arreglos dinmicos, que
incluyan entre otras operaciones la
asignacin de un arreglo para otro,
profundizar en la implementacin de
constructores y destructores para objetos
con campos dinmicos. Se debe ensear
adems el constructor de copia y su
necesidad.

Ensear los conceptos de listas lineales


(incluyendo colas y pilas) y mostrar
implementaciones
usando
arreglos
definidos dinmicamente o estructuras
enlazadas, en las que emplearn punteros
para en enlace entre cada elemento y su
contiguo.

Retomamos el concepto de herencia, en este


caso para ensear conceptos relativos a la
definicin de tipos-subtipos en una jerarqua y
como esto permite definir objetos polimrficos.
Adems se ensea cmo se establece la
compatibilidad entre objetos, punteros a objetos

y parmetros actuales y formales en una


jerarqua de clases.
Considerando el sistema de conocimientos y
habilidades acumulados hasta este punto por el
estudiante en el tema de herencia, es
aconsejable desarrollar ejercicios en que puedan
construir nuevas clases ampliando clases que
han sido desarrolladas en los tpicos anteriores,
bien buscando una nueva especializacin o
simplemente para ampliar la funcionalidad de la
clase. Se sugiere evitar en estos momentos el
uso de la herencia selectiva.
Por ltimo se estudian las clases abstractas y las
funciones virtuales puras, a travs de un
ejemplo de una jerarqua con una clase base
raz abstracta, por ejemplo, las figuras en el
plano, como en el ejemplo:
class TFigura
{ protected:
float x, y;
public:
TFigura(float cx=0, float cy=0)
{ x = cx;
y = cy;
}
virtual void Mostrar() = 0;
virtual float Area() = 0;
// otras funciones...................
};
// Clases derivadas
class TCirculo: public TFigura
{ .........
public:
// Funciones concretas Area y Mostrar para
// TCirculo
........
};
.......
class TCuadrado: public TFigura
{ .........
public:
// Funciones concretas Area y Mostrar para
// TCuadrado
........
};
.......
Mostrar como usar la clase con un programa
ejemplo, tal como:
void main()
{ TFigura *p[2];
// da espacio e inicializa un crculo

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

18

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

typedef double tfun(double);


double SumaCuadrado(tfun &f,int m,int n)
{ double sum=0;
int k;
for (k=m; k<=n; k++)
sum += f(k) * f(k);
return sum;
}

p[0] = new TCirculo(0,0,5);


// da espacio e inicializa un cuadrado
p[1] = new TCuadrado(1,1,4);
for (int i=0; i<2; i++)
{ // Se muestran los datos de la figura adecuada
p[i]->Mostrar();
// Ahora se imprime el rea de la figura
cout << "Su rea es: " << p[i]->Area()
<<endl;
}
system("PAUSE");

double g(double x)
{ return 1.0 / x;
}
void main()
{ double a, b;
a = SumaCuadrado(g, 1, 5);
b = SumaCuadrado(sin, 0, 4);
cout <<"a= " <<a <<" b= " <<b <<endl;
}

}
donde se muestra un arreglo de objetos polimrficos
con diferentes figuras de la jerarqua.
Por ltimo se les muestra un ejemplo en que puedan
aprender cmo usar la herencia privada para una
clase derivada pueda obviar mtodos de su clase
base.
Hasta aqu se han relacionado conceptos bsicos de
programacin que se pueden encarar en la primera
asignatura destinada a la enseanza de la
programacin. En dependencia del tiempo
disponible para su imparticin y de la profundidad
conceptual a la que se quiera llegar en la asignatura,
proponemos seleccionar algunas de las siguientes
temticas en el orden que se especifica:
a)

Estructuras y uniones, que ahora constituyen


caractersticas redundantes en el lenguaje, pero
si los estudiantes tienen a la programacin
como objeto de estudio deben conocer estos
tipos.

c)

Formas de polimorfismo operacional

Se ensea la forma propia que posee C++ y


la heredada de C. En este momento se
formaliza el estudio de punteros void y su
uso en la compatibilizacin entre tipos
punteros mediante la coercin.

b) Tpicos adicionales sobre punteros:

aritmtica de punteros,

punteros de tipo const y punteros a objetos


dinmicos constantes.

Punteros y referencias para las funciones:


aqu lo deseado es poder construir listas de
funciones y tambin facilitar el traspaso de
funciones como parmetros formales de
funciones. En este ltimo caso sugerimos
usar el traspaso por referencia al estilo de
C++, como en el ejemplo siguiente para
obtener la suma de los cuadrados de una
funcin f evaluada para valores enteros
entre m y n dados.

Coercin (casting).

#include <iostream.h>
#include <math.h>

Sobrecarga de operadores.
Como sabemos, la sobrecarga de
operadores es un recurso muy cmodo, que
hace permite a los programadores construir
tipos de datos de una forma similar a los
tipos simples predefinidos (int, long, etc.),
dando una interpretacin para el tipo de los
operadores predefinidos del lenguaje. Esto
conlleva el estudio de las funciones
operadoras (operator) y el concepto de
funcin amiga de una clase (friend), uso y
peligros.
Se debe desarrollar alguna clase
previamente estudiada, como la clase de
manipulacin de nmeros fraccionarios o
de nmeros complejos u otra afn, usando
las funciones operadoras, mostrando el uso
o necesidad de usar funciones amigas
dentro de clases que implementan
funciones operadoras.
Por otra parte debe reconocerse las
diferencias entre implementar funciones
miembros de una clase y funciones no
miembros amigas de la clase, desarrollando

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

19

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

algunos ejercicios en que se pida


implementar la misma operacin usando
los dos esquemas.
Algunas sobrecargas interesantes que
deben mostrarse, adems de los operadores
aritmticos, lgicos clsicos, deben ser la
sobrecarga del operador de asignacin =,
en una clase como la de arreglos dinmicos
previamente estudiada. As mismo se
recomienda ensear, usando esta propia
clase, la sobrecarga del operador de
indizacin []. Finalmente pueden ser
mostradas otras sobrecargas de operadores.

Funciones y clases genricas.


Se define el concepto de genericidad y su
importancia prctica y se ensea cmo
definir templates de funciones y de clases
(puede usarse como ejemplo el bien
conocido de la pila genrica). Un estudio
ms profundo debe ser dejado a una
asignatura subsiguiente de Estructuras de
Datos, donde pueden explotar adems
bibliotecas del tipo STL (Standard
Template Library).

d) El sistema de manipulacin de excepciones del


lenguaje. Si se decide estudiar este tema,
debera ser introducido despus de transcurrido
el 75% del fondo de tiempo de la asignatura y
no precisamente en sus finales.

4. Conclusiones
Programar es un desafo. La programacin requiere
el uso de habilidades de pensamiento abstracto y
muchos estudiantes no han recibido asignaturas que
requieran o les hayan ayudado a desarrollar estas
habilidades en niveles precedentes de enseanza,
considerando que la asignatura de Programacin
debe ser una de las primeras que enfrente un
estudiante de carreras de perfil afn a la
computacin. Muchos estudiantes entran a la clase
de programacin con escasas habilidades
conceptuales para programar.
En el presente trabajo se ha hecho un anlisis
detallado de algunas deficiencias que presenta el
lenguaje C++ al ser considerado como el primer
lenguaje en que los estudiantes que comienzan a
familiarizarse con la programacin orientada a
objetos. A partir de tales deficiencias, pero tambin
considerando algunas de sus bondades, como la
riqueza de elementos conceptuales, presencia de

excelentes ambientes de trabajo y demandas del


sector industrial se brindan un conjunto de
sugerencias que parten de las experiencias
didcticas acumuladas de siete generaciones de
estudiantes que han recibido la asignatura de
Programacin en el primer ao de la carrera, usando
como lenguaje de programacin al C++, adems de
experiencias del uso del lenguaje Java en otros
cursos subsiguientes de programacin. Estas
sugerencias ofrecen una propuesta de cmo
establecer secuencia de contenidos de la asignatura
y de posibles ejercicios a desarrollar en algunas de
las temticas.
Todo lo anterior nos reafirma una idea que es de
todos conocida, pero no tan unnimemente aplicada:
el profesor debe ensear a los estudiantes los
principios de la programacin (en este caso
orientada a objetos), lo cual podramos hacerlo en el
lenguaje que consideremos apropiado. Resulta
primaria una metodologa de programacin y
subsidiaria de sta la codificacin en un lenguaje de
programacin.
Otra idea extremadamente importante es que las
asignaturas de corte matemtico que son enseadas
en el propio ao acadmico que la programacin,
como lgica matemtica, lgebra y anlisis
matemtico, pueden influir muy positivamente en el
aprendizaje por parte del estudiante de una buena
metodologa de programacin, cuestin que algunas
veces tambin es obviada.
De otro lado los estudiantes no deben abandonar la
universidad sin ser capaces de usar un lenguaje de
amplio uso en el mundo real actual, como en la
actualidad lo contina siendo C++. En este sentido,
el lenguaje usado en la primera asignatura de
programacin debe ser relevante para el dominio de
los lenguajes de ms amplio uso cientfico e
industrial del momento.

Bibliografa
Arnold, K., Gosting, J. (1996) The Java
Programming Language, Addison-Wesley.
Ben-Ari, M. (1998). Constructivism in Computer
Science Education, SIGSCE 98 Atlanta, GA., p.257261, 1998.
Deitel, H., Deitel, P. (2002). C++, How to Program,
4th edition.
Deitel, H., Deitel, P. (2005). C++, How to Program,
5th edition.
Daz, J. (2002): Introduccin a la programacin
usando C++. Universidad de Oriente, Cuba.

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

20

Enseando programacin con C++: una propuesta didctica


____________________________________________________________________________________________________________________

Eckel, B. (2003): Thinking in Java, Third Edition.


Prentice Hall.
Klling, M. (1999). The problem of teaching objectoriented programming. Part I: Environments.
Journal of Object-Oriented Programming, 11(8):
p.8-15.
Stroustrup, B. (1997): The C++ programming
language, Third Edition. Addison-Wesley.
Tonella, P., Potrich, A. (2002). Cjj: a subset of C++
compliant with Java. Science of Computer
Programming, 42, p.229-271.

___________________________________________________________________________________________________________________
Revista de Informtica Educativa y Medios Audiovisuales Vol. 3(7), pgs. 12-21. 2006
ISSN 1667-8338 LIE-FI-UBA. liema@fi.uba.ar

21

Vous aimerez peut-être aussi