República Bolivariana de Venezuela
Universidad Nacional Experimental del Táchira
Departamento de Ingeniería Informática
Tema Perteneciente a la Unidad Nº
4: Programación en C++ Builder.
Autor: Lcdo. José Froilán Guerrero Pulido
C++ es uno de los lenguajes más
usados en el campo profesional, ya que este añade las posibilidades de
orientación a objetos que permiten simplificar el diseño de proyectos de gran
complejidad, todo ello sin sacrificar las características de bajo nivel que
permiten realizar llamadas a todo el API de Windows aprovechando todos los
recursos del sistema.
Un programa de C++ en su versión
más simple su función principal es el main( ). En el entorno de Windows
la función principal es el WinMain( ). El siguiente fragmento de código
corresponde a la sintaxis general de la función WinMain( ):
WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
instrucciones;
return 0;
}
La palabra WINAPI indica el tipo de
valor que devolverá la función, y los parámetros hacen referencia a los valores
que puede recibir WinMain( ).
Este aparte del material implica la
compilación de código con algún método de entrada y salida simple sin el uso de
la parte visual de C++ Builder. Las operaciones de entrada y salida se llevará
a cabo con las funciones: InputBox( ) y ShowMessage( ). Estas
funciones pertenecen al archivo de cabecera “dialogs.hpp”.
Para compilar y ejecutar un
programa con las funciones anteriores se debe seleccionar la opción “View
Source” del menú “Project”, esto abrirá una nueva ventana con el código
correspondiente al proyecto, que es en realidad el punto de inicio de cualquier
aplicación C++ Builder. Es de destacar que el compilador genera automáticamente
varios archivos con el mismo nombre del proyecto, es necesario conservar los
archivos con la extensión H, BPR, CPP y RES.
La función ShowMessage su
uso es para desplegar en una ventana de diálogo de salida un mensaje simple y/o
variables con valores de tipo char o AnsiString. El nombre del archivo
ejecutable aparece en la barra de título de la ventana de diálogo. AnsiString
( ) como constructor de la clase AnsiString permite hacer conversión de
cualquier tipo de dato de C++ al tipo cadena de caracteres. Cuando se presenta
en pantalla la ventana ocupa la parte central de la pantalla sobre la que se
está ejecutando la aplicación, dispone de un título en su parte superior que es
el nombre del proyecto y adicionalmente aparece el botón “OK” el cual permite
desaparecer la ventana en pantalla.
Sintaxis:
ShowMessage
(“Mensaje con o sin secuencias de escape” + variable_o_AnsiString (variable));
La función InputBox su uso
es para desplegar una ventana de diálogo de entrada, en donde el usuario pueda
introducir un solo valor a la vez en un cuadro de texto. Si el usuario escoge
el botón “Cancel”, InputBox devuelve el valor contenido en el cuadro de texto.
Si el usuario escoge el botón “OK”, InputBox devuelve el valor contenido en el
cuadro de texto. El primer parámetro de la función determina el nombre de la
barra de título de la ventana de diálogo; el segundo parámetro es el texto que
incita al usuario la entrada en la ventana de diálogo; y el tercer parámetro
determina el valor por defecto que aparecerá en el cuadro de texto en la
ventana de diálogo (en algunos casos solo se especifican las comillas
exclusivamente).
Sintaxis:
AnsiString variable = InputBox ("Título de la
Ventana", "Mensaje", "Valor por Defecto");
En algunos casos se deberá recurrir
a la función c_str ( ) que es un método la clase AnsiString. Esta
función permite hacer la conversión de un objeto de tipo AnsiString a un
carácter o cadena de caracteres (un dato tipo char). También será necesario
combinar la función anterior con cualquiera de las siguientes funciones
presentadas en la tabla (archivo de cabecera “stdlib.h”) en el caso de efectuar
procesos matemáticos en el programa.
Nombre de
Función |
Descripción |
atoi |
Convertir una cadena a un entero. |
atof |
Convertir una cadena a un real. |
atol |
Convertir una cadena a un entero largo. |
Operadores new y delete
A diferencia de lo que ocurre con
el espacio de memoria asignado por una variable, la memoria asignada por new
esta libre al comienzo del programa y sólo es reservada cuando se realiza la
llamada de este operador. Esto nos permite ocupar en cada momento solo la
porción de memoria necesaria, por lo que se denomina asignación dinámica. Una
vez que el bloque de memoria que se ha asignado con new ya no sea útil se
tendrá que liberar, ya que la liberación no se realiza automáticamente a través
del compilador. Para llevar a cabo esta operación se usa el operador delete que
permite la liberación de memoria reservada inicialmente por el operador new.
Ejercicios
Resueltos
/* Programa 1: Asignación de valores a variables de
diferentes tipos */
#include <dialogs.hpp>
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
int Contador = 5;
float N =
Contador + 1.0;
char Letra = 'B';
// Mostrar los
valores de las variables
ShowMessage
("Valores de las variables \n"
"--------------------------------- \n"
"Contador = " +
AnsiString(Contador) +
"\nN = " + AnsiString(N) +
"\nLetra = " +
AnsiString(Letra));
return 0;
}
/* Programa 2: Manejo
de estructuras y concatenación de cadenas de caracteres */
#include <dialogs.hpp>
struct Fecha
{
unsigned char dd, mm;
int aa;
};
struct Ficha
{
AnsiString Nombre,
Email; // Dos cadenas de caracteres
Fecha Nacimiento;
};
WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
Ficha Yo;
AnsiString cadena;
Yo.Nombre =
"Perez";
Yo.Email =
"perez@unet.edu.ve";
Yo.Nacimiento.dd
= 1;
Yo.Nacimiento.mm =
2;
Yo.Nacimiento.aa =
1967;
cadena =
"Datos Personales \n"
"------------------------ \n"
"Nombre = " + Yo.Nombre +
"\nEmail = " + Yo.Email+
"\nFecha de Nacimiento = "+
Yo.Nacimiento.dd +
"\\" +
Yo.Nacimiento.mm + "\\" +
AnsiString(Yo.Nacimiento.aa);
ShowMessage (cadena);
return 0;
}
/* Programa 3: Capturar un valor y convertirlo a su
correspondiente valor en ASCII */
#include <dialogs.hpp>
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
AnsiString Valor;
char Codigo; //
Almacenar el código ASCII
// Solicitar la
entrada de un valor
Valor =
InputBox("Entrada del código","Dar un número entre 0 y
255", "");
Codigo = (char)
atoi(Valor.c_str( )); // Convertir un número a caracter
ShowMessage("El carácter correspondiente a " + Valor + " es:" +
AnsiString(Codigo));
return 0;
}
/* Programa 4: Uso de la sentencia switch */
#include <dialogs.hpp>
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
AnsiString Entrada;
char Opcion;
Entrada =
InputBox("MultipleSwitch","Introduzca la opción deseada
(A-D):", "");
Opcion =
Entrada[1]; // Capturar el primer carácter del InputBox
switch (Opcion)
{
case 'A':
ShowMessage("Código de la opción A");
break;
case 'B':
ShowMessage("Código de la opción B");
break;
case 'C':
ShowMessage("Código de la opción C");
break;
case
'D':
ShowMessage("Código de la opción D");
break;
default:
ShowMessage("** Opción Incorrecta **");
}
return 0;
}
/* Programa 5: Uso de ciclos anidados para generar las tablas
de multiplicar del 1 al 10 */
#include <dialogs.hpp>
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
AnsiString Cadena;
for (int M = 1; M <= 10; M++)
{
for (int N = 1; N <= 10; N++)
Cadena += AnsiString(M) + "x" + AnsiString(N)
+ "=" + AnsiString(M*N) +
" ";
Cadena += "\n";
}
ShowMessage(Cadena);
return 0;
}
/* Programa 6: Determinar el promedio de notas de N
estudiantes */
#include <dialogs.hpp>
#include <stdlib.h>
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
AnsiString
Entrada1,Entrada2,Entrada3;
short cp=0,acum,nota;
float pro;
do
{
cp++;
Entrada1 =
InputBox("Promedio de Notas","Dar Nombre del Estudiante " +
AnsiString(cp) + ":","");
acum=0;
for (int i=1; i<=3; i++)
{
do
{
Entrada2 = InputBox("Promedio de Notas","Dar nota "
+ AnsiString(i) + " de " + Entrada1 + ":","");
nota
= atoi(Entrada2.c_str( ));
}
while
(nota<0 || nota>20);
acum
+=nota;
}
pro =
acum/3.0;
ShowMessage
("El promedio de notas de " + Entrada1 + " es: " +
AnsiString(pro) + " Puntos");
Entrada3 =
InputBox("Promedio de Notas","¿Desea procesar otro estudiante
(S/N)?:","");
}
while (Entrada3=="S"||Entrada3=="s");
return 0;
}
/* Programa 7: Parámetros por valor y por referencia */
#include <dialogs.hpp>
AnsiString Cadena;
int Numero, Numero1;
void Funcion1(int N1, int &N2)
{
Cadena +=
"Funcion1 \n";
N1 = 10;
N2 = 12;
}
void Funcion2(int &N1)
{
Cadena +=
"Funcion2 \n";
N1 = 25;
}
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
Cadena =
"Inicial " + AnsiString(Numero) + ", " +
AnsiString(Numero1) + "\n";
Funcion1(Numero,
Numero1);
Cadena +=
"Numero =" + AnsiString(Numero) + "\n Numero1 =" +
AnsiString(Numero1) + "\n";
Funcion2(Numero);
Cadena +=
"Numero =" + AnsiString(Numero);
MessageBeep(Numero*10000);
ShowMessage(Cadena);
return
0;
}
/* Programa 8: Procedimiento que recibe un vector de enteros
y calcula el cuadrado de cada valor */
#include <dialogs.hpp>
void Cuadrados (const int Numeros[ ], int NumElementos)
{
AnsiString Cadena = " ";
for (int N = 0; N
< NumElementos; N++)
Cadena +=
AnsiString(N+1) + ") Cuadrado de " + AnsiString(Numeros[N]) + "=
" +
AnsiString(Numeros[N]*Numeros[N]) + "\n";
ShowMessage(Cadena);
}
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
// Dos vectores de
tipo entero
int Serie1[3] =
{1, 2, 3}, Serie2[5] = {7, 9, 12, 18, 20};
Cuadrados (Serie1,
sizeof(Serie1)/sizeof(Serie1[0]));
Cuadrados (Serie2,
sizeof(Serie2)/sizeof(Serie2[0]));
return 0;
}
/* Programa 9: Prototipos de función para generar la tabla de
ASCII dentro de un rango de valores */
#include <dialogs.hpp>
AnsiString Cadena;
void Numero (int N);
void Caracter(int N)
{
Cadena = Cadena +
(char ) N + "\n";
if (N > 32) Numero(N-1);
}
void Numero(int N)
{
Cadena += AnsiString(N) + " : ";
if (N > 32) Caracter(N);
}
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
Numero(65);
ShowMessage(Cadena);
return
0;
}
/* Programa 10: Asignación Dinámica de Memoria */
#include <dialogs.hpp>
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
int *PNumero;
PNumero = new int;
// Asignar memoria a un dato tipo int
ShowMessage ("*PNumero = "
+ AnsiString(*PNumero));
*PNumero
= 5; // Modificar el valor
ShowMessage ("*PNumero = "
+ AnsiString(*PNumero));
delete
PNumero; // Liberar la memoria
asignada
return 0;
}
/* Programa 11: Asignación Dinámica de Memoria a un Vector */
#include <dialogs.hpp>
WINAPI WinMain (HINSTANCE, HINSTANCE,
LPSTR, int)
{
int * PNumero;
PNumero = new
int[5000]; // Asignar memoria para un vector de tipo int
PNumero[1] = 5;
PNumero[7] = 10;
ShowMessage("PNumero [1] = " + AnsiString(PNumero[1]) +
"\nPNumero [7] = " + AnsiString(PNumero[7]));
delete [ ]
PNumero; // Liberar la
memoria asignada al vector
return 0;
}
/* Programa 12-A: Diseño de un módulo de funciones
estadísticas */
// Página principal del proyecto que contiene el nombre del
proyecto
#include <vcl.h>
USEUNIT("Estadistica.cpp"); // Programa creado dentro del ámbito del
proyecto desarrollado
WINAPI WinMain(HINSTANCE, HINSTANCE,
LPSTR, int)
{
return 0;
}
// Página del proyecto que contiene el desarrollo de las
funciones estadísticas en el archivo: Estadistica.cpp
#include "Estadistica.h"
int Max(const int Elementos[ ], int
NumElementos)
{
int Maximo;
Maximo =
Elementos[0];
for (int N = 0; N
< NumElementos; N++)
if
(Elementos[N] > Maximo)
Maximo =
Elementos[N];
return Maximo;
}
int Min(const int Elementos[ ], int
NumElementos)
{
int Minimo;
Minimo =
Elementos[0];
for (int N = 0; N
< NumElementos; N++)
if (Elementos[N] < Minimo)
Minimo =
Elementos[N];
return Minimo;
}
int Sum(const int Elementos[ ], int
NumElementos)
{
int Suma = 0;
for (int N = 0; N
< NumElementos; N++)
Suma +=
Elementos[N];
return Suma;
}
float Med(const int Elementos[ ], int
NumElementos)
{
return
Sum(Elementos, NumElementos) / NumElementos;
}
// Página del proyecto que contiene la cabecera de archivo:
Estadistica.H
#ifndef EstadisticaH
#define EstadisticaH
const char *Version =
"2.0";
int Num (const int Elementos[ ], int
NumElementos);
int Max (const int Elementos[ ], int
NumElementos);
int Min (const int Elementos[ ], int
NumElementos);
int Sum (const int Elementos[ ], int
NumElementos);
float Med (const int Elementos[ ],
int NumElementos);
#endif
/* Programa 12-B: Implementación del módulo de funciones
estadísticas */
#include <vcl.h>
#include "Estadistica.H"
USEOBJ("Estadistica.obj");
WINAPI WinMain(HINSTANCE, HINSTANCE,
LPSTR, int)
{
int Matriz[ ] =
{15, 37, 12, 43, 67};
AnsiString Cadena;
Cadena =
"Versión del módulo= " + AnsiString(Version) + "\n";
Cadena = Cadena +
"Valor máximo= " + AnsiString(Max(Matriz,
sizeof(Matriz)/sizeof(Matriz[0]))) +
"\nValor mínimo= " +
AnsiString(Min(Matriz, sizeof(Matriz)/sizeof(Matriz[0]))) +
"\nSuma de los elementos= " +
AnsiString(Sum(Matriz, sizeof(Matriz)/sizeof(Matriz[0]))) +
"\nValor medio= " +
AnsiString(Med(Matriz, sizeof(Matriz)/sizeof(Matriz[0])));
ShowMessage(Cadena);
return 0;
}
Ejercicios
Propuestos
1) El Instituto Nacional de Deportes (IND) esta interesado
en promover el basketball y para ello necesita seleccionar personas que tengan
las siguientes características: EDAD: menor de 18 años, ESTATURA: mínimo 1.80 cm., y PESO: máximo 80 Kg.
Elabore un programa que le de entrada a los datos de los aspirantes, verifique
las condiciones y al que las cumpla imprima su nombre. Además se debe
determinar la altura promedio de los seleccionados y quien fue el aspirante de
menor edad. Suponga que se consultan 12
aspirantes.
2)
En una práctica de física se mide la temperatura de un cuerpo, cada media
hora, en grados Fahrenheit, y se necesita determinar, cada vez que se mide, si‚
ésta se encuentra por debajo, sobre o
si es igual a los 150 grados centígrados ( F = (9/5)*C + 32 ). Escriba un programa, que controle el
proceso, emitiendo un mensaje para cada caso. El proceso debe culminar cuando
el usuario lo decida.
3)
Una Empresa arrendadora de automóviles, necesita automatizar la
facturación de manera que cuando cada cliente que entregue el auto alquilado se
de entrada a la siguiente información:
Nombre del cliente, número de kilómetros que marcaba el auto cuando este
se recibió y cuando el cliente lo entregó.
Elabore un programa que permita:
a) Emitir inmediatamente la
factura a cada cliente que entregue un auto, indicando el monto a pagar de
acuerdo a la siguiente tarifa:
-
Bs. 6500: Si recorrió hasta un máximo de 560 Km.
-
Bs. 6500 + 2000 Bs./cada Km. adicional: Si recorrió entre 560 y 720 Km
(inclusive).
-
Bs. 6500 + (2000 Bs./cada Km. entre 560 y 720) + 1200 Bs./cada Km.
adicional: Si recorrió más de 720 Km.
b) Obtener el total recaudado en Bs., el número de
clientes que pagó la tarifa mínima, el cliente que pagó la mayor factura y el
porcentaje de clientes que pagaron entre 10350 y 18450 Bs.
4) La administración de un supermercado maneja la
siguiente información: Descripción de los artículos que ofrece al público,
cantidad en el almacén de los artículos al iniciar el mes, cantidad vendida de
cada uno de ellos al finalizar el mes y el precio de Venta en Bs. Se necesita
codificar un programa para:
a) Mostrar un listado de aquellos artículos, para los
que solo quedan menos de 10 unidades al final de mes.
b) Calcular el total de ventas, en Bs., al final del
mes.
c) Encontrar el articulo que se vendió en mayor
cantidad durante el mes.
d) Mostrar la cantidad al iniciar el mes, la cantidad
vendida al finalizar el mes y el precio de venta en Bs., de un articulo cuya
descripción sea solicitada al usuario para que sea introducida a través del
teclado.
e) Mostrar el nombre de aquellos artículos para los
que la cantidad que queda en almacén a fin de mes, sea mayor al 20%.
f)
Calcular el
porcentaje de artículos para los que la cantidad vendida sea menor al promedio.
5) Codifique un programa para almacenar un conjunto de
números enteros en un
arreglo unidimensional y determinar:
a) La cantidad de números impares en el conjunto.
b) El porcentaje de números múltiplos de 5.
c) El menor número entre los pares positivos.
6) Codifique un programa que utilice arreglos
unidimensionales. El programa debe:
a) Almacenar los datos de 10 empleados. Para cada
empleado se conoce: su nombre, el número de horas trabajadas y el departamento
al que pertenece.
b) Mostrar los valores almacenados de la siguiente
forma:
Número |
Nombre |
Horas/Trab. |
Departamento |
1 |
José López |
35 |
Contabilidad |
2 |
Luis Ruiz |
27 |
Ventas |
c) Determinar quien o quienes trabajaron el mayor
número de horas.
4) Una empresa de ventas a consignación, entrega a sus
vendedoras una cantidad de un secador de pelo. Al final de un cierto tiempo,
cada vendedora devuelve la cantidad sobrante de secadores. Conocidos: el nombre
de cada vendedora, la cantidad de secadores entregada por la empresa a cada
vendedora y la cantidad de secadores devueltos por cada vendedora, codifique un
programa para:
a) Almacenar en arreglos unidimensionales, los datos
conocidos.
b) Calcular la cantidad de secadores vendidos por cada
vendedora y almacenarlos en un nuevo arreglo.
c) Calcule el total de secadores vendidos por la
empresa.
d) Conocido el precio de costo unitario en Bs. y el
precio de venta unitario en Bs.. Obtenga: Ingreso total, costo total y ganancia
total para la empresa, expresados en Bs..
8) Una distribuidora de vehículos, ofrece a sus
clientes una diversidad de modelos, de los que destacan datos de importancia
como: Modelo del automóvil, el rendimiento expresado en Km./Litro y la capacidad
del tanque de combustible expresado en litros. Escriba un programa que use
arreglos unidimensionales y que permita:
a) Determinar los kilómetros que puede recorrer cada
modelo con un tanque lleno de combustible.
b) Encuentre el modelo o los modelos de mayor
rendimiento.
c) Calcule la cantidad de combustible que consumiría
cada uno de los modelos, para recorrer una cantidad de kilómetros suministrada
por el usuario.
d) Mostrar el rendimiento y la capacidad del tanque,
de un modelo suministrado por el usuario. La búsqueda del modelo debe concluir
en el momento en que sea encontrado, pero si el modelo solicitado no se
encuentra, el programa debe informarlo.
9) La Asociación de Músicos del Estado (AME) posee un
registro de cada uno de sus socios, con los datos: apellidos y nombres,
instrumento que ejecuta, agrupación al que pertenece e ingresos mensuales.
Codifique un programa usando funciones definidas por el usuario para:
a) Leer los datos y cargar en arreglos.
b) Calcular el porcentaje de socios que ejecutan
trombón.
c) Calcular el promedio de los ingresos.
d) Determinar cuantos socios ejecutan la trompeta y a
su vez pertenecen a la agrupación "EL TROMPETÓN".
10)
Conocidos los
siguientes datos de 10 estudiantes de una Universidad: Nombres y apellidos,
sexo (M: Masculino; F: Femenino), nacionalidad (venezolana ó extranjera),
estado civil (soltero ó casado), promedio de notas (Escala de 1 a 20), fecha de
nacimiento (Formato: día, mes, año), fecha de ingreso (Formato: día, mes, año)
y la fecha actual. Codifique un programa usando funciones definidas por el
usuario para:
a) Almacenar los datos en arreglos.
b) Imprimir el nombre de los estudiantes que reúnen
los requisitos para prestar el servicio militar. Dichos requisitos son: varón,
mayor de 18 años, venezolano y soltero.
c) Determine el porcentaje de estudiantes que reúnen
los requisitos para optar a una beca de estudios. Los requisitos son: promedio
superior a 7.0 puntos, inclusive, y no menos de 2 años de permanencia en la
Universidad.
11)
Un
banco debe calcular los intereses que afín de año habrá de acreditar a cada uno
de sus clientes. Los datos de cada cliente son organizados en estructuras, cada
uno de los cuales contiene los siguientes campos: Código del cliente, capital
depositado, fecha del depósito y la tasa de interés convenida. Codifique
un programa usando funciones definidas por el usuario para:
a) Almacenar en un arreglo de
estructura los datos de los clientes.
b) Calcular los intereses
anuales a cada cliente.
c) Emitir un listado de los códigos, el capital y los intereses
ganados, de aquellos clientes que hayan efectuado el deposito ente los meses de
Junio a Noviembre.
d)
Calcular
el porcentaje de clientes cuyos intereses hayan superado los Bs. 305000.
12)
La
empresa CASA, es una inmobiliaria que posee un registro para cada uno de los
inmuebles que administra y que están
actualmente disponibles, con los siguientes datos: Tipo de inmueble (casa,
quinta ó apartamento), nombre del propietario, tipo de transacción (venta o
alquiler), características del inmueble (cantidad de habitaciones, cantidad de
baños, con o sin teléfono) y costo de la transacción. Escriba un programa usando
funciones definidas por el usuario para:
a) Almacenar los datos en un
arreglo de estructuras.
b) Calcular el costo promedio
de las casas en venta.
c) Listar el nombre del
propietario y el costo de los apartamentos de 3 habitaciones, disponibles para
alquilar.