Está en la página 1de 141

PROGRAMACIN BSICA EN C Y JAVA

Jos Luis Lpez Goytia


(elaboracin: 2010; ltima revisin: 2011)

TEMA

PG.
2

Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Aspectos metodolgicos 1. Criterios de calidad del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Pruebas de caja negra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Ciclo de desarrollo de sistemas (mtodo de cascada) . . . . . . . . . . . . . . . . . . . . . 4. Concepto de compilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 9 12 20

Programando en lenguaje C 5. Un primer acercamiento al desarrollo de software . . . . . . . . . . . . . . . . . . . . . . . . . 6. El paradigma de la programacin estructurada . . . . . . . . . . . . . . . . . . . . . . . . . . 7. Los primeros elementos para codificar en lenguaje C . . . . . . . . . . . . . . . . . . . . . . 8. Condicionales en lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9. Ciclos en lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10. Arreglos en lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11. Subrutinas en lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12. Apuntadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 40 51 64 71 82 86 91

Programando en Java 13. Enfoque de la programacin orientada a objetos . . . . . . . . . . . . . . . . . . . 14. Cmo funciona Java? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15. Creacin de una clase sencilla en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16. El uso de mltiples clases en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17. Arreglos en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18. Herencia y polimorfismo en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19. Composicin en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografa . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 101 107 115 121 125 137 141

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

1 / 141

INTRODUCCIN
Este material est dirigido para estudiantes que comienzan su carrera en informtica o disciplinas afines. Parte del supuesto que no han tomado ningn curso de programacin y en un futuro se harn profesionales del rea. Por ello se fomentan en primera instancia los aspectos conceptuales, que normalmente se dejan de lado en materiales de este tipo. En la segunda parte se desarrollan los aspectos bsicos de lenguaje C, los cuales tienen un enlace natural con los fundamentos de Java, que se abordan en la tercera parte. Todos los programas fueron probados con herramientas reconocidas y gratuitas: el compilador Dev C++ para el caso de C y el entorno NetBeans para el caso de Java. Bajo esta estructura se pretende dar un camino natural a fin de abordar los lenguajes C y Java bajo un enfoque metodolgico claro. En el caso de la UPIICSA, abarcara la parte central de las materias de de Lenguajes de Programacin I y Lenguajes de Programacin III de las carreras de Ingeniera en Informtica y Licenciatura en Ciencias de la Informtica. Se espera que para prximas actualizaciones esas materias se conserven con otros nombres. Finalmente, hay que advertir los alcances del presente trabajo para no crear falsas expectativas. No tiene el propsito de abarcar todas las instrucciones de C y Java; nicamente dan sus fundamentos de una manera disciplinada y metodolgica, por lo cual deben ser complementados con otros libros o lo que para los estudiantes es ms natural- con bsquedas en la Web.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

2 / 141

CRITERIOS DE CALIDAD DEL SOFTWARE


CONTENIDO
Correccin Eficiencia Funcionalidad Ejercicios y casos reales Robustez Portabilidad Oportunidad Bibliografa Compatibilidad Facilidad de uso Otras cualidades

Un software debe reunir ciertas caractersticas para que su funcionamiento sea adecuado. Existen factores externos visibles para el usuario final. Es importante recalcar que usuario final no se refiere nicamente a quien opera directamente el sistema; abarca a las personas que compran el software o adquieren el desarrollo. Otras cualidades, como la legibilidad, son perceptibles nicamente para quienes leen el cdigo fuente. Esos factores son internos. El autor Bertrand Meyer proporciona un listado de las cualidades externas que debe reunir el software. Se citan a continuacin, con algn comentario que juzguemos pertinente.
1

CORRECCION

(Indice)

Correccin es la capacidad de los productos software para realizar con exactitud sus tareas [y sin errores], tal y como se definen en las especificaciones. La correccin es la cualidad principal. Si un sistema no hace lo que supone que debe hacer, poco importan el resto de las consideraciones que hagamos sobre l si es rpido, si tiene una bonita interfaz de usuario Para llegar a la correccin se requiere como primer paso especificar los requisitos del sistema en una forma precisa, lo cual no es sencillo. Este paso requiere de diversas tcnicas de Ingeniera de software. En esta parte el usuario final est directamente involucrado. Para ampliar informacin: consulte los temas de Ciclo de Desarrollo de Sistemas en general, y haga hincapi en las etapas de anlisis y pruebas. En una segunda etapa, se trata de construir el software que cumpla dichas especificaciones. Lo cual corresponde ms a temas de lenguajes de programacin y bases de datos. Son rubros en donde prcticamente no interviene el usuario final. Hay que hacer hincapi que se construye un software bajo el supuesto de que los niveles inferiores son correctos. Por ejemplo: quien est elaborando un programa sobre desviacin estndar parte del hecho de que las funciones de raz cuadrada realizadas por el compilador son correctas. Ciertamente, nunca hay una garanta absoluta en ello, pero es la nica forma realista de trabajar.

ROBUSTEZ

(Indice)

Robustez es la capacidad de los sistemas de software de reaccionar apropiadamente ante condiciones excepcionales.

Meyer, Bertrand; Construccin de software Orientado a Objetos; Prentice-Hall; Segunda edicin; Madrid, 1999; pgs. 3-13.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

3 / 141

La robustez complementa la correccin. La correccin tiene que ver con el comportamiento de un sistema en los casos previstos por su especificacin: la robustez caracteriza lo que sucede fuera de tal especificacin. Es decir, lo que sucedera en casos excepcionales, entendiendo por excepcional un caso no previsto por la especificacin y por normal algo planificado durante el diseo del software. Una forma prctica de abordar la robustez es garantizar que el sistema no termine abruptamente su ejecucin en todos aqullos casos anmalos que de antemano se sabe que pudieran llegar a darse. Por ejemplo: que se intente grabar cuando no hay espacio suficiente el disco; que se intente copiar a una unidad de disco inexistente; que se dae una tabla en la base de datos; que se intente realizar una divisin entre cero; que el saldo neto de una quincena de un trabajador resultara en negativo al aplicar todos los descuentos autorizados, etc.

COMPATIBILIDAD
Compatibilidad es la facilidad de combinar unos elementos de software con otros. Al menos hay dos enfoques para garantizar la compatibilidad:

(Indice)

Una prueba directa en un ambiente de pruebas con el software que va a convivir simultneamente. Si el software apenas se va a desarrollar se puede hacer una prueba preliminar con algunas rutinas del nuevo sistema. Un anlisis de los diferentes estndares y protocolos manejados por los sistemas para observar que existe compatibilidad (formatos de archivo, estructuras de datos, interfaces de usuarios, etc).

Debe destacarse que muchos problemas de compatibilidad se resuelven cambiando diversos parmetros de configuracin en uno o varios de los sistemas que estn ejecutndose simultneamente. Tambin puede darse el caso de que no puede solucionarse el problema de compatibilidad, pero no se requiere que ambos sistemas trabajen al mismo tiempo. Dejar esta situacin as hasta que el software sea sustituido al paso del tiempo es una solucin prctica en muchsimos casos.

EFICIENCIA

(Indice)

Eficiencia es la capacidad de un sistema software para exigir la menor cantidad posible de recursos hardware, tales como tiempo del procesador, espacio ocupado de memoria interna y externa o ancho de banda utilizado en los dispositivos de comunicacin. Con respecto a la eficiencia se puede caer en dos actitudes opuestas (y ambas equivocadas): restar su importancia, porque cada da son ms rpidas las computadoras; o tener una obsesin por las cuestiones del rendimiento, y por ello tratar de optimizar al mximo. Una de las formas de mejorar la eficiencia es incrementar la ventaja de los buenos algoritmos sobre los malos. Por ejemplo: supongamos que para sacar un reporte se leen uno por uno medio milln de registros de un archivo histrico. Otro desarrollador hace una pequea rutina que combina las condiciones dadas por el usuario para traer en promedio- unos 2000 registros. En este caso, el tiempo de procesamiento disminuye mucho ms por usar un buen algoritmo que por emplear una computadora con mayores recursos. Para tener elementos sobre la eficiencia de un algoritmo, consulte informacin sobre funcin de trabajo. Ahora bien, optimizar un proceso muchas veces implica un mayor esfuerzo de programacin y a veces impacta negativamente a la claridad y a la reutilizacin. La mayora de los procesos no se ejecutan cotidianamente y por eso motivo o por otros motivos igualmente vlidos- no requieren ese esfuerzo

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

4 / 141

extra. Por el contrario, hay algunas rutinas que por su uso frecuente ameritan ser optimizadas al mximo. El desarrollador debe hacer un balance entre la eficiencia y el tiempo de desarrollo.

PORTABILIDAD

(Indice)

Portabilidad (transportabilidad) es la facilidad de transferir los productos software a diferentes entornos hardware y software. La portabilidad tiene que ver con las variaciones no slo del hardware fsico sino ms generalmente de la mquina hardware-software, la que realmente programamos y que incluye el sistema operativo, el sistema de ventanas (si se emplea) y otras herramientas fundamentales. En este rubro debe tomarse en cuenta desde un principio si el software que se ofrece se ejecutar para una computadora personal, red LAN, INTERNET o cualquier otro tipo de plataforma.

FACILIDAD DE USO

(Indice)

Facilidad de uso es la facilidad con la cual personas con diferentes formaciones y aptitudes pueden aprender a usar los productos software y aplicarlos a la resolucin de problemas. Tambin cubre la facilidad de instalacin, de operacin y de supervisin. Uno de los problemas de la facilidad de uso es como proporcionar explicaciones y guas detalladas a los usuarios novatos sin fastidiar a los usuarios expertos que quieren ir directos al grano. Debe construirse un buen diseo, de acuerdo a una estructura clara y pensada en trminos del usuario final. Debe considerarse que un usuario final puede ser alguien diestro en el manejo del sistema y en el rea que aborda el software, pero tambin alguien que toma el software por primera vez y no tenga prcticamente ningn conocimiento del tema. Por ejemplo: puede ser un experto en nmina que lleva manejando este software tres aos, o un capturista que lo comenz a utilizar hace un par de horas. Un sistema sencillo e intuitivo no est peleado con un sistema rpido de manejar y con opciones avanzadas. Implica tener ayuda documental clara, completa y concisa, tanto en lnea como remota.

FUNCIONALIDAD
Funcionalidad es el conjunto de posibilidades que proporciona un sistema.

(Indice)

Para lanzar la versin de un producto se debe cubrir un rea lo suficientemente amplia del conjunto completo de caractersticas para atraer a los consumidores previstos en lugar de alejarlos. Seguramente se dejarn algunas caractersticas de lado, pero las que se decida incluir deben cubrir todas las caractersticas de calidad. Hay que rechazar el pasar a considerar nuevas propiedades hasta que no se est satisfecho con las que se tiene. Para solucionar el problema de mantener la calidad y avanzar lo ms posible en ofrecer ms facilidades, debe trabajarse una y otra vez sobre la consistencia del producto global, tratando de que todo encaje en un molde general. Un buen producto de software est basado en un nmero pequeo de potentes ideas: incluso si tiene muchas propiedades especializadas, stas deberan explicarse como consecuencia de los conceptos bsico. El gran plan debe estar visible y todo debera ocupar su sitio dentro de l.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

5 / 141

OPORTUNIDAD

(Indice)

Oportunidad es la capacidad de un sistema de software de ser lanzado cuando los usuarios lo desean, o antes. La oportunidad es una de las mayores frustraciones de nuestra industria. Un gran producto software que aparece demasiado tarde puede no alcanzar su objetivo. Esto es cierto en otras industrias tambin, pero pocas evolucionan tan rpidamente como el software la oportunidad es todava, para grandes [y pequeos] proyectos, un fenmeno poco comn.

OTRAS CUALIDADES

(Indice)

Conviene destacar otras cualidades que tambin afectan a los sistemas de software y a la gente que compra estos sistemas o encarga su desarrollo. Verificabilidad es la facilidad para preparar procedimientos de aceptacin, especialmente datos de prueba y procedimientos para detectar fallos y localizar errores durante las fases de validacin y operacin. Integridad es la capacidad de los sistemas software para proteger sus diversos componentes (programas, datos, etc.) contra modificaciones y accesos no autorizados. Esta capacidad se basa entre otras formas- en polticas de claves de acceso y algoritmos de encriptamiento. Reparabilidad es la capacidad para facilitar la reparacin de los defectos. Economa, junto con la oportunidad, es la capacidad que un sistema tiene de completarse con el presupuesto asignado o por debajo del mismo. Razonablemente costoso. En sentido estricto, no se refiere al software en s, sino a su comercializacin, pero no hay que perderlo de vista. El software se debe ofrecer a un precio que sea atractivo para compradores potenciales en razn de la problemtica que soluciona y de las ofertas que realiza la competencia a la cual se enfrenta, tanto en su adquisicin como en su costo de mantenimiento. Garanta de soporte y actualizacin. El proveedor del software debe garantizar el soporte oportuno durante todo el tiempo de vida del software, as como sus adecuaciones por cambios tecnolgicos, de ley o por nuevos requerimientos de la empresa. Muchas de estas actualizaciones se pueden hacer va INTERNET. Atractivo. El software, adems de ser funcional y fcil de usar, debe ser visualmente atractivo, pues de otra forma perdera a muchos usuarios potenciales. Facilidad de mantenimiento. Que el software realizado pueda adaptarse con relativa facilidad a nuevos requerimientos. Modular. Que el software sea modular, lo cual facilita el desarrollo, mantenimiento y reutilizacin de cdigo.

EJERCICIO: IDENTIFICACIN DE LAS CARACTERSTICAS EN CASOS REALES D(Indice)


Elija dos software que haya utilizado. Uno que le haya sido agradable de emplear y otro que le haya causado diversos problemas. Evalu para cada uno las caractersticas de software. Utilice una escala del 0 al 10.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

6 / 141

El programa para recibir las informativas de sueldos y salarios de la Secretara de Hacienda y Crdito Pblico del ao 2002 fue publicado una semana antes de la fecha lmite en que los contribuyentes deben entregar la informacin. Al instalarlo, no corri en Windows Millenium ni en monitores VGA y si la mquina ya tena la versin del ao pasado, no actualizaba la ayuda. Qu caractersticas de un software no cumple? Se hizo un sistema en SQL Server que funciona correctamente. Sin embargo, corre con demasiada lentitud y cuando se intent pasar a Access, se presentaron problemas con el cdigo. Qu caractersticas de software no cumpli? El Instituto Mexicano del Seguro social (IMSS) dio a conocer su sistema, el cual cubra lo necesario para el IMSS, pero descuidaba varios requerimientos tiles para la empresa. El IMSS aclar que no era un error; as se haba considerado desde el inicio. Sin embargo, varias empresas se dieron cuenta que podan abrir las tablas del sistema por fuera. Qu caractersticas de software no cumpli?

EJERCICIO: IDENTIFICACIN DE CARACTERSTICAS A NIVEL CDIGO


Un usuario acord con usted realizar un programa que realizara la siguiente pantalla:

(Indice)

Este programa obtiene la divisin dos nmeros sin utilizar el operador de divisin Teclee el primer nmero: 13 Teclee el segundo nmero: 5 1) 13 - 5 = 8 2) 8 - 5 = 3 El resultado es: 2 Oprima cualquier tecla para continuar... El programa, ya elaborado, tiene el siguiente cdigo: /* Autor: Jos Luis Lpez Goytia; noviembre/2005; Compilador: Dev-C++ 4.9.8.0 */ #include <conio.h> #include <string.h> main() { int cantidad, divisor, sobrante, resultado; printf("Este programa obtiene la divisin dos nmeros sin utilizar el operador de divisin\n\n"); printf("Teclee el primer nmero: "); scanf("%d", &cantidad); printf("Teclee el segundo nmero: "); scanf("%d", &divisor); if (divisor == 0) printf("No se puede realizar una divisin entre cero.\n\n"); else { // se realiza a travs de restas sucesivas sobrante = cantidad; resultado = 0; while (sobrante >= divisor) { resultado++; sobrante -= divisor;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

7 / 141

printf("%d ) %d - %d = %d\n", resultado, sobrante divisor, sobrante); } printf("El resultado es: %d\n", resultado); } printf("Gracias."); printf("\n\nOprima cualquier tecla para continuar..."); getch(); }

+ divisor,

El cdigo en general es correcto. Sin embargo, no tiene robustez. Modifique el cdigo de tal modo que el programa no truene, aunque se le indiquen datos inconsistentes (por ejemplo: letras en lugar de nmeros o una divisin entre cero). Qu porcentaje de lneas se tuvieron que modificar?

BIBLIOGRAFIA

(Indice)

Meyer, Bertrand; Construccin de software Orientado a Objetos; Prentice-Hall; Segunda edicin; Madrid, 1999; 1198 pginas.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

8 / 141

PRUEBAS DE CAJA NEGRA


CONTENIDO
Concepto de caja negra Qu probar? Lmite de las pruebas de caja negra Ejercicios sugeridos

CONCEPTO DE CAJA NEGRA

(Indice)

El concepto de caja negra representa el punto de vista del usuario. Dicho de otra forma: se hacen partiendo del supuesto que no se tiene acceso al cdigo. Slo se puede operar el sistema con las opciones que estn disponibles para el usuario De preferencia, estas pruebas deben disearse inmediatamente despus de definir los requerimientos. El enfoque es: si al terminar la programacin este programa arroja estos resultados, daremos por bueno el producto. El proceso debiera ser entonces como sigue: REQUERIMIENTOS >> DISEO DE PRUEBAS >> CODIFICACIN >> APLICAR PRUEBAS Pasar las pruebas correctamente se convierte en uno de los criterios indispensables para la aceptacin del producto. El programa no estar terminado hasta que arroje los resultados esperados. Por tanto, sera un grave error ponerlo en produccin antes. No es una exageracin; es sentido comn. No le parece sensato probar el agua de frutas que acaba de hacer antes de llevarla a sus invitados? Es increble el nmero de casos en que esto se deja de lado. Hay que hacer hincapi en que las pruebas son parte del proceso de programacin. Se deben ir realizando pruebas por mdulos conforme el plan de trabajo establecido y no dejarlas al final de todo el proyecto. Cuando se prueba hasta el final se corre el riesgo de que se hayan cometido errores de tal magnitud que es ms fcil rehacer el sistema que corregirlo. (Indice)

QU PROBAR?

Como el programador pudiera equivocarse en cada proceso, lo ideal sera realizar una prueba para cada caso distinto (distinto desde el punto de vista del usuario). No tiene caso realizar 100 pruebas de casos tpicos. Bastara con un par de casos tpicos y una prueba para cada uno de los casos atpicos esperados. A manera de ejemplo, suponga que va a probar un programa que obtiene el mayor de dos nmeros. El siguiente lote de pruebas estara mal diseado: PRUEBA 1: si introducimos los valores 10 y 12 el resultado ser 12. PRUEBA 2: si introducimos los valores 3 y 5 el resultado ser 5. PRUEBA 3: si introducimos los valores 1 y 3 el resultado ser 3. puesto que conceptualmente todos son iguales: en todos los casos el segundo es mayor. Lo que sera conveniente es tener una prueba por cada caso distinto.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

9 / 141

PRUEBA 1: si introducimos los valores 10 y 12 el resultado ser 12. PRUEBA 2: si introducimos los valores 12 y 10 el resultado ser 12. PRUEBA 3: si introducimos los valores 5 y 5 el resultado ser 5. Qu probar? El diseo de las pruebas se volver ms sencillo si recordamos las caractersticas que debe reunir un buen software.

Para probar la correccin: Pruebas por cada caso de naturaleza distinta: se ejecutar el programa con cada caso que se considere distinto, incluyendo situaciones tpicas y atpicas. En algunos casos con casos simulados y en otros casos con datos reales. Pruebas de configuracin: se revisar la configuracin que est cargada en el sistema. Por ejemplo: directorio de sucursales, catlogo de productos, catlogo de puestos, etc. Pruebas integrales: se prueba el sistema funcionando de manera ntegra. La forma ms prctica es simulando un usuario del sistema (alumno, empleado, cliente, etc.) y realizando con l todas operaciones tpicas y atpicas a las que suele acceder, para verificar que el proceso en su conjunto es correcto. Es muy usual combinar estas pruebas con las pruebas en paralelo. Las pruebas en paralelo consisten en ejecutar el sistema a la par con el sistema anterior para comparar los resultados. En ocasiones, el nuevo sistema se ejecuta algunos das despus -para evitar sobrecargas de trabajo- pero partiendo de la misma informacin que aliment al viejo sistema.

Para probar la robustez: Se realizan los errores tpicos para verificar que el sistema los maneja adecuadamente: dar tipos de datos incorrectos (por ejemplo, una fecha errnea o una letra cuando se espera un nmero); hacer funcionar el sistema cuando algn dispositivo est desconectado (por ejemplo: la impresora); alimentar datos intentado producir una divisin entre cero; etc.

Para probar la compatibilidad: Hacer correr el sistema junto con los otros programas que se ejecutarn simultneamente.

Para probar la eficiencia: Se debe correr el sistema con la carga mxima de datos que va a soportar. Este proceso se conoce tambin como pruebas de carga mxima. Esta es otra de las pruebas que casi siempre se deja de lado. Los problemas se detectan, justamente, cuando el sistema se somete a su esfuerzo mximo. Las pruebas de eficiencia se notan solamente con un gran nmero de datos.

Para probar la portabilidad: Se debe correr el sistema en los diferentes entornos en que se supone debe correr. Por ejemplo: en monitores de diferente resolucin.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

10 / 141

Para verificar la facilidad de uso: En este caso, se piensa en verificaciones ms que en pruebas. El lenguaje debe ser dirigido al usuario; las pantallas deben entenderse por s solas; la operacin debe ser intuitiva y fcil; no debe haber faltas de ortografa, y las pantallas deben ajustarse a los estndares de color, manejo y tipo de letras establecidos.

Para verificar la funcionalidad: Al finalizar la etapa de requerimientos se establecieron todas las funciones que debera cubrir el sistema a realizar. El sistema terminado debe cubrir toda esa funcionalidad. Una de las herramientas ms sencillas que incluso parece burda- es realizar un check list . Sin embargo, a veces ni siquiera se realiza esta tarea.

Para verificar la oportunidad: Se debe verificar si la entrega es oportuna conforme al plan de trabajo establecido y, en caso contrario, tomar las medidas que se consideren convenientes.

Para verificar la integridad: Revisin de los usuarios y la configuracin de sus respectivos permisos. Pruebas de que stos funcionen correctamente. Pruebas de respaldos. (Indice)

LMITES DE LAS PRUEBAS DE CAJA NEGRA

Conviene recordar que ningn lote de pruebas detecta todos los errores. Como criterio general se considera que el nmero de fallas detectadas es proporcional al nmero oculta de ellas. Por otra parte, las pruebas de caja negra son desde el punto de vista usuario. No revisa estndares tcnicos ni la estructura interna del sistema, porque ambos aspectos no son visibles desde el exterior. Por ello este enfoque debe combinarse con otro tipo de revisiones para lograr un control de calidad completo del desarrollo de software. (Indice)

EJERCICIOS SUGERIDOS

Se recomienda hacer una serie de programas algunos que se ejecutan correctamente y otros con errores- para que el alumno establezca lotes de pruebas a fin de detectar cuales programas no corren bien y en que casos.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

11 / 141

CICLO DE DESARROLLO DE SISTEMAS (MTODO DE CASCADA)


CONTENIDO
La necesidad de un desarrollo metodolgico Las etapas del mtodo de cascada
Sntomas de una mala aplicacin del ciclo de desarrollo de sistemas Ejemplos reales

Bibliografa

LA NECESIDAD DE UN DESARROLLO METODOLGICO

(Indice)

Quiz la primer forma en que se desarrollo un programa es la de tener una idea general de los que se hace y programarlo. Cuando al fin hace lo que deseamos y despus de unas pruebas muy generalesse presenta al profesor, quien detecta errores y nos pide modificaciones. A la desvelada de sbado y domingo se aade la del mircoles para, al fin, presentarlo correctamente. Ahora cambiemos un poco los sustantivos y observemos el resultado. Quiz la primer forma en que se desarroll un sistema es la de tener una idea muy general de lo que hace y desarrollarlo. Cuando al fin se hace lo que deseamos y despus de unas pruebas muy generales- se presenta a un director de la empresa, quien detecta errores y nos pide modificaciones. A los seis meses de trabajo se aaden otros tres para, al fin presentarlo correctamente. Definitivamente, trabajar sin aspectos metodolgicos adecuados difcilmente puede llevar a buen trmino un desarrollo de software. Solamente una labor realizada con calidad en cada uno de sus pasos y con base en la metodologa diseada correctamente y seguida en forma disciplinada- puede dar un sistema confiable y eficiente. En caso contrario, las quejas de los usuarios sern frecuentes y ser conveniente tener siempre nuestro curriculum vitae bien preparado (por si es necesario buscar otro trabajo). Algunas de las frases ms escuchadas en el rea de desarrollo de software: ni les creas; nunca entregan las cosas a tiempo (usuarios refirindose al rea de informtica); ni saben lo que quieren ni te dan informacin completa (informtica refirindose a usuarios); dej el sistema echo un desmadre (desarrolladores refirindose a los desarrolladores que trabajaron antes en el sistema); dice una cosa y luego se echa para atrs (todos refirindose a todos). Con excepcin de la ltima frase, las dems pueden tender a desaparecer cambiando la cultura bajo la cual trabaja el rea de informtica y adoptando mtodos de organizacin y desarrollo adecuados. La ltima solo podr solucionarse parcialmente, pues nace de la falta de orden en el desarrollo, pero tambin de deshonestidades y golpes bajos. Lamentablemente, aunque la honestidad es uno de los sentimientos que por lo menos en teora- alaba ms nuestra sociedad, tambin se permite y en ocasiones se alaba que se obtengan resultados con base en falsas promesas.
Un mtodo que sigue funcionando es el mtodo de cascada. En ella el desarrollo se divide en etapas que deben darse en forma secuencial. En el caso de modificaciones se seguir este mtodo para los cambios a realizar. A continuacin se ofrece un cuadro que sintetiza las etapas del mtodo de cascada. Conviene hacer hincapi en que la documentacin no es una etapa, se hace a la par que avanza el proyecto. Por otro parte, se incluye la etapa de autorizacin del proyecto, que prcticamente ningn autor considera como parte del mtodo de cascada. Sin embargo, la realidad cotidiana nos empuja a considerarla como la base de las actividades siguientes.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

12 / 141

LAS ETAPAS DEL METODO DE CASCADA

(Indice)

Etapa

Objetivo y descripcin de la etapa

Documentacin entregada contrato

% del tiempo de desarrollo 10

Autorizacin del proyecto

Que se autorice el proyecto: alcance, tiempos y recursos. Rubros a cubrir: evaluacin alternativas; estimacin de tiempos; estimacin de costobeneficio; establecer el contenido general; definicin de plataformas en que debe ejecutarse. Tcnicas utilizadas: entrevistas con el directivo; consultas a especialistas; herramientas de planeacin (grficas de GANTT, ruta crtica), etc.

Anlisis

Definir los requerimientos a detalle del nuevo sistema Rubros cubrir: resultados que arrojar el nuevo sistema (incluyendo reportes); entradas que alimentarn al nuevo sistema (incluyendo pantallas); documentacin de clculos; glosario de trminos y estndares de presentacin; readecuacin de procesos administrativos. Tcnicas utilizadas: anlisis del sistema actual; revisin de reglamentacin vigente; entrevistas con el usuario operativo; diagrama de flujo de datos, etc.

especificacin de requerimientos

20

Diseo

Arquitectura general del producto Rubros a cubrir: diseo modular; normalizacin de bases de datos; script de creacin de bases de datos; diccionario de campos; estndares tcnicos; algoritmos principales. Tcnicas utilizadas: pruebas de portabilidad; diseo modular (Top-Down); reglas de normalizacin de base de datos; complejidad computacional; explotacin de las tablas del sistema de la base de datos, herramientas automatizadas de creacin de scripts (Vg. Erwin); etc.

manual tcnico

15

Codificacin y pruebas por mdulo

Construccin del especificaciones.

producto

conforme

cdigo fuente comentado

25

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

13 / 141

Rubros a cubrir: diseo lote de pruebas; descripcin de rutinas genricas; estndares de programacin; cdigo fuente comentado y probado. Tcnicas utilizadas: diseo de lote de pruebas; seudocdigo; diagramas de sintaxis; enfoque de caja blanca y caja negra; lenguajes de programacin; etc. discos de instalacin y manuales. 12

Pruebas integrales

Prueba integral del producto Rubros a cubrir: diseo de lote de pruebas integral; manual de usuario; manual de instalacin (incluye discos de instalacin). Tcnicas utilizadas: carga de datos reales; creacin de discos de instalacin; pruebas en paralelo; pruebas de carga mximo; prueba integral; revisin de la configuracin del nuevo sistema; pruebas de control de accesos y de seguridad en general.

Carga y puesta a punto

Puesta en funcionamiento del sistema Rubros a cubrir: capacitacin; cartas de liberacin. Tcnicas utilizadas: carga de datos reales; formas de instalacin masiva; formas de soporte cercano a nuevos usuarios.

adecuaciones por correccin de errores o nuevos requerimientos.

18

Mantenimiento

Mantener al sistema en un funcionamiento correcto Rubros a cubrir: modificaciones de funcionamiento; adecuacin de datos histricos. Tcnicas utilizadas: contratos de mantenimiento; establecimiento de estndares.

actualizacin del sistema con su respectivo soporte documental

De 2 a 4 veces del desarrollo original

SINTOMAS DE UNA MALA APLICACIN DEL CICLO DE DESARROLLO DE SISTEMAS


(Indice)

La siguiente lista es una lista de algunos sntomas tpicos cuando no se sigue el ciclo de desarrollo de sistemas. Elija un desarrollo de sistemas que haya tenido problemas y seale los sntomas con los que coincida. Los sntomas estn ubicados en la etapa en la cual se generaron, aunque hayan sido descubiertos posteriormente.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

14 / 141

AUTORIZACION ( ) No se tiene un contrato o plan de trabajo por escrito al arrancar el proyecto. Se haban realizado varias plticas para promover el proyecto y se descubri que la ( ) persona no tena un inters real o no tena una influencia significativa en la decisin ( ) Ya se tenan avances significativos del proyecto y no autorizaron el proyecto. ( ) No se hizo una estimacin de tiempos con bases slidas. ( ) No se hizo una estimacin de costos con bases slidas. ( ) El contrato no indica los costos y alcances del mantenimiento. ( ) No se consider la "curva de aprendizaje" en los tiempos y costos. ( ) No se consideraron la compatibilidad entre versiones. ANALISIS ( ) No hay documentos que expliquen los procesos de clculo. Se presentan ambigedades o puntos encontrados acerca del significado de varios ( ) trminos en etapas posteriores. ( ) En etapas posteriores se agregan muchos reportes que no estaban considerados. ( ) En etapas posteriores se agregan mdulos completos que no estaban considerados. ( ) Cuando se le presenta el proyecto al usuario dice que no era lo que l haba pensado. Los reportes y consultas no se pueden limitar por los parmetros ms usuales que ( ) necesita el usuario (fechas, sucursales, etc.) ( ) Cada programador le da al sistema una presentacin diferente (colores, mens, etc.) ( ) El dueo o el directivo no respeta las decisiones del lder de proyecto. DISEO ( ) No existe un diagrama general del sistema. Al hacer la prueba integral se presentan problemas porque hay campos o rutinas que ( ) cada programador manej con nombres distintos cuando deberan tener un solo nombre. ( ) La consulta de los nombres y tipos de campos es muy lenta. Hay varias partes del cdigo que hacen prcticamente lo mismo y se programaron varias ( ) veces. ( ) Se dificulta encontrar los nombres de programas o tablas porque no existe un estndar. ( ) Los programas corren bien pero son demasiado lentos. ( ) El sistema permite la entrada a datos inconsistentes. ( ) El sistema en general no valida datos tpicos (por ejemplo: fechas). El sistema no permite modificar un dato que iba a cambiar a mediano plazo. Por ejemplo: ( ) el monto del salario mnimo general. CODIFICACION Y PRUEBAS POR MODULO ( ) Cuando se va a probar un mdulo no se tiene prediseado un lote de pruebas. ( ) Los programas no estn comentados. ( ) No se aplicaron estndares de presentacin ni estndares tcnicos. ( ) Los programas "truenan" o arrojan resultados incorrectos. ( ) Un programa en particular no valida datos tpicos (por ejemplo: fechas). ( ) Faltas de ortografa. PRUEBAS INTEGRALES ( ) No se hizo ninguna prueba integral. ( ) Las pruebas integrales no se hicieron con datos reales. ( ) No se hizo el manual de instalacin ( ) No se prob el procedimiento de instalacin. ( ) No se hizo el manual de usuario. La carga de datos se hizo manualmente, lo cual implica volver a repetirla manualmente en ( ) el futuro. ( ) No se prob el procedimiento de instalacin.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

15 / 141

MANTENIMIENTO ( ) No se actualiz la documentacin. ( ) No se hicieron rutinas para conservar la coherencia de datos histricos. ( ) No hay ningn soporte documental. ( ) Se "traspapel" la documentacin tcnica y/o de usuario del sistema. ( ) Se "traspapelaron" los discos de instalacin. ( ) No existen respaldos probados.

EJEMPLO REALES

(Indice)

ENVO DE CORRESPONDENCIA Una empresa deseaba tener un listado de compradores potenciales, el cual captur por delegacin poltica. Su listado era similar al siguiente:

Delegacin: Fecha de contacto Nombre Direccin

Cuando llevaban 5,500 registros decidieron enviarles correspondencia, el problema es que para enviar correspondencia se necesita siguiente formato.

Calle y Nmero:

Colonia: Cdigo Postal Delegacin

Y la direccin se haba capturado en un solo campo. Que implicaba ello? a) Crear nuevos campos en la base de datos. b) Modificar pantallas de captura y reportes. c) Recapturar la direccin de las 5,500 personas.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

16 / 141

El error desde el punto de vista prctico fue no separar los campos. Desde el punto de vista conceptual fue mucho mayor: no se siguieron las etapas del ciclo de desarrollo de sistemas, por ello nunca se previeron necesidades futuras inmediatas. Una falla en el anlisis provocara cambios posteriores en todas las dems etapas, con sus repercusiones anmicas y econmicas. En este ejemplo, la captura se hizo por segunda vez y tal vez eso consumi 2 meses. Qu hubiera sucedido si un error de tal magnitud hubiera surgido en un sistema de $10 ,000 USD? Es exageracin? Tal vez, pero se dio el caso de una empresa mediana de la ciudad de Mxico que compr un software a inicios de 1998 para darse cuenta 2 3 meses despus que no estaba preparado para el ao 2000 y, peor an, que nunca se lo haban preguntado al proveedor ni le haban pedido por escrito ese requisito. Definitivamente los errores cuestan.

SISTEMA DE CONTROL ESCOLAR En un sistema de control de asignaturas se observ un cdigo parecido al siguiente. if materia = "ADMI" then nombre_materia = "administracin" if materia = "PROG" then nombre_materia = "programacin" El listado segua con 30 materias ms. Este tipo de cdigo trae problemas futuros. Es posible que en los prximos 10 aos cambie la clave y/o el nombre de una asignatura? La probabilidad es casi del 100%. Entonces estos datos deben estar en un catlogo que el usuario pueda modificar. De lo contrario ser necesario alterar el cdigo fuente, probar, actualizar la documentacin y poner al da todas las instalaciones en las que se encuentre el programa. El ahorro de unas 2 horas nos causar a corto o mediano plazo tener que invertir al menos un par de das, sobre todo si existen decenas o centenares de instalaciones.

SISTEMA DE LA SECRETARA DE HACIENDA Y CRDITO PBLICO La Secretara de Hacienda y Crdito Pblico public va INTERNET EN 2001 el software para capturar los datos de la Declaracin de Sueldos y Salarios. El programa fue publicado con una semana de anticipacin; el dato que se capturaba en sueldo normal apareca en el reporte como aguinaldo; las pantallas aparecan cortadas en monitores tipo VGA (en aquel entonces una cuarta parte de las PCs no poda poner una resolucin mayor) y los ejemplos en el manual no mostraban datos reales. Una situacin as nicamente puede explicarse entre otros muchos motivos- porque nunca se sigui una metodologa para el desarrollo de este producto. Existieron errores en todas las etapas del desarrollo. (Indice)

EJERCICIOS A NIVEL CNCEPTUAL:

Un lder de proyecto indic capturar el nombre completo, direccin y telfono de clientes potenciales en un archivo tipo texto; cada campo con una longitud fija. Ejemplos: Jos Luis Huerta Jimnez Iris #38, col. Obrera 84-27 Juan Hernndez Lpez T 48, unidad FOVISSSTE Miramontes 23-56 55-6856-91-

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

17 / 141

El programador realiz el sistema conforme a los ejemplos sealados. Un mes despus - cuando se quiso enviar correspondencia por correo- se detect que debi capturarse la calle y nmero en un rengln, y en un otro rengln la colonia. Fue necesario reprogramar y corregir 5000 registros. En qu etapa o etapas del desarrollo se gener el error? Argumente.

EJERCICIOS A NIVEL CDIGO:


Un usuario acord con usted realizar un programa que realizara la siguiente pantalla:

(Indice)

Este programa obtiene la divisin dos nmeros sin utilizar el operador de divisin Teclee el primer nmero: 13 Teclee el segundo nmero: 5 1) 13 - 5 = 8 2) 8 - 5 = 3 El resultado es: 2 Oprima cualquier tecla para continuar... El programa, ya elaborado, tiene el siguiente cdigo: /* Autor: Jos Luis Lpez Goytia; noviembre/2005; Compilador: Dev-C++ 4.9.8.0 */ #include <conio.h> #include <string.h> main() { int cantidad, divisor, sobrante, resultado; printf("Este programa obtiene la divisin dos nmeros sin utilizar el operador de divisin\n\n"); printf("Teclee el primer nmero: "); scanf("%d", &cantidad); printf("Teclee el segundo nmero: "); scanf("%d", &divisor); if (divisor == 0) printf("No se puede realizar una divisin entre cero.\n\n"); else { // se realiza a travs de restas sucesivas sobrante = cantidad; resultado = 0; while (sobrante >= divisor) { resultado++; sobrante -= divisor; printf("%d ) %d - %d = %d\n", resultado, sobrante + divisor, divisor, sobrante); } printf("El resultado es: %d\n", resultado); } printf("Gracias."); printf("\n\nOprima cualquier tecla para continuar..."); getch(); } Suponga que se requiere un cambio a la pantalla como sigue:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

18 / 141

Este programa obtiene la divisin dos nmeros sin utilizar el operador de divisin Teclee el primer nmero: 13 Teclee el segundo nmero: 5 El resultado es: 2 Demostracin del resultado 1) 13 - 5 = 8 2) 8 - 5 = 3 Oprima cualquier tecla pra continuar... Qu porcentaje de lneas tiene que cambiar?

BIBLIOGRAFA

(Indice)

El tema del mtodo de cascada se encuentra prcticamente en cualquier libro sobre Ingeniera de Software. En muchos de ellos se refieren a ciclo de vida de un sistema. Recomendamos particularmente: McConnell, Steve; Desarrollo y Gestin de Proyectos Informticos; McGraw-Hill; Espaa, 1998. 691 pginas.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

19 / 141

CONCEPTO DE COMPILADOR
CONTENIDO
El concepto bsico de compilador El problema de las versiones Libreras en C, C++ y Java Libreras de acceso dinmico La mquina virtual de Java Los compiladores en ambiente WEB La compilacin en lenguaje de acceso a base de datos Bibliografa

EL CONCEPTO BASICO DE COMPILADOR


Tradicionalmente, el compilador se juzga como un programa que traduce de un cdigo fuente (realizado en un lenguaje de programacin) a un cdigo mquina (instrucciones en cdigo binario, entendibles por la computadora).

cdigo fuente

cdigo mquina

El compilador intenta traducir todo el programa a cdigo mquina. Si alguna lnea est mal, indica el error y no realiza traduccin alguna. El intrprete, traduce y ejecuta lnea por lnea, lo cual puede resultar una ventaja (al menos hizo algo) o una gran desventaja (lo peor que puede pasar es dejarlo a medias). C, C++ y Java trabajan con base en compiladores. Los intrpretes se encuentran en lenguajes como Basic y el lenguaje para manejo de base de datos (SQL). Este ltimo se ejecuta instruccin por instruccin en todos sus comandos bsicos.

EL PROBLEMA DE LAS VERSIONES


El lenguaje mquina depende de la arquitectura de la computadora. Dicho de otro modo: un cdigo mquina producido para computadoras compatibles con IBM PC (que corren en ambiente Windows) no se podr ejecutar con computadoras compatibles con Apple, mquinas PALM o celulares. Determinadas instrucciones tambin varan segn el modelo de la computadora. Sobre todo, de la versin del procesador. Programas que se ejecutan correctamente en una computadora con procesador Intel 486 (de inicios de los 90s) difcilmente corrern en un Pentium IV. Si se quiere ver de otro modo: es poco probable que un programa que corra bien sobre Windows 3.11 trabaje todava en Windows XP. Entre ms tiempo se alejen se aumenta el riesgo de la falta de compatibilidad. Este no es un fenmeno exclusivo de la computacin ni de inicios del siglo XXI. Sucede en general en todas las ramas. Por citar un ejemplo: los rollos de una cmara fotogrfica con sistema Advantix no funcionan en otro tipo de cmaras fotogrficas. Claro est, se nota menos en las ramas cuyos cambios tecnolgicos no son tan acelerados.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

20 / 141

Sucede algo similar del lado del cdigo fuente. En primer lugar, como el compilador traduce de un determinado lenguaje de programacin a un determinado tipo de mquina, deber existir un compilador distinto para cada lenguaje y tipo de mquina. Por ejemplo: habr uno compilador especfico para lenguaje C que convierta a cdigo mquina para computadores personales compatibles con IBM PC (Windows); otro de Pascal para computadores personales compatibles con IBM PC; otro ms de lenguaje C para computadoras personales marca Apple, etc. Por otro lado, puede haber varios fabricantes, cuyos compiladores presentan ligeras diferencias entre s. Verbigracia: un programa escrito en lenguaje C puede no marcar ningn error con el compilador Dev C++ y marcar errores si se compila con Borland C. A pesar de que ambos estn intentando traducir de lenguaje C a cdigo mquina para computadoras compatibles con una IBM PC (Windows). Si una instruccin fue incorporada en una versin no ser reconocida por una versin anterior. Incluso, pueden darse diferencias entre compiladores de la misma versin pero idiomas diferentes. No debemos asustarnos tanto. En trminos generales las diferencias entre compiladores son mnimas. Tip: si va a comenzar a programar use el compilador y la versin que le recomiende su instructor y no la cambie hasta que haya ejecutado en l al menos media docena de programas. Tip: la gran mayora de las diferencias puede preverse. Si usted considera que un programa debe ejecutarse correctamente en dos o ms ambientes distintos deber atacar el problema de dos formas: a) usar slo instrucciones que estn en la definicin general del lenguaje. De esta manera evitar emplear sentencias que slo obedezca determinado fabricante; B) probar las instrucciones que va a utilizar centenares de veces en ambas herramientas. As garantiza escribir de tal forma que trabaje bien en todos los ambientes. Si toma en cuenta estos dos aspectos, las correcciones que tenga que hacer al cambiar de herramienta se reducirn en ms del 90%.

LIBRERIAS EN C, C++ Y JAVA


Desde hace unos 30 aos existe la posibilidad de codificar y compilar subprogramas que realizan una labor especfica y que despus pueden ser llamados por otro programa. Estos subprogramas no pueden ejecutarse por s solos porque no son un programa completo, pero ya fueron traducidos por el compilador. Al cdigo producido de esta manera se le conoce como cdigo objeto. En algunas ocasiones, se publica el cdigo fuente de estas subrutinas. Estos subprogramas o subrutinas se agrupan, segn su tarea, en libreras. De esta forma, existe una librera con las subrutinas matemticas, otra para manejo de textos, etc. Al comenzar el programa principal se indican las libreras que se van a utilizar (en lenguaje C se hace con la instruccin #include; para Java se emplea import). Los programas en C, C++ y Java hacen uso intensivo de las libreras. Conviene conocer las posibilidades que se tienen. Su desconocimiento nos puede llevar a reinventar el hilo negro. Normalmente las libreras se incorporan al tiempo de compilar y quedan incluidas en el cdigo mquina.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

21 / 141

cdigo fuente

cdigo mquina

libreras

LIBRERIAS DE ACCESO DINAMICO


Los programas realizados para ambientes visuales entre los que destaca Visual Basic consumen una gran cantidad de recursos. Si se creara un ejecutable con todas las libreras necesarias el cdigo mquina producido sera de 10 20 megabytes. Para ahorrar espacio, se crearon las libreras de acceso dinmico (DLLs), las cuales se mandan llamar en tiempo de ejecucin. De esta forma, el ejecutable disminuye en ms de un 90% su tamao. La situacin qued como sigue:

cdigo fuente

cdigo mquina

libreras de acceso dinmico (DLL)

Las libreras de acceso dinmico solucionaron un problema a costa de causar otro. Imagine que existe una librera ejemplo.dll hecha en el ao 2003, y otra ejemplo.dll para el ao 2004, ambas ubicadas en el mismo directorio. Lgicamente, no pueden estar ambas simultneamente. Si un programa se realiz con la ejemplo.dll del 2003 y otro con ejemplo.dll del 2004 se corre el riesgo de que corra uno u otro. Esta situacin se lleg a dar entre las versiones 4.5 y 5.0 de Visual Basic. Aunque se ha ido solucionando, todava persisten algunos problemas de incompatibilidad. Tips: 1) Si desinstala una aplicacin y hay un mensaje de que las libreras pudieran estn compartidas, nunca las elimine, pues podra ocasionar problemas con otra aplicacin. Al dejarla tal vez desperdicie espacio en disco duro, pero todos sus programas seguirn trabajando. 2) Cuando existan dos versiones deje la ms reciente. En teora las libreras de acceso dinmico deben satisfacer los requerimientos de las versiones anteriores. Lgicamente, si se desea instalar un programa con libreras de acceso dinmico en otra mquina, se tiene que copiar el ejecutable ms todas las libreras que ocupa. Esto se realiza a travs de las opciones que producen los discos de instalacin. Estas opciones crean automticamente el programa de instalacin, que incluye todas las libreras necesarias. Si despus de instalarlo falta alguna intente copiarla manualmente de la otra mquina. Tal vez resulte. Lamentablemente, no existe ninguna relacin fcil de localizar indicando la lista de libreras que ocupa cada componente de programacin visual.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

22 / 141

LA MAQUINA VIRTUAL DE JAVA


Java se basa en libreras al igual que el lenguaje C. Sin embargo, incorpora un concepto nuevo: la mquina virtual. El compilador no produce directamente el cdigo ejecutable. En su lugar deja un cdigo de bytes que en un segundo paso- un intrprete transformar al cdigo mquina de la computadora. Por eso se dice que la compilacin es hacia una mquina virtual. En otras palabras, compilamos para un intrprete que an no se conoce.

cdigo fuente

cdigo de bytes

ejecucin

libreras

Esta forma de trabajo tiene grandes ventajas. Por un lado, ni el programa fuente ni el cdigo compilado dependen de la computadora en especfico. Por otro, es mucho ms difcil vulnerar la seguridad en Java. Pero tiene costos: se requiere un intrprete que realice el paso final y hace que los programas sean menos eficiente por ese ltimo paso de traduccin. La idea no era nueva y haba fracasado en intentos anteriores. Sin embargo, la situacin tcnica de la computacin hacia finales de los 90s y la aplicacin masiva de INTERNET hicieron que Java tuviera una difusin que ningn otro lenguaje haba logrado.

LOS COMPILADORES EN AMBIENTE WEB


HTML no es un lenguaje de programacin como tal. En su caso la traduccin la realiza un intrprete que se encuentra en el navegador de la computadora cliente, es decir, en la computadora que est visualizando la pgina WEB. Presenta una peculiaridad: si hay una instruccin errnea, hace caso omiso de la parte equivocada y ejecuta la parte de la instruccin que s se escribi de manera correcta. Por lo regular, las pginas no mandan un error. Pero los errores pueden ocasionar que el despliegue no sea como se haba pensado. El navegador tambin interpreta cdigo JavaScript. Este lenguaje tiene muchas instrucciones comunes con C y Java, pero conceptualmente no tiene que ver directamente con Java. No tiene un compilador como tal ni emplea una mquina virtual. Lo interpreta el propio navegador. Si existe un error, detiene la ejecucin de la parte correspondiente a Java Script y despliega un mensaje de error (aunque puede configurarse el navegador para que no lo despliegue). Existen lenguajes para controlar a las sentencias de acceso a base de datos. Los ms comunes son Active Server Pages (ASP) y PHP. ASP de tecnologa Microsoft- es un Basic adaptado para ambiente WEB. En ambos casos se manejan mediante un intrprete situado en el servidor WEB, es decir, en la mquina que tiene alojado el sitio WEB. Para el caso de ASP el intrprete es Internet Information Server; para el caso de PHP, el intrprete es Apache.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

23 / 141

LA COMPILACION EN LENGUAJE DE ACCESO A BASE DE DATOS


El lenguaje para acceder bases de datos relacionales es SQL (Standard Query Lenguaje). Estas sentencias son traducidas por un intrprete contenido en el Sistema Manejador de Bases de Datos (SMBD). Los SMBD tambin permiten la creacin de programas (disparadores, transacciones, procedimientos almacenados). En este caso, cada SMBD tiene su propio compilador.

BIBLIOGRAFIA
No conocemos ninguna bibliografa que abarque las diferentes formas prcticas en que trabaja un compilador. Se tendra que buscar en libros de programacin estructurada, programacin visual, programacin para INTERNET y programacin para base de datos. Para quien desee ahondar sobre el tema de compiladores se recomienda: Aho, Alfred V.; SEIT, Ravi; Ullman, Jeffrey D. Compiladores. Principios, tcnicas y herramientas; Addison Wesley Longman; Mxico, 1998; 820 pginas.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

24 / 141

Captulo 5 UN PRIMER ACERCAMIENTO AL DESARROLLO DE SOFTWARE


5.1. Los criterios de calidad del software
Desde hace dcadas se habla de la crisis del software, referencia obligada en prcticamente todos los cursos de Ingeniera de Software y tema de mltiples chascarrillos con cierta dosis de verdad. Un estudio realizado en 2001 seala que slo el 28% de proyectos de software son exitosos, contra 23% 2 cancelados y 49% excedidos en tiempo o presupuesto o con caractersticas faltantes ; investigaciones ms recientes muestran que la situacin no ha cambiado; entre 40% y 50% del software nunca es empleado por el usuario final. En las aulas se gesta parte del problema y en ellas est en gran medida la solucin. El estudiante y el docente deben estar concientes que el propsito no es hacer un programa conforme el maestro lo dice para obtener la calificacin mxima o al menos para no reprobar; la finalidad principal es aprender a crear un software de calidad, conforme a criterios tcnicos especficos. La siguiente lista fue tomada y 3 enriquecida de un libro clsico realizado por Bertrand Meyer . Cualidades que rodean al software: coherencia entre el software y los objetivos de la empresa, costo de compra-venta razonable y garanta de soporte y actualizacin. Correccin: es la capacidad de los productos software para realizar con exactitud sus tareas [y sin errores], tal y como se definen en las especificaciones. Funcionalidad: es el conjunto de posibilidades que proporciona un sistema. Facilidad de uso: es la facilidad con la cual personas con diferentes formaciones y aptitudes pueden aprender a usar los productos software y aplicarlos a la resolucin de problemas. Tambin cubre la facilidad de instalacin, de operacin y de supervisin. Atractivo: el software, adems de ser correcto y fcil de usar, debe ser visualmente atractivo, pues de esta manera contribuir a que el usuario se sienta motivado a usarlo, independientemente de que lo haga por iniciativa propia o por necesidad laboral. Robustez: es la capacidad de los sistemas de software de reaccionar apropiadamente ante condiciones excepcionales. Eficiencia: es la capacidad de un sistema software para exigir la menor cantidad posible de recursos hardware, tales como tiempo del procesador, espacio ocupado de memoria interna y externa o ancho de banda utilizado en los dispositivos de comunicacin. Compatibilidad: es la facilidad de combinar unos elementos de software con otros. Portabilidad: es la facilidad de transferir los productos software a diferentes entornos hardware y software. Seguridad: es la capacidad de los sistemas software para proteger sus diversos componentes (programas, datos, etc.) contra modificaciones y accesos no autorizados.
Estudio de Johnson et. al. en 2001, citado en Schach, Stephen. Ingeniera de Software Clsica y Orientada a Objetos. Mc Graw Hill, 6. edicin. Mxico, 2006. pg. 6. 3 Meyer, Bertrand. Construccin de software Orientado a Objetos. Prentice-Hall. Segunda edicin. Madrid, 1999. pgs. 3-13.
2

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

25 / 141

Oportunidad: es la capacidad de un sistema de software de ser lanzado cuando los usuarios lo desean, o antes. Acorde al presupuesto: junto con la oportunidad, es la capacidad que un sistema tiene de completarse con el presupuesto asignado o por debajo del mismo. Facilidad de mantenimiento: que el software realizado pueda adaptarse con relativa facilidad a nuevos requerimientos. Desde un primer curso se debe avanzar en el logro de esas caractersticas, expresando de manera explcita los puntos que faltaran para llegar a la calidad deseada. Los siguientes pueden ser criterios generales de un curso introductorio de programacin: Es conveniente fomentar una gama amplia de ejercicios de diversa ndole e incorporar todos aqullos propuestos por los estudiantes, aunque adaptados al avance del curso. Los ejercicios deben ser acordes al avance temtico y deben poder resolverse con los conceptos explicados hasta ese momento. Aunque puede darse el caso que los estudiantes tengan que investigar instrucciones por su cuenta. Los requerimientos deben darse por escrito y resolver cualquier ambigedad antes de pasar al diseo del algoritmo. Una persona externa o el propio docente harn el rol del usuario, evitando que el estudiante defina los requerimientos. Desde luego, pueden aceptarse mejoras propuesta por el alumno. Los programas deben ser realizados conforme a las especificaciones, considerando los casos especiales que puedan darse, entregados a tiempo y debidamente documentados. Las pantallas deben ser claras para el usuario y sin faltas de ortografa. Ante varias posibilidades de sintaxis, se preferir aqulla aceptada por la mayora de los compiladores o bien por reglas estndares. La aplicacin de subrutinas debe hacerse atendiendo a criterios tcnicos de modularidad y facilidad de mantenimiento (que se comentarn en el captulo correspondiente).

5.2. El mtodo de cascada aplicado a un curso introductorio de programacin


Quiz la primer forma en que se desarroll un programa es la de tener una idea general de lo que se hace y programarlo. Cuando al fin hace lo que deseamos y despus de unas pruebas muy generales- se presenta al profesor, quien detecta errores y nos pide modificaciones. A la desvelada de sbado y domingo se aade la del mircoles para, al fin, presentarlo correctamente (ver figura 5-1).

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

26 / 141

Figura 5-1. . La programacin sin aplicar metodologas de desarrollo.


Ahora cambiemos un poco los sustantivos y observemos el resultado. Quiz la primer forma en que se desarroll un sistema es la de tener una idea muy general de lo que hace y desarrollarlo. Cuando al fin se hace lo que deseamos y despus de unas pruebas muy generales- se presenta a un directivo de la empresa, quien detecta errores y nos pide modificaciones. A los seis meses de trabajo se aaden otros tres para, al fin presentarlo correctamente. Definitivamente, trabajar sin aspectos metodolgicos adecuados difcilmente puede llevar a buen trmino un desarrollo de software. Solamente una labor realizada con calidad en cada uno de sus pasos y con base en una metodologa acorde al proyecto y seguida en forma disciplinada- puede dar un sistema confiable y correcto. En caso contrario, las quejas de los usuarios sern frecuentes y ser conveniente tener siempre nuestro curriculum vitae bien preparado, por si es necesario buscar otro trabajo. Algunas de las frases ms escuchadas en el rea de desarrollo de software: ni les creas; nunca entregan las cosas a tiempo (usuarios refirindose al rea de informtica); ni saben lo que quieren ni te dan informacin completa (informtica refirindose a usuarios); dej el sistema echo un desmadre (desarrolladores refirindose a los desarrolladores que trabajaron antes en el sistema); dice una cosa y luego se echa para atrs (todos refirindose a todos). Una metodologa de trabajo trata de garantizar un software de calidad. Lo que sirva para ese propsito debe fomentarse. Si algn paso o documentacin no contribuye a esa meta, debe adecuarse o eliminarse totalmente. La metodologa vigente ms conocida es el mtodo de cascada, la cual consta de varios pasos que deben ejecutarse en forma secuencial (ver cuadro 5-1). Tomamos las etapas de uno de los mejores libros 4 sobre gestin de proyectos informticos que hemos conocido . El mtodo de cascada ha recibido cuestionamientos serios. Entre los ms significativos: la falta de una etapa previa al anlisis en la cual se autoriza el proyecto y que el software se pruebe hasta el final. Sin embargo, sigue siendo vigente para proyectos de corta duracin y cuyos requerimientos no cambian a lo largo del mismo. De hecho, todas las metodologas actuales lo retoman en gran medida, hacindole modificaciones prcticas y conceptuales.

McConnell, Steve. Desarrollo y Gestin de Proyectos Informticos. McGraw-Hill. Espaa, 1998. Pg. 158-159.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

27 / 141

En nuestro caso, ser nuestra base, aunque agregaremos algunos elementos de otras metodologas, 5 como el diseo guiado por pruebas de Programacin Extrema . Para metodologas de mayor alcance pueden consultarse Proceso Unificado, Scrum o Programacin Extrema.

Cuadro 5-1. Las etapas del mtodo de cascada Etapa Anlisis de requerimientos Diseo Codificacin y depuracin Pruebas Mantenimiento Objetivo Establecer sin ambigedades los requerimientos del sistema a realizar. Diseo general del sistema a nivel interno: estructura de bloques y base de datos. Realizacin del software en el lenguaje de programacin elegido. Pruebas del software para constatar que funciona correctamente. Modificaciones al software cuando ya est en funcionamiento.

Reflexin 5-1. Qu estrategia utilizar en la enseanza de la programacin? Existen distintos puntos de vista para la enseanza primero propone que el estudiante trate a los lenguajes conceptos algortmicos, por lo cual sus ejemplos slo los segundo intenta ir al cdigo inmediatamente, dejando centrados en el diseo de la solucin. de la programacin. El de programacin como da en pseudocdigo. El de lado los ejercicios

Ambos tienen su razn de ser y sus riesgos. No puede lograrse la solucin de problemas de mediana complejidad sin el planteamiento abstracto de la solucin, expresado con algn tiempo de diagrama o pseudocdigo. Por otra parte, si no se lleva la solucin planteada a cdigo, no hay aplicacin concreta y no podemos estar totalmente seguros de que nuestros algoritmos realmente funcionan. Nosotros nos inclinamos por un mtodo mixto: llevar a los estudiantes a un primer ejemplo que involucre un pequeo cdigo tan pronto como sea posible, a fin de que los estudiantes perciban mejor el contexto de trabajo. Posteriormente, en cada rubro combinar ejercicios de codificacin con otros sobre la lgica del algoritmo y pruebas de escritorio para tratar de que el alumno pueda visualizar los conceptos independientemente del lenguaje en que se codifique finalmente. Esta propuesta reconoce implcitamente que deben diversificarse las estrategias de enseanza. No existe un nico mtodo para aprender. A continuacin describiremos brevemente nuestra forma de trabajo y brindaremos un ejemplo sencillo (no comenzaremos con hola mundo). La intencin es que desde el inicio usted se familiarice con la forma de trabajo a fin de que siga este mtodo desde su primer trabajo ( ver figura 5-2). Sera recomendable que reprodujera el ejemplo en el equipo de cmputo con ayuda de un profesor o un amigo. Al principio, podr sentirse desorientado. No se preocupe, tendr varias formas para no perderse: 1.- La descripcin general que se brindar para los distintos elementos en esta introduccin. 2.- La explicacin detallada en el momento de abordar cada tema en los siguientes captulos. 3.- La gua del profesor.
5

Para metodologas de mayor alcance pueden consultarse Proceso Unificado, Programacin Extrema o Scrum.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

28 / 141

Figura 5-2. El trabajo paso por paso para un curso inicial de lenguajes de programacin.
El cuadro 5.2 muestra las etapas del mtodo de cascada y la forma en que se reflejan en nuestro curso:

Cuadro 5-2. Adaptacin del mtodo de cascada a un curso introductorio de programacin Anlisis Diseo Codificacin Pruebas Documentacin a entregar Requerimiento del problema Diseo de tabla de pruebas. Diseo de la pantalla con ejemplos reales Pseudocdigo o equivalente Codificacin en el lenguaje de programacin con buenas prcticas de codificacin. Aplicacin del lote de pruebas. Requerimiento, cdigo, tabla de pruebas aplicadas y la pantalla del programa ejecutndose.

Paso 1. Especificacin de requerimientos del usuario: en este paso el estudiante debe aclarar cualquier duda del requerimiento incluyendo la realizacin de clculos, la delimitacin del problema, la aclaracin de ambigedades y la ubicacin de casos especiales. De preferencia, deben ser explcitas las validaciones que el programa debe realizar (por ejemplo: que exista la fecha indicada) y aqullas que por ser un curso introductorio pueden omitirse (como la validacin del tipo de dato al capturar).

Reflexin 5-2. Nunca deje que el estudiante sea su propio usuario Una de las prcticas ms comunes en los cursos de programacin es que el estudiante define los requerimientos a partir de una idea general. No lo permita! Es primordial que el desarrollar tenga la perspectiva de que trabaja para un usuario final (o para un conjunto de usuarios finales en caso de un software de uso general). Lo ms probable es que no convenga recurrir a un usuario final real en un curso introductorio, pero el profesor u otro compaero puede hacer las veces de usuario final. Lo ms importante es que quien codifique no defina los requerimientos y el programa terminado sea sometido a pruebas por otro estudiante o el profesor mismo.

Paso 2: Diseo preliminar de la pantalla que se obtendr al finalizar el programa. Esta pantalla tiene dos finalidades: verificar que no existen dudas del requerimiento y tener una visin del resultado final esperado. Siempre debe hacerse con datos de ejemplo que corresponden a posibles datos reales del usuario. Los datos que provengan de operaciones deben ser calculados a partir de los datos

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

29 / 141

proporcionados por el usuario. Una recomendacin final: utilizar una forma visual que se asemeje lo ms posible a la forma en que se ver el programa terminado.

Reflexin 5-3. Sobre la importancia de los requerimientos No deben dejarse ambigedades en los requerimientos al empezar la parte del diseo del algoritmo, pues normalmente eso traer como consecuencia una gran cantidad de reprocesos innecesarios. Prcticamente la mitad del software creado nunca es utilizado por el usuario final y esto se debe en gran parte a errores al establecer los requerimientos. A un grupo de estudiantes se les plante: Realice un programa que reciba los tres lados de un tringulo y despliegue su rea. El 45% lo hizo con (base * altura) / 2, lo cual no corresponda a la especificacin solicitada. Ese porcentaje baj a 8% en otro grupo al cual se les dio la frmula y un ejemplo de clculo desde el inicio.

Paso 3. Diseo del lote de pruebas que se aplicar al terminar el programa. Este lote de pruebas debe cubrir los diferentes casos tpicos y especiales a los cuales se puede enfrentar el programa. Debe de establecerse antes de comenzar el diseo del algoritmo.

Reflexin 5-4. Sobre la consistencia de datos en el lote de pruebas Las pruebas de un programa deben incluir consistencia de tipos de datos. Por ejemplo: avisar que el usuario tecle una letra cuando se solicit un nmero. En un curso introductorio como ste, se puede suponer que el usuario capturar adecuadamente el tipo de informacin requerida. Sin embargo, en asignaturas posteriores deber llenarse tal vaco. A partir del tema de condicionales, conviene que el estudiante tambin valide la coherencia de los datos. Por ejemplo: antes de obtener el factorial de un nmero que se verifique que ste no sea negativo (no existen factoriales de nmeros negativos).

Paso 4. Elaborar el algoritmo. Conviene que el estudiante elabore el bosquejo de la solucin bajo alguna modalidad (pseudocdigo, diagrama de flujo, etc.). El propsito es que se centre en la lgica del algoritmo y por el momento no piense en la sintaxis. El pseudocdigo se construye con las palabras elegidas por el estudiante. Por ejemplo: leer, desplegar, si, etc. No debieran establecerse reglas demasiado rgidas, aunque s tiene que reflejar las estructuras de condicionales y ciclos que maneja la programacin estructurada. En cuanto al diagrama de flujo, ste puede ser realizado a mano alzada pero conforme a las reglas que rigen al mismo. Debe cuidarse en que no consuma demasiado tiempo.

Reflexin 5-5. Sobre el pseudocdigo y los diagramas de flujo El pseudocdigo es muy til para representar al algoritmo, pues refleja con cierta libertad al lenguaje en que se codificar. No obstante, puede darse el caso que el estudiante se aleje demasiado de las posibilidades de la programacin estructurada, a tal punto que sea imposible codificar lo escrito. Por otra parte, cmo evaluarlo si no

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

30 / 141

existen reglas formales para su manejo? Por su parte, el diagrama de flujo sigue reglas claras y por lo mismo es ms til desde el punto de vista pedaggico. Aunque consume ms tiempo hacer el diagrama de flujo que el mismo cdigo y por ello prcticamente no se emplea a nivel profesional. No existe solucin idnea. Cada docente debe tratar de aprovechar las ventajas de cada opcin tratando al mismo tiempo de minimizar sus inconvenientes.

Paso 5: Elaborar el cdigo. Se realizar la codificacin tomando como base el algoritmo diseado y buenas prcticas de programacin (alineacin del cdigo, uso de comentarios, etc.). Al terminar, se aplicar el lote de pruebas que se determin en el paso 3. Recuerde: el programa no est terminado hasta no haber pasado todas las pruebas (y an as, pudiera haber errores no descubiertos).

Reflexin 5-6. Desde el inicio, las buenas prcticas de programacin! El curso introductorio de programacin es el comienzo para formar un arquitecto de software. As que desde el inicio se tiene que insistir en un desarrollo de calidad, que incluya la parte metodolgica (trabajar en base a requerimientos, pruebas al cdigo, documentacin, etc.) como la codificacin (nombres de variables, alineacin, etc.). No debemos dejar para despus las buenas prcticas de programacin. Muchos hbitos que no se forman desde un inicio ya nunca se pueden recuperar.

Paso 6: Conjuntar la documentacin. Se conjunta la documentacin del programa que se entregar: requerimiento, cdigo, tabla de pruebas y pantalla final. Conviene aclarar que algunas actividades no se reflejan en la documentacin final del sistema, slo ayudan a avanzar ms rpido y evitar reprocesos. En nuestro caso, el diseo preliminar de la pantalla y el diseo del algoritmo no se incorporarn a la documentacin final.

Reflexin 5-7. Qu documentacin se pide en los programas? Una de las carencias ms fuertes en el entorno docente es un anlisis de la documentacin a pedir en los cursos introductorios de programacin. Por lo comn se solicita nicamente el cdigo fuente y con ello se pierde implcitamente la liga entre los requerimientos, el cdigo fuente y las pruebas. Desde el inicio debe acostumbrarse al estudiante a documentar de forma completa un programa: cuando menos el requerimiento, el cdigo y las pruebas a que fue sometido.

5.3. Nuestro primer ejemplo: el promedio de dos nmeros


Aqu va nuestro primer ejemplo. Muy probablemente usted sienta que es un problema relativamente artificial y que ningn usuario real solicitara algo tan sencillo. Tiene razn, pero es un buen ejemplo para efectos didcticos. Paso 1: requerimientos del usuario:
Hacer un programa que reciba dos nmeros y despliegue su promedio.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

31 / 141

Paso 2: diseo preliminar de la pantalla que se obtendr al finalizar el programa.


Bienvenido. Este programa obtiene el promedio de dos nmeros. Teclee sus datos separados por un espacio. 6 9 El promedio es 7.5 Oprima cualquier tecla para terminar

Paso 3: diseo del lote de pruebas que se aplicar al terminar el programa.


Datos del usuario 6 9 6 m Resultado esperado El promedio es 7.5 En nuestro caso, el programa tronar. En cursos posteriores deber validarse que el tipo de dato sea correcto.

Paso 4: elaborar el algoritmo.


comentario: pseudocdigo para obtener el promedio de dos nmeros desplegar el texto Bienvenido solicitar los 2 datos promedio = (dato1 + dato2) / 2 desplegar promedio despliega Oprima cualquier tecla para terminar

Paso 5: elaborar el cdigo.


// Programa que recibe 2 datos y devuelve su promedio. #include <conio.h> #include <stdio.h> main() { float dato1, dato2, promedio; printf("Bienvenido.\n\n"); printf("Este programa obtiene el promedio de dos numeros.\n"); printf("Teclee sus datos separados por un espacio.\n"); scanf("%f %f", &dato1, &dato2); promedio = (dato1 + dato2) / 2; printf("El promedio es%4.1f", promedio); printf("\n\n Oprima cualquier tecla para terminar..."); getch(); }

Paso 6: conjuntar la documentacin a entregar.


Requerimiento: Hacer un programa que reciba dos nmeros y despliegue su promedio. Cdigo: // Programa que recibe 2 datos y devuelve su promedio. #include <conio.h> #include <stdio.h> main() { float dato1, dato2, promedio;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

32 / 141

printf("Bienvenido.\n\n"); printf("Este programa obtiene el promedio de dos numeros.\n"); printf("Teclee sus datos separados por un espacio.\n"); scanf("%f %f", &dato1, &dato2); promedio = (dato1 + dato2) / 2; printf("El promedio es %4.1f", promedio); printf("\n\n Oprima cualquier tecla para terminar..."); getch(); }

Pruebas aplicadas: Datos del usuario 6 9 Pantalla final:

Resultado esperado El rea del tringulo es de 7.5

5.4. Un primer acercamiento a la codificacin


Desmenucemos el cdigo de nuestro primer ejemplo, con la advertencia que se dar nicamente una breve explicacin introductoria de cada tema. Esperamos que sea suficiente para que el lector no se sienta completamente perdido; conforme se avance en el libro se ahondar en cada uno de los conceptos. Un programa (cdigo fuente) est escrito en un lenguaje de programacin. Dicho cdigo fuente se traduce a un lenguaje entendible para la computadora (cdigo mquina) a travs de un software de propsito especfico llamado compilador. En la gran mayora de ocasiones se incorporan fragmentos de cdigo (subrutinas) previamente escritos y compilados por otros compiladores (ver diagrama 5-3). Todo programa debe ser compilado antes de poder ejecutarse.

cdigo fuente

cdigo mquina

libreras

Figura 5-3. El propsito de un compilador


En nuestro caso, emplearemos el compilador Dev C++ por ser gratuito y de fcil manejo. Este software puede bajarse del sitio Web http://www.bloodshed.net/dev/devcpp.html. En enero de 2011 se encontraba disponible la versin 4.9.9.2 en versin beta. Todos los ejemplos fueron probados en la versin 4.9.8.0.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

33 / 141

Para observar los resultados de un programa debe compilarse (Compile) y posteriormente ejecutarse (Run) desde la opcin Execute del propio compilador, como se muestra en el diagrama 1.2.

Figura 5.4. Compilacin y ejecucin en Dev C++.


El cdigo del programa se explica de manera general en las siguientes lneas:
// Programa que recibe 2 datos y devuelve su promedio.

Esta lnea es un comentario que describe el propsito del programa. Los comentarios no son tomados en cuenta por el compilador. Puede utilizarse el operador // al inicio de cada lnea o bien los operadores /* y */ para iniciar y finalizar los comentarios, respectivamente.
#include <conio.h> #include <stdio.h>

Indican las libreras que se utilizarn en el programa. Las instrucciones scanf y getch se encuentra en la librera <conio.h>. En sentido estricto, la librera <stdio.h> es innecesaria en este cdigo. No obstante, en algunos compiladores scanf o getch estn en <stdio.h>, por lo cual se mantiene la costumbre de poner siempre ambas libreras.
main() {....}

Enmarca a todas las instrucciones del programa.


float dato1, dato2, promedio;

Es una declaracin de 3 variables de tipo decimal (flotante), llamadas dato1, dato2 y promedio. Las variables pueden cambiar su valor a lo largo del programa y en la mayora de los casos se recomienda que slo almacenen datos del tipo indicado.
printf("Bienvenido.\n\n"); printf("El promedio es %4.1f", promedio);

Son instrucciones para desplegar. \n equivale a un salto de lnea. %f seala que se desplegar el valor de una variable de tipo flotante. Al poner .1 entre el % y la f se est indicando que el valor se redondear a un decimal. El 4 significa que se reservan cuatro espacios para desplegar el valor de la variable.
scanf("%f %f", &dato1, &dato2);

Permite leer datos del teclado. %f seala que es informacin de tipo flotante (decimal). Observe que el nombre de cada variable est antecedido por un &.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

34 / 141

promedio = (dato1 + dato2) / 2;

Asigna realiza la operacin mostrada y el resultado lo almacena en promedio. Los parntesis son indispensables, como en lgebra, aunque en programacin no se utilizan los corchetes para este tipo de instrucciones.
getch()

Permite detener la pantalla hasta que se oprima cualquier tecla. Si no se pone en el programa la pantalla desaparecer tan rpido que no se podr ver el resultado. Debemos aclarar que no es la nica forma de solucionar este problema.

5.5. Por qu lenguaje C para un primer curso de programacin?


Existe discrepancia acerca del lenguaje ms adecuado para empezar a programar. Las propuestas abarcan C, Pascal y Java, entre otras. La decisin se vuelve ms difcil porque no es predecible hacia donde se dirigen los lenguajes de programacin (ver figura 5-5). Java y C conservan el ms alto nivel de penetracin, aunque Java ha ido disminuyendo su participacin. Lenguajes relativamente nuevos como Python van ganando popularidad, mientras Microsoft con C# y Visual Basic-, as como PHP para ambientes Web conservan un nicho significativo. Conviene aclarar que SQL predomina en el campo de base de datos a pesar de no figurar en la imagen. Pascal tiene su ventaja en ser un lenguaje muy enfocado a los cimientos pedaggicos, aunque casi no es empleado en el campo profesional. Java es muy utilizado, pero su orientacin a objetos prcticamente no se explotara poco en un curso introductorio. Lenguaje C tiene un sitio envidiable en mercado, particularmente en cdigo embebido; no obstante, su sintaxis en muchas ocasiones confunde a los estudiantes. Nos inclinamos hacia lenguaje C, sin dejar de reconocer que tambin Pascal o Java podran ser opciones viables. Sin importar la eleccin, hay que hacer hincapi en la lgica de programacin, la metodologa de trabajo y los principios bsicos de la programacin estructurada. Curiosamente, rubros que se suelen descuidar en gran parte en cursos introductorios, los cuales se centran casi siempre en la sintaxis del lenguaje.

Figura 5.5. Tendencias de los lenguajes de programacin6.

Tomado de www.tiobe.com [accesado el 14 de enero de 2011].

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

35 / 141

Por otra parte, no es fcil para una persona o una institucin establecer un conjunto de asignaturas ligadas coherentemente con el objetivo de aprender software a nivel profesional ni crear las condiciones 7 adecuadas para ello, aunque ya existen planteamientos preliminares interesantes . En trminos generales, se pueden sealar las siguientes recomendaciones: 1.- Debe integrarse en forma coherente y natural con los dems conceptos manejados, pues el conocimiento es acumulativo. 2.- Debe crear un ambiente de trabajo lo ms cercano posible al campo laboral o de investigacin, pues all se reflejar el conocimiento (El alumno aprende de lo que vive!). 3.- Debe ser viable en las condiciones existentes, sobre todo en lo que respecta a la infraestructura existente. Si se desea aprender programacin Web, una posible liga de un curso de lenguaje C con posteriores asignaturas sera la siguiente:

Lenguaje C

Java bsico (POO)

Servlets y JSP

Framework de Java

Programacin para mviles

Diagrama 1.4. Una posible liga del curso de C con el aprendizaje del desarrollo de software.

5.6. Hacia el enfoque por competencias y ms all


Uno de los cambios ms significativos a nivel educacin superior es el enfoque basado en competencias. Las competencias engloban el saber qu (conocimiento), saber hacer (habilidad), saber ser (valores) y saber convivir (trabajo colaborativo). Vistas en ese contexto, las competencias representan un gran avance frente a una transmisin pasiva del conocimiento. Las competencias especficas que el estudiante puede cubrir con este material son acordes con el planteamiento de muy diversas escuelas. A manera de ejemplo, transcribimos las que se indican en la 8 unidad de aprendizaje de Lgica de Programacin de la UPIICSA (IPN) : o Analiza el planteamiento de un problema especfico para llegar a un requerimiento preciso, delimitado y sin ambigedades. Bosqueja, valida y depura el algoritmo de solucin para el requerimiento especificado.

o Codifica y prueba el algoritmo propuesto, basado en estructuras de control de lenguaje C. o Modela, codifica y prueba un diseo modular que resuelva el requerimiento especificado.
o Codifica y prueba el algoritmo propuesto, basado en tipos de datos compuestos de lenguaje.

Esas competencias se reflejan a lo largo del texto en el conocimiento de las estructuras de la programacin estructurada y su codificacin (saber conocer); la resolucin prctica de algoritmos y su
Ver Lpez Goytia, Jos Luis; Oviedo Galdeano, Mario; Hacia un replanteamiento de la enseanza de la programacin. 3er. Congreso Internacional de Educacin Media Superior y Superior 2010. Gobierrno del Distrito Federal. Mxico, 2010. 8 Programa analtico de la unidad de aprendizaje de Lgica de Programacin, de la UPIICSA del IPN. Junio de 2010.
7

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

36 / 141

traslado a su correspondiente codificacin, incluyendo pruebas de escritorio y de usuario final (saber hacer); la comprensin crtica del porqu es necesario buenas prcticas de programacin y el seguimiento de normas metodolgicas (saber ser) y la ejecucin de ejercicios en equipos de trabajo (saber convivir). Se da como premisa que actualmente la creacin de programas es una labor de un equipo interdisciplinario y no el producto de un programador talentoso y solitario. Partimos de una supuesto que tiene que ver con el enfoque constructivista de la educacin y que coincide con algunos estudios sobre la formacin de los conceptos en el cerebro humano: el estudiante formar su aprendizaje significativo a partir de la interaccin cotidiana con el medio, es decir, con base en 9 sus vivencias y sus utopas (reiteramos: el estudiante aprende de lo que vive!). Por ello, los conceptos de calidad de software no deben ser un tema aislado; tienen que reflejarse en la construccin de cada programa. Por otra parte, el estudiante y el docente deben tomar en cuenta que la parte racional de toda persona 10 es inseparable de su parte emocional . Difcilmente un alumno aprender programacin sino siente emocin por la asignatura, y esa bsqueda del gusto por el desarrollo de software depende del docente, el entorno escolar y social, y el propio estudiante. Finalmente, es sumamente interesante mostrar un diagrama en torno a los niveles de proximidad al 11 conocimiento . El material de este libro es el comienzo para aprender desarrollo de software. A este curso seguirn otros de la propia carrera para cubrir el primer nivel (Nivel I: la carrera). No obstante, esas asignaturas son slo un subconjunto del conocimiento que ya existe sobre esta la programacin (Nivel II: conocimiento conocido). Dicho conocimiento se enriquecer con las investigaciones actuales (Nivel III: la investigacin actual) y en un futuro no tan inmediato con paradigmas y enfoques que an no han nacido (Nivel IV: El imaginario del porvenir).

NIVELES DE PROXIMIDAD AL CONOCIMIENTO


marco conceptual y aplicacin inmediata
no parcialmente ilimitado y disperso s fijo no s s no

material base

se evala en la escuela?

se conoce la respuesta?
empresas tecnolgicas universidades

I. Carrera
escuelas consultoras s parcialmente no

II. Conocimiento conocido III. La investigacin actual IV. El imaginario del porvenir

quin lo hace?

el docente conoce las respuestas?

Figura 5-6. Los niveles de proximidad al conocimiento


9

Hofstadter, D. (2009). Yo soy un extrao bucle. Mxico. Edit. Tusquets. y Hofstadeter, D.. Gdel, Escher, Bach: un eterno y grcil bucle. Edit. Tusquets-CONACyT. Mxico, 1987. 10 Damasio, Antonio. El error de Descartes. Drakontos Bolsillo. Espaa, 2006. 11 Lpez Goytia, Jos Luis. Prospectiva de los lenguajes de programacin. Xxxx Congreso . Mxico, 2010.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

37 / 141

El estudiante que slo se concrete a sus cursos, sin buscar por l mismo el conocimiento, renuncia a la mayor parte del saber que necesitar en su vida profesional y personal. Por ello en muchos ejercicios propuestos se tendr que buscar informacin adicional a la presentada en el texto, aunque cuidando que est al alcance del estudiante por medios relativamente sencillos. En muchos casos se presentarn ejercicios avanzados que pueden representar un reto para los alumnos ms aventajados (a juicio del profesor, bien pudieran valer puntos extras en el curso). Por otra parte, es necesario inculcar en los estudiantes un espritu crtico frente a la informacin que reciben, sobre todo porque gran parte de ella viene de Internet: un abanico gigantesco que est lleno de verdaderas joyas, sucesos triviales y mentiras. Una de las estrategias que pueden dar mejor resultado es que el estudiante compruebe la veracidad de la informacin e incluso haga sus propios experimentos. Por citar un ejemplo, no se alinea al cdigo porque s, sino porque facilita el mantenimiento. Un ejercicio que casi nunca se realiza es poner a un estudiante a modificar el cdigo realizado por otros alumnos: uno con cdigo alineado y otro sin alinear. Comprobemos en la prctica lo que la teora dicta! Pero eso tiene una implicacin muy interesante: los docentes tenemos que entender que nuestras afirmaciones pueden someterse a crtica y a pruebas. Un estudiante puede venir, diccionario en mano, a demostrarnos una falta de ortografa a pesar de que nosotros afirmramos un da antes que la una palabra estaba escrita correctamente. Eso debe ser motivo de burla? Bajo ninguna circunstancia. Simplemente es reconocernos iguales como seres humanos. Cmo reenfocar la educacin para que tanto alumnos como maestros vayan hacia la profundizacin del conocimiento como un concepto de vida? Qu hacer para que ello les cause placer, cundo muchsimas personas no suele comprar libros y las actividades culturales no se integran a su vida 12 cotidiana? El enfoque por competencias no aborda la complejidad de esos cuestionamientos, quiz los ms difciles que la educacin debe resolver.

5.7 Los primeros ejercicios


He aqu algunos ejercicios sugeridos, que deben ser realizados con un proceso de entrada, clculo y salida sencillos (sin condicionales ni ciclos). Lo ms importante: debe seguirse el mtodo de trabajo sugerido. o o o o Realice un programa que reciba el lado de un cuadrado y calcule su rea. Realice un programa que reciba el dimetro de un crculo y calcula su rea. Realice un programa que reciba un nmero y despliegue su raz cuadrada. Una tienda departamental promueve descuento sobre descuento en algunas temporadas. Calcula el primer precio y, al monto con ese descuento, le aplica un segundo descuento. Por ejemplo: si a una prenda cuyo costo original es de $100.00 le colocara un 40% ms 20% adicional, su precio final sera $48.00. Realice un programa que permita ingresar el monto original y ambos descuentos. Como resultado arroje el precio final.

12

Para mayor informacin en el caso de Mxico, puede verse: Conaculta. Encuesta Nacional de hbitos, prcticas y consumo culturales. Mxico, 2010.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

38 / 141

Reflexin 5.8 Cmo saber si el mtodo de trabajo funciona? En diferentes casos, hemos pedido a los estudiantes que dibujen la pantalla de salida a partir del requerimiento. Entre un 50% y un 75% lo hacen diferente a como lo habamos imaginado. A su vez, ese porcentaje puede dividirse en dos vertientes: dan una interpretacin diferente al problema porque su redaccin es ambigua y no revisan adecuadamente la redaccin. Por citar un ejemplo: se les pide recibir el dimetro de un crculo y calcular su rea 2 (rea=*radio ). Los estudiantes toman directamente el dato sin considerar que le piden el dimetro al usuario y la frmula utiliza el radio. Las evaluaciones no deben considerar nicamente la codificacin; deben validar tambin si el software se realiz conforme a las especificaciones establecidas.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

39 / 141

Captulo 6. EL PARADIGMA DE LA PROGRAMACIN ESTRUCTURADA


El desarrollo de software tiene poco ms de seis dcadas, tomando como referencia el nacimiento de la ENIAC, en 1946. Se trata de un rea joven si la comparamos con ciencias como la fsica, qumica o matemticas, que adquirieron una madurez desde hace siglos. En sus primeros aos, la programacin se basaba en instrucciones muy cercanas al cdigo mquina y necesitaba un conocimiento del hardware sobre el cual se trabajaba. Realizar una multiplicacin o alguna instruccin de complejidad similar- requera de al menos una docena de instrucciones. Era la poca del lenguaje ensamblador, que hoy se sigue empleando en microprocesadores y cdigo embebido. Posteriormente se agruparon instrucciones y se inventaron programas que traducan estos comandos a lenguaje ensamblador. Nacieron de esta forma COBOL (para aplicaciones administrativas), Fortran (para aplicaciones cientficas) y BASIC como lenguaje de uso general. Sin embargo, el estilo de programar en estos lenguajes presentaba un problema: el salto incondicional, representado sobre todo por la instruccin goto de BASIC, la cual permita ir directamente a cualquier lnea de cdigo. El empleo continuo del salto incondicional se convirti en un gran dolor de cabeza para dar mantenimiento a los programas. Para solucionar ese problema naci la programacin estructurada, cuyos representantes ms notorios fueron Pascal y C. La programacin estructurada propugnaba porque todos los programas se basaran en tres estructuras bsicas: a) Secuencia.- el cdigo se ejecutaba de arriba hacia abajo. La secuencia queda implcita a la hora de leer, compilar y ejecutar los programas. b) Condicionales- elementos de decisin que permitan realizar un bloque de instruccin si se cumpla una condicin y, opcionalmente, llevar a cabo otro conjunto de comandos si no se cumpla. c) Ciclos.- repetir una secuencia de instrucciones mientra se cumpliera una condicin. Aunque conservaban el salto incondicional hacan hincapi en que ste no se empleara. El avance natural en esta lnea fue el nacimiento de la Programacin Orientada a Objetos (POO), cuyo representante ms famoso es Java. La POO retoma los tipos de datos y las rutinas de la programacin estructurada y crea con ellos una estructura de mayor potencia: las clases. Este breve recorrido intenta contextualizar a la programacin estructurada, aunque resulta demasiado simplificado y deja fuera de manera injusta a lenguajes de propsito especfico como el ya mencionado COBOL y a otros paradigmas, entre ellos los dedicados al campo de Inteligencia Artificial. Tampoco describe lo sucedido con lenguajes para modo grfico como Visual Basic (basado en la programacin estructurada), que posteriormente se transformara en Visual .NET (basado en la Programacin Orienta a Objetos - POO). En cuanto a la programacin WEB, sta se basa parcialmente en la programacin estructurada (ASP clsico, PHP, JavaScript, etc.) y en la Programacin Orientada a Objetos (J2EE, tecnologa .NET, etc). En sntesis, la programacin estructurada sigue siendo vigente en dos sentidos: varios lenguajes todava la aplican y su conocimiento es base para el aprendizaje de la Programacin Orientada a Objetos.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

40 / 141

6.1. Qu es un algoritmo?
Como ya se mencion, los ciclos y las condicionales son las estructuras bsicas de la programacin estructurada y sobre stas deben fincarse la creacin de algoritmos bsicos. Un algoritmo es un conjunto de pasos debidamente ordenados y sin ambigedades, que en un tiempo finito dan la solucin a un problema claramente planteado. Un algoritmo puede plantearse de diversas formas, desde la palabra escrita hasta mecanismos formales. Entre los ms conocidos estn: Pseudocdigo: se escriben en el idioma nativo (el espaol, en nuestro caso) palabras cercanas a las instrucciones de un lenguaje de programacin. Es muy recomendable como paso intermedio entre el problema y la codificacin de la solucin en un lenguaje de programacin (Pascal, C, Java, etc.). Diagrama de flujo: establece de manera grfica la solucin del problema, utilizando conos para cada estructura de programacin (ciclos, decisiones, etc.). Sumamente utilizado para aspectos didcticos. UML (Unified Modeling Languaje): la forma de diagramacin utilizada para programacin orientada a objetos. Su conjunto de smbolos se aplica para todas etapas del proceso de desarrollo de software.

6.2. ELEMENTOS BSICOS EN LA LGICA DE PROGRAMACIN


La gran ventaja y, al mismo tiempo, la gran desventaja del pseudocdigo es que no existen reglas formales para escribirlo. Cada persona puede establecer sus propios criterios. Ciertamente, esto puede dar lugar a ambigedades. Para evitarlo, deber orientarse al alumno hacia las estructuras bsicas de control y establecer claramente los pasos a seguir. Sugerimos al inicio limitar el pseudocdigo a las siguientes convenciones. Variables. Una variable es un lugar de memoria que puede guardar un valor, el cual puede cambiar a lo largo del programa. Cuando se asigna un nuevo valor, el valor anterior se pierde. Debe ser identificado por un nombre determinado, el cual slo se utilizar para esa variable. Todas las variables a utilizar deben ser declaradas al inicio del programa. Nombres de identificadores. Los identificadores son nombres que ubican a los diferentes elementos de los programas: el nombre del propio, programa, las variables, etc. Reglas de prioridad. La ejecucin de los operadores aritmticos se realiza con las mismas reglas de lgebra. Primero se harn las multiplicaciones y divisiones, y posteriormente las sumas y restas. De esta forma 8 + 3 * 4 ser igual a 20. Igual que en matemticas, se pueden utilizar parntesis para forzar a que en primer lugar se haga lo que est dentro de ellos. Cabe aclarar que en programacin slo se usan los parntesis circulares. Leer se utilizar para recibir un dato del teclado. Por ejemplo: leer x significar que se recibir el valor de la variable x del teclado. Desplegar se manejar para mostrar un mensaje textual o el valor de una variable en la pantalla. Condicionales. Indican una decisin. Ciclos. Indica que una accin se realizar mientras se cumpla la instruccin sealada.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

41 / 141

6.3. CONDICIONALES
Las condicionales establecen una decisin con la estructura siguiente: si (condicin) bloque 1 de instrucciones en caso contrario bloque 2 de instrucciones termina si En diagrama de flujo se identificara como sigue:

no (opcional)

instrucciones

instrucciones

Diagrama 6-1. La representacin de condicionales en diagrama de flujo.


En prcticamente todos los lenguajes de programacin el si se identifica con un if y en caso contrario con un else. El si (condicin) es obligatorio, mientras el en caso contrario (bloque 2 de instrucciones) es opcional. Existen diversas formas para indicar sin ambigedades hasta donde abarca cada bloque de instrucciones: llaves en lenguaje C, begin-end en Pascal, endif en SQL, etc. A manera de ejemplo, suponga que se desea recibir tres calificaciones, desplegar el promedio e indicar si la calificacin es o no es aprobatoria. La calificacin mnima aprobatoria es 8. El pseudocdigo quedara como sigue: declarar a, b,c y promedio como decimales desplegar Por favor, teclee sus tres calificaciones leer a, b y c promedio = (a + b + c) / 3 desplegar El promedio es desplegar promedio si promedio >= 8 desplegar APROBADO en caso contrario desplegar REPROBADO termina si

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

42 / 141

6.4. CICLOS
Los ciclos Indican que una accin se realizar mientras se cumpla la instruccin sealada. Tendr la siguiente estructura: mientras (condicin) instrucciones termina mientras Hay que hacer hincapi que la condicin significa mientras que. Una condicin que siempre se cumpla generara un ciclo infinito. Por el contrario, una condicin que nunca se cumpla implicara que no se ejecutaran las instrucciones del cuerpo del ciclo ni una sola vez. Un error muy frecuente es no identificar claramente aqullo que es repetitivo (va a ir dentro del ciclo) con lo que debe hacerse una sola vez antes o despus del ciclo (debe ir fuera del ciclo). El resultado de este error suele dar resultados equivocados o generar ciclos infinitos. En diagrama de flujo, los ciclos se representan de la siguiente manera: Su diagrama es como sigue:

no

instrucciones

Diagrama 6-2. La representacin de ciclos en diagrama de flujo.

La condicin mientras que se identifica con la palabra while en casi todos los lenguajes.

Cuadro 2-1. Los ciclos en lenguaje C y Java while do-while for Mientras que, se valida al inicio por lo cual el bloque de instrucciones puede no ejecutarse ni una sola vez. Mientras que, se valida al final por lo cual el bloque de instrucciones se ejecuta al menos una vez. Una instruccin muy similar en el lenguaje Pascal es el repeat. Por lo general se aplica cuando se conoce de antemano las veces que se repetir un conjunto de instrucciones. Aunque en lenguaje C tiene la misma potencialidad que el while.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

43 / 141

Al igual que en condicionales, existen diversas formas para indicar sin ambigedades hasta donde abarca cada bloque de instrucciones: llaves, begin-end, endWhile, etc., segn el lenguaje de programacin. Aparte del ciclo mencionado existen otras variantes, cuya conceptualizacin vara un poco segn el lenguaje de programacin. En lenguaje C y Java se manejan tres posibilidades: A manera de ejemplo, suponga que se desea recibir tres calificaciones y desplegar el promedio.. El pseudocdigo quedara como sigue: declarar dato, suma y promedio como decimales declarar i como entera suma = 0 desplegar Por favor, teclee sus tres calificaciones mientras (i < 3) leer dato suma = suma + dato termina mientras promedio = suma / 3 desplegar El promedio es desplegar promedio

6.5. EJERCICIOS DE CONSTRUCCIN DE LGICA A PARTIR DEL PROBLEMA


Reflexin 2-1. Sobre los ejercicios de construccin de lgica Algunos docentes suelen comenzar con ejercicios de lgica del tipo: cmo se hacen huevos con jamn?. Consideramos que una primera analoga de este tipo es til para resaltar su parecido con algunos elementos de un algoritmo, pero sin ir ms all, pues son actividades lejanas a la formalidad de un lenguaje de programacin. Qu es vlido y qu no en ejemplos como ste? Con qu criterios establecer esta diferenciacin? Existe un riesgo latente de que el estudiante quede con la impresin de que se trabajar a contentillo del profesor. Con las descripciones vistas hasta este punto tenemos los elementos suficientes para iniciar ejercicios de construccin de lgica. Un primer bloque de ejercicios puede partir de una descripcin general de un requerimiento que debe ser llevado a detalle. En este bloque pueden incorporarse todas las sugerencias de los estudiantes que sean viables con la aplicacin de secuencias y ciclos. Se recomienda la siguiente estrategia de trabajo: 1) En la primera etapa los estudiantes buscarn la forma de clculo y se pondrn de acuerdo sobre la interpretacin del requerimiento. El usuario final para definir cualquier ambigedad podr ser el profesor o algn estudiante familiarizado con el problema. Por cuestin formativa, el estudiante que acte como usuario final deber disear el lote de pruebas y aplicarlo al programa final, pero l no ser el que realice la codificacin. Esta etapa abarcar los primeros tres pasos del mtodo de trabajo expuesto: especificacin de requerimientos del usuario, diseo preliminar de la pantalla y diseo del lote de pruebas. Pudiera darse la pantalla desde un inicio o que el mismo grupo la definiera. 2) En la siguiente etapa se tiene que elaborar el algoritmo que d solucin al problema a travs de pseudocdigo o diagrama de flujo. Este algoritmo ser realizado por un estudiante y verificado por

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

44 / 141

otro; slo podrn usar operadores, condicionales y ciclos (omitir por el momento, arreglos, archivos y subrutinas). Los estudiantes que ya tengan familiaridad con un lenguaje de programacin puedan codificar dicho algoritmo para confirmar su validez. La siguiente es una lista de ejercicios propuestos, con los dos primeros elementos: especificacin de requerimientos del usuario y diseo preliminar de la pantalla. Por razones de espacio, se omiti en la pantalla las palabras de bienvenida y despedida, que s deberan estar en el programa definitivo. o Una librera ofrece descuentos por volumen: 3% a partir de tres libros; 5% si son ms de 3 libros y 10% si son ms de 10. Los descuentos no se acumulan. Realice un programa que reciba el costo del libro, el nmero de libros y despliegue el total a pagar. Seale el costo unitario del libro: 120 Indique el nmero de libros: 3 El total a pagar es 349.20 o Realice un programa que calcule el promedio de varias calificaciones redondeado a un decimal. Al inicio se le preguntar al usuario cuantos nmeros va a capturar (suponga que el usuario capturar los datos adecuadamente). Cuntas calificaciones se van a capturar? 3 Captrelas: 7 6 4 El promedio es 5.7 o Realice un programa que calcule el promedio final de tres calificaciones redondeado a un entero. Si el promedio es mayor o igual a 6 el resultado se redondear al entero ms cercano; en caso contrario, no se tomarn en cuenta los decimales. Indique las tres calificaciones a promediar: 6 2 9 El promedio final es 5 o Realice un programa que calcule el promedio de varios nmeros. El usuario capturar datos y al final pondr un -1 para sealar que ya no existen ms datos (suponga que el usuario capturar los datos adecuadamente). Capture las calificaciones (indique un -1 para finalizar): 7 6 4 -1 El promedio es 5.7 o Un trabajador tiene un salario por hora (el salario diario supone 8 horas laboradas). Si que trabaja ms de 8 horas recibe pago por horas extras. De la novena a la undcima percibe el doble; de la dcimo segunda en adelante es el triple. Las horas pueden ser fraccionadas. Realice un programa que reciba el salario diario y las horas trabajadas; a partir de esos datos seale el monto a recibir por el salario normal, las horas extras y el total. Indique el sueldo diario: 200 Indique las horas trabajadas: 9.5 Sus percepciones en el da son: 275.00

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

45 / 141

o Un apostador asiduo tiene la costumbre de apostar si atina al nmero que resulta al tirar un dado. Si lo logra gana $5.000; en caso contrario, pierde $1.00. l comienza con $7.00 y el juego termina cuando gana $6.00 o pierde todo su capital. Qu nmero saldr en el dado? 5 El dado arroj un 4. Acaba de perder $1.00 Su saldo es $6.00 Qu nmero saldr en el dado? 5 o En una feria haba un kiosco llamado menor-7-mayor, que se refera a un juego con dos dados. Quien deseaba participar apostaba $1.00 a alguna de tres opciones: menor: 2-6; b) 7 exacto; c) mayor: 8-12. Si apostaba a menor y resultaba un valor entre 2 y 6, ganaba $1.00. De forma similar, si apostaba a mayor y resultaba un valor entre 8 y 12 ganaba $1.00. Si apostaba al 7 y sala exactamente ese valor, ganaba $5.00. Si no atinaba en su apuesta, perda $1.00 en cualquiera de los tres casos. Iniciar con $5.00 y el juego termina cuando llega a $10.00 o pierde todo su capital. A) Menor 2-6 B) 7 C) Mayor 8-12

Cul es su apuesta? A Lo sentimos, el nmero fue 9 (mayor) Su saldo es de $4.00 A) Menor 2-6 B) 7 C) Mayor 8-12

Cul es su apuesta? A continuacin se varios ejercicios sencillos en donde los estudiantes tienen que iniciar el trabajo desde la elaboracin de las pantallas. o Recibir los tres lados de un tringulo y desplegar su rea. o Capturar los tres lados de un tringulo y desplegar si es issceles, escaleno o equiltero. o Capturar 3 nmeros y desplegar el mayor de ellos. o Recibir n datos y calcular su promedio y su desviacin estndar.

6.6. PRUEBA DE ESCRITORIO


La prueba de escritorio consiste en tratar de seguir paso a paso lo que hace el algoritmo. En otras palabras, tratar de actuar como si uno fuera el equipo de cmputo. Hay que hacer hincapi en ello: no debe pensarse lgicamente ni como se supone que debe ser. Es menester desprenderse de la condicin humana y tratar de actuar como mquina, siguiendo instruccin por instruccin lo que sucede en el cdigo. No hay una representacin formal de la prueba de escritorio. Sugerimos poner una casilla por cada variable e ir anotando su valor. En el caso de ciclos, realizar un cuadrado y utilizar una columna por cada iteracin. Para ejemplificar, suponga que se tiene la siguiente definicin del problema:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

46 / 141

Realizar un programa que lea un nmero y despliegue su factorial. El factorial de un nmero n est dada por la siguiente serie: 1 * 2 * 3 * * (n-1) * n. El factorial de 0 es 1 y no existen factoriales de nmeros negativo. Este programa obtendr el factorial de un nmero. Teclee el nmero, por favor 5 Su sumatoria es 120 El lote de pruebas es el siguiente: valores 5 0 -3 resultados 120 1 No existen factoriales de nmeros negativos Pas la prueba?

El pseudocdigo que se presenta est descrito a continuacin. variables a utilizar: i, suma, despliegue Bienvenido despliegue Este programa obtendr el factorial de un nmero. despliegue Teclee el nmero, por favor leer dato si dato < 0 despliega No existen factoriales de nmeros negativos en caso contrario i = 1 acumula = 1 mientras i <= dato acumula = acumula * i i = i + 1 despliegue Su factorial es despliegue acumula despliegue Oprima cualquier tecla para continuar

Y la prueba de escritorio se coloca a continuacin: Antes del ciclo i ___1___ acumula ___1___ dato ___5___ Durante el ciclo Nmero de repeticin Valor de acumula Valor de i 1 1 2 2 2 3 3 6 4 4 24 5 5 120 6

Observe que se sale del ciclo cuando ya no se cumple la condicin. El valor final de acumula fue 120, que era el resultado esperado.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

47 / 141

6.7. EJERCICIOS PROPUESTOS PARA PRUEBAS DE ESCRITORIO


A continuacin se sealan varios ejercicios para realizar la prueba de escritorio. Observar que muchos de ellos se refieren a calcular un promedio, aunque con diferentes variantes. La intencin es que el estudiante visualice que un problema puede solucionarse de diferentes formas y que existen errores clsicos escondidos, independientemente del procedimiento utilizado. Indique el resultado del siguiente pseudocdigo tal y como est escrito. Suponga que los valores de a, b y c son 8 9 y 10, respectivamente 1 2 3 4 5 6 7 8 9 numdatos = 1 leer a numdatos = numdatos + 1 leer b numdatos = numdatos + 1 leer c numdatos = numdatos + 1 promedio = a + b + c / numdatos desplegar promedio

Reescriba la(s) lnea(s) que estn mal escritas.


# de lnea Correccin

Dado el siguiente cdigo: mayor = b si (b > a) y (b > c) mayor = b if (c > a) y (c > b) mayor = c despliega "El resultado es: despliega mayor Indique el resultado de la tradas sealadas a continuacin, tal y como est Datos de prueba 7 8 9 8 9 8 8 9 9 9 8 7 Resultado

Qu mensaje desplegar el siguiente pseudocdigo tal y como est escrito suponiendo que el usuario responde 5.5 cuando se le pide el dato? x = calificacin proporcionada por el usuario si (x > 5) Desplegar aprobado termina si si (x < 5) Desplegar reprobado termina si

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

48 / 141

Ordene el siguiente pseudocdigo para obtener el promedio de 3 nmeros declarar dato, suma y promedio como decimales declarar i como entera desplegar El promedio es desplegar Por favor, teclee sus tres calificaciones desplegar promedio i = 0 i = i + 1 leer dato mientras (i < 3) promedio = suma / 3 suma = 0 suma = suma + dato termina mientras Qu desplegar en pantalla el siguiente pseudocdigo tal y como est escrito? Suponga que el usuario teclea: 5 6 7 8 suma = 0 n = 4 i = 1 mientras i <= n despliega Teclee los 4 datos: leer dato suma = suma + dato i = i + 1 fin de mientras despliega El promedio es: despliega suma / i El siguiente pseudocdigo pretende obtener el promedio de 3 nmeros. Reescrbalo correctamente sin cambiar el nombre de las variables. definir suma, dato y i como entero i = 1 leer dato mientras i < 3 suma = suma + dato i = i + 1 termina mientas promedio = suma / i desplegar promedio

Este programa pretende obtener el promedio de 3 nmeros. Qu valor tendr promedio al final del siguiente pseudocdigo, suponiendo que se ejecuta sin problemas? 1 define promedio como entero 2 define dato1 = 9, dato2 = 6, dato3 = 8 3 promedio = dato1 + dato2 + dato3 / 3 Reescriba la(s) lnea(s) que estn mal escritas.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

49 / 141

# de lnea

Correccin

Qu valor tendr x y w despus de las siguientes instrucciones? x = 1 w = x mientras (x <=5) w = w * x x = x + 1 termina mientras o Qu valor tendr x despus de las siguientes instrucciones (cada inciso es independiente)? a) x = 8 x = x + 2 b) x x x x = = = = 8 x + 2 5 x * x

c) w = 8 t = 5 x = w * t d) a b c x = = = = 8 10 9 a + b + c / 3

e) x = 8 * 6 + 2 * 6 / 2 + 1

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

50 / 141

Captulo 7. Los primeros elementos para codificar en lenguaje C


7.1. Un programa para calcular descuentos
Como base para una explicacin posterior, presentamos la documentacin de un programa sencillo para calcular descuentos
Requerimiento: Hacer un programa que reciba el precio normal de un producto y su correspondiente descuento. Como salida, entregue el precio final (con el descuento incluido). Cdigo: // Programa que calcula el descuento de un producto. #include <conio.h> #include <stdio.h> main() { float precio, descuento, preciofinal; printf("Bienvenido.\n\n"); printf("Este programa le ayuda a calcular el precio "); printf("con descuento de un producto.\n"); printf("Teclee el precio normal y su porcentaje de descuento.\n"); scanf("%f %f", &precio, &descuento); preciofinal = (precio - precio * descuento / 100); printf("El precio final es %4.1f", preciofinal); printf("\n\n Oprima cualquier tecla para terminar..."); getch(); } Pruebas aplicadas: Datos del usuario 100 40 100 0 100 100 100 110

Resultado esperado El precio final es 60.0 El precio final es 100.0 El precio final es 0.0 El precio final es -10.0 Este resultado, aunque correcto desde el punto de vista aritmtico, no tiene sentido en el mundo real. En una versin posterior del programa (cuando ya se haya visto el tema de condicionales) deber validarse que el descuento capturado est entre 0 y 100.

Pantalla final:

7.2. La labor del compilador y el uso de libreras


En el captulo 1 se introdujo el primer ejemplo del cdigo y la forma general de trabajo. En el captulo 2 se trabaj sobre la lgica de programacin en abstracto (sin pensar en el cdigo). En este captulo abordaremos las reglas que debe cubrir la codificacin. Por qu estamos trabajando en la forma descrita? En algunos sentidos, codificar se asemeja a jugar un deporte. Se deben conocer las reglas que rigen el juego. No obstante, eso sera insuficiente sin

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

51 / 141

estrategias para ganar el partido y jugadas prefabricadas. La codificacin son las reglas; la lgica de programacin conforma la estrategia. Prosiguiendo con esta analoga, prcticamente nadie esperara poder jugar bien un deporte sin practicar cotidianamente. No obstante, un gran nmero de estudiantes aspira a aprender a programar estudiando dos das antes del examen. Adentrmonos, pues, en la lgica del compilador. Como ya se mencion, un programa (cdigo fuente) est escrito en un lenguaje de programacin que el compilador traducir a cdigo. Para lograr esa labor el compilador realiza algunas tareas: 1) Revisa que no se introduzcan elementos incorrectos en el programa. Por ejemplo: variables que no fueron declaradas previamente. 2) Revisa que las sentencias escritas estn construidas conforma a las reglas establecidas por el compilador. 3) Convierte el cdigo fuente a lenguaje mquina, enlazndolo previamente con las rutinas que se elaboraron por otros programadores y estn contenidas en las libreras correspondientes. Cada rutina es un subprograma que realiza una funcin especfica, puede o no recibir datos desde fuera de la rutina (llamados parmetros) y devolver o no algn. Cada librera rene rutinas de con un propsito en comn. Para usar estas rutinas se le debe avisar al compilador a travs de la palabra include, al inicio del programa . En la siguiente tabla se muestra una seleccin de algunas de las subrutinas precompiladas ms usuales en lenguaje C: Algunas subrutinas se encuentran en diferentes libreras, segn el compilador y la versin. Por lo comn basta poner stdio.h y conio.h para acceder a las rutinas de entrada-salida ms comunes (scanf, printf, getch). Existen rutinas que slo obedecen a determinados compiladores. Cabe destacar gotoxy y clrscr, que funcionan para Turbo C, de Borland, y no estn incluidos en Dev C++.

Reflexin 7-1. La frecuente confusin entre los compiladores de C y C++ Los compiladores de C++ estn preparados para programacin orientada a objetos, aunque pueden ejecutar los cdigos de lenguaje C. Las instrucciones cin y cout nicamente las tomar un compilador de C++. Por ello, muchas personas creen que al trabajar en un compilador de C++ estn utilizando programacin orientada a objetos. Estrictamente, se utiliza programacin orientada a objetos al emplear clases, encapsulamiento, herencia, polimorfismo y/o sobrecarga. Si slo se cambia el printf y scanf por cout y cin, respectivamente, se sigue en el paradigma de programacin estructurada.

La rutina principal: main Cabe aclarar que todo programa que se desee ejecutar de manera independiente debe tener al menos una rutina principal, que lleva el nombre de main. Suele variar el requerimiento en cuanto a la rutina

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

52 / 141

principal: main. Los siguientes casos cubren los compiladores que hemos tenido la oportunidad de probar.
main() { // sin return (usada en Dev C++) } void main() { // sin return } main() { return 0; } // en realidad puede ser cualquier valor entero

Reglas para los nombres de los identificadores Toda subrutina, variable y constante debe llevar un nombre irrepetible a lo largo del programa. Dicho nombre conocido como identificador- debe ser declarado antes de poder emplearse y es la forma en que el compilador ubica el elemento del cual se trata. Deben comenzar con una letra No deben tener espacios, guiones ni caracteres especiales (, acentos, etc.). Se admite el carcter de subrayado, aunque ya no es algo usual. Algunos lenguajes (C y Java, entre otros) hacen distincin de maysculas y minsculas, mientras que otros (Basic y SQL, entre otros) no lo toman en cuenta. Deben de ayudar a identificar el propsito de la variable o subrutina. En lenguaje C permanece la costumbre de manejar todo en minsculas. No obstante, en Java y tecnologa .NET se acostumbra la notacin de camello: la primera letra de cada palabra comienza con mayscula (excepto la primera). Por ejemplo: promedioGeneral.

En nuestro programa tenemos los siguientes identificadores: precio, descuento y preciofinal.

Comentarios Los comentarios son fragmentos del cdigo que orientan sobre aspectos que deben ser tomados en cuenta a futuro por el propio programador u otros programadores. Tambin sirven para dar mayor claridad al cdigo, orientar sobre la forma en que ste enlaza con los requerimientos y brindar informacin del contexto de desarrollo (Vg. versin del compilador empleado). En lenguaje C existen dos formas de comentarios: // a partir de aqu el resto de la lnea es un comentario /* esto es un comentario que puede abarcar varias lneas */ Un ejemplo de un comentario til podra ser el siguiente: /* el siguiente cdigo responde a modificaciones en las prestaciones de la empresa a partir del 1 de enero de 2011 */ Procure no emplear comentarios para situaciones que resultan obvias para quien maneja el lenguaje. El siguiente sera un comentario innecesario: s = ( a + b ) / 2; // s es el promedio de a y b

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

53 / 141

7.3 TIPOS DE DATOS


Todas las variables y constantes deben ser de un determinado tipo de datos. Estas consideraciones abarcan subrutinas, constantes y variables. Los ms usuales son: entero, decimal y carcter, que se identifican por int, float y char, respectivamente. En lenguaje C no existen directamente datos lgicos ni cadenas. Un tipo de datos define: a) el tipo de valores que se puede almacenar; b) el espacio y forma de almacenamiento; c) el tipo de operaciones que se pueden aplicar. En lenguaje C y Java, una declaracin especifica un tipo de dato y a continuacin una lista de una o ms variables de ese tipo. Opcionalmente, a cada una de ellas puede asignrsele un valor inicial. Por ejemplo: float suma = 0.0, promedio; En algunos casos es mejor dejar una variable por rengln para colocar comentarios pertinentes. float suma = 0.0; float promedio = 0.0; /* suma de las calificaciones semestrales */ /* promedio general del alumno */

En lenguaje C existen los siguientes tipos de datos bsicos int entero normal float decimal normal char carcter de un solo byte double decimal de doble precisin En lenguaje C y en todos los lenguajes de programacin cada constante y cada variable tiene un espacio fsico asignado dentro de la memoria temporal con un determinado nmero de bits, el cual queda distribuido en ciertos trminos prefijados. Rebasa los lmites del presente libro tratar la forma en que se almacenan los diferentes tipos de datos. No obstante, quien codifique debe tener en cuenta los lmites de las variables manejadas a fin de utilizar el formato adecuado.

Reflexin 7-2. Un nombre que no poda existir por un tipo de dato inadecuado En los primeros aos de este siglo los padres de una nia mexicana quisieron ponerle un nombre nhuatl (el nhuatl es el dialecto ms hablado en el pas, con antecedentes desde la poca prehispnica). La respuesta de las autoridades fue que escogieran otro nombre, pues el sistema no manejaba esos caracteres (por cierto, una de tantas formas de discriminacin que existen hacia los indgenas de Mxico). Los padres, en una mezcla de valenta y fueron apelando la decisin hasta llegar a la Suprema Corte de Justicia de la Nacin, quien por fin les dio la razn: deba modificarse el sistema. Ese caso se dio en un Sistema Manejador de Base de Datos, pero suelen darse situaciones semejantes en todos los lenguajes de programacin.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

54 / 141

A manera de ejemplo, explicaremos lo que sucede con el tipo de datos entero (int). En la mayora de los compiladores el tipo entero queda almacenado en 2 bytes o, lo que es lo mismo, 16 btis. Con 16 16 bits se pueden formar 2 combinaciones = 65536 combinaciones. Si esas combinaciones se dividen entre 2 quedan 32,768 negativos, el cero y 32,767 nmeros positivos. No puede haber nmero entero que salga de esos lmites si fue declarado de tipo int13. Aunque lenguaje C conserva la posibilidad de utilizar modificadores para ampliar o reducir el nmero de bytes asignados. Hay modificadores que se aplican a todos los tipos bsicos. Pueden combinarse los modificadores referentes al espacio con los referentes al signo. short long unsigned signed disminuye el espacio asignado al tipo de dato aumenta el espacio asignado al tipo de dato el tipo de dato trabajar nicamente con valores positivos el tipo de dato trabajar con valores positivos y negativos

Los modificadores signed y unsigned no cambian el espacio asignado. Los tipos de datos son signed por omisin. Los modificadores se pueden anteponer al tipo de dato (Vg.: un entero corto se indicar como short int). Si se utilizan para enteros, puede omitirse la palabra int. El tamao en bytes para short, normal y long vara de compilador a compilador. Lo nico seguro es que tamao de short <= tamao normal <= tamao long A continuacin se muestra una tabla donde se seala el nmero de bytes para cada tipo de dato, con 14 base en el estndar ANSI C :

Cuadro 7-1. Los tipos de datos en ANSI C Tipo Char unsigned char Int unsigned int short int long int unsigned long int Float Double long double Tamao aproximado en bits 8 8 16 16 16 32 32 32 64 128 Rango mnimo -128 a 127 0 a 255 -32768 a 32767 0 a 65535 Igual que int -2147483648 a 2147483647 0 a 4294967295 6 dgitos de precisin 10 dgitos de precisin 10 dgitos de precisin

Los datos de tipo float y double se pueden manejar mediante notacin cientfica. Es vlido asignar un valor como 123.456e-7 o bien 0.12E3 Las constantes long se escriben segn la forma 123L. Cualquier constante entera cuyo tamao se demasiado grande en una variable int se toma como long.15
Valide si esta situacin se cumple en su compilador. Puede darse que ocupa 4 bytes en lugar de 2, como en Dev C++. 14 Adaptado de: Schildt, Herbert; C. Manual de bolsillo. McGrawHill. Segunda edicin. Espaa, 1992. 15 Kernighan, Brian W.; Ritchie, Dennos M.; El lenguaje de programacin C; Prentice Hall; Mxico, 1986.
13

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

55 / 141

Para especificar un valor hexadecimal se comienza con 0x; para un valor octal, con cero. Como en el siguiente ejemplo:
int dec = 243; int hex = 0x80; int oct = 012 ; /* 243 en decimal. La notacin comn y corriente */ /* 128 en decimal */ /* 10 en decimal */

C no tiene algunos tipos de datos que s existen en otros lenguajes (como datos lgicos y cadenas), pero ofrece alternativas que pueden suplir estas carencias, las cuales se explicarn en su momento. A partir de los tipos de datos que el lenguaje proporciona se pueden hacer estructuras que los agrupan o combinan. Estas posibilidades se vern en los temas referentes a arreglos, registros (estructuras), uniones y apuntadores.

Entrada y salida de datos Las entradas y salidas de datos se hacen a travs de scanf y printf, respectivamente. El formato es similar al siguiente ejemplo: printf("El precio final es %4.1f", preciofinal); El %f seala que all se mostrar un valor, el cual se indicar despus del cierre de las comillas. .1 se refiere al nmero de decimales y 4 a los lugares que se reservarn para el despliegue el dato (incluyendo el punto decimal y la parte fraccionaria). Se utiliza una d para enteros, una c para carcter y una f para tipo flotante. Para leer la sintaxis es similar al ejemplo siguiente. Observe que en este caso el nombre de la variable va precedida por un amperson scanf("%f %f", &precio, &descuento); Es muy comn equivocarse en la sintaxis, sobre todo en el cierre de las comillas y el empleo de amperson. Las consecuencias en estos casos son impredecibles.

Conversiones de tipo En sentido estricto los tipos de datos de C lo que indican es el espacio que reservarn en la memoria, no un tipo de dato funcional. Dicho de otra forma, un char no es un caracter propiamente, sino un byte; puede ser desplegado como un caracter o como un dato numrico. Esta posibilidad es uno de los mayores atractivos de C -y uno de los mayores dolores de cabeza. Es responsabilidad del programador indicar adecuadamente los tipos de datos en las entradas y salidas. El programa siguiente maneja una variable de tipo caracter y la despliega como un entero. El programa se ejecuta y muestra el valor que corresponde a ese caracter, conforme el cdigo ASCII (para la A es 65). #include <conio.h> main() { char letra; letra = 'A'; printf("Desplegar la <A>: %6d", letra); printf("\n\nOprima cualquier tecla para continuar..."); getch(); }

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

56 / 141

Los lenguajes de programacin hacen conversiones automticas de tipos de datos bajo reglas predeterminadas. Cuando se combinan diferentes tipos de datos en una expresin numrica, el de tipo inferior es ascendido al de tipo superior y el resultado se deposita internamente en un tipo superior. Por ejemplo: la suma de un nmero entero y un nmero decimal se almacenar automticamente en la memoria de la mquina como un nmero decimal; char y short se convierten en int, int se convierte en long y float se convierte en double. A manera de ejemplo, el resultado del siguiente programa es 2.0, debido a que el resultado de 7/3 es almacenado internamente en una variable de tipo entero (un tipo entero entre un tipo entero se almacena en un tipo entero). Esa variable interna de tipo entero que ya no tiene decimales- es asignada a aux. #include <conio.h> main() { float aux = 7/3; printf("El resultado de 7/3 es %f", aux); printf("\n\n Oprima cualquier tecla para terminar..."); getch(); } La solucin ms sencilla es que alguno de los nmeros se expresa como variable de tipo decimal, puesto que un nmero entero entre un decimal se almacenar internamente en una variable decimal. Es decir: aux = 7 / 3.0. Claro est, esta solucin no aplicara si en lugar de expresiones indicadas directamente se tuvieran variables. En este caso se aplicara una coercin de tipos, cuya sintaxis es (tipoDeDato) (expresin a convertir). La lnea en cuestin quedara de la siguiente forma:
aux = (float) a / b; /* a y b son variables de tipo entero */

Reflexin 7-3. Hacia la portabilidad del cdigo Nunca asuma que el lenguaje har las conversiones necesarias entre los tipos de datos manejados, incluso en los casos en que no marque ningn error. Asegrese que as sea y en caso necesario- hgalo de manera explcita.

Tipos de datos en otros lenguajes de programacin Los tipos de datos ms comunes en los lenguajes de programacin son entero, decimal, carcter, cadena de caracteres y lgico. Otros tipos de datos se fueron incorporando conforme surgan nuevas necesidades, sobre todo en relacin a lenguajes de programacin para ambientes visuales y sistemas manejadores de bases de datos: tiempo, fecha, grfico, video y musical, entre otros. Un lenguaje de programacin o un Sistema Manejador de Base de Datos permiten variantes entre los tipos de datos, que afectan al rango de valores que se pueden guardar o a la precisin de stos. Por ejemplo: un entero normal en muchos compiladores abarca del -32768 al +32767 y ocupa 2 bytes de memoria, mientras un entero corto va del -128 al +127 y abarca un solo byte. En otros casos estas diferencias se deben a formatos manejados por diferentes proveedores o diseos ms eficientes, como el caso de los distintos formatos para guardar imgenes (BMP, GIF, etc.).

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

57 / 141

Declaracin implcita y explcita En algunos lenguajes (como C o Java) tienen que declararse antes de ser usadas; en otros, como BASIC, el compilador detecta a una nueva variable y la declara por si misma. En apariencia, pareciera que la segunda opcin es menos engorrosa, pero en realidad trae ms trabajo. Imagine la siguiente instruccin: numeroDeAlumnoos = numeroDeAlumnos + 1 Casi es seguro que el programador se refiere a la misma variable, pero la escribi mal. Si fuera BASIC, asumira que es una nueva variable y las consecuencias seran impredecibles. Para evitar errores como el anterior se prefiere siempre que el compilador obligue a declarar las variables e indique un error cuando se intenten utilizar una variable no declarada.

3.4 Sentencias y operadores


Todos los lenguajes de programacin manejan operadores de tipo numrico, lgicos, para manejo de cadena de caracteres y, muy posiblemente de otro tipo, cada uno de ellos con una funcin especfica. Algunos son operadores nativos del lenguaje y otros forman parte de sus bibliotecas. Todos los operadores se rigen por reglas de prioridad. De hecho, por las reglas de prioridad matemticas que conocemos desde siempre, aplicables tambin en lgebra y hojas de clculo. Cabe aclarar que en programacin la multiplicacin se identifica a travs de un asterisco (*). La expresin 3 + 4 * 2 dar como resultado 11, porque por regla de prioridad la multiplicacin se debe hacer primero. Cuando dos operadores tienen igual prioridad, las operaciones se ejecutan de izquierda a derecha en el caso de operadores numricos. En el ejemplo de este captulo est una expresin basada en reglas de prioridad:
preciofinal = (precio - precio * descuento / 100);

El orden de evaluacin es el siguiente: a) b) c) d) Primero se ejecuta precio * descuento El resultado se divide entre 100 Se realiza precio menos lo obtenido de los dos incisos anteriores El valor de los tres pasos se asigna a preciofinal

Reflexin 7-4. Reglas de prioridad en la calculadora de Windows La calculadora de Windows en versin cientfica respeta las reglas de prioridad, mientras que en modo estndar no las toma en cuenta. La multiplicacin se indica por el operador *, el cual es de uso obligado. La expresin 4ac 4(a)(c) no son vlidas en programacin. Lo correcto es: 4 * a * c. Los parntesis permiten agrupar operaciones que deben hacerse primero igual que en matemticas. En ocasiones se colocan por otros dos motivos: a) mejoran la claridad del cdigo; b) el programador no se acordaba de las reglas de prioridad y para asegurarse los puso. Son motivos vlidos. Sin embargo, no abuse del uso de parntesis, porque su instruccin puede hacerse ms difcil de entender.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

58 / 141

El uso de espacios entre datos y operadores es optativo. El programa ejecutar correctamente 4*a*c 4 * a * c. Recomendamos dejar un espacio entre cada operador y dato. En general, el programa se hace ms sencillo de leer y la vista se cansa menos. Al usar operadores debe tenerse cuidado con la combinacin de tipos de datos. Sera ilgico aplicar una operacin de multiplicacin entre un caracter y un entero. La mayora de lenguajes marcar un error al compilar. No obstante, algunos como lenguaje C- s realizarn la operacin. El resultado por lo comn ser absurdo. En cuanto a los operadores de condicin, no existe una regla que seale el orden de evaluacin y eso en ocasiones trae errores de programacin. Imagine la siguiente condicin:
si (no se ha llegado al final del archivo) y (el empleado est activo)

En este caso basta con que una de las dos condiciones sea falsa para que toda la operacin sea falsa. De hecho, si la primera es falsa no es posible evaluar la segunda. Pero no podemos dar por sentado que el compilador es inteligente. En trminos prcticos: no ponga dos condiciones si, cuando una de ellas es falsa, ya no es posible valuar la segunda. La solucin al problema anterior consiste en separar las condiciones:
si (no se ha llegado al final del archivo) si (el empleado est activo)

C dispone de los operadores tpicos de un lenguaje de programacin: suma, resta, multiplicacin, divisin, etc. Adicionalmente posee dos operadores: incremento en uno (++) y decremento en uno (--). Estos operadores pueden emplearse como prefijos (antes de la variable) o como sufijos (despus de la variable), segn si su valor se incremente antes o despus de usarse. Cuando la instruccin est sola no hay diferencia, pero en combinacin con otras instrucciones puede dar diferentes resultados. Por ejemplo: suponga que n vale 5. x = n++; pone un 5 en x, pero x = ++n; coloca un 6 en x. En ambos casos, n vale finalmente 6. Las expresiones de asignacin abreviadas de C son muy tiles. En estos casos debe tenerse presente que la asignacin relaciona a la variable con toda la parte derecha de la expresin. x *= y + 1 es equivalente a x = x * ( y + 1) y no a x = x * y + 1 Este tipo de operadores son ms fciles de entender si se leen coloquialmente. x += 2; interpretarse como smale 2 a x. debe

Lista de operadores en C
C tiene una gama de operadores bastante grande y proporciona una gran libertad al programador. Por lo mismo, es indispensable tener un cuidado especial con la prioridad y significado de los operadores. La lista completa de los operadores de C (sin funciones de biblioteca) es la siguiente: Cuadro 7-2. Los operadores en ANSI C y su priorodad Tipo campos de registros campos de Operador Significado -> . campo de un registro campo de un registro Prioridad 14 14

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

59 / 141

registros ndice de arreglos Parntesis a nivel de bits Apuntadores Apuntadores Aritmtico Aritmtico conversin de tipos espacio en bytes lgico aritmtico aritmtico aritmtico aritmtico aritmtico a nivel de bits a nivel de bits de comparacin de comparacin de comparacin de comparacin de comparacin de comparacin a nivel de bits a nivel de bits a nivel de bits lgico lgico de asignacin de asignacin de asignacin

[] () ~ & * -++ (tipo) sizeof ! / * % + >> << <= > <= < != == & ^ | && || ?: %= &=

ndice de un arreglo agrupa expresiones que deben valuarse primero complemento a uno enva la direccin que apunta a una variable usa la direccin que apunta a una variable decremento en 1 de una variable incremento en 1 de una variable conversin de tipos clculo del espacio necesario en bytes negacin (NOT) divisin multiplicacin residuo de una divisin entera Resta Suma desplazamiento a la derecha desplazamiento a la izquierda mayor o igual que mayor que menor o igual que menor que es diferente a? es igual que? y (AND) a nivel de bits O exclusiva (XOR) a nivel de bits O (OR) a nivel de bits y lgico (AND) lgico (OR) asignacin condicional asigna a la variable el residuo de su valor actual con la expresin indicada asigna a la variable su valor actual con un AND a nivel bits de la expresin indicada asigna a la variable su valor actual con un desplazamiento a la derecha de los lugares que seala la expresin indicada asigna a la variable su valor actual con un desplazamiento a la izquierda de los lugares que seala la expresin indicada asigna a la variable su valor actual con un OR a nivel bits de la expresin indicada asigna a la variable su valor actual con un XOR a nivel bits de la expresin indicada asigna a la variable su valor actual dividido con la expresin indicada asigna a la variable su valor actual multiplicado con la expresin indicada

14 14 13 13 13 13 13 13 13 13 12 12 12 11 11 10 10 9 9 9 9 8 8 7 6 5 4 3 2 1 1

de asignacin

>>=

de asignacin de asignacin de asignacin de asignacin de asignacin

<<= |= ^= /= *=

1 1 1 1 1

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

60 / 141

de asignacin de asignacin de asignacin

-= += =

asigna a la variable su valor actual restado con la expresin indicada asigna a la variable su valor actual sumado con la expresin indicada Asignacin

1 1 1

En su momento, se vern a detalle la mayora de los operadores aqu expresados. El siguiente programa ejemplifica el empleo de operadores aritmticos:
#include <conio.h> main() { int r = 8, s = 3; printf("Partimos de r = 8 y s = 5\n\n"); r += s + 7 * 2; printf("Aplicamos r += s + 7 * 2. Ahora r = %d\n\n", r); s = r % 8; printf("Dividimos r entre 8. El residuo lo ponemos en s. Ahora s = %d\n\n", s); s++; printf("Sumamos 1 a s. Ahora s = %d\n\n", s); printf("La divisin entera entre r y s es... %d\n\n", r/s); printf("Preguntamos si r >= s... %d\n", r >= s); printf(" (recuerde que si el resultado es verdadero devuelve el valor de 1)"); printf("\n\nOprima cualquier tecla para continuar..."); getch(); }

Existen subrutinas que estn en las bibliotecas de lenguaje C y que en la prctica- actan como si fueran operadores, entre ellas la raz cuadrada. Para emplear estas subrutinas es necesario revisar su sintaxis y la biblioteca a la cual pertenecen. La raz cuadrada (sqrt) devuelve la raz cuadrada de un nmero mayor o igual que cero. Tiene la siguiente cabecera: #include maht.h double sqrt (double num); A continuacin un programa que ejemplifica su uso: #include <conio.h> #include <math.h> main() { double x = 10.0; printf("La raz cuadrada de 10 es %6.2f\n", sqrt(x)); printf("\n\nOprima cualquier tecla para continuar..."); getch(); }

3.5 Sala de cdigo en primeros auxilios


Una persona transcribi los siguientes programas de una fuente fidedigna y pudo comprobar que corran adecuadamente: cumplen con el requerimiento y la lgica de programacin es adecuada. No obstante, cometi varios errores al transcribirlos: errores de dedo, alguna lnea omitida o la modificacin inadvertida de algn. Podra ayudarlo a que corrieran adecuadamente? (seguramente todos ellos le resultarn conocidos). Sugerencia: primero trate de ubicar las equivocaciones en papel. Posteriormente, transcriba el cdigo y verifique si logr ubicar todas las fallas.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

61 / 141

// Programa que calcula el descuento de un producto. #include <conio.h> #include <studio.h> main() { float precio, descuento, preciofinal; printf("Bienvenido.\n\n"); printf("Este programa le ayuda a calcular el precio "); printf("con descuento de un producto.\n"); printf("Teclee el precio normal y su porcentaje de descuento.\n"); scanf("%f %f", precio, descuento); preciofinal = (precio - precio * descuento / 100); printf("El precio final es %4.1f", preciofinal); printf("\n\n Oprima cualquier tecla para terminar..."); getch(); }

#include <conio.h> main() { float aux = 7/3; printf("El resultado de 7/3 a un decimal es %5.1f", aux); printf("\n\n Oprima cualquier tecla para terminar..."); getch(); }

/* Programa que recibe 2 datos y devuelve su promedio. #include <conio.h> #include <stdio.h> main() { float dato1, dato2, prommedio; printf("Bienvenido.\n\n"); printf("Este programa obtiene el promedio de dos numeros.\n"); printf("Teclee sus datos separados por un espacio.\n"); scanf("%f %f", &dato1, &dato2); promedio = dato1 + dato2 / 2; printf("El promedio es%4.1f", promedio); }

include <conio.h> include <stdio.h> Main() { Printf("Hola mundo."); Getch(); }

// y nos volvemos a ver

7.5. Ejercicios para practicar codificacin


A continuacin, algunos ejercicios para practicar la codificacin, an sin utilizar condicionales ni ciclos.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

62 / 141

o o

Hacer un programa que despliegue al azar un nmero del 1 al 6, simulando la tirada de un dado. Hacer un programa que despliegue al azar un nmero del 2 al 12, simulando la tirada de dos dados. Hacer un programa que capture el monto a entregar por un cajero automtico, que tiene billetes de 500, 100 y 20 pesos, adems de monedas de 5 y 1 (las denominaciones no cambian). El cajero debe determinar las cantidades a entregar de cada denominacin, conforme la pantalla siguiente: Bienvenido a su cajero La amabilidad ante todo. Qu cantidad desea recibir? 528 Le entregamos billetes: 1 de 500 0 de 100 1 de 20 y monedas: 1 de 5 3 de 1 Gracias! Oprima cualquier tecla para salir

Hacer un programa que lea una letra y despliegue aqulla que se encuentra tres lugares adelante en el alfabeto (segn el cdigo ASCII). Hacer un programa que lea un nmero entero y entregue ese nmero elevado a la cuarta potencia. El programa debe admitir como resultado cifras que pueden llegar hasta mil millones. Cuando se llega a este cdigo a, b y c estn definidos como enteros. Antes de la lnea 1 las variables a, b y c tienen los valores de 7, 8 y 9, respectivamente: 1 2 3 4 5 6 mayor = a; if (b > a) && (b > c) mayor = a; if (c > a) && (c > b) mayor = c; printf("El resultado es: %d\n", mayor);

a) Indique el resultado de la siguiente trada segn la lgica del algoritmo: Datos de prueba 7 8 9 8 9 8 8 9 9 Resultado

b) Realice los cambios que juzgue pertinentes para que el programa corra correctamente. Tambin corrija posibles errores de sintaxis (slo hay errores en algunas lneas): Nmero de lnea Correccin

Realizar un programa que lea tres calificaciones, despliegue el promedio final y diga si el alumno aprob o no. La calificacin final ser el promedio ponderado de las 3 calificaciones, las cuales valen 20%, 30% y 50%, respectivamente. La calificacin mnima aprobatoria es 8.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

63 / 141

CONDICIONALES EN LENGUAJE C
CONTENIDO
El concepto de condicional Los errores ms comunes en el uso de if El uso de condiciones mltiples con base en un valor (case) Ejercicios de condicionales en lenguaje C

EL CONCEPTO DE CONDICIONAL

(Indice)

Todas las condiciones preguntan acerca de una condicin (if). Una respuesta afirmativa provocar que se realice el bloque de instrucciones indicada; en caso contrario se realiza un segundo bloque de instrucciones. El primer bloque de instrucciones es obligatorio, mientras el segundo es opcional. Para indicar el inicio y final de cada bloque se emplean llaves; dichas llaves pueden omitirse si el bloque est compuesto por una sola instruccin. En pseudocdigo se expresara de la siguiente forma: si (condicin) bloque 1 de instrucciones en caso contrario bloque 2 de instrucciones termina si Un diagrama de flujo los identificara como sigue:

no (opcional)

instrucciones

instrucciones

A manera de ejemplo, suponga que se desea recibir tres calificaciones, desplegar el promedio e indicar si la calificacin es o no es aprobatoria. La calificacin mnima aprobatoria es 8. El pseudocdigo quedara como sigue: declarar a, b,c y promedio como decimales desplegar Por favor, teclee sus tres calificaciones leer a, b y c promedio = (a + b + c) / 3 desplegar El promedio es

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

64 / 141

desplegar promedio si promedio >= 8 desplegar APROBADO en caso contrario desplegar REPROBADO termina si El cdigo quedara como sigue (es obligatorio que la condicin vaya entre parntesis): #include <conio.h> main(void) { int a, b, c; float promedio; printf("Por favor, teclee sus tres calificaciones: "); scanf("%d %d %d", &a, &b, &c); promedio = (a + b + c) / 3; printf("El promedio es: %6.1f", promedio); if (promedio >=8) printf(" APROBADO"); else printf(" REPROBADO"); printf("\nOprime cualquier tecla.."); getch(); } Las condicionales se pueden escribir de manera anidada, como en el siguiente ejemplo (hay que tener especial cuidado con la anidacin): #include <conio.h> main(void) { int a, b, c; float promedio; printf("Por favor, teclee sus tres calificaciones: "); scanf("%d %d %d", &a, &b, &c); promedio = (a + b + c) / 3; printf("El promedio es: %6.1f", promedio); if (promedio == 10) printf(" EXCELENTE"); else if (promedio >= 8) { printf(" MUY BIEN. "); printf("FELICITACIONES."); } else printf(" REPROBADO"); printf("\nOprime cualquier tecla.."); getch(); } En estos casos debe tenerse especial cuidado en la alineacin del cdigo.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

65 / 141

LOS ERRORES MS COMUNES EN EL USO DEL IF

(Indice)

El uso de condicionales es sencillo. Sin embargo, existen errores relativamente comunes que conviene prevenir:

Cuidar el alcance de los bloques En todo momento se debe tener presente que los bloques quedan delimitados por las llaves. Si stas no se colocan se asume el bloque abarca una sola instruccin. Como ejemplo, observe el siguiente cdigo: #include <conio.h> #include <stdio.h> main () { int x; x = 8; if (x >= 6) printf("Aprobado.\n"); else printf("Reprobado.\n"); printf("A estudiar ms.\n"); printf("\nOprime cualquier tecla para continuar..."); getch(); } La frase A estudiar ms se desplegar siempre. El programa asume a falta de llaves- que el else abarca slo a una instruccin. La correccin sera como sigue: else { printf("Reprobado.\n"); printf("A estudiar ms.\n"); }

Utilizar el operador de asignacin (=) en lugar del de comparacin (==) Es muy comn que en las condiciones se requiera comparar una variable o una operacin con un valor determinado, Por ejemplo: si x es igual a 8. En este caso hay que recordar que el operador de comparacin es ==. Observe el siguiente cdigo: #include <stdio.h> #include <conio.h> main () { int opcion; printf("Bienvenido al cine.\n\n"); printf("1) Amores Perros\n"); printf("2) Babel\n"); printf("\nElija una opcin: "); scanf("%d", &opcion);

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

66 / 141

if (opcion = 1) printf("\nUsted desea ver Amores Perros"); else printf("\nUsted desea ver Babel"); printf("\n\nOprima cualquier tecla para continuar..."); getch(); } En este programa siempre aparecer el letrero Usted desea ver Amores Perros. La razn es la siguiente: la instruccin if (opcion = 1) indica que se asigne un 1 a la variable opcin, si esto es posible (lo cual es obvio en este caso), se desplegar Usted desea ver Amores Perros. La instruccin en realidad se debi haber manejado como if (opcion == 1). Este error es tan comn y tan difcil de rastrear que el lenguaje Java (basado en la sintaxis de C) ya no permite la instruccin if (opcion = 1).

EL USO DE CONDICIONES MLTIPLES CON BASE EN UN VALOR (CASE)

(Indice)

Es muy comn que en diversas ocasiones se tenga que seleccionar alguna opcin con base en un valor determinado. Por ejemplo, desplegar el nombre del mes. Esto podra realizarse a travs de condicionales anidados, como en el siguiente programa, que despliega el nmero de das que tiene un mes determinado (recuerde que febrero es bisiesto si el ao es divisible entre 4 excepto aqullos que sean divisibles entre 100; pero si es divisible entre 400 s se trata de un ao bisiesto). #include <conio.h> main(void) { int ano,mes; printf("Programa que dependiendo del da y mes despliega cuantods das tiene el mes.\n"); printf("Dame el nmero del ao: \n"); scanf("%d",&ano); printf("Dame el nmero del mes: \n"); scanf("%d", &mes); if ((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12)) printf("El mes tiene 31 das."); else if (mes==2) { if ( (ano%4==0) && ( (ano%400==0) || !(ano%100==0) ) ) if ((ano%100==0) && !(ano%400==0)) printf("El mes tiene 28 das."); else printf("El mes tiene 29 das."); else printf("El mes tiene 28 das."); } else if ((mes==4)||(mes==6)||(mes==9)||(mes==11)) printf("\nEl mes tiene 30 das."); printf("\nOprime cualquier tecla..");

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

67 / 141

getch(); } Como se puede observar, los das del mes dependen del valor de la variable mes y, en el caso de febrero, del ao. Aunque el programa trabaja correctamente resulta confuso de leer. Por ello en este tipo de casos, se prefiere la instruccin switch, que es una forma de if abreviado. Su sintaxis es la siguiente: switch (variable) case valor: {bloque de instrucciones} break; // el break es opcional /* pueden repetirse tantos case como se deseen */ default: {bloque de instrucciones} El break indica que ya no siga explorando los siguientes casos. En la mayora de los casos se desea un break para cada opcin, pero en otras situaciones es deseable que adems de lo realizado en el caso anterior- se realicen otras instrucciones, en cuyo caso no se coloca ningn break en la opcin que est finalizando. El programa finalmente, quedara como sigue:

#include <conio.h> main(void) { int ano,mes; printf("Programa que despliega cuantos das tiene un mes.\n"); printf("Dame el ao: \n"); scanf("%d",&ano); printf("Dame el mes: \n"); scanf("%d", &mes); switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: printf("El mes tiene 31 das"); break; case 4: case 6: case 9: case 11: printf("El mes tiene 30 das"); break; case 2: if (ano%4==0) if ((ano%100==0) && !(ano%400==0)) printf("El mes tiene 28 das"); else printf("El mes tiene 29 das"); else printf("El mes tiene 28 das"); break;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

68 / 141

default: printf("Mes no vlido.\n"); } printf("\n\nOprime cualquier tecla.."); getch(); }

EJERCICIOS DE CONDICIONALES EN LENGUAJE C


Qu desplegara el siguiente cdigo tal y como est escrito? #include <conio.h> #include <stdio.h> main () { int x; x = 8; if (x >= 6) printf("Aprobado.\n"); else printf("Reprobado.\n"); printf("A estudiar ms.\n"); printf("\nOprime cualquier tecla para continuar..."); getch(); }

(Indice)

Pruebe y corrija el siguiente programa: #include <stdio.h> #include <conio.h> main () { int opcion; printf("Bienvenido al cine.\n\n"); printf("1) Amores Perros\n"); printf("2) Babel\n"); printf("\nElija una opcin: "); scanf("%d", &opcion); if (opcion = 1) printf("\nUsted desea ver Amores Perros"); else printf("\nUsted desea ver Babel"); printf("\n\nOprima cualquier tecla para continuar..."); getch(); }

Realice un programa que obtenga el promedio entero de 3 calificaciones. Se redondea al entero ms cercano si el promedio es mnimo de 6. En caso contrario, la calificacin bajar al entero inferior.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

69 / 141

Un trabajador gana $30.00 por hora. Las horas extras en un da se pagan dobles hasta la tercera hora. A partir de all se pagan triples. Realice un programa que lea el nmero de horas extras y despliegue el pago correspondiente a dichas horas. Dado el siguiente cdigo: 1 2 3 4 5 6 mayor = b; if ((b > a) && (b > c)) mayor = b; if ((c > a) && (c > b)) mayor = c; printf("El resultado es: %d\n", mayor);

a) Indique el resultado de la tradas sealadas a continuacin, tal y como est escrito (valor=2 puntos): Datos de prueba 7 8 9 8 9 8 8 9 9 9 8 7 Resultado

Realice un programa que reciba los 3 lados de un tringulo e indique si es equiltero (tres lados iguales), issceles (dos lados iguales) o escaleno (tres lados diferentes).
Realice un programa que reciba dos datos enteros: el da y el mes. Con base en ellos despliegue el da y el mes con el formato: 19 de diciembre. Nota: requiere utilizar la sentencia switch.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

70 / 141

CICLOS EN LENGUAJE C
CONTENIDO
Tipos de ciclos El ciclo while El ciclo for El ciclo do-while Cuando usar cada tipo de ciclo Ejercicios de ciclos en lenguaje C
(Indice)

TIPOS DE CICLOS

(Indice)

En lenguaje C todos los ciclos indican que un determinado bloque de instrucciones se repita mientras se cumpla determinada condicin. Existen tres tipos: while.- la condicin se coloca al principio y se ejecuta el boque de instrucciones mientras se cumpla la condicin. do-while.- la condicin se coloca al final y se ejecuta el boque de instrucciones mientras se cumpla la condicin. for.- la condicin se coloca al principio y se ejecuta el bloque de instrucciones mientras se cumpla la condicin. Su sintaxis es diferente a la del while, pero su funcionalidad es equivalente.

EL CICLO WHILE

(Indice)

En el while se repite un bloque de instrucciones mientras se cumple una determinada condicin. La condicin se verifica al inicio. En resumen: mientras (condicin) bloque de instrucciones termina mientras Su diagrama es como sigue:

no

instrucciones

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

71 / 141

Hay que hacer hincapi que la condicin significa mientras que. Una condicin que siempre se cumpla generara un ciclo infinito. Por el contrario, una condicin que nunca se cumpla implicara que no se ejecutaran las instrucciones del cuerpo del ciclo ni una sola vez. Un error muy frecuente es no identificar claramente aquello que es repetitivo (va a ir dentro del ciclo) con lo que debe hacerse una sola vez antes o despus del ciclo (debe ir fuera del ciclo). El resultado de este error suele dar resultados equivocados o generar ciclos infinitos. A manera de ejemplo, suponga que desea obtener el promedio de varios nmeros proporcionados por el usuario. La pantalla que desea es similar a la siguiente.

Este programa obtiene el promedio de calificaciones. Cuntas calificaciones se van a introducir? 3 Capture las calificaciones, por favor. 8 9 10 El promedio es 9.00 Oprima cualquier tecla para terminar... Qu debe ir dentro del ciclo (color amarillo)? Resulta obvio que la lectura de las calificaciones. Como el valor de una variable se pierde al recibir un segundo valor, entonces se requiere ir sumando las calificaciones en otra variable. Las dems partes del programa irn fuera del ciclo. El cdigo finalmente quedara como sigue:

#include <conio.h> main() { int i, n; float suma = 0.0, promedio, dato; printf ("Este programa obtiene el promedio de calificaciones.\n"); printf ("Cuntas calificaciones se van a introducir?\n"); scanf("%d",&n); if (n > 0) { printf("Capture las calificaciones, por favor.\n"); i = 1; while (i <= n) { scanf("%f", &dato); suma += dato; i++; } promedio = suma / n; printf("El promedio es: %5.2f\n", promedio); } else printf("No puedo sacar el promedio de 0 calificaciones.\n"); printf("\nOprima cualquier tecla para terminar...\n"); getch(); }

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

72 / 141

EL CICLO FOR

(Indice)

En lenguaje C, en realidad el ciclo for es otra forma de expresar la misma funcionalidad que el ciclo while (por lo cual su diagrama es el mismo). Sin embargo, en otros lenguajes su sintaxis les permite nicamente hacer un ciclo cuando ya se conoce exactamente el nmero de veces que se repetir algo. Su sintaxis es la siguiente: for (sentencias antes del ciclo; condicin; ltimas sentencias a repetir) Como ejemplo de for, un programa que despliegue 4 veces hola:

#include <conio.h> main() { int i; printf(Este programa ejemplifica un for desplegando 4 veces hola); for (i=0; i<4; i++) printf(hola); printf("\nOprima cualquier tecla para terminar...\n"); getch(); } El ejemplo desarrollado anteriormente quedara como sigue: #include <conio.h> main() { int i, n; float suma = 0.0, promedio, dato; printf ("Este programa obtiene el promedio de calificaciones.\n"); printf ("Cuntas calificaciones se van a introducir?\n"); scanf("%d",&n); if (n > 0) { printf("Capture las calificaciones, por favor.\n"); for (i=1; i <= n; i++) { scanf("%f", &dato); suma += dato; } promedio = suma / n; printf("El promedio es: %5.2f\n", promedio); } else printf("No puedo sacar el promedio de 0 calificaciones.\n"); printf("\nOprima cualquier tecla para terminar...\n"); getch(); } El siguiente cuadro resume las diferencias entre ambos programas: Caso while i = 1; while (i <= n) { scanf("%f", &dato); Caso for for (i=1; i <= n; i++) { scanf("%f", &dato);

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

73 / 141

suma += dato; i++; }

suma += dato; }

EL CICLO DO-WHILE

(Indice)

Tanto el while como el for validan la condicin antes de ejecutar el bloque de instrucciones la primera vez, con lo cual abren la posibilidad de que dicho bloque de instrucciones no se ejecute ni una sola vez. El do-while valida la condicin al final, por lo cual existe la garanta de que al menos se ejecuta una vez dicho bloque de instrucciones. En los tres casos, se seguir repitiendo mientras que la condicin se cumpla. La estructura del do-while queda como sigue: realiza bloque de instrucciones mientras (condicin)

instrucciones

no
Usando el ejemplo anterior, tendramos: #include <conio.h> main() { int i, n; float suma = 0.0, promedio, dato; printf ("Este programa obtiene el promedio de calificaciones.\n"); printf ("Cuntas calificaciones se van a introducir?\n"); scanf("%d",&n); if (n > 0) { printf("Capture las calificaciones, por favor.\n"); i=1; do { scanf("%f", &dato); suma += dato; i++; } while (i<=n); promedio = suma / n; printf("El promedio es: %5.2f\n", promedio); } else

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

74 / 141

printf("No puedo sacar el promedio de 0 calificaciones.\n"); printf("\nOprima cualquier tecla para terminar...\n"); getch(); }

CUANDO USAR CADA TIPO DE CICLO

(Indice)

En muchas ocasiones un problema puede resolverse por cualquiera de los tres ciclos existentes y prcticamente es decisin del programador cual utilizar. Sin embargo, conviene recalcar algunos puntos para facilitar su seleccin: En todos los lenguajes, el while puede hacer lo que realice el for y el do-while. Especficamente en lenguaje C y Java, el for tiene la potencialidad de un while. Aunque el for es tan potente como el while, se recomienda usarlo solamente cuando se conoce exactamente el nmero de veces que se va a repetir un bloque de instrucciones. Aplicarlo a otras situaciones traer como consecuencia cdigos confusos. En el do-while, el bloque de instrucciones al menos se ejecuta una vez.

El ejemplo anterior se prestaba, de una u otra manera, para todos los tipos de ciclos. Ahora suponga que el requerimiento cambia al siguiente:

Este programa obtiene el promedio de calificaciones. Capture -1 para terminar. as calificaciones, por favor. 8 9 10 -1 El promedio es 9.00 Oprima cualquier tecla para terminar... El cdigo utilizando un while queda como sigue: #include <conio.h> main() { int i; float suma = 0.0, promedio, dato; printf ("Este programa obtiene el promedio de calificaciones. Capture -1 para terminar.\n"); i = 0; scanf ("%f", &dato); while (dato >= 0) { suma+=dato; i++; scanf("%f",&dato); } if (i > 0) { promedio = suma / i; printf("El promedio es: %5.2f\n", promedio); } else

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

75 / 141

printf("No es posible obtener el promedio si no teclea nmero."); printf("\n\nOprima cualquier tecla para terminar...\n"); getch(); }

ningn

Como ya mencion, se puede realizar ese mismo programa con un for, pero el cdigo pierde claridad, independientemente de cmo quede. A continuacin, una de las distintas posibilidades: #include <conio.h> main() { float suma = 0.0, promedio, dato; int i; printf ("Este programa obtiene el promedio de calificaciones. Capture -1 para terminar.\n"); i = 0; for ( ; dato >= 0 ; ) { scanf("%f", &dato); if (dato >= 0) { suma += dato; i++; } } if (i > 0) { promedio = suma / i; printf("El promedio es: %5.2f\n", promedio); } else printf ("No se proporcion ninguna calificacin.\n"); printf ("\nOprima cualquier tecla para terminar...\n"); getch(); }

EJERCICIOS DE CICLOS EN LENGUAJE C


Realice un programa que despliegue 4 veces hola utilizando: a) while; b) for; c) do-while. Cmo obtendra el siguiente despliegue? Cuntas veces deseas desplegar hola? 3 hola hola hola Cmo obtendra el siguiente despliegue? hola hola hola a todos a todos a todos Cmo obtendra el siguiente despliegue? hola a todos a todos a todos hola a todos

(Indice)

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

76 / 141

a todos a todos Cmo obtendra el siguiente despliegue? Cuntas veces deseas desplegar hola? 3 Cuntas veces deseas a todos? 2 hola a todos a todos hola a todos a todos hola a todos a todos Transforme el siguiente cdigo a un for (1 punto) i = 0; while (i<5) { printf(hola); i++; } Corrija el siguiente programa sin tener a la vista el programa correcto. #include <stdio.h> #include <conio.h> main () { float suma, dato, promedio; int numDatos, i; printf("Este programa despliega el promedio de varios nmeros.\n\n"); printf("Indique la cantidad de nmeros: "); scanf("%d", &numDatos); i = 1; suma = 0.0; printf("Teclee los datos:\n "); while (i < numDatos) { scanf("%f", &dato); suma += dato; i++; promedio = suma / numDatos; printf("El promedio es: %6.1f\n", promedio); } printf("\n\nOprima cualquier tecla para continuar..."); getch(); } Corrija el siguiente programa sin tener a la vista el programa correcto #include <stdio.h> #include <conio.h> main () { float suma, dato, promedio; int numDatos, i; printf("Este programa despliega el promedio de varios nmeros.\n\n"); printf("Indique la cantidad de nmeros: ");

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

77 / 141

scanf("%d", &numDatos); printf("Teclee los datos:\n "); while (i < numDatos) { scanf("%f", &dato); suma += dato; i++; } promedio = suma / numDatos; printf("El promedio es: %6.1f\n", promedio); printf("\n\nOprima cualquier tecla para continuar..."); getch(); } Corrija el siguiente programa sin tener a la vista el programa correcto #include <stdio.h> #include <conio.h> main () { float suma, dato, promedio; int numDatos, i; printf("Este programa despliega el promedio de varios nmeros.\n\n"); printf("Indique la cantidad de nmeros: "); scanf("%d", &numDatos); printf("Teclee los datos:\n "); for (i=1; i==numDatos; i++) { scanf("%f", &dato); suma += dato; } promedio = suma / numDatos; printf("El promedio es: %6.1f\n", promedio); printf("\n\nOprima cualquier tecla para continuar..."); getch(); } El siguiente programa pretende obtener el promedio de 4 nmeros. Analcelo e indique lo que desplegara en pantalla al ejecutarlo suponiendo que cuando el programa pide Teclee los datos el usuario responde 2 5 9 14 (2 puntos)

#include <stdio.h> #include <conio.h> main () { float suma, dato, promedio; int numDatos, i; printf("Este programa despliega el promedio de 4 nmeros.\n\n"); numdatos = 4; i = 1; suma = 0.0; printf("Teclee los datos:\n "); while (i < numDatos) { scanf("%f", & dato); suma += dato; i++; promedio = suma / numDatos; printf("El promedio es: %6.1f\n", promedio); } printf("\n\nOprima cualquier tecla para continuar...");

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

78 / 141

getch(); } Cmo obtendra el siguiente despliegue? Voy a contar las calificaciones aprobadas. Teclea las calificaciones (termina con -1) 7 4 8 10 -1 Obtuviste 3 calificacin(es) aprobatoria(s) y 1 calificacin(es) reprobatoria(s). Tu promedio fue: 7.25 Desea obtener la siguiente pantalla: Este programa calcula el promedio de varias calificaciones: Cuntas calificaciones va a capturar? 3 Teclee las calificaciones 6.6 7.2 9.9 El promedio es 7.9 Oprima cualquier tecla para continuar... Elija las siguientes instrucciones en el orden correcto para llegar al resultado deseado. Las instrucciones pueden utilizarse ms de una vez, sobran algunas y usted debe darles la sangra adecuada. Hay ms de una solucin correcta. i++; while (i < n) { float i, n; i = 0; getch(); printf(Oprima cualquier tecla para continuar...); i = 1; } while (i <= n) scanf(%d, &n); suma = 0; promedio = suma / n; float suma, promedio; int i, n; float suma = 0, promedio; #include <conio.h> main() #include <stdio.h> printf(Este programa calcula...); float dato; printf(Teclea las calificaciones); suma = suma + dato; suma += dato;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

79 / 141

scanf(%f%, &dato); printf(Cuntas calificaciones va a capturar); printf(El promedio es %5.1f, promedio); El siguiente programa debe obtener la multiplicacin de x * n. Codifique la parte que haga falta para obtener el resultado sin emplear la multiplicacin, es decir, con base en sumas sucesivas (2 puntos): main() { float x, resultado; int n, i; scanf(%f, x); scanf(%d, n); /* poner cdigo */ printf(Resultado=%f, resultado); }
Realice un programa que calcule el factorial de un nmero indicado por el usuario. La pantalla ser la siguiente: Bienvenido. Este programa calcula el factorial de un nmero: Indique el nmero: El factorial es: 120 Notas: No existen factoriales de nmeros negativos; el factorial de 0 es uno. Para guardar el factorial se requiere de un tipo de dato que guarde rango de valores mayores que el int.

Realice un programa que calcule el factorial de un nmero indicado por el usuario. La pantalla ser similar a la siguiente (valor 3 puntos) Bienvenido. Este programa calcula el factorial de un nmero. Qu nmero es? 5 Resultado: 1 * 2 * 3 * 4 * 5 = 120

Realice un programa que calcule la sumatoria de un nmero indicado por el usuario. La pantalla ser similar a la siguiente. Bienvenido. Este programa calcula la sumatoria de un nmero. Qu nmero es? 5 Resultado: 1 + 2 + 3 + 4 + 5 = 15

Partiendo del siguiente cdigo:

#include <conio.h> #include <math.h> main() { // las iteraciones se declararan flotantes porque pueden exceder el rango de enteros float i, numiteraciones; double sumatoria=0.0, resultado;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

80 / 141

printf("Este programa obtendr un valor muy cercano a PI aplicando "); printf("la frmula\n PI = 1 / 2 * raz cuadrada(sumatoria(1..n de 24/(i*i)))."); printf("\n\nTeclee el valor de n, por favor.\n"); scanf("%f", &numiteraciones); for (i = 1.0; i <= numiteraciones; i += 1.0) sumatoria += 24 / (1.0 * i * i); resultado = sqrt(sumatoria) / 2; printf("\nEl valor obtenido es: %8.4f", resultado); printf("\nEl error absoluto es: %8.4f", fabs(resultado-3.1416)); printf("\nEl error relativo es: %8.4f", fabs(resultado-3.1416) / 3.1416 * 100.0); printf ("\nOprima cualquier tecla para terminar...\n"); getch(); }

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

81 / 141

ARREGLOS EN LENGUAJE C
CONTENIDO
Concepto de arreglo Clculo de la desviacin estndar

CONCEPTO DE ARREGLO
En el campo de la programacin, en muchas ocasiones se van a manejar diversas variables del mismo tipo que recibirn el mismo tratamiento. Por ejemplo: para la reservacin y venta de boletos de un autobs, para la frecuencia de calificaciones, para la multiplicacin de matrices, etc. Se podran definir n variables del mismo tipo, pero sera un mtodo demasiado lento de programar y de modificar. Para estos casos se tienen los arreglos. Los arreglos son estructuras que contienen datos del mismo tipo. El arreglo recibe un nombre y los elementos se ubican a travs de uno o ms ndices. Cuando el arreglo es de un solo ndice se le conoce como arreglo unidimensional o vector; cuando es de dos ndices, como arreglo bidimensional o matriz. En el caso de lenguaje Pascal se estipulan los dos lmites del arreglo. Por costumbre se comienza del dato 1, pero tcnicamente puede principiar en cualquier punto. { arreglo de 50 posiciones en Pascal. Cada elemento es de tipo carcter } arreglo : array [1..50] of char; En Pascal, el ndice puede ser tambin de tipo carcter. { arreglo de 26 posiciones en Pascal. Cada elemento es de tipo entero } frecuencia : array ['A'..'Z'] of integer; En BASIC la dimensin del arreglo se estipula con un nico dato. El arreglo comienza en la posicin 1. DIM arreglo(5) ' arreglo de 5 posiciones en BASIC: de la 1 a la 5

En los lenguajes C, C++, JavaScript y Java los arreglos tambin se indican con un nico dato, pero inician en la posicin cero. char arreglo[5]; la 4 */ /* arreglo de 5 posiciones en lenguaje C: de la 0 a

Un aspecto importante en los arreglos es si el tamao de estos se establece en tiempo de compilacin (como el caso de lenguaje Pascal y C) o en tiempo de ejecucin (como en Java). Lgicamente, el segundo caso ofrece mayor versatilidad. En todos los lenguajes, cuando se quiere acceder a un elemento para modificarlo se escribe el nombre del arreglo y entre corchetes el ndice correspondiente (en el caso de BASIC se usan parntesis en lugar del corchete). Suponiendo las siguientes declaraciones en lenguaje C.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

82 / 141

int datos [5], i; Despus de aplicar las siguientes instrucciones: for (i=0; i < 5; i++) datos[i] = 0; datos [1] = 7; datos [4] = 12; datos [0] = datos [1]; datos [2] = datos [4] + 1; El contenido del arreglo sera: 0 7 1 7 2 13 3 0 4 12

Siguiendo con el mismo ejemplo. La instruccin datos [5] = 0; sera invlida porque no existe la localidad 5. Se debe tener especial cuidado en no intentar acceder fuera de los lmites del arreglo.

CALCULO DE LA DESVIACION ESTANDAR

(ndice)

El clculo de la desviacin estndar es un ejemplo en el cual forzosamente se aplican arreglos. El 16 clculo se realiza de la siguiente forma : 1) Suponga que se quiere obtener la desviacin estndar de los siguientes nmeros: 8, 9, 10, 5 , 7. 2) Se obtiene el promedio. En nuestro caso: (8 + 9 + 10 + 5 + 7) / 5 = 7.8 3) Se obtiene la sumatoria del cuadrado de las diferencias entre cada dato y el promedio (8 7.8)
2

+ (9 7.8) + (10 7.8) + (5 - 7.8) + (7 7.8) = 14.8

4) Se divide entre el nmero de datos y se extrae la raz cuadrada. ________ (14.80 / 5) = 1.72 Como se observar, es necesario leer los nmeros y obtener su promedio (paso 1 y 2). Esos datos volvern a ser requeridos. Como es ilgico pedirlos nuevamente al usuario, debern ser almacenados bajo algn mtodo. Al ser datos del mismo tipo, la forma ms prctica es un arreglo. Ya en el arreglo, se har un recorrido a travs del arreglo para calcular la sumatoria de la diferencia entre cada dato y el promedio (paso 3). Finalmente, se har la divisin y la raz cuadrada (paso 4). El programa queda de la siguiente manera. /* Programa que calcula la desviacin estndar de un grupo de nmeros Probado en Dev-C++ 4.9.8.0 Elabor: Jos Luis Lpez Goytia. */
16 La frmula es distinta para una muestra y para la poblacin total. En nuestro caso, asumiremos que esos valores son toda la poblacin existente.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

83 / 141

#include <conio.h> #include <math.h> main() { float datos[50]; float dato; usuario */ float promedio, suma=0; float s=0; int numdatos; usuario */ int i; */

/* arreglo para guardar los datos */ /* variable auxiliar para leer el dato del /* promedio y suma de los datos del usuario */ /* desviacin estndar */ /* nmero de datos que proporcionar el /* variable auxiliar para controlar los ciclos

printf("Programa para calcular la desviacion estndar.\n"); printf("Cuntos nmeros va a ingresar (mximo 50)?\n"); scanf("%d", &numdatos); printf("\nIngrese los datos a calcular\n"); for (i=0; i<numdatos; i++) { scanf("%f", &dato); suma += dato; datos[i] = dato; } promedio = suma / numdatos; for (i=0; i<numdatos; i++) { /* suma el cuadrado de las diferencias */ s += (datos[i] - promedio) * (datos[i] - promedio); } s = sqrt(s/numdatos); printf("\n\nResultado = %6.2f \n", s); printf("\n\nOprima cualquier tecla para continuar\n"); getch(); } El resultado sera como sigue: Programa para calcular la desviacin estndar. Cuntos nmeros va a ingresar (mximo 50)? 5 Ingrese los datos a calcular: 8 9 10 5 7 Resultado = 1.72 Oprima cualquier tecla para continuar...

EJERCICIOS

(ndice)

Realice un programa que reciba n nmeros enteros y despliegue cuantos de esos nmeros son mayores al ltimo nmero proporcionado. La pantalla sera similar a la siguiente (valor 4 puntos):

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

84 / 141

Bienvenido. Este programa le dir cuantos nmeros son mayores al ltimo nmero que capture. Cuntos nmeros va a capturar? 5 Indique los nmeros: 6 7 9 10 8 Hay 2 nmeros mayores al ltimo nmero capturado. Sugerencia: cree un arreglo que guarde los nmeros capturados y despus recorra ese arreglo con un ciclo contando los nmeros mayores al ltimo dato que se proporcion. Suponga que hay un camin con 10 lugares. Todos estn disponibles al principio. Realice un programa que permita al usuario reservar "n" lugares, indicando cuales. Al final, despliegue los lugares an disponibles (valor 5 puntos) Este programa reserva lugares en camin. Cuntos lugares desea reservar? 3 Cules 4 7 9 Los lugares an disponibles son: 1 2 3 5 6 8 10 Notas: si el usuario da un lugar mayor de 10 simplemente se har caso omiso de este dato. Variante. Cambie la pantalla por la siguiente: Este programa reserva lugares en camin. Cuntos lugares desea reservar? 3 Cules 4 7 9 Situacin al final: 1 2 3 4 5 6 7 8 9 10 D D D - D D - D - D Declare, llene y despliegue el arreglo utilizando el menor nmero de lneas de cdigo posibles. La primera lnea es el contenido y la segunda es el ndice (2 puntos): VALOR INDICE 0 0 1 1 4 2 9 3 16 4 25 5 36 6 49 7 64 8 59 9 60 10 61 11 62 12 63 13 64 14 65 15

Suponga que existe el siguiente arreglo: 0 1 2 3 4 5 6 7 8 9 10 8 9 1 6 7 12 10 3 4 13 0 Pida un nmero al usuario. Trate de ubicar ese nmero en el arreglo. Si existe, despliegue el primer lugar donde lo encontr. En caso contrario, seale que el nmero no existe. Por ejemplo: si el usuario da 9, su programa debe decir ubicado en el lugar 1.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

85 / 141

SUBRUTINAS EN LENGUAJE C
INDICE
Concepto de modularidad Estructura bsica de una subrutina Un primer ejemplo de subrutina Ocultamiento de la informacin

CONCEPTO DE MODULARIDAD

(ndice)

La idea bsica de modularidad es la creacin de mdulos lo ms independientes posibles, con entradas y salidas claramente definidas. Un mtodo de construccin de software es modular, por tanto, si ayuda a los diseadores a producir sistemas de software a partir de elementos autnomos 17 interconectados mediante una estructura simple y coherente . La idea de modularidad se puede encontrar en muy diversas reas. Por ejemplo: los aparatos electrnicos se basan en componentes, cada uno de ellos con una entrada y una salida claramente definidas (bocinas, audfonos, etc.). Una pieza que cumpliera las especificaciones marcadas podra reemplazar a otra y el sistema en su conjunto seguira funcionando. La modularidad facilita cubrir los criterios de calidad de software de extensibilidad y reutilizacin. En trminos ms prcticos: Permite el trabajo en paralelo de varios desarrolladores. Simplifica el desarrollo de sistemas, pues es ms fcil realizar una subrutina que el sistema completo, tanto en lo referente al volumen como en la complejidad. Simplifica el mantenimiento de sistemas, al hacer ms fcil las modificaciones. Permite el desarrollo por capas, en el cual solamente unas rutinas son dependientes del hardware, con lo cual es ms fcil caminar hacia la portabilidad. Evita redundancia, pues evita repetir cdigo que tiene el mismo propsito.

ESTRUCTURA BSICA DE UNA SUBRUTINA

(ndice)

Una subrutina recibe uno o ms valores (llamados parmetros), realiza una labor especfica y devuelve, opcionalmente, un valor de un tipo especfico.

SUBRUTINA

Meyer, Bertrand; Construccin de software orientado a objetos; Prentice-Hall; 2. Edicin; Espaa, 1999; pgina 40.

17

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

86 / 141

Cada uno de los parmetros que recibe una rutina debe ser de un tipo especfico y su nombre slo tiene efectos para la propia subrutina. En otras palabras, es independiente de la subrutina que la llama. El orden con que se declaran y envan los parmetros debe ser el mismo, pues la rutina los identificar a travs de su posicin En forma similar, el valor que devuelve es de un determinado tipo. Si la subrutina no devolviese nada se debe indicar de manera explcita a travs de la variable void. La palabra return sirve para retornar el valor desde la rutina hacia el mdulo que la llam. Cada rutina puede tener variables locales, las cuales slo tiene efecto para la propia rutina. Se crean al comenzar sta y se destruyen al terminar. Ninguna otra rutina las puede ver aparte de la propia subrutina. En lenguaje C las rutinas se suelen agrupar en libreras. Cada librera cubre cubre un rea especfica (por ejemplo: manejo de cadenas o funciones matemticas).

UN PRIMER EJEMPLO DE SUBRUTINA

(ndice)

A manera de ejemplo, revise el siguiente programa que contiene dos rutinas: la rutina principal (main) y la subrutina de sumatoria. #include <conio.h> int sumatoria (int a); main() { int dato, resultado; printf("Este programa obtiene la sumatoria de un nmero.\n"); printf("Por favor, teclee el nmero: "); scanf("%d", &dato); resultado = sumatoria(dato); printf("La sumatoria de %d es %d\n\n", dato, resultado); printf("Oprima cualquier tecla para continuar..."); getch(); } int sumatoria (int a) { int i, suma = 0; if (a == 0) return 0; else { for (i = a; i > 0; i--) suma += i; return(suma); } } Cabe hacer hincapi en que las variables locales slo pueden accesarse por la propia rutina. En nuestro caso: Rutina main sumatoria Variables locales que usa dato, resultado i, suma

El parmetro se recibe a partir de la variable a. Observe que, en este caso, la rutina principal es quien lee los datos del usuario, mientras que la rutina recibe su informacin a travs de los parmetros y no

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

87 / 141

realiza ningn proceso de entrada-salida. En trminos generales, sta es la estructura ms recomendable para el manejo de rutinas.

OCULTAMIENTO DE LA INFORMACIN

(ndice)

El diseador de cada mdulo debe seleccionar un subconjunto de propiedades del mdulo como informacin oficial sobre el mdulo para ponerla a disposicin de los autores de mdulos clientes. Para entender los beneficios de la ocultacin de la informacin parta del hecho de que un mdulo es conocido a travs de una descripcin oficial que seala sus propiedades pblicas. Todo lo dems se desconoce. Cualquier uso de este mdulo y cualquier prueba de su funcionamiento deben basarse nicamente sobre estas propiedades pblicas. Normalmente las propiedades se refieren a la funcin del mdulo y los datos de entrada y salida que requiere. El proceso interno de su tarea (el como lo hace) debe quedar como parte privada y nadie debe hacer uso de ella directamente. Si se cumplen estas reglas se puede modificar el proceso interno (algoritmos, variables locales, etc.) sin que se afecte en modo alguno al sistema en su conjunto. Ejemplo: la rutina de raz cuadrada en lenguaje C maneja la siguiente descripcin oficial : #include math.h double sqrt (double num); La funcin sqrt() devuelve la raz cuadrada de num. Si se llama a esta funcin con un argumento negativo, se producir un error de dominio. Indica que se encuentra en la librera math.h, que requiere un nmero de tipo double como entrada y devolver un nmero tambin de tipo double. El parmetro de entrada tiene que ser mayor o igual a cero. Los dems detalles quedan ocultas: si usa variables locales, el algoritmo que emplea, etc. Esta parte privada no se dice ni tiene porque conocerla quien hace uso de este mdulo. Observe otra variante de la rutina sumatoria. Como no se modifica ninguna de las partes que ligan con otras rutinas, no se tiene que cambiar ninguna lnea del programa principal. int sumatoria (int a) { return a * (a + 1) / 2; }
18

EJERCICIOS
Complete las cinco palabras faltantes. Cada inciso corresponde a una palabra (2 puntos) _____(a)_____ mayor (float a, float b) { float ____(b)________; if (a > b) aux = ____(c)_______; _____(d) ______ aux = b; ____(e)________ aux; }
18

(ndice)

Schildt, Herbert; C. Manual de Bolsillo; McGraw-Hill; Espaa, 1992; pg. 180.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

88 / 141

(a)

(b)

(c)

(d)

(e)

Elabore la rutina sumatoria, que debe devolver la sumatoria de un nmero (1+2+3++n). Si se recibe un nmero negativo deber devolver un -1. La rutina debe combinar correctamente con el siguiente programa principal (Valor=3 puntos). int sumatoria (int a); main() { printf("La sumatoria de 3 es: %d \n", sumatoria(3)); }

Qu desplegar el siguiente programa? (Valor = 1 punto)


#include <conio.h> void incremento(); main() { int p = 3; incremento(); printf("El valor final de p es: %d \n", p); getch(); } void incremento () { int p = 5; }

La rutina siguiente intenta intercambiar dos nmeros, pero no funciona bien. Corrjala empleando apuntadores correctamente:

#include <conio.h> void intercambio (int a, int b); main() { int cal1, cal2, cal3; printf("Teclea 2 nmeros:\n"); scanf("%d %d", &cal1, &cal2); intercambio (cal1, cal2); printf("Los nmeros intercambiados son: %d %d", cal1, cal2); printf("\n\nOprima cualquier tecla para continuar..."); getch(); } void intercambio (int a, int b) { int aux; aux = a; a = b; b = aux; }

Elabore una subrutina que reciba un nmero entero y devuelva la sumatoria de ese nmero. Elabore una subrutina que reciba 3 nmeros enteros y devuelva el promedio de esos 3 nmeros. Complete el siguiente cdigo:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

89 / 141

#include <conio.h> float promedio (int cal1, int cal2, int cal3); main() { int c1, c2, c3; _____indicar la palabra que falta______ x; printf("Introduce los numeros a promediar:\n"); scanf("%d" "%d" "%d", &c1, &c2, &c3); /* completar cdigo, parte 1 */ printf("El promedio es: %6.2f\n", x); } float promedio (int cal1, int cal2, int cal3) { /* completar cdigo, parte 2 */ } Realice una subrutina llamada cubo que reciba un dato de tipo entero y devuelva un dato de tipo flotante. Esta subrutina elevar el nmero proporcionado al cubo (1 punto)

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

90 / 141

APUNTADORES
INDICE
Concepto de apuntador Llamadas por valor y por referencia Manejo de cadenas Ejercicios

CONCEPTO DE APUNTADOR

Indice

Los apuntadores son variables que guardan direcciones de memoria del tipo de dato que se le indique. Existen 2 operadores para el manejo de apuntadores: & indica la direccin de la variable; mientras * significa el lugar al cual seala el apuntador. Se utiliza NULL para indicar que el apuntador todava no tiene asignada una direccin. Para ejemplificar el uso de apuntadores suponga la siguiente definicin: int x; x = 5; int *apuntadorx; apuntadorx = &x; /* /* /* /* definir la variable x */ asignar el valor 5 a la variable x */ definir un apuntador con el nombre apuntadorx */ asignar a apuntadorx la direccin de memoria de la variable x */

despus de las instrucciones siguientes, apuntadorx tendr un valor similar al siguiente: 0012FF7C. se puede afectar a la variable a la cual seala el apuntador con la instruccin *apuntador. De esta forma, *apuntador = 8 es equivalente a decir x = 8. El siguiente esquema representa los conceptos manejados.

0012FF7C

Los apuntadores tienen tres usos principales: a) Permiten enviar direcciones de memoria para que una subrutina altere el valor de la variable original. A estos parmetros se les conoce como parmetros por referencia. Entre otros casos, se utilizan para la lectura de datos. b) permiten alterar directamente algunas zonas de memoria, lo cual se aprovecha en aplicaciones de software de bajo nivel, y c) permiten manejar estructuras de datos que basan su funcionamiento en una direccin inicial, como es el caso de arreglos.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

91 / 141

LLAMADAS POR VALOR Y POR REFERENCIA

Indice

Existen dos formas de enviar parmetros a una subrutina: por valor y por referencia. En el primer caso, se realiza en forma automtica una copia de los parmetros; el segundo, se trabaja directamente sobre las direcciones, con lo cual se altera el valor de la variable original. El siguiente programa ilustra un caso que maneja parmetros por valor:
/* Tomado de: Deitel; C/C++ Cmo programar y Java; Pearson; Mxico, 2004; 1113 pgs. Figura 7.6: fig07_06.c Eleva al cubo una variable mediante una llamada por valor */ #include <stdio.h> int cuboPorValor( int n ); /* prototipo */ int main() { int numero = 5; /* inicializa nmero */ printf( "El valor original de nmero es %d", numero ); /* pasa nmero por valor a cuboPorValor */ numero = cuboPorValor( numero ); printf( "\nEl nuevo valor de nmero es %d\n", numero ); printf("\n\nOprima cualquier tecla para continuar..."); getch(); } /* fin de main */ /* calcula y devuelve el cubo de un argumento entero */ int cuboPorValor( int n ) { return n * n * n; /* eleva al cubo la variable local n y devuelve el resultado */ } /* fin de la funcin cuboPorValor */

La salida del programa es la siguiente: El valor original de nmero es 5 El nuevo valor de nmero es 125 Oprima cualquier tecla para continuar... Este programa ilustra el caso de parmetros por valor:
/* Tomado de: Deitel; C/C++ Cmo programar y Java; Pearson; Mxico, 2004; 1113 pgs. Figura 7.7: fig07_07.c Eleva al cubo una variable mediante el uso de una llamada por referencia con un apuntador como argumento */ #include <stdio.h> void cuboPorReferencia( int *ptrN ); /* prototipo */ int main() { int numero = 5; /* inicializa nmero */ printf( "El valor original de nmero es %d", numero ); /* pasa la direccin de nmero a cuboPorReferencia */ cuboPorReferencia( &numero ); printf( "\nEl nuevo valor de nmero es %d\n", numero ); printf("\n\nOprima cualquier tecla para continuar..."); getch(); } /* fin de main */

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

92 / 141

/* calcula el cubo de *ptrN; modifica la variable nmero en main */ void cuboPorReferencia( int *ptrN ) { *ptrN = *ptrN * *ptrN * *ptrN; /* cubo de *ptrN */ } /* fin de la funcin cuboPorReferencia */

La salida del programa es la siguiente:


El valor original de nmero es 5 El nuevo valor de nmero es 125 Oprima cualquier tecla para continuar...

MANEJO DE CADENAS

Indice

En lenguaje C prcticamente no existen operadores relativos al manejo de cadenas. Estas labores se realizan mediante subrutinas basadas en apuntadores que se encuentran en la biblioteca string.h. Recuerde que en lenguaje C una cadena es un arreglo de caracteres que termina con el carcter \0, tambin llamado nulo. Ejemplificaremos su modo de empleo con strlen y strcat. Su sintaxis es la siguiente: size_t strlen (char *cad) devuelve la longitud de la cadena finalizada con carcter nulo apuntado por cad. El carcter nulo no se cuenta char *strcat(char *cad1, const char *cad2) concatena una copia de cad2 en cad1 y hace que cad1 finalice con un carcter nulo. El carcter nulo que tena originalmente cad1 se sobrescribe con el primer carcter de cad2. La cadena cad2 no se toca en esta operacin. Para utilizar strcat es necesario que la primer cadena tenga espacio suficiente para recibir la concatenacin. Esto se logra definiendo un arreglo de caracteres. A continuacin un programa que ejemplifica su uso:
#include <conio.h> #include <string.h> main() { char cadena1[50] = "cadena", *cadena2 = "de ejemplo"; int longitud; strcat(cadena1, cadena2) ; longitud = strlen(cadena1); printf("La longitud de <cadena> y <de ejemplo> es: %6d", longitud); printf("\n\nOprima cualquier tecla para continuar..."); getch(); }

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

93 / 141

EJERCICIOS
Qu arrojara el siguiente programa?
#include <conio.h> main() { int a, b, c; // variables int *apuntador1, *apuntador2, *apuntador3; a = 5; b = 8; c = 10; printf("La direccin de la variable a es: %p\n", &a); printf("La direccin de la variable b es: %p\n", &b); printf("La direccin de la variable c es: %p\n", &c); printf("\n"); apuntador1 = &a; apuntador2 = &b; apuntador3 = &c; printf("El valor de apuntador 1 es: %p\n", apuntador1); printf("El valor de apuntador 2 es: %p\n", apuntador2); printf("El valor de apuntador 3 es: %p\n", apuntador3); printf("\n"); printf("El valor contenido en %p es: %d\n", apuntador1, *apuntador1); printf("El valor contenido en %p es: %d\n", apuntador2, *apuntador2); printf("El valor contenido en %p es: %d\n", apuntador3, *apuntador3); printf("\n"); // haciendo que apuntador 3 tome apuntador3 = apuntador2; *apuntador3 = 4; printf("El valor contenido en %p printf("El valor contenido en %p printf("El valor contenido en %p printf("\n"); la direccin de apuntador1 es: %d\n", apuntador1, *apuntador1); es: %d\n", apuntador2, *apuntador2); es: %d\n", apuntador3, *apuntador3);

Indice

printf("\nOprima cualquier tecla para terminar...\n"); getch(); } Respuesta: La direccin de la variable a es: 0022FF6C La direccin de la variable a es: 0022FF68 La direccin de la variable a es: 0022FF64 El valor del apuntador 1 es: 0022FF6C El valor del apuntador 1 es: 0022FF68 El valor del apuntador 1 es: 0022FF64 El valor contenido en 0022FF6C es: 5 El valor contenido en 0022FF68 es: 8 El valor contenido en 0022FF64 es: 10 El valor contenido en 0022FF6C es: 5 El valor contenido en 0022FF68 es: 4 El valor contenido en 0022FF64 es: 4 Oprima cualquier tecla para terminar...

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

94 / 141

Realice la prueba de escritorio al siguiente cdigo:


#include <conio.h> void menorMayor (float cal1, float cal2, float cal3, float *minimo, float *maximo); main() { float c1, c2, c3, menor, mayor; printf("Este programa indicar el nmero menor y mayor de 3 cantidades que proporciones:\n"); scanf("%f %f %f", &c1, &c2, &c3); menorMayor(c1, c2, c3, &menor, &mayor); printf("El menor es: %6.1f\n", menor); printf("El mayor es: %6.1f\n", mayor); printf("Oprime cualquier tecla para continuar..."); getch(); } void menorMayor (float cal1, float cal2, float cal3, float *minimo, float *maximo) { float men = cal1, max = cal1; if (cal2 < men) men = cal2; if (cal2 > max) max = cal2; if (cal3 < men) men = cal3; if (cal2 > max) max = cal3; *minimo = men; *maximo = max; }

Qu desplegar el siguiente programa? (Valor = 2 puntos) #include <conio.h> void cuadrado (int p); void decremento (int *w); main() { int p = 3; cuadrado(p); decremento(&p); printf("El valor final de p es: %d \n", p); getch(); }
void cuadrado (int p) { p = p * p; } void decremento (int *w) { *w = *w - 1; }

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

95 / 141

ENFOQUE DE LA PROGRAMACION ORIENTADA A OBJETOS (POO)


CONTENIDO
Conocimientos previos Enfoque de la POO Diagramas de clase Ejercicios sugeridos Bibliografa Con que proseguir

CONOCIMIENTOS PREVIOS

(Indice)

Conocimientos bsicos de algn (tipos de datos y subrutinas) de algn lenguaje de programacin, preferentemente de lenguaje C.

ENFOQUE DE LA PROGRAMACIN ORIENTADA A OBJETOS


Bruce Eckel define el enfoque orientado a objetos bajo las siguientes bases:
19

(Indice)

Todo es un objeto. La realidad (perros, edificios, servicios, etc.) ser representada a travs de objetos dentro de un programa. Las posibles caractersticas (atributos) de un objeto y su comportamiento (definido por los mtodos) quedan definidos por la clase a la cual pertenece. Suponga que existen dos objetos de la clase Foco, llamados foco1 y foco2. Ambos tendrn los mismos atributos y mtodos, aunque cada uno tendr sus propios valores para los distintos atributos.

Foco estado: String cambiarEstado()

foco1: Foco estado=encendido

foco2: Foco estado=apagado

Figura 1. Una clase Foco a partir de la cual se definieron 2 objetos. La clase define los atributos que pueden tener los objetos y su comportamiento (mtodos que se le pueden aplicar).

Un programa es un cmulo de objetos que se dicen entre s lo que tienen que hacer mediante el envo de mensajes. Cada objeto puede recibir peticiones y, en razn de ellas, realizar una operacin determinada. Esas peticiones slo pueden hacerse por la interfase que el mismo objeto ha diseado.

19

Tomado de: Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; pg. 3.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

96 / 141

En las clases existen partes pblicas y privadas (y algunas variaciones). Normalmente los datos son de naturaleza privada y los mtodos son pblicos. Las partes privadas slo pueden ser accesadas a travs de los propios mtodos de las clases. Con ello se impide que se modifique esa informacin desde fuera del objeto. Encapsulamiento es la capacidad de ocultar algunos miembros de la clase, pero proporcionando una interfase pblica para acceder a dichos miembros de la clase. Esa interfaz fija una serie de reglas que no se pueden brincar.

Elevador +subir() +bajar()


Figura 2. Un objeto elevador y su interfase externa para el usuario. A travs de esta interfase slo se puede indicar: a) que se desea subir o b) que se desea bajar.

Cada objeto tiene su propia memoria, constituida por otros objetos. Los objetos pueden contener atributos (datos), mtodos (rutinas) o bien otros objetos. Se pueden crear objetos a partir de otros objetos. El nuevo objeto tendr los datos y mensajes de la clase padre, ms los datos y mensajes que desee agregar. Tambin existe la posibilidad de redefinir un mensaje. Este mecanismo se conoce como herencia.

Profesor

ProfesorNivelSuperior Profesor nivel superior atributos mtodos Profesor

Figura 3. Una clase puede heredar atributos y mtodos de otra clase. Sobre esa base puede aadir sus propios atributos y mtodos. Tambin puede sobreescribir los mtodos recibidos.

Todo objeto es de algn tipo. Cada objeto es un elemento de una clase, entendiendo por clase un sinnimo de tipo. La caracterstica ms relevante de una clase la constituyen el conjunto de mensajes que se le pueden enviar. Todos los objetos de determinado tipo pueden recibir los mismos mensajes. Esta es una afirmacin de enorme trascendencia como se ver ms tarde. Dado que un objeto de tipo tringulo es tambin un objeto de tipo polgono, se garantiza que todos los objetos tringulo acepten mensajes propios de polgono. Esto permite la escritura de cdigo que haga referencia

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

97 / 141

a polgonos, y que de manera automtica puede manejar cualquier elemento que encaje con la descripcin de tringulo. Esta capacidad de suplantacin es uno de los conceptos ms potentes de la POO . Se conoce como polimorfismo. Polimorfismo es la capacidad de que una referencia pueda apuntar a objetos de diferente tipo. Debe recordarse que una clase tiene los datos y mensajes que hered de la clase padre, ms los datos y mtodos que desee agregar. Si hay dos clases que heredaron de la misma clase padre y no se hizo ninguna redefinicin, al menos tendrn en comn los datos que heredaron. Existe un mtodo especial en las clases que permite crear al objeto y asignar valores iniciales a sus datos. A este mtodo se le conoce como constructor. El constructor tiene el mismo nombre que la propia clase. Puede haber varios mtodos con el mismo nombre en la misma clase. Se distinguir entre ellas porque reciben diferentes parmetros, ya sea en nmero o tipo. A esto se le conoce como sobrecarga. Al mtodo contrario, que realiza algunas tareas a la hora de eliminar ese objeto de memoria, se le conoce como destructor. El destructor no existe como tal en todos los lenguajes orientados a objetos. Tip de portabilidad: en Java no existe concepto de destructor. El recolector de basura (Garbage Collection) se encarga de liberar la memoria de los objetos que ya no se usan.

DIAGRAMAS DE CLASE

(Indice)

Como se puede notar, todo se basa en objetos y clases. La forma de representar las clases empleando la notacin de UML (Lenguaje Unificado de Modelado Unified Modeling Language) es mediante un rectngulo con secciones. La primera seccin (el nombre de clase) es forzosa. Los dems son opcionales, pero debe respetarse el orden indicado. La segunda parte indica los atributos; la tercera, los mtodos; en la cuarta se colocan comentarios. En este tipo de diagramas la parte privada se maneja como y la parte pblica con +. El diagrama ser similar al 20 siguiente :

Nombre de la clase atributo:Tipo = ValorInicial operacin (lista argumentos): tipo de devolucin comentarios
El mecanismo de herencia se seala mediante una flecha que va de la clase hija a la clase padre.

Clase padre

Clase hija

20

Fowler, Martin; UML Gota a gota; Pearson; Mxico, 1999.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

98 / 141

A manera de ejemplo, suponga que se requiere una clase que simule una tarjeta de dbito. Esta tarjeta tendr un saldo. Las operaciones que se pueden hacer con ella son: meter dinero, sacar dinero y consultar saldo. El saldo nunca puede ser negativo. Adicionalmente suponga que habr una tarjeta de crdito, con una lnea de crdito. La opcin de sacar dinero variar porque, adems de sacar su propio dinero, puede sacar dinero hasta su lnea de crdito disponible. El diagrama de clases quedara como sigue:

+ TarjetaDebito - saldo : double +TarjetaDebito(saldoInicial : double) + getSaldo(): double + meterDinero (cantidad : double) : void + sacarDinero (cantidad : double) : boolean

TarjetaCredito - lineaDeCredito : double + TarjetaCredito (saldo : double) + TarjetaCredito (saldo : double, lineaCredito : double) + getLineaDeCredito() : double + setLineaDeCredito(cantidad: double) + sacarDinero (cantidad : double) : boolean

EJERCICIOS SUGERIDOS
GRUPO 1: Qu diferencia hay entre partes privadas, pblicas y protegidas? Por qu no existe un mtodo setSaldo? En dnde existe una situacin de sobrecarga? Cuntos atributos tiene la clase TarjetaDebito? Cuntos mtodos tiene la clase TarjetaDebito? Cuntos atributos tiene la clase TarjetaCredito? Cuntos mtodos tiene la clase TarjetaCredito?

(Indice)

GRUPO 2: Realice un diagrama de clase para una clase Cuadrado, con dos mtodos: rea y permetro. GRUPO 3: Qu desplegara el siguiente pseudocdigo? clase Ejemplo mtodo bienvenida despliega hola

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

99 / 141

clase Ejemplo2 hereda Ejemplo mtodo bienvenida despliega buenos das Ejemplo2 objeto; objeto.bienvenida(); Respuesta: __________________________ Elija, de entre los enunciados siguientes, el que corresponde ms al trmino de encapsulamiento. a) Que una clase tenga atributos y mtodos. b) Que no tengamos acceso al cdigo en un archivo .class c) Que un atributo privado no pueda ser accesado desde fuera de la clase. Respuesta: __________________________ Son ventajas de la POO frente a la programacin estructurada? a) La POO siempre es de tipo grfico. b) La POO corre en cualquier plataforma. c) Las clases tienen atributos y mtodos. d) Hay herencia. e) Un mtodo puede llamar a otro mtodo. f) Pueden repetirse nombres de mtodos en un sistema. g) Es posible la sobrecarga de mtodos. Respuesta: __________________________

BIBLIOGRAFIA

(Indice)

Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; 906 pgs. Fowler, Martin; UML Gota a gota; Pearson; Mxico, 1999; 203 pgs.

CON QUE PROSEGUIR


(Indice)

Algunas otras bases conceptuales antes de entrar al cdigo, por ejemplo: la forma de almacenamiento de objetos en Java. Ejercicios didcticos que refuercen los conceptos utilizando nicamente diagramas UML. Este enfoque es recomendado para alumnos que se acercan por vez primera a programacin orientada a objetos. Ejercicios de cdigo que muestren clases en cdigo, comenzado con una clases sencilla (sin herencia ni sobrecarga) e incorporando poco a poco un mayor grado de dificultad.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

100 / 141

CMO FUNCIONA JAVA?


CONTENIDO
Conocimientos previos La mquina virtual de Java El manejo de memoria en Java El recolector de basura de Java (Garbage Collection) Las caractersticas de Java Las versiones de Java Los productos de Java Los entornos de desarrollo de Java Ejercicios sugeridos Bibliografa Con que proseguir

CONOCIMIENTOS PREVIOS

(Indice)

Conocimientos bsicos (tipos de datos y subrutinas) de algn lenguaje de programacin, preferentemente de lenguaje C o Java.

LA MQUINA VIRTUAL DE JAVA

(Indice)

Java se basa en libreras al igual que el lenguaje C. Sin embargo, incorpora un concepto nuevo: la mquina virtual. El compilador no produce directamente el cdigo ejecutable. En su lugar deja un cdigo de bytes que en un segundo paso- un intrprete transformar al cdigo mquina de la computadora. Por eso se dice que la compilacin es hacia una mquina virtual. En otras palabras, compilamos para un intrprete que an no se conoce. La idea no era nueva y haba fracasado en intentos anteriores. Sin embargo, la situacin tcnica de la computacin hacia finales de los 90s y la aplicacin masiva de INTERNET hicieron que Java tuviera una difusin que ningn otro lenguaje haba logrado.

cdigo fuente (.java)

cdigo de bytes (.class)

ejecucin

libreras (import) Figura 1. La mquina Virtual de Java Esta forma de trabajo tiene grandes ventajas. Por un lado, ni el programa fuente ni el cdigo compilado dependen de la computadora en especfico. Por otro, es mucho ms difcil vulnerar la seguridad en Java. Pero tiene costos: se requiere un intrprete que realice el paso final y hace que los programas sean menos eficiente por ese ltimo paso de traduccin. Sin embargo, con la tecnologa actual de Java, ese costo se ha reducido cada vez ms.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

101 / 141

EL MANEJO DE MEMORIA EN JAVA

(Indice)

En Java, todo se maneja a travs de referencias (apuntadores). Cuando se crea un objeto, el nombre de ste queda en un espacio de memoria llamado stack. Esta variable, a su vez, seala al objeto, el cual queda alojado en otro espacio de memoria llamado heap.
Stack Memory Heap Memory

Clase objeto; objeto = new Clase(); Figura 2. El manejo de memoria en Java.

Cuando se declara la variable objeto, ste se da de alta en el stack. Esta variable almacena la direccin de memoria del objeto. El objeto se crea en el heap cuando se da de alta explcitamente mediante la palabra new.

EL RECOLECTOR DE BASURA DE JAVA (GARBAGE COLLECTION))

(Indice)

Suponga que se define y crea un objeto. Qu sucedera si el objeto se crea nuevamente sin ser eliminado el primero? Se pierde la primera referencia del primer objeto, el cual ya no es accesible por ninguna va. En otros lenguajes (como lenguaje C) este objeto seguira consumiendo memoria hasta que se apague la mquina. En el caso de Java, la memoria se liberar posteriormente a travs del recolector de basura (Garbage Collection). El objetivo del recolector de basura es eliminar de la memoria las referencias y objetos que ya no se usan.
Stack Memory Heap Memory objeto del cual ya no se tiene referencia

Clase objeto; objeto = new Clase(); objeto = new Clase(); Figura 3. El objeto que ya no tiene referencia es eliminado en forma automtica por el recolector de basura (Garbage Collection).

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

102 / 141

LAS CARACTERSTICAS DE JAVA21

(Indice)

Los autores de Java han escrito un influyente Libro Blanco que explica sus metas de diseo y conclusiones. El libro est organizado en los siguientes once clichs: Simple Orientado a objetos Distribuido Robusto Seguro Arquitectura Neutral Portable Interpretado Alto rendimiento Multithreaded Dinmico

En esta seccin vamos a resumir algunos extractos del Libro Blanco con lo que los diseadores de Java dicen de cada clich,

Simple
Quisimos hacer un sistema que pudiera ser programado fcilmente sin mucho aprendizaje esotrico y que mejorara los estndares actuales. Aunque vimos que C++ no era apropiado, diseamos Java lo ms parecido a C++ para hacerlo ms entendible. Java omite las caractersticas de C++ que rara vez se utilizan, que no se entienden y que causan confusin que, por nuestra experiencia, dan ms quebradero de cabeza que beneficios.

Orientado a objetos
Podemos afirmar que el diseo orientado a objetos es una tcnica de programacin que hace nfasis en los datos (=objetos) y en las relaciones con esos objetos. Haciendo una analoga con una carpintera, un carpintero orientado a objetos estara ms preocupado por la silla que est haciendo y, en segundo lugar por las herramientas utilizadas para hacerla; un carpintero no orientado a objetos dara ms prioridad a sus herramientas. Las utilidades de Java orientadas a objetos son bsicamente las mismas que las de C++.

Distribuido
Java tiene una extensa biblioteca de rutinas para realizar copias con los protocolos de TCP/IP como HTTP y FTP. Las aplicaciones de Java pueden abrir y acceder a objetos a travs de la Red va URL con la misma facilidad con la que se accede al sistema local de ficheros.

Robusto
Java est hecho para escribir programas que deben ser fiables en varios aspectos. Java pone nfasis en la pronta comprobacin de posibles problemas, la comprobacin dinmica (en tiempo de ejecucin) posterior, eliminando situaciones propensas a errores La diferencia ms significativa entre Java y C/C++ es que Java tiene un modelo de punteros que elimina la posibilidad de sobrescribir la memoria y corromper los datos.

Seguro
Java est pensado para ser usado en entornos distribuidos o en red. Con ese fin, se ha hecho mucho nfasis en la seguridad. Java permite crear sistemas libres de virus y falsificaciones.

Tomado de: Horstmannn, Cay S.; Cornell, Gary; Java 2 Fundamentos; Prentice Hall; Espaa, 2003; pgs. 6-13. Los autores lo sintetizaron a su vez del Libro Blanco en http://java.sun.com/doc/language_environment.

21

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

103 / 141

Arquitectura neutral
El compilador genera un fichero objeto cuyo formato es independiente de la arquitectura (el cdigo compilado se ejecuta en muchos procesadores, en los que haya un sistema de ejecucin Java). El compilador Java hace esto al generar instrucciones bytecode que no estn relacionadas con una arquitectura de computadora en particular. Ms bien, las instrucciones se hacen para que sean fciles de interpretar en cualquier mquina y fcilmente traducibles al cdigo mquina nativo en tiempo de ejecucin.

Portable
A diferencia de C y C++ no hay aspectos de la especificacin dependientes de la implementacin. Estn especificados los tamaos de los datos bsicos, as como su comportamiento aritmtico.

Interpretado
El intrprete Java puede ejecutar bytecodes de Java directamente en cualquier mquina a la que se haya trasladado el intrprete. Puesto que el enlace (linking) es un proceso ms incremental y ligero, el proceso de desarrollo es mucho ms rpido.

Alto rendimiento
Mientras que el rendimiento de los bytecodes interpretados normalmente es ms que adecuado, hay situaciones en las que se requiere un mejor rendimiento. Los bytecodes se pueden traducir en tiempo de ejecucin a cdigo mquina para la CPU de la mquina en la que se estn ejecutando.

Multithreaded
Las ventajas del multithreaded son una mayor sensacin de interactividad y un mejor comportamiento en tiempo real.

Dinmico
En varios aspectos Java es un lenguaje ms dinmico que C o C++. Se dise para adaptarse a un entorno en evaluacin. Las bibliotecas pueden aadir mtodos nuevos e instanciar variables sin que afecte a los clientes. En Java, descubrir informacin en tiempo de ejecucin es sencillo.

Java e Internet
La idea en este punto es sencilla: los usuarios descargan los bytecodes de Java desde Internet y los ejecutan en sus propias mquinas. Los programas Java que se ejecutan en paginas web se llaman applets. Para utilizar un applet, necesita un navegador que tenga la capacidad de ejecutar Java, el cual interpretar los bytecodes.

LAS VERSIONES DE JAVA

(Indice)

Se suele hablar de Java I, Java 2 y Java 3D. En realidad, la numeracin tiene que ver ms con una cuestin comercial que tcnica. El nombre de Java 2 se emplea para hacer hincapi en el crecimiento de Java como una plataforma amplia y probada a partir de la versin 1.2 del compilador. Java 3D, por su parte, contiene una serie de clases para creacin de imgenes grficas. Se puede decir que es totalmente independiente de Java 2. La tabla 1 indica el crecimiento de Java a lo largo del tiempo. A continuacin se muestra una tabla con la versin del compilador de Java y su crecimiento .
Versin Nmero de clases e interfaces Nmero de mtodos y campos
22

22

Ibid; pg. 17.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

104 / 141

1.0 1.1 1.2 (Java 2) 1.3 1.4

212 504 1781 2130 3020

2125 5478 20935 23901 32138

Tabla 1. El crecimiento de Java a lo largo del tiempo.

Sun desarroll la primera versin de Java a principios de 1996. La gente se dio cuenta rpidamente de que Java 1.0 no iba a servir para desarrollar aplicaciones serias. Es verdad que se poda utilizar Java 1.0 para hacer un applet en el que apareciese el texto movindose de forma temblorosa de ac para all en un lienzo. Pero ni siquiera se poda imprimir en Java 1.0. Para ser francos, Java 1.0 no estaba listo para distribuirse masivamente. Su sucesor, la versin 1.1, arregl la mayor parte de los defectos obvios, mejor de manera notable la capacidad de reflexin, y aadi un modelo nuevo de eventos para la programacin de la GUI (Interfaz grfica de usuario). An as, todava tena muchas limitaciones. La gran noticia de la conferencia JavaOne de 1998 fue la inminente versin 1.2 de Java, que reemplazaba esa especie de juguete que era la GUI y las herramientas grficas con versiones sofisticadas y escalables que se acercaban ms a la promesa de Escribir el cdigo una sola vez, ejecutarlo en cualquier sitio (Write Once, Run Anywhere) que lo logrado por sus predecesores. Tres das ms tarde (!), esto ocurra en diciembre de 1998, el departamento de marketing de Sun cambi el nombre 23 al trmino pegadizo Java 2 Standard Edition Software Development Kit Versin 1.2

LOS PRODUCTOS DE JAVA

(Indice)

La tecnologa de Java vigente a mediados de 2006 incluida la Mquina Virtual de Java (Java Virtual Machine)- est incluida en tres grupos diferentes de productos, cada uno diseado para las necesidades de un sector de mercado distinto: Java 2 Plataform, Standard Edition (J2SE ).- desarrollo de applets y aplicaciones que corren dentro de navegadores de WEB y computadoras personales, respectivamente. 2 Plataform, Enterprise Edition (J2EE Java distribuidas cliente-servidor. Java 2 Plataform, Micro Edition (J2EE telfonos celulares.
TM TM TM TM TM TM

).- aplicaciones empresariales, aplicaciones

).- aplicaciones para dispositivos del consumidor, como

LOS ENTORNOS DE DESARROLLO PARA JAVA

(Indice)

Los programas de Java quedan grabados en archivos tipo ASCII (TXT). Este archivo puede crearse desde cualquier editor (como el bloc de notas de Windows). Sin embargo, el uso de un entorno integrado de desarrollo facilita en gran medida la escritura de cdigo. Java puede combinarse con diferentes entornos de desarrollo, pues desde un inicio separ el ambiente de desarrollo del compilador. Entre los ms comunes se encuentran: IDE JCreator, BlueJ, JGrasp, freeJ Netbeans IDE (SUN free)
23

Requerimientos en RAM 64 MB 256 MB

Productos de Java JSE JSE, JEE, JME

Costo libre libre

Idem.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

105 / 141

JDeveloper (Oracle) JBuilder (Borland) Bea weblogic (Java Workshop) WebSphere Studio (IBM) Eclipse (IBM free) Java Studio Enterprise / Java Studio Creador (SUN)

256 MB 256 MB 256 MB 256 MB 256 MB 256 MB

JSE, JEE, JME JSE, JEE, JME JSE, JEE, JME JSE, JEE, JME JSE, JEE, JME JSE, JEE, JME

pagado pagado pagado pagado Libre Pagado (tiende a ser libre)

EJERCICIOS SUGERIDOS

(Indice)

Instalar el compilador de Java ubicando la versin del compilador, el producto del cual se trata y si viene acompaado por algn entorno de desarrollo. De las siguientes caractersticas de software, en cul contribuye ms Java? a) Eficiencia b) Portabilidad c) Facilidad de uso d) Funcionalidad Respuesta: _____ Fundamente su respuesta: _________________________________________________________________________ _________________________________________________________________________ Qu pasa en el siguiente cdigo? Cuadrado ejemplo1; ejemplo1 = new Cuadrado(6.5); ejemplo1 = new Cuadrado(8.1); a) Marca error de sintaxis. b) Se crea un solo objeto en memoria con el ltimo dato. c) El compilador detecta redundancia y hace caso omiso de la segunda instruccin. d) Se crean dos objetos en memoria pero slo mantiene el direccionamiento del ltimo; Respuesta: __________________________

BIBLIOGRAFIA

(Indice)

Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; 906 pgs. Horstmannn, Cay S.; Cornell, Gary; Java 2 Fundamentos; Prentice Hall; Espaa, 2003.

CON QUE PROSEGUIR


(Indice)

Ejercicios de cdigo que muestren clases en cdigo, comenzado con una clases sencilla (sin herencia ni sobrecarga) e incorporando poco a poco un mayor grado de dificultad. Un panorama general de los tipos de datos y las estructuras de control de Java.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

106 / 141

CREACIN DE UNA CLASE SENCILLA EN JAVA


CONTENIDO
Conocimientos previos Creacin de una clase sencilla en Java Compilando un programa en Java desde comandos Reglas para el nombre de identificadores en Java Ejercicios sugeridos Bibliografa

CONOCIMIENTOS PREVIOS

(Indice)

Conocimientos de algn lenguaje de programacin de preferencia lenguaje C- y de conceptos bsicos de programacin orientada a objetos. Se supone que ya se tiene un compilador de Java instalado.

CREACIN DE UNA CLASE SENCILLA EN JAVA

(Indice)

La programacin de una clase parte del diagrama de clases, muy posiblemente complementada con 24 otro tipo de informacin. Para este momento, ya se realiz el requerimiento, anlisis y diseo . Ahora lo que debe hacerse es transferir a cdigo los diagramas entregados. La primera clase a crear ser la de un cuadrado. El diagrama de clases es el siguiente: + + + + + + Cuadrado lado: double Cuadrado(dato: double) perimetro(): double area (): double getLado (): double setLado (lado: double)

Repasemos las secciones del diagrama de clase: NombreDeLaClase atributos mtodos comentarios De esta forma: + seala que su acceso es pblico, mientras que indica acceso de tipo privado y # se refiere a un dato protegido. La clase Cuadrado ser de naturaleza pblica. Esto implica que debe existir un archivo Cuadrado.java, Hay un constructor Cuadrado (dato: double). Se identifica porque lleva el mismo nombre que la clase.

24

Muchos cursos combinan el curso de programacin con las fases previas, comenzado por el levantamiento de requerimientos. A nuestro juicio, esta costumbre rompe la idea de desarrollo por etapas de cualquier metodologa y dispersa la atencin del alumno.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

107 / 141

Hay un nico atributo llamado lado, de naturaleza privada. Este atributo ser accesado a travs de los mtodos getSaldo y setSaldo. Hay mtodos de naturaleza pblica que arrojan el rea y el permetro. Se llaman area y perimetro, respectivamente.

Para efectos de pruebas, se har una rutina principal que crear un objeto de tipo Cuadrado e invocar a sus mtodos. La creacin del objeto se hace utilizando la palabra new, considerando los parmetros que espera el constructor. La llamada a mtodos y atributos se realiza con la sintaxis objeto.atributo u objeto.mtodo (parmetros). El cdigo quedara como sigue: /* Descripcin: programa que crea una clase Cuadrado con sus respectivas instrucciones de prueba. Probado con j2sdk1.4.2_05 / NetBeansIDE3.6 Elaboracin: Jos Luis Lpez Goytia */ public class Cuadrado { private double lado; public Cuadrado(double dato) { lado = dato; } public double area() { return lado * lado; } public double perimetro() { return lado * 4; } public double getLado() { return lado; } public void setLado(double dato) { lado = dato; } public static void main (String [] args) { Cuadrado mosaico; mosaico = new Cuadrado(6.0); System.out.println("El lado mide " + mosaico.getLado() + ". El permetro es " + mosaico.perimetro() + " y el rea es " + mosaico.area()); mosaico.setLado(5.0); System.out.println("El lado mide " + mosaico.getLado() + ". El permetro es " + mosaico.perimetro() + " y el rea es " + mosaico.area()); } } El resultado del programa es:
Lado= 6.0 El lado mide 6.0. El permetro es 24.0 y el rea es 36.0 Lado= 5.0 El lado mide 5.0. El permetro es 20.0 y el rea es 25.0

Observaciones acerca del cdigo: La palabra class se utiliza para crear la clase. Los modificadores + y se transforman en public y private. En Java existe el tipo de datos String, que no se encuentra en lenguaje C. La rutina principal se indica como public static void main (String[] args) {.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

108 / 141

La explicacin detallada de esta lnea queda fuera del alcance de este artculo, pero de manera sinttica puede mencionarse que la palabra public seala un mtodo pblico; static indica que se crear nicamente una vez este mtodo independientemente de cuantos objetos se creen; void hace notar que no se devuelve ningn valor; main se utiliza para la rutina principal; finalmente, String [] args indica que puede recibir desde fuera varias cadenas de caracteres. La salida al monitor se har mediante la instruccin System.out.println La explicacin del significado de esta lnea queda fuera del alcance de este artculo. La instruccin Cuadrado mosaico; define un objeto mosaico de tipo Cuadrado. Esta instruccin slo crea la referencia al objeto en el Stack Memory. La instruccin mosaico = new Cuadrado(6.0); crea el objeto en memoria, en el Heap Memory. Las instrucciones Cuadrado mosaico; mosaico = new Cuadrado(6.0); podran abreviarse de la siguiente forma: Cuadrado mosaico = new Cuadrado(6.0); (Indice)

COMPILANDO UN PROGRAMA EN JAVA DESDE COMANDOS

La creacin del programa se puede realizar en cualquier editor que guarde archivos de tipo ASCII (.TXT). La extensin debe ser .java. Desde el entorno de comandos, el paso de compilacin se realiza con la palabra javac. La ejecucin se realiza con la palabra java. Si desea ver todas las opciones de ejecucin, teclee javac sin ningn parmetro. La misma situacin se aplica para java. La compilacin sera similar a la siguiente: C:\Archivos de programa\Java\jdk1.5.0_06\bin>javac Cuadrado.java
Si no despliega ningn mensaje, es que la compilacin se hizo correctamente. En el paso siguiente se realiza la ejecucin:

C:\Archivos de programa\Java\jdk1.5.0_06\bin>java Cuadrado Es adecuado indicar al sistema operativo que ejecute el programa de Java desde cualquier directorio. En caso contrario, slo se podr ejecutar el compilador desde la ubicacin <directorio de Java>\bin. En el caso de Windows XP la opcin para lograr esto se encuentra de la siguiente forma: a) ir a Panel de control; b) ir a la opcin sistema; c) dentro de opciones avanzadas ir a variables de entorno; d) agregar el directorio en donde se encuentra el compilador de java.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

109 / 141

Despus de realizar estas operaciones, se puede llamar a javac y java desde cualquier otro directorio.

REGLAS PARA EL NOMBRE DE IDENTIFICADORES EN JAVA

(Indice)

Existen una serie de reglas para el nombre de identificadores, establecidos por Sun como un estndar para toda la programacin de Java. Todas las clases de naturaleza pblica se guardan en un archivo NombreDeLaClase.java El nombre del constructor siempre ser el mismo que el nombre de la clase. Los nombres de las clases comienzan con maysculas, al igual que las interfases. Los nombres de atributos y mtodos comienzan con minscula. Se recomienda el uso de verbos para los mtodos. La primera letra de cada palabra intermedia debe ser mayscula. Por ejemplo: nombreDelMetodo. El acceso a los atributos se realiza a travs de las palabras get y set. Las constantes se especifican con mayscula. Por ejemplo: VALOR_MAXIMO. La ubicacin de los paquetes se hace todo con letras minsculas.

ENCAPSULAMIENTO

(Indice)

En el ejemplo de cuadrado no se le ve mucho sentido a que el lado sea de tipo privado, ms all de las cuestiones didcticas. El diagrama de clases se podra simplificar como sigue:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

110 / 141

+ + + + +

Cuadrado lado: double Cuadrado(dato: double) perimetro(): double area (): double

Con lo cual las dems clases podran leer y modificar directamente el valor de lado. Sin embargo, imagine una clase que refleje el funcionamiento de una tarjeta de crdito. En este caso no puede haber un valor negativo. Una clase como se muestra en el siguiente diagrama: + + + + + TarjetaDebito saldo: double TarjetaDeDebito(dato: double) meterDinero(dato:double) sacarDinero ()

Sera sumamente riesgosa, pues permitira leer y modificar directamente el valor del saldo desde cualquier otra clase. En su lugar se preferir una clase que proteja el valor del saldo, a fin de que ste slo pueda ser ledo y modificado a travs de los propios mtodos de la clase. A este proceso se le conoce como encapsulamiento. La clase quedara de la siguiente forma: + + + + + TarjetaDebito saldo: double TarjetaDebito(dato: double) meterDinero(dato:double) sacarDinero (): boolean getSaldo(): double

Nota: un atributo tambin puede ser de tipo protected (protegido). En este caso slo puede ser ledo y modificado por la propia clase y sus subclases. Observe que sacarDinero() retorna un valor lgico. Si fue posible sacar dinero, afectar a saldo y retornar verdadero. En caso contrario, el saldo permanecer intacto y devolver falso. Tip: se recomienda que el estudiante codifique ambas clases y compruebe que no se puede afectar un atributo privado desde fuera de la propia clase.

EL OPERADOR THIS

(Indice)

En ocasiones, es confuso si el nombre de un identificador se refiere a un dato del objeto, a una variable o a un parmetro. Para romper esta ambigedad se utiliza el operador this. Este operador seala que el atributo se refiere al objeto; se emplea como this.atributo. Por ejemplo, la clase Cuadrado que originalmente est escrita de la siguiente forma: public class Cuadrado { private double lado; public void setLado(double dato) { lado = dato; } /* aqu va ms cdigo */

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

111 / 141

} Tambin podra escribirse de la siguiente forma: public class Cuadrado { private double lado; public void setLado(double lado) { this.lado = lado; } /* aqu va ms cdigo */ } En este ejemplo no se le ve mucha utilidad. Sin embargo, es indispensable su uso en diversas ocasiones, adems de que algunos ambientes de desarrollo generan el cdigo automticamente como se muestra en la segunda versin.

DIFERENCIAS ENTRE C Y JAVA


Las diferencias ms significativas entre los lenguajes C y Java son las siguientes:

(Indice)

En lenguaje Java los apuntadores son implcitos, por tanto no existen los operadores ligados a stos y la sintaxis se vuelve ms natural. No se admite el operador de asignacin dentro de la condicin del if; solamente se admite el operador de comparacin, lo cual evita varios dolores de cabeza a los programadores. Observe el siguiente cdigo en lenguaje C: scanf("%d", &opcion); if (opcion = 1) printf("\nUsted desea ver Amores Perros"); else printf("\nUsted desea ver Babel"); El resultado siempre ser Usted desea ver Amores Perros, porque if (opcion = 1) debe interpretarse como asigna 1 a opcion y, si lo pudiste hacer (lo cual siempre es cierto), contina. En realidad lo que debera haberse puesto es if (opcion == 1). Para evitar estas confusiones, el compilador de Java slo admite if (opcion == 1).

En Java existen de manera natural los tipos de datos enumerados. En Java existe el tipo de dato cadena (String), con lo cual las cadenas se manejan de manera natural. Habra que aclarar que en trminos estrictos las cadenas no son un tipo de dato primitivo, sino una clase. Pero, en trminos prcticos, su manejo se da con la misma facilidad que los dems tipos de datos. Los tipos de datos en Java son diferentes de los de cualquier otro lenguaje : Descripcin Entero con signo Entero con signo Valor mnimo / mximo -128 a 127 -32768 a 32767
25

Tipo byte short


25

Varios autores; Programacin en Java 2; McGraw-Hill (Schaum); Espaa, 2005; pg. 12.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

112 / 141

int long float double char boolean

entero con signo entero con signo real de simple precisin real de doble precisin caracteres unicode verdadero o falso

-2147483648 a 2147483647 -922117036854775808 a 92117036854775807 3.40282347e+38 a 1.40239846e-45 \u0000 a \uFFFF true o false
1.79769313486231570e+308 a 4.94065645841246544-324

Los tipos por omisin son double e int. Para indicar que una cantidad se trata de un tipo de dato flotante, se seala el valor y a continuacin se coloca una f (minscula o mayscula). Por ejemplo, 0.45f. Tip didctico: al inicio se recomienda que por facilidad de manejo se empleen nicamente estos tipos de datos.

EJERCICIOS SUGERIDOS

(Indice)

Capture la clase cuadrado, complela y ejectela desde el directorio en que se encuentra el sistema operativo. Agregue la variable de entorno, mueva la clase Cuadrado a un directorio creado para los programas Java y repita el proceso desde ese directorio (compilacin y ejecucin). Realice el cdigo de la clase Bacteria, con las siguientes especificaciones.

Esta clase asume que las bacterias se duplican en un periodo determinado (es un comportamiento tpico de seres microscpicos); el fallecimiento se da de manera individual. En este caso la poblacin inicial es, de manera forzosa, de 400 individuos (ciertamente, es un supuesto demasiado rgido, pero ejemplifica la forma de manejar constructores sin parmetros). Bacteria individuos: entero = 400 Bacteria () getIndividous(): entero duplica () muere ()

+ + + +

Realice una clase que simule el lanzamiento de un dado, es decir, que devuelva un nmero al azar entre 1 y 6. Suponga que en el programa principal existe un objeto TarjetaDebito ejemplo1 y otro double x, con base en el siguiente diagrama. + + + + + TarjetaDebito saldo: double = 0 TarjetaDebito(double saldoinicial) consultarSaldo(): double meter (double cantidad): void sacar (double cantidad): bolean

A) Indique cuales instrucciones seran errneas, suponiendo que se dan desde otra clase: a) b) meter(ejemplo1,1000); ejemplo1.meter(1000);

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

113 / 141

c) x = ejemplo1.meter(1000); d) ejemplo1.saldo = ejemplo1.saldo + 6000; Respuesta: __________________________ B) Indique nombre y extensin de los archivos que se crearan en Java al capturar y compilar el programa: ____________________________________________ Complete las palabras que hacen falta. Cada inciso corresponde a una palabra. public _____(a)_____ Equilatero { private _______(b)________ lado; public ________(c)______ (double dato) { lado = dato; System.out.println("Construyendo un tringulo equiltero."); } public String toString() { return "Tringulo equiltero. Lado = " + lado; } public static void main (String [] args) { Equilatero _____(d)_________; ejemplo = ______(e)_____ equilatero(8.5); System.out.println(ejemplo.toString()); } } Respuesta: a) __________________ b) ___________________ c) ___________________ d) __________________ e) ___________________

Dada la siguiente clase: + + + + + Cuadrado lado: double Cuadrado(dato: double) perimetro(): double getLado (): double setLado (lado: double)

Haga un programa TestCuadrado.java que despliegue el rea de un cuadrado con un lado de valor 8.

BIBLIOGRAFA
Horstmannn, Cay S.; Cornell, Gary; Java 2 Fundamentos; Prentice Hall; Espaa, 2003.

(Indice)

CON QUE PROSEGUIR


(Indice)

Antes de proseguir con otros temas se recomienda hacer varios ejercicios de complejidad similar. Con que proseguir: a. Repaso de los elementos bsicos del lenguaje Java (condicionales, bifurcaciones, tipos de datos, etc.). b. Compilacin y ejecucin de varias clases en el ambiente de desarrollo a utilizar o desde modo comandos.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

114 / 141

EL USO DE MLTIPLES CLASES EN JAVA


CONTENIDO
Conocimientos previos Separando la clase del archivo de prueba La creacin de paquetes en Java Ejercicios sugeridos Bibliografa

CONOCIMIENTOS PREVIOS

(Indice)

Al llegar a este punto se recomienda que los estudiantes ya hayan realizado y compilado alguna clase sencilla.

SEPARANDO LA CLASE DEL ARCHIVO DE PRUEBA


Suponga que ya tiene codificada la clase Cuadrado. + + + + + + Cuadrado lado: double Cuadrado(dato: double) perimetro(): double area (): double getLado (): double setLado (lado: double)

(Indice)

/* Descripcin: programa que crea una clase Cuadrado con sus respectivas instrucciones de prueba. Probado con j2sdk1.4.2_05 / NetBeansIDE3.6 Elaboracin: Jos Luis Lpez Goytia */ public class Cuadrado { private double lado; public Cuadrado(double dato) { lado = dato; } public double area() { return lado * lado; } public double perimetro() { return lado * 4; } public double getLado() { return lado; } public void setLado(double dato) { lado = dato; } public static void main (String [] args) { Cuadrado mosaico; mosaico = new Cuadrado(6.0);

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

115 / 141

System.out.println(mosaico.toString()); System.out.println("El lado mide " + mosaico.getLado() + ". El permetro es " + mosaico.perimetro() + " y el rea es " + mosaico.area()); mosaico.setLado(5.0); System.out.println(mosaico.toString()); System.out.println("El lado mide " + mosaico.getLado() + ". El permetro es " + mosaico.perimetro() + " y el rea es " + mosaico.area()); } En el ejemplo anterior, la clase y las pruebas se encuentran en el mismo archivo. Esto no representa ningn problema si se trata de un solo archivo. Sin embargo, imagine que tiene un proyecto que involucra diversas clases y cada una tiene su propio main dentro del archivo. Tendramos rutinas main esparcidas a lo largo del proyecto, cuando en realidad slo debera haber una. Para solucionar esto, se crean archivos de prueba independientes de la clase. Estos archivos se llaman TestNombreDeLaClase. De esta forma, la clase no lleva main y el archivo TestNombreDeLaClase tiene las instrucciones necesarias para probar la clase. Para ejemplificar este enfoque, haremos una clase Cuadrado2 con su respectivo archivo de prueba, El diagrama de clase queda como sigue. [realizar diagrama] El cdigo de la clase Cuadrado2 contendr nicamente la clase: /* Descripcin: programa que crea una clase Cuadrado2. Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ public class Cuadrado2 { private double lado; public Cuadrado2(double dato) { lado = dato; } public double area() { return lado * lado; } public double perimetro() { return lado * 4; } public double getLado() { return lado; } public void setLado(double dato) { lado = dato; } } Y el cdigo de la clase TestCuadrado2 har las veces de archivo de prueba: /* Descripcin: programa que prueba una clase Cuadrado2 ya creada. Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ public class TestCuadrado2 { public static void main (String [] args) {

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

116 / 141

Cuadrado2 mosaico; mosaico = new Cuadrado2(6.0); System.out.println("El lado mide " + mosaico.getLado() permetro es " + mosaico.perimetro() + " y el rea mosaico.area()); mosaico.setLado(5.0); System.out.println("El lado mide " + mosaico.getLado() permetro es " + mosaico.perimetro() + " y el rea mosaico.area()); } }

+ ". El es " + + ". El es " +

LA CREACIN DE PAQUETES EN JAVA

(Indice)

Cmo se logra que los diferentes desarrolladores de Java realicen sus clases y puedan ser usadas masivamente? La respuesta son los paquetes. Las clases se compilan en el subdirectorio bin de Java (o en el directorio especificado para el proyecto en el ambiente integrado de desarrollo que se est usando). En caso de usar otro subdirectorio, se especifica obligatoriamente mediante la palabra package. Esta indicacin debe ir en la primera lnea de cdigo (sin considerar comentarios ni lneas en blanco). La instruccin queda similar a la siguiente: package caleidosystem.proyecto; public class Ejemplo /* prosigue el cdigo */ Las clases que quieran hacer uso de otras clases fuera de su paquete, tienen que indicar en donde se encuentran a travs de la palabra import. Es importante ubicar el paquete en el cual se ubican las instrucciones de Java a utilizar. La instruccin import se coloca despus de las instrucciones package; se puede indicar que utilice todas las clases de ese paquete o una clase en particular. Las instrucciones quedan similares a la siguiente: import caleidosystem.proyecto.*; import caleidosystem.proyecto.Ejemplo; // importando todas las clases // importando slo una clase

De hecho, Java incorpora por omisin el paquete java.lang.* a todas las clases para que reconozca instrucciones de uso comn (como System.out.println). Las clases de Java son realizadas por un sinnmero de empresas. Para evitar que existan paquetes con el mismo nombre, se recomienda que se utilice el nombre del dominio de la empresa en orden inverso (com.miempresa). Como el nombre del dominio es nico a nivel mundial, prcticamente se elimina la posibilidad de paquetes duplicados. Los ambientes integrados utilizan una estructura de subdirectorios ya definida. Dentro de esa estructura, el subdirectorio src se ha reservado de facto para los cdigos fuentes de las clases. Desde all se corrern los programas. La estructura fsica ser similar a la siguiente (nota: para facilitar un poco la lectura, usaremos caleidoSystem como si fuera nombre de dominio).

caleidosystemjava ejemplos src caleidosystem proyecto Cuadrado2.java

subdirectorio de proyectos java proyecto especfico directorio de clases nombre de dominio de la empresa directorio destinado de las clases nombre de la clase

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

117 / 141

pruebas TestCuadrado2.java

directorio destinado a las pruebas nombre de la clase

Para ejemplificar su uso crearemos una clase relativa a un rectngulo. El diagrama de clase ser como sigue: + + + + + + + + + Rectangulo lado1: double lado2: double Rectangulo(dato1: double, dato2: double) perimetro(): double area (): double getLado1 (): double getLado2 (): double setLado1 (lado: double) setLado2 (lado: double) toString(void): String

El cdigo de Rectangulo.java /* Descripcin: programa que crea una clase Rectangulo. Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.proyecto; public class Rectangulo { private double lado1, lado2; public Rectangulo(double dato1, double dato2) { lado1 = dato1; lado2 = dato2; } public double area() { return lado1 * lado2; } public double perimetro() { return lado1 * 2 + lado2 * 2; } public double getLado1() { return lado1; } public double getLado2() { return lado2; } public void setLado1(double dato) { lado1 = dato; } public void setLado2(double dato) { lado2 = dato; } public String toString() { return "Lado1= " + lado1 + "y lado2=" + lado2 + "."; } } Cuando una clase se encuentra en el mismo paquete no es necesario utilizar la palabra import. En caso contrario, emplearn import nombredelpaqute.NombreDeLaClase; se puede utilizar un asterisco en lugar

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

118 / 141

del nombre de la clase. Observe que el nombre del paquete est todo en minsculas. El cdigo ser similar al siguiente: import com.caleidosystem.proyecto.*; o bien import com.caleidosystem.proyecto.Rectangulo;

/* Descripcin: programa que prueba una clase Rectangulo ya creada. Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.pruebas; public class TestRectangulo { public static void main (String [] args) { Rectangulo mosaico; mosaico = new Rectangulo(6.0, 5.0); System.out.println("Los lados son: " + mosaico.getLado1() + mosaico.getLado2() + "."); System.out.println("El permetro es " + mosaico.perimetro() + " es " + mosaico.area()); mosaico.setLado1(4.0); mosaico.setLado1(3.0); System.out.println("Los lados son: " + mosaico.getLado1() + mosaico.getLado2() + "."); System.out.println("El permetro es " + mosaico.perimetro() + " es " + mosaico.area()); } } Y el resultado del programa es: Los lados son: 6.0 y El permetro es 22.0 Los lados son: 3.0 y El permetro es 16.0 5.0. y el rea es 30.0 5.0. y el rea es 15.0

"

"

y el rea

"

"

y el rea

LA SOBRECARGA DE MTODOS EN JAVA

(Indice)

Una clase permite especificar mtodos con el mismo nombre y diferente nmero o tipo de parmetros. El mtodo a ejecutar se elige en razn de los parmetros sealados. Es muy comn que la carga se aplique a los constructores de la clase. Como ejemplo, revise el siguiente cdigo: /* Descripcin: programa que ejemplo la sobrecarga promedio Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.proyecto; public class Promedio { double promedio (double dato1, double dato2) { de mtodos utilizando

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

119 / 141

return ((dato1 + dato2) / 2); } int promedio (int dato1, int dato2) { return ((dato1 + dato2) / 2); } double promedio (double dato1, double dato2, double dato3) { return ((dato1 + dato2 + dato3) / 3); } public static void main (String[] args) { Promedio media = new Promedio(); System.out.println("El promedio de 3.5 y 6.7 es:" + media.promedio(3.5,6.7)); System.out.println("El promedio de 3 y 7 es:" + media.promedio(3,7)); System.out.println("El promedio de 3.1, 4.2 y 5.3 es :" + media.promedio(3.1,4.2,5.3)); } }

EJERCICIOS SUGERIDOS

(Indice)

Cree un proyecto desde el ambiente de desarrollo elegido y cree las clase Cuadrado, Cuadrado2 y TestCuadrado2. Cree en el mismo proyecto las clases Rectangulo y TestRectangulo. Cree la clase Promedio para verificar el proceso de sobrecarga.

Cree la siguiente clase, separando la clase del archivo de prueba correspondiente. Verifique que no se puede modificar el saldo directamente desde la rutina principal. Posteriormente haga el atributo
saldo pblico y confirme que s es posible accesarlo desde fuera de la clase.

+ + + + +

TarjetaDebito saldo: double TarjetaDebito(dato: double) meterDinero(dato:double) sacarDinero (): boolean getSaldo(): double

BIBLIOGRAFIA

(Indice)

Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; 906 pgs. Fowler, Martin; UML Gota a gota; Pearson; Mxico, 1999; 203 pgs.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

120 / 141

ARREGLOS EN JAVA
CONTENIDO
Conocimientos previos Manejo de arreglos en Java Ejemplo Ejercicios sugeridos Bibliografa

CONOCIMIENTOS PREVIOS

(Indice)

Se parte del hecho de que los alumnos ya conocen el concepto de arreglo y lo han codificado en algn otro lenguaje.

MANEJO DE ARREGLOS EN JAVA

(Indice)

Como primer acercamiento podra decirse que un arreglo en Java funciona igual que en C. Pero en realidad, es bastante ms que eso. . La declaracin del arreglo se almacena en el Stack Memory, mientras los datos del arreglo estn en el Heap Memory.

Stack Memory

Heap Memory

TipoDeDato[] nombreDelArreglo; nombreDelArreglo = new TipoDeDatos[nmeroDeElementos];


Figura 1. La creacin de arreglos en Java.

La declaracin se realiza como: TipoDeDato[] nombreDelArreglo; Que tambin pudiera escribirse como: TipoDeDato nombreDelArreglo[]; Es recomendable no revolver tipos. La primera sintaxis es la que recomienda SUN. Para inicializar se puede recurrir a la forma tpica, en que primero se declara y despus se asigna el valor a cada elemento:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

121 / 141

String[] nombre; nombre = new String[3]; nombre[0] = Adn; nombre[1] = Eva; nombre[2] = Otro; O bien utilizar una forma corta: String[] nombre = {Adn, Eva, Otro }; La forma corta tambin se puede aplicar a objetos. Por ejemplo: Fecha[] celebraciones = { new Fecha(1,1,2006), new Fecha(10,5,2006), new Fecha(25,12,2006) }; Este manejo permite varias posibilidades que no estaban presentes en el lenguaje C tradicional: a) El tamao del arreglo se puede crear en tiempo de ejecucin. int numeroDeElementos; /* en esta parte del cdigo se calcula el valor de x */ char[] arreglo; arreglo = new char [x]; b) Pueden crearse arreglos bidimensionales tradicionales, pero tambin se pueden crear arreglos de arreglos, cada uno con una longitud diferente. int[][] dosDimensiones = new int [2][]; dosDimensiones[0] = new int[5]; dosDimensiones[1] = new int[4] De hecho, si todos fueran de la misma longitud se recomienda asignarles en un solo paso. int[][] dosDimensiones = new int [2][5]; c) Si se vuelve a crear el arreglo se pierde el contenido anterior y se vuelve a un arreglo vaco. El arreglo anterior ser destruido posteriormente por el recolector de basura. d) Por supuesto, tambin pueden haber arreglos de objetos. e) La palabra lenght sirve para averiguar el tamao del arreglo. Finalmente, cabe citar que la funcin arraycopy permite copiar el contenido de un arreglo a otro. Su sintaxis es: System.arraycopy(arreglo1, posicion1, arreglo2, posicion2, elementosACopiar);

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

122 / 141

EJEMPLO

(Indice)

Para ejemplificar el uso de arreglos, suponga que usted quiere crear una clase que realice clculos estadsticos (promedio, desviacin estndar, etc.). El listado de nmeros se los dar al mandarla llamar, a travs de un arreglo. El programa, con su respectivo archivo de pruebas, quedara como sigue: /* Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.proyecto; public class Estadistica { private double[] datos; private int numeroDeElementos; public Estadistica (double[] elementos) { numeroDeElementos = elementos.length; datos = new double[numeroDeElementos]; System.arraycopy(elementos, 0, datos, sintaxis simplificada /* Sintaxis tradicional */ // for (int i=0; i<numeroDeElementos; i++) // datos[i] = elementos[i]; } public double promedio() { double prom, suma = 0; for (int i=0; i<numeroDeElementos; i++) suma += datos[i]; prom = suma / numeroDeElementos; return(prom); } public double desviacionEstandar() { // obtener promedio double prom, s=0; prom = promedio(); for (int i=0; i<numeroDeElementos; i++) // suma el cuadrado de las diferencias s += (datos[i] - prom) * (datos[i] - prom); s = Math.sqrt(s/numeroDeElementos); return (s); } }

0,

numeroDeElementos);

//

/* Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.pruebas; import caleidosystem.proyecto.Estadistica; public class TestEstadistica { public static void main(String[] args) { double[] listado = {3, 8, 10, 6, 4}; double resultado;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

123 / 141

Estadistica lista = new Estadistica (listado); resultado = lista.desviacionEstandar(); System.out.print("La desviacin estndar es:" + resultado); } } Destacaremos varios puntos de este programa: Observe que el arreglo en la clase no tiene longitud fija. Se establece conforme al nmero de elementos del arreglo que recibe desde fuera. El mtodo desviacionEstandar manda llamar al mtodo promedio. Se utiliza una versin simplificada para copiar archivos pero, entre comentarios, se establece el equivalente con instrucciones tradicionales. La funcin sqrt de la clase Math es una funcin esttica. Las funciones y atributos estticos son aqullos en que slo hay uno para toda la clase, independientemente de cuantos objetos de esa clase se hayan creado. Por ello se mandan llamar con la sintaxis NombreDeLaClase.Mtodo o NombreDeLaClase.Atributo, sin necesidad de saber si se han creado o no objetos de esa clase.

EJERCICIOS SUGERIDOS
Elabore el diagrama UML de la clase. Verifique que el cdigo se ejecute en su compilador. Agregue los mtodos menor y mayor a la clase.

(Indice)

(AVANZADO) Agregue el mtodo moda a la clase (la moda es el dato que se repite ms veces). Si existen ms de dos modas, que despliegue el valor mayor.

BIBLIOGRAFIA

(Indice)

Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; 906 pgs. Fowler, Martin; UML Gota a gota; Pearson; Mxico, 1999; 203 pgs.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

124 / 141

HERENCIA Y POLIMORFISMO EN JAVA


CONTENIDO
Conocimientos previos Concepto de herencia en Java Control de accesos Ejemplo de herencia Polimorfismo Ejercicios sugeridos Bibliografa Solucin de ejercicios

CONOCIMIENTOS PREVIOS

(Indice)

Se parte del hecho de que los alumnos ya conocen el concepto de arreglo en Java y su codificacin, as como el uso de paquetes.

CONCEPTO DE HERENCIA EN JAVA

(Indice)

La herencia significa que una clase hija -tambin conocida como subclase- hereda de una clase padre, todos sus atributos y sus mtodos. Para ello se emplea la palabra extends. En todo momento debe respetarse las reglas impuestas por la clase padre. Ello implica que la clase hija no puede acceder a los atributos privados de la clase padre; slo puede accesarlos a travs de los mtodos que brinda la propia clase padre. Tampoco puede brincarse a su constructor, lo cual obliga a que la primera instruccin del constructor de la clase hija sea una llamada al constructor de la clase padre. Para ello existe la palabra super. Una subclase puede aadir mtodos y atributos. En todo momento se considerar que lo atributos y mtodo de la clase hija son los propios ms los heredados. Una subclase tambin puede sustituir alguno de sus mtodos, lo cual se conoce como sobreescritura de mtodos. La sobreescritura de mtodos cancela al mtodo heredado y coloca el propio. Aqu conviene hacer una aclaracin: todos los objetos de Java heredan de la clase Object. Esto se hace de manera automtica, sin necesidad de utilizar la palabra extends.

CONTROL DE ACCESOS
En Java, el alcance de los modificadores es el siguiente: Modificador Acceso por la propia clase XXX XXX XXX Acceso por clases del mismo paquete XXX XXX Acceso por subclases

(Indice)

Acceso por cualquier clase

private default protected

XXX

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

125 / 141

public

XXX

XXX

XXX

XXX

Si no se indica el tipo de modificador, por omisin se asume que ser de tipo default.

EJEMPLO DE HERENCIA EN JAVA


Suponga el siguiente diagrama UML: TarjetaDebito # saldo : double +TarjetaDebito(saldoInicial : double) + getSaldo(): double + meterDinero (cantidad : double) : void + sacarDinero (cantidad : double) : boolean

(Indice)

TarjetaCredito - lineaDeCredito : double + TarjetaCredito (saldo : double) + TarjetaCredito (saldo : double, lineaCredito : double) + getLineaDeCredito() : double + setLineaDeCredito(cantidad: double) + sacarDinero (cantidad : double) : boolean La idea bsica es que una tarjeta de dbito slo puede disponer del monto del ahorrador. Por lo tanto, el saldo no puede ser negativo. El mtodo sacarDinero debe verificar si se cumple esta condicin, en cuyo caso debe disminuir el saldo y devolver verdadero. Por el contrario, si se desea sacar ms dinero que el saldo, no deber realizar la operacin y devolver el valor de falso. La tarjeta de crdito funciona de manera similar, pero, adems del saldo, el tarjetahabiente tiene una lnea de crdito. Podr disponer de su saldo ms la cantidad que le permita su lnea de crdito. Por eso es necesario sobrescribir el mtodo sacarDinero. El cdigo quedara como sigue: package caleidosystem.proyecto; public class TarjetaDebito { protected double saldo; public TarjetaDebito(double montoInicial) { saldo = montoInicial; } public double getSaldo() { return saldo; } public void meterDinero (double monto) { saldo += monto; } public boolean sacarDinero (double monto) { if (monto <= saldo) { saldo -= monto; return true;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

126 / 141

} else return false; } }

package caleidosystem.proyecto; public class TarjetaCredito extends TarjetaDebito { private double lineaDeCredito; public TarjetaCredito (double saldo) { super(saldo); lineaDeCredito = 0; } public TarjetaCredito (double saldo, double lineaCred) { super(saldo); lineaDeCredito = lineaCred; } public double getLineaDeCredito() { return lineaDeCredito; } public void setLineaDeCredito(double monto) { lineaDeCredito = monto; } public boolean sacarDinero (double monto) { if (monto <= saldo + lineaDeCredito) { saldo -= monto; return true; } else return false; } }

POLIMORFISMO

(Indice)

Java permite que una instancia de clase de tipo padre tambin pueda usarse para crear un objeto de tipo hijo. Este objeto de manera natural podr acceder a los mtodos que le son comunes a la clase y a la subclase. Qu sucedera si se quisiera acceder a los mtodos de la subclase que no contiene la clase? Se tendra que declarar una instancia de la subclase y, mediante un forzamiento de tipos, depositar all al objeto que fue declarado en la clase. Como en mltiples ocasiones no se sabe de antemano de que tipo es el objeto -por ejemplo, cuando se recibe como parmetro- Java permite preguntarlo a travs del operador instanceof. De esa forma, nos podemos asegurar que en todo momento estamos empleando el tipo correcto de datos. Retomando el ejemplo anterior: qu pasara si una tarjeta de crdito tiene una lnea de crdito de 0, o bien si el usuario decide nunca emplear la lnea de crdito? En la prctica se convertira en una tarjeta de dbito. Puede decirse entonces que una tarjeta de crdito tambin es una tarjeta de dbito. Algo similar sucede en el caso de la herencia. Un objeto de tipo TarjetaCredito tambin es de tipo TarjetaDebito. Suponga la siguiente declaracin:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

127 / 141

TarjetaCredito ejemplo = new TarjetaCredito (10000.0, 1500.0); La instruccin if (ejemplo instanceof TarjetaCredito) devolvera verdadero. Y la instruccin if (ejemplo instanceof TarjetaDebito) devolvera verdadero tambin. No sucede lo mismo de manera inversa. Una tarjeta de dbito no puede comportarse como una tarjeta de crdito. Por tanto la siguiente instruccin: TarjetaDebito ejemplo = new TarjetaDebito (10000.0); if (ejemplo instanceof Credito) devolvera falso. Si se considera ese enfoque, se podr deducir fcilmente que si hay un objeto x, la sentencia if (x instanceof Object) devolver verdadero sin importar que tipo de objeto sea x, pues todas las clases heredan automticamente de Object. A manera de ejemplo, el siguiente cdigo presenta un arreglo de objetos, en el cual se mezclan objetos de tipo TarjetaDebito y TarjetaCredito. package caleidosystem.pruebas; import caleidosystem.proyecto.*; public class TestTarjetaCredito2 { public static void main (String[] args) { TarjetaDebito arregloDeTarjetas[]; TarjetaCredito auxiliar; arregloDeTarjetas = new TarjetaDebito[5]; arregloDeTarjetas[0] = new TarjetaDebito(2000.0); System.out.println("En el lugar 0 hay una tarjeta de DEBITO con saldo de: " + arregloDeTarjetas[0].getSaldo()); arregloDeTarjetas[1] = new TarjetaCredito(2000.0, 1000.0); arregloDeTarjetas[1].sacarDinero(2500); System.out.println("En el lugar 1 hay una tarjeta de CREDITO con saldo de: " + arregloDeTarjetas[1].getSaldo()); if (arregloDeTarjetas[1] instanceof TarjetaCredito) { auxiliar = (TarjetaCredito) arregloDeTarjetas[1]; System.out.println(" y lmite de crdito de : " + auxiliar.getLineaDeCredito()); } } }

CLASES ABSTRACTAS

(Indice)

En ocasiones, se tienen los atributos de una clase y varios mtodos, pero de otros mtodos se desconoce el detalle. No obstante, s se puede establecer la interfaz hacia el exterior (nombre,

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

128 / 141

parmetros de entrada y tipo de datos de retorno). Con estos datos se establece un mtodo abstracto, cuya implementacin ser establecida por la subclase. Cuando uno o ms mtodos son abstractos, se considera que la clases como tal es abstracta. Una clase abstracta tiene constructor, pero no es posible crear objetos de estas clases porque son clases incompletas. Los objetos se declararn de tipo subclase. Conviene aclarar que la subclase est obligada a instrumentar los mtodos abstractos y puede aadir sus propios atributos y mtodos. A manera de ejemplo, imagine que en una escuela cambiar el sistema de calificaciones. En ambos sistemas se realizan tres evaluaciones parciales y un examen global. En el caso 1 se coloca la calificacin ms alta entre el promedio de las tres evaluaciones parciales y el examen global. Por ejemplo: Evaluaciones parciales 6 6 6 8 7 8 7 7 7 Promedio 6 8 7 Examen Final 7 9 5 Calificacin Definitiva 7 9 7

En el caso 2 se coloca la calificacin ms alta entre el promedio de las tres evaluaciones parciales y el examen global, pero nicamente si el promedio de las tres evaluaciones parciales es de 8 como mnimo. Si fuera menor, se coloca el resultado del examen global. Por ejemplo: Evaluaciones parciales 6 6 6 8 7 8 7 7 7 Promedio 6 8 7 Examen Final 7 9 5 Calificacin Definitiva 7 9 5

Las clases quedaran programadas de la siguiente manera:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

129 / 141

+ Curso {abstract} - parcial1: entero - parcial2: entero - parcial3: entero - global: entero + Curso (calif1, calif2, calif3, examenGlobal: entero) + cambiarCalificaciones (calif1, calif2, calif3, examenGlobal: entero): void + obtenerPromedio(): entero

+ Curso2000 + Curso2000 (calif1, calif2, calif3, examenGlobal: entero) + cambiarCalificaciones (calif1, calif2, calif3, examenGlobal: entero): void + obtenerPromedio(): entero

+ Curso2006 + Curso2006 (calif1, calif2, calif3, examenGlobal: entero) + cambiarCalificaciones (calif1, calif2, calif3, examenGlobal: entero): void + obtenerPromedio(): entero

package caleidosystem.proyecto; public abstract class Curso { private int parcial1, parcial2, parcial3, global; public Curso (int calif1, int calif2, int calif3, int examenGlobal) { parcial1 = calif1; parcial2 = calif2; parcial3 = calif3; global = examenGlobal; } public void cambiarCalificaciones (int calif1, int calif2, int calif3, int examenGlobal) { parcial1 = calif1; parcial2 = calif2; parcial3 = calif3; global = examenGlobal; } public abstract int obtenerPromedio(); }

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

130 / 141

package caleidosystem.proyecto; public class Curso2000 extends Curso { public Curso2000 (int calif1, int calif2, int calif3, int examenGlobal) { super(calif1, calif2, calif3, examenGlobal); } public int obtenerPromedio() { int sumaParcial = parcial1 + parcial2 + parcial3; int promedio; if (sumaParcial < 18) promedio = (int) (sumaParcial / 3.0); else promedio = (int) (sumaParcial / 3.0 + 0.5); if (global > promedio) return global; else return promedio; } }

package caleidosystem.proyecto; public class Curso2006 extends Curso { public Curso2006 (int calif1, int calif2, int calif3, int examenGlobal) { super(calif1, calif2, calif3, examenGlobal); } public int obtenerPromedio() { int sumaParcial = parcial1 + parcial2 + parcial3; int promedio; if (sumaParcial < 24) return global; else { promedio = (int) (sumaParcial / 3.0 + 0.5); if (global > promedio) return global; else return promedio; } } }

INTERFASES

(Indice)

Los mtodos abstractos son aqullos cuya implementacin se deja de manera obligatoria a la clase hija (subclases). La clase slo indica el encabezado: nombre de la clase, parmetros de entrada y parmetros de salida. Cuando una clase contiene uno o ms mtodos abstractos se dice que es una clase abstracta. Cuando todos los mtodos son abstractos ya no se habla propiamente de una clase abstracta, sino de una interfase. Las interfases sirven para enunciar la estructura mnima que deben contener las clases hijas. De alguna forma heredan solamente obligaciones.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

131 / 141

A manera de ejemplo, suponga que desea hacer diversas clases de polgonos, y para cada uno debe haber al menos- una rutina que calcule el rea y otra que calcule el permetro. El diagrama se muestra a continuacin, junto con las clase Rectangulo y Triangulo como clases hija.

<< interface >> + Poligono + area(): double + perimetro(): double

+ Rectangulo - lado1: double - lado2: double + area(): double + perimetro(): double + cambiarValores (dato1: double, dato2: double) + getLado1(): double + getLado2(): double El cdigo quedara para la interfase sera: package caleidosystem.proyecto; public interface Poligono { public double area(); public double perimetro(); } Mientras que Rectangulo quedar:

+ Triangulo

package caleidosystem.proyecto; public class Rectangulo implements Poligono { private double lado1, lado2; public Rectangulo(double dato1, double dato2) { lado1 = dato1; lado2 = dato2; } public double area() { return lado1 * lado2; } public double perimetro() { return lado1 * 2 + lado2 * 2; } public void cambiarValores(double dato1, double dato2) { lado1 = dato1; lado2 = dato2; } public double getLado1() { return lado1; } public double getLado2() {

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

132 / 141

return lado2; } }

El caso de Triangulo se le deja como ejercicio al lector.

EJERCICIOS SUGERIDOS
GRUPO 1

(Indice)

Conteste las siguientes preguntas: o Cuntos atributos tiene la tarjeta de crdito? o Cuntos mtodos tiene la tarjeta de dbito? o En dnde hay una situacin de sobreescritura? Verifique que el cdigo se ejecute en su compilador. Para ello cree las clases TestTarjetaDebito y TestTarjetaCredito que sirvan para probar las clases creadas. Si los programas creados no corrieran adecuadamente, comprelos con la solucin mostrada al final de este captulo (no revise la solucin hasta no haberlo intentado previamente). Cree una clase TestTarjetaCredito3 que declare un arreglo de 5 elementos de tipo TarjetaDebito. Llene el arreglo con objetos de tipo TarjetaDebito y TarjetaCredito. Posteriormente, utilizando un ciclo, despliegue el estatus de la cuenta en una lnea: tipo, saldo y, el caso de la tarjeta de crdito, lmite de crdito. (AVANZADO) Cree una clase TarjetaDebito2 y TarjetaCredito2 con la misma funcionalidad que la mostrada, pero suponiendo que el saldo fuera de tipo privado.

GRUPO 2

Cree una clase Circulo cuyo nico atributo sea dimetro y tenga los mtodos area y perimetro. Posteriormente cree una subclase Cilindro que aada el mtodo altura y tenga codificados los mtodos area y volumen. Codifique la clase Triangulo citada en el tema de interfases. Recuerde que las rutinas deben funcionar para cualquier tipo de tringulo.

A partir del siguiente diagrama, realice las clases Cuadrado, Cubo y TestCubo. Tenga especial cuidado en respetar las especificaciones de los diagramas de clase. La clase TestCubo debe desplegar lo siguiente: Suponiendo que hay un cubo de lado 3. El rea es 54. El volumen es 27. Cuadrado lado: double Cuadrado () perimetro(): double area(): double setLado (dato: double)

+ + + +

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

133 / 141

+ getLado(): double

Cubo + Cubo() + volumen(): double + area(): double

GRUPO 3

Qu desplegar el siguiente programa? public class EjemploDeHerencia { public EjemploDeHerencia() { System.out.println("Constructor padre"); } public static void main (String [] args) { EjemploDeHerencia2 objeto = new EjemploDeHerencia2(); } } class EjemploDeHerencia2 extends EjemploDeHerencia { public EjemploDeHerencia2() { System.out.println("Constructor hijo"); } } Respuesta: __________________________ __________________________ del

del

Qu desplegar el siguiente programa? public class EjemploDeSobrecarga { public void despliega() { System.out.println("Despliegue del padre"); } public static void main (String [] args) { EjemploDeSobrecarga2 objeto = new EjemploDeSobrecarga2(); objeto.despliega(); } } class EjemploDeSobrecarga2 extends EjemploDeSobrecarga { public void despliega() { System.out.println("Despliegue del hijo"); } } Respuesta: __________________________ __________________________

Suponga el siguiente caso: public class Cuadrado public double area() { return lado * lado } public class Cubo extends Cuadrado public double area() { return lado * lado * 6 }

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

134 / 141

public double volumen () { return lado * lado * lado }

a) Qu desplegar Cuadrado c = new Cubo(5.0); System.out.println(c.area()); Respuesta: __________________________

b) Con qu instrucciones se podra desplegar el volumen del cubo? ____________________________________________________ ____________________________________________________ ____________________________________________________ ____________________________________________________ Qu suceder en el siguiente caso? package caleidosystem.proyecto; public class ModificadoresDeHerencia { private void despliega () { System.out.println("Despliegue del padre"); } public static void main (String [] args) { ModificadoresDeHerencia2 objeto = new ModificadoresDeHerencia2(); objeto.despliega(); } } class ModificadoresDeHerencia2 extends ModificadoresDeHerencia { public void despliega () { System.out.println("Despliegue del hijo"); } }

Qu suceder en el siguiente caso?


package caleidosystem.proyecto; public class ModificadoresDeHerencia { public void despliega () { System.out.println("Despliegue del padre"); } public static void main (String [] args) { ModificadoresDeHerencia2 objeto = new ModificadoresDeHerencia2(); objeto.despliega(); } } class ModificadoresDeHerencia2 extends ModificadoresDeHerencia { private void despliega () { System.out.println("Despliegue del hijo"); } }

BIBLIOGRAFIA

(Indice)

Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; 906 pgs. Horstmannn, Cay S.; Cornell, Gary; Java 2 Fundamentos; Prentice Hall; Espaa, 2003.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

135 / 141

SOLUCIN DE EJERCICIOS SELECCIONADOS

(Indice)

/* Descripcin: programa que prueba una clase tarjeta de dbito. Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.pruebas; import caleidosystem.proyecto.TarjetaDebito; public class TestTarjetaDebito { public static void main (String[] args) { TarjetaDebito tarjeta = new TarjetaDebito(1000.0); System.out.println("El saldo despus de arrancar con $1000.00 es: " tarjeta.getSaldo()); tarjeta.meterDinero(500.0); System.out.println("El saldo despus de meter $500.00 es: " tarjeta.getSaldo()); if (tarjeta.sacarDinero(2000.00) == true) System.out.println("El saldo despus de sacar $2000.00 es: " tarjeta.getSaldo()); else System.out.println("No fue posible sacar $2000.00"); if (tarjeta.sacarDinero(1000.00) == true) System.out.println("El saldo despus de sacar $1000.00 es: " tarjeta.getSaldo()); else System.out.println("No fue posible sacar $1000.00"); } }

+ + +

/* Descripcin: programa que prueba una clase tarjeta de crdito. Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.pruebas; import caleidosystem.proyecto.TarjetaCredito; public class TestTarjetaCredito { public static void main (String[] args) { TarjetaCredito tarjeta = new TarjetaCredito(2000.0, 1000.0); System.out.println("El saldo despus de arrancar con $2000.00 es: " tarjeta.getSaldo()); System.out.println("La lnea de crdito es: " + tarjeta.getLineaDeCredito()); tarjeta.meterDinero(500.0); System.out.println("El saldo despus de meter $500.00 es: " tarjeta.getSaldo()); if (tarjeta.sacarDinero(3000.00) == true) { System.out.println("El saldo despus de sacar $3000.00 es: " tarjeta.getSaldo()); } else System.out.println("No fue posible sacar $3000.00"); if (tarjeta.sacarDinero(1000.00) == true) System.out.println("El saldo despus de sacar $1000.00 es: " tarjeta.getSaldo()); else System.out.println("No fue posible sacar $1000.00"); } }

+ +

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

136 / 141

COMPOSICIN EN JAVA
CONTENIDO
Conocimientos previos Concepto de composicin Ejemplo Ejercicios sugeridos Bibliografa

CONOCIMIENTOS PREVIOS

(Indice)

Se parte del hecho de que los alumnos ya conocen el concepto de arreglo y lo han codificado en algn otro lenguaje.

CONCEPTO DE COMPOSICIN

(Indice)

La composicin significa que una clase tiene como atributo un objeto de otra clase. Imagine, por ejemplo el caso de un cliente bancario que tiene una tarjeta de dbito. El diagrama quedara similar al siguiente: + CuentaDeCheques - titular: String - cuenta: TarjetaDebito - Cliente (n:String, t: TarjetaDebito) - getTitular(): String - setTitular(n:String): void - getCuenta(): TarjetaDebito - setCuenta(t:TarjetaDebito): void

+ TarjetaDebito - saldo: double + TarjetaDebito(dato: double) + meterDinero(dato:double) + sacarDinero (): boolean + getSaldo(): double

La composicin se puede abordar de manera natural si uno se acostumbra que un objeto se puede pasar como argumento. Para eso momento claro est- el objeto ya debe estar creado. Recurdese que una clase es un tipo de dato. Por tanto, en donde se pone un tipo primitivo de dato (nmeros, caracteres o datos lgicos) es posible colocar una clase.

EJEMPLO

(Indice)

A manera de gua, tmese el ejemplo de un coche conformado por un 2 puertas y 4 llantas. Las puertas y las llantas deben construirse primero para despus armar el coche. Reconocemos que el ejemplo es bastante artificial pero servir para ubicar el concepto con claridad. Los constructores respectivos desplegarn cuando ya fue construido el objeto. El cdigo de las puertas slo indicar que la puerta fue creada:

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

137 / 141

/* Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.proyecto; public class Puerta { public Puerta() { System.out.println("Construyendo un objeto puerta."); } } El cdigo de las llantas recibir algunos parmetros y sealar que fueron creadas. /* Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.proyecto; public class Llanta { private double altura; private double anchura; private double rin; public Llanta (double alto, double ancho, double radio) { altura = alto; anchura = ancho; rin = radio; System.out.println("Construyendo un objeto llanta altura = " + alto + ", anchura = " + ancho + ", rin = " + rin); } } El coche estar construido de ambos objetos: /* Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.proyecto; public class Coche { public Llanta llanta1; public Llanta llanta2; public Llanta llanta3; public Llanta llanta4; public Puerta puerta1; public Puerta puerta2; // constructor 1: construyendo un coche sin parmetros public Coche() { System.out.println("Construyendo un objeto coche."); } // constructor 2: construyendo un coche con parmetros public Coche(Llanta l1, Llanta l2, Llanta l3, Llanta l4, Puerta p1, Puerta p2) { System.out.println("Construyendo un objeto coche."); llanta1 = l1; llanta2 = l2; llanta3 = l3; llanta4 = l4;

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

138 / 141

puerta1 = p1; puerta2 = p2; } } Con finalidades didcticas, los atributos fueron declarados pblicos, lo cual permitira dos posibilidades: a) b) Crear el objeto coche y despus aadirle los objetos. Crear los objetos desde fuera y pasarlos al objeto coche como parmetros.

Por lo regular el camino b) es el ms natural. Este caso lo ejemplifica bien. El primer caso es algo as como: te vendo un coche pero no tiene llantas ni puertas. T se las pones despus. Por otra parte, el camino b) tiene mayor seguridad si los atributos llanta y puerta se hacen de naturaleza privada, en cuyo caso el camino a) ya no es posible. A continuacin ambos caminos, cada uno con un archivo de pruebas: Camino a) Crear el objeto coche y despus aadirle los objetos. /* Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.pruebas; import caleidosystem.proyecto.*; public class TestCoche { public static void main (String[] args) { Coche objetoCoche = new Coche(); objetoCoche.llanta1 = new Llanta(165.0, objetoCoche.llanta2 = new Llanta(165.0, objetoCoche.llanta3 = new Llanta(170.0, objetoCoche.llanta4 = new Llanta(170.0, objetoCoche.puerta1 = new Puerta(); objetoCoche.puerta2 = new Puerta(); } } Camino b) Crear los objetos desde fuera y pasarlos al objeto coche como parmetros. /* Probado con j2sdk1.5.0_06 / NetBeans IDE 5.0 Elaboracin: Jos Luis Lpez Goytia */ package caleidosystem.pruebas; import caleidosystem.proyecto.*; public class TestCoche2 { public static void main (String[] args) { Llanta auxLlanta1 = new Llanta(165.0, 14.0, 15.0); Llanta auxLlanta2 = new Llanta(165.0, 14.0, 15.0); Llanta auxLlanta3 = new Llanta(165.0, 14.0, 15.0); Llanta auxLlanta4 = new Llanta(165.0, 14.0, 15.0); Puerta auxPuerta1 = new Puerta(); Puerta auxPuerta2 = new Puerta(); Coche objetoCoche2 = new Coche(auxLlanta1, auxLlanta3, auxLlanta4, auxPuerta1, auxPuerta2); } }

14.0, 14.0, 15.0, 15.0,

15.0); 15.0); 14.0); 14.0);

auxLlanta2,

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

139 / 141

EJERCICIOS SUGERIDOS
Verifique que los programas se ejecuten correctamente en su entorno.

(Indice)

Cambie los parmetros de coche a privado y confirme que el camino a) ya no puede manejarse. Programe el diagrama inicial referente a la tarjeta de dbito y la cuenta de cheques.

BIBLIOGRAFIA

(Indice)

Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; 906 pgs. Fowler, Martin; UML Gota a gota; Pearson; Mxico, 1999; 203 pgs.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

140 / 141

BIBLIOGRAFA
Aho, Alfred V.; SEIT, Ravi; Ullman, Jeffrey D. Compiladores. Principios, tcnicas y herramientas; Addison Wesley Longman; Mxico, 1998; 820 pginas. Deitel; C/C++ Cmo programar y Java; Pearson; Mxico, 2004; 1113 pgs. Eckel, Bruce; Piensa en Java; Pearson Prentice Hall; segunda edicin; Espaa, 2002; pg. 3.
Fowler, Martin; UML Gota a gota; Pearson; Mxico, 1999.

Horstmannn, Cay S.; Cornell, Gary; Java 2 Fundamentos; Prentice Hall; Espaa, 2003. McConnell, Steve; Desarrollo y Gestin de Proyectos Informticos; McGraw-Hill; Espaa, 1998. 691 pginas. Meyer, Bertrand; Construccin de software Orientado a Objetos; Prentice-Hall; Segunda edicin; Madrid, 1999; 1198 pginas. Schach, Stephen R.; Anlisis y Diseo Orientado a Objetos con UML y el Proceso Unificado; McGrawHill; Mxico, 2005. Schildt, Herbert; C. Manual de Bolsillo; McGraw-Hill; Espaa, 1992; pg. 180.

Programacin bsica en C y Java (elabor: Jos Luis Lpez Goytia)

141 / 141