Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2015 Tec 5 Apunte Lab Programacion
2015 Tec 5 Apunte Lab Programacion
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
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.
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
int receta_del_mes;
Asignar un valor
Otro Ejemplo
double d;
int i;
short s;
//...
d=d+i;
i=s*i;
Entrada / Salida
Cout (C output)
cout << "Texto: " << variable << "\n";
cout
cout
cout
cout
<<
<<
<<
<<
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
== 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
<<=
>>=
&=
^=
|=
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.
Sentencia IF
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
//Parte FALSA
}
la palabra "else" o "De lo contrario" indica al lenguaje que de lo contrario al no ser verda-
#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
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
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;
}
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";
}
13
return 0;
}
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
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
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];
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;
}
Su representacin es:
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo
20
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)
22
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
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 ;
}
}
25
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";
}
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo
27
#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 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};
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.
#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
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);
}
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
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
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.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo
42
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.
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
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
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
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
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();
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
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.
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
#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
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
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
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;
y = y+4*z;
if(x>y || x<z)
y +=x;
cout<<"verdadero" ;
cout<<"verdadero";
cout<<y;
else
cout<<"falso";
else
cout<<"falso";
if(i<x) cout<<i;
else cout<<i-x;
}
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;
}
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,
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.
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
87
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;
}
}
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
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
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
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
VIDA.OUT
......
..***.
..*...
..**..
......
......
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
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo
104
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.
Laboratorio de Programacin
EEST N5 Prof Abdala Pablo
107
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
teros
N9
Introduccin
a la programacin orientada a
objetos (POO).
Libreras en
C++ .h
N10
Constructores y destructores
Puntero THIS
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 (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