You are on page 1of 18

Ejercicio propuesto #8

Disear un algoritmo que determine el precio de un billete de ida y vuelta en ferrocarril, dando la distancia
a recorrer y el nmero de das en destino, sabiendo que si la estancia es superior a 7 das y la distancia
es superior a 800 km. el billete tiene una reduccin del 30%. El precio por kilmetro es de $8,5.

Analisis:
El programa que haremos nos mostrara cuando es el precio del billete que est viajando en el tren, el
cual nos muestra que por cada kilometro el billete cuesta $8.5, y si los datos que nos proporcionan, los
cuales son la distancia y los das, es superior a los 7 das y mayor de 800 km entonces se le quitara el 30
por ciento de su valor, el cual se saca de la sig formula:
El 30 por ciento se saca por medio de multiplicar por .30 y
Esto se le resta al valor inicial del billete, si es menor a los datos antes proporcionado pues no se le quita
ningn peso y queda de la misma manera.

Datos de
Datos de salida
entrada
Valor del
"Bienvenid
billete
o al
Distancia
programa
recorrida
donde
Das
podras
transcurri
calcular
dos
cuanto es
el valor de
un billete
despus
de haber
recorrido
ciertos km
y dias");

Diseo de la solucin:
Algoritmo:

Interaccin con el usuario


Introduce el valor
del billete
Introduce la
distancia
recorrida
Introduce los das
trancurridos

calculos
dist > 800 y
das > 7
precio <-- dist
* 8.5
reduc <-precio * 0.30
reduc <-- 0
precio <-precio reduc

Primero se introduces el valor del billete.


Despus introduces la distancia recorrida del ferrocarril.
Luego introduces los das transcurridos del viaje.
De ah el programa compara si la distancia es > 800 (mayor a 800 km) y das > 7(superior a los 7
dias de viaje).
Entonces el programa hace la siguiente operacin:
distancia * 8.5= la cual se guarda en precio y
precio * 0.30= la cual se guarda en la variable de reduccin.
Si despus de comparra la sentencia se determina que la distancia es menor a 800 km y menos
de 7 dias de viaje entonces, se determina que no hay reduccin en el valor del billete.
Por ltimo se imprime el valor final del billete despus del recorrido.

Pseudocodigo
INICIO
Leer dist;
Leer dias;
Leer precio;
Escribir "Bienvenido al programa donde podras calcular cuanto es el valor de un billete despus de haber
recorrido ciertos km y dias";
Escribir Introduce el valor del billete;
Leer precio
Escribir Introduce la distancia recorrida del ferrocarril;
Leer dist
Escribir Intruduce los das transcurridos del viaje;
Leer dias
Si dist > 800 y das > 7
entonces
precio <-- dist * 8.5
reduc <-- precio * 0.30
Si no
reduc <-- 0
Fin Si
precio <-- precio - reduc
escribir precio
FIN

DIAGRAMA DE FLUJO
Inicio

escribir Bienvenido al programa donde podras calcular cuanto es el valor

de un billete despus de haber recorrido ciertos km y dias";

escribir "Introduce el valor del billete"

Leer precio

escribir "Introduce la distancia recorrida "

Leer dist

escribir "Introduce los das transcurridos"

Leer dias

dist > 800 y das > 7

precio <-- dist * 8.5


reduc <-- precio * 0.30

reduc <-- 0

EscribirEl valor del


billete es:"+precioreduc

Fin

CODIFICACION
Programa en Java
import java.io.*;
public class x{
public static void main (String args[])throws IOException{
double dias, distancia, reduc, total,valor;
BufferedReader calc = new BufferedReader(new InputStreamReader(System.in));
//Se muestra una bienvenida al usuario
//las lineas punteadas son adornos para separar textos
System.out.println("------------------------------------------------------------------------------");
System.out.println("Bienvenido al programa donde podras calcular cuanto es el valor de un billete
despues de haber recorrido ciertos km y dias");

System.out.println("------------------------------------------------------------------------------");
System.out.println("\n");
System.out.println("******************************************************************************");
System.out.println("Si la estancia es superior a 7 dias y la distancia es superior a 800 km,el
tiene una reduccion del 30%, mientras que el precio por kilometro es de $8.50");

billete

System.out.println("******************************************************************************");
System.out.println("\n");
//En esta parte se tiene una interraccion con el usuario ya que se le piden los datos que se utilizaran en el
programa.
System.out.println("Introduzca los dias de viaje en el tren");
dias= Float.parseFloat(calc.readLine());
System.out.println("Introduzca la distancia recorrida en km del tren");
distancia= Float.parseFloat(calc.readLine());
//Es la siguiente estructura solo se da a conocer la condicion que debe de cumplir el programa
if (distancia>800 && dias>7){
valor=distancia*8.5;
reduc=valor*0.30;
total=valor - reduc;
//Por ultimo esto muestra el resultado o el valor del billete.
System.out.println("El valor del billete es de"+total);
}

else

reduc=0;
valor=distancia*8.5;
System.out.println("El valor del billete es de:"+valor);
}
}
}

DIAGRAMAS UML
Diagrama de casos de usos

Nombre del sistema

Valor de un billete
Da bienvenida

Da indicaciones

Diseador

Rellena datos

Usuario

Verifica condicin

Realiza
operacin
Manda resultado
a pantalla
Programa

Programa

Diagramas de actividades

Se da la bienvenida

Se da
indicaciones
Se ingresan los datos
pedidos

Se verifica la
condicin

Se hace la
operacin
correspondiente

No se hace operacin

Se da
resultado

Diagrama de componentes

Programa para calcular el valor de un billete


Computadora

Textpad

JDK

Doc. De presentacin

Biblioteca io

Diagrama de objetos

Ferrocarril
Distancia
Recorrido
Marca

Billete

Modelo

Denominaci
n
Valor
Identificador
Papel
Tamao

Diagrama de clases

Ferrocarril
+ Distancia ()
+Dias ()
#Operacin: if (distancia>800)
# Operacin (dias>7)
Programa:: Valor-billete
+Ferrocarril: Ferrocarril
+Billete: Billete

Billete
+Valor: inicial
+Valor: 0
+reduccin: 30%
# Operacin: precio=distancia*8.5 ()
# operacin: reduc=precio*0.30 ()
# Operacin: total=precio-reduc ()

Diagrama de secuencia

Si das>7 y
Distancia>80
0

Ferrocarril

Billete

Operacione
s

Diagrama de despliegue

Computadora personal

Programa_8.jar

Java
Usuario
Comprob
ar valor
de un
billete

Sistema
operativo
Windows 2007
Windows XP

Diagrama de estados

Iniciando
Se da la bienvenida

Se introducen los
datos

Condicion
Se determina la
condicion
Determinando
Se verifica si los
das son menor de
7

Si se cumplen las
condiciones se
hace la
reduccin del
30%

Determinando
Se determina si la
distancia es
mayor a 800 km

Resultado
Valor del billete

PRUEBAS Y DEPURACION
Una vez compilado el programa, este es sometido a pruebas a fin de determinar si resuelve o no el
problema planteado en forma satisfactoria. Para ello le suministramos datos de prueba, como lo hicimos
en la prueba de escritorio. El programa codificado y compilado no garantiza que funcione correctamente.
Debe depurarse (librarse de errores de lgica o de ejecucin) realizando corridas de prueba continuas
con datos y respuestas conocidas como lo hicimos en la prueba de escritorio, verificando todas las
posibles alternativas del programa y sus respuestas y haciendo el mayor nmero de variantes con sus
combinaciones, a fin de determinar si resuelve o no el problema planteado en forma satisfactoria.
Las pruebas que se aplican al programa son de diversa ndole y generalmente dependen del tipo de
problema que se est resolviendo. Comnmente se inicia la prueba de un programa introduciendo datos
vlidos, invlidos e incongruentes y observando como reacciona en cada ocasin.
Los resultados obtenidos en las pruebas pueden ser cualquiera de los siguientes:
a. La lgica del programa esta bien, pero hay errores sencillos, los cuales los corregimos eliminando
o modificando algunas instrucciones o incluyendo nuevas.
b. Hay errores ocasionados por fallas en la lgica, lo que nos obliga a regresar a las fases de Diseo
y Codificacin para revisin y modificacin del diagrama.
c. Hay errores muy graves y lo ms aconsejable es que regresemos a la fase 2 para analizar
nuevamente el problema, y repetir todo el proceso.
d. No hay errores y los resultados son los esperados. En este caso guardamos el programa
permanentemente en un medio de almacenamiento.
Puede ser necesario en la mayora de los casos retroceder a fases previas de desarrollo, revisar el
algoritmo otra vez en caso de errores de anlisis y/o lgica (que son los ms difciles de detectar, a
diferencia de los de sintaxis y semntica), realizar ajustes al cdigo y una serie de nuevas ejecuciones de
prueba para que el programa funcione correctamente. Si no existen errores en el programa, puede
entenderse la depuracin como una etapa de refinamiento en la que se ajustan detalles para optimizar el
desempeo del programa.
La prueba que yo hice fue de escritorio, ya que le dije a mi sobrina de quince aos y a mis
hermanas que se basaran de mi algoritmo para ver si ellas podran entenderle a los pasos que
puse y sobre todo si les sala el mismo resultado, por lo cual las pruebas salieron satisfactorias, ya
que a ellas le sali el mismo resultado siguiendo los pasos detallados.

DOCUMENTACION
Es la fase ms ignorada por la mayora de los programadores noveles, por razones de tiempo, costos o
simple pereza. Pero no documentar los programas es un mal hbito en programacin y un gran error.
Ser muy difcil a los usuarios entender un programa si no cuentan con un manual de operaciones (el
Manual de Usuario). Tambin para los programadores que necesiten darle mantenimiento o hacerle
modificaciones si no existe ninguna documentacin acerca de sus fases de desarrollo. Incluso ser difcil

de entender para el mismo autor, algn tiempo despus.


La documentacin es la gua o comunicacin escrita en sus variadas formas, ya sea en enunciados,
procedimientos, dibujos o diagramas y sirve para ayudar a comprender o usar un programa o para
facilitar futuras modificaciones (mantenimiento). Recoge todos los elementos encontrados y material
creado en las diferentes fases del desarrollo, adems de las normas de instalacin o las
recomendaciones para la ejecucin del programa.
La documentacin se divide en tres partes:

Documentacin Interna

Documentacin Externa

Manual del Usuario

Documentacin Interna: Son los comentarios que se aaden al cdigo fuente para clasificarlo.
Documentacin Externa: Es todo el material creado y empleado en las diferentes fases del desarrollo
del programa. Incluye:

Descripcin del Problema

Narrativo con la descripcin de la solucin

Autor(s)

Algoritmo (diagrama de flujo y/o pseudocdigo)

Cdigo Fuente (programa)

Relacin de los elementos utilizados en el programa, cada uno con su respectiva funcin

Limitaciones del programa


La documentacin interna trata de poner comentarios para que el usuario o cualquier persona que
quiera ver el cdigo o utilizarlo lo pueda comprender de una manera fcil y practica por lo que se
ponen comentarios fciles de entender y para aclarar las dudas de las personas que lo utilizan,
estos ya se encuentran en el pseudocdigo.
La documentacin externa se mostrara a continuacin:

Descripcin del problema: El programa servir para calcular cual ser el valor de un billete
despus de pedir una cierta distancia en km y los das transcurridos de viaje.
Narrativo del problema: El programa que haremos nos mostrara cuando es el precio del billete que
est viajando en el tren, el cual nos muestra que por cada kilometro el billete cuesta $8.5, y si los
datos que nos proporcionan, los cuales son la distancia y los das, es superior a los 7 das y mayor
de 800 km entonces se le quitara el 30 por ciento de su valor, el cual se saca de la sig formula: El
30 por ciento se saca por medio de multiplicar por .30 y esto se le resta al valor inicial del billete, si
es menor a los datos antes proporcionado pues no se le quita ningn peso y queda de la misma
manera.
Relacin de elementos:

ase Condicional.java

Primeramente se declara la Clase atravs del vocablo class.

Es definido un mtodo llamado analisis el cual retorna una respuesta en base a las
operaciones del condicional if/else; una caracterstica de este mtodo es que utiliza el
calificativo static, esto se debe a que es llamado directamente del mtodo principal main el
cual tambin es static; debido a que el vocablo static es empleado en mtodos que no
requieren instancias, si se realiza un llamado hacia determinado mtodo de uno static ste
tambin deber ser static, esto garantiza un posible error al invocar mtodos estaticos.

Dentro del mtodo principal (main) es invocado el mtodo analisis en tres ocasiones,
imprimiendo los respectivos resultados a pantalla.

Estructura de seleccin:
if (condicin) sentencia;

La condicin es una expresin booleana. La sentencia se ejecuta solamente si la expresin booleana es verdadera.
Retomando el problema de la divisin, incorporamos una estructura de seleccin para realizar la operacin libre de
ceros.
public class DivisionSegura {
public static void main(String args[]){
int x = 12;
int y = 0;
int z = 0;
if( y !=0 ) z = x / y;
System.out.println("El resultado es : " + z);
}
}

En el programa, la variable x tiene el valor del dividendo, la y el divisor y la z el cociente. La condicin es una
expresin que arroja un valor booleano. En este caso se utiliza un operador relacional que verifica si y es distinto de
0. Si esta condicin se cumple realiza la divisin. En caso contrario se saltea la divisin y solo imprime el valor de z,
que hemos inicializado convenientemente antes de la operacin.
Qu ocurre si la condicin no se cumple? En este caso nada. Podemos agregar una serie de instrucciones que se
ejecutarn solo si la condicin no se cumple. Para esto tendremos que agregar la sentencia else. La estructura de
seleccin quedar as:
if (condicin) sentencia 1;
else sentencia 2;

Si la condicin es verdadera se ejecuta la sentencia 1 en caso contrario se ejecuta la sentencia 2. Ambas sentencias
nunca se ejecutarn al mismo tiempo, son excluyentes.
Ahora ampliemos el programa para mostrar una advertencia en el caso que se encuentre cara a cara con un cero
siniestro.
public class DivisionSegura {

public static void main(String args[]){


int x = 12;
int y = 0;
int z = 0;
if( y !=0 ) z = x / y;
else System.out.println("Atencin! se pretende dividir por 0");
System.out.println("El resultado es : " + z);
}
}

El programa nos qued mas completo. Con la clusula else incluimos otra alternativa de accin. Pero algo anda
suelto. Este programa siempre muestra un resultado, se cumpla o no la condicin. El mensaje por pantalla no est
incluido en la estructura de seleccin. Tendremos que colocarlo dentro del sector de sentencias que se ejecutarn
cuando la condicin sea verdadera. Para agrupar las sentencias se utilizan las llaves ( { } ) Indicarn el inicio y el fin
de un bloque de sentencias.
Probemos como queda con un bloque
public class DivisionSegura {
public static void main(String args[]){
int x = 12;
int y = 2;
int z = 0;
if( y !=0 ) {
z = x / y;
System.out.println("El resultado es : " + z);
} else
{
System.out.println("Atencin! se pretende dividir por 0");
}
}
}

Las buenas prcticas en defensa de un cdigo mantenible han dictaminado que utilicemos las llaves en todo
momento, an en el caso que utilicemos una sola sentencia.
if (condicin) {
sentencia;
} else {
sentencia;
}

Lamentablemente no siempre nos encontraremos con condiciones tan sencillas. Muchas veces tendremos que recurrir
a proposiciones compuestas para formar una condicin. Para ello podemos recurrir a operadores relacionales o
lgicos. Recuerden que siempre debe dar como resultado un valor booleano.
Parece complicado, pero nos demuestra muchas cosas. En primer lugar observamos que se pueden anidar las
sentencias if-else. Cada resultado de una condicin puede caer en una nueva comprobacin para formar una
estructura compleja de seleccin.
Tambin vemos que hay cierta relacin entre conectores lgicos y la estructura.
Conjuncin
if (condicin1 && condicin2){
sentecia1;
} else {
sentencia2;
}

if ( condicin1 ) {
if ( condicin2 ) {
sentencia1;
} else {
sentencia2;
}
} else {

sentencia2;
}

Disyuncin
if ( condicin1 || condicin2 ) {
sentencia1;
} else {
sentencia2;
}

if ( condicin1 ){
sentencia1;
} else {
if ( condicin2 ) {
sentencia1;
} else {
sentencia2;
}
}

Negacin
if ( ! condicin1) {
sentencia1;
} else {
sentencia2;
}

if ( condicin1) {
sentencia2;
} else {
sentencia1;
}

PALABRAS RESERVADAS
Import
Explicacin:
Para importar clases de un paquete se usa el comando import. Se puede importar una clase individual, o
bien, se puede importar las clases declaradas pblicas de un paquete completo, utilizando un arterisco (*)
para reemplazar los nombres de clase individuales.

Java.io
Explicacin:
Paquete de Entrada/Salida. Clases que definen distintos flujos de datos.
Public class
Explicacin:
Mtodo que es utilizado para definir la clase que se utilizara.
Integer.parseInt(...)
Explicacin:
Es un mtodo que Devuelve un valor float especificada por el parmetro de cadena . Convierte de string a
entero.

public static void main(String[] args) {


Explicacin:
Esto declara nuestra primer rutina. Las funciones y rutinas en Java siempre corresponde a una clase, y
se denominan mtodos. El cdigo de arriba define el mtodo main (principal). Al mtodo anterior se lo

declara de tipo void, para indicar que no es una funcin sino un procedimiento y se lo define como static
(esttico). Este calificador indica que no es un mtodo que vaya a actuar sobre un objeto de la clase, sino
que ser ejecutado sin necesidad de crear ningn objeto: es un mtodo de clase (esto queda ms claro
cuando se estudian clases y objetos en Java). El mtodo main recibe un arreglo de Strings como nico
argumento. Este es un vector de cadenas de caracteres representa que los parmetros opcionales que le
podemos pasar por la lnea de comando.
throws IOException
Explicacin:
El mtodo main necesita una clusula throws IOException porque de otra forma se producir un error en
la compilacin del programa. Esto se debe a que Java requiere que los programas capturen las
excepciones. Las excepciones son condiciones de borde que ocurren rara vez pero que los programas
deben considerar para evitar errores indeseados durante la ejecucin.
Int
Explicacin:
La variable int almacena un valor entero como 1, 2, 0, -1, etc. Esto significa que al asignar una variable
entera a otra variable entera, se copia el valor de la primera en el espacio que ocupa la segunda variable.
Las variables de tipo referencia a objetos en cambio almacenan direcciones y no valores directamente.
Una referencia a un objeto es la direccin de un rea en memoria destinada a representar ese objeto.
BufferedReader calc = new BufferedReader (new InputStreamReader(System.in));
Explicacin:
Un flujo importante en este tipo de problemas es InputStream, que es una clase abstracta para el flujo de
entradas de bytes sin estructura. Es una superclase de todas las dems clases de flujo de entrada y
proporciona una interfaz bsica. El sistema Java incluye un InputStream bsico para entradas por
teclado: System.in.
Pero necesitamos algo ms sofisticado que un sistema de lectura de bytes sin estructura. Para ello
vamos a utilizar flujos "filtro" que sirven de intermediarios: manejan un flujo de entrada de bytes y lo
convierten en flujos estructurados (modo caracter). Un ejemplo de filtro es InputStreamReader, que sirve
de puente desde un stream de bytes a un stream de caracteres:
InputStreamReader isr = new InputStreamReader( System.in );
Con un InputStreamReader tenemos el mtodo read() para leeer caracteres. Pero todava no es
suficiente. Necesitamos otros "puentes" que conviertan el flujo en modo carcter a uno en modo buffer
(una especie de cadena de caracteres). Para ello contamos con clases como BufferedReader que recibe
en su constructor el flujo de caracteres y maneja el flujo en la forma de buffer, con un mtodo como
readLine() que lee los caracteres hasta encontrar un final de lnea. Un ejemplo de estas
transformaciones (de flujo de byte a flujo de carcter y de ste a buffer) se encuentra en el manejo de
teclado:
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));

System.in
Explicacin:
Para leer del teclado es necesario emplear System.in. Este objeto pertenece a la clase InputStream,
esto significa que para leer tenemos que emplear sus mtodos, el ms bsico es read, que permite leer
un carcter.
New
Explicacin:
Es un constructor que se utiliza para crear nuevas instancias de objetos.
System.out.println("_______");
Explicacin:
Esto mostrar un texto en pantalla. El texto System.out hace referencia a un objeto: el out del paquete
System. Este es un objeto que ya est disponible para nuestro uso, es decir Java nos brinda un serie de
clases y objetos ya definidas. Aqu nos encontramos con el mtodo println ("___"), que toma los
parmetros y los imprime en pantalla.
Integer
Integer es una clase empleada para representar al tipo bsico int, y para transformar de String a int, pero
puede lanzar excepciones.

MANTENIMIENTO
Es posible que el programa deba revisarse cada cierto tiempo para ajustes. Estos cambios pueden ser
por la dinmica del problema, por la naturaleza del cdigo, las exigencias del tiempo o las modernas
necesidades que surgen frecuentemente, por lo que se considera que ningn programa es esttico. Los
programas siempre son susceptibles de mejoras y de mantenimiento. Por tales razones, es comn que
se tenga que retornar a una de las fases iniciales de desarrollo para corregir o aadir funcionalidades,
repitiendo el proceso en cada fase subsiguiente para introducir los cambios pertinentes y lograr que el
programa funcione correctamente con los cambios realizados. Se enfatiza el hecho de que cualquier
actualizacin o cambio en el programa deber reflejarse en su documentacin para que sta mantenga
su vigencia.

El mantenimiento del programa se ira dando respecto a las necesidades que tenga el usuario, las
cuales pueden cambiar respecto al 30% de reduccin, el cul puede incrementar, respecto a la
necesidad del usuario por lo que solo se tendr que modificar el porcentaje correspondiente, as
como el valor del billete en cada kilometro ya que los datos que se piden son variables que no
tienen que cambiar ya que esas las da el usuario.

You might also like