Академический Документы
Профессиональный Документы
Культура Документы
La Programación es el arte de dar soluciones a los problemas para que la computadora pueda ejecutarlas. La
gran parte del esfuerzo en programar es buscar soluciones y refinarlas. 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 prácticos de la programación usando el lenguaje de
programación C++.
¿Por qué C++? No se puede aprender a programar sin un lenguaje de programación, y C++ apoya
directamente los principales conceptos y técnicas que se utilizan en el mundo real del software. C++ es uno
de los lenguajes de programación más ampliamente utilizados. La mayoría de los conceptos de programación
pueden utilizarse directamente en otros lenguajes, como C#, Fortran, PhP y Java. Por último, C++ es
frecuente elegirlo como lenguaje para escribir código elegante y eficiente. La hipótesis 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.
Creador:
Dennis Ritchie (Laboratorios Bell) en 1972, cuando trabajaba junto con Ken Thompson diseño 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 programación creado a mediados de los años 1980 por BJarne Stroustrup.
La intención de su creación fue extender al exitoso lenguaje de programación C con mecanismos que permitan
la manipulación de objetos.
Características:
El “C” es un lenguaje de programación de “alto nivel” (alto nivel quiere decir “próximo al lenguaje humano”),
pero con características de “bajo nivel” (bajo nivel= próximo al lenguaje máquina).
Es de BAJO NIVEL porque permite trabajar con “bits”, registros de la C.P.U. y posiciones de memoria.
El lenguaje „C‟ es poderoso y flexible: la mayor parte del sistema operativo UNIX fue escrito en „C‟.
Incluso están escritos en „C‟ los compiladores e intérpretes de otros lenguajes, como FORTRAN, APL,
PASCAL, LISP, LOGO y BASIC.
El „C‟ es gráficamente:
CÓDIGO FUENTE: es el programa que nosotros escribimos, se graba con la extensión CPP
CÓDIGO OBJETO: es el programa fuente pero traducido a lenguaje máquina (sucesión de ceros y unos), se
graba con la extensión OBJ
PROGRAMA EJECUTABLE: es el programa objeto más las “librerías del C”, se graba con la extensión
EXE. Y no necesita el programa que hemos utilizado para crearlo, para poder ejecutarlo.
El código Objeto que genera un compilador de “C”, es casi tan eficiente (rápido) como si lo hubiéramos
escrito en lenguaje ENSAMBLADOR (lenguaje de programación más próximo al lenguaje máquina).
El presente apunte está orientado a la construcción de programas sobre el compilador Dev C++ y
Embaracdero XE8 C++ Rad Studio
El primero contiene las palabras de C y que C++ como evolución de C también contiene:
and bitand compl not_eq or_eq xor_eq and_eq bitor not or xor
Los tipos de datos primitivos son los que están definidos dentro del lenguaje.
En este tema veremos los tipos primitivos y en temas siguientes estudiaremos los tipos derivados.
Los tipos de datos primitivos en C++ son: numéricos enteros, numéricos reales, tipo lógico y tipo carácter
ampliado.
Número de
Tipo de Dato Descripción Rango
bytes típico
signed short Entero corto 2 -32768 a 32767
unsigned short Entero corto sin signo 2 0 a 65535
signed int Entero 4 -2147483648 a +2147483647
unsigned int Entero sin signo 4 0 a 4294967295
signed long Entero largo 4 -2147483648 a +2147483647
unsigned long Entero largo sin signo 4 0 a 4294967295
signed char Carácter 1 -128 a 127
unsigned char Carácter sin signo 1 0 a 255
Podemos ver que los datos enteros de tipo signed son equivalentes a los enteros sin utilizar el calificador:
Tipo lógico
Los datos de este tipo sólo pueden contener dos valores: true ó false (verdadero ó falso).
Si se muestran como enteros, el valor true toma el valor 1 y false el valor 0.
Tipo de Número de
Descripción Rango
Dato bytes típico
bool Dato de tipo lógico 1 0, 1
Caracteres en C++
El conjunto de caracteres que se pueden usar en un programa C++ para dar nombre a variables, constantes,
funciones, clases, etc, etc son los siguientes:
- Dígitos del 0 al 9.
Los caracteres espacios en blanco que pueden aparecer en un programa C++ son los siguientes:
el espacio en blanco
tabulador horizontal
tabulador vertical
avance de página
nueva línea
- Secuencias de escape: Una secuencia de escape esta formada por una barra
inversa seguida de una letra o de una combinación de dígitos.
Una secuencia de escape siempre representa un solo carácter aunque se escriba con dos o más caracteres.
Se utilizan para realizar acciones como salto de línea o para usar caracteres no imprimibles.
Identificadores en C++
Los identificadores son los nombres que se les da a los objetos de un programa.
contador! nº $edad
Como norma general, un identificador debe tener los suficientes caracteres para que su significado se reconozca
fácilmente, pero se debe evitar un excesivo número de caracteres.
Un identificador puede tener cualquier número de caracteres, pero dependiendo del compilador utilizado, solo
son significativos los n primeros caracteres. Por tanto, dos identificadores son diferentes si difieren al menos en
uno de los n primeros caracteres.
No se permite el uso de la ñ ni de las tildes en los identificadores, aunque sí pueden ser utilizados en
comentarios.
C++ diferencia mayúsculas y minúsculas, por lo tanto, nombre y Nombre son identificadores diferentes.
Literales en C++
Un literal es cualquier valor numérico, carácter o cadena de caracteres que puede aparecer dentro de un
programa.
Por ejemplo, literales C++ válidos pueden ser: 150, 12.4, “JOSE”, etc.
Hay 4 tipos de literales en C++: numéricos enteros, numéricos reales, carácter y cadena de caracteres.
Literal numérico entero en C++
Un literal numérico entero en C++ puede expresarse en base decimal (base 10), base octal (base 8) y base
hexadecimal (base 16).
literales enteros en base decimal
Están formados por 1 o más dígitos del 0 al 9. El primer dígito debe ser distinto de cero.
Por ejemplo:
12
4303
4
El tipo del literal es int, unsigned int ó unsigned long int. Se toma como tipo, siguiendo ese orden, aquel en el
que su valor pueda ser representado.
También podemos usar los sufijos U, L, UL para indicar explícitamente el tipo del literal. U indica que es del tipo
unsigned int, L indica el tipo long y UL unsigned long. Por ejemplo:
1234 Tipo: int
1234U Tipo: unsigned int
1234L Tipo: long
1234UL Tipo: unsigned long
Están formados por 1 o más dígitos del 0 al 7. El primer dígito debe ser cero.
Por ejemplo:
012
Están formados por 1 o más dígitos del 0 al 9 y letras de la A a la F. Estos literales deben comenzar por 0x ó 0X.
Por ejemplo:
0x1A2
0X430
0xF4
El tipo del literal entero en hexadecimal, si no se le ponen sufijos, sigue la misma regla que para los enteros
octales.
También podemos usar los sufijos U, L, UL para indicar explícitamente el tipo del literal.
Por ejemplo:
0x1A Tipo: int
0x1AU Tipo: unsigned int
0x1AL Tipo: long
0x1AUL Tipo: unsigned long
Operadores C++
En aquellas expresiones en las que aparecen operandos de distinto tipo, C++ convierte los valores al tipo de
dato de mayor precisión de todos los datos que intervienen. Esta conversión es de forma temporal, solamente
para realizar la operación. Los tipos de datos originales permanecen igual después de la operación.
Por ejemplo:
int n = 10;
double v1 = 12.5, v2;
v2 = n + v1; // da como resultado 22.5
para realizar esta operación se convierte el valor de n a tipo double que es el tipo de v1. Realmente n no se
modifica, solo su valor es convertido para realizar la suma.
Más ejemplos:
int i = 7;
double f = 5.5;
char c = 'w'; // ASCII „w‟=119 „0‟=48
Otro ejemplo:
int i = 1;
Los operadores relacionales se utilizan para construir expresiones lógicas, cuyo resultado es de tipo cierto o
falso.
En C++ toda expresión numérica con un valor distinto de cero (no sólo el 1) se considera como cierta y el
valor cero como falsa.
Las expresiones lógicas compuestas que constan de expresiones lógicas individuales unidas por los operadores
lógicos && y || se evalúan sólo hasta que se ha establecido el valor cierto o falso del conjunto.
Cuando, por ejemplo, una expresión va a ser seguro falsa por el valor que ha tomado uno de sus operandos,
C++ ya no evalúa el resto de expresión.
Operadores de asignación.
Se utilizan para asignar el valor de una expresión a una variable.
= Asignación
Operador condicional.
Lo forman los caracteres ? y :
Se utiliza de la forma siguiente:
expresión1 ? expresión2 : expresión3
Si expresión1 es cierta entonces se evalúa expresión2 y éste será el valor de la expresión condicional. Si
expresión1 falsa, se evalúa expresión3 y éste será el valor de la expresión condicional.
Por ejemplo:
int i = 10, j;
j = (i < 0) ? 0 : 100;
Otros operadores
Operador coma
La coma, usada como operador, se utiliza para encadenar varias expresiones.
Ejemplo: x=(v=3,v+5)
Equivale a: v=3
x=v+5
Ejemplo: z=26
v=(z=z+10,72/z)
Equivale a: z=26
z=z+10
v=72/z
Operador de dirección
Se representa por el símbolo & (ampersand), y su función es la de obtener la dirección dónde se almacena una
determinada variable.
Por ejemplo, dadas las siguientes instrucciones:
int x = 10;
cout << “Valor de x: “ << x << endl;
cout << “Dirección de la variable x: “ << &x << endl;
muestran por pantalla:
Valor de x: 10
Dirección de la variable x: 0x27ff44
Operador de indirección
Se representa por un asterisco *, y su función es la de obtener el valor contenido en una dirección de memoria.
Operador referencia a
Una referencia es un nombre alternativo (un alias, un sinónimo) para un objeto.
La forma general de expresar una referencia es:
tipo &referencia = variable;
Por ejemplo:
float m = 30.01;
float &n = m; // n es una referencia de m
Se ha declarado la variable m como float y n como referencia de m, indicando al compilador que en este
programa m también tiene otro nombre ( n ).
Las operaciones realizadas sobre m se reflejan en n, y viceversa. Por lo tanto en el programa podemos utilizar
indistintamente m o n.
Una referencia no es una copia de la variable referenciada, sino que es la misma variable con un nombre
diferente.
Los operadores no operan con la referencia sino directamente sobre la variable referenciada.
Por ejemplo:
int j = 0;
int &k = j; // k es una referencia a j;
k++;
cout << j << endl; // muestra 1
cout << k << endl; // muestra 1;
Una referencia debe ser inicializada y su valor no puede ser alterado después de haberla inicializado, por lo que
siempre se referirá al mismo objeto.
Las referencias se utilizan, por ejemplo, como alternativa a los punteros en el paso de parámetros en las
funciones.
La siguiente tabla muestra todos los operadores de C++ ordenados de mayor a menor prioridad.
Los operadores que aparecen en la misma línea tienen la misma prioridad.
:: Sin asociatividad
() [] . -> n++ n-- _cast typeid Izquierda a Derecha
signo ~ ! * & ++n -–n sizeof new delete (tipo) Derecha a Izquierda
->* .* Izquierda a Derecha
* / % Izquierda a Derecha
+ - Izquierda a Derecha
<< >> Izquierda a Derecha
< <= > >= Izquierda a Derecha
== != Izquierda a Derecha
& Izquierda a Derecha
^ Izquierda a Derecha
| Izquierda a Derecha
&& Izquierda a Derecha
|| Izquierda a Derecha
?: Derecha a Izquierda
= += -= *= /= %= <<= >>= &= |= ^= Derecha a Izquierda
, Izquierda a Derecha
Cuando en una expresión en C++ intervienen operandos de distinto tipo, los datos se convierten de forma
temporal al operando de mayor precisión para realizar la operación.
Cuando a un variable se le asigna un valor que no es de su tipo, C++ convierte el valor de la derecha al tipo de
la variable a la que se le va a asignar siempre que no haya pérdida de información.
Si se produce pérdida de información el compilador avisará de ello.
En una asignación de tipos distintos puede ocurrir que:
1. Un valor real (tipo double o float) puede truncarse (pierde la parte decimal) si se asigna a una variable entera.
2. Un valor de tipo double puede ser redondeado si se asigna a una variable de tipo float.
3. Un valor de tipo entero puede ser modificado si se asigna a una variable entera de menor precisión o a una
variable de tipo char. Algunos de los bits más significativos pueden perderse.
En grandes proyectos formados por varios archivos, es posible que en archivos diferentes del mismo proyecto
se encuentren recursos con el mismo nombre. Para evitar confusiones y saber a qué recurso estamos haciendo
referencia se utilizan los espacios de nombres (namespace).
Un espacio de nombres es básicamente un conjunto de nombres de recursos (clases, métodos, funciones,
etc) en el cual todos los nombres son únicos.
Todos los elementos de la biblioteca estándar de C++ se declaran dentro de un espacio de nombres llamado
std.
Con la instrucción using namespace std estamos indicando que vamos a usar este espacio de nombres.
Esta línea se incluirá en la mayoría de programas que escribamos en C++.
Si no la escribimos, la instrucción cout << "Hola mundo!!!\n"; tendríamos que escribirla indicando el espacio de
nombres donde se declara cout así:
std::cout<<”Hola mundo!!!\n”;
Para dar formato a los datos que se muestran por pantalla, C++ asocia con el stream de salida un conjunto de
manipuladores que permiten modificar la forma en la que son visualizados los resultados.
Un manipulador equivale a una llamada a una función.
Algunos de los manipuladores más comunes son los siguientes:
dec conversión a decimal
hex conversión a hexadecimal
oct conversión a octal
skipws extrae un espacio en blanco inicial
endl se imprime un „\n‟ y se vacía el buffer de salida
flush se vacía el buffer de salida
setw(int w) establece la anchura mínima de campo
setprecision(int p) establece el número de cifras significativas, por defecto 6.
setfill(char ch) establece el carácter de relleno
left la salida se alinea a la izquierda
rigth la salida se alinea a la derecha
internal se alinea el signo y los caracteres indicativos de la base por la izquierda y las cifras por la derecha
showbase se muestra la base de los valores numéricos
showpoint se muestra el punto decimal
uppercase los caracteres de formato aparecen en mayúsculas
showpos se muestra el signo (+) en los valores positivos
scientific notación científica para coma flotante
fixed notación normal de C++ para coma flotante
setiosflag(long i) establece una lista de flags de formato
resetriosflag(long i) suprime una lista de flags de formato
Los manipuladores pueden tener argumentos o no tenerlos. Los manipuladores sin argumentos (endl, flush, etc.)
están definidos en iostream. Los que tienen argumentos están declarados en iomanip.
Un manipulador sólo afecta al stream (cin, cout, etc.) al que se aplica.
Un manipulador en C++ se utiliza de la forma:
//*********************************************************
// Ejemplo de uso de manipuladores setfill y setw
//*********************************************************
#include <iostream>
#include <iomanip> // define diferentes manipuladores
using namespace std;
int main(void)
{
cout << setfill('.'); // manipulador de relleno.
//el carácter de relleno será el punto
cout << "Listado de calificaciones\n" << endl;
cout << "Roberto Aniorte" << setw(20) << "8.5" << endl;
cout << "Andrea Gutierrez" << setw(19) << "6.9" << endl;
cout << "Isabel Sanchez" << setw(21) << "5.7" << endl;
cout << "Anastasio Castro" << setw(19) << "7.5" << endl;
cout << "Barbara Lopez" << setw(22) << "7.8" << endl;
cout << "Martin Garcia" << setw(22) << "9.1" << endl;
cout << setfill('\0'); // se restablece el carácter de relleno
cout << endl;
system("pause");
}
Este programa muestra:
Tras el mensaje “Introduce un carácter” el programa no espera a que se teclee y muestra directamente el
mensaje “El carácter no es una letra minúscula”. Esto ocurre porque cuando se ha introducido el valor 18
realmente en el flujo de entrada está ese valor más el intro que hemos pulsado:
//leemos un carácter
cout << "Introduce un caracter: ";
cin.get(c);
cout << "El caracter" << ((c>='a' and c<='z')? " es ":" no es");
cout << " una letra minuscula" << endl;
system("pause");
}
Ejemplo 2:
En el siguiente ejemplo se leen cadenas de caracteres hasta que se pulsa F6. Se comprueba y se muestra el
estado del flujo cin después de cada lectura.
#include <iostream>
using namespace std;
int main(void)
{ char cadena[15];
cout << "Introduzca cadena de caracteres. F6 Para finalizar\n\n";
do
{ cout << "cadena: ";
cin.getline(cadena,15,'\n');
Para limpiar el buffer de entrada estándar con el método cin.ignore() el cual por defecto borra el primer
caracter que encuentra en el buffer (normalmente „\n‟). Otra forma, es pasando al mismo método dos
parámetros, que son la cantidad de caracteres que serán borrados (máximo 256), y el caracter en el cual
terminará el borrado, para nuestro caso „\n‟.
cin.ignore(256,’\n’);
Las Sentencias de Iteración o Ciclos son estructuras de control que repiten la ejecución de un grupo de
instrucciones. Básicamente, una sentencia de iteración es una estructura de control condicional, ya que dentro
de la misma se repite la ejecución de una o más instrucciones mientras o hasta que una a condición
específica se cumpla. Muchas veces tenemos que repetir un número 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 número de veces que una o más sentencias han de repetirse. Por otro lado,
la sentencia while es útil en aquellos casos en donde no se conoce de antemano el número de veces que una
o más sentencias se tienen que repetir.
Sentencia For
for(contador; final; incremento)
{
Código a Repetir;
}
donde:
Ejemplo 1:
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>
Using namespace std;
int main()
{
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 condición que se evalúa así como que el contador se decremento en lugar de ser incrementado .
Sentencia while
while(condición)
{
código a Repetir
}
donde:
Ejemplo 1:
#include <iostream>
Using namespace std;
int main(int argc, char* argv[])
{
int contador = 0;
while(contador<=10)
{
contador=contador++;
El contador Indica que hasta que este llegue a el total de 10 entonces se detendrá y ya no se realizará el código
contenido dentro de la sentencia while, de lo contrario mientras el "contador" sea menor a 10 entonces el
código contenido se ejecutará desplegando hasta 10 veces "Hola Mundo" en pantalla.
Sentencia do - while
La sentencia do es usada generalmente en cooperación con while para garantizar que una o más instrucciones
se ejecuten al menos una vez. Por ejemplo, en la siguiente construcción no se ejecuta nada dentro del ciclo
while, el hecho es que el contador inicialmente vale cero y la condición para que se ejecute lo que está dentro
del while es "mientras el contador sea mayor que diez". Es evidente que a la primera evaluación hecha por
while la condición deja de cumplirse.
int contador = 0;
#include <iostream>
Using namespace std;
int main(int argc, char* argv[])
{
int contador = 0;
do
{
contador ++;
cout<<"Hola Mundo";
}
while(contador > 10);
system(“pause”);
return 0;
}
Observe cómo en el caso de do la condición es evaluada al final en lugar de al principio del bloque de
instrucciones y, por lo tanto, el código que le sigue al do se ejecuta al menos la primera vez.
Función rand()
La función rand calcula un número aleatorio en el intervalo entre 0 y RAND_MAX. El valor de RAND_MAX es
una constante predefinida que representa el mayor valor que puede devolver la función rand. En Dev-C++ este
valor es 32767.
#include <iostream>
int main()
int i;
system("pause");
La función rand genera números a partir de un valor inicial o semilla. Si ejecutamos el programa anterior varias
veces seguidas obtendremos siempre la misma secuencia de números. Para que esto no se produzca debemos
cambiar el valor inicial de la semilla cada vez que se ejecute el programa. Esto se hace con la función srand.
Función srand()
La función srand fija el punto de comienzo para generar números aleatorios. El generador de números
aleatorios obtiene los números en función del valor de su argumento. Cuando esta función no se utiliza, el valor
del primer número generado siempre es el mismo para cada ejecución (corresponde a un argumento de valor
1).
Para obtener números aleatorios mediante estas funciones, es recomendable utilizar como semilla un valor que
cambie constantemente, como por ejemplo, el valor devuelto por la función time (librería ctime). Esta función
devuelve el número de segundos transcurridos desde las 0 horas del 1 de Enero de 1970.
Podemos comprobar el funcionamiento modificando el ejemplo anterior para que genere números diferentes en
cada ejecución:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int i;
cout << "20 numeros generados aleatoriamente:\n";
for(i=1; i<=20; i++)
cout << rand() << endl;
system("pause");
}
Para generar números aleatorios entre dos límites DESDE – HASTA utilizaremos la siguiente expresión:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int i, n, aleatorio, DESDE=4, HASTA=10;
cout << "Numeros aleatorios entre " << DESDE << " y " << HASTA << endl;
cout << "Cuantos numeros aleatorios quiere generar? ";
cin >> n;
for (i = 1; i <= n; i ++)
{
aleatorio = rand()%(HASTA-DESDE+1)+DESDE;
cout << aleatorio << " ";
}
cout << endl;
system("pause");
}
Otro ejemplo
/* srand example */
#include <iostream>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
using namespace std;
int main ()
{
cout<<"First number: "<< rand()%100<<endl;
srand (time(NULL));
cout<<"Random number: “<< rand()%100<<endl;
srand (1);
cout<<"Again the first number: "<< rand()%100<<endl;
return 0;
}
enum
Sintaxis:
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 código crea un tipo enumerador para colores:
En el ejemplo anterior, el efecto de enumeración 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:
ColorT c = verde;
cout << "c es " << c << endl;
Funciones en C++.
Una función está formada por un conjunto de sentencias que realizan una determinada tarea y que podemos
invocar mediante un nombre.
Un programa C++ está formado por una o más funciones.
Utilizando funciones podemos construir programas modulares. Además consiguen que no se repita el mismo
código en varias partes del programa: en lugar de escribir el mismo código cuando se necesite, por ejemplo para
validar una fecha, se hace una llamada a la función que lo realiza.
Todo programa C++ tiene una función llamada main. La función main es el punto de entrada al programa y
también el punto de salida.
Los parámetros formales son los datos que recibe la función para operar con ellos. Una función puede
recibir cero o más parámetros. Se debe especificar para cada parámetro su tipo.
Una función puede devolver un dato a quien la ha llamado. Esto se realiza mediante la instrucción return. El tipo
del dato devuelto debe coincidir con el tipo_devuelto que se ha indicado antes del nombre de la función.
Ejemplo de función C++ : función que sume dos números enteros
Esta función se llama suma y recibe dos números enteros a y b. La función suma los dos números y guarda el
resultado en c. Finalmente devuelve mediante la instrucción return la suma calculada.
Para que una función se ejecute es necesario llamarla o invocarla desde alguna parte del programa.
La llamada a una función está formada por su nombre seguido de una lista de argumentos entre paréntesis y
separados por comas (cero o más argumentos) que son los datos que se le envían a la función.
Los argumentos que aparecen en la llamada a una función se llaman parámetros actuales, porque son los
valores que se pasan a ésta en el momento de la ejecución.
Los parámetros actuales y los formales deben coincidir en número, orden y tipo. Si el tipo de un parámetro
actual no coincide con su correspondiente parámetro formal, el sistema lo convertirá al tipo de este último,
siempre que se trate de tipos compatibles. Si no es posible la conversión, el compilador dará los mensajes de
error correspondientes.
Si la función devuelve un valor, la llamada a la función puede estar incluida en una expresión que recoja el valor
devuelto.
Cuando se llama a una función, se crean en memoria las variables que aparecen en la cabecera de la función. Las
variables declaradas en la cabecera de una función así como las que se declaran en el interior de la
misma son variables locales de la función. Esto significa que solo son accesibles dentro de la función.
Aunque tengan el mismo nombre que otras variables que puedan aparecer en otras partes del programa se trata
Cuando se llama a una función, la ejecución del programa pasa a la función y cuando ésta acaba, la ejecución
continúa a partir del punto donde se produjo la llamada.
Pasar parámetros por valor significa que a la función se le pasa una copia del valor que contiene el
parámetro actual.
Los valores de los parámetros de la llamada se copian en los parámetros de la cabecera de la función. La
función trabaja con una copia de los valores por lo que cualquier modificación en estos valores no afecta
al valor de las variables utilizadas en la llamada.
Aunque los parámetros actuales (los que aparecen en la llamada a la función) y los parámetros formales (los que
aparecen en la cabecera de la función) tengan el mismo nombre son variables distintas que ocupan
posiciones distintas de memoria.
Por defecto, todos los argumentos salvo los arrays se pasan por valor.
En la llamada a la función el valor de la variable num se copia en la variable num de la cabecera de la función.
Aunque tengan el mismo nombre, se trata de dos variables distintas.
Dentro de la función se modifica el valor de num, pero esto no afecta al valor de num en main. Por eso, al
mostrar en main el valor de num después de la llamada aparece el valor original que se ha leído por teclado.
En la llamada, a la función se le envía la dirección de los parámetros. El operador que obtiene la dirección de una
variable es &.
intercambio(&a, &b);
En la cabecera de la función, los parámetros formales que reciben las direcciones deben ser punteros. Esto se
indica mediante el operador *
void intercambio(int *x, int *y)
Los punteros x e y reciben las direcciones de memoria de las variables a y b. Al modificar el contenido de las
direcciones x e y, indirectamente estamos modificando los valores a y b. Por tanto, pasar parámetros por
referencia a una función es hacer que la función acceda indirectamente a las variables pasadas.
Ejemplo 2:
En el siguiente ejemplo, se lee una hora (hora, minutos y segundos) y se calcula la hora un segundo después. El
programa utiliza una función segundo_despues que recibe la hora, minutos y segundos leídos y los modifica de
forma que al finalizar contienen la hora un segundo después.
// Hora un segundo después
//llamada a la función
segundo_despues(&horas, &minutos, &segundos);
Esta función no devuelve nada (aparece void como tipo devuelto), por lo que no es necesario poner la
instrucción return.
Mediante return una función solo puede devolver un valor. En casos como la función anterior en los que es
necesario devolver más de un valor, habrá que hacerlo pasando los parámetros por referencia.
Este paso de parámetros por referencia basado en punteros es el utilizado por C y por tanto también puede
usarse en C++. Pero C++ incorpora una nueva forma de paso de parámetros que no hace uso de punteros.
Es el paso de parámetros utilizando referencias.
Una referencia es un nombre alternativo (un alias, un sinónimo) para un objeto. Una referencia no es una copia
de la variable referenciada, sino que es la misma variable con un nombre diferente.
Utilizando referencias, las funciones trabajan con la misma variable utilizada en la llamada. Si se modifican los
valores en la función, realmente se están modificando los valores de la variable original.
Ejemplo:
El primer ejemplo del punto anterior utilizando referencias lo podemos escribir así:
#include <iostream>
using namespace std;
void intercambio(int &, int &);
int main( )
{ int a, b;
cout << "Introduce primer numero: ";
cin >> a;
cout << "Introduce segundo numero: ";
cin >> b;
cout << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
intercambio(a, b);
cout << endl << "Despues del intercambio: " << endl << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
system("pause");
}
void intercambio(int &x, int &y)
{
int z;
z = x;
x = y;
y = z;
}
En la declaración de la función y en la definición se coloca el operador referencia a & en aquellos
parámetros formales que son referencias de los parámetros actuales:
void intercambio(int &, int &); //declaración de la función
void intercambio(int &x, int &y) //definición de la función
Escribir un programa que permita al usuario elegir el cálculo del área de cualquiera de las
figuras geométricas: círculo, cuadrado, rectángulo o triángulo mediante funciones.
#include<stdio.h>
#include<iostream.h>
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()
{
carga();
system(“pause”);
return 0;
}
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;
system(“pause”);
}
while (n !=5);
float circulo(int r)
{
return ((float)(3.14*r*r));
}
void funcion();
int main()
{
cout << x << endl; // muestra 1
x++;
cout << x << endl, // muestra 2
void funcion()
{
//la función tiene acceso a la variable global x
x = x * 2;
}
2 Variables locales.
Las variables locales son las que se declaran dentro de una función. Son accesibles desde el punto donde se
declaran hasta el final del bloque donde se han declarado. Los límites de los bloques están definidos por las
llaves de apertura y cierre { }. Normalmente el final del bloque coincide con el final de la función. Si el bloque
donde se ha declarado la variable local contiene a su vez otros bloques, también son accesibles dentro de ellos.
Las variables locales se destruyen cuando se sale del bloque donde han sido declaradas.
Los parámetros formales (los que aparecen en la cabecera de una función) se consideran variables locales de la
función.
#include <iostream>
using namespace std;
bool es_primo(int);
int main()
{ int numero, i; // variables locales de main
cout << "Introduzca 10 numeros enteros > 0: ";
for(i=1;i<=10;i++)
{
do
{
cout << "numero " << i << ": ";
cin >> numero;
}while(numero <= 0);
if (es_primo(numero))
cout << "Es primo" << endl;
else
cout << "No es primo" << endl;
}
system("pause");
}
}
return estado;
Ocultación de variables
Puede ocurrir que una variable global y otra local tengan el mismo nombre. Cuando ocurre esto, la variable
global queda oculta en el ámbito de accesibilidad de la local del mismo nombre.
Para acceder a una variable global que ha quedado oculta por otra local se utiliza el operador de resolución de
ámbito ::
Ejemplo de ocultación de variables en C++:
// Ejemplo de ocultación de variables
#include <iostream>
using namespace std;
int a = 10; //variable global
int main()
{
int a = 5; //variable local de main
//oculta la variable global con el mismo nombre
cout << a << endl; //muestra 5
cout << ::a << endl; //acceso a la variable global mediante ::
//muestra 10
system("pause");
}
El programa muestra:
5
10
3 Variables de bloque.
Una función puede contener bloques definidos dentro de otros. Los límites de los bloques están
definidos por las llaves de apertura y cierre { }.
El ámbito de una variable declarada dentro de un bloque comienza en el punto en que se declara hasta
el final del bloque donde se ha declarado (llave final del bloque).
Una variable de bloque se destruye cuando acaba la ejecución del bloque donde se ha declarado.
Un ejemplo muy usual de declaración de variables dentro de un bloque es hacerlo en las instrucciones
for:
for(int i = 1; i<=20; i+=2)
{
cout << i << endl;
}
La variable i se ha declarado dentro del for y solo es accesible dentro de él.
Si a continuación de la llave final del for escribimos:
cout << i << endl;
se producirá un error de compilación: la variable i no existe fuera del for y el compilador nos dirá que no está
declarada.
Una variable puede quedar oculta (no accesible) si hay otro bloque anidado y se declara otra variable con el
mismo nombre.
La variable declarada en el bloque interior oculta a la primera variable y la hace inaccesible en el bloque interior.
Ejemplo
la función llevará a cabo la suma de dos números, llamada suma( )…sin embargo ocurre algo especial con
esta función, debería ser capaz de realizar la suma recibiendo parámetros de tipo entero y de tipo real (como
3.42 o 8.4765).
En el lenguaje C, cuando se declara una función, solo se puede indicar un tipo de dato (int, float, char,
double, etc) por cada dato que se recibirá, por lo tanto lo que haremos a continuación es implementar dos
funciones que tendrán el mismo nombre suma( ) pero que una recibirá y retornará valores de tipo entero (int)
y la otra función recibirá y retornará valores de tipo real (double).
Vamos a dividir el código completo en 3 partes, para explicar cada una de ellas de forma más entendible. A
continuación se presenta la primera parte del programa, con la directiva de preprocesador, el espacio de
nombres a usar (en este caso el estándar, std) y luego, los prototipos de la función suma( ) sobrecargada,
como puedes notar, ambas funciones tienen el mismo nombre pero los tipos de dato con los que trabaja son
diferentes, por lo que es válida la declaración.
#include <iostream>
using namespace std;
A continuación se lleva a cabo la definición de la función principal main( ), que dada la finalidad del ejemplo, es
muy sencilla, y lo único que hacemos es imprimir en pantalla el resultado de las dos funciones suma.
// Definición de la función principal
int main(void)
{
cout<<"2 + 3 = "<<suma(2,3)<<endl;
cout<<"4.5 + 2.1 = "<<suma(4.5,2.1)<<endl<<endl;
return 0;
}
Finalmente realizamos la definición de las “dos” funciones suma( ) las cuales resultan ser muy básicas, por la
finalidad del ejemplo.
//Definición de la función suma sobrecargada...para enteros y reales
int main(void)
{
cout<<"2 + 3 = "<<suma(2,3)<<endl<<endl;
cout<<"4.5 + 2.1 = "<<suma(4.5,2.1)<<endl<<endl;
return 0;
}
Un array es una colección finita de datos del mismo tipo, que se almacenan en posiciones consecutivas de
memoria y reciben un nombre común.
Ejemplo de array: Supongamos que queremos guardar las notas de los 20 alumnos de una clase. Para ello
utilizaremos un array de 20 elementos y en cada elemento almacenaremos una nota.
Podemos representar gráficamente el array de notas de la siguiente forma:
Array notas:
El número de índices determina la dimensión del array. Si el array tiene solo un índice es un array de
una dimensión o unidimensional (también llamado vector), si tiene dos índices es un array de dos dimensiones o
bidimensional (también llamados matrices, tablas o arreglos), si tienen tres índice tridimensional, etc.
Para facilitar la modificación del programa, el tamaño del array se puede declarar utilizando una constante en
lugar de una cantidad entera. Esto hace más fácil modificar el programa ya que todas las referencias al tamaño
máximo del array (por ejemplo, en bucles for o en definiciones de arrays) pueden ser modificadas cambiando el
valor de la constante.
Por ejemplo, declaración de 4 arrays A, B, C y D de 10 elementos cada uno de tipo double usando una
constante llamada ELEMENTOS:
const int ELEMENTOS = 10;
double A[ELEMENTOS], B[ELEMENTOS], C[ELEMENTOS], D[ELEMENTOS];
En este caso si se modifica el tamaño de los arrays, solo habrá que cambiar el valor de la constante.
Los arrays declarados como locales en una función tienen como valores iniciales valores indeterminados, como
ocurre con las variables locales.
Las declaraciones de arrays que hemos hecho hasta ahora se llaman declaraciones implícitas: para cada array
que se declara hay que indicar el tipo y la dimensión.
Una alternativa a esto es definir un nuevo tipo de dato para el array asignándole un nombre, y posteriormente
declarar las variables como pertenecientes a ese tipo.
C++ dispone del especificador typedef que permite la creación de nuevos tipos de datos.
Los tipos de datos creados con typedef son sinónimos de otros tipos ya existentes.
Por ejemplo, la siguiente instrucción crea un nuevo tipo de dato llamado entero, sinónimo de int.
Por ejemplo:
Tvector a, b;
Ejemplo: Generar 2 vectores (a y b) con números aleatorios. Sumar sus elementos en otro vector llamado
s. Mostrar todos los vectores
#include <iostream>
using namespace std;
const int n=10;
int main() {
int a[n],b[n],s[n];
cargarvector(a);
cargarvector(b);
sumar(a,b,s);
cout<<"vector a"<<endl;
• El procesamiento de todos los elementos requiere como mínimo dos ciclos iterativos.
• Dentro de los ciclos se deben realizar las operaciones específicas que se solicitan.
• Una matriz cuadrada es aquella en el numero de filas es igual al número de columnas.
• Entre las aplicaciones más importantes de las matrices está la posibilidad de resolver sistemas de ecuaciones con n
variables.
Las matrices cuadradas tienen algunas características importantes asociadas a la ubicación de sus elementos en el
conjunto. Se puede hablar de diagonal principal, diagonal secundaria, triangular superior, triangular inferior, por mencionar
algunas.
Ordenamiento de Vectores
Es la operación de arreglar los registros de una tabla en algún orden secuencial de acuerdo a un criterio de
ordenamiento. El ordenamiento se efectúa con base en el valor de algún campo en un registro. El propósito
principal de un ordenamiento es el de facilitar las búsquedas de los miembros del conjunto ordenado.
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 numérico, alfabético o incluso alfanumérico, ascendente o
descendente.
• Requerimientos de Memoria: Al igual que el ordenamiento burbuja, este algoritmo sólo necesita una variable
adicional para realizar los intercambios.
• Tiempo de Ejecución: El ciclo externo se ejecuta n veces para una lista de n elementos. Cada búsqueda
requiere comparar todos los elementos no clasificados.
Ventajas:
• Fácil implementación.
• No requiere memoria adicional.
• Rendimiento constante: poca diferencia entre el peor y el mejor caso.
Desventajas:
• Lento.
• Realiza numerosas comparaciones
#include <iostream>
Using namespace std;
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;
}
Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de
posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten
más intercambios, lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la forma con
la que suben por la lista los elementos durante los intercambios, como si fueran pequeñas "burbujas". También
es conocido como el método del intercambio directo.
Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparación, siendo
el más sencillo de implementar.
#include <iostream>
Using namespace std;
DESCRIPCIÓN.
Completa la tripleta de los algoritmos de ordenación más básicos y de orden de complejidad cuadrático,
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 prácticos. Realiza una cantidad de
comparaciones bastante equilibrada con respecto a los intercambios, y tiene un par de características 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 ordenación son
imprescindibles dos cosas: un array o estructura similar de elementos comparables y un criterio claro de
comparación, tal que dados dos elementos nos diga si están en orden o no.
• En cada iteración del ciclo externo los elementos 0 a i forman una lista ordenada
• 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 Ejecución: Para una lista den elementos el ciclo externo se ejecuta n1 veces. El ciclo interno se
ejecuta como máximo una vez en la primera iteración, 2 veces en la segunda, 3 veces en la tercera, etc.
Ventajas:
• Fácil implementación.
• Requerimientos mínimos de memoria.
Desventajas:
• Lento.
• Realiza numerosas comparaciones.
Este también es un algoritmo lento, pero puede ser de utilidad para listas que están ordenadas o semi
ordenadas, porque en ese caso realiza muy pocos desplazamientos.
El método de ordenación por 'inserción binaria'' es una mejora del método de inserción directa. Para lograr esta
mejora se recurre a una búsqueda binaria en lugar de una búsqueda secuencial para insertar un elemento en la
parte izquierda del vector, que ya se encuentra ordenado. El resto del procedimiento es similar al de inserción
directa, es decir, se repite este mismo procedimiento desde el segundo término hasta el último elemento.
El método Shell es una versión mejorada del método de inserción directa. Este método también se conoce con
el nombre de inserción con incrementos decrecientes. En el método de ordenación por inserción directa cada
elemento se compara para su ubicación correcta en el vector, con los elementos que se encuentran en la parte
izquierda del mismo. Si el elemento a insertar es más pequeño que el grupo de elementos que se encuentran a
su izquierda, es necesario efectuar entonces varias comparaciones antes de su ubicación.
Shell propone que las comparaciones entre elementos se efectúen con saltos de mayor tamaño pero con
incrementos decrecientes, así, los elementos quedarán ordenados en el vector más rápidamente.
El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un espacio
de varias posiciones. Esto permite que un elemento haga "pasos más grandes" hacia su posición esperada. Los
pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. El último paso del
Shell sort es un simple ordenamiento por inserción, pero para entonces, ya está garantizado que los datos del
vector están casi ordenados.
El Shell sort lleva este nombre en honor a su inventor, Donald Shell, que lo publicó en 1959.
#include <iostream>
Using namespace std;
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" ;
ordenShell(vector,tamano);
mostrarVector(vector,tamano);
system(“pause”);
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";
}
Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un montículo (heap), y luego
extraer el nodo que queda como nodo raíz del montículo (cima) en sucesivas iteraciones obteniendo el
conjunto ordenado. Basa su funcionamiento en una propiedad de los montículos, por la cual, la cima contiene
siempre el menor elemento (o el mayor, según se haya definido el montículo) 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 características:
Un heap es un vector de n posiciones ocupado por los elementos de la cola. (Nota: se utiliza un vector que
inicia en la posición 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 posición 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 subárbol.
PROCEDIMIENTO
#include <iostream>
using namespace std;
int _tmain( )
{
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 método comienza en la posición 1!!! ---------------------
En este apartado nos centramos en la búsqueda interna. Como principales algoritmos de búsqueda en arrays
tenemos la búsqueda secuencial, la binaria y la búsqueda utilizando tablas de hash.
Búsqueda 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.
Búsqueda binaria
La búsqueda binaria sólo 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:
Si la clave no fuese encontrada en algun momento Iabajo > Iarriba, con un while vamos a controlar esta
condición para salir del ciclo en tal caso y devolver -1 (clave no encontrada).
Hagamos modificaciones al código de búsqueda lineal para implementar una función de búsqueda binaria.
#include <iostream>
using namespace std;
#pragma argsused
int main()
{
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
Archivos
Hasta ahora, siempre hemos leído mediante cin, y escrito mediante cout. Sin embargo, a veces es cómodo
utilizar uno o más (todos los que queramos) archivos de texto de donde sacar los datos, y similarmente
escribir a uno o más archivos los resultados de nuestro programa.
Para utilizar archivos y hacer funcionar los ejemplos de esta sección, tendremos que incluir #include <fstream>
en nuestros programas.
Archivos de entrada
Es posible crear una variable que represente un archivo de entrada, del cual el programa leerá datos. Estas
variables se utilizan de exactamente igual manera que cin, y se declaran como en el siguiente programa de
ejemplo:
#include <fstream>
int main()
{
ifstream archivo1("nombre1.txt");
ifstream archivo2("nombre2.in");
int x,y,z;
archivo1 >> x>> y >> z;
string a; int b;
archivo2 >> a >> b;
return 0;
}
En el ejemplo se ve que podemos leer datos contenidos en los archivos exactamente igual que hacíamos con cin,
pero indicando la variable del archivo correspondiente. En lugar de tener que ser tipeados por el usuario, el
programa recibe los datos contenidos en los archivos correspondientes. Las variables son de tipo ifstream (Del
inglés, “Input File Stream”), y al declararlas se indica entre paréntesis el nombre del archivo del cuál se leerá
utilizando esa variable. Dicho archivo debe existir y contener los datos deseados, al momento de ejecutar el
programa.
En este ejemplo se usan dos archivos distintos: El contenido de “nombre1.txt” se guarda en x,y,z (que tendrán 3
enteros) y el de “nombre2.in” se guarda en a,b (Un string y un entero).
Archivos de salida
Los archivos de salida se pueden utilizar de manera completamente análoga a los de entrada, pero operando
como si fueran cout, y su tipo será ofstream (Del inglés “Output File Stream”).
#include <fstream>
int main()
{
ofstream archivo1("nombre1.txt");
ofstream archivo2("nombre2.out");
int x = 32,y = 10;
archivo1 << x << " " << y << " " << -33 << endl;
string a = "pepe"; int b = 100;
archivo2 << a << endl << b << endl;
return 0;
}
32 10 -33
pepe
100
El lenguaje C++ permite definir variables que combinen diferentes ítems/ tipos de datos. A esto se le llama
registros.
Por ejemplo.
El siguiente es un programa que contendrá un registro llamado Netjuegos con los siguientes campos: id_juego;
Nick_jugador; nombre_juegos; puntaje_jugador; dia_mes_anio.
Crear un archivo plano llamado juegos.in que contenga los siguientes datos:
15
123222 daniel counter-strike 9776 02-noviembre-2017
213323 selena counter-strike 6587 04-noviembre-2017
112326 ciclo_ counter-strike 4355 05-noviembre-2017
131234 nester counter-strike 3456 07-noviembre-2017
244329 cheste counter-strike 1424 10-noviembre-2017
876789 alpase -----LOL------ 5334 08-octubre-2017
324243 lechne -----LOL------ 4223 12-octubre-2017
878976 casior -----LOL------ 3003 14-cotubre-2017
564635 veg777 -----LOL------ 2322 20-julio-2017
647643 alexLO -----LOL------ 1023 23-octubre-2017
875785 redox_ --minecraft--- 100000 04-febrero-2018
437253 astero --minecraft--- 845784 07-febrero-2018
436572 segova --minecraft--- 679864 13-febrero-2018
984394 vipter --minecraft--- 45678 23-febrero-2018
978438 omega_ --minecraft--- 20000 26-febrero-2018
#include <iostream>
#include <fstream>
const int maximo=256;
using namespace std;
int n;
struct Netjuegos
{
int id_juego;
char nick_jugador[maximo];
char nombre_juego[máximo];
int puntaje_jugador;
char dia_mes_ano[máximo];
system("pause");
return 0;
}
void leer_datos (struct Netjuegos Art[maximo])
{
int i;
ent>>n;
for(i=0;i<n;i++)
{
ent>>Art[i].id_juego>>Art[i].nick_jugador>>Art[i].nombre_juego>>Art[i].puntaj
e_jugador>>Art[i].dia_mes_ano;
}
}
void mostrar_datos (struct Netjuegos Art[maximo])
{
int i;
cout<<"id_juego nick_jugador nombre_juego puntaje_jugador
dia_mes_año"<<endl;
for(i=0;i<n;i++)
{
cout<<Art[i].id_juego<<" "<<Art[i].nick_jugador<<"
"<<Art[i].nombre_juego<<" "<<Art[i].puntaje_jugador<<"
"<<Art[i].dia_mes_ano<<" "<<endl;
}
}
strcpy()
Copiar una cadena y pegarla sobre otra.
Copia la cadena apuntada por "fuente" al arreglo apuntado por "destino", insertando por su cuenta el caracter
de fin de cadena (barra invertida cero). Hay que destacar que para que el programa no explote al realizar esta
operación, el arreglo "destino" tiene que tener un tamaño de por lo menos la cantidad de
caracteres que haya en "fuente" + 1 (espacio para el caracter de fin de cadena) o dicho de otra forma:
tamaño mínimo de destino debe ser >= strlen( fuente ) + 1.
strncpy()
Copia los primeros "n" caracteres de una cadena a otra.
Copia los primeros "cuantos" caracteres de "fuente" a "destino". Si el final de la cadena "fuente" (indicado por el
caracter de fin de cadena 'barra invertida cero' ) es alcanzado antes de que se copien la cantidad de caracteres
indicados por "cuantos", el arreglo "destino" se llena con ceros hasta que una cantidad de "cuantos" caracteres
hayan sido escritos en él.
int main ()
{
const int tamanyo = 40;
char cad1[]= "Ser o no ser";
char cad2[tamanyo];
char cad3[tamanyo];
cout<<cad1<<endl;
cout<<cad2<<endl;
cout<<cad3<<endl;
return 0;
}
Salida:
Ser o no ser
Ser o no ser
Ser o
strcat()
Concatena dos cadenas.
Pega una copia de la cadena "fuente" al final de la cadena "destino". El "pegado" se produce desde la posición del
caracter nulo o de fin de cadena (barra invertida cero) en "destino", sobreescribiéndolo con el primer caracter
de "fuente" y continuando. Un nuevo caracter de fin de cadena es insertado al final del proceso. Como con
strcpy(), hay que resaltar que el arreglo "destino" tiene que tener un tamaño suficiente para anexar
su contenido a la cadena "fuente", es decir:
Ejemplos de uso:
int main ()
{
char cad[80];
char cad2[] = "estan ";
cout<<cad;
return 0;
}
Salida:
Pega los primeros "cuantos" caracteres de fuente al final de "destino", agregando solo el caracter de fin de
cadena. Si el tamaño de la cadena "fuente" es menor a la cantidad de caracteres "cuantos", se copiará y pegará
solamente los caracteres que haya hasta llegar al caracter de fin de cadena de "fuente". Se deben tener las
mismas precauciones de tamaños de arreglos que las indicadas para strcat().
Ejemplos de uso:
int main ()
{
char cad1[20];
char cad2[20];
strcpy( cad1, "Ser " );
strcpy( cad2, "o no ser" );
strncat( cad1, cad2, 4 );
cout<<cad1;
return 0;
}
Salida:
Ser o no
DE COMPARACIÓN:
strcmp()
Compara si dos cadenas son iguales.
Esta función comienza comparando el primer caracter de cada cadena. Si estos caracteres son iguales, continua
con el siguiente par hasta que los caracteres comparados son distintos o se alcanza un caracter nulo o de fin de
Valor de retorno: retorna un valor int que indica la relación entre las dos cadenas:
- Un valor 0 (cero) indica que las dos cadenas son iguales.
- Un valor mayor a cero indica que el primer caracter encontrado que es distinto tiene un valor mayor en cad1
que en cad2.
int main ()
{
char clave[] = "manzana";
char entradaClave[80];
do {
cout<<"Cual es mi fruta preferida? ";
cin.getline( entradaClave, 80 );
} while ( strcmp( clave, entradaClave ) != 0 );
cout<<"Respuesta correcta!";
return 0;
}
strncmp()
Compara si los primeros "n" caracteres de una cadena son iguales a los primeros "n" caracteres de otra.
Compara los primeros "cuantos" caracteres de la cadena "cad1" con los primeros "cuantos" caracteres de la
cadena "cad2".
Esta función comienza comparando el primer caracter de cada cadena. Si estos caracteres son iguales, continua
con el siguiente par hasta que los caracteres comparados son distintos, o se alcanza un caracter nulo o de fin de
cadena, o hasta que "cuantos" caracteres ah sido comparados y encontrados iguales, lo que pase primero.
Valor de retorno: retorna un valor int que indica la relación entre las dos cadenas:
- Un valor 0 (cero) indica que las dos cadenas son iguales.
- Un valor mayor a cero indica que el primer caracter encontrado que es distinto tiene un valor mayor en cad1
que en cad2.
int main ()
{
char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
cout<<"Buscando astromech droids R2..."<<endl;
for( int n=0 ; n<3; n++ ) {
if ( strncmp ( str[n], "R2xx", 2) == 0 )
{
cout<<"Encontrado: "<<str[n]<<endl;
}
}
return 0;
}
DE BÚSQUEDA:
strrchr()
Busca en la cadena la última ocurrencia de un caracter (char) indicado.
int main ()
{
char str[] = "Esta es una cadena de ejemplo";
char * pch;
cout<<"Buscando el caracter 's' en \""<<str<<"\"...\n\n";
pch = strchr( str, 's' );
while( pch != NULL )
{
cout<<"Encontrado en la posicion "<<pch-str+1<<endl;
cout<<"El puntero retornado apunta a: "<<pch<<endl;
/* busca desde después del último encontrado */
pch = strchr( pch+1, 's' );
}
return 0;
}
Salida:
Encontrado en la posicion 2
El puntero retornado apunta a: sta es una cadena de ejemplo
Encontrado en la posicion 7
El puntero retornado apunta a: s una cadena de ejemplo
strcspn()
Busca en una cadena la primera ocurrencia de cualquiera de los caracteres de otra cadena y retorna la posición
de la misma.
Retorna un puntero a la última ocurrencia de "letra" en "cad". El caracter de fin de cadena es considerado parte
de la cadena, por lo que puede ser buscado para obtener un puntero al final de la misma.
Ejemplos de uso:
int main ()
{
char str[] = "Esta es una cadena de prueba";
char * pch;
pch = strrchr( str, 's' );
cout<<"La ultima ocurrencia de 's' fue encontrada en la posicion "<<pch-
str+1<<endl;
cout<<"El puntero retornado apunta a: "<<pch;
return 0;
}
Salida:
strpbrk()
Busca en una cadena la primera ocurrencia de cualquiera de los caracteres de otra cadena y retorna un puntero
a char con la subcadena formada desde esa posición.
Retorna un puntero a la primera ocurrencia en "cad1" de cualquiera de los caracteres contenidos en "cad2", o
un puntero a NULL si no hubo coincidencias.
Ejemplos de uso:
int main ()
{
char cadena[] = "Esto es un cstring de prueba";
char claves[] = "aeiou";
char * pch;
cout<<"Vocales en '"<<cadena<<"': ";
pch = strpbrk( cadena, claves );
while( pch != NULL )
{
cout<<*pch<<" ";
pch = strpbrk( pch+1, claves );
}
return 0;
}
Salida:
strspn()
Retorna el largo de la porción inicial de una cadena que está formada solamente por los caracteres presentes en
otra.
Retorna la longitud de la porción inicial de "cad1" que consiste solamente de caracteres que son parte de
"cad2".
La búsqueda no incluye el caracter de fin de cadena de ninguna de las dos cadenas, pero termina en ese punto.
Valor de retorno: la longitud de la porción inicial de "cad1" que consiste solamente de caracteres que son parte
de "cad2".
Por lo tanto, si todos los caracteres de "cad1" están en "cad2" la función retorna el largo de "cad1", y si el
primer caracter de "cad1" no está en "cad2" la función retorna cero.
Ejemplos de uso:
int main ()
{
char cadena[] = "129asd";
char numeros[] = "1234567890";
int i = strspn( cadena, numeros );
cout<<"El numero inicial de la cadena tiene "<< i <<" digitos.";
return 0;
}
Salida:
strstr()
Busca una cadena dentro de otra cadena, retorna un puntero a la subcadena.
Retorna un puntero a la primera ocurrencia de "cad2" (completa) en "cad1", o un puntero NULL si "cad2" no es
parte de "cad1".
El proceso de búsqueda y comparación no incluye al caracter de fin de cadena, pero se detiene al llegar al
mismo.
int main ()
{
char str[] ="Esta es una cadena simple";
char * pch;
pch = strstr( str, "simple" );
strncpy( pch, "propia", 6 );
cout<<str;
return 0;
}
strtok()
En la primera llamada, la función espera un cstring como argumento para "cad", cuyo primer caracter es
utilizado como el punto de partida para buscar tokens. En las llamadas siguientes, la función espera un puntero
NULL y utiliza la posición inmediatamente siguiente al fina del último token como nuevo punto de partida para
realizar la búsqueda.
Para determinar el principio y el fin de un token, la función primero busca desde la posición inicial la ubicación
del primer caracter en "cad" que no está contenido en la cadena "delimitantes" (que se convierte en el principio
del token). Y entonces busca, partiendo desde ese principio del token, al primer caracter en "cad" contenido en
"delimitantes", que se convierte en el final del token. La búsqueda también se detiene si se llega al caracter de fin
de cadena.
Este final del token es automáticamente reemplazado por el caracter de fin de cadena, y el principio del token es
retornado como puntero por la función.
Una vez que el caracter de fin de cadena en "cad" es encontrado por strtok(), todas las subsecuentes llamadas a
esta función (con un puntero NULL como primer argumento) retornarán un puntero NULL.
El punto donde el último token fue encontrado se mantiene guardado internamente por la función para ser
usado en la siguiente llamada.
int main ()
{
char cad[] ="- Esta, una cadena de prueba.";
char * pch;
cout<<"Partiendo la cadena \""<<cad<<"\" en tokens:\n\n";
pch = strtok( cad, " ,.-" );
while( pch != NULL )
{
cout<< pch <<endl;
pch = strtok( NULL, " ,.-" );
}
return 0;
}
strerror()
Retorna una cadena que describe un error producido en el programa (pura magia).
Devuelve un puntero a una cadena que contiene un mensaje sobre un error producido.
La función interpreta el valor de errnum, generando una cadena con un mensaje que describe la condición del
error como fue descrita en errno por una función de la librería.
El puntero retornado apunta a una cadena estática, que no deberá ser modificada por el programa.
Subsecuentes llamadas a esta función pueden sobrescribir su contenido.
La cadena producida por strerror() puede ser específica para cada sistema e implementaciones de la librería.
Valor de retorno: Un puntero a una cadena que describe el error cuyo código representa errnum.
Ejemplos de uso
int main ()
{
ifstream flujo( "inexistente.ent" );
if ( !flujo.is_open() ) {
cout<<"Error al abrir el archivo unexist.ent: "<<strerror( errno );
}
return 0;
}
strlen()
Retorna el largo de una cadena.
Devuelve el largo de "cadena" (el tipo size_t es como un unsigned int). El largo de la cadena es determinado por
el caracter nulo o de fin de cadena (barra invertida cero): una cadena o cstring es tan largo como caracteres
haya antes del caracter de fin de cadena (sin incluirlo).
Esto no debe confundirse con el tamaño de la cadena como arreglo.
Por ejemplo:
Ejemplos de uso:
int main ()
{
char entrada[256];
cout<<"Introduzca una frase: ";
#include <iostream>
using namespace std;
int main()
{
char frase[]="hola mundo";
cout<<asteriscos(frase)<<endl;
cout<<"*"<<frase<<"*"<<endl;
cout<<asteriscos(frase)<<endl;
system("pause");
return 0;
}
C++ String
operator+
// concatenating strings
#include <iostream>
#include <string>
main ()
{
std::string firstlevel ("com");
std::string secondlevel ("cplusplus");
std::string scheme ("http://");
std::string hostname;
std::string url;
return 0;
}
Output:
http://www.cplusplus.com
getline
// extract to string
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string name;
return 0;
}
Append // agregar
// appending to string
int main ()
{
string str;
string str2="Writing ";
string str3="print 10 and then 5 more";
Assign // asignar
// string::assign
#include <iostream>
#include <string>
int main ()
{
std::string str;
std::string base="The quick brown fox jumps over a lazy dog.";
str.assign(base);
std::cout << str << '\n';
str.assign(base,10,9);
std::cout << str << '\n'; // "brown fox"
str.assign("c-string");
std::cout << str << '\n'; // "c-string"
str.assign(10,'*');
std::cout << str << '\n'; // "**********"
str.assign<int>(10,0x2D);
std::cout << str << '\n'; // "----------"
str.assign(base.begin()+16,base.end()-12);
std::cout << str << '\n'; // "fox jumps over"
return 0;
}
int main ()
{
std::string str ("Test string");
for (unsigned i=0; i<str.length(); ++i)
{
std::cout << str.at(i);
}
return 0;
}
Back//final c++11
// string::back
#include <iostream>
#include <string>
int main ()
{
std::string str ("hello world.");
str.back() = '!';
std::cout << str << '\n';
return 0;
}
Begin
// string::begin/end
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
std::cout << *it;
std::cout << '\n';
return 0;
}
Output:
Test string
int main ()
{
std::string str ("Test string");
std::cout << "size: " << str.size() << "\n";
std::cout << "length: " << str.length() << "\n";
std::cout << "capacity: " << str.capacity() << "\n";
std::cout << "max_size: " << str.max_size() << "\n";
return 0;
}
compare
// comparing apples with apples
#include <iostream>
#include <string>
int main ()
{
std::string str1 ("green apple");
std::string str2 ("red apple");
if (str1.compare(str2) != 0)
std::cout << str1 << " is not " << str2 << '\n';
if (str1.compare(6,5,"apple") == 0)
std::cout << "still, " << str1 << " is an apple\n";
if (str2.compare(str2.size()-5,5,"apple") == 0)
std::cout << "and " << str2 << " is also an apple\n";
if (str1.compare(6,5,str2,4,5) == 0)
std::cout << "therefore, both are apples\n";
return 0;
}
Output:
green apple is not red apple
still, green apple is an apple
and red apple is also an apple
therefore, both are apples
copy
// string::copy
#include <iostream>
#include <string>
int main ()
{
char buffer[20];
std::string str ("Test string...");
std::size_t length = str.copy(buffer,6,5);
buffer[length]='\0';
std::cout << "buffer contains: " << buffer << '\n';
return 0;
}
Output:
buffer contains: string
int main ()
{
std::string str ("Please split this sentence into tokens");
delete[] cstr;
return 0;
}
Output:
Please
split
this
sentence
into
tokens
data
// string::data
#include <iostream>
#include <string>
#include <cstring>
int main ()
{
int length;
if ( str.length() == std::strlen(cstr) )
{
std::cout << "str and cstr have the same length.\n";
Output:
str and cstr have the same length.
empty
// string::empty
#include <iostream>
#include <string>
int main ()
{
std::string content;
std::string line;
std::cout << "Please introduce a text. Enter an empty line to finish:\n";
do {
getline(std::cin,line);
content += line + '\n';
} while (!line.empty());
std::cout << "The text you introduced was:\n" << content;
return 0;
}
erase
// string::erase
#include <iostream>
#include <string>
int main ()
{
std::string str ("This is an example sentence.");
std::cout << str << '\n';
// "This is an example sentence."
str.erase (10,8); // ^^^^^^^^
std::cout << str << '\n';
// "This is an sentence."
str.erase (str.begin()+9); // ^
std::cout << str << '\n';
// "This is a sentence."
str.erase (str.begin()+5, str.end()-9); // ^^^^^
std::cout << str << '\n';
// "This sentence."
return 0;
}
Output:
This is an example sentence.
This is an sentence.
This is a sentence.
This sentence.
find
// string::find
#include <iostream> // std::cout
#include <string> // std::string
int main ()
{
std::string str ("There are two needles in this haystack with needles.");
std::string str2 ("needle");
found=str.find("haystack");
if (found!=std::string::npos)
std::cout << "'haystack' also found at: " << found << '\n';
found=str.find('.');
if (found!=std::string::npos)
std::cout << "Period found at: " << found << '\n';
return 0;
}
Notice how parameter pos is used to search for a second instance of the same search string. Output:
first 'needle' found at: 14
second 'needle' found at: 44
'haystack' also found at: 30
Period found at: 51
There are two prepositions in this haystack with needles.
find_first_not_of
// string::find_first_not_of
#include <iostream> // std::cout
#include <string> // std::string
#include <cstddef> // std::size_t
int main ()
{
std::string str ("look for non-alphabetic characters...");
if (found!=std::string::npos)
{
std::cout << "The first non-alphabetic character is " << str[found];
std::cout << " at position " << found << '\n';
}
return 0;
}
find_first_of
// string::find_first_of
#include <iostream> // std::cout
#include <string> // std::string
#include <cstddef> // std::size_t
int main ()
{
return 0;
}
find_last_not_of
// string::find_last_not_of
#include <iostream> // std::cout
#include <string> // std::string
#include <cstddef> // std::size_t
int main ()
{
std::string str ("Please, erase trailing white-spaces \n");
std::string whitespaces (" \t\f\v\n\r");
return 0;
}
find_last_of
// string::find_last_of
#include <iostream> // std::cout
#include <string> // std::string
#include <cstddef> // std::size_t
int main ()
{
std::string str1 ("/usr/bin/man");
std::string str2 ("c:\\windows\\winhelp.exe");
SplitFilename (str1);
return 0;
}
Splitting: /usr/bin/man
path: /usr/bin
file: man
Splitting: c:\windows\winhelp.exe
path: c:\windows
file: winhelp.exe
front
// string::front
#include <iostream>
#include <string>
int main ()
{
std::string str ("test string");
str.front() = 'T';
std::cout << str << '\n';
return 0;
}
Output:
Test string
insert
// inserting into a string
#include <iostream>
#include <string>
int main ()
{
std::string str="to be question";
std::string str2="the ";
std::string str3="or not to be";
std::string::iterator it;
Output:
to be, or not to be: that is the question...
length
// string::length
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
std::cout << "The size of str is " << str.length() << " bytes.\n";
return 0;
}
Output:
The size of str is 11 bytes
operator+=
// string::operator+=
#include <iostream>
#include <string>
int main ()
{
std::string name ("John");
std::string family ("Smith");
name += " K. "; // c-string
name += family; // string
name += '\n'; // character
Output:
John K. Smith
operator=
// string assigning
#include <iostream>
#include <string>
int main ()
{
std::string str1, str2, str3;
str1 = "Test string: "; // c-string
str2 = 'x'; // single character
str3 = str1 + str2; // string
operator[]
// string::operator[]
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
for (int i=0; i<str.length(); ++i)
{
std::cout << str[i];
}
return 0;
}
pop_back
// string::pop_back
#include <iostream>
#include <string>
int main ()
{
std::string str ("hello world!");
str.pop_back();
std::cout << str << '\n';
return 0;
}
hello world
push_back
// string::push_back
#include <iostream>
#include <fstream>
#include <string>
int main ()
{
std::string str;
std::ifstream file ("test.txt",std::ios::in);
if (file) {
while (!file.eof()) str.push_back(file.get());
}
std::cout << str << '\n';
return 0;
}
replace
// replacing in a string
int main ()
{
std::string base="this is a test string.";
std::string str2="n example";
std::string str3="sample phrase";
std::string str4="useful.";
// Using iterators:
0123456789*123456789*
str.replace(str.begin(),str.end()-3,str3); // "sample
phrase!!!" (1)
str.replace(str.begin(),str.begin()+6,"replace"); // "replace
phrase!!!" (3)
str.replace(str.begin()+8,str.begin()+14,"is coolness",7); // "replace is
cool!!!" (4)
str.replace(str.begin()+12,str.end()-4,4,'o'); // "replace is
cooool!!!" (5)
str.replace(str.begin()+11,str.end(),str4.begin(),str4.end());// "replace is
useful." (6)
std::cout << str << '\n';
return 0;
}
Output:
replace is useful.
reserve
// string::reserve
#include <iostream>
#include <fstream>
#include <string>
int main ()
{
std::string str;
file.seekg(0);
while (!file.eof())
{
str += file.get();
resize
// resizing string
#include <iostream>
#include <string>
int main ()
{
std::string str ("I like to code in C");
std::cout << str << '\n';
unsigned sz = str.size();
str.resize (sz+2,'+');
std::cout << str << '\n';
str.resize (14);
std::cout << str << '\n';
return 0;
}
Output:
I like to code in C
I like to code in C++
I like to code
substr
// string::substr
#include <iostream>
#include <string>
int main ()
{
std::string str="We think in generalities, but we live in details.";
// (quoting Alfred N. Whitehead)
std::cout << str2 << ' ' << str3 << '\n';
return 0;
}
swap
// swap strings
main ()
{
std::string buyer ("money");
std::string seller ("goods");
std::cout << "Before the swap, buyer has " << buyer;
std::cout << " and seller has " << seller << '\n';
seller.swap (buyer);
std::cout << " After the swap, buyer has " << buyer;
std::cout << " and seller has " << seller << '\n';
return 0;
}
Output:
Before the swap, buyer has money and seller has goods
After the swap, buyer has goods and seller has money
Librería math.h
Librería math.h es un archivo de cabecera de la biblioteca estándar . Muchas de sus funciones incluyen el uso
de números en coma flotante.
Nombre Descripción
acos arcocoseno
/* acos example */
#include <stdio.h> /* printf */
#include <math.h> /* acos */
#define PI 3.14159265
int main ()
{
double param, result;
param = 0.5;
result = acos (param) * 180.0 / PI;
printf ("The arc cosine of %f is %f degrees.\n", param,
result);
return 0;
}
asin arcoseno
atan arcotangente
atan2 arcotangente de dos parámetros
/* atan2 example */
#include <stdio.h> /* printf */
#define PI 3.14159265
int main ()
{
double x, y, result;
x = -10.0;
y = 10.0;
result = atan2 (y,x) * 180 / PI;
printf ("The arc tangent for (x=%f, y=%f) is %f degrees\n",
x, y, result );
return 0;
}
cos coseno
abs valor absoluto
fmod resto del punto flotante
printf ( "fmod of 5.3 / 2 is %f\n", fmod (5.3,2) );
printf ( "fmod of 18.5 / 4.2 is %f\n", fmod (18.5,4.2) );
Salidas:
/* sqrt example */
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
int main ()
{
double param, result;
param = 1024.0;
result = sqrt (param);
printf ("sqrt(%f) = %f\n", param, result );
return 0;
}
Salida
sqrt(1024.000000) = 32.000000
tan tangente
El puntero es una técnica muy potente que hace que la programación C++ sea tan utilizada. La técnica
de punteros apoya a la programación orientada a objetos, que es una de las grandes diferencias entre
C y C++.
Referencias
Una clase es la descripción de un tipo de objeto. La descripción abarca la definición de los distintos
atributos y métodos inherentes al objeto.
Sintaxis:
class tipo_objeto
{
public:
tipo_dato metodo1 (parámetros);
:
tipo_dato metodoN (parámetros);
private:
tipo_dato atributo1;
:
tipo_dato atributoN;
};
En algunos casos se puede pensar en la declaración de atributos en la parte publica y asi mismo el declarar
métodos en la parte privada.
La parte pública de la clase implica que los elementos definidos en este bloque solo se pueden manipular en
cualquier lugar del programa a través de un identificador de acceso (variable o arreglo). La parte privada de la
clase implica que los elementos definidos en este bloque solo se pueden manipular solo por métodos definidos
en la parte pública.
Constructores.
Cuando se crean objetos, una de las operaciones más comunes que se realizan sus programas es inicializar los
datos miembros del objeto. Para simplificar el proceso de inicialización de los datos miembros de la clase, el
C++ proporciona una función constructora que se ejecuta por si sola cada vez que se crea un objeto. A
continuación se presentan las siguientes características de los constructores:
Las funciones constructoras son métodos de la clase que facilitan a los programas la inicialización de los
datos miembros de la clase.
Cada vez que el programa crea un objeto de la clase, C++ llama a la función constructora de la clase, si
existe.
Pueden existir varias funciones constructoras, pero con diferentes parámetros, esto se conoce como
sobrecarga.
Destructores.
Una función destructora automáticamente se ejecuta cada vez que se finalice la ejecución de un programa.
Muchos de los objetos pueden asignar memoria para almacenar información, cuando se descarta a un objeto, el
C++ llama a una función destructora especial que puede liberar dicha memoria, limpiando la basura dejada por
la desaparición del objeto. A continuación se presentan las siguientes características de los constructores:
Las funciones destructoras tienen el mismo nombre que la clase, con la excepción de que debe
anteponer a su nombre el carácter tilde (~).
Funciones Amigas
Una función amiga de una clase se define por fuera del alcance directo de los miembros privados de dicha
clase, pero aún así tiene el derecho de acceso a los miembros private de la clase. Se puede declarar una función
o toda una clase como friend de otra clase. Para declarar una función como friend en una clase, en la definición
de clase procede el prototipo de la función con la palabra reservada friend.
class tipo_objeto
{
friend tipo_dato funcionamiga (tipo_objeto *, parámetros);
public:
:
private:
:
};
tipo_dato funcionamiga (tipo_objeto *, parámetros)
{
instrucciones;
}
Ejercicios Resueltos
class empleado
{
public:
void leer_empleado(void);
void mostrar_empleado(void);
char nombre[15];
long numero_empleado;
float salario;
};
void empleado::leer_empleado(void)
{
cout<< "Nombre:";
cin >> nombre;
cout<< "Número:";
cin >> numero_empleado;
cout<< "Salario: Bs.";
cin >> salario;
}
void empleado::mostrar_empleado(void)
{
cout << "Nombre: " << nombre << endl;
cout << "Número: " << numero_empleado << endl;
cout << "Salario: Bs." << salario << endl;
}
void main()
{
empleado trabajador;
clrscr();
trabajador.leer_empleado();
cout<<"\nResultado después de la lectura...\n";
trabajador.mostrar_empleado();
#include <iostream.h>
#include <conio.h>
class empleado
{
public:
void leer_empleado(void);
void mostrar_empleado(void);
private:
char nombre[15];
long numero_empleado;
float salario;
};
void empleado::leer_empleado(void)
{
cout<< "Nombre:";
cin >> nombre;
cout<< "Número:";
cin >> numero_empleado;
cout<< "Salario: Bs.";
cin >> salario;
}
void empleado::mostrar_empleado(void)
{
cout<<"\t"<<nombre<<"\t"<<numero_empleado<<"\t"<<salario<< endl;
}
void main()
{
empleado trabajador[5];
clrscr();
for (int i=0; i<5; i++)
{
cout<<"Empleado "<<i+1<<endl;
trabajador[i].leer_empleado();
}
clrscr();
cout<<"\n\tListado de Empleados\n";
cout<<"\tNombre\tNumero\tSalario Bs.\n\n";
for (int i=0; i<5; i++)
trabajador[i].mostrar_empleado();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <conio.h>
class perros
{
public:
void perros::mostrar_raza(void)
{
cout << "Raza: " << raza << endl;
cout << "Peso promedio: " << peso_promedio << endl;
cout << "Altura promedio: " << altura_promedio << endl;
}
void main()
{
perros canito, canuto;
strcpy(canito.raza,"Doberman");
canito.peso_promedio = 58;
canito.altura_promedio = 25;
clrscr();
cout<<"\nResultados después de la lectura...\n\n";
cout<<"Los datos de Canito son:\n";
canito.mostrar_raza();
cout<<"\nLos datos de Canuto son:\n";
canuto.mostrar_raza();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <conio.h>
class empleado
{
public:
int asignar_valores(char *, long, float);
void mostrar_empleado(void);
void cambiar_salario(void);
private:
char nombre[15];
long numero;
float salario;
};
void empleado::mostrar_empleado(void)
{
cout << "Empleado: " << nombre << endl;
cout << "Número: " << numero << endl;
cout << "Salario: Bs." << salario << endl;
}
void main()
{
empleado trabajador;
#include <iostream.h>
#include <string.h>
#include <conio.h>
#define ENTER 13
class empleado
{
public:
void leer_clave(void);
void validar_clave(char *);
private:
void asignar_valores(void);
void mostrar_empleado(void);
char clave[6];
char nombre[15];
float salario;
void empleado::leer_clave(void)
{
int j=0;
char t_clave[6];
do
{
t_clave[j]=getch();
if (t_clave[j]!=ENTER) cout<<"*";
j++;
}
while (t_clave[j-1]!=ENTER);
t_clave[j-1]='\0';
validar_clave(t_clave);
}
void empleado::asignar_valores(void)
{
cout<< "\nNombre:";
cin >> nombre;
cout<< "Salario: Bs.";
cin >> salario;
}
void empleado::mostrar_empleado(void)
{
cout << "\nEmpleado: " << nombre << endl;
cout << "Salario: Bs." << salario << endl;
}
void main()
{
empleado acceso;
#include <iostream.h>
#include <conio.h>
void main()
{
clrscr();
tiempo t; // t es una variable objeto de tipo tiempo
cout << "El tiempo inicial en formato militar es -> ";
t.imprimir_formato_militar ();
#include <iostream.h>
#include <conio.h>
class entero
{
public:
entero()
{
x=2;
};
void mostrar_valor(void);
private:
int x;
};
void entero::mostrar_valor(void)
{
cout<<x;
}
void main(void)
{
entero vec[10];
clrscr();
for (int i=0; i<10; i++)
{
cout<<"\nEl valor de vec["<<i<<"]:";
vec[i].mostrar_valor();
}
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <string.h>
#include <conio.h>
class empleado
{
public:
empleado(char *, int, float);
void mostrar_empleado(void);
private:
char nombre[15];
void empleado::mostrar_empleado(void)
{
cout << "\nEmpleado: " << nombre << endl;
cout << "Número: " << numero << endl;
cout << "Salario: Bs." << salario << endl;
}
void main()
{
char nom[15];
float sal;
int num;
cout<< "Nombre:";
cin >> nom;
cout<< "Número:";
cin >> num;
cout<< "Salario: Bs.";
cin >> sal;
empleado trabajador(nom, num, sal);
cout<<"\n\nLos datos almacenados después de ejecutarse la función
constructora";
trabajador.mostrar_empleado();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <string.h>
#include <conio.h>
class empleado
{
public:
empleado(char *, long, float);
empleado(char *, long);
void mostrar_empleado(void);
int cambiar_salario(float);
long leer_numero(void);
private:
char nombre[25];
long numero_empleado;
float salario;
};
void empleado::mostrar_empleado(void)
{
cout << "Empleado: " << nombre << endl;
cout << "Número: " << numero_empleado << endl;
cout << "Salario: Bs." << salario << endl;
}
void main()
{
empleado trabajador("Feliz Guerra", 101, 10101.0);
empleado gerente("Juana Pérez", 102);
trabajador.mostrar_empleado();
gerente.mostrar_empleado();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <string.h>
#include <conio.h>
class empleado
{
public:
empleado(char *, int, float);
~empleado(void);
void mostrar_empleado(void);
private:
char nombre[15];
int numero;
float salario;
};
empleado::~empleado(void)
{
cout<<"\n\nDestruyendo el objeto para "<< nombre<< endl;
getch();
}
void empleado::mostrar_empleado(void)
void main()
{
char nom[15];
float sal;
int num;
cout<< "Nombre:";
cin >> nom;
cout<< "Número:";
cin >> num;
cout<< "Salario: Bs.";
cin >> sal;
empleado trabajador(nom, num, sal);
cout<<"\n\nLos datos almacenados después de ejecutarse la función constructora";
trabajador.mostrar_empleado();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
//Programa 11: Implementación de una clase cadena para crear y manipular objetos
tipo cadenas de caracteres.
#include <iostream.h>
#include <string.h>
#include <conio.h>
class cadena
{
public:
cadena(char *); // Constructor
void sumar_cadena(char *);
void restar_caracter(char);
void mostrar_cadena(void);
private:
char datos[100];
};
cadena::cadena(char *letras)
{
strcpy(datos, letras);
}
void main()
{
cadena titulo("Aprenda Programación Orientada a Objetos en C++");
cadena tema("Entienda la sobrecarga de operadores");
titulo.mostrar_cadena();
titulo.sumar_cadena(" paso a paso!");
titulo.mostrar_cadena();
tema.mostrar_cadena();
tema.restar_caracter('r');
tema.mostrar_cadena();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <conio.h>
class numero
{
friend void asignar_valor(numero *,int );
public:
numero(){x=0;}
void imprimir(void);
private:
int x;
};
void numero::imprimir(void)
{
cout << x << endl;
}
void main()
{
int n;
numero m;
cout<<"El valor de la variable x antes de activar la función amiga: ";
m.imprimir();
cout<<"Dar un valor para x:";
cin>>n;
asignar_valor(&m,n);
cout<<"El valor de la variable x después de activar la función amiga: ";
m.imprimir();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <conio.h>
class entero
{
friend float suma_condicionada(entero *, int &);
public:
void cargar();
private:
float y;
};
void entero::cargar()
{
cin>>y;
}
void main()
{
entero vec[100];
float pro, acum=0;
char resp;
int i=-1,con=0;
do
{
i++;
cout<<"Dar valor "<<i+1<<":";
vec[i].cargar();
cout<<"Desea cargar otro valor (s/n):";
resp=getch();
resp=toupper(resp);
cout<<endl;
}
while (resp=='S'||i>=100);
for (int j=0; j<=i; j++)
{
acum+=(suma_condicionada(&vec[j],con));
}
pro=acum/con;
printf ("El promedio de los valores condicionados es de:%.2f",pro);
cout<<"\nPresione una Tecla para Continuar";
getch();
}
//Programa 14: Implementación de una función amiga dentro de una clase perteneciente a
otra clase.
#include <iostream.h>
#include <string.h>
#include <conio.h>
class biblioteca
{
public:
void cambiar_catalogo(libro *, char *);
};
class libro
{
public:
libro(char *, char *, char *);
void mostrar_libro(void);
friend void biblioteca::cambiar_catalogo(libro *,char *);
private:
char titulo[25];
char autor[25];
char catalogo[25];
};
void libro::mostrar_libro(void)
{
cout << "Título: " << titulo << endl;
cout << "Autor: " << autor << endl;
cout << "Catálogo: " << catalogo << "\n\n";
}
void main()
{
libro programacion("Aprenda C++ paso a paso"," Ing. Informatica","
Principiantes");
programacion.mostrar_libro();
biblioteca bibliotecario;
bibliotecario.cambiar_catalogo(&programacion,"Como aprender en C++ funciones
amigas");
programacion.mostrar_libro();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
Herencia
En un material previo se definio la herencia como la habilidad que tiene una clase derivada de heredar las
características de una clase base existente. En este material se indicará la manera de cómo programar una
herencia simple y múltiple, y una cadena de herencia respectivamente.
Herencia Simple
class BASE
{
public:
BASE (tipo_dato1,...,tipo_datoN);
:
//Otros métodos
private:
tipo_dato atributo1;
:
tipo_dato atributoN;
};
class DERIVADA: public BASE
{
public:
DERIVADA (tipo_dato1,...,tipo_datoM);
:
//Otros métodos
private:
tipo_dato atributo[N+1];
:
tipo_dato atributoM;
};
DERIVADA::DERIVADA (tipo_dato param1,... ,tipo_dato paramM)
:BASE (param1,... ,paramN) //No incluye el tipo
de dato
{
//Asignación de los valores de los parámetros
//a los atributos de la clase derivada
}
//Cuerpo Principal
DERIVADA identificador (valor1,...,valorM);
Herencia Múltiple
Ejercicios Resueltos
//Programa 1: Herencia simple entre la clase base EMPLEADO y la clase derivada
//GERENTE.
#include <iostream.h>
#include <string.h>
#include <conio.h>
class empleado
{
public:
empleado(char *, char *, float);
void mostrar_empleado(void);
void empleado::mostrar_empleado(void)
{
cout << "\nNombre: " << nombre << endl;
cout << "Puesto: " << puesto << endl;
cout << "Salario: Bs." << salario << endl;
}
gerente::gerente(char *t_nom, char *t_pue, char *t_aut, float t_sal, float t_bono,
int t_acc):empleado(t_nom,t_pue,t_sal)
{
strcpy(automovil, t_aut);
bono = t_bono;
acciones = t_acc;
}
void gerente::mostrar_gerente(void)
{
mostrar_empleado();
cout << "Automóvil de la Empresa: " << automovil << endl;
cout << "Bonificacion Anual: Bs." << bono << endl;
cout << "Acciones de la Empresa: " << acciones << endl;
}
void main()
{
empleado trabajador("Juan Pérez","Programador",850000);
gerente jefe("Carmen Gómez","Vicepresidente","Corsa",2500000,30000,500);
trabajador.mostrar_empleado();
jefe.mostrar_gerente();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <string.h>
#include <conio.h>
class libro
void ficha_prestamo::mostrar_ficha(void)
{
mostrar_libro();
cout << "Numero de dias del Prestamo: " << entrega << endl;
if (prestado)
cout << "Estado: No disponible" << endl;
else
cout << "Estado: Disponible" << endl;
}
void main()
{
ficha_prestamo ficha("Herencia en C++","Carmen Cordero",272,3,0);
ficha.mostrar_ficha();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <string.h>
#include <conio.h>
void empleado::mostrar_empleado(void)
{
cout << "Nombre: " << nombre << endl;
cout << "Puesto: " << puesto << endl;
cout << "Salario: Bs." << salario << endl;
}
void gerente::mostrar_gerente(void)
{
mostrar_empleado();
cout << "Automóvil de la Empresa: " << automovil << endl;
cout << "Bonificacion Anual: Bs." << bono << endl;
cout << "Acciones de la Empresa: " << acciones << endl;
}
void main()
{
gerente jefe("Carmen Gómez","Vicepresidente","Corsa",2500000,30000,500);
jefe.mostrar_gerente();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <string.h>
#include <conio.h>
class libro
{
public:
void ficha_prestamo::mostrar_ficha(void)
{
cout << "Título: " << titulo << endl;
cout << "Autor: " << autor << endl;
cout << "Páginas: " << paginas << endl;
cout << "Numero de dias del Prestamo: " << entrega << endl;
if (prestado)
cout << "Estado: No disponible" << endl;
else
cout << "Estado: Disponible" << endl;
}
void main()
{
ficha_prestamo ficha("Herencia en C++","Carmen Cordero",272,3,0);
ficha.mostrar_ficha();
cout<<"\nPresione una Tecla para Continuar";
getch();
}
#include <iostream.h>
#include <string.h>
#include <conio.h>
class empleado
{
public:
empleado (char *, char *, char *, char *);
void mostrar_empleado (void);
private:
char nombre [20];
#include <iostream.h>
#include <string.h>
#include <conio.h>
class monitor
{
public:
monitor(char *, long, int, int);
void mostrar_pantalla(void);
private:
char tipo[32];
long colores;
int resolucion_x;
int resolucion_y;
};
class tarjeta
void tarjeta::mostrar_tarjeta(void)
{
cout << "Procesador: " << procesador << endl;
cout << "Velocidad: " << velocidad << " Mhz" << endl;
}
void main()
{
Polimorfismo
Mediante las funciones virtuales y el polimorfismo, se hace posible diseñar y poner en práctica sistemas
que son de mayor facilidad extensibles. Se pueden escribir programas para procesar objetos de clases existentes
y de clases que aun no existan cuando el programa esté en desarrollo. Si esas clases deben ser derivadas de
clases base que el programa conozca, éste puede proporcionar un marco general para manipular los objetos de
las clases base, y los objetos de las clases derivadas encajarán bien dentro de este marco general.
Suponga un conjunto de clases de figuras, como circulo, triángulo, rectángulo y cuadrado, todas ellas
derivadas de la clase base figura. En la programación orientada a objetos cada una de estas clases estaría
investida con la capacidad de dibujarse a si misma. Aunque cada clase tiene su propia función miembro dibujar, la
función dibujar correspondiente a cada figura es bien distinta. Cuando se dibuja una forma, cualquiera que ésta
sea, sería agradable tener la capacidad de tratar todas estas formas en una genérica, como objetos de la clase
base figura. Entonces al dibujar cualquier figura, solo se llamaría a la función dibujar de la clase base figura, y
dejariamos que el programa determinase en forma dinámica (es decir, en tiempo de ejecución) cual de las
funciones dibujar de las clases derivadas utilizar.
Para habilitar este tipo de comportamiento se declara el método dibujar en la clase base en forma de una
función virtual, a continuación, en cada una de las clases derivadas redefinimos dibujar, a fin de que se dibuje la
forma apropiada. Se declara una función virtual en la clase base precediendo el prototipo de función con la
palabra reservada virtual. Una clase con funciones virtuales se hace abstracta al declarar una o más de sus
funciones virtuales como puras. Una función virtual pura es aquella que en su declaración contenga un
inicializador de = 0.
Ejercicios Resueltos
//Programa 1: Implementación de una función virtual y polimorfismo.
#include <iostream.h>
#include <string.h>
#include <conio.h>
class Base
{
void main()
{
Base b, *p;
Derivada1 d1;
Derivada2 d2;
p=&b;
p->f();
p->g();
p=&d1;
p->f();
p->g();
p=&d2;
p->f();
p->g();
#include <iostream.h>
#include <string.h>
#include <conio.h>
class Base
{
public:
virtual void f() {cout<<"f(): Clase Base !"<<endl;}
virtual void g() {cout<<"g(): Clase Base !"<<endl;};
};
void main()
{
Base b, *p;
Derivada1 d1;
Derivada2 d2;
p=&b;
p->f();
p->g();
p=&d1;
p->f();
p->g();
p=&d2;
p->f();
p->g();
#include <iostream.h>
#include <string.h>
#include <conio.h>
class telefono
{
public:
telefono (char *, int );
virtual void marcaje (char *);
protected:
char numero_telefonico[32];
int volumen;
};
void main()
{
por_tono oficina ("5326-5614", 5);
con_disco casa ("5355-5555", 2);
celular = &casa;
celular->marcaje ("5555-3434");
celular = &oficina;
celular->marcaje ("6666-8888");
#include <string.h>
#include <conio.h>
class telefono_abstracto
{
public:
telefono_abstracto (char *, int);
virtual void marcaje (char *marcar_numero)=0;
protected:
char numero_telefonico[32];
int volumen;
};
void main( )
{
por_tono oficina ("5326-5614",5);
oficina.marcaje ("5326-5538");
telefono_abstracto *p;
p=&oficina;
p->marcaje("7877-9992");
cout<<"\nPresione una Tecla para Continuar";
system(“pause”);
}
Templates
INTRODUCCIÓN
Las técnicas de Templates en C++, permiten un grado de programación genérica, creando códigos especiales
para problemas especializados.
Por ejemplo, la idea del valor mínimo o máximo, se repite infinidad de veces en la programación, aunque los
objetos a evaluar varíen de un caso a otro por el tipo de datos. Sobre esta idea surgió un nuevo paradigma
denominado programación genérica o funcional.
La programación genérica está mucho más centrada en los algoritmos que en los datos y su postulado
fundamental puede sintetizarse en una palabra: generalización. Significa que, en la medida de lo posible, los
algoritmos deben ser parametrizados al máximo y expresados de la forma más independiente posible de
detalles concretos, permitiendo así que puedan servir para la mayor variedad posible de tipos y
estructuras de datos.
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
carácter.
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;
}
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 patrón con un simple código 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 factoría de ensamblaje, porque producen una variedad de objetos; es
decir, dado un material se produce un determinado artículo.
Las templates permiten parametrizar estas clases para adaptarlas a cualquier tipo. Así el cambio de las tres
sobrecargas, viene reemplazado siguiente Template:
template<class T>
T max(T a,T b)
{
return a>b?a:b;
}
#include <iostream>
using namespace std;
// 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';
cout << " El mayor de los char es : " << max(e,f)<< endl;
system("PAUSE");
return 0;
}
Se ha considerado que el template, radique en un archivo tipo header, donde se ha incluido la función
plantilla min(),
template<class | typename<id>[...]>
<tipo de retorno> <identificador>(<lista de parámetros>)
{
// cuerpo de la función
}
Considerar que el template radique en un archivo tipo header, donde se ha incluido la función plantilla min().
//Programa principal
#include <iostream>
#include <stdlib.h>
#include "minymax.h"
using namespace std
void main()
{
int x1=4,x2=3;
double y1=7.5,y2=8.3;
char c1='a',c2='A';
cout << "min int : " << min(x1,x2) << endl;
cout << "max double : " << max(y1,y2) << endl;
cout << "max char : " << max(c1,c2) << endl;
system("PAUSE");
}
IntToStr (Integer to String) Cambia del tipo de número entero a cadena de texto
StrToInt (String to Integer) Cambia del tipo cadena de texto a número entero
Otros:
StrToFloat (texto a decimal flotante) DateTimeToStr (Fecha/hora a texto)
FloatToStr (Decimal flotante a texto)) DateToStr (Fecha a Texto)
FloatToDecimal (Decimal flotante a decimal StrToTime (Texto a hora)
Formatfloat (Decimal flotante a texto con formato) StrToDate (Texto a fecha)
Ejercicio 1:
Crear una nueva aplicación VCL (librería visual C para Windows) escogiendo del menú: File New VCL Form
Applicaton C++ Builder.
En un formulario nuevo, desde la Tool palette, añade un
componente TButton (botón Button1). Desde el panel de
propiedades, cambia su propiedad Caption por: Aceptar
Pulsa doble clic sobre el botón e introduce el código (en el
evento OnClic del botón Button1) por:
Ejercicio 3. Contador:
StrToInt y InttoStr: Son funciones que convierten un valor de numérico entero (Integer) a texto (String) y viceversa
Recupera el ejercicio anterior.
Cambia el texto (propiedad caption) del botón por: 0
Añade un segundo botón a la ventana formulario desde la paleta
Tool palette – sección Standard: Tbutton
Al botón 2 cambia el texto (propiedad caption) por Contar
Pulsa doble clic encima de él, para abrir la ventana de código.
Entre las llaves { } debes escribir el código:
Button1->Caption= Button1->Caption +1;
Si lo ejecutas (run), verás cuenta mal porque añade la letra 1 pero no suma el número 1
Para ello hay que convertir las letras en números enteros: string to integer o abreviado: StrToInt
Button1->Caption = StrToInt(Button1->Caption) +1;
Si ahora lo ejecutas, verás que ya funciona.
Si funciona correctamente, guarda la aplicación: File – Save Project as.. El archivo de proyecto se llamará Contador.
File – Save as…Guarda la unidad como: Contador1.cpp
}}
En el siguiente código, cambia el error de clave (ShowMessage("Clave incorrecta” ) por una ventana de diálogo:
MessageDlg("Clave incorrecta",mtError,mbAbortRetryIgnore,0);
Preparación:
Creamos 2 variables públicas: Bueno: integer y Intentos: integer:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int bueno, intentos; // -> declaramos dos variables numéricas enteras públicas
Cocción:
Al crearse el formulario se genera un número aleatorio del 1 al 100 y se guarda en la variable bueno:
void fastcall TForm1::FormCreate(TObject *Sender)
{
randomize; //baraja
bueno=random(100); //crea un num aleatorio entre 0 y 100 y lo guarda en la variable bueno
intentos=0; //pone intentos a cero
}
Acciones: Al pulsar el botón, se crea una variable numerousuario y se evalúa si la variable es igual o mayor a
la variable bueno:
void fastcall TForm1::Button1Click(TObject *Sender)
{
int numerousuario; //declaramos una variable numérica entera privada válida sólo para esta función
numerousuario = StrToInt(Edit1->Text); //pasa valor de texto a numérico y lo guarda en la variable
if (numerousuario==bueno) {
ShowMessage("Acertaste");
}
else
{
ShowMessage("Fallaste, el número era el " + IntToStr(bueno));
}}
Mejoras:
if (numerousuario>bueno) {
ShowMessage("Fallaste, el número es más pequeño");
}
else
{
ShowMessage("Fallaste, el número es más grande");
}
}}
Mejora 2ª:
Añadir una barra de progreso: progressbar1 (paleta win32) Progressbar: Max: 60 Position: 60
Añadir un Temporizador: Timer (paleta system) Interval: 1000 (Repetirá el evento cada 1 segundo)
En el evento del timer OnTimer añadir el código para evaluar el tiempo tardado en acertar y decrementar la barra de
progreso. if (ProgressBar1->Position=0) {Showmessage('Se acabó el tiempo'); Timer1->enabled:=false;}
Mejora 3ª:
Al pulsar la tecla Enter en el Edit1 (Edit1KeyPress), llama a la función Button1Click:
if (Key==13) Button1Click(Sender);
Guardar: Guarda la aplicación (Save all).
La unidad con el nombre: adivinanza1.cpp y el proyecto con el nombre: adivinanza.cproj
Ejercicio 4: Conversor
Teoría previa:
StrToInt y InttoStr: Son funciones que convierten un valor de numérico entero (integer) a texto y viceversa
FloatToStr y StrToFloat: Convierten un valor de numérico decimal flotante (float) a texto y viceversa
Sender: Es un parámetro que indica el nombre del objeto que ha desencadenado el evento
Ejercicio:
Crear una nueva aplicación VCL (librería visual c para windows) escogiendo
del menú: File - New – VCL Form Applicaton C++ Builder.
En el formulario nuevo, desde la Tool palette, añade: 2 edits, 1 botón y 3
labels
Cambia la propiedad caption de las label y del botón para que muestre el
texto de la imagen.
Pulsa doble clic encima del botón para llamar al evento (on click)
void fastcall TForm1::Button1Click(TObject *Sender) y escribe:
Edit2->Text=Edit1->Text * 1.3;
Si no funciona correctamente escribe en su lugar:
Edit2->Text=StrToInt(Edit1->Text) * 1.3;
Si funciona correctamente, guarda toda la aplicación: Fila – Save all
El archivo de proyecto se llamará Conversor y la unidad: Conversor1.cpp
}
}
Edit1->Text=Edit2->Text/1.3;
En el evento onclick del botón 2 tienes que asignar el mismo evento que el del botón 1 para que ambos botones
llamen a la misma función.
Si funciona correctamente, guarda toda la aplicación: Fila – Save all.
Versión para Mobile Android: (Firemonkey. Para versiones de Embarcadero XE3 y superiores)
Para versiones XE3-XE4: Crear una nueva aplicación: File – New - Firemonkey – Mobile Application C++ Builder
Para versiones XE7-XE8: File - New - Multi-device application C++ Builder
Diseño: Header footer -
Guardar en la carpeta: conversor.
Añadir 2 labels, 2 Spinbox y 2 botones.
Cambiar las propiedades como en la figura:
Añadir el código a cada
botón: ButtonCmClick:
SpinBox2->Value=SpinBox1-
>Value*2.54;
ButtonPulgaClic
k:
SpinBox1->Value=SpinBox2-
>Value/2.54;
Pizarra de dibujo
Crear una nueva aplicación VCL (librería visual) escogiendo del menú: File - New – VCL Form Applicaton C++ Builder.
Cambiar el nombre y título del formulario principal: Con el inspector de objetos, cambiar la propiedad Caption por
PIZARRA y la propiedad Name por MainForm.
Guardar (File Save As) la unidad asociada al formulario (Unit1.cpp, por defecto) como PizarraUnit.cpp. El archivo
cabezera a Pizarrah.h y el proyecto (File | Save Project As) como Pizarra.bpr. o .cbproj
Poner icono: Para asignar un icono: (Project - Options Application). Puls: Load Icon… - Seleccionar un icono.
Temas en XE: Asignar un tema: Esoge (Project - Options - Application) - Appearance. Escoge: Amakrits. Asigna
el tema como Default y pulsa Ok
Ya podemos comprobar la apariencia del ejecutable: selecciona del menú: Project – Run.
Escribir el código.
En primer lugar, escribiremos el código asociado al evento OnPaint del componente PaintBox. Seleccionar en
el inspector de objetos dicho componente, y tras seleccionar la pestaña Events haremos doble click en el gestor
del evento OnPaint. El gestor de este evento quedará como sigue:
void __fastcall TMainForm::PaintBoxPaint(TObject
*Sender)
{
// Dibujar un círculo amarillo:
PaintBox->Canvas->Pen->Color = clBlack;
PaintBox->Canvas->Brush->Color = clYellow;
PaintBox->Canvas->Ellipse (100, 100, 150,
150);
// Dibujar un cuadrado rojo:
PaintBox->Canvas->Pen->Color = clRed;
PaintBox->Canvas->Brush->Color =
clRed;
PaintBox->Canvas->Rectangle (200, 100, 250, 150);
/*Si quisiera dibujar una linea en diagonal:
PaintBox->Canvas->MoveTo(0,PaintBox->Height/2);
PaintBox->Canvas->LineTo(PaintBox-
>Width,PaintBox-
>Height/2);
*/
} //----------------------------------------------------------------------
--
Finalmente, escribiremos el código asociado al evento OnClick del componente BitBtn (ExitBtn). Seleccionar
en el inspector de objetos dicho componente, y tras seleccionar la pestaña Events haremos doble click en el
gestor del evento OnClick. El gestor de este evento quedará como sigue:
void __fastcall TMainForm::ExitBtnClick(TObject *Sender) //---------------
--
{
Application->Terminate(); //-> termina la aplicación
//o también: MainForm->Close(); //-> cierra la ventana
} //------------------------------------------------------------------------
Generar el ejecutable:
Ahora podemos construir el ejecutable y probarlo: seleccionar Project Build Pizarra y a continuación, Run Run.
Guardar:
Para finalizar esta parte, Guarda todo (File Save All) Esto guardará: PizarraUnit.cpp - Pizarrah.h - Pizarra. .cbpro
Ejecuta y prueba (Run): Al arrastrar el mouse sobre el objeto Paintbox dibujará desde la coordenada que se indica en
PaintBoxMouseDown.
Guardar: Guarda todo (File Save All)
Dibujar previamente, desde Paint, 4 imágenes de una nave conteniendo las cuatro direcciones. Guardar en la
carpeta Naves.
{
//ShowMessage(Key); para test de tecla
switch (Key)
{
case 37: Nave->Left=Nave->Left-1;
//izda break;
case 38: Nave->Top=Nave->Top-1;
//arriba break;
case 39: Nave->Left=Nave->Left+1;
//derecha break;
case 40: Nave->Top=Nave->Top+1; //abajo
}
}
Variante con ImageList:
Borrar los 4 componentes de imagen y agregar un componente ImageList.
En el componente ImageList, agregar las 4 imágenes de posición de la nave
Cambiar el código anterior por:
switch (Key)
{
case 37: izquierda();
break;
case 38: arriba();
break;
case 39: derecha();
break;
case 40: abajo();
}
Crear las funciones:
void fastcall TForm1::izquierda()
{ImageList1->GetBitmap(2,Nave->Picture-
>Bitmap); Nave->Left=Nave->Left-1;}
void fastcall TForm1::arriba()
{ImageList1->GetBitmap(0,Nave->Picture-
>Bitmap); Nave->Top=Nave->Top-1; }
void fastcall TForm1::derecha()
{ImageList1->GetBitmap(3,Nave->Picture-
>Bitmap); Nave->Left=Nave->Left+1;}
void fastcall TForm1::abajo()
{ImageList1->GetBitmap(1,Nave->Picture-
>Bitmap); Nave->Top=Nave->Top+1;}
Declarar las funciones en el archivo cabecera h:
void fastcall
izquierda(); void
fastcall arriba(); void
fastcall derecha(); void
fastcall abajo();
Otras acciones:
Acciones Cortar, copiar y pegar: Estas acciones funcionan sin código escrito porque estás asociadas a una combinación
del teclado que se designa en la propiedad: ShortCut: Ctrl+X, Ctrl+C y Ctrl+V.
Acción Nuevo: FileNew1 - FileNew1Execute: añade el código: RichEdit1->Lines->Clear();
Accción Salir: FileExit1 - FileExit1Execute. Comprueba el código: Close(); ó Application->Terminate();
Accción Acrecade (Créditos): HelpAbout1 - HelpAbout1Execute. Comprueba el código:
AboutBox->ShowModal();
if (userResponse == mrYes) {
TextMemo->Clear();
currentFile = "";
}
}
}
Al abrir (Open)
void fastcall TTextEditorForm::FileOpen1Accept(TObject
*Sender)
{
// Get file name from TFileOpen component
String fileName = FileOpen1->Dialog->FileName;
if (FileExists(fileName)) {
TextMemo->Lines->LoadFromFile(fileName);
currentFile = fileName;
this->Caption = "Text Editor - " + ExtractFileName(fileName);
}
}
Al Guardar como
*Sender)
if (FileExists(fileName)) {
if (userResponse == mrNo) {
*Sender,
TextStatus->Panels->Items[ 0]->Text =
TextStatus->Panels->Items[ 1]->Text =
TextStatus->Panels->Items[ 2]->Text =
EEST N° 5 Amancio Willians 153
Prof. Abdala
"Lines: Achaval
" + IntToStr Pablo
(TextMemo->Lines->Count);
Juego de TATETI (modo visual)
Diseño:
Iniciamos nuevo proyecto: File – New – VCL Forms application C++
De la paleta Adicional, añadimos una rejilla StrinGrid.
Cambiamos sus propiedades:
Name: Tablero
ColCount t RowCount: 3
FixedCol y FixedRow: 0
ScrollBars: None
DefaultColWith y DefaultColHeight:50
Código:
Evaluar Movimiento del jugador: Pulsamos doble clic en el evento OnSelectCell del tablero para activar el procedure:
TableroSelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect)
Iniciar el Tablero: En el Form1 pulsa doble click sobre el evento void fastcall TForm1::IniciaClick(TObject *Sender)
del Button Inicia para descadenar la función: IniciaClick {
Aquí rellenamos el tablero de espacios en blanco para luego poder int i,j;
comparar con algo. Para ello utilizamos dos contadores para for (i = 0; i < 3; i++) {
incrementar fila y columna en la rejilla (grid) del tablero. for (j = 0; j < 3; j++) {
Tablero->Cells[i][j]=ESP;
Añade, al principio del código , la directiva:
}
#define ESP ' ' //-> ESPACIO en blanco }
}
Sobre el Form1 activa (doble clic) el evento Onshow: void fastcall TForm1::FormShow(TObject *Sender)
Este evento se desencadena al mostrarse el formulario, por lo {
tanto, llamamos aquí también a la función IniciaClick para que IniciaClick(Sender);
ya se nos prepare el tablero al iniciarse la aplicación: → }
Una vez programados los dos eventos anteriores, vamos a definir un evento común para las etiquetas, de forma que
al realizar un clic sobre la misma, se ha de generar una tirada aleatoria. Para realizar este proceso programamos el
evento onClick de la primera etiqueta.
Para posteriormente poder asociar el evento a las otras etiquetas, el evento que se está programando ha de capturar
el objeto sobre el cual se ha hecho clic y para ello si nos fijamos en el código observamos que la función recibe un
objeto denominado “Sender”, el cual es una referencia al objeto sobre el que se ha realizado la acción.
Para poder capturar el objeto y aplicar la programación, se ha de realizar la interpretación del objeto indicando que es
una etiqueta. Para aplicar esta interpretación se ha de realizar un “casting” del objeto con la orden dynamic_cast, una
vez realizada la conversión se puede interactuar con las propiedades del objeto. El código que se ha de teclear en la
función del evento es la siguiente:
Código fuente
void fastcall TForm1::Label1Click(TObject *Sender) Código Fuente unit1.cpp
{ #include <vcl.h>
// al hacer clic en la etiqueta se ha de volver a generar un numero TLabel *Label2;
// aleatorio para el dado seleccionado. TLabel *Label3;
// Para no tener que programar el evento para todas las TLabel *Label4;
etiquetas TLabel *Label5;
// utilizaremos el objeto Sender el cual almacena el objeto sobre TButton
// el que se ha realizado la acción. *Button2;
// para poder actual sobre el objeto realizamos una conversion o void fastcall Button1Click(TObject *Sender);
// casting sobre el objeto sender, al cual se le realiza una void fastcall Label1Click(TObject *Sender);
// conversion dinamica utilizando la orden dynamic_cast, a la cual void fastcall Button2Click(TObject
// se le indica el tipo de objeto sobre el cual realizar la conversion *Sender); private: // User declarations
// seguidamente se especifica el objeto recibido sender public: // User declarations
randomize(); fastcall TForm1(TComponent* Owner);
dynamic_cast <TLabel *>(Sender)->Caption = };
(rand()%6)+1; //---------------------------------------------------------------------------
} extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
Una vez finalizada la programación de los eventos
correspondientes, al ejecutar el programa se ha de
visualizar un formulario similar al que se muestra a
continuación.
- Pulsa en Diseño para crear la tabla de Usuarios con los campos de la imagen.
- El tipo será numérico entero con valor predeterminado 0.
- Cierra y guarda la tabla de Usuarios.
- Rellena al menos 3 usuarios y abandona Access al finalizar
Accede a RAD Studio y crea una nueva aplicación VCL escogiendo del menú:
File - New – VCL Form Applicaton C++ Builder.
Desde inspector de objetos, cambia la propiedad del formulario principal Caption por lista
Guarda (File Save As) en una carpeta nueva llamada Lista, Guarda el archivo fuente como Lista1.cpp. El archivo
cabezera: Listah.h y el proyecto (File | Save Project As) como: Lista.bpr. o .cbproj
Poner icono: Para asignar un icono: (Project - Options Application). Puls: Load Icon… - Seleccionar un icono.
Temas en XE: Escoge (Project - Options - Application) - Appearance. Escoge: Rubi Graphite como el tema y pulsa Ok
Componentes de diseño
De la paleta Win 32 añade un ToolBar y un StatusBar.
De la paleta DataControls, añade un DBGrid con su propiedad Align al cliente y un DBNavigator sobre la
toolBar1
En ambos componentes le asignamos su propiedad Datasource a
Ejecuta y prueba (Run). Si todo es correcto, Guarda todo (File Save All):
Añadir botón para filtrar usuarios:
void fastcall TVentanaAgenda::FiltrarClick(TObject *Sender)
Este botón filtrará la lista de usuarios para que sólo se {
vean los usuarios de tipo 0 if (Filtrar->Down==True) {
Filtrar->Down=False ;
TableUsuarios->Filtered=False;
}
else
{
Filtrar->Down=True;
TableUsuarios->Filter="tipo=0";
TableUsuarios->Filtered=True;
}
}
Luego añadir al evento OnShow de nuestro formulario principal (no OnCreate): PasswordDlg->ShowModal();
2. Ejecuta tu navegador
web (Chrome, Explorer,
EEST N° 5 Amancio Willians 163
Prof. Abdala Achaval Pablo
Mozilla…) y escribe en
el cuadro de la
dirección: localhost
Accederás a la página de presentación de Xampp.
Localhost equivale a usar
nuestra propia máquina local
como servidor de nuestra
página web. Es decir, emula la
dirección de nuestra web
desde nuestro ordenador.
3. En el panel de navegación
izquierdo de la página, pulsa
sobre: PhpMyAdmin.
Otra manera de acceder, es
escribir directamente, la
dirección:
localhost/phpmyadmin
Nota: la carpeta virtual localhost quedará localizado
normalmente en: C:\xampp\htdocs
4. Pulsa en Base de datos.
Luego escribe en el cuadro de
Crear base de datos el
nombre: Bancos. Escoge un
cotejamiento para el juego de
caracteres tipo Unicode
utf8_spanish o similar, para
evitar luego problemas
con los acentos y la ñ, como la imagen y pulsa el botón
Crear.
La base de datos Bancos contendrá tres tablas: una para las libretas de ahorros, con los
datos del titular. Otra tabla servirá para las operaciones en las libretas y la tercera tabla
contendrá los apuntes realizados en todas las libretas, asociando cada apunte con su
libreta mediante una relación entre campos.
Para facilitar la verificación de las reglas de consistencia observa que hemos añadido los
siguientes campos redundantes al esquema:
Tabla Columna Significado
Libretas Apuntes Número de apuntes en la libreta
Saldo Saldo acumulado
Fecha Fecha del último apunte
Apuntes Saldo Saldo en el momento de la operación
Crear la aplicación:
Elije del menú principal: File New VCL form Application.
Preparar el driver mysql:
Copiar todos los archivos *.dll de la carpeta xampp/mysql/lib
a la carpeta de C:\Program Files (x86)\Embarcadero\RAD Studio\XX\bin
El módulo de datos.
Crea un formulario: New Other C++ Builder files- Datamodule. Llámalo DM. La configuración
de las conexiones dependerá del formato que se esté utilizando para los datos: InterBase, Oracle,
MS SQL Server o MySql.
Métodos de conexión a la base de datos MySql:
Método utilizando el conector dbxExpress:
Con los servicios Xampp iniciados, añadir al
formulario el componente
Volver al IDE del programa, buscar la paleta DbGO. Añadir un componente ADOtable y un
ADOConection al formulario. Si sólo fuésemos a utilizar una tabla, podríamos añadir la
Conectionstring directamente en la AdoTable. Pero como utilizaremos tres tablas,
utilizaremos el componente ADOConection para introducir la cadena de conexión.
Propiedad Valor
Name tbApuntes
TableName Apuntes
MasterSource DSLibretas
La propiedad IndexFieldNames, han concatenado los campos MasterFields Codigo
Libreta y Numero, para que la tabla de detalles quede ordenada IndexFieldNames Libreta;Numero
efectivamente por el número de los apuntes.
Diseño del Form Principal:
La ventana principal será una ventana SDI, que mostrará los apuntes
correspondientes a una libreta seleccionada.
Propiedad Valor
EEST N° 5 Amancio Willians Name tbApuntes
167
Prof. Abdala Achaval Pablo
TableName Apuntes
MasterSource DSLibretas
La propiedad IndexFieldNames, han concatenado los campos
Ejercicios / Guía de Trabajos Prácticos
Ejercicio 1.A+B
Enunciado
Este es un sencillo problema de ejemplo, adecuado para probar que todo está funcionando
bien. La consigna es la siguiente: Dados dos números enteros A y B , calcular su suma, A + B .
Entrada: La entrada, que se recibe por cin , consta de dos enteros A y B , en una única línea,
separados por un espacio.
Salida : La salida, que se debe escribir por cout, consta del entero A + B , en una única línea.
Ejemplo: Si la entrada fuera: 1 2
La salida debería ser: 3
2. Si la entrada fuera: 10 10
La salida deberá ser:
10
x 10
----
100
3. Si la entrada fuera: 50 60
La salida deberá ser:
50
x 60
----
3000
Para N = 3 sería 2 − (1 + 3)
Para N = 6 sería (2 + 4 + 6) − (1 + 3 + 5)
Ejemplo
Si la entrada fuera: 6
Ejercicio 9 Pedir una cantidad de dólares y pasarla a pesos (21.37), mostrando el resultado.
Ejercicio 10 Pedir una cantidad de pesos y pasarla a dólares, mostrando el resultado.
Ejercicio 11 Leer 2 variables. Intercambiar su valor y mostrarlas por pantalla.
EEST N° 5 Amancio Willians 170
Prof. Abdala Achaval Pablo
Ejercicio 12. Pedir tres números al usuario y decir cuál es el mayor.
Ejercicio 13 Dados tres números, escribirlos en orden ascendente y descendente
Ejercicio 14 Escribir un programa para convertir una medida dada en pies a sus equivalentes
en
a) b) c) d)
Ejercicio 17 propuesto: Escribir un programa que acepte un año escrito en cifras arábigas y
visualice el año escrito en números romanos, dentro del rango 1000 a 2100.
IV= 4, XL= 40, CM=900, MCM= 1900, MCML= 1950, MCMLXXXIX= 1989
Como parte del trabajo de estudio, se han repartido la tarea de encontrar estos números,
dado que resulta bastante laborioso.
Para hacerle la tarea facil al grupo, se te pide que desarrolles un programa que encuentre
todos los números dentro de un rango que no son divisibles por ningún número menor o igual
que una cota dada.
Esto es, tienes que escribir un programa que dados tres naturales a, b y c, encuentre
todos los naturales i que cumplen que a i b y además i no es divisible por ningún divisor d
mayor que 1 y menor o igual a c.
• Ejercicio 1
El cifrado César, también conocido como cifrado por desplazamiento, es una de lastécnicas de
codificación de textos más simples y usadas. Es un tipo de cifrado por sustitución en el que una
letra en el texto original es reemplazada por otra letra que se encuentra un número fijo de
posiciones más adelante en el alfabeto. Por ejemplo, con un desplazamiento de 3 posiciones, la
A sería sustituida por la D (situada 3 lugares a la derecha de la A ), la B sería reemplazada por
la E, etc. Se supone que el alfabeto es circular de modo que, a todos los efectos, a
continuación de la Z comienzan de nuevo las letras A, B, C, etc.
Se propone que programe una función que recibiendo como parámetros una cadena de
caracteres escrita exclusivamente en mayúsculas y el desplazamiento, devuelva el texto
codificado. Debe tener en cuenta que sólo se codifican los caracteres correspondientes a las
letras del alfabeto, el resto de caracteres (letras minúsculas, espacios en blanco, signos de
puntuación, etc) permanecerán inalterados.
Ejemplo: Si el texto a codificar es: “UN TEXTO, y algo MAS” y la clave es 1 resultará “VO
UFYUP, y algo NBT”
• Ejercicio 2
Igual que el ejercicio 1, pero esta vez las letras minúsculas se transformarán en Mayúsculas, y
se codificarán junto con el resto del texto. El resto de símbolos del texto que no sean letras
(mayúsculas o minúsculas) se eliminarán del texto codificado.
Ejemplo: Si el texto a codificar es: “UN TEXTO, y algo MAS” y la clave es 1 resultará
“VOUFYUPZBMHPNBT”
• Ejercicio 3
Desarrolle un programa que permita decodificar el siguiente texto sabiendo que se encriptó
empleando la codificación CESAR con una clave desconocida (El texto no contiene espacios ni
signos de puntuación). Se sabe que el texto decodificado contiene la palabra FELIX como parte
de su texto.
LEGREXIRDRVJLEKVOKFHLVTFEKZVEVKFURJCRJCVKIRJUVCRSVTVURIZFLEVAVDGCFVJ
TRURMVQHLVKIRSRAFWVCZODVGRXRLENYZJB
Datos de entrada
Se recibe un archivo mensajes.in con el siguiente formato:
Una línea conteniendo un número indicando la cantidad L de letras de la secuencia base ( 1
= L = 100 ).
Una línea conteniendo L letras del alfabeto internacional a…z separadas por blanco.
Una línea conteniendo la palabra enviada, de largo l ( 2 = l = 10 ) formada también con
letras del alfabeto internacional a…z. datos de salida
Se debe generar un archivo mensajes.out conteniendo
Si es posible leer la palabra:
o una línea que diga SI
o una línea con la dirección de lectura: I si se lee de izquierda a derecha o
D si se lee en forma inversa.
Una línea conteniendo una imagen sin comprimir, con una longitud máxima de 250 letras.
Una línea con una imagen ya comprimida, con una longitud tal,
que una vez expandida no supere las 250 letras.
Datos de salida
Se debe generar un archivo imagenes.out conteniendo:
Una línea con la compresión de la imagen obtenida de la primera línea
del archivo de entrada.
Una línea con la descompresión de la imagen de la segunda línea del archivo de entrada.
Ejemplo
Si el archivo de imagenes.in de tu programa fuera el siguiente:
NNNNNNNNBRAVBRRRRRAAAAAAAVVVVV
(N5)(A6)VBNNN(R6)
El archivo imagenes.out debería ser:
(N8)BRAVB(R5)(A7)(V5)
NNNNNAAAAAAVBNNNRRRRRR
Una maestra se encuentra preparando un dictado para sus alumnos. Como desea incentivar la
participación de los niños, decidió modificar el esquema tradicional incorporando las siguientes
reglas:
• Solamente dictará las primeras P letras de la palabra.
• Los alumnos deberán completar la palabra con la menor cantidad
de letras al final para que la misma sea un palíndromo (palabra que es igual si se lee de
izquierda a derecha que de derecha a izquierda)
Por ejemplo, si la maestra dicta “hola” los alumnos deberán escribir “holaloh”. Es decir, que se
agregarán 3 letras a la palabra original.
Los archivos de texto de una computadora han sido afectados por un nuevo virus. Este virus
daña 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 carácter le
intercala el segundo carácter.
Por ejemplo si el texto original fuera aadabeaa y el virus elige como primer carácter a y
como segundo carácter b, el texto infectado será abadabeaba. Si el archivo de texto original
no contenía 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 que conociendo el texto infectado y los dos caracteres elegidos por el virus,
realice el proceso de desinfección del mismo. Tu programa sólo recibirá archivos que sean
desinfectables.
Datos de entrada
Restricciones
• Tanto los caracteres que elige el virus como los caracteres del texto pueden ser cualquier
letra del alfabeto, excepto la ñ, en minúsculas y sin acentos.
• La longitud máxima del texto a desinfectar es de 255 caracteres.
Ejemplo
12
caadeabfaeaa
Con frecuencia estas cadenas sufren mutaciones, pudiendo estas agregar una base, quitar una
base o reemplazar una base de la cadena por otra.
Debes escribir un programa que dadas dos cadenas de ADN de largo
N y M, determine la menor cantidad de mutaciones que pudo haber sufrido la primera cadena
para convertirse en la segunda cadena.
Si este número fuera mayor que K, presumiblemente no hubo una mutación de una a la otra y
en esos casos se debe escribir "Muy distintas.".
Datos de entrada
Ejemplo
Si la entrada adn.in fuera:
15 14 4
ATTCGCCCATACGCT
ATTCGGGCATACGT
La salida adn.out debe ser:
3
Ejercicio 9
Dada una expresión aritmética tal como la (a+b)*(c+d) se puede representar con la notación
polaca inversa de forma que cada operador va después de sus dos operandos de la forma:
ab+cd+*
Se trata de calcular una expresión dada en notación polaca inversa.
Datos de entrada:
El programa debe leer los datos de entrada del archivo NOPOIN.IN. En la primera línea figura
la expresión 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
expresión es sintácticamente correcta.
Datos de salida:
El archivo de salida NOPOIN.OUT consistirá de una sola línea donde aparece el entero que es
el valor de la expresión evaluada.
EJEMPLO:
NOPOIN.IN NOPOIN.OUT
10 8 + 4 2 - * 36
Dada una matriz de números enteros positivos, de N filas y M columnas, se debe determinar la
suma de cada fila y de cada columna.
Entrada: La entrada, consta de una primera lı́nea con dos números, N y M . Luego siguen N
lı́neas, cada una con M números x, que son los números de la matriz.
Salida
La primera lı́nea debe contener N números separados por un espacio: la suma de cada
fila, en orden de arriba hacia abajo.
La segunda lı́nea debe contener M números separados por un espacio: la suma de cada
columna, en orden de izquierda a derecha.
Cotas1 ≤ N, M, x ≤ 100
Ejemplo
Entrada Salida
4 3 9 18 9 6
2 3 4 12 14 16
5 6 7
4 3 2
1 2 3
0 3 -2 5
3 4 5 6
Ejercicio 5 Ingresar una matriz A(10,8), calcular e informar la suma de sus elementos.
Ejercicio 7 Entrada: Se tienen una matriz de N líneas, y M números para cada uno de estos i números,
0<i<10000.
Salida: Generar otra matriz que encuentre a qué grupo se refiere imprimiendo el número que lo
representa y el número de integrantes que tiene, deberá imprimir los grupos en orden primero el grupo
con más integrantes y por último el que menos integrantes tiene.
12233 18
11153 37
11353 53
13135 22
Ejercicio 8 Generar una matriz de NxN (N ingresada por el usuario < 100) con números aleatorios
menores a 5000. Guardar en un Vector todos los números abundantes (función recursiva) que se
encuentren en la matriz.
Número abundante: todo número natural que cumpla la condición que la suma de sus divisores
propios sea mayor que el propio número. 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.
12, 18, 20, 24, 30, 36, 40, 42, 48, 54, 56, 60, 66, 70, 72, 78, 80, 84, 88, 90, 96, 100, 102, …
la cual recibirá el valor por referencia y la variable val, dicha funcion devolvera true o false si
val existe en el vector.
que indicara si la carga fue de ambos fue igual o no. mostrar ambos vectores.
Ejercicio 11 Crear un programa que imprima el 25% del total de los elementos de un vector
de 12 posiciones.
Para pasar desapercibidos, algunos virus permutan trozos de instrucciones aprovechando, por ejemplo,
que el orden en que se ejecutan no afecta a la finalidad del virus. Si los trozos sujetos a un orden
arbitrario son muchos, la cantidad de patrones de los cuales debiera disponer el antivirus se haría
inmanejable. Esta característica de estos virus permite llamarlos polimorfos, o sea de muchas formas.
Para detectar su presencia se han estudiado los trozos que puede conmutar y para referirse a ellos se
han numerado 1, 2,... M. La presencia de uno de estos trozos no es significativa porque programas
normales también pueden realizar acciones similares.
Para detectar estos virus se ha diseñado la siguiente estrategia. En una primera etapa se descompone el
código en trozos de ejecución independiente. Estos se numeran con un número del rango 1 a M, o con
uno distinto según sea que ese trozo coincida con una acción del virus, o no concuerde,
respectivamente. El resultado de este primer análisis es transformar el programa en una secuencia de
números enteros que lo describen en un modo abreviado.
En una segunda etapa se espera detectar la presencia de los trozos del virus en posiciones consecutivas,
aunque sea en cualquier orden. Con más precisión, se considera que el virus está localizado en la
posición p si los elementos p, p+1,..., p+M-1 de la secuencia (que describe el programa) constituyen
una permutación de los números 1 a M (1 = M = 50.000 ).
Se pide tu colaboración para esta segunda etapa de análisis, escribiendo un programa que efectúe el
trabajo de localización. Es posible que el virus tenga múltiples localizaciones. Interesa encontrarlas
todas.
Los elementos de la secuencia que describe el programa tienen sus posiciones numeradas a partir de 1.
Por ejemplo, si la primera etapa produjera 1, -1, 3, 2, 4, 1, 2, 3, 6; y el virus tuviera cuatro trozos
habría una localización en 3 y otra en 5.
Datos de entrada
Se recibe un archivo polimorfo.in con:
• Una primera línea que contiene la cantidad de números N ( 1 = N = 2.000.000) que describen los
trozos del código a examinar, seguido de la cantidad de trozos M de código que posee el virus,
separados por un espacio.
• N líneas conteniendo cada una un número entero en el rango -100.000 a
+100.000 que describe un trozo de código.
Datos de salida
Se debe generar un archivo polimorfo.out conteniendo dos líneas:
• La primera línea contiene la cantidad de localizaciones del virus.
• La segunda línea contiene dichas localizaciones, si su cantidad fuera menor o igual a 10. De ser más de
10, las primeras 5 y las últimas 5. En ambos casos separadas por espacios.
Puntuación
Una solución correcta recibirá 100 puntos.
Ejemplo
EEST N° 5 Amancio Willians 181
Prof. Abdala Achaval Pablo
Si la entrada polimorfo.in fuera:
9 4
1
-1
3
2
4
1
2
3
6
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:
Escribir un programa que dada la lista de los pesos de las pertenencias de la familia, determine el peso
que cada camión deberá llevar para cumplir con los requerimientos de la empresa. Nota: No hay límite
para el peso que pueden cargar los camiones.
Entrada
La entrada deberá realizarse del archivo de texto mudanza.in. La primera línea contiene el número N
de pertenencias de la familia (10 ≤ N ≤ 10000, con N par). Las siguientes N líneas 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 números enteros.
Ejemplo:
mudanza.in mudanza.out
10 15871 17689
5320
21
34
17
100
286
9870
17605
12
295
Hilera de ladrillos
Recientes hallazgos en ruinas del lejano oriente aportan datos sobre las formas que los esclavos tenían
para distraerse durante las arduas jornadas en que se construyó la célebre muralla china.
En un viejísimo manual de juego se detallan las siguientes reglas: se construye una hilera de ladrillos y se
les asigna a cada uno un número. Pero esto siempre respetando la regla del juego, que indica que un
ladrillo tiene que tener un número equivalente a la suma de sus dos ladrillos predecesores en la hilera, si
los hubiera.
Algunos ladrillos tienen número asignado y otros están vacíos. La idea es que se deben completar con
números todos los ladrillos vacíos 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
números faltantes en los ladrillos de las hileras.
Datos de entrada
Los ladrillos vacíos los representaremos con un * (asterisco) y los números explícitos o desconocidos
de cada ladrillo serán enteros de -1.000.000.000 a +1.000.000.000.
Se recibe un archivo ladrillos.in del directorio actual, que contiene la descripción de una hilera de
ladrillos. La misma se describe por una primera línea que contiene un entero M, 1 ≤ M ≤ 45, que
representa la cantidad de ladrillos que componen la hilera.
A continuación, en una segunda línea el archivo contiene M datos, separados por blancos, detallando en
cada posición los números conocidos o espacios vacíos 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 solución con números enteros.
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)
g)
int *punta, *puntb;
int x=7;
int y=5;
punta=&x;
*punta=3;
puntb=&y;
*puntb=x;
x=9;
puntb=punta;
cout<<*puntb<<endl<<y; // ¿qué imprime este cout?
h)
int *punt,i;
int x[5]={1,2,3,4,5};
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;
EEST N° 5 Amancio Willians 185
Prof. Abdala Achaval Pablo
*(punt+2)=9;
*(x+3)=7 ;
punt[1]=11 ;
for(i=0;i<5;i++)
Cout<< *(punt+i) <<”/”<<; // ¿qué imprime este cout?
l)
int *punt,i;
int x[5]={1,2,3,4,5};
punt=x+4;
*(punt-2)=9;
punt--;
*(punt)=7 ;
punt[1]=11 ;
for(i=0;i<5;i++)
Cout<< *(punt+i) <<”/”<<; // ¿qué imprime este cout?
ll)
int *punt,i;
int x[5]={1,2,3,4,5};
punt=&x[0]+3;
*(punt-2)=9;
punt--;
*(punt)=7 ;
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‟;
}
EEST N° 5 Amancio Willians 186
Prof. Abdala Achaval Pablo
int main(){
int x=9;
float y=44.6;
char c=‟a‟;
datos (&x, &y, &c);
cout<< x<<”/”<< y<<”/”<< c<<; // ¿qué imprime este cout?
}
ñ)
void datos(int *x, float *y, char *c)
{
cout<< x<<”/”<< y<<”/”<<c<<; // ¿qué imprime este cout?
*x=8;
*y=4.2;
*c=‟g‟;
}
int main(){
int x=9;
float y=44.6;
char c=‟a‟;
datos (&x, &y, &c);
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( ){
EEST N° 5 Amancio Willians 187
Prof. Abdala Achaval Pablo
int x=9;
float y=44.6;
char c=‟a‟;
x=datos (x, y, c);
Cout<< x<<”/”<< y<<”/”<<c<<; // ¿qué imprime este cout?
}
q)
char datos(int *x, float *y, char *c)
{
Cout<< x<<”/”<< y<<”/”<<c<<; // ¿qué imprime este cout?
*x=8;
*y=4.2;
*c=‟g‟;
return „h‟ ;
}
int main( ){
int x=9;
float y=44.6;
char c=‟a‟;
c=datos (&x, &y, &c);
Cout<< x<<”/”<< y<<”/”<<c<<; // ¿qué imprime este cout?
}
r)
#include <stdio.h>
s)
#include <iostream.h>
EEST N° 5 Amancio Willians 188
Prof. Abdala Achaval Pablo
#include <stdio.h>
void inverso_array (int v[], int inv[], int & lon)
{
for(int i=0; i<lon ; i++)
{
*(inv+i)=*(v+(lon-(i+1)));
}
}
void main(){
int v[5]={2,3,4,5,6};
int inv[5]={0};
inverso_array(v, inv, 5);
for (int i=0; i<5; i++)
{
cout << *(inv+i) << " ";
}
}
t)
#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);
}
u)
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
#include <iostream.h>
#pragma argsused
int I(char *s);
EEST N° 5 Amancio Willians 189
Prof. Abdala Achaval Pablo
int main()
{
char *s= "Pablo Abdala Achaval";
I(s);
cout << s;
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;
}
}
1. El gobierno municipal ha realizado una encuesta, donde se han solicitado los datos más
relevantes, sobre la preferencia de los vehículos disponibles en el mercado, para determinar
cuales modelos se escogerán para la puesta en marcha de un plan denominado “FonBienes”.
Los datos registrados, para cada encuestado se refieren a: Nombre del encuestado, marca del
vehículo, modelo, monto disponible para entregar como cuota inicial y número de meses para
pagar. El gobierno desea un programa en C++, que posea las siguientes características:
b) Almacenar los datos recopilados en un arreglo de objetos. Utilice una función miembro
pública.
c) Generar un listado por pantalla con los nombres de aquellos encuestados que hayan
seleccionado vehículos de la marca “Ford” a excepción del modelo “Sport” y que requieran un
plazo mayor a dos años para cancelar el vehículo. Utilice una función miembro pública.
a) Una función amiga para cargar los datos de los atributos del objeto.
b) Una función miembro pública para validar el costo del libro (el costo debe se mayor a
400$.).
c) Una función miembro pública para asignarle al atributo “Observación” un valor con base a
la siguiente condición: Si el costo del libro es mayor a 6000 $. o la publicación del libro es
menor al año 2018, este libro no lo puede adquirir la universidad; en caso contrario el libro si
se lo puede adquirir la universidad.
d) Una función miembro pública para listar los datos de aquellos libros que la biblioteca no
puede adquirir.
e) Una función amiga para determinar el costo promedio de los libros de una determinada
editorial suministrada por el usuario.
3. Una inmobiliaria posee el registro para cado uno de los tipos de inmuebles que administra
(casas, quintas y apartamentos) y que están actualmente disponibles con los siguientes campos:
Nombre del propietario, tipo de transacción (venta o alquiler), costo de la transacción,
características del inmueble (cantidad de habitaciones, cantidad de baños, garage), para este
último atributo hacer uso de un campo tipo estructura. Escriba un programa en C++ para:
a) Almacenar los datos de la siguiente cantidad de inmuebles: seis casas, tres quintas y
cuatro apartamentos.
b) Calcular mediante una función amiga el costo promedio de las casas en venta.
6. En la sucursal Monolito del banco Provincia de Mar del Plata existe un gerente, tres
subgerentes y seis cajeros, cada uno de estos empleados mencionados poseen por jerarquia un
nombre de usuario y una contraseña iguales para tener acceso al sistema de transacciones u
operaciones de los clientes del banco. Diseñar un programa en C++ con menús de
operaciones para efectuar lo siguiente:
Los datos almacenados acerca de los clientes en el archivo son los siguientes: Nro. de cuenta,
Nro. de libreta, fecha de apertura de la cuenta (un campo de tipo estructura: dia, mes y año) y
nombre del cliente.
En otra clase independiente a los clientes manejar los datos de los empleados de los cuales se
tienen los siguientes datos privados y funciones miembros públicas: Nombre del empleado,
nombre de usuario, contraseña, tipo de empleado, sueldo y prima; cargar y listar los datos de
los empleados. Aplicar sobrecarga de funciones constructoras.
http://wiki.oia.unsam.edu.ar/curso-cpp
https://www.geeksforgeeks.org/c-plus-plus/
http://www.cplusplus.com/doc/tutorial/
http://www.stroustrup.com/C++.html
http://ejercicioscpp.blogspot.com.ar/p/teoria.html
https://blogdelingeniero1.wordpress.com/