República Bolivariana de Venezuela

Universidad Nacional Experimental del Táchira

Departamento de Ingeniería Informática

Computacion II-Ingeniería Electrónica (6010)
San Cristóbal-Venezuela

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E/S en C++ Builder
 

 

 

 

Parte I 

 

 


Tema Perteneciente a la Unidad Nº 4: Programación en C++ Builder.

 

 

 

 

 

 

 

 

 

 

 

 

 

Autor: Lcdo. José Froilán Guerrero Pulido

 

 

 

Abril, 2004

 

Estructura del Lenguaje C++ Builder

 

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( ).

 

 

Entrada y Salida de Datos en C++ Builder sin el uso de Componentes

 

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.