Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 111

ndice

Tema

Pgina

Notas Preliminares
Introduccin a la Programacin en C/ C++.
Estructura de un programa en C:
Tipos de Datos- Declaracin y asignacin de variables
Entrada / Salida cin -cout
Constantes.
Operadores
Iteraciones y decisiones
Sentencia IF
switch
Sentencias de iteracin: for
while
Do while
FUNCIONES
Pasaje de Parmetros
Vectores o Vectores Unidimensionales
Enum, Typedef
Vectores Bidimensionales o Matrices
Consideraciones importantes asociadas al uso de matrices:
ORDENAMIENTO
Ordenamiento Por Seleccin (Selection Sort)
Ordenamiento BubbleSort.
Ordenamiento Por Insercin Directa
Mtodo De Ordenamiento Por Insercin Binaria
Ordenamiento por el Mtodo Shell
Ordenamiento Heap Sort
Bsqueda de elementos en un Vector
Bsqueda secuencial
Bsqueda binaria
Recursividad
Fibonacci
Torres de Hanoi
Operaciones recursivas con Vectores
Archivos en C++
Backtracking
La vuelta del caballo
El problema de las ocho reinas
El Problema de la mochila (seleccin ptima)
Ejemplo Backtraking
Cadenas O Strings (swap, find first of,

3
3
4
5
6
7
7
8
9
10
11
12
13
14
16
16
18
19
21
22
23
24
25
26
27
29
29
29
31
33
34
35
37
40
42
45
47
48
53
55
56
70
74

Biblioteca conio - math


Punteros
Templates (introduccin)
Trabajos Prcticos

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

Notas Preliminares

La Programacin es el arte de dar soluciones a los problemas para que el equipo pueda ejecutarlas. La gran parte del esfuerzo en programar es buscar soluciones y refinarlas. A menudo, el problema es slo comprender plenamente a travs del proceso de programacin la solucin. Este apunte es para alguien que nunca ha programado antes, pero que est dispuesto
a trabajar duro para aprender. Asimismo, le ayudar a comprender los principios y adquirir
los conocimientos prcticos de la programacin usando el lenguaje de programacin C++.
Por qu C++? No se puede aprender a programar sin un lenguaje de programacin, y C++
apoya directamente los principales conceptos y tcnicas que se utilizan en el mundo real del
software. C++ es uno de los lenguajes de programacin ms ampliamente utilizados. La mayora de los conceptos de programacin pueden utilizarse directamente en otros lenguajes,
como C#, Fortran, PhP y Java. Por ltimo, C++ es frecuente elegirlo como lenguaje para escribir cdigo elegante y eficiente. La hiptesis fundamental es desear escribir los programas
para el uso de otros, y de hacerlo con responsabilidad, proporcionando un buen nivel de calidad de todo el sistema, es decir, lograr un muy buen nivel de profesionalismo.
La programacin se adquiere por escribir programas. En este tipo de programacin es similar
a la de otras actividades con un componente prctico. Las personas no pueden aprender a
nadar, a tocar un instrumento musical, o conducir un coche solo con leer un libro. Todos debemos practicar. No se puede aprender a programar sin leer y escribir bastante cdigo. Este
apunte intenta centrase en ejemplos de cdigo estrechamente vinculado con texto explicativo
y diagramas. Esto es esencial, pero, por s sola, no le brindar los conocimientos prcticos de
programacin. Para ello, se necesita hacer los ejercicios y acostumbrarse a las herramientas
para escribir, compilar y ejecutar los programas.

Introduccin a la Programacin en C/ C++.

a) Introduccin Terica

Creador:
Dennis Ritchie (Laboratorios Bell) en 1972, cuando trabajaba junto con Ken Thompson diseo del sistema operativo UNIX.
El C se cre como herramienta para programadores, en consecuencia su principal objetivo es
ser un lenguaje til.
C++ es un lenguaje de programacin creado a mediados de los aos 1980 por BJarne Stroustrup. La intencin de su creacin fue extender al exitoso lenguaje de programacin C con mecanismos que permitan la manipulacin de objetos.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

Caractersticas:
El C es un lenguaje de programacin de alto nivel (alto nivel quiere decir prximo al lenguaje humano), pero con caractersticas de bajo nivel (bajo nivel= prximo al lenguaje
mquina).
Es de ALTO NIVEL porque es racional, estructurado y fcil de aprender.
Es de BAJO NIVEL porque permite trabajar con bits, registros de la C.P.U. y posiciones de
memoria.
Por qu el C?
El lenguaje C es poderoso y flexible: la mayor parte del sistema operativo UNIX fue escrito
en C.
Incluso estn escritos en C los compiladores e intrpretes de otros lenguajes, como FORTRAN, APL, PASCAL, LISP, LOGO y BASIC.
El lenguaje C es amistoso porque es lo suficientemente estructurado para ejercer buenos
hbitos de programacin. Es el lenguaje de programacin ms utilizado por el programador
de sistemas.

Estructura de un programa en C:
El C es grficamente:

CDIGO FUENTE: es el programa que nosotros escribimos, se graba con la extensin CPP
CDIGO OBJETO: es el programa fuente pero traducido a lenguaje mquina (sucesin de
ceros y unos), se graba con la extensin OBJ
PROGRAMA EJECUTABLE: es el programa objeto ms las libreras del C, se graba con la
extensin EXE. Y no necesita el programa que hemos utilizado para crearlo, para poder ejecutarlo.
El cdigo Objeto que genera un compilador de C, es casi tan eficiente (rpido) como si lo
hubiramos escrito en lenguaje ENSAMBLADOR (lenguaje de programacin ms prximo al
lenguaje mquina).

El presente apunte est orientado a la construccin de programas sobre el compilador Borland C++ Builder 6.0
Para Borland C++ Builder 6.0 se utiliza: File New- other- Console Wizard.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

Los programas en C++ consisten en una o ms funciones. La nica funcin que debe estar
absolutamente presente es la denominada main, siendo la primera funcin que es llamada
cuando comienza la ejecucin del programa. Aunque main no forma tcnicamente parte del
lenguaje C, hay que tratarla como si lo fuera.
Borland C++ Builder 6.0
#include<iostream.h> Declaracin de libreras
int main()
{
Inicio de bloque
// cuerpo del programa
Return(0);
}
fin de bloque
La forma general de un programa en C es:

El programa as escrito se denomina programa fuente y puede estar escrito en uno o varios
archivos.
Para que el programa pueda ser ejecutado se debe compilar y Ejecutar (run) con todas aquellas funciones de la biblioteca que se necesiten.
Tipos de Datos

Todos los programas necesitan, en algn momento, almacenar nmeros o datos ingresado
por el usuario. Estos datos son almacenados en variables, y en C++ como en otros lenguajes
estas variables deben tener un tipo.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

bool

La palabra clave bool es el nombre para el tipo de datos Booleano en C++. Un tipo de datos
Booleano puede tomar uno de dos valores: verdadero o falso, que en C++ se sealan con las
palabras clave true y false respectivamente.

Ejemplo
En el siguiente cdigo, se inicializa una variable booleana con valor falso y luego se usa esta
variable para controlar la ejecucin de un bucle, la cual termina cuando la variable toma el valor
verdadero:
bool listo = false;
while( !listo ) {
...
}

bool

Por lo general utiliza 1 byte de memoria, valores: true o false

Declaracin y asignacin de variables


Para declarar una variable, basta con indicar su tipo y su nombre. Existen ciertas convenciones en cuanto al nombre de las variables. Algunos prefieren separar las partes de un nombre
con '_', otros prefieren escribir una mayscula para separarlas. Ejemplo:
int mes;

int receta_del_mes;

Asignar un valor

Es posible asignar un valor a una variable al momento


de declararla:
int Mes = 12;
Tambin es posible declarar varias variables en una
misma lnea, pero en este caso, todas las variables de
la lnea tendrn el mismo tipo.

Otro Ejemplo
double d;
int i;
short s;
//...
d=d+i;
i=s*i;

int recetaDelMes = 12301, recetaDelAo = 45644545;

Entrada / Salida

Cout (C output)
cout << "Texto: " << variable << "\n";

Se trata de un objeto global definido en "iostream.h".


Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

int entero = 10;


char caracter = 'c';
char cadena[20] = "Hola";
float pi = 3.1416;

cout
cout
cout
cout

<<
<<
<<
<<

"entero=" << entero << "\n";


"caracter=" << caracter << endl;
"cadena=" << cadena << endl;
"pi=" << pi << endl;

Cin
#include <iostream>
#include <string>
using namespace std;

int entero;
string nombre;
int main()
{
Cout<<ingrese un nmero entero<<endl;
Cin>>entero;
Cout <<Ingrese Frase<<endl;
getline(cin,nombre);
}
Constantes.
Las constantes se declaran, aadiendo la palabra const delante. Por ejemplo, para declarar
una constante con valor 14:
const int numero = 14;

Estas constantes no pueden ser modificadas a lo largo del programa. Por eso deben ser definidas al mismo tiempo que declaradas.

Operadores

aritmticos

lgicos

relacionales

Asignacin

Lista de operadores
aritmticos con su
significado

! Not (no lgico)


&& And (y lgico)
|| Or ( lgico)

== Igual a
!= No igual a
> Mayor que
< Menor que
>= Mayor o igual que

=
*=
/=
%=
+=
-=

+ Suma
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

Asignacin
Asigna producto
Asigna divisin
Asigna resto (mdulo)
Asigna suma
Asigna diferencia (resta)
7

- Resta
* Producto
/ Cociente de una divisin
% Resto de una divisin

<= Menor o igual


que

<<=
>>=
&=
^=
|=

Asigna desplazamiento izquierda


Asigna desplazamiento derecha
Asigna AND entre bits
Asigna XOR entre bits
Asigna OR entre bits

Ejemplo:
x = 3;
x += 3;
x &= 3;

Iteraciones y decisiones
DEFINICIN
Las sentencias de decisin o tambin llamadas de CONTROL DE FLUJO son estructuras de
control que realizan una pregunta la cual retorna verdadero o falso (evala una condicin) y
selecciona la siguiente instruccin a ejecutar dependiendo la respuesta o resultado.
En algn momento dentro de nuestros programas, es preciso cambiar el flujo de ejecucin de
las instrucciones, es decir, el orden en que las instrucciones son ejecutadas. Muchas de las
veces tenemos que tomar una decisin en cuanto a que se debe ejecutar basndonos en una
respuesta de verdadero o falso (condicin). La ejecucin de las instrucciones incluyendo una
estructura de control como el condicional funciona de esta manera:
Las instrucciones comienzan a ejecutarse de forma secuencial (en orden) y cuando se
llega a una estructura condicional, la cual est asociada a una condicin, se decide qu
camino tomar dependiendo siempre del resultado de la condicin siendo esta falsa o
verdadera.

Cuando se termina de ejecutar este bloque de instrucciones se reanuda la ejecucin en


la instruccin siguiente a la de la condicional.

Sentencia IF

La instruccin if es, por excelencia, la ms utilizada para construir estructuras de control de


flujo.
SINTAXIS
Primera Forma
if (condicin)
{
Set de instrucciones
}

Siendo "condicin" el lugar donde se pondr la condicin o pregunta que se tiene que cumplir para que sea verdadera la sentencia y as proceder a realizar el "conjunto de sentencias"
o cdigo contenido dentro de la sentencia.
Segunda Forma
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

if (condicin)
{
Conjunto de sentencias
}
else
{
Conjunto de sentencias 2
}

//PARTE VERDADERA

//Parte FALSA

La forma mostrada anteriormente muestra la unin de la parte "VERDADERA" con la nueva


secuencia la cual es la parte "FALSA" de la sentencia de decisin "IF" en la cual esta compuesta por el:
else
{
Conjunto de sentencias 2

//Parte FALSA

}
la palabra "else" o "De lo contrario" indica al lenguaje que de lo contrario al no ser verda-

dera o no se cumpla la parte verdadera entonces realizara el "set de instrucciones 2".


EJEMPLOS DE SENTENCIAS IF...
Ejemplo 1:

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#pragma argsused
int numero;
int main(int argc, char* argv[])
{
cout<<"ingrese numero";
cin>>numero;
if(numero == 0) //La condicin indica que tiene que ser igual a Cero
{
cout<<"El Numero Ingresado es Igual a Cero";
}
getch();
return 0; }

Ejemplo 2:
if(numero > 0) // la condicin indica que tiene que ser mayor a Cero
{
cout<<"El Numero Ingresado es Mayor a Cero";
}

Ejemplo 3:
if(numero < 0) // la condicin indica que tiene que ser menor a Cero
{
cout<<"El Numero Ingresado es Menor a Cero";
}

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

Ahora uniremos todos estos ejemplos para formar un solo programa mediante la utilizacin
de la sentencia "Else" e introduciremos el hecho de que se puede escribir en este espacio una
sentencia if ya que podemos ingresar cualquier tipo de cdigo dentro de la sentencia escrita
despus de un Else.
Ejemplo 4:
if(numero == 0) //La condicin indica que tiene que ser igual a Cero
{
cout<<"El Numero Ingresado es Igual a Cero";
}
else
{
if(numero > 0) // la condicin indica que tiene que ser mayor a Cero
{
cout<<"El Numero Ingresado es Mayor a Cero";
}
else
{
if(numero < 0) // la condicin indica que tiene que ser menor a Cero
{
cout<<"El Numero Ingresado es Menor a Cero";
}
}
}
Sentencia switch

switch es otra de las instrucciones que permiten la construccin de estructuras de control. A


diferencia de if, para controlar el flujo por medio de una sentencia switch se debe de combinar con el uso de las sentencias case y break.
Notas: cualquier nmero de casos a evaluar por switch as como la sentencia default son opcionales. La sentencia switch es muy til en los casos de presentacin de mens.
Sintaxis:
switch (condicin)
{
case primer_caso:
bloque de instrucciones 1
break;
case segundo_caso:
bloque de instrucciones 2
break;
case caso_n:
bloque de instrucciones n
break;
default: bloque de instrucciones por defecto
}

Ejemplo 1
#include <vcl.h>
#pragma hdrstop
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

10

#include <iostream.h>
#include <conio.h>
#pragma argsused
int numero;
int main(int argc, char* argv[])
{
cout<<"ingrese numero";
cin>>numero;
switch (numero)
{
case 0: cout << "numero es cero";
}
getch();
return 0; }

Ejemplo 2
switch (opcion)
{
case 0: cout << "Su opcin es cero"; break;
case 1: cout << "Su opcin es uno"; break;
case 2: cout << "Su opcin es dos";
}
Ejemplo 3
switch (opcion)
{
case 1: cout << "Su opcin es 1"; break;
case 2: cout << "Su opcin es 2"; break;
case 3: cout << "Su opcin es 3"; break;
default: cout << "Elija una opcin entre 1 y 3";
}

Sentencias de iteracin
Definicin
Las Sentencias de Iteracin o Ciclos son estructuras de control que repiten la ejecucin de
un grupo de instrucciones. Bsicamente, una sentencia de iteracin es una estructura de control condicional, ya que dentro de la misma se repite la ejecucin de una o ms instrucciones
mientras o hasta que una a condicin especfica se cumpla. Muchas veces tenemos que repetir un nmero definido o indefinido de veces un grupo de instrucciones por lo que en estos
casos utilizamos este tipo de sentencias. En C++ los ciclos o bucles se construyen por medio
de las sentencias for, while y do - while. La sentencia for es til para los casos en donde
se conoce de antemano el nmero de veces que una o ms sentencias han de repetirse. Por
otro lado, la sentencia while es til en aquellos casos en donde no se conoce de antemano el
nmero de veces que una o ms sentencias se tienen que repetir.
Sentencias For
for(contador; final; incremento)
{
Cdigo a Repetir;
}

donde:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

11

1. contador es una variable numrica


2. final es la condicin que se evala, o sea, el valor final para contador
3. incremento es el valor que se suma o resta al contador
Ejemplo 1:
#include <conio.h>
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
for(int i=1; i<=10; i++)
{
cout<<"Hola Mundo"<<endl;
}
getch();
return 0;
}

Esto indica que el contador "i" inicia desde 1 y finaliza cuando el contador "i" sea menor o
igual a 10 ( en este caso llegar hasta 10) e "i++" realiza la sumatoria por unidad lo que hace
que el for y el contador se sumen. repitiendo 10 veces "HOLA MUNDO" en pantalla.
Ejemplo 2:
#include <conio.h>
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
for(i=10; i>=0; i--)
{
cout<<"Hola Mundo"<<endl;
}
getch();
return 0;
}

Este ejemplo hace lo mismo que el primero, salvo que el contador se


inicializa a 10 en lugar de 1; y por ello cambia la condicin que se evala
as como que el contador se decremento en lugar de ser incrementado.
Sentencia while

while(condicin)
{
cdigo a Repetir
}

donde:
1. condicin es la expresin a evaluar
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

12

Ejemplo 1:
#include <conio.h>
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
int contador = 0;
while(contador<=10)
{
contador=contador++;
cout<<"Hola Mundo"<<endl;
}
getch();
return 0;
}

El contador Indica que hasta que este llegue a el total de 10 entonces se detendr y ya no se
realizar el cdigo contenido dentro de la sentencia while, de lo contrario mientras el "contador" sea menor a 10 entonces el cdigo contenido se ejecutar desplegando hasta 10 veces
"Hola Mundo" en pantalla.
Sentencia do - while

La sentencia do es usada generalmente en cooperacin con while para garantizar que una o
ms instrucciones se ejecuten al menos una vez. Por ejemplo, en la siguiente construccin no
se ejecuta nada dentro del ciclo while, el hecho es que el contador inicialmente vale cero y la
condicin para que se ejecute lo que est dentro del while es "mientras el contador sea mayor que diez". Es evidente que a la primera evaluacin hecha por while la condicin deja de
cumplirse.
int contador = 0;
while(contador > 10)
{
contador ++;
cout<<"Hola Mundo";
}

Al modificar el segmento de cdigo anterior usando do tenemos:


#include <conio.h>
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
int contador = 0;
do
{
contador ++;
cout<<"Hola Mundo";
}
while(contador > 10);
getch();
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

13

return 0;
}

Observe cmo en el caso de do la condicin es evaluada al final en lugar de al principio del


bloque de instrucciones y, por lo tanto, el cdigo que le sigue al do se ejecuta al menos la
primera vez.
FUNCIONES
Definicin de una Funcin

Uno de los conceptos actualmente utilizados en el mundo del software, es la de Modularidad.


Se ha dicho que la Modularidad, es el atributo individual del software que permite a un programa ser intelectualmente manejable. El software monoltico (es decir, un programa compuesto de un nico mdulo) no puede ser fcilmente abarcado por un lector. El nmero de
caminos de control, la expansin de referencias, el nmero de variables y la complejidad
global podran hacer imposibles su correcta compresin.

Estructura de una funcin:


tipo_de_funcion

nombre_de_la_funcion (argumentos)

{
Cuerpo de la Funcin
return(variable valor); /* opcional solo cuando la funcin es de
tipo void*/
}

Donde el tipo_de_funcion corresponde al tipo de datos que retorna devuelve dicha funcin, la cual puede ser del tipo entero ( int ) , flotante (float), carcter (char ) etc, adems es
importante aclarar que aquellas funciones que no son definidas, por defecto son de tipo entero.
argumentos: corresponde a valores recibidos por la funcin, los cuales tambin se deben
definir de un tipo determinado, como si se tratase de una definicin de variable comn y corriente, cabe destacar adems que no necesariamente una funcin debe recibir un valor, si no
que esta puede estar vaca.
Cuerpo de la funcin: Corresponde al cdigo fuente que se encargar de realizar el proceso, aqu se debern declarar variables si fuese necesario, dichas variables son denominadas variables locales porque pertenecen a esa funcin y slo existen cuando el compilador
toma dicha funcin, dejando de existir cuando el compilador termina de ejecutar dichas lneas
de cdigo. Existen las variables globales, definidas en el programa principal, antes del main(),
las cuales pueden ser utilizadas en cualquier parte del programa, incluyendo las funciones.
return(variable valor): Corresponde al valor que retornar dicha funcin donde fue llamada, es importante destacar que una variable valor nico. Ms adelante veremos como

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

14

retornar variables que tengan asociados ms de un valor, por lo que por el momento slo nos
quedaremos con la proposicin inicial.
Algunas veces no necesitaremos que las funciones nos retornen un valor, por lo que podremos omitir esta sentencia.
Ejemplo Crear un programa utilizando funciones donde se sumen dos nmeros. En este
programa existen variables globales (x e y) y variables locales (result en el cuerpo del programa principal; y las variables a y b en la funcin suma. Las variables locales slo tienen
existencia durante la ejecucin de la respectiva funcin. Pueden existir variables locales con el
mismo nombre en distintas funciones las cuales estarn haciendo referencia a posiciones distintas de memoria.
#include <conio.h>
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
#pragma argsused
int x,y;
int suma(int a,int b); // Todas las funciones se declaran antes que el
// main(), para que puedan ser reconocidas por el
//compilador y utilizadas en cualquier parte del
//programa
int main(int argc, char* argv[])
{
int result;
cout<<"Ingrese el primer valor ";
cin>>x;
cout<<"Ingrese el segundo valor ";
cin>>y;
result=suma(x,y); //se ingresan las variables adecuadas como parmetros y el
//valor devuelto por la funcin es asignada a la variable result.
cout<<"La suma es : "<<result;
getch();
return 0;
}
int suma(int a,int b)
{
return(a+b);
}

Otro Ejemplo
Escribir un programa que permita al usuario elegir el clculo del rea de cualquiera de las figuras geomtricas: crculo, cuadrado, rectngulo o tringulo mediante
funciones.
#include <vcl.h>
#pragma hdrstop
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

15

#pragma argsused
int n,r,b,a,b1,b2,a2;
float circulo(int r);
void carga();
float triangulo (int b, int a);
float cuadrado (int b1);
float rectangulo (int b2, int a2);
int main(int argc, char* argv[])
{
carga();
getch ();
return 0;
}
void carga ()
{
do
{
clrscr();
cout<<"1. circulo"<<endl;
cout<<"2. triangulo"<<endl;
cout<<"3. cuadrado"<<endl;
cout<<"4. rectangulo"<<endl;
cout<<"5. Salir"<<endl;
cout<<"Ingrese opcion:"<<endl;
cin>>n;
switch (n)
{
case 1:cout<<"Opcion 1=circulo"<<endl;
cout<<"Ingrese el radio del circulo:"<<endl;
cin>>r;
cout<<"El superficie del circulo es:"<<circulo(r)<<endl;
break;
case 2:cout<<"Opcion 2=triangulo"<<endl;
cout<<"Ingrese la base del triangulo:"<<endl;
cin>>b;
cout<<"Ingrese la altura del triangulo:"<<endl;
cin>>a;
cout<<"La superficie del triangulo es:"<<triangulo (a,b)<<endl;

break;
case 3:cout<<"Opcion 3=cuadrado"<<endl;
cout<<"Ingrese el lado del cuadrado:"<<endl;
cin>>b1;
cout<<"La superficie del cuadrado es:"<<cuadrado (b1)<<endl;
break;
case 4:cout<<"Opcion 4=rectangulo"<<endl;
cout<<"Ingrese la base del rectangulo:"<<endl;
cin>>b2;
cout<<"Ingrese la altura del rectangulo:"<<endl;
cin>>a2;
cout<<"La superficie del rectangulo es:"<<rectangulo (b2,a2)<<endl;

break;
}
getch();
}
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

16

while (n !=5);
}
float circulo(int r)
{
return ((float)(3.14*r*r));
}
float triangulo(int a, int b)
{
return ((float) (b*a)/2);
}
float cuadrado (int b1)
{
return ((float) (b1*b1));
}
float rectangulo (int b2, int a2)
{
return ((float)(b2*a2));
}

Paso de parmetros
C++ permite dos tipos de paso de parmetros:
copia, en terminologa de C++), y por referencia.

por valor

(tambin denominado por

Paso de parmetros por referencia


El paso de parmetros por referencia se utiliza cuando se le quiere pasar una variable a una
funcin o procedimiento, de manera que los cambios que se le hagan a esa variable dentro de
la funcin sean repercutidos despus en el resto del programa.
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#pragma argsused
void imprimeValor(int *n);
int main(int argc, char* argv[])
{
int contador = 0;
contador++;
cout<<"el valor del contador es:" << contador<<endl;
imprimeValor(&contador);
cout<<"Ahora el valor de contador es:" << contador<<endl;
getch();
return 0; }
void imprimeValor(int *n)
{
*n = 5;
}
Paso de parmetros por valor

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

17

El paso de parmetros por valor se utiliza cuando se le quiere simplemente pasar un dato a
una funcin o procedimiento, sin ms repercusiones en el resto del programa.
El paso de parmetros por valor admite dos variantes, que es necesario utilizar en funcin del
tipo de dato del parmetro que se quiera pasar. Para los tipos de datos simples, esto es, Entero y Real, el paso de parmetros por valor consiste bsicamente en poner el nombre del tipo y
el nombre del parmetro formal a continuacin. Para su invocacin, se indica el nombre de la
variable o un valor literal.
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#pragma argsused
void imprimeValor();
int main(int argc, char* argv[])
{
int contador = 0;
contador++;
cout<<"el valor del contador es:" << contador<<endl;
imprimeValor();
cout<<"Ahora el valor de contador es:" << contador<<endl;
getch();
return 0; }
void imprimeValor()
{
int contador = 5;
cout<<"El valor de contador es: "<< contador<<endl;
}

enum
Sintaxis:
enum nombre {lista-de-nombres} variable-lista;
La palabra clave enum es usada para crear un tipo enumerador llamado nombre que consiste
de los elementos en lista-de-nombre. La variable-lista es opcional, y puede ser usada para
crear instancias de tipo nombre junto con la declaracion. Por ejemplo, el siguiente cdigo crea
un tipo enumerador para colores:
enum ColorT {rojo, naranja, amarillo, verde, azul, indigo, violeta};
...
ColotT c1 = indigo;
if( c1 == indigo ) {
cout << "c1 es ndigo" << endl;
}

En el ejemplo anterior, el efecto de enumeracin es introducir nuevas constantes llamadas rojo, naranja, amarillo, etc. Por defecto, estas constantes son asignadas consecutivamente como
enteros empezando en cero. Puedes cambiar los valores de estas constantes, como es mostrado en el siguiente ejemplo:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

18

int main(int argc, char* argv[])


{
enum ColorT { rojo = 10, azul = 166, verde }; //verde toma el valor de azul+1
ColorT c = azul;
cout << "c es " << c << endl;
getch();
return 0; }

Se pone typedef para que funcione en compiladores C y C++ a la par:


typedef enum ColorT { rojo = 10, azul = 15, verde } ColorT;
ColorT c = verde;
cout << "c es " << c << endl;

Vectores Unidimensionales
Un vector o vector es un conjunto de datos del mismo tipo que se puede representar de la
siguiente manera:

Dicho vector podra haber sido representado por una definicin de 8 variables de tipo char.
Cabe destacar adems que los vectors comienzan en el ndice 0. Para declarar un vector se
sigue la siguiente sintaxis.
Tipo_Dato

Nombre_Variable[Cantidad_Elementos];

Ejemplo: Ingresar 10 elementos utilizando vectors y mostrar el mayor.


Entrada: 10 enteros
Salida: El mayor de los 10 enteros
#include <vcl.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#pragma hdrstop
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

19

#pragma argsused
void cargar();
void obtener_mayor(int vector[10]);
void mostrar_mayor(int mayor);
int main(){
cargar();
getch();
return 0;
}
void cargar(){
int vector[10],i;
for(i=0;i<10;i++){
clrscr();
cout<<"Ingrese el numero en la posicion "<<i+1<<": ";
cin>>vector[i];
}
obtener_mayor(vector);
}
void obtener_mayor(int vector[10]){
int mayor=0,i;
for(i=0;i<10;i++){
if(vector[i]>mayor){
mayor=vector[i];
}
}
mostrar_mayor(mayor);
}
void mostrar_mayor(int mayor){
clrscr();
cout<<"El mayor numero ingresado es: "<<mayor;
}

Vectors Bidimensionales o Matrices


Un vector multidimensional, es un vector de vectors. Una matriz es un vector bidimensional.
Declaracin de una matriz: int vector[filas][columnas];
int a[5][5],m[10][4],i,j,f,c //
Ejemplo:
int vector[5][3];

nombre del vector y dimensin

Su representacin es:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

20

Lectura de una Matriz (llenado):


for (i=0; i<5;i++)
{
for (j=0; j < 5 ; j=j+1)
{
Cout<<\n
Ingrese
elemento A[<<i<<][<<j<<] = ;
Cin>>a[i][j];
}
}

Cada elemento se referencia a travs


del nombre y su ubicacin en el conjunto, por ejemplo:
{
a[4][2]=10; // Se almacena en
la fila 5, columna 3 el valor 10
m[0][5]=0; // Se almacena en la
fila uno, columna 6 el valor 0
if (a[i][j] == a[j][i] ) // se
consulta si el valor ubicado en la
fila i-1 y columna j-1 es igual al
elemento
//
almacenado en la fila j-1 y columna
i-1
}

Consideraciones importantes asociadas al uso de matrices:


El procesamiento de todos los elementos requiere como mnimo dos ciclos iterativos.
Dentro de los ciclos se deben realizar las operaciones especficas que se solicitan.
Una matriz cuadrada es aquella en el numero de filas es igual al nmero de columnas.
Entre las aplicaciones ms importantes de las matrices est la posibilidad de resolver sistemas de ecuaciones con n variables.
Las matrices cuadradas tienen algunas caractersticas importantes asociadas a la ubicacin
de sus elementos en el conjunto. Se puede hablar de diagonal principal, diagonal secundaria,
triangular superior, triangular inferior, por mencionar algunas.

ORDENAMIENTO
Es la operacin de arreglar los registros de una tabla en algn orden secuencial de acuerdo a
un criterio de ordenamiento. El ordenamiento se efecta con base en el valor de algn campo
en un registro. El propsito principal de un ordenamiento es el de facilitar las bsquedas de los
miembros del conjunto ordenado.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

21

El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en
una secuencia tal que represente un orden, el cual puede ser numrico, alfabtico o incluso
alfanumrico, ascendente o descendente.
Ordenamiento Por Seleccin (Selection Sort)

Busca el elemento ms pequeo de la lista.


Intercambia con el elemento ubicado en la primera posicin de la lista.
Busca el segundo elemento ms pequeo de la lista.
Lo intercambia con el elemento que ocupa la segunda posicin en la lista.
Repite este proceso hasta que haya ordenado toda la lista.

ANLISIS DEL ALGORITMO.


Requerimientos de Memoria: Al igual que el ordenamiento burbuja, este algoritmo slo necesita una variable adicional para realizar los intercambios.
Tiempo de Ejecucin: El ciclo externo se ejecuta n veces para una lista de n elementos. Cada
bsqueda requiere comparar todos los elementos no clasificados.
Ventajas:
Fcil implementacin.
No requiere memoria adicional.
Rendimiento constante: poca diferencia entre el peor y el mejor caso.
Desventajas:
Lento.
Realiza numerosas comparaciones
#include <vcl.h>
#pragma hdrstop
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include <iostream.h>
#pragma argsused
void seleccionsort(int vector[15],int tamano);
void mostrarVector(int[], int);
int _main( )
{
const int tamano = 15;
int vector[tamano] = {25,17,13,16,41,32,12,115,95,84,54,63,78,21,10};
int i;
cout << "vector sin ordenar\n" ;
mostrarVector(vector,tamano);
cout << "vector ordenado\n" ;
seleccionsort(vector,tamano);
mostrarVector(vector,tamano);
getch();
return 0;
}
void seleccionsort (int A[], int n)
{
int min,i,j,aux;
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

22

for (i=0; i<n-1; i++)


{
min=i;
for(j=i+1; j<n; j++)
{ if(A[min] > A[j])
{min=j;
aux=A[min];
A[min]=A[i];
A[i]=aux ;}
}
}
}
void mostrarVector( int vector[], int tamano)
{
for (int i = 0 ; i < tamano ; i++)
cout << vector[i] << "/";
cout<<"\n";
}

Ordenamiento BubbleSort o Burbuja o Intercambio Directo.


Es un sencillo algoritmo de ordenamiento.
Funciona revisando cada elemento de la lista que va a ser
cambindolos de posicin si estn en el orden equivocado.
toda la lista hasta que no se necesiten ms intercambios, lo
denada. Este algoritmo obtiene su nombre de la forma con
mentos durante los intercambios, como si fueran pequeas
como el mtodo del intercambio directo.

ordenada con el siguiente, interEs necesario revisar varias veces


cual significa que la lista est orla que suben por la lista los ele"burbujas". Tambin es conocido

Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de
comparacin, siendo el ms sencillo de implementar.
#include <vcl.h>
#pragma hdrstop
#include<conio.h>
#include <iostream.h>
#pragma argsused
void BubbleSort(int vector[15],int tamano);
void mostrarVector(int[], int);
int main(int argc, _TCHAR* argv[])
{
const int tamano = 15;
int vector[tamano] = {20,17,13,16,41,32,12,115,95,84,54,63,78,21,10};
int i;
cout << "vector sin ordenar\n" ;
mostrarVector(vector,tamano);
cout << "vector ordenado\n" ;
BubbleSort(vector,tamano);
mostrarVector(vector,tamano);
getch();
return 0;
}
//----------------------------------------------------------------void BubbleSort(int A[],int n)
{int i, j, inc, temp, k,item ;
for (i = 1; i <n; i++ )
{
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

23

for (j = 0; j <n - i ; j++)


{
if (A[j]> A[j + 1])
{
temp = A[j];
A[j] = A[j + 1] ;
A[j + 1] = temp;
}
}
}
}
void mostrarVector( int vector[], int tamano)
{
for (int i = 0 ; i < tamano ; i++)
cout << vector[i] << "/";
cout<<"\n";
}

Ordenamiento Por Insercin Directa


DESCRIPCIN.
El algoritmo de ordenacin por el mtodo de insercin directa es un algoritmo relativamente sencillo y se comporta razonablemente bien en gran cantidad de situaciones.
Completa la tripleta de los algoritmos de ordenacin ms bsicos y de orden de complejidad cuadrtico, junto con SelectionSort y BubbleSort.
Se basa en intentar construir una lista ordenada en el interior del array a ordenar.
De estos tres algoritmos es el que mejor resultado da a efectos prcticos. Realiza una
cantidad de comparaciones bastante equilibrada con respecto a los intercambios, y tiene un
par de caractersticas que lo hacen aventajar a los otros dos en la mayor parte de las situaciones.
Este algoritmo se basa en hacer comparaciones, as que para que realice su trabajo de
ordenacin son imprescindibles dos cosas: un array o estructura similar de elementos comparables y un criterio claro de comparacin, tal que dados dos elementos nos diga si estn en
orden o no.
En cada iteracin del ciclo externo los elementos 0 a i forman una lista ordenada
ANLISIS DEL ALGORITMO.
Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es
estable.
Requerimientos de Memoria: Una variable adicional para realizar los intercambios.
Tiempo de Ejecucin: Para una lista den elementos el ciclo externo se ejecuta n1 veces. El
ciclo interno se ejecuta como mximo una vez en la primera iteracin, 2 veces en la segunda, 3
veces en la tercera, etc.

Ventajas:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

24

Fcil implementacin.
Requerimientos mnimos de memoria.

Desventajas:
Lento.
Realiza numerosas comparaciones.
Este tambin es un algoritmo lento, pero puede ser de utilidad para listas que estn ordenadas
o semi ordenadas, porque en ese caso realiza muy pocos desplazamientos.
void insercionDirecta(int A[],int n)
{
int i,j,v;
for (i = 1; i < n; i++)
{
v = A[i];
j=i -1;
while (j >= 0 && A[j] > v)
{
A[j + 1] = A[j];
j--;
}A[j+ 1] = v ;
}
}

Mtodo De Ordenamiento Por Insercin Binaria


El mtodo de ordenacin por 'insercin binaria'' es una mejora del mtodo de insercin directa.
Para lograr esta mejora se recurre a una bsqueda binaria en lugar de una bsqueda secuencial para insertar un elemento en la parte izquierda del vector, que ya se encuentra ordenado.
El resto del procedimiento es similar al de insercin directa, es decir, se repite este mismo procedimiento desde el segundo trmino hasta el ltimo elemento.
void insercionBinaria(int A[],int n)
{
int i,j,aux,izq,der,m;
for(i=1;i<n;i++)
{
aux = A[i];
izq=0;
der=i-1;
while(izq<=der)
{
m=((izq+der)/2);
if (aux<A[m])
der=m-1;
else
izq=m+1;
}
j=i-1;
while(j>=izq)
{
A[j+1]=A[j];
j=j-1;
}A[izq]=aux;
}
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

25

Ordenamiento por el Mtodo Shell


El mtodo Shell es una versin mejorada del mtodo de insercin directa. Este mtodo tambin
se conoce con el nombre de insercin con incrementos decrecientes. En el mtodo de ordenacin por insercin directa cada elemento se compara para su ubicacin correcta en el vector,
con los elementos que se encuentran en la parte izquierda del mismo. Si el elemento a insertar
es ms pequeo que el grupo de elementos que se encuentran a su izquierda, es necesario
efectuar entonces varias comparaciones antes de su ubicacin.
Shell propone que las comparaciones entre elementos se efecten con saltos de mayor tamao
pero con incrementos decrecientes, as, los elementos quedarn ordenados en el vector ms
rpidamente.
El Shell sort es una generalizacin del ordenamiento por insercin, teniendo en cuenta dos observaciones:
1. El ordenamiento por insercin es eficiente si la entrada est "casi ordenada".
2. El ordenamiento por insercin es ineficiente, en general, porque mueve los valores slo
una posicin cada vez.
El algoritmo Shell sort mejora el ordenamiento por insercin comparando elementos separados
por un espacio de varias posiciones. Esto permite que un elemento haga "pasos ms grandes"
hacia su posicin esperada. Los pasos mltiples sobre los datos se hacen con tamaos de espacio cada vez ms pequeos. El ltimo paso del Shell sort es un simple ordenamiento por
insercin, pero para entonces, ya est garantizado que los datos del vector estn casi ordenados.
El Shell sort lleva este nombre en honor a su inventor, Donald Shell, que lo public en 1959.
#include <vcl.h>
#pragma hdrstop
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include <iostream.h>
void ordenShell(int vector[15],int tamano);
void mostrarVector(int[], int);
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
const int tamano = 15;
int vector[tamano] = {25,17,13,16,41,32,12,115,95,84,54,63,78,21,10};
int i;
cout << "vector sin ordenar\n" ;
mostrarVector(vector,tamano);
cout << "vector ordenado\n" ;
ordenShell(vector,tamano);
mostrarVector(vector,tamano);
getch();
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

26

return 0;
}
//--------------------------------------------------------------------------void ordenShell(int A[],int n)
{int i, j, inc, temp;
for(inc = 1 ; inc<n;inc=inc*3+1);
while (inc > 0)
{
for (i=inc; i < n; i++)
{
j = i;
temp = A[i];
while ((j >= inc) && (A[j-inc] > temp))
{
A[j] = A[j - inc];
j = j - inc;
}
A[j] = temp;
}
inc/= 2;
}
}
void mostrarVector( int vector[], int tamano)
{
for (int i = 0 ; i < tamano ; i++)
cout << vector[i] << "/";
cout<<"\n";
}

Ordenamiento Heap Sort


El ordenamiento por montculos (Heap sort) es un algoritmo de ordenacin no recursivo, no
estable.
Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un montculo
(heap), y luego extraer el nodo que queda como nodo raz del montculo (cima) en sucesivas
iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los
montculos, por la cual, la cima contiene siempre el menor elemento (o el mayor, segn se
haya definido el montculo) de todos los almacenados en l.
El significado de heap en ciencia computacional es el de una cola de prioridades (priority
queue). Tiene las siguientes caractersticas:
Un heap es un vector de n posiciones ocupado por los elementos de la cola. (Nota: se utiliza un
vector que inicia en la posicin 1 y no en cero, de tal manera que al implementarla en C se
tienen n+1 posiciones en el vector.)
Se mapea un rbol binario de tal manera en el vector que el nodo en la posicin i es el padre
de los nodos en las posiciones (2*i) y (2*i+1).
El valor en un nodo es mayor o igual a los valores de sus hijos. Por consiguiente, el nodo padre
tiene el mayor valor de todo su subrbol.
PROCEDIMIENTO
Heap Sort consiste esencialmente en:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

27

Convertir el vector en un heap


Construir un vector ordenado de atrs hacia adelante (mayor a menor) repitiendo los siguientes pasos:

Sacar el valor mximo en el heap (el de la posicin 1)


Poner ese valor en el vector ordenado
Reconstruir el heap con un elemento menos
Utilizar el mismo vector para el heap y el vector ordenado

#include <vcl.h>
#pragma hdrstop
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include <iostream.h>
#pragma argsused
void heapsort(int vector[15],int tamano);
void mostrarVector(int[], int);
int _tmain(int argc, _TCHAR* argv[])
{
const int tamano = 15;
int vector[tamano] = {0,17,13,16,41,32,12,115,95,84,54,63,78,21,10};
int i;
cout << "vector sin ordenar\n" ;
mostrarVector(vector,tamano);
cout << "vector ordenado\n" ;
heapsort(vector,tamano);
mostrarVector(vector,tamano);
getch();
return 0;
}
//-----Este mtodo comienza en la posicin 1!!! --------------------void heapsort(int A[],int n)
{int i, j, inc, temp, k,item ;
for(k=n;k>0;k--)
{
for(i=1;i<=k;i++)
{
item=A[i];
j=i/2;
while(j>0 && A[j]<item)
{
A[i]=A[j];
i=j;
j=j/2;
}
A[i]=item;
}
temp=A[1];
A[1]=A[k];
A[k]=temp;
}
}
void mostrarVector( int vector[], int tamano)
{
for (int i = 1 ; i < tamano ; i++)
cout << vector[i] << "/";
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

28

cout<<"\n";
}

Bsqueda de elementos en un Vector


La bsqueda de un elemento dentro de un array es una de las operaciones ms importantes
en el procesamiento de la informacin, y permite la recuperacin de datos previamente almacenados. El tipo de bsqueda se puede clasificar como interna o externa, segn el lugar en el
que est almacenada la informacin (en memoria o en dispositivos externos). Todos los algoritmos de bsqueda tienen dos finalidades:
- Determinar si el elemento buscado se encuentra en el conjunto en el que se busca.
- Si el elemento est en el conjunto, hallar la posicin en la que se encuentra.
En este apartado nos centramos en la bsqueda interna. Como principales algoritmos de bsqueda en arrays tenemos la bsqueda secuencial, la binaria y la bsqueda utilizando tablas de
hash.
Bsqueda secuencial
Consiste en recorrer y examinar cada uno de los elementos del array hasta encontrar el o los
elementos buscados, o hasta que se han mirado todos los elementos del vector.
void secuencia(int a[n1],int k1)
{
int cual,x1;
bool ubicado=false;
cout<<"Que elemento se buscara? : ";cin>>cual;
cout<<endl;
for(x1=0;x1<=k1+1;x1++)
{
if(a[x1]==cual)
{
ubicado=true;
cout<<"Elemento encontrado en la posicion "<<x1<<endl;
}
}
if (ubicado=false) cout<<"Elemento no encontrado"<<endl;
}

Bsqueda binaria
La bsqueda binaria slo se puede implementar si el vector est ordenado. La idea consiste en
ir dividiendo el vector en mitades. Por ejemplo supongamos que tenemos este vector:
int vector[10] =

{2,4,6,8,10,12,14,16,18,20};

La clave que queremos buscar es 6. El algoritmo funciona de la siguien manera


1. Se determinan un indice arriba y un indice abajo, Iarriba=0 e Iabajo=9 respectivamente.
2. Se determina un indice central, Icentro = (Iarriba + Iabajo)/2, en este caso quedara
Icentro = 4.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

29

3. Evaluamos si vector[Icentro] es igual a la clave de busqueda, si es igual ya encontramos la clave y devolvemos Icentro.
4. Si son distintos, evaluamos si vector[Icentro] es mayor o menos que la clave, como el
vector est ordenado al hacer esto ya podemos descartar una mitad del vector asegurandonos que en esa mitad no est la clave que buscamos. En nuestro caso vector[Icentro] = 4 < 6, entonces la parte del vector vector[0...4] ya puede descartarse.
5. Reasignamos Iarriba o Iabajo para obtener la nueva parte del vector en donde queremos buscar. Iarriba, queda igual ya que sigue siendo el tope. Iabajo lo tenemos subir
hasta 5, entonces quedaria Iarriba = 9, Iabajo = 5. Y volvemos al paso 2.
Si la clave no fuese encontrada en algun momento Iabajo > Iarriba, con un while vamos a controlar esta condicin para salir del ciclo en tal caso y devolver -1 (clave no encontrada).
Hagamos modificaciones al cdigo de bsqueda lineal para implementar una funcin de bsqueda binaria.

//Bsqueda binaria en un vector.

#include <vcl.h>
#pragma hdrstop
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include <iostream.h>
int busquedaBinaria(const int[], int, int); //vector, tamao, clave
void ordenarVector(int[], int); //prototipo que modifica y ordena el vector
void intercambiar(int&, int&); //prototipo, intercambia los valores de dos
elementos
void mostrarVector(int[], int);
//-------------------------------------------------------------------#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
int clave =0;
const int tamano = 15;
int vector[tamano] = {20,17,13,16,41,32,12,115,95,84,54,63,78,21,10};
int i;
//ordenamos el vector para que funcione la busquedaBinaria
cout << "Vector sin ordenar\n" ;
mostrarVector(vector,tamano);
ordenarVector(vector,tamano);
cout << "Elementos del vector ordenado:\n";
mostrarVector(vector,tamano);
cout << "Indique un valor a buscar y se le devolvera el indice: " ;
cin >> clave;
cout<< "Su valor se encuentra en
vector["<<busquedaBinaria(vector,tamano,clave)<<"]" ;
cout << "Fin del programa :)";
getch();
return 0;
}
void mostrarVector( int vector[], int tamano)
{
for (int i = 0 ; i < tamano ; i++)
cout << vector[i] << "/";
cout<<"\n";
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

30

}
int busquedaBinaria(const int vector[], int tamano, int clave)
{
int Iarriba = tamano-1;
int Iabajo = 0;
int Icentro;
while (Iabajo <= Iarriba)
{
Icentro = (Iarriba + Iabajo)/2;
if (vector[Icentro] == clave)
return Icentro;
else
if (clave < vector[Icentro])
Iarriba=Icentro-1;
else
Iabajo=Icentro+1;
}
return -1;
}
void ordenarVector(int vector[], int tamano)
{
for (int i = 0; i< tamano -1 ; i++)
for (int j = 0; j< tamano -1 ; j++)
if (vector[j] > vector[j+1])
intercambiar(vector[j],vector[j+1]);
}
void intercambiar(int &a, int &b)
{
int tmp = b;
b = a;
a = tmp;
}

Recursividad
Se dice que algo es recursivo si se define en funcin de s mismo o a s mismo. Tambin se
dice que nunca se debe incluir la misma palabra en la definicin de sta. El caso es que las
definiciones recursivas aparecen con frecuencia en matemticas, e incluso en la vida real.
Un ejemplo: basta con apuntar una cmara al monitor que muestra la imagen que muestra esa
cmara. El efecto es verdaderamente curioso, en especial cuando se mueve la cmara alrededor del monitor.
En matemticas, tenemos mltiples definiciones recursivas:
- Nmeros naturales:
(1) 1 es nmero natural.
(2) el siguiente nmero de un nmero natural es un nmero natural
- El factorial: n!, de un nmero natural (incluido el 0):
(1) si n = 0 entonces: 0! = 1
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

31

(2) si n > 0 entonces: n! = n (n-1)!


Asimismo, puede definirse un programa en trminos recursivos, como una serie de pasos bsicos, o paso base (tambin conocido como condicin de parada), y un paso recursivo, donde
vuelve a llamarse al programa. En un computador, esta serie de pasos recursivos debe ser finita, terminando con un paso base. Es decir, a cada paso recursivo se reduce el nmero de pasos que hay que dar para terminar, llegando un momento en el que no se verifica la condicin
de paso a la recursividad. Ni el paso base ni el paso recursivo son necesariamente nicos.
Por otra parte, la recursividad tambin puede ser indirecta, si tenemos un procedimiento P que
llama a otro Q y ste a su vez llama a P. Tambin en estos casos debe haber una condicin de
parada.
Un ejemplo de programa recursivo en C, el factorial:
int factorial(int n)
{
if (n == 0) return 1;
return n * factorial(n-1);
}

Como se observa, en cada llamada recursiva se reduce el valor de n, llegando el caso en el que
n es 0 y no efecta ms llamadas recursivas. Hay que apuntar que el factorial puede obtenerse
con facilidad sin necesidad de emplear funciones recursivas, es ms, el uso del programa anterior es muy ineficiente, pero es un ejemplo muy claro.
A continuacin se expone un ejemplo de programa que utiliza recursin indirecta, y nos dice si
un nmero es par o impar. Al igual que el programa anterior, hay otro mtodo mucho ms
sencillo de determinar si un nmero es par o impar, basta con determinar el resto de la divisin
entre dos. Por ejemplo: si hacemos par(2) devuelve 1 (cierto). Si hacemos impar(4) devuelve 0
(falso).
/* declaracion de funciones, para evitar errores */
int par(int n);
int impar(int n);
int par(int n)
{
if (n == 0) return 1;
return impar(n-1);
}
int impar(int n)
{
if (n == 0) return 0;
return par(n-1);
}

Qu pasa si se hace una llamada recursiva que no termina?


Cada llamada recursiva almacena los parmetros que se pasaron al procedimiento, y otras variables necesarias para el correcto funcionamiento del programa. Por tanto si se produce una
llamada recursiva infinita, esto es, que no termina nunca, llega un momento en el que no quedar memoria para almacenar ms datos, y en ese momento se abortar la ejecucin del proLaboratorio de Programacin
EEST N5 Prof Abdala Pablo

32

grama. Para probar esto se puede intentar hacer esta llamada en el programa factorial definido
anteriormente:
factorial(-1);
Por supuesto no hay que pasar parmetros a una funcin que estn fuera de su dominio, pues
el factorial est definido solamente para nmeros naturales, pero es un ejemplo claro.

Fibonacci
Sucesin de Fibonacci, en matemticas, sucesin de nmeros en la que cada trmino es igual a
la suma de los dos trminos precedentes: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... y as
sucesivamente, que empieza con 0 y 1. Esta sucesin fue descubierta por el matemtico italiano Leonardo Fibonacci. Los nmeros de Fibonacci tienen interesantes propiedades y se utilizan mucho en matemticas. Las estructuras naturales, como el crecimiento de hojas en espiral
en algunos rboles, presentan con frecuencia la forma de la sucesin de Fibonacci.
#include <vcl.h>
#pragma hdrstop
#include<conio.h>
#include<stdio.h>
#include <tchar.h>
#pragma argsused
//----------------------------------------------double Fibonacci(int n);
int _tmain(int argc, _TCHAR* argv[])
{
int n;
/* Se solicita al usuario el valor de n */
Cout<<"Ingrese el valor de n: ";
Cin>>n;
/* Imprime el fibonacci de n */
Cout<<"El termino <<n<< de Fibonacci es: <<Fibonacci(n);
getch();
return 0;
}
//--------------------------------------------double Fibonacci(int n) {
switch (n) {
case 0 : return 0;
case 1 : return 1;
default: return Fibonacci(n - 1) + Fibonacci(n - 2);
/* ^-- Llamado recursivo --^ */
}
}

El tringulo de Pascal
En algn momento de tu vida habrs aprendido que (x + z)2 = x2 + 2xz + z2, que (x + z)3 = x3
+ 3x2z + 3xz2 + z3 y, en general, para cualquier entero positivo n, a calcular los coeficientes de
(x + z)n, y posiblemente le diste el nombre de nCm al coeficiente de xmzn-m. Seguramente recuerdas la siguiente tabla triangular:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

33

1
11
121
1331
14641
......
Esa tabla se conoce como tringulo de Pascal y se construye como sigue: Al principio se coloca
un 1 (que corresponde con 0C0). Para cada rengln subsecuente, digamos para el rengln n, se
coloca un 1 a la izquierda y un 1 a la derecha (que corresponden con nC0 y nCn, respectivamente) y los elementos restantes se calculan sumando los dos nmeros que tiene justo arriba a la
izquierda y arriba a la derecha, es decir, nCm = n-1Cm-1 + n-1Cm para toda 0 < m < n.
Entre otras cosas, el nmero nCm cuenta la cantidad de formas de escoger m objetos de un
total de n objetos distintos. A estos nmeros tambin se les llama las combinaciones de m objetos en n.
int comb(int n, int m)
{
if ((n == 0) || (n == m)) return 1;
else return comb(n-1,m-1) + comb(n-1,m);
}
Torres de Hanoi
La Leyenda
Segn una leyenda, los monjes del templo de una antigua ciudad de la India tienen que mover
una torre de 64 discos sagrados de un sitio a otro. Pero los discos son frgiles as que solo uno
de ellos puede moverse a la vez. Ningn disco puede colocarse encima de otro ms pequeo. Y
nicamente existe otro lugar en el templo (adems del sitio original y el destino) lo suficientemente sagrado para que una torre de discos pueda ponerse ah.

La leyenda dice adems que antes de que los monjes realicen el ltimo movimiento para completar la torre en su nuevo lugar, el templo se reducir a cenizas y el mundo se acabar.

.
El problema de las Torres de Hanoi
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

34

Este es un problema clsico de recursin, ya que pertenece a la clase de problemas cuya


solucin se simplifica notablemente al utilizar recursin.
Se tienen 3 torres y un conjunto de n discos de diferentes tamaos.
Cada uno de ellos tiene una perforacin en el centro que les permite deslizarse por cualquiera
de las torres. Inicialmente, los n discos estn ordenados de mayor a menor en una de las
torres (Torre A). Se deben pasar los discos a otra torre, utilizando la del medio como auxiliar.
Los movimientos deben hacerse respetando las siguientes reglas:
1. Solo puede moverse un disco a la vez, por lo tanto ste ser el que est en la parte
superior de una torre.
2. No se puede colocar un disco grande encima de uno ms pequeo.
Las torres de identificaran con las letras A, B y C; los discos estn inicialmente en la torre A
y se desea transferirlos a la torre B, de la misma manera como estn en A.
Este programa calcula la cantidad de movimientos necesarios ingresando la cantidad de discos.
#include <vcl.h>
#pragma hdrstop
#include<conio.h>
#include<stdio.h>
#include <tchar.h>
//--------------------------------------------------------------------------int hanoi(int n);
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
int n;
int disc, mov;
cout<<"::TORRES DE HANOI::\n";
cout<<"Numero de discos: ";
cin>>disc;
cout<<"\tMovimientos necesarios: <<hanoi(disc)<<\n";
getch();
return 0;
}
//----------------------------------------------int hanoi(int n)
{
if(n==1)
return 1;
else
return 2 * hanoi(n-1) + 1;
}

Operaciones recursivas con Vectores

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

35

- Dado un vector constituido de nmeros enteros y que contiene N elementos siendo N >= 1, devolver
la suma de todos los elementos.
int sumarray(int numeros[], int posicion, int N)
{
if (posicion == N-1) return numeros[posicion];
else return numeros[posicion] + sumarray(numeros, posicion+1, N);
}
...
int numeros[5] = {2,0,-1,1,3};
int N = 5;
cout<<sumarray(numeros, 0, N)<<endl;
Notar que la condicin de parada se cumple cuando se llega al final del array. Otra alternativa es recorrer el array desde el final hasta el principio (de derecha a izquierda):
int sumarray(int numeros[], int posicion)
{
if (posicion == 0) return numeros[posicion];
else return numeros[posicion] + sumarray(numeros, posicion-1);
}
...
int numeros[5] = {2,0,-1,1,3};
int N = 5;
cout<<sumarray(numeros, N-1)<<endl;

- Dado un array constituido de nmeros enteros, devolver la suma de todos los elementos. En este caso
se desconoce el nmero de elementos. En cualquier caso se garantiza que el ltimo elemento del array
es -1, nmero que no aparecer en ninguna otra posicin.
int sumarray(int numeros[], int posicion)
{
if (numeros[posicion] == -1) return 0;
else return numeros[posicion] + sumarray(numeros, posicion+1);
}
...
int numeros[5] = {2,4,1,-3,-1};
cout<<sumarray(numeros, 0)<<endl;

La razn por la que se incluye este ejemplo se debe a que en general no se conocer el nmero de elementos de la estructura de datos sobre la que se trabaja. En ese caso se introduce un centinela -como la
constante -1 de este ejemplo o la constante NULO para punteros, u otros valores como el mayor o menor entero que la mquina pueda representar- para indicar el fin de la estructura.

- Dado un array constituido de nmeros enteros y que contiene N elementos siendo N >= 1, devolver el
elemento mayor.
int mayor(int numeros[], int posicion)
{
int aux;
if (posicion == 0)
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

36

return numeros[posicion];
else {
aux = mayor(numeros, posicion-1);
if (numeros[posicion] > aux)
return numeros[posicion];
else
return aux;
}

}
...
int numeros[5] = {2,4,1,-3,-1};
int N = 5;
cout<<mayor(numeros, 4)<<endl;

Archivos en C++
Al igual que ocurre con la escritura en pantalla, a la hora de manejar los archivos desde C++,
podemos emplear las funciones que ya conocamos de C, o bien emplear otras nuevas posibilidades que aporta C++. Tambin al igual que ocurra con la pantalla, el manejo de archivos se
basar en flujos de entrada y salida.
Tenemos las clases fstream (archivo, en general), ifstream (archivo de entrada) y ofstream
(archivo de salida), todas ellas definidas en fstream.h. Leeremos y escribiremos con << y
>>, al igual que para la pantalla. Cerraremos un archivo con close (tanto si lo hemos abierto
como para leer o para escribir) y comprobaremos si se ha terminado un archivo de entrada con
eof (end of file fin de archivo).
Vamos a ver un primer ejemplo que lo aplique, creando un archivo de texto:
#include <fstream.h>
Int main() {
ofstream archivo("c: \\ejemplo.txt");
archivo << "Hola" << endl;
archivo << "Adios" << endl;
archivo.close();
}
Debera ser muy fcil de seguir:
Incluimos el archivo de cabecera fstream.h.
Definimos un archivo de salida, que tendr por nombre fsico ejemplo.txt en la unidad C: \
Escribimos dos lneas de texto en el archivo.
Cerramos en el archivo.
En un caso general, puede ocurrir que no sepamos el nombre fsico del archivo en el momento
de definir la variable archivo, sino ms tarde (por ejemplo, porque el usuario sea el que vaya
a teclear el nombre del archivo con el que trabajar, o porque vaya a escoger dicho nombre en
una ventana de dilogo). En ese caso, podemos usar la funcin miembro open.
Como ejemplo, vamos a leer el archivo que acabamos de crear:
#include <fstream.h>
#include <iostream.h>
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

37

int main() {
fstream archivo;
char texto[200];
archivo.open("ejemplo.txt", ios::in); // Abro para lectura
archivo >> texto;
// Leo una primera lnea
while (!archivo.eof())
// Mientras se haya podido leer algo
{
cout << texto << endl; // Muestro lo que se lee
archivo >> texto;
// Y vuelvo a intentar leer
}
archivo.close();
// Finalmente, cierro
}
La estructura es ligeramente distinta, pero aun as, debera resultar fcil de seguir. Esta vez, el
archivo lo hemos declarado como genrico, sin especificar si va a ser para lectura o escritura, de modo que este dato lo indicamos cuando realmente abrimos el archivo. Los modos de
apertura que tenemos disponibles son:
ios::in abre el archivo para lectura
ios::out abre el archivo para escritura
ios::append abre el archivo para aadir datos (al final, despus de los que ya contenga)
Si hubiramos declarado el archivo como ifstream, se dara por sentado que lo abrimos para
leer, y no sera necesario indicarlo:
ifstream archivo;
// Abro para lectura
archivo.open("C: \\ ejemplo.txt");
No hemos comprobado si el archivo realmente se ha podido abrir. Para conseguirlo, aadiramos despus de open algo parecido a esto, similar a lo que hacamos en C estndar:
if (!archivo) {
cerr << "No se ha podido abrir el archivo." << endl;
exit(1);
}
Estas son las ideas bsicas. Pero hay ms posibilidades, que voy a comentar con menos detalle, pero prefiero que se sepa que existen, porque pueden ser tiles en muchos casos. Por
ejemplo, podemos leer un bloque de datos de una determinada longitud, lo que ser til cuando manejemos archivos binarios, o escribir una serie de bytes, o leer un dato de un flujo pero
sin avanzar de posicin.
Estas son algunas funciones miembro de iostream que nos servirn para cosas como esas:
put(char c) escribe un carcter en un flujo de salida.
get(char& c) lee un carcter de un flujo de entrada.
read(char* s, int n) lee n bytes del flujo de entrada y los deposita en la cadena s
(normalmente se usar para entrada binaria).
write(const char* s, int n) escribe n bytes de la cadena s en un flujo de salida (normalmente
se usar para salida binaria).
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

38

get(char* s, int n, char c=\n) lee como mximo n caracteres del flujo de entrada
(incluyendo el \0) y los introduce en la cadena s, o hasta que encuentre el carcter de terminacin (por defecto \n, salto de lnea), o el fin de archivo. No retira el carcter de terminacin
del flujo de entrada.
getline(char* s, int n, char c=\n) lee como mximo n-1 caracteres del flujo de entrada, o
hasta que encuentre el carcter de terminacin (por defecto un final de (lnea) o hasta el fin de
archivo. Retira el carcter de terminacin del flujo de entrada,
pero no lo almacena en la cadena s.
ignore(int n=1, int delim=EOF) ignora o descarta los n caracteres siguientes de un flujo de
entrada (o un solo carcter, si no se indica el valor de n), o hasta que encuentra un cierto carcter de terminacin (por defecto el fin de archivo EOF).
peek() lee un carcter del flujo de entrada pero sin retirarlo de dicho flujo.
putback(char c) devuelve el carcter c al flujo de entrada (de modo que sera lo primero que
se leera en la prxima operacin de entrada).
Por otra parte, en la clase fstream tenemos otras funciones miembro que nos ayudarn a
comprobar errores en la lectura o escritura:
good () devuelve un valor distinto de cero si no ha habido ningn error.
eof() devuelve un valor distinto de cero si se ha llegado al fin del archivo, como ya hemos
visto.
bad() devuelve un valor distinto de cero si ha habido un error grave de entrada/salida grave.
No se puede continuar en esas condiciones.
fail() devuelve un valor distinto de cero si ha habido cualquier error de E/S distinto de
EOF. Despus podemos llamar a bad() para comprobar si el error es grave o si se puede intentar proseguir la lectura. Si bad() devuelve 0, el error no es grave y la lectura puede proseguir
despus de llamar a la funcin clear().
clear() resetea la situacin de error (siempre que no sea grave), para poder seguir leyendo.
Adems, tambin podemos comprobar si ha habido algn error en la forma que hemos empleado en el ejemplo anterior: cada funcin (open, read, etc) devolver un valor distinto de
cero cuando exista algn error, por lo que es habitual emplear construcciones como
if (!archivo) {
// No se ha podido abrir el archivo
}
o como
if (!archivo.get(ch)) {
// No se ha podido leer el siguiente dato.
}
Ejemplo de lectura de archivo sumo.in, convierte los contenidos en una matriz y guarda los
contenidos en un archvivo sumo.out del ejercicio LUCHADORES JAPONESES pag. 103.
#include <vcl.h>
#pragma hdrstop
#include<conio.h>
#include <tchar.h>
#include <fstream.h>
#include <iostream.h>
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

39

fstream archivo;
char
texto[200];
int
matriz[12][2],f,c;
archivo.open("c:\\sumo.in", ios::in); // Abro para lectura
archivo >> texto;
// Leo una primera linea
matriz[0][0]=atoi(texto);
while (!archivo.eof()) // Mientras se haya podido leer algo
{
for (f=1; f<=10;f++)
{
for (c=1; c<=2; c++)
{
archivo >> texto;
// Y vuelvo a intentar leer
matriz[f][c]=atoi(texto);// asigno a la matriz los datos leidos
}
}
}
ofstream archivoout("c:\\sumo.out");
cout<<matriz[0][0]<<"\n";
for (f=1; f<=10;f++)
{ cout<<"\n";
archivoout<<endl;
for (c=1; c<=2; c++)
{
cout<<matriz[f][c]<<"/";
archivoout << matriz[f][c]<< " ";
}
}
getch();
archivo.close();
return 0;
}

// Finalmente, cierro

Backtracking
* Introduccin
* La vuelta del caballo
* El problema de las ocho reinas
* El problema de la mochila (seleccin ptima)

Introduccin
Los algoritmos de vuelta atrs se utilizan para encontrar soluciones a un problema. No siguen
unas reglas para la bsqueda de la solucin, simplemente una bsqueda sistemtica, que ms
o menos viene a significar que hay que probar todo lo posible hasta encontrar la solucin o
encontrar que no existe solucin al problema. Para conseguir este propsito, se separa la bsqueda en varias bsquedas parciales o subtareas. Asimismo, estas subtareas suelen incluir ms
subtareas, por lo que el tratamiento general de estos algoritmos es de naturaleza recursiva.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

40

Por qu se llaman algoritmos de vuelta atrs?. Porque en el caso de no encontrar una solucin en una subtarea se retrocede a la subtarea original y se prueba otra cosa distinta (una
nueva subtarea distinta a las probadas anteriormente).
Puesto que a veces nos interesa conocer mltiples soluciones de un problema, estos algoritmos
se pueden modificar fcilmente para obtener una nica solucin (si existe) o todas las soluciones posibles (si existe ms de una) al problema dado.
Estos algoritmos se asemejan al recorrido en profundidad dentro de un grafo (ver seccin de
grafos, estructuras de datos, y recorrido de grafos, algoritmos), siendo cada subtarea un nodo
del grafo. El caso es que el grafo no est definido de forma explcita (como lista o matriz de
adyacencia), sino de forma implcita, es decir, que se ir creando segn avance el recorrido. A
menudo dicho grafo es un rbol, o no contiene ciclos, es decir, al buscar una solucin es, en
general, imposible llegar a una misma solucin x partiendo de dos subtareas distintas a y b; o
de la subtarea a es imposible llegar a la subtara b y viceversa.
Grficamente se puede ver as:

A menudo ocurre que el rbol o grafo que se genera es tan grande que encontrar una solucin
o encontrar la mejor solucin entre varias posibles es computacionalmente muy costoso. En
estos casos suelen aplicarse una serie de restricciones, de tal forma que se puedan podar algunas de las ramas, es decir, no recorrer ciertas subtareas. Esto es posible si llegado a un punto se puede demostrar que la solucin que se obtendr a partir de ese punto no ser mejor
que la mejor solucin obtenida hasta el momento. Si se hace correctamente, la poda no impide
encontrar la mejor solucin.
A veces, es imposible demostrar que al hacer una poda no se est ocultando una buena solucin. Sin embargo, el problema quizs no pida la mejor solucin, sino una que sea razonablemente buena y cuyo coste computacional sea bastante reducido. Esa es una buena razn para
aumentar las restricciones a la hora de recorrer un nodo. Tal vez se pierda la mejor solucin,
pero se encontrar una aceptable en un tiempo reducido.
Los algoritmos de vuelta atrs tienen un esquema genrico, segn se busque una o todas las
soluciones, y puede adaptarse fcilmente segn las necesidades de cada problema. A contiLaboratorio de Programacin
EEST N5 Prof Abdala Pablo

41

nuacin se exponen estos esquemas, extrados de Wirth Los bloques se agrupan con begin y
end, equivalentes a los corchetes de C, adems estn tabulados.
- esquema para una solucin:
procedimiento ensayar (paso : TipoPaso)
repetir
| seleccionar_candidato
| if aceptable then
| begin
| anotar_candidato
| if solucion_incompleta then
| begin
|
ensayar(paso_siguiente)
|
if no acertado then borrar_candidato
| end
| else begin
|
anotar_solucion
|
acertado <- cierto;
| end
hasta que (acertado = cierto) o (candidatos_agotados)
fin procedimiento

- esquema para todas las soluciones:


procedimiento ensayar (paso : TipoPaso)
para cada candidato hacer
| seleccionar candidato
| if aceptable then
| begin
| anotar_candidato
| if solucion_incompleta then
|
ensayar(paso_siguiente)
| else
|
almacenar_solucion
| borrar_candidato
| end
hasta que candidatos_agotados
fin procedimiento

Por ltimo, se exponen una serie de problemas tpicos que se pueden resolver fcilmente con
las tcnicas de vuelta atrs. El primero que se expone es muy conocido. Se trata de la vuelta
del caballo. Muchos problemas de los pasatiempos de los peridicos pueden resolverse con la
ayuda de un ordenador y en esta web se muestran algunos de ellos.

La vuelta del caballo

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

42

Se dispone de un tablero rectangular, por ejemplo el tablero de ajedrez, y de un caballo, que


se mueve segn las reglas de este juego. El objetivo es encontrar una manera de recorrer todo
el tablero partiendo de una casilla determinada, de tal forma que el caballo pase una sola vez
por cada casilla. Una variante es obligar al caballo a volver a la posicin de partida en el ltimo
movimiento.
Por ltimo se estudiar como encontrar todas las soluciones posibles partiendo de una misma
casilla.
Para resolver el problema hay que realizar todos los movimientos posibles hasta que ya no se
pueda avanzar, en cuyo caso hay que dar marcha atrs, o bien hasta que se cubra el tablero.
Adems, es necesario determinar la organizacin de los datos para implementar el algoritmo.
- Cmo se mueve un caballo?. Para aquellos que no sepan jugar al ajedrez se muestra un
grfico con los ocho movimientos que puede realizar. Estos movimientos sern los ocho candidatos.

Con las coordenadas en las que se encuentre el caballo y las ocho coordenadas relativas se
determina el siguiente movimiento. Las coordenas relativas se guardan en dos arrays:
ejex = [2, 1, -1, -2, -2, -1, 1, 2]
ejey = [1, 2, 2, 1, -1, -2, -2, -1]
El tablero, del tamao que sea, se representar mediante un array bidimensional de nmeros
enteros. A continuacin se muestra un grfico con un tablero de tamao 5x5 con todo el recorrido partiendo de la esquina superior izquierda.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

43

Cuando se encuentra una solucin, una variable que se pasa por referencia es puesta a 1 (cierto). Puede hacerse una variable de alcance global y simplificar un poco el cdigo, pero esto no
siempre es recomendable.
Para codificar el programa, es necesario considerar algunos aspectos ms, entre otras cosas no
salirse de los lmites del tablero y no pisar una casilla ya cubierta (seleccin del candidato). Se
determina que hay solucin cuando ya no hay ms casillas que recorrer.
A continuacin se expone un cdigo completo en C, que recubre un tablero cuadrado de lado N
partiendo de la posicin (0,0).
#include <stdio.h>
#define N 5
#define ncuad N*N
void mover(int tablero[][N], int i, int pos_x, int pos_y, int *q);
const int ejex[8] = { -1,-2,-2,-1, 1, 2, 2, 1 },
ejey[8] = { -2,-1, 1, 2, 2, 1,-1,-2 };
int main(void)
{
int tablero[N][N]; /* tablero del caballo. */
int i,j,q;
/* inicializa el tablero a cero */
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
tablero[i][j] = 0;
/* pone el primer movimiento */
tablero[0][0] = 1;
mover(tablero,2,0,0,&q);
if (q) { /* hay solucion: la muestra. */
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%3d ", tablero[i][j]);
putchar('\n');
}
}
else
printf("\nNo existe solucion\n");
return 0;
}
void mover(int tablero[][N],int i, int pos_x, int pos_y, int *q)
{
int k, u, v;
k = 0;
*q = 0;
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

44

do {
u = pos_x + ejex[k]; v = pos_y + ejey[k]; /* seleccionar candidato */
if (u >= 0 && u < N && v >= 0 && v < N) { /* esta dentro de los limites? */
if (tablero[u][v] == 0) { /* es valido? */
tablero[u][v] = i; /* anota el candidato */
if (i < ncuad) { /* llega al final del recorrido? */
mover(tablero,i+1,u,v,q);
if (!*q) tablero[u][v] = 0; /* borra el candidato */
}
else *q = 1; /* hay solucion */
}
}
k++;
} while (!*q && k < 8);

Cambiando el valor de N puede obtenerse una solucin para un tablero cuadrado de tamao N.
A continuacin, se muestra una adaptacin del procedimiento que muestra todas las soluciones. Si se ejecuta para N = 5 se encuentra que hay 304 soluciones partiendo de la esquina
superior izquierda.
Cuando se encuentra una solucin se llama a un procedimiento (no se ha codificado aqu) que
imprime todo el tablero.
void mover(int tablero[][N],int i, int pos_x, int pos_y)
{
int k, u, v;
for (k = 0; k < 8; k++) {
u = pos_x + ejex[k]; v = pos_y + ejey[k];
if (u >= 0 && u < N && v >= 0 && v < N) { /* esta dentro de los limites */
if (tablero[u][v] == 0) {
tablero[u][v] = i;
if (i < ncuad)
mover(tablero,i+1,u,v);
else imprimir_solucion(tablero);
tablero[u][v] = 0;
}
}
}
}
El problema de las ocho reinas
Continuamos con problemas relacionados con el ajedrez. El problema que ahora se plantea es
claramente, como se ver, de vuelta atrs. Se recomienda intentar resolverlo a mano.
Se trata de colocar ocho reinas sobre un tablero de ajedrez, de tal forma que ninguna amenace
(pueda comerse) a otra. Para los que no sepan ajedrez deben saber que una reina amenaza a
otra pieza que est en la misma columna, fila o cualquiera de las cuatro diagonales.
La dificultad que plantea este problema es la representacin de los datos. Se puede utilizar un
array bidimensional de tamao 8x8, pero las operaciones para encontrar una reina que amenaLaboratorio de Programacin
EEST N5 Prof Abdala Pablo

45

ce a otra son algo engorrosas y hay un truco para evitarlas. La solucin aqu expuesta vuelve a
ser tomada de Wirth
Es lgico que cada reina debe ir en una fila distinta. Por tanto, en un array se guarda la posicin de cada reina en la columna que se encuentre. Ejemplo: si en la tercera fila hay una reina
situada en la quinta columna, entonces la tercera posicin del array guardar un 5. A este
array se le llamar col.
Hace falta otro array que determine si hay puesta una reina en la fila j-sima. A este array se
le llamar fila.
Por ltimo se utilizan dos arrays ms para determinar las diagonales libres, y se llamarn
diagb y diagc.
Para poner una reina se utiliza esta instruccin:
col[i] = j ; fila[j] = diagb[i+j] = diagc[7+i-j] = FALSE;
Para quitar una reina esta otra:
fila[j] = diagb[i+j] = diagc[7+i-j] = TRUE;
Se considera vlida la posicin para este caso:
if (fila[j] && diagb[i+j] && diagc[7+i-j]) entonces proceder ...
A continuacin se expone el cdigo completo en C. Se han utilizado tipos enumerados para
representar los valores booleanos.
#include <stdio.h>
enum bool {FALSE, TRUE};
typedef enum bool boolean;
void ensayar(int i, boolean *q, int col[], boolean fila[], boolean diagb[], boolean diagc[]);
int main(void)
{
int i;
boolean q;
int col[8];
boolean fila[8],diagb[15], diagc[15];
for (i = 0; i < 8; i++) fila[i] = TRUE;
for (i = 0; i < 15; i++) diagb[i] = diagc[i] = TRUE;
ensayar(0,&q,col,fila,diagb,diagc);
if (q) {
printf("\nSolucion:");
for (i = 0; i < 8; i++) printf(" %d", col[i]);
} else printf("\nNo hay solucion");
return 0;
}
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

46

void ensayar(int i, boolean *q, int col[], boolean fila[], boolean diagb[], boolean diagc[])
{
int j;
j = 0;
*q = FALSE;
do {
if (fila[j] && diagb[i+j] && diagc[7+i-j]) {
col[i] = j; fila[j] = diagb[i+j] = diagc[7+i-j] = FALSE;
if (i < 7) { /* encuentra solucion? */
ensayar(i+1,q,col,fila,diagb,diagc);
if (!*q)
fila[j] = diagb[i+j] = diagc[7+i-j] = TRUE;
} else *q = TRUE; /* encuentra la solucion */
}
j++;
} while (!*q && j < 8);
}
Por ltimo, se deja al lector que implemente un procedimiento que encuentre todas las soluciones. Si se desea complicar ms entonces se puede pedir que encuentre todas las soluciones
distintas, es decir, aquellas que no sean rotaciones o inversiones de otras soluciones.
Ahora que se conoce el mtodo general, puede hacerse extensible a mltiples piezas simultneamente.

El Problema de la mochila (seleccin ptima)


Con anterioridad se ha estudiado la posibilidad de encontrar una nica solucin a un problema
y la posibilidad de encontrarlas todas. Pues bien, ahora se trata de encontrar la mejor solucin,
la solucin ptima, de entre todas las soluciones.

Partiendo del esquema que genera todas las soluciones expuesto anteriormente se puede obtener la mejor solucin (la solucin ptima, seleccionada entre todas las soluciones) si se modifica la instruccin almacenar_solucion por esta otra:
si f(solucion) > f(optimo) entonces optimo <- solucin

siendo f(s) funcin positiva, optimo es la mejor solucion encontrada hasta el momento, y solucion es una solucion que se est probando.

El problema de la mochila consiste en llenar una mochila con una serie de objetos que tienen
una serie de pesos con un valor asociado. Es decir, se dispone de n tipos de objetos y que no
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

47

hay un nmero limitado de cada tipo de objeto (si fuera limitado no cambia mucho el problema). Cada tipo i de objeto tiene un peso wi positivo y un valor vi positivo asociados. La mochila
tiene una capacidad de peso igual a W. Se trata de llenar la mochila de tal manera que se maximice el valor de los objetos incluidos pero respetando al mismo tiempo la restriccin de
capacidad. Notar que no es obligatorio que una solucin ptima llegue al lmite de capacidad
de la mochila.

Ejemplo: se supondr:
n=4
W=8
w() = 2, 3, 4, 5
v() = 3, 5, 6, 10
Es decir, hay 4 tipos de objetos y la mochila tiene una capacidad de 8. Los pesos varan entre 2
y 5, y los valores relacionados varan entre 3 y 10.
Una solucin no ptima de valor 12 se obtiene introduciendo cuatro objetos de peso 2, o 2 de
peso 4. Otra solucin no ptima de valor 13 se obtiene introduciendo 2 objetos de peso 3 y 1
objeto de peso 2. Cul es la solucin ptima?.
A continuacin se muestra una solucin al problema, variante del esquema para obtener todas
las soluciones.
void mochila(int i, int r, int solucion, int *optimo)
{
int k;
for (k = i; k < n; k++) {
if (peso[k] <= r) {
mochila(k, r - peso[k], solucion + valor[k], optimo);
if (solucion + valor[k] > *optimo) *optimo = solucion+valor[k];
}
}
}
Dicho procedimiento puede ser ejecutado de esta manera, siendo n, W, peso y valor variables
globales para simplificar el programa:
n = 4,
W = 8,
peso[] = {2,3,4,5},
valor[] = {3,5,6,10},
optimo = 0;
...
mochila(0, W, 0, &optimo);

Ejemplo Backtraking

Caminos

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

48

Sea un tablero de dimensiones MxN, 1<=M<=9, 1<=N<=9, tal que cada casilla contenga una
letra mayscula. La casilla que est en la fila m y la columna n la identificamos mediante (m,n).
Dos casillas diferentes (mi,ni) y (mj,nj) son adyacentes si se cumple:
- para la primera componente, |mi-mj|<=1 o |mi-mj|=M-1, y
- para la segunda componente, |ni-nj|<=1 o |ni-nj|=N-1.
Es decir, son adyacentes todas aquellas casillas que rodean a una dada, considerando que en
el tablero como si la ltima fila estuviera unida a la primera, y lo mismo para las columnas. En
el dibujo siguiente marcamos con un asterisco las casillas adyacentes a las casillas (2,3) (a la
izquierda) y (1,1) (a la derecha) en un tablero 4x4:
.
.
.
.

***
.*.*
*.*
**.*
***
....
...
**.*

Dada una palabra de k letras maysculas A=a1 a2 ... ak, k>=1, decimos que A est contenida
en el tablero si se cumple que:
- existe una casilla (m1,n1) que contiene la letra a1,
- para cada letra ai+1, 1<=i<k, existe una casilla (mi+1,ni+1) que contiene ai+1 cumplindose
que (mi,ni) y (mi+1,ni+1) son casillas adyacentes en el tablero, y
- no existen dos casillas (mi,ni) y (mj,nj) iguales, 1<=i, j<=k.
A la secuencia de casillas (m1,n1), ..., (mk,nk) la llamamos el camino de A en el tablero.
As, dado el tablero 4x4 de la figura siguiente, las cadenas "SOLA", "HOLA" y "ADIOS" estn
contenidas en l, pero no sucede lo mismo con "GOZA", "HORA" ni "HALA".
SHAZ
IOLG
EZEF
OHDI
En el caso de "SOLA", las casillas que forman su camino son (1,1), (2,2), (2,3) y (1,3). Para
"HOLA", son (1,2), (2,2), (2,3) y (1,3). Para "ADIOS", el camino es (1,3), (4,3), (4,4), (4,1) y
(1,1).
Dado un tablero de las caractersticas anteriormente descritas y una palabra A compuesta por
letras maysculas, se pide calcular el camino de A. Al construir el programa, podis suponer
que A est contenida en el tablero y que existe un nico camino para ella.
Entrada
Residente en el archivo de caracteres "CAMI.DAT":

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

49

- Lnea 1: valores de M y N (un carcter del '1' al '9') separados por un nico blanco
- Lneas de la 2 a la M+1 (la lnea k representa la fila k-1 del tablero): N caracteres, representando el contenido de la lnea correspondiente del tablero
- Lnea M+2: p caracteres, M*N>=p>=1, que representa la palabra a tratar.
Salida
A guardar en el archivo de caracteres "CAMI.OUT":
p lneas (una para cada letra de la palabra a tratar), siendo el contenido de la lnea k igual a la
casilla que aparece en posicin k dentro del camino de la palabra, de esta forma: carcter del
'1' al '9' - blanco - carcter del '1' al '9'
Ejemplo de entrada
44
SHAZ
IOLG
EZEF
OHDI
SOLA
Ejemplo de salida
1
2
2
1

1
2
3
3

Este problema se ha resuelto utilizando la recursividad (marcha atrs, backtracking). Primero


se busca la primera letra de la palabra buscada, y una vez encontrada se busca la siguiente
entre las adyacentes. As se miran todas las posibilidades hasta que se encuentra la palabra
buscada. Es un mtodo de fuerza bruta, un poco lento para casos grandes, pero muy efectivo
cuando el tamao de la tabla es pequeo (el lmite en este problema es 9). El problema en s
no tiene ms dificultades, pero se pueden utilizar un par de trucos para hacer el cdigo ms
sencillo:
1.- No est permitido recorrer dos veces la misma casilla en una palabra, por lo que hay que
tener algo que nos indique si una casilla se ha utilizado anteriormente o no. Para eso se utiliza
otra tabla auxiliar del mismo tamao que la original, inicializada a 0. Cuando una casilla se utiliza, la casilla correspondiente de la tabla auxiliar pasa a marcar 1, as cuando se vaya a utilizar
una casilla primero habr que mirar si ya se ha usado o no (marca 1 0). Hay que tener cuidado, al hacer backtracking hay que volver a poner la casilla a 0.
2.- Para mirar las casillas adyacentes en busca de una nueva letra se puede implementar una a
una las 8 direcciones, lo que hara un cdigo largo, engorroso y difcil de depurar, o se puede
tener en dos arrays los incrementos posibles de sila y de columna; si estamos en (F,C), podemos ir a (F-1,C-1), (F-1,C), (F-1,C+1), (F,C-1), (F,C+1), (F+1,C-1), (F+1,C) y (F+1,C+1). Si
tenemos un array con los valores:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

50

FF={-1,-1,-1, 0, 0, 1, 1, 1};
CC={-1, 0, 1,-1, 1,-1, 0, 1};
se puede llegar a las 8 casillas con un bucle for, del tipo:
for(i=0;i<8;i++)
{
filanueva = filaantigua + FF[i];
columnanueva = columnaantigua + CC[i];
...
}
As se ahorra lneas de cdigo, y en caso de haber errores, con modificarlo en un sitio basta.
3.- El problema tambin considera adyacentes de una casilla situada en un borde las casillas
del lado opuesto, como si la tabla fuera cclica. Para no tener que preocuparse de este problema, al hallar las casillas adyacentes basta con hacerlas mdulo nmero de filas (o columnas,
segn corresponda):
filanueva = (filaantigua + FF[i]) % numerodefilas;
columnanueva = (columnaantigua + CC[i]) % numerodecolumnas;
Pero esto falla en un caso, cuando filaantigua es 0, y FF[i] es -1, filanueva toma el valor -1 (lo
que dara un runtime error). Para evitar eso, y aprovechndonos de que a % b = (a + b) % b,
basta con poner:
filanueva = (filaantigua + FF[i] + numerodefilas) % numerodefilas;
columnanueva = (columnaantigua + CC[i] + numerodecolumnas) % numerodecolumnas;
As nos aseguramos de que las nuevas coordenadas son positivas.
4.- El programa te pide que des las posiciones de las casillas en las que est la palabra, ordenadas del principio al final, y al hacer backtracking salen ordenadas justo al revs (del final al
principio). Para dar la salida correctamente hay dos soluciones: una es guardar las casillas en
una tabla, lo que supone un gasto de memoria (y de tiempo, importante en una funcin recursiva). Lo ms eficaz es buscar la palabra del final al principio, en vez de buscarla del principio al
final. Por ejemplo, si te piden hallar la palabra SOLA, hallamos la palabra ALOS, y al dar las
coordenadas de esta palabra al revs, se obtienen las coordenadas de la palabra SOLA en orden correcto.
#include <vcl.h>
#pragma hdrstop
#include<string.h>
#include <conio.h>
#include <fstream.h>
#include <iostream.h>
#pragma argsused
bool busca(int,int,int); // Funcin recursiva que
// busca la palabra pedida en la tabla.
char mapa[9][9]; // Variable que contiene la tabla.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

51

char v[9][9]; // Indica si hemos utilizado una casilla o no.


int F,C; // Nmero de filas y columnas de la tabla.
char cad[100];
int l; // Palabra a buscar y su longitud.
int ff[8]={1,1,1,-1,-1,-1,0,0}; // Incremento de la fila
int cc[8]={-1,0,1,-1,0,1,-1,1}; // Incremento de la columna
int main(int argc, char* argv[])
{
int a,b;
ifstream archivo_entrada("c:\\cami.dat");
ofstream archivo_salida("c:\\cami.out");

// Abro los archivos.

archivo_entrada>>F;
archivo_entrada>>C; // Leo el nmero de filas y columnas.
for(a=0;a<F;a++) // Leo la tabla.
for(b=0;b<C;b++)
{
archivo_entrada>>mapa[a][b];
}
archivo_entrada>>cad; // Leo la palabra a buscar
l=strlen(cad); // y su longitud.
memset(v,0,sizeof(v)); // No he utilizado ninguna casilla.
for(a=0;a<F;a++) // Recorro la tabla buscando la ltima letra de la palabra
for(b=0;b<C;b++)
if(mapa[a][b]==cad[l-1]) // Cuando la encuentro
{
v[a][b]=1; // Marco como utilizada la casilla.
if(busca(a,b,l-2))// Y busco la penltima. Si forma parte de la palabra:
archivo_salida<<a+1<<" "<<b+1<<"\n";//Imprimo la posicin de esa casilla.
v[a][b]=0; // Marco como no utilizada la casilla.
}
getch();
return(0); // Fin.
}
// Funcin recursiva que busca la palabra en la tabla, del final al principio,
// para que al imprimir las casillas estn ordenadas de principio a fin.
bool busca(int f,int c,int prof)
{
int a,f1,c1;
if(prof<0) // Si se ha encontrado toda la palabra:
return(true); // Empezar a deshacer el camino.
for(a=0;a<8;a++) // Recorro las 8 direcciones.
{
f1=(f+ff[a]+F)%F; // Nuevo valor de la fila.
c1=(c+cc[a]+C)%C; // Nuevo valor de la columna.
if(v[f1][c1]==0 && mapa[f1][c1]==cad[prof]) // si la nueva casilla no se
ha utilizado y coincide con la letra que se busca:
{
v[f1][c1]=1; // Se marca como utilizada
if(busca(f1,c1,prof-1)) // Seguir buscando con la letra anterior.
Si se ha encontrado la palabra:
{
archivo_salida<<f1+1<<" "<<c1+1<<"\n"; // Imprimir la casilla.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

52

return(true); // Seguir deshaciendo el camino.


}
v[f1][c1]=0; // Se marca como no utilizada
}
}
return(false); // No se ha encontrado la palabra.
}

Cadenas de caracteres en C++. STRING


Una cadena de caracteres en C++ no es ms que un vector de caracteres.
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
// inicializaciones
string sCadena;
string sCadena2("hola2");
sCadena = "hola";
cout << "1: " << sCadena << " " << sCadena2 << endl;
// paso de char* a string y viceversa
char szCadena[10]="adios";
sCadena = szCadena;
cout << "2: " << sCadena << endl;
sCadena = "hola";
strcpy(szCadena,sCadena.c_str());
cout << "2b: " << szCadena << endl;
// operaciones de acceso
cout << "3: " << "[3] " << sCadena[3] << endl;
cout << "4: " << sCadena.substr(0,3) << endl;
// operaciones de busqueda
cout << "5: " << sCadena.find("la",0) << endl;
// operaciones de modificacion
cout << "6: " << sCadena.erase(0,2) << endl;
// operacin de concatenacin
cout << "7: " << sCadena + sCadena2 << endl;
// operacin de comparacin
cout << "8: " << (sCadena == sCadena) << endl;
// Operacion de longitud
cout << "9: " << sCadena.length() << endl;
// Operacion de tamao
cout << "10: " << sCadena.size() << endl;
return 0;

operador[]
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

53

Imprime el contenido de la variable str, caracter por caracter con el ciclo for.
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ("prueba de string");
int i;
for (i=0; i < str.length(); i++)
{
cout << str[i];
}
return 0;
}
Swap
Vuelca el contenido de un String en otro

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string buyer ("dinero");
string seller ("mercaderia");
cout << "Antes de cambiar el comprador tiene " << buyer;
cout << " y el vendedor " << seller << endl;
seller.swap (buyer);
cout << " Antes de cambiar el comprador tiene " << buyer;
cout << " y el vendedor tiene " << seller << endl;
getch();
return 0;
}
find_first_of
Encuentra caracteres en una variable String
#include <vcl.h>
#pragma hdrstop
#include <conio.h>
#pragma argsused
#include <iostream>
#include <string>
using namespace std;
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

54

int main(int argc, char* argv[])


{
string str ("Remplaza las vocales por asteriscos.");
size_t found;
found=str.find_first_of("aeiou");
while (found!=string::npos)
{
str[found]='*';
found=str.find_first_of("aeiou",found+1);
}
cout << str << endl;
getch();
return 0;
}

Biblioteca conio
Contiene los prototipos de las funciones, macros, y constantes para preparar y manipular la
consola en modo texto en el entorno de MS-DOS.
Nombre Funcin
clrscr

getch

getchar

gotoxy(int x, int
y);

Descripcin
Esta funcin despeja la ventana de texto actual y
coloca el cursor en la esquina superior izquierda:
posicin (1,1).
La funcin getch retorna el carcter ledo desde
el teclado.

Ejemplo
clrscr();

Lee un caracter de el teclado y regresa el caracter leido.

char vocal;

Mueve el cursor de la ventana de texto a la posicin segn las coordenadas especificadas por los
argumentos x e y. Si las coordenadas no son vlidas entonces la llamda a la funcin gotoxy es
ignorada. Los argumentos no pueden ser 0.

getch();

vocal=getchar();
gotoxy( 1, 15 );

Librera math.h es un archivo de cabecera de la biblioteca estndar . Muchas de sus funciones incluyen el uso de nmeros en coma flotante.
Nombre
acos
asin
atan
atan2
cos

Descripcin
arcocoseno
arcoseno
arcotangente
arcotangente de dos parmetros
coseno

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

55

abs
fmod

valor absoluto
resto del punto flotante
printf ("fmod de 5.3 / 2 es%lf\n", fmod (5.3,2) );

pow(x,y)
sin
Sqr

eleva un valor dado a un exponente, xy


seno
Cuadrado de un nmero
int main ()
{
double param, result;
param = 1024.0;
result = sqrt (param);
printf ("sqrt(%lf) = %lf\n", param, result );
return 0;
}

sqrt
tan

raz cuadrada
tangente

Punteros
Introduccin
El puntero es una tcnica muy potente que hace que la programacin C++ sea tan utilizada. La
tcnica de punteros apoya a la programacin orientada a objetos, que es una de las grandes
diferencias entre C y C++.
Definicin: Un puntero es una variable que almacena una direccin de memoria.

Operador de Direccin: &

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

56

Referencias

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

57

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

58

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

59

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

60

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

61

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

62

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

63

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

64

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

65

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

66

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

67

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

68

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

69

Templates
INTRODUCCIN
Las tcnicas de Templates en C++, permiten un grado de programacin genrica,
cdigos especiales para problemas especializados.

creando

Por ejemplo, la idea del valor mnimo o mximo, se repite infinidad de veces en la programacin, aunque los objetos a evaluar varen de un caso a otro por el tipo de datos. Sobre esta
idea surgi un nuevo paradigma denominado programacin genrica o funcional.
La programacin genrica est mucho ms centrada en los algoritmos que en los datos y su
postulado fundamental puede sintetizarse en una palabra: generalizacin. Significa que, en la
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

70

medida de lo posible, los algoritmos deben ser parametrizados al mximo y expresados de la


forma ms independiente posible de detalles concretos, permitiendo as que puedan servir
para la mayor variedad posible de tipos y estructuras de datos.
A menudo se tiene el pensamiento que un programa es la implementacin de un mapeo
(mapping). El programa toma valores y mapea entonces a su salida. En la programacin imperativa este mapping es realizado en forma indirecta, por los comandos que leen
valores de entrada, manipulan estos y luego escriben las salidas. Los comandos influyen
en los programas mediante el uso de las variables almacenadas en la memoria.
En la programacin funcional, el mapping de valores de entrada a valores de salida es realizado de modo directo. El programa es una funcin o grupo de funciones; sus relaciones son
muy simples: entre ellas se invocan. Los programas son escritos en un lenguaje de expresiones, funciones y declaraciones.
El cdigo es similar siempre, pero estamos obligados a rescribir ciertas funciones que dependen del tipo o de la clase del objeto que se almacena. Tmese por ejemplo el problema de
encontrar el valor mayor de un par de datos; tanto para un entero, flotante, carcter, etc.
Se hace uso de las funciones prototipos; en este caso para encontrar el mayor de dos valores para distintos tipos de datos:
Se hace uso de esta sobrecarga de funciones, para obtener el mayor entre dos enteros,
doble flotantes y carcter.
int max(int,int);
double max(double,double);
char max(char,char);

#include <iostream.h>
#include <stdlib.h>
// sobrecarga de funciones para max()
int max(int,int);
double max(double,double);
char max(char,char);
void main()
{
int a=5,b=3;
cout <<" El mayor de los enteros es : << max(a,b)<< endl;
double c=5.5,d=10;
cout << El mayor de los flotantes es: << max(c,d)<< endl;
char e='a',f='A';
cout << El mayor de los char es
: << max(e,f)<< endl;
system(PAUSE);
}
int max(int a,int b)
{
return a>b?a:b;
}
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

71

double max(double a,double b)


{
return a>b?a:b;
}
char max(char a,char b)
{
return a>b?a:b;
}

Un Template es una forma de objeto, que se aplica a diferentes instancias, sin especificar el
tipo de objeto a ser referenciado. El patrn con un simple cdigo cubre un gran rango de
funciones de sobrecarga denominadas funciones patrones o un gran rango de clases denominadas clases patrones.
Se dice que los patrones son como una factora de ensamblaje, porque producen una variedad de objetos; es decir, dado un material se produce un determinado artculo.
Las templates permiten parametrizar estas clases para adaptarlas a cualquier tipo. As el
cambio de las tres sobrecargas, viene reemplazado siguiente Template:
Esta funcin trabaja para enteros, como tambin para flotantes y para caracteres.
Afortunadamente existen los template que hacen la labor de programacin ms fcil.
Los templates tambin denominadas tipos parametrizados, son un mecanismo de C++
que permite que un tipo pueda ser utilizado como parmetro en la definicin de una clase
o una funcin.
template<class T>
T max(T a,T b)
{
return a>b?a:b;
}

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <stdlib.h>
// sobrecarga de funciones para max()
template<class T>
T max(T a,T b)
{
return a>b?a:b;
}
#pragma argsused
int main(int argc, char* argv[])
{
int a=5,b=3;
cout << " El mayor de los enteros es : " << max(a,b)<< endl;
double c=5.5,d=10;
cout << " El mayor de los flotantes es: " << max(c,d)<< endl;
char e='a',f='A';
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

72

cout << " El mayor de los char es : " << max(e,f)<< endl;
system("PAUSE");
return 0;
}
C++ permite crear Templates de funciones y de clases.
La sintaxis para declarar un template de funcin es parecida a la de cualquier otra funcin,
pero se aade al principio una presentacin de la clase que se usar como referencia en la
plantilla:
La lista de clases que se incluye a continuacin de la palabra reservada template se escribe
entre las llaves "<" y ">"; y en este caso esos smbolos no indican que
se debe introducir un literal.
Se ha considerado que el template, radique en un archivo tipo header, donde se ha incluido la funcin plantilla min(),
template<class | typename<id>[...]>
<tipo de retorno> <identificador>(<lista de parmetros>)
{
// cuerpo de la funcin
}

Considerar que el template radique en un archivo tipo header, donde se ha incluido la funcin
plantilla min().
// minymax.h
#ifndef __MINYMAX_H
#define __MINYMAX_H
template <class T>
T max(T a,T b)
{ return (a>b)?a:b;}
template <class T>
T min(T a,T b)
{ return (a<b)?a:b;}
#endif

//Programa principal
#include <iostream.h>
#include <stdlib.h>
#include "minymax.h"
void main() // Eduardo Raffo Lecca
{
int x1=4,x2=3;
double y1=7.5,y2=8.3;
char c1='a',c2='A';
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

73

cout << "min int : " << min(x1,x2) << endl;


cout << "max double : " << max(y1,y2) << endl;
cout << "max char : " << max(c1,c2) << endl;
system("PAUSE");
}

Un Template que ejecuta el valor mximo para tres valores


#include <iostream.h>
#include <stdlib.h>
template <class T>
T maximo(T a,T b,T c)
{
T max=(a>b?a:b);
return(max>c?max:c);
}
Int main()
{
int a,b,c;
cout << "ingrese 3 enteros : " << endl;
cin >> a >> b >> c;
int j=maximo(a,b,c);
cout << "mayor : " << j << endl;
char d,e,f;
cout << "ingrese 3 char
: " << endl;
cin >> d >> e >> f;
char k=maximo(d,e,f);
cout << "mayor : " << k << endl;
system("PAUSE");
}

Trabajos Prcticos
Trabajo practico Estructuras de control
Escribir los programas que se detallan a continuacin.
1. La municipalidad debe liquidar impuestos atrasados de los ltimos 10 aos, los datos a ingresar son: Nro. De Contribuyente, Ao, e Importe.
Desarrollar un algoritmo que ingrese los datos e imprima la liquidacin actualizando el importe
de acuerdo al ndice de la siguiente tabla.
1992-1994
1995
1996-1997
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

:3150
:3000
:2800
74

1998-2004
2005:2012

:2001
:2000

2.- Leer una temperatura e imprimir el deporte apropiado de acuerdo a la siguiente tabla:
Temp
28>-= Temp
20>-= Temp
15>-= Temp
-5 = Temp

> 28
>= 20
>= 15
>= 5

:Waterpolo
: Surf
:futbol
:ajedrez
:Snowboard

3.- Dados tres nmeros hallar el mayor.


4.- Calcular la suma de los N primeros nmeros naturales.
5.- Dado un nmero entero decir si:
a) es par o impar;
b) es mayor, menor o igual a cero.
6.- Dado un mes escribir la cantidad de das de dicho mes.
7.- Escribir las tablas de multiplicar del nmero 1 al nmero 9 de los primeros 15 nmeros.
8 Una empresa fabrica tapas de material laminado en 3 formatos: redondo, cuadrado
o rectangular. Cobra $18 el metro cuadrado y si la tapa es redonda, le suma $4 ms al total.
Se pide:
a) Ingresar el cdigo de forma: 1-redonda, 2- cuadrada, 3- rectangular
b) Ingresar la longitud en metros: si es cuadrada, se ingresa un solo valor y si es redonda, corresponde al radio del crculo
c) Informar el costo total de la tapa
9.- Se ingresan pares de valores decimales y se debe informar el promedio de cada par. El ingreso de datos finaliza cuando el operador responde NO a la siguiente pregunta: Desea calcular el promedio? (SI / NO)?
10.- Se realiza una encuesta para estimar el grado de aceptacin de los productos x e y en el
mercado. A cada encuestado se le pregunta si consume el producto x y si consume el producto
y. Fin de ingreso de datos -1 a X. La respuesta puede ser si o no. Se pide calcular e informar
el porcentaje de consumidores de:
a) del producto x
b) del producto y
c) del producto x solamente
d) del producto y solamente
e) de ambos productos
f) de ninguno de los productos
11.- En una empresa el sueldo se calcula adicionando al bsico 50% del mismo, en caso en
que la antigedad sea superior a los 10 aos. Disear un programa que lea el nombre del empleado, el sueldo bsico y la antigedad y escriba el nombre y el sueldo a cobrar.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

75

12.- Ingresar 3 nmeros, donde los dos primeros representan los extremos de un intervalo. Se
solicita verificar si el valor pertenece o no al intervalo.
13.- Una empresa ha decidido dar a sus empleados una gratificacin adicional que depende de
las horas extras y ausencias.
Sea Horas= Horas Extras (2/3)* ausencias. La gratificacin G se calcula de la siguiente manera:
Horas <= 10
G: 100
10< horas <=20
G: 200
20<horas<=30
G: 300
30<horas <=40
G: 400
40<horas
G: 500
Disear un programa que lea el nombre de un empleado, las horas extras trabajadas y las horas de ausentismo, y determine el monto de loa gratificacin que corresponde.
14.- Calcular el promedio de los nmeros positivos y negativos por separado, de un conjunto
de datos que se ingresan por teclado, preguntando antes de cada ingreso si hay ms informacin.
15.- Escribir un programa para convertir una medida dada en pies a sus equivalentes en
a) Yardas; b) pulgadas; c) centmetros; d) metros. Un pie = 12 pulgadas, 1 yarda =3 pies, 1
pulgada = 2.54 cm, 1 m = 100 cm). Leer el nmero de pies e imprimir el nmero de yardas,
pies, pulgadas, centmetros y metros.
16.- Escribir un programa que lea la hora de un da de notacin de 24 horas y la respuesta en
notacin 12 horas. Por ejemplo, si la entrada es 13:45, la salida ser 1:45 PM
22.- Escribir un programa que acepte un ao escrito en cifras arbigas y visualice el ao escrito
en nmeros romanos, dentro del rango 1000 a 2100.
Nota: recuerde que V =5, X=10, L=50, C=100, D=500, M= 1000.
IV= 4, XL= 40, CM=900, MCM= 1900, MCML= 1950, MCMLXXXIX= 1989
17.- Disear un algoritmo que construya las facturas de electricidad correspondientes a un
bimestre. Por cada usuario se lee nombre y domicilio y los estados del medidor anterior y actual (el fin de datos viene dado por un fin). Las facturas deben contener la siguiente informacin con ttulos aclaratorios:
Nombre y domicilio:
Estado del medidor actual:
Estado del medidor anterior:
Consumo del bimestre:
Importe a Pagar:
El importe se calcula en funcin del consumo de las siguiente forma:
Importe = 1.5 * consumo si consumo <= 100 kwh.
Importe =2.0 * consumo si 100 kwh < consumo <= 200 kwh.
Importe = 2.5 * consumo si consumo >200 kwh.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

76

18.- El equipo de Hockey ha tenido una buena campaa y desea premiar a sus jugadores con
un aumento de salario para la siguiente campaa. Los sueldos deben ajustarse de la siguiente
forma:
Sueldo Actual
Aumento
Hasta 4800

20%

4801- 6000

10%

6001 6600

5%

Mas de 6600

No hay

El equipo tiene un cuadro de 20 jugadores. Disee un algoritmo que lea el Nombre del Jugador
y el salario Actual y que a continuacin imprima el nombre, el sueldo actual y el monto aumentado. Al final de la lista debe proporcionar, tambin, el monto total de la nueva nmina que
incluye los aumentos mencionados.
19.- Calcular la suma de los primeros 1000 mltiplos de 2.
20.- Que imprimen los siguientes cdigos
a)

b)

c)

d)

int x = 2, y = 6, z = 4;

int x = 2, y = 6, z = 4;

int x = 2, y = 6;

int i=4, x=5;

y = y+4*z;

if(x>y || x<z)

if(x<y && x==y)

for(i=0; i<10; i++)

y +=x;

cout<<"verdadero" ;

cout<<"verdadero";

cout<<y;

else
cout<<"falso";

else
cout<<"falso";

if(i<x) cout<<i;
else cout<<i-x;
}

Trabajo Practico Funciones


1. Escribir un programa que lea una cadena de caracteres y la visualice en un cuadro
**********
*Algoritmos*
**********
2. Escribir un programa que lea una frase, sustituir todas las secuencias de dos o varios blancos por un solo blanco y visualizar la frase obtenida.
3. Escribir un programa que lea una frase y a continuacin visualice cada palabra de la frase en
una columna, seguido del nmero de letras que componen la frase.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

77

4. Escribir un programa que posea una funcin lgica llamada Vocal que determine si un carcter es una vocal.
5. Escribir un programa que permita al usuario elegir el clculo del rea de cualquiera de las
figuras geomtricas: crculo, cuadrado, rectngulo o tringulo mediante funciones.
7. Escribir un programa que posea una funcin que tenga un argumento de tipo entero y que
devuelva la letra P si el nmero es positivo, y la letra N si es cero o negativo.
8. Escribir un programa que permita deducir si un nmero N es primo, apoyndose en una funcin llamada Primo.
9.- Escribir un programa que posea una funcin lgica de dos argumentos enteros, que devuelva true si uno es mltiplo del otro y false en caso contrario.
10.- Escribir una funcin inversa que recibe una cadena cad como parmetro y devuelve los
caracteres de cad en orden inverso. Por ejemplo, si cad es Pablo?, la funcin devuelve ?olbaP.
11. Que imprime el siguiente cdigo
a)
int mi_funcion( )
{
return 3+2;
}
int main( ){
cout<<La function devuelde<<mi_funcion());
}
b)
int mi_funcion(int x)
{
return x*x;
}
int main( ){
cout<<La function devuelde<<mi_funcion(5));
}
c)
int mi_funcion(int x)
{
int y;
y=2+x*3;
return y;
}
int main( ){
cout<<La function devuelde <<mi_funcion(5+2));
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

78

}
d)
int mi_funcion(int x)
{
return x*x;
}
int main(void){
int x=3;
mi_funcion(x);
cout<<La function devuelde << mi_funcion(x));
cout<<La variable vale x vale<< x;
}
e)
int mi_funcion(int x)
{
x=x*5;
return x;
}
int main( ){
int x=3;
mi_funcion(x);
cout<< function devuelve << mi_funcion(x));
cout<<La variable vale x vale<< x;
}

Gua de trabajos Prcticos. Vectores y Matrices

1) Leer un vector llamado Z de N elementos. A partir de su lectura calcular:


a) Generar un vector llamado POSITIVO con la cantidad y el promedio de elementos
positivos.
b) Generar un vector llamado NEGATIVO con la cantidad y el promedio de elementos
negativos.
c) Generar un vector llamado ZERO con la cantidad y el promedio de elementos igual
a 0.
2) Una compaa almacena la informacin relacionada a sus proveedores en los arreglos:
- P(N) arreglo de proveedores, donde cada P(I) es el nombre del proveedor ordenado alfabticamente
- C(N) arreglo de ciudad, donde cada C(I) es el nombre de la ciudad en la que reside el proveedor P(I)
- A(N) arreglo de artculos, donde cada A(I) es el nmero de artculos diferentes del proveedor
P(I)
Realice un programa en C++ que pueda llevar a cabo las siguientes transacciones:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

79

Dado el nombre del proveedor, informar el nombre de la ciudad en la que reside y el nmero de artculos que provee. Actualizar el nombre de la ciudad, en caso de que un proveedor cambie de domicilio; los datos sern el nombre del proveedor y el nombre de la ciudad
a la que se mud. Actualizar el nmero de artculos de un proveedor en caso de que ste
aumente o disminuya.
La compaa da de baja a un proveedor: actualizar los arreglos.
3) Escribir un programa que lea un vector A de N elementos (N es un dato entero suministrado
por el usuario). Una vez ledo el vector, el programa debe permitir al usuario elegir a travs de
un men la ejecucin de las siguientes opciones:
a) Volver a leer los datos del vector
b) Calcular el elemento mayor y menor del vector
c) Calcular la suma de los elementos que componen el vector (A[i]=A[1]+A[2]++A[N])
d) Calcular el promedio de los elementos que componen el vector (A[i]/N)
e) Calcular el producto de los elementos que componen el vector
f) Crear un nuevo vector que contenga los elementos del array transpuestos, es decir, B[1]
contiene el elemento A[N], B[2] contiene el elemento A[N-1], , B[N] contiene el elemento
A[1]
g) Crear un nuevo vector que contenga los elementos del vector A pero con una posicin corrida, es decir, B[1] contiene el elemento A[2], B[2] contiene el elemento A[3], , B[N] contiene
el elemento A[1]
h) Crear un nuevo vector que contenga los elementos del vector A pero con M posiciones corridas (siendo M<N), es decir, B[1] contiene el elemento A[M+1], B[2] contiene el elemento
A[M+2],
i) Salir del programa
4) Se tiene un listado con los siguientes datos:
nmero de alumno (1 a n ) (filas)
nmero de materia (1 a m ) (columnas)
nota (0 a 10).
a) El mismo nmero de alumno y de materia puede aparecer ms de una vez.
b) El listado no est ordenado, ni necesariamente completo. Esto ltimo quiere decir que puede ser que un alumno no haya cursado una o ms materias, y por lo tanto no existan los
datos correspondientes en el listado.
Se pide:
(1) Crear una estructura bidimensional que almacene el promedio por materia de cada alumno
e informarla asignndole en la impresin un guin al caso de falta de datos mencionado.
(2) Informar el porcentaje de alumnos que curs cada materia y el promedio general por
materia considerando los alumnos que la cursaron.
(3) Informar la cantidad de materias que curs cada alumno y el promedio que obtuvo considerando las materias que curs.
5) Realizar un programa que implemente el juego del BUSCAMINAS. Dicho juego consiste en
lo siguiente: Existe una matriz bidimensional de NxM en la que se sitan aleatriamente K minas. Una vez distribuidas las minas en el tablero, el jugador especifica una casilla de la tabla,
de manera que, si en dicha casilla existe una mina, el juego termina. Si en la casilla no existe
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

80

mina, el programa debe devolver el nmero de minas que se encuentran en las casillas adyacentes a la casilla en cuestin, entendiendo por adyacentes todas aquellas casillas que se encuentren encima, debajo, a la izquierda, a la derecha, y en las cuatro esquinas. El juego se
gana cuando el jugador es capaz de levantar todas las casillas libres del tablero sin haber explotado con ninguna mina.
6) Se posee una matriz de F filas y C columnas.
a.- Asignarle valores a todos sus elementos teniendo en cuenta que cada elemento a[i,j] est
definido como
si i*j es par el valor que se le asigna a la posicin es i+j
si i*j es impar el valor que se le asigna a la posicin es i-j.
Ejemplo: si f=2 y c=4
b.- Imprimir la matriz.
0 3 -2 5
3 4 5

7.- Leer una matriz de NxN elementos enteros llamada tierra. Generar un vector llamado
agua que contenga los elementos de la matriz tierra remplazados en la siguiente funcin:
X2*Pi+ 6X3. Calcular el promedio de los elementos que se encuentran en la diagonal superior y
generar un vector llamado Aire tal que contenga los elementos de tierra multiplicados por aire.
Y Generar un vector llamado Fuego de tipo char que contenga los elementos de la diagonal
inferior convertidos en cadena de caracteres. Mostrar por pantalla Agua, fuego, tierra y aire.
8.- Ingresar una matriz A(10,8), calcular e informar la suma de sus elementos.
9.- Leer una matriz de F filas y C columnas. (F =C)
a.- Calcular el elemento Minimo de la matriz
b.- Calcular el promedio de cada una de las filas.
c.- Calcular el promedio de los elementos de la diagonal principal
d.- Calcular el promedio de los elementos de la diagonal secundaria.
e.- A cada elemento par de la matriz guardarlo en un vector llamado Pares.
10. Entrada: Se tienen una matriz de N lneas, y M nmeros para cada uno de estos i
nmeros, 0<i<10000.
Salida: Generar otra matriz que encuentre a qu grupo se refiere imprimiendo el nmero que
lo representa y el nmero de integrantes que tiene, deber imprimir los grupos en orden
primero el grupo con ms integrantes y por ltimo el que menos integrantes tiene.
Utilizar recursividad en la bsqueda de los elementos integrantes.
Mostrar ambas matrices.
Ejemplo:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

81

Entrada

Salida

1
1
1
1

1
3
5
2

2
1
1
3

2
1
3
1

3
5
5
3

3
3
3
5

8
7
3
2

11. Generar una matriz de NxN (N ingresada por el usuario < 100) con nmeros aleatorios menores a 5000. Guardar en un Vector todos los nmeros abundantes (funcin recursiva) que se encuentren en la matriz.
Nmero abundante: todo nmero natural que cumpla la condicin que la suma de sus divisores
propios sea mayor que el propio nmero. Por ejemplo, 12 es abundante ya que sus divisores son 1,
2, 3, 4 y 6 y se cumple que 1+2+3+4+6=16, que es mayor que el propio 12.
Los primeros nmeros abundantes son:
12, 18, 20, 24, 30, 36, 40, 42, 48, 54, 56, 60, 66, 70, 72, 78, 80, 84, 88, 90, 96, 100, 102,

Trabajo Prctico Recursividad.


1.- Disear un programa que posea una funcin recursiva que permita multiplicar dos nmeros
enteros M y N. Acumulando su contenido hasta que uno de los dos llegue a 0.
2.- Disear un programa que dado un numero decimal lo transforme a uno binario y a otro
Hexadecimal.
3.- Escribir las funciones, una recursiva y otra no recursiva, tal que dado el entero positivo X
devuelva true(verdadero) si y solo si X es potencia de 2.
4.- Escribir un programa que utilice una funcin recursiva EscribeBlancos(n) que imprima n
caracteres blancos consecutivos.
5.- Disear un algoritmo recursivo que imprima los dgitos de un nmero decimal en orden
inverso.
6.- Escribe una funcin recursiva que devuelva la suma de los valores almacenados en un array
de enteros.
7.- Escribe un programa recursivo que calcule la suma de los primeros N nmeros pares naturales.
8.- Implemente un programa que utilice una funcin recursiva que imprima por pantalla los
valores desde 1 hasta el nmero introducido desde teclado por el usuario.
9.- Dado un vector de n nmeros enteros, disear un algoritmo recursivo que dado el vector
devuelva:
La posicin del ltimo nmero par que aparece en el vector
El valor 0 si ningn elemento del vector es par

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

82

10.- Disee una funcin recursiva que devuelva cierto si una palabra es palndroma o falso en
caso contrario. Decimos que una palabra es palndroma si se lee igual de derecha a
izquierda que de izquierda a derecha.

Trabajo Prctico archivos


1.- crear un programa que vaya leyendo las frases que el usuario teclea y las guardar en un
fichero de texto llamado registroDeUsuario.txt. Terminar cuando la frase introducida sea
"fin" (esa frase no deber guardarse en el fichero).
2.-Hacer un programa que pida al usuario que teclee frases, y las almacene en el fichero frases.txt. Acabar cuando el usuario pulse -1. Despus deber mostrar el contenido del fichero.
3. Hacer un programa que pregunte un nombre de fichero y muestre en pantalla el contenido
de ese fichero
4.- Hacer un programa que pida al usuario que teclee frases, y las almacene en el fichero "registro.txt", que puede existir anteriormente (y que no deber borrarse, sino aadir al final de
su contenido). Cada sesin acabar cuando el usuario pulse -1.
5.- Crear un programa que pida al usuario pares de nmeros enteros y escriba su suma (con el
formato "20 + 3 = 23") en pantalla y en un fichero llamado "sumas.txt", que se encontrar en
un subdirectorio llamado "resultados". Cada vez que se ejecute el programa, deber aadir los
nuevos resultados a continuacin de los resultados de las ejecuciones anteriores.

Trabajo Prctico Punteros


Ejercicio 1: Punteros Qu imprime?.
a)
int *punt;
int x=7;
int y=5;
punt=&x;
*punt=4;
Cout<<x<<endl<<y; // qu imprime este cout?
b)
int *punt;
int x=7;
int y=5;
punt=&x;
x=4;
Cout<<*punt<<endl<<y; // qu imprime este cout?
c)
int *punt;
int x=7;
int y=5;
punt=&x;
x=4;
punt=&y;
Cout<<*punt<<endl<<x; // qu imprime este cout?
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

83

d)
int *punt;
int x=7;
int y=5;
punt=&x;
*punt=3;
punt=&y;
*punt=x;
x=9;
Cout<<*punt<<endl<<y; // qu imprime este cout?

e)
int *punta, *puntb;
int x=7;
int y=5;
punta=&x;
*punta=3;
puntb=&y;
*puntb=x;
x=9;
Cout<<*puntb<<endl<<x; // qu imprime este cout?

f)
int *punta, *puntb;
int x=7;
int y=5;
punta=&x;
*punta=3;
puntb=&y;
*puntb=x;
x=9;
Cout<<*puntb<<endl<<*punta; // qu imprime este cout?
g)
int *punta, *puntb;
int x=7;
int y=5;
punta=&x;
*punta=3;
puntb=&y;
*puntb=x;
x=9;
puntb=punta;
Cout<<*puntb<<endl<<y; // qu imprime este cout?
h)
int *punt,i;
int x[5]={1,2,3,4,5};
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

84

punt=x;
*punt=9;
for(i=0;i<5;i++)
Cout<< x[i] <</<<; // qu imprime este cout?
i)
int *punt,i;
int x[5]={1,2,3,4,5};
punt=&x[0];
*punt=9;
punt[3]=7;
for(i=0;i<5;i++)
Cout<< x[i] <</<<; // qu imprime este cout?
j)
int *punt,i;
int x[5]={1,2,3,4,5};
punt=x;
*x=11;
*(punt+3)=9 ;
for(i=0;i<5;i++)
Cout<< x[i] <</<<; // qu imprime este cout?
k)
int *punt,i;
int x[5]={1,2,3,4,5};
punt=x;
*(punt+2)=9;
*(x+3)=7 ;
punt[1]=11 ;
for(i=0;i<5;i++)
Cout<< *(punt+i) <</<<; // qu imprime este cout?
l)
int *punt,i;
int x[5]={1,2,3,4,5};
punt=x+4;
*(punt-2)=9;
punt--;
*(punt)=7 ;
punt[1]=11 ;
for(i=0;i<5;i++)
Cout<< *(punt+i) <</<<; // qu imprime este cout?
ll)
int *punt,i;
int x[5]={1,2,3,4,5};
punt=&x[0]+3;
*(punt-2)=9;
punt--;
*(punt)=7 ;
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

85

punt[1]=11 ;
punt=x;
for(i=0;i<5;i++)
Cout<< punt[i]<</<<; // qu imprime este cout?
m)
void suma_dos(int *x, int *y, int *z)
{
*x=*x+2;
*y=*y+2;
*z=*z+2;
}
int main(){
int x,y,z;
x=3;
y=10;
z=15;
suma_dos (&x, &y, &z);
Cout<< x<</<< y<</<< z<<; // qu imprime este cout?
}
n)
void datos(int *x, float *y, char *c)
{
*x=8;
*y=4.2;
*c=g;
}
int main(){
int x=9;
float y=44.6;
char c=a;
datos (&x, &y, &c);
Cout<< x<</<< y<</<< c<<; // qu imprime este cout?
}
)
void datos(int *x, float *y, char *c)
{
Cout<< x<</<< y<</<<c<<; // qu imprime este cout?
*x=8;
*y=4.2;
*c=g;
}
int main(){
int x=9;
float y=44.6;
char c=a;
datos (&x, &y, &c);
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

86

Cout<< x<</<< y<</<<c<<; // qu imprime este cout?


}
o)
void datos(int x, float y, char c)
{
Cout<< x<</<< y<</<<c<<; // qu imprime este cout?
x=8;
y=4.2;
c=g;
}
int main( ){
int x=9;
float y=44.6;
char c=a;
datos (x, y, c);
Cout<< x<</<< y<</<<c<<; // qu imprime este cout?
}
p)
int datos(int x, float y, char c)
{
Cout<< x<</<< y<</<<c<<; // qu imprime este cout?
x=8;
y=4.2;
c=g;
return x;
}
int main( ){
int x=9;
float y=44.6;
char c=a;
x=datos (x, y, c);
Cout<< x<</<< y<</<<c<<; // qu imprime este cout?
}
q)
char datos(int *x, float *y, char *c)
{
Cout<< x<</<< y<</<<c<<; // qu imprime este cout?
*x=8;
*y=4.2;
*c=g;
return h ;
}
int main( ){
int x=9;
float y=44.6;
char c=a;
c=datos (&x, &y, &c);
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

87

Cout<< x<</<< y<</<<c<<; // qu imprime este cout?


}
r)
#include <stdio.h>
void vector (float * vp[], float v[], int lon);
void main(){
float v[5]={1,2,3,4,5};
float * vp[5]={NULL}; //vector de punteros a float
for (int i=0; i<5; i++)
{
vp[i]=&v[i];
}
vector(vp, v, 5);
}
void vector (float * vp[], float v[], int lon)
{
for (int i=0; i<lon; i++)
{
v[i]=*(vp[i]);
}
}
s)
#include <iostream.h>
#include <stdio.h>
void inverso_array (int v[], int inv[], int & lon)
{
for(int i=0; i<lon ; i++)
{
*(inv+i)=*(v+(lon-(i+1)));
}
}
void main(){
int v[5]={2,3,4,5,6};
int inv[5]={0};
inverso_array(v, inv, 5);
for (int i=0; i<5; i++)
{
cout << *(inv+i) << " ";
}
}
t)
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

88

#include <stdio.h>
void vector (float * vp[], float v[], int lon);
void main(){
float v[5]={1,2,3,4,5};
float * vp[5]={NULL}; //vector de punteros a float
for (int i=0; i<5; i++)
{
vp[i]=&v[i];
}
vector(vp, v, 5);
}
void vector (float * vp[], float v[], int lon)
{
for (int i=0; i<lon; i++)
{
v[i]=*(vp[i]);
}
}
u)
#include <vcl.h>
#pragma hdrstop
#include <conio.h>
#include <tchar.h>
#include <iostream.h>
#pragma argsused
int I(char *s);
int main()
{
char *s= "Pablo Abdala Achaval";
I(s);
cout << s;
getch();
return 0;
}
//----int I(char *s) {
char *t= s;
while (*t)
t++;
t--;

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

89

while(s < t) {
char Temp= *s;
*s++= *t;
*t--= Temp;
}
}

Ejercicios Backtracking y Archivos


1.- Tom y Jerry
Como es usual, el gato Tom persigue a Jerry por las habitaciones de una casa sin ningn xito,
pues el maldito roedor conoce todos los recovecos de la mansin. Harto de esta situacin, Tom
adquiere un PC con la intencin de construir un programa capaz de encontrar el camino ms
corto hasta su ansiada presa sorteando todos los obstculos (paredes, armarios, etc.) que
pueda encontrarse. Adems, para asegurar el xito de la cacera, Tom desea atacar a Jerry
cuando ste duerma.
Representaremos la casa por una superficie rectangular de M filas y N columnas, dividida en
casillas unitarias:

Tom tan solo puede moverse en horizontal o vertical dentro de la habitacin, nunca en diagonal. Supondremos que tanto Tom como Jerry ocupan una casilla dentro de esta superficie. Los
obstculos de la habitacin sern rectngulos de coordenadas vlidas dentro de la superficie, y
se representarn con su vrtice superior izquierdo y el inferior derecho. Existe la posibilidad
que el rectngulo sea en realidad una recta (horizontal o vertical; por ejemplo, las coordenadas
(3, 4) y (3, 6) definen una recta horizontal) o incluso un punto (cuando las dos coordenadas
son iguales).

Apartado 1
Construir un programa que procese un fichero de entrada, de nombre "TOM1.DAT", que contenga la configuracin inicial de la casa, y que la dibuje si es correcta. Los casos de error que
consideramos sern: (E0) M o N (o ambas) son igual a 0. (E1) Tom o Jerry no se encuentran
en coordenadas vlidas de la superficie de la casa. (E2) Tom y Jerry estn en la misma casilla.
(E3) Algn obstculo no est situado en coordenadas vlidas de la superficie. (E4) Los vrtices
que representan un obstculo no cumplen una relacin vlida entre s. (E5) Dos o ms obstculos se solapan. (E6) Tom o Jerry estn en una casilla ocupada por un obstculo.
El formato del fichero "TOM1.DAT" es el siguiente:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

90

Lnea 1: valores de M y de N, separados por un nico espacio en blanco (tanto M como N se


representan con un nico dgito)
Lnea 2: cuatro valores naturales, separados por un nico espacio en blanco, representados
cada uno de ellos por un dgito. Los dos primeros valores representan la posicin inicial de Tom
(fila - columna) y los dos siguientes la de Jerry.
Lneas siguientes: cada lnea se corresponde a un obstculo y contiene cuatro valores naturales, separados por un nico espacio en blanco, y representados cada uno de ellos por un dgito. Los dos primeros valores representan el vrtice superior izquierdo del obstculo (fila - columna) y los dos restantes el vrtice inferior derecho.
La salida debe almacenarse en el fichero "TOM1.RES". En caso de encontrarse algn error, el
fichero contendr una nica lnea con el mensaje "ERROR Ex", siendo la 'x' un nmero entre 0
y 6 que identifica el tipo del primer error que se encuentre en la entrada. Si hubiese ms de un
error a la vez, se devolver aquel con cdigo menor; por ejemplo, si el primer error lo provoca
un obstculo que se solapa con alguno de los anteriores y al mismo tiempo ocupa la casilla de
Tom o de Jerry, el cdigo a devolver sera E5. En caso de no encontrarse ningn error, el fichero contendr M lneas de N caracteres cada una de ellas, siendo cada carcter el contenido de
una casilla, que ser 'o' para las casillas vacas, 'x' para las casillas que forman parte de un
obstculo, 'T' para la casilla ocupada por Tom y 'J' para la casilla ocupada por Jerry.
A continuacin, ofrecemos algunos ejemplos de entrada errnea y el mensaje que debe guardarse en el fichero de salida:
TOM1.DAT

TOM1.DAT

TOM1.DAT

33
2233
1221

33
2232
1223

3
3
1
1

TOM1.RES

TOM1.RES

TOM1.RES

ERROR E4

ERROR E6

ERROR E5

3
223
122
223

En cambio, las entradas siguientes generan resultados correctos:


TOM1.DAT

TOM1.DAT

5
1
2
1

7
1
2
2
4
6
6

5
153
133
444

5
2
1
4
2
1
4

7
2
2
4
6
6

1
2
4
5
2
4

TOM1.RES

TOM1.RES

Tooxo
xxxxo
xxxxo
oooxo

oTooo
xxoxo
ooooo
oxxxx

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

91

ooJoo

ooooo
xxoxo
Joooo

Apartado 2
Construir un programa que, para una entrada que no contenga ningn error, devuelva un camino lo ms corto posible que lleve de Tom a Jerry. El programa leer la informacin del fichero "TOM2.DAT", con el mismo formato que el fichero "TOM1.DAT" del apartado anterior. La
salida se almacenar en el fichero "TOM2.RES", que contendr diferentes lneas con el resultado del algoritmo. En concreto, el fichero contendr una lnea para cada posicin que forme
parte del camino en el mismo orden en que aparecen en l, siendo pues la primera la posicin
de Tom y la ltima la posicin de Jerry. Concretamente, cada lnea contendr un par de valores
naturales, representados mediante un dgito y separados por un nico espacio en blanco; el
primer natural representa la fila y el segundo la columna. En caso de que no haya ninguna
solucin posible, el fichero "TOM2.RES" deber contener una nica lnea con la palabra "INALCANZABLE". En caso de que haya ms de un camino mnimo, podis devolver cualquiera de
ellos.
As para las entradas del ltimo ejemplo del apartado anterior, para el primero de ellos el fichero "TOM2.RES" debera contener una nica lnea con la palabra "INALCANZABLE". En cambio,
para el segundo, al existir un nico camino mnimo, el resultado sera el fichero "TOM2.RES"
siguiente:
TOM2.RES
1
1
2
3
3
3
4
5
5
5
6
7
7
7

2
3
3
3
2
1
1
1
2
3
3
3
2
1

Apartado 3
Construir un programa que, para una entrada que no contenga ningn error, devuelva todos
los caminos que lleven de Tom a Jerry, sean lo largos que sean, y tales que no se pasa ms de
una vez por una misma casilla. Para minimizar el tamao de la salida, nos limitaremos a decir
cuntos caminos hay de cada longitud. La longitud de un camino se define como el nmero de

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

92

posiciones que lo componen menos uno; en el ltimo ejemplo del apartado anterior, el camino
que aparece tiene longitud 13.
El programa leer la informacin del fichero "TOM3.DAT", con el mismo formato que el fichero
"TOM2.DAT" del apartado anterior. La salida se almacenar en el fichero "TOM3.RES", que
contendr diferentes lneas. Cada una de las lneas estar formada por dos valores naturales,
representados mediante tantos dgitos como sea necesario y separados por un nico espacio
en blanco; el primer natural representa la longitud y el segundo el nmero de caminos existentes de esa longitud. No se debe incluir lneas para aquellas longitudes que no sean longitudes
de algn camino de Tom a Jerry. Las lneas deben estar ordenadas por la longitud.
La figura siguiente muestra un ejemplo de entrada y el resultado esperado para ella:
TOM3.DAT

TOM3.RES

4
1
3
2

62
82

4
144
233
323

2.- Buque
La lnea martima "Titanic S.A.", cuya flota consta de un nico buque, se ocupa del transporte
de mercancas desde el puerto nuevo de Villabajo de Arriba allende los mares. Cada uno de los
productos tiene un volumen (por motivos de conservacin, las mercancas van siempre embaladas en cajas) y un precio de venta. Ante la convocatoria inminente de una huelga de estibadores, la lnea decide efectuar un viaje extraordinario llenando el buque de manera que la mercanca que transporte sea lo ms valiosa posible. Se pide construir un programa que, dada la
informacin de las mercancas (volumen, precio y unidades disponibles), determine cules deben transportarse en el buque sin desbordar su capacidad (que ser una informacin adicional
sumistrada al programa). En caso que existan diversas combinaciones ptimas de mercanca
con respecto al precio, se elegira aqulla que ocupe menos volumen; en este caso, s puede
suponerse que existe una nica solucin ptima al problema.
Entrada
Residente en el fichero de caracteres "BUQU.DAT":
Lnea 1: nmero N de tipos de mercancas, mediante uno o dos caracteres que representan un
nmero entero entre 1 y 99.
Lnea 2: capacidad del buque, mediante uno, dos, tres o cuatro caracteres que representan un
nmero entero entre 1 y 9999.
Lneas de la 3 a la N+2: cada una de las lneas tiene el formato:
mercanca volumen coste unidades
donde mercanca es una palabra formada exclusivamente por letras minsculas (y sin signos
de puntuacin, es decir, ni acentos ni similares) de a lo sumo 20 letras, y los otros tres componentes son enteros representados mediante un nmero de dgitos que oscila entre 1 y 5 (es
decir, el entero ms grande representable es el 99999). Los componentes de la lnea estn
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

93

separados por un nico carcter blanco, y no existen blancos ni otro tipo de caracteres al principio o final de lnea.
Salida
A guardar en el fichero de caracteres "BUQU.OUT":
Lnea 1: un par de enteros representados mediante dgitos de la manera habitual, que indican
el coste total de la carga transportada y el volumen. Ambos valores estn separados por un
nico carcter blanco, y no existen blancos ni otro tipo de caracteres al principio o final de lnea.
Lneas siguientes: cada una de ellas contiene un par:
mercanca unidades
que dice cuantas unidades de una mercanca dada aparecen en la carga transportada. La mercanca debe haber aparecido como tal en el fichero de entrada. Las unidades se representan
mediante dgitos de la manera habitual. Ambos valores estn separados por un nico carcter
blanco, y no existen blancos ni otro tipo de caracteres al principio o final de lnea. No deben
aparecer mercancas con cero unidades transportadas. Las lneas deben estar ordenadas alfabticamente segn el nombre de la mercanca; no deben aparecer mercancas repetidas.
Ejemplo de entrada
5
2000
patatas 350 2 7
judias 400 5 4
guisantes 1000 12 4
fresones 1100 17 3
arroz 600 8 1
Ejemplo de salida
27 1900
fresones 1
judias 2
3.- Estampillas
El servicio de correos quiere determinar la combinacin ptima de valores de estampillas segn ciertas caractersticas. Se sabe que la superficie estndar de las cartas permite que pueden
pegarse hasta un mximo de h estampillas en el sobre. El servicio de correos est interesado
en una emisin de estampillas de k valores diferentes a determinar, mltiplos de 1 $(no se
admiten centavos).
Dados h y k como se acaban de definir, se pide calcular el valor mximo n de pesos tal que se
pueden generar todos los valores entre 1 y n pesos. Por ejemplo, si h = 3 (caben un mximo
de 3 pesos en los sobres) y k = 2 (el servicio de correos contempla hasta 2 valores diferentes),
el valor n es igual a 7, siendo los dos valores 1 y 3 pesos:
1 $ = 1 estampilla de 1 $
2 $ = 2 estampillas de 1 $
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

94

3
4
5
6
7
8

$
$
$
$
$
$

=
=
=
=
=
=

1 estampilla de 3 $
1 estampilla de 3 $ + 1 estampilla de 1 $
1 estampilla de 3 $ + 2 estampillas de 1 $
2 estampillas de 3 $
2 estampillas de 3 $ + 1 estampilla de 1 $
IMPOSIBLE

Entrada
Residente en el fichero de caracteres "ESTAM.DAT": varias lneas conteniendo cada una dos
valores para h y k. Podis suponer que los valores de h y k se pueden representar con una
nica cifra (carcter entre '1' y '9'). Las cifras se separan con un nico blanco. No hay ningn
otro tipo de caracteres ni al inicio ni al final de la lnea.
Salida
A guardar en el fichero de caracteres "ESTAM.OUT": para cada lnea de la entrada, una lnea
conteniendo: primero, el valor n, y segundo, los valores usados para generar este n, en orden
creciente de valor. Estos datos se separan por un nico blanco; no hay ningn otro tipo de
caracteres ni al inicio ni al final de la lnea.
Ejemplo de entrada
32
21
Ejemplo de salida
713
21

4. El salto del caballo


Se dispone de una superficie rectangular "cuadriculada", es decir, formada por un entramado
de posiciones o casillas (como ocurre, por ejemplo, con un tablero de ajedrez). Nos interesa
buscar caminos dentro de esta superficie que cumplan ciertas condiciones, teniendo en cuenta
que algunas de las casillas no pueden formar parte de dichos caminos (para entendernos, representan obstculos en la superficie).
Objetivo
Dada una superficie rectangular de dimensin n x m, realizar un programa que la recorra partiendo de una casilla inicial y llegando a una casilla final segn las reglas siguientes:

Todas las casillas debern ser visitadas excepto las casillas marcadas como no visitables.
No se podr visitar ms de una vez cada casilla.
El salto de una casilla a otra deber realizarse siguiendo las reglas de movimiento del
caballo de ajedrez. Esto es, desde una casilla slo se podr avanzar a aquellas resultantes de avanzar una posicin en lnea recta y otra en diagonal en la misma direccin. El
siguiente esquema muestra las casillas accesibles (con una cruz) desde la casilla A:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

95

El programa deber calcular la secuencia de casillas visitadas desde la inicial hasta la final. En
caso que no exista ninguna solucin, el programa debe detectar esta situacin e informar.
Entrada
La entrada del programa consiste en una secuencia de lneas, que residen en un archivo de
texto (ASCII) con nombre CAB.DAT, que tendr el siguiente formato:

La primera lnea contiene la dimensin de la superficie, es decir, el nmero n de columnas y el nmero m de filas.
La segunda lnea contiene la posicin inicial y la posicin final, cada posicin siendo dos
enteros, la columna y la fila respectivamente. Podis suponer que las dos posiciones estn dentro de los lmites de la superficie.
A continuacin, m lneas ms. Cada lnea representa una fila de la superficie, y contiene
n caracteres, uno por columna. Cada uno de estos caracteres puede ser 'V' o 'N', dependiendo de si la posicin correspondiente es visitable o no. Los caracteres aparecen
separados por un nico carcter "espacio".

A efectos de numeracin, debe considerarse que las filas van de 1 a m y las columnas de 1 a n.
Salida
La salida del programa ha de grabarse en un archivo de texto (ASCII) con nombre CAB.RES,
que contendr una lnea por cada posicin que forme parte del camino encontrado como solucin que cumpla las condiciones dadas en el enunciado. Cada posicin es un par de enteros: la
columna y la fila. La primera posicin de la solucin ser la posicin inicial, y la ltima la posicin final.
Si no hay ninguna solucin, el fichero CAB.RES contendr una nica lnea con el texto INSATISFACTIBLE. Si existe ms de una solucin, cualquiera de ellas se considera vlida.
Ejemplo de entrada
54
11
14
VVVNN
VNVVV
VVVNV
VVVVV
Ejemplo de salida
1
2
4
5

1
3
4
2
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

96

3
1
2
3
5
3
1
2
4
5
3
1

1
2
4
2
3
4
3
1
2
4
3
4

5.- ANAGRAMAS
Dado un conjunto de letras, escribe un programa que genere todas las palabras posibles.
Ejemplo: De la palabra 'abc' el programa debe producir, explorando todas las posibles
combinaciones de letras, las siguientes palabras: 'abc', 'acb', 'bac', 'bca', 'cab' y 'cba'.
En la palabra obtenida del archivo de entrada, algunas letras pueden aparecer ms de una
vez. Para una palabra dada, el programa no debe producir la misma palabra ms de una
vez y las palabras deben aparecer ordenadas alfabticamente.
Los datos de entrada estn en el archivo de texto ANAGRA.IN que est formado por diversas
palabras. La primera lnea contiene el nmero de palabras que siguen. Cada lnea contiene
una palabra. Una palabra est compuesta por letras de 'a' a 'z', del alfabeto sajn, maysculas y minsculas. Las letras maysculas
y minsculas deben considerarse diferentes.
Los datos de salida estarn en el fichero de texto ANAGRA.OUT, para cada palabra del archivo de entrada, el archivo de salida debe contener todas las diferentes palabras que pueden
ser generadas con las letras de la palabra. Las palabras generadas desde una palabra deben mostrarse en orden alfabtico.
Ejemplo:
ANAGRAMA.IN
2
Abc
acba

ANAGRA.OUT
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

97

baca
bcaa
caab
caba
cbaa
6.-EL JUEGO DE LA VIDA
Consideremos una poblacin de K insectos en una tabla (M x N), de modo que en cada
celda de la tabla hay, como mximo, un insecto. Por lo tanto, cada insecto tiene, como mximo, 8 vecinos. La poblacin se est desarrollando continuamente debido a los nacimientos
y defunciones que se producen. Las reglas de evolucin que se observan son las siguientes:
1

Aquellos insectos que tienen 0, 1, 4, 5, 6, 7 u 8 vecinos mueren irremediablemente.


2 Los insectos que tienen 2 o 3 vecinos sobreviven.
3 En cada celda vaca en cuya vecindad hay exactamente tres insectos, nace un nuevo
insecto.
4 Los insectos que nacen o mueren no afectan las reglas hasta que se ha completado un ciclo evolutivo, entendiendo por ste un ciclo en el que se ha decidido la supervivencia o muerte de los insectos (vivos al comenzar el ciclo) de acuerdo a las reglas mencionadas.
Escribe un programa que simule la evolucin de la poblacin y que determine cmo estar la
poblacin despus de L ciclos evolutivos.
Los datos de entrada estn en el archivo de texto VIDA.IN, en la primera lnea hay 3 enteros separados por un espacio en blanco N, M y L que representan al nmero de filas,
de columnas y de ciclos, respectivamente. Las siguientes N lneas contienen la ubicacin
de los insectos representados por un asterisco '*' y por un punto '.' las celdas vacas.
Los datos de salida estarn en el fichero de texto VIDA.OUT, en el que habr N lneas con
la ubicacin de los insectos tras L ciclos. En cada lnea un '.' representa a una celda vaca
y un '*' a un insecto.
Ejemplo:
VIDA.IN
661
......
...**.
..**..
...*..
......
......

VIDA.OUT
......
..***.
..*...
..**..
......
......

7.- BIBLIOTECA INFANTIL


En una biblioteca infantil se ha diseado un sistema para determinar cada da en qu orden
elegirn los nios el libro que desean leer. Para ello los bibliotecarios han decidido seguir la
siguiente estrategia: cada da se formar un crculo con todos los chicos. Uno de los chicos
es elegido al azar como el nmero 1 y el resto son numerados en orden creciente hasta N
siguiendo el sentido de las agujas del reloj.
Comenzando desde 1 y movindose en sentido horario uno de los bibliotecarios cuenta k chicos mientras el otro bibliotecario comienza en N y se mueve en sentido antihorario
contando m chicos. Los dos chicos en los que se paren los bibliotecarios son elegidos; si los
dos bibliotecarios coinciden en el mismo nio, ese ser el nico elegido.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

98

Cada uno de los bibliotecarios comienza a contar de nuevo en el siguiente chicos que permanezca en el crculo y el proceso contina hasta que no queda nadie.
Tener en cuenta que los dos chicos abandonan simultneamente el crculo, luego es posible
que uno de los bibliotecarios cuente un chico ya seleccionado por el otro.
Se pide la construccin de un programa que, dado el nmero N de chicos y los nmeros k y m
que utilizar cada bibliotecario en la seleccin, indique en qu orden irn siendo seleccionados
los chicos.
Formato de la entrada (residente en el fichero de caracteres "BIBLIO.IN"): En cada lnea
aparecern tres nmeros (N, k y m, los tres mayores que 0 y menores que 20) separados
por un nico espacio en blanco y sin blancos ni al comienzo ni al final de la lnea. La ltima
lnea del fichero contendr siempre tres ceros.
Formato de la salida (a guardar en el fichero de caracteres " BIBLIO.OUT"): Para cada
lnea de datos del fichero de entrada (excepto, claro est, la ltima que contiene tres ceros), se generar una lnea de nmeros que especifique el orden en que seran seleccionados
los chicos para esos valores de N, k y m. Cada nmero de la lnea ocupar tres caracteres en
el fichero (no llevarn ceros a la izquierda y sern completados con blancos por ese lado
hasta alcanzar ese tamao). Cuando dos nios son seleccionados simultneamente, en el fichero aparecer primero el elegido por el bibliotecario que cuenta en sentido horario. Los grupos de elegidos (de uno o dos nios cada uno) vendrn separados entre s por comas (no
debe ponerse una coma despus del ltimo grupo). La salida correspondiente a la entrada
dada como ejemplo tendra que ser exactamente la siguiente; para ver con claridad cuntos blancos deben aparecer, representamos cada carcter blanco con un carcter '*' (en el
fichero generado, pues, no aparecen asteriscos sino espacios en blanco).
Ejemplo:
BIBLIO.IN
10 4 3
528
13 2 2
000

BIBLIO.OUT
**4**8,**9**5,**3**1,**2**6,*10,**7
**2**3,**5,**4**1
**2*12,**4*10,**6**8,**9**5,*13**1,**7,**3*11

8.- VA DE UNOS
Dado cualquier nmero entero N del rango [1..10000] no divisible por 2 o 5, algn mltiplo de
N es un nmero que en notacin decimal es una secuencia de unos. Hay que encontrar el nmero de dgitos que tiene el menor mltiplo de N que est formado solo por unos.
Por ejemplo, si N es 3, el menor mltiplo de 3 que est formado solo por unos es 111. Por lo
tanto la solucin sera 3.
Los datos de entrada estn en el fichero UNOS.IN, en el que hay una sola lnea que contiene
un nmero entero positivo del rango antes mencionado.
Los datos de salida estarn en el fichero UNOS.OUT que contendr una sola lnea que contendr el nmero de unos que tiene el menor mltiplo de N que est formado solo por unos.
Ejemplo:
UNOS.IN UNOS.OUT
7
6
9.- NOTACIN POLACA INVERSA
Dada una expresin aritmtica tal como la (a+b)*(c+d) se puede representar con la notacin
polaca inversa de forma que cada operador va despus de sus dos operandos de la forma:
ab+cd+*
Se trata de calcular una expresin dada en notacin polaca inversa.
Datos de entrada:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

99

El programa debe leer los datos de entrada del archivo NOPOIN.IN. En la primera lnea figura
la expresin a evaluar. sta est formada por enteros del rango [32000..32000] y por los operadores +, -, * y /. Un espacio en blanco separa a cada operando y a cada operador. La expresin es sintcticamente correcta.
Datos de salida:
El archivo de salida NOPOIN.OUT consistir de una sola lnea donde aparece el entero que es
el valor de la expresin evaluada.
EJEMPLO:
NOPOIN.IN NOPOIN.OUT
10 8 + 4 2 - * 36
10.- Aos Santos
En el ao 1179 el Papa Alejandro III, a travs de la bula Regis Aeterni, confirma la
gracia del privilegio jubilar, concedida a Compostela por el Papa Calixto II a peticin del arzobispo Diego Xelmrez, y establece oficialmente que sern aos santos compostelanos todos
aquellos en que la conmemoracin del martirio de Santiago (el da 25 de julio) coincida en domingo.
Desde entonces, ha habido adems dos aos santos extraordinarios: el 1885 (concedido
por el papa Len XIII mediante la bula Deus Omnipotens) para celebrar el redescubrimiento
de los restos del apstol, y el 1938 para que pudieran asistir a ganar el jubileo los contendientes de la guerra civil que no hubiesen podido ir el ao anterior.
Debe tenerse en cuenta que el actual calendario gregoriano fue establecido por el
Papa Gregorio XIII en el ao 1582 (mediante la bula Inter gravissimus) para mejorar la precisin del calendario juliano vigente en aquel momento. Para ello se corrigi la regla de los
bisiestos (que indicaba que todos los aos mltiplos de 4 tenan un da extra despus del 28
de febrero), estableciendo que los mltiplos de 100 que no lo fuesen de 400 no seran, a partir
de ese momento, bisiestos. Paracorregir la desviacin que haba provocado hasta entonces la
imprecisin del calendario juliano, ese ao se suprimieron los 10 das que van del 5 al 14 de
octubre, de modo que al jueves 4 de octubre le sigui el viernes 15.
Objetivo
Se trata de calcular cuantos aos santos hay entre dos aos dados (ambos incluidos).
Entrada
En un archivo de texto con nombre "SANT.IN" se pasarn al programa una lista de pares de
aos (un par por lnea), todos ellos posteriores al ao 1179 y anteriores al ao 100000. Los dos
aos de cada par aparecern separados unicamente por espacios en blanco (uno o ms). No
habr otros caracteres ni al principio ni al final de las lneas.
Salida
El programa deber escribir, en un archivo de texto con nombre "SANT.OUT", una lnea por
cada lnea del archivo de entrada, indicando para cada intervalo, el nmero de aos santos que
le corresponde.
Ejemplo
SANT.IN
SANT.OUT
1998 2000 1
1998 2004 2
1999 2005 2
11.- EL RECTNGULO DE KUBRIK
El rectngulo de Kubrik es una adaptacin a dos dimensiones del clsico cubo de Rubik. Se
dispone de un rectngulo de 8 casillas, distribuidas en dos filas y cuatro columnas, coloreadas
con 8 colores diferentes, que aqu representamos con un nmero del 1 al 8. Inicialmente, la
disposicin de los colores en las casillas es la siguiente:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

100

1234
8765
Se pide, a partir de esta disposicin inicial, alcanzar una disposicin objetivo caracterizada por
una configuracin diferente del rectngulo. Un ejemplo podra ser la configuracin final:
5183
4762
Para ello debern aplicarse sobre la disposicin inicial una serie de transformaciones hasta alcanzar la disposicin objetivo. Existen tres tipos de transformaciones, identificadas por las letras A, B y C.
A: intercambia la fila superior y la fila inferior. El efecto se visualiza en la figura siguiente: de la
configuracin de la izquierda se pasa a la de la derecha:
1234
8765
8765
1234
B: desplazamiento circular derecho del rectngulo:
1234
8765
4123
5876
C: rotacin en sentido horario de los cuatro cuadrados del centro:
1234
8765
1724
8635
Concretamente, el programa pide una secuencia mnima de transformaciones que lleve de la
configuracin inicial a la configuracin destino. En caso de haber ms de una secuencia mnima, se puede devolver cualquiera de ellas.
Formato de la entrada (residente en el fichero de caracteres "KUBRIK.IN"): una lnea con ocho
caracteres entre '1' y '8', sin repeticin y separados exactamente por un blanco (no hay ningn
otro tipo de caracteres ni al inicio ni al final de la lnea), que representan la configuracin final,
numeradas a partir del vrtice superior izquierdo en el sentido del movimiento de las agujas del
reloj.
Formato de la salida (a guardar en el fichero de caracteres "KUBRIK.OUT"): una lnea inicial
diciendo la longitud de la secuencia mnima y, a continuacin, tantas lneas como transformaciones aplicadas, en el orden de aplicacin. No debe aparecer ningn otro tipo de informacin
en la lnea. Podis trabajar con la seguridad de que existe una secuencia de movimientos que
llevan de la configuracin inicial a la configuracin final.
Ejemplo:

KUBRIK.IN
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

KUBRIK.OUT
101

51832674 4
C
A
B
C

Laberinto ajedrecstico
Descripcin del problema
Se tiene un laberinto muy particular que se desarrolla sobre un tablero cuadrado con lados de
tamao N. En cada avance se puede mover como caballo, alfil o torre, con la nica restriccin
de no hacer ms que dos movimientos de la misma especie en forma consecutiva. As por
ejemplo, sera ilcito mover como torre, caballo, caballo, caballo, alfil. Pero s sera lcito: torre,
caballo, caballo, alfil, caballo. El tablero tiene obstculos, que limitan los movimientos mximos
cuando se mueve como torre o alfil. Un movimiento como caballo slo tiene la restriccin de
no posarse sobre un obstculo. Como muchos obstculos estn contiguos y alineados con
otros, ya sea horizontal, vertical o diagonalmente, se los ha descripto dando las ubicaciones de
los extremos de tales alineaciones. Una secuencia i, j, i, k describe una alineacin horizontal;
j, i, k, i una vertical; y cuando el valor absoluto en la diferencia de las coordenadas extremas
es el mismo, la alineacin es diagonal.
Dos alineaciones de obstculos pueden tener puntos en comn. Se cuentan puntos en contra
por cada jugada, uno por movimiento al modo de caballo, dos por movimiento al modo de alfil
y tres por movimiento al modo de torre. El objetivo es partir del casillero [1, 1] y llegar al [N,
N] acumulando la menor cantidad de puntos en contra. Los casilleros de salida y llegada nunca tienen obstculo y se sabe que el laberinto tiene solucin. La figura siguiente ilustra dos
posibles soluciones para el caso del ejemplo.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

102

Se te pide que escribas un programa ajedrez.cpp, que informe la cantidad de jugadas de una
solucin ptima del laberinto, y los puntos en contra obtenidos.
Datos de entrada
Se recibe un archivo ajedrez.in del directorio actual, que contiene:
Primera lnea: El tamao N del tablero ( 3 N 1.000 ), la cantidad c de alineaciones de
obstculos ( 1 c 2.000 ), separados por un espacio.
Un conjunto de c lneas, cada una conteniendo 4 nmeros separados por blanco, correspondientes a una alineacin de obstculos.
Datos de salida
El programa debe generar el archivo ajedrez.out, en el directorio actual con:
Una lnea, conteniendo la cantidad de jugadas de una solucin del problema y la penalizacin obtenida, separadas por blanco.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

103

Luchadores Japoneses

Descripcin del problema


Una academia dedicada a las difciles artes de lucha oriental, est organizando un torneo de
luchadores sumo. A los efectos de conformar la grilla de combates, es necesario armar parejas
de luchadores que puedan ofrecer un espectculo atractivo. Como es sabido que los cultores
de esta disciplina son hombres de estructura fsica imponente, los organizadores habitualmente
arman duplas de combatientes estableciendo comparaciones relativas a sus alturas y pesos.
Por experiencia, los organizadores saben que un combatiente domina a otro si lo supera en
ambas medidas, o bien si lo iguala en peso y lo supera en altura, o viceversa. En cualquier otro
caso, los luchadores no son comparables lo que hace el resultado imprevisible y por lo tanto
ms atractivo para el pblico. Sabiendo que no hay luchadores que coinciden en ambas medidas, los organizadores quieren saber a cuantos posibles contrincantes domina cada uno de
ellos, y por esta razn se te pide que escribas un programa sumo.cpp, que efecte este recuento.
Datos de entrada
Se recibe un archivo sumo.in con el siguiente formato:
Una lnea que indica la cantidad L (1 L 100.000) de luchadores.
L lneas con 2 nmeros P y H (0 P,H 1.000.000) que indican el peso y la altura de cada
participante, separados por blancos.
Datos de salida
Se debe generar un archivo sumo.out conteniendo
L lneas con la cantidad de luchadores a quienes domina cada participante, en el mismo orden en el que los participantes entraron.

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

104

Desinfectando los archivos


Descripcin del problema
Los archivos de texto de una computadora han sido afectados por un nuevo virus. Este virus
daa los archivos de texto de la siguiente manera: elige dos caracteres cualesquiera, luego
recorre el texto y cada vez que encuentra dos ocurrencias consecutivas del primer carcter le
intercala el segundo carcter.
Por ejemplo si el texto original fuera aadabeaa y el virus elige como primer carcter a y como
segundo carcter b, el texto infectado ser abadabeaba. Si el archivo de texto original no
contena la secuencia aba entonces el archivo se puede desinfectar realizando el proceso
inverso. A estos archivos los denominaremos desinfectables.
Con el objeto de ayudar a desinfectar los archivos de texto de la computadora se te pide que
escribas un programa antivirus.cpp, que conociendo el texto infectado y los dos caracteres
elegidos por el virus, realice el proceso de desinfeccin del mismo. Tu programa slo recibir
archivos que sean desinfectables.
Datos de entrada
Se recibe un archivo antivirus.in con dos lneas:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

105

La primera lnea contiene la cantidad de caracteres del texto infectado, seguido de los dos
caracteres elegidos por el virus, separados por un espacio.
La segunda lnea contiene el texto infectado.
Datos de salida
Se debe generar un archivo antivirus.out conteniendo dos lneas:
La primera lnea contiene la cantidad de caracteres del texto desinfectado.
La segunda lnea contiene el texto desinfectado.
Restricciones
Tanto los caracteres que elige el virus como los caracteres del texto pueden ser cualquier
letra del alfabeto, excepto la , en minsculas y sin acentos.
La longitud mxima del texto a desinfectar es de 255 caracteres.

Hilera de ladrillos
Descripcin del problema
Recientes hallazgos en ruinas del lejano oriente aportan datos sobre las formas que los esclavos tenan para distraerse durante las arduas jornadas en que se construy la clebre muralla
china.
En un viejsimo manual de juego se detallan las siguientes reglas: se construye una hilera de
ladrillos y se les asigna a cada uno un nmero. Pero esto siempre respetando la regla del juego, que indica que un ladrillo tiene que tener un nmero equivalente a la suma de sus dos ladrillos predecesores en la hilera, si los hubiera.
Algunos ladrillos tienen nmero asignado y otros estn vacos. La idea es que se deben completar con nmeros todos los ladrillos vacos cumpliendo la regla anteriormente mencionada.
Para completar las investigaciones, los excavadores nos han pedido escribir un programa ladrillos.cpp que encuentre a partir de una cantidad de ladrillos y algunos casilleros una forma de
completar todos los nmeros faltantes en los ladrillos de las hileras.
Datos de entrada
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

106

Los ladrillos vacos los representaremos con un * (asterisco) y los nmeros explcitos o desconocidos de cada ladrillo sern enteros de -1.000.000.000 a +1.000.000.000.
Se recibe un archivo ladrillos.in del directorio actual, que contiene la descripcin de una hilera
de ladrillos. La misma se describe por una primera lnea que contiene un entero M, 1 M
45, que representa la cantidad de ladrillos que componen la hilera.
A continuacin, en una segunda lnea el archivo contiene M datos, separados por blancos,
detallando en cada posicin los nmeros conocidos o espacios vacos a completar mediante
asteriscos.
Datos de salida
El programa debe generar el archivo ladrillos.out, en el directorio actual con la hilera de ladrillos completa (con todos sus casilleros definidos, con el formato de la entrada). Los casos con
los que ser probado el programa tienen solucin con nmeros enteros.
Si hubiera ms de una solucin cualquiera vale.

A correr que es muy saludable !!!


Descripcin del problema
Una entidad deportiva ha organizado una carrera multitudinaria en el marco de los festejos por
el Bicentenario. Los organizadores piensan clasificar a los competidores segn su categora y
sexo: Las categoras se asignan segn rangos de edades y su cantidad puede variar de una
competencia a otra, a criterio de quienes la organizan. Los sexos son naturalmente dos: masculino y femenino. Al inscribirse los corredores informan su edad y reciben un nmero que deben llevar abrochado en la remera. Los nmeros de corredor se asignan correlativamente. A
medida que los competidores van arribando uno detrs de otro a la meta, los fiscales de la
competencia registran el nmero del corredor. Se te pide que escribas un programa carrera.cpp que determine los ganadores de oro, plata y bronce para cada categora y sexo, para
establecer los integrantes de los podios.
Datos de entrada
Se recibe un archivo carrera.in con el siguiente formato:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

107

Una lnea que indica: la cantidad A ( 1 A 1.000.000 ) de competidores inscriptos, cf y


cm ( 1 cf, cm 60 ) la cantidad de categoras por sexo respectivamente, y L ( 0 L
) la cantidad de corredores que arribaron a la meta, todos separados por blanco.
cf lneas con los rangos Fn, Fx de edades de cada categora femenina (10 Fn Fx 80)
y cm lneas con los rangos de edades de cada categora masculina Mn, Mx (10 Mn Mx
80). Las categoras se dan en orden creciente; los rangos obviamente son disjuntos y sus cotas
estn separadas por blanco.
A lneas con los pares E, X correspondientes a la edad ( 10 E 80 ) y sexo (M / F) de
los corredores inscriptos, en orden de inscripcin (nmeros correlativos, comenzando desde 1),
separados por blanco.
L lneas con los nmeros de los corredores arribados a la meta, por orden de llegada.
Datos de salida
Se debe generar un archivo carrera.out conteniendo
cf+cm lneas, conteniendo cada una el nmero de categora y los 3 nmeros de los corredores que merecieron oro, plata y bronce, separados por blanco. Se deben listar ordenados por
nmero de categora, primero las cf correspondientes a las damas y luego las cm de los caballeros. Si en alguna categora llegaron menos de 3 participantes, los premios correspondientes
se declaran desiertos y se debe colocar un 0(cero) como nmero de corredor.

Contenidos Asignatura:

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

108

EJES
N1

PERODO
1

Conceptos iniciales
Elementos tcnicos bsicos
Lectura por teclado
Tipos de soluciones. Abstracciones y modelos. Algoritmos. Lgica. Resolucin algortmica.

Estructura de un programa.
Sintaxis y reglas sintcticas.
Tipos de datos estndar en C++.
Constantes y variables.
Asignacin y reglas de asignacin.
Operadores aritmticos y de relacin.
Entrada y salida de datos.
Condicionales simples y mltiples.
Control de ciclos condicionales. (while, do while)
Control de ciclo exacto.(for)
Declaracin y utilizacin de funciones y procedimientos definidos por el usuario.
Valores de retorno de una funcin.
Argumentos de una funcin.
Pasaje de parmetros por valor y por referencia
Funciones que modifican parmetros.
Copia, insercin y borrado dentro de cadenas de
caracteres.
Ubicacin de caracteres dentro de una cadena.
Tratamiento de cadenas como arreglos de caracteres individuales.
Transformacin de cadenas.
Biblioteca stdlib.h

Introduccin a
la Programacin
N2
Estructuras de
Datos
Ciclos Repetitivos

N3
Funciones y
procedimientos
N4
Tratamiento de
cadenas de caracteres

N5

Arreglos uni y
bidimensionales

N6 Archivos

N7

10

Introduccin a
la recursin

N8 Memoria
dinmica - Pun-

CONTENIDOS

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

Estructura de datos de arreglo.


Manejo de dimensiones de un arreglo.
ndices.
Tcnicas de ordenamiento (Selection Sort, BubbleSort, Insercin Directa, Mtodo Shell, Heap Sort)
Bsqueda secuencial y binaria.
Arreglos paralelos.
Matrices.
Diagonal principal y secundaria
Clculo de matrices y vectores
Archivos en C y C++.
ABM de ficheros.
Recursin, concepto.
La sucesin de Fibonacci, factorial de un nmero.
Torres de Hanoi.
Backtraking
Introduccin
La vuelta del caballo
El problema de las ocho reinas
El problema de la mochila (seleccin ptima)
Introduccin a las variables puntero
Repaso: - operador de direccin: &referencias
109

teros

N9

Introduccin
a la programacin orientada a
objetos (POO).
Libreras en
C++ .h

N10

Constructores y destructores
Puntero THIS

Declaracin de variables de tipo puntero


Inicializacin de variables de tipo puntero
El puntero nulo: NULL
Valor apuntado por un puntero: Indireccin de punteros
Aritmtica de punteros
Relacin entre Vectores y punteros
Cadenas y punteros.
El Operador NEW y DELETE
Las clases
Pilares de la Programacin Orientada a Objetos
Caractersticas fundamentales de las clases en C++
Representaciones Grficas
Construccin de una clase
Atributos
Mtodos. Implementacin de los mtodos de una clase
Creacin de objetos
Paso de mensajes
Libreras
Organizacin de archivos header
#ifndef NOMBRE_CLASE_H

Categoras de los mtodos (inicializadores, accedentes


selectores, mutadores o modificadores, visualizadores y
operadores)
Inicializacin de miembros
Mtodos constructores
Inicializacin de objetos con y sin constructores
Sobrecarga de funciones constructoras
Argumentos implcitos en constructores
El constructor por defecto
Mtodo destructor
Cundo se ejecuta el destructor?
Puntero This
La clase Fraccional
Categoras de los objetos que aparecen en los mtodos
El puntero this
Mtodos operadores

N11

Mtodos
operadores
unarios.
Clases y funciones amigas:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

Sobrecarga de operadores
Mtodos de operadores unarios . Operador de incremento (prefijo).
Devolucin de objetos en los mtodos. Retorno por
referencia
Clases Amigas
110

friend

N12

10

Templates

Introduccin a las funciones amigas (Funciones friend)


Funciones amigas
Clases amigas
Ejemplo: La clase fraccional. Mtodos operadores amigos

Introduccin (Genericidad).
Template de funciones o funciones genricas.
Sintaxis de Templates.

Ejemplos de declaraciones.
Un ejemplo de Template de funciones: Mximo de un
vector.
Sobrecarga de Template.
Especializacin de funciones genricas.
Punteros a objetos
Vectores dinmicos de objetos
Uso de objetos dinmicos
Atributos dinmicos
Creacin de objetos con atributos dinmicos
Destruccin de objetos con parmetros dinmicos
Operador de asignacin para objetos con parmetros
dinmicos.

Bibliografa
R. Sedgewick. Algorithms in C, C++(Fundamental Algorithms, Data Structures, Sorting,
Searching). Addison-Wesley,1990.
Stroustrup - Bjarne - The C++ Programming Language 3rd Edition- Addison Wesley
Stroustrup - Programming - Principles and Practice Using C++ (Pearson, 2009).
C++ - The Complete Reference (3rd Ed)Herb Schildt.
Grady Booch - Object-Oriented Analysis and Design With Applications, 2nd EDITION.
Algorithms and Data Structures - Niklaus Wirth 2004
http://www.cplusplus.com
http://es.scribd.com/doc/1739233/Ordenamiento-en-C
http://www.algoritmia.net
http://c.conclase.net
http://www.cppreference.com
http://www.oia.org.ar (Olimpiadas Argentina de Informtica)
http://www.cartagena99.com/recursos/recursos_programacion.php
http://www.nebrija.es/~abustind/Informatica/MetodologiaI/MetodologiaI.html
http://www.nebrija.es/~abustind/Informatica/MetodologiaII/MetodologiaII.html

Laboratorio de Programacin
EEST N5 Prof Abdala Pablo

111

También podría gustarte