Sei sulla pagina 1di 141

ndice

Tema 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, Pgina 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 103 139
2

Biblioteca conio - math


Punteros Templates (introduccin) Programacin Visual Trabajos Prcticos Contenidos Asignatura
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

Notas Preliminares

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

Introduccin a la Programacin en C/ C++.

a) Introduccin Terica

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

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.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 4

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.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

bool

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

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

bool

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

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

int receta_del_mes;

Es posible asignar un valor a una variable al momento de declararla: int Mes = 12; Tambin es posible declarar varias variables en una misma lnea, pero en este caso, todas las variables de la lnea tendrn el mismo tipo. int recetaDelMes = 12301, recetaDelAo = 45644545;

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

Entrada / Salida

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

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


EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 6

int entero = 10; char caracter = 'c'; char cadena[20] = "Hola"; float pi = 3.1416; cout cout cout cout << << << << "entero=" << entero << "\n"; "caracter=" << caracter << endl; "cadena=" << cadena << endl; "pi=" << pi << endl;

Cin
#include <iostream.h> #include <string.h> 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 Lista de operadores aritmticos con su significado + Suma

lgicos ! Not (no lgico) && And (y lgico) || Or ( lgico)

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

Asignacin = *= /= %= += -= Asignacin Asigna producto Asigna divisin Asigna resto (mdulo) Asigna suma Asigna diferencia (resta)
7

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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

<= Menor o igual que

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

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

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

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

Las instrucciones comienzan a ejecutarse de forma secuencial (en orden) y cuando se llega a una estructura condicional, la cual est asociada a una condicin, se decide qu camino tomar dependiendo siempre del resultado de la condicin siendo esta falsa o verdadera.

Cuando se termina de ejecutar este bloque de instrucciones se reanuda la ejecucin en la instruccin siguiente a la de la condicional.

Sentencia IF

La instruccin if es, por excelencia, la ms utilizada para construir estructuras de control de flujo. SINTAXIS Primera Forma
if (condicin) { Set de instrucciones }

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

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

//PARTE VERDADERA

//Parte FALSA

La forma mostrada anteriormente muestra la unin de la parte "VERDADERA" con la nueva secuencia la cual es la parte "FALSA" de la sentencia de decisin "IF" en la cual esta compuesta por el:
else { Conjunto de sentencias 2 } la palabra "else" o "De lo contrario" indica al lenguaje que de lo contrario al no ser verda//Parte FALSA

dera o no se cumpla la parte verdadera entonces realizara el "set de instrucciones 2". EJEMPLOS DE SENTENCIAS IF... Ejemplo 1:
#include <vcl.h> #pragma hdrstop #include <iostream.h> #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"; } system(pause); 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"; }

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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

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

Ejemplo 1
#include <vcl.h> #pragma hdrstop
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 10

#include <iostream.h> #pragma argsused int numero; int main(int argc, char* argv[]) { cout<<"ingrese numero"; cin>>numero; switch (numero) { case 0: cout << "numero es cero"; } system(pause); 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:
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 11

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

Esto indica que el contador "i" inicia desde 1 y finaliza cuando el contador "i" sea menor o igual a 10 ( en este caso llegar hasta 10) e "i++" realiza la sumatoria por unidad lo que hace que el for y el contador se sumen. repitiendo 10 veces "HOLA MUNDO" en pantalla. Ejemplo 2:
#include <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; } system(pause); return 0; } Este ejemplo hace lo mismo que el primero, salvo que el contador se inicializa a 10 en lugar de 1; y por ello cambia la condicin que se evala as como que el contador se decremento en lugar de ser incrementado. Sentencia while

while(condicin) { cdigo a Repetir }

donde: 1. condicin es la expresin a evaluar


EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 12

Ejemplo 1:
#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; } system(pause); return 0; }

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

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

Al modificar el segmento de cdigo anterior usando do tenemos:


#include <iostream.h> #include <vcl.h> #pragma hdrstop #pragma argsused int main(int argc, char* argv[]) { int contador = 0; do { contador ++; cout<<"Hola Mundo"; } while(contador > 10); system(pause);
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 13

return 0; }

Observe cmo en el caso de do la condicin es evaluada al final en lugar de al principio del bloque de instrucciones y, por lo tanto, el cdigo que le sigue al do se ejecuta al menos la primera vez. FUNCIONES Definicin de una Funcin

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

Estructura de una funcin:


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

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
14

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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 <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; system(pause); 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>
EDI Laboratiorio Programacin C++ 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(); system(pause); 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; } system(pause); }
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 16

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

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

por valor

(tambin denominado por

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

int main(int argc, char* argv[]) { enum ColorT { rojo = 10, azul = 166, verde }; //verde toma el valor de azul+1 ColorT c = azul; cout << "c es " << c << endl; system(pause); return 0; }

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


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

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

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

Ejemplo: Ingresar 10 elementos utilizando vectors y mostrar el mayor. Entrada: 10 enteros Salida: El mayor de los 10 enteros
#include <vcl.h> #include <iostream.h> #include <stdio.h> #pragma hdrstop
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 19

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

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

Su representacin es:

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

20

Lectura de una Matriz (llenado):

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

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

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

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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

21

El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numrico, alfabtico o incluso alfanumrico, ascendente o descendente. Ordenamiento Por Seleccin (Selection Sort) Busca el elemento ms pequeo de la lista. Intercambia con el elemento ubicado en la primera posicin de la lista. Busca el segundo elemento ms pequeo de la lista. Lo intercambia con el elemento que ocupa la segunda posicin en la lista. Repite este proceso hasta que haya ordenado toda la lista.

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

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

Ordenamiento BubbleSort o Burbuja o Intercambio Directo. Es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser cambindolos de posicin si estn en el orden equivocado. toda la lista hasta que no se necesiten ms intercambios, lo denada. Este algoritmo obtiene su nombre de la forma con mentos durante los intercambios, como si fueran pequeas como el mtodo del intercambio directo. ordenada con el siguiente, interEs necesario revisar varias veces cual significa que la lista est orla que suben por la lista los ele"burbujas". Tambin es conocido

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

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

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

Ventajas:
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 24

Fcil implementacin. Requerimientos mnimos de memoria.

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

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

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

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

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

Convertir el vector en un heap Construir un vector ordenado de atrs hacia adelante (mayor a menor) repitiendo los siguientes pasos: Sacar el valor mximo en el heap (el de la posicin 1) Poner ese valor en el vector ordenado Reconstruir el heap con un elemento menos Utilizar el mismo vector para el heap y el vector ordenado

#include <vcl.h> #pragma hdrstop #include<iostream> #include<conio.h> #include<stdio.h> #include <iostream.h> #pragma argsused void heapsort(int vector[15],int tamano); void mostrarVector(int[], int); int _tmain(int argc, _TCHAR* argv[]) { const int tamano = 15; int vector[tamano] = {0,17,13,16,41,32,12,115,95,84,54,63,78,21,10}; int i; cout << "vector sin ordenar\n" ; mostrarVector(vector,tamano); cout << "vector ordenado\n" ; heapsort(vector,tamano); mostrarVector(vector,tamano); system(pause); 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] << "/";
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 28

cout<<"\n"; }

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

Bsqueda binaria La bsqueda binaria slo se puede implementar si el vector est ordenado. La idea consiste en ir dividiendo el vector en mitades. Por ejemplo supongamos que tenemos este vector: int vector[10] = {2,4,6,8,10,12,14,16,18,20};

La clave que queremos buscar es 6. El algoritmo funciona de la siguien manera 1. Se determinan un indice arriba y un indice abajo, Iarriba=0 e Iabajo=9 respectivamente. 2. Se determina un indice central, Icentro = (Iarriba + Iabajo)/2, en este caso quedara Icentro = 4.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 29

3. Evaluamos si vector[Icentro] es igual a la clave de busqueda, si es igual ya encontramos la clave y devolvemos Icentro. 4. Si son distintos, evaluamos si vector[Icentro] es mayor o menos que la clave, como el vector est ordenado al hacer esto ya podemos descartar una mitad del vector asegurandonos que en esa mitad no est la clave que buscamos. En nuestro caso vector[Icentro] = 4 < 6, entonces la parte del vector vector[0...4] ya puede descartarse. 5. Reasignamos Iarriba o Iabajo para obtener la nueva parte del vector en donde queremos buscar. Iarriba, queda igual ya que sigue siendo el tope. Iabajo lo tenemos subir hasta 5, entonces quedaria Iarriba = 9, Iabajo = 5. Y volvemos al paso 2. Si la clave no fuese encontrada en algun momento Iabajo > Iarriba, con un while vamos a controlar esta condicin para salir del ciclo en tal caso y devolver -1 (clave no encontrada). Hagamos modificaciones al cdigo de bsqueda lineal para implementar una funcin de bsqueda binaria.
//Bsqueda binaria en un vector. #include <vcl.h> #pragma hdrstop #include<iostream> #include<conio.h> #include<stdio.h> #include <iostream.h> int busquedaBinaria(const int[], int, int); //vector, tamao, clave void ordenarVector(int[], int); //prototipo que modifica y ordena el vector void intercambiar(int&, int&); //prototipo, intercambia los valores de dos elementos void mostrarVector(int[], int); //-------------------------------------------------------------------#pragma argsused int _tmain(int argc, _TCHAR* argv[]) { int clave =0; const int tamano = 15; int vector[tamano] = {20,17,13,16,41,32,12,115,95,84,54,63,78,21,10}; int i; //ordenamos el vector para que funcione la busquedaBinaria cout << "Vector sin ordenar\n" ; mostrarVector(vector,tamano); ordenarVector(vector,tamano); cout << "Elementos del vector ordenado:\n"; mostrarVector(vector,tamano); cout << "Indique un valor a buscar y se le devolvera el indice: " ; cin >> clave; cout<< "Su valor se encuentra en vector["<<busquedaBinaria(vector,tamano,clave)<<"]" ; cout << "Fin del programa :)"; system(pause); return 0; } void mostrarVector( int vector[], int tamano) { for (int i = 0 ; i < tamano ; i++) cout << vector[i] << "/"; cout<<"\n";
EDI Laboratiorio Programacin C++ 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 las 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
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 31

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

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

Qu pasa si se hace una llamada recursiva que no termina? Cada llamada recursiva almacena los parmetros que se pasaron al procedimiento, y otras variables necesarias para el correcto funcionamiento del programa. Por tanto si se produce una llamada recursiva infinita, esto es, que no termina nunca, llega un momento en el que no quedar memoria para almacenar ms datos, y en ese momento se abortar la ejecucin del proEDI Laboratiorio Programacin C++ Prof. Abdala Pablo 32

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

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

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

Operaciones recursivas con Vectores

EDI Laboratiorio Programacin C++ 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)
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 36

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

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

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>
EDI Laboratiorio Programacin C++ 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).
EDI Laboratiorio Programacin C++ 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[]) {
EDI Laboratiorio Programacin C++ 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]<< " "; } } system(pause); 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.

EDI Laboratiorio Programacin C++ 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 contiEDI Laboratiorio Programacin C++ Prof. Abdala Pablo 41

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

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

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

La vuelta del caballo


42

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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

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

EDI Laboratiorio Programacin C++ 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;
EDI Laboratiorio Programacin C++ 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 amenaEDI Laboratiorio Programacin C++ 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;
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 46

void ensayar(int i, boolean *q, int col[], boolean fila[], boolean diagb[], boolean diagc[]) { int j; j = 0; *q = FALSE; do { if (fila[j] && diagb[i+j] && diagc[7+i-j]) { col[i] = j; fila[j] = diagb[i+j] = diagc[7+i-j] = FALSE; if (i < 7) { /* encuentra solucion? */ ensayar(i+1,q,col,fila,diagb,diagc); if (!*q) fila[j] = diagb[i+j] = diagc[7+i-j] = TRUE; } else *q = TRUE; /* encuentra la solucion */ } j++; } while (!*q && j < 8);

Por ltimo, se deja al lector que implemente un procedimiento que encuentre todas las soluciones. Si se desea complicar ms entonces se puede pedir que encuentre todas las soluciones distintas, es decir, aquellas que no sean rotaciones o inversiones de otras soluciones. Ahora que se conoce el mtodo general, puede hacerse extensible a mltiples piezas simultneamente.

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

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

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

El problema de la mochila consiste en llenar una mochila con una serie de objetos que tienen una serie de pesos con un valor asociado. Es decir, se dispone de n tipos de objetos y que no
EDI Laboratiorio Programacin C++ 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

EDI Laboratiorio Programacin C++ 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":
49

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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

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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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 <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. char v[9][9]; // Indica si hemos utilizado una casilla o no.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 51

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

// Abro los archivos.

archivo_entrada>>F; archivo_entrada>>C; // Leo el nmero de filas y columnas. for(a=0;a<F;a++) // Leo la tabla. for(b=0;b<C;b++) { archivo_entrada>>mapa[a][b]; } archivo_entrada>>cad; // Leo la palabra a buscar l=strlen(cad); // y su longitud. memset(v,0,sizeof(v)); // No he utilizado ninguna casilla. for(a=0;a<F;a++) // Recorro la tabla buscando la ltima letra de la palabra for(b=0;b<C;b++) if(mapa[a][b]==cad[l-1]) // Cuando la encuentro { v[a][b]=1; // Marco como utilizada la casilla. if(busca(a,b,l-2))// Y busco la penltima. Si forma parte de la palabra: archivo_salida<<a+1<<" "<<b+1<<"\n";//Imprimo la posicin de esa casilla. v[a][b]=0; // Marco como no utilizada la casilla. } system(pause); 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. return(true); // Seguir deshaciendo el camino.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 52

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

Cadenas de caracteres en C++. STRING


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

operador[]
53

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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; system(pause); return 0; } find_first_of Encuentra caracteres en una variable String #include <vcl.h> #pragma hdrstop #pragma argsused #include <iostream> #include <string> using namespace std;
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 54

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

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

clrscr

getch

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(); system(pause);

getchar

Lee un caracter de el teclado y regresa el caracter leido. 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.

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

gotoxy(int x, int y);

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
55

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

abs fmod pow(x,y) sin


Sqr

valor absoluto resto del punto flotante


printf ("fmod de 5.3 / 2 es%lf\n", fmod (5.3,2) );

eleva un valor dado a un exponente, xy seno Cuadrado de un nmero


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

sqrt tan

raz cuadrada tangente

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

Operador de Direccin: &

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

56

Referencias

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

57

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

58

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

59

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

60

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

61

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

62

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

63

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

64

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

65

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

66

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

67

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

68

EDI Laboratiorio Programacin C++ 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
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 70

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

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

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

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

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

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

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

Programacin visual

Introduccin y entorno de trabajo.


Comenzaremos a programar en forma visual, para ello utilizaremos un compilador, el Borland C++ Builder. Este compilador respeta las mismas teclas rpidas que los compiladores que venamos usando en C++ (dado que todos son del mismo fabricante, Borland). Este compilador genera aplicaciones para entornos visuales (en esta versin Windows 95 o superior. Pensemos en una ventana clsica de Windows. Dentro de la venta tendremos botones, cuadros de edicin, etiquetas, barras de desplazamiento, un men principal, etc Hay tres aspectos importantes que nos interesaran sobre los objetos:

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

74

Propiedades Eventos Mtodos 1) Propiedades: Como su nombre lo indica, son las caractersticas de los objetos (Tamao, posicin etc.). Si el objeto fuese una estructura, las propiedades serian los campos de la estructura. De hecho, utilizaremos las propiedades como campos de una estructura, ya que veremos que tienen tipos (Int, Char, String, etc.)

2) Eventos: Un evento es un mensaje que el objeto enva al programa de que "algo" a sucedido. Si hacemos click sobre un objeto, eso es un evento, si cambiamos el tamao de un objeto (por ejemplo la ventana) es un evento si modificamos el texto de un cuadro de edicin hay un evento, si tocamos una tecla, hay un evento. De ahora en adelante, en lugar de pensar el programa como un solo bloque, lo pensaremos como pequeos bloques de programa que se ejecutaran cuando suceda un determinado evento. Por ejemplo, si quiero que al tocar un botn aparezca un mensaje, en el evento OnClick del botn escribo una lnea de cdigo que diga: ShowMessage("Hola, que tal"); (Evidentemente ShowMessage muestra un mensaje, pero esto lo veremos en despus con mayor detalle).

3) Mtodos: Los Objetos son de una determinada clase. Podramos decir que una clase (class) es una estructura mejorada. Mas exactamente, es una estructura que adems de tener campos, tiene funciones relacionadas a ella. Estas funciones se llaman Mtodos. A veces es comn confundir las propiedades con los mtodos, sin embargo son cosas totalmente diferentes. Una propiedad es una cualidad que esta expresada con algn tipo de dato (enteros, caracteres, etc.). Un mtodo en cambio es una accin que puede realizar el objeto. Por ejemplo la ventana tiene el mtodo Close() que obviamente cierra la ventana.

Entonces: Las propiedades son datos a los cuales podemos acceder en tiempo de ejecucin y (algunas) en tiempo de edicin. Por ejemplo el ancho de una ventana lo definimos cuando estamos editando nuestra aplicacin, pero lo podemos cambiar en tiempo de ejecucin. Los eventos son sucesos. Nosotros programaremos los bloques de programacin (tambin llamados cpsulas) dentro de los eventos que nos interesen. Los mtodos son acciones que nosotros invocamos en tiempo de ejecucin.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

75

Debemos tomar algunos recaudos antes de comenzar a programar. Pensemos en un programa de Windows, muchas veces los programas tiene mas de una ventana (ventanas de configuracin, cuadros de dialogo, etc.) A cada Ventana le corresponderan dos archivos (un *.CPP y un *.H) a su vez, existe un archivo que rene a todas las ventanas en un mismo proyecto (en nuestra versin es un archivo *.MAK, en versiones posteriores, *.BPR). Adems de estos archivos, el compilador creara nuevos archivos de recursos, archivos temporales, etc.

Importante: Nuestro programa (de ahora en adelante ser un proyecto) esta formados por muchos archivos. Es por eso que antes de escribir un sola lnea de cdigo, lo que haremos ser guardar el proyecto en una carpeta nueva a la que le pondremos un nombre conveniente, recin entonces comenzaremos a escribir nuestro programa (acordate, siempre grabaremos y abriremos proyectos). Cuando queramos salvar nuestro trabajo utilizaremos la opcin save all que guardar todos los archivos de nuestro proyecto. Si tomamos esta medida de seguridad nos ahorraremos problemas. Cabe aclarar que el compilador genera algunos archivo temporales que agilizan el proceso de compilacin pero que son grandes (varios mega) por lo que es muy incomodo de trasladarlos en disquetes. Estos archivos no son necesarios, y podemos borrarlos pues el compilador los generara automticamente en la prxima compilacin, los archivos que debemos guardar (y los que debemos a copiar a un disquete en caso de querer trasladar un proyecto de un lado a otro) son:

*.MAK

*.CPP

*.RES

*.H

*.HPP

*.RC

*.DEF

*.DFM

Caractersticas del compilador: Al abrir el compilador nos encontramos (en principio) con tres ventanas: Estas ventanas son:

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

76

Barra de herramientas

Inspector de objetos

Esquema de la ventana

Barra de Herramientas: Aqu encontramos las opciones del compilador, (Opciones de archivos, de edicin, configuracin, etc.), as como tambin lo controles de compilacin (ejecutar, compilar, detener etc.), y lo mas novedoso para nosotros, la barra de componentes. La barra de componentes es una pagina de pestaas en donde estn clasificados los distintos componentes (objetos) que podremos colocar en nuestra aplicacin. Por ejemplo, si queremos poner un botn, seleccionamos de la pestaa Standar el objeto con forma de botn (que dice Ok) y lo arrastramos a la Ventana Esquema en el lugar de la ventana que deseamos colocarlo (como si se tratase del PaintBrush).
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 77

El esquema de la ventana: Es el aspecto (aproximado) que tendr la ventana de nuestro proyecto al comenzar su ejecucin (si nuestro proyecto tuviese mas de una ventana habr ms de un esquema, por supuesto podremos cerrar las ventanas que no estemos modificando). Este aspecto podra cambiar en tiempo de ejecucin por ejemplo por redimensionamientos de la ventana. Los puntos que vemos dibujados tienen la funcin de grilla (o imn) para facilitar la colocacin de los objetos, esta grilla puede desactivarse, o modificarse, pero en general nos ayuda muchsimo. De todo modos esos puntos no se vern en la aplicacin terminada. Es en esta ventana donde colocaremos los objetos desde la barra de componentes. Si ocultramos accidentalmente esta ventana, reaparecer al pulsar F10 .

El Inspector de Objetos: Es una ventana con dos pestaas, Properties (Propiedades) y Events (eventos). En estas pestaas figuran las propiedades y los eventos de los objetos que tenemos en nuestra aplicacin. Es importante que sepas que los valores que le asignamos a las propiedades los podremos modificar luego en tiempo de ejecucin. Si ocultramos accidentalmente esta ventana, reaparecer al pulsar F11.

En un principio puede resultarte incomodo el hecho de que estas ventanas estn "flotando" en el escritorio, ya que estamos acostumbrados a programas que tienen una ventana madre y que contiene todas las ventanas de la aplicacin (Word, Excel, etc.) Sin embargo no tardaras en acostumbrarte a este entorno de trabajo. Antes de terminar con este capitulo debemos tener en cuenta algo: Cuando programbamos en C a modo consola, estbamos dentro de una aplicacin (el compilador). Al probar nuestro programa el compilador quedaba en segundo plano mientras nuestro programa se ejecutaba, y al terminar volvamos automticamente al compilador. Ahora en cambio nos encontramos en un entorno Windows, que es multitarea, es decir, puede ejecutar varias aplicaciones al mismo tiempo (si tenemos suerte), entonces cuando estemos probando nuestro programa el compilador estar accesible en todo momento, adems nuestro programa no terminar a menos que nosotros lo cerremos explcitamente (como todo los programas de Windows). Debemos tener cuidado de cerrar el programa en ejecucin y no el compilador. Este es un error es muy comn, ya que la ventana esquema del compilador es muy parecida a la aplicacin en uso, de hecho, solo se diferencia por los puntos de la grilla. Si nosotros no cerramos la aplicacin en prueba, podremos pasar el control al compilador y seguir programando tranquilamente, pero no nos permitir recompilar el proyecto hasta que la aplicacin no este cerrada.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

78

Ventana Principal, Botones, Cuadros de Edicin.


Creacin de un nuevo proyecto: Estamos en condiciones de crear nuestra primera aplicacin, para ello, lo primero que haremos es guardar el proyecto como se explico en el capitulo 1. Si en estas condiciones, y sin tocar absolutamente compilamos (presionamos F9 o hacemos click en el botn de Play) el programa realizara las tareas necesarias y luego aparecer nuestra aplicacin, que no es otra cosa que una ventana completamente vaca. Sin embargo podremos ver que esta ventana es funcional, es decir, podemos moverla, maximizarla, minimizarla, y por supuesto cerrarla. Esto significa que los objetos que nosotros colocamos en la aplicacin no necesitamos "programarlos" solo necesitamos indicar que deseamos hacer con ellos. Podemos ahora realizar nuestro primer programa, el clsico mensaje de bienvenida. Ejemplo: Realizaremos un programa que muestre una ventana con un botn, al presionar el botn aparecer un mensaje que diga: Felicitaciones, ha realizado su primer programa Para ello colocaremos en la ventana esquema un botn, este objeto se encuentra en la barra de componentes en la pestaa Standar (El objeto con forma de botn que dice Ok). Ahora iremos al Inspector de Objetos, donde figuran las propiedades del botn que acabamos de crear. Atencin, en el inspector de objetos figuran dos posibles objetos, la ventana (Form1) y el botn (Button1). No olvidemos, la ventana es tambin un objeto. Seleccionamos el objeto Button1 (nuestro botn) y hacemos click sobre la pestaa Events. Aqu vemos una lista de los posibles eventos que puede considerar nuestro objeto, en nuestro caso, el evento que nos interesa es OnClick, as que hacemos doble click sobre este evento. Al hacer esto se abre una ventana con texto, el cursor esta ubicado entre dos llaves, que encierran la funcin (o cpsula) que debe ejecutarse cuando suceda el evento click del botn. Ms arriba estn las llamadas a libreras graficas y otras declaraciones que nosotros no debemos tocar. Esta ventana de texto es el cdigo de nuestro programa, si pensabas que en la programacin visual no haba que escribir cdigo te equivocabas. En esta ventana de texto escribiremos el cdigo que se guardar como un archivo de texto *.CPP. Pero volvamos al cursor que est entre llaves. Dentro de estas llaves nosotros escribiremos el cdigo que queramos, cdigo que, en general ya conoces : (for, while, do-while, if, switch, etc.) con la salvedad de que algunas funciones que utilizbamos en la programacin en modo texto ya no tienen sentido (como por ejemplo printf, scanf, gotoxy, etc.), debemos entonces aprender otras funciones pero esto no va presentarte mayores problemas.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 79

Nosotros queremos que al presionar el botn aparezca un mensaje. No necesitamos escribir algo como: if (boton = = pulsado) {......................} Esto no es necesario ya que lo que escribamos aqu se ejecutar cuando suceda el evento click del botn, as que solamente escribiremos lo que deseamos hacer cuando el botn se pulse. Deseamos que aparezca un mensaje, una funcin para mostrar mensajes es ShowMessage. Luego veremos que existen otras ms complejas que nos brindan mayores opciones, ShowMessage es la ms simple de todas, lo que hace es mostrar un mensaje en un cuadro de dialogo (sin ningn icono) y un botn de Ok que cierra el cuadro de dialogo. Escribiremos entonces entre las llaves: ShowMessage("Felicitaciones, ha realizado su primer programa"); De esta manera el programa completo debera haber quedado:
//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage("Felicitaciones, ha realizado su primer programa"); }

Recuerda, la primer parte del cdigo, est generada por el compilador y no ser necesario (ni recomendable) cambiarla. Solo nos interesa lo que ponemos dentro de las cpsulas de los eventos, en nuestro caso: ShowMessage("Felicitaciones, ha realizado su primer programa"); Compila el programa y prubalo.

Analicemos ahora la primer funcin que has aprendido, la funcin ShowMessage, seguramente intuirs que esta funcin, pide como parmetro de entrada un string, y no devuelve nada. En realidad no pide un string, sino un nuevo tipo de dato llamado AnsiString, que por el momento te dir que es un string mejorado, luego aprenderemos ms sobre los AnsiString. Lo que est escrito entre las llaves del evento OnClick es algo parecido a una funciones, es importante que sepas que las variables que declares en este punto se crearan al sealarse el evento y se destruyen al llegar a la llave de cierre. Son variables locales de esta cpsula. Con este programa sencillo podremos analizar algunas caractersticas de los objetos.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 80

Dentro de la programacin orientada a objetos, uno de los conceptos principales es el concepto de herencia. Pongamos un ejemplo de la vida real. Supongamos que definimos el conjunto vehculos terrestres. Los vehculos tendrn la propiedad Cantidad de Ruedas, que ser de tipo entero (2 ruedas, 4 ruedas, etc.) . Luego podramos decir que dentro de los vehculos terrestres definimos el conjunto de motos y de automviles. El conjunto de automviles tendr la propiedad Cantidad de Puertas (2, 4, 5). Es evidente que el conjunto de motos no tendr esa propiedad, pero sin embargo, entre las motos y los autos habr muchas propiedades en comn (potencia del motor, velocidad mxima, etc.) En programacin sucede lo mismo, lo cual significa que los objetos tendrn muchas propiedades en comn (por suerte) con lo cual aprenderemos para que sirven algunas propiedades genricas y luego veremos algunas propiedades que son nicas de un determinado objeto. Por ejemplo, todos los objetos visuales derivan de una clase genrica llamada Trect (Rectngulo). Esto significa que todos los objetos visuales tendrn la propiedad Top (distancia a la parte superior de la ventana medida en pixeles) Left (distancia a la parte izquierda de la ventana medida en pixeles) Height (altura del objeto medida en pixeles) y Width (ancho del objeto medido en pixeles). Veamos en el inspector de objetos algunas propiedades comunes a los objetos visuales, puedes analizar entonces tanto las de la ventana (Form1) como las del botn (Button1). Las propiedades aparecen en el inspector de objetos en orden alfabtico: Propiedades de los objetos visuales: Caption: Es una propiedad de tipo AnsiString, es el ttulo del objeto, en el caso de la ventana, el titulo que aparece arriba, en el caso del botn, el texto que aparece dentro del mismo. El Caption de un objeto es informativo para el usuario, debe ser claro, puede contener nmeros, espacios, smbolos, etc. Caption inclusive podra estar vaca. Muchos objetos pueden tener el mismo Caption (en una aplicacin hay muchos botones que dicen Aceptar). Si deseamos que un objeto (por ejemplo un botn) tenga una tecla rpida, antepondremos un & a esa letra, por ejemplo si tenemos un botn que dice Aceptar y otro que dice Archivo, y los Caption de ellos son respectivamente &Aceptar, y A&rchivo entonces veremos Subrayada la letra A en Aceptar y la letra r en Archivo. Pulsar la A equivaldr a pulsar Aceptar, pulsar la r equivaldr a pulsar Archivo.

Cursor: Propiedad de tipo Enum Es la forma que toma el puntero del mouse al pasar por encima del objeto. Enabled: Propiedad de tipo booleana, puede valer true o false. Indica si el objeto esta habilitado o no. Un objeto deshabilitado aparece con su texto en relieve, y no es posible clickear sobre el. Font: Es una propiedad de tipo Tfont (una clase que guarda la fuente, el tamao, y el estilo). Indica que fuente debe utilizarse en el Caption y en el texto (si el objeto lo tuviese). Height: Propiedad de tipo int. Altura del objeto medida en pixeles.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 81

Hint: Propiedad AnsiString, es el mensaje aclaratorio que deseamos que aparezca si el mouse se detiene sobre el objeto. Left: Propiedad de tipo int. Distancia del objeto medida en pixeles al borde izquierdo de la ventana madre. Name: Esta propiedad es muy importante, es el nombre interno del objeto, es decir, el nombre con el cual el programador (es decir nosotros) identificaremos al objeto, no tiene nada que ver con el Caption. Cuando programbamos en modo texto las variables tenan un nombre (A, B, C, CONT, PROM, etc.) sin embargo este nombre no tena ninguna importancia para el usuario. Este es el mismo caso, Name es el nombre del objeto. Dos objetos no pueden tener el mismo nombre. Los nombres pueden contener, letras, nmeros y el smbolo guin bajo _ pero el nombre de un objeto no puede comenzar con un nmero, es decir, un objeto puede llamarse Boton1, pero no puede llamarse 1Boton. Tambin sera un nombre vlido Boton_Aceptar. Los nombres no pueden contener espacios en blanco u otros smbolos que no sean el guin bajo. Cuando el compilador crea un objeto, por defecto le pone el nombre del tipo de objeto seguido de un nmero, por ejemplo si creamos 3 botones se llamarn, Button1, Button2, Button3. Es muy recomendable ponerles un nombre mas especfico que nos de una idea que hace el objeto. Sin embargo es importante que, si pensamos cambiarle el nombre al objeto lo hagamos ni bien lo creamos, ya que si lo cambiamos luego, el programa no actualizar las referencias. Por ejemplo, si nosotros en el programa del ejemplo cambiamos el nombre de Button1 por el de B_Aceptar, el compilador nos dar error, ya que el evento hace referencia a:

..void __fastcall TForm1::Button1Click(TObject *Sender).

Es decir que si cambiamos el nombre de un objeto, deberemos cambiar las referencias a eventos que tienen el nombre anterior. En resumen, cambiemos el nombre del objeto ni bien lo creamos o no lo cambiemos ms. Top: Propiedad de tipo int. Distancia del objeto a la parte superior de a ventana madre. Visible: Propiedad de tipo booleana, puede valer true o false. Indica si el objeto es visible en pantalla o no. Width: Propiedad de tipo int. Ancho del objeto medido en pixeles.

Cuando analicemos nuevos objetos nos centraremos nicamente en las propiedades, mtodos y eventos que revistan mayor inters en ellos. Pero en la mayora de los casos tendrn propiedades comunes a todos ellos (los citados arriba corresponden a los objetos visuales). Objeto Form Es una ventana, nuestro programa deber tener al menos una ventana.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

82

Propiedades: Por el momento las ventanas no tienen propiedades exclusivas que nos interesen (por ahora) Eventos: Podemos tratar diversos eventos en ella (OnClick por ejemplo) los nombres de sus eventos hacen evidentes su llamada. Mtodos: Por el momento el nico mtodo que nos podra interesar es el mtodo Close() que obviamente cierra la ventana (si es la ventana principal cierra la aplicacin)

Objeto Button: Es el botn simple de mandato: Sus propiedades y sus mtodos no presentan mayor importancia, as como sus eventos (Salvo OnClick). Se usa generalmente para realizar una accin cuando sucede el evento OnClick.

Cmo accedemos a las propiedades de un objeto en tipo de ejecucin?

Para acceder a la propiedad de un Objeto debemos primero hacer referencia al objeto (por su nombre) y luego la propiedad, separada del objeto por una flecha, que se escribe con un signo menos - y un signo mayor >. Entonces, si quisisemos cambiar el ancho de Button1 para que valga 150, debemos escribir: Button->Width = 150; Si quisisemos incrementar en 20 el alto de Form1 deberamos escribir:

Form1->Height = Form1->Height + 20;


Atencin con las maysculas y las minsculas, recuerda que Builder es sensible a ellas.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

83

Ya estas en condiciones de realizar algunos ejercicios sencillos.

Ejercicio 1: Realiza una aplicacin con dos botones. Al pulsar el primero mostrar un mensaje de bienvenida. Al pulsar sobre el segundo, borra el ttulo de la ventana.

Ejercicio 2: Realiza una aplicacin con cuatro botones, uno para aumentar el ancho de la ventana, otro para aumentar su altura, otro para disminuir su altura y el ultimo para disminuir su ancho.

Ejercicio 3: Realiza una aplicacin con dos botones. Al pulsar sobre uno de ellos se habilita o deshabilita el otro botn, al pulsar sobre el otro, borrar los ttulos de los dos botones.

Ejercicio 4: Realiza una aplicacin con un botn. Al pulsarlo ocultarlo de la ventana (propiedad Visible) para volver a verlo pulsar sobre la ventana.

Objeto Edit: Veamos un nuevo objeto, el cuadro de edicin simple. Es el objeto que se encuentra en la pestaa Standar y que tiene forma de cuadro con las letras ab dentro de el. Los cuadros de edicin se utilizan generalmente para ingresar una lnea de texto dentro de ellos (Ingresar nombres por ejemplo).

Propiedades: Las propiedades importantes del objeto Edit son: Text: Propiedad de tipo AnsiString, es el contenido del cuadro de edicin, aqu queda guardado el texto que figura en el. Por defecto esta propiedad contiene el nombre del cuadro de edicin (si es el primero Edit1) en general es preferible que esta propiedad arranque vaca. MaxLength: Propiedad de tipo entero. Indica la cantidad mxima de caracteres que se puede ingresar en el. PaswordChar: Propiedad de tipo char. Si deseamos que al ingresar un texto no se vea (por ejemplo para ingresar una clave) y que en su lugar aparezca un carcter determinado (por ejemplo *) colocamos en esta propiedad el carcter que deseamos. Por defecto esta propiedad contiene el carcter nulo, lo que significa que el texto se visualiza normalmente.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

84

ReadOnly: Propiedad de tipo booleana, puede valer verdadero o falso. Indica si el cuadro es o no de solo lectura, en caso de serlo no se podr modificar su texto desde la interfase visual.

Eventos: Uno de los eventos ms utilizados en los Edit es el evento OnChange, que informa cuando el texto del Edit cambie (es decir, cuando se pulsa cualquier tecla que modifique su contenido), recuerda que el texto cambia en forma inmediata, es decir, no es necesario presionar ENTER para que el evento acte.

Antes de realizar ejercicios utilizando cuadros edicin deberemos aclarar que son los famosos AnsiString. Los AnsiString son una clase, es decir, una estructura mejorada, mejorada porque tiene Mtodos propios. Entre otras cosas, los AnsiString toman el tamao necesario para contener el texto (son verdaderamente mas cmodos que los String) tambin tienen mtodos para convertir los AnsiString en los tipos ya conocidos (int, float, string). Adems de mtodos para insertar, borrar, encontrar cadenas dentro de ellos etc. Nosotros veremos solo algunas cualidades de la clase AnsiString. Es importante que comprendas que AnsiString es una clase, esto es un tipo de dato. Nosotros podremos entonces declarar variables de este tipo, lo haremos de la forma habitual, primero el tipo y luego la o las variables. Ejemplo:

AnsiString cadena1, cadena2;

Declaramos dos variables de tipo AnsiString, cadena1 y cadena2. Bien, todo lo que a continuacin veamos sobre AnsiString es aplicable a cualquier dato de este tipo. Por ejemplo la propiedad Caption es AnsiString, por lo que es factible aplicarle cualquier mtodo que describamos a continuacin.

Los AnsiString pueden ser igualados a cualquier tipo, la conversin es automtica. Ejemplo:

AnsiString cadena; int j=10; char k[14]="hola que tal";


EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 85

cadena=j; ShowMessage(cadena); cadena=k; ShowMessage(cadena);

Esto mostrar dos cuadros de dialogo sucesivos, el primero mostrar un numero 10 (lo mostrar como texto, es decir, el carcter 1 y el carcter 0) luego, el segundo mostrar un mensaje que dir hola que tal. Como vers, a una variable AnsiString se le puede asignar una variable o una variable char sin problema, tambin se le pueden asignar variable float, pero en este caso habr que especificar el formato (cantidad de cifras, separador decimal, etc.) Adems se pueden efectuar operaciones de suma ente varios tipos, interpretndolo siempre como una concatenacin de textos. Ejemplo:

AnsiString cadena; int j=15; char k[32]=" aos de servicio en la empresa"; cadena="El seor Juan tiene"; cadena=cadena + j + k; ShowMessage(cadena);

Esto muestra un mensaje que dice El seor Juan tiene 15 aos de servicio en la empresa Como vemos a cadena se le asigna la suma de un AnsiString, un int y un string. La suma, fue interpretada como una concatenacin de texto. Importante: Por el modo en que se realiza la conversacin es imprescindible que el primer sumando sea de tipo AnsiString.

Los AnsiString pueden ser comparados unos con otros utilizndose en este caso el orden alfabtico (como la hacamos con los string de Pascal) Ahora veremos algunos mtodos de la clase AnsiString. Los mtodos se separan de la clase por un punto.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

86

LowerCase: No tiene parmetros de entrada, devuelve un AnsiString, que es el AnsiString propietario convertido a minscula.

Ej: Form1->Caption= Form1->Caption.LowerCase();

UpperCase: dem LowerCase pero convierte a mayscula.

Length: No tiene parmetros de entrada, devuelve un entero, el tamao del AnsiString.

Ej:

int j; j=Edit1->Text.Length();

j tomar el valor correspondiente a la cantidad de caracteres que tenga Edit1->Text. ToIntDef: Pide un entero, y devuelve un entero. ToIntDef convierte un AnsiString en entero, (es el valor que devuelve), en caso que el AnsiString no contenga un entero, entonces devuelve el valor pasado como parmetro.

Ej:

int j; j=Edit1->Text.ToIntDef(-3);

Si Edit1->Text no contiene un entero (es decir, cualquier cosa que no sea un nmero) entonces j tomar el valor 3.

Ejercicio 5: Realiza una aplicacin con un botn y un Edit, al pulsar el botn, mostrar con ShowMessage el contenido del Edit.

Ejercicio 6: Realiza una aplicacin con un botn, al pulsarlo mostrar un mensaje que indique cuanta veces se puls el botn (necesitars una variable global de tipo int).

Ejercicio 7: Realiza una aplicacin con dos edit y un botn. Un Edit para ingresar nombre y el otro para ingresar edad. Al pulsar el botn, mostrar un mensaje que diga por ejemplo: El seor Juan Perez es mayor de edad con 24 aos. O bien Juan Perez tiene 15 aos y le faltan 3 para ser mayor de edad. En caso de no haber ingresado un entero en la edad mostrar un mensaje de error.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 87

Ejercicio 8: Idem al anterior pero si la edad no es un entero valido (positivo) y si el nombre esta vaco mantener el botn deshabilitado.

Ejercicio 9: Realiza una aplicacin con un Edit y un botn, en el Edit se debe ingresar un nmero entre 1 y 10 (caso contrario el botn permanece deshabilitado). Al presionar el botn mostrar tantos mensajes como diga el Edit: Mensaje N 1, Mensaje N 2, etc.

Ejercicio 10: Realiza una aplicacin con un Edit y un botn. Mientras el Edit este vaco, mantener el botn deshabilitado. Al pulsar el botn, cambiar el ttulo de la ventana con el contenido del Edit.

Ejercicio 11: Utilizando un Edit y un botn, realiza el juego del ahorcado, (el algoritmo es casi el mismo que usaste en programacin en modo texto con algunas modificaciones).

Es probable que para la realizacin de estos ejercicios te resulte conveniente utilizar el objeto Label.

Objeto Label: Label es simplemente una etiqueta, sus propiedades de inters son Caption (lo que dice la etiqueta) y Font (fuente de la etiqueta). Es factible tratar eventos sobre la etiqueta (OnClick por ejemplo) aunque en la prctica el objeto Label se usa como una etiqueta puramente aclaratoria.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

88

Objeto Memo, archivos de texto


Veremos continuacin el objeto Memo. Antes aclararemos algunos puntos. Los objetos son clases (que como lo habamos mencionado, son estructuras mejoradas con mtodos y eventos). Las propiedades de los objetos pueden ser clases que tienen mtodos y eventos propios. Esto que en principio puede parecernos complicado, en realidad facilita muchsimo las cosas. Por ejemplo, muchos objetos visuales tienen la propiedad Color. La propiedad color es una clase (class) llamada TColor, la clase TColor tiene a su vez sus propiedades, pero lo importante, es que una vez que conocemos las propiedades de TColor, las podremos aplicar a cualquier objeto que tenga la propiedad Color, es mas, podremos hacer que un objeto tome el color de otro con una simple igualacin, pues las propiedades Color de ambos objetos son del mismo tipo (TColor). Para facilitar las cosas los tipos de clase estn dados anteponiendo una T mayscula al nombre del objeto definido (los Button son de la clase TButton, los Form son de la clase TForm, etc.)

Objeto Memo: Es un objeto que tiene la capacidad de contener texto plano (esto es sin formato, es decir, sin cambios en la fuentes, colores etc. Contiene solamente texto, cambios de lnea y tabulaciones. Para que te ubiques, el Bloc de Notas tiene un objeto Memo que ocupa toda la ventana principal. (No lo confundas con el WordPad, que puede contener distintos tipos de fuentes). El objeto Memo se encuentra en la pestaa Standar y tiene forma de hoja. Sus propiedades importantes son:

Color: de tipo TColor (comn a muchos objetos visuales) hace referencia al color del fondo memo. Font: Se refiere a la fuente con la cual visualizaremos el texto. Si bien el texto no contiene informacin acerca de fuentes y colores, todos los textos de Windows utilizan una determinada fuente. Esa fuente la especificamos con esta propiedad, pero el texto no guardara informacin sobre la fuente usada, se trata simplemente de la fuente con la cual deseamos ver el texto en este momento. ScrollBars: de tipo Enum, se refiere a si el objeto tendr o no barras de desplazamiento en sus bordes, puede tomar los siguientes valores: ssNone : ninguna barra de desplazamiento ssHorizontal: barra de desplazamiento horizontal ssVertical: barra de desplazamiento vertical ssBoth: ambas barras de desplazamiento. Lines: de tipo TString, esto es una lista AnsiString. Es la propiedad que ms nos interesa, ya que es la propiedad donde esta guardado el texto del Memo. TString es una clase, y es como se dijo una lista de AnsiString, a continuacin te dar algunas propiedades y mtodos de la clase TString, que ser aplicable a todos los objetos de tipo TString (en particular a la propieEDI Laboratiorio Programacin C++ Prof. Abdala Pablo 89

dad Lines de los Memos)

La Clase TString: Propiedades:

Count: Indica la cantidad de AnsiString que contiene el objeto TString Strings[int indice]: es una propiedad de tipo AnsiString, y se refiere al AnsiString que esta en la posicin dada por el indice. Por ejemplo:

AnsiString aux; aux = Memo1->Lines->Strings[3];

este pequeo cdigo copia el tercer rengln del memo en la variable aux (nota que el indice en este caso arranca de 1) Mtodos:

Append (AnsiString S): Agrega el AnsiString S al final de la lista. Clear(): Borra toda la lista. Delete(int indice): borra el rengln dado por ndice (todo el texto se desplaza hacia arriba). Insert(int indice, AnsiString S) Inserta el AnsiString S en el rengln indice. Move(int actual, int nuevo): mueve el renglon actual al renglon nuevo. LoadFromFile(AnsiString nombre_archivo): Carga un texto desde archivo dado por nombre_archivo SaveToFile(AnsiString nombre_archivo): Graba el bre_archivo. texto a un archivo dado por nom-

Con todo esto ya estamos en condiciones de realizar algunos programas: Ejercicios: Ejercicio 1: Realiza un programa que permita cargar y guardar un texto. Puedes especificar el
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 90

nombre del archivo en un Edit.

Ejercicio 2: Idem anterior pero con botones para borrar el contenido del memo, y para informar mediante un mensaje la cantidad de renglones que contiene el Memo. Ejercicio 3: Idem anterior pero con un botn que nos permita contar la cantidad de veces que aparece una letra determinada (ingresada en un cuadro de edicin). Ejercicio 4: Modifica el programa del ahorcado para que en lugar de ingresar la palabra clave, la mquina la elija al azar desde un archivo de texto que contiene una lista de ttulos de pelculas (el archivo te lo proporcionar el profesor). Puedes utilizar el objeto Shape (formas) manejando su propiedad visible. Antes de terminar este captulo veremos algunos componentes ms cuya implementacin es muy sencilla.

Objeto CheckBox: Es una casilla de verificacin, que puede estar marcada o no. Se suele utilizar para manejar variables booleanas. Su propiedad ms importante es la propiedad Checked, que puede tomar los valores true o false, de acuerdo a si la casilla esta marcada o no.

Objeto RadioGroup: Es un conjunto de casillas circulares. Se suele utilizar cuando debo elegir entre una de varias opciones, es decir, cuando marco una casilla circular, automticamente se libera la casilla que estaba marcada anteriormente. Se puede configurar para que permita seleccin multiple, pero para este caso es preferible utilizar varias checkbox. Sus propiedades importantes son:

Items: Es una propiedad de tipo Tstrings, donde cada AnsiString representa una opcin. Es factible entonces modificar los items en tiempo de ejecucin. Esto en general no se utiliza, sino que se asignan las opciones en tiempo de edicin. ItemIndex: Es una propiedad de tipo int, donde se representa el nmero de item que est seleccionado (0 es el primero) para que no haya ningn item selecionado, ItemIndex debe valer 1.

Ejercicio 6: Realiza un programa con un memo que me permita abrir y guardar texto. Debe haber una casilla de verificacin,que me permita poner visible o invisible el memo. Ademas debe haber un radio group con las opcioes:
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 91

Las cuales

Sin barra de deplazamiento. Solo barra horizontal Solo barra vertical Ambas barras colocan las ScrollBar correspondientes en el memo.

Cuadros de dialogo y objetos no visuales


Como te habrs dado cuenta, ingresar los nombres de los archivos mediante cuadros de edicin es muy incmodo y adems da lugar a errores de tipo. Para acceder a los archivos podemos utilizar una herramienta especfica para tal fin.

Cuadros de Dialogo: Pensemos en cualquier programa de Windows que acceda a archivos (Word, Excel, Corel Draw, etc.) Al querer acceder a los archivos se abre una ventana que nos permite movernos por el rbol de directorio, ver los archivos como lista, etc. Esta ventana es un cuadro de dialogo. Un cuadro de dialogo es una ventana que no puede ser redimencionada y puede ser tan compleja como queramos. De hecho, la ventana que aparece con ShowMessage es un cuadro de dialogo con un botn. Ahora bien, existen cuadros de dialogo predefinidos por Windows, por ejemplo, el cuadro de dialogo de abrir archivos es propio de Windows y es llamado por los programas. Nosotros podremos entonces pedirle a Windows que muestre alguno de sus cuadros de Dialogo predefinidos. Para ellos deberemos colocar el objeto cuadro de dialogo que necesitemos. Estos objetos estn en la ventana Dialogs. Aqu se incorpora un concepto nuevo, los objetos no visuales. Es decir, cumplen una determinada funcin pero no son visibles para el usuario. Los cuadros de dialogo son objetos no visuales, al ponerlos en nuestro proyecto se vern como un icono, pero ese icono no aparecer en nuestra aplicacin, por lo tanto no es importante el lugar donde pongamos ese icono, es conveniente ponerlo en un lugar visible (para poder acceder a sus propiedades) pero que no nos moleste mientras estamos en editando.

Objeto OpenDialog: Dentro de la pestaa Dialogs, es el objeto que tiene forma de carpeta. Su funcin es obtener el nombre de un archivo. Como todos los cuadros de dialogo es un objeto no visual. Mtodos: Execute(): es un mtodo que no pide ningn parmetro y devuelve un valor booleano. Es el mtodo ms importante del OpenDialog. Lo que hace es justamente mostrar (ejecutar) el cuadro de dialogo. All podremos entonces seleccionar cualquier archivo de nuestro sistema, nos permitir cambiar de carpeta, de unidades, crear una nueva carpeta, etc. Hay dos maneras de cerrar el cuadro de dialogo, seleccionando un archivo, o cancelando la operacin (ya sea con Cancelar o con el botn de cerrar la ventana). Si seleccionamos un archivo Execute() devolver TRUE, si cancelamos la operacin Execute devolver FALSE.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 92

Es importante que tengas en claro que el objeto OpenDialog no abre un archivo, lo nico que hace actualizar la propiedad FileName con el nombre del archivo seleccionado, o sea que la operacin de apertura de archivo corre cuenta del programador. Recuerda OpenDialog no abre un archivo, sino que nos permite seleccionar uno cmodamente. El mtodo Execute() deber ser llamado por el evento que corresponda cuando desees abrir un archivo (por ejemplo un botn de abrir).

Propiedades:

FileName: Propiedad de tipo AnsiString. Esta es la propiedad que contiene el nombre del archivo que se seleccion con el mtodo Execute(); y es la propiedad que nos interesar a la hora de abrir el archivo. Si el mtodo Execute() se cancelo (devolvi FALSE) esta propiedad no vara, por lo tanto contendr el mismo valor que antes. Debes tener cuidado de evaluar si el evento Execute() devuelve verdadero o falso para evitar errores. Ej:

void __fastcall TForm1::Button1Click(TObject *Sender) { if (OpenDialog1->Execute()) Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } Este cdigo carga el texto de un archivo en un Memo.

Title: Propiedad de tipo AnsiString. Aqu colocamos el ttulo que deseamos que tenga el cuadro de edicin. Si no se especifica nada, el ttulo ser Abrir. Filter: La propiedad filter permite visualizar determinados tipos de archivos (solo *.txt, solo *.pas. etc.) Haciendo doble click sobre la propiedad filter (Inspector de Objetos) se abre el filter editor, que nos presenta una tabla con dos columnas. En la columna de la derecha colocamos el nombre del filtro (que deseamos que aparezca en el cuadro de dialogo), en la columna de la izquierda, el filtro en s. Ej: Filter Name Archivos de texto Filter *.txt
93

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

Archivos de C Todos los archivos

*.cpp *.*

DefaultExt: Propiedad de tipo AnsiString. Si lo deseamos podemos indicar una extensin que se agrega automticamente si el usuario escribe el nombre de un archivo sin extensin. En general esta propiedad no se utiliza en el OpenDialog.

Objeto SaveDialog: Como se aclar anteriormente, el objeto OpenDialog no abre un archivo sino que nos facilita la obtencin de su nombre. Por lo tanto sera factible utilizar el OpenDialog para obtener el nombre de un archivo que deseamos guardar. Esto (insisto) es totalmente factible, sin embargo, las leyendas el cuadro de OpenDialog, hace referencia a apertura de archivo, con lo cual podra dar lugar a equivocaciones usar este cuadro para guardar. Para guardar entonces se utiliza el cuadro de dialogo SaveDialog, que tiene las mismas propiedades que el anterior, y el evento Execute() que se comporeta de la misma manera. La diferencia es puramente esttica, ya que sus textos hacen referencia a Guardar en lugar de abrir. En este objeto cobra sentido la propiedad DefaultExt, ay que si el usuario no coloca ninguna extensin al archivo, SaveDialog colocar automticamente la extensin que figura en dicha propiedad. Por ejemplo si se trata de un programa que trabaja sobre texto plano sera lgico que su DefaultExt fuese TXT.

Objeto ColorDialog: Al igual que los anteriores es un objeto no visual y se comporta de la misma forma. Se utiliza cada vez que deseamos seleccionar un color. El mtodo Execute se comporta igual que en los cuadros anteriores. Propiedad Color: Es un propiedad de tipo TColor. La clase TColor guarda informacin acerca de un color especfico, nos bastar con saber que podemos igualar dos variables (o propiedades) de tipo TColor. Recuerda que el objeto ColorDialog es un objeto no visual, por lo tanto su propiedad Color no hace referencia al color de dicho objeto, sino al color que fue seleccionado (en caso de que Execute devuelve TRUE)

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

94

Ej: void __fastcall TForm1::Button1Click(TObject *Sender) { if(ColorDialog1->Execute()) Form1->Color=ColorDialog1->Color; }

El pulsar un botn aparece un cuadro de seleccin de color, al elegir uno, la ventana toma dicho color.

Objeto FontDialog: Es prcticamente igual al objeto ColorDialog, solo que en este caso la propiedad que nos interesa es Font, y que al igual que antes, no es la fuente del objeto (pues no es visual) sino la fuente seleccionada.

Ejercicio 1: Modifica los ejercicios 3, 4, 5 y 6 del captulo anterior, reemplazando los cuadros de edicin por OpenDialog y SaveDialog respectivamente.

Ejercicio 2: Realiza un programa que nos permita cargar y guardar un Memo, borrar su contenido, cambiar su fuente y su color. Los cuadros de dialogo no son los nicos objetos no visuales. Por ahora veremos tambin los mens.

Objeto MainMenu: Como se indic antes, es un objeto no visual. Lo encontramos en la pestaa Estndar. El MainMenu es el men principal de la aplicacin. Una ventana solo puede tener un MainMen, sin embargo es factible (aunque improbable) que deseemos cambiar de men en tiempo de ejecucin. Por lo tanto es posible colocar mas de un MainMenu en una aplicacin, aunque solo uno estar activado a la vez. El objeto Form tiene la propiedad Menu, en la cual se especifica cual de todos los MainMenu existentes es el que debe utilizarse. Cuando nosotros creamos el primer MainMenu (y en general el nico) esta propiedad se actualiza automticamente, as que en general no debes preocuparte por todo lo anterior. Para editar el MainMenu, debemos hacer doble click sobre dicho objeto, y veremos una tabla en la que colocaremos las diferentes opciones.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 95

En la primer fila se suelen poner los ttulos (Archivo, Editar, Opciones, Etc.) y a apartir de la segunda fila se colocan los distintos items. Si queremos que aparezca una lnea divisoria, debemos ingresar como Caption el carcter menos -. Si hacemos click derecho sobre un item, podemos (entre otras cosas) agregar en el un submenu, podemos adems guardar y cargar una plantilla (template) con el esqueleto de men que deseemos. Para acceder el evento que se llamar al clickear sobre el item del menu, lo nico que debemos hacer es doble click sobre dicho item. Cada item tiene un nombre, de este modo podemos acceder a las propiedades de cada item (por ejemplo la propiedad Enabled de cada item) Colocar un men a una aplicacin es algo verdaderamente sencillo, irs aprendiendo ms propiedadesy funciones con su uso.

Objeto PopUpMenu: El PopUpMenu es el men emergente, esto es, el men que aparece cuando hacemos click derecho sobre un determinado objeto. La manera de crear un PopUpMenu es idntica a la del MainMenu. Podemos crear tantos PopUpMenu como deseemos, pero recuerda que estos estn vinculados con objetos visuales. Todos los objetos visuales tienen la propiedad PopUpMenu, aqu especificamos que PopUpMenu deseamos relacionar con este objeto. Un mismo PopUpMenu puede estar vinculado a varios objetos visuales.

Ejercicio 3: Realiza un programa que nos permita cargar y guardar un Memo, Nuevo archivo, cambiar su fuente y su color. Todas estas funciones deben ser accesibles desde el men principal, adems las funciones de cambio de color y de fuente debern ser accesibles desde un men emergente relacionado al Memo.

Ejercicio 4: Idem al anterior, pero deben figurar las opciones Abrir, Guardar y Guardar Como. Al Abrir o Guardar Como debe copiarse el nombre del archivo en el ttulo de la ventana. Si el archivo ya tiene un nombre vlido entonces se habilitar la opcin Guardar, la cual no deber preguntar el nombre del archivo. Dicha opcin debe deshabilitarse con Archivo Nuevo.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

96

Cuadros de dilogo personalizados y ventanas mltiples.

Ventanas no modales: En este captulo veremos como realizar nuestros propios cuadros de dialogo, los cuales podrn ser tan complejos como queramos, ya que de hecho, un cuadro de dialogo es una ventana que no puede ser redimensionada. El proceso es sencillo, pero requiere ser metdico a la hora de guardar nuestro proyecto.

Ejemplo 1: Para el ejemplo crearemos una ventana principal con un botn, luego, en el men iremos a File->New Form. De esta manera se crea una segunda ventana llamada (en principio) Form2. Para no confundir esta ventana como la primera, le cambiaremos el color desde las propiedades (rojo por ejemplo) y le agregaremos dos botones, uno que diga Si, y otro que diga No. Es importante que grabes tu proyecto en una carpeta como se explic en el capitulo 1. Si no cambias los nombres de los archivos (si los cambias no habr ningn problema), la ventana 1 estara guardada como Unit1.cpp con su correspondiente Unit1.h, y la ventana2 estara guardada como Unit2.cpp con su correspondiente Unit2.h, El proyecto, al ser compilado arrancar con el Form1, el cual es independiente del Form2, y ademas desconoce la existencia de Form2, es por eso que necesitamos que Form1 se entere de que Form2 existe para llamarlo. Para eso iremos al cdigo de Form1 (Unit1.cpp) y veremos que en el principio, dentro de los include figura: #include "Unit1.h" Aqu se incluye la declaracin de los objetos y los mtodos del Form1. Lo que haremos ser agregar a continuacin la declaracin de los objetos y los mtodos del Form2, es decir agregaremos a continuacion: #include "Unit2.h" Con lo cual Form1 conocer la existencia de Form2. Ahora haremos que al pulsar el botn del Form1 aparezcar el Form2. Para ello utilizaremos un mtodo que posee el objeto Form, el mtodo es Show() que como podrs darte cuenta lo que hace es justamente mostrar un Form. El cdigo entonces quedar:
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 97

//----------------------------------------------------------#include <vcl\vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //----------------------------------------------------------#pragma resource "*.dfm" TForm1 *Form1; //---------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //----------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { Form2->Show(); } Si pruebas de compilar esta aplicacin vers que entonces ambas ventanas son accesibles, cada ventana tendr entonces sus objetos y sus mtodos en forma independiente. Este tipo de aplicacin se llama aplicacin SDI, donde puede haber varias ventanas, y donde podemos cambiar el foco de ventana en ventana en ventana. Mas all de los nombres que tengan los objetos (si no has cambiado los nombres, cada ventana tendr un botn llamado Button1), debes saber que cada objeto es propio de cada ventana.

Ejemplo 2: Para aclararlo, agrega un segundo botn en el Form1, y cuando lo pulse agrega el siguiente cdigo:

Button2->Left++;

Lo que suceder ahora es que cada vez que pulses este botn, el mismo se desplazar a la derecha. Pero si Form2 tiene un botn que tambin se llama Button2, cmo sabe Builder a cual de los dos nos referimos? En realidad, el hecho de que los dos botones se llamen igual es pura coincidencia. Form1 no puede hacer referencia (en forma directa) a los objetos de Form2. Prueba de cambiar el nombre del Button2 del Form2, colcale como nombre SegundoBoton.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 98

Y ahora modifica el evento del Button2 del Form1 de la siguiente manera:

SegundoBoton->Left++;

Supuestamente debera desplazarse el botn del Form2, sin embargo al compilar notamos que el compilador nos da un error

[C++ Error] Unit1.cpp(21): E2451 Undefined symbol 'SegundoBoton'

Lo que sucede es que Form1 no conoce a SegundoBoton, porque este objeto es propio de Form2, para ello deberemos modificar nuestro cdigo de la siguiente manera: Form2->SegundoBoton->Left++;

De esta manera podemos hacer accesibles los objetos de un Form desde otro Form. Cabe aclarar que por ahora los objetos de Form2 son accesibles desde Form1, pero no a la inversa, para lograr eso, en Unit2.cpp deberamos incluir la declaracin de los objetos de Form1, es decir:

#include "Unit1.h"

Cabe aclarar que los Objetos del Form2 son persistentes aunque la ventana se cierre, es decir, cerrar la ventana equivale a ocultarla, no a destruirla. Form1 sigue siendo la ventana principal de la aplicacin, si se cierra la Form1, la aplicacin se cierra, y Form2 se cierra con ella.

Ejercicio 1: Crea una aplicacin con dos ventanas, una roja y la otra azul, ambas ventanas tienen un botn y un Edit. Al comenzar la aplicacin deben estar ambas ventanas abiertas (utiliza el evento OnActivate de la ventana 1) . Al pulsar sobre el botn de la ventana 1, la ventana 2 tomar por ttulo el contenido del Edit de la ventana 1 y viceversa.

Ejercicio 2: Modifica el ejercicio 4 del captulo 4 de manera que el Memo este solo en una ventana diferente a la principal (para que el Memo ocupe toda la ventana dale a la propiedad Align el valor alClient).
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 99

La diferencia entre ventanas y cuadros de dialogo es, como se ha dicho, que los cuadros de dialogo no pueden ser redimensionados, para ello lo nico que hay que cambiar es la propiedad BorderStyle del Form2, y cambiarla de bsSizeable a bsDialog. De esta manera la ventana ser un cuadro de dialogo. Prueba de modificar los ejercicios anteriores utilizando esta nueva propiedad.

Ventanas Modales: Hay una gran diferencia entre ventanas (o cuadros de dialogo) modales y no modales. La aplicacin anterior tena la particularidad de que nosotros podamos cambiar el foco de una ventana a la otra, es decir, podamos trabajar en una ventana o en otra indistintamente. Esto no siempre es as. Por ejemplo el cuadro de dialogo de ShowMessage toma el control de la aplicacin, es decir, la aplicacin pasa su atencin a este cuadro de dialogo, el cual debemos cerrar para volver a tener el foco en la ventana principal (ya sea aceptando o cerrando el cuadro de dialogo). Lo mismo sucede con el cuadro de dialogo propio de OpenDialog. Este cuadro espera una respuesta (por seleccin o por Cancel) pero nosotros no podemos volver a nuestra aplicacin sin dar una respuesta a este cuadro de dialogo. Este tipo de cuadros (o ventanas) son Modales. Un ejemplo de cuadro de dialogo no modal se el que aparece con la opcin de hallar y reemplazar (en Word por ejemplo). En este caso si se nos permite cambiar el foco del Word al cuadro de dialogo sin necesidad de cerrarlo. Este es un ejemplo de cuadro de dialogo no modal. Las diferencias entre las ventanas o los cuadros de dialogo modales y no modales seran entonces:

No modales: Pueden coexistir con la ventana principal, y podemos cambiar de uno a otro cuando queramos. Modales: La aplicacin pasa su atencin a el, y no recupero el control de la aplicacin hasta darle una respuesta (o cerrarlo).

Desde el punto de vista de la construccin de una ventana modal, los pasos a seguir son exactamente los mismos con una salvedad, en lugar de mostrarlos son el evento Show() los mostraremos con el evento ShowModal() que es propio del objeto Form.

Ejemplo 3:
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 100

Sigue los pasos del ejemplo 1 pero en el evento del Button1 del Form1 en lugar de Form2->Show(); Coloca Form2->ShowModal();

Prueba la aplicacin y vers que efectivamente no se puede pasar del Form2 al Form1 sin cerrar primero el Form2. Ahora bien, los botones que dicen Si y No son muy sugerentes, supuestamente deberan dar una respuesta. La idea de los cuadros de dialogo modales suelen ser dar un respuesta, recuerda los cuadros con los botones Si / No, Aceptar / Cancelar, Reintentar / Cancelar, etc. Aqu veremos una diferencia importante en los mtodos Show() y ShowModal(). Show es un mtodo declarado como: void Show (void);

Es decir, no pide ni devuelve nada, simplemente muestra la ventana. ShowModal en cambio esta declarado como:

int ShowModal (void);

Es decir, ShowModal devuelve un valor entero, que es el que debemos evaluar para saber que botn a pulsado el usuario. Cmo hacemos entonces para que la ventana modal devuelva un valor como respuesta? El proceso es muy sencillo. Los botones tienen (y siempre la tuvieron) una propiedad llamada ModalResult, que es una propiedad de tipo int. Al poner algo en esa propiedad, ese botn automticamente se convierte en un botn que dar una respuesta a la ventana principal (devolviendo el valor especificado) y cerrar la ventana modal. Si observamos los valores que puede tomar la propiedad ModalResult veremos que son:

MrOk MrCancel MrAbort MrRetry MrIgnore MrYes


101

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

MrNo MrAll MrNoToAll MrYesToAll Pero si ModalResult es una propiedad de tipo int, cmo es posible que tome esos valores?. La respuesta es que todos los valores mencionados anteriormente son constantes que toman los valores del 1 al 10 respectivamente. Si quisisemos dar otro valor entero diferente se puede asignar cualquier otro valor entero a ModalResult. Es nuestra responsabilidad evaluar el valor de ShowModal.

Ejemplo 4:

Modifica el ejemplo anterior poniendo a los botones si y no del Form2 los ModalResul MrYes y MrNo respectivamente. En el evento OnCLick del Button1 del Form1 coloca lo siguiente:

void __fastcall TForm1::Button1Click(TObject *Sender) { int r; r=Form2->ShowModal(); ShowMessage(r); }

Prueba la aplicacin y explica lo que sucede.

Ejemplo 4: En el Form1 cambia el Caption del Button1 y coloca Cerrar En el Form2 agrega un Label con letras grandes que diga: Seguro desea cerrar la aplicacin? En el evento OnClick del Button1 (cerrar) coloca:

void __fastcall TForm1::Button1Click(TObject *Sender) { int r; r=Form2->ShowModal(); if(r==6) Form1->Close(); }


EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 102

Prueba la aplicacin y explica que sucede.

Ejercicio 3: Modifica el ejercicio 2 de modo que al seleccionar Archivo Nuevo aparezca un cuadro de Dialogo Modal de confirmacin (Esta seguro? Si o No).

Ejercicio 4: Modifica el ejercicio anterior para que pida una confirmacin cuando seleccionamos cerrar la ventana (consultar al profesor el evento OnCloseQuery).

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 1998-2004 2005:2012 :3150 :3000 :2800 :2001 :2000

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

3.- Dados tres nmeros hallar el mayor. 4.- Calcular la suma de los N primeros nmeros naturales. 5.- Dado un nmero entero decir si: a) es par o impar;
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 103

b) es mayor, menor o igual a cero. 6.- Dado un mes escribir la cantidad de das de dicho mes. 7.- Escribir las tablas de multiplicar del nmero 1 al nmero 9 de los primeros 15 nmeros. 8 Una empresa fabrica tapas de material laminado en 3 formatos: redondo, cuadrado o rectangular. Cobra $18 el metro cuadrado y si la tapa es redonda, le suma $4 ms al total. Se pide: a) Ingresar el cdigo de forma: 1-redonda, 2- cuadrada, 3- rectangular b) Ingresar la longitud en metros: si es cuadrada, se ingresa un solo valor y si es redonda, corresponde al radio del crculo c) Informar el costo total de la tapa 9.- Se ingresan pares de valores decimales y se debe informar el promedio de cada par. El ingreso de datos finaliza cuando el operador responde NO a la siguiente pregunta: Desea calcular el promedio? (SI / NO)? 10.- En una empresa el sueldo se calcula adicionando al bsico 50% del mismo, en caso en que la antigedad sea superior a los 10 aos. Disear un programa que lea el nombre del empleado, el sueldo bsico y la antigedad y escriba el nombre y el sueldo a cobrar. 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
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 104

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. 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 4801- 6000 6001 6600 Mas de 6600 20% 10% 5% 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) int x = 2, y = 6, z = 4; y = y+4*z; y +=x; cout<<y; b) int x = 2, y = 6, z = 4; if(x>y || x<z) cout<<"verdadero" ; else cout<<"falso"; c) int x = 2, y = 6; if(x<y && x==y) cout<<"verdadero"; else cout<<"falso"; d) int i=4, x=5; for(i=0; i<10; i++) { if(i<x) cout<<i; else cout<<i-x; }
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 105

21.- 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

Trabajo Practico Funciones


1. Escribir un programa que lea una cadena de caracteres y la visualice en un cuadro ********** *Algoritmos* ********** 2. Escribir un programa que lea una frase, sustituir todas las secuencias de dos o varios blancos por un solo blanco y visualizar la frase obtenida. 3. Escribir un programa que lea una frase y a continuacin visualice cada palabra de la frase en una columna, seguido del nmero de letras que componen la frase. 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()); }
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 106

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)); } d) int mi_funcion(int x) { return x*x; } int main(void){ int x=3; mi_funcion(x); cout<<La function devuelde << mi_funcion(x)); cout<<La variable vale x vale<< x; } e) int mi_funcion(int x) { x=x*5; return x; } int main( ){ int x=3; mi_funcion(x); cout<< function devuelve << mi_funcion(x)); cout<<La variable vale x vale<< x; }

Gua de trabajos Prcticos. Vectores y Matrices


EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 107

1) Leer un vector llamado Z de N elementos. A partir de su lectura calcular: a) Generar un vector llamado POSITIVO con la cantidad y el promedio de elementos positivos. b) Generar un vector llamado NEGATIVO con la cantidad y el promedio de elementos negativos. c) Generar un vector llamado ZERO con la cantidad y el promedio de elementos igual a 0. 2) Una compaa almacena la informacin relacionada a sus proveedores en los arreglos: - P(N) arreglo de proveedores, donde cada P(I) es el nombre del proveedor ordenado alfabticamente - C(N) arreglo de ciudad, donde cada C(I) es el nombre de la ciudad en la que reside el proveedor P(I) - A(N) arreglo de artculos, donde cada A(I) es el nmero de artculos diferentes del proveedor P(I) Realice un programa en C++ que pueda llevar a cabo las siguientes transacciones: 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:
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 108

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 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 6

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.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 109

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:

Entrada
1 1 1 1 2 1 1 3 2 1 3 1 3 5 5 3 3 3 3 5

Salida
1 3 5 2 8 7 3 2

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

Trabajo Prctico Recursividad.


1.- Disear un programa que posea una funcin recursiva que permita multiplicar dos nmeros enteros M y N. Acumulando su contenido hasta que uno de los dos llegue a 0. 2.- Disear un programa que dado un numero decimal lo transforme a uno binario y a otro Hexadecimal. 3.- Escribir las funciones, una recursiva y otra no recursiva, tal que dado el entero positivo X devuelva true(verdadero) si y solo si X es potencia de 2. 4.- Escribir un programa que utilice una funcin recursiva EscribeBlancos(n) que imprima n caracteres blancos consecutivos.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

110

5.- Disear un algoritmo recursivo que imprima los dgitos de un nmero decimal en orden inverso. 6.- Escribe una funcin recursiva que devuelva la suma de los valores almacenados en un array de enteros. 7.- Escribe un programa recursivo que calcule la suma de los primeros N nmeros pares naturales. 8.- Implemente un programa que utilice una funcin recursiva que imprima por pantalla los valores desde 1 hasta el nmero introducido desde teclado por el usuario. 9.- Dado un vector de n nmeros enteros, disear un algoritmo recursivo que dado el vector devuelva: La posicin del ltimo nmero par que aparece en el vector El valor 0 si ningn elemento del vector es par 10.- Disee una funcin recursiva que devuelva cierto si una palabra es palndroma o falso en caso contrario. Decimos que una palabra es palndroma si se lee igual de derecha a izquierda que de izquierda a derecha.

Trabajo Prctico archivos


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

Trabajo Prctico Punteros


Ejercicio 1: Punteros Qu imprime?. a) int *punt; int x=7; int y=5; punt=&x; *punt=4; Cout<<x<<endl<<y; // qu imprime este cout? b) int *punt; int x=7;
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 111

int y=5; punt=&x; x=4; Cout<<*punt<<endl<<y; // qu imprime este cout? c) int *punt; int x=7; int y=5; punt=&x; x=4; punt=&y; Cout<<*punt<<endl<<x; // qu imprime este cout? 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;
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 112

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}; 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--;
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 113

*(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 ; 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? } )
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 114

void datos(int *x, float *y, char *c) { Cout<< x<</<< y<</<<c<<; // qu imprime este cout? *x=8; *y=4.2; *c=g; } int main(){ int x=9; float y=44.6; char c=a; datos (&x, &y, &c); Cout<< x<</<< y<</<<c<<; // qu imprime este cout? } o) void datos(int x, float y, char c) { Cout<< x<</<< y<</<<c<<; // qu imprime este cout? x=8; y=4.2; c=g; } int main( ){ int x=9; float y=44.6; char c=a; datos (x, y, c); Cout<< x<</<< y<</<<c<<; // qu imprime este cout? } p) int datos(int x, float y, char c) { Cout<< x<</<< y<</<<c<<; // qu imprime este cout? x=8; y=4.2; c=g; return x; } int main( ){ int x=9; float y=44.6; char c=a; x=datos (x, y, c); Cout<< x<</<< y<</<<c<<; // qu imprime este cout? } q) char datos(int *x, float *y, char *c) {
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 115

Cout<< x<</<< y<</<<c<<; // qu imprime este cout? *x=8; *y=4.2; *c=g; return h ; } int main( ){ int x=9; float y=44.6; char c=a; c=datos (&x, &y, &c); Cout<< x<</<< y<</<<c<<; // qu imprime este cout? } r) #include <stdio.h> void vector (float * vp[], float v[], int lon); void main(){ float v[5]={1,2,3,4,5}; float * vp[5]={NULL}; //vector de punteros a float for (int i=0; i<5; i++) { vp[i]=&v[i]; } vector(vp, v, 5); } void vector (float * vp[], float v[], int lon) { for (int i=0; i<lon; i++) { v[i]=*(vp[i]); } } s) #include <iostream.h> #include <stdio.h> void inverso_array (int v[], int inv[], int & lon) { for(int i=0; i<lon ; i++) { *(inv+i)=*(v+(lon-(i+1))); } }
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 116

void main(){ int v[5]={2,3,4,5,6}; int inv[5]={0}; inverso_array(v, inv, 5); for (int i=0; i<5; i++) { cout << *(inv+i) << " "; } } t) #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 <tchar.h> #include <iostream.h> #pragma argsused int I(char *s); int main() { char *s= "Pablo Abdala Achaval"; I(s); cout << s;
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 117

system(pause); return 0; } //----int I(char *s) { char *t= s; while (*t) t++; t--; while(s < t) { char Temp= *s; *s++= *t; *t--= Temp; } }

Ejercicios Backtracking y Archivos


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

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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

118

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

TOM1.RES ERROR E5

En cambio, las entradas siguientes generan resultados correctos: TOM1.DAT 55


EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

TOM1.DAT 75
119

1153 2133 1444

1 2 2 4 6 6

2 1 4 2 1 4

7 2 2 4 6 6

1 2 4 5 2 4

TOM1.RES Tooxo xxxxo xxxxo oooxo ooJoo

TOM1.RES oTooo xxoxo ooooo oxxxx 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
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

2 3 3 3 2 1 1 1 2 3 3 3
120

72 71

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 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 4 1 3 2 4 144 233 323 TOM3.RES 62 82

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":
121

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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 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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

122

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 2 3 4 5 6 7 8 $ $ $ $ $ $ $ $ = = = = = = = = 1 estampilla de 1 $ 2 estampillas de 1 $ 1 estampilla de 3 $ 1 estampilla de 3 $ + 1 estampilla de 1 $ 1 estampilla de 3 $ + 2 estampillas de 1 $ 2 estampillas de 3 $ 2 estampillas de 3 $ + 1 estampilla de 1 $ IMPOSIBLE

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

4. El salto del caballo Se dispone de una superficie rectangular "cuadriculada", es decir, formada por un entramado de posiciones o casillas (como ocurre, por ejemplo, con un tablero de ajedrez). Nos interesa buscar caminos dentro de esta superficie que cumplan ciertas condiciones, teniendo en cuenta que algunas de las casillas no pueden formar parte de dichos caminos (para entendernos, representan obstculos en la superficie).
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 123

Objetivo Dada una superficie rectangular de dimensin n x m, realizar un programa que la recorra partiendo de una casilla inicial y llegando a una casilla final segn las reglas siguientes:

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

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
124

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

54 11 14 VVVNN VNVVV VVVNV VVVVV Ejemplo de salida 1 2 4 5 3 1 2 3 5 3 1 2 4 5 3 1 1 3 4 2 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:
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 125

ANAGRAMA.IN 2 Abc acba

ANAGRA.OUT abc acb bac bca cab cba aabc aacb abac abca acab acba baac 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: Aquellos insectos que tienen 0, 1, 4, 5, 6, 7 u 8 vecinos mueren irremediablemente. 2 Los insectos que tienen 2 o 3 vecinos sobreviven. 3 En cada celda vaca en cuya vecindad hay exactamente tres insectos, nace un nuevo insecto. 4 Los insectos que nacen o mueren no afectan las reglas hasta que se ha completado un ciclo evolutivo, entendiendo por ste un ciclo en el que se ha decidido la supervivencia o muerte de los insectos (vivos al comenzar el ciclo) de acuerdo a las reglas mencionadas. Escribe un programa que simule la evolucin de la poblacin y que determine cmo estar la poblacin despus de L ciclos evolutivos. Los datos de entrada estn en el archivo de texto VIDA.IN, en la primera lnea hay 3 enteros separados por un espacio en blanco N, M y L que representan al nmero de filas, de columnas y de ciclos, respectivamente. Las siguientes N lneas contienen la ubicacin de los insectos representados por un asterisco '*' y por un punto '.' las celdas vacas. Los datos de salida estarn en el fichero de texto VIDA.OUT, en el que habr N lneas con la ubicacin de los insectos tras L ciclos. En cada lnea un '.' representa a una celda vaca y un '*' a un insecto. Ejemplo: VIDA.IN 661 ...... ...**. ..**.. ...*.. ......
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

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


126

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

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

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: 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
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 128

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 1998 2000 1998 2004 1999 2005

SANT.OUT 1 2 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: 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.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

129

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 KUBRIK.OUT 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.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

130

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.

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

131

Luchadores Japoneses

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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

132

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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

133

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
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 134

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

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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

135

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

JUZGADOS Un funcionario de Juzgados tramita expedientes, de forma que siempre va tomando de la bandeja de expedientes a tramitar el que se encuentra ms arriba. Cada expediente se puede caracterizar por un codigo_juzgado, id_receptoria, cartula, la fecha de inicio, la fecha ltimo movimiento, tipo de causas: en movimiento, paralizadas y archivadas. Un ordenanza es el encargado de traerle nuevos expedientes, que va dejando encima de los que ya haba en la bandeja.
EDI Laboratiorio Programacin C++ Prof. Abdala Pablo 136

a) Definir la estructura de datos ms adecuada para representar la bandeja de expedientes y el empleado responsable del expediente. b) Realizar el cdigo en c++ que permita representar el ingreso de expedientes nuevos que trae el ordenanza en la pila de datos, relacionados con el empleado del expediente. c) Como con este sistema es fcil que algn expediente se retrase mucho, de vez en cuando un juez pide que se tramite un determinado expediente urgentemente. Para ello indica el cdigo de dicho expediente. Definir la operacin urgencia, que permitir buscar un determinado expediente en la bandeja y eliminarlo de la pila de expedientes del empleado.

MUDANZA (olimpiadas Mexico)


Una familia va a cambiar de residencia y para ello va a utilizar dos camiones de mudanza. La empresa de mudanzas desea que todas las pertenencias de la familia se repartan equitativamente entre los dos camiones de manera que: ambos transporten el mismo nmero de objetos, y el peso que carga un camin sea lo ms parecido al peso que carga el otro, es decir, la diferencia entre los pesos debe ser la mnima.

Escribir un programa que dada la lista de los pesos de las pertenencias de la familia, determine el peso que cada camin deber llevar para cumplir con los requerimientos de la empresa. Nota: No hay lmite para el peso que pueden cargar los camiones. Entrada La entrada deber realizarse del archivo de texto mudanza.in. La primera lnea contiene el nmero N de pertenencias de la familia (10 N 10000, con N par). Las siguientes N lneas contienen el peso de cada uno de los objetos representado como un entero positivo menor o igual a 60000.

Salida En el archivo de texto mudanza.out deber escribirse el peso que cargar cada uno de los camiones, en cualquier orden, separados por un espacio. Ambos pesos son nmeros enteros.

Ejemplo:
mudanza.in 10 5320 21 34 17 100 286 9870 17605 12 295 mudanza.out 15871 17689

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

137

Examen Diciembre 2012 EDI 1.

Contenidos Asignatura EDI I:


EJES PERODO CONTENIDOS
(36 clases Aprox.)

N1 Introduccin a la Programacin

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

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

138

3 N2

Estructuras de Datos Ciclos Repetitivos N3 Funciones y procedimientos N4 Tratamiento de cadenas de caracteres 5 5

Biblioteca iostream.h 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. (Cin y Cout) Condicionales simples y mltiples. (If) 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 Estructura de datos de arreglo. Manejo de dimensiones de un arreglo. ndices. Tcnicas de ordenamiento (Selection Sort, BubbleSort, Insercin Directa, Mtodo Shell, Heap Sort) Bsqueda secuencial y binaria. Arreglos paralelos. Matrices. Diagonal principal y secundaria Clculo de matrices y vectores Archivos en C++. Abrir cerrar leer y guardar datos en archivos Recursin, concepto. La sucesin de Fibonacci, factorial de un nmero. Torres de Hanoi. Backtraking Introduccin La vuelta del caballo El problema de las ocho reinas El problema de la mochila (seleccin ptima). Ejercicios Olimpiadas Informtica Argentina Resolucin Nivel 2.

N5 Arreglos uni y bidimensionales

N6 Archivos N6 Introduccin a la recursin

3 10

N7 OIA Olimpiadas informatica Argentina

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

139

Contenidos Asignatura EDI II:


EJES PERODO (36 clases Aprox.) IDE INTEGRATED DEVELOPMENT ENVIRONMENT 3 C++ Builder.. (Ventana principal. Diseador de formularios. Editor de cdigo) http://elvex.ugr.es/decsai/builder/intro/2.html - PARTES_IDEBarra de Herramientas, Paleta de Componentes, Diseador de Formularios, Inspector de Objetos, Editor de Cdigo, Administrador de Proyectos Sistema de ayuda. Compilacin, ejecucin y depuracin de programas. Almacenamiento de objetos. CONTENIDOS

MEMORIA DINMICA - PUNTEROS 5

Introduccin al uso de punteros Definicin y declaracin de punteros Generacin y destruccin de variables dinmicas Operaciones bsicas con datos apuntados Operaciones bsicas con punteros El valor nil Aplicaciones no recursivas de los punteros Asignacin de objetos no simples Funciones de resultado no simple

MECANISMOS DE ABSTRACCIN CLASES

Conceptos y clases Los miembros de la clase Control de acceso constructores Miembros estticos. Funciones miembro y funciones auxiliares Sobrecarga de operadores Uso de clases concretas Destructores constructores por defecto. New y delete.

SOBRECARGA DE OPERADORES

Notacin Funciones del operador - operadores binarios y unarios significados predefinidos para operadores - significados definidos por el usuario para los operadores Operadores y espacios de nombres - un tipo complejo - miembros y no miembros operadores - de modo mixto aritmticas - inicializacin - copia Conversiones - literales - Funciones auxiliares - Los operadores de conversin-ambigedad resolucin
140

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

CLASES DERIVASAS

TEMPLATES

PROYECTO FINAL

friend - miembros y amigos - objetos de gran tamao la asignacin e inicializacin - subndices - llamada de funcin - desreferenciacin - incremento y decremento - una clase de string. Conceptos y clases Clases derivados - funciones miembro - Construccin y destruccin jerarquas de clase - Funciones virtuales Clases abstractas - jerarquas tradicionales de la clase clases abstractas como interfaces localizacin de la creacin de objetos las clases abstractas y las jerarquas de clase templates - un String template instanciacin - los parmetros de l template- Tipo de funcin comprobacin de Template Deduccin de parmetros del template la especificacin de parmetros del template sobrecarga de funcin de template La poltica como argumentos del template los parametros por defecto del template. Especializacin - derivacin y plantillas - plantillas miembros - Las conversiones de cdigo organizacin del cdigo Creacion de proyecto final utilizando conocimientos adquiridos durante el ao.

Bibliografa Stroustrup - Bjarne - The C++ Programming Language 3rd Edition- Addison Wesley Stroustrup - Programming - Principles and Practice Using C++ (Pearson, 2009). Herb Schildt C++ - The Complete Reference (3rd Ed). Grady Booch - Object-Oriented Analysis and Design With Applications, 2nd EDITION. Algorithms and Data Structures - Niklaus Wirth 2004. R. Sedgewick. Algorithms in C, C++(Fundamental Algorithms, Data Structures, Sorting, Searching). Addison-Wesley,1990. 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 http://elvex.ugr.es/decsai/builder/ http://courseware.ikor.org/internet Programacin Visual (Prof. Lazurri Guillermo EEST N 5 MdP)

EDI Laboratiorio Programacin C++ Prof. Abdala Pablo

141

Potrebbero piacerti anche