Sie sind auf Seite 1von 238

1

Introduccin

1.1 Conceptos Bsicos


Dato
Representacin simblica (numrica, alfanumrica).
Se puede procesar.
Informacin
Conjunto organizado de datos procesados.
Constituye un mensaje vlido para un receptor.
Computador
Mquina electrnica que procesa datos segn programas previamente almacenados en memoria, de
manera de obtener informacin
Posee caractersticas de multipropsito.

Computacin
Ciencia que estudia el proceso electrnico de datos y a las computadoras.
Informtica
Ciencia que estudia el proceso de la informacin: captacin, proceso,
generacin y distribucin; con el uso de tecnologas como la
computacin y las telecomunicaciones.
Programa
Conjunto de instrucciones lgicamente ordenadas que realizan una
tarea especfica en el computador por un periodo finito.

Computacin Programacin

Bit (BInary digiT)


Unidad mnima de procesamiento de informacin en un computador.
Es un 0 un 1.
El computador internamente trabaja con bits, es decir, con ceros y unos.

Byte:

Conjunto de 8 bits.

Unidad mnima de almacenamiento en un computador.

Constituye una unidad de medida para la capacidad de almacenamiento de un computador, ya sea


para la memoria principal o la memoria secundaria.

Hardware:
El trmino referencia a todas las componentes fsicas y concretas de un computador, considerando
a las macro componentes, tales como pantalla, teclado, mouse, etc; hasta las componentes ms
pequeas e internas, como las placas de circuitos integrados, cables, fuentes de poder, etc.
Ejemplos
Procesador
RAM
Disco Duro
Lecto-grabador de CD
Lecto-grabador de DVD
Tarjeta de Red

Software:
Trmino que identifica al conjunto de programas que entrega
a la mquina la habilidad
para poder realizar ciertas funciones especficas.
Entre los ejemplos de programas se tiene a los
Sistemas Operativos, Procesadores de texto,
planillas electrnicas, bases de datos, administradores de correo, juegos, antivirus, ambientes de
programacin, etc.

Sistema Operativo
Un sistema operativo es un conjunto de programas que administran las componentes del
computador, suministrando una interfase conveniente a los usuarios de la mquina.

Ejemplo: Windows = Sistema operativo orientado a la interfaz, que permite la interaccin


hombre-mquina a travs de grficos y ventanas que se despliegan cada vez que el usuario
ejecuta un comando.

El sistema operativo es el conjunto de algoritmos que determinan tanto la forma en que el


computador interacta con el mundo exterior, como controlar las actividades de la mquina,
gestionando sus recursos.

El sistema operativo es el software bsico que se ejecuta en un computador y es puesto en


operaciones apenas se enciende la mquina. Si no se carga un sistema operativo, la mquina no
sirve para nada.

Ejemplos de sistemas operativos:


DOS
UNIX
WINDOWS
NOVELL
LINUX
SYSTEM (Mac)
Etc

Redes de computadoras
Una red de computadoras o sistema de telecomunicaciones es el conjunto de hardware y software
compatibles y organizados para comunicar informacin de un lugar a otro.

Los componentes que la constituyen son:


Los computadores para procesar la informacin. Cada computador tiene su propia direccin
en la red, la que lo identifica como nico entre todos.
Terminales que capten y enven datos sin procesarlos en forma local.
Canales de comunicacin o enlaces mediante los cuales los
datos son transmitidos entre
los dispositivos de emisin y recepcin de datos
.
Los canales de comunicacin emplean diversos medios como:
Cables trenzados
Cables coaxiales
Fibra ptica y
Transmisin inalmbrica.

Dispositivos de comunicacin encargados de encaminar los datos desde un computador o


terminal a otro:

Mdem: Cada vez que se necesita comunicar dos computadores lejanos (a ms de una
cuadra de distancia), los datos que se envan entre ellos deben usar una seal
elctrica grande como si fuera un vehculo grande para transportarse. A este proceso se
le denomina modulacin de los datos. En el otro lado de la comunicacin es necesario

sacar los datos de esta seal transportadora, a este proceso se le denomina demodulacin
de datos.
El dispositivo que realiza la MOdulacin y la DEModulacin es el mdem.
Es comn por lo tanto que para comunicar nuestros computadores en casa a Internet se
deba utilizar un modem, independiente que la seal llegue por cable telefnico
(Movistar, Entel pcs) o por video cable (VTR)

Switch: Cuando los computadores que se van a comunicar estn cercanos (a


menos de una cuadra), para comunicarse envan los datos directamente sin modificarlos
(solo unos y ceros por el cable),
El dispositivo que permite llegar a estos datos desde un computador a
otro identificando a cada uno en forma independiente, se denomina Switch.

El computador enva
paquetes, que contienen entre
otros:
Direccin fuente
Direccin destino
Datos

Boca que se conecta a un


computador

Router: Sin importar si los datos llegan por un


modem o por un switch, cada vez que van a Internet
necesitan encontrar su camino hacia el destino que se
desea alcanzar (a veces muy distante),

10

Nuestros datos ven la red como una ruta internacional donde deben ser
encaminados desde una ruta a otra como se hace en las rotondas,
donde se busca el camino de acuerdo a nuestro destino final.
A estos elementos enrutadores, se les denomina en ingls Router

11

Los diversos software de comunicaciones que controlan las actividades de entrada y salida y
otras funciones de la red de comunicaciones.

Correo electrnico.

Gestores de intercambio de archivos (Ares, Emule).

Mensajera (MSN, Hotmail).

Un elemento fundamental en una red de computadores la constituyen los protocolos, o


conjunto de reglas y procedimientos que gobiernan la transmisin entre los componentes de la
red y que identifican un servicio.

HTTP: servicio de pginas web.


FTP: servicio para transferir archivos.
Red de rea local (LAN): todos los computadores conectados estn cercanos y se
comunican a alta velocidad. Estos computadores conectados tambin pueden tener la
capacidad para salir hacia fuera (Internet). Para efectos de la LAN, el router es un
computador ms
Red extendida (WAN): comunican redes de rea local o computadores lejanos, para
ello se requieren los routers.

12

13

Sistema de Informacin
Conjunto formal de procesos que operando sobre un grupo de datos, de acuerdo a las
necesidades de una empresa, recopila, elabora y distribuye la informacin necesaria para cualquier
tarea de un negocio, tales como: operacin, control, direccin, etc.
Ejemplos de Sistemas Computacionales
Sistema Curricular de Alumnos (online UCN)
Educa
Cajeros Automticos
Administrador de Mineras (SAP)
Reservas de pasajes en las lneas areas
Reservas de pasajes en empresas de buses

14

reas de la computacin
Lenguajes de programacin
Algoritmos y estructuras de datos
Arquitectura de computadores
Redes de computadores
Sistemas Operativos
Ingeniera de Software
Inteligencia Artificial
Interaccin humano - computador
Clculo numrico y simblico
Bases de datos
Automatizacin de procesos

15

1.2 Arquitectura de los computadores


Modelo Von Newmann

16

Partes de un computador
1. UCP (CPU):
La unidad central de procesos cumple el doble propsito de permitir la realizacin de
clculos con datos en la unidad aritmtico-lgica y controlar la ejecucin de las
instrucciones en la unidad de control.
Cach: Memoria intermedia entre la memoria RAM y el procesador, que tiene por objetivo
acelerar el proceso de ejecucin de los programas.
El procesador en vez de ejecutar de a una instruccin desde la memoria RAM, traslada
desde la RAM a la cache un bloque y ejecuta de a una instruccin desde la memoria cache. Este
proceso es cclico, ya que el procesador mientras va ejecutando las instrucciones, el controlador
de la cache cuando corresponde vuelve a buscar un bloque de memoria a la RAM
La cache es mucho ms rpida, ms cara y de menor capacidad que la RAM.

2. Memoria
Memoria principal + memoria secundaria

17

Memoria principal:

La memoria principal es el medio de almacenamiento de datos y programas. Este medio se


utiliza slo durante la fase de ejecucin de los programas.

Terminada la ejecucin, los resultados quedan almacenados en memoria secundaria,


que es de tipo permanente.

La memoria principal est dividida en RAM y ROM.


o

La memoria RAM (random Access memory) es una memoria de lectura y escritura, es


decir sus contenidos son alterables por programa, es donde se almacenan datos y
programas del usuario mientras trabaja en el computador, adems almacena el sistema
operativo mientras la mquina funciona.
El computador solo opera datos y programas que estn en esta memoria RAM, la cual
pierde su informacin si se interrumpe la energa elctrica a ella, por ello es necesario
guardar cada cierto rato los trabajos que no se quieren perder mientras se modifican.

La memoria ROM (read only memory) es una memoria cuyos contenidos no son
modificables en tiempo de ejecucin. Permite almacenar programas permanentes en el
momento de la fabricacin del computador.

18

En ella existe un pequeo programa muy bsico que solo le indica al computador como
comenzar a trabajar y operaciones muy elementales, llamado BIOS.
Se puede ver algo as en los seres humanos, al nacer que si bien tienen completo sus
manos, pies cabeza, boca, estomago (hardware), no saben leer, escribir o realizar funciones
complejas (nada han aprendido, nadie los ha programado), sin embargo si tienen hambre
lloran y si se les entrega una mamadera se la toman (ese es el ROM BIOS, rutinas que
estn desde la fabricacin, que no se pueden borrar y que permiten la operacin ms bsica
del sistema).

Unidad de medida de la memoria es el byte.

19

Memoria secundaria:
Discos:
o Permiten
mantener informacin por tiempo indefinido.
o Sus contenidos son modificables la mayora de las veces.
o Los discos son de gran importancia ya que constituyen la memoria secundaria
del sistema.
o Hoy estn cada vez ms de moda los medios de
almacenamientos de tipo flash (memorias que almacenan los datos en circuitos integrados,
que no requieren estar energizados para mantenerlos y que son bastante ms rpidos que
un disco duro convencional), por ejemplo pendrive, disco duro de estado slido.

Cuando un programa no encuentra los datos o instrucciones que requiere para operar en
la memoria principal, los debe buscar en la memoria secundaria, de esta forma la memoria se
transforma en un espacio continuo que incluye la memoria principal y la secundaria.
Este concepto se conoce como jerarqua de memoria.
Los accesos a memoria secundaria requieren de aproximadamente 1.000 a 10.000 veces el
tiempo de acceso a memoria principal, por lo que es de vital importancia para mantener los
tiempos de proceso dentro de mrgenes tolerables, reducir al mximo los accesos a memoria
secundaria.

20

Memoria virtual
Zona del disco duro tratada como parte de la memoria RAM, donde se almacenan en forma
temporal programas o trozos de ellos que no est ejecutando el procesador en ese momento y que
se encuentran en la RAM, con el objetivo de desocupar la memoria RAM para almacenar nuevos
programas y as tener la capacidad de ejecutar una mayor cantidad de programas.
Al traspaso de bloque desde la RAM a la memoria virtual y viceversa se llama swap

21

3. Entrada/salida:
La unidad de Entrada/Salida es la responsable
mundo externo a travs de los dispositivos perifricos.

Pantalla
Teclado
Impresora
Mouse
Detector de cdigo de barras
Lpiz de luz
Pantalla sensible al tacto
Escner de imgenes
Joystick
Plotters
Detector de caracteres magnticos
Terminales punto de ventas
Terminales de operaciones financieras
Dispositivos de reconocimiento de voz
Sistemas de adquisicin de datos anlogos
etc.

de comunicar el computador con el

22

Modelo Von Newmann (programas)

23

Tarjetas: Placas con un conjunto de elementos elctricos y electrnicos, en especial circuitos


integrados, que en unin realizan alguna tarea especfica.
Tarjeta madre
Tarjeta de video
Tarjeta de sonido
Tarjeta de red
etc.

24

Tarjeta madre: Es la tarjeta ms importante de un computador ya que todo se conecta a ella. Lo


que no est conectado directamente a la tarjeta madre, es un perifrico.

25

1.3 Jerga Computacional


Bootear

Iniciar el computador, encendido o arranque

Hechar a correr
Carga de archivo

Hacer funcionar un programa


Transferir datos desde y hacia un disco.
Tambin, se refiere a la transferencia de archivos desde la memoria
principal a la memoria secundaria y viceversa
Seleccionar el apagado del equipo

Bajar el computador
Resetear
Computador
pegado
Se cay
Formatea
Rutear un algoritmo

Reiniciar el equipo a travs de hardware: Un botn, una tecla o un conjunto


de teclas
Equipo en proceso que no permite la interaccin humana
Trmino anormal de un programa o alguna operacin de la mquina
Iniciar un disco en blanco
Revisin manual de un algoritmo, mediante el seguimiento paso a paso
de ste.
Es decir, se debe ir mostrando el contenido que van tomando todas
las variables que estn involucradas en el algoritmo

26

ELEMENTOS BSICOS DE PROGRAMACIN

2.1. Etapas para resolver un problema

Para resolver un problema necesitamos:


Tener una visin general del problema
Entender sus caractersticas
Identificar los datos importantes

27

28

29

a. Anlisis del problema


El objetivo de esta etapa es entender y especificar el problema que se quiere resolver. Al
finalizar:
Deben estar especificados los requerimientos funcionales
(Por ejemplo, el programa debe permitir ingresar estudiantes)
Debe estar establecida la informacin del mundo del problema (por ejemplo, contexto
UCN)
Deben estar especificados los requerimientos no funcionales
(por ejemplo, la aplicacin ser utilizada simultneamente por 3.000 usuarios, estudiantes)
b. Diseo de la solucin
El objetivo de esta etapa es detallar, usando algn lenguaje (planos, dibujos, ecuaciones,
diagramas, texto, etc.), las caractersticas que tendr la solucin antes de ser construida.
Los diseos nos van a permitir la solucin antes de comenzar el proceso de fabricacin
propiamente tal.

30

c. Construccin de la solucin
Tiene como objetivo implementar el programa a partir del diseo y probar su correcto
funcionamiento.
Implementar significa escribir el cdigo fuente en algn lenguaje de programacin como Java,
C, C# o C++. El cdigo fuente se crea y edita usando un ambiente de desarrollo, por ejemplo
DrJava.
Las pruebas de software es el proceso por el cual se busca garantizar la calidad de un
producto desarrollado. Se utiliza para identificar posibles fallas en los productos software.
Por lo tanto, el proceso de pruebas de software tiene dos objetivos:
Demostrar al desarrollador y cliente que el software satisface sus requerimientos.
Descubrir defectos en el software (comportamiento incorrecto, no deseado
que no cumple su
especificacin).

31

Pruebas de Caja Negra o testing funcional


Las condiciones de prueba se desarrollan en base a las funcionalidades del programa,
es decir, el tester
(persona dedicada a ejecutar las pruebas) requiere informacin sobre los datos de
entrada y las salidas
observadas.
Se requiere conocer cules son los resultados esperados.
No se requiere conocer cmo trabaja el software.
Debugging de un programa
Es el proceso de identificar y corregir errores de programacin.
En su forma ms bsica se puede depurar (debugging) un programa colocando, en algn lugar de
l, instrucciones para desplegar a la pantalla mensajes o resultados intermedios, de manera de
poder seguir la ejecucin del programa.

32

Ejemplo del proceso de solucin de problemas


Problema: Construccin de una casa
Se parte haciendo el anlisis, donde se ven los requerimientos de la casa (cantidad de
dormitorios, tamao de la cocina, baos, etc.). Luego se hace el diseo (planos y
maquetas) y finalmente se construye la casa. A medida que se construye la casa, se
hacen las pruebas respectivas, por ejemplo, se chequea la calidad del hormign.

33

34

2.1 Resolucin de problemas con el computador


Algoritmo de Computador
Conjunto de instrucciones ordenadas lgicamente que realizan una tarea
especfica en un periodo finito.
Un ejemplo concreto es una receta de cocina o un mueble con la
modalidad Armelo Ud. mismo.
Por ejemplo: Algoritmo para cambiar la rueda a un auto
1. Tirar del freno de mano.
2. Sacar repuesto y la gata del portamaleta.
3. Colocar la gata y aflojar pernos de la rueda averiada.
4. Levantar auto con la gata.
5. Quitar las tuercas y la rueda.
6. Colocar la rueda buena y las tuercas.
7. Bajar automvil y apretar tuercas.
8. Guardar la gata y la rueda averiada.
Los algoritmos son el medio por el cual se pueden especificar tareas, que
posteriormente podemos ensear a los computadores a travs de los
lenguajes de programacin.

35

Ejemplo: Calcular el rea de un tringulo

1.

Obtener la base del tringulo, variable b.

2.

Obtener la altura del tringulo, variable h.

3.

Multiplicar la base por la altura (b*h)

4.

Dividir el resultado de la multiplicacin en 2 y


guardar el resultado en la variable A, o sea,
A=(b*h)/2

5.

Comunicar el resultado de la operacin.

36

Ejemplo: Calcular el promedio de las tres notas de un alumno y determinar si el alumno aprob o no
el curso. (La condicin de aprobacin es promedio mayor o igual que 4)
1.

Obtener la nota 1, N1.

2.

Obtener la nota 2, N2.

3.

Obtener la nota 3, N3.

4.

Sumar las 3 notas y dividirlas por 3, P=(N1+N2+N3)/3

5.

Si P >= 4.0, entonces comunicar Aprob


Sino comunicar Reprob

37

Ejemplo: Conversin de decimal a binario


1. Obtener el nmero a convertir.
2. Guardar el nmero en la variable PE.

3. Dividir PE en 2.
4. Guardar la parte entera del resultado en la variable PE.
5. Guardar el resto de la divisin en la variable R.
6. Formar el binario.

mientras
PE > 0

38

Un algoritmo en si es algo puramente conceptual, de modo que para comunicar un algoritmo, a otra
persona o a un computador, se debe hallar alguna forma de representarlo.
Pseudocdigo

Describe un algoritmo utilizando una mezcla de frases en lenguaje comn,


instrucciones de lenguaje de programacin y palabras claves

39

Ejemplos de algoritmos utilizando pseudocdigo


Ejemplo 1
Leer (N1, N2, N3)
R N1*0.3 + N2*0.3 + N3*0.4
Escribir (R)

40

Ejemplo 2
Read (N)
C0
S0
For I= 1 to N Do
Read (Nota)
S S + Nota
if (Nota >= 4.0) then
CC+1
Endif
Endfor
R S/N
Write ('Promedio del curso',R)
Write (Numero de Alumnos aprobados', C)

41

Programa de computador

Instrucciones de computador

Lenguaje de programacin

Algoritmo escrito en un lenguaje de


programacin, que ingresado a un computador
y traducido al cdigo binario, permite que
la mquina ejecute alguna funcin.
Comandos imperativos que dirigen a la
mquina
a ejecutar una accin especfica:
Leer, escribir, asignar, preguntar, repetir
Conjunto de normas que determinan una forma
especfica de escribir un algoritmo para
computador.
Un lenguaje de programacin es el medio
mediante el cual la mquina acepta y entiende
algoritmos, expresados en una forma
compatible con los seres humanos.

42

Algunos Lenguajes

C#

Python

C++
Algol

Basic

Objective-C
Fortran

Ada

C
Java

43

La coleccin de instrucciones, cada una con su estructura semntica bien definida y una sintaxis
no ambigua, para describir un algoritmo, se denomina lenguaje de programacin.

Por sintaxis se entiende la forma en que se escribe una instruccin y por semntica, su
significado. Un programa sintcticamente correcto, no necesariamente es semnticamente correcto.

El lenguaje de programacin permite expresar algoritmos en forma de oraciones, las cuales


conducen las operaciones de las componentes de la computadora.

Ejemplos de sentencias en Java


a = 5;
for (int i = 1; i <= 5; i++){

}
if (a > b) {
a++;
b--;
}

44

Algoritmo: Estructura Lgica


Programa
Computador
Lenguaje: Formato de escritura

Pensar en lo que hara

Lo que la mquina debe hacer

45

Estrategia iterativa (refino sucesivo)

Se refinan las tareas necesarias de realizar


El refino sucesivo es la bsqueda de la solucin de un problema, detallando nivel a nivel la
solucin, es decir, las tareas necesarias de realizar para llevar a cabo una funcin.
Un problema determinado es separado funcionalmente en distintas tareas que permiten su solucin.
Las tareas definidas, por su parte, pueden nuevamente ser detalladas en sub niveles, que
determinan un tercer nivel de solucin.
As, es posible continuar hasta alcanzar cierto nivel de detalle que permita claras y sencillas
instrucciones de programacin que den cuenta de la solucin.

46

2.2 Ejemplos de refino


2.2.1

Se deben leer 2 datos desde pantalla y se debe imprimir el mayor.

Programa mayor
BEGIN
Leer datos
Ver cul es el mayor
Imprimir el mayor
END

47

2.2.2

Indicar si un alumno aprueba o reprueba un curso, a partir de tres notas.

Primer Nivel
Programa NotaFinal
begin
Leer notas
Calcular nota final
Aprueba o no?
end
Segundo nivel
Leer notas
begin
Leer nota 1
Leer nota 2
Leer nota 3
end
Aprueba o no?
begin
Si la nota final es mayor o igual a 4
imprimir Aprob
Sino, imprimir Reprob
end

48

Ejemplo: Clculo de promedio


Refino Obtener notas
Calcular NF
Entregar Resultado
La idea:
begin
Leer notas desde pantalla
Calcular nota promedio
Informar nota calculada
end
Algoritmo en Seudocdigo
Begin
Read (nota1, nota2, nota3)
NF nota1*0.3 + nota2 * 0.3 + nota3 * 0.4
Write(NF)
end

49

Lo que finalmente se traduce en .


Cdigo Java
import ucn.*;
public class Promedio
{
public static void main(String args[])
{
StdOut.print("Ingrese nota 1:");
double N1 = StdIn.readDouble();
StdOut.print("Ingrese nota 2:");
double N2 = StdIn.readDouble();
StdOut.print("Ingrese nota 3:");
double N3 = StdIn.readDouble();
double NF = (N1 + N2 + N3) / 3;
StdOut.println("Nota final: " + NF);
} // Fin main
} // Fin class Promedio

50

Lenguajes de programacin

Un lenguaje de programacin es el medio mediante el cual la mquina acepta y entiende


algoritmos, expresados en una forma compatible con los seres humanos.

Un algoritmo es un conjunto de instrucciones que lgicamente ordenadas y que requieren un tiempo


finito de desarrollo, ejecutan una tarea en el computador.

Programar o programacin: Especificar mediante un lenguaje de programacin lo que una


mquina debe hacer.

Programa: Conjunto de instrucciones y datos especificados mediante un lenguaje de programacin


que pueden ser entendibles por una mquina o software de forma automtica

A diferencia de la mayora de los humanos, las mquinas no tienen sentido comn, por lo que harn
exacta y literalmente lo que uno le indique.

51

Un algoritmo en s es algo puramente conceptual, de modo que para comunicar un algoritmo, a otra
persona o a un computador, se debe hallar alguna forma de representarlo.

La coleccin de instrucciones, cada una con su estructura semntica bien definida y una sintaxis no
ambigua, para describir un algoritmo, se denomina lenguaje de programacin.

La traduccin de una idea (algoritmo) a un lenguaje, se llama "programar"

Para poder programar una mquina necesitamos un Lenguaje de programacin, que de forma similar
al lenguaje natural que utilizamos los humanos, nos permitir comunicarnos con las mquinas e
indicarles lo que deben hacer con detalle exacto.

Al hablar de un lenguaje, por sintaxis se entiende la forma en que se escribe una instruccin y por
semntica, su significado. Un programa sintcticamente correcto, no necesariamente es
semnticamente correcto.

52

El lenguaje de programacin permite expresar algoritmos en forma de oraciones, las cuales


conducen las operaciones de las componentes de la computadora.

A partir de un algoritmo, se pueden crear varios programas que lo implementen:

o Por ejemplo en distintos lenguajes


o Con distintas tecnologas
o Pero an as ser la misma solucin al mismo problema.

53

3.1 Proceso de traduccin de un programa

Para que un computador realice una o un conjunto de tareas, es imprescindible que exista un
algoritmo puesto en la memoria principal, expresado en el lenguaje de la mquina (0 y 1).

Un programa de computador, es decir un algoritmo escrito en algn lenguaje de programacin, para


ser ejecutado por la mquina debe ser convenientemente traducido al lenguaje que entiende el
procesador, es decir, a lenguaje de mquina.

Para convertir los programas escritos en algn lenguaje de programacin a cdigo de mquina, se
debe ejecutar un proceso de traduccin, de alguna de estas formas:

Proceso de compilacin, realizado por un programa llamado compilador.

Proceso de interpretacin, realizado por un intrprete, o bien un enfoque hbrido (cdigo


intermedio).

54

La diferencia entre un compilador y un intrprete, es que el compilador traduce todas las sentencias
del programa a ceros y unos, y luego lo ejecuta. En cambio, un intrprete traduce de a una las
sentencias y las va ejecutando inmediatamente.

Proceso de compilacin

Programa en
lenguaje de alto nivel
Programa Fuente

Compilador

Programa
Objeto

55

Qu es programar?
La programacin moderna, al igual que la ciencia de la computacin, es un rea del conocimiento
que tiene poco ms de medio siglo de existencia.
Prcticamente toda la tecnologa actual incluye programacin de una u otra forma, desde un sencillo
reloj, hasta los costosos equipos mdicos o servicios de telecomunicaciones e informacin.
Programar o programacin ser para nosotros: especificar mediante un lenguaje de
programacin lo que una mquina debe hacer.
Para poder programar necesitamos (definiciones generales e incompletas por ahora):
Problema: Un problema o tema a solucionar que requiere automatizacin.
Algoritmo: Una idea general de como resolver el problema
Lenguaje de Programacin: Lenguaje que define una mecanismo, forma y significado de lo
que podemos indicarle a la mquina para implementar el algoritmo y resolver el problema
mediante un programa.
Un compilador/intrprete: Un software especializado que permite transformar o interpretar los
programas para una mquina especfica
Mquina: La mquina para ingresar el problema y visualizar la solucin

56

3.2 Errores
Al momento de programar, se cometen errores. stos se pueden clasificar en varios tipos.
a. Errores en tiempo de compilacin: El compilador de un lenguaje detecta los errores de sintaxis en
un programa fuente y otros errores bsicos. Si existe este tipo de errores, no se genera el programa
ejecutable.
b. Errores en tiempo de ejecucin: Son problemas que se presentan durante la ejecucin de un
progama. Por ejemplo, tratar de realizar una divisin por cero, lo que causara el trmino anormal
del programa.
c. Errores lgicos: Un programa puede correr, y parecer que funiona, pero produce resultados
errneos. Por ejemplo, algn clculo mal realizado ya que la forma de hacer el clculo se escribi en
forma incorrecta. El computador no tiene forma de saber que lo que uno escribe en este caso est
incorrecto!

57

3.2.1

Errores de Sintaxis Simples en Java

Mensaje de error
Error: ')' expected
Error: variable X might not have been
initialized
Error: bad operand type java.lang.X for
unary operator 'Y'
Error: not a statement

Causa comn
Falta un parntesis
Se debe asignar un valor por defecto a la
variable X indicada
No se puede aplicar el operador Y sobre la el
tipo de dato X
Lo escrito no se entiende como una sentencia
vlida del lenguaje
Error: class, interface, or enum expected Sobra una palabra clave, est mal escrita o sobra
una llave de cierre

58

3.2.2

Errores de Sintaxis en Smbolos y Tipos de Datos

Mensaje de error
Error: incompatible types
required: X
found: Y
Error: possible loss of precision
required: X
found: Y
Error: cannot find symbol
symbol: X
location: Y
Error: bad operand types for
binary operator Z
first type: X
second type: Y

Causa comn
No se puede utilizar el tipo de dato Y, se requiere el tipo X

El tipo de dato Y no es suficiente, se requiere al menos el tipo de dato X


o realizar un casting
No se conoce la variable, instruccin X en el lugar Y

No se pueden operar los tipos de datos X e Y mediante el operador Z

59

3.3 Aspectos bsicos asociados a un programa


3.3.1
Concepto de Variable
Todo dato que el programa necesita lo representa a travs de un smbolo.
Todo smbolo de un programa es una variable.
Toda variable ocupa un espacio en la memoria RAM.
El espacio utilizado por una variable en memoria puede ser:
Fijo, cuando el tamao de la misma no variar a lo largo de la ejecucin del programa.
Variable, cuando el tamao de la misma puede variar a lo largo de la ejecucin.
Cada variable posee un nombre y un contenido, repartido en la memoria RAM en celdas de
memoria
El nombre de una variable debe ser significativo.
Las variables son objetos cuyo valor puede ser modificado a lo largo de la
ejecucin de un
programa

Memoria RAM, dividida en celdas


N1 N2

NF (N1 + N2 + N3)/3
N3 NF

60

Ejemplo: Celda de memoria correspondiente a la variable X


Si ejecutamos
Declarar X

Qu pasa en la memoria?
X

X0
0
X3
3

61

Todas las variables poseen una declaracin de tipo que determina los valores que puede almacenar
y las operaciones en que puede participar.
Ejemplo: int, double, String, etc.

62

3.3.2

Concepto de Constante

Las constantes son objetos cuyo valor permanece invariable a lo largo de la ejecucin de un
programa.
Una constante es la denominacin de un valor concreto, de tal forma que se utiliza su nombre cada
vez que se necesita referenciarlo.
Debe tener un tipo y nombre

63

Ejemplo:
Celdas de memoria asociadas a las constantes PI y E
En algn lugar estn definidos dos bloques de memoria, que contiene dichos valores:

PI 3.141592
E 2.710281
3.141592 PI
2.718281 E

64

3.3.3

Tipos de Datos Bsicos

3.3.3.1

Nmeros Enteros

65

3.3.3.2

Nmeros Reales

66

3.3.3.3

Booleano

3.3.3.4

Carcter

3.3.3.5

Cadena de caracteres

67

3.3.4

Operadores

3.3.4.1

Operadores Aritmticos

Operador
+
*
/
%

Uso

Descripcin

v1 + v2
v1 - v2
v1 * v2
v1 / v2
v1 % v2

Suma v1 y v2
Resta v2 de v1
Multiplica v1 por v2
Divide v1 por v2
Calcula el resto de dividir v1 con v2

68

Nota: Aun cuando parezca extrao, los textos (o sea, los String) tambin se pueden "sumar". El
resultado de sumarle algo a un String es la concatenacin del String con la otra cosa. Por ejemplo:
String a = "hola" + "mundo";
String b = "hola" + 123;
String a = "hola";
String b = "mundo";
String c = a + b;
String a = "hola";
String b = "Mundo";
int c = 103;
String d = a + c + b;

El String a adquiere el valor "holamundo"


El String b adquiere el valor "hola123"
El String c adquiere el valor "holamundo"

El String d adquiere el valor ????

69

Operadores Relacionales
Operador

Uso

Devuelve Verdadero Si:

>

v1 > v2

v1 es mayor que v2

>=

v1 >= v2

v1 es mayor o igual que v2

<

v1 < v2

v1 es menor que v2

<=

v1 <= v2

v1 es menor o igual que v2

==

v1 == v2

v1 y v2 son iguales

!=

v1 != v2

v1 y v2 son distintos

70

Operadores Lgicos

Operador

Uso

Devuelve verdadero si...

&& (AND)

v1 && v2

v1 y v2 son ambos verdaderos

|| (OR)

v1 || v2

v1 o v2 son verdaderos

! (NOT)

!v

v es falso

71

Instrucciones
3.3.4.2 Asignacin de datos
Dar un valor a una variable de acuerdo a su tipo.
Ejemplo:
En pseudocdigo: var expresin

En Java: var = expresin;


Se guarda el resultado de la expresin en la celda de memoria asociada a variable

Ejemplo:

n1 = 6.1;
edad = 21;
NF = (n1 + n2)/3;

72

Ejemplos:
n1 = 10;
n2 = 20;
n1 = n2 + 6;
n1

n1 = 10;
n1 = n1 + 6;

n2 = 10;
n1 = n2;

n2

73

Algunos usos de la sentencia de asignacin:


3.3.4.2.1.1 Esquema contador

Uso de una variable para contar.


Sintaxis:

i = i + 1;
i ++;
Ejemplo:
..
int i = 1;
while (i <= 4) {

i++; // i = i + 1;
}

i
1
2
3
4
5

74

3.3.4.2.1.2 Esquema sumador o acumulador

Variable que suma nmeros de cualquier valor y su resultado lo guarda en la variable de asignacin
involucrada.
Sintaxis:

i
1
2
3
4
5

sumEdades = sumEdades + edad;

sum
0
1
3
6
10

Ejemplo:
..
int i = 1;
int sum = 0;
while (i <= 4) {
sum = sum + i;
//sum es un acumulador
i++; // i = i + 1;
}

75

Orden de Evaluacin de los Operadores en una expresin


En toda expresin, al realizar operaciones de todo tipo (aritmticas, lgicas), la expresin siempre se
evala en un orden especfico:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

Parntesis (comenzando por los ms internos).


Signo.
Potencias.
Productos y divisiones.
Sumas y restas.
Concatenacin.
Operadores Relacionales.
Operador de Negacin.
Operador de Conjuncin (AND, &&).
Operador de Disyuncin (OR, ||).

La evaluacin de operadores de igual orden se realiza siempre de izquierda a derecha.

76

Ejemplo 1:
( (3+2) 2 - 15 ) /2 * 5
(Math.pow(( 3
2 ) , 2) - 15) / 2 * 5
( Math.pow(5, 2)
(

25

- 15) / 2 * 5
- 15) / 2 * 5

10

/ 2*5
5

*5
25

77

Ejemplo 2:
5 2 > 4 && ! 0.5 = 1 / 2
0.5
5
2 > 4 && ! 0.5 =

> 4 && ! 0.5 =


Falso && ! 0.5

0.5

Falso

&& ! Verdadero

Falso

&&
Falso

Falso

0.5

78

Lectura de datos
Adquirir datos de dispositivos como teclado, discos, etc.
READ (n1, n2, n3)

(pseudocdigo)

En Java:
int n1 = StdIn.readInt();
double n2 = StdIn.readDouble();
String s1 = StdIn.readString();

79

3.3.4.3

Salida de datos

Enviar datos y mensajes a dispositivos como pantalla, discos, impresora, etc.


WRITE (n1, n2, n3)
En Java:
StdOut.print(n1);
StdOut.println(n2);

(pseudocdigo)

80

3.3.4.3.1 Ejemplo Lectura desde teclado y despliegue a pantalla


import ucn.*;
public class AppLecturaDesplieguePantalla
{
public static void main(String[] args)
{
// Lectura de un entero
StdOut.print("Ingrese numero entero: ");
int num = StdIn.readInt();
StdOut.println("numero: " + num);
// Lectura de un double
StdOut.print("Ingrese numero double: ");
double num5 = StdIn.readDouble();
StdOut.println("numero: " + num5);
// Lectura de un String
StdOut.print("Ingrese un string ");
String s = StdIn.readString();
StdOut.println("string: " + s);
} // Fin main
}// Fin AppLecturaDesplieguePantalla

81

3.3.4.4

Instrucciones condicionales

Permite definir distintos cursos de accin dentro de un algoritmo.


Alternativa Simple:
if (condicin) {
// instrucciones si se cumple la condicin
}

Alternativa Completa:

if (condicin) {
// instrucciones si se cumple la condicin
} else{
// instrucciones si no se cumple la condicin
}

82

Condicin: Expresin booleana que puede resultar Verdarera o Falsa. Compara a travs de
operadores y expresiones con conectores lgicos.

Las instrucciones pueden ser otros IF.

Si es una sola instruccin, no son necesarias las llaves

83

Diferencia entre el if al mismo nivel y el if anidado


Suponga
que tiene que leer un dato entero
dependiendo del valor del dato

hacer

algo diferente,

if (dato == 1){
StdOut.print(1);
}
if (dato == 2){
StdOut.print (2);
}
if (dato == 3){
StdOut.print (3);
} else {
StdOut.print (Ni 1, ni 2, ni 3);
}

Cmo funciona si dato es 1?

Entra al primer if (si dato = 1).


Como es si, imprime el 1 en la pantalla
Entra al segundo if (si dato = 2).
No se cumple la condicin. No hace nada
Entra el tercer if (si dato = 3).
No se cumple la condicin. Se
va por el else e imprime: Ni 1, ni
2, ni 3

Impresin
1
Ni 1, ni 2, ni 3

84

if (dato == 1){
StdOut.println(1);
} else {
if (dato == 2){
StdOut.println(2);
} else {
if (dato == 3){
StdOut.println(3);
} else {
StdOut.println(Ni 1, ni 2,ni 3);
}
}
}

Cmo funciona si dato es 1?


Entra al primer if (si dato = 1).
Como es si, imprime el 1 en la
pantalla y se va al final, ya que
despus viene el else, por lo tanto
no entra ah.

Impresin
1

85

Alternativa Mltiple:
switch (nomVar) {
case valor1:
// instrucciones
break;
case valor2:
// instrucciones
break;
case valorN:
// instrucciones
break;
default:
// instrucciones
}

nomVar: es el nombre de la variable.


valor1, valor2, valorN: son los valores que
puede tomar la variable nomVar. Ejemplo:
1, 2, 3,
default: es la seccin en donde se indican
las instrucciones que se ejecutarn en caso
de que la variable no tenga ninguno de los
valores especificados en los case.

86

if anidado versus switch


if (dato == 1){
StdOut.print (1);
} else {
if (dato == 2){
StdOut.print (2);
} else {
if (dato == 3){
StdOut.print (3);
} else {
StdOut.print (Ni 1, ni 2, ni 3);
}
}
switch (dato) {
}
case 1:
StdOut.print (1);
break;
case 2:
StdOut.print (2);
break;
case 3:
StdOut.print (3);
break;
default:
StdOut.print (Ni 1, ni 2, ni 3);
}

87

Ejemplos del uso del if:


i) Indicar si un alumno aprueba o reprueba un curso, a partir de tres notas.
import ucn.*;
public class AppIf1
{
public static void main(String args[])
{
StdOut.print("Ingrese la primera nota: ");
double nota1 = StdIn.readDouble();
StdOut.print("Ingrese la segunda nota: ");
double nota2 = StdIn.readDouble();
StdOut.print("Ingrese la tercera nota: ");
double nota3 = StdIn.readDouble();
double notaFinal = (nota1 + nota2 + nota3) / 3;
if (notaFinal >= 3.95) {
StdOut.println("Aprobo con nota = " + notaFinal);
} else {
StdOut.println("Reprobo con nota =" + notaFinal);
}
} // Fin main
} // Fin AppIf1

88

ii) Calcular nota final de un alumno (considere el promedio de las 3 notas parciales), bonificando la
nota final en 0.5 si todas las notas son mayores o iguales a cuatro.
import ucn.*;
public class AppIf2
{
public static void main(String args[])
{
StdOut.print("Ingrese la primera nota: ");
double nota1 = StdIn.readDouble();
StdOut.print("Ingrese la segunda nota: ");
double nota2 = StdIn.readDouble();
StdOut.print("Ingrese la tercera nota: ");
double nota3 = StdIn.readDouble();
double notaFinal = (nota1 + nota2 + nota3) / 3;
if (nota1 >= 4.0 && nota2 >= 4.0 && nota3 >= 4.0) {
if (notaFinal < 6.6) {
notaFinal = notaFinal + 0.5;
} else {
notaFinal = 7.0;
}
}
StdOut.println("nota final = " + notaFinal);
}// fin main
} // fin AppIf2

89

3.3.4.4.1 Ejercicios
i) Leer notas para 2 alumnos distintos. Determinar cual posee el mejor promedio.
Programa MejorPromedio
begin
Leer notas de los 2 alumnos
Calcular promedios para los 2 alumnos
Determinar cual promedio es mejor
End
Programa MejorPromedio
begin
Leer notas alumno 1
Leer notas alumno 2
Calcular promedio alumno1
Calcular promedio alumno2
Determinar cual promedio es mejor
end

90

ii) Indicar si un alumno repite aprueba o va a recuperativa, segn las reglas de notas y taller dadas
en el curso.
Programa CalculoNF
begin
Leer notas
Sacar Promedio
Imprimir nota final y mensaje
end

91

Instrucciones para ciclos


Posibilita la repeticin de una o ms instrucciones (ciclos)
3.3.4.4.2 for
Repite un conjunto de sentencias un nmero especfico de veces
for (inicio; condicion_termino; incremento){
// Conjunto de Sentencias
}
Ejemplo: Leer las edades de 10 personas
int edad;
for(int i=1; i<=10; i++){
StdOut.print("Ingrese edad: ");
edad = StdIn.readInt();
}

92

3.3.4.4.3 while

Repite la ejecucin de un conjunto de sentencias, de tal forma que estas se ejecutan mientras
la condicin sea verdadera.
La condicin, ser evaluada siempre antes de cada repeticin.
while(condicion_termino){
// Conjunto de Sentencias
}

Ejemplo: Leer las edades de personas hasta que se ingrese una edad igual a -1
StdOut.print("Ingrese edad: ");
int edad = StdIn.readInt();
while (edad != -1) {
StdOut.print("Ingrese edad: ");
edad = StdIn.readInt();
}

93

3.3.4.4.4 dowhile:
Repite un conjunto de sentencias de tal forma que estas se ejecutan mientras la condicin sea
verdadera. La condicin ser evaluada siempre despus de cada repeticin. El conjunto de
instrucciones se ejecuta al menos una vez.
do {
// Conjunto de Sentencias
} while (condicion_termino);
Ejemplo: Leer la edad de una persona, no se debe permitir el ingreso de una edad negativa.
int edad;
do {
edad = StdIn.readInt();
} while (edad < 0);

94

Ejemplos:
o int i = 1;
while (i <= 100) {
//Sentencias
i = i + 1; //i++
}

int i = 0;
do {
//Sentencias
i++;
} while(i<100);
for (int i = 1; i <= 100; i++){
//Sentencias
}

95

3.4 Validacin de datos de entrada y casos de prueba


a. Validacin de datos de entrada
Verificar correcta lectura de la informacin ingresada.
Verificar formatos de rut, montos, fechas, etc.
Verificar el ingreso de datos slo numricos donde corresponda.
Verificar validacin en el ingreso de los das correspondientes al mes.
Verificar validacin en el ingreso de los meses correspondientes al ao.
Verificar redaccin clara y precisa.
Verificar correcta ortografa.

Ejemplos de validacin de datos de entrada:


Se estn ingresando las edades de los alumnos, se debe validar que no pueden ser menores a
15 y mayores a 70
Se estn ingresando las notas de los alumnos y estas deben ser numricas y estar entre 1.0
y 7.0
Se est ingresando un mes, se debe validar que est entre 1 y 12.

96

Ejemplo de un tipo de validacin:


Validacin del rut
Para validar el rut se utiliza su dgito verificador, es decir, se debe comparar el dgito
verificador del rut con un dgito verificador que se calcula con los dgitos que tiene el
rut hasta antes del guin.
Si son iguales est correcto, sino significa que hay un error en el rut ingresado.
Cmo se calcula el dgito verificador (DV)?
1. Se multiplica cada dgito por un ponderador que parte en 2, se va incrementando en 1
por cada dgito y su valor mximo es 7.
Si hay ms dgitos se vuelve a partir desde el 2.
El rut se considera de atrs para adelante.
Por ejemplo, para el rut 8.064.042-0
8
*
2
=
16

0
*
7
=
0

6
*
6
=
36

4
*
5
=
20

0
*
4
=
0

4
*
3
=
12

2
*
2
=
4

97

2. Se hace la suma de los valores obtenidos anteriormente.


16 + 0 + 36 + 20 + 0 + 12 + 4 = 88
3. El resultado de la suma anterior se divide por 11, obtenindose el resto de la divisin
88 : 11 = 8
Resto de la divisin

4. Se resta 11 menos el resto de la divisin anterior


11 0 = 11
5. Si resultado
es 11 DV = 0
es 10 DV = K
est entre 1 y 9 DV = resultado

98

b. Casos de prueba

Nmero

Casos de Prueba
Datos de prueba Resultados Esperados

99

Ejemplo de un caso de prueba


Construir un programa para calcular e imprimir el promedio de edad de los estudiantes. Se leen las
edades de los estudiantes. Fin de datos, edad = -1
Casos de Prueba
Nmero Datos de prueba Resultados Esperados
1

20
19
18
-1

Edad promedio: 19

18
21
-1

Edad promedio: 19.5

-1

No se ingresaron edades

100

Algoritmos: Promedios, Bsqueda del mayor y menor

4.1 Calcular y desplegar por pantalla el promedio de notas de un curso de 100 alumnos. Se
debe leer desde pantalla la nota final de cada alumno.

Programa promedio
Begin
Inicializar acumulador de notas
For I = 1 to 100
Leer nota final
Acumular nota final
Calcular e imprimir promedio
End

Refino

101

En Java:
import ucn.*;
public class Promedio100Alumnos
{
public static void main(String args[])
{
double suma = 0;
for (int i = 1; i <= 100; i++) {
StdOut.print("Ingrese nota de un alumno: ");
double notaFinal = StdIn.readDouble();
suma = suma + notaFinal;
}
double prom = suma / 100.0;
StdOut.println("Promedio: " + prom);
}
}

102

4.2 Determinar al mejor alumno (con la mejor nota), en 1000 estudiantes. Por cada alumno se
debe leer su matrcula y su promedio de notas. Se debe desplegar el nmero de matrcula y
la nota del mejor alumno.
import ucn.*;
public class MejorAlumno
{
public static void main(String args[])
{
double mayor = 0;
String matrMayor = "";
for (int i = 1; i <= 1000; i++) {
// Lectura de los datos
StdOut.print("Ingrese matricula del alumno: ");
String mat = StdIn.readString();
StdOut.print("Ingrese promedio del alumno: ");
double prom = StdIn.readDouble();
if (prom > mayor) {
mayor = prom;
matrMayor = mat;
}
}
StdOut.println("Mayor promedio es: " + mayor +
" numero de matricula: " + matrMayor);
}
}

103

4.3 El arancel de matrcula es calculado por la frmula:


AM =
SUELDO_PADRES * 10
NHERMANOS * EDAD_ESTUDIANTE +
IMPUESTO_POR_REGION_PROCEDENCIA
Dependiendo de la regin, el impuesto es:
1. 5000
2. 1000
3. 4000
4. 10000
Cualquier otra regin: 0
Construya un algoritmo que calcule e imprima el arancel a pagar por un estudiante. Se debe leer,
desde pantalla, el sueldo de los padres, N de hermanos, edad y la regin.

Programa Arancel
Begin
Leer datos
Calcular arancel
Imprimir arancel
End

Refino

104

import ucn.*;
public class Arancel
{
public static void main(String args[])
{
// Lectura de los datos
StdOut.print("Ingrese sueldo: ");
int sueldo = StdIn.readInt();
StdOut.print("Ingrese cantidad de hermanos: ");
int cant = StdIn.readInt();
StdOut.print("Ingrese edad: ");
int edad = StdIn.readInt();
StdOut.print("Ingrese region: ");
int region = StdIn.readInt();
int impuesto;
switch (region)
case 1:
impuesto =
break;
case 2:
impuesto =
break;
case 3:
impuesto =
break;
default:
impuesto =
}

{
5000;
1000;

4000;

0;

int arancel = sueldo * 10 - cant * edad + impuesto;


StdOut.println("Arancel: " + arancel);
}
}

Nota: Hacer los cambios en el cdigo para reemplazar el switch por if

105

4.4 Leer datos de alumnos, matrcula, nota1, nota2, nota3 y desplegar el promedio de cada uno.
Son 500 estudiantes.
PROGRAMA Promedio
BEGIN
FOR I = 1 TO 500
Leer datos
Calcular Promedio
Imprimir promedio
END FOR
END

Refino

106

import ucn.*;
public class Promedio50
{
public static void main(String args[])
{
for (int i = 1; i <= 50; i++) {
// Lectura de los datos de un alumno
StdOut.print("Ingrese matricula: ");
String matr = StdIn.readString();
double n1 = StdIn.readDouble();
double n2 = StdIn.readDouble();
double n3 = StdIn.readDouble();
// Calculo del promedio
double prom = (n1 + n2 + n3) / 3;
StdOut.println("Matricula " + matr + ", promedio: " + prom);
}
}
}

107

4.5 Leer e imprimir la edad de N alumnos. N es el primer dato!


import ucn.*;
public class Leyendo_N_Edades
{
public static void main(String args[])
{
int N = StdIn.readInt();
for (int i = 1; i <= N; i++) {
// Leemos de la edad de un alumno
int edad = StdIn.readInt();
StdOut.println(edad);
}
}
}

108

4.6 Leer varios nmeros hasta encontrar un -1 y calcular su suma.


import ucn.*;
public class SumaNumerosHastaMenosUno
{
public static void main(String args[])
{
int suma = 0;
StdOut.println("Ingrese numero: ");
int num = StdIn.readInt();
while (num != -1) {
suma = suma + num;
StdOut.println("Ingrese numero: ");
num = StdIn.readInt();
}
StdOut.println("Suma: " + suma);
} // Fin main
}// Fin SumaNumeros

109

4.7 Leer una secuencia de nmeros hasta encontrar un -1, y determinar cuntas veces hubo
cambio entre signos positivos y negativos.
import ucn.*;
public class DetectarCambiosDeSignoHastaLeerMenosUno
{
public static void main(String args[])
{
int anterior = 0;
int cant = 0;
StdOut.println("Ingrese un numero: ");
int numero = StdIn.readInt();
while (numero != -1) {
if (numero * anterior < 0) {
cant++;
}
anterior = numero;
StdOut.println("Ingrese un numero: ");
numero = StdIn.readInt();
}
StdOut.println("Cambios de Signo:" + cant);
}
}

110

4.8 Leer una secuencia de 100 nmeros y determinar cuntos son divisibles por 2 y cuntos por
3.
Refino:
PROGRAMA Divisibles por 3 y por 2
BEGIN
Inicializar 2 contadores
FOR i = 1 TO 100
Leer nmero
Ver si es divisible por 2
Ver si es divisible por 3
IF (es divisible por 2) THEN
Incrementar contador de los divisibles por 2
ENDIF
IF (es divisible por 3) THEN
Incrementar contador de los divisibles por 3
ENDIF
ENDFOR
WRITE (Total nmero divisible por 2,
Contador de los divisibles por 2)
WRITE (Total nmero divisible por 3,
Contador de los divisibles por 3)
END

111

En Java:
import ucn.*;
public class Leer100NumerosYDecirDivisiblesPor2y3
{
public static void main(String args[])
{
int cantidadDivisiblePor2 = 0;
int cantidadDivisiblePor3 = 0;
for (int i = 1; i <= 100; i++) {
StdOut.print("Ingrese el item " + i + ": ");
int numero = StdIn.readInt();
// Vamos a ver si "numero" es divisible por 2
int aux2 = numero;
while (aux2 > 0) {
aux2 = aux2 - 2;
}
if (aux2 == 0) {
cantidadDivisiblePor2++;
}
// Ahora, veamos si "numero" es divisible por 3
int aux3 = numero;
while (aux3 > 0) {
aux3 = aux3 - 3;
}
if (aux3 == 0) {
cantidadDivisiblePor3++;
}
}
StdOut.println("Cantidad de divisibles por 2:" + cantidadDivisiblePor2);
StdOut.println("Cantidad de divisibles por 3:" + cantidadDivisiblePor3);
}
}

112

Nota: Hacer los cambios en el cdigo para usar la funcin resto de Java

113

4.9 Leer un nmero y determinar si es primo o no.


import ucn.*;
public class DeterminarSiUnNumeroEsPrimo
{
public static void main(String args[])
{
boolean ok = true;
int numero = StdIn.readInt();
int i = 2;
int mitad = numero / 2;
while (i <= mitad && ok) {
int auxiliar = numero;
while (auxiliar > 0) {
auxiliar = auxiliar - i;
}
if (auxiliar == 0) {
ok = false;
}
i = i + 1; // o tambin "i++"
}
StdOut.println("El nmero " + numero);
if (ok) {
StdOut.println(" es primo");
} else {
StdOut.println(" no es primo");
}
}
}

114

Nota: Hacer los cambios en el cdigo para usar la funcin resto de Java

115

4.10 Calcular la integral entre A y B, con precisin de DX para la ecuacin. A, B y DX deben


leerse desde pantalla.
f(x) = x4 - 3 x3 - 2x + 6
PROGRAM Integral
BEGIN
f(x)
Leer datos
FOR cada rectngulo
Calcular el rea
Acumular el rea f(x)
ENDFOR
Imprimir el rea resultante
END

dx b

116

import ucn.*;
public class Integral
{
public static void main(String args[])
{
StdOut.print("Ingrese A: ");
double a = StdIn.readDouble();
StdOut.print("Ingrese B: ");
double b = StdIn.readDouble();
StdOut.print("Ingrese DX: ");
double dx = StdIn.readDouble();
double area = 0;
for (double x = a; x <= b; x = x + dx) {
double fx = Math.pow(x, 4) - 3 * Math.pow(x, 3) - 2 * x + 6;
double r = dx * fx;
area = area + r;
}
StdOut.print("El rea bajo la curva es: ");
StdOut.println(area);
}
}

117

4.11 Leer registros de alumnos (matrcula, promedio) y determine los 2 nmeros de matrculas
correspondientes a los alumnos de mejores promedios. Fin de datos: matrcula = -1.
Refino:
PROGRAMA Los dos mejores
BEGIN
Leer matricula
WHILE (matrcula < > -1)
Leer promedio
Determinar el primer mayor
Determinar el segundo mayor
Leer matrcula
ENDWHILE
Imprimir el primer mayor
Imprimir el segundo mayor
END

118

En Java:
import ucn.*;
public class DosMejores
{
public static void main(String args[])
{
double mayor1 = 0;
String mat1 = " ";
double mayor2 = 0;
String mat2 = " ";
StdOut.print("Ingrese matrcula: ");
String mat = StdIn.readString();
double prom;
while (!mat.equals("-1")) {
StdOut.print("Ingrese promedio de notas: ");
prom = StdIn.readDouble();
if (prom > mayor1) {
mayor2 = mayor1;
mat2 = mat1;
mayor1 = prom;
mat1 = mat;
} else {
if (prom > mayor2) {
mayor2 = prom;
mat2 = mat;
}
}
StdOut.print("Ingrese matrcula: ");
mat = StdIn.readString();
} // Fin del while
StdOut.println("Mejor promedio: " + mayor1 + " matricula: " + mat1);
StdOut.println("Segundo mejor promedio: " + mayor2 + " matricula: " + mat2);
} // Fin main
} // Fin DosMejores

119

Programas de generacin de sucesiones y series

5.1 Conceptos bsicos


5.1.1

Sumatorias
N

t t t

Definicin:

i 1

....... t N

Propiedades:

t v t v
N

i.

i 1

i 1

ii.

ct
i 1

i 1

c t i

(c constante)

i 1

iii. Si ti = c i = 1,N (c constante)


N

t c N c
i 1

i 1

Nota:

t t t
i 1

i 1

i k 1

120

5.1.2

Productos
N

t t t

Definicin:

i 1

....... t N

Propiedades:

t v t v
N

i.

i 1

i 1

ii.

i 1

c t c t
N

i 1

i 1

(c constante)

iii. Si ti = c i = 1,N (c constante)


N

i 1

i 1

ti c c
N

Nota:

t t t
i 1

i 1

i k 1

121

5.1.3

Funcin Recursiva

Es aquella que permite evaluar una infinidad de trminos, cada uno de los cuales despus de un
cierto punto, est definido en trmino de los elementos precedentes.
Ejemplos:
5.1.3.1

Secuencia de Fibonacci:
t1 = 1, t2 = 1
tn = t n-1 + t n-2

n3

1, 1, 2, 3, 5, 8, 13, 21,........
5.1.3.2

Definicin del N factorial


n! = 1 si n = 0
n! = n (n-1)! Si n 1
Tambin:

ti = t i-1 * i
t0 = 1
1, 1, 2, 6, 24, 120,......

i>0

122

5.1.3.3 El primer trmino de una sucesin es igual a 1 y los siguientes a 3 veces el trmino
anterior.
ti = 3t i-1 i 2
t1 = 1
1, 3, 9, 27,.......

123

Funcin Posicional
Es aquella en que cada trmino es evaluado de acuerdo a su posicin en la sucesin o serie, no
requirindose la evaluacin de trminos anteriores. Por ejemplo:
5.1.3.4

Sucesin de los nmeros naturales: 1, 2, 3, 4, 5, ........


Funcin
Funcin
Recursiva
Posicional
t1 = 1
ti = i i > 0
ti = t i-1 + 1 i > 1

5.1.3.5

Sucesin de los nmeros impares: 1, 3, 5, 7, 9, ........


Funcin
Funcin
Recursiva
Posicional
t1 = 1
ti = 2i - 1 i > 0
ti = t i-1 + 2 i > 1

5.1.3.6

Sucesin de los nmeros pares: 2, 4, 6, 8, ........


Funcin
Funcin
Recursiva
Posicional
t1 = 2
ti = 2i i > 0
ti = t i-1 + 2 i > 1

124

5.1.3.7

Progresin Aritmtica, trmino inicial 5,


5, 8, 11, 14 ........
Funcin
Recursiva
F1 = 5
Fi = F i-1 + 3 i > 1

5.1.3.8

diferencia 3:

Funcin
Posicional
Fi = 5 + 3(i-1)
i>0

Progresin Aritmtica en general, trmino inicial a, diferencia d:


a, a+d, a+2d, ........, a+(i-1)d
Funcin Recursiva Funcin Posicional
F1 = a
Fi = a + d(i-1) i > 0
Fi = F i-1 + d i > 1

5.1.3.9

Progresin Geomtrica, trmino inicial 5, razn 2:


5, 10, 20, 40, 80, ........
Funcin Recursiva Funcin Posicional
F1 = 5
Fi = 5 * 2(i-1) i > 0
Fi = F i-1 * 2 i > 1

125

5.1.3.10 Progresin Geomtrica en general, trmino inicial a, razn r:


a, ar, ar2, ar3, ar4, .....,ar i-1
Funcin Recursiva Funcin Posicional
F1 = a
Fi = a * r(i-1) i > 0
Fi = F i-1 * r i > 1

126

5.1.4

Ejercicios

5.1.4.1

Determinar la funcin posicional y recursiva de la sucesin:


12, 22, 32, 42, 52,......

5.1.4.2

Expresar S mediante notacin recursiva

S 5 8 1114 ....
5.1.4.3

Expresar S mediante notacin recursiva

S xx

5.1.4.4

x x x
3

.........

Expresar S mediante notacin recursiva y posicional

S 1 1 2 1 2 3 ..... 1 2 3 ... N

127

5.1.4.5

Expresar S mediante notacin recursiva

S t1 t 3 t 5 t 7 .......
t1 = 1 ; t2 = 1 ; t3 = 2 ; t4 = 3; t5 = 5

5.1.4.6

Expresar S mediante notacin recursiva


S

3!

5!

7!

x x x x
1!

......

5.1.4.7 Construir un algoritmo para calcular la serie 1/xi hasta que el trmino sea menor a
0.0000005 (no incluir ese trmino). El valor x debe ser ledo.
Refino:
PROGRAM Serie
BEGIN
Leer x
Calcular trmino
WHILE ( trmino >= 0.0000005) DO
Acumular trmino
Obtener nuevo trmino
END WHILE
WRITE (S)
END

128

En Java:
import ucn.*;
public class Serie1
{
public static void main(String args[])
{
StdOut.print("Ingrese X:");
double x = StdIn.readDouble();
double s = 0;
double den = x;
double term = 1 / den;
while (term >= 0.0000005) {
s = s + term;
den = den * x;
term = 1 / den;
}
StdOut.println(s);
}
}

129

5.1.4.8

Genere el trmino M de la secuencia de Fibonacci.


S = 0, 1, 1, 2, 3, 5, 8, 13, M > 3

import ucn.*;
public class Fibo1
{
public static void main(String args[])
{
int anteriorUno = 0;
int anteriorDos = 1;
int nuevo = 0;
StdOut.print("Ingrese M: ");
int m = StdIn.readInt();
for (int i = 3; i <= m; i++) {
nuevo = anteriorUno + anteriorDos;
anteriorUno = anteriorDos;
anteriorDos = nuevo;
}
StdOut.println("El Fibonacci de " + m + " es
}
}

" + nuevo);

130

Procesamiento de archivos secuenciales

Un programa puede trabajar con archivos, de lectura o de escritura.


Bsicamente, lo que se requiere es habilitar el acceso de las instrucciones de lectura y escritura a
medios diferentes al teclado y la pantalla.
Al conjunto de datos almacenado en disco, ya sea para ser ledo por un programa o resultado de algn
proceso computacional, se le denomina Archivo.
En trminos formales, un Archivo es un conjunto de datos organizados en estructuras llamadas
registros, en los medios de almacenamiento secundarios, por ejemplo disco.
Un archivo est compuesto por registros o lneas de datos que conforman un grupo de informacin
que es reconocido como una unidad.
El archivo est compuesto de estas lneas de datos y se estructuran sin confundirse y perder su
significado.

131

Ejemplo:
Un archivo de alumnos que contiene datos de matrcula, nota1, nota2 y nota3.
26543
26579
26580
26583
26597

4.5
3.9
3.7
5.5
7.0

5.2
4.2
2.9
6.2
3.7

7.0
3.3
6.4 Registros de datos
1.0
4.2

6.1 Para recordar


a. Un registro tiene campos.
b. Los campos estn separados por espacios
c. Al leer los datos, los espacios en blanco se ignoran

132

Ejemplo:
25 Juan 2
25

Juan

133

d. Un archivo debe ser:


Abierto, antes de empezar a leerlo o grabarlo

Cerrado, una vez que se termin de usar

Ejemplos de archivos
26580 3.7 2.9 6.4
26583 5.5 6.2 1.0
26597 7.0 3.7 4.2

alumnos.txt
juan 20 true
pedro 19 false
maria 24 true

resultado.txt
5.1
3.6
6.5

juan 20 true 5.1


pedro 19 false 3.6
maria 24 true 6.5

134

Por ejemplo, vamos a leer el archivo "alumnos.txt", vamos a mostrar por pantalla sus contenidos y
vamos a escribir sus contenidos a otro archivo, llamado "resultado.txt".
import ucn.*;
public class Ejemplo1Archivos
{
public static void main(String[] args)
{
// Se abre el archivo de entrada
In entrada = new In("alumnos.txt");
// Se crea el archivo de salida
Out salida = new Out("resultado.txt");
while (!entrada.isEmpty()) { // Mientras no sea fin de archivo
// Se lee el registro:
// Se obtienen cada uno de los campos del registro de entrada
String nombre = entrada.readString();
int edad = entrada.readInt();
boolean pertenece = entrada.readBoolean();
double promedio = entrada.readDouble();
// Despliegue en la pantalla de los datos del registro leido
StdOut.println("Edad: " + edad + ". Nombre: " + nombre +
". Pertenece: " + pertenece + ". Promedio: " + promedio);
// Se escriben los datos al archivo de salida:
salida.print(nombre);
salida.print(edad);
salida.print(pertenece);
salida.println(promedio);
} // Fin while
// Se cierran los 2 archivos
entrada.close();
salida.close();
}// Fin main
}

135

El archivo "alumnos.txt" tiene los siguientes contenidos:


juan 20
pedro 19
maria 24

true 5.1
false 3.6
true 6.5

Despus de ejecutar el programa, cul es el contenido del archivo "resultado.txt"?


Qu tengo que hacer para que el nombre, la edad, el pertenece y el promedio no aparezcan
"pegados" unos a otros?
Cul es la diferencia entre print y println?

136

Qu pasa si me equivoco en el orden en que se leen los elementos desde el archivo de entrada?
boolean pertenece = entrada.readBoolean();
String nombre = entrada.readString();
int edad = entrada.readInt();
double promedio = entrada.readDouble();

en vez de
String nombre = entrada.readString();
int edad = entrada.readInt();
boolean pertenece = entrada.readBoolean();
double promedio = entrada.readDouble();

137

6.2 Ejemplo
Leer un archivo con datos de nombre de alumno, matrcula y tres notas, y calcular el promedio para
cada alumno y escribirlo en un archivo junto con el nombre y la matricula. Adems, escriba el
promedio general del curso en la pantalla del computador. El archivo de entrada se llama
datos.txt y el de salida resultado.txt.

138

Program Archivo
Begin
Definir el archivo de lectura datos.txt
Definir el archivo de salida resultado.txt
Inicializar contador y sumador
Mientras existan registros en el archivo Datos.txt
Begin
Leer registro del archivo Datos.txt
Obtener cada uno de los campos del registro
Calcular promedio
Grabar el registro en el archivo de resultados
Contar la cantidad de registros (cantidad de alumnos)
Acumular el promedio
End;
Calcular el promedio general
Imprimir el promedio general
Cerrar archivos
Calcular y mostrar el promedio general del curso
End.

139

import ucn.*;
public class Ejemplo2Archivos
{
public static void main(String args[])
{
In entrada = new In("datos.txt");
Out salida = new Out("resultado.txt");
int contador = 0;
double sum = 0;
while (!entrada.isEmpty()) {// Mientras no sea fin de archivo
// Leemos los datos desde el archivo de entrada
//
String nombre = entrada.readString();
String matricula = entrada.readString();
double n1 = entrada.readDouble();
double n2 = entrada.readDouble();
double n3 = entrada.readDouble();
// Se calcula el promedio
double promAl = (n1 + n2 + n3) / 3;
// Escribimos los datos al archivo de salida
salida.print(nombre);
salida.print(" ");
salida.print(matricula);

140

salida.print(" ");
salida.println(promAl);
contador++;
sum = sum + promAl;
} // Fin while

// Se cierran los archivos


entrada.close();
salida.close();
double promG;
if (contador > 0) {
promG = sum / contador;
} else {
promG = 0;
}
StdOut.println("Promedio general es: " + promG);
} // fin main
} // fin Ejemplo

141

Con el siguiente Archivo Datos.txt


Daniela_Fernandez
Jose_Ramirez
Sergio_Perez

89.446-5
92.889-0
89.234-7

3.0
3.5
4.0

4.0
3.0
4.5

Resultado.txt
Daniela_Fernandez 89.446-5 4.0
Jose_Ramirez 92.889-0 4.0
Sergio_Perez 89.234-7 4.066666666666666

5.0
5.5
3.7

142

Vectores y Matrices

7.1 Conceptos

143

Un arreglo consiste en un nmero fijo, finito y ordenado de elementos, todos del mismo tipo y bajo
un nombre comn para todos ellos.

Valor Valor Valor Valor Valor Valor Valor


1
2
3
4
5
6
7

Primer
elemento

Valor
N

ensimo
elemento

144

7.2 Tipos de arreglos:


Unidimensionales

Tipos de Arreglos

Bidimensionales

Multidimensionales

145

7.2.1

Arreglos unidimensionales (vectores)

Son arreglos de una dimensin. Tambin se denominan vectores.


Tiene un solo ndice. Cada componente del vector se direcciona mediante un nombre seguido del
nmero correspondiente al ndice entre parntesis cuadrados.
0

En Java el primer elemento SIEMPRE est en la posicin 0.


ndice
vector

del

146

Para trabajar con vectores se necesita:

Declarar el vector
Crear el vector
Insertar elementos al vector
Obtener elementos del vector

147

Ejemplo: para trabajar con un vector de nmeros enteros.


7.2.1.1

Declaracin del Vector


int [] vecNum;

Crea una referencia


para utilizar el arreglo.

148

7.2.1.2

Creacin del Vector

vecNum = new int[26];

Crea un arreglo que


puede almacenar 26
elementos de tipo int.
Los ndices de estos 26
elementos irn del 0 al
25.

149

7.2.1.3

Insercin de elementos en el Vector

for(int i=0; i<26;i++) {


vecNum[i]=i+1;
}

150

7.2.1.4 Obtener elementos


Desplegar los elementos del vector en la pantalla.
for(int i=0; i<26;i++) {
StdOut.println(vecNum[i]);
}

151

7.2.1.5 Ejemplo
Programa que lee desde el teclado la nota final de un alumno para cada una de 10 asignaturas, las
almacena en un vector y calcula e imprime su media.
Refino:
PROGRAM NOTA MEDIA
Begin
Leer notas y dejarlas en un vector de 10 posiciones
Sumar las notas
Calcular e imprimir el promedio
end

152

import ucn.*;
class EjemploVector
{
public static void main(String args[])
{
// Declaracin y creacin del vector
double[] notas = new double[10];
// Lectura de las notas e ingreso al vector
for (int i = 0; i < 10; i++) {
StdOut.print("Ingrese nota " + (i + 1));
double nota = StdIn.readDouble();
notas[i] = nota;
// Las dos lineas anteriores se pueden reemplazar con una sola lnea:
// notas[i] = PantallaEntrada.getDouble();
}
// Calculo del promedio
double suma = 0;
for (int i = 0; i < 10; i++) {
suma = suma + notas[i];
}
double prom = suma / 10.0;
StdOut.println("Promedio: " + prom);
} // Fin main
} // Fin EjemploVector

153

7.2.2

Arreglos Bidimensionales (Matrices)

Son tablas de 2 dimensiones.


Tienen dos ndices, por lo cual cada componente de la matriz se direccionan mediante su nombre
seguido de los dos ndices, donde cada uno se encuentra entre parntesis cuadrados.
0

N-1

0
1
2

M-1
MxN
Matriz de M filas y N columnas
En Java, SIEMPRE la primera fila es la 0 y la primera columna es la 0.
Siempre la primera dimensin corresponde a la fila, y la segunda a la columna.

154

7.2.2.1

Declaracin de la matriz

int [][] m;
7.2.2.2

Creacin de la matriz

m = new int[13][2];

155

7.2.2.3

Direccionamiento de un elemento
A[fila] [columna]
Identificador
Valor variable o expresin
numrica entera

Ejemplos:
int val = 0;
for(int f=0; f<13; f++) {
for(int c=0; c<2; c++){
m[f][c]= val;
val++;
}
}

156

int val = 0;
for(int c=0; c<2; c++) {
for(int f=0; f<13; f++){
m[f][c]= val;
val++;
}
}

157

En general, los elementos de una matriz se almacenan en la memoria interna de la


computadora por columnas es decir:
A(1,1), A(2,1), A(3,1), ,
A(N,1), A(N,2), A(N,3), A(N,4), , A(N,M)
A
1

N
1
2
3

158

7.2.2.4 Ejemplo
Hay una matriz de 7 filas y 9 columnas que contiene el nmero de alumnos matriculados a cada
grupo de un centro docente, por asignatura. Las filas corresponden a los grupos y las columnas a las
asignaturas. (no se ocupar ni la fila ni columna 0)
MATRICULA
1
2
30
1 35
33
2 40
23
3 25
33
4 33
44
5 45
20
6 24

Asignatura 7
3
32
40
26
33
45
22

4
32
37
21
32
44
22

5
34
36
24
34
43
24

6
35
39
24
30
40
25

7
34
40
25
32
44
24

8
28
29
15
20
33
12

Grupo 6

Hay 21 alumnos del grupo 3 en la asignatura 4


Se debe construir un algoritmo que cargue la tabla del ejemplo anterior y a continuacin calcule e
imprima el total de alumnos matriculados por asignatura.

159

El nombre de las asignaturas es el siguiente:

Asignatura Nmero 1: Matemticas


Asignatura Nmero 2: Lengua Espaola
Asignatura Nmero 3: Formacin Humanstica
Asignatura Nmero 4: Ciencias Naturales
Asignatura Nmero 5: Ingls
Asignatura Nmero 6: Informtica Bsica
Asignatura Nmero 7: Estructura de la Informacin
Asignatura Nmero 8: Metodologa de la Programacin

Program Matricula
Begin
Leer matriz
for cada asignatura:
Calcular el total de alumnos
Imprimir el total de alumnos
endfor
end

160

import ucn.*;
public class TotalAlumnos
{
public static void main(String args[])
{
int[][] matriz = new int[7][9];
String[] asig = new String[9];
asig[1]
asig[2]
asig[3]
asig[4]
asig[5]
asig[6]
asig[7]
asig[8]

=
=
=
=
=
=
=
=

"Matemticas";
"Lengua Espaola";
"Formacin Humanista";
"Ciencias Naturales";
"Ingls";
"Informacin Bsica";
"Estructura de la Informacin";
"Metodologa de la Programacin";

for (int f = 1; f <= 6; f++) {


for (int c = 1; c <= 8; c++) {
StdOut.println("Ingrese Grupo: " + f
+ " Asignatura: " + asig[c]);
matriz[f][c] = StdIn.readInt();
}
}
StdOut.println("Alumnos matriculados");
StdOut.println("Asignatura Nmero Alumnos");
StdOut.println("---------- --------------");

161

for (int c = 1; c <= 8; c++) {


int suma = 0;
for (int f = 1; f <= 6; f++) {
suma = suma + matriz[f][c];
}
StdOut.println(asig[c] + "
" + suma);
}
} // Fin main
} // Fin TotalAlumnos

162

Algoritmos de bsqueda

Concepto de bsqueda:
Entrada: Un vector A, de tamao N y un valor a buscar.
Salida: Posicin donde se encuentra Valor. Si no est, se enva un mensaje.
Condiciones: Los datos se encuentran desordenados
8.1 Bsqueda Secuencial
int n = StdIn.readInt();
int[] A = new int[n];
for (int i = 0; i < n; i++) {
A[i] = StdIn.readInt();
}
int valor = StdIn.readInt();
// ----- Version 1 ------------int i = 0;
while (i < n && A[i] != valor) {
i++;
}
if (i == n) {
StdOut.println("valor no encontrado");
} else {
StdOut.println("valor encontrado en pos " + i);
}
// -- Fin versin 1 -------------

163

// --- Versin alternativa --------int i = -1;


do {
i++;
} while (A[i] != valor && i < n - 1);
if (A[i] == valor) {
StdOut.println("valor encontrado en pos " + i);
} else {
StdOut.println("valor no encontrado");
}
// --- Fin Versin alternativa -----

// -- Versin Versin Alternativa 2 --------int i;


for (i = 0; i < n; i++) {
if (A[i] == valor) {
StdOut.println("valor encontrado en pos " + i);
break;
}
}
if (i == n) {
StdOut.println("valor no encontrado");
}
// --- Fin -----------------------

164

// -- Versin Alternativa 2' --------int i;


boolean encontrado = false;
for (i = 0; i < n; i++) {
if (A[i] == valor) {
encontrado = true;
break;
}
}
if (encontrado == true) {
StdOut.println("valor encontrado en pos " + i);
} else {
StdOut.println("valor no encontrado");
}
// --- Fin -----------------------

165

8.2 Bsqueda Secuencial Rpida


int n = StdIn.readInt();
int[] A = new int[n + 1];
for(int i=0;i<n;i++){
A[i] = StdIn.readInt();
}
int valor = StdIn.readInt();
A[n] = valor;
int i = 0;
while(A[i] != valor){
i++;
}
if (i == n) {
StdOut.println("valor no encontrado");
} else {
StdOut.println("valor encontrado en pos " + i);
}

166

8.3 Para datos que se encuentran ordenados de menor a mayor


8.3.1

Bsqueda Secuencial
int n = StdIn.readInt();
int[] A = new int[n];
for (int i = 0; i < n; i++) {
A[i] = StdIn.readInt();
}
int valor = StdIn.readInt();
int i = 0;
while (i < n && A[i] < valor) {
i++;
}
if (i == n || A[i] > valor) {
StdOut.println("valor no encontrado");
} else {
StdOut.println("valor encontrado en pos " + i);
}

167

8.3.2

Bsqueda Binaria (para arreglos ordenados)


K: Posicin de al medio del arreglo

El algoritmo es el siguiente:
Comenzar con I=0, J=n-1 (el ltimo ndice del arreglo)
Calcular K como el ndice al medio de I y J
(*)
Comparar el valor en K con el valor buscado:
Si son iguales, xito! y Fin
Si V > A[K], hacer I = K + 1
Si V < A[K], hacer J = K - 1
Repetir desde (*)

168

int n = StdIn.readInt();
int[] A = new int[n];
int i;
for (i = 0; i < n; i++) {
A[i] = StdIn.readInt();
}
int
i =
int
int

valor = StdIn.readInt();
0;
j = n - 1;
k;

do {
k = (i + j) / 2;
if (valor > A[k]) {
i = k + 1;
} else {
j = k - 1;
}
} while (A[k] != valor && i <= j);
if (A[k] == valor) {
StdOut.println("valor encontrado en pos " + k);
} else {
StdOut.println("valor no encontrado");
}

169

8.4 Problema
Determinar el ganador de una eleccin. El programa recibe inicialmente el listado de 50 candidatos y
luego 1000 votos (los votos contienen el nombre del candidato).

candidatos
0 Stan
1 Kyle
2 Eric
Kenny
49 Jimmy

0
1
2
3
4
5

999

votos
Kenny
Kenny
Kyle
Stan
Kenny
Stan
Jimmy
Kenny

170

8.4.1

Refino

PROGRAM VOTOS
BEGIN
Leer a los 50 candidatos y dejarlos en un vector de 50 posiciones
Inicializar el contador de votos de cada candidato en 0
FOR I 1 TO 1000
READ (VOTO)
Buscar a que candidato corresponde ese voto
Incrementar el contador correspondiente
endfor
Determinar al candidato con la mayor cantidad de votos
Imprimir al candidato ganador
END

171

import ucn.*;
class Votos
{
public static void main(String args[])
{
String[] candidatos = new String[50];
int[] votos = new int[50];
int i;
for (i = 0; i < 50; i++) {
String nombre = StdIn.readString();
candidatos[i] = nombre;
votos[i] = 0; // este paso es innecesario...porque?
}
for (i = 0; i < 1000; i++) {
String nombre = StdIn.readString();
int j = 0;
while (j < 50 && !candidatos[j].equals(nombre)) {
j = j + 1;
}
if (j == 50) {
StdOut.println("Candidato no existe");
} else {
votos[j] = votos[j] + 1;
}
}
int mayor = 0;
String mejorCandidato = "NINGUNO";
for (i = 0; i <= 49; i++) {
if (votos[i] > mayor) {
mayor = votos[i];
mejorCandidato = candidatos[i];
}
}
StdOut.println(mejorCandidato + mayor);
} // fin main
}// Fin votos

172

Algoritmos de Ordenamiento

Entrada: Arreglo Desordenado


Salida: Arreglo Ordenado de menor a mayor

9.1 Ordenamiento Simple


// Lectura del vector
StdOut.println("Ingrese valor de N: ");
int N = StdIn.readInt();
int[] A = new int[N];
for (int i = 0; i < N; i++) {
StdOut.print("Ingrese valor de A[" + i + "]: ");
A[i] = StdIn.readInt();
}

173

// Ordenamiento del vector


for (int i = 0; i <= N - 2; i++) {
for (int j = i + 1; j <= N - 1; j++) {
if (A[i] > A[j]) {
int AUX = A[i];
A[i] = A[j];
A[j] = AUX;
}
}
}

// Despliegue del arreglo ordenado


for (int i = 0; i < N; i++) {
StdOut.println(A[i]);
}

174

9.2 Ordenamiento de Burbujas


// Lectura del vector
StdOut.println("Ingrese valor de N: ");
int n = StdIn.readInt();
int[] arreglo = new int[n];
for (int i = 0; i < n; i++) {
StdOut.print("Ingrese valor de arreglo[" + i + "]: ");
arreglo[i] = StdIn.readInt();
}
// Ordenamiento del vector
for (int izq = 0; izq <= n - 2; izq++)
for (int der = n - 1; der >= izq +
if (arreglo[der] < arreglo[der
int aux = arreglo[der];
arreglo[der] = arreglo[der
arreglo[der - 1] = aux;
}
}
}
// Despliegue del arreglo ordenado
for (int i = 0; i < n; i++) {
StdOut.println(arreglo[i]);
}

{
1; der--) {
- 1]) {
- 1];

175

9.3 Algoritmos de Insercin y Eliminacin


9.3.1
Eliminacin
Eliminar de un arreglo A de N elementos, el valor X.
El arreglo y X deben ser ledos.
Imprimir el arreglo resultante.
El arreglo podra estar ordenado o no.

PROGRAM Eliminar
BEGIN
Leer arreglo Leer X
Buscar la posicin donde est X en el arreglo
IF (X est en el arreglo)
Corrimiento
NN-1
Imprimir arreglo resultante
ENDIF
END
Primera posicin a correr

0
X

Segunda posicin a correr


Tercera posicin a correr

N1

176

StdOut.print("Ingrese cantidad de elementos: ");


int n = StdIn.readInt();
int[] elementos = new int[n];
for (int i = 0; i < n; i++) {
StdOut.print("Ingrese datos para pos " + i + ": ");
elementos[i] = StdIn.readInt();
}
StdOut.print("Ingrese valor a eliminar:");
int x = StdIn.readInt();
// Se busca el elemento a eliminar
int i = 0;
while (i < n && x != elementos[i]) {
i++;
}
if (i == n) {
StdOut.println("Valor no encontrado");
} else {
// Desplazamiento
for (int k = i; k < n - 1; k++) {
elementos[k] = elementos[k + 1];
}
n--; // El vector tiene un elemento menos
}
for (int j = 0; j <= n - 1; j++) {
StdOut.println(elementos[j]);
}

177

9.3.2
Insercin
Leer un arreglo de N elementos que est ordenado.
Leer un valor X e insertarlo en el arreglo de manera que se conserve el orden.
Imprimir el nuevo arreglo.
PROGRAM Insertar
BEGIN
Leer arreglo
Leer X
Buscar la posicin donde se debe insertar X para que el arreglo siga ordenado
Desplazamiento
Insertar X
NN+1
Imprimir arreglo resultante
END
0
Posicin a insertar x

Tercera posicin a correr

Segunda posicin a correr

N-1

Primera
correr

posicin

178

StdOut.print("Ingrese cantidad de elementos: ");


int n = StdIn.readInt();
int[] elementos = new int[n + 1];
for (int i = 0; i < n; i++) {
StdOut.print("Ingrese dato en pos " + i + ": ");
elementos[i] = StdIn.readInt();
}

StdOut.println("Ingrese valor a insertar: ");


int x = StdIn.readInt();

// Bsqueda de la posicin donde hacer la insercin,


// de manera de mantener el orden de los datos,
// de mayor a menor
int i = 0;
while (i <= n - 1 && x > elementos[i]) {
i++;
}
// Desplazamiento
for (int k = n; k >= i + 1; k--) {
elementos[k] = elementos[k - 1];
}
elementos[i] = x;
n++;
for (i = 0; i < n; i++) {
StdOut.println(elementos[i]);
}

179

9. FUNCIONES Y PROCEDIMIENTOS
9.1 Introduccin
Al resolver un problema complicado de programacin, es necesario utilizar la tcnica dividir
para conquistar.
Es decir, si un problema es complejo, lo puedo dividir en subproblemas, cada uno de menor
complejidad.
Cada uno de estos subproblemas, lo puedo seguir dividiendo, de tal manera de llegar a problemas
sencillos de resolver.

180

9.2 Ejemplo de Dividir para Conquistar


Construya un programa que a partir de un archivo de ventas (ventas.txt) de una empresa, determine
los diez productos ms vendidos, ordenando los resultados de menor a mayor; y los productos que no
se vendieron. El archivo de ventas contiene por cada registro el cdigo del producto (entero) y la
cantidad vendida. Adems, se tiene un archivo inventarios.txt, que contiene en cada registro el
cdigo del producto y su stock.
Considere que cada vez que procesa un registro del archivo de ventas debe actualizar el stock del
producto correspondiente.

181

Refino 1
Begin.
Generar tabla de productos
Procesar archivo de ventas
Emitir salidas
End.

cod_prod

stock cantidad

Refino 2

Generar tabla de productos


Begin
Cargar en tabla el archivo de inventarios
Dejar columna cantidad en 0
End.
Procesar archivo de ventas
Begin
while (not EOF) do
Leer un registro de ventas
Buscar en tabla de productos
Disminuir stock del producto
Actualizar columna cantidad
end while
End

Emitir salidas
Begin
Ordenar tabla artculos, por columna cantidad
Seleccionar 10 mayores
Emitir listado mayores
Seleccionar productos no vendidos (cantidad = 0)
Emitir listado no vendidos
End.

182

9.3 Programacin modular


La programacin modular es un enfoque que construye algoritmos a travs del desarrollo de
mdulos, que encapsulan la lgica en pequeos programas que pueden ser referenciados por el
programa definitivo.
La idea se sustenta en que es mejor enfrentar la solucin de un complejo problema agrupando
tareas del problema en mdulos, conceptualmente pequeos, de fcil comprensin y
unifuncionales.
La divisin del problema original en mdulos genera un conjunto de sub programas, que al ser
reunidos dan origen a una solucin final verstil, flexible y mejor presentada.
Para la construccin de mdulos o subprogramas podemos utilizar:
Procedimientos
Funciones
Un subprograma es un programa en miniatura que se incluye dentro del programa mismo para
llevar a cabo una tarea especfica.

183

184

Una gran ventaja al usar subprogramas es que permiten al programador disear el programa de tal
forma que el cuerpo principal acta como un supervisor, delegando tareas.
El enfoque modular facilita la escritura y depuracin de un programa, ya que las diferentes partes
del programa (es decir, los subprogramas) pueden ser escritos y depurados independientemente.

185

9.4 Beneficios de los subprogramas:


Disminucin de la codificacin
Simplifica la lgica
Concentra la funcionalidad
Un programa queda compuesto por un algoritmo coordinador, llamado programa principal, y un
conjunto de subprogramas, llamados rutinas o subrutinas.
Programa principal

Carga de datos

Proceso estadstico

Resultados

Carga registros Validacin


Proceso A

Proceso B

Proceso C

La coordinacin entre el programa principal y las rutinas se logra por el algoritmo del programa y
mediante la utilizacin de parmetros.

186

9.5 Criterios para descomponer en subprogramas


Si existe un grupo de sentencias que se repite muchas veces, se puede formar un subprograma con
estas sentencias, de tal manera que en cada lugar donde iban estas sentencias, se cambie por un
llamado al subprograma.
Begin Principal
____
____
____
____
____
____
____
____
____

subprograma Nombre subprograma


begin
..
end

end
Begin Principal
Llamado al subprograma
Llamado al subprograma
Llamado al subprograma
End

187

Dividir la funcionalidad del programa en partes ms sencillas, donde cada parte tenga una funcionalidad
clara y especfica.
Ejemplo:
Programa Principal

Carga de datos

Proceso estadstico

Resultados

188

Program Principal
// Declaracin de variables visibles para el programa completo
Subprograma Carga de datos
//Declaracin de variables del subprograma Carga de datos
begin
.....
end
Subprograma Proceso estadstico
//Declaracin de variables del subprograma
begin
.....
end
Subprograma Resultados
//Declaracin de variables del subprograma
begin
.....
end
begin
//del programa principal. Equivalente al main en Java
....
end //Fin del main
end //fin de todo el programa

189

9.6 Tipos de Subprogramas: Funciones y Procedimientos


9.6.1

Funciones

Una funcin es una operacin que toma uno o ms valores llamados Parmetros, los cuales
procesa por medio de sus instrucciones y retorna un solo valor (resultado).
Se localiza dentro de una instruccin

Ejemplo:
public static int calcularBono(int sueldo)
{
int bono = 0;
if (sueldo <= 450000) {
bono = 100000;
} else {
bono = 50000;
}
return bono;
}

190

9.6.2

Procedimientos

Un procedimiento es un subprograma que ejecuta un proceso especfico y ningn valor est


asociado con el nombre de dicho procedimiento, por consiguiente no existe un valor de
retorno.

Se usan como una instruccin

Ejemplo
public static void imprimir(int valor, String mensaje)
{
StdOut.println("************************");
StdOut.println("Valor: " + valor + " " + mensaje);
StdOut.println("************************");
}

191

9.6.3

Cmo seran invocados?

public class App


{
public static void main(String args[]) throws IOException
{
StdOut.print("Ingrese sueldo: ");
int sueldo = StdIn.readInt();
int bono = calcularBono(sueldo);
imprimir(bono, "El valor del bono es: ");
}
}

192

9.6.4

Aplicacin completa

import ucn.*;
public class App
{
public static int calcularBono(int sueldo)
{
int bono = 0;
if (sueldo <= 450000) {
bono = 100000;
} else {
bono = 50000;
}
return bono;
}
public static void imprimir(int valor, String mensaje)
{
StdOut.println("************************");
StdOut.println("Valor: " + valor + " " + mensaje);
StdOut.println("************************");
}
public static void main(String args[]) throws IOException
{
StdOut.print("Ingrese sueldo: ");
int sueldo = StdIn.readInt();
int bono = calcularBono(sueldo);
imprimir(bono, "El valor del bono es: ");
}
}

193

9.6.5

Cundo conviene utilizar una funcin o un procedimiento?

9.6.5.1 Tipo funcin


Se define una funcin cuando se requiere un resultado concreto.
Ejemplos:
M 3.1416 + SQRT(A)
IF (ABS(X) < 4.0) THEN
WHILE(NOT EOF(AR)) DO
Una funcin entrega un resultado que reemplaza a la invocacin, durante la ejecucin del
programa.
S S + X*PRIMO(I)

SI i = 5

S S + X*7
public static int
.
}

PRIMO(int I) {

194

Los parmetros entregados a la funcin deben coincidir con los definidos en la construccin de
la rutina.

195

9.6.5.2 Tipo procedimiento


Se define cuando se requieren varios resultados simultneos o alguna funcin como leer, imprimir
u ordenar.
Ejemplos:
LEER(M1)
ORDENA(VEC,N)
BUSCAR(M1,X,N,POSX,POSY)

Los parmetros deben coincidir con los tipos de datos esperados en la rutina.

Los nombres de los parmetros pueden cambiar cuando son invocados, puesto que se tratan de
variables distintas.

196

9.6.6

Traspaso de Parmetros

En Java el traspaso de parmetros es por valor:


o Implica que para el subprograma se crea una copia de la variable que se ha traspasado sin
afectar el valor de la variable original. Slo interesa el valor, no las modificaciones que
pueda tener dentro del subprograma.
o Son parmetros unidireccionales, que pasan informacin desde el algoritmo al
subprograma.
parmetro real

parmetro formal

197

9.6.6.1

Ejemplo

import ucn.*;

parmetro formal

public class Ejemplo


{
public static void trazaLinea(int N)
{
for (int i = 1; i <= N; i++) {
StdOut.println("*");
}
StdOut.println("");
}

public static void main(String[] Args)


{
int num = 9;
trazaLinea(num);
StdOut.println("HOLA");
trazaLinea(5);
trazaLinea(num + 2);
}
}

parmetro real

198

Qu sucede si observamos el siguiente main?


public static void main(String[] args)
{
for (int i = 1; i <= 4; i++){
trazaLinea(i);
}
}

199

9.6.6.2

Por referencia

En ciertas circunstancias se desear escribir un subprograma que sea capaz de cambiar el valor de
una variable definida desde donde se llama al subprograma.
Para que un parmetro pueda cambiar el valor de la variable definida en el enunciado de llamada,
debe ser declarada como parmetro variable (por referencia) en el encabezado del subprograma.
Implica que en el subprograma se puede afectar el valor de la variable original. Se pasa una
referencia a la posicin de memoria donde se encuentra dicho valor.
Se utilizan tanto para recibir como para transmitir informacin entre el programa que llama y el
subprograma
parmetro real

parmetro formal

200

9.6.7

Procedimientos sin parmetros

Cul ser la salida del siguiente programa?


import ucn.*;
public class SinParametros
{
public static void trazaLinea()
{
for (int i = 1; i <= 10; i++) {
StdOut.println("*");
}
StdOut.println("");
}
public static void main(String[] Args)
{
int num = 8;
trazaLinea();
StdOut.println(num + " al cuadrado " + (num * num) );
trazaLinea();
}
}

201

9.7 Ejemplo
Se tiene un programa en Java con:

Una rutina de tipo procedimiento denominada leeVector, que lee un vector de enteros. Se
traspasa como parmetros el vector y su tamao.
Una rutina de tipo procedimiento denominada imprimeVector, que imprime un vector de
enteros. El vector y su tamao se traspasan como parmetros.

Una rutina de tipo funcin que calcule la suma de los elementos del vector. El vector y su tamao
se traspasan como parmetros.

Una rutina de tipo procedimiento que modifique el contenido del vector, sumndole 1 a cada
elemento. Recibe como parmetro el vector y su tamao.

El main que invoca a las 4 rutinas anteriores.

202

import ucn.*;
public class Ejemplo1
{
public static void leeVector(int n, int[] vector) throws IOException
{
for (int i = 0; i < n; i++) {
StdOut.print("Ingrese elemento " + i + " del vector");
vector[i] = StdIn.readInt();
}
}
public static void imprimeVector(int[] vector, int n)
{
for (int i = 0; i <= n - 1; i++) {
StdOut.println("V[" + i + "]: " + vector[i]);
}
StdOut.println("");
}
public static int calculaSuma(int[] vector, int n)
{
int suma = 0;
for (int i = 0; i <= n - 1; i++) {
suma = suma + vector[i];
}
return suma;
}

203

public static void modificaVector(int[] vector, int n)


{
for (int i = 0; i <= n - 1; i++) {
vector[i]++;
}
// n++;
// Este cambio de n no se reflejara en el main,
// ya que el traspaso de parmetros es por valor.
}

public static void main(String[] args) throws IOException


{
StdOut.println("Ingrese tamao del vector: ");
int N = StdIn.readInt(); // N = 4
int[] vec = new int[N];
leeVector(N, vec);
imprimeVector(vec, N);
modificaVector(vec, N);
imprimeVector(vec, N);
StdOut.println("Suma elementos del vector:" + calculaSuma(vec, N));
} // Fin main
} // Fin Ejemplo1

204

9.7.1

Versin 2

Cambiamos la funcin leeVector:


public static int[] leeVector(int n) throws IOException
{
int[] vector = new int[n];
for (int i = 0; i < n; i++) {
StdOut.print("Ingrese elemento " + i + " del vector");
vector[i] = StdIn.readInt();
}
return vector;
}

Y modificamos el

main:

public static void main(String[] args) throws IOException


{
StdOut.println("Ingrese tamao del vector: ");
int N = StdIn.readInt(); // N = 4
int[] vec = leeVector(N);
imprimeVector(vec, N);
....

205

9.7.2

Salida por pantalla

V[0]:
V[1]:
V[2]:
V[3]:

5
10
8
3

V[0]:
V[1]:
V[2]:
V[3]:

6
11
9
4

Suma de los elementos del vector 30

206

9.8 Alcance de las variables


9.8.1

Variables Globales

Son aquellas declaradas en la clase donde est el main. No son parte ni del main ni de ningn
subprograma.

La celda de memoria para una variable global existe durante toda la ejecucin del programa.

No es conveniente hacer uso de las variables globales.

9.8.2

Variables Locales

Son aquellas que estn declaradas y definidas dentro de un subprograma, y son distintas de las
variables con el mismo nombre declaradas en cualquier parte del programa principal.

Las variables locales se crean especficamente para permitir al procedimiento ejecutar su tarea.

Las celdas de memoria para las variables locales se crean cada vez que el subprograma es llamado
y se borran cuando se sale de aqul.

El significado de una variable est confinado al procedimiento o funcin en la que est


declarada.
Cuando otro subprograma utiliza el mismo nombre se refiere a una posicin de memoria diferente.

207

9.9 Ejemplos
9.9.1

Ejemplo 1

Construir una rutina de tipo procedimiento que imprime un vector. La rutina se invoca como
imprime(V1,N)
public static void imprime(int[] V1, int N)
{
for (int i = 1; i <= N; i++) {
StdOut.println("V[" + i + "] =" + V1[i]);
}
}

208

9.9.2
Ejemplo 2
Construir una rutina que lea una matriz cuadrada de NxN

Como Procedimiento. La matriz y N se traspasan como parmetro


Como Funcin. N se traspasa como parmetro
Procedimiento
public static void leeMatriz(int N, int[][] matriz) throws IOException
{
for (int i = 0; i < N; i++) {
StdOut.println("Ingresando datos de la fila " + i);
for (int j = 0; j < N; j++) {
StdOut.println("columna " + j);
matriz[i][j] = StdIn.readInt();
}
}
}

209

Funcin
public static int[][] leeMatriz(int N) throws IOException
{
int[][] matriz = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
StdOut.println("Ingresando datos de la fila " + i + "columna " + j);
matriz[i][j] = StdIn.readInt();
}
}
return matriz;
}

210

9.9.3

Ejemplo 3

Calcular la siguiente serie, en donde PRIMO(i) calcula el nmero primo de posicin I. Suponga que x
es entero.

Quinto nmero primo


Primer nmero primo
Tercer nmero primo

N
x*primo(i) = x*1 + x*2 + x*3 + x*5 + x*7 + x*11 + .
i=1
Segundo nmero primo

Cuarto nmero primo

Seudocdigo:
BEGIN
S0
READ (N,X)
FOR I = 1 TO N
S S + X * PRIMO(I)
ENDFOR
WRITE (S)
END

211

En Java:
import ucn.*;
public class Ejemplo3
{
public static int primo(int i)
{
// Posicion Primo
int posPrimo = 2;
// Numero que va a ser verificado si es primo o no
int numero = 1;
// Mientras no se calcule el primo en la posicion i
while (posPrimo <= i) {
numero++;
boolean esPrimo = true;
int divisor = 2;
// Verificacion de si numero es primo o no
while (divisor <= numero / 2 && esPrimo) {
if ((numero % divisor) == 0) {
esPrimo = false;
}
divisor++;
}
if (esPrimo == true) { posPrimo++; }
}
return numero;
}

212

public static void main(String[] Args) throws IOException


{
int S = 0; // S es un acumulador
// Lectura de N y X
int N = StdIn.readInt();
int X = StdIn.readInt();
for (int i = 1; i <= N; i++) {
S = S + X * primo(i); // Aqui se invoca a la funcion primo
}
StdOut.println("S = " + S);
} // fin main
} // fin Ejemplo3

213

9.9.4

Ejemplo 4

Leer 3 matrices de 5 x 5 y calcular:


a) Suma de matriz 1 con la 3
b) Suma de matriz 2 con la 3
c) Suma de matriz 2 a la resultante de a
d) Suma de resultado b con c
e) La suma de los elementos de la matriz 1
Seudocdigo de LeeMatriz

Procedimiento

procedure LeeMat(int [][] matriz)


BEGIN
for I = 0 to 4
for J = 0 to 4
print(Ingrese elemento fila +I+ columna + J + de la matriz);
matriz[I][J] = readInt();
endfor
endfor
end

214

function int [][]LeeMat () {


int [][] matriz = new int[5][5];
for I = 0 to 4
for J = 0 to 4
print(Ingrese elemento fila +I+
columna + J + de la matriz);
matriz[I][J] = readInt();
endfor
endfor
return matriz;
}

Seudocdigo de SumaMatriz
funcion int [ ][ ] SumaMatriz (int [][] matriz1, int [][]matriz2){
int [][] matriz3 = new int[5][5];
for I = 0 to 4
for J = 0 to 4
matriz3[I] [J] = matriz1[I] [J] + matriz2[I] [J];
endfor
endfor
return matriz3
}

215

Seudocdigo de Imprime
procedimiento Imprime (int [][] matriz){
for I = 0 to 4
for J = 0 to 4
print (matriz [I] [J] + );
Endfor
println();
endfor
}

Seudocdigo de sumaElementos
funcion int sumaElementos (int [][] matriz) {
suma = 0;
for (int i = 0 ; i<= 4; i++)
for (int j = 0 ; j<= 4; j++)
suma = suma + matriz[i][j] ;
return suma;
}

216

Seudocdigo del main


BEGIN
//Declaracin y creacin de las matrices
int [][] M1 = new int[5][5];
int [][] M2 = new int[5][5];
int [][] M3 = new int[5][5];
// LeeMat es un procedimiento
LeeMat (M1);
LeeMat (M2);
LeeMat (M3)

Invocando a la funcin
LeeMat
int [][] M1 = LeeMat();
int [][] M2 = LeeMat ();
int [][] M3 = LeeMat ();

RA SumaMat(M1, M3) // SumaMat es un funcion


RB SumaMat (M2, M3)
RC SumaMat (M2, RA)
RD SumaMat (RB, RC)
Imprime(RA) // Imprime es un procedimiento
Imprime (RB)
Imprime (RC)
Imprime (RD)
int suma sumaElementos(M1); //sumaElementos es una funcion
println(suma);
END

217

En Java, usando leeMat como procedimiento:


import ucn.*;
public class Ejemplo4
{
public static void leeMat(int[][] matriz) throws IOException
{
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 4; j++) {
StdOut.print("Ingrese elemento fila " + i +
" columna " + j + " de la matriz");
matriz[i][j] = StdIn.readInt();
}
}
} // fin leeMat
public static int[][] sumaMatriz(int[][] matriz1, int[][] matriz2)
{
int[][] matriz3 = new int[5][5];
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 4; j++) {
matriz3[i][j] = matriz1[i][j] + matriz2[i][j];
}
}
return matriz3;
}
// contina

218

public static void imprime(int[][] matriz)


{
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 4; j++) {
StdOut.print(matriz[i][j] + " ");
}
StdOut.println(" ");
}
}
public static int sumaElementos(int[][] matriz)
{
int suma = 0;
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 4; j++) {
suma = suma + matriz[i][j];
}
}
return suma;
}

public static void main(String[] Args) throws IOException


{
int[][] M1 = new int[5][5];
int[][] M2 = new int[5][5];
int[][] M3 = new int[5][5];
leeMat(M1);
leeMat(M2);
leeMat(M3);
int[][] RA = sumaMatriz(M1, M3);

219

int[][] RB = sumaMatriz(M2, M3);


int[][] RC = sumaMatriz(M2, RA);
int[][] RD = sumaMatriz(RB, RC);
imprime(RA);
imprime(RB);
imprime(RC);
imprime(RD);
StdOut.println("Suma de los elementos de la matriz M1 es: " +
sumaElementos(M1));
} // fin main
} // fin Ejemplo

220

Usando leeMat como funcin:


Modificamos leeMat:
public static int[][] leeMat() throws IOException
{
int[][] matriz = new int[5][5];
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 4; j++) {
StdOut.print("Ingrese elemento fila " + i +
" columna " + j + " de la matriz");
matriz[i][j] = StdIn.readInt();
}
}
return matriz;
} // fin leeMat

Modificamos el main:
public static void main(String[] Args) throws IOException
{
int[][] M1 = leeMat();
int[][] M2 = leeMat();
int[][] M3 = leeMat();
int[][]
int[][]
int[][]
int[][]

RA
RB
RC
RD

=
=
=
=

sumaMatriz(M1,
sumaMatriz(M2,
sumaMatriz(M2,
sumaMatriz(RB,

M3);
M3);
RA);
RC);

221

imprime(RA);
imprime(RB);
imprime(RC);
imprime(RD);
StdOut.println("Suma de los elementos de la matriz M1 es: " +
sumaElementos(M1));
} // fin main

222

9.9.5

Ejemplo 5

Una compaa ha subdivido sus empleados en dos grupos, GRUPO1 y GRUPO2. Cada empleado en GRUPO1
recibir un aumento de 25 dlares semanales, mientras que cada empleado del GRUPO2 recibir un aumento de
15 dlares a la semana.
import ucn.*;
public class AumentoSueldo
{
public static int aumento(int grupo, int salario)
{
// Calcula el nuevo salario y lo retorna
int nuevoSalario;
if (grupo == 1) {
nuevoSalario = salario + 25;
} else {
nuevoSalario = salario + 15;
}
return nuevoSalario;
}
public static void main(String[] Args) throws IOException
{
StdOut.print("Digite su grupo y su salario actual ");
int suGrupo = StdIn.readInt();
int suSalario = StdIn.readInt();
int nuevoValor = aumento(suGrupo, suSalario);
StdOut.println("Nuevo salario es $" + nuevoValor);
}
} // Fin AumentoSueldo

Cules sern los resultados emitidos del programa si ejecutamos los siguientes ejemplos?

223

Digite su grupo y su salario actual


2 280
Su nuevo salario es $........
Digite su grupo y su salario actual
1 280
Su nuevo salario es $........

224

9.9.6
Ejemplo 6
Construir un programa que contenga una funcin que lea una matriz de N x M de enteros. Los datos
vienen en un archivo datos.txt y en cada lnea viene una fila de la matriz.
N y M vienen en la primera lnea del archivo.

225

import ucn.*;
public class Ejemplo6_Funcion
{
public static int[][] leeMatriz()
{
In arch = new In("matriz.txt");
int N = arch.readInt();
int M = arch.readInt();
int[][] Mat = new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
Mat[i][j] = arch.readInt();
}
}
arch.close(); // Se cierra el archivo
return Mat;

Archivo matriz.txt:
3 5
5 7 3 1 0
2 4 5 1 3
0 1 0 2 0

}
public static void main(String[] args)
{
int[][] matriz = leeMatriz();
int N = matriz.length;
int M = matriz[0].length;
StdOut.println("N = " + N);
StdOut.println("M = " + M);
}// Fin main
} // fin Ejemplo6_Funcion

Cul ser la salida por pantalla?

226

Nota: Suponga ahora que N y M se leen desde teclado.


import ucn.*;
public class Ejemplo6_Teclado
{
public static void leeMatriz(int[][] Mat)
{
In entrada = new In("matriz.txt");
int N = Mat.length;
int M = Mat[0].length;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
Mat[i][j] = entrada.readInt();
}
}
entrada.close(); // Se cierra el archivo
}
public static void main(String[] args)
{
StdOut.print("Ingrese N: ");
int n = StdIn.readInt();
StdOut.print("Ingrese M: ");
int m = StdIn.readInt();
int[][] matriz = new int[n][m];
leeMatriz(matriz);
}
}

227

9.9.7
Ejemplo 7
Disear un programa que contenga una rutina que sume todos los elementos de una matriz de N x M
e imprima el resultado). N y M se leen desde pantalla
import ucn.*;
public class Ejemplo7
{
public static void sumaElementos(int N, int M, int[][] Mat)
{
int suma = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
suma = suma + Mat[i][j];
}
}
StdOut.println("Suma de los elementos: " + suma);
}
public static void main(String[] args)
{
int N = StdIn.readInt();
int M = StdIn.readInt();
int[][] Mat = new int[N][M];
sumaElementos(N, M, Mat);
}
}

228

9.9.8
Ejemplo 8
Idem a 7, pero el resultado de la suma se debe desplegar en el main.
import ucn.*;
public class Ejemplo8
{
public static int sumaElementos(int N, int M, int[][] Mat)
{
int suma = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
suma = suma + Mat[i][j];
}
}
return suma;
}
public static void main(String[] args)
{
int N = StdIn.readInt();
int M = StdIn.readInt();
int[][] Mat = new int[N][M];
int suma = sumaElementos(N, M, Mat);
StdOut.println("Suma de los elementos: " + suma);
}
}

Qu relacin
hay entre estas
dos variables
"suma" ?

229

10 Representacin de datos relacionados


Cmo representar los distintos datos de un empleado?
Ejemplo, archivo Empleado.java:
public class
{
private
private
private

nombre
sueldo edad
Empleado Perez, Jorge $600.000 28

Empleado
String nombre;
int sueldo;
int edad;

public Empleado(String nom, int suel, int ed)


{
nombre = nom;
sueldo = suel;
edad = ed;
}
public String getNombre() { return nombre; }
public int getSueldo() { return sueldo; }
public int getEdad() { return edad; }
public void setNombre(String nom) { nombre = nom; }
public void setSueldo(int suel) { sueldo = suel; }
public void setEdad(int ed) { edad = ed; }
}

230

10.1 Ejemplo
Se requiere un vector con los datos (nombre, sueldo y edad) de los 50 empleados de la empresa.
Solucin anterior: 3 vectores paralelos
nombre
0 juan
1 maria
2 pedro

49 teresa

sueldo
250
329
499

edad
29
34
58

1000

25

231

Alternativa de solucin: Un vector con empleados


vecEmpl
0

juan

250

29

maria

329

34

pedro

499

58

teresa

1000

25

49

232

import ucn.*;
public class Ejemplo
{
public static void main(String[] args)
{
Empleado[] vecEmpl = new Empleado[50];
for (int i = 0; i <= 49; i++) {
StdOut.println("Ingreso de empleado" + (i + 1));
StdOut.print("Nombre: ");
String nom = StdIn.readString();
StdOut.print("sueldo: ");
int sueldo = StdIn.readInt();
StdOut.print("edad: ");
int edad = StdIn.readInt();
// Se crea al empleado
Empleado emp = new Empleado(nom, sueldo, edad);
vecEmpl[i] = emp; // Se ingresa el empleado al vector
}
// Despliegue de los empleados
for (int i = 0; i <= 49; i++) {
StdOut.println("nombre: " + vecEmpl[i].getNombre() +
" sueldo: " + vecEmpl[i].getSueldo() +
" edad: " + vecEmpl[i].getEdad());
}
}
}

233

Cmo le cambiamos el sueldo al empleado que est en la posicin 5 del vector de empleados?
// El nuevo sueldo es de 200
vecEmpl[5].setSueldo(200);

Cmo le aumentamos el sueldo en 100 al empleado en la posicin 5?


// El nuevo sueldo es 100 ms que el que tiene
vecEmpl[5].setSueldo(vecEmpl[5].getSueldo() + 100);

234

Programa anterior, pero construido con subprogramas


import ucn.*;
public class EjemploV2
{
public static void ingresaEmpleados(Empleado[] vecEmpl)
{
for (int i = 0; i < vecEmpl.length; i++) {
StdOut.println("Ingreso de empleado" + (i + 1));
StdOut.print("Nombre: ");
String nom = StdIn.readString();
StdOut.print("sueldo: ");
int sueldo = StdIn.readInt();
StdOut.print("edad: ");
int edad = StdIn.readInt();
// Se crea al empleado
Empleado emp = new Empleado(nom, sueldo, edad);
vecEmpl[i] = emp; // Se ingresa el empleado al vector
}
}
public static void despliegaEmpleados(Empleado[] vecEmpl)
{
// Despliegue de los empleados
for (int i = 0; i < vecEmpl.length; i++) {
StdOut.println("nombre: " + vecEmpl[i].getNombre() +
" sueldo: " + vecEmpl[i].getSueldo() +
" edad: " + vecEmpl[i].getEdad());
}
}

235

public static void main(String[] args)


{
int cantEmp = 50;
Empleado[] vecEmpl = new Empleado[cantEmp];
ingresaEmpleados(vecEmpl);
despliegaEmpleados(vecEmpl);
}
}

236

10.2 Cmo funciona el traspaso de parmetros para un objeto?


import ucn.*;
public class EjemploV3
{
...
public static void cambiarSueldoEmp (Empleado e, int sueldo)
{
e.setSueldo(sueldo);
}
public static void main(String[] args)
{
int cantEmp = 50;
Empleado[] vecEmpl = new Empleado[cantEmp];
ingresaEmpleados(vecEmpl);
despliegaEmpleados(vecEmpl);
Empleado emp =vecEmpl[0];
StdOut.print("sueldo empleado de la posicin 0: " + emp.getSueldo());
int nuevoSueldo = emp.getSueldo() +100;
cambiarSueldoEmp (emp, nuevoSueldo);
StdOut.print("sueldo empleado de la posicin 0: " + emp.getSueldo());
}
}

237

10.3 Ejercicio
Representar en Java los siguientes datos de una persona: nombre, celular, sexo
nombre
Luna, Laura

celular
98768907

sexo
f

238

Archivo Persona.java
public class
{
private
private
private

Persona
String nombre;
int celular;
char sexo;

public Persona(String nom, int cel, char s)


{
nombre = nom;
celular = cel;
sexo = s;
}
public String getNombre() { return nombre; }
public int getCelular() { return celular; }
public char getSexo() { return sexo; }
public void setNombre(String nom) { nombre = nom; }
public void setCelular(int cel) { celular = cel; }
public void setSexo(char s) { sexo = s; }
}