UNIDAD # 3 : OBJECT PASCAL - MiLenguaje | Just … · Web view3.2– Constantes y variables....

48
Curso rápido para aprender Delphi en el menos tiempo posible y con una buena calidad para realizar tus programas. UNIDAD # 3 : OBJECT PASCAL 3.1 – Introducción El lenguaje de programación Object Pascal que usamos en Delphi no fue inventado en 1995 con el entorno visual de desarrollo de Borland. Simplemente, era una extensión de Object Pascal, que ya se estaba usando en los productos Pascal de Borland. Pero Borland no inventó Pascal, sólo ayudó a hacerlo popular y lo extendió un poco. El lenguaje Pascal fue diseñado originalmente EN 1971 por Niklaus Wirth, profesor en el Politécnico de Zúrich, Suiza. Fue concebido como versión simplificada con fines educativos el lenguaje Algol, que data de 1960. Cuando Pascal fue diseñado, ya existían muchos lenguajes de programación, pero pocos eran de uso generalizado: FORTRAN, C, ensamblador, COBOL. La idea clave del nuevo lenguaje fue el orden , administrado mediante un concepto sólido de tipo de dato, y requiriendo declaraciones de tipo y controles de programa estructurados. El lenguaje fue diseñado también para ser un instrumento de enseñanza a estudiantes que aprendían a programar. A pesar de que la mayor parte del desarrollo de una aplicación con Delphi se realiza de forma visual, insertando componentes y modificando propiedades, ningún programa tendrá una aplicación práctica si tan solo cuenta con una interfaz, sin una interfaz, sin un código de programa que sea capaz de procesar las entradas de datos y generar unos resultados, o lo que es lo mismo, sin que el programa sea interactivo. Para esto necesitamos conocer el lenguaje que utiliza Delphi ya que de lo contrario difícilmente podremos escribir nada de código. Este lenguaje, llamado Object Pascal, es un heredero del Turbo Pascal de Borland y, seguramente, el 1

Transcript of UNIDAD # 3 : OBJECT PASCAL - MiLenguaje | Just … · Web view3.2– Constantes y variables....

Curso rápido para aprender Delphi en el menos tiempo posible y con una buena calidad para realizar tus

programas.

UNIDAD # 3 : OBJECT PASCAL

3.1 – Introducción

El lenguaje de programación Object Pascal que usamos en Delphi no fue inventado en 1995 con el entorno visual de desarrollo de Borland. Simplemente, era una extensión de Object Pascal, que ya se estaba usando en los productos Pascal de Borland. Pero Borland no inventó Pascal, sólo ayudó a hacerlo popular y lo extendió un poco. El lenguaje Pascal fue diseñado originalmente EN 1971 por Niklaus Wirth, profesor en el Politécnico de Zúrich, Suiza. Fue concebido como versión simplificada con fines educativos el lenguaje Algol, que data de 1960. Cuando Pascal fue diseñado, ya existían muchos lenguajes de programación, pero pocos eran de uso generalizado: FORTRAN, C, ensamblador, COBOL. La idea clave del nuevo lenguaje fue el orden, administrado mediante un concepto sólido de tipo de dato, y requiriendo declaraciones de tipo y controles de programa estructurados. El lenguaje fue diseñado también para ser un instrumento de enseñanza a estudiantes que aprendían a programar. A pesar de que la mayor parte del desarrollo de una aplicación con Delphi se realiza de forma visual, insertando componentes y modificando propiedades, ningún programa tendrá una aplicación práctica si tan solo cuenta con una interfaz, sin una interfaz, sin un código de programa que sea capaz de procesar las entradas de datos y generar unos resultados, o lo que es lo mismo, sin que el programa sea interactivo. Para esto necesitamos conocer el lenguaje que utiliza Delphi ya que de lo contrario difícilmente podremos escribir nada de código. Este lenguaje, llamado Object Pascal, es un heredero del Turbo Pascal de Borland y, seguramente, el Pascal más evolucionado que existe actualmente. Se trata de un lenguaje completamente estructurado, con orientación a objetos, claro y muy elegante en cuanto respecta a la claridad y eficacia del código. A lo largo de este capitulo vamos a conocer los fundamentos de Object Pascal con el fin de aprender a declarar variables, construir expresiones, conocer las estructuras de control y adquirir algunos conocimientos de las capacidades de orientación a objetos. Como se ha dicho, estos serán los fundamentos que nosotros necesitaremos para comenzar, pero Object Pascal es un lenguaje mucho más amplio y complejo, que difícilmente podríamos abarcar. Turbo Pascal El compilador de Pascal de Borland, famoso en todo el mundo, fue presentado en 1985. El compilador Turbo Pascal ha sido una de las series de compiladores que mejor se han vendido de todos los tiempos, e hizo de Pascal un lenguaje especialmente importante en la plataforma PC, gracias a su equilibrio entre simplicidad y potencia. Turbo Pascal introdujo un entorno integrado de programación (IDE) en que se podía editar el código (en un editor compatible con WordStar), ejecutar el compilador, ver los errores, y volver directamente a las líneas que contenían los errores. Ahora suena trivial,

1

pero antes de eso había que salir del editor, volver a MS-DOS, ejecutar el compilador de línea de comandos, anotar las líneas erróneas, abrir de nuevo el editor y buscarlas. Además, Borland puso a la venta Turbo Pascal por 49 dólares (USA), mientras que el compilador de Pascal de Microsoft estaba a unos cuantos cientos de dólares. Los muchos años de éxito de Turbo Pascal contribuyeron a que Microsoft finalmente retirase su compilador del mercado. El Pascal de Delphi Tras 9 versiones de compiladores de Turbo Pascal y Borland Pascal, que fueron extendiendo el lenguaje gradualmente, Borland puso a la venta Delphi en 1995, convirtiendo Pascal en un lenguaje de programación visual. Delphi extiende el lenguaje Pascal de muchas formas, incluyendo muchas extensiones orientadas a objetos que son distintas de otras versiones de Object Pascal, incluidas las del compilador Borland Pascal with Objects.

Antes que nada debemos aprender a guardar los proyectos en que vayamos trabajando. Para realizar esta tarea debemos primeramente abrir el Delphi. Luego de tenerlo abierto debemos guardarlo así tal y como aparece y luego ir salvando todo a medida que vayamos trabajando(si desea puede trabajar un poco primero, luego guardar y después seguir guardando a medida que vayamos trabajando). Para salvarlo debemos ir al menú principal y ver en File(Archivos) la opción saveprojectas(salvar proyecto como) y se abrirá la ventana de dialogo de guardar. Tienes que crear una carpeta en la cual guardarás el proyecto y luego le das salvar dentro de esta carpeta. Observe que te dice salvar dos veces(una para salvar la unit y la otra para salvar el proyecto).

Nota: Es aconsejable que guarde el proyecto lo más pronto posible e ir salvando consecutivamente por si hay algún desperfecto inesperado en su PC o hay alguna falla eléctrica.

3.2– Constantes y variables.

3.2.1– Variables Las variables son el "sitio" donde podemos guardar los datos que el programa necesite. En Pascal las variables hay que definirlas antes de usarlas. Las variables tienen cuatro características:

Un nombre Un tipo de datos Un ámbito de visibilidad Un tiempo de vida

Toda las variables tienen un nombre, este nombre es por el que la vamos a llamar para que nos devuelva su valor. También al declararla debemos asignarle un tipo de dato, por ejemplo:Var nombre: tipo de dato; Si fuese programando y fuese una variable por ejemplo entera, quedaría:Var a : integer;

2

Como dije anteriormente también tienen un ámbito de visibilidad el cual está dado por el lugar en que lo declaremos y un tiempo de vida el cual esta dado por el ámbito de visibilidad.

Ámbito de visibilidad y tiempo de vida.Zona de declaración Ámbito de visibilidad Tiempo de vidaEntre el procedure – begin del procedimiento

Esta variable solo será visible en este procedimiento y son llamadas variables dinámicas. Cuando se declara en esta zona debe estar antecedida la variable por la palabra reservada var

Durará mientras dure la ejecución de este procedimiento

Private (privadas) Esta variable será visible desde cualquier procedimiento de esta unidad, pero no lo será de ninguna otra. Al declararla no hay que escribir delante var sino solo l variable y el tipo.

Mientras estemos ejecutando un código perteneciente a esta unidad

Public(públicas) Esta variable será visible desde cualquier unidad, en esto se diferencia de la declaración en pivate(privado). A la hora de declararla sucede lo mismo que al declarar en private(privado).

Mientras estemos ejecutando el programa

Nota: Más adelante veremos otras zonas de declaración.

3.2.2- Constantes En Pascal permite la declaración de constantes, para nombrar valores que no cambian durante la ejecución del programa. Para declarar una constante, no necesita especificar un tipo de dato, sino sólo asignar un valor inicial. El compilador examinará el valor y usará el tipo de dato adecuado, automáticamente. La forma de declararla es la misma que las variables, así como su ámbito de visibilidad y tiempo de vida. Siguen algunos ejemplos:const Millar = 1000; Pi = 3.14; NombreAutor = 'Marco Cantù'; Delphi determina el tipo de dato de la constante de acuerdo con su valor. En el ejemplo anterior, la constante Millar se supone que es del tipo SmallInt, el tipo de entero más pequeño en que cabe el valor 1000. Sin embargo, si quiere usted decirle a Delphi que use un tipo específico, puede incluir el nombre del tipo en la declaración:

const Millar: Integer = 1000;

Cuando usted declara una constante, el compilador puede elegir entre asignarle una posición en la memoria y guardar su valor allí, o duplicar el valor actual cada vez que se

3

usa la constante. Este segundo modo de funcionamiento tiene sentido especialmente en el uso de constantes simples.Nota: La versión en 16 bits de Delphi permite modificar el valor de una constante durante la ejecución, como si fuera una variable. La versión en 32 bits aún permite este comportamiento para garantizar la retrocompatibilidad, cuando se habilita la directiva $J del compilador o se activa la casilla Assignable typed constants de la página Compiler del cuadro de diálogo Project Options. Aunque este es el valor por defecto, se aconseja enérgicamente no utilizar este truco como técnica de programación habitual. Asignar un nuevo valor a una constante, desactiva todas las optimizaciones previstas en el compilador para el manejo de constantes. En tales casos, decántese por una variable.

3.3– Tipos de datos Los tipos de datos mas utilizados y son los que veremos en nuestro texto son los de tipo integer para números enteros, real para números reales y string para cadenas de caracteres. A continuación se le dará una gran gama de tipos para que ustedes los conozcan y trabajen con ellos cuando los necesiten pero solo trabajaremos en este libro con los nombrados anteriormente. Ahora veremos cada uno de ellos.

3.3.1– Tipos ordinales. Con ellos se define un conjunto ordenado de valores donde cada valor tiene un antecesor excepto el primero y un sucesor excepto el último. Existen dos tipos de ordinales.

Tipo ordinales enteros. Estos representan un subconjunto de números enteros, y su uso mejora considerablemente el rendimiento de su PC.Tipo de enteroNombre Rango TamañoNúmeros enteros genéricosInteger (entero) –2147483648 a 2147483647 32 bits con signoCardinal (cardenal) 0 a 4294967295 32 bits sin signoNúmeros EnterosShortInt(entero corto) –128 a 127 8 bits con signoSmallInt(entero pequeño) –32768 y 32767 16 bits sin signoLongInt(entero largo) –2147483648 a 2147483647 32 bits con signoInt64(entero 64) -2 63 a 2 63 –1 64 bits con signoByte(tabla binaria) 0 a 255 8 bits sin signoWord 0 a 65535 16 bits sin signoLongWord 0 a 4294967295 32 bits sin signo

Tipos ordinales caracteres Representan un subconjunto de caracteres.Tipos de CaracteresNombre Tamaño

4

AnsiChar Juego de caracteres ANSI 8 bitsWideChar Juego de caracteres Unicode

(los 256 caracteres Unicode=ANSI)16 bits

Tipos ordinales booleanosBoolean es el tipo aconsejado, aunque existen 3 más: ByteBool, WordBool y LongBool, sólo para compatibilidad con otros lenguajes. Los valores que toma son true y false.

3.3.2– Tipos reales. Los tipos reales definen un subconjunto de números que pueden representarse mediante la notación como flotante.Tipos reales fundamentalesNombre TamañoReal48(real 48) Parte fraccionaria 11 a 12 dígitos significativos 6 bytesSingle(solo) Parte fraccionaria 7 a 8 dígitos significativos 4 bytesDouble(doble) Parte fraccionaria 15 a 16 dígitos significativos 8 bytesExtended(extendido) Parte fraccionaria 19 a 20 dígitos significativos 10 bytesComp Parte fraccionaria 19 a 20 dígitos significativos 8 bytesCurrency(moneda) Parte fraccionaria 19 a 20 dígitos significativos 8 bytesTipos Reales genéricoNombre TamañoReal Parte fraccionaria 15 a 16 dígitos significativos bytes

3.3.3- Fecha y Hora Delphi usa tipos reales también para manejar información sobre la fecha y la hora. Para ser más precisos, Delphi define un tipo de datos específico, TDateTime. Este es un tipo de coma flotante, porque el tipo tiene que ser lo bastante amplio para almacenar ños, meses, días, horas, minutos y segundos, hasta resolución de milisegundos, en una sola variable. Las fechas se almacenan como número de días desde el 30 de diciembre de 1899 (12/30/1899), donde los valores negativos indican fechas anteriores al año 1899, en la parte entera del valor de TDateTime. La hora se almacena como fracciones de un días en la parte decimal del valor. TDateTime no es un tipo predefinido que el compilador comprende, sino que es definido en la unidad de sistema como:type TDateTime = type Double; Usar el tipo TDateTime es bastante fácil, porque Delphi incluye varias funciones que operan sobre este tipo. Puede encontrar una lista de estas funciones en la tabla 3.3.

Rutinas del sistema para el tipo TDateTime Rutina Descripción Now Devuelve la fecha y la hora actual en un solo valor TDateTime.Date Devuelve sólo la fecha actual.Time Devuelve sólo la hora actual.3.3.4– Tipos de cadena

5

Tipo texto(cadena)Nombre Rango TamañoChar 1 carácter ASCII 1 byteString Hasta 255 caracteres 2 a 256 bytesShortString Hasta 255 caracteres 2 a 256 bytesAnsiString ~2 ^31 para caracteres de 8 bits (ANSI) 4 bytes a 2 Gb.WideString ~2^ 30 para caracteres UNICODE tes a 2 Gb.

3.3.5- Conversión entre tipos.

Muchas veces por ejemplo necesitamos entrar un numero y realizar operaciones matemáticas(*, /, +, -, etc). Vamos a ver un pequeño ejemplo. Imagine que necesita que entrado un numero por medio de un edit, al presionar un botón nos muestre en otro edit este numero multiplicado por 4. Si no les enseñara lo que les voy a enseñar ustedes escribirían el siguiente código:

procedure TForm1.Button1Click(Sender: TObject);var a:integer;begina:=edit1.text;edit2.text := 4*a;end;

Al hacer esto y correr el programa le dará un error ya que no son compatibles los tipos de datos, uno es entero(integer) y el otro es de tipo cadena(string). Para solucionar este problema tenemos que conocer la forma de convertir de un dato a otro. Los tipos de datos principales que vamos a trabajar son integer, real, string. Cuando van a convertir datos de uno a otro cada uno toma una abreviatura para esta operación. Integer se abrevia a int, real a float y string a str. Estas abreviaturas son tanto para ellas en específicos así como para los de su grupo. Por ejemplo si van a convertir una variable de tipo shortint que pertenece al grupo de integer utilizamos int, de la misma manera si vamos a convertir una del tipo double utilizaremos float y para char utilizaremos str. A continuación les muestro algunas de las conversiones.

Para la conversión entre tipos.Rutina Descripción Chr Convierte un número ordinal en un carácter ANSI.Ord Convierte un valor de tipo ordinal en el número que indica su orden.

Round Convierte un valor de tipo real en un número de tipo entero, redondeando su valor.

Trunc Convierte un valor de tipo real en un número de tipo entero, truncando su valor.

Int Extrae la parte entera del argumento de valor en coma flotante.IntToStr Convierte un número en una cadena.IntToHex Convierte un número en una cadena con su representación hexadecimal.

6

StrToInt Convierte una cadena en un número, provocando una excepción si la cadena no representa un entero válido.

StrToIntDef Convierte una cadena en un número, usando un valor por defecto si la cadena no es correcta.

Val Convierte una cadena en un número (rutina tomada de Turbo Pascal, disponible por compatibilidad).

Str Convierte un número en una cadena, usando parámetros de formateo (rutina tomada de Turbo Pascal, disponible por compatibilidad).

StrPas

Convierte una cadena de terminación nula (null-terminated) en una cadena de tipo Pascal. Esta conversión se realiza automáticamente sobre cadenas AnsiStrings en Delphi de 32 bits. (Véase la sección dedicada a las cadenas, más adelante en este mismo capítulo.)

StrPCopy

Copia una cadena tipo Pascal en una cadena de terminación nula. Esta conversión se hace con un simple moldeo (typecast) sobre0 PChar, en Delphi de 32 bits. (Véase la sección dedicada a las cadenas, más adelante en este mismo capítulo.)

StrPLCopy Copia una porción de una cadena tipo Pascal en una cadena de terminación nula.

FloatToDecimal Convierte un valor de coma flotante a un registro, incluyendo su representación decimal (exponentes, dígitos, signo).

FloatToStr Convierte un valor de coma flotante a su representación como cadena, con formato por defecto.

FloatToStrF Convierte un valor de coma flotante a su representación como cadena, con el formato especificado.

FloatToText Copia un valor de coma flotante a un buffer (tampón) de cadena, con el formato especificado.

FloatToTextFmt Como la rutina anterior, copia un valor de coma flotante a un buffer (tampón) de cadena, con el formato especificado.

StrToFloat Convierte una cadena Pascal a un valor de coma flotante.TextToFloat Convierte una cadena de terminación nula a un valor de coma flotante.

También se pueden convertir los de tipo Fecha y hora de la siguiente manera:

Conversiones entre tipos TDateTime con otros.Rutina Descripción

DateTimeToStrConvierte un valor de fecha y hora en una cadena, utilizando formato por defecto; para tener mayor control sobre la conversión, utilice la función FormatDateTime.

DateTimeToString

Copia el valor de fecha y hora en un buffer (tampón) de cadena, en formato por defecto.

DateToStr Convierte la porción de fecha de un valor TDateTime en una cadena.TimeToStr Convierte la porción de hora de un valor TDateTime en una cadena.FormatDateTime Da un formato especificado a fecha y hora; puede especificar qué valores

quiere ver y qué formato utilizar, proveyendo una cadena de formato

7

complejo.

StrToDateTimeConvierte una cadena con información de fecha y hora en un valor TDateTime, provocando una excepción en caso de error en el formato de la cadena.

StrToDate Convierte una cadena con información de fecha en un valor TDateTime.StrToTime Convierte una cadena con información de hora en un valor TDateTime

DayOfWeek Extrae el número correspondiente al día de la semana del valor TDateTime que se pasa como parámetro.

DecodeDate Estrae los valores de año, mes y día de un valor de fecha.DecodeTime Extrae los valores de un valor de hora.EncodeDate Convierte valores de año, mes y día en un valor TDateTime.

EncodeTime Convierte valores de hora, minuto, segundo y milisegundo en un valor TDateTime.

3.3.6-Conclusion.

Existen más tipos de datos y más tipos de conversiones pero con estos les serán suficiente por buen tiempo.

3.4- Operadores y expresiones.

3.4.1- Operadores aritméticos Los operadores aritméticos son binarios, lo cual quiere decir que actúan sobre dos operandos, uno dispuesto a la izquierda del operador y el otro a la derecha. Los operadores (+)y(-) también pueden ser usados como operadores unarios, disponiéndolos delante de un numero para indicar su signo.

Tabla de operadores aritméticos.

Operador Resultado de la operación que lleva a cabo.+ La suma de los dos operandos.- El primer operando menos el segundo.* El producto de los dos operandos./ El cociente de dividir el primer operando entre el segundo.Div El cociente de una division entera del primer operando por el segundo.Mod El resto de una división entera del primer operando por el segundo. Todos los operandos aritméticos, a excepción del de división, generan un resultado del mismo tipo al que pertenecen los operandos. Es decir, si sumamos dos enteros obtendremos un resultado entero, si sumamos dos reales obtendremos un numero real, sin embargo el operador de división genera siempre un resultado del tipo real sin importar el tipo de los operandos. Esto significa que no podemos asignar el resultado de una división a una variable del tipo entera lo cual generaria un error. En caso de que deseemos obtener una división entera, sin parte decimal, en lugar del operador (/) usaremos el operador (div).

8

3.4.2- Operadores relaciones.

Una expresión relacional es aquella en la que se comprueba la relación existente entre los operandos, generándose un resultado del tipo boolean según que la relación se cumpla o no se cumpla. Si comprobamos, por ejemplo, la relación de igualdad entre dos variables, el valor devuelto será True si efectivamente los valores que almacenan son iguales o false en caso contrario. Los operandos de una expresión relacional no han de ser necesariamente numéricos, como sí es obligatorio en una expresión aritmética, y podemos perfectamente comprobar la relación existente entre dos cadenas, por poner un ejemplo. Tabla de operadores relacionales.Operador El resultado es True en caso de que..= Ambos operandos sean iguales.<> Los operandos no sean iguales.< El primer operando sea menos que el segundo.<= El primer operando sea menor o igual que el segundo.> El primer operando sea mayor que el segundo.>= El primer operando sea mayor o igual que el segundo.

Todos los operadores relacionales, que se encuentran en esta tabla son binarios, lo que significa que actuarán siempre sobre dos operandos. En una misma expresión es posible combinar operadores aritméticos y relacionales, siempre que la composición se haga correcta. Los operadores de una expresión relacional pueden ser, a su vez, otras expresiones, generalmente de tipo aritmético. A continuación se muestra un fragmento de código donde se puede ver la comprobación de una cierta relación, con el operador >, entre el resultado generado por dos expresiones aritméticas. El resultado final de tipo boolean, es almacenado en una variable:

Var resultado:Boolean;Begin Resultado:=2*5>14 div 2;//el resultado es true;............

3.4.3- Operadores lógicos.

En ocasiones nos podemos encontrar con que necesitamos que se cumpla mas de una condición, al menos una de ellas, ninguna, etcétera. Entonces es cuando necesitaremos los operadores lógicos, los cuales nos permiten comprobar en una solo paso múltiples expresiones relacionales. Estos operadores son: Tabla de operadores lógicos.Operador Resultado que genera.not True si el resultado es False y viveversa.And True si los dos operandos son True y False en caso contario.Or True si uno de los dos operandos es True, False si ambos son False.

9

Xor True si solo uno de los operandos es True. El operador Not es un operador unario, que irá seguido de un operando sobre el que actuará negándolo, es decir, invirtiendo su valor. Los otros tres operadores son binarios, actuando sobre dos operandos que serán facilitados a la izquierda y derecha del operador, sin importar su orden.

3.4.4- Otros operadores. Además de los operadores que han sido englobados en las tres categorías anteriores, Object Pascal cuenta con otros adicionales que nos permiten, por ejemplo, concatenar dos cadenas, comprobar la existencia de un elemento en un conjunto u obtener la dirección en que se almacena el valor contenido en una variable.

Concatenación de cadenas. La concatenación de cadenas no es más que unir la secuencia de caracteres de dos o más cadenas para generar una sola, cuya longitud final va a ser igual a la suma de las longitudes de cada una de las cadenas que actúan como operandos. Para concatenar dos cadenas se utiliza el operador (+), que en este caso no actuará como operador aritmético, sumando dos números, sino como operador de cadena. Ejemplo:1-Entrado dos nombres en un edit cada uno, aparezcan los dos en un label unidos al hacer click sobre un botón.Resp: En el evento OnClick del botón programamos:

Label1.caption := edit1.text + edit2.text;

Nota: Si desea concatenar cadenas que no sean edit, sino textos fijos el procedimiento es el mismo, solo recordar que lo que le asignes tienes que ponerlo entre comillas(‘’), ejemplo:

Label1.caption := edit1.text + ‘oscar’;

Operadores de conjuntos Los operadores de conjunto nos permiten realizar operaciones con ellos como la unión, intersección o diferencia. Los operadores para trabajo con conjuntos son algunos de los de los que ya conocemos como operadores aritméticos, pero al trabajar sobre operandos de tipo conjunto actúan de forma diferente. Tabla de operadores de conjunto.

Operador Operación que realiza+ Unión de los conjuntos.- Diferencia del primer conjunto menos el segundo.* Intersección de los conjuntos.In Comprobación de un elemento en un conjunto.

10

Operadores de trabajo con puntero.

Un puntero es una variable especial, en el sentido que de que el valor que almacena no es un dato de nuestra aplicación, sino una dirección de memoria en la cual se encontrará este dato. Existen dos operadores que debemos conocer para poder trabajar con punteros, los cuales son (@ y ^). El primero de ellos, dispuesto delante del identificador de una variable, obtiene la dirección de memoria en cual se encuentra almacenado el valor. Dicha dirección puede ser almacenada en una variable puntero del mismo tipo que el valor. Por ejemplo, suponga que tiene una variable de tipo integer y desea obtener y almacenar su dirección, para lo cual necesitará un puntero de tipo integer. La declaración de este puntero y la posterior asignación se realizarían de la forma siguiente:

Var N:integer; PunteroN : ^integrer;Begin Punteron := @n;

Al declarar la variable PunteroN delante del tipo integer se coloca el símbolo (^) , lo que indica que esa variable es un puntero a un valor de tipo integer. Por tanto no podemos asignar directamente a PunteroN un valor numérico, como si podemos hacer con la variable n. En la posterior asignación se usa el operador @ para obtener la dirección en la que almacena el valor la variable N, asignándola al puntero. El operador (^) nos servirá en el momento en que necesitemos acceder al valor cuya dirección está almacenada en un puntero. Suponga que desea asignar un valor a la variable N, cuya dirección está almacenada en punteroN, podría hacerlo de cualquiera de las formas siguientes:

N := 5;PunteroN^ := 5;

Ejercicio sobre variables, zona de declaracion, tipo de dato, conversion de tipo y uso de operadores aritmeticos.

1- Entrado un número mostrar el resultado que daría ese número multiplicado por 5. Todo debe ocurrir al hacer click sobre un botón.

Solucion por fases. Fase de diseño.

1- Para crear la fase de diseño de este programa necesitamos un edit para entrar el número, un botón para al oprimirlo se muestre el resultado y otro edit para mostrar el resultado.

Fase de diseño - ejecución.1- Lo primero es saber cuando es que será calculado y mostrado el resultado de

multiplicar por 5 el numero entrado en el edit1. Si lee el problema nos damos cuenta que esto ocurrira al hacer click sobre el botón. Entonces lo que debemos hacer es seleccionar el botón, ir a su evento OnClick y hacemos dobleclick a la derecha de

11

dicho evento para que se muestre el editor de código de fuente con su respectivo procedimiento.

2- Ya estando en este procedimiento, tenemos que saber que vamos a programar en este procedimiento. Para programar necesitamos seguir los siguientes pasos:

2.1- Necesitamos declarar una variable(a) para guardar el número entrado en el edit1.2.2- Necesitamos declarar otra variable(b) para guardar el resultado de la multiplicación.2.3- Necesitamos mostrar el resultado o sea la variable b en el edit2.

3- Ahora, esta variable “a” la vamos a utilizar sólo en este procedimiento por lo tanto podemos declararla entre el procedure - begin de este procedimiento, lo cual nos quedaría:

procedure TForm1.Button1Click(Sender: TObject); var a:integer;begin

end;4- Ya tenemos declarada la variable, así que ahora podemos asignarle el valor entrado en

el edit1, escríbalo de esta forma:a : = edit1.text;

5- Si escribieron esta línea de código les tiene que haber dado un error debido a que no son compatibles. En otras palabras se le está asignando un texto a una variable numérica. ¿Cómo podemos remediar este problema? Pues convirtiendo ese dato de tipo texto a dato de tipo entero, lo cual nos quedaría arreglando el código anterior nos quedaría:

a : = strtoint(edit1.text);6- Ahora necesitamos multiplicar esta variable por 5 y asignárselo a b. Para esto tienen

que agregar la siguiente línea de código:b : = a*5;

7- Ahora necesitamos mostrar el valor de esta variable en el edit2. Para esto tenemos que convertir esta variable “b” de tipo integer(entero) a string(cadena de caracteres). Esto se debe realizar de la siguiente forma:

Edit2.text : = inttostr(b);8- Ahora corra el programa y verá lo que ha logrado.9- Vamos a añadirle un inciso a.

a- Que muestre el resultado de la división por 3 del número entrado en otro componente al hacer click sobre otro botón.

Solución por fases.

Fase de diseño1- Para crear esta fase de diseño necesitamos agregar a la fase de diseño anterior un edit y

un botón.

12

Fase de diseño – ejecución.

1- Lo primero que necesitamos es saber cuando se llevará a cabo la división por 3 del número entrado y al leer el problema nos damos cuenta que es cuando le hagamos click al botón3. Entonces accedamos a este procedimiento por medio del inspector de objetos en su evento OnClick.

2- Ya en este procedimiento, tenemos que saber los pasos que necesitamos para realizar esta parte del programa:

2.1- Necesitamos una variable preferentemente la misma(a) para guardar el número entrado en el edit1.2.2- Necesitamos otra variable(c) para guardar el valor de la valor de la división de “a” por 3.2.3- Necesitamos mostrar el valor de esta variable “c” en el edit3.

3- Para resolver la primera parte de asignarle a la variable “a” el valor del edit1 y esta “a” es la misma del procedimiento Onclick del botón1 en el cual ya está declarado. Si ya está declarada entonces sólo tenemos que asignarle el valor despues de convertirlo de string a integer de la siguiente forma:

a : = strtoint(edit1.text);4- Corra el programa. El programa le ha dado un error, dice que no está declarada “a”. ¿A

que se debe esto? Pues simplemente a que la variable “a” ha sido creada entre el procedure - begin del procedimiento OnClick del botón1, por lo tanto solo será visible o sea solo se podrá acceder a ella desde este procedimiento. La solución entonces sería declararla en otro lugar. Esta variable necesitamos que sea accesible desde dos procedimientos, por lo cual la zona en que debemos declararla es en public y quitar la declaración echa entre el procedure – begin del procedimiento. Ya en public escribimos:

A: integer; Recuerden que no tiene que ir antecedida por la palabra reservada “var”.5- Ya ahora si corre bien el programa pero aún nos faltan dos pasos. Necesitamos una

variable “c” para guardar el valor de la division de “a” por 3. Esta variable solo la utilizaremos desde el procedimiento OnClick del botón2 así que la podemos declarar entre el prodcedure – begin de este procedimiento de la siguiente forma:

var c: integer;6- Ya declarada la variable podemos entonces asignarle el valor de la división por 3:

C : = a/3; 7- Corra el programa, le ha dado otro error. Le está diciendo que no es compatible una

variable de tipo extended e integer. En otras palabras, no se puede asignar un valor real a una variable entera. (vea epigrafe 3.4.1).

8- Ahora veamos como solucionar este problema. La solución no es convertir de entero a real como posiblemente hayan pensado ya que esto no es posible. La solucion es declarar la variable “c” del tipo real.

9- Luego de declarar a “c” real corra el programa y verá que ya no le da error.

13

10- Ya lo único que nos falta es mostrar el resultado de la división, para lo cual hay que convertir a “c” de real a string :

Edit3.text := floattostr(c);11- Corra el programa y verá el resultado de sus estudios.

3.5– Contadores y sumadores.

Un contador es una variable que nos va a ir sumando un valor fijo cada vez que deseemos. Por ejemplo: a:=a+1 es un sumador que nos va a ir sumando 1 a la variable a y c:=c+4 le va a ir sumando 4. Un sumador es una variable que va a ir sumando diferentes valores a una variable determinada. Por ejemplo si queremos en una variable ir sumando los datos que vamos entrando en un edit seria: declaramos una variable (m)en la cual vamos a ir asignando el valor entrado en el edit y luego hacemos el sumador s:=s+m o si desea hacerlo directo s:=s+strtoint(edit1.text) . Esta variable hay que inicializarla o sea darle un valor a partir del cual deseamos que comience a contar. La zona donde la va a declarar está determinada por la situación del problema. Por ejemplo si tu deseas que inicialmente al correr el programa comience con ese valor inicial, entonces tienes que inicializarla en el evento OnCreate del formulario. Para inicializarla debemos asignarle ese valor inicial, por ejemplo si deseo que la variable (C) comience a contar a partir de 0 la inicializó escribiendo (C := 0). Recuerde que si la declaras en un evento y también la vas a usar en otro tienes que declararla en un ámbito de visibilidad que le permita ser vista por los dos procedimientos, por ejemplo en public.

3.6– Arreglos o matrices.

Arreglos unidemensionales. Los arreglos pertenecen al grupo de estructura de datos. Un arreglo es una estructura de datos que contiene elementos del mismo tipo, su tamaño depende tanto del tipo de dato como del número de elementos que contendrá el arreglo. La sintaxis es la siguiente: variable o constante: array[cantidad de elementos]of tipo de dato. Por ejemplo si declaramos una matriz de la forma:Aquí estamos creando una variable(nombre) de tipo array que contiene 10 elementos de tipo string.

var nombres : array [1..10] of string;

Luego de declararla tenemos que decirle cuales son esos nombres.Const nombre:array[1..10] of string = ‘oscar’,’addys’,’’dioni’,’angel’,’mirelis’,’mirialis’,’oskenia’,’rafelito’,’mayda’,’deisel’)

Claro que hay otra forma de asignarle los nombres aunque menos cómoda a mi entender. Quedaría:

14

nombre[1]:=’oscar’;nombre[2]:=’addys’; // y así sucesivamente

Mirando esta matriz en una dimensión sería:<<Oscar addys dioni angel mirelis mirialis oskenia rafelito mayda Deisel Podían en lugar de declarar una variable de arreglo haber definido una variable para cada nombre y luego haberle asignado sus respectivos valores, de la siguiente forma:

Var nombre1, nombre2, nombre3, nombre4, nombre5, nombre6, nombre7,nombre8, nombre9, nombre10; begin nombre1:= ‘oscar’; nombre2:=’addys’; ...............end;

Claro que nosotros como programadores tenemos que saber cual sea mas cómoda y por supuesto que lo es la de arreglo. El por que se lo diré ahora:1 – Con el arreglo ahorramos variables y trabajo.2 – Esta es la de mayor importancia y es que cuando trabajamos con la matriz podemos referirnos a cada uno de ellos por su índice. Por ejemplo si queremos obtener el nombre del tercer elemento de la matriz hacemos nombre[3] y entonces nos devolverá el tercer elemento de la matriz nombre que sería dioni. Observar la matriz unidimensionalNotas: Todos los elementos de una matriz han de ser de un mismo tipo. Por ejemplo:

nombres:array [1..10] of string; //datos de tipo stringnumeros:array[1..5] of integer; //datos de tipo entero

Pero nunca mezclar los tipos. En caso de no saber la cantidad de elementos que componen a la matriz lo que

tenemos que hacer es no decirle la cantidad de elementos que posee, o sea:apellidos : array of string

Arreglos bidimensionales.

Object Pascal y en consecuencia Delphi permiten la creación de arreglos multidimensionales, los cuales funcionan como arreglos de columnas y renglones. Para crear un arreglo de mas de una dimensión se emplea la misma sintaxis, pero para cada dimensión se agrega una coma. Por ejemplo:

nombres = array [1..2,1..3] of string; Define un arreglo de 2 columnas con 3 filas. Viéndolo en dos dimensiones sería:

Columna 1 Columna 2Fila 1 Oscar AngelFila 2 Addys MirelisFila 3 Dioni Mirialis Entonces si nos referimos a nombres[1,2] entonces nos devolverá el elemento que se encuentra en la columna 1, fila 2 o sea addys.

15

Arreglos multidimensionales. .

La forma de trabajo de estos arreglos es similar a como se trabaja con la de dos pero con mas dimensiones. Este objetivo ya se sale del objetivo del curso por eso lo dejamos para su estudio cuando lo necesite.

3.7- Records o registros.

El registro es un tipo estructurado o complejo, caracterizándose por contener en su interior múltiples campos o variables, cada una de las cuales puede ser de un tipo diferente, lo que le diferencia de una matriz. Este tipo de dato es muy útil cuando necesitamos mantener una serie de datos de forma conjunta, generalmente cuando estén relacionados de alguna forma. Para definir un registro facilitaremos primero, como es habitual, el identificador con que se le va a conocer, seguido de un signo igual (=) y la palabra record. En las líneas siguientes tendremos que especificar cuales serán los componentes del registro, para lo cual iremos facilitando identificadores y tipos para cada miembro, como si estuviésemos declarando variables. La declaración de cada miembro estará terminada con un punto y coma, y el fin de la definición del registro se indicará mediante la palabra End.

Ejercicio sobre arreglo y record.

1- Si deseamos hacer un registro donde deseamos tener algunos datos de una biblioteca como son: nombre del usuario, titulo del libro, autor y saber si el usuario está inscrito o no.a-) Entrado un número y luego presionar un botón nos muestre los datos del usuario y pedido correspondiente.

Solución por fases. Fase de diseño

1- Primeramente necesita entrar los datos nombre de usuario, titulo y autor, para esto utilizaremos 3 edit. También necesitaremos un radiobutton para saber si es un usuario inscrito o no.

2- Necesitamos un botón para que al oprimirlo sean guardados los datos.3- Necesitamos 3 label para poner sobre cada edit su función. 4- Al radiobutton debemos darle en su propiedad caption el valor ‘¿ES USUARIO DE

LA BIBLIOTECA?’.

16

5- Al final nos quedaría de la siguiente forma: Fase de diseño – ejecución.

1- Primeramente tenemos que declarar el registro lo cual se hace de la siguiente manera. En Type escribimos lo siguiente:

type Tbiblioteca =record usuario:array [1..10000]of string;//nombres de los usuarios titulo:array[1..10000]of string;//titulos de los libros autor:array[1.10000]of string;//nombres de los autores inscrito:array[1..10000]of string;//para saber si esta inscrito end;

Observe que primeramente se le facilita un identificador al record (Tbiblioteca) seguido del signo igual y la palabra record. Luego especificamos los componentes del registro a los cuales vamos facilitándoles indicadores(usuario, titulo, autor e inscrito). Tomamos los arreglos de 10000 elementos porque es un numero bastante grande, claro que si crees que necesitas que sea mayor porque habrán mas clientes puedes poner un numero mayor. Observe también que este registro termina con la palabra end.2- Tenemos que declarar una variable la cual será del tipo Tbiblioteca, vamos a llamar esa

variable biblioteca. La declararemos entre el procedure – begin del evento OnClick del botón. Ya que solo la usaremos en este procedimiento:

Var biblioteca : tbiblioteca;//la variable sera entera

3- Ahora queremos que al oprimir el botón los datos entrados sean guardados en el registro. Para poder guardarlas en el registro necesitamos una herramienta que nos permita saber que cantidad de elementos se han entrado, para asignarle los últimos datos al componente que está después de; ultimo que entramos. Para ello haremos un sumador. El sumador casi siempre se utiliza en dos procedimientos en el que lo vamos a inicializar o sea le vamos a dar su valor inicial y el procedimiento en que lo vamos a utilizar para realizar operaciones con él. Debido a que lo vamos a utilizar en mas de un procedimiento debemos declarar este contador en public de la siguiente manera:

a : integer;//la variable que hara de contador será del tipo entero Luego de declarar la variable debemos inicializarla, lo cual lo haremos en el evento OnCreate del formulario de la siguiente forma:

a := 0;//el valor inicial del contador será cero Ahora en el evento OnClick del boton entre el begin y el end comenzamos a sumarle al contador:

a := a+1;//cada vez que se oprima el boton el sumador se sumará uno Continuando con el evento OnClick del botón vamos a aclarar para que es el sumador. El sumador se utiliza para que cada vez que el usuario oprima el botón sume uno, entonces cuando vamos a asignar a la variable de arreglo le asignamos en el arreglo correspondiente a este numero. Nos quedaría lo siguiente:

Biblioteca.usuario[a] := edit1.text;Biblioteca.titulo[a] := edit2.text;Biblioteca.autor[a] := edit3.text;If radiobutton1.checked then biblioteca.inscrito[a]:=’SI’else

17

biblioteca.inscrito[a]:=’NO’;

Veamos que hacen estas líneas: las líneas de la primera a la tercera lo que hacen es asignarle a la variables de arreglo en su posición determinada por el contador el cual suma uno cada vez que se haga click sobre el botón. La ultima línea comprueba si el radiobutton está seleccionado o no y en dependencia de esto guarda en la variable en la posición determinada por el contador los valores SÍ o No. Observe que cada vez que escribe el nombre de la variable Biblioteca y el punto de separación, Delphi abre una pequeña ventana emergente en la que enumeran los miembros del tipo. Esto evita que tengamos que recordar los nombres asignados, evitando también fallos de tecleo ya que podemos seleccionar directamente el elemento de esta lista.

a-) Ahora va a realizar el inciso a. Fase de diseño.

1- Para esto primeramente creemos un nuevo formulario donde aparecerán los datos que deseamos visualizar.

2- Luego necesitamos 4 edit para mostrar nombre del usuario, titulo del libro, autor y si el usuario está o no inscrito en la biblioteca. También 4 label para poner sobre cada uno de los edit para que lo vamos a utilizar. También necesitamos otro botón en el formulario1 que es el que va a hacer posible mostrar los datos. Necesitamos un edit que estará en el formulario1 en el cual escribiremos el número de la posición en la que está el usuario que deseamos obtener sus datos. Nos quedaría entonces aproximadamente de la siguiente forma:

Fase de diseño – ejecución.1- Ahora ¿qué es lo que va a suceder cuando oprimamos el botón? Va a mostrase el form2. Van a aparecer los datos que deseamos del usuario determinado.2- Ahora ¿cómo hacemos esto?. Hacemos visible el formulario2.

18

Declaramos una variable que tomará el valor entrado en el edit4 del formulario convertido de string a entero.

Llamamos al usuario y sus datos de acuerdo al valor numérico entrado en el edit4.3- Escribiendo nos quedaría de la siguiente forma:

procedure Tform1.Button2Click(Sender: Tobject); var a:integer;//declaarda aquí porque solo se utilizará en este procedimientobegin form2.show//muestra el formulario2 a:=strtoint(edit4.text);//convierte de string a entero form2.edit1.Text := biblioteca.usuario[a];//muestra en el edit1 de form2 el

dato form2.edit2.text := biblioteca.titulo[a];//muestra en el edit2 del form2 el dato form2.edit3.Text := biblioteca.autor[a];//muestra en el edit3 del form2 el dato form2.edit4.Text := biblioteca.inscrito[a];//muestra en el edit4 del form2 el

datoend;

4- Esto lo que hace es convertir el texto que aunque un visualmente es un numero para la computadora es un texto entrado en el edit4 , convertirlo a entero y asignárselo a una variable. Entonces en esta variable estará el valor de la posición en que se encuentra el elemento del arreglo biblioteca los cuales son arreglos. Luego llamamos a los elementos del registro biblioteca y se lo asignamos a diferentes edit. Como los elementos del registro son arreglos tenemos para que se muestre el que deseamos tenemos que darle el valor de la posición para que la máquina lo busque y nos lo muestre.

3.8 – Sentencias.

3.8.1- Sentencias condicionales.

Como su nombre indica son estructuras que ejecutan determinadas acciones según la condición que les hayamos impuesto sea verdadera o falsa o dicho en otras palabras si se cumple la condición o no. Estas sentencias para trabajar con ellas es necesario conocer bien los operadores relacionales y lógicos dados en clases anteriores. Hay dos tipo, el If y el Case.

3.8.1.1- Sentencia condicional “if.”

La sentencia condicional if tiene la siguiente estructura si lo decimos con nuestras palabras:

Si (condición es cierta) haz sentencia

Si deseamos que si es cierta realice un conjunto de sentencias y en caso de ser falsa otro conjunto de sentencias quedaría de la siguiente forma.

Si (condición es cierta) haz

19

Sentencia Sino Sentencia.

Ahora, ¿cómo le escribimos en Object Pascal estas sentencias condicionales a nuestro programa? En el caso del primer tipo cuando queremos que sólo si se cumple haga las sentencias quedaria:1- La palabra “si” en español la sustituimos por “if” ()en inglés.2- La palabra “haz” en español la sustituimos por “then”(entonces) en inglés.3- Entonces nos quedaría:

If (condición es cierta) then Sentencia;

La segunda el principio es el mismo y ya en la segunda parte cambiamos “sino” en español por “else” (sino, de lo contrario, de otra manera). Para escribir en Object Pascal nos quedaría:

If (condición es cierta) then Sentencia Else Sentencia;

Observe que el punto y coma no va hasta el final de la ultima sentencia después del else. Esto es debido a que Delphi toma la sentencia condicional como una sola sentencia o sea como si fuese una línea de código y sabemos que a las líneas de código se le pone el punto y coma al final.

Ahora que sucedería si al cumplirse una condición queremos que se realice más de una sentencia y si no se cumple realice también mas de una sentencia. Para esto tenemos que poner las sentencias entre un begin-end indicando que al cumplirse la condición debe realizar todo lo que está entre el begin-end y si no se cumple realice las sentencias que están entre el begin-end del else. Escribiéndolo en Pascal nos quedaría:

If (condición es cierta) then Begin Sentencias end Else begin Sentencias end;

Observe que el punto y coma no aparece hasta después del begin-end del else.Nota: Todo begin tiene que tener un end, por lo cual es aconsejable tan pronto como escribas el begin escribir debajo su end correspondiente y luego escribir dentro de ellos.

3.8.1.1- Sentencia condicional “case”.

20

La sentencia condicional case e if aunque con diferente estructura pueden realizar un mismo ejercicio. En otras palabras, lo que hagamos con el if lo podemos hacer con el case, todo depende de la comodidad a la hora de trabajar si es mejor una que otra. La estructura del case con nuestras palabras es la siguiente:

Caso (expresión a controlar) de Caso1:sentencia; Caso2:sentencia; Caso3:sentencia; ........ end;

Lo que estamos diciendo es: “en caso que el valor de la expresión sea: el caso1 haz la sentencia correspondiente, el caso 2 haz la sentencia correspondiente y así sucesivamente.” Observe que el case tiene su propio end, por lo tanto sería bueno hacer lo mismo que dije que hicieran con el begin-end en la nota final, que no sería más que escribir case y debajo su correspondiente end y luego escribir dentro de ellos. Si queremos que al cumplirse un caso se realice más de una sentencia, tendríamos que escribir luego del caso correspondiente un begin-end y dentro de él el conjunto de sentencias que queremos que realice.

Para escribirlo a la máquina nos quedaría de la siguiente forma:Caso (expresión a controlar) de Caso1:begin Sentencia end; caso2:sentencia; .........end;

Ahora les falta saber como escribir este código en Pascal. La palabra “caso” la sustituimos por “case”(caso), la palabra “de” la sustituimos por “of ”(de) y los casos no son más que los valores que quieres que se verifiquen y en caso de ser cierto se realice la sentencia o conjunto de sentencia que se le ordene. Entonces nos quedaría de la siguiente forma:

Case (expresión a controlar) of Caso1:begin sentencias End; Caso2:sentencia; ....end;

Ejercicio sobre sentencias condicionales.

21

1- Entrado el nombre de un estudiante y sus cinco notas(0-5), mostrar en otros dos componentes el nombre y el promedio de este alumno al oprimir la tecla enter luego de entrar la ultima nota.

a- En dependencia del promedio alcanzado(2-M, 3-R, 4-B,5-MB) mostrar su evaluación en este tipo de evaluación.

Solución por fases. Fase de diseño

1- Necesitamos dos edit uno para entrar el nombre y otro para las notas.2- Un botón para almacenar los datos.3- Dos componentes(listbox) para almacenar el nombre y el promedio.

Fase de diseño – ejecución.1- Algo que veremos ahora será lo que se conoce como máscara. Esto no es mas que hacer

que en un componente se entren sólo los caracteres que ustedes desean. En nuestro ejercicio necesitamos que en el componente que vamos a entrar las notas sólo se escriban números. Para esto debemos saber que siempre que nosotros presionamos una tecla estando el foco en este componente el componente va y observa lo que le programó en el evento OnKeyPress y lo hará. Para esto debemos saber también el número ASCII de algunas teclas. La tecla enter es #13, la tecla backspace(la de borrar de atrás hacia delante) es #8 y los caracteres se pueden escribir igual pero entre comillas. Esto son algunos y por supuesto que hay muchos más pero que en este momento se van fuera del tema. Sabiendo esto vayamos al evento OnKeyPress del edit por el que vamos a entrar los nombres y escribamos el siguiente código:

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);begin if not(key in [‘0’..’9’,#13,#8])then //si no es un numero del intervalo 0 al 9, enter o backspace key:=#0; //entonces asígnale a la tecla que oprimió el #0 o sea nada.end;

2- Las notas a entrar son de 0-5 o sea un solo carácter. Para obligar al programa que sólo pueda entrar un carácter en el edit en su propiedad Maxlength le damos el valor 1.

3- Necesitamos entrar en un mismo edit entrar cinco notas y al llegar a la quinta nota y presionar enter sea mostrado el nombre y el promedio de este estudiante. Para esto tenemos que aplicar un sumador(c) y un contador(s) que cuente y sume respectivamente cada vez que oprima el enter. Estas dos Al entrar la quinta nota y oprimir enter debemos mostrar el nombre y el promedio, para esto tenemos

4- Además de contar y sumar cada vez que se oprima el enter debemos limpiar el edit y poner para poder entrar la otra nota sin dificultad. Al entrar la quinta nota y oprimir enter debe mostrarse el nombre y el promedio. Para calcular el promedio debe haber declarado en public un contador(c) y un sumador(s), deben declararla en public porque la vamos a usar en más de un procedimiento, en donde la vamos a inicializar y donde la vamos a utilizar o sea cuando menos en 2 procedimientos. También debemos saber que el promedio no es más que el resultado de la suma de las notas dividido por la cantidad

22

de notas. Es aquí donde entran el sumador y el contador. Ahora tenemos que declarar la variable de promedio entre el procedure-begin del procedimiento anterior y luego agregar el siguiente código al código anterior:

If (key=#13)and(edit2.text<>’’) then //si oporimes el enter y el edit2 tiene algo escrito entonces Begin //haz lo que está entre el begin-end c:=c+1; // suma1 al contador s:=s + strtoint(edit2.text); //suma el númeroentrado en el edit2 edit2.clear; //limpia el edit2 if c=5 then //si c=5 o sea si se han entardo 5 notas begin // haz lo que está entre el begin-end p:=s/c; // se divide la suma entre la cantidad de datos y se le asigna a p listbox1.items.add(edit1.text); //añade el nombre al listbox1 listbox2.items.add(floattostr(p)) //añade el promedio al listbox2 edit2.setfocus; // pone el foco en el edit2 end; end5- Ahora corra el programa entre una nota y oprima enter, así sucesivamente hasta la

quinta y verá el resultado de su trabajo.

a- Solución por fases: Fase de diseño.

1- Debemos agregar un listbox para almacenar el nuevo tipo de evaluación.

Fase de ejecución.1- Ahora les voy a mostrar dos formas de realizar este mismo ejercicio y usted se dará

cuenta de la importancia de conocer los dos tipos de concionales.

I- If p=2 then listbox3.items.add(‘M’); If p=3 then listbox3.items.add(‘R’); If p=4 then listbox3.items.add(‘B’) ; If p=5 then listbox3.items.add(‘MB’);

II- Case p of 2: listbox3.items.add(‘M’); 3: listbox3.items.add(‘R’); 4: listbox3.items.add(‘B’); 5: listbox3.items.add(‘MB’); end; Como puede apreciar la forma más sencilla es con el case y así no tiene que estar comparando constantemente a (p).2- Ya sabemos como se escribe el código ahora tenemos que añadirlo al código anterior en

el begin-end de cuando se cumpla la condición de que (c) sea igual a 5 y de la linea donde está calculado el promedio en cualquiera.

23

3- El código completo del ejercicio nos quedaría:En private:

private c, s : integer;

En el evento OnKeyPress del edit2:

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); var p : real; //variable de promedio del tipo real.begin if not(key in [‘0’..’9’,#13,#8])then //si no es un numero del intervalo 0 al 9, enter o backspace key:=#0; //entonces asígnale a la tecla que oprimió el #0 o sea nada. If (key=#13)and(edit2.text<>’’) then //si oporimes el enter y el edit2 tiene algo escrito entonces Begin //haz lo que está entre el begin-end c:=c+1; // suma1 al contador s:=s + strtoint(edit2.text); //suma el númeroentrado en el edit2 edit2.clear; //limpia el edit2 if c=5 then //si c=5 o sea si se han entardo 5 notas begin // haz lo que está entre el begin-end p:=s/c; // se divide la suma entre la cantidad de datos y se le asigna a p listbox1.items.add(edit1.text); //añade el nombre al listbox1 listbox2.items.add(floattostr(p)) //añade el promedio al listbox2 Case p of 2: listbox3.items.add(‘M’); 3: listbox3.items.add(‘R’); 4: listbox3.items.add(‘B’); 5: listbox3.items.add(‘MB’); end; edit2.setfocus; // pone el foco en el edit2 end; end

end;

3.8.2 – Sentencia With(con).

Esta sentencia es una estructura pensada para trabajar menos, lo que siempre se agradece y es que es simple y cómoda. Supongamos que estamos dando propiedades a un componente "ComponenteX" en nuestro programa, hemos de referirnos a él diciendo:

ComponenteX.Propiedad1:=.... ComponenteX.Propiedad2:=....

24

ComponenteX.Propiedad3:=.... ComponenteX.Propiedad4:=.... ComponenteX.Propiedad5:=.... ..... Componentex.propiedadN:=..... Donde PropiedadN será el color, la posición, la fuente, lo que sea.

Lo que hace la sentencia With principalmente es decir "todo lo que esté dentro de mi estructura pertenece a lo que le indico", veamos:

With ComponenteX do Begin Propiedad1:=.... Propiedad2:=.... Propiedad3:=.... Propiedad4:=.... Propiedad5:=.... End;

¿Parece que no tiene importancia? Evidentemente se puede prescindir de ella, pero en la práctica la tiene, y mucha, no solamente nos evita trabajo, sino que hace unos programas más legibles. Como en cualquier estructura puede darse "anidamiento", es decir, que una esté contenida en otra, una siguiente en la anterior, etc. con la única condición a cumplir que es la de no liar al compilador. Cada una se abre y se cierra, si incorpora otras estas deben abrirse y cerrarse antes de la principal, algo parecido a lo siguiente:

With ComponenteX do Begin Propiedad1:=.... With Propiedad2 do Begin ... End; End; Por supuesto, donde pongo puntos suspensivos (por no atenerme a ejemplos reales que aún no se han visto en estas páginas) irán nuevas actuaciones e igualmente puede ir otra estructura, pero lo que me interesa que quede bien claro es la forma de abrirlas y cerrarlas. Un End mal puesto, o un punto y coma en el sitio equivocado, lo que mejor puede pasar es que de un error, porque si no es así, es impredecible lo que estamos haciendo, no sabemos dónde finaliza cada cosa y empieza la siguiente.

Ejercicio sobre condicional With.1- Veamos un ejemplo muy sencillo. Deseamos que al oprimir un botón el edit1 sufra los

siguientes cambios. Se le asigne un texto que diga Oscar, se ponga de color amarillo, se ponga en letra mayúscula y se coloque en la posición 10,10 del formulario.

25

a- Para ver como son los anidamientos en la propiedad font vamos a modificarle sus subpropiedades color y estilo dándole los valores rojo y fsbold respectivamente.

Solución por fases. Fase de diseño.

1- Necesitamos colocar un boton y un edit en nuestro formulario. El edit debe estar aproximadamente en el centro del formulario.

Fase de diseño – ejecución.1- Lo primero es saber que todo sucede cuando le hagamos click a un botón. Así que

debemos marcar el botón, ir al inspector de objetos y en el evento OnClick del botón programar lo siguiente:

procedure TForm1.Button1Click(Sender: TObject);begin with edit1 do begin text := 'Oscar'; color := clyellow; charcase := ecUppercase; left := 10; top := 10; end;end;

2- Corra el programa para que vea lo que ha logrado.

a- Para solucionar este inciso tan solo debemos incluir dentro del begin-end del With y si desea debajo de la asignacion a la propiedad top el siguiente código:

with font do begin color := clred; style := [fsbold]; end;

El ejercicio al final quedaría de la siguiente forma:

procedure TForm1.Button1Click(Sender: TObject);begin with edit1 do begin text := 'Oscar'; color := clgreen; charcase := ecUppercase;

26

left := 10; top := 10; with font do begin color := clred; style := [fsbold]; end; end;end;

3.9 – Estructuras de control de flujo.

Estas, como las anteriores, son estructuras de utilización continua. Creo que nadie se puede imaginar un programa sin encontrarse con ellas de forma continuada. La esencia de un bucle, como puede suponerse, es repetir hasta que se indique lo contrario, se cumpla una condición, etc. y dependiendo de ello hay tres que son igualmente útiles: El FOR, el WHILE y el REPEAT, a pesar de que el último he apreciado que se sustituye en muchas ocasiones por el While, siendo, no obstante, distinto su cometido.

3.9.1- Bucle FOR.

Este bucle no hace mas que repetir una determinada cantidad de veces(desde un valor inicial hasta un valor final) una o varias sentencias que se encontraran en su estructura. Su estructura sería:

FOR <variable>:= <valor inicial> TO <valor final> DO sentencia

Si el código es un conjunto de sentencias que deseamos que se realicen en este ciclo debemos incluirlo entre un begin-end:

FOR <variable>:= <valor inicial> TO <valor final> DO begin <codigo> end;

27

Esta estructura es cuando el valor que va tomando (I) va aumentando. Ahora si queremos que ese valor en vez de ir aumentando queremos que vaya decreciendo, la estructura sería la siguiente:

FOR <variable>:= <valor inicial> DOWNTO <valor final> DO begin <codigo> end;

Nota: Este valor inicial va a ser mayor que el valor final.

Nota: Las sentencias que se estén realizando dentro del ciclo se van a estar realizando hasta que la variable que controla el ciclo tome el valor final y luego de tomar el valor final es que comienza a realizar las sentencias continúan después del ciclo.

Ejercicio sobre bucle FOR1- Entrado un número calcular su factorial.

Solución por fases. Fase de diseño.

1- Necesitamos dos edit, uno para entrar el número y otro para mostrar su factorial.

Fase de diseño - ejecución.1- Tenemos que saber como se calcula el factorial de un número. El factorial de

número x no es mas que multiplicar todos los número desde el uno hasta el número x. por ejemplo el factorial de 3 es (1*2*3=6), el de 4 es (1*2*3*4=24) y así sucesivamente.

2- Todo el calculo y la muestra del resultado ocurrirá al hacer clic en el botón. Al oprimirlo el programa debe calcular el factorial del número y mostrarlo. Para ello debemos hacer un ciclo y dentro de el hacer un factorizador. El ciclo debe ser desde uno (porque es el primer número que se multiplica) hasta el valor entrado en el edit. El código nos quedaría de la siguiente forma:

a:= strtoint(edit1.text); // le asigno a (a) el valor entrado en el edit1For I := 1 to a do // hago un ciclo desde 1 hasta (a) Begin B:=B*I; // a B le va a ir multiplicando todos los valores que va a ir tomando I desde 1 hasta a que es el valor del edit1. End;Edit2.text := inttostr(B); //luego que la variable que controla el ciclo(I) toma el ultimos valor entonces muestra en el edit2 el valor del factorial(B).

3- Aun el ejercicio no ha terminado ya que como pueden ver hay variables que no han sido declaradas como son (a, I). La variable B la veremos aparte. Las variables (a) e (I) solo van a ser utilizadas en este procedimiento por tanto se pueden declarar como enteras entre el procedure - begin de este procedimiento.

28

4- La variable B también se va usar solo en este procedimiento por tanto también podemos declararlas como enteras entre el procedure y el begin de este procedimiento. Pero si corre el programa y le aconsejo que lo haga, verás que el resultado mostrado siempre va a ser cero, esto es debido a que por ejemplo si entar el valor 5 entonces el ciclo va a ser desde uno hasta 5. Ahora cuando entra al ciclo comienza la multiplicación de (B:=B*I), I comienza por el valor 1 y B como no se le ha dado ningun valor tiene valor cero, entonces a B:=0*1 o lo que es lo mismo B:=0. Como el ciclo es hasta 5 entonces I entra ahora con el valor 2 y b anteriormente tomo el valor cero por lo que ahora B:=0*2 o lo que es lo mismo B:=0. Este proceso se repite hasta que I toma el valor 5, sale del ciclo y muestra el valor de B en el edit 2 que es cero. Esto sucede porque a B hay que darle un valor inicial el cual en este caso tiene que ser 1. Este valor inicial hay que asignárselo antes que comience el ciclo. Por lo tanto antes de la asignación (a := strtoint(edit1.text)) debemos agregar B:=1. que hara esta asignación, cuando entra al ciclo comienza la multiplicación de (B:=B*I), I comienza por el valor 1 y B con su valor inicial 1, entonces a B:=1*1 o lo que es lo mismo B:=1. Como el ciclo es hasta 5 entonces I entra ahora con el valor 2 y B anteriormente tomo el valor 1 por lo que ahora B:=1*2 o lo que es lo mismo B:=2. Luego B:=2*3 o sea B:= 6, luego B:=6*4 o sea B:=24, luego B:=24*5 o sea B:=120. Terminado el ciclo ya que I ha tomado el valor 5 entonces sale del ciclo y muestra el resultado en edit2.

3.9.2- Bucle WHILE.

La ventaja de éste, es que puede sustituir a cualquier otro, por mucho que lo lógico es utilizar cada tipo para lo que ha sido creado. Como todos su misión es ejecutarse en tanto que se cumpla una condición dada. Su forma es: Mientras <condiciones sea cierta> haz Begin sentencias end

Su forma para decírselo a la maquina es:

While <condiciones sea cierta> do Begin sentencias End;

Lo que hace más exactamente este bucle es que mientras la condicion sea cierta estará haciendo lo orientado después del do.

29

Ejercicio sobre bucle While1- Realizar un programa que permita entrar cinco nombres.a- Tecleado un nombre verificar si este nombre está guardado en la lista.

Solución por fases. Fase de diseño.

1- Necesitamos un edit para entrar un nombre.2- Necesitamos un botón para que al oprimirlo se guarden los nombres en la lista.

Fase de diseño-ejecución.1- Los nombres serán guardados al oprimir el botón. Para guardarlos necesitamos una

variable de arreglo que nos permita guardar los cincos nombres. Esta variable será utilizada sólo en este procedimiento así que la podemos declarar entre el procedure-begin del evento OnClick del botón de la siguiente forma:

Var a:array [1..5]of string;

2- Ahora para asignarle los nombres a la variable de arreglo debemos escribir el siguiente código en el procedimiento generado por el evento OnClick del botón:

c:=c+1;// contador, recordar que hay que declararlo e inicializarlo a[c]:=edit1.text;//a la variable de arreglo en el subindice ‘c’le asignamos el nombre(edit). Si corre el programa no entre más de cinco nombres porque le dará error ya que la variable está declarada para almacenar sólo cinco nombres.a- Fase de diseño.1- Necesitamos otro edit para teclear el nombre que se va a verificar.2- Necesitamos otro botón para que al oprimirlo verifique si el nombre está en la lista.

a- Fase de diseño-ejecución.1- Lo que tenemos que hacer al oprimir el botón es verificar si el nombre tecleado

pertenece a la lista o no. Para esto utilizaremos el bucle while.2- En el evento OnClick de este segundo botón debemos escribir entonces el siguiente

código:

While a[b]<>edit2.text do //mientras la variable de arreglo sea desigual de lo escrito en el edit2 hará… Begin b:=b+1; //b es un contador, recordar lo que hay que hacer antes de utilizarlo End;

Estas líneas lo que hacen es que mientras la variable de arreglo subindizada que comienza en el arreglo cero sea diferente del nombre entrado en el edit2 contará para luego preguntar por el arreglo que le sigue.

30

3- Sucede algo si corre el programa, si el nombre está en la lista no te dice si estaba o no, además si el nombre no se encuentra el ciclo continuará por lo que parecerá como si el programa se hubiese bloqueado. Analicemos como hacer para que esto no suceda.

3.1- Si el nombre no aparece en la lista entonces seguirá el ciclo por lo que seguirá contando indefinidamente. Ahora lo que pretendo hacer es que como son cinco nombres no necesito verificar un sexto nombre por lo que si no encuentra el nombre entre los cinco primeros caracteres entonces detendré el ciclo y mostraré un mensaje que diga que el nombre no aparece en la lista. Para esto entre el begin-end que está dentro del ciclo y debajo del contador añadiremos las siguientes líneas de código:

If b=6 then begin Break;//detiene el ciclo Showmessage(‘el nombre no aparece en la lista’);//muestra el mensaje end;

3.2- Ya tenemos como detener el ciclo, veamos como podemos mostrar si el nombre aparece o no. Cuando este ciclo encuentra el nombre se detiene automáticamente deteniendo también el contador. Si lo encuentra entonces el valor que podría haber alcanzado el contador (b) será el valor 5. teniendo en cuenta esta condición podemos entonces añadir las siguientes líneas de código después del end del ciclo:

If b<=5 then Showmessage(‘el nombre si aparece en la lista’)

3.3- Corra el programa para verificar que todo esté correcto.

3.9.3- Bucle REPEAT.

Este bucle no hace más que repetir sentencias hasta que se cumpla una determina condición. En palabras sería:

Repite <Sentencias> Hasta que <condiciones>

En código sería:

Repeat <sentencias> until

31

<condiciones>

Ejercicio sobre bucle Repeat.1- Realicemos el inciso (a) del ejercicio del bucle While pero ahora con este nuevo

bucle.

Fase de diseño-ejecución.1- Tienen que hacer antes de realizar el inciso (a) que realicen

2- En el evento OnClick del botón2 escribimos el siguiente código:

Repeat begin b:=b+1;// contador, recordar que hay que hacer antes de utilizarlo end until a[b]= edit2.text;

3- Ahora sucede lo mismo que vimos al resolver el ejercicio por la otra vía y es que no se sabe si el nombre estaba en la lista o no. Para esto debemos hacer lo mismo que se hizo en el ejercicio anterior. Cuando no lo encuentra entre los cinco nombres entonces el valor del contador será mayor que seis, así que lo que vamos a hacer es detener el bucle cuando (b) tome el valor seis, entonces añadimos entre el begin-end del bucle y debajo del contador:

If b=6 then Begin Showmessage(‘el nombre no está en la lista’) Break; End;

4- Si encuentra el nombre simplemente saldrá del ciclo y (b) tendrá un valor menor o igual que 5, así que podemos añadir una línea para que nos diga si encontró el nombre en la lista. Entonces ya fuera del ciclo escribimos el siguiente código:

If b<=5 then Showmessage(‘el nombre si se encuentra en la lista’)

5- Corra el programa para que observe lo que ha realizado.

3.9.4- Bucle Try.

Este bucle se utiliza principalmente para la captura de errores (excepciones) lo cual veremos mas profundamente en otro apartado.

32

La estructura es la siguiente:

Prueba a hacer Sentencias luego Sentencias.

Try // nuevos procesos Finally // procesos de finalización del segundo Try End;

33