Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Notas de
Programa
ión I
2
Índi
e general
1. INTRODUCCIÓN 5
2. ALGORÍTMICA 7
2.1. Con
eptos bási
os . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1.1. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1.2. Prueba de es
ritorio . . . . . . . . . . . . . . . . . . . . 16
2.1.3. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2. Estru
turas de
ontrol . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.1. Estru
turas de
ontrol
ondi
ionales . . . . . . . . . . . . 26
2.2.2. Estru
turas de
ontrol iterativas (
i
los) . . . . . . . . . 36
2.3. Arreglos (ve
tores) . . . . . . . . . . . . . . . . . . . . . . . . . 48
3. LENGUAJES DE PROGRAMACIÓN 51
3.1. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.1.1. Compila
ión y eje
u
ión de un programa . . . . . . . . . 56
3.1.2. Generalidades . . . . . . . . . . . . . . . . . . . . . . . . 59
3.1.3. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.1.4. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . 63
3.1.5. Entrada y salida de datos . . . . . . . . . . . . . . . . . 66
3.1.6. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.1.7. Estru
tura general de un programa . . . . . . . . . . . . 77
3.1.8. Fun
iones . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.1.9. Estru
turas de
ontrol
ondi
ionales . . . . . . . . . . . . 85
3.1.10. Estru
turas de
ontrol iterativas . . . . . . . . . . . . . . 92
3.1.11. Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.1.12. Más a
er
a de fun
iones . . . . . . . . . . . . . . . . . . 107
3.2. Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
3.2.1. Eje
u
ión de un programa . . . . . . . . . . . . . . . . . 114
3.2.2. Tipos bási
os de datos . . . . . . . . . . . . . . . . . . . 121
3
4 ÍNDICE GENERAL
5
6 CAPÍTULO 1. INTRODUCCIÓN
Capítulo 2
ALGORÍTMICA
En una primera instan
ia, salvo que seamos los
readores o analistas de
un programa dado, nosotros solemos observar a la parte
entral del diagrama,
la relativa al pro
esamiento,
omo si fuera una
aja negra, manteniendo para
nuestra mente
omo un misterio la forma en que se llevan a
abo las opera
iones.
Suele utilizarse el término
aja negra para referirse al pro
eso en el sentido de
que su estru
tura interna se des
ono
e, pero está fundamentada.
7
8 CAPÍTULO 2. ALGORÍTMICA
Los siguientes son algunos de los símbolos de uso más
omun utilizados
para elaborar diagramas de ujo:
ii ) Pseudo ódigo:
En adelante, durante este
apítulo, utilizaremos los pseudo
ódigos para elaborar
nuestros algoritmos.
2.1.1. Variables
Antes de denir lo que signi
a para nosotros una variable,
onsideremos
a la memoria de la
omputadora
omo un armario
onformado por mu
hos
ajones, en los que podemos alma
enar datos (estos datos se alma
enan en
lenguaje máquina, es de
ir, se
uen
ias nitas de
eros y unos), y supongamos
también que
ada uno de estos
ajones está numerado para poder referirnos
a
ada uno de manera úni
a. Más pre
isamente este número se
ono
e
omo
dire
ión de memoria.
Denimos una variable
omo una por
ión de la memoria, reservada para
alma
enar un dato,
on la analogía presentada antes, una variable es un
ajón.
Así
omo la
omputadora ne
esita etiquetar los
ajones, nosotros también
vamos a ne
esitar un nombre o identi
ador de variable para referirnos a
nuestras variables. Debe existir una
orresponden
ia unívio
a entre los nombres
de variable y los números de los
ajones.
Cada lenguaje de programa
ión tiene sus propias reglas para dar un nombre
a una variable. Entre las reglas más generales se en
uentran las siguientes:
2.1. CONCEPTOS BÁSICOS 11
Un nombre válido para una variable es una se
uen
ia de
ara
teres que
pueden ser letras, dígitos y guiones bajos.
Cabe men
ionar que en el momento en que
reamos una nueva variable
dentro de un programa, lo úni
o que se ha
e es reservar un espa
io de memoria
para ésta, y la mayoría de los lenguajes de programa
ión no se preo
upan
por la informa
ión alma
enada en este espa
io de memoria, generalmente
manteniendo el
ontenido previamente alma
enado ahí, lo que es
onsiderado
omo 'basura'.
Esta es la razón por la que, además de
rear las variables dentro de nuestros
programas, será nuestra responsabilidad ini
ializarlas antes de utilizarlas, pues
de otra forma
orremos el riesgo de estar usando esos valores basura, pues no
sabemos que hay en el
ajón que se
orresponde
on la variable que a
abamos
de de
larar.
Por otra parte, las dos opera
iones que son permitidas sobre las variables
son:
Por otro lado, el alma
enamiento de un valor dentro de una variable puede
ha
erse de entre una de las dos siguientes maneras:
Asigna ión.
Le tura.
Asigna
ión
La asigna
ión es un pro
eso a través del
úal damos un valor a una variable.
Esta es una opera
ión destru
tiva, ya que reemplaza
ualquier valor que la
variable tuviera antes de la asigna
ión. Su forma general es:
<variable>=<expresión>
Veamos un ejemplo:
14 CAPÍTULO 2. ALGORÍTMICA
variable_1=5
variable_1=variable_1+1
var_x+var_y=var_z
pero
var_z=var_x+var_y
A=5
B=7
C=A+B-1
Solu
ión:Un pseudo
ódigo del algoritmo que resuelve el problema es:
2.1. CONCEPTOS BÁSICOS 15
variable_1=3
variable_2=4
variable_3=variable_1
variable_1=variable_2
variable_2=variable_3
No será di
il
onven
erse de que al terminar el programa, los valores asignados
se habrán invertido, esto es: variable_1=4 y variable_2=3.
Le
tura
Para obtener un dato propor
ionado dire
tamente por el usuario durante
la eje
u
ión del algoritmo vamos a utilizar la palabra:
Se re omienda, razones prá ti as, leer un solo valor por ada opera ión LEE.
NOTA: Las instru
iones E/S (Entrada/Salida) o I/O (del inglés Input/Output)
onstituyen la forma general que se usa para llevar a
abo la intera
ión
hombre/máquina. La entrada estándar (stdin),
omo ya se men
ionó antes,
suele se
onsiderada
omo el te
lado, mientras que la salida estándar (stdout)
se asume
omo la pantalla de la
omputadora. Adi
ionalmente existe otro tipo
de salida en el
aso del sistema operativo Unix (Linux y sus variantes), y es
la salida de errores (stderr), a donde son enviados todos los mensajes de error
generados por un programa.
Se deben utilizar tantas variables
omo sea ne
esario pero tan po
as
omo
sea posible.
Ejemplo 2.1.2. Rees
ribir el algoritmo que inter
ambia los valores de las
variables, pero que en vez de asigna
ión se utili
e LEE para darle valores a
éstas, y que, al nal, es
riba en la pantalla los valores de las dos variables.
Solu
ión:
16 CAPÍTULO 2. ALGORÍTMICA
2.1.3. Operadores
Un operador es un
ará
ter(o se
uen
ia de
ara
teres) que a
túa sobre una
o más variables, realizando una opera
ión espe
í
a. Un operador puede ser
unario, o binario, dependiendo del número(1 o 2) de variables, expresiones o
términos a los
uales se apli
a. A
ontinua
ión presentamos los operadores de
uso más fre
uente.
Operadores aritméti
os
Los operadores aritméti
os son los operadores binarios:
Los primeros
uatro
orresponden a la adi
ión, sustra
ión, produ
to y
o
iente
on las que todos estamos familiarizados. El operador residuo o módulo, %,
se apli
a solamente a variables,
onstantes o expresiones de tipo entero. Su
signi
ado es simple: el resultado de la opera
ión a %b es el residuo que se
obtiene de dividir a por b, por ejemplo:
Es sabido de álgebra que existe una regla de pre
eden
ia entre los operadores
aritméti
os, que nos indi
a que opera
iones hay que ha
er primero y
uales
después. Bási
amente di
e lo siguiente:
OBSERVACIÓN: Los paréntesis son los uni
os símbolos que utilizaremos para
agrupar opera
iones, pues en la mayoría de los lenguajes de programa
ión los
or
hetes y llaves tienen otras fun
iones.
Ejemplo 2.1.3. Ha
er un algoritmo que lea desde el te
lado dos números
enteros para dos in
ógnitas, y que posteriormente
al
ule el
uadrado de la
suma de ambos números y presente en la salida el resultado de esta opera
ión.
Solu
ión:
ESCRIBE Este programa
al
ula el
uadrado de la suma de
dos números introdu
idos por el usuario.
ESCRIBE Introduz
a un primer número entero
LEE A
ESCRIBE Introduz
a un segundo número entero
LEE B
C=A*A+2*A*B+B*B
ESCRIBE C
Solu
ión2:
ESCRIBE Este programa
al
ula el
uadrado de la suma de
dos números introdu
idos por el usuario.
ESCRIBE Introduz
a un primer número entero
LEE A
ESCRIBE Introduz
a un segundo número entero
LEE B
ESCRIBE (A+B)*(A+B)
2.1. CONCEPTOS BÁSICOS 21
Solu
ión2:
ESCRIBE Este programa
al
ula el
uadrado de la suma de
dos números introdu
idos por el usuario.
ESCRIBE Introduz
a un primer número entero
LEE A
ESCRIBE Introduz
a un segundo número entero
LEE B
C=A+B
C=C*C
ESCRIBE C
En este ejemplo puede observarse
omo un problema tan simple, puede tener
múltiples solu
iones. Otro aspe
to importante es que podemos emplear tantas
variables
omo sean ne
esarias, pero a la vez,
on miras en minimizar el uso
de la memoria de alma
enamiento, es re
omendable utilizar tan po
as
omo
sea posible.
var_x = var_x + a
podemos es ribir
var_x +=a
22 CAPÍTULO 2. ALGORÍTMICA
En general, la expresión:
es equivalente a :
++
−−
i=5
x=i++
al eje utarse estas dos instru iónes el estado de las variables es: x = 5, i = 6.
j=5
y =++j
enton
es, una vez eje
utadas las senten
ias se obtiene j = 6, y = 6.
2.1. CONCEPTOS BÁSICOS 23
si <expresión1> y <expresión2> son datos del mismo tipo por ejemplo números
enteros,
adenas de
ara
teres o valores booleanos, si es que está denida,
enton
es se realiza la
ompara
ión.
igual que: ==
diferente que: ! =
a + b == c devuelve FALSO
a ∗ b < c devuelve VERDADERO
c/b ! = a devuelve VERDADERO
a + b − c >= 0 devuelve FALSO
hola==adios
24 CAPÍTULO 2. ALGORÍTMICA
e<j
w>=p
a==a
f<=b
z<z
los valores booleanos que devuelven estas expresiones son VERDADERO para
las tres primeras y FALSO para las restantes.
Operadores lógi
os
Los operadores lógi
os son los operadores binarios:
Y lógi
o o
onjun
ión: .Y.
Estos operadores pueden
ombinarse entre sí, empleando parentésis para agruparlos.
Por ejemplo,
onsidérese la expresión:
Para x = 3:
2.2. ESTRUCTURAS DE CONTROL 25
(x {z < 0} .O. x
| + 22 x − 3 == 0}) .Y. (x
| ∗ x − 2 ∗{z | es ra
ional
{z } .O. |x ==
{z π}))
F V V F
Otra
ara
terísti
a de las variables booleanas es que, dado que alm
enan
un valor de verdad, pueden
onsiderarse
omo valores booleanos, razón por la
ual en lugar de instru
iones
omo:
B .Y. x<10
En ésta última de
lara
ión se debe entender que devolverá un valor de verdad
verdadero si B==V y x<10.
En otros
asos quisieramos que bajo
iertas
ondi
iones se eje
ute una o
varias instru
iónes más de una vez.
Las senten
ias que nos permiten alterar el ujo de eje
u
ión de un algoritmo
se
ono
en
omo estru
turas de
ontrol de ujo, a las que en llamaremos
simplemente estru
turas de
ontrol, y dan forma a la programa
ión estru
turada.
26 CAPÍTULO 2. ALGORÍTMICA
En este texto presentamos dos tipos de ellas: las senten
ias
ondi
ionales o de
sele
ión y las senten
ias iterativas o
i
los.
Senten
ia SI
Esta estu
tura
ondi
ional permite eje
utar una se
uen
ia de instru
iones,
en fun
ión del valor de verdad de una
ondi
ión dada. La forma general de esta
senten
ia es la siguiente:
Solu
ión:
ESCRIBE Introduz
a un número distinto de
ero
LEE A
SI(A!=0) {
b=1/A
ESCRIBE 1/A = b
}
SI(A==0) {
ESCRIBE El número introdu
ido no es válido
}
ESCRIBE Gra
ias por utilizar este programa.
En estas dos pruebas de es
ritorio, y en todas las que se in
luyen más adelante,
vamos a abreviar los valores booleamos VERADERO y FALSO
omo V y F
respe
tivamente.
Senten
ia SI-DOM
El SI-DOM es una senten
ia
ondi
ional que, de
ierto modo, puede pensarse
omo una generaliza
ión o extensión del SI. Tiene la forma:
Se eje
uta de la siguiente manera: Si la evalua
ión de <
ondi
ión> resulta
VERADERA, se eje
utan <instru
iones1> y se prosigue
on las senten
ias
que hubiera despues de la llave que
ierra el DOM (<instru
iones2> no se
eje
uta). Si en
ambio, al evaluar <
ondi
ión> resulta FALSO, el algoritmo
no lleva a
abo <instru
iones1> y pasa a eje
utar <instu
iones2>.
Esta senten
ia es ideal para tratar bifur
a
iones en las que solo pueden
su
eder dos
osas: se
umple la
ondi
ión o su
omplemento, aunque,
omo
veremos más adelante sirve también para tratar situa
iones en las que se
presentan dos o más
asos ex
lusivos dos a dos.
Solu
ión:
ESCRIBE Introduz
a un número distinto de
ero
LEE A
SI(A!=0) {
b=1/x
ESCRIBE 1/x = b
}
DOM{
ESCRIBE El número introdu
ido no es válido
}
ESCRIBE Gra
ias por utilizar este programa.
Solu
ión
ESCRIBE Introduz
a un valor numéri
o para la variable M
LEE M
ESCRIBE Introduz
a un valor numéri
o para la variable N
LEE N
SI(M>N) {
ESCRIBE M es mayor que N
}
DOM{
SI(M<N) {
ESCRIBE M es menor que N
}
DOM{
ESCRIBE M es igual a N
}
}
ESCRIBE Fin del programa
M>N
M<N
M==N
Las tres tablas siguientes son las pruebas de es
ritorio de
ada uno de estos
tres
asos (para algunos valores de M y N) respe
tivamente.
Con M=0 y N=-1:
2.2. ESTRUCTURAS DE CONTROL 31
on M=10 y N=20:
nalmente, on M=N=4:
NOTA: En general, en el
uerpo de una estru
tura de
ontrol (ya sea
ondi
ional
o de repeti
ión, las
uales veremos más adelante), pueden gurar nuevamente
las estru
turas de
ontrol.
Senten
ia SI-(DOM-SI)-DOM
La estru
tura de
ontrol SI-(DOM-SI)-DOM puede pensarse
omo una
abrevia
ión de dos o más senten
ias SI-DOM anidadas. Su forma general es:
Solu
ión:
ESCRIBE Introduz
a un valor numéri
o para la variable M
LEE M
ESCRIBE Introduz
a un valor numéri
o para la variable N
LEE N
SI(M>N) {
ESCRIBE M es mayor que N
}
DOM-SI(M<N) {
ESCRIBE M es menor que N
}
DOM{
ESCRIBE M es igual a N
}
34 CAPÍTULO 2. ALGORÍTMICA
Senten
ia SWITCH
SWITCH es una senten
ia
ondi
ional en la que, dada una
antidad nita
de op
iones, y dependiendo de
ual de todas ellas se
umple, se eje
utará
uni
amente su respe
tivo bloque de instru
iones. Esta estru
tura de
ontrol
tiene la siguiente forma:
SWITCH(<variable>){
aso <
1>:{
<instru
iones1>
break;
}
aso <
2>:{
<instru
iones2>
break;
}
aso <
3>:{
<instru
iones3>
break;
}
..
.
A
ontinua
ión se presenta un sen
illo ejemplo del uso de esta senten
ia.
Para una mejor
omprensión de su fun
ionamiento, re
omendamos al le
tor
realizar al menos una prueba de es
ritorio para la solu
ión presentada enseguida.
Solu
ión:
ESCRIBE Te
lee una letra (minús
ula) del abe
edario
LEE letra
SWITCH(letra){
aso a:{
ESCRIBE Es vo
al
break
}
aso e:{
ESCRIBE Es vo
al
break
}
aso i:{
ESCRIBE Es vo
al
break
}
aso o:{
ESCRIBE Es vo
al
break
}
aso u:{
ESCRIBE Es vo
al
break
}
DOM:{
ESCRIBE Es
onsonante
}
}
i los.
Debemos
uidar que, al espe
i
ar la
ondi
ión bajo la
ual se eje
utará
el
uerpo de un
i
lo se garanti
e que en determinado momento la
ondi
ión
será falsa, pues de no ser así, podriamos estar indi
ando al programa que un
fragmento del
ódigo se eje
ute una
antidad innita de ve
es, lo que se
ono
e
omo
i
lo innito.
Senten
ia MIENTRAS
La sintaxis del
i
lo MIENTRAS es la siguiente:
Solu
ión
ESCRIBE Este programa imprime los enteros de 0 a N en
orden des
endente
ESCRIBE Introduz
a un valor entero y no negativo para N
LEE N
MIENTRAS(N>=0) {
ESCRIBE N
N−−
}
ESCRIBE Fin del programa
38 CAPÍTULO 2. ALGORÍTMICA
Senten
ia HACER-MIENTRAS
Una variante de la instru
ión MIENTRAS es el
i
lo HACER-MIENTRAS.
La diferen
ia entre éstas es que en la última se garantiza que su se
uen
ia de
instru
iones se eje
utará al menos una vez. Su sintaxis es la siguiente:
HACER {
<instru
iones>
} MIENTRAS(<
ondi
ión>)
Su prueba de es ritorio, on el mismo valor (-1) que las dos anteriores es:
Senten
ia PARA
Esta es quizá la estru
tura de repeti
ión que se utiliza
on más fre
uen
ia.
En su forma más simple se de
lara de la siguiente manera:
PARA (<opera
ión ini
ial>; <
ondi
ión>; <opera
ión de varia
ión>) {
<instru
iones>
}
En <opera
ion ini
ial> se de
laran y asignan determinados valores ini
iales
42 CAPÍTULO 2. ALGORÍTMICA
La primera a
ión que se realiza en estos
i
los es <opera
ion ini
ial>,
y no se vuelve a eje
utar de nuevo. Despúes de esto y antes de pro
eder
a la eje
u
ión de <instru
iones>, se evalúa <
ondi
ión>, si ésta resulta
VERDADERA, se pro
ede a eje
utar el bloque <instru
iones>. Una vez
he
ho esto, se eje
uta una vez <opera
ión de varia
ión> y se regresa al paso
que
onsiste en veri
ar el valor de verdad de <
ondi
ión>. Este pro
eso se
repite hasta que <
ondi
ión> no sea VERDADERA, momento en el
ual la
eje
u
ión del
i
lo termina y el programa
ontinúa su ujo en donde termina
la de
lara
ión del PARA.
Figura 2.4: Orden en que se realizan las a iones durante la instru ión PARA
Solu
ión
ESCRIBE Este programa
al
ula el fa
torial de un número
x=1
ESCRIBE Introduz
a un valor entero no negativo
LEE n
SI(n>1) {
PARA(i=2;i<=n;i++) {
x=i*x
}
ESCRIBE x
}
DOM-SI(n==0 .O. n==1) {
ESCRIBE x
}
DOM {
ESCRIBE: El número introdu
ido debe ser no negativo
}
ESCRIBE Fin del programa
NOTA: La
ondi
ión B==V también puede ser expresada
omo B, puesto
que esta variable ya es booleana, y por lo tanto alma
ena un valor de verdad.
Por otra parte, ha
emos hin
ápie en que debe tenerse
uidado en que la
ondi
ión deje de
umplirse en algún momento, para evitar que el programa
entre en un
i
lo innito.
Ejer
i
io 2.2.12. Ha
er un algoritmo que lea un número N y que imprima en
orden inverso los enteros entre 0 y N. Utilizar el
i
lo PARA.
Ejer
i
io 2.2.14. Ha
er un algoritmo que para una fun
ión dada f (x) ≥ 0
al
ule una aproxima
ión del área bajo la
urva.
instru
iones utilizadas más
omunmente para la
rea
ión de
i
los. Aunque a
primera vista pare
en ser diferentes, lo
ierto es que la mayoría de los problemas
en los que hay que eje
utar varias ve
es un mismo
onjunto de instru
iones
pueden implementarse utilizando
ualquiera de estas dos senten
ias.
A
ontinua
ión proponemos tres solu
iones a éste problema, una
on
ada
una de las senten
ias de
ontrol de repeti
ión.
El le
tor puede analizar las diferen
ias de los tres algoritmos y veri
ar
via pruebas de es
ritorio que efe
tivamente los tres dan solu
ión al problema
48 CAPÍTULO 2. ALGORÍTMICA
planteado.
[v1 , v2 , . . . , vn ]
v[i℄
donde i puede ser
ualquier número entero desde 0 hasta el tamaño del ve
tor
menos uno. Como
on
ualquier variable, es indispensable ini
ializarla antes
de emplearla en un programa (esto se detallará
uando se trate este tema en
ada uno de los lenguajes de programa
ión en el
apítulo siguiente). Por lo
pronto,
omo ejemplo,
on ayuda de la senten
ia PARA, podemos a
eder a
ada uno de los elementos del ve
tor y mostrar su valor:
v[2℄=10
v[0℄++
mat[3℄[2℄=1
obteniendo:
0 0 0 0 0
0 0 0 0 0
mat =
0
1 0 0 0
0 0 0 0 0
A las se
uen
ias de instru
iones que es
ribimos en alguno de los lenguajes
de programa
ión le llamamos
ódigo fuente, el
ual debe tradu
irse al
ódigo
máquina para poder ser eje
utado. Esta tradu
ión puede llevarse a
abo de
entre una de las tres maneras siguientes:
51
52 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Figura 3.1: Los programas eje
utables son nativos para
ada tipo de
omputadora.
53
Intérpreta
ión:
Se realiza la tradu
ión de las instru
iones una a una, eje
utando
ada
instru
ión inmediatamente después de tradu
irla.
Otra de las diferen
ias entre las tradu
iones por
ompila
ión (a
ódigo
máquina o intermedio) e interpreta
ión es que, utilizando un
ompilador, los
pro
esos de tradu
ión y eje
u
ión del programa son independientes: primero se
tradu
e, y posteriormente se eje
uta. Por el
ontrario, al utilizar un intérprete,
ambos pro
esos están ligados:
ada instru
ión es eje
utada inmediatamente
después de que se ha tradu
ido.
55
3.1. C
En esta se
ión nos o
uparemos de algunos de los aspe
tos más elementales
en lo que
on
ierne a la implementa
ión de programas en el lenguaje C. El
objetivo es ini
iar al le
tor al
ono
imiento de este lenguaje, esperando que
sea
apaz de elaborar programas
omo los planteados en el
apítulo 2. Para un
estudio más detallado puede
onsultar [1℄.
En 1999 se hizo una revisión de C90, dando lugar a C99, que es la última
versión de éste estándar de la deni
ión de C. En él se han agregado algunos
tipos de datos que no guraban en la versión anterior tales
omo los tipos long
long int y long long double. Otro
ambio importante es que en C90 existia
bool
omo tipo de dato nativo en la espe
i
a
ión del lenguaje C, pero en
C99 bool se sa
ó de la espe
i
a
ión base de C, poniendo su espe
i
a
ión
ahora por fuera, en un ar
hivo de en
abezado. Además se realizaron
ambios
en la lingüisti
a y
ara
terísti
as de la bibliote
a, por men
ionar algunos. En
el presente texto nos apegamos al estándar C99.
3.1.2. Generalidades
Antes de
ontinuar, ha
emos unas observa
iones generales y
onven
iones
en
uanto a la forma en que debemos es
ribir las instru
iones de los programas
en el ar
hivo fuente.
Los headers que usaremos
on más fre
uen
ia son <stdio.h> (para entrada
y salida), <math.h> (propor
iona fun
iones matemáti
as). Para
ono
er
las fun
iones que propor
iona
ada uno de estos, y otros headers puede
onsultarse el APÉNDICE B: Bibliote
a Estándar de [1℄.
Tal
omo en el
apítulo 2, vamos a sangrar las instru
iones (
uando sea
ne
esario) para fa
ilitar la
omprensión de los programas.
En general, los programas pueden ser muy
omplejos, por lo que será
ne
esario dividirlos en partes más pequeñas y manejables
ono
idas
omo
fun
iones. En este
ontexto, entenderemos por fun
ión a una se
uen
ia
de instru
iones que tienen una tarea espe
í
a dentro del programa.
Cada programa es
rito en este lenguaje debe tener al menos una fun
ión,
la llamada fun
ión (o programa) prin
ipal. Se de
lara
omo se muestra
enseguida:
main(){
<instru
iones>
return 0;
}
Al nal de
ada una de las instru
iones (salvo algunas
omo p.e. los
#in
lude< - - > y las senten
ias de
ontrol) es ne
esario poner punto
y
oma (;). En
aso de no ha
erlo, la
ompila
ión será fallida. El signo
de puntua
ión ; es el delimitador de senten
ias o instru
iones en C.
3.1. C 61
3.1.3. Variables
C es uno de los lenguajes en los que es ne
esario de
larar e ini
ializar
las variables que vayamos a utilizar dentro de un programa, indi
andole al
ompilador sus nombres y sus tipos. El tipo de variable es diferente, de a
uerdo
on el tipo de informa
ión que ne
esitemos alma
enar, e indi
a la
lase de valor
que
abe en el espa
io de memoria reservado para ella, así
omo las opera
iones
que pueden realizarse
on di
ha variable.
Como ya sabemos, las dos opera
iones que permitidas sobre las variables
son:
onsultar su valor o darle algún valor.
A
ontinua
ión veremos
omo de
larar e ini
ializar variables, lo que
orresponde
a dar algún valor a una variable.
también es posible de
larar e ini
ializar varias variables del mismo tipo en
una misma línea
Los tipos short int, long int y long long int pueden abreviarse,
omo
short, long y long long respe
tivamente.
A pesar de que podemos alma
enar números enteros muy grandes, desde
menos nueve trillones dos
ientos veinti tres mil tres
ientos setenta y dos billones
treinta y seis mil o
hos
ientos
in
uenta y
uatro millones sete
ientos setenta
y siete mil o
ho
ientos o
ho hasta nueve trillones dos
ientos veinti tres mil
tres
ientos setenta y dos billones treinta y seis mil o
ho
ientos
in
uenta y
uatro millones setes
ientos setenta y siete mil o
ho
ientos siete, es posible
alma
enar números enteros aún máyores. La restri
ión que se ha
e es que
pueden alma
enarse solo números enteros sin signo, de
larados anteponiendo
al tipo de dato la palabra reservada unsigned. Los rangos de los números que
pueden alma
enarse se presentan enseguida:
Tipo Rango Bytes
unsigned
har 0· · · 255 1
unsigned short int 0· · · 65535 2
unsigned int 0· · · 4294967295 4
unsigned long int 0· · · 4294967295 4
unsigned long long int 0· · · 18446744073709551615 8
Utilizando este modi
ador, apli
ado a long long int, el máximo número
entero que puede alma
enar
e es dies
io
ho trillones
uatro
ientos
uarenta y
seis mil sete
ientos
uarenta y
uatro billones setenta y tres mil sete
ientos
nueve millones quinientos
in
uenta y un mil seis
ientos quin
e (positivo).
Los rangos de los valores de los diferentes tipos de datos enteros y otantes
en C pueden variar, en fun
ión al
onjunto Sistema Operativo-Computadora.
En el ar
hivo de en
abezado <limits.h> se denen
onstantes para los tamaños
máximo y mínimo de los tipos de datos enteros. Para los tipos otantes, los
rangos pueden denirse
on <oat.h>.
Como es natural suponer, para operar dos tipos de datos numéri
os, estos
deben ser del mismo tipo. Por ejemplo, si queremos sumar dos variables, estas
deben ser de tipo (int, short int, oat, et
.). Sin embargo, si es
ribimos algo
omo lo siguiente:
int x=3;
float y=2.5;
x+y;
C realizará una
onversión (implí
ita): la variable int es
onvertida a tipo oat
para poder efe
tuar la opera
ión indi
ada, y el resultado es de tipo otante.
A este tipo de
onversión se le denomina retipi
a
ión (
asting). En general,
si se operan dos (o más) variables numéri
as de diferente tipo, se realiza la
opera
ión, pre
edida por la
onversión de la(s) variable(s)
uyo tipo es de
menos rango, al tipo de la variable de tipo
on mayor rango.
indi
a que, antes de efe
tuar las opera
iones indi
adas, se realiza la
onversión
de 3 y 87356 a tipo oat.
bool bandera=false;
o bien
bool bandera=0;
Más generalmente, podemos denotar que una variable de tipo bool asignando
ualquier número distinto de
ero a di
ha variable, y
ero para falso. Así,
bool bandera2=true;
es equivalente a
bool bandera2=5;
Cuando
reamos una nueva variable de tipo booleano, por omisión alma
ena
el valor de verdad false, a menos que la ini
ialemos nosotros mismos. Sin
embargo, es ampliamente re
omedable ini
ializarla nosotros mismos para evitar
ambugüedades.
En su forma más simple nos permite imprimir una
adena de
ará
teres,
de la siguiente manera:
int x=29;
printf( %d,x);
produ e:
_____123
produ e:
123_____
Un número que empieza por
ero: Tiene la misma fun
ión que si se
antepone un número positivo,
on la salvedad de que los espa
ios que no
o
upa el número, se rellenan
on
eros. Por ejemplo:
produ e:
00000123
genera un error.
resulta en:
____+123
3.1. C 69
en:
+123____
Note
omo el uso del modi
ador '+' redu
e la
antidad de posi
iones
efe
tivas utilizadas para la representa
ión del número.
Los
ará
teres de formato de salida para los tipos de datos otantes se
muestran en la tabla siguiente:
Tipo Nota
ión
onven
ional Nota
ión exponen
ial
oat %f %e
double %f %e
long double %Lf %Le
Al igual que los tipos de datos enteros, los otantes soportan modi
adores
omo los siguientes:
Un número
on punto de
imal: La parte entera de este número tiene
el mismo efe
to que en un tipo entero, mientras que la parte de
imal
indi
a
uantos de
imales del otante se mostrarán. Por ejemplo:
da omo resultado
___43.270
da omo resultado
43.2700
Los modi adores expli ados en el aso anterior, también apli an en éste.
La instru
ión printf(); nun
a propor
iona una nueva línea de manera
automáti
a. Para obtener una nueva línea es ne
esario es ne
esario es
ribir la
se
uen
ia \n en el lugar en que queramos la nueva línea. Está es una de las
instru
iones que se
ono
en
omo se
uen
ias de es
ape.
Otras de las se uen ias de es ape más omunes son las siguientes:
int x=65;
printf(Imprime:\n\t Entero: %04d\n y\n\t Flotante: %.5f\n, x, 3.1416);
Observe que, por
ada vez que apare
e un
ará
ter de formato en el primer
argumento del printf(), deben existir en los siguientes argumentos de esta
fun
ión, datos del tipo espe
i
ado por
ada uno de di
hos
ará
teres, además,
3.1. C 71
deben
oin
idir en
antidad y tipo pues de no ser así, la
ompila
ión no se
realizará exitosamente. En la segunda de las dos instru
iónes que a
abamos de
es
ribir, en el primer argumento tenemos dos
ará
teres de formato, el primero
de tipo int y el segundo oat, por lo que es segundo y ter
er argumento deben
gurar un entero y un otante, respe
tivamente. Enton
es el resultado de estas
instru
iones es:
int x;
printf(La dire
ión de memoria de x es: %u, (unsigned)&x);
Los
ará
teres de formato para la le
tura de datos enteros son los mismos
que los que se utilizan
on el printf(). Para la le
tura de otantes, existe
una ligera diferen
ia
on los
ara
teres de formato para salida: el tipo double
utiliza el
ará
ter de formato %lf para le
tura de datos (re
uerde que el de
impresión era %l). Los tipos oat y long double emplean los mismos
ará
teres
para entrada y para salida.
3.1. C 73
int w;
s
anf( %f,&w);
float v;
s
anf( %d,&v);
Programa 3.1.1. Tradu
ión al lenguaje C del pseudo
ódigo del ejemplo 2.1.2
#in
lude<stdio.h>
main(){
int var_1, var_2, var_3;
printf(Introduz
a un valor numéri
o para var_1 \n);
s
anf( %d,& var_1);
printf(Introduz
a un valor numéri
o para var_2 \n);
s
anf( %d,& var_2);
var_3=var_1;
var_1=var_2;
var_2=var_3;
printf( %d,var_1);
printf(\n %d,var_2);
printf(\n);
return 0;
}
74 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
La subse
ión 3.1.11 presentaremos otras dos fun
iones para le
tura de
datos (espe
í
amente
ará
teres) in
luidas en el ar
hivo de en
abezado <stdio.h>.
3.1.6. Operadores
Operadores aritméti
os
Los operadores aritméti
os en C son los mismos que se han dado en la
subse
ión 2.1.3 de este texto. El operador módulo es apli
able sólo a los tipos
de datos enteros.
+, −.
3.1. C 75
Operadores lógi
os
En la se
ión 2.1.3 hemos hablado ya de los operadores:
Y lógi
o o
onjun
ión: .Y.
Por otra parte están las variables globales, que no se de
laran dentro de
78 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
ninguna fun
ión, sino después de de
larar los prototipos de fun
iones y antes
de la fun
ión prin
ipal del programa. Estas variables pueden utilizarse en
ualquiera, in
luso en varias, de las fun
iones de
laradas en todo el programa.
Y el prototipo de una fun
ión así de
larada es una expresión redu
ida de
la de
lara
ión de una fun
ión, en la que guran el identi
ador de la fun
ión,
sus argumentos y el tipo de valor que devuelve, sin in
luir la deni
ión de la
misma. Un prototipo de fun
ión se enun
ia de la siguiente manera:
Está permitido no de
larar los prototipos de las fun
iones, pero en tal
aso deben de
lararse las deni
iones de las fun
iones antes de que aparez
a la
fun
ión main(), pues en
aso de no ha
erlo así la
ompila
ión será fallida. Sin
embargo, re
omendamos denir las fun
iones despúes del main() y de
larar
los prototipos en el lugar que hemos indi
ado, ya que esto permite tener una
visión general de la estru
tura del programa y las fun
iones que lo
onforman
sin ne
esidad de leer todo el
ódigo.
3.1. C 79
Si la fun
ión regresa algún dato, debe gurar entre las instru
iones del
uerpo de la fun
ión la proposi
ión:
return <exp>;
donde <exp> es una variable del tipo indi
ado por <tipoDeDatoRegresado>, o
bien una expresión que al ser evaluada resulta ser un valor del tipo di
ho antes.
O bien:
También existen fun
iones que no re
iben ni devuelven datos. Dando lugar
a deni
iones de fun
iones
on la forma:
80 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
o in luso indi ar explí itamente que no re ibe datos, ni retorna ningún dato:
Note que en el
aso en que una fun
ión no retorna dato alguno, no hemos
omitido <tipoDeDatoRegresado> (hemos empleado el pseudo-tipo de dato
void). Si se omite por
ompleto <tipoDeDatoRegresado> la fun
ión retornará,
por omisión, datos de tipo int.
nombreDeFun ión(<argumentos>);
También puede llamarse a una fun
ión dentro de ella misma, lo que se
ono
e
omo re
ursividad. Este es un tema a tratar en el
urso Programa
ión
II
Una fun
ión que regresa un valor de
ierto tipo de dato, puede emplearse
omo di
ho tipo de dato, por ejemplo, si tenemos una fun
ión:
Y ya que retomamos el tema de la fun
ión main()
abe men
ionar que,
dado que en los programas presentados hasta ahora no hemos espe
i
ado
el tipo de dato que retorna esta fun
ión, por lo que devuelve por omisión
datos de tipo entero (al igual que
ualquier fun
ión en la que no se espe
i
a
<tipoDeDatoRetornado>). Es por esta razón que no hay problema en in
luir,
en su de
lara
ión de la fun
ión rin
ipal, la instru
ión
return 0;
Es también
orre
to espe
i
ar que el tipo del dato que devuelve es entero,
de la siguiente manera:
int main(){
<instru
iones>
return 0;
}
Para los programas siguientes tomamos la
onven
ión de de
larar la fun
ión
main()
omo sigue:
int main(void){
<instru
iones>
return 0;
}
82 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Programa 3.1.2.
//De
lara
ión de ar
hivos de en
abezado
#in
lude<stdio.h>
int main(void){
printf(Este programa
al
ula el produ
to de dos binomios
onjugados\n);
int a, b,
;
printf(Introduz
a un valor para la variable a\n);
s
anf( %d, &a );
printf(Introduz
a un valor para la variable b\n);
s
anf( %d, &b );
=(a + b)*(a − b);
printf(( %d+ %d)*( %d+ %d)= %d\n, a, b, a, b,
);
printf(Fin del programa\n);
return 0;
}
Ha
emos notar que las dos primeras líneas es
ritas dentro del main()
representan una úni
a instru
ión, pues
omo hemos men
ionado antes, el
delimitador de instru
iones es el punto y
oma. Evidentemente, la segunda
línea altera el sangrado de instru
iones que hemos
onvenido. Una manera de
remediarlo
onsiste en utilizar los printf() que sean ne
esarios, por ejemplo,
en lugar de es
ribir un sólo printf() podemos es
ribir:
Ahora vamos a implementar este mismo programa empleando una fun ión.
Programa 3.1.3.
//De
lara
ión de ar
hivos de en
abezado
#in
lude<stdio.h>
Otra ventaja que propor
iona la utiliza
ión de fun
iones, es que es más fá
il
la le
tura y
omprensión del programa, así
omo la modi
a
ión del mismo.
Programa 3.1.4.
//De
lara
ión de ar
hivos de en
abezado
#in
lude<stdio.h>
A
laramos que en este lenguaje de programa
ión, sangrar las instru
iónes
no es obligatorio, pero si re
omendable
on objetivo de fa
ilitar la le
tura y
omprensión de los programas. Cabe men
ionar que existen lenguajes en los
que esto si es ne
esario, pues no se pueden emplear las llaves ({, }) para
delimitar los bloques de instru
iones de las senten
ias de
ontrol.
Senten
ia if
El equivalente en C a la senten
ia SI, es la instru
ión if, y la de
lara
ión
se ha
e de la siguiente manera:
Cabe men
ionar que si el bloque <instru
iones >
onsta de una sola
instru
ión, pueden omitirse las llaves. A
laramos que esto está permitido
ex
lusivamente en el
aso en que se debe eje
utar una úni
a instru
ión (
on
la hipótesis de que se
umple la
ondi
ión), pues en otro
aso, el programa
podría
omportarse de una manera no deseada.
#in lude<stdio.h>
int main(void){
int a;
float b;
printf(Introduz
a un número diferente de
ero\n);
s
anf( %d,&a);
if(a!=0){
//Note la
onversión explí
ita (float)a
b=1/(float)a;//0 bien b=1.0/a
printf(1/ %d = %f\n, a, b);
}
if(a==0){
printf(El número introdu
ido no es válido\n);
}
printf(Gra
ias por utilizar este programa\n);
return 0;
}
Senten
ia if-else
La senten
ia
ondi
ional SI-DOM posee un equivalente en C, el if-else. La
forma general de de
lararla es:
3.1. C 87
Al igual que el
uerpo del if, en el else pueden omitirse las llaves si
<instru
iones2>
onsta de una úni
a senten
ia.
Ahora daremos una solu
ión alternativa a la del programa 3.1.5, empleando
la senten
ia if-else.
#in lude<stdio.h>
int main(void){
int a;
float b;
printf(Introduz
a un número diferente de
ero\n);
s
anf( %d,&a);
if(a!=0){
//Note la
onversión explí
ita (float)a
b=1/(float)a;
printf(1/ %d = %f\n, a, b);
}
else{
printf(El número introdu
ido no es válido\n");
}
printf(Gra
ias por utilizar este programa\n);
return 0;
}
Note que este
ódigo no tiene grandes diferen
ias
on el programa 3.1.5.
Lo úni
o que se ha modi
ado es if(a!=0) por else. Sin embargo, el ujo
del programa presenta diferen
ias importantes, tal
omo ya se mostró en la
subse
ión 2.1.1.
#in lude<stdio.h>
int main(void){
int m, n;
printf(Introduz
a un valor numéri
o para la variable m\n);
s
anf( %d,&m);
printf(Introduz
a un valor numéri
o para la variable n\n);
s
anf( %d,&n);
if(m>n){
printf( %d es mayor que %d\n, m, n);
}
else{
if(m<n){
printf( %d es menor que %d\n, m, n);
}
else{
printf( %d es igual a %d\n, m, n);
}
}
printf(Fin del programa\n);
return 0;
}
Senten
ia else if
La senten
ia SI-DOM puede pensarse
omo un
aso parti
ular de otra de las
senten
ias de
ontrol estudiadas en el
apítulo de algoritmi
a: el SI-(DOM-SI).
La sintáxis para el SI-(DOM-SI)) en C es else if, y la manera de de
lararse se
presenta enseguida:
3.1. C 89
#in lude<stdio.h>
int main(void){
int m, n;
printf(Introduz
a un valor numéri
o para la variable m\n);
s
anf( %d,&m);
printf(Introduz
a un valor numéri
o para la variable n\n);
s
anf( %d,&n);
if(m>n){
printf( %d es mayor que %d\n, m, n);
}
else if(m<n){
printf( %d es menor que %d\n, m, n);
}
else{
printf( %d es igual a %d\n, m, n);
}
printf(Fin del programa\n);
return 0;
}
90 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Senten
ia swit
h
SWITCH, la última de las estru
turas de
ontrol
ondi
ionales presentadas
en el apartado 2.2.1 no existe para todos los lenguajes de programa
ión.
Afortunadamente en C si existe, aunque en realidad es muy similar a else
if. La palabra reservada para esta senten
ia es swit
h. Se utiliza del siguiente
modo:
swit
h(<variable>){
ase <
1>:{
<instru
iones1>
break;
}
ase <
2>:{
<instru
iones2>
break;
}
ase <
3>:{
<instru
iones3>
break;
}
.
.
.
#in lude<stdio.h>
int main(void){
har letra;
printf(Te
lee una letra(minús
ula) del abe
edario\n);
s
anf( %
, &letra);
swit
h(letra){
ase 'a':{
printf(Es vo
al\n);
break;
}
ase 'e':{
printf(Es vo
al\n);
break;
}
ase 'i':{
printf(Es vo
al\n);
break;
}
ase 'o':{
printf(Es vo
al\n);
break;
}
ase 'u':{
printf(Es vo
al\n);
break;
}
default:{
printf(Es
onsonante\n);
}
}
printf(Fin del programa\n);
return 0;
}
92 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
NOTA: Pueden omitirse sin problema alguno los paréntesis que delimitan
las se
uen
ias de instru
iones que ha de eje
utarse en
ada
ase.
#in lude<stdio.h>
int main(void) {
har letra;
printf(Te
lee una letra (minús
ula) del abe
edario\n);
s
anf( %
, &letra);
swit
h(letra) {
ase 'a':
ase 'e':
ase 'i':
ase 'o':
ase 'u':{
printf(Es vo
al\n);
break;
}
default: {
printf(Es
onsonante\n);
}
}
printf(Fin del programa\n);
return 0;
}
razón por la que limitaremos a dar úni
amente la sintaxis de
ada una, así
omo uno o dos ejemplos de programas en los que se emplea
ada una de ellas,
sin detenernos a expli
ar
omo es que fun
iona
ada uno de estos
i
los, pues
la expli
a
ión se ha dado en la subse
ión 2.2.2.
Senten
ia while
while es una de las tres senten
ias de
ontrol iterativas, y es el equivalente
a la senten
ia MIENTRAS que se ha presentado ya en la se
ión anterior. Así
pues, para utilizarla se ha
e una de
lara
ión del siguiente tipo:
#in lude<stdio.h>
int main(void){
int n;
printf(Este programa imprime los enteros de 0 a n en orden);
printf( des
endente\n);
printf(Introduz
a un valor entero y no negativo para n\n);
s
anf( %d,&n);
while(n>=0){
printf(" %d\n,n);
n−−;
}
printf(Fin del programa\n);
return 0;
}
Senten
ia do-while
do-while es la variante de la senten
ia while. Di
ho de otra manera,
do-while es la senten
ia que
orresponde al HACER-MIENTRAS del que ya se
94 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
do{
<instru
iones>
} while(<
ondi
ión>)
int main(void){
int n;
printf(Este programa imprime los enteros de 0 a n en);
printf( orden des
endente\n);
printf(Introduz
a un valor entero y no negativo para n);
s
anf( %d, &n);
do{
printf( %d\n, n);
n−−;
}while(n>=0);
printf(Fin del programa\n);
return 0;
}
#in lude<stdio.h>
int main(void){
int n;
printf(Este programa imprime los enteros de 0 a n en);
printf( orden des
endente\n);
printf(Introduz
a un valor entero y no negativo para n);
s
anf( %d, &n);
if(n>=0){
do{
printf( %d\n, n);
n−−;
}while(n>=0);
}
printf(Fin del programa\n);
return 0;
}
El le
tor puede es
ribir ambos
ódigos y eje
utarlos para ver que en efe
to,
los resultados varían ligeramente.
Senten
ia for
Por último, la senten
ia de
ontrol iterativa for
orresponde a la instru
ión
PARA del
apítulo anterior. Debe de espe
i
arse así:
#in lude<stdio.h>
int main(void){
int x=1,n;
printf(Este programa
al
ula el fa
torial de un número\n);
printf(Introduz
a un valor entero no negativo\n);
s
anf( %d,&n);
if(n>1){
int i;
for(i=2;i<=n;i++){
x=i*x;
}
printf( %d, x);
}
else if(n==0 || n==1){
printf( %d, x);
}
else{
printf(El número introdu
ido debe ser no negativo);
}
printf(Fin del programa);
return 0;
}
#in lude<stdio.h>
int main(void){
int n, x=0, i, j;
printf(Intoduz
a un número no negativo\n);
s
anf( %d,&n);
for(i=1,j=n;j>=1;j−−,i++){
x=x+i+j;
}
x=x/2;
printf(La suma es igual a %d \n, x);
return 0;
}
Programa 3.1.16.
#in
lude<stdio.h>
int main(void){
int n, x=0, i=1, j;
printf(Intoduz
a un número no negativo\n);
s
anf( %d,&n);
j=n;
for( ;j>=1;j−−,i++){
x=x+i+j;
}
x=x/2;
printf(La suma es igual a %d \n, x);
return 0;
}
Note que la ini
ializa
ión de la variable j se realiza una vez que se ha
leido el valor de n. De no ha
erlo así, por ejemplo, asignar j=n antes de leer n
98 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Programa 3.1.17.
#in
lude<stdio.h>
#in
lude<stdbool.h>
int main(void){
int n,i,j;
bool B=true;
printf(Introduz
a un número no negativo);
s
anf( %d, &n);
for(i=1, j=1; j<500*i*i & B; i++, j=2*j+1){
if(i*i+j*j>=n){
B=0;
}
}
printf(Hola %d \n %d \n i2 +j 2 <n\n, i, j);
printf(Fin del programa");
return 0;
}
Programa 3.1.18. Implementa
ión de la solu
ión del ejemplo 2.2.9 empleando
while(MIENTRAS)
la senten
ia
#in lude<stdio.h>
int main(void){
int x=0, y=0, i=1, k=0;
printf(Con un grupo de 10,000
ani
as se forma una pirámide);
printf( de base
uadrada,
on una úni
a
ani
a en su vérti
e);
printf( superior y un número
uadrado perfe
to de
ani
as)
printf( en
ada etapa. ¾Cuántas
ani
as sobrarán?);
while(k<10000){
k=k+i*i;
i++;
if(k<10000){
y++;
x=k;
}
}
printf(El número de
apas es: %d,y);
printf(Las
ani
as sobrantes son: %d, 10000-x);
return 0;
}
Programa 3.1.19. Implementa
ión de la solu
ión del ejemplo 2.2.9 empleando
la senten
ia do-while(HACER-MIENTRAS)
100 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
#in
lude<stdio.h>
int main(void){
int x=0, y=0, i=1, k=0;
printf(Con un grupo de 10,000
ani
as se forma una pirámide);
printf( de base
uadrada,
on una úni
a
ani
a en su vérti
e);
printf( superior y un número
uadrado perfe
to de
ani
as)
printf( en
ada etapa. ¾Cuántas
ani
as sobrarán?);
do{
k=k+i*i;
i++;
if(k<10000){
y++;
x=k;
}
}while(k<10000);
printf(El número de
apas es: %d,y);
printf(Las
ani
as sobrantes son: %d, 10000-x);
return 0;
}
Programa 3.1.20. Implementa
ión de la solu
ión del ejemplo 2.2.9 empleando
for(PARA)
la senten
ia
#in
lude<stdio.h>
int main(void){
int x=0, y=0, i, k;
printf(Con un grupo de 10,000
ani
as se forma una pirámide);
printf( de base
uadrada,
on una úni
a
ani
a en su vérti
e);
printf( superior y un número
uadrado perfe
to de
ani
as)
printf( en
ada etapa. ¾Cuántas
ani
as sobrarán?);
for(k=0, i=1;k<10000;i++){
k=k+i*i;
if(k<10000){
y++;
x=k;
}
}
printf(El número de
apas es %d,y);
printf(Las
ani
as sobrantes son %d, 10000-x);
return 0;
}
3.1. C 101
3.1.11. Arreglos
Un ve
tor,
omo ya sabemos,
ontiene elementos de un mismo tipo (no
puede tener, por ejemplo, elementos de tipo int y oat a la vez). Los arreglos
unidimensionales se de
laran en C de la siguiente manera:
int v1[10℄={0,1,2,3,4,5,6,7,8,9};
Debe tenerse espe
ial
uidado en no salirse del rango de las entradas
del ve
tor, pues el
ompilador no nos muestra un error si intentamos a
eder
(y por ejemplo, imprimir) un elemento que se en
uentra en una posi
ión
que sobrepasa los límites de la deni
ión del ve
tor, i.e, i>=<tamaño>. Por
ejemplo:
Lo
ual no sería mar
ado
omo error por el
ompilador, pero evidentemente
es in
orre
to, pues los elementos impresos no son los que forman a v1. Es
por esto que, dado que C no tiene veri
a
ión en términos de validar que
úni
amente se usen las posi
iones de
laradas, el programador debe tener sumo
uidado, pues en
aso de salirse de los rangos del arreglo, estaría invadiendo
espa
ios de memoria ajenos, pudiendo
ondu
ir esto a obtener
omportamientos
inesperados.
y/o utilizar sólo las que ne
esitemos (por ejemplo, 50), aunque hay que tener
uidado de no utilizar los elementos del ve
tor de los que des
ono
emos su
ontenido, para evitar
omportamientos anormales en nuestros programas.
Programa 3.1.21.
#in
lude<stdio.h>
int main(void) {
int tam, i;
printf(Introduz
a entero y no negativo para el tamaño);
printf( del ve
tor.\n);
s
anf( %d, &tam);
int v[tam℄;
for(i=0; i<tam; i++) {
printf(Introduz
a un número entero para la);
printf( entrada v[ %d℄ del ve
tor v\n, i);
s
anf( %d, &v[i℄);
}
printf(El ve
tor leído desde el te
lado es: v=[);
for(i=0; i<tam; i++) {
printf( %d,, v[i℄);
}
printf(℄);
return 0;
}
gets(): Esta fun
ión nos sirve para obtener una
adena de
ará
teres
104 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
#in
lude<stdio.h>
int main(void) {
har texto[20℄;
printf(Es
riba una ora
ion de a lo más);
printf( 20
ará
teres:\n);
gets(texto);
printf(\nTexto obtenido \ %s\\n, texto);
return 0;
}
Aqí puede su
eder que no se o
upen todos los espa
ios disponibles del
ve
tor, por de
ir algo, que se introduz
an úni
amente 10
ará
teres,
lo
ual no
ausará
oni
to alguno. En
ambio, si se introdu
e una
adena
uya lóngitud rebasa el tamaño del ve
tor destinado para el
alma
enamiento, se produ
e un error:
get
har(): Esta una fun
ión es
omo un
aso parti
ular de gets(), ya
que sirve para leer desde el te
lado un sólo
ará
ter. Considéremos el
siguiente ejemplo:
#in lude<stdio.h>
int main(void){
har letra1, letra2;
printf(Presione dos letras y pulse Intro: );
letra1 = get
har();
letra2 = get
har();
printf(Cará
teres re
ibidos: );
put
har(letra1);
printf( y %
\n, letra2);
return 0;
}
Antes que nada, observe que se ha utilizado la fun
ión put
har() por
primera vez en éste texto. Ésta sirve para imprimir
ará
teres(sólo uno
por
ada vez que se emplea di
ha fun
ión). En la siguiente gura se
muestra la eje
u
ón de éste programa:
La fun
ión get
har() lee
ará
ter a
ará
ter, y no se analiza lo que
hemos te
leado hasta que se pulsa Intro. Si te
leamos varias letras, la
primera vez que usemos get
har nos dirá
ual era la primera, la siguiente
vez que se utili
e nos dirá
ual fue la segunda letra y así su
esivamente.
<tipoDeDato> <nombreDeMatriz>[<numFilas>℄[<numColumnas>℄;
Programa 3.1.24.
#in
lude<stdio.h>
int main(void) {
int mat[5℄[4℄,i, j;
//Asignamos las entradas de la matriz
for(i=0 ;i<5 ; i++) {
for(j=0; j<4; j++) {
mat[i℄[j℄=0;
}
}
//Imprimimos los elementos de la matriz
printf(Los elementos de la matriz son:\n\n);
for(i=0 ;i<5 ; i++) {
for(j=0; j<4; j++) {
printf( %d\t,mat[i℄[j℄);
}
printf(\n);
}
return 0;
}
Programa 3.1.25.
#in
lude<stdio.h>
int main(void) {
int m, n, i, j;
printf(Para
rear un matriz de números flotantes\n);
printf(indique en número de filas);
s
anf( %d, &m);
printf(y el número de
olumnas);
s
anf( %d, &n);
float matriz[m℄[n℄;
//Leemos las entradas de la matriz
for(i=0 ;i<m ; i++) {
for(j=0; j<n; j++) {
printf(Introduz
a el elemento de la ");
printf(posi
ión M[ %d℄[ %d℄, i, j);
s
anf( %f, &matriz[i℄[j℄);
}
}
//Imprimimos los elementos de la matriz
printf(Los elementos de la matriz son:\n\n);
for(i=0 ;i<m ; i++) {
for(j=0; j<n; j++){
printf( %f\t,matriz[i℄[j℄);
}
printf(\n);
}
return 0;
}
Programa 3.1.26.
//Este programa nos di
e si un número es par o impar
Programa 3.1.27.
3.1. C 109
Programa 3.1.28.
Programa 3.1.29.
3.2. JAVA 111
3.2. Java
JavaT M es un lenguaje de programa
ión que entra en la
ategoría de los
lenguajes que se
ompilan a
ódigo intermedio, y fue desarrollado por Sun
Mi
rosystems In
.
R empresa que, ha
e po
o fue
omprada por Ora
le, la
ual
es a
tualmente la en
argada de la espe
i
a
ión de este lenguaje. Existe una
variante de Java llamada OpenJava, que no es más que Java tomado de la
última versión de Java
uando era de
ódigo abierto y a partir de ella la
omunidad sigue parti
ipando en el desarrollo del lenguaje. En el presente
texto vamos a utilizar Java propor
ionado por Ora
le, y re
omendamos no
utilizar OpenJava, pues si
ompilamos un programa en OpenJava posiblemente
no fun
ione la eje
u
ión del programa en una
omputadora
on Java de Ora
le.
java
Si ya está instalada, nos mostrará informa
ión. En
aso
ontrario nos noti
a
que no está instalado y allí mismo nos redire
iona a la instala
ión del mismo.
Otra alternativa es ir al
entro de software de Ubuntu,...
112 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
java -version
Figura 3.12: Pro eso de ompila ión (java ) y eje u ión (java) de un programa en Java
Debe existir una y sólo una
lase pri
ipal, y es en la que
omienza la
eje
u
ión del programa. Más pre
isamente el programa
omienza a eje
utarse
en donde se en
uentra el main(). Es
onveniente señalar que, si bien no es
una regla sintá
ti
a, es una
onven
ión generalmente a
eptada que los nombres
de las
lases
omien
en
oon letra mayús
ula, mientras que los de
ualquier
otro
omponente ini
ien
on minús
ula (Se detallan éstas reglas en ??). El
seguimiento de esta
onven
ión,
onere a los programas una más fá
il le
tura
por parte del programador.
También es importante men
ionar que el ar
hivo que
ontenga una
lase
denido
omo publi
, debe imperativamente tener el mismo nombre que
di
ha
lase. Esta misma regla apli
a para el
aso de que una
lase
ontenga en
su interior el método main(). Los modi
adores publi
, private y stati
serán abordados en 3.2.5. El nombre de esta
lase prin
ipal debe
omenzar
forzosamente
on mayús
ula, al igual que
ualquier otra
lase. Por otra parte,
los ar
hivos .java deben guardarse imperativamente
on el mismo nombre que
la
lase
uya deni
ión
ontienen.
En este ejemplo la
lase Hola es la
lase prin
ipal, es por ello que el
ódigo
se alma
enó (en el es
ritorio de la
omputadora)
on el nombre Hola.java.
java Hola.java
java Hola
hola, mundo.
Para efe
tos de éste texto vamos a utilizar el Entorno de Desarrollo Integrado
Netbeans
R . Puede des
argarse desde la página o
ial de Netbeans de forma
gratuita. Está disponible tanto para el S.O. Unix así
omo para Ma
Os X.
Hemos optado programar desde este IDE
on la nalidad de explotar un po
o
las ventajas que tiene este lenguaje en lo que
on
ierne al uso de grá
os,
aunque no se abordará mu
ho en el tema, sino que se dará una muy breve
expli
a
ión sobre la
rea
ión de ventanas para la intera
ión hombre-máquina.
Cabe men
ionar que existen otros IDE que pueden emplearse,
omo por ejemplo,
E
lipse
R aunque para efe
to de las expli
a
iones
ontenidas en estas notas, se
hará uso de Netbeans.
Después de sele
ionar Next debemos es
ribir un nómbre para el proye
to,
y si deseamos que se
ree la
lase prin
ipal del programa hay que mar
ar la
op
ión Create Main Class.(g 3.16).
118 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Como hemos men
ionado, por omisión el
ódigo a eje
utarse es el que
se en
uentra dentro de la instru
ión
System.out.println(hola, mundo);
Para
ompilar y eje
utar este programa de una manera sen
illa, vamos
al panel izquierdo y ha
emos
li
dere
ho en nuestro proye
to y sele
ionamos
la op
ión Set as Main Proje
t. Cada vez que ne
esitemos
orrer el programa
(
ompilarlo y eje
utarlo) basta pulsar en el i
óno:
120 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
/* aquí
va
el
omentario*/
hola, mundo.
Enseguida se de
laran e ini
ializan una varible de
ada uno de los tipos
espe
i
ados en la tabla:
byte a=123;
short b=43;
int
=3;
long d=233432;
float e=234.124165f;
double f=1623.2847134604;
har g='t';
boolean h=true;
de
laramos una variable, digamos de tipo int e intentamos utilizarlo sin haberlo
ini
ializado, la
ompila
ión resultará fallida.
Para poder operar dos variables, estas deben ser del mismo tipo por lo
ual (a ve
es) es ne
esario efe
tuar
onversiones de tipo.
byte x=100;
short x1=x;
int x2=x;
long x3=x;
float x4=x;
double x5=x;
double y=12;
float y1=(float)y;
long y2=(long)y1;
int y3=(int)y2;
short y4=(short)y3;
byte y5= (byte)y4;
y1=1.23878618E9
y2=1238786176
y3=1238786176
y4=24704
y5=-128
124 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
3.2.3. Operadores
Operadores aritmeti
os
Los operadores aritméti
os que nos propor
iona este lenguaje son los mismos
que se han dado en la subse
ión 2.1.3 de este texto. El operador módulo es
apli
able sólo a los tipos de datos enteros.
+, −.
igual que: ==
diferente que: ! =
Éstos a
túan sobre tipos de datos enteros, otantes o
ará
teres. Las expresiones
a ambos lados del operador deben pertene
er al mismo tipo de dato.
Respe
to a estos operadores solo resta men
ionar que los operadores == y
! = tienen la misma pre
eden
ia y se aso
ian de izquierda a dere
ha. Por otra
parte, los
uatro operadores restantes son de pre
eden
ia igual, y mayor que la
de ==. Además, los operadores de pre
eden
ias iguales se aso
ian de dere
ha
a izquierda.
Operadores lógi
os
En la se
ión 2.1.3 hemos hablado ya de los operadores:
El operador de nega
ión tiene pre
eden
ia mayor que la de la
onjun
ión.
La pre
eden
ia del operador disyun
ión es menor a la de la
onjun
ión.
Operadores
!, ++, −−
*, /, %
+, −
<, <=, >, >=
==, !=
&&
||
=, +=, −=, *=, /=, %=
nombre
género
edad
o upa ión
na ionalidad
es ribir
trabajar
asarse
aminar
levantarManoDere ha
Nombres de variables
El le
tor ya habrá notado de que las
lases las hemos es
rito
on mayús
ula
ini
ial, mientras que los atributos y métodos
omienzan
on minús
ula. En
adelante, para Java tomamos esta
onven
ión. Más espe
i
amente, daremos
las reglas que seguiremos en el presente texto para asignar nombres:
Cabe men
ionar que el paquete java.lang propor
iona
lases que engloban
(de
ierta manera se puede de
ir que
ontienen) a los tipos de datos simples
de Java. Éstas son las siguientes:
i ) java.lang.Byte
ii ) java.lang.Short
iii ) java.lang.Integer
iv ) java.lang.Long
v ) java.lang.Float
vi ) java.lang.Double
viii ) java.lang.Boolean
lass <NombreDeClase>{
//Cuerpo de la
lase
<atributos>
<métodos>
}
return <exp>;
publi
<NombreDeClase>(<parámetros>){
<ini
ializa
iónDeLosAtributos>
}
3.2. JAVA 133
Un ejemplo
ompleto
Vamos ahora a
onsiderar un ejemplo más
ompleto, del
ual haremos la
implementa
ión de un programa en este lenguaje:
parteReal
parteImaginaria
norma
inversoMultipli ativo
y sus métodos:
al ulaConjugado
al ulaNorma
sumaComplejos
al
ulaInversoMultipli
ativo
134 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Enseguida vamos mostrar
omo denir esta
lase en Java dentro del proye
to
MiPrimerPrograma:
i ) Primero a
edemos a File>New File.
iii ) Damos un nombre a la
lase que estamos
reando. Re
ordemos que debe
omenzar
on mayús
ulas. Para este ejemplo, hemos dado el nombre
Complejo.
//CONSTRUCTORES
//Creamos un
onstru
tor que no re
ibe argumentos
publi
Complejo(){
parteReal=0;
parteImaginaria=0;
}
//GETTERS:
publi
float re
uperaParteReal(){
float r=this.parteReal;
return r;
}
//SETTERS:
publi
void defineValores(float re,float im){
this.parteReal=re;
this.parteImaginaria=im;
}
La primera observa
ión que ha
emos es que a los atributos hemos antepuesto
el modi
ador private (para más detalles ver 3.2.5), lo que quiere de
ir que
sólo se tiene a
eso a di
hos atributos desde la misma
lase, por lo que no
podremos modi
arlos desde otra
lase.
Note además que los atributos de una
lase pueden ser in
luso elementos
de la misma
lase. Despúes de la de
lara
ión de los atributos, se han denido
dos
onstru
tores, los
uales no re
iben argumentos e ini
ializan los atributos
parteReal y parteImaginaria, en el primer
aso, no re
ibe parámetros e
ini
ializa estos valores
omo
ero y en el segundo
onstru
tor se ini
ializan
omo los dos valores de tipo otante re
ibidos. Podrían también denirse otros
onstru
tores siempre y
uando re
iban diferentes argumentos (ya sea en tipo
o
antidad).
• deneValores()
• deneNorma()
• deneInversoM()
3.2. JAVA 139
nuevo.defineNorma()
nuevo.defineInversoM()
Getters: Son métodos similares a los setters, diriendo en que los getters
retornan algúno de los atributos de un objeto. El ejemplo 3.2.1
uenta
on 4 setters:
• re
uperaParteReal()
• re
uperaPArteImaginaria()
• re
uperaNorma()
• re
uperaInverso()
Los métodos(instan
iados) que retornan algún valor pueden ser asignados
a alguna variable pertene
iente a la
lase o tipo de valor que regresa. Por
140 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
ii ) Heren
ia: Permite denir nuevas
lases a partir de las que ya existen,
de tal manera que la nueva
lase posea todos los métodos y atributos
que la
lase original. La nueva
lase puede tener además otros métodos
y atributos o in
luso se pueden redenir atributos de ésta
lase. Di
ho
de otra manera, podemos extender una
lase preexistente, agregando o
modi
ando sus atributos y/o métodos. Por ejemplo, si
onsideramos
la
lase
omplejo, podemos denir una nueva
lase Real que tenga los
mismos atributos y métodos que los de Complejo, además de (quizá)
otros adi
ionales. Por ejemplo, el atributo parteImaginaria sería igual
a
ero para todas las instan
ias de Real. También, norma
oin
ide
on el
valor absoluto de los números reales, y
omo es sabido, la suma de reales
es
oin
ide
on la suma de
omplejos,
onsidérando a éstos números reales
on parte imaginaria igual a
ero.
lase Complejo, en la
uál existen dos métodos (de he
ho,
onstru
tores
ambos) que tienen el mismo nombre o identi
ador pero que efe
tuan
diferentes a
iones, pues re
iben diferentes parámetros para su eje
u
ión.
lass <NombreDeClase>{
//Cuerpo de la
lase
<atributos>
<métodos>
}
Ahora que hablamos de los modi
adores que nos permitirán o limitarán el
a
eso al uso de una
lase, la sintaxis es la siguiente:
<atributos>
<métodos>
}
142 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
publi
: Las
lases
on esta propiedad pueden ser utilizadas desde
ualquier
paquete (in
luso aquellos en los que no ha sido de
larada). Una
lase
on
tal
ara
terísti
a debe de
lararse en un ar
hivo que lleve el nombre de tal
lase. De aquí se dedu
e que en un ar
hivo .java puede existir uni
amente
una
lase públi
a.
Clase2{
.
.
.
}
on la ex
ep
ión de que no está permitido que una
lase sea a la vez abstra
t
y final.
3.2. JAVA 143
<Clase> <nombre>;
en
ualquiera de los
asos están permitidos los modi
adores: private, publi
,
prote
ted o ninguno de ellos.
El modi
ador se espe
i
a antes que <tipoBási
o> o <Clase> según sea
el
aso:
Los efe tos de ada uno de éstos modif adores se resumen en la tabla:
Modi
ador a
eso desde a
eso desde a
eso desde a
eso desde
misma
lase sub
lase sismo paquete todo el entorno
private si no no no
publi
si si si si
prote
ted si * si no
por omisión si no si no
*Se tendrá a
eso desde las sub
lases del mismo paquete o desde
la primera sub
lase de la
lase en que se de
laro el atributo
144 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Ahora, vamos a
rear una nueva
lase dentro de este proye
to, para esto
vamos a File>New File
146 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Con estos pasos habremos obtenido una
lase que es una extensión de
javax.swing.JFrame. Puede
onsultarse la espe
i
a
ión de ésta
lase en la
API. Aquí no vamos a dar todos los detalles. Nos limitamos a mostrar algunas
de sus
ara
ter'isti
as y
omo emplearla. Ésta
onsta prin
iaplmente de dos
partes:
El diseño de la ventana.
En la gura 3.25 se muestra la interfaz
orrespondiente al
digo fuente en
el
ual podremos espe
i
ar las instru
iones del programa. Observe además
que dentro de este
ódigo se en
uentra
ontenida la
lase prin
ipal main(),
razón por la
ual al momento de
rear el nuevo proye
to CreandoVentana
no fue ne
esario
rear la
lase prin
ipal.
3.2. JAVA 149
El siguiente paso que vamos a dar es agregar un boton. Para esto basta
3.2. JAVA 151
JTextArea
Es importante men
ionar que todos estos
omponentes, y los demás que
se en
uentran en el Palette, perene
en a
lases predenidas en el pa
kage
jaxax.swing. Cuando arrastramos alguno de estos
omponentes hasta el área
154 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Figura 3.32: Panel en el que se muestran los omponentes que hemos añadido a la ventana.
Para este ejemplo, hemos añadido dos elementos de esta
lase, uno (jLabel1)
que muestra el texto: Programa que re
ibe el nombre de una persona, y
el segundo (jLabel2) en el que se en
uentra el texto: Es
riba aquí su nombre
quedando nuestra ventana tal
omo se muestra en la gura3.33. Nota: Se ha
efe
tuado un simple rea
omodo de las posi
iones de los
omponentes de la
ventana, para darle una mejor presenta
ión.
156 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
JLabel.
Para los nes de los ejemplos que se in
luyen en este texto, estos son todos
los
omponentes que se utilizarán, por lo que no hablaremos de los demás. El
le
tor interesado puede
onsultar la API para ver la espe
i
a
ión de estas
lases, o bien,
onsultar algún texto espe
ializado en estos temas.
Programa 3.2.2. Espe
i
a
ión de la
lase Alumno, dentro del proye
to Creando
Ventana
/*
* To
hange this template,
hoose Tools | Templates
* and open the template in the editor.
*/
3.2. JAVA 157
/**
*
* author javier
*/
//Constru
tor
publi
Alumno(){
nombre=null;
edad=0;
es
uela=null;
}
//Setters
publi
void defineNombre(String x){
this.nombre=x;
}
//getters
publi
String regresaNombre(){
return this.nombre;
}
El
ódigo que se es
riba en el
uerpo de este método sera eje
utado
ada
vez que se pulse el boton, durante la eje
u
ión del programa.
String x= re ibe.getText();
Este método es apli
able a instan
ias de la
lase JTextField, tales
omo el
objeto re
ibe. En ésta instru
ión estamos de
larando una nueva variable de
lase String y además la ini
ializamos
omo el valor que se en
uentre en el
JTextField re
ibe.
Dado que este método retorna elementos de tipo String, si al momento
de
orrer un programa se en
uentra es
rito un número (12.314 por ejemplo),
éste será alma
enado
omo String y no
omo número.
3.2. JAVA 159
String x= re ibe.getText();
a eptarA tionPerformed(<argumentos>)
Línea 116: Con la llamada a este
onstru
tor, se
rea un nuevo elemento
pertene
iente a la
lase Alumno.
Línea 117: Estable
emos el texto que se obtuvo en la línea 114,
omo el
atributo nombre del elemento nuevo.
160 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
salida.append(x);
O bien, puede imprimirse el atributo del objeto nuevo que hemos
reado.
Esta es la línea que in
luiremos en el
ódigo, y no la anterior, aunque en la
pantalla observariamos el mismo resultado, el programa estaría fun
ionando
de dos maneras muy distintas.
salida.append(nuevo.regresaNombre());
Note que salida es, en efe
to, un elemento de la
lase JTextArea, por lo
que el
ódigo fun
ionará
orre
tamente.
Ahora pro
edemos a eje
utar el
ódigo para ver
omo es que fun
iona.
En la gura 3.35 se muestra, a la izquierda, podemos observar la ventana
tal
ual resulta de la eje
u
ión del programa, sin haberla utilizado. Por otra
parte, a la dere
ha se en
uentra el resultado que se obtiene después de es
ribir
Fibona
i en el
omponente de tipo JTextField (destinado para re
ibir datos
introdu
idos por el usuario) y pulsar el boton A
eptar. Debido a estas a
iones,
y
on
ordando
on el
ódigo que es
ribimos, se muestra en el
omponente
destinado a mostrar texto, el nombre que hemos propor
ionado al programa.
Debe quedar
laro que el
ódigo que hemos es
rito en el
uerpo del método
a
eptarA
tionPerformed(<argumentos>) se eje
uta sólamente
ada vez que
se presiona di
ho boton.
3.2. JAVA 161
Figura 3.35: Eje u ión del programa. Antes (izquierda) y después (dere ha)
Durante la eje
u
ión de este programa, podemos ha
er que se efe
tue más
de una vez las a
iones pogramadas para el boton A
eptar. El le
tor se dará
uenta al ha
er esto, que el método setTetx() no propor
iona por sí solo un
ambio de línea en el
ampo destinado a mostrar el texto.
byte
short
int
long
oat
double
Byte
Short
Int
Long
Float
Double
No ha
e falta más que unos ejemplos que ilustren
omo se obtienen estos
tipos de datos:
Note que para
ada tipo bási
o se emplea exa
tamente el mismo método
(el de la
lase que extiende a di
ho tipo bási
o), esto debido a que los tipos
bási
os al no pertene
er a ninguna
lase, no poseen atributos ni métodos, pero
no
ausa
oni
to asignarles el valor alma
enado en un objeto de la
lase que
es una extensión del tipo de dato bási
o en
uestión.
Figura 3.37: Se añadió ódigo para obtener un número entero. (Líneas 135-140)
String x0 = Hola;
har x1 = 'e', x2 = 's';
Chara
ter x3 = 't', x4 = 'u'
String enun
iado = x0 + ' '+ esto + x1 + x2 + x3 + x4 + a + frase
String w = Hola
es string está formado por las letras de Hola y un espa io en blan o..
través de la
on
atena
ión, pues ésta también esta permitida entre los tipos de
datos di
hos antes, y variables de tipo numéri
o. Si
on
atenamos un String
on un entero, antes de
on
atenar se obtiene el String
orrespondiente a di
ho
entero.
Así pues, para imprimir el atributo edad del elemento nuevo del ejemplo
que venimos
onstruyendo, es
ribimos la instru
ión (después de la línea 140
de la imágen 3.37):
salida.append(\n+ nuevo.regresaEdad());
Se muestra en la imagen 3.38 la eje
u
ión del programa
on las modi
a
iones
he
has hasta este instante:
Cabe men
ionar que deben llenarse ambos
ampos de texto pues, en
aso
ontrario, se produ
irá un error en la eje
u
ión del programa. Para solu
ionar
o evitar este tipo de problemas se debe ha
er el uso de ex
ep
iones. (ver
Subse
ión 3.2.11)
Figura 3.38: Eje u ión del programa. Antes (izquierda) y después (dere ha) de pulsar el
boton
Note que en el
digo se han he
ho algunas modi
a
iones en los argumentos
de los métodos append() para darle presenta
ión a los datos mostrados en el
ampo destinado para mostrar el texto. El resultado de una eje
u
ión (
on dos
a
iones del boton) se ilustra en la imágen 3.41.
import javax.swing.JOptionPane;
javax.swing.*;
JOptionPane.showInputDialog(String <textoAMostrar>);
Senten
ia if-else
if(<
ondi
ión>){
<instru
iones1>
}
else{
<instru
iones2>
}
Senten
ia swit
h
swit
h(<variable>){
ase <
1>:{
<instru
iones1>
break;
}
ase <
2>:{
<instru
iones3>
break;
}
.
.
.
ase <
K>:{
<instru
ionesK>
break;
}
default{
<instru
iones>
}
}
3.2. JAVA 171
Senten
ia if
if(<
ondi
ión>) {
<instru
iones>
}
Dado que ya se ha expli
ado en el
apítulo de algoritmi
a
omo es que
fun
ionan estas senten
ias de
ontrol, nos vamos a limitar a mostrar un ejemplo,
implementado
on
ada una de éstas senten
ias de
ontrol
ondi
ionales. Cabe
men
ionar que en este lenguaje de programa
ión, si el
uerpo de las senten
ias
if o if-else
onsta de una úni
a instru
ión, pueden omitirse las llaves. Del
mismo modo, para
ada uno de los
asos de la senten
ia swit
h pueden
omitirse las llaves.
Para este ejemplo, partimos del he
ho de que hemos realizado las siguientes
a
iones:
i ) Creamos un nuevo proye
to, llamado Senten
ias Condi
ionales (sin
lase prin
ipal).
ii ) Creamos dentro de éste proye
to, una ventana (que es una
lase que
extiende a la
lase JFrameForm)
omo la que se
reó en la subse
ión
3.2.6. Hemos nombrado a ésta Condi
ionales.
vii ) El boton Senten ia swit h tiene omo nombre de variable: senten iaS.
Note que aquí ya se está utilizando la senten
ia if. Este método lo hemos
de
larado en la parte inferior del
ódigo fuente, pero dentro de la
lase publi
lass Condi
ionales extends javax.swing.JFrame. Además, para nes de
este ejemplo vamos a tratar a los
ará
teres
omo variables de tipo String, ya
que esta
lase es más ri
a en métodos y más manejable que el tipo bási
o
har
y la
lase Chara
ter. El método equals() sirve para
omparar si el String
al que se apli
a, es igual al objeto que se indi
a
omo argumento del método.
Para más detalles
onsultar la API.
}
}
Figura 3.44: Eje
u
ión de la ventana Condi
ionales. Las dos primeras líneas se obtuvieron
al pulsar el boton Senten
ia if, las ter
era y
uarta
on el boton Senten
ia if-else y las
do{
<instru
iones>
} while(<
ondi
ión>)
Ejemplo 3.2.2. Con un grupo de una
antidad n (te
leado por el usuario)
de
ani
as se forma una pirámide de base
uadrada,
on una úni
a
ani
a
en su vérti
e superior y un número
uadrado perfe
to de ellas en
ada etapa.
¾Cúantas
apas se obtendrán?, y ¾Cúantas
ani
as sobrarán?
i ) Creamos un nuevo proye
to, llamado Senten
ias Iterativas (sin
lase
prin
ipal).
ii ) Creamos dentro de éste proye
to, una ventana (que es una
lase que
3.2. JAVA 179
vi) El boton Senten
ia do-while tiene
omo nombre de variable: senten
iaDW.
180 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
vii ) El boton Senten ia for tiene omo nombre de variable: senten iaF.
Una vez he
ho esto, es
ribimos los fragmentos de
ódigo para las a
iones
de
ada uno de los botones. Primero, para el boton Senten
ia while, el
ódigo
es:
3.2.10. Arreglos
Ve
tores (arreglos de una dimensión)
En Java existen dos maneras de de
larar arreglos de una sola dimensión
(ve
tores):
El tipo de dato que se alma
ena en
ada una de las entradas de un ve
tor
puede ser String,
ualquiera de los tipos bási
os de Java o bien, elementos
pertene
ientes a las
lases que extienden a los tipos bási
os, tales
omo Byte,
Short, Integer, et
.,
on la restri
ión de que todas las entradas deben ser
del mismo tipo.
Por otra parte, para ini
ializar un ve
tor debemos es
ribir una línea
omo
la siguiente:
<nombreDelVe tor>[i℄
Programa 3.2.3.
3.2. JAVA 185
import javax.swing.JOptionPane;
String ve
[℄;
ve
= {Esta, es, una, frase,
ompleta}
int n = Integer.parseInt(JOptionPane.
showInputDialog(Introduz
a un número));
3.2.11. Ex
ep
iones
Hemos men
ionado previamente que en algunos
asos,
abe la posibilidad
de que un programa entre en un estado de error mientras se en
uentra en
eje
u
ión (aunque la
ompila
i'on haya sido exitosa),
uyas posibles
ausas
son de tipo semánti
o tales
omo intentar dividir por
ero, asignar un número
de punto otante a una variable entera, salirse del rango del tamaño de un
ve
tor, et
. Cuando un error de este tipo se produ
e, la JVM
rea un objeto
pertene
iente a la
lase Ex
eption y se noti
a esta situa
ión al sistema de
eje
u
ión (en el
aso de Netbeans en la noti
a
ión se realiza en la
onsola de
este IDE). Una vez
reada la ex
ep
ion, la JVM bus
a algún método
apaz de
tratar la ex
ep
ión, efe
tuando la busqueda primero dentro del método desde
el que se produjo el error, y si no lo en
uentra, bus
a ahora dentro del método
desde el que se hizo la llamada al método en el que se produjo el error, y así
su
esivamente hasta que en
uentra el método que trate la ex
ep
ión (si es que
3.2. JAVA 189
existe) o hasta que no hay más donde bus
ar. Si ningún método es
apaz de
tratar la ex
ep
ión, la JVM manda un mensaje de error y el programa naliza.
try
at h
finally
los
uales no son más que fragmentos de
ódigo en los que el programador
puede espe
i
ar que a
iones se deben realizar en
aso de que se produz
a
una determinada ex
ep
ión (prevista por el mismo programador).
try{
<Instru
iones>
}
at
h(<tipoDeEx
ep
ión> <nombreDeVariable>){
<instru
iones1>
}
at
h(<tipoDeEx
ep
ión> <nombreDeVariable>){
<instru
iones2>
}
.
.
.
finally{
<instru
ionesn>
}
nally y se eje
utan
ada una de las instru
iones de éste. Cabe la posiblidad
de que no esté presente el manejador nally.
int n = Integer.parseInt(JOptionPane.showInputDialog(
Introduz
a un número entero positivo));
3.3. Phyton
Como ya se dijo antes Python es un lenguaje interpretado, una de sus
ara
terísti
as prin
ipales es que su es
ritura es muy sen
illa, al grado de
que los programas es
ritos en este lenguaje se asemejan
on mu
ho a los
pseudo
ódigos.
iii ) A eder al dire torio en que está guardado el ar hivo del punto I).
Por otra parte, la instru
ión print es una fun
ión predenida en Python,
y se utiliza para imprimir en la pantalla el texto, o los datos que se en
uentran
enseguida. Se darán más detalles en la subse
ión 3.3.6. Tampo
o hemos denido
lo que es una fun
ión, pero por el momento basta saber que se trata simplemente
de una se
uen
ia de instru
iones que tiene una tarea espe
í
a dentro de un
programa. Se abordará más sobre ellas en 3.3.7
3.3.2. Comentarios
Un programa puede, en general, ser muy extenso, por lo que es re
omendable
poner
omentarios para indi
ar (al programador), por ejemplo,
ual es el
objetivo de alguna variable o in
luso de un fragmento de
ódigo. Los
omentarios
en éste lenguaje
omienzan
on #. Así, todas las líneas que
omien
en
on este
símbolo (#) no son senten
ias en Python, por lo que no tienen interpéta
ión al
eje
utar un programa.
3.3.3. Variables
En la mayoría de los lenguajes de programa
ión, es ne
esario de
larar las
variables, espe
i
ando además el tipo al que perene
en. In
luso hay lenguajes
(
omo Java) que exigen más aún, deben de
lararse las variables espe
i
ando su
tipo y, además hay que ini
ializarlas antes de intentar
ompilar los programas,
pues de no ser así, la
ompila
ioón no se realiza exitosamente.
196 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Para asignar un valor una variable en este lenguaje lo uni
o que hay que
ha
er es es
ribir un nombre para ella (la variable) y asignarle un valor de
alguno de los tipos que se men
ionarán más adelante. En general, esto se ha
e
on senten
ias
omo:
<nombreDeVariable> = <expresión>
Pueden tener letras mayús ulas o minús ulas, números (y el guión bajo).
Se distingue entre mayús
ulas y minús
ulas. Esto es, var y Var serían
dos variables distintas.
3.3. PHYTON 197
x=5
x=4.0
se tiene que la variable llamada x alma
ena primero un valor entero, y despúes
de la segunda asigna
ión alma
ena un valor otante. Esto no se genera
oni
to
alguno en la interpreta
ión y eje
u
ión de un programa. En otros lenguajes, por
ejemplo C, si asignamos un valor otante a una variable de tipo entero, habrá
problemas de
ompila
ión y/o eje
u
ión. Así pues, no se de
lara el tipo de una
variable debido a que podrá
ambiar durante la eje
u
ión de un programa. Los
tipos bási
os de Python son: números,
adenas y booleanos.
Cadenas
Booleanos
Números
En Python pueden manejarse tres tipos de variables numéri
as:
Enteros: Los números enteros (positivos, negativos o
ero) se representan
en Python mediante el tipo int. Pueden alma
enarse números entre −231
198 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Por omisión,
uando
reamos una nueva variable entera, se alma
ena
omo tipo de dato int. Sólo en
aso de que el número no se en
uentre
dentro del rango del tipo int es
omo será alma
enado
omo tipo long.
Por otra parte, si alma
enamos un número pequeño (no long) podemos
indi
arle al intérprete de Python que lo alma
ene
omo tipo long simplemente
agregando una L (mayús
ula) inmediatamente despúes del último dígito
del número. Por ejemplo:
n=1941L
r=3.1416
s=2.0
4.3219123e12
0.3193e-8
omp = 3i +2j
z=22.132+0.2j
Cadenas
Una
adena en Python es una se
uen
ia de
ará
teres en
errados entre
omillas simples (' ') o
omillas dobles ( ). Las
adenas pertene
en al tipo
str. En el programa
uyo
ódigo se muesta en la gura 3.57 apare
e entre
omillas dobles el texto Mi primer programa, es de
ir es una
adena. También
pudo es
ribirse en
errada entre
omillas simples:
Existe una ter
era manera de representar
adenas, siendo esta última empleada
para es
ribir una
adena en varias líneas. Para esto, en
erramos entre
omillas
(simples o dobles) triples el texto que
onformará la
adena. Por ejemplo:
Las
adenas tiene unas porpiedades muy pe
uliares, pues pueden apli
arse
a ellas los operadores + y *.
El operador suma, apli
ado a dos
adenas, las pega (una tras otra) literalmente,
lo que se
ono
e
omo
on
atena
ión. Por ejemplo, si:
a='Hola' b=mundo
enton es
= a + ' ' + b
es la
adena hola mundo. Por otra parte, el operador * efe
túa la multipli
a
ión
de un número entero y una
adena. El resultado
onsiste en la repeti
ión de la
adena, la
antidad de ve
es indi
ada por di
ho número. por ejemplo,
on
la
adena es
rita arriba y las instru
iones:
200 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
print 2*
print
*2
se obtiene:
holamundoholamundo
holamundoholamundo
Por último, dentro de las
omillas pueden in
luir
ará
teres de es
ape, tales
omo el
ambio de línea '\'. Otros
ará
teres de es
ape son:
Booleanos
Las variables booleanas o tipo boolean pueden alma
enar uno de entre los
dos valores de verdad: True o False, por ejemplo:
m=True
n=False
Se utilizan para ha
er
ompara
ionés lógi
as, utilizando los operadores lógi
os
omo veremos más adelante. También, algunas senten
ias
omparativas (o
fun
iones) regresan un valor de verdad.
type(<variable>)
3.3. PHYTON 201
la ual nos indi a el tipo de valor que se alma ena dentro de una variable.
a=3
b=2
=a+b
=True
=2+3j
a=3
b=2
=a+b
print type(
)
=True
print type(
)
=2+3j
print type(
)
Re
uerde que la asigna
ión es una opera
ión destru
tiva, por lo que en
202 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
3.3.5. Operadores
A
ontinua
ión se presentan algunos de los operadores que están disponibles
en Python. En este texto sólo hemos in
luido los que nos serán de utilidad para
los objetivos del presente.
Operadores aritméti
os
Los operadores aritméti
os apli
ables a los tipos de datos numéri
os en
Python son los mismos que se han dado en la subse
ión 2.1.3 de este texto,
más el operador operador poten
ia (**)
on su signi
ado usual. El operador
módulo es apli
able sólo a los tipos de datos enteros.
**: Mayor pre
eden
ia que los demás. Este opreador aso
ia de dere
ha a
izquierda. Es de
ir, 3**4**5 representa 3( 45 ) y no (34 )5 .
A pesar de
ono
er las pre
eden
ias, para evitar ambigüedades y dar mejor
legibilidad a los programas se re
omienda ha
er expí
ito el orden en que deben
ha
erse las opera
iones, mediante el uso de paréntesis. Un pro
eso
urioso se
da
uando dividimos dos números enteros en Python. Considere la asigna
ión:
x=1/2
El resultado que esperaríamos es que x=0.5, sin embargo, si esta instru
ión
apara
iera en un programa en Python, el valor alma
enado en la variable x
sería 0. Esto porque en este lenguaje al operar dos enteros se obtiene de nuevo
un entero. El valor devuelto de un
o
iente de dos números enteros es igual a
la parte entera del resultado (
omo otante) de di
ho
o
iente. Para obtener
el resultado
on de
imales, es ne
esario que al menos uno de los operandos sea
un número otante. Por ejemplo:
x=1.0/2
En general, en este lenguaje de programa
ión, si se efe
tua alguna opera
ión
aritméti
a en la que los operandos son de tipos distintos, el tipo de dato del
resultado será el tipo más general de los dos operandos. Los tipos numéri
os,
de más general a menos general se muestran enseguida:
Complejo
Flotante
Entero
Operadores lógi
os
En la se
ión 2.1.3 hemos hablado ya de los operadores:
igual que: ==
diferente que: ! =
Respe
to a estos operadores solo resta men
ionar todos tienen la misma
pre
eden
ia. No hay una manera de aso
iarse por omisión, ya que éstos operadores
son binarios. ¾Qué signi
ado tendría, en el sentido usual, 3<4<=5?. Si se
aso
iara de izquierda a dere
ha se
ompararía primero 3<4, que resulta verdadero.
La siguiente
ompara
ión sería True<5 lo
ual no tiene ningún signi
ado.
Sin embargo, Python si permite ente tipo de
ompara
iones, devolviendo el
resultado de la
ompara
ión:
Salida de datos
En algunos de los programas previos hemos mostrado datos a través de la
pantalla utilizando la fun
ión predenida print.
# oding=iso-8859-1
También es posible imprimir
ualquiera de los otros tipos bási
os dire
tamente,
es de
ir, sin ne
esidad de
onvertirlos a tipo str. Por ejemplo:
x=12
y=0.02
w=3+2j
b=True
print x
print y
3.3. PHYTON 207
print w
print b
Además, la fun
ión print nos permite imprimir más de un dato (in
luso
de diferentes tipos). Para esto solamente tenemos que separar
on
omas los
datos que queremos imprimir,
omo en el siguiente ejemplo:
x=10
print el área de la figura es, x, unidades
de lo que se obtiene:
También ya habrá notado el le
tor que
ada vez que llamamos a la fun
ión
print, sus argumentos se imprimen en una nueva línea. Si queremos que no se
reali
e este
ambio de línea, debemos terminar la instru
ión print anterior
on
oma. Por ejemplo:
x=10
print el area de la figura es,
print x,
print unidades
Entrada de datos
Para obtener datos desde el te
lado vamos a emplear la fun
ión predenida:
raw_input(<argumento>)
Si deseamos que el valor alma
enado sea de otro tipo, podemos utilizar
3.3. PHYTON 209
oat(<argumento>)
Si <argumento> puede ser de tipo int, simplemente
onvierte este entero
a su equivalente en otante. También está permitido que el parámetro
sea de tipo str, en
uyo
aso la
adena se
onvierte al número de punto
otante que esta represente. Si la
adena no representa un otante, el
intérprete nos mandará un mensaje de error a través de la
onsola. Así
print float(13)
print float(12.35)+1
resulta en:
13.0
13.35
print float(1.2e5)
da omo resultado
120000.0
int(<argumento>)
<argumento> puede ser de tipo float o str. En el primer
aso, la
fun
ión retorna la parte entera del argumento. En el segundo
aso, se
retorna el entero que representa la
adena, en
aso de di
ha
adena
represente efe
tivamente un número entero. Ejemplos:
print int(3.14)
print int(3)
str(<argumento>)
Re
ibe
omo <argumento> un número y devuelve a este mismo pero
omo una
adena. Si ha
emos
x = str(2)
y = str(54.02)
se tendrá que:
x = 2
y = 54.02.
Así, podemos obtener desde te
lado datos de tipo str, es de
ir,
adenas y
posteriormente
onvertirlas a enteros o otantes, en
aso de que sea posible.
# oding=iso-8859-1
Además, toda fun
ión debe estar denida antes de llamarla a eje
u
ión
por primera vez, pues de no ha
erlo así, el intérprete de Python nos mandará
un mensaje de erros di
iendonos que la fun
ión a la que intentamos llamar, no
ha sido denida aún.
Si la fun
ión regresa algún dato, debe gurar entre las instru
iones del
uerpo de la fun
ión la proposi
ión:
return <exp>
def obtieneCuadrado(x):
return x**2
Esta es una fun
ión
uyo argumento debe ser un número (entero, otante
o
omplejo). Para esta fun
ión, si el argumento es entero, el valor regresado
será también entero. Si se da un argumento de tipo otante, el valor retornado
será tambien de tipo otante. Una situa
ión análoga se da si el parámetro
dado a la fun
ión obtieneCuadrado () es de tipo
omplejo. Para veri
ar
esta arma
ión, eje
ute el siguiente programa:
212 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Programa 3.3.2.
def obtieneCuadrado(w):
return w**2
print type(obtieneCuadrado(2))
print type(obtieneCuadrado(2.0))
print type(obtieneCuadrado(2+0j))
Podemos también denir una fun
ión similar a la del programa 3.3.2 en la
que no se re
ibe argumento alguno y se obtiene un número desde el te
lado
para después obtener su
uadrado:
Programa 3.3.3.
#
oding=iso-8859-1
def obtieneCuadrado():
w = int(raw_input(Es
riba un número))
return w**2
print obtieneCuadrado()
Observe que este último programa obtiene números enteros (en
aso de ser
posible), así que si queremos elevar al
uadrado un número de tipo float
o
omplex, sería ne
esario denir otros métodos, o utilizar alguna de las
senten
ias de
ontrol
ondi
ionales que se presentarán en el apartado 3.3.8.
Módulos
Cuando los programas son muy extensos, podemos es
ribir fragmentos de
ódigo en diferentes ar
hivos funte de Python (
on extensión .py) a los que
se
ono
en
omo módulos. En un programa, podemos utilizar las fun
iones
denidas en otros módulos, pero para ello es ne
esario indi
arle al intérprete de
Python que in
luya a di
ho módulo. Esto se ha
e muy fá
il: si el módulo que
queremos importar es <nombreDelMódulo>.py, preferentemente en la parte
superior del programa al que deseamos añadirlo debemos es
ribir la instru
ión:
import <nombreDelMódulo>
Programa 3.3.4.
#
oding=iso-8859-1
<nombreDelModúlo>.<nombreDeFun ion>
previa importa
ión del módulo, pues si por ejemplo, se llamara a eje
u
ión
la fun
ión antes de importar el módulo fun
ión1 se noti
aría un mensaje de
error, indi
ando que la fun
ión no ha sido denida aún.
Programa 3.3.5.
#
oding=iso-8859-1
def obtieneCuadrado():
w = int(raw_input(Es
riba un número))
return w**2
if __name__==__main__:
# Estas instru
iones se eje
utan solo si se
# está eje
utando este módulo
print obtieneCuadrado()
if __name__==__main__:
son las úni
as que no se eje
utan al importar este módulo ( ar
hivo
on
extensión .py en el que se guardó el programa 3.3.5). Todo el
ódigo que
se en
uentre fuera del bloque de instru
iones de esta senten
ia o fuera de las
deni
iones de las fun
iones (si es que las hay), será eje
utado al importar
di
ho módulo. Pruebe implementando el módulo 3.3.4 junto
on el programa
3.3.5 y eje
utando este último.
if __name__==__main__:
if __name__==__main__:
# Instru
iones prin
ipales del programa
<instru
iones>
Cabe men
ionar que existen alguno módulos predenidos, en los
uales
se denen algunas fun
iones que podemos emplear al importar el módulo que
la
ontenga. Algunos módulos de uso
omún son:
math: posee las fun
iones trigonométri
as, exponen
ial, logaritmo, raiz
uadrada, redondeos, et
., así
omo algunos valores
onstantes
omo un
valor aproximado de π o e por men
ionar algunos.
syst:
ontiene fun
iones que permiten a
esar al sistema operativo, así
omo
onstantes que dependen de la
omputadora.
Senten
ia if
En Python el equivalente a la senten
ia SI, es la instru
ión if, y la de
lara
ión
se ha
e de la siguiente manera:
# oding=iso-8859-1
if __name__==__main__:
a=int(raw_input(Introduz
a un número diferente de
ero\n))
if a!=0 :
b=1.0/a
print1/ + str(a) + = + str(b)
if a==0:
print El número introdu
ido no es valido
print Gra
ias por utilizar este programa
Programa 3.3.7.
#
oding=iso-8859-1
if __name__==__main__:
a=int(raw_input(Introduz
a un número diferente de
ero\n))
if a!=0 :
b=1.0/a
print1/ + str(a) + = + str(b)
if a==0:
print El número introdu
ido no es valido
print Gra
ias por utilizar este programa
Aunque éste es muy pare
ido al programa 3.3.6 tendrá diferentes resultados.
Observe que la úni
a diferen
ia de estos dos programas es en la línea 7. En el
primero de estos dos programas la séptima línea no está sangrada, por lo que
ésta no forma parte del bloque de instru
iones else, y se eje
utará aunque
no se
umpla el else. Por el
ontrario, en el segundo programa, al poner
sangría a esta línea estamos indi
ando al intérprete de Python que la séptina
línea forma parte de las instru
iones que
onforman al else y, por lo tanto,
esta instru
ión sólo se eje
utará si se
umple el else y no en
aso
ontrario.
Así, esta simple sangría ha
e que el ujo de los dos programas sea distinto.
Por eso, debemos tener sumo
uidado al utilizar las sangrías, para es
ribir
ade
uadamente lo que en realidad deseemos expresear.
Senten
ia if-else
La senten
ia
ondi
ional SI-DOM tiene
omo equivalente en Python a la
senten
ia if-else. La forma general de de
lararla es:
218 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
Al igual que para la senten
ia if, el
uerpo del else debe es
ribirse
on
sus debido sangrado.
# oding=iso-8859-1
if __name__==__main__:
a=int(raw_input(Introduz
a un número diferente de
ero\n))
if a!=0 :
b=1.0/a
print 1/ + str(a) + = + str(b)
else:
print El número introdu
ido no es valido
print Gra
ias por utilizar este programa
Note que este
ódigo no tiene grandes diferen
ias
on el programa 3.1.5.
Lo úni
o que se ha modi
ado es if(a!=0) por else. Sin embargo, el ujo
del programa presenta diferen
ias importantes, tal
omo ya se mostró en la
subse
ión 2.1.1., ya que se efe
túan menos veri
a
iones, lo que representa
menos opera
iones y menor tiempo de eje
u
ión (aunque en programas pequeños
no se note la diferen
ia).
#
oding=iso-8859-1
if __name__==__main__:
m=int(raw_input(Te
lee un valor númeri
o para la variable m\n))
n=int(raw_input(Te
lee un valor númeri
o para la variable n\n))
if m>n:
print m, es mayor que, n
else:
if m<n:
print m, es menor que, n
else:
print m, es igual a, n
print Fin del programa
Aquí observe que hay senten
ias
ondi
ionales anidadas: en el bloque de
instru
iones del primer if gura a su vez otra senten
ia if
on su respe
tivo
else. Es por eso que hay en este
ódigo senten
ias
on doble o hasta triple
sangrado,
on el n de determinar
uales serán las instru
iones que se eje
utarán
en
ada senten
ia
ondi
ional.
Senten
ia elif
Como ya se men
ionó antes, la senten
ia SI-DOM puede pensarse
omo un
aso parti
ular de otra de las senten
ias de
ontrol estudiadas en el
apítulo
de algoritmi
a: el SI-(DOM-SI). La sintáxis para el SI-(DOM-SI)) en Python
es elif, y la manera de de
lararse se presenta enseguida:
Al igual que if y if-else, los bloques de instru
iones a eje
utarse en
ada
uno de los
asos deben tener su respe
tiva sangría. El programa 3.1.7 puede
220 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
#
oding=iso-8859-1
if __name__==__main__:
letra=raw_input(Te
lee una letra (minús
ula) del abe
edario\n)
if letra==a:
print Es vo
al
elif letra==e:
print Es vo
al
elif letra==i:
print Es vo
al
elif letra==o:
print Es vo
al
elif letra==u:
print Es vo
al
else:
print Es
onsonante
3.3. PHYTON 221
Senten
ia while
while es una de las senten
ias de
ontrol iterativas que pueden emplearse en
Python, y es el equivalente a la senten
ia MIENTRAS que se ha presentado ya
en al
apítulo de algoritmi
a. Así pues, para utilizarla se ha
e una de
lara
ión
del siguiente tipo:
Programa 3.3.12. Implementa
ión del pseudo-
ódigo del ejemplo 2.2.6.
222 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
# oding=iso-8859-1
if __name__==__main__:
print Este programa imprime los enteros de 0 a n en,
print orden des
endente
n=int(raw_input(Te
lee un valor entero no negativo para n\n))
while n>=0:
print n
n-=1 #O bien n=n-1
print Fin del programa
Senten
ia for
La senten
ia de
ontrol iterativa for
orresponde a la instru
ión PARA
del
apítulo anterior. Re
ordemos que ésta se de
lara de la siguiente manera:
PARA (<opera
ión ini
ial>; <
ondi
ión>; <opera
ión de varia
ión>) {
<instru
iones>
}
<variable> no ne
esita haber sido ini
ializada, ya que tomará los valores
espe
i
ados en el <rango>. <rango>,
omo hemos di
ho,
onsiste de la
se
uen
ia de valores que tomará <variable> en
ada itera
ión del
i
lo. Más
pre
isamente, <rango> debe ser lo que en Python se
ono
e
omo lista, y es
equivalente a lo que se
ono
e
omo arreglo unidimensional o ve
tor en otros
lenguajes. La senten
ia for fun
iona de la siguiente manera: <variable> toma
ini
ialmente el primer valor alma
enado en la lista (equivale a la opera
ión de
ini
ializa
ión) y eje
uta el bloque <instru
iones>y, una vez nalizado esto, a
<variable> se le asigna el siguiente elemento del rango de valores (en algunos
asos para listas de números es posible espe
i
ar el in
remento o de
remento
entre los valores). El pro
eso
ontinúa hasta que <variable> ha tomado todos
y
ada uno de los valores de <rango>.
3.3. PHYTON 223
<nombre>=[<elemento0>,<elemento1>,. . . ,<elementon>℄
tu nombre es Luis
tu nombre es Moni
a
tu nombre es Edgar
tu nombre es Carlos
tu nombre es Andrea
w=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9℄.
range(10)
224 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
donde valor ini
ial será el primer elemento de la lista, y el segundo será el
primero más la <varia
ión> en
aso de ser ésta positiva (o menos la varia
ión
en
aso de ser ésta negativa), mientras que <valorFinal> es el máximo valor
posible que puede pertene
er a la lista. Puede emplearse range()
on dos
argumentos, en
uyo
aso se toman
omo <valor ini
ial> y <valorFinal+1> y
onsiderando que <varia
ión>=1. Finalmente,
uando utilizamos esta misma
fun
ión
on un sólo argumento, se
onsidéra que éste es <valorFinal+1>, y
por omisión será <valor ini
ial>=0. Es por ello que range(10) es la lista
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9℄
for i in range(1,10,2):
print i
# oding=iso-8859-1
if __name__==__main__:
x=1
print Este programa
al
ula el fa
torial de un número\n
n=int(raw_input(Introduz
a un valor entero no negativo\n))
if n>1:
for i in range(2,n+1):
x=i*x
print x
print El fa
torial de, n, es, x
else:
if (n==0 or n==1):
print El fa
torial de, n, es, x
else:
print El número introdu
ido debe ser no negativo
print Fin del programa
3.3.10. Arreglos
En Python, la estru
tura equivalente a los arreglos unidimensionales se les
ono
e
omo listas. Como y hemos di
ho en la al hablar de la senten
ia for.
Así pues, una lista es una se
uen
ia de elementos los
uales pueden ser enteros,
otantes,
omplejos,
adenas, booleanos o in
luso listas y no ne
esariamente
todos del mismo tipo. Una lista se de
lara de la siguiente manera:
<nombre>=[<elemento0>,<elemento1>,. . . ,<elementon>℄
#Lista va
ía:
a=[]
print len(a)
print len(b)
print len(
)
on los tres argumentos números enteros, y donde <valor ini
ial> es el elememto
que o
upará la posi
ión 0, <valorIni
ial>+<varia
ión> será el elemento en la
posi
ión 1, el elemento en la posi
ión 2 será igual al elemento en la posi
ión 1
más <varia
ión> y así su
esivamente, siempre y
uando no se rebase al número
<valorFinal>. Evidentemente, si <varia
ión> es positiva, <valorIni
ial> debe
ser menor (o igual) que <valorFinal> pues, en
aso
ontrario se obtendrá
una lista va
ía. De manera similar, si <varia
ión> es negativa, para obtener
una lista no va
ía debe ser <valorIni
ial> mayor (o igual) que <valorFinal>.
Ejemplos:
v1=range(-10,15,2)
v2=range(-10,15,-2)
v3=range(15,-10,-2)
v3=range(15,-10,2)
on lo que se obtendrá:
v1[10℄=0
print v1+v3
devuelve:
[-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 15, 13, 11, 9,
7, 5, 3, 1, -1, -3, -5, -7, -9]
print [1,2,3]*3
resulta en:
[1, 2, 3, 1, 2, 3, 1, 2, 3]
También es posible
rear listas (arreglos) en los que el usuario propor
ione
tanto la longitud del arreglo
omo
ada una de las entradas del mismo, tal
omo se obtiene
on el siguiente programa:
# oding=iso-8859-1
if __name__==__main__:
n=int(raw_input(Espe
ifique el tamaño de la lista\n))
#Ini
ializamos una lista
on 10 '
eros'
x=[0℄*n
#Leemos los elementos que
onformarán a la lista
for i in range(n):
print obteniendo el elemento, i
x[i℄=int(raw_input(Introduz
a un número\n))
for k in range(len(x)):
print x[k℄
print Fin del programa
append(<argumento>)
v=[-2, 44, 6, 8, 0]
print v
print len(v)
v.append(-1)
print v
print len(v)
Otro programa que también fun
iona para leer un arreglo desde el te
lado
es el siguiente:
# oding=iso-8859-1
if __name__==__main__:
#Creamos una lista va
ía
x=[℄
n=int(raw_input(Espe
ifique el tamaño de la lista\n))
#Leemos los elementos que
onformarán a la lista
for i in range(n):
print obteniendo el elemento, i
mero\n)))
x.append(int(raw_input(Introduz
a un n
#Imprimimos la lista
print x
print Fin del programa
Con ayuda de las listas podemos también trabajar
on matri
es, que son
listas de listas. Es de
ir, una matriz es una lista
uyos elementos son a su
vez listas. Pueden ini
ializarse ha
iendo explí
itos
ada uno de sus elementos,
por ejemplo:
Las listas que son elementos de la matriz deben tener la misma longitud o
tamaño, pues en
aso
ontrario no habremos denido una matriz, sino simplemente
una lista
on listas (de diferentes tamaños). La siguiente no es una matriz:
<nombreDeLaMatriz> [i][j]
230 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
mat [0][1]=0
mat [3][2]=1
mat [2][0]=-1
on lo que se obtiene:
También es posible leer una matriz
uyos elementos sean propor
ionados
por el usuario del programa. Para esto, primero vamos a
rear una matriz de
eros de manera automáti
a, del tamaño deseado, y posteriormente reemplazaremos
estos
eros
on los datos propor
ionados por el usuario. Primero veamos
omo
obtener una matriz de
eros (
on dimensiones dadas por el usuario):
Programa 3.3.16.
3.3. PHYTON 231
# oding=iso-8859-1
if __name__==__main__:
#Creamos una lista va
ía
n=int(raw_input(Espe
ifique el número de filas\n))
m=int(raw_input(Espe
ifique el número de
olumnas\n))
mat=[℄
for k in range(m):
v=[0℄*n
mat.append(v)
print mat
# oding=iso-8859-1
if __name__==__main__:
#Creamos una lista va
ía
n=int(raw_input(Espe
ifique el número de filas\n))
m=int(raw_input(Espe
ifique el número de
olumnas\n))
#Creamos una matriz de
eros
mat=[℄
for k in range(m):
v=[0℄*n
mat.append(v)
#Reemplazamos los
eros
on los valores dados por el usuario
for i in range(m):
for j in range(n):
print obteniendo , i, ,,j
mat[i℄[j℄=int(raw_input(De un número\n))
print mat
3.3.11. Ex
ep
iones
Existen varias situa
iones en las que un programa puede entrar en un estado
de error, por ejemplo, si en una instru
ión
omo:
232 CAPÍTULO 3. LENGUAJES DE PROGRAMACIÓN
el usuario del programa te
lea algún
ará
ter que no representa un número
entero (o otante), se produ
e un error, ya que no se puede ha
er la
onversión
a número entero. Otras situa
iones en las que se produ
en errores son intentar
dividir por
ero,
al
ular la raiz
uadrada de un número negativo, intentar
a
eder a un elemento fuera del rango de un arreglo, entre otros mu
hos.
Algunos de los errores pueden
apturarse y tratarse, esto es, el programador
puede indi
arle al programa que ha
er en
aso de que se produz
a un error. Para
esto vamos a utilizar el manejador de ex
ep
iones try-ex
ept. En general, se
utiliza de la siguiente manera
try:
<instru
iones>
ex
ept <tipoDeEx
ep
ión1>:
<instru
iones2>
ex
ept <tipoDeEx
ep
ión2>:
.
.
.ex
ept <tipoDeEx
ep
iónk>:
<instru
ionesk> finally:
<instru
ionesF>
Programa 3.3.18.
#
oding=iso-8859-1
if __name__==__main__:
#Creamos una lista va
ía
try:
n=int(raw_input(Espe
ifique el número de filas))
m=int(raw_input(Espe
ifique el número de
olumnas))
mat=[℄
for k in range(m):
v=[0℄*n
mat.append(v)
print mat
ex
ept:
print El
ará
ter te
leado no representa un número entero
finally:
print Fin del Programa
3.3. PHYTON 235
#
oding=iso-8859-1
if __name__==__main__:
#Creamos una lista va
ía
try:
n=int(raw_input(Espe
ifique el no mero de filas"))
m=int(raw_input(Espe
ifique el no mero de
olumnas"))
mat=[℄
for k in range(m):
v=[0℄*n
mat.append(v)
print mat
ex
ept ValueError:
print El
ará
ter te
leado no representa un número entero
finally:
print Fin del Programa
Programa 3.3.19.
#
oding=iso-8859-1
from math import sqrt
if __name__==__main__:
try:
a=float(raw_input(Es
riba un número positivo a))
b=float(raw_input(Es
riba un número positivo b))
=float(raw_input(Es
riba un número positivo
))
x=(sqrt(b**b-4*a*
))/(2*a)
ex
ept ValueError:
print El
ará
ter te
leado no representa un número
ex
ept ZeroDivisionError:
print a debe ser distinto de
ero
x=(sqrt(b**b-4*a* ))/(2*a)
es sus
eptible de otro error: que el argumento de la fun
ión sqrt() sea negativo.
Pero resulta que éste problema también entra dentro de la ex
ep
ión ValueError,
así que se eje
utarán las instru
iones del bloque ex
ept ValueError:
Programa 3.3.20.
#
oding=iso-8859-1
from math import sqrt
if __name__==__main__:
try:
a=float(raw_input(Es
riba un número positivo a))
b=float(raw_input(Es
riba un número positivo b))
=float(raw_input(Es
riba un número positivo
))
if b**b-4*a*
>=0:
x=(sqrt(b**b-4*a*
))/(2*a)
print x
else:
print .El dis
riminante es negativo"
ex
ept ValueError:
print El
ará
ter te
leado no representa un número
ex
ept ZeroDivisionError:
print a debe ser distinto de
ero
Bibliografía
237