Capítulo 1. Introducción a C++Juan Carlos Diazjcdiaz@cable.net.co MetodologíaUsted deberá leer el presente documento e ir corriendo los programas en C++, cuidando de leer bien las instrucciones y tratar de entenderlas por completo. Está escrito de una forma escalonada para que alcance el conocimiento de C++ y programación por objetos de forma progresiva. Se recomiendo leerlo con cuidado, porque aunque no es demasiado extenso si contiene mucha información que usted debe ir asimilando. Si va muy rápido llegará un punto en que no entenderá.Resuelva los ejercicios y preséntelos
al profesor.
El Primer ProgramaEl programa más sencillo en C++ sería el siguiente:prog1 main () {
Sin embargo da un error que señala que cout no está definido. Eso significa que no tiene incluida la librería de iostream.h. prog2 # include "iostream.h" main () {
La librería iostream.h es la primera librería de C++ que se usará y permite entre otras cosas el uso de las instrucciones cin y cout para la entrada de datos. Dentro de este programa podremos definir
variables globales que pueden ser de tipo primitivos, estructuras, clases
y apuntadores.
Definición de un tipo primitivo
prog3 # include "iostream.h" int variableGlobal = 0; main () {
Se ha definido una variable global de un
tipo primitivo, así como una variable local que son mostradas por
pantalla.
Definición de una estructuraprog4# include "iostream.h" struct Estructura1 {
main () {
En este caso se define una estructura con
tres campos uno entero, otro de caracter y otro flotante. Posteriormente
se les asigna un valor a cada uno y luego se muestra por pantalla. (Identifique
cada una de las acciones dentro del codigo).
Definición de una claseprog5# include "iostream.h" class Clase1 {
main () {
En este caso se define una clase con tres
campos: uno entero, otro de caracter y otro flotante. Posteriormente se
les asigna un valor a cada uno y luego se muestra por pantalla. (Identifique
cada una de las acciones dentro del codigo).
Ejercicio No. 1Escriba las similitudes y diferencias entre la definición de una estructura y la definición de una clase.Definición de un apuntadorUn apuntador en C++ es una variable que guarda la dirección de un valor en memoria. Esto crea una distinción entre las variables por valor como la siguiente:int a,b; y las variables por referencia int *c,*d; Las variables a y b, guardan directamente
el valor de la variable, en cambio, c y d guardan la dirección donde
el sistema operativo ha guardado el valor de la variable.
Apuntadores a valores primitivosUna variable por valor (es decir, que no usa apuntadores) tiene varias fases en su uso:
# include "iostream.h" main () {
Apuntadores a estructurasCuando se usan apuntadores a estructuras el manejo de los campos varía. Cuando se usan campos de estructuras sin apuntador se hace de la siguiente forma: Ejercicio Resuelto ATransforme este programa en: a) un programa que use apuntadores a enteros; b) un programa que usa una un apuntador a una estructura cuyos campos son a y b. c) un programa que usa una clase con dos campos públicos a y b#include "iostream.h" main() {
Solucióna) apuntadores a tipos primitivos#include "iostream.h" main() {
b) apuntadores a estructuras #include "iostream.h" struct Estructura {
main() {
c) clase #include "iostream.h" class Clase {
main() {
Ejercicio No. 2Transforme este programa en: a) un programa que use apuntadores a enteros; b) un programa que usa una un apuntador a una estructura cuyos campos son perros, gatos, pajaritos y mamiferos. c) un programa que usa una clase con dos campos públicos perros, gatos, pajaritos y mamiferos.#include "iostream.h" // Guarderia veterinaria "mi primer mundo" main() {
Creación de arreglos dinámicosArreglos dinámicos unidimensionales
prog8 #include "iostream.h" main() {
Los nuevos arreglos dinámicos se definen como un apuntador y tienen una instrucción adicional de localización de memoria antes de poder usar los datos. Como todos los apuntadores deben tener una instrucción para devolver el espacio pedido al sistema operativo. prog9 #include "iostream.h" main() {
Ejercicio Resuelto BExplicar porqué el siguiente programa no está bien:#include "iostream.h" main() {
Respuesta:Razones en las que falla el programa:
Matrices dinámicasPara declarar una matriz dinámica (2-dimensiones) tenemos que definir la variable con un doble asterisco anterior. Se debe tener en cuenta que para localizar la memoria primero se debe localizar un vector y luego por cada posición del vector se inicializa un nuevo vector formando así las filas y las columnas. a continuación hay un ejemplo.Supongamos una matriz de enteros de 5x4 posiciones, el manejo se hará de la siguiente forma: prog10 #include "iostream.h" main() {
// localización en memoria. En las matrices
dinámicas se debe localizar primero
// y luego la otra. Observe como cada posición
del primer arreglo localizado crea
// llenado del arreglo. Ahora se llena el arreglo
con una función
// uso de los datos del arreglo (mostrarlos en
pantalla)
Estos arreglos dinámicos tienen
la ventaja de permitir que su longitud sea escogida al momento de ejecución
y no ser conocido de antemano por el programador.
Uso de funcionesLas funciones permiten encapsular fragmentos de código que van a permitir cortar el cuerpo de un programa para que no quede completamente en el main del programa. Vamos a hacer una conversión de un programa que ya hallamos mirado antes y vamos a convertir en función fragmentos del código. Retomamos el programa 4 de esta lectura que a continuación recordamos.prog4 # include "iostream.h" struct Estructura1 {
main () {
Ahora vamos a crear dos funciones que se van a encargar de inicializar los campos del registro y posteriormente otra función se encargará de mostrar los resultados prog11 # include "iostream.h" struct Estructura1 {
//
void mostrarDatos(){
main () {
Si observa los programas 4 y 11, el main que originalmente era así: main () {
Luego de usar las funciones se convierte en esto: main () {
Es importante anotar que la variable local registro se convierte en una variable global en el caso de las funciones. Esto es porque no es pasada como parámetro a las funciones.
Ejercicio No. 3Hacer una versión del programa 11 en el cual la variable de estructura registro no es una variable global sino local.prog11 # include "iostream.h" struct Estructura1 {
//
void mostrarDatos(){
main () {
Ejercicio Resuelto CElaborar un programa en C++ que lea dos variables enteras long1i y long2. Utilizando estas dos variables, crear dinámicamente dos arreglos palabra1[] y palabra2[]. Luego de tener en la memoria dinámica los dos arreglos, escriba las instrucciones necesarias para leer dos palabras. La primera palabra la almacena en el arreglo palabra1[] y la segunda palabra la almacena en el arreglo palabra2[]. El programa debe escribir la palabra "homófonas" en caso de que las palabras almacenadas en los arreglos lo sean, de lo contrario debe escribir el literal "no homófonas". una palabra ses homófona si tiene el mismo sonido pero está escrita con diferentes consonantes. Por ejemplo, atajo y hatajo, vacilo y bacilo.Solución:Los pasos para la solución del problema son los siguientes:1. Leer las variables long1 y long2, que
definirán el tamaño del arreglo dinámico.
Inicialmente no hemos resuelto como comparar si son homófonas o no. #include "iostream.h" int homofonas(char *p1, char* p2) {
main() {
// 2. Crear los dos arreglos palabra1[] y palabra2[], y localizar
la
// 3. Leer las dos palabras y almacenarlas en a y en b correspondientemente.
// 4. Detectar si las palabras son homófonas. Hacemo
uso de una función
Ejercicio No. 4Diseñar la función que toma las dos palabras y las compara para ver si son homófonas o no.int homofonas(char *p1, char* p2) {
// ???
return 1;
Declaración de ClasesLas clases en C++ funciona de forma similar a las estructuras definidas con la palabra struct, pero con algunas mejoras que permiten mayor unidad de los datos. Las estructuras solo contienen datos, las clases además de contener datos, contienen las funciones que los manejan y además tienen control de acceso a dichos datos.Veremos un ejemplo de una estructura y como se maneja para luego convertirla en una clase. prog12 #include "iostream.h" struct Paciente {
main () {
cout << "Escriba los datos del paciente" << endl;
cout << endl;
delete Registro1.nombre;
return 0;
Vamos ahora a hacer una versión de este programa con una clase que tiene todos sus campos públicos prog13 - clase con todos los campos públicos #include "iostream.h" class Paciente {
main () {
cout << "Escriba los datos del paciente" << endl;
cout << endl;
delete Registro1.nombre;
return 0;
Aquí pueden observar que al cambiarlo a una clase con las variables públicas no cambia mucho con respecto a la estructura. (Se han resaltado los cambios). Las clases tienen adicionalmente la capacidad de inicializar los datos y de destruirlos, eso haría que cambiara la estructura del programa al meter una parte del main en las rutinas de constructor y destructor. Estas rutinas llevan el mismo nombre de la clase y se ejecutan al crear o destruir la variable de esta clase. prog 14 #include "iostream.h" class Paciente {
// Note que el main se ha reducido y ya solo
se crea la clase y se llaman
return 0;
Ejercicio Resuelto DElaborar una clase llamada Codificador, que contenga una variable privada codigo y dos funciones públicas. La primera función deber ser el constructor de la clase donde almacene la variable privada codigo el número 328 y una segunda función denominada verCodigo(), la cual devuelva al programa principal el valor de la variable privada codigo.Solución:class Codificador {int codigo; public: Codificador() { codigo = 328; } int verCodigo() { return codigo; } }; Ejercicio Resuelto EElaborar una clase denominada Alumno, la cual tenga como variables privadas un apuntador a una cadena de caracteres denominado nombre, y una variable entera llamada nota. La clase debe contener en su parte pública tres funciones: la primera, la función Alumno(), la cual recibe como parámetro una cadena de caracteres y un entero con la nota, tendrá como tarea almacenar en la memoria dinámica la cadena y el entero recibidos en el constructor. La cadena debe quedar indicada por el apuntador nombre y la nota por el entero nota. La segunda función denominada verNombre(), debe retornar la dirección e la memoria dinámica donde está almacenada la cadena indicada por el apuntador nombre. Y la tercera llamada verNota() debe devolver un entero que refleje el contenido de la nota. El objeto debe liberar memoria al terminar.class Alumno {
Ejercicio Resuelto FElaborar una clase Coordenada, la cual contenga dos variables de tipo entero x y y. La clase debe contener dos funciones: la primera el constructor, el cual recibe dos parametors i y j. El valor almacenado en i se debe almacenar en la variable privada x y el valor almacenado en la variable j se debe pasar al a variable privada y. La clase debe contener la función verCoordenada(), la cual debe informar al programa principal los valores almacenados en x y y. la función no puede retorna ningún dato. Con el propósito de elaborar su tarea, la función verCoordenada() debe trabajar parámetros por referencia.#include "iostream.h" class Coordenada {
// se coloca el main para mostrar como se usaría
la clase
Ejercicio Resuelto GElaborar una clase denominada Codificador. La clase debe tener un su parte privada una variable dato de tipo entero, otro entero llamado codificado que debe comenzar en 0 y debe tener una función privada verDatoReal() la cual tiene como tarea retornar dato si codificado está en cero y el valor 1000 - dato si codificado es igual a 1. En la parte pública deben existir cuatro funciones: el constructor, el cual requiere de un parámetro que inicializa la variable dato. La función asignarDato(), la cual recibe un parámetro de tipo entero, que almacena reemplazando el contenido de dato, también debe inicializar el codificado en 0. La tercera función se debe denominar procesar(), y tiene como tarea reemplazar a dato por 1000 - dato y a codificado por 1 - codificado. La cuarta función verDato() debe retornar el valor interno usando, utilizando la función definida en el bloque privado de la clase Codificador.class Codificador {
Ejemplo Resuelto H.Elaborar una clase X, la cual tiene en su parte privada una variable x y en su parte pública dos funciones. El constructor de la clase, el cual almacena en la variale x, el valor del parámetro enviado al constructor. Tiene adicionalmente una función H(), la cual retorna el valor de la variable almacenada en la parte privada de la clase X. Con base en su clase anterior, diseñar una clase Y, que tiene en su parte privada una variable a de tipo X. La clase Y, el cual tiene como tarea inicializar la variable privada de la clase X y adicionalmente debe tener la función I(), la cual debe retornar el programa principal el valor de la variable almacenada en la parte privada de la clase X, a través de la función H() declarada en la parte pública de la clase X.class X {
class Y {
Ejemplo Resuelto IElabore una clase Matriz, la cual almacene en su parte privada un aputnador a una matriz en la cual en cada celda se pueda almacenar un entero. El programa debe tener un constructor que asigne automáticamente memoria dinámica para almacenar la matriz. El orden de la matriz se indica en los parámetros del constructor. El constructor tiene dos parámetros de tipo entero. El primer parámetro indicará el número de filas de la matriz y el segundo parámetro el número de columnas de la matriz que se quiere trabajar. Adicionalmente en su parte pública debe exister una función denominada llenar(), la cual recibe un parámetro. Esta función debe inicializar la matriz manejada dentro de la clase con el valor del parámetro. Debe existir una tercera función, que corresponde al destructor de la clase Matriz. En este destructor se debe liberar toda la memoria asignada para la matriz. La clase debe tener una cuarta función la cual tiene como tarea retornar al programa pirncipal la dirección de la matriz.class Matriz {
Matriz::Matriz(int pfilas, int pcolumnas) {
void Matriz::llenar(int valor) {
Matriz::~Matriz() {
Ejemplo Resuelto JElaborar una clase Lado, que contenga en su parte privada un valor de tipo entero. Denominemos esta variable longitud. La función debe contener un constructor, el cual inicializa la variable longitud con el valor del parámetro enviado desde un programa principal o desde una función. La clase Lado, debe tener adicionalmente tener una función, que devuelva el valor de la variable longitud. Elaborar un programa principal que construya tres objetos de tipo Lado e inicialice su variable longitud. Después de construidos estos tres objetos, deben en las rutinas que usan la clase Lado, existir las instrucciones necesarias con el propósito de mirar si con los valores almacenados en cada una de las variables longitud de los tres objetos, se puede formar un triángulo. En caso de que se pueda formar se debe escribir "si" de lo contrario se debe escribir la palabra "no".# include "iostream.h" class Lado {
int triangulo(int a1, int a2, int a3) {
main() {
Ejercicio No. 5Escriba el programa para que el Ejemplo Resuelto C (palabras homónimas) use clases.
|