manual de fundamentos de programaciÓn

89
MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN Enfoque Orientado a Objetos Elaborado por Ing. Alejandro Valdivia Barboza Docente Investigador USAT 2010-I

Upload: alejocix

Post on 01-Jul-2015

4.499 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

MANUAL DE FUNDAMENTOS DE PROGRAMACIÓNEnfoque Orientado a Objetos

Elaborado por Ing. Alejandro Valdivia BarbozaDocente Investigador USAT 2010-I

Page 2: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

CAPI MODELAMIENTO DE OBJETOS

Proceso

El proceso implica transformación, cambio a través de una serie de acciones ordenadas de manera lógica, que persiguen un objetivo, el cual se expresa mediante las salidas.

Imaginemos una calculadora, en la cual necesitamos realizar una multiplicación de dos números:

3 X 4 = 12 Para realizar esta operación se necesitó presionar los botones 3 ,4 y X, es decir necesitamos ingresar a la calculadora los dos números y la operación que necesitamos realizar, a estos valores le denominamos entradas y la salida será entonces el cálculo de esta operación, que nos da como resultado 12.

El proceso es sumas 3 veces 4 o sumar 4 veces 3.

Dato e información

Dato: Valor sin significado para la persona

Información: son los datos que significan algo para la persona

Proceso de desarrollo de un programa

PROCESO

La información es la colección de datos que tienen un significado para la persona, podría suceder que para una persona algún suceso no sea informativo, pero para otra persona sí lo es, por lo tanto los conceptos son difíciles de diferenciar, pero es válido tener la idea de ambos. Información = Datos + Significado

Análisis del problema

Diseño del Programa(Algoritmo)

Codificación del programa(utilizamos un IDE, en este

caso NETBEANS, código

Compilación / Interpretación

(Eliminación de errores de

Pruebas del programa(Eliminación de Errores de

Lógica, Ejecución)

Generación de Ejecutable (.class , .exe)

Entradas Salidas

Page 3: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Tipos de datos, variables, constantes

Los tipos de datos tienen la finalidad de reservar una determinada cantidad de memoria, cada tipo de dato reserva una cantidad que no necesariamente es la misma, con esto se busca el uso eficiente de memoria; es decir; usar la menor cantidad de memoria posible, dependiendo del contexto en el cual se estén representando los datos.

Simples (Sin estructura) Compuestos (derivados de los simples)

Enteros CadenasReales MatricesLógicos ClasesCarácter Archivos

A continuación se muestra un gráfico de barras, en el cual podemos ver de manera intuitiva el espacio ocupado por estos tipos de datos

Logico

Caracter

Entero

Real

Variables Una variable es un símbolo que representa un elemento no especificado de un conjunto dado. Dicho conjunto es llamado conjunto universal de la variable, universo o dominio de la variable, y cada elemento del conjunto es un valor de la variable. Sea x una variable cuyo universo es el conjunto {1,3,5,7,9,11,13}; entonces x puede tener cualquiera de esos valores: 1,3,5,7,9,11,13. En otras palabras x puede reemplazarse por cualquier entero positivo impar menor que 14. Por esta razón, a menudo se dice que una variable es un reemplazo de cualquier elemento de su universo.

Constantes Es un valor de tipo permanente, que no puede modificarse, al menos no dentro del contexto o situación para el cual está previsto. Suele relacionarse y usarse en combinación con las variables, que sí admiten modificación en sus valores.

Dominio de los datos

Es el conjunto de valores que puede tener una variable en un determinado contexto.

Sexo puede tener solamente dos valores Masculino o Femenino, entonces podemos representar con la letra ‘F’ para Femenino y ‘M’ para masculino, ese es el dominio de la variable sexo, esta variable puede ser representada como un caracter.

La variable sueldo en una empresa varía desde 800 soles a 45000 soles, además puede contener decimales, por lo tanto es un real o un double.

Page 4: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Programa o Algoritmo

Variables

Constantes

Memoria

USA

AlmacenarDatos

Generalmente el dominio es considerado como rango que tiene un inicio y fin.

La memoria se llena de datos

Ejemplos

La primera letra de ‘USAT’

Nombre de una calle

Número de Hermanos

Capital de Canadá

El año

La Estatura de una persona

El Sueldo

Fecha

Temperatura

Número de Teléfono

Monto Total de una factura

Número de Clientes de una empresa

Pi

“ab”

Nombre de mi mejor amigo

Dirección

“1.234”

Definir qué tipo de dato es cada una de las variables

3 ‘Juan’

‘a’

True

Page 5: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Identificadores

El sentido del uso de los identificadores de variables o constantes, es que el acceso directo a la memoria por parte del programador, no sería amigable, por que las referencias a las posiciones de memoria son números en hexadecimal, entonces para evitar ese tipo de referencia es que mejor usamos identificadores que son definidos de manera descriptiva por el programador.

Un identificador es una palabra usada por el programador para nombrar una variable, método, clase.

Reglas para crear identificadores

No debe ser palabra reservada del lenguaje de programaciónQue respete la siguiente gramática:

Inicie con $, _ ó letra; donde mayúsculas son diferentes de minúsculas.

Seguido de cero o más: letras ó dígitos ó $ ó under-scores. No puede incluir el carácter espacio en blanco

Las variables deben ser suficientemente descriptivas, los identificadores como n,v,x,y,z , los cuales son válidos , pero hacen menos legible el programa. Variables como numero_de_empleados, saldo_cuenta, numero_de_productos, basta con leerlas para saber de qué se tratan, recuerda que no solo tú como propietario del programa leerás el código fuente, lo harán después otros programadores, o tú mismo lo leerás después de un tiempo y es bastante probable que no entiendas para que usaste las variables, sino las has identificado de manera descriptiva.

Las variables de un determinado tipo solo pueden tomar valores de ese tipo.

Proceso de Abstracción

El programador tiene la capacidad y la responsabilidad de diseñar y crear objetos en el computador, a este proceso se le conoce como abstracción; es decir; representar la realidad, en un programa de computadora.

Abstracción

Page 6: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

ObjetoRepresentación de la realidad, Física o Conceptual, con características y comportamiento, la cual tiene un periodo de vida definido e identidad propia. Ejemplos

Físicos.- Puede ser captado por nuestros sentidos

“Juan”, “Pedro”, “Lucía”“Perro”, “Gato”, ”Vaca”“sal”, “pimienta”, “comino”“Chery QQ”, “Nissan 4x4”, “Toyota Yaris”“Recibo Luz 00001”, “Recibo Luz 00001”, “Recibo Luz 00001”, “Recibo Luz 00001”“Sporting Cristal” , “U”,”Boys”“Ace”,”Ariel”, etc“Tristeza” , “Alegria”, “Ira”“fx-5800P”, “fx-3650P”, “fx-3950P”

Conceptuales.- No puede ser captado por nuestros sentidos puede ser una idea, proceso, etc

“Cuenta banco 001-223456-5656”, “Cuenta banco 001-223456-5645”, “Cuenta banco 001-223456-5678””Domingo” ,“Lunes” , “Martes”, “Miércoles”,…“01-11-2009” , “02-02-2008”

Características de un objeto, son los datos que describen, identifican a un objeto, a estos se les conoce como atributos.

Por ejemplo que características tienen Juan, Pedro , Lucía.

Nombre, edad, sexo, peso, talla, dirección, teléfono fijo

Características de perro , gato, Vaca

Nombre, edad, sexo, peso, talla,

Características de una “Cuenta banco 001-223456-5656”, “Cuenta banco 001-223456-5645”, “Cuenta banco 001-223456-5678”

Numero de cuenta, saldo, moneda

Características de un ”Domingo” ,“Lunes” , “Martes”, “Miércoles”,…

Nombre, inicio de semana, laborable

Características de una “01-11-2009”, “02-02-2008”

Dia, mes , año, festivo

Page 7: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Comportamiento de un objeto

Son acciones que el objeto es capaz de realizar, servicios que el objeto brinda a otros objetos.

Por ejemplo que comportamiento tienen Juan, Pedro, Lucía, ¿qué acciones realizan o qué acciones se pueden realizar sobre ellos?

Nacer, Dormir, comer, trabajar, estudiar, jugar, morir, razonar, dar su nombre,

Comportamiento de perro, gato, Vaca

Nacer, Dormir, comer, morir, jugar

Comportamiento de una “Cuenta banco 001-223456-5656”, “Cuenta banco 001-223456-5645”, “Cuenta banco 001-223456-5678”

Crear, retirar, depositar, obtener saldo, Cerrar

El cliente del banco actúa sobre su cuenta

Clases (class)Conjunto de objetos con características y comportamiento común.

¿Qué características comunes encuentras en estas 3 calculadoras?

“Juan”

“Pedro”

“Lucìa”

Persona

“Perro”

“Gato”

“Vaca”

Animal

“sal”

“pimienta”

“comino”

Condimento

Page 8: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Vamos a hacer el ejercicio de modelamiento de estas calculadoras, reduciendo la complejidad de la calculadora que conocemos, estas calculadoras solo permiten hacer operaciones con dos números a la vez.

Primero definimos la clase Calculadora y las características que la definen

Calculadora marcamodelotipoprendidanumero1numero2

Segundo ahora vamos a asignarle los tipos de datos a cada una de las características definidas

Calculadora

Cadena marca;Cadena modelo;carácter tipo;lógico prendida;real numero1;real numero2;

Los nombres que describen las características de este objeto se han creado tomando en cuenta las reglas para formar identificadores y usando el lenguaje natural, propio del ser humano.

Círculoradio

Circulo

Real radio;

Haz el mismo ejercicio para los siguientes objetos Auto, Termómetro, Persona, Cuentabancaria.

¿Qué es un Lenguajes de Programación?Lenguaje artificial que puede ser usado para controlar el comportamiento de una máquina,

Page 9: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

especialmente una computadora. Estos se componen de un conjunto de reglas sintácticas y semánticas que permiten expresar instrucciones que luego serán interpretadas.

Es un lenguaje diseñado para describir el conjunto de acciones consecutivas que un equipo debe ejecutar. Por lo tanto, un lenguaje de programación es un modo práctico para que los seres humanos puedan dar instrucciones a un equipo

El lenguaje utilizado por el procesador se denomina lenguaje máquina. Se trata de datos tal como llegan al procesador, que consisten en una serie de 0 y 1 ( datos binarios).

El lenguaje máquina, por lo tanto, no es comprensible para los seres humanos, razón por la cual se han desarrollado lenguajes intermediarios comprensibles para el hombre. El código escrito en este tipo de lenguaje se transforma en código máquina para que el procesador pueda procesarlo.

El lenguaje natural es utilizado por los seres humanos para su comunicación, el lenguaje de programación es mucho más rígido.

Por lo tanto, un lenguaje de programación tiene varias ventajas:

Es mucho más fácil de comprender que un lenguaje máquina:

Permite mayor portabilidad, es decir que puede adaptarse fácilmente para ejecutarse en diferentes tipos de equipos.

Existen los lenguajes compilados, interpretados y los intermedios.

¿Qué es una sentencia?una sentencia es una línea de código en algún lenguaje de programación. Un programa está constituido por múltiples sentencias de programación, lo que es llamado código fuente.

Las sentencias de programación suelen tener algún caracter que determina su final, por lo general es un punto y coma (;) o un punto final (.), y algunas están separadas simplemente por enters (retorno de carro). Esto depende del lenguaje de programación que se esté empleando. Existen lenguajes que no necesitan un caracter que determine el final de una sentencia.

En algunos lenguajes de programación las sentencias están numeradas, de esta manera, si existe algún error de sintaxis (o alguna advertencia), el compilador entrega un mensaje con el número de sentencia donde fue encontrado.

Una sentencia de programación tiene una sintaxis y una semántica. La sintaxis está determinada por el lenguaje de programación y, si existe algún error, el compilador suele detectarlo. También una sentencia tiene una semántica, si existe algún error de semántica, en general, no puede ser descubierto por el compilador. Esto es porque la semántica está asociada al "significado" o "función" de esa sentencia (o un grupo de sentencias), pero el compilador no puede determinar qué quiere hacer el programador.

A CADA instrucción o sentencia le corresponde UNA acción de procesador.

¿Qué es un programa?

Page 10: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Es un conjunto de instrucciones que una vez ejecutadas realizarán una o varias tareas en una computadora. Sin programas, estas máquinas no pueden funcionar correctamente.1 2 Al conjunto general de programas, se lo denomina software y así, se refiere al equipamiento lógico o soporte lógico de una computadora digital.

Transformación del archivo fuente al archivo al archivo ejecutable

¿Qué es JAVA?

Lenguaje de Programación Orientado a Objetos.

Java is a language used to write computer programs that was created by Sun Microsystems, with development starting in 1991. The idea behind the language is that a program written with Java can run on any platform – in other words, on any computer with any type of operating system, on any computer device (cell phones, etc.), or on any type of server.

JAVA= Just Another Vague Acronym?

Las aplicaciones Java están típicamente compiladas en un bytecode, aunque la compilación en código máquina nativo también es posible. En el tiempo de ejecución, el bytecode es normalmente interpretado o compilado a código nativo para la ejecución, aunque la ejecución directa por hardware del bytecode por un procesador Java también es posible.

La implementación original y de referencia del compilador, la máquina virtual y las bibliotecas de clases de Java fueron desarrollados por Sun Microsystems en 1995. Desde entonces, Sun ha controlado las especificaciones, el desarrollo y evolución del lenguaje a través del Java Community Process, si bien otros han desarrollado también implementaciones alternativas de estas tecnologías de Sun, algunas incluso bajo licencias de software libre.

Entre noviembre de 2006 y mayo de 2007, Sun Microsystems liberó la mayor parte de sus tecnologías Java bajo la licencia GNU GPL, de acuerdo con las especificaciones del Java Community Process, de tal forma que prácticamente todo el Java de Sun es ahora software libre (aunque la biblioteca de clases de Sun que se requiere para ejecutar los programas Java aún no lo es).

El término Java fue acuñado en una cafetería frecuentada por algunos de los miembros del equipo. Pero no está claro si es un acrónimo o no, aunque algunas fuentes señalan que podría tratarse de las iniciales de sus creadores: James Gosling, Arthur Van Hoff, y Andy Bechtolsheim. Otros abogan por el siguiente acrónimo, Just Another Vague Acronym ("sólo otro acrónimo ambiguo más"). La hipótesis que más fuerza tiene es la que Java debe su nombre a un tipo de

Page 11: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

café disponible en la cafetería cercana, de ahí que el icono de java sea una taza de cafe caliente

Java Virtual Machine

Una Máquina virtual Java (en inglés Java Virtual Machine, JVM) es un programa nativo, es decir, ejecutable en una plataforma específica, capaz de interpretar y ejecutar instrucciones expresadas en un código binario especial (el Java bytecode), el cual es generado por el compilador del lenguaje Java.

Codificar los Tipos de Datos en Java

Tipo de Dato en lenguaje natural Tipo Dato JavaEntero byte, short,int,longReal float, doubleCadena StringLógico booleanCarácter char

Cada tipo de dato en java reserva una cantidad de memoria y permite un rango o dominio de valores

byte 1 byte o 8 bits -128 a 127short 2 bytes o 16

bits-32768 a 32767

int 4 bytes o 32 bits

-2147483648 a -2147483647

Long 8 bytes o 64 bits

-9223372036854775808 a -9223372036854775807

float 4 bytes o 32 bits

1 bit signo, 8 exponente, 24 mantisa. 1.4x10-45 1.4x1038

double 8 bytes o 64 bits

1 bit signo , 11 exponente, 52 mantisa

boolean 1 bit true o falsechar 2 bytes o 16

bitsCaracteres Unicode

Diseño y codificación de los atributos de un objeto

Calculadora Cadena marca;

Cadena modelo;carácter tipo;lógico prendida;

class Calculadora { private String marca; private String modelo; private char tipo; private boolean prendida; private float numero1;

Archivo Fuente .java

Archivo bytecode .class

Java Virtual Machine

Page 12: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

real numero1;real numero2;

private float numero2; }

CirculoReal radio;

class Circulo{ private float radio;}

Haz el mismo ejercicio para los siguientes objetos Auto, Termómetro, Persona, Cuentabancaria

Representación de los datos en memoria

Organización de la computadora

Cada tipo de tipo de dato ocupa o reserva un determinado espacio en la memoria RAM, bajo una estructura determinada. La computadora de lo único que entiende es de 0s y 1s, para el computador 5 en sistema decimal es igual 0101 en sistema binario.

A cada dígito 1 o 0 se le conoce como bit, los cuales representan ciertos rangos de voltaje, el 1 equivale a un voltaje más alto que el 0, el cual depende de la arquitectura de cada computador.

Podemos definir entonces 1Byte = 8 bits, 1Kb = 1024Bytes, 1 Mb = 1024Kb, 1Gb = 1024Mb, 1Tb = 1024 Gb, pueden ver en el sgte link las equivalencias que existen:

http://es.wikipedia.org/wiki/Exabyte

Podemos representar los bits como celdas por ejemplo:

1Byte en la memoria RAM del computador

0 0 0 1 0 1 0 1

Este byte representa al número 21 en decimal

Con 1 bit podemos representar 0 y 1

Con 2 bits podemos representar 00, 01, 10, 11 (0,1, 2, 3)

Page 13: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Con 3 bits podemos representar 000, 001, 010, 011, 100, 101, 110, 111 que equivalen a (0, 1, 2, 3, 4, 5, 6, 7)

Con N bits entonces podemos generar 2 N posibles valores

Si queremos representar X valores diferentes, necesitaremos N bits, donde N es el mayor entero, mayor o igual que log 2 X

Números Enteros

Si tenemos 32 bits podemos representar 2 32 posibles combinaciones de de 0s y 1s

lo cual nos permite generar hasta 4294967296 valores (0 4294967295).

Ahora qué es lo que pasa con los números negativos y el cero, el computador será capaz de representar – 2147483648 hasta 2147483647

No podemos representar más números si yo realizo la siguiente operación 2147483647 + 1 obtendré como resultado – 2147483648.

Una variable entera (int) está formada por 4 bytes, es decir 32 bits. Estos 32 bits representan el valor almacenado por esa variable en binario. Por ejemplo:

El valor representado por esta variable es:

1*2^2 + 0*2^1 + 1*2^0

En donde x^y se usa acá como una abreviación de x elevado a y.

En general, una variable entera x está formada por 32 bits que denotaremos x31, x30, ... , x2, x1 y x0. El valor numérico representado por la variable x está dado por el siguiente cálculo:

Si x31 es 0, el valor es positivo y se calcula como:

x31*2^31 + x30*2^30 + ... + x2*2^2 +x1*2^1+ x0*2^0

Si x31 es 1, el valor es negativo y se calcula construyendo una nueva palabra y, tal que:

yi= 1 si xi==0

0 si xi==1

valor(x) = - (valor(y) + 1)

Se dice que y es el complemento de x.

Ejemplos:

valor(000...001001) = 1*2^3+1*2^0= 9

valor(111...111010) = - (valor(000...000101)+1) = - (5+1) = -6

Page 14: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Una variable entera (int) siempre utiliza 32 bits, aún cuando el número sea pequeño. Por otra parte, no es capaz de almacenar números demasiado grandes (en valor absoluto).

Valores máximos y mínimos

Máximo= valor(011...111111)= 2^31-1

Mínimo= valor(100...000000)= -2^31

Por lo tanto, con un int se pueden almacenar números de 9 dígitos aproximadamente.

Ejercicios:

¿Qué número representa el siguiente número en binario 000...00101011?

¿y el 111...101001?

¿Cómo se representa en el computador el número 23?

¿y el -35?

tipo número rango de bits representado

int 32 [-2^31,2^31-1]

short 16 [-2^15,2^15-1]

byte 8 [-2^7,2^7-1]

long 64 [-2^63,2^63-1]

Números Reales (En notación Científica)(+/-)Mantisa x 2exponente

El ordenador solo puede representar un subconjunto de los números reales (números en coma flotante).

Las operaciones aritméticas en coma flotante están sujetas a errores de redondeo:

N < 0 N>0

-∞ -N(max) N(max) +∞

Estándar IEEE 754

Precisión Sencilla (bit de signo + 8 bits exponente + 32 bits mantisa)

Precisión Doble (bit de signo + 11bits exponente + 32bits mantisa)

Una variable real (double) está formada por 8 bytes, es decir el doble de un entero. En ella se almacenan números reales en formato binario. Por ejemplo, el número:

Desbordamiento

Desbordamiento

Agotamiento

Page 15: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

1101.1010

Representa en decimal al número:

2^3 + 2^2 + 2^0 + 2^(-1) + 2^(-3) = 8+4+1+0.5+0.125

Los primeros computadores almacenaban los números reales en una formato llamado punto fijo, en donde se destinaba una cantidad fija de bits para la parte entera (por ejemplo 32 bits) y el resto a la parte fraccionaria. Por lo tanto, el número anterior sería representado en 64 bits como:

00000000 00000000 00000000 00001101 . 10100000 00000000 00000000 00000000

En esta representación, el punto que separa la parte entera de la parte fraccionaria, siempre se ubica en una posición fija y de ahí el nombre de esta representación.

El problema de esta representación es que el rango de valores representables es el mismo de los números enteros. Se necesitaba un mecanismo que aumentara el rango de números representables. La forma de hacerlo fue destinar una parte de los bits a indicar la posición del punto. Y este formato paso a llamarse punto flotante.

Representación en punto flotante

Un número real se almacena en una variable especificando 3 componentes: el signo (+ o -), la mantisa y el exponente. Por ejemplo, el número 11 se representa como:

El signo: +

Mantisa: 10110000...

Exponente: 4

La mantisa es una secuencia de bits que siempre comienza en 1. El exponente indica en donde colocar el punto que separa la parte entera de la fraccionaria. Un valor 0 indica que el punto se coloca justo antes del primer bit. Un valor 4 indica que se coloca después del cuarto bit. Un valor -3 indica que hay que imaginar que el número va precedido por 0.000 y luego viene la mantisa.

¿Qué número es el siguiente?

el signo: -

mantisa: 110010000...

exponente: 7

Solución: -1100100.00... , que es -(4+32+64)= -100

Otros ejemplos:

signo mantisa exponente en binario en decimal

+ 1000... 100 1 seguido 2^99 de 99 ceros

+ 1010... 0 0.1010 0.5+0.125 (0.625)

+ 1000... -3 0.0001 2^(-4) (0.0625)

Page 16: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

En una variable de tipo double se destina 1 bit para el signo, 11 bits para el exponente y 52 bits para la mantisa.

Valores máximos y mínimos

Máximo en valor absoluto: 2^1023

Valor más pequeño: 2^(-1024)

La ventaja de esta representación es que se alcanza un rango de representación mucho más grande de lo que sería posible con 64 bits.

Precisión y error de representación

La desventaja es que los números se almacenan con una precisión limitada. Esto significa que un número que requiera 100 bits de mantisa será aproximado a uno que solo ocupa 52, introduciéndose entonces un error de representación.

El error que se comente se puede visualizar mejor en base 10. El error que comete es como cuando el siguiente número:

1234567890123456789012345678901234567890

se aproxima al siguiente valor:

123456789012345*10^25

Es decir, solo se representan 15 dígitos de los 40 iniciales. El error absoluto que se comete es:

6789012345678901234567890

que parece enorme, pero lo que importa es el error relativo que es ~10^(-15) que es bajísimo y para la mayoría de las aplicaciones numéricas es insignificante. Pero es un error que conviene tener presente.

Observación: además del tipo double existe el tipo float

tipo tamaño mantisa exponente rangoprecisión

en bits en bitsen bits representado en dígitos

double 64 52 11 ~ [-10^300,10^300] ~ 15

float 32 24 7 ~ [-10^33,10^33] ~ 7

Conceptos esenciales de este capítulo que Ud. debe comprender:

El rango de representación de los enteros es limitado. Si el resultado de una operación aritmética (como la multiplicación) excede el rango de representación se producirá un error en la magnitud del valor almacenado. Lamentablemente, Java no alerta cuando se comete este tipo de errores.

El rango de representación de los reales es casi ilimitado, pero los números se almacenan con una precisión limitada (15 dígitos para una variable de tipo double). Esto hace que al realizar multiplicaciones y divisiones, los valores que se obtienen

Page 17: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

poseen un error de precisión, que no es relevante para la mayoría de las aplicaciones numéricas.

Tarea :

Muestre que el número 0.3 no es representable en forma exacta en una variable de tipo double.

Indicación:

Para obtener la representación de un número en el rango [0,1[ como 0.6875 proceda de la siguiente forma:

0.6875 multiplicado por 2 da: 1.375.

La parte entera es el primer bit del número en base 2. El número será entonces 0.1... Quédese sólo con la parte fraccional de 1.375.

0.375 multiplicado por 2 da: 0.75.

La parte entera es el segundo bit, por lo que queda como 0.10...

0.375 multiplicado por 2 da: 1.5.

La parte entera es el tercer bit, por lo que queda como 0.101... Quédese sólo con la parte fraccional de 1.5.

0.5 multiplicado por 2 da: 1.

La parte entera es el cuarto bit, por lo que queda como 0.1011... Quédese sólo con la parte fraccional de 1.0.

El número que queda es 0, por lo que 0.6875 en base 2 es 0.1011.

Aplique este mismo método para 0.3 y deduzca la forma final del número en base 2.

Representación de textos

Se escoge un conjunto de símbolos alfabéticos, numéricos y especiales (separadores y signos de puntuación), gráficos y de control (por ejemplo, retorno de carro).

Estos símbolos se codifican usando n bits con lo cual puedo representar 2 n símbolos.

Ejemplos de códigos normalizados

ASCII (American Standard Code For Information Interchange)

ANSI X 3.4-1968, 7 bits (128 símbolos)

ISO 8859-1 = Latin 1, 8 bits (256 símbolos)

Page 18: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN
Page 19: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

SESIÓN 2 EXPRESIONES ARITMÉTICO LÓGICAS Y MÉTODOS

Operadores AritméticosSuma + 3 + 4Resta - 12.56 -56.09Multiplicación * 3 * 10.45División / 10 /2Potencia ^ 3^4Resto %(mod) 35%3

Operadores RelacionalesMayor que >Menor que <Mayor o igual que >=Menor o igual que <=Diferente !=igual ==

Operadores Lógicos

NO lógico (NOT) o negación:

Operador unario (aplicado a un único operando). Cambia el valor de verdad de verdadero (V) a falso (F) y viceversa.

p NOT p

V FF V

O lógica (OR) o disyunción:

Operador n-ario (aplicado a 2 o más operandos). Si todos los operandos son F devuelve F; si hay alguno que sea V devuelve V.

p q p OR q

V V V

V F V

F V V

F F F

Y lógica (AND) o conjunción:

Operador n-ario . Si todos los operandos son V devuelve V; si hay alguno que sea F devuelve F.

p q p AND q

V V V

V F F

F V F

F F F

Page 20: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

O-eXclusiva lógica (XOR):

Operador binario (aplicado a dos operandos). Devuelve V cuando ambos operandos son distintos y F cuando son iguales.

p q p XOR q

V V F

V F V

F V V

F F F

Expresiones Aritméticas

Una expresión aritmética puede ser una variable, una constante o un conjunto operadores y operandos. Los operadores actúan sobre los operandos para obtener un resultado.

Los paréntesis permiten agrupar operaciones permitiendo darle mayor precedencia o prioridad de cálculo.

Expresar los siguientes ejercicios como una expresión aritmética

Calcular la suma de dos números reales

Suma=numero1+numero2 suma es una variable de tipo real a la cual se le asigna el resultado de la suma de ambos números.

Calcular al área del círculo

AreaCirculo = 3.14.16*r^2 3.14.16 y 2 son constantes literales, r es una variable real que identifica el radio del círculo y areacirculo es una variable real.

Se pueden expresar las expresiones anteriores en lenguaje natural de la sgte manera:

Expresiones Lógicas

Dado M=2 y N = 10

Entonces (M<N) y (N<2*M) V y F

F

El resultado de la expresión lógica es Falso

Page 21: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Entonces ((M-N) != 10) O (2*N>4*M)V O V

V

Para poder codificar las expresiones lógicas anteriores en Java usamos los siguientes equivalentes:

Codificando en Java

Y &&

O ||

NO !

&: devuelve verdadero si ambos operandos son true, evaluándolos ambos.

| : devuelve verdadero uno de los operandos es true, evaluándolos ambos.

Entonces la primera expresión lógica era:

(M<N) y (N<2*M) en java esto sería (M<N) && (N<2*M)

((M-N) != 10) O (2*N>4*M) en java esto sería ((M-N) != 10) || (2*N>4*M)

Es casi idéntico salvo por los operadores lógicos

Definir una expresión lógica de tal forma que dado un número nos devuelva Verdadero si es positivo o falso si es negativo.

(numero > 0)

Cuando numero tiene valor 10, entonces (numero > 0) es verdadero.Cuando numero tiene valor -3, entonces (numero > 0) es falso.

Definir una expresión lógica de tal forma que dado un número nos devuelva verdadero si está entre 1000 y 2000, falso en caso contrario.

(Numero >= 1000) y (Numero<=2000)si Numero=1200 (1200 >= 1000) es V y (1200<=2000) es V, por lo tanto V y V resulta V.

Como estamos usando la conjunción basta que una de las condiciones falle para que el resultado sea falso.

Métodos

Los métodos son servicios que el objeto es capaz de brindar a otros objetos, esto debido a que los objetos interactúan unos con otros.

Esta interacción o comunicación entre objetos se realiza mediante mensajes

Page 22: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Cada mensaje pide la ejecución de un servicio de un objeto.

En el caso de la calculadora vamos a definir al inicio solo dos servicios o métodos que esta nos puede proporcionar uno es el de la suma de dos números reales y el otro que nos diga si el número que digitamos es positivo o no.

real suma() Inicio

retornar (numero1 + numero2);

Fin

float suma(){

return (numero1 + numero2);

}

lógico es_positivo()Inicio retornar (numero>0);Fin

boolean es_positivo(){

return (numero>0);

}Lógico dentro_rango()Inicio Retornar ((Numero >= 1000) y (Numero<=2000));Fin

boolean dentro_rango(){

return ((Numero >= 1000) && (Numero<=2000));}

En el caso del círculo esta clase nos permite calcular el área dado un radio determinado

real areaCirculo()Inicio

retornar (3.1416*r^2);

Fin

float areaCirculo(){

return (3.1416*r*r);

}

Objeto1 Objeto2

Servidor de Mensaje 1 Servidor de Mensaje 2

Mensaje 2Mensaje 1

Cliente de Mensaje 2

Page 23: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Vamos a diseñar y codificar a toda la calculadora

Modelo en lenguaje Natural En lenguaje de programación JavaCalculadoraInicio Cadena marca;

Cadena modelo;carácter tipo;lógico prendida;real numero1;real numero2;

real suma() Inicio

retornar (numero1 + numero2);

Fin

lógico es_positivo()Inicio retornar (numero1>0);Fin

Fin Calculadora

class Calculadora { //inicio

private String marca; private String modelo; private char tipo; private boolean prendida; private float numero1; private float numero2;

float suma(){

return (numero1 + numero2);

}

boolean es_positivo(){

return (numero1>0);

}} // fin de clase

CirculoInicioReal radio;

real areaCirculo()Inicio

retornar (3.1416*r^2);

Fin

Fin

class Circulo{ private float radio;

float areaCirculo(){

return (3.1416*r*r);

}}

Cuando se define una clase lo que se está haciendo es un molde a partir del cual se van a crear objetos, de acuerdo al contexto en el que nos encontremos.

Realizar este mismo ejercicio pero para Auto, Termómetro digital CuentaBancaria, Matrimonio, Persona

Page 24: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

SESIÓN 3 EXPRESIONES ARITMÉTICO LÓGICAS Y MÉTODOS

En el campeonato descentralizado se quiere modelar una clase que permita manejar a todos los equipos de futbol y el puntaje total obtenido, cada equipo tiene un nombre, partidos empatados, partidos perdidos, partidos ganados, cada partido ganado es 3 puntos, cada partido empatado es 2 puntos y por cada partido perdido se le disminuye un punto.

1) Características del EquipoNombrepartidos_jugadospartidos_perdidospartidos_empatados

2) Diseñamos los atributos de la clase EquipoInicio Cadena Nombre; entero partidos_ganados; entero partidos_empatados;

entero partidos_perdidos;Fin

3) Diseñamos los servicios que proporciona la clasePuntaje_total = Partidos_ganados*3 + partidos_empatados*2 – partidos_perdidos

4) Diseñamos los servicios como métodosEntero puntaje_total ()Inicio retornar (Partidos_ganados*3 + partidos_empatados*2 – partidos_perdidos);Fin

5) Diseñamos la clase completaEquipoInicio Cadena Nombre; entero partidos_ganados; entero partidos_empatados;

entero partidos_perdidos; Entero puntaje_total () Inicio retornar (Partidos_ganados*3 + partidos_empatados*2 – partidos_perdidos); FinFin

6) Codificar la clase en Javaclass Equipo { private String nombre;

Page 25: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

private byte partidos_ganados; private byte partidos_empatados;

private byte partidos_perdidos;

byte puntaje_total () { return (Partidos_ganados*3 + partidos_empatados*2 – partidos_perdidos); }

}

Se tiene en una bodega una serie de productos, los cuales tienen como características el nombre, precio de compra, precio de venta, las unidades vendidas, se necesita una clase que permita calcular el monto total de venta y la utilidad obtenida por la venta.

1) Características del productoNombrePrecio_compraPrecio_ventaUnidades_vendidas

2) Diseñar los atributos de la claseProductoInicio

Cadena Nombre;Real precio_compra;Real precio_venta;Entero unidades_vendidas;

Fin3) Diseñamos los servicios que proporciona la clase

Monto de venta Unidades_vendidas*precio_VentaLa utilidad Unidades_vendidas*(precio_venta-precio_compra)

4) Diseñamos los servicios como métodosReal monto_venta()Inicio

retornar (Unidades_vendidas*precio_Venta);FinReal utilidad()Inicio

Retornar (Unidades_vendidas*(precio_venta-precio_compra);FinNOTA: se debe tomar en cuenta que ambos métodos pudieron ser atributos de la clase; sin embargo; se deben evitar atributos calculados o derivados

5) Diseñamos la clase completaProductoInicio

Cadena Nombre;Real precio_compra;Real precio_venta;Entero unidades_vendidas;Real monto_venta()

Page 26: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Inicioretornar (Unidades_vendidas*precio_Venta);

FinReal utilidad()Inicio

Retornar (Unidades_vendidas*(precio_venta-precio_compra);Fin

Fin

6) Codificamos la claseclass Producto{

private String Nombre;private float precio_compra;private float precio_venta;private int unidades_vendidas;float monto_venta(){

return (Unidades_vendidas*precio_Venta);}float utilidad(){

return Unidades_vendidas*(precio_venta-precio_compra);}

}

Page 27: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

SESION 4 ESTRUCTURAS ALGORITMICAS SECUENCIALES

Problema

Diferencia entre un estado final y un estado inicial, un estado actual y un estado deseado.

Ejemplo “Clasificación al mundial de futbol”

Algoritmo Secuencia de pasos o acciones finitas, ordenadas de manera lógica que nos permiten dar solución a un determinado problema, sin hacer uso del computador.

(Del latín, dixit algorithmus y éste a su vez del matemático persa al- Jwarizmi ) es una lista bien definida, ordenada y finita de operaciones que permite hallar la solución a un problema

Simple, preciso, claro

Definido -> confiable

Orden Lógico

Tener Inicio y Fin, es decir; ser finitos

Eficiente (Uso justo de memoria y tiempo de procesador)

Eficaz (Debe funcionar correctamente)

Tipos de Algoritmos

Pseudocódigo: Este tipo de algoritmo se expresa en lenguaje natural, inicialmente de manera informal, para luego expresarlo siguiendo ciertas reglas estándar.

El pseudocódigo describe un algoritmo utilizando una mezcla de frases en lenguaje común, instrucciones de programación y palabras clave que definen las estructuras básicas. Su objetivo es permitir que el programador se centre en los aspectos lógicos de la solución a un problema.

No siendo el pseudocódigo un lenguaje formal, varían de un programador a otro, es decir, no hay una estructura semántica ni arquitectura estándar. Es una herramienta ágil para el estudio y diseño de aplicaciones

Se necesita hacer un pseudocódigo para poder realizar la suma de dos números en una calculadora.

Inicio suma números prender la calculadora ingresar primer numero ingresar segundo número Realizar calculo Mostrar resultado Apagar la calculadoraFin

Page 28: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Entonces la calculadora funciona igual al computador, tiene dispositivos que permiten la entrada de datos y además dispositivos que permiten la salida de datos.

En la computadora el ingreso de datos se puede dar a través de los siguientes dispositivos:

El teclado, Mouse, scanner, CD, DVD, Memory, DiscoDuro

Los dispositivos de salida de datos son:

Pantalla, impresora, CD, DVD, Memory, DiscoDuro

Entonces lo que tenemos que hacer es diseñar y codificar un programa que permita realizar la suma de dos números. Para esto debemos aprender tenemos lo siguiente:

Instanciación de una clase

Instanciar una clase es crear objetos a partir de ella, como dijimos antes la clase es una especie de molde, que determina la estructura de los objetos que agrupa. La instanciación coloca en memoria al objeto creado.

Ejemplo

La clase calculadora se ha instanciado 3 veces, para dar vida a 3 calculadoras que mantienen la misma estructura.

Entonces para crear una instancia de una clase en Java usamos la palabra reservada new y escribimos la siguiente sentencia:

La instanciación se puede hacer de 2 maneras

Calculadora

New

NewNew

Page 29: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

1era FormaClase Objeto; // declaramos el objetoObjeto = new Clase(); // instanciamos el objeto

2da Forma

Clase Objeto = new Clase(); // declaración e instanciación en la misma sentencia

Siguiente la 2da forma podemos declarar e instanciar un objeto calculadora

Calculadora oCalculadora = new Calculadora();

Si quisiéramos crear otras calculadoras entonces haríamos lo sgte:

Calculadora oCalculadora1 = new Calculadora();

Calculadora oCalculadora2 = new Calculadora();

Es decir creamos 3 calculadoras a partir de un mismo molde, en este caso la clase calculadora.Tomar en cuenta que los 3 objetos han sido identificados de manera diferente, colocándoles un número al final, si no los identificamos de manera diferente, estaríamos trabajando sobre el mismo objeto a pesar de haber instanciado 3 veces.

Lógicamente para poder prender una calculadora, esta debe existir, en el mundo real, esta premisa es coherente, sin embargo para la computadora no lo es, si pretendemos representar una calculadora en el computador, esta calculadora NO existe hasta que la instanciamos.

Para poder usar los atributos y métodos de un objeto primero debe ser instanciado

¿Cómo asignamos valores a los atributos de una clase?

Los valores pueden ser asignados a los atributos de un objeto desde el mismo programa a lo cual se le conoce como inicialización o desde un dispositivo externo, para propósitos del curso usaremos el teclado como dispositivo para el ingreso de datos.

Primero tenemos la clase Calculadora que ya la habíamos modelado

class Calculadora { //inicio

String marca; String modelo; char tipo; boolean prendida; float numero1; float numero2; float suma(){ return (numero1 + numero2); } boolean es_positivo(){ return (numero1>0);

Método constructor de la clase Calculadora

Page 30: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

}} // fin de clase

Luego instanciamos un primer objeto calculadora

Calculadora oCalculadora = new Calculadora();

Entonces si quiero asignarle el primer número a la calculadora que he creado, desde el mismo programa hago lo siguiente:

oCalculadora.numero1=3; // asigno el número 3 al atributo numero1

oCalculadora.numero1=10; // asigno el número 3 al atributo numero2

A este primer paso se le conoce como INICIALIZACIÓN

La asignación es de derecha a izquierda, puedo asignar constantes literales ya sean números, caracteres, valores lógicos o cadenas y también puedo asignar expresiones aritméticas o lógicas.

Retomando el algoritmo inicial, empezamos a codificar

Inicio suma números prender la calculadora ingresar primer número ingresar segundo número Realizar calculo Mostrar resultado Apagar la calculadoraFin

Calculadora oCalculadora = new Calculadora();oCalculadora.numero1=3;oCalculadora.numero1=10;System.out.println(oCalculadora.suma());

Ahora debemos hacer que este pequeño programa se puede probar en la computadora para ello debemos crear un PROGRAMA PRINCIPAL.

En java podemos crear el programa principal de la siguiente manera:

class Sumar {

public static void main (String [] args) {

Calculadora oCalculadora = new Calculadora(); oCalculadora.numero1=3; oCalculadora.numero1=10; System.out.println(oCalculadora.suma());

}

}

Con esto hemos realizado un algoritmo secuencial y lo hemos codificado en Java

Con lo cual tenemos al finalizar este ejercicio tendremos 2 archivos uno para guardar la clase Calculadora.java y otro con la clase para el manejo del programa principal Sumar.java

En la asignación se valores o expresiones se debe tener en cuenta que debe ser entre variables o atributos del mismo tipo de dato, no puedo

Nombre del programa principal

Método main que permite definir el inicio y final del programa principal

Se envía un mensaje al objeto calculadora para que realice la suma, este mensaje hace una llamada al método

Page 31: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

asignar un valor numérico a un atributo o variable de tipo cadena por ejemplo

¿Cómo haría para inicializar los valores desde el teclado?

En java asignar valores desde el teclado, utilizamos las siguientes instrucciones, creamos los objetos para leer desde el teclado:

InputStreamReader isr = new InputStreamReader (System.in);BufferedReader br = new BufferedReader (isr);

Luego leemos la línea ingresada

br.readLine(), esta instrucción siempre lee en forma de cadena.

Pero tenemos un inconveniente los atributos a los cuales deseamos asignarle el valor ingresado desde el teclado es de tipo entero numero1 y numero2, entonces para eso deberemos convertir la cadena en tipo de dato entero, java proporciona una clase para realizar dicha tarea.

oCalculadora.numero1=Integer.parseInt(br.readLine());

oCalculadora.numero2=Integer.parseInt(br.readLine());

el Integer.parseInt(), permite convertir una cadena en un entero.

Con lo cual nuestro programa principal para sumar dos números ingresados desde el teclado, quedaría como sigue:

class Sumar {

public static void main (String [] args) {

Calculadora oCalculadora = new Calculadora(); InputStreamReader isr = new InputStreamReader (System.in); BufferedReader br = new BufferedReader (isr); oCalculadora.numero1= Integer.parseInt(br.readLine()); oCalculadora.numero1= Integer.parseInt(br.readLine()); System.out.println(oCalculadora.suma());

}

}

Diagrama de Flujo: Algoritmo hecho a manera de una representación gráfica de las acciones que conforman un proceso. Estos diagramas utilizan una serie de símbolos con significados especiales.

Inicio y Fin del Diagrama de Flujo

Lectura de datos desde el teclado

Page 32: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Proceso , asignación,cálculos,etc

Decisión , decidimos si ejecutamos un bloque de acciones o no

Mostrar datos en pantalla

Conector para continuar en la misma página

Conector para continuar en la siguiente página.

Nuestro algoritmo inicial hecho a manera de pseudocódigo, lo podemos expresar a manera de pseudocódigo

Inicio suma números prender la calculadora ingresar primer número ingresar segundo número Realizar calculo Mostrar resultado Apagar la calculadoraFin

Inicio

Numero1

Número2

Suma= Numero1 + Numero2

Suma

Fin

Page 33: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Sesión 5 ESTRUCTURAS ALGORITMICAS SECUENCIALES

Variables Locales vs Atributos

Tenemos el siguiente método que habíamos definido para la clase calculadora, este método solo hace uso del procesador.

float suma(){ return (numero1 + numero2); }

Para declarar una variable local se usa la siguiente sintaxis:

Tipo de dato Identificador de variable;

Si queremos inicializarla en la misma sentencia de declaración

Tipo de dato Identificador de variable = valor;

float suma(){float resultado; // declaramos o definimos una variable local , el tipo tiene debe ser el mismo // tipo que devuelve el método para evitar la incompatibilidad

resultado=(numero1 + numero2); // asignamos la suma de dos números a la variable return resultado; // retornamos el valor de la variable

}

Si bien es cierto el agregar una variable más hace que el programa sea menos eficiente por qué hago uso de la memoria, esta variable adicional nos permite un mayor control del cálculo realizado, esta variable solo será visible en el método la cual se la ha definido, después de ejecutado el método, la variable local desaparece de memoria.

Parámetros en los métodos

Un parámetro (o argumento) es una variable que es recibida por una función, procedimiento o subrutina, método. Quien recibe el o los parámetros los utiliza para alterar su comportamiento o sus resultados al ejecutarse.

Page 34: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

En forma general, existen dos formas de pasar un parámetro a un procedimiento o función:

por valor

por referencia

Un parámetro se pasa por valor cuando se copia su contenido y si es alterado su valor dentro del procedimiento no se modifica el parámetro original. En cambio cuando un parámetro es pasado por referencia, si se modifica su valor dentro del procedimiento, se ve modificada el original.

¿En qué casos se necesita usar parámetros?

Si NO tenemos las variables disponibles como atributos del objeto

Si NO se pueden obtener como un cálculo de los atributos

Si los valores se pueden obtener ingresando datos del teclado o de otros método.

Si es necesario darle mayor flexibilidad al método que estamos programando.

Cuando necesitamos datos en un método y estos no están disponibles a partir de los atributos directamente o una expresión basada en los atributos, entonces vamos a necesitar parámetros para que el método pueda obtener datos que provienen del teclado o de otro método.

Por ejemplo vamos a redefinir nuestra clase calculadora como sigue:

class Calculadora { //inicio

String marca; String modelo; char tipo; boolean prendida;

float suma(float numero1, float numero2){ return (numero1 + numero2); }

boolean es_positivo(float numero){ return (numero>0); }

} // fin de clase

Para el caso de inicializar valores dentro del programa

Hemos quitado los atributos numero1 y numero2, entonces ahora si queremos sumar dos números tendremos que pasarlos como parámetros al método suma porque no los tenemos disponibles como atributos.

Page 35: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

class Sumar {

public static void main (String [] args) {

float num1;float num2;

Calculadora oCalculadora = new Calculadora(); num1=3; // inicializamos las variables locales num2=10;

System.out.println(oCalculadora.suma(num1,num2));

}

}

Para el caso de ingresar los valores desde el teclado

class Sumar {

public static void main (String [] args) {

float num1;float num2;float respuesta;

InputStreamReader isr = new InputStreamReader (System.in);BufferedReader br = new BufferedReader (isr);Calculadora oCalculadora = new Calculadora();

num1= Integer.parseInt(br.readLine()); num2= Integer.parseInt(br.readLine()); respuesta= oCalculadora.suma(num1,num2);

System.out.println(respuesta);

}

}

Métodos constructores

Los métodos constructores son tipos especiales de una clase que nos permiten inicializar los atributos de un objeto, en el mismo momento en que estamos instanciándolo.

El uso de parámetros genera más flexibilidad

Es importante recordar que en java, los parametros de los tipos primitivos (int, long, etc.) SIEMPRE se pasan por valor. Los objetos y arrays se pasan por referencia

Page 36: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Estos métodos Tienen la particularidad que se llaman igual que la clase y no retorna ningún tipo de dato. Veamos algunos ejemplos

class Persona{

String nombre;String apellido_paterno;String apellido_materno;String direccion;String telefono;String dni;String ruc;String email;String web;char sexo;String fecha_nacimiento;boolean casada;

Persona(){// método constructor nombre=””; apellido_paterno=””; apellido_materno=””; dirección=””; teléfono=””; dni=””; ruc=””; email=””; web=””; sexo=’H’; fecha_nacimiento=””; casada=false; }

Persona (String pnombre, String ppaterno, String pmaterno, char psexo){ //sobrecarga de //método constructor

nombre=pnombre; apellido_paterno=ppaterno; apellido_materno=pmaterno; sexo=psexo;

}String cual_es_tu_nombre(){

return nombre;}

String cual_es_tu_apellidoPat(){return apellido_paterno;

}String cual_es_tu_apellidoMat(){

return apellido_materno;}String cual_es_tu_edad(){

Page 37: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Retornar edad;}

}

Entonces ahora cuando instanciamos un objeto persona se ejecutará el primer constructor.Persona oPersona = new Persona(); // este constructor inicializa los valores en blanco

Persona oPersona = new persona (“Juan”,”Perez”,”Gonzales”,’H’); // instanciamos y le damos

// valores a los atributos considerados.

Persona oPersona = new persona (“Caroll”,”Hernández”,”Obando”,’M’);

Acceso público y privado a los atributos

Ya habíamos visto que cuando instanciábamos una clase para crear un objeto, se creaba la estructura de la clase en la memoria.

También vimos que para poder acceder a un atributo de una clase, usábamos la forma general objeto.atributo y para acceder a un método de la clase usábamos objeto.metodo(); a este tipo de acceso se le conoce como acceso público; sin embargo; existe otra forma de acceso conocido como privado el cual incorpora mayor seguridad a los datos de un objeto.

Como logramos configurar un acceso privado a los atributos de un objeto, pues es muy sencillo usaremos la palabra reservada prívate delante de cada atributo. Por lo general los atributos siempre serán privados y los métodos públicos, pero existen ciertos contextos en donde esto deja de ser válido.

Ahora usaremos la clase Auto

class Auto{

Al hacer un new se construye la estructura de la clase en memoria por cada instancia

Dibujamos la siguiente tabla para representar a la memoria

Page 38: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

private String Marca; private String Modelo; private byte numPuertas; private int kilometraje; private String placa; private boolean descapotable; private short velocidad;

short Acelerar(){

return (velocidad + 1);

}

short Frenar(){

return (velocidad – 1);

}

short Prender(){

return 1;

}

short Apagar(){

return 0;

}

}

Bueno para poder usar un objeto Auto tenemos que instanciarlo

Entonces

Auto oAuto = new Auto();

Si yo quisiera asignarle un valor al atributo marca y hago lo siguiente: oAuto.marca=”Toyota”; esto es incorrecto por que el acceso a ese atributo ha sido definido como privado.

¿Entonces, Cómo hacemos para asignarle un valor a ese atributo privado?

Pues tendremos que definir un método público que permita asignarle un valor a dicho atributo

Por ejemplo:

void set_marca(String pMarca){

Este método no devuelve ningún valor por lo tanto devuelve vacío o para lo cual java usa la palabra reservada void

Page 39: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Marca=pMarca;

}Este método debe añadirse a la clase que hemos definido previamente, entonces ahora cuando queramos asignarle una marca a algún objeto instanciado, haremos lo siguiente:

oAuto.set_marca(“Toyota”);

Análogamente se deben crear métodos para cada atributo que permitan la asignación de valores, a estos métodos se le conocen como métodos SET.

Ahora lo mismo sucedería si quiero recuperar el valor que está contenido en alguno de los atributos, antes solo bastaba con poner la instrucción oAuto.Marca y podíamos recuperar cuál es la marca del objeto oAuto, pero ahora que está como privado ya NO es posible, entonces es necesario crear un método que me permita recuperar el valor de ese atributo.

String get_Marca() {

Return Marca;

}

Entonces si yo quisiera mostrar en pantalla la marca del objeto oAuto tendría que poner la siguiente sentencia System.out.println(oAuto.get_Marca()); parar poder recuperar ese dato del objeto.

Entonces agregando los dos métodos el Set y Get en la clase

class Auto{

private String Marca; private String Modelo; private byte numPuertas; private int kilometraje; private String placa; private boolean descapotable; private short velocidad;

short Acelerar(){ return (velocidad + 1);}short Frenar(){ return (velocidad – 1);}short Prender(){ return 1;}short Apagar(){ return 0;}// agregamos los 2 métodos definidos

Page 40: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

void set_marca(String pMarca){ Marca=pMarca;}String get_Marca() {Return Marca;}}

Sesión 6 Estructuras Selectivas

La unidad aritmética y lógica es uno de los componentes más importantes de una computadora típica. El propósito de la unidad aritmética es el manejo de las operaciones aritméticas; la porción lógica da a la computadora la capacidad de tomar decisiones. Esto forma la base de la construcción si-entonces-de lo contrario (if-else), la que permitirá la selección de acciones alternativas.

Una decisión se especifica en una expresión lógica de la misma forma en que una operación de cálculo se especifica en una expresión numérica.

Suponga que tiene dos variables numéricas, denominadas A y B, que tienen valores diferentes, y suponga que desea imprimir el valor de la mayor. Si A es mayor que B, debe imprimir el valor de A; pero, por otro lado, si B es mayor que A, debe imprimirse el valor de B. La elección de que alternativa tomar depende de la decisión de si la variable A es o no mayor que B. Esta estructura se representa mediante el diagrama siguiente

Las estructuras selectivas se utilizan para tomar decisiones lógicas; de ahí que se suelan denominar también estructuras de decisión o alternativas.

Page 41: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

En las estructuras selectivas se evalúa una condición y en función del resultado de la misma se realiza una opción u otra. Las condiciones se especifican usando expresiones lógicas. La representación de una estructura selectiva se hace con palabras en pseudocódigo (if, else o bien en español si, sino), con una figura geométrica en forma de rombo o bien con un triángulo en el interior de una caja rectangular.

si <condición> entonces

<acción S1>

fin_si

Alternativa doble (si-entonces-sino/if-then-else)

La estructura anterior es muy limitada y normalmente se necesitará una estructura que permita elegir entre dos opciones o alternativas posibles en función del cumplimiento o no de una determinada condición.

Si la condición C es verdadera, se ejecuta la acción S1, y si es falsa, se ejecuta la acción S2.

si <condición>entonces

<acción S1>

sino

<acción S2>

fin_si

Page 42: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Hacer el algoritmo para escribir un programa que permita que la calculadora reste dos números y nos muestre por pantalla si la resta fue positiva o negativa

Inicioprender la calculadora;leer numero1;leer numero2;restar los números;Si (la resta es menor que cero) Mostrar “Es positiva”;Sino Mostrar “Es negativa”;Fin

Calculadora ocalc = new Calculadora();float numero1;float numero2;InputStreamReader isr = new InputStreamReader (System.in);BufferedReader br = new BufferedReader (isr);numero1=Integer.parseInt(br.readline());numero2= Integer.parseInt(br.readline());resta= ocalc.restar(numero1,numero2);if (resta<0) System.out.println(“Es positiva”);else System.out.println(“Es negativa”);

class Restar_numeros {

public static void main(String [] args){

Calculadora ocalc = new Calculadora(); float numero1; float numero2; float resta;

InputStreamReader isr = new InputStreamReader (System.in);BufferedReader br = new BufferedReader (isr); numero1=Integer.parseInt(br.readline());numero2= Integer.parseInt(br.readline());

resta= ocalc.restar(numero1,numero2);

if (resta<0) System.out.println(“Es positiva”);

else

System.out.println(“Es negativa”);

}

}

Hacer un algoritmo para un programa que calcule el pago que hacen un grupo de personas para ver una película teniendo en cuenta que si el grupo es menor de 8 personas el pago es de 1.5 soles por persona y para grupos de 8 personas o más el pago es 0.5 soles por persona.

class Pelicula {

byte numero_personas;float costo_pelicula(){

Page 43: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

if (numero_personas<8)

return 1.5;

else

return 0.5;

}

}

Hacer un algoritmo para un programa que convierta un número mayor de 10000, dado en segundos a horas minutos y segundos. Ejemplo 12015 segundos es equivalente a 3 horas, 20 minutos, 15 segundos

1) Definir la clase: Convertir_segundos2) Análisis del problema

EntradasNumero – la entrada dede ser inicializada ya sea por teclado o dentro del programa

Salida HorasMinutosSegundos

ProcesoHoras=Numero/3600Minutos=(Numero-Horas*3600)/60Segundos=Numero-Minutos*60

class Convertir_segundos {private long numero;prívate long horas;long minutos;long segundos;

void convierte(){ // este método no devuelve ningún valor , solo actualiza los valores de los // atributos Horas=Numero/3600; Minutos=(Numero-Horas*3600)/60; Segundos=Numero-Minutos*60;}}

Page 44: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

class Principal {public static void main(String [] args){

Convertir_segundos ocv = new Convertir_segundos(); InputStreamReader isr = new InputStreamReader (System.in);BufferedReader br = new BufferedReader (isr);ocv.numero= Long.parseLong(br.readline());ocv.convierte();System.out.println(“El número : ” + ocv.numero + “ Equivale a ” + ocv.horas + “, Horas” + ocv.minutos + “ Minutos , ” + ocv.segundos + “ Segundos ”);}}

De los estudiantes que se matriculan en la UNAT-A, los ex soldados pagan 30 soles por curso en el que se matriculen, mientras que los demás (regulares), pagan 50 soles por curso. Diseñe el algoritmo para escribir un programa en el que el usuario introduce los datos del estudiante (ex soldado o regular) y el número de cursos y las salidas sean la categoría del estudiante (ex soldado o regular), número de cursos y los costos totales por los cursos a llevar.

1) Definimos la clase UNAT2) Análisis del problema

Entradas

Carácter Tipo_de_estudianteentero numero_cursos

Salidas

Entero pagoentero costo_total

Proceso

Si tipo_de_estudiante es ex soldado entonces

Pago=30;

Caso contrario

Pago=50;

Costo_total=pago*numero_cursos;

3) Diseñar la clase

UNATInicio carácter tipo_de_estudiante; entero numero_cursos; entero pago; entero calcula_costo() Inicio

Class UNAT {char tipo_de_estudiante;byte numero_cursos;byte pago;

Page 45: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Si tipo_de_estudiante es ex soldado entonces Pago=30; Caso contrario Pago=50; Retornar(pago*numero_cursos); FinFin

int calcula_costo(){if (tipo_de_estudiante==’E’) pago=30;else pago=50;return (pago*numero_cursos);}

}

class UNAT_principal {public static void main(String [] args){

UNAT ounat = new UNAT(); InputStreamReader isr = new InputStreamReader (System.in); BufferedReader br = new BufferedReader (isr); ounat.tipo_de_estudiante=br.readLine().charAt(0);// leemos un caracter ounat.calcula_pago(); System.out.println(ounat. calcula_costo());

}

}

Selectivas Anidadas

En la ciudad de Chachapoyas, una agencia de seguros para automóviles asigna costos basados en el sexo y la edad del conductor. Los varones menores de 25 años pagan los precios más altos, 1000 soles. Los hombres de 25 años o más años pagan 700 soles. Las mujeres de menos de 21 años pagan 800 soles, mientras que las mujeres de 21 años o más pagan 500 soles. Escribir el algoritmo y el programa que imprima la edad del conductor, sexo, y el pago correspondiente para los clientes de la aseguradora

1) Definimos la clase: Agencia_seguros2) Análisis del problema

Entradas

Carácter Sexoentero edad

Salidas

Entero pago

Page 46: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Proceso

Si (sexo es hombre) Si (edad < 25) Pago =1000; Sino Pago=700;Sino // si es mujer Si (edad<21) Pago=800; Sino Pago=500;

3) Diseñar y codificar clase

Agencia_segurosInicio Carácter sexo; entero edad; entero pago; vacío calcula_pago () Inicio Si (sexo es hombre) Si (edad < 25) Pago =1000; Sino Pago=700; Sino // si es mujer Si (edad<21) Pago=800; Sino Pago=500; finFin

class Agencia_seguros{char sexo;short edad;short pago;

void calcula_pago (){if (sexo==’H’) if (edad<25) pago=1000; else pago=700;else if (edad<21) pago=800; else pago=500;}

}

class Agencia_seguros_principal {public static void main(String [] args){

Agencia_seguros oagencia = new Agencia_seguros(); InputStreamReader isr = new InputStreamReader (System.in); BufferedReader br = new BufferedReader (isr);

oagencia.sexo=br.readLine().charAt(0);oagencia.edad= Short.parseShort(br.readLine());oagencia.calcula_pago();System.out.println(oagencia.pago);

Page 47: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

}

}

Sesión 7 Selectivas Múltiples

Escribir el algoritmo y programa que solicita se le ingrese un número. Si el número es positivo debe escribirse el número y junto a el positivo (15 POSITIVO). Si el número es cero (0 CERO); Si es negativo debe escribirse el número y junto a el negativo (-5 NEGATIVO).

1) Definimos la clase: Numero2) Análisis del problema

EntradasEntero num

SalidasCadena Mensaje

ProcesoSi numero es mayor que cero entonces mostrar “(“ + numero + “POSITIVO)”Si numero es cero entonces mostrar “(“ + numero + “CERO)”Si numero es menor que cero entonces mostrar “(“ + numero + “NEGATIVO”

3) Diseñar la claseNumeroInicioentero numero;cadena mensaje;vacio obtener_mensaje()Inicio

Si numero es mayor que cero entonces mensaje = “(“ + numero + “POSITIVO)”Si numero es cero entonces mensaje= “(“ + numero + “CERO)”Si numero es menor que cero entonces mensaje=“(“ + numero + “NEGATIVO”

FinFin

class Numero{short num;String mensaje;void obtener_mensaje(){ if (numero>0) mensaje = “(“ + numero + “POSITIVO)”;if (numero==0) mensaje= “(“ + numero + “CERO)”;if (numero<0) mensaje=“(“ + numero + “NEGATIVO”;}

}

Page 48: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

class Numero_principal {public static void main(String [] args){

Numero onum = new Numero();

InputStreamReader isr = new InputStreamReader (System.in); BufferedReader br = new BufferedReader (isr);

System.out.println(“Ingresa el número”);onum.num= Short.parseShort(br.readLine());

onum.obtener_mensaje();System.out.println(onum.mensaje);

}

}

Hacer un algoritmo y un programa que devuelva el nombre del día de la semana siguiendo un orden de correspondencia (1, 2, 3...7) para (lunes, martes, miércoles... domingo) respectivamente.

1) Definición de clase: Dia_semana2) Análisis del problema

Entrada entero num_diaSalida cadena nombre_diaProceso si num_dia es 1 entonces nombre_dia=”lunes” si num_dia es 2 entonces nombre_dia=”martes” si num_dia es 3 entonces nombre_dia=”miércoles” si num_dia es 4 entonces nombre_dia=”jueves” si num_dia es 5 entonces nombre_dia=”viernes” si num_dia es 6 entonces nombre_dia=”sábado” si num_dia es 7 entonces nombre_dia=”Domingo”

3) Diseño de la claseDia_semanaInicio entero num_dia; cadena nombre_dia; vacio dame_nombre_dia() Inicio si num_dia es 1 entonces nombre_dia=”lunes” si num_dia es 2 entonces nombre_dia=”martes”

Page 49: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

si num_dia es 3 entonces nombre_dia=”miércoles” si num_dia es 4 entonces nombre_dia=”jueves” si num_dia es 5 entonces nombre_dia=”viernes” si num_dia es 6 entonces nombre_dia=”sábado” si num_dia es 7 entonces nombre_dia=”Domingo” Finfin

4) Codificación de la clase

class Dia_semana{ byte num_dia; String nombre_dia; void dame_nombre_dia(){ if (num_dia== 1) nombre_dia=”Lunes”; if (num_dia==2) nombre_dia= “Martes”; if (num_dia== 3) nombre_dia=”Lunes”; if (num_dia==4) nombre_dia= “Martes”; if (num_dia== 5) nombre_dia=”Lunes”; if (num_dia==6) nombre_dia= “Martes”; if (num_dia==7) nombre_dia= “Martes”; }}

class Dia_semana _principal {public static void main(String [] args){

Dia_semana odia = new Dia_semana();InputStreamReader isr = new InputStreamReader (System.in);BufferedReader br = new BufferedReader (isr);odia.num_dia=Byte.parseByte(br.readLine());odia.dame_nombre_dia();System.out.println(“El nombre del día es :” + odia.nombre_dia);

}}

class Dia_semana{ byte num_dia; String nombre_dia; void dame_nombre_dia(){ switch (num_dia) { case 1: nombre_dia=”Lunes”;break; case 2: nombre_dia= “Martes”;break; case 3: nombre_dia=”Lunes”;break; case 4: nombre_dia= “Martes”;break; case 5: nombre_dia=”Lunes”;break; case 6: nombre_dia= “Martes”;break; case 7: nombre_dia= “Martes”;break; default: nombre_dia=”No existe”; } }}

Hacer el algoritmo y programa que calcule:

- El valor del área de un triángulo, dada la base y la altura.

- El valor de la base de un triángulo dada la altura y el área.

- El valor de la altura de un triángulo dada la base y el área.

1) Definimos la clase: Triangulo

2) Análisis del problema:

Page 50: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Entradascarácter tipo_calculoreal basereal altura

real areaSalidas

Real valor

Proceso

Si (tipo_calculo es ‘a’) entonces Inicio area= base*altura/2 valor=area Fin

si (tipo_calculo es ‘b’) entonces Inicio base = area*2/altura valor=base; Fin

si (tipo_calculo es ‘h’) entonces Inicio altura =area*2/base valor=altura fin

4) Diseño de la clase

TrianguloInicio carácter tipo_calculo

real basereal alturareal valor

vacio calcular_valor() Inicio Si (tipo_calculo es ‘a’) entonces Inicio area= base*altura/2 valor=area Fin

si (tipo_calculo es ‘b’) entonces Inicio

Page 51: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

base = area*2/altura valor=base; Fin

si (tipo_calculo es ‘h’) entonces Inicio altura =area*2/base valor=altura fin fin calcular_valor fin Triangulo

5) Codificar clase y programa principal

class Triangulo{ char tipo_calculo; float base; float altura; float area; float valor; void calcular_valor(){ switch (tipo_calculo){ case ‘a’: {area=base*altura/2;valor=area;break;} case ‘b’:{ base = area*2/altura ;valor=base;break;} case ‘h’:{ altura =area*2/base ;valor=altura;break;} } }}

class Triangulo_principal{public static void main(String [] args){ }}

Page 52: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Sesión 8 Estructuras Algorítmicas Repetitivas

ContadorUn contador es una variable cuyo valor se puede incrementar o decrementar. Por ejemplo

byte contador;contador=3;contador = contador +1; // contador ahora es 4

contador=15;contador=contador-1; // contador ahora es 14

También puede expresarse de la sgte manera:contador++;contador+=1;

contador--;contador-=1;

AcumuladoresLas variables acumuladoras tienen la misión de almacenar resultados

int sueldo;int aumento;

Sueldo=1000;

Aumento=200;

Page 53: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

sueldo = sueldo + aumento; // sueldo ahora es 1200

sueldo=sueldo+aumento;//sueldo ahora es 1400

Estructuras Repetitivas

Se llama Mientras a la estructura algorítmica que se ejecuta mientras la condición evaluada resulte verdadera. Se evalúa la expresión booleana y, si es cierta, se ejecuta la instrucción especificada, llamada el cuerpo del bucle. Entonces se vuelve a evaluar la expresión booleana, y si todavía es cierta se ejecuta de nuevo el cuerpo. Este proceso de evaluación de la expresión booleana y ejecución del cuerpo se repite mientras la expresión sea cierta.

Cuando se hace falsa, finaliza la repetición. En la lección anterior iniciamos con las estructuras repetitivas. La estructura While (condición) { … } y la estructura do { … } while (condición), se conocen como Iterativas. Se usan cuando NO se conoce con anticipación el número de veces que se ejecutará la acción.

La diferencia entre ambas es que la condición se sitúa al principio o al final de la secuencia de instrucciones. Entonces, en el primero, el bucle continúa mientras la condición es verdadera (la cual se comprueba antes de ejecutar la acción) y en el segundo, el bucle continúa hasta que la condición se hace verdadera (la condición se comprueba después de ejecutar la acción, es decir, se ejecutará al menos una vez).

La estructura Desde/Para suele utilizarse cuando se conoce con anterioridad el número de veces que se ejecutará la acción y se le conoce como Estructura Repetitiva en lugar de iterativa, para diferenciarla de las dos anteriores.

Las estructuras Mientras y Para/Desde suelen en ciertos casos, no realizar ninguna iteración en el bucle, mientras que Repetir ejecutará el bucle al menos una vez.

Observa en el flujograma, que se necesita una variable contadora (un índice), para llevar la cuenta de las veces que entramos al cuerpo del ciclo. También es importante notar que esta variable se inicializa antes de entrar al cuerpo del ciclo y dentro del cuerpo se incrementa en una cantidad constante, por lo general en uno.

Page 54: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Esta variable a la vez, nos sirve para compararla con el valor dado en la condición, cuando se cumple la condición, se sale del ciclo.

Representación pseudocodificada:

Mientras <condición>

Acciones

Fin_mientras

En Java

While (condición){

}

EJEMPLO:

Calcular la suma de los cuadrados de los primeros 100 números enteros y escribir el resultado.

Solución.

Como recordarás, resolvimos este ejercicio en la lección anterior pero utilizando la estructura Desde. Hoy lo haremos con la estructura Mientras. Que tendremos de diferente?

Page 55: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Se llama REPETIR / PARA a la estructura algorítmica que se ejecuta un número definido de veces hasta que la condición se torna verdadera:

Page 56: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Representación pseudocodificada :

Para i=1 hasta N

Acciones

Fin para

for (i=1;i<=N;i++){

}

EJEMPLO:

Calcular la suma de los cuadrados de los primeros 100 números enteros y escribir el resultado.

Solución.

Nuevamente resolveremos el ejercicio de las dos lecciones anteriores, ahora utilizando la estructura Repetir.¿Podrás decir cuál será ahora la diferencia? Las reglas para construcción de esta estructura usando Repetir, nos dicen que debemos declarar una variable contador que debe inicializarse antes del ciclo e incrementarse dentro del ciclo. A diferencia de la estructura Mientras, la condición ahora estará colocada al final del bucle para que primero ejecutamos la instrucción y luego preguntamos si la condición se cumple. Esto quiere decir, que en esta estructura el bucle se realizará por lo menos una vez. También podrás observar que la condición está al revés, porque el bucle se repite hasta que la condición se cumpla. En el bucle Mientras, la condición se evaluaba mientras era cierta.

Page 57: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Sesión 9 Ejercicios de Estructuras Repetitivas - Mientras

Un cliente del banco de crédito, quiere sacar dinero del cajero automático, se sabe que no se puede retirar más de S/. 1500. El cajero pedirá su clave, dni y el monto a retirar, para poder realizar el retiro de dinero. El saldo con el que cuenta el cliente en su cuenta, se inicializará dentro del programa. El cajero siempre pregunta Si desea realizar otra transacción o No. Si la respuesta es N, terminará la transacción, si la respuesta es si continuará haciendo retiros. Si ya no tiene saldo en su cuenta también terminará la transacción. Todo retiro disminuye el saldo de su cuenta. Se pide hacer un programa en java, que simule el trabajo de un cajero automático.

import java.io.*;

import java.util.logging.Level;import java.util.logging.Logger;

public class Cajero { // 1) definimos las entradas al programaString clave="1234";String dni="19674473";float monto_transaccion;

Page 58: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

final short monto_maximo=1500; // constante que limita el monto de retiro// 2) Definimos las salidas del programafloat saldo=3000;// 3) Procesovoid transacción(){ try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.println("Desea realizar una transacción"); char rpta = br.readLine().charAt(0); boolean conSaldo=true; while(rpta!='N'&& rpta!='n'&& conSaldo){ System.out.println("Ingrese el monto a retirar"); this.monto_transaccion=Float.parseFloat(br.readLine()); if (this.monto_transaccion>1500) System.out.println("Máximo de retiro 1500"); else if ((this.saldo-this.monto_transaccion)>=0) this.saldo-=this.monto_transaccion;//actualizamos el saldo else System.out.println("El monto de transacción debe ser menor al saldo"); if (saldo<=0) conSaldo=false; if (conSaldo){ System.out.println("Desea realizar una transacción"); rpta = br.readLine().charAt(0); } }

} catch (IOException ex) { System.out.println("Error en el ingreso de Datos"); Logger.getLogger(Cajero.class.getName()).log(Level.SEVERE, null, ex); }}}

Segunda Versión

public class Cajero1 {

private String clave="1234"; private String dni = "19674473"; private float monto_transaccion; private short monto_maximo = 1500;// constante que limita el monto de retiro

// 2) Definimos e inicializamos las salidas del programa

private float saldo = 3000; byte retirar(){ if (monto_transaccion>this.monto_maximo) return 0; if (monto_transaccion<saldo) { saldo-=monto_transaccion;//actualizamos saldo return 1; // retornamos código que indica operación exitosa } else return -1; //retornamos código de error } boolean esClave(String pClave){ if (pClave.equalsIgnoreCase(this.clave)) return true; else return false; } boolean esDni(String pDni){ if (pDni.equalsIgnoreCase(this.dni))

Page 59: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

return true; else return false; } public String getClave() { return clave; } public void setClave(String clave) { this.clave = clave; } public String getDni() { return dni; } public void setDni(String dni) { this.dni = dni; } public float getMonto_transaccion() { return monto_transaccion; } public void setMonto_transaccion(float monto_transaccion) { this.monto_transaccion = monto_transaccion; } public short getMonto_maximo() { return monto_maximo; } public void setMonto_maximo(short monto_maximo) { this.monto_maximo = monto_maximo; } public float getSaldo() { return saldo; } public void setSaldo(float saldo) { this.saldo = saldo; }

}

import java.io.*;

public class Cajero1_principal {

public static void main (String [] args){

try{

Cajero1 ocaj1 = new Cajero1();

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

System.out.print("Ingrese Clave : ");

if (ocaj1.esClave(br.readLine())){

System.out.println("Ingrese la clave");

if (ocaj1.esDni(br.readLine()))

{

System.out.println("Ingrese el monto a retirar");

ocaj1.setMonto_transaccion(Float.parseFloat(br.readLine()));

if (ocaj1.retirar()!=1) System.out.println("Error en el retiro");

}

Page 60: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

else

System.out.println("DNI incorrecto");

}

else

System.out.println("Clave Incorrecta");

} catch(IOException ex){

System.out.println("Error de entrada y salida" + ex.getMessage());

}

}

}

Desarrollar un programa en java que al ingresar n notas de un curso y el peso de cada una pueda calcular el promedio ponderado del alumno.

public class Nota {

private byte nota;

private short suma_nota;

private byte peso;

private float promedio;

private byte numero_de_notas;

Nota(){

nota=0;

suma_nota=0;

peso=0;

promedio=0;

numero_de_notas=0;

}

void calcula_suma_nota(){

suma_nota+=nota*peso;

}

void calcula_promedio(){

promedio=suma_nota/numero_de_notas;

}

void incrementa_numero_notas(){

Page 61: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

numero_de_notas++;

}

public byte getNota() {

return nota;

}

public void setNota(byte nota) {

this.nota = nota;

}

public short getSuma_nota() {

return suma_nota;

}

public void setSuma_nota(short suma_nota) {

this.suma_nota = suma_nota;

}

public byte getPeso() {

return peso;

}

public void setPeso(byte peso) {

this.peso = peso;

}

public float getPromedio() {

return promedio;

}

public void setPromedio(float promedio) {

this.promedio = promedio;

}

public byte getNumero_de_notas() {

return numero_de_notas;

}

public void setNumero_de_notas(byte numero_de_notas) {

this.numero_de_notas = numero_de_notas;

}

}

Page 62: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Desarrollar un programa para leer una cantidad indeterminada de números y cuente cuántos son positivos y cuántos negativos impares. Si se ingresa Cero el programa deberá terminar y mostrar el reporte de negativos impares y positivos.

public class Numero {

static boolean es_positivo(int pnum){

return (pnum>0);

}

static boolean es_par(int pnum){

return ((pnum%2==0?true:false));

}

}

Sesión 10 Ejercicios de Estructuras Repetitivas - Para

Hacer un programa que sume los primeros 1000 números impares

Suma=0;

Para i=1 hasta 1000 hacer

Si i es impar entonces suma+=i;

Fin para

Mostrar suma;

Class Mostrar_impares{

static long suma;

static void sumar_impares(){

Page 63: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

for (short i=1 ; i<=1000;i++)

if (i%2!=0) suma+=I;

}

}class mostrar_impares_principal{

Public static void main(String [] args){ Mostrar_impares.sumar_impares(); System.out.println(Mostrar_impares.suma);}}

Hacer un programa que ingrese los sueldos de 234 trabajadores y calcules el promedio de sueldo.

Promedio=0;

Constante max_trabajador;

Para i=1 hasta max_trabajador hacer

Leer sueldo

Total_sueldo+=sueldo; // incrementar el sueldo

Fin para

Promedio=total_sueldo/max_trabajador;

public class Trabajador {

private String nombre="";

static float total_sueldo=0.0f;

private float sueldo=0.0f;

void incrementar_total_sueldo(){ total_sueldo+=sueldo;}void setnombre(String pnombre){nombre=pnombre;}void setsueldo(float psueldo){sueldo=psueldo;}static float getsueldo(){return total_sueldo;}static float sueldo_promedio(short num){return total_sueldo/num;}}

Page 64: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

import java.io.*;public class Trabajador_Principal {

public static void main(String [] args){final short numTrabajadores=234;try {

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader (isr);

for (short i =1 ; i<= numTrabajadores ; i++){

Trabajador otrab = new Trabajador();

otrab.setnombre(br.readLine());

otrab.setsueldo(Float.parseFloat(br.readLine()));

otrab.incrementar_total_sueldo();

} System.out.println("El sueldo promedio es : " + Trabajador.sueldo_promedio(numTrabajadores));

}catch(IOException ex){

System.out.println("Error en programa principal " + ex.getMessage());

}}}

Ejercicios

Diseñar y codificar un programa que reciba como entrada 24 números reales que representen las temperaturas del exterior en un periodo de 24 horas, el programa deberá mostrar la temperatura promedio y la temperatura más alta y más baja del día.

Dados N valores de Y, diseñe y codifique un programa para calcular el resultado de la siguiente función:

3*Y + 36 Si 0 < Y <=11Y4 – 10 Si 11 < Y <=33Y15 + Y10 - 1 Si 33 < Y <=640 Si para cualquier otro valor de Y

Page 65: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Sesión 11 Arreglos Unidimensionales

Definición de ArregloUn arreglo se define como una colección finita, homogénea y ordenada de elementos.

13.4 0.3 -234.09

Los arreglos tienen la característica que pueden almacenar a N elementos del mismo tipo y además permite el acceso a cada uno de estos elementos. Así se distinguen 2 partes en los arrelgos:

Los componentes

Los índices

Las posiciones determinadas por un índice, el cual es entero, comienzan desde cero de izquierda a derecha.

El arreglo que se muestra arriba es de longitud 12, pero las posiciones van de 0 a 11.

Los componentes hacen referencia a los elementos que forman el arreglo; es decir; a los valores que se almacenan en cada una de las casillas del mismo, los componentes son las celdas que apuntan a los elementos.

Declaración de Arreglos en JAVA

Los arreglos en Java son dinámicos, pero no extensibles, lo cual significa que deben ser creados con el tamaño que tendrán hasta el final de su vida.

Un arreglo se declara de la siguiente forma:

<tipo>[] <nombre>;

O sea, para declarar, por ejemplo, un arreglo de números enteros utilizaremos la siguiente sentencia:

int[] arreglo_enteros;

Es importante notar que el arreglo aún no ha sido creado, sino meramente declarado. Para crear el arreglo (reservar su memoria e inicializarlo) deberemos recurrir al operador new:

Arreglo_enteros = new int[10];

Este comportamiento debe comprenderse de esta forma: en Java todo es un objeto, y los objetos deben ser creados mediante el operador new. El caso de los arreglos no es

0 1 11Índice

ElementoComponente

Page 66: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

diferente, el tipo de datos del arreglo (int[] en este caso) es una clase y cada una de sus instancias debe ser creada explícitamente, el tamaño puede pensarse como un parámetro al constructor de la clase.

Una de las características que hacen de Java un entorno de programación seguro, y que se relaciona con el manejo de los arreglos es que el lenguaje no permite la indexación de arreglos fuera de rango, o sea, una asignación de este tipo generará una excepción:

ArrInt[25] = 1; // por que el índice 25 no existe , no se definió de esa manera

Otra forma de declararlos es la siguiente:

UNIDIMENSIONALES:

tipo nombre_array[]=new tipo[nº];

tipo nombre_array[]={valores};

Asignación de valores a un Arreglo

La asignación de valores a un arreglo es de acuerdo al índice y considerando la longitud del mismo. Por ejemplo vamos a inicializar diferentes tipos de arreglos:

boolean [] lista_booleanos = new boolean[20]; // boolean lista_booleanos [] = new boolean[20];

for(byte i =0; i<=19; i++) lista_booleanos[i] =true;

for(byte i =0; i<lista_booleanos.length; i++) lista_booleanos[i] =true;

Para asignar un valor determinado a una posición determinada del arreglo anterior, por ejemplo asignar false al componente 17 del arreglo

Lista_booleanos[16]=false;

Int [] lista_enteros = new int [400];

for(short indice=0; indice<400; indice++) lista_enteros[indice]= 3;

for(short indice=0; indice<lista_enteros.length ; indice++) lista_enteros[indice]= 3;

lista_enteros[345] =13; // asignamos al componente 346 el valor 13

Recuperación de elementos de un arreglo

tenemos el siguiente arreglo de temperaturas en ºC debemos convertirlo a ºF:

float [] lista_temperaturas = {10, 20.3 , 11 , 15.6 , 12.34 ,19, 12, 12, 8.4, 12.6}float tcenti,tfah;tcenti=0.0f;tfah=0.0f;

Page 67: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

for(byte índice=0; índice<lista_temperaturas.length; índice++) {tcenti =lista_temperaturas[indice]; // recuperamos el elemento ubicado en indicetfah = tcenti *9 /5 +32;

lista_temperaturas[indice]=tfah; // asignamos el nuevo valor convertido a grados}

for (índice=0;índice<lista_temperaturas.legth;índice++)

System.out.println(lista_temperatura[indice]);

SESIÓN 12 ARREGLOS BIDIMENSIONALES

Page 68: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN
Page 69: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN
Page 70: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN
Page 71: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

int[][] A = {{2,3,8},{9,5,4},{7,8,3},{4,6,8}}; // 4 x 3

int[][] B = {{1,4,7},{2,5,8}}; // 3 x 2

int n = 4, m = 3, l = 2;

int[][] C = new int[n][l];

int i,j,k,suma;

for(i = 0; i < n; i++)

{

for(j = 0; j< l; j++)

{

for(k = 0, suma = 0; k < m; k++)

{

suma = suma + A[i][k] * B[k][j];

}

C[i][j]= suma;

}

}

for(i = 0; i < n; i++)

{

for(j = 0; j < l; j++)

{

Page 72: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

System.out.print(C[i][j]+ " ");

}

}

Hasta ahora hemos visto arreglos unidimensionales y bidimensionales. Sin embargo, podemos tener arreglos con las dimensiones que uno desee. Por ejemplo, podemos tener arreglos de 3, 4 o 5 dimensiones.

Por ejemplo:

char[][][] A = new char[2][3][6];

Aquí hemos creado 2 × 3 × 6 elementos de tipo char.

int[][][][] B = new int[2][2][2][2];

Aquí hemos creado 2 × 2 × 2 × 2 elementos de tipo int.

SESIÓN13 ARREGLOS DE OBJETOS

Page 73: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Suponga que tenemos la siguiente simple clase para representar cursos.

class Curso{private String sigla;private int creditos;

public Curso(String sig, int cred){sigla = sig;creditos = cred;}

public int Creditos(){ return creditos; }

public String Sigla(){ return sigla;}

}

Supongamos queremos tener una clase Alumno a la que podamos asignarle varios objetos de tipo Curso.

La clase Alumno debería contener un arreglo de objetos Cursos.

Tal como definíamos arreglos para tipos simples en JAVA podemos hacer arreglos de objetos.

Por ejemplo, para crear un arreglo llamado cursos de 5 (referencias a) cursos debemos hacer:

Curso[] cursos = new Curso[5];

Ahora podríamos a cada curso[i] asignarle un objeto de tipo curso, ya sea uno previamente creado, o uno nuevo

Curso c1 = new Curso("ing1310", 10);cursos[0] = c1;cursos[2] = c1;cursos[1] = new Curso("ing1320", 15);

Después de que creamos un arreglo de objetos y asignamos ciertos objetos a cada componente, podemos usar los métodos/atributos de cada objeto tal como un objetocualquiera.

Dado que por ejemplo cursos[1] es un objeto de la clase Curso podemos hacer

cursos[1].Creditos();

para obtener los créditos del curso con índice 1.

Page 74: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Siguiendo el ejemplo anterior, qué imprime este trozo de código?

System.out.println(cursos[2].Creditos());System.out.println(cursos[1].Creditos());System.out.println(cursos[0].Creditos());

Ahora podriamos tener una clase Alumno como la siguiente:

class Alumno{String nombre;private Curso[] cursos;private int cantidadCursos;private int maximaCantidadCursos;

public Alumno(String nom){ nombre = nom; cantidadCursos = 0; maximaCantidadCursos = 6; cursos = new Curso[maximaCantidadCursos];}....}

Donde maximaCantidadCursos indica la máxima cantidad permitida de cursos que puede tener asignado un alumno, y cantidadCursos representa la cantidad de cursos que actualmente tiene asignado el alumno.

Ejercicio: complete la clase Alumno con los siguientes métodos:

public boolean TieneCurso(Curso c) que entrega true si el alumno ya tiene asignado un curso en particular, y false en otro caso.

public void AsignaCurso(Curso c) para asignar un nuevo curso al alumno.

public int CantidadTotalCreditos() que entrega la cantidad total de créditos del alumno.

public void ImprimeListaCursos() para imprimir una lista de toda la info de los cursos asignados al alumno.

public void EliminaCurso(Curso c) para eliminar un curso particular, previamente asignado al alumno (este método es difícil porque se debe mantener la consistencia interior del objeto).

Page 75: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

ANEXO A Editar el programa en NetBeans

Creamos un nuevo proyecto, opción Archivo / Proyecto Nuevo

Seleccionamos categorías: Java y luego Aplicación Java en Proyectos

Creamos nuestro primero proyecto como Laboratorio1

Crear la clase principal y también configurar como proyecto principal, para que se ejecute por defecto el laboratorio que estamos trabajando actualmente

Page 76: MANUAL DE FUNDAMENTOS DE PROGRAMACIÓN

Puedes ver en el explorador de proyectos debe aparecer toda la estructura creada, para el proyecto Laboratorio1 y además el primer archivo .java, donde estará el programa principal.

Luego a la derecha del explorador está el editor del código fuente en donde escribiremos nuestros programas.