I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
4 Introducción a la programación 4.1 Clasificación del software. 4.1.1
Software del sistema. Al resultado de la programación de sistemas se le conoce como software de base o software de sistemas. Al software de sistemas pertenecen los programas cuya finalidad es servir a otros programas y ejecutar funciones comunes para todos los usuarios de la computadora. El software de sistemas implementa funciones de control que permiten al software de aplicación comunicarse con otros elementos del software. Entre los programas que pertenecen al software de sistemas se encuentran: los sistemas operativos , compiladores , ensambladores , cargadores, manejadores de bases de datos, etc.
4.1.2
Software de aplicación. El software de aplicación implementa los procedimientos requeridos para realizar las funciones de procesamiento de la información. El software de aplicación es el software específico para aplicaciones particulares de los usuarios de un sistema de cómputo. Su utilización se restringe a cierto ámbito( a diferencia del software de sistemas). Normalmente, en la codificación del software de aplicación no se utiliza un lenguaje de bajo nivel, sino que se codifican en lenguajes de alto nivel y se traducen ya sea por compiladores o por intérpretes (los cuales forman parte del software de sistemas). Podemos decir que el software de aplicación se apoya en el software de sistemas, lo cual no puede decirse en sentido inverso. En lo que sigue del curso desarrollaremos software de aplicación, utilizando un compilador (software de base) para el lenguaje C# (C Sharp).
4.2 Conceptos de la programación. 4.2.1
Definición de programa. Un programa es un conjunto de instrucciones internas, utilizadas para ejecutarse en una computadora y producir un resultado concreto. 4.2.2
Definición de programación. La programación es el proceso de escribir programas para computadora. Generalmente, los programas para computadora se escriben en lenguajes de alto nivel o en lenguaje ensamblador (bajo nivel).
4.2.3
Definición de lenguaje de programación. Para que una computadora pueda ejecutar una instrucción, ésta debe estar escrita en un lenguaje que "entienda" la máquina. La máquina está compuesta por circuitos eléctricos. Originalmente, la programación de las computadoras se hacía abriendo y cerrando los circuitos de éstas. Para introducir las órdenes en la computadora sólo se podían manejar dos estados con cada circuito: "cerrado" y "abierto" (esto es, con corriente y sin corriente). Debido a que la introducción de instrucciones con apertura y cierre de circuitos por métodos manuales era muy lento, se inventó el concepto de programa. Para escribir los
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 55
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
programas, se convino en que un 0 (cero) significaría "abierto" (esto es, sin corriente), y un 1 (uno) significaría "cerrado" (esto es, con corriente). Con la invención del transistor el concepto de "cerrado" se cambió a "alto voltaje" y el de abierto a "bajo voltaje" . Actualmente, el alto voltaje es un valor cercano a 5 voltios, y el bajo voltaje uno cercano a 2 voltios. Se necesita un grupo de varios circuitos para representar cada carácter de un lenguaje humano, y varios grupos para representar una palabra. Así que escribir conjuntos de instrucciones (programas) implica largas cadenas de unos y ceros, con una alta probabilidad de cometer errores (y una gran dificultad para corregirlos). Para facilitar la escritura de programas, se inventaron los lenguajes de programación "de bajo nivel" (ensambladores) con nemotécnicos de palabras de un lenguaje humano y, posteriormente, los "de alto nivel" que utilizan palabras completas. La escritura de programas en lenguajes diferentes al de la máquina hace necesario el uso de programas traductores (ensambladores, compiladores e intérpretes) Podemos definir a un lenguaje de programación como un lenguaje que está formado por un subconjunto de símbolos y palabras pertenecientes a un lenguaje natural. Aunque el lenguaje natural comúnmente utilizado para crear lenguajes de programación es el inglés, con UNICODE es posible usar caracteres de todos los lenguajes naturales existentes.
4.3 Datos. 4.3.1 Dato
Definición.
Representación formal de hechos, conceptos o instrucciones adecuada para su comunicación, interpretación y procesamiento por seres humanos o medios automáticos. 4.3.2 Tipos de datos. Tipo de dato Especificación de un dominio (rango de valores) y de un conjunto válido de operaciones a los que normalmente los traductores asocian un esquema de representación interna propio. Clasificación de los tipos de datos En función de quién los define: Tipos de datos estándar Tipos de datos definidos por el usuario
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 56
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
En función de su representación interna: Tipos de datos escalares o simples Tipos de datos estructurados Tipos de datos primitivos en Java El lenguaje Java define 8 tipos de datos primitivos:
Números enteros byte, short, int, long 4 tipos básicos para representar números enteros (con signo):
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 57
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de ProgramaciĂłn
Literales enteros Los literales enteros pueden expresarse: En decimal (base 10): 255 En octal (base 8): 0377 3 ∗ 8 7 ∗ 8 7 255
En hexadecimal (base 16): 0xff 15 ∗ 16 15 255 Los literales enteros son de tipo int por defecto 2 2 1
Un literal entero es de tipo long si va acompaĂąado del sufijo l o L: 1234567890L es de tipo long Nota: Se prefiere el uso de L porque l (L minĂşscula) puede confundirse con 1 (uno). NĂşmeros en coma flotante float double SegĂşn el estĂĄndar IEEE 754-1985
Literales reales Cadenas de dĂgitos con un punto decimal 123.45 En notaciĂłn cientĂfica 10 123 45
0.0 !
0.001
123# 45
12# 6
Por defecto, los literales reales representan valores de tipo doublĂŠ. Para representar un valor de tipo float, hemos de usar el sufijo f o F: 123.45F
0.0f
Instituto TecnolĂłgico Superior de la Sierra Negra de Ajalpan
0.001f
P ĂĄ g i n a | 58
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
Caracteres char
Literales de tipo carácter Valores entre comillas simples
‘a’
‘b’
‘c’
…
‘1’
‘2’
‘3’
…
‘*’
…
Códigos UNICODE (en hexadecimal): \u????
‘\u000a’ (avance de línea) ‘\u000d’ (retorno de carro)
Secuencias de escape para representar caracteres especiales:
La clase Character define funciones (métodos estáticos) para trabajar con caracteres: isDigit(), isLetter(), isLowerCase(), isUpperCase() toLowerCase(), toUpperCase()
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 59
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
Datos de tipo booleano boolean Representa algo que puede ser verdadero (true) o falso (false).
Literales
Cadenas de caracteres La clase String
String no es un tipo primitivo, sino una clase predefinida Una cadena (String) es una secuencia de caracteres Las cadenas de caracteres, en Java, son inmutables: no se pueden modificar los caracteres individuales de la cadena.
Literales Texto entra comillas dobles “ ” “Esto es una cadena” “‘Esto’ también es una cadena” Las secuencias de escape son necesarias para introducir determinados caracteres dentro de una cadena: “\”Esto es una cadena entre comillas\””
Concatenación de cadenas de caracteres El operador + sirve para concatenar cadenas de caracteres
Si cualquier operando es un String, toda operación se convierte en una concatenación de cadenas. En java cualquier cosa puede convertirse automáticamente en una cadena de caracteres (un objeto de tipo String).
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 60
I.S.C. Salvador Cruz Alfaro 4.3.3
Apuntes: Fundamentos de Programación
Identificadores.
Una variable no es más que un nombre simbólico que identifica una dirección de memoria:
“Suma el contenido de la posición 3001 y la 3002 y lo almacenas en la posición 3003” VS total = cantidad1 + cantidad2 “Suma cantidad1 y cantidad2 y lo almacenas en total” Declaración de variables Para usar una variable en un programa hay que declararla.
El ordenador conoce así cómo codificar la información que se va a almacenar en la posición de memoria correspondiente.
Al declarar una variable, se reserva el espacio de memoria necesario para almacenar un valor del tipo de la variable.
El identificador asociado a la variable se puede utilizar para acceder al dato almacenado en memoria y para modificarlo.
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 61
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
Declaración de variables en Java <tipo> identificador; <tipo> lista de identificadores;
Las variables se han de declarar antes de poder usarlas.
Los identificadores de las variables son los nombres que utilizaremos para referirnos a ellas.
Al declarar una variable, hay que definir su tipo: la variable sólo admitirá valores del tipo especificado.
En una misma declaración se pueden declarar varias variables, siempre que sean del mismo tipo. En este caso, los identificadores de las variables se separan por comas. Ejemplos:
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 62
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
Identificadores en Java
El primer símbolo del identificador será un carácter alfabético (a, …, z, A, …, Z, ‘_’, ‘$’) pero no un dígito. Después de ese primer carácter, podremos poner caracteres alfanuméricos (a, …, z) y (0, 1, …, 9), signos de dólar ‘$’ o guiones de subrayado ‘_’.
Los identificadores no pueden coincidir con las palabras reservadas, que ya tienen significado en Java:
Las mayúsculas y las minúsculas se consideran diferentes.
‘$’ y ‘_’ se interpretan como una letra más.
‘$’ no se suele utilizar en la práctica (lo usa el compilador). Ejemplos válidos a, pepe, r456, tu_re_da, AnTeNa, antena, usd$ Ejemplos no válidos 345abc, mi variable, Nombre.Largo, cañada, camión Convenciones
Los identificadores deben ser descriptivos: deben hacer referencia al significado de aquello a lo que se refieren. int n1, n2; // MAL int anchura, altura; // BIEN
Los identificadores asociados a las variables se suelen poner en minúsculas. int CoNTaDoR; // MAL int contador; // BIEN
Cuando el identificador está formado por varias palabras, la primera palabra va en minúsculas y el resto de palabras se inician con una letra mayúscula. int mayorvalor; // MAL int mayor_valor; // ACEPTABLE int mayorValor; // MEJOR
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 63
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
Inicialización de las variables En una declaración, las variables se pueden inicializar: int i = 0; float pi = 3.1415927f; double x = 1.0, y = 1.0; NOTA: La inicialización puede consistir en una expresión compleja que se evalúa cuando se ejecuta el programa.
Definición de constantes en Java Una constante hace referencia a un valor que no puede modificarse final <tipo> identificador = <valor>; Las constantes se definen igual que cuando se declara una variable y se inicializa su valor. Con la palabra reservada final se impide la modificación del valor almacenado Convenciones Los identificadores asociados a las constantes se suelen poner en mayúsculas. final double PI = 3.141592; Si el identificador está formado por varias palabras, las distintas palabras se separan con un guión de subrayado. final char RETORNO_DE_CARRO = ‘\n’; final double ELECTRONIC_CHARGE = 1.6E-19;
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 64
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
4.3.4 Almacenamiento, direccionamiento y representación en memoria. Almacenamiento La computadora posee determinada cantidad de almacenamiento interno denominado memoria principal, memoria RAM o memoria volátil. Esta memoria se activa al encender la computadora y se desactiva al apagarla. Para que un programa se ejecute, debe cargarse en la memoria principal, así como los datos necesarios. Como es más costosa, es un recurso escaso donde sólo se almacenan los datos que se requieren de inmediato, y los demás se relegan a los dispositivos de almacenamiento externo, donde la capacidad de almacenamiento es mayor, pero también el tiempo de recuperación. Por otra parte, el costo del almacenamiento externo es más bajo. Direccionamiento La memoria principal de la computadora se divide en pequeñas unidades de tamaño uniforme denominadas palabras, que tienen una dirección única. Cada una de éstas palabras es capaz de almacenar una unidad de información (como, por ejemplo, resultados numéricos), y determina el número más grande y el más pequeño que puede almacenar. El tamaño de la palabra depende de la computadora, pero siempre se especifica en múltiplos de 8 bits. Así, existen computadoras con tamaños de palabra de 8, 16, 32 y 64 bits. Cada palabra de la memoria principal tiene una dirección fija que va de cero hasta el número total de palabras - 1. Las direcciones de memoria sirven para identificar cada palabra individualmente, de tal manera que pueda accederse al dato contenido en ella. A fin de simplificar su comprensión, las memorias se consideran como una hilera de palabras. Por ejemplo, suponiendo que la memoria principal de una computadora tiene un tamaño de palabra de 8 bits, la cinta de color amarillo que se muestra enseguida podría representar las tres primeras palabras: Dirección 0000 0 0001 0 0002 0
1 1 0
Palabra 0 0 1 0 0 0 0 0 1 1 0 0
1 0 1
Valor en decimal 1 75 1 65 0 50
Representación en memoria La representación en memoria de los caracteres no reviste mayor complicación, debido a que los códigos utilizados, como el ASCII (American Standard Code for Information Interchange), les asignan valores enteros positivos. En el caso de los datos numéricos hay que considerar la distinción entre números negativos y positivos, y la que hay entre números de punto flotante y enteros. Los signos se manejan normalmente mediante el bit más significativo de la palabra (el situado a la extrema izquierda), y se le denomina bit de signo. Cuando el bit de signo almacena un cero, el número se
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 65
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
considera positivo; cuando almacena un uno el número es negativo. Es por esto que, si el tamaño de la palabra es de m bits, quedan m-1 bits para representar la magnitud del número almacenado. Los números de punto flotante se manejan en formato logarítmico, con un número fijo de bits para la base y otro para la mantisa. El estándar para los números de punto flotante lo fija el IEEE. Debido al formato logarítmico, los cálculos que se hacen con tipos de punto flotante no son tan precisos como los que se hacen con tipos enteros. 4.3.5 Sistema de numeración binaria y hexadecimal. Sistema de numeración binario Las memorias de las computadoras se componen de microcircuitos que son capaces de conducir bajo voltaje (aprox. 2 voltios) y alto voltaje (aprox. 5 voltios). Estos dos estados se representan con los símbolos 0 y 1. A este sistema de numeración que utiliza dos símbolos se le denomina binario, y a los dígitos 0 y 1 se les denomina dígitos binarios o simplemente bits (binary digits). Nuestro sistema de numeración decimal toma su nombre de los diez únicos símbolos (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) que pertenecen al código. Esta diferencia entre los dos sistemas de numeración complica la comunicación entre las personas y las computadoras. Para resolver el problema se requiere convertir de un sistema a otro para codificar la información. Sistema hexadecimal Al sistema que utiliza 16 símbolos se le denomina hexadecimal. Los símbolos hexadecimales y sus equivalentes en binario y decimal se muestran en la siguiente tabla. Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F
Bin 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
Dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
P á g i n a | 66
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
Por ejemplo, en el código ASCII la letra 'Y' tiene asociado el número decimal 89. Si queremos manejar la letra 'Y' con la computadora, necesitamos comunicarle el código de la letra (89) en el sistema de numeración que ella entiende, esto es, convertir el número 89 a binario. La conversión se logra tomando en cuenta que cada dígito tiene asociado un peso que depende de su posición en la secuencia de símbolos en la cifra. Así, el número 89 puede expresarse como 9x10 elevado a la potencia 0 + 9x10 elevado a la potencia 1, esto es: 9x1 + 8x10. Para convertir de binario a decimal podemos utilizar la siguiente tabla: 7 1 128
6 1 64
5 1 32
4 1 16
3 1 8
2 1 4
1 1 2
0 1 1
Exponente Binario Valor decimal
7 6 5 4 3 2 1 0 Exponente
1 1 1 1 1 1 1 1 Binario 128 64 32 16 8 4 2 1 Valor decimal
De la tabla anterior, podemos escribir el 89 en binario como:
89 = 01011001 = 64 + 16 + 8 +1
A la inversa, si tuvieramos la serie de dígitos binarios 01011001 y quisieramos conocer su equivalencia en decimal, escribiríamos:
0x2^7+1x2^6+0x2^5+1x2^4+1x2^3+0x2^2+0x2^1+1x2^0=
= 0 + 1x64 + 0 + 1x16+ 1x8 + 0 + 0 + 1x1 =
= 64 + 16 + 8 + 1 = 89 Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 67
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
La conversión del número hexadecimal F9B5 a decimal sería:
F9B5 = Fx16^3 + 9x16^2 + Bx16^1 + 5x16^0
= 15x16x16x16 + 9x16x16 + 11x16 +5x1 =
= 61,440 + 2,304 + 176 + 5
= 63,925
--------------------------------------------------------------------------------
En general, la conversión al sistema decimal del número abcde de un sistema numérico de base n es:
a x n^4 + b x n^3 + c x n^2 + d x n^1 + e x n^0
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
P á g i n a | 68
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
4.4 Operadores, operandos y expresiones. Operadores aritméticos Java incluye cinco operadores para realizar operaciones aritméticas: Operador
+ * / %
Operación Suma Resta Multiplicación División Módulo (resto de la división)
Si los operandos son enteros, se realizan operaciones enteras. En cuanto uno de los operandos es de tipo float o double, la operación se realiza en coma flotante. No existe un operador de exponenciación: para calcular x hay que utilizar la función Math.pow(x,a) División ( / ) Operación 7/3 7/3.0f 5.0/2 7.0/0.0 0.0/0.0
Tipo int float double double double
Resultado 2 2.33333333f 2.5 +Infinity NaN
Si se dividen enteros, el resultado es entero y el resto se pierde. Una división entera por cero produce una excepción. Una división por cero, en coma flotante, produce Infinite o NaN.
Módulo ( % ) o resto de dividir Operación 7%3 4.3%2.1
Tipo int Doublé
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
Resultado 1 ~ 0.1
P á g i n a | 69
I.S.C. Salvador Cruz Alfaro
Apuntes: Fundamentos de Programación
Operadores relacionales Operadores de comparación para números y caracteres. Generan un resultado booleano. Operador == != < > <= >=
Significado Igual a Diferente que Menor que Mayor que Menor o igual Mayor o igual
Ejemplos Comparación 25<=25 25<>25 25<>4 25==25 56==2
Resultado True False True True False
Operadores lógicos/booleanos Operandos booleanos. Tienen menos precedencia que los operadores de comparación. Operador ! && || ^
Nombre NOT AND OR XOR
Significado Negación lógica “y” lógico “o” inclusivo “o” exclusivo
NOT (!) cambia el valor booleano. AND (&&) devuelve true si los dos son operandos son true. No evalúa el segundo operando si el primero es false OR (||) devuelve false si los dos son false. No evalúa el segundo operando si el primero es true. Si uno de los dos es true, devuelve true. XOR (^) devuelve true si los dos operandos son diferentes. Con operandos booleanos es equivalente a !=. Ejemplos Número x entre 0 y 10 Número x fuera del intervalo [0,10]
Instituto Tecnológico Superior de la Sierra Negra de Ajalpan
0 $ % && % $ 10
! ( 0 ) % && % ) 10 * ó 0 + % | | % + 10
P á g i n a | 70