OBJETIVO EDUCACIONAL Comprenderá los conceptos básicos de la programación, y escribirá expresiones aritméticas y lógicas en un lenguaje de programación. ACTIVIDADES DE APRENDIZAJE 4.1 Realizar un mapa conceptual sobre los tipos de software y posconceptos básicos de programación. 4.2 Realizar ejercicios de codificación de expresiones aritméticas y lógicas en un lenguaje de programación. 4.3 Buscar la información necesaria para instalar y configurar el compilador del lenguaje de programación a utilizar. 4.4 Compilar y ejecutar un programa modelo. 4.5 Realizar cambios en expresiones lógicas y algebraicas de un programa modelo y analizar los resultados obtenidos. FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN 4.1 CLASIFICACIÓN DEL SOFTWARE El software paulatinamente adquirió mayor importancia que el hardware. En un principio, la proporción favorecía al equipo físico, pero progresivamente, el componente inmaterial adquirió una mayor relevancia hasta hacerse el más importante. Para facilitar su análisis, el software se clasifica generalmente en tres grandes rubros: sistemas operativos, lenguajes de programación y programas de aplicación. Clasificación del Software Fig. 4.1 Evolución progresiva del software – hardware Además de estas categorías basadas en tareas, varios tipos de software se describen basándose en su método de distribución. Entre estos se encuentran los así llamados programas enlatados, el software desarrollado por compañías y vendido principalmente por distribuidores, el freeware y software de dominio público, que se ofrece sin costo alguno, el shareware, que es similar al freeware, pero suele conllevar una pequeña tasa a pagar por los usuarios que lo utilicen profesionalmente. 4.1.1 Software Del Sistema Sistema operativo, software básico que controla una computadora. El sistema operativo tiene tres grandes funciones: coordina y manipula el hardware del ordenador o computadora, como la memoria, las impresoras, las unidades de disco, el teclado o el mouse; organiza los archivos en diversos dispositivos de almacenamiento, como discos flexibles, discos duros, discos compactos o cintas magnéticas, y gestiona los errores de hardware y la pérdida de datos. Los sistemas operativos controlan diferentes procesos de la computadora. Un proceso importante es la interpretación de los comandos que permiten al usuario comunicarse con el ordenador. Algunos intérpretes de instrucciones están basados en texto y exigen que las instrucciones sean tecleadas. Otros están basados en gráficos, y permiten al usuario comunicarse señalando y haciendo clic en un icono. Por lo general, los intérpretes basados en gráficos son más sencillos de utilizar. 62 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN Los sistemas operativos pueden ser de tarea única o multitarea. Los sistemas operativos de tarea única, más primitivos, sólo pueden manejar un proceso en cada momento. Por ejemplo, cuando la computadora está imprimiendo un documento, no puede iniciar otro proceso ni responder a nuevas instrucciones hasta que se termine la impresión. Todos los sistemas operativos modernos son multitarea y pueden ejecutar varios procesos simultáneamente. En la mayoría de los ordenadores sólo hay una UCP (Unidad Central de Procesamiento); un sistema operativo multitarea crea la ilusión de que varios procesos se ejecutan simultáneamente en la UCP. El mecanismo que se emplea más a menudo para lograr esta ilusión es la multitarea por segmentación de tiempos, en la que cada proceso se ejecuta individualmente durante un periodo de tiempo determinado. Si el proceso no finaliza en el tiempo asignado, se suspende y se ejecuta otro proceso. Este intercambio de procesos se denomina conmutación de contexto. El sistema operativo se encarga de controlar el estado de los procesos suspendidos. 4.1.2 Software De Aplicación El Software de Aplicación es un programa informático diseñado para facilitar al usuario la realización de un determinado tipo de trabajo. Posee ciertas características que le diferencia de un sistema operativo (que hace funcionar al ordenador), de una utilidad (que realiza tareas de mantenimiento o de uso general) y de un lenguaje (con el cual se crean los programas informáticos). Suele resultar una solución informática para la automatización de ciertas tareas complicadas como puede ser la contabilidad o la gestión de un almacén. Dentro de las aplicaciones se pueden distinguir distintas versiones según su funcionalidad: • • • • • Freeware: son programas de libre distribución, gratuitos y no sujetos a ningún tipo de limitación legal para su uso. Shareware: tienen una funcionalidad limitada, es decir, se ejecutarán en nuestro ordenador parcialmente. Así, puede que no tenga activas todas las opciones de menú o que tenga un periodo de vigencia de un número de días concretos, tal lo cual dejará de funcionar. Beta: versiones previas de un programa, destinado a su comprobación de funcionamiento real en ordenadores personales antes de su lanzamiento comercial. Demo: software comercial destinado a mostrar al posible usuario sus características. Al igual que los programas shareware, tienen limitadas las opciones de ejecución o el periodo de validez. Comerciales: son aquellas que se encuentran sujetas a su compra para poder usarlas en el ordenador. Normalmente tras su adquisición debe procederse al registro del producto [1]. CAPÍTULO 4 63 Conceptos de la programación Ciertas aplicaciones desarrolladas 'a medida' suelen ofrecer una gran potencia ya que están exclusivamente diseñadas para resolver un problema específico. Otros, llamados paquetes integrados de software, ofrecen menos potencia pero a cambio incluyen varias aplicaciones, como un programa procesador de textos, de hoja de cálculo, base de datos, editor de imágenes, reproductores de sonido y video, navegadores web, antivirus, compresores, seguridad, etc. FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN 4.2 CONCEPTOS DE LA PROGRAMACION Antes de iniciar con el proceso de programación, es conveniente tener claro algunos conceptos preliminares respecto a ciertos conceptos relacionados con ella, que deben entenderse, reconocerse y comprenderse. Desde el punto de vista del usuario, un programa, son las especificaciones de un conjunto de operaciones que debe llevar a cabo el computador para lograr resolver una determinada tarea. Un programa se escribe en un lenguaje de programación, estos lenguajes permiten simplificar la creación de programas debido a su fácil descripción de las instrucciones que ha de ejecutar el procesador; en algunos casos, agrupando varias instrucciones y dando un solo nombre al conjunto, de tal forma que la lista de operaciones se reduce considerablemente, resultando fácil la comprensión y resolución de programas. También varios cientos de instrucciones simples se pueden expresar con una lista de unas cuantas líneas. Finalmente, a la acción de realizar un programa se le conoce como programación. A menudo, el lenguaje de programación se denomina software de programación cuando se emplea un término genérico, a fin de distinguirlo del hardware. En conclusión, reuniendo estos tres conceptos podemos decir: Un programa se escribe en un lenguaje de programación y a la actividad de expresar un algoritmo en forma de programa se le denomina programación. 4.2.1 Definición De Programa Un programa de ordenador o computadora (software) es una secuencia de instrucciones que una computadora puede interpretar y ejecutar. Para la elaboración de un programa se requiere de las siguientes fases: • • • • • • Definición y análisis de problema. Diseño de algoritmos. Codificación Depuración y verificación Documentación. Mantenimiento Un programa al considerarse, como una secuencia de acciones (instrucciones) que manipulan un conjunto de objetos (datos). Contendrá, por lo tanto, dos bloques para la descripción de estos aspectos: • Bloque de declaraciones: En él se especifican todos los objetos que utiliza el programa (variables, constantes, tablas, registros, archivos, etcétera). • Bloque de instrucciones: Constituido por el conjunto de operaciones que se han de realizar para la obtención de los resultados deseados [2]. 64 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN 4.2.2 Definición De Programación Se llama programación a la creación de un programa de computadora, un conjunto concreto de instrucciones que una computadora puede ejecutar. El programa se escribe en un lenguaje de programación, aunque también se pueda escribir directamente en lenguaje de máquina, con cierta dificultad. Un programa se puede dividir en diversas partes, que pueden estar escritas en lenguajes distintos. La programación de ordenadores debe perseguir tres objetivos fundamentales: • Corrección. Un programa es correcto si hace lo que debe hacer. Para determinar si un programa hace lo que debe es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y una vez acabado compararlo con lo que realmente hace. • Claridad. Es muy importante que el programa sea lo más claro posible y legible posible para mejorar el mantenimiento del software. Cuando se acaba de escribir el código del programa, se deben buscar errores y corregirlos. Más concretamente, cuando el programa está concluido, es necesario hacerle ampliaciones y/o modificaciones, según la demanda de los usuarios, esta labor puede ser llevada acabo por el mismo programador que implementó el programa o por otros. • Eficiencia, Debe consumir la menor cantidad de recursos posible. Normalmente al hablar de eficiencia se suele hacer referencia al consumo de tiempo y/o memoria. La eficiencia y la claridad de un programa pueden ser objetivos contrapuestos: se puede conseguir mayor claridad sacrificando parte de la eficiencia o viceversa. Pero hay que tener en cuenta que el tiempo del programador es caro, y que hoy en día el precio de los ordenadores es razonable y cada vez son más baratos. 4.2.3 Definición De Lenguaje De Programación Un lenguaje de programación es una técnica estándar de comunicación que permite expresar las instrucciones que han de ser ejecutadas en una computadora. Consiste en un conjunto de reglas sintácticas y semánticas que definen un programa informático. Un lenguaje de programación permite a un programador especificar de manera precisa sobre qué datos una computadora debe operar, cómo deben ser estos almacenados y transmitidos y, qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Un programa escrito en un lenguaje de programación necesita pasar por un proceso de compilación, es decir, ser traducido al lenguaje de máquina, o ser interpretado para que pueda ser ejecutado por el ordenador. CAPÍTULO 4 65 FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN 4.3 DATOS Todas las aplicaciones del software pueden colectivamente llamarse procesamiento de datos. El software se construye para procesar datos: para transformar datos de una forma a otra, es decir, para aceptar una entrada, manipularla de alguna forma y producir una salida. 4.3.1 Definición Un dato es una representación simbólica (numérica, alfabética, etc.) de un atributo o característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado (procesado) se puede utilizar en la realización de cálculos o toma de decisiones. Podemos definir un tipo de dato a partir de los valores permitidos y las operaciones que se puedan llevar a cabo sobre estos valores. 4.3.2 Tipos De Datos La tabla 4.1 lista los tipos de datos primitivos de Java. Los tipos primitivos son los bloques de construcción de tipos más complicados. Al igual que sus lenguajes predecesores C y C++, Java requiere que todas las variables tengan un tipo antes de que se puedan usar en un programa. Por esta razón, caracterizamos a Java como un lenguaje de tipos estrictos. resentación en memoria A diferencia de C y C++, los tipos primitivos de Java son portátiles entre todas las plataformas que reconocen a Java (Windows, Linux, Mac, etc.). Esto permite a los programadores escribir los programas una sola vez sin saber en cuál plataforma de computadora se ejecutará el programa [3]. Tipo Bolean Char Valores true o false '\u0000' a '\uFFFF' Byte Short Int Long -128 a +127 -32,768 a +32,767 -2,147,483,648 a +2,147,483,647 -9,223,372,036,854,775,808 a +9,223,372,036,854,77 5 ,807 -3.40292347E+38 a +3.40292347E+38 -1.79769313486231570E+308 a + 1.79769313486231570E+308 Flota Double Estándar (Conjunto de caracteres ISO Unicode) (IEEE 754 de punto flotante) (IEEE 754 de punto flotante) Tabla 4.1 Los tipos de datos primitivos de Java. 66 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN 4.3.3 Identificadores Un nombre de variable o de referencia es cualquier identificador válido. Un identificador es una serie de caracteres que consiste en letras, dígitos, subrayados (_) y signos de dólar ($) que no comienza con un dígito. Java permite identificadores de cualquier longitud, y es sensible a la caja: las letras mayúsculas y minúsculas son diferentes, de modo que a2 y A2 son dos identificadores distintos. La selección de los nombres de variables o identificadores significativos ayuda a que los programas se “autodocumenten”, es decir, es mas fácil entender los programas con solo leerlos, sin tener que leer manuales o incluir demasiados comentarios. Las palabras reservadas no pueden usarse como identificadores, es decir, como nombre de variables. En la tabla 4.2 presentamos una lista completa de las palabras clave de Java [4]. Palabras Reservadas de Java Abstract boolean Catch char Do double Final finally Implements Import Long native Private protected Static super Throw throws Void volatile break class else float instanceof new public switch transient while byte continue extends for int null return synchronized true Palabras clave que están reservadas aunque Java no las usa Byvalue cast const future Goto Inner operator outer Var case default false if interface package short this try generic rest Tabla 4.2 Palabras reservadas en Java 4.3.4 Almacenamiento, Direccionamiento Y Representación En Memoria La memoria de ordenador es la parte del hardware que retiene durante cierto período de tiempo información que necesita el sistema para funcionar correctamente. En los programas en C y C++, los programadores a menudo tenían que escribir varias versiones de los programas para trabajar con las numerosas plataformas de computadora porque no se garantizaba que los tipos de datos primitivos serían idénticos en todas las computadoras. Por ejemplo, un valor int en una máquina podría representarse con 16 bits (2 bytes) de memoria, y un valor int en otra máquina podría representarse con 32 bits (4 bytes) de memoria. En Java, los valores int siempre tienen 32 bits (4 bytes) [5]. CAPÍTULO 4 67 Sis FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN Tipo Bolean Char Byte Short Int Long Flota Double Tamaño en bits 1 16 8 16 32 64 32 64 Tabla. 4.3 Tamaño de almacenamiento en memoria Los nombres de variables como sum y number en realidad corresponden a posiciones en la memoria de la computadora. Toda variable tiene un nombre, un tipo, un tamaño y un valor. Ilustrémoslo con el siguiente enunciado: number = Integer. parseInt ( o.toString () ); el valor tecleado por el usuario en el campo de texto se coloca en una posición de memoria a la que el compilador asigna el nombre number. Supongamos que el usuario introduce el número 45 como valor para number. La computadora colocará 45 en la posición number como se muestra en la figura 4.2 Siempre que un valor se coloca en una posición de memoria, este nuevo valor sustituye al valor que estaba antes en esa posición. El valor anterior se destruye. Una vez que el programa obtiene un valor, lo adiciona a la suma y coloca el resultado en la variable sum. El enunciado: sum = sum + number; que realiza la suma también implica la destrucción de un valor. Esto ocurre cuando la suma calculada de sum y number se coloca en la posición sum (sin considerar el valor que podría haber estado ya en sum). Una vez calculada sum, la memoria queda como se ilustra en la figura 4.3. Observe que el valor de la variable number aparece exactamente igual que antes de que lo usáramos en el cálculo de sum, Usamos el valor, pero no lo destruimos, cuando la computadora realizó el cálculo. Por tanto, cuando se lee un valor de una posición de memoria, el proceso no es destructivo [6]. number 45 Fig. 4.2 Posición de memoria en la que se puede ver el nombre y el valor de una variable. 68 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN Number 45 Sum 45 Fig. 4.3 Posiciones de memoria después de un cálculo 4.3.5 Sistema De Numeración Binaria Y Hexadecimal En esta sección presentaremos los sistemas de numeración más importantes que usan los programadores en Java, sobre todo cuando trabajan en proyectos de software que requieren una interacción íntima con hardware en el "nivel de máquina". Entre los proyectos de esta índole podemos mencionar los sistemas operativos, el software para trabajo con redes de computadoras, compiladores, sistemas de bases de datos y aplicaciones que requieren alto rendimiento. Cuando escribimos un entero como 227 o -63 en un programa en Java, se da por sentado que el número está en el sistema de numeración decimal (base 10). Los dígitos del sistema de numeración digital son 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. El dígito más bajo es 0 y el dígito más alto es 9, uno menos que la base (10). Internamente, las computadoras usan el sistema de numeración binario (base 2). El sistema de numeración binario tiene sólo dos dígitos, 0 Y l. El dígito más bajo es 0 y el más alto es 1, uno menos que la base (2). Como veremos, los números binarios tienden a ser mucho más largos que sus equivalentes decimales. Para los programadores que trabajan con lenguajes de ensamblador y con lenguajes de alto nivel como Java que permiten a los programadores bajar hasta el "nivel de máquina" resulta laborioso trabajar con números binarios. Es por ello que se ha popularizado el uso de otros dos sistemas, el sistema de numeración octal (base 8) y el sistema de numeración hexadecimal (base 16), pues permiten abreviar los números binarios. En el sistema de numeración octal, los dígitos van del 0 al 7. Dado que tanto el sistema de numeración binario como el octal tienen menos dígitos que el sistema decimal, sus dígitos son los mismos que los dígitos correspondientes en el sistema decimal. El sistema de numeración hexadecimal presenta un problema porque requiere 16 dígitos: un dígito inferior de 0 y un dígito superior con un valor equivalente al 15 decimal (uno menos que la base, 16). Por convención, usamos las letras de la A a la F para representar los dígitos hexadecimales que corresponden a los valores decimales del 10 al 15. Así, en hexadecimal podemos tener números como 876 que consisten exclusivamente en dígitos tipo decimal, números como 8A55F que consisten en dígitos y letras y números como FFE que consisten exclusivamente en letras. Ocasionalmente, un número hexadecimal deletreará una palabra común como CABE o FABADA; esto puede parecer extraño a programadores acostumbrados a trabajar con números. CAPÍTULO 4 69 FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN Todos estos sistemas de numeración emplean notación posicional: cada posición en la que se escribe un dígito tiene un valor de posición distinto. Por ejemplo, en el número decimal 937 (llamamos al 9, el 3 y el 7 valores de símbolo) decimos que el 7 está escrito en la posición de las unidades, el 3 está escrito en la posición de las decenas y el 9 está escrito en la posición de las centenas. Observe que cada una de estas posiciones es una potencia de la base (base 10) y que estas potencias comienzan en 0 y aumentan en 1 conforme nos movemos hacia la izquierda en el número [7]. Dígito Binario 0 1 Digito Octal 0 1 2 3 4 5 6 7 Dígito Decimal 0 1 2 3 4 5 6 7 8 9 Dígito Hexadecimal 0 1 2 3 4 5 6 7 8 9 A (Valor decimal del 10) B (Valor decimal del 11) C (Valor decimal del 12) D (Valor decimal del 13) E (Valor decimal del 14) F (Valor decimal del 15) Tabla 4.4 Dígitos de los Sistemas de Numeración Binario, Octal, Decimal y Hexadecimal. Atributo Base Dígito inferior Dígito superior Binario 2 0 1 Octal 8 0 7 Decimal 10 0 9 Hexadecimal 16 0 F Tabla 4.5 Comparación de los Sistemas de Numeración Binaria, Octal, Decimal y Hexadecimal Valores de posición en el Sistema de numeración Decimal Dígito decimal 9 Nombre de posición centenas Valor de posición 100 Valor de posición como potencia de la base (10) 102 3 decenas 10 101 7 unidades 1 100 Tabla 4.6 Valores de posición en el Sistema de Numeración Decimal En el caso de números decimales más grandes, las siguientes posiciones a la izquierda serían la posición de los millares (10 a la tercera potencia), la posición de las decenas de millar (10 a la cuarta potencia), la posición de las centenas de millar (10 a la quinta potencia), la posición de los millones (10 a la sexta potencia), la posición de las decenas de millones (10 a la séptima potencia), y así sucesivamente. 70 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN En el número binario 101, decimos que el 1 de la extrema derecha está escrito en la posición de las unidades, el 0 está escrito en la posición de los doses y el 1 de la izquierda está escrito en la posición de los cuatros. Observe que cada una de estas posiciones es una potencia de la base (base 2) y que dichas potencias comienzan en 0 y aumentan en 1 conforme nos movemos a la izquierda en el número [8]. Valores de posición en el Sistema de numeración Binario Dígito binario 1 Nombre de posición cuatros Valor de posición 4 Valor de posición como potencia de la base (2) 22 0 doses 2 21 1 unos 1 20 Tabla 4.7 Valores de posición en el Sistema de numeración Binario En el caso de números binarios más grandes, las siguientes posiciones a la izquierda serían la posición de los ochos (2 a la tercera potencia), la posición de los dieciseises (2 a la cuarta potencia), la posición de los treinta y doses (2 a la quinta potencia), la posición de los sesenta y cuatros (2 a la sexta potencia), y así sucesivamente. En el número octal 425, decimos que el 5 está escrito en la posición de las unidades, el 2 está escrito en la posición de los ochos y el 4 en la posición de los sesenta y cuatros. Observe que cada una de estas posiciones es una potencia de la base (base 8) y que dichas potencias comienzan en 0 y aumentan en 1 conforme nos movemos a la izquierda en el número [9]. Valores de posición en el Sistema de numeración Octal Dígito Octal 4 Nombre de posición sesenta y cuatros Valor de posición 64 Valor de posición como potencia de la base (8) 82 2 ochos 8 81 5 unos 1 80 Tabla 4.8 Valores de posición en el Sistema de numeración octal En el caso de números octa1es más grandes, las siguientes posiciones a la izquierda serían la posición de los quinientos doces (8 a la tercera potencia), la posición de los cuatro mil noventa y seises (8 a la cuarta potencia), la posición de los treinta y dos mil setecientos sesenta y ochos (8 a la quinta potencia), y así sucesivamente. En el número hexadecimal 3DA, decimos que la A está escrita en la posición de las unidades, la D está escrita en la posición de los dieciseises y el 3 está escrito en la posición de los doscientos cincuenta y seises. Observe que cada una de estas posiciones es una potencia de la base (base 16) y que dichas potencias comienzan en 0 y aumentan en 1 conforme nos movemos a la izquierda en el número [10]. Valores de posición en el Sistema de numeración Hexadecimal Dígito Hexadecimal 3 Nombre de posición doscientos cincuenta y seises Valor de posición 256 Valor de posición como potencia de la base (16) 162 D dieciseises A unos 16 161 1 160 Tabla 4.9 Valores de posición en el sistema de numeración hexadecimal. CAPÍTULO 4 71 FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN En el caso de números hexadecimales más grandes, las siguientes posiciones a la izquierda serían la posición de los cuatro mil noventa y seises (16 a la tercera potencia), la posición de los sesenta y cinco mil quinientos treinta y seises (16 a la cuarta potencia), y así sucesivamente. 4.4 OPERADORES, OPERANDOS Y EXPRESIONES Operadores Aritméticos. Casi todos los programas realizan cálculos aritméticos. Los operadores aritméticos se resumen en la Tabla 4.10. Tome nota del uso de varios símbolos especiales que no se emplean en álgebra. El asterisco (*) indica multiplicación y el signo de porcentaje (%) es el operador de residuo que veremos un poco más adelante. Los operadores aritméticos de la Tabla 4.10 son operadores binarios. Por ejemplo, la expresión sum. + value contiene el operador binario + y los dos operandos sum y value. La división entera produce un cociente entero; por ejemplo, la evaluación de la expresión 7 / 4 produce 1, y la evaluación de la expresión 17 / 5 produce 3. Observe que cualquier parte fraccionaria en la división entera simplemente se desecha (es decir, el cociente se trunca); no hay redondeo. Java cuenta con el operador de residuo, %, que produce el residuo de la división entera. El operador de residuo es un operador entero que sólo puede usarse con operadores enteros. La expresión x % y produce el residuo que queda después de dividir x entre y. Así, 7 % 4 produce 3, y 17 % 5 produce 2. Operación de Java Suma Resta Multiplicación División Residuo Operador Aritmético + * / Expresión Algebraica f+7 P–c bm x/y o % x y o x÷y r mod s Expresión en Java f+7 p–c b*m x/y r%s Tabla 4.10 Operadores aritméticos. Operadores de asignación. Java proporciona varios operadores de asignación cuyo propósito es abreviar las expresiones de asignación. Por ejemplo, el enunciado: J = J + 3; se puede abreviar con el operador de suma y asignación += así: J += 3; El operador += suma el valor de la expresión que está a la derecha del operador al valor de la variable que está a la izquierda del operador y almacena el resultado en la variable que está a la izquierda del operador. Cualquier enunciado de la forma: 72 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN variable = variable operador expresión; donde operador es uno de los operadores binarios +, -, *, / o % (u otros que veremos más adelante), se puede escribir en la forma: variable operador= expresión; Por tanto, la asignación J += 3 suma 3 a J. En la figura 4.11 se muestran los operadores de asignación aritmética, expresiones de ejemplo de uso de dichos operadores, y explicaciones [11]. Operador de asignación Expresión de muestra Explicación Suponga int C=3, D=5, E=4, F=6, G=12; += C += 7 -= D -= 4 *= E *= 5 /= F /= 3 %= G %= 9 Asigna C=C+7 D=D–4 E=E*5 F=F/3 G=G%9 10 a C 1aD 20 a E 2aF 3aG Tabla 4.11 Operadores de asignación aritmética. Operadores de incremento y decremento. Java ofrece el operador de incremento unario ++, y el operador de decremento unario --, que se resumen en la tabla 4.12. Si una variable c se incrementa en 1, se puede utilizar el operador de incremento ++ en lugar de las expresiones c = c + 10 c += 1. Si el operador de incremento o decremento se coloca antes de una variable, decimos que es un operador de preincremento o de predecremento, respectivamente. Si el operador de incremento o decremento se coloca después de la variable, decimos que es un operador de postincremento o de postdecremento, respectivamente. Cuando preincrementamos (o predecrementamos) una variable, hacemos que se sume (reste) 1 a la variable y luego se use el nuevo valor de la variable en la expresión en la que aparece. Cuando postincrementamos (postdecrementamos) una variable, hacemos que se use el valor actual de dicha variable en la expresión en la que aparece, y luego se sume (reste) 1 al valor de la variable. Operador ++ Llamado Preincremento Expresión de muestra ++A ++ Posincremento A++ -- Predecremento --B -- Posdecremento B-- Explicación Incrementar A en 1 y luego usar el nuevo valor de A en la expresión en la que A reside. Usar el valor actual de A en la expresión en la que reside y luego incrementar A en l. Decrementar B en 1 y luego usar el nuevo valor de B en la expresión en la que B reside. Usar el valor actual de B en la expresión en la que reside y luego decrementar B en l. Tabla 4.12 Operadores de incremento y decremento Operadores de igualdad y relaciónales. Todos los operadores relacionales tienen le mismo nivel de precedencia y se asocian de izquierda a derecha. Ambos operadores de igualdad tienen el mismo nivel de precedencia, que es CAPÍTULO 4 73 FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN mas bajo que la precedencia de los operadores relaciónales. Los operadores de igualdad también se asocian de izquierda a derecha [12]. Operador de igualdad o relacional algebraico estándar Operador de igualdad o relacional en Java Ejemplo de condición en Java Significado de la condición en Java Operadores de Igualdad = ≠ == != x == y x != y x es igual a y x no es igual a y Operador Relacionales > < ≥ ≤ > < >= <= x>y x>y x >= y x<= y x es mayor que y x es menor que y x es mayor o igual que y x es menor e igual que y Tabla 4.13 Operadores de igualdad y relacionales Operador condicional ?: Este operador, tomado de C/C++, permite realizar bifurcaciones condicionales sencillas. Su forma general es la siguiente: booleanExpression ? res1 : res2 donde se evalúa booleanExpression y se devuelve res1 si el resultado es true y res2 si el resultado es false. Es el único operador ternario (tres argumentos) de Java. Como todo operador que devuelve un valor puede ser utilizado en una expresión. Por ejemplo las sentencias: x=1 ; y=10; z = (x<y) ? x+3 : y+8; asignarían a z el valor 4, es decir x+3. Operadores lógicos. nes Los operadores lógicos se utilizan para construir expresiones lógicas, combinando valores lógicos (true y/o false) o los resultados de los operadores relacionales. La Tabla 4.14 muestra los operadores lógicos de Java. Debe notarse que en ciertos casos el segundo operando no se evalúa porque no es necesario (si ambos tienen que ser true y el primero es false ya se sabe que la condición de que ambos sean true no se va a cumplir). Esto puede traer resultados no deseados y por eso se han añadido los operadores (&) y (|) que garantizan que los dos operandos se evalúan siempre [13]. 74 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN Operador && Nombre AND Utilización op1 && op2 || OR Op1 || op2 ! & | Negación AND OR ! op Op1 & op2 Op1 | op2 Resultado true si op1 y op2 son true. Si op1 es false ya no se evalúa op2 true si op1 u op2 son true. Si op1 es true ya no se evalúa op2 true si op es false y false si op es true true si op1 y op2 son true. Siempre se evalúa op2 true si op1 u op2 son true. Siempre se evalúa op2 Tabla 4.14 Operadores lógicos Operador de concatenación de cadenas de caracteres (+). El operador más (+) se utiliza también para concatenar cadenas de caracteres. Por ejemplo, para escribir una cantidad con un rótulo y unas unidades puede utilizarse la sentencia: System.out.println("El total asciende a " + result + " unidades"); donde el operador de concatenación se utiliza dos veces para construir la cadena de caracteres que se desea imprimir por medio del método println(). La variable numérica result es convertida automáticamente por Java en cadena de caracteres para poderla concatenar. En otras ocasiones se deberá llamar explícitamente a un método para que realice esta conversión. Operadores que actúan a nivel de bits. Java dispone también de un conjunto de operadores que actúan a nivel de bits. Las operaciones de bits se utilizan con frecuencia para definir señales o flags, esto es, variables de tipo entero en las que cada uno de sus bits indican si una opción está activada o no. La Tabla 4.15 muestra los operadores de Java que actúan a nivel de bits [14]. Operador >> << >>> & | ^ ~ Utilización op1>>op2 op1<<op2 op1>>>op2 op1&op2 op1|op2 op1^op2 ~op2 Resultado Desplaza los bits de op1 a la derecha una distancia op2 Desplaza los bits de op1 a la izquierda una distancia op2 Desplaza los bits de op1 a la derecha una distancia op2 (positiva) Operador AND a nivel de bits Operador OR a nivel de bits Operador XOR a nivel de bits Operador complemento Tabla 4.15 Operadores a nivel de bits. En binario, las potencias de dos se representan con un único bit activado. Por ejemplo, los números (1, 2, 4, 8, 16, 32, 64, 128) se representan respectivamente de modo binario en la forma (00000001, 00000010, 00000100, 00001000, 00010000, 00100000, 01000000, 10000000), utilizando sólo 8 bits. La suma de estos números permite construir una variable flags con los bits activados que se deseen. Por ejemplo, para construir una variable flags que sea 00010010 bastaría hacer flags=2+16. Para saber si el segundo bit por la derecha está o no activado bastaría utilizar la sentencia [15], if (flags & 2 == 2) {...} CAPÍTULO 4 75 P FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN La Tabla 4.16 muestra los operadores de asignación a nivel de bits. Operador &= |= ^= <<= >>= >>>= Utilización Op1 &= op2 Op1 |= op2 Op1 ^= op2 Op1 <<= op2 Op1 >>= op2 Op1 >>>= op2 Equivalente a Op1 = op1 & op2 Op1 = op1 | op2 Op1 = op1 ^ op2 Op1 = op1 << op2 Op1 = op1 >> op2 Op1 = op2 >>> op2 Tabla 4.16. Operadores de asignación a nivel de bits. 4.5 PRIORIDAD DE OPERADORES, EVALUACIÓN DE EXPRESIONES Las expresiones aritméticas en Java deben escribirse en forma de línea recta para facilitar la introducción de programas en la computadora. Así, las expresiones como “a dividido entre b” se deben escribir como a / b de modo que todas las constantes, variables y operadores aparezcan en una línea recta. La notación algebraica a b generalmente no es aceptable para los compiladores, aunque existen algunos paquetes de software de aplicación especial que reconocen una notación más natural para las expresiones matemáticas complejas. Usamos paréntesis en las expresiones Java de la misma forma que en las expresiones algebraicas. Por ejemplo, si queremos multiplicar a por la cantidad b + c, escribimos: a * (b + c) Java aplica los operadores de las expresiones aritméticas en un orden preciso determinado por las siguientes reglas de precedencia de operadores, que generalmente son las mismas que se siguen en álgebra: 1. Los operadores de expresiones contenidas dentro de pares de paréntesis se evalúan primero. Así, el programador puede usar paréntesis para forzar la evaluación en cualquier orden que desee. Se dice que los paréntesis están en "el nivel de precedencia más alto". En caso de haber paréntesis anidados, o incrustados, se aplican primero los operadores del par de paréntesis más interno. 2. A continuación se aplican las operaciones de multiplicación, división y residuo. Si una expresión contiene varias operaciones de multiplicación, división y residuo, los operadores se aplican de izquierda a derecha. Decimos que la multiplicación, la división y el residuo están en el mismo nivel de precedencia. es 76 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN 3. Las operaciones de suma y resta se aplican al final. Si una expresión contiene varias operaciones de suma y resta, los operadores se aplican de izquierda a derecha. La suma y la resta también tienen el mismo nivel de precedencia. Las reglas de precedencia de operadores permiten a Java aplicar los operadores en el orden correcto. Cuando decimos que los operadores se aplican de izquierda a derecha, nos estamos refiriendo a la asociatividad de los operadores. Veremos que algunos operadores se asocian de derecha a izquierda. En la tabla 4.17 se resumen estas reglas de precedencia de operadores [16]. Operador(es) () Operador(es) Paréntesis * / % Multiplicación División Residuo Suma Resta +- Orden de Evaluación (Precedencia) Se evalúan primero. Si los paréntesis están anidados, la expresión dentro del par más interno se evalúa primero. Si hay varios pares de paréntesis "en el mismo nivel" (es decir, no anidados), se evalúan de izquierda a derecha. Se evalúan en segundo lugar. Si hay varios, se evalúan de izquierda a derecha Se evalúan en segundo lugar. Si hay varios, se evalúan de izquierda a derecha. Se evalúan al último. Si hay varios, se evalúan de izquierda a derecha. Tabla 4.17 Precedencia de los operadores aritméticos. Consideremos ahora varias expresiones a la luz de las reglas de precedencia de operadores. Cada ejemplo presenta una expresión algebraica y su equivalente en Java. El siguiente es un ejemplo de media aritmética (promedio) de cinco términos: Álgebra: m= a + b + c + d + e 5 Java: m= ( a + b + c + d + e ) / 5 los paréntesis son necesarios porque la división tiene mayor precedencia que la suma. Necesitamos dividir la cantidad completa (a + b + c + d + e) entre 5. Si omitimos erróneamente los paréntesis, obtendremos a + b + c + d + e / 5, que se evalúa así: a + b + c + d + e 5 el siguiente es un ejemplo de la ecuación de una línea recta: Álgebra: y = mx + b Java: y = m * x + b; no necesitamos paréntesis. La multiplicación se aplica primero porque tiene mayor precedencia que la suma. CAPÍTULO 4 77 FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN El siguiente ejemplo contiene operaciones de residuo (%), multiplicación, división, suma y resta: Álgebra: z = p r % q + w / x - y Java: z = p * r % q 2 1 + w 4 / x 3 - y; 5 Los números encerrados en círculos bajo el enunciado indican el orden en que Java aplica los operadores. La multiplicación, el residuo y la división se evalúan primero en orden de izquierda a derecha (esto es, se asocian de izquierda a derecha) puesto que tienen mayor precedencia que la suma y la resta. A continuación se aplican la suma y la resta, también de izquierda a derecha. a * (b + c) + c * (d + e) no contiene paréntesis anidados. Más bien, decimos que los paréntesis están "en el mismo nivel". A fin de entender mejor las reglas de precedencia de operadores, consideremos la evaluación de un polinomio de segundo grado. y = a * 1 x * 2 x + 4 b * 3 x + c; 5 Los números encerrados en círculos bajo el enunciado indican el orden en que Java aplica los operadores. No existe un operador aritmético para la exponenciación en Java, de modo que representamos x2 como x * x. Al igual que en álgebra, es aceptable colocar paréntesis innecesarios en una expresión para hacerla más clara. Estos paréntesis innecesarios también se llaman paréntesis redundantes [17]. Por ejemplo, la expresión de asignación anterior podría escribirse con paréntesis así: y = (a * x * x) + (b * x) + c; 78 CAPÍTULO 4 Estructura básica de un programa No todas las expresiones con varios pares de paréntesis contienen paréntesis anidados. Por ejemplo, la expresión: Proceso de creación de un ejecutable INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN 4.6 ESTRUCTURA BÁSICA DE UN PROGRAMA Los nombres de Java son sensibles a las letras mayúsculas y minúsculas. Así, las variables masa, Masa y MASA son consideradas variables completamente diferentes. Las reglas del lenguaje respecto a los nombres de variables son muy amplias y permiten mucha libertad al programador, pero es habitual seguir ciertas normas que facilitan la lectura y el mantenimiento de los programas de ordenador. Se recomienda seguir las siguientes instrucciones: 1. En Java es habitual utilizar nombres con minúsculas, con las excepciones que se indican en los puntos siguientes. 2. Cuando un nombre consta de varias palabras es habitual poner una a continuación de otra, poniendo con mayúscula la primera letra de la palabra que sigue a otra (Ejemplos: elMayor(), VentanaCerrable, RectanguloGrafico). 3. Los nombres de clases e interfaces comienzan siempre por mayúscula (Ejemplos: Geometría, Rectángulo, Dibujable, Graphics, Vector, Enumeration). 4. Los nombres de objetos, los nombres de métodos y variables miembro, y los nombres de las variables locales de los métodos, comienzan siempre por minúscula (Ejemplos: main(), dibujar(), numRectangulos, x, y, r). 5. Los nombres de las variables finales, es decir de las constantes, se definen siempre con mayúsculas (Ejemplo: PI) Estructura general de un programa Java. Un fichero fuente (*.java) puede contener más de una clase, pero sólo una puede ser public. El nombre del fichero fuente debe coincidir con el de la clase public (con la extensión *.java). Si por ejemplo en un fichero aparece la declaración (public class MiClase {...}) entonces el nombre del fichero deberá ser MiClase.java. Es importante que coincidan mayúsculas y minúsculas ya que MiClase.java y miclase.java serían clases diferentes para Java. Si la clase no es public, no es necesario que su nombre coincida con el del fichero. Una clase puede ser public o package (default), pero no private o protected. Estos conceptos se explican posteriormente. De ordinario una aplicación está constituida por varios ficheros *.class. Cada clase realiza unas funciones particulares, permitiendo construir las aplicaciones con gran modularidad e independencia entre clases. La aplicación se ejecuta por medio del nombre de la clase que contiene la función main() (sin la extensión *.class). Las clases de Java se agrupan en packages, que son librerías de clases. Si las clases no se definen como pertenecientes a un package, se utiliza un package por defecto (default) que es el directorio activo. Los packages se estudian con más detenimiento en siguientes apartados [18]. 4.7 PROCESO DE CREACIÓN DE UN EJECUTABLE El aprendizaje de todo lenguaje de programación pasa por la etapa obligatoria de realizar un primer programa, lo más sencillo posible, que muestre: • • • La estructura sintáctica mínima a la que obliga el lenguaje. La manera de introducir, traducir y ejecutar el programa. La validez del entorno en el que se sustentarán los desarrollos (para nosotros el SDK). CAPÍTULO 4 79 FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN Nuestro programa únicamente escribirá el texto "Hola mundo", pero servirá para asentar cada uno de los puntos expuestos en el párrafo anterior. ' Pasos detallados: Paso 1. Abrir un editor de texto (por ejemplo el Block de Notas): Paso 2. Introducir el código (sin incluir los números de línea): 1 2 3 4 5 public class HolaMundo { public static void main (String[] args) { System.out.println(“Hola Mundo”); } } Es necesario respetar la condición mayúscula/minúscula de cada letra del programa, puesto que en este lenguaje una letra en minúscula es diferente a su correspondiente en mayúsculas. La línea 1 define la clase (objeto) HolaMundo. Java es un lenguaje orientado a objetos, donde todas las aplicaciones se estructuran en grupos de objetos (clases en Java). La clase se define como public (pública), indicando que será accesible a cualquier otra clase. El último carácter de la línea 1 es una llave de comienzo; indica el comienzo de la clase. La clase termina en la línea 5 (con la llave de fin). El contenido del método main, en nuestro ejemplo, se encuentra delimitado entre la llave de inicio situada en la línea 2 y la llave de fin situada en la línea 4. Únicamente contiene la instrucción situada en la línea 3, que imprime el literal (texto) que aparece entre comillas y como parámetro de la llamada al método println. Obsérvese el carácter ";" que se debe utilizar obligatoriamente para separar instrucciones. El sangrado de cada una de las líneas no es necesario, pero resulta muy conveniente para hacer más legible los programas. Su función principal es facilitar la identificación visual de cada bloque de código. Paso 3. Grabar el código en el fichero HolaMundo.java y con formato de texto: 80 CAPÍTULO 4 Proceso de creación de un ejecutable La línea 2 define un método (procedimiento, subrutina) de la clase HolaMundo. Este método es especial, le indica al entorno de Java el comienzo de nuestra aplicación. Su nombre (identificador) es main (método principal). Este método siempre lleva un parámetro String[] que identifica un conjunto de literales (textos); por ahora, no emplearemos esta característica, aunque debemos respetar su sintaxis. El método es público y estático (atributos que veremos en detalle en los temas siguientes). Proceso de creación de un ejecutable INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN Fig. 4.4 Guardar archivo HolaMundo.java Es absolutamente necesario que la extensión del archivo sea .java, es decir, que esté grabado con formato de texto y que el nombre de la clase coincida EXACTAMENTE con el nombre del archivo (en nuestro caso HolaMundo). Finalmente, en el Block de Notas nos quedará una ventana similar a la siguiente: Fig. 4.5 Código fuente archivo HolaMundo.java Paso 4. Compilar el programa: En la ventana de MS-DOS, en el directorio donde hemos grabado el fichero HolaMundo.java, debemos ejecutar el compilador (javac) poniendo como argumento el nombre del fichero CON LA EXTENSIÓN .java (javac HolaMundo.java). Si existen errores, se obtendrá un listado de ellos. Si no los hay, como en nuestro caso, no aparece nada: Tras la compilación con éxito del programa, obtenemos el fichero objeto HolaMundo.class: Paso 5. Ejecutar el programa: En el directorio en el que estamos trabajando, ejecutar el intérprete de Java (java) suministrando como parámetro el nombre de la clase (HolaMundo) SIN la extensión .class (java CAPÍTULO 4 81 FUNDAMENTOS DE PROGRAMACIÓN INTRODUCCIÓN A LA PROGRAMACIÓN HolaMundo) [19]. Nos aparecerá el texto "Hola Mundo" correspondiente a la impresión de datos por consola que codificamos en la línea 3 de nuestro programa: Fig. 4.6 Compilación y ejecución de archivo HolaMundo.java 82 CAPÍTULO 4 INTRODUCCIÓN A LA PROGRAMACIÓN FUNDAMENTOS DE PROGRAMACIÓN REFERENCIAS BIBLIOGRÁFICAS [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] http://www.educa.aragob.es/cursoryc/ordenador1/modulo4/unidad4.htm http://www.fing.uach.mx/examenes/DisAlgoritmos/investiga/tema1.html Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 94-95. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 66. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 94-95. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 34. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. Anexos pp. 977-978. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. Anexos pp. 979. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. Anexos p. 979. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. Anexos p. 980. Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 91 Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 39 García de Jalón, J. 1999. Aprenda Java como si estuviera en primero. Universidad Navarra. p.27. García de Jalón, J. 1999. Aprenda Java como si estuviera en primero. Universidad Navarra. p.27. García de Jalón, J. 1999. Aprenda Java como si estuviera en primero. Universidad Navarra. p.28 Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 36 Deitel y Deitel. 1998. Como programar en Java. Prentice Hall. p. 37-38 García de Jalón, J. 1999. Aprenda Java como si estuviera en primero. Universidad Navarra. p.19. Bobadilla. Java a través de ejemplos. p. 8 CAPÍTULO 4 de de de de 83