Está en la página 1de 456

I

fntroduccin a fa
Programacin con

(Cdigo det Curso Cy320)


Versin 3.0

I
I
I

Sumario del Curso

;(c

BM lT Education Services
Worldwide Certified Material
f

Informacin de la Publicacin
Esta pubfcacin ha sido producida usando Microsoft Word 20OO y Microsoft powerpoint
2O00 para Windows.

Marcas Comerciales
IBM @ es una marca comercial registrada 'de tnternational Business Machines

Corporation.

Otras compaas, productos y nombres de servicios pueden ser marcas comerciales o


marcas de servicios de otros.

Edicin Junio 2005


La informacin contenida en este documento no ha sido sometida a ninguna prueba
formal de IBM y es distribuida bsicamente "como es" sin ninguna garnta ya sea
expresa o implcita. El uso de esta informacin o ia implementacin de cualquiera de
estas tcnicas es responsabifidad del comprador y depender de la habilidad de ste
para su evaluacin e integracin en el ambiente operacional del cliente. A pesar de que
cada tema ha sido revisado por IBM para su exactitud en una situacin especfica,'no
hay garanta de obtener el mismo resultado o uno similar a ste en otra situacin. Los
clientes que intenten adaptar estas tcnicas a sus propios ambientes lo hacen bajo su

propio riesgo.

Copyright International Business Machines Gorporation, 2005. All rights reserved.


Este documento no puede ser reproducido en su totalidad o en parte sin el previo
permiso escrito de lBM.

o
a
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
O

o
o

O ,i

or
o
o

o
o

o
o
o
o
o
o
oi
ol,
olr

uccin a la programacin con C

Nombre def Curso


lntroduccin a la programacin con C

Duracin
La duracin de este curso es de 74 horas.

Propsito
Ef propsito de- este curso es ayudar al estudiante a desanollar
habilidades para
programar con c
para este fin, e.ste cu.rso proporciona informacin
detallada acerca
de los diferentes elementos de c. El objetvo orifo
. brindarle una slida base de los
conceptos y fa programacin con c. El curso comienza
con una introduccin a los
conceptos bsicos de computacin,
el
concepto
de
algoritmos a travs de una
.desde
definicin de un programa hasta los de
lenguajes oe frogramacin y compiladores.

A travs del curso, el estudiante se familiariza conel


uso de importantes construcciones
de c, tales como fos diferentes tipos de la sentencia
if, la construccin switch, la
funcin s-canf, etc' Adems, aprende el uso de construcciones
iterativas para la
solucin de problemas y podr usar las construcciones
iterativas como la sentencia for
y la sentencia while. Tambin se introduce
el concepto de arreglos en c, y se aprende
a usar los diferentes tipos de aneglos para resolver problemas.
el curso, se aprende acerca de las estructuras y uniones medida que progresa
en C. Se introducen los
conceptos de funciones, recursin, punteros, mnejo
de
archivos,
manejo de los
argumentos de lnea de comandos, as como se
estdia acerca oe ios tipo, de dato
enumerados y tambin como usar rnacros.
Junto con las sesiones de teora, se tienen sesiones
de laboratorios, donde se podr
practicar todo lo 9!e se aprende en el saln
oe ctase y aRnar las habilidades en el uso
de C.

Prerrequisitos
Para poder entender los conceptos tratados en
este curso, se debe tener conocimiento
acerca de sistemas operativos, y conocer acerca
de un sistema operativo como Linux
es esenciar para rograr un mejor aprovechamiento
der curso.

oll
oll
-fr
Ii
I,
-.ta

dlutl

.f-

I
,I

Copyright tBM Corp. 2005


Los materiales del crrso no puedbn ser reprcducidos
en pafte o en su totaridad sin erprevio permiso
escrito o" rgla.

Introduccin a la Programacin con

ei Curso

Objetivos del Curso


Al final de este curso Ud. ser capaz de:

a
o
a
a

o
a

o
o
O

Obtener una visin general de los conceptos bsicos de las computadoras,


ta :s
como un programa, lenguajes de programacin, compiladores, afgoritmos,
etc
Usar los diferentes tipos de sentencias i f en el esfrerzo de resolver probJernas
Emplear la construccin swirch para esribir programas c.
Escribir programas usando las funciones printf y scanf de c.
Resolver problemas usando el concepto de arreglos.
Emplear el concepto de estructuras en la solucin de problemas.
Definir el tipo de dato enumeracin y usarlo en el esfuerzo de resolver
problemas.
Definir recursin en C"
Definir el concepto de una unin y us.arlo para resolver problemas
en c.
Trabajar con directivas del preprocesador en C.
Trabajar con el concepto del manejo de archivos en C.
Manipular argumentos la lnea de comandos en los programas c.

Agenda
Cada unidad de este curso es de 2 horas de duracin.

Copyright tBM Corp. 2005

Los materiales delcurso no pueden ser reproducidos


en parte o en su totalidad sin el previo permiso escrito de

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o

o
o
o
o
o

d (o
o
o
o
o
o
o
o
o

o
O

o
o
o
o
o
o

Sumario del Curso

lntroduccin a la

Contenido del Curso


Volumen
Unidad

l: Fundamentos de C

l: Introduccin

a ta programacin

Objetivos de Aprendizaje
1. Introduccin

2. Qu son Algoritmos?
3. Tipos de Algoritmos
4. Organizacin Elemental de la Computadora
5. eu es un programa de Computadora?
6. por qu se Necesita un Lenguaje de programacin?
7. Compiladores
Resumen

Unidad 1. Examen deAutoevaluacin


Respuestas a ra unidad 1: Examen de Autoevaruacin

unidad 2: Laboratorio de rntroduccin a ra programacin


Objetivos de Aprendizaje
Eje16i6ie5 de Laboratorio

Unidad 3: Programacin en C _ Los primeros pasos


Obleiivos de Aprendizaje
i inti-oduccln
2 La Evolucin de C
3 Pnmeros pasos para Escribr un programa en C
lr,1s Acerca de Declaraciones
5. Ms Acerca de los Operadores
6 Compilacin de programas hechos en lenguaje C
Resumen
Unidad 3: Examen de Autoevaluacin
Respuestas a ra unidad 3: Examen de Autoevaruacin

Unidad 4: Construir Fundamentos Slidos en C


Objetivos de Aprendizaje
1. lntroduccin
2. Aceptar Entradas del Usuario
3. ldentificadores de Variables
4. Palabras Claves en C
5. Tipos de Datos Bsicos en C
6. Constantes en C
7. Operadores Aritmticos

,o

@ Copyright tBM Corp. 2005


Los materiales del curso no puedbn iLr reprocucidos
en parte o en su totaridad sin ef .previo permiso escritode
rBM.

macin con C

*rr::e_g{re
8. Operadores Compuestos de Asignacin
9. Conversin Explcita de Tipos
10. Conversin lmplcita de Tipos
Resumen

Unidad 4: Examen de Autoevaluacin


Respuestas a ra unidad 4: Examen de Autoevaruacin

Unidad S: Laboratorio de programacin en C


Objetivos de Aprendizaje
Ejercicios de Laboratorio
Ejercicio Opcional

Volumen 2: Estructuras de Controt en


Unidad l: Estructuras de Controt de Decisin

Objetivos de Aprendizaje
1. Introduccin

2. Construccin if Simple
3. La Construccin if_et-se
4. La Construccin if Anidado
5. Expresiones y Operadores Lgicos
6. Operador Temario

y Relacionales

Las Diferentes Formas de Sentencias i


8. La Estructura switch ... case
Resumen
Unidad 1: Examen de Autoevaluacin
Respuestas a ra unidad 1: Examen de Autoevaruacin
7

unidad 2: Laboratorio de Estructuras de control de


Decisin
Objetivos de Aprendizaje
Ejercicios de Laboratorio

Unidad 3: Construcciones lterativas


Objetivos de Aprendizaje
1. lntroduccin

2.

Construccin lterativa white


Resumen
Unidad 3: Examen de Autoevaluacin
Respuestas a a unidad 3: Examen de Autoevaruacin

Unidad 4: Laboratorio Construcciones fterativas


Objetivos de Aprendizaje
Ejercicos de Laboratorio

@ Copyright tBM Corp. 2005


Los materiafes del curso no pueden ser reproducidos
en parte o en su totalidad sin el previo permiso escrito de lBM.

o
a

:f
o
o
O

o
o
a
o
o
o
o
o

o
o
o
o
o

:(o
!\ rv

o
o
o
o
O

o
o
o
o
o
O

o
o
o
o!

Sumario delCurso

Introduccin a la

Unidad S: Ms Construccones lterativas


Objetivos de Aprendizaje
1. Introduccin

2'

Resolucin de Problemas Usando Otras Construcciones


lteratrvas
Ms acerca de la Sentencia for
Safir de un Bucle prematuramente

3.
4.
5. Uso de la Funcin ncorporada ptw 1
6. La palabra Reservada continue
7. La Estructura de la Sentencia do_white
f

Resumen
Unidad 5: Examen de Autoevaluacin
Respuestas a ra undad 5: Examen de Autoevaruacin

unidad 6: Laboratorio Ms construcciones tterativas


Objetivos de Aprendizaje
Ejercicios de Laboratorio

volumen 3: Tipos de Datos Estructurados en c


Unidad l: Programacin con Arregfos
Objetivos de Aprendizaje
1. Introduccin
2. Declarar un Arreglo en C
3. Inicializar un Arreglo
4. Desarroilar y programar Argoritmos con Anegros
5. Cadenas de Caracteres en C
Resumen
Unidad 1: Examen de Autoevaluacin
Respuestas a ra unidad 1. Examen de Autoevaruacin

Unidad 2: Arreglos Multidimensionales


Objetivos de Aprendizale
1. Introduccin
2. Resorver probiemas con Anegros Bidimensionares
Resumen
Unidad 2: Examen de Autoevaluacin
Respuestas a ra unidad 2: Examen de Autoevatuacin

unidad 3: Laboratorio de programacin con Arregtos


Objetivos de Aprendizaje
Ejercicios de Laboratorio

l\.f
x'E

a
-

amacin con

@ Copyright tBM Corp.2005


Los materiales dglarrso no puedbn ser reproducidos
en parte o en su totaridad sin el previo permiso escrito
oe rgir.

lntroduccin a la
Sumario del Curso

Unidad 4: Estructuras
Objetivos de Aprendizaje
1. f ntroduccin
2. Definicin y Uso de Estructuras
3' Tipos de Datos Definidos por ef usuario
4. Uniones
Unidad 4: Examen de Autoevaluacin
Respuestas a ta Unidad 4: Examen
de Autoevaruacin
Unidad S: Laboratorio de Estructuras

Objetivos de Aprendizaje
Ejercicios de Laboratorio

Vof ume
Unidad

l:

n 4: Funciones en C
Funciones

Objetivos de Aprendizaje
1. Introduccin
2. programar Funciones

3' Definicin y Uso de Funciones


en
4. Clases de Almacenamiento

ra sorucn

de probremas

S. Archivos de Encabezamiento
(header)

Resumen
Unidad 1: Examen de Autoevaluacin
spuestas a la Unidad 1:Examen
de Autoevafuacin

Unidad 2: Laboratorio de Funciones


Objetivos de Aprendizaje
Ejercicios de Laboratorio

Unidad 3: Recursin
Objetivos de Aprendizaje
1. lntroduccin
2. Escribir Funciones Recursivas
3. Recursin vs. lteracin
Resumen
Unidad 3: Examen de Autoevafuacin
Respuestas a la Unidad 3: Examen
de Autoevaluacin

Unidad 4: Laboratorio de Recursin


Objetivos de Aprendizaje
Ejercicios de Laboratorio

@ Copyright tBM Corp. 2O0S


Los materiales del curso no pueOen
ser reproducidos
en parte o en su totardad sin
erjrvio p"-*'ro escrito de rBM.

I
a
o

Sumario delCurso

o
o
o
o

Volumen 5: punteros en

Objetivos de Aprendizaje
Introduccin
2. Fundamentos de punteros .
3. uso de punteros para pasar Argumentos a ras Funciones
Resumen
Unidad 1:Examen de Autoevaluacin
Respuestas a ra unidad 1: Examen de Autoevaruacin

l.

o
o
o
o
o
a
o
o

Unidad 2: Laboratorio de punteros


Objetivos de Aprendizaje
Ejercicios de Laboratorio

Unidad 3: Punteros Avanzados

o
o
o
o
o
o
o
a
o
o
a
o
o
o

Unidad 3:Examen de Autoevaluacin


Respuestas a ra unidad 3:Examen de Autoevaruacin

unidad 4: Laboratorio de punteros Avanzados


Objetivos de Aprendizaje
Ejercicios de Laboratono

Vof

oi

d
q
e

ot-

I'

umen O: Tpicos Avanzados en C

Unidad 1: Manejo de Archivos en C

Or

-'tr
.T
T'

5. Puntero a Estructura
6. Puntero a una Funcin
Resumen

t-

Objetivos de Aprendizaje
1. Introduccin
2. Aritmtica de Direcciones
3. Puntero a puntero
4. Arreglo de punteros

/0

^tE

Unidad 1: Punteros

I
I

dx
.-l !

fntroduccin a la programacin con C

Objetivos de Aprendizaje
1. Introduccin.
2. Uso de Archivos de Datos en C
3. Archivos de Texto y Binarios
4. Manipular Archivos de Datos sin Formatos
Resumen
Unidad 1: Examen de Autoevaluacin

@ Copyright tBM Corp. 2OOs


Los materiales del curso no pueObnr reproducidos
en parte o en su totafidad sin e[ previo penniso
escrft J" rafrr.

o dei

Respuestas a fa unidad 1: Examen


de Autoevafuacin

Unidad 2: Laboratorio de Manejo de


Archivos en G
Objetivos de Aprendizaje
Ejercicios de Laboratorio

Unidad 3: Garacterscas Adicionafes


en G
Objetivos de Aprendizaje
1. Introduccin
2. Enumeraciones
3. Argumentos de ra Lnea de comandos para
ra funcin main0
4. Directivas def preprocesador

5. Operadores

de Manejo de Bits

Resumen
Unidad 3: Examen de Autoevaluacin
Respuestas a ra unidad 3: Examen
de Autoevaruacin

unidad 4: Laboratorio de caractersticas


Adiciones de c
Objetivos de Aprendizaje
Ejercicios de Laboratorio

@ Copyright tBM Corp. 2005


Los materiales deiulso no puedn ser.reproducdos
en parte o en su totaridad sin previo permiso
er

"r"rito-o-JrgM.

Curso

oi
a
a

Sumario del Curso

o0
o

(Nota: La duracin de cada Unidad


es de 2 horas)

ol

Volumen

ol
ol

Unidad

ol
ol

o1

ol

o1

ol
oj

ol
ol

o/
./

o/

:i(
rl 0
ol
oi
ol

o
.l
o
o
q
?

?
?
?
?
?
_^
K(lL
I,U

l:

l: Fundamentos de C

Introduccin a la programacin

Esta unidad proporciona una introduccl


q computacin a travs de conceptos tales
como algoritmos, organizacin elemental ?
de ta corputadora y qu es un programa
de
Tambin se discute acerca de tos renguaes
oe'piogr;acin y et rot der

::ilffii"?:'

unidad 2: Laboratorio de Introduccin a ra programacion


Esta unidad est diseada para reforzar
la idea de argoritmos presentada en la unidad
1 fntroduccin a la compuiacin. Los ejercicio.-J"
raboratorio presentados requieren
que se escriban argoritmos simpres
pra iesorv"ipioor",'as especficos.

unidad 3: programacin en c

- Los primeros

pasos

En la primera parte, se discute la evolucin


del lengule de programacin c y el mtodo
para escribir a partir de algoritmos programas
en c. r-os erment.'o."os de un
programa en C tambin se establece.

Unidad 4: Construir Fundamentos Slidos


en C
Algunos de los elementos bsicos que
van a construir un fundamento sfido en
c se
discuten tales co.mo. variables, expresiones
artmticas, sentencias de asignacin y
tipos de datos primitivos. tambien, se da
una introduccin de cmo aceptar entradas
del usuario a travs de la funcin scanf.
Unidad S: Laboratorio de programacin
en C
Esta unidad trata acerca de la solucin
de problemas a travs programas bsicos
en c
los conceptos aprendidos en las unidades
anteriormente,
especiatmente
ta
?',f:li:

Vof ume n

2: Estructuras de Controf en C

Unidad 1: Estructuras de Control de Decisin


En esta unidad' el concepto fundamental que
se cubre es la necesidad de verificar
condiciones v ra toma de decisin
basada u; ;;ndiJ;;;
i#i"s;ffi," bremas. Las
facilidades de c que se estudian
aqu prr,
imptementacin
que involucran el control de decisin
"yria'ia if, sentencias de algoritmos
ion l"'."nt"n""

operadores relacionales, operadores


fgicor y
construccin switch de C.

if

"*prron"r

anidadas,
relacionales. Se introduce la

unidad 2: Laboratorio de Estructuras de


contror de Decisin

5ffiti::':o

se proveen ejercicios que invotucran estructuras


bsicas de controt de

:'\-

It
?
t)

ramacin con C

Descripcin de Unidades

Or

Introduccin a la

@ Copyright fBM Com. 2005


Los materiates dglixrso no pueon ser
reproctucidos
en parte o en su totatidad sin er prwio permso
escrtt" lgM.

Introduccin a la

macin con C

Sumano del Curso

Unidad 3: Construccones tterativas

Ef tema centraf de esta unidad


es el rol de la iteracin en la solucin
de problemas y
arsoritmos.

::*,,"ffi""#?'i::J"J-* !n

se oiscute v-r.-a-,"n

".,"

unidad

unidad 4: Laboratorio de construccones


rterativas
se proporciona problemas simples. que
C que necesitan iteraciones uJanOo requieren la implementacin de programas
la construccn
whit_e, esto para
conceptos

ta
ra

en

reforzar los

los conceptos aprendidos en


h U;;3.
Unidad S: Ms Construcciones fterativas

El tema

central de' esta unidad


reso]ver problemas con estructuras
anidadas' Se ifustran la sentencia ^es
iterativas
for de c y ras sentencias break y continue.
discute y usa la construccin
se
do_whi1e.

unidad 6: Laboratorio de Ms construcciones


fterativas

Ef nfasis de esta unidad es


en la impfementacin de.programas
compretos en
resolver probfemas especficos
usando las estiuciuras terativas
de la unidad 5.

para

volumen 3: Tipos de Datos Estructurados


en c
Unidad l: programar con Arregtos
se discute en esta unidad la tcnica
de desanolrar arg_oritmos
Er nfasis r constituve ra programacinque emprean
en c con
;1,'ilil:,il3l3i.

arregros
arresros

Unidad 2: Arreglos Muttidimensionales


se ilustra el uso de arreglos multidim_ensionales

varios ejempfos. En los elemplos


r

,""n

Unidad 3: Laboratorio de Arreglos

m;ggJ:t:#:

lT,$:?:1;;;]e

(arreglos bidimensionales) a
travs de
problemas con matrices.

nrooramacin con arresros en

a travs de un

Unidad 4: Estructuras
Esta unidad discute el uso de las
estructuras y uniones en c. se presentan
para decrarar estructuras y
ros mtodos
a usarros para resofver problemas
especficos.

Unidad 5: Laboratorio de Estructuras


Basado en las bases. conceptuafes
desanolfadas

ejercicios de faboratorio que

ieil;;;";

en la unidad 4, esta unidad provee


escribir programas con estructuras.

@ Copyright tBM Corp. 2005


Los materiates detcl9 n9 pr"On
en parte o en su totalidad sin el previo "ur reproducidos
f"rmiso escrito de lBM.

10

I
o
o
o

Volume n 4: Funciones

o1

o
o
o
o

a'a

o
o

en C

Unidad l: Funciones
Esta unidad- introduce la naturale-za
y ef uso de ras funciones en
probfemas' se discuten
fa sorucin de
arjus.runc'ioner-in"oipor"das
ejemplos se ilustra cmo
de
.-A
travs
de varios
d;fi;;r runcones o"r']r""f"ro_ y a
usarros en ra sorucin de

o
o
o
o
o
o
o
o
o
o
o
o
o

ogramacn con C

i#:5#::rJf,:'"#,#",i::,;!:*"::lf m;if

p""nio,o"-c-i",","o,"o-I"n",.

Unidad 2: Laboratorio de Funciones

,t;iT:'i:"t[J;,i"?T:1['J;rlaboratorio

que requieran escribir


runciones especricas

Unidad 3: Recursin
Esta unidad discute fa naturale
za general de la recursin y su
rof en la solucin de
r"nen,-.u'ru,t,."
5i?l'33?;"1,.?t3:|,il;n"a;f:[i:3'5f"T'"XJi,,"o.
er mtoJo

Unidad 4: Laboratorio de Recursin


Esta unidad provee ejercicios
j.:^_,1?::qtorios que requieren escribir funciones
recursivas en c y usarras para
rsorver probremas
simpres.

Volumen S: punteros en
Unidad l: punteros

Esta unidad introdu.ce los


conceptos fundamentares detrs
de ta natura reza yer uso de
fos punteros en c. frustra
ros puntero, un J-p""o
de argumentos a funciones
especiarmente pasar arregfos
a funciones como una referencia.

;-;;'d;

o
o

Unidad 2: Laboratorio de punteros

o
o
o

A travs der uso d,ufg: conceptos


tT,g:r:"jares de punteros
u,l,
aprendidos en ra Unidad
u, oo o d e pa s a r rs
I :H :'J'
u m e nto s a
ff,J*J
ff"

o
o
o
o
o
o
o
o
o
o

"

"

:#:',

ff

trSIll j:: *:,;

Unidad 3: punteros Avanzados


se discuten afgunas de fas facilidades
avanzadas der uso de ros punteros
operacione. d"
como
o"nn,
usar
arregro de punteros, puntero
v
punteros
?:l!eros,
a estructuras y paso de fucione.

.orJJffientos

a punteros,
a otras funciones.

Unidad 4: Laboratorio de punteros


Avanzados
A travs del uso de
fundamentafes de fo-s punteros
-l"oootorios
.fos conceptos
unidad 3' fos elercicios
aprendidos en ra
o"
p"-"i- refo.zar ,l
argumentos a funciones
de pasar

"l

como punters y usarros dentro


de tas mismas.

fll

o
o

@ Copyright tBM Corp.2005


Los materales def a1s9 no p*Onr,reproducidos
en parte o en su totafidad sin
eirevlo-imiso escrito de-rBM

11

Introduccin a fa

ramacin con C

Sumario dei Curso

umen 6: Tpicos Avanzados


en
Unidad l: Manejo de Archivos
en C
Vof

Esta unidad detalfa los mtodos para


usar ros dispositivos de atmacenamiento
J*J" io"^p.girslramoen se oscut"
,tooo para
t ;;";; en c. eJpm""rente. se discuten fos
"l archivos de

secundario para leer y escribir


definir archivos oe dtos

i?:"":,;^i',Tilffi ll5J,:?il?gff

Unidad 2: Laboratorio de Manejo"?:y"#;;;''lio,",i",o";;;;iil.queayudan


de Archvos en C
En esta unidad se proporciona
unos pocos probremas reracionados
archivos de datos para reforzar
ar manejo de
la bse conceptuaf aprendida
en ra unidad 1.
Unidad 3: Caractersticas Adicionales
de C
Esta unidad es una cofeccin de
tpicos como el tipo de dato
manejar argumentos de fa tnea
enumerado, cmo
dL
comandos y el uso de las macros.
adems unas pocas directivas
son dscuten
l pro.esa.dor y sus usos.
unidad 4: Laboratorio de caractersticas
Adicionafes de c
Esta- unidad provee un solo problema
que imprica er uso de numerosos
recnrcas y facifidades de c aprendidos
conceptos,
para obtener un programa que
trabaia.

?1

I
I

@ Copyright IBM Corp. 2005


Los materiales dei riro no pu"o5n-"L,
reproducidos
en parte o en su totaldad sin
er prevop*i"o escrito de

rBM.

o
o
o
o

.'a

ntroduccin a la
Programacin en C
f

(Cdigo del Curso: Cy32O)


Versin 3.0)

ol
Ol
o

ol

Gua del Estudiante

o
o

oj
o

oj
oi
oi
o1

oi
o1

oi

),1 r'>.

Fundamentos de C

:'((E
ri '"o
o
o
o

o
.{

a
q

BM fT Education Services
Worldwide Certified Material
f

Informacin de la publicacin

rt8i!::j",ff;?:#:

producida utilizando Microsoft word


2000 y Microsoft powerpoini

Marcas Registradas
IBM @ es una marca registrada de lnternationaf
Business Mactrines corporation.
otras compaas y nombres de productos y servicios
pueden ser marcas regrstradas
marcas de servicio de otros.

Marcas comerciares de otras compaas


son mostradas a contnuacin
Windows
Microsoft Corporation
Red Hat Linux

Red Hat

Edicin Junio 2005

no ha s,:: s:^.::i:a
:ijlt:T":jg? :"T"nid:.,"n este documento
,;;-;t';" ;;-; -.." -. "^' : :'-'i a
Et uso de esta infornracin o la i_.
-==_u_.=;:^::f::?tcnicas
?.implcita.
= ,-__
estas
es responsabiridad der cornprador y oeoe.os:a
r5
para su evatuacin e integracin en
cada tema ha sido revisado por rBM"ipara
"ro,!'" "oirl-.;r;;:=.: ::-:,==

su exactrtud en una S.,,2^.

nra^i^
-:^^-^
propo
riesgo.

;.,;;;i;1.

copyright International Business Machines corporation,


2005. All rights reserved.
ser reproducido en su totaridad o en parte
sin er previo
;:n*t":ffX.".:iJ,il:de
fnstrucciones especiales para la impresin
de este curso.
No deben removerse.las pginas en bla.nco que
puedan aparecer en el final de cada
unidad y entre dos unidades.-Estas han
sido insertdas intencionalmente.

o
o
o
o
o
o
o
o
o
o
o
o
o

Gua def Estudiante


lntroduccin a la programacin

Unidad

Introduccin a la programacin

1.
2. eu son Algoritmos?
3. Tipos de Algoritmos
4. Organizacin Elementaf de la Computadora
5. eu es un programa de Computadora?
6 por qu se Necesita un Lenguaje de programacin?
7. Compifadores

2
2

4
5
x

Resumen
Unidad 1: Examen de Autoevafuacin
Respuestas a ra unidad l:
Examen de Autoevaruacin
unidad 2: Laboratorio de Introduccin
a fa programacin
Objetivos de Aprendizaje
Ejercicios de Laboratorio
Unidad 3: programacin en
C Los primeros pasos

oi
oi

Contenido

Objetivos de Aprendizaje
Introduccin

o
o
o
o
o
o
o

o
ot
o
o'
ol

i:

.lf :

10
11

IJ

l5
15

16

17

Objetivos de Aprendizaje
lntroduccin
La Evofucin de C
prmeros pasos
para

1.
2.
3.
programa en
Escribr
C
4. Ms Acerca de Declaraciones un
5. Ms Acerca de fos Operadores
6. Compifacin de programas Hechos en

1
IT

.1

18
18

24

Lenguaje C

Resumen
Unidad 3: Examen de Autoevatuacin
Respuestas a fa Unidad
3: Examen de Autoevafuacin
Unidad 4: Construir Fundamentos
Slidos en C
Objetivos de Aprendizaje
Introduccin
Aceptar Entradas del Usuario
ldentificadores de Variables
palabras Claves
en C
Tipos de Datos Bsicos
en C
Constantes en C
OperadoresAritmticos
Operadores Compuestos
de Asignacin
Conversin Expficita de Tipos
10. Conversin lmplcita de Tipos

28
24

l
34

35

1.
2.
3.
4.
5.
6.
7.
8.
9.

36
36
36
41

42
43
44
47
48
49
50

@ Copyright tBM Corp.


2004
Los materiales delcurso no pueden
sr reproOucidos en parte
o en su totalidad sin el previo permis'escrito
de

IBM

Introguccin a la prograrnacin con C

Resumen
Unidad 4: Examen de Autoevaluacin
Respuestas a ra unidad 4: Examen de Autoevaruacin
Unidad 5: Laboratorio de programacin en C
Objetivos de Aprendizaje
Ejercicios de Laboratorio
Ejercicios Opcional

AA

c5
c,A

56

.l

@ Copyright IBM Corp. 2005


Los materiares dercurso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.

lo
lo
lo
lo

Gua del Estudlante

ol
o

o
o
o
o

ol
o
O

Ol

o
Ol

lntroduccin a la programacin con

Unidad 1: f ntroduccin a ta
Programacin
Objetivos de Aprend izaje
Al final de esta unidad, Ud. ser capaz
de:.
. Definir el trmino algoritmo.

.
.
'
'
.

Discutir los diferentes tipos de algoritmos.


Describir fa organizacin de una computadora.
Definir ra necesidad de construir programas
para una computadora.
Discutir ros diferentes nveres de ros renguajes
de programacin.
Definir qu es un compilador y describir
su rol.

oi
ol
r1

ol
o/

!'o

?
o
+

t?
?

p
p
lr
b
l:

p
,Ivt

tnr

tr
ft
I

Votumen@

Unidadt:lnt@

@ popyright fBM Com. 2005


Los materiares dercurs r pueen
si rlprooucioos en parte
o en su totalidad sin el previo permisoes*ito
de.f BM

fntroduccin a la

l.

lntroduccin

Los problemas a. resofver por


medio de una computadora pueden
variaroesde los n::s
simpfes a los ms compleios.
En su nivel ms simpfe, fos problemas
pueden ser tan senciflos
computaciona,es
como encontrar el promedio
de
un
conjunto de nmeros 3
calcular el inters simple generado
por alguna a"uo"- por otra parte
pueden ser tar
compfejos corno encontrar una
solucion un cnunto de
ecuaciones oiferenciares
simultneas' la multipticacn
de una matrizo contar ra frecuencia
de una parabra en un
texto' A un nivel mucho ms especializado,
rtorput"dora
puede resorver probremas
como reconocer las huellas
digitales o la vo,zJ" ,n inooiduo,
simurar stuaciones en un
juego de guena o jugar
un partldo de ajedrez de alta
caridad.
una computadora es una herramienta
poderosa que es capaz de
hacer varias tareas
simurtneamente. sin embargo,
es sro una ,a!rin" y no posee
ra capacidad de
pensar' solamente puede implementar
instrucciones
que
le
ha
dado el usuario o
programador' De all que programador
el
no puede darle a ra compttadora
que sean ambiguas por naturaleza.
instruccjones
Todar ";;l;l"ion", deben
fi"n defrnirJas y
sin ambigedades. De aquse
origina er concepto de argor:itmo.
""i

2. Que son Atgoritmos?

un matemtco persa lfamado Abu


Jafar Mohammed lbn Musa Al
Khwarizmi desarroll
este mtodo en.el siglo ll DC y
demostr su efec{ividad. cuando
ros franceses
conocieron su mtodo, se referan
a ste como ef mtodo de Al
Khwarizmio como un
la palabra fue transformadaa ro que
se conoce como un
lfr";il"Posteriormente,

A continuacin se discuten algunos


ejemplos de algoritmos.
1.1 Ejemplos de Afgoritmos

;ffiffItrender
Ejempfo

y entender los algoritmos y

su

naturarezase presentan los siguientes

l.l

Dados tres nmeros diferentes


A, B, c obtener er mayor de eros:
Paso l: Obtener los tres nmeros
A, B, C.
Paso 2: si A > B es cierto,
er mayor es A. En caso contrario
er mayor es B.
Paso 3: Si er mayor encontrado
en er paso 2 es menor que c entonces
er mayor
ahora es c' En caso contrario
et r"yortnido en el paso 2
se
conserva.
Fin de Ejempto

l.l

Unidad

r,r"Oor""

Volumen

t: funGmEntos

Copyright fBM Corp. 2005


Los materiales del curso no pueden s, reproOucidos
en parte
o en su totardad sin er previo permiso
escrito oe rgl-"@

Oe

Cl

I
o
o
a
o
o
o
o
a
o
O

o
O

o
o
o
o

o
o
o
o

J@

o
o
a
o
o
a

o
o
a
o

o
o

o
a

'l
{y
p

b
.,

aL.

t'o

Gua del Estudiante

Introduccin a la programacin

Ejempto 1.2

6ei

6.

Suponga que se tienen que determinar


si un nmero entero dado es pnmo
entero no negativo es primo
o no. Un
si es divisible solamente entre y
I
s mismo. por lo tanto,
para determinar si un nmero
n es primo, se oeoe
frobar la divisibifidad de n para todos
los nmeros entre 1 y n. Ef
algoritmo para esto es como sigue:
Paso l: Obtener ef entero n
corr.to entrada.
Paso
ur";o:::'
ste es divisible poi t" variabre j,
ra cuaf armacena varores entre
't
.si
Paso t,
< n_1), entonces er entero n'o S primo,

1ffiT;;i,ffi:,"l Jrffi j

Fin de Ejempfo 1.2


Ejempto 1.3

suponga que se tienen que encontrar


las races de la ecuacin de segundo
grado
* c : o, donde ros coeficientes

ax2 + bx

.,

;t ; r"" varores de entrada.

Ef algoritmo para resolver ste problema


es como sigue.

Paso l: obtener como entrada fos


varores de ros coeficientes, a,
b, y c.
Paso 2: Calcular discriminante
= b2 _ 4ac
Paso 3: Sier discriminante <
0, ras races son imaginarias. parar.
paso 4: Si eldiscriminante
= 0, las races son iguales,
raizj. : raiz2 _ _b / 2a- pafar
Paso S: De otro modo, las races
son:

Fin de Ejempto 1.3


Ejempto 1.4

- + sqr.t (discriminante ) / 2a y
-D - sqrt(drscriminante) / 2a

Asuma que se debe contar ef


nmero de ocurrencias de tas
vocales en el texto de un
documento' El proceso para resolver
este problema es bastante sencillo.
carcter a la vez en el texto y
Tome un
verifique si es una vocaf. si fo
es, unton"", ,antenga un
contador de esa vocal en
iarticufar, en caso contrario salte ese carcter.
contine

;;' ;; ; r" re vi s a d o E, a,s o rit m o p a ra


:1' : :il?,ffj *,.'
"
Paso 1: lnicializaf contA, contE.
contr, conto y contU a cero.
Paso 2: Leer ef primer

[1iill". :,* :x'x:l.

carcter deltexto.
Paso 3: Repetir ros siguientes pasos
hasta tegar af finar det texto.
si er carcter = A a entonces incrementar
en uo contA.
si er carcter = E e entonces incrementar
en uDo conrE.
sier carcter = | i entonces incrementar
en uno contr.

votumen@
:

Unidad

@ Copyright fBM Corp. 20OS


.
ros
materiafes dercurso no pueoen
si prooucioos en parte
o en su totafidad sin elprevio.permis
escrito de IBM

carder = O o entonces incrementar


en uo conto.
Si ef carcter = U u entonces incrementar
en uno contu.
Si el

Caso contrario saltar el carcter


Leer el siguiente carcter.

Paso 4: Mostrar el contenido d


contA, contE, cont- r
Fin del Ejempto 1.4

contO y contU.

Los ejemplos presentados ilustran


que los afgoriimos involucran cmputos
aritmticos,
o
diferencia d; dos cantidades, flevando
a cabo
condicionalmente un conjunto
de.pasos, y la repeticin de fa ejecucon
oe
un
conjunto
en una condicin. A cntnuacn se
aprendern tos diferentes tipos
i:::firff:ados

verificacin por igualdad

3. Tipos de Atgoritmos
En la vida real se encuentran diferentes
tipos de algoritmos. una clasificacin
simple
ayuoa a comprender la naturaleza
subyacente oe tos afgoritmos y los
problemas para los que son
tipos de
ms adecuados. Esta cfasificacin tambin
permite
escoger un mtodo apropiado para
evaluar la valide z y laeficiencia del
atgoritmo.

En generar, ros afgoritmos se crasifican


en tres tipos:
Algoritmos Finitos Determinsticos.
Algoritmos Finitos no Determinsticos.
Algoritmoslnfinitos.

.
.
.

A continuacin se expfica brevemente


cada uno de ros tipos de aigoritmos
3.1 Afgoritmos Finitos Determinsticos
Estos son algoritmos que terminan
en una cantidad de tiempo finta. pueden
tomar un
tiempo largo en terminar la tarea
asignada, pero terminarn definitivamente
en un
tiempo finito' Estos algoritmos
siempre dan un resuftado que depende
nicamente
de la
entrada' En otras pafabras,
pr"u determinar el resultado exacto
s se conocen ras
entradas' La mayora de algoritmos
""
que se encuentran en la vida realpertenecen
a esta
categora' Encontrar tas races de
una ecuacin cuadrtica, determinar todos
nmeros primos entre I y I mifln
los
y encontrar la inversa de una matriz
cuadrada son
todos ejemplos de algoritmos

3.2

finitos beterminsticos.

Algoritmos Finitos No Determinsticos

Estos son algoritmos que terminan


en una cantidad finita de
o entradas, ef resultado del alsoritmotiempo. sin embargo, para

;n":|jf,i:o3"ot

puede no ser nico y

considere un algoritmo para generar


un nmero aleatorio- Existe un mtodo
matemtico
probado llamado el generadr
congruente multiplicativo, el cual es
una funcin de la
forma xt = (aX'-' ) mod m donde
a y m son constantes que siguen ciertas regras.
El
Unidad r'a"Oor",o
Volumen

i:

Fundarnentos de C 4

@ Copyright tBM Corp. 2005


Los materiares der curso no pueden
sr reproducidos en parte
o en su totafidad sin el previo permiso
escrito de lBM.

Guia del Estudiante

lntroduccin a la programacin con C

ol
o

algoritmo en este caso es no determinstico ya que


al ejecutar el algoritmo el resultado
casi nunca es el mismo. Sin embargo, este sirve para
el propsito del algoritmo, ya que
se supone que genera nmeros aleatorios.

3.3 Afgoritmoslnfinitos

o
a
o
a
o
o
o
o
o
o
o

Los algoritmos infinitos son aquetlos que no terminan,


ya sea porque una condicin de
termnacn no fue especificada o porque la condicin
no fue satisfecha para ef conjunto
de datos de entradas dado. Usualmente ios algoritmos
infinitos son aquellos donde las
condiciones de terminacn no estn especificaas
apropadamente.

o
o
o
o

a
t:t3
o
o
o
O

o
o
o
o
o
o
o

?
o
5

sin

embargo, tambin existen algoritmos infinitos tiles.


La tarea de monitorear ta
temperatura en un reactor nuclear es un algoritmo
infinito, claramente, esta tarea es
continua y debe seguir mientras el reactor est
trabajando. La tarea se mantiene
ejecutndose a menos que haya un estmuro externo
que to detenga.

otro ejemplo de un algoritmo infinto es fa tarea de enumerar


todos dgitos decimales
del nmero pi. se sabe que elmtodo para carcur"r
un ,n nmero
infinito de dgitos en su parte no entera. Este"inJr!;;;;rli
es especialmente tl para los
matemticos.
A continuacin se discute que es una computadora.

4. orga nizacin Efemental de la computadora


',

una computadora es un dispositivo electrnico que


ayuda a la resolucin de problemas
computacionales a travs de un algortmo, describiendo
sin ambigedades los pasos
involucrados' Los computadores se usan para
una gran variedad de propsitos y se
cfasifican en diferentes categoras. analgicor,
digit"fur, personales, servidores,

supercomputadoras. etc.

un sistema de computadora moderno consiste de un sistema


interconectado de
procesadores, memoras y dispositivos
de entrada / safida. A continuacin se discute
una organizacin elemental de una computador,
denominado sr'sfem a simple orientado

a bus.

La undad central de Procesamiento (cPU)


es el componente vitaf de la computadora.
su funcin es ejecutar las instrucciones almacenad,
la memoria principal: las
obtiene, las examina y ejecuta una clespus
"n
de la otra.

La cPU consiste de varias partes importantes.


Tiene una unidad de control que es
responsable de traer las instrucciones de la
memoria principal y determinar el tipo de
instruccin' La unidad Aritmtico Lgica (ALU)
t"p"=
realizar operaciones
antmticas y lgicas. La cPU posee tambin
", unas de
pocas localidades de
almacenamiento temporal de alta velocidad
llamados 'registros'. Los registros se usan
para almacenar resultados intermedios y tos
datos necesarios para llevar a cabo las
instrucciones.

Volumen

$o
It

?
o

l: funarnetoGE

Unidad t:ltroOucco aGFroqra,r:rc

@ Copyright fBM Corp. 2005


Los materiales def curs n-o pueden ser iepiooucoos
en parte
o en su totalidad sin'el previo permiso escrfto de
lBM.

-:

Introduccin a la programacin con

Gufa del Estudiante

Toda la comunicacin entre estas entidades se lleva a cabo a travs


del bus del

sistema' Un bus es un conjunto de cables paralelos a travs


del cual todas las seales y
los datos se transmiten entre varias entidades. Esto se muestra
en la Figur a 1.1.
Unidad

Oispositrvo

Central de
Procesamiento

De

Salida

Bus delSistema

Figura 1.i: Bus de la Computadora


Una computadora requiere de dos entradas para funcionar. un
algoritmo, un conjunto de
instrucciones que especifican las tareas a realizar, y los datos que
necesita el algoritmo.
El algoritmo y los datos requeridos por ste s almacenan en la
memoria principaljunto
con los resultados generados. La palabra 'principal o primaria" se
usa para referirse a la
memoria reconocida como voltil, el dispositivo pierde el contenido
cuando se apaga,

distinguindola

de los otros dispositivos de

almacenamiento,

almacenar instrucciones y datos de forma semi-permanente.

los que

permiten

Se discuten a continuacin otros dispositivos de almacenamiento conocidos


como
dispositivos
de almacenamiento secundario.

Los dispositivos de almacenamiento secundarios pueden almacenar instrucciones


es
decir, algoritmos y datos por un largo perodo de tiempo. De cierta
forma, se les puede
considerar tambin como dispositivos de entrada / salida. Algunos
dispositivos de
almacenamiento secundarios ms usados comnmente son los
discos duros, discos
flexibles, CD ROMs, DVDs y cintas.

La memoria primara es relativamente ms costosa y por lo tanto


limitada en tamao.
Aunque la palabra, 'memoria" evoca imgenes de "cpacidad de
recuerdo", ,,capacidad
de autoconciencia", 'ser creativon, en este contexto memoria esencialmente
significa
almacenamiento.
Los resultados obtenidos al ejecutar una tarea en una computadora
estn disponibles al
usuario a travs de dispositivos de salida. Un dispositivo de salida
ayuda a leer los
datos resultados de la memoria principal. Los dispositivos de salida que pueden
conectarse a una computadora son de diferentes formas y capacidades.
Algunos de los
dispositivos de salida ms utilizados son: el VDU (Visual Display
Unit), impresoras,

plotters y dispositivos de sonido.

Unidad 2:Laboratorio de IntroduccOn aGFrogramacion

I
I

tl
l

tl

Volumen 1: Fundamentos de C 6

@ Copyright IBM Corp. 2005


Los materiales dercurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

o
o
a
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o

Gua del Estudiante

lntroduccin a la

se presenta una visin

muy simpte de cmo un sistema de


computador
flff:::'"cin
' Los datos e instrucciones para llevar a cabo una tarea deben estar disponibles al
computador' Estos son provistos ya
por fos dispositivos dl entraoa,
cuando
los ingresa, o por fas uidades'de
"".
armac"n"r"nto secundarios

;iH:il"

'
o

como

La cPU enva una

:'ina"J::liento

a la
""i:l^ para entidad.
-apropiada, dispositivo de entrada o
secundario,
que estn
disponibre r"f inrirr"ciones y datos

La entidad' dispositivo de entrada o almacenamiento


secundario, los enva a
travs del bus a la memoria principal.

' h*:#.entonces lee fas instrucciones en una secuencia bien definida de la


' La cPU ejecuta las instrucciones usando la ALU y los registros, y enva los
'
'

resultados a la memoria principal


a travs J"iorr.
Los resuftados que estn disponibfes
en la memoria principal se envan
a los
dispositivos de safida va el b.us.
una seal a la memora principal para que
to enve at dispositivo
5:

Sy":t"n

5. Que es un programa de Computadora?


Un programa de computador"
de un algoritmo en un tenguaje
apropado para usar en una computdora.
"t-f1,.1:presentacin
Por lo tanto, consiste de un conjunto
de
instrucciones que estn bien definidas
y sin ambigedades. por ejemplo,
un programa
para dividir un nmero entre
otro nmero consist de una secuencia
de instrucciones
que le indican a fa computadora que
realice la divisin. cuando se ingresan
dos
nmeros como entrada, la computadora
lleva a cabo las instruccones con
la ayuda del
programa y obtiene el resultado.
Los programas de computadora se desarrollan
para resolver problemas especficos.
Estos programas tambin se les denomina
software. Existen muchos tipos de
programas de computadora'
Algunos de ellos se escriben para ayudar
a controrar el
funcionamento de un sistema
de computadora y optimizar el uso de sus
recursos. A
estos se les denomina programas
del sistem y Lr'personas que desarrollan
ste tipo
de programas se fes ilama programadores
de sistem.
Existen programas que llevan a
cabo la solucin de un probtema en particular
o un
conjunto de problemas relacionados.
se les denominan programas de aplicacin. rJna
gran mayora de programas de computadora
estn dentro de esta ategora. Los
programas de aplicacin van
desde programas simples que calculan
el factorial hasta
aquelfos que resuefven un sistema
complejo de ecuciones diferenciales
o que pueden
jugar un juego de ajedrez.

"t",::,f#:ramas

Votumen@

de computadoras se escriben en un tenguaje


de
Unidad

@ Copyright tBM Corp. 2005


Los materiales detcurso no pueden
sr re-p'roucioos en parte
o en su totalidad sin ef previo permiso
escrito de IBM:

programacin

6. Por gu se Necesita un Lenguaje


de programaci n?
un afgoritmo debe poder ser tfevado
a una computadora. un oronl"r, rearizaesto
a
travs de un conjunto de instrucciones.
Por

fo tanto, fas instrutcJnes en el programa


deben ser claras, bien definidas y
sin ambigedad. para poder ltevar
las instrucciones,
lensuaje que permita una comunicacin
ctara, bien definida y sin

;r1;3:.::::."

Los lenguajes naturales como el Ingls


son muy
semntica y tienden a ser try .otpticados'p"r" ricos en sintaxis (gramtica) y
ros desanolradores y para ros
aprendices y usuarios' Ms an, fos
fenguajes naturares tenden a ser
muy ambiguos
debido al uso de "lenguaje figurativo'y-"rica'. por
ejempfo ra sentencia "arguien

:,'nt[,o"ilffiI"'

no suiere decr literalmente que arsuien


estir

p"r"; si no que

Los computadores son esencialmente


dispositivos bsicos gue pueden
solamente tareas simples

realizar
tales como adicin, sustraccin, multiplicacin,
divisin, etc.
La manera como las instrucciones se
comunica al computador, debe ser por
fo tanto
muy simple' Para permitir una comunicacin
bien definida, el lenguaje debe ser
limitado
en su sintaxis y semntica. Ef renguaje
no debe ser ambiguo. Es por eso, que
necesita un lenguaje de programacin
se
de computadora con una sintaxis simple,
semntica restringida y de natuialeza
no ambigua.
6.1 Nivefes de Lenguajes
Hay diversos niveles, de
.lenguajes de programacin. A continuacin se presenta una
breve descripcn de los Oifents
niveles.

6.1.1 Lenguaje de Mquina


En ef nvel bsico' una computadora
necesita trabajarcon nmeros binarios,
' y 1'
es decir, 0
Las instrucciones que se escriben
en forma binaria se dicen que estn
en lenguaje
de mquina' El lenguaie de mquina
constituy un conjunto de instrucciones
implantadas en la computadora
en forma binaria (una cadena de 0,s y .1,s).
Los circuitos
son capaces de rlevar a cabo estas
instrucciones en
ffilputadora

;f::::i:rfl""

6.1.2 Lenguaje Ensamblador


claramente, er uso de fenguaje de
mquina es bueno para fos computadores,
pero
tedioso para los humanos. Los humanos
trabajan ms fcitmente con smbolos.
lugar de pensar en 1000101001010100
En
como una instruccin de adicn, la
clave es
usar ef smbolo 'add'' similarmente,
se pueden usar smboros como ,,sub' para
'mul" para la multiplicacin,
restar,
etc. un lenguaje basado en un smbolo
o
un
nemotcnico
para cada instruccin de lenguaje
de mquina se llama tenguaje ensamblador.
emoargo, escribir programas usando
sin
instruccion", trr rimpres como add,
sub,
mul,
move, etc. tambin puede ser
muy tedioso.
Unidad 2:Laboratoro

Volumen 1: Fundamentos de C

Copyrght tBM Corp. 2005


Los materiales delcurso no pueden
ser reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.
@

a
o
o
:

o
o
a
o
o'
o
o
o
o
O

o
o
o
q
o
o
i

3o

o
o
o
o
o

t
t

a
o.{
o

t
e

;*

?
u
I

I
E

l
.',v

cin a la programacin con C

6.1.3

Lenguajes de Atto Nivel

Los lenguaies de alto nivef son necesarios para poder


expresar las instrucciones de una
manera ms simple en comparacin con los lenguajes
de mquina y ensamblador, Los
programas de computadoras se escriben
usualmente en un lenguaje de afto nivel cuyo
conjunto de instrucciones es ms compatible con
los lenguajes natlrales. La sintaxis y
semntica del lenguaje de alto nivel deben ser
tal que contribuyan a especificar
instrucciones bien definidas que no sean anibiguas.

se han desarrollado un gran nmero de lenguales de


alto nivel. Literalmente son cientos
de estos lenguajes. Algunos de ellos son muy populares,
mientras que otros no. La
mayora de los lenguaies de alto nvel son lenguajes
de propsito general como c,
Pascal' FORTRAN. c++. Java. etc. Estos pueoei
,rrru para escribir programas

una amplia varieoaC de aplicaciones.


Los lenguajes de a/to nlvel penenecen a una
de las dos siguientes categoras:

para

6.1.4

Lenguaje de programacin Orientado a Objetos


El software orrentaoc a objetos es acrca.de
objetos. un objeto es un "dispositivo,,, que
recibe y envia mensales Los objetos realmente
contienen un cdigo, una secuencia de
instrucciones de computador. y los datos,
la informacin sobr io, qru opera las
Instrucclones Generalnrente. el cdigo y los
datos
embargc en lcs lenguajes de programacin orientados se mantienen separados. sin
estn fusionaics en un obleto. El,l" los lenguaes a objetos, el cdigo y los datos
oe programacin orientados a
ob.letos que g3zan de popuJaridad estn
C++ y.lua]--

6.1.5

Lenguaje procedimentaf

Es un leng;a.ie donde el programador da.a la


computadora una secuencia de pasos
segurccs unc ce otro para oblener la safida
d"r""i".
Los lenguajes procedimentales
mas populares incluyen Basic, pascal C.
v

7. Compifadores
una computadcra solamente puede ejecutar instrucciones
en lenguaje mquina. si un
programa se na escrito

en c, las instrucciones no podrn ser llevadas


a cabo fcilmente
por los circuitos electrnicos de la computadora.
Las instrucciones escritas en el

ienguale c deben ser traducidas en una


secuencia de nstrucciones en el lenguaje
mquina de la computadora. La entidad que
realiza esta traduccin de un fenguaje de
alto nivel a lenguaje mquina se llama compitador.
Un compilador es un programa de computadora
que toma como entrada un programa
escrrto en un lenguaje de alto nivel como
y
C lo traduce a un conjunto de instrucciones
en el lenguaje de mquina de la computadora.

l#ffi81 -:>t@->
rl

Progama
Eeculabte

Compiladtr

Figura 1.2. programa Convertido a Lenguaje


de Mquina.
Mqr

Volumenr@

Unidadt:lt@
@

Copyright fBM Corp. 2005

Los materiales dercuqo no pueden sr'reproducidos


en parte
- 'o en su totafidad sin elprevio permiso escrito

de lBM.

lntroduccin a la programacin con C

Guia del Estudrarie

Resumen
Ahora que ha completada esta unidad, Ud. debe ser capaz
de:
. Definir el trmino algoritmo.

.
.
.
o
.

Discutir los diferentes tipos de algoritmos.


Describir la organizacin. de una computadora.

Definir la necesidad de escribir programas en una computadora.


Discutir los diferentes niveles de los lenguajes de programacin.

ilfr

Definir qu es un compilador y describir su rol.

:i
;
I
;

a.

.l
I

unroao ;:Laboratorio de Introduccin a la programacin

Volumen 1: Fundamentos de C 10

Copyright tBM Corp. 2005


Los matenales dercurso nb pueden sr reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

.)
-

o
o
o
o

Gua del Estudiante

o0

Unidad
1)

o
o
o
o
o
o
o
o
o
o
o
o
a
o
o

o
o
),A
_i (3
O'.o
O

o
o
o
o
o
o
o
o
O

o
a
o
o
o
O

a
O

l: Examen de Autoevatuacin

Cul de las siguientes es la funcin principal de la computadora?


a) Resolver problemas no computacionales.
b) Resolver problemas que son imposibles para los humanos de resolver.
c) Resolver una variedad de probremas computacionares.
d) Todas las anteriores.

2) Cul de fos siguientes

es un proceso paso a paso bien-definido para resolver


un
problema, enunciado de una manera clara y no
ambigua?
a) Mtodo.
b) Algoritmo.
c) Tecnologa.
d) Programa.

3) Un algoritmo desarrollado para encontrar


entre 1 y 1 milln es un ejemplo de:
a) Un algoritmo infinito.
b) Un algoritmo finito determinstico.
c) Un algoritmo no determinstico.
d) Ambas (b) y (c)

todos los nmeros primos que existen

4) Un algoritmo usado en un sistema de computadora para


monitorear los signos
vitales de un paciente en la Unidad de Cuidados lntensivos
(como presin
sangunea y pulso) es un ejemplo de:
a) Un algoritmo infinito.
b) Un algoritmo finito, determinstico.
c) Un algoritmo no determinstico.
d) Ambos (b) y (c)
6\

cules de las siguientes entidades usualmente contene ra cpu?


a) La memoria primaria, el bus y la Unidad de Control.
b) Solamente la Unidad Aritmtico Lgica (ALU).
c) La Unidad de Controt y la ALU.
d) La Unidad de Control, ALU y algunos registros.

o/ Por qu a fa memoria principal de una computadora


se le llama almacenamiento
vof til?
a) Pierde los contenidos almacenados cuando se apaga la fuente de poder.
b) Retiene los contenidos afmacenados an despus e apagar ta fuente poder.
c) Es sumamente sensible a fluctuaciones de fuente de poder etctrico. de
d) Ninguna de las anteriores.

o_

Introduccin a la

Volumen

l: funOametosE

Unidadl:lntroOu@

@ Copyright tBM Corp. 2005


Los materiales dercurbo no pueden'r reproducidos
en parte
o en su ttalidad sin elprevio permiso escrito de lBM.

Introduccn a la programacin
con C

7)

8)

Gufa delEstudiante

Un disco duro puede ser clasificado


como
a) Un dispositivo solamente de entrada.
b) Un dispositivo sofamente de salida.
c) Ambos, como dispositivo de entrada y de sfida.
d) Ninguno de los anteriores.

cul de los siguientes es la entidad en un sistema de


computadora que permite ra
entre ta CpU, ta ,"',oii"'-'prir"ri"
tos dispositivos de
$[ttr3r",,,::,

a) El almacenamiento secundaro.
b) La Unidad de Control.

c)
d)

Ef bus del sistema.


Ambos (b) y (c).

9)

cules de los siguientes son algunas de las caractersticas


principales
lenguaje de programacin de computadoras?
a) No son ambiguos.
b) Sintaxis y semntica restringida.
c) Sintaxis y semntica no restringida.
d) Ambos (a) y (b).

de

un

10) Qu es un compilador?
a) un dispositivo, de hardware que traduce un programa
de computadora escrito en
lenguaje de alto nivel a ,n
lenguaje mquina.
b) un programa que traduce "n
un programa de computadora escrito
en un lenguaje

de alto nivel a lenguaje de mquina.

c) un ser humano que acta como intermediario


d)

entre el usuario de una


computadora y la comptadora mismo.
un mtodo de describir el lenguaje de programacin
de computadora a los
usuarios potenciales.

Unidad 2:Laboratorio Oe

tnt@

Volumen 1: Fundamehtos Oe C

@ Copyrght IBM Corp. 2005


Los rnateriales delcurso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso
escrito de lBM.

lZ

Gua del Estudiante

Respuestas a la Unidad
1)c
2)b
3)b
4)a
s)d
6)a
7)c
8)c
e)d

Introduccin a la programacin con

i: Exarnen de Autoevatuacin
-

r0) b

Volumen 1: Fundamentos Oe C
@ Copyright tBM Corp .2OOs
Los materiafes der urso n-o pueden sr reproducidos
en parte
o en su totalidad sin elprvo permiso"escrito de lBM.

Estudiante

Pgina dejada intencionalmente


en blanco...

Unidad 2:Laboratorio

Volumen

i:

Fundamentos de C 14

@ Copyrght tBM Corp. 2005


Los materiales def curso no pueden
ser reproducidos en parte
o en su totalidad sin elprevio permiso
escrito

de lBM.

oI
a':

Gua del Estudiante

o
o

-L,
t-

o
o
o
o

(,

ramacin con C

unida d 2: Laboratorio de f ntroduccin a


fa Programacin
Objetivos de Aprend izaje
Af final de esta unidad, Ud. ser capaz de:
. Resolver problemas sistemticamente.

o
o
o

.
.

o
o
o
o
o
o
o
o
o
o

Escribir algoritmos para una tarea dada.


Aplicar diferentes afgoritmos a distintos tipos de problemas
esfuerzos en su resolucin.
Generar un aigoritmo para una subtarea repetitiva.

que

j(,
t-,.

.\

o
o
o

c
o

o
a
a

o
o
o
o
o

(t-l
I'

o
o
o

Volumen

l:

Fundamentos OeC

Unidadt:lntroducc@

@ Copyright tBM Corp. 2005


Los materiales detcurso no pueden sr reprooucidos
en partb
o en su totafidad sin el previo peimiso escrito
de lBM.

requieran

Guia del Estudante

trJercfcios de Laboratorio
Ejercicios
1) Expficar paso a paso' ef proceso

2) Escribi*n

para preparar caf


en una cafetera erctrica
jnoieue
gu.e
a.un
granjero
cmo transportar un robo,
"'g:1lT-o
una cabra
en el oote, y sin deiar a, ,obo

I#,i"iJi:il'i:n,i"*";i':#1,ff
3)

4)

ff,fi;:: fts

ff:il,ff,.i:x1""x1;iln:,;ffif':i:',4;,il:x:"

ff#;ff:i,t'"

oe orechal

"ot

para

senellT:::r^:!,*

iJrl"lqueffos

que son isuafes s

por ejempro, ros nmeros


121, 4334 y

sus edades, ra edad promed


oy
1

y,2ooo'sue sean parndromes

sJ""n

151151

o"lJir",;il?

son todos

o"ru.h,

parndromes.

Unidad

r'r"Oo

Volumenl:@
tBM Corp. 2005
,^
los
materiales delcu
oensutot"r0"'!?J,"rij|,3"J"itr j:Tlj.:ili"",,E[rl"n"
@

Copyright

lr!

ro,
lo
lo
lo

Gua def Estudiante

ol
o

o
o

o
o
o
o
o
o
o
o
o
o

Introduccin a la proqramacin con C

Unidad 3: Programacin en C
Los Primeros pasos
Objetivos de Aprend izaje
Alfinal de esta unidad, Ud. ser capaz

.
'
'

de:

Describir la evolucin de C.
Discutir cmo escribir algoritmos en C para resolver problemas
simples.
Explcar los dferentes componentes de un programa simpre
en c.

o
o
o
o

o
o
o
o
o
o
o
o
o

o
o
o
o
o
io
fo
ItL
TU

fo
fo

o
o

Volumen 1: Fundamentos erc

Unidad 3:Progra

@ Copyright tBM Corp. 2005


Los materiates derburso no pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.

Introduccin a la

f.

ramacin con C

Gua del Estuo

lntroduccin

s^:.

Esta unidad presenta una introduccin


a ra programacin usando er renguaje
programacin c' Es muy
ce
importante desarrollar slioas
telncas-iu"orogr"racrn, ya
que son las bases para
convertirse en buenos ingenieros
de software. Er renguaje de
programacin contribuye
a
ese
que
tiene
v.
una buena estructura de
programacin y proporciona
.propti"
los fundamentos
,otr"
los cuales otros renguajes tares
como c++ y Java pueden aprenderseEs tambin un fenguaje que
se usa ampriamente
en ra comunidad de programadores,
adems de ser er renguaje
construyen los sistemas oprativos
con er que se
ms popufares.

2. La Evolucin de C
Ef lenguaie de programacin
c
Dennis

fue diseado y desarroilado por


Brian Kemighan y
Ritchie en los Laboratorios
Bell Researci en er ano rc72.Fue
momento cuando se desarroilaban
riberado en un
cientos oe reuales de programacin.
A menudo' estos lenguajes de programacin
se desarrollaban para su uso en
conjunto especfico de aplicaciones.
un
El lenguaje ronrnnru
ejemplo' fue desarrollado para
rronma'inerurt"tion) por
aplicaciones cientficas
v'0" ""ru era. El fenguaje
coBol (common Business orieted
Lenguage) fue desarrofrado para
comerciales y de negocios
apricaciones
Tambin se reafLarn'esfuezos
para JeJarroilar renguajes
de programacin que sirvieran
como lenguajes de propsito genera
rango de aplicaciones' uno
I para un amprio
de los primeroi
concertados en esta direccin
el desarrollo del lenguaje ALGOL
fue
"rrr"os
(ALGOrithmic
r-anguage). ALGOL nunca
popular fuera del ambiente
rfeg
a ser
acadmico y";;; ;;";;"riado
abstracto. Ef Lenguaje de
Programacin c.ombinado (cPL)
fue desarrollado para reoucir
ra abstraccin de ALGoL
y nacerlo tif sin embargo,
ef lenguaje cpl resuftante tuvo
demasiados problemas,
eia dircir o"
resurtaba dircir desarrorar
.o'f,',1:::ni,-:':ff:istlas'
"pr"no"r v

i,l

Martin Richards' en la Universidad


de cambridge, intent reducir
fas caractersticas der
lenguaje cpl a soro unas pocaiy
tires. ri; fr;';"mado BcpL
(Basic cpl). pero
result ser demasiado simple
y sin'mucho poder. Ar mismo
momento Ken Thomson en
AT&T trabaiaba en una simplificacin
de
cpl
y
oesarroil
el renguaje B. Tambin
permaneci sin uso hasta que
Dennis Ritchie
caractersticas oe B y BCpL,
y desarroll C, con sus propias
"oroin-r"s
adiciones al lenguaje.
Hoy en da' Ia especificacin
de las caractersticas de c, su
sintaxis y semntica ras
proporciona el American
National standards rnsttute
c
itus,l
es un fenguaje de nivel
medio con estructuras de alto
nivel comparabres
intfuso
1e
mejores) a tas que dispone
Pascaf y FoRTRAN' y caracterisicas
de
bajo
niver
que
ayudan
que toman ventaja de las
a escribir programas
caraciersticas a nivel de mquina.

Unidad a,O

Volument:f@
@ Copyright fBM Corp.
2005
Los materiales delcurso no pueden
ser reproOucidos en parte
o en su totalidad sin elprevio permis
escrito de tBM.

o
o
o
o
a
o
o
o
o
o
o
o
o

't
Gua del Estudiante

o
o

3. Primeros pasos para Escribir un programa


en

Los pasos bsicos para escribir un programa


de computadora en c son los siguientes:
Paso l: Leer y entender el contexto del problema
gue requiere una solucin
mediante un programa de computadora.
Paso 2: Desarroilar un argoritmo para resorver probrema.
ef
Paso 3: Verificar el algoritmo para su ralidez.
Paso 4: Convertir el algoritmo a fenguaje C
Paso s: probar y verifcar er programa c para
su vafidez.
Nota: El paso 4 requiere el conocimiento de las
estructuras de un programa en c, es
decr, los elementos der renguaje, su sintaxis y
semnticas.

Para poder desarrollar un programa en lenguaje


c, ro primero es crear un archivo
denominado archivo fuente con extensin ".c"
n cuatquier editor de texto conocido.
3.1 Estructura de un programa:

o
o
o
o
o
o
o
o
o
o
o
o

Introduccin a la programacin ccn C

cuando se escribe el programa se recomienda usar


er siguiente formato:
1 f]amadas a bibfiotecas
2 dec-Iaracin de funcicnes (prototipos de funciones)
3 decl-aracin de varj-ai:,es giobales

(0

4 mainOi
5
dec,laracin cle.._a:iabl-es focales
6
senl_encias
1j
8 definicrr Ce i::.:_::.:-.

Cualquier aplicacin hecha en lenguaie C debe


constar de una funcin principal
denominada ri,ai:-. que ser la primeia en
ser llamada. En la estructura anterior elmain
comprende desde la linea 4 a la lnea 7.
3.2 Variables y Sentencias:
La manera ms simple o'e almacenar los datos
es en una entidad llamada variable.
Las variables son nombres que se les dan a
las focalidades
donde un elemento de dato puede almacenarse. puede en la memoria principal
ser til pensar en estas
localidades de memoria como un conjunlo
de casillas que pueden contener algn dato.
Todas estas casillas se deben poder referenciar
de forma nica. por tanto, a stas se
les dan etiquetas simblicas que se denominan
nombres de variables. un nombre de
una variable solamente se refiere a una localidad
en fa menioria donde algn dato est
almacenado.
La sintaxis del lenguaje de programacin
los nombres de variabres. Estoi se ristan

c impone atgunas reglas en la construccin de


a contnuacin:

variables siempre deben empezar con una retra,


' *"t.l":?t:t3,:
esto incruve
ye al
carGler " "
es buena
pirrJ;;;."r[r*

;.::l:,TbT,

variabfes que empiecenion letras

Volumen faFundamenGrdeE

.prdicab"

mn,:rrii

f:;;

Unidad 3:Program

@ Copyright tBM Com. 2005


Los materiares det crs n-o pueoen ci reproducidos
e parte
o en su totalidad sin el preVio permiso escrto
de IBM'

ol

lntroduccin a la programacin
con C

Gufa del Estudiae

un nombre de variable puede estar formadopor una secuencia de fetras


arfabeto y/o dgitos de 0 af g y/o

'

def
carctei "_" (subrayado).
El estndar ANSI c establece que fa
variable puede ser de cuarqu.ier
rongitrrd,
como por ejemplo abu jafar_mbh"rr"_ior_i"r"[xn""*rr,=
,, pero sdo
fos primeros 31 caracter so
s"m""i"";
No se permiten comas niespacios
en un nombre de variable.

er

'
'

h;?$s:;:

smbofos especiafes, otro


sue no sea er carcrer de subrayado, en un

La manera de informa r a la computadora


que ,,
,n" variable es a travs de una
sentencia de declaracin' Las locafidades
", pueden
de memoria
armacenar enteros tal
como 15' nmeros reafes por ejemplo
34.24 | ."r".t"r"s por ejempro ras
retras def
alfabeto' Las sentencias de declaracin
ayudan adefinir ro que se puede
armacenar
en
o" variable' En el caso, de querer almacenar un entero,
se

i[:tot"

decrara como

irrt

num;

;:;?::n:,:J:ilada

ffjnlT|.."

en

que indica se est haciendo una


decraracin.

El smbolo de ; se usa como separador


de sentencias, tambin conocido como
delmitador de sentencia. si existen
mrtiples sentencias, se le debe informar
compirador donde termina una
al
sentencia y empie za otra.
se ha creado una varable lfamada num.
un varor se armacena en num a travs

::i:J":":n:::::Z:::,

de

una resra simpre para rormar ra sentencia


de asisnacin

<nombre de l_a variab]-e>


= <expresin>
El smbolo = s l operador de
asignacin. La entidad a la izquierda
del : es cualquer
nombre de variabre, tar
r.,t.
La
entidad
a fa derecha der : es cuarquier
expresin aritmtica - As "oro
que para almacenar por ejemplo
15 en nLm, se escribe ra
sentencia de la siguiente manera:
n''

Ejemplo

_:

Y
Li

3.r

Extraer fos Dgitos Individuares


de un Entero de Dos Dgitos
considere un entero positivo de dos
dgitos num. Los dgitos individuales
del nmero se
deben extraer y mostrar como resultado.
Para lograr entender la naturaleza
del.afgoritmo requerido para la solucn
problema' considere el entero positivo
de este
oe os dgitos 25. se sabe que er dgito
de fa
izquierda es 2 y el dgito de fa ierecha
es s. cimo sL extraen ?, 2s dividido
entre
da el cociente 2' se observa entonces
10
que para cualquier entero positivo
de dos dgitos,
la divisin entre '10 esulta en el dgito
de la izquieiJa. El resto de fa misma
divisin
entonces conesponde al dgito de
fa-derecha. cuando se divide 25
entre 10, el residuo
Unidad S:e

Votument@
@ Copyright tBM Corp. 2005
Los materiales del curso no pueden
ser reproducidos en parte
o en su totalidad sin elprevio permiso
escrto de lBM.

.l

il:
ei

o
o
o
o
o
o
O

o
o
o
Ol
o
o

o'

o
!i

oi
ot
ol
oi
al
ol

)r ?
o
o
o
o
o
o
o

o
o
o
o
o
o
a
o
o
o
a

u, fil
l\lu

o
o
o
o

Gua del Estudiante

Introduccin a la

es 5' Por fo tanto, para cualquier nmero entero positvo


de dos dgitos, el residuo de
una divisin entre 10 da el dgito de la derecha.
Por lo tanto el algortmo puede escrbirse como
sigue:
Paso l: Sea num elentero positivo de dos dgitos.
Paso 2: El dgito ms a la izquierda de num
es elcociente de la divisin entre 10.
Paso 3: El dgto ms a la derecha de :rum es
el residuo de la divisin entre 10.
Paso .f: Mostrar er dgito ms a ra izquierda y
er dgito ms a ra derecha.
Ahora se presenta el algoritmo escrito de una forma
compacta, orientado a un cierto
valor para num:

Paso l: num = 25.


Paso 2: Dgito ms a la izguierda num / 10.
=
Paso 3: Dgto ms a ra derecha residuo de
=
num / i0.
Paso 4: Mostrar er dgito ms a ra.izquierda y
er dgito ms

a ra derecha.
A continuacin se estructura elconjunto de sentencias
en c para ef algoritmo anterior.
El cdigo C comienza aqu...

I /* Se incluye 1a J-ibrera predefinida


(stdio-h) +/
2 #inc_lude <stdio. h>
3 /* La funcj-n principal- se inicia
aqui */
4 mainO{
5
int num,6
int digito_izguiefdo,7
int dlgito_derecho,.
8 / * La varia-b1e se inici-ali-za con er valor
25 * /
9
num = 25;
10 /* EI dgito rzquierdo se extrae */
ii
org:to__izquie:cio : nuli. / _A;
E!
,'dgito derecho se extrae _/
-2
:-:---._l=::::r:
::.._:. - r..i:. _-,-10,.
-:
,- ,.- Los digitos son enviados a la sal-i_d.a
estndar +/
::::::: ";r cr qtac :-zg.r:e:ic es ?d\n,,, digito_izqu'erdo),.
-5
::-:^:: ("a1 c:qric cierecio es ?d\n,,, digito
derecho) ;
::
El cdigo C finaliza aqu...
Fin de Ejemplo 3.1

Felicitacionesl, se ha desanollado el primer programa en


c. Existe un nmero
importante de lecciones por aprender a partir
oe ios primeros pasos que se han dado
aqu' Para resolver un problema, se debe desarrollar
primero un algortmo. se puede
escribir el algoritmo de manera que empfee
trminos y sintaxs similares a c
Posteriormente se tiene que verifcar si el algoritmo
est correcto o no. A continuacin
se convierte el algoritmo a un programa en -c.
Este programa consste de una funcin
Volumen

l: punOamiffi

3:ProgramacOnffi

@ Gopyright tBM Corp.2OOs


Los materiares dercurso nb pueden'sr reproducidos
en parte
o en su totalidad sin el previo permiso eiscrfto
de IBM'.

main gue se inicia llevando a cabo tas


instrucciones dentro de elfa. En la funcin
main,
las sentencias en C estn encerrada
entre tfaves {}.

En el programa existen dos partes


diferentes: una parte de declaracin y
una parte
ejecutabfe' En elejemplo la parte
decfarativa
consta

int num,.
int digito_izguierdo,.
int digito_derecho;

o!|", siguientes sentencias:

Esto indica que tres variabres enteras


,amoas nlun, digito_izguerdo
y
digito-derecho se usan en este programa.
La comput"o"r"-..;"espacios oe
almacenamiento

;iliJ,"

en la memoria principal para estas


variables cuando fa funcin main
trabajar' se puede pensar que ellas
son corno casiilas en

fa memoria

num

digito_i zquierdo

La otra parte de la funcin main


COmPUtadorA cicnr

::fi 3l'?':'i

la parte ejecutable. Esta consiste de las


";::'":'r;"r'?:

es

rfa on

":f :::i^ :" ^ :: i

digito derecho

:^"11 i :"

f *ni""'",
# ffi ;";"' :'' ", . l'3'J', n'3

* ", h; l, ;

;ffi;:

num

"1,'"i'"

"il

25

En este punto, ras^rocafidades digito_izguierdo


y digito derecho no tienen
vafores en etos- si se trata de
mostrar er contenid, d"
la funcin
en esta etapa, la computadora mostrar
argn varor sin sgnificado para este

r;;il;;#"

:;T::

La ejecucin de la siguiente sentencia


es como sigue:
digito_izquierdo : num ,/10;
Esto asigna 25/ic, que es z

alavariable

u,,

Cr

g: to_i zquierdo

diqito _r zquierdo .
digito derecho

La ejecucin de la siguiente sentencia


es como sigue:
digito_cie:echo : num _ (num/10) *10,.
Esto asigna el residuo : a la variable

digito

num
5

Unidad 3:prog

digrto_i zguierdo

derecho.

digito_derecho

Volumen

l:

funOmEtos oe

@ Copyright tBM Corp. 2OO5


Los materiafes del curso no pueden
ser reproducidos en parte
o en su totafidad sin elprevio permiso
escrito de lBM.

zZ

f,

oH
aii

Gua del Estudiante

o
o

s:_lni_f ("El- dig:-to izguierdo

0
i,

EJ-

oj
oi

Ahora se puede mejorar el programa recin escrito si se


aprende un poco ms sobre C
y sus capacidades' Para comenzar se aprender
un poco ms acerca de las sentencias
de declaracin.

ol

o
o
o
o
o
o

o
o
O

o
o
O

o
a
o
o

,.

El digito derecho es 5
Todas fas sentencias en la funcin main se han ejecutado y
el programa termina.

ot
o

Muestra el mensaje

oJ

o
o
o
o
o

digito izquierdo es

printf ("Ef digrito derecho es td\n,,, di-gito derecho)

o,,,
O'*0
o
o
o
a

,.

Qu sucede con la siguiente sentencia?

ol
ol

q
a

es ?d\n,,, digrto_izquierdo)

Muestra el siguiente mensaje.

1||

O'

Introduccin a la p

4. Ms Acerca de Declaraciones
Cuando se declaran mltiples variables enteras, no se
necesita declararlas
separadamente.
se puede combinar su declaracin en

muestra a continuacin:

_..: :::::./ c:!r- r!c_izquierdo,

una sola sentencia como se

digito_derecho;

En otras palabras, se pueden declarar variables en


una sola sentencia con la lista de
variables separadas por comas. El int especifica que
una variable entera se est
declarando se asigna espacio de almacenamiento de manera que
los enteros se
puedan almacenar alf i. En estas variables se puede
asignar cualquier entero vlido. Es
vlido asignar --:, -2-:: 1,* -901 a una variabre
decrarad corT.ro inr.
Tratar cje asignar un no entero, por ejemplo 3- 141
o er carctere, se asignar 3 65
(cdigo ASCII para el carcter a) a la variable.
A parte de las variables enreras se
pueden definir otros tipos de datos, como
una variable de nmero real o una variable de
prnio lcrante tal como se muestra a continuacin:
_---;a; pi, saf ario,.
Esta deciaracin crea dos variables de punto flotante que
pueden almacenar nmeros
reales cie la forma 3.747 o -0. o0o2s6. Los datos
son truncados cuando a una
variable entera se fe asigna un valor real.
Pero qu sucede si se hace lo siguiente?
pt = 2;
En ste caso, la constante entera z serconvertida
a la forma flotante 2.0 y asignada a
la variable pi. Es de saber que esta locatidad asignada
un l" rurJ;
una casilla

",

ms grande que lo requerido para una variable entera.


se han explicado los tipos de datos
y float. El lenguaje c provee otro tipo de
dato llamado char Este permite almacenar caracteres
constantes como las letras del
alfabeto A- z 'Z,losdgitos 0 - gyalgunos caracteresespeciales
como G,
$,
z
&, etc. Las variables char se declaran de la siguiente forma:

int

#,

Volumen 1:

FundametosE

Unidad 3:Programa

@ Copyright tBM Corp. 2005


Los materiales detcuqo no puden sr reproducidos
en larte
o en su totalidad sin el previo permiso escrlto de
lBM.

Introduccin a la

cnar vocal, consonante;


Las siguientes asignaciones
son vldas.

,a,;
voca]:
consonante = 'et;
vocaf : consonante,.

Nota: Las constantes caracteres estn


dentro de comif{as smples. se
!e asign la fetra
e (una vocal) a la variable consonante.
Esto
dado
que
no
existe signficado
alguno en el nombre de la variable,
"" "orr""io
ms que
su
tipo.
solamente
acta
etiqueta para poder referenciar
a una locafidad de memora. sin embargo,como una
programador debe escoger
un buen
un nombre de variabfe que;;;r;;
,';,-o=offio para er cual
adecuado tramar r" u"r"ire
sananci" v-r"roar alr fas
;:,fi:JiJil'::';r*:"es
"

5. Ms Acerca de fos Operadores


Hay que reordar que para haflar
el residuo de fa divisin de num entre
10, se us la
siguiente expresin:
num

- (num ,210)*

10

y no se utiliz la siguiente expresin:


num _ (num,/10)fO

;';il3:n:i::ffilrXff::: operador debe ser una parte expricita de ra expresn No


Los parntesis o en fa expresin
aritmtica anterior indica que la
expresin que se
encuentra en su interior se evaluar
primero. c ofrece un amprio
conjunto de
operadores para hacer la programacin
ms sencilra. por ejempro er operador
mduro
' se denota a travs del smbol g y
ste se usa paia ootener er residuo
de
una
divisin
hacer
uso de ste operador mduro directamente
tar como se muestra

::tffir::#:de

num

fr-- rr

r))

se lee num mduro

10

10, y

devuerve er residuo de ra divisin


entera de num entre
10
Er primer programa en c presentado
puede ser ahora reescrito basado
en la
discusin anterior acerca de declaraciones
y operadores.

'

El cdigo C comienza aqu...

1
2
3
4
5
6
'7
8

#include <stdio.h>
mainO i

/* Declaracin de varialles en una


so]-a lnea *,/
int num, digito_izquierdo, digito_derecho;
/* La variable n.m se inici-ait=.'"".-";';:.
de 2s */
num : 25;
/* El dgito j_zquierdo se extrae */
digito_izqurerdo = num / :aO;

Unidad S:ero

votumenl@
@ Copyright tBM Corp. 2005
Los materiafes del curso no pueden
sr reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.

o
o
o
o
o
o
o
o
o
a
o
o
o
o
o
o
o
o

o
o
o
o
o
o 0
o
o

c
o
o
o
o
o
o
o
o
o
o
o
o
o

o^
de
a

o
o
o

Guia dei Estudiante

ntroduccin a Ia pr

i * Er digi-to derecho se extrae utir-i-zando e1


operador mdu ro
3.g,ac_ie:echo -. :t lri : i0,.
E1 dg'i-to izq'ierdo se muestra en la salida
-|
estandar ./
-t ') "*
Drr-ntr ("r:1 drgito izquierdo es td\n", ciigi.rc
rzguierdo)
r? /* Er dgito
derecho se muestra en Ia sari. estndar *,/
!4
^-i*-r
(/rrrl -1 orgrto derecho es ?C\n',, digito derecnol
},rlrrL.i_
^-l

*!

,.

_5

..

Ef cdigo C termina aqu...

Nota: Los comentarios se escriben entre


/* y */,y ef compiladorde.C los ignora.
Los comentarios se usan para mejo rar la legibilidad
del programa. Es una buena
prctica escrbr comentarios para explicar programa,
el
ro cual tambin sirve como una
documentacin del programa. sin embargo,
evite usar comentarios triviales tales como.
,/* Asigrnar 25 a nu-n. -,/
num : 25;
.
/* Aarlir 1 a num */
num : nUm + 1;
Estos comentarios no aaden valor. A continuacin
se presentan otros ejemplos.
Nota: Es mportante resaltar que todo mensaje dirigido
a la salida estndar en un
cdigo en c trabaja con el alfabeto ingls lo que
imprica que no se pueden incluir
vocales acentuadas, fa letra ,', entre otros.

Ejemplo 3.2: Invertir ros Dgitos de un Entero de


Dos Dgitos
Asuma que se desea tomar como entrada un
entero de dos dgitos, invertir los dgitos
que lo componen y mostrar el resultado. Por
ejemplo, si la entrada es gg, entonces el
resultado ser 68. Er algoritmo para este probfema
es muy senciilo.
Paso l: lngresar un nmero entero de dos dgitos
num.
Paso 2: Ertraer el oiqiro_izquierdo.
Paso 3: Extraer el oigito cieecno.
Paso 4: usando el concepto de peso posicional
de enteros decimales, se puede
formar

num_.invertido como sigue:

num_invertido = digito_derecho *

1O + digito rzquierdo:
Paso 5: Mostrar el valor de num_inverti-do.
Esto es precisamente un algoritmo que necesita
ser convertido a C, tambin usa
algunos pasos ya discutidos anteriormente. Er programa
en c se muestra a
continuacin:

Volumen

l:

fuE-entos de C

Unidad 3:Prog

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden sr reproducidos
en parte
o en su totalidad sin el previo permso escrito
de lBM.

lntroduccin alaP

Gula del Estudiante

El cdigo C comienza aqu...

r /* Este progr:-a invierte los dgritos de un nmero de d.os d-qitos


usando eJ- operador mdulo *,/
2
#incl-ude <stdio. h>
3
nain O {
4
/* Sentencias de Dec].aracin */
5
int num, digito_izguierdo, digito_derecho. num invertico,.
6
/* Sentencias de Asigmacin */
= 89,.
digito_izquierdo : num /
num

1
8

J_O;

ve-su.lO: nUm 810;


10 /* EI n,oero con 1os d.gitos invertidos
es calculado *,/
11
num_invertido : digito_derecho-10 - drgito_izquierdo;
I2
printf ( "El dato original es %d\n", num)
13
printf ("E1 dato invertido es %d\n",:t:;:, i:verticio) ;
+^
^.i ^i

i^-^^L

,.

L4

El cdigo C finaliza aqu...

Fin de Ejemplo 3.2


Ejemplo 3.3: lnvertir un Nmero Entero de Tres Dgitos
El problema consiste en nvertir los dgitos de un nmero entero positivo de tres dgitos
dado y mostrar ef resultado. Lo primero es tomar algunos ejemplos para vsualizar si se

puede desarrollar una lgca del algoritmo.

Considere el nmero 134. Para exfraer el dgito ms a la izquierda, se divide el nmero


entre 100. Esto es,134/100 y se obtiene 1 que es el dgito ms a la izquierda. El residuo
de la divisin entre 100 es 34. Estos dos dgitos 3 y 4 son los dos dgitos ms a Ia
derecha- En el ejemplo anterior se aprendi a extraer los dgitos individuales de un
nmero entero de dos dgitos. Una vez que se tienen todos los dgitos individuales sean
digito-izquierdo, digrito_medio y diqito_derecho, se puede invertir el
nmero usando los pesos posicinales.

q,

El algoritmo que resuelve el probrema se muestra a continuacin:

Paso l: Dado como entrada el nmero de tres dgitos num.


Paso 2: El dgito ms a la izquierda es digiro_i_zguierdo

num/100.
temp diqito-j-zquierdo ? 100. Con esto se obtienen los dos
dgitos ms a la derecha y se almacenan en remp.
Paso 4: digito_medio : temp,/10.
Paso 5: digito_derecho : temp % 10.
Paso 6: num_invertido : digito derecho * 100 + digito mecio * 10

Paso 3:

+ digito_izquierdo.

Paso 7: Mostrar num.


Paso 8: Mostrar num invertido.
Unidad S:erog

Volumen

'1:

Fundamentos de

O Copyright tBM Corp. 20OS


Los materiales del curso nb pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso escrito
de fBM.

26

\\

of
a
o
o

oi
o
o
o
o

o
a
o

o
o
o
o
o
o
o
o

o
o

o3
o"
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o

c
o
o
o

Gua del Estudiante

-._._

Introduccin a la programacin con C

Siempre que un programa tenga una sentencia larga, la lnea se puede dividir
en
mltiples lneas. Cada lnea de la sentencia multilinea se termina con el carcter
de
diagonal inversa (\). Esta declaracin o expresin larga escrita en mltiples lneas.
terminada con un diagonal inversa, se trata como una sentencia compuesta.
Esta
facilidad permite escribir un programa bien formateado. El programa en C se muestra
a
continuacin:
El cdigo de C comienza aqu ...
1 #include <stdio. h>
2 mainO{
3
int nurn, dtg-ito_rzoui erdc, Crcito_riedlo,.
4
int digrto_de:echo, temp, nun inver:rcic,.
5
num : 734;
6 /* E1 dgito ms a 1a izquierda se extrae */
7
: nun / 100,.
digito_izqurerdo
8 /* Los dos dgrtos ms a Ia derecha se extraen * /
9
temp : num ? iOO;
I0 /* E1 dgito del medio se extrae */
11
dig'ito_medjo - -renp,/ iC,.
72 /* EI dgito ms a la derecha se extrae * /
13
digito_de::echo : i_enp ?. ,C;
14 /* El- nmero inverti-do se calcula. se usa eI carcter de diagronal
inversa Para sel)arar las s!-gruientes sentencias en dos 1neas */

15
I6
I1
!8
rg l

num-invertido : irg---c_cie:ec:-: - rco + dlgito medio *


+ digito_izquiercic;
printf ("El dai,c c:::qr:.a1 es : !,o\rr,", ium) ;
prtntf ("El dalo i::r-:::ii: :s : r.d.,..", num invertido) ;

10

Ef cdigo C finaliza aqu...

Se recomienda ir a travs de cada sentencla del programa en secuencia para diferentes


entradas, asignndole diferentes valores a ia variable num y observar cmo el programa
se comporta para diferentes valores. Se puede pensar en otro algoritmo para realizar
la misma tarea?.

Fin del Ejemplo 3.3

Antes de seguir con otros ejemplos, se explca cmo convertr el programa C


cdigo que entienda la mquina.

Volumen 1: Fundamentos de C

Unidad 3:Programacn en

C-Lm

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden ier reproducidos en parte
o en su totalidad sin elprevio permiso escrito de lBM.

un

6- compilacin de programas Hechos


en Lenguaje

En Linux la compilacin se hace usando programa


ef
cc, que genera un archivo a.out si
el programa compita sin errores. El compil"ori
ces
cc, y toma el nombre del archivo
del programa en c como un argumento. La
extensin que se usa para los archivos que
contienen un programa en c eJ.c. A continuacin
se presenta el siguiente ejemplo:
cc nombrearchivo. c

El archivo a'out que genera cc es el archivo


ejegutabte y puede ejecutarse como otros
programas en el sistema Linux. Para
ms infrmacin i"r." oe comprador,
use las
pginas man de Linux.

Ejempfo 3'4: Convertir la Temperatura de Grados


Fahrenheit a Grados celsius
Escribir un programa que tome un nmero que
representa grados Fahrenheit, lo
convierte a grados celsius y lo imprime.
sea la entrada la varible fahrenheir que
representa el nmero en grados Fahrenheit,.
Se puede convertr el nmero dado de
grados Fahrenheit a grados cersius
usando ra siguiente frmura:

cel-sius : 5 * (fahrenheir _ 32 ) /

El algoritmo en s mismo es simple y por tanto


se escribir directamente el programa c.
Ef cdigo C comienza aqu...

1 #incl_ude <stdlo. h>


2 tnt ma-i-n (voj_d) {
3
float ceJ-sius, fahrenhe:t;
4 /* Iemp,eratura en Fahrenheit */
5
fahrenheit : 9g.1;
6 ,/* Te>eratura en Celsj-us */
'7
celsius : 5* (fah:-enhei-- - 32)/9;
B /t Se muestran 1os datos por 1a saf-irt: estndar */
9
p:lrti ("La .-er..e:ru:a if Fahrenheit es.
eguivalente a ?f \
10
cersius\n,,, fah:e::heit, cef sius),.
11 l
Ef cdigo C termina aqu...

En este ejemplo, se. utiliz el tipo de dato float por


primera vez. Este tipo de dato puede
almacenar valores decimales rales. En la
sentL""
pirtr se nota que en la cadena de
formato contiene un o/of, el cual indica que
un tipo float ser impreso. siempre que se
desee imprimir un tipo de dato float, se debe
usar o/of en ra caden o" io-"to del printf.
Nota: El cdigo anterior usa 'int main (void),
en sustitucin de ,main o , debido a
que son equivalentes' Es importante mencionar
que la funcin prn"ip"i por defecto
devuelve un entero y no est definida para
recibir argumento arguno.
Fin de Ejempfo 3.4

Unidad 3:Prog

Volumen

i.

Fundamentos dEE-28

Copyright tBM Corp. 2005


Los materiales del curso no pueden sr reproducidos
en parte
o en su totaldad sin el previo permiso
escrito de f BM.
@

o
o
o
o
o

Gua dei Estudiante

Introduccin a la programacin ccn C

Ejemplo 3.S: Calcular el rea de una Circulo Dado el Radio


El siguiente programa en c calcula el rea de un crculo
dado el radio. El algoritmo es
simple, ya que se conoce la frmula para calcular el rea
dado el radio del circulo. El
rea de un crculo vienedado porlafrmula, Area rf .
Donde Tres aproximadamente
=
3'14159 y r es el radio de la circunferencia. El programa puede
escribirse como sigue:
El cdigo en C comienza aqu...

o
o
o

1 #inc]ude <stdio. h>


2 inr main (void) {
3
f -l oa! area / raot
4
r:ad o : 32 . 15:

o
o
a

o
o

5
6

o,.

at:ea : 3.14159 * ac-:


printf ( "para e-l :ad:c

/j

.,

, :-cic,.
: , = r area es :

o
o

El cdigo C termina aqui...


Fin de Ejempto 3.S

Ejemplo 3.6: Cafcutar ef Inters Simple de un Monto Dado


Escribir un programa en C que calcule la cantidad a pagar
del monto principal para un
nmero de aos especficos a una tasa de inters dada.
Se asume que las variables se
llaman: interes_a_paE,ar, itir:::.r-pa_1 , tiempo y
tasa.

f:

o
o

Se sabe que:

rnteres

:0
o

a-paja:

=::_.

- tiempo * tasa/100

El programa que realtza los ciculos es ef siguiente:


El cdigo C comienza aqu...

o
o
o
o
o
o
?
a

P
P

p
p

t lh
llLt
rtf

b
O

15

-::- :

':

El inters a pagar es calcu1 ad.o */


' :.:e:-es_a_paga: : principal * tiempo *
tasa /IOO;
Los detalles del i_nters a >agar se muestra.r +/
p:r-ntf ("Principal-: %C\n", principal) ;
prrntf ("Numero de anios: ?d\n,,, tiempo)
prrntf ( "Tasa de interes: ?f \n", tasa)
printf("\nCantidad de intereses a pagar: Bf\n,,,
\
interes_a_pagar)
,.

,.

1'1

,.

Volumen 1: FundametosE C

Unidad 3:ProgramacO

@ Copyright tBM Corp. 2005


Los materales dercurso no pueden sr reproducidos
en parte
o en su totalidad sin el previo permso escrito de lBM.

Gufa del Estudiante

Ef cdigo C finafiza aqu...

Para la cadena de impresin


de la sentencia printf , se usa zd o
zf de acuerdo ar
orden y af tipo de variables que
se est imprimiendo. n-qu, la primera
variable a imprimir
es principal, que es un int,
luego tiempo, que tambin es
un
int.
cuando tasa y
interes-a-pagiar se van a imprimir, se usa
zf yaque ambos son dertipo f toat.
Fin de Ejempto 3.6

El uso de ros caracteres de cadena


de formato se.muestra en ra Tabra
3.1.
Cadena de Formato

int (notacin decimalcon signo)


int (notacin decimat coi@orcctaf

hexadecimal)

zx,

int (notacin octal sin signo)


int (notacin hexadecimal sin signo)
irt (notacin decimal sin signo)

zx

?f ?e

?;E Zq

?G

'.F

,_:i5-:

;-

fabla 3.1: Cadenas de Formato para


>rrntf y scanf
Ef uso de secuencias de caracteres
de escape se muestra en raTabra
3.2

I
.l
I

\b

Carcter de alerta (timbre

Retroceso

(Bactspacj

Retomo de carro
Tabulador horizontal

Tabla 3.2: Secuencias de Escape


Unidad a:erog

Volumen

i:

Fundanentos OECJO

@ Copyright tBM Corp. 2005


Los materiares dercurs rib pueden
si prooucidos en parte
o en su totalidad sin elprevio permiso
escrto de lBM.

O
O
Guia oel Estudante

o
o

.l
a

Ahora que ha completada esta unidad, Ud. debe ser capaz de.
. Establecer la evolucin de C.

.
.

Discutir cmo escribir algoritmos en C para solucionar problemas simples.


Explicar las diferentes componentes de un programa C simple.

.\--

-).vtr\
\

r-. l':

\,.\J

'\--

\.

1 ,

..-.)\

*+

\'.r ).r

:\1

'*.-'-\

O^
.R
?v

o
o

.. "\..
.

--: \i

-\
r,- J

!;l)

\.

\-\\r

---:--_,

c
o

_\')-.s')

\-- \ *-.> l\

. \-_ti\

--f)

\. i'<---

"

r9-

j'.\

o
o
O

t
f

Ip
b

I
I

p
lt s,
r,rL!
-tE

IL

Resumen

a
a
o
o
o
o

a
o
o
o
o
o
o
a
a
o

lntroduccin a la Prooramacin con

Voiumen 'l: Fundamentos de C

Unidad 3:Programacn en C

- Los Primeros

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden ser reproducdos en parte
o en su totalidad sin el previo permiso escrito de lBM.

pasos

3.1

--.

-l

Introduccin a la programacin con

Gufa delEstudiante

Unidad 3: Examen de Autoevaluacin


1) Cada lnea de cualquier sentencia multilnea en un cierto
cdigo se termina con el
carcter de diagonal (/).
a) Verdadero.
b) Falso.

2)

Asumiendo que a' b y c son todas variabtes declaradas del tipo


las siguientes expresiones aritmticas son conettas?

int,

Cules de

a) b+I-723*a/c
b) a++b
c) a (b+c)
d) b/a

3) cules de las siguientes sentencias de asignacin son vlidas?

a)x:x-1;
b)a+b:a-b;
c) (a) :b+7;
d) x : y * y * y;

4) A quin se le acredita el desanollo del lenguaje C?


a) Martin Richards.

b) Bll Martin.
c) Dennis Ritchie.
d) Ken Thomson.

0l

5) En qu ao fue desarroltado el lenguaje C?


a) 1970.
b) 1971.

c)
d)

1972.
1983.

6) un nombre de variabre en renguaje c no puede empezar con


a) Un dgito 0 de g.
b) Una letra del alfabeto en minscula.
c) Una letra del alfabeto en mayscula.
d) Un carcter especial como S o % o &.

Unidad3:Programacffi

Volumen 1: Fundamentos de

Copyright IBM Corp. 2005


Los materiales der curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

a2

I
o

a
o
lr
:t
ov
o
a
o

o
o
o
a
o
a
o
O

o
o
o
a
a
a

IJ'
!tv

o
o
o
o
a
o
o
o
o
o
o
a
o
a
o
o
o
e0

o
o
o
o

;- : cei Estudlante

"cual

Introduccin a la Proqramacin con

de los siguientes tipos de parntesis se permiten en una expresn aritmtica?

b) Il

c) o

a) Ninguna de los anteriores.


8) Cul de los siguientes smbolos se usa para separar las sentencias en un programa
en C?
a) Punto (.).
b) Punto y coma (;).
c) Dos puntos (:).
d) Ambas (a) y (b)
9) Cul de los siguientes no es un tipo de dato vlido en C?

a) int

b)

c)
d)

float
char
text

10) sea x una variable entera. cul ser el resultado de la asignacin


a) 0.33
b) 0.30

r/3?

c)0

d)

Un valor indefinido

Volumen 1: Fundamentos de C

Unidad 3:Programacin en C - Los Primeros pasos 33

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

Introduccin a la Programacin con C

Respuestas a la unidad 3: Examen de Autoevatuacin


1)b
2) ayd
3) ayd

4)c
5)c

6) ayd

7)c
8)b
e)d

l0) c

0;

Unidad 3:ProgramacOn

effi

Volumen 1: Fundamentos de

@ Copyright tBM Corp. 2O0S


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

o
O

o
o

-:-r cl Estudiante

o
o
o
o
o
o
o
o
o
o
o
o
o
a.

Slidos en C
Objetivos de Aprend izaje
Al final de esta unidad, Ud. ser capaz de.

'

Explicar cmo escribir programas que tomen una entrada simple usando la
funcin scanf.

Discutir las reglas que rigen fa creacin de nombres de variabies.


Discutir las propiedades de algunos de los tipos de datos primitivos predefinidos.en C.

a
a

Describir las propiedades y usos de varios operadores aritmticos.


Describir la jerarqua de las operaciones o precedencia de operadores en una
expresin aritmtica.

cr

o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o

a
o
o
o
o

Unida d 4: Construir Fundan'lentos

o0

o
o
o
o

Introduccin a la Proqramacin con

Volumen 1: Fundamentos de C

Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

en C 35

lntroduccin a fa

l.

acin con C

Gula del Estudiante

ntroduccin

En la unidad 3: Programar
enc - Los Primerosp^1os,
los datos de entrada
se escribieron programas
estaan drsponibfes p;;;;;i
donde
programa
asignacin' Esto no es
a travs de una sentencia
ioear, y" qr" tiene varias'lmiacon;.';;;
de
ejempro, se desea

:i T['i:"1
oir".J",5i ri e n e q u e e d ta
",", compifarfos
rcesarios,
". y oot.n"i r
versin ejecutabfe o" "T
progt"r;

:'?ffi[

:: "^:#*:

t itij:.,'f

,nl

.
2. Aceptar Entradas def
Usuaro
nuevamente.

En la tJnidad 3: Programar
en
los datos de entrada

c - los Primerospasos, se
escribieron programas
estaoan'olponiotes p"rt"t
donde
programa
asignacin' Esto no es
a travs de una sentencia
ioear, ya que tiene varias
de
rimitaciones. si, por elempfo,
ejecutar el programa
con un cnjunto o" u"ior".-iu
se desea
0",o, diferents, se tiene que
editar
s a ros,
il,.3ii ;1I.1,,:T:';"
pr,.r o, y obte

?":;"

*: :l*: iff

"::e

Lo que realmente se necesita


e o s e e m e n to s . ; ;

p ro p o rc i o n

ner

"o,

un

";; ;l;':J :fi i lli; i,ff" ","ffir"li" [1 "ril" Tffi:


::'""ffi; ilT,j;jx:u:: Ljjff
d se
nd
n
o,"r,
; ::, i:*:id
"0,
Existen muchas
I

a p re

e r

funcones incorporadas
como la func.,

:Jfi ,fff

?i.J?'Jilffff ::g:,,g*i;#::::i".i',li;,J,1;'i:: jju:'?i"j

#inc_l-ude <stCro. h>


Esta sentencia es esencial
en el n
de compitacin def programa.
' una directiva ar compilador de atomento
En realidad es
estndar oe
que
constituye
una de ,
ta tibrera
a esta fibrera s printf.
De las funciones propias
de la librera stdio.h existe
una que permite obtener
ra
ra r,n"on scanr
's,"'"on"idera un escenario donde
se
variable flamada num
se puede
en una

rr*'1"::Trf,!:ilJ:g:n'"'a

;::'i1til::::il:'"";ff:

"r'"""narro

";.:[?1""f:j#:H"

scanf (',9d,,, &num) ,.


"n;uv
cuando esta funcin,se
ejecuta, se espera que
er usuario
vez que ef vafor se obtiene
oi,tr"ro, urtJ r ;;;."" ingrese un entero vfido. una
num' La cadena de caracte;";;;;"ada
en ra variabre entera ffamada
en comifras en et scanr
formato' ca indica que
se ,ama cadena de
un
'ubcacin'de fa variaole entero decimar ,, ;;;;';.
La funcin scanr requiere
ra
''t* en-.,i"?or", o" r"nur"-q*ue

i"*io,''"i']

pueoa atmacenar er
varor
n""" ustamenle esto, pasa en
la

iii&1it;9;,iJ"l,tilmm*"' '"
.':;::"H:;T::i[U*:":,*,Ti:,SilTH"';lTiJ,J,;tifu

i;:T_"j:

Unidad '
Vofumen

l,

punOamentos

O Copyright IBM Corp.


2005

Los materales delcu

oensu,o,",,o"o'!?li,"r?J,:ff

trJ:tJ3j,i3i""',El,l,n"

e C

36

o
o
o
o

o0

o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o

3a
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

dl
o
o
o
o

Gua del Estudiante

Introduccin a la Programacin con

Ahora, asuma que se desea leer la entrada del usuario en dos variables pesc ! e.r:j
donde eiai S de tipo de dato rnr- f pe-sc s :-.,:-,. Se debe usar las siguientes

sentencias:

scanf ( " gd", &edad) ;


scanf ( ,'% f ',, &peso )
,.

o/of

Note que se usa


para leer peso ya que es de tipo float. En esta unidad, se discute
cmo obtener las entradas del usuario. Se aqumir que todas las entradas del usuario
para los programas son vlidas. Las valdaciones de las entradas del usuario se discute
en el Volumen 2, Unidad 1 - Estructura de Control de Decisin.
Considere el siguiente ejemplo:

El cdigo C comienza aqu...

-)
-

t -- \
t-11,r)
--

tn:lucie

<s-_

i_

. h>

3
in: e':ut:a,1 i - Se tona eI valor de 1a variable como entrada del usuario
5
sca.-i i"?C", &altura)
/- Se impr:-me dicho walor en J-a salida estndar */
7
c:-:,:j ("?d\n", altura);
Ei

,.

El cdigo C termina aqu...


Este programa espera por la entrada del usuario cuando se ejecuta. No se le indica a
los usuarios si ellos deben ingresar un tipo de dato entero, flotante o carcter. Tampoco
se le ofrece una indicacin (promptl de que ingrese una entrada apropiada. Sin
embargo es buena prctica de programacin indicar a los usuarios que Ingresen un
valor corresponCrente a lo que espera el programa.
Considere el siguiente cdigo. Cuando el programa se ejecuta, se le indica al usuario
que Ingrese un valor mediante la primera sentencia prinrf que se ejecuta. De esta
forma el usuario puede ingresar la entrada que el programa requiere. La salida

mcstrada es ciai-amente til y no simplemente un nmero.


El cdigo C comienza aqu...
=_

^ --: ' :

-_

:_

_.

:-:

=____-l

/- Se le rndrca al usuario que hacer "/


a:':-i: 1".;E:ese su altura en cent j_metros\n',);
/* Obtener eI valor de Ia variab]-e cono entrada de1 e1 usuario
qenf
I tt9Atl
&aftura);

8 /* rnprinir el walor de l-a variable a 1a sarida estndar */


9 printf ("La al-tura en centimetros es ?cl \n". l-_ura)
10 )
,.

El cdigo C termina aqu...


Volumen 1: Fundamentos de C

Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

en

C 37

Introduccn a la programacin con

Gufa del Estudiante

-Ejempto 4.1: Extraer los


Versin Revisada.
EI primer programa desarollado fue tomar un
entero positivo de dos dgitos, extraer el
dgito ms a la izquierda y el dgito ms a la derecha
e imprimirlos. El nmero de entero
de dos dgitos estaba disponible para el programa a
travs de una sentencia de
asignacin de la forma num
25.
Se puede mejorar el programa tomando la entrada
del usuario.
El cdigo C comienza aqu...
1 #inc_l-ude <stdio. h>

2 mainO {
3
int num, digito_izguierdo, digito_derecho;
4 /* Se 1e indica a1 usuario que hacer */
5
printf ("rngrese un numero positivo de 2 digitos\n,,),.
6 /* obtener el walor de 1a varia-ble como una entrada
de1 usr::-ia
7
scanf ( "?d"/ &num) ;
B /* E1 dgit.o izquierdo se extrae */
9
digito_izquierdo : nurn / IO;
10 1* E1 digito derecho se extrae *,/
11
digi-to_derecho : num - 1num,/ 1O ) * 10,.
72 * Se muestra cada clig.ito obtenido *,/
'1 ?
^-r --r
rr
prrnti
(/ 'r"El dtgito izqu_:-ei-do es:
?d\n,,, digito_izguierdo) ;
74
printf ("Fl drg:to deecho es: %d\n,,, digito derecho)

t5

*/

,.

El cdigo C termina aqu


Fin de Ejempto 4.i

De igual forma, se pueden mejorar todos los programas


escritos en la lJnidad 3:
Programar en c - Los Primeros Pasos. Estos e;emptos
son revisados y se presenta el
programa modificado de algunos de esos
cdigos a contnuacin. Muchos de estos
programas son auto explcativos.
Ejempfo 4'2: convertir la Temperatura de Grados
Fahrenheit a Grados celsius
El cdigo C comienza aqu...

'

I #include <stiio. h>


2 mainO {
3
float ce_Ls:._s, f ahre:r.l-^e-:,.
4 /* Indj-car a1 usuarj-o que j_ngrrese 1os rtatos -,2
5
printf ("rngrese 1a temperatura en grados Fahrenhei-t\n,,);
6 /* obtener e1 valor de 1a varj-alle como entrada de
usuari-o */
7
scanf ( "?f", &fahrenhej_t) ;
8 /* r-a temperatura en grados celsius es calcurada, */
9
celsius = 5"(fahrenheit _ 32)/9;
10 * La tem.peratura en grados CeJ-sius y Fahrenh
et *
11
printf('La temperatura %f Fahrenheit es : Ef /
en cersius\n,,
unidad'

constru@
.

Volumen

Fundamentos de C

O Copyright IBM Corp. 2005


Los materiales del curso no pueden
ser reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.

?n

o
o
Gua del Estudiante

o
o
o

!.:

o
o
o
a
o
o
o

fahrenheit,

Introduccin a la programacin con

cer,sjus

El cdigo C termina aqu


Fin de Ejemplo 4.2

Ejemplo 4.3: calcular el rea de un crculo Dado el Radio


El cdigo C comienza aqu...
1 #rncl-ude <stdio. h>
2 marnO {
3
f loat area, radi o,.
4
Indicar aJ. usuario que l_ngrese 1os datos */
5
printf ("Increse e_L raC. c ie -l-a ci rcunf eencla\n,,)

o
O

o
o
a
o
o

obtener el valor de Ia vanable como entrada del usuario * /

7
scanf ("%f',,,iradio);
8 /* Calcular e1 rea del crc1o -/
9
area : 3. 11159 * rad.io - :acii_c,.
10 /* Se muestra el radio de entrada y rea cal_culada */
11
crlntf ("\n El radio ingresacio es: n.r,,,:aCl-o);
72
Prlntf ( " \n El area es : .: " , are) :

o
o
o
a 0
o
O,

o
o

t<

El cdigo C termina aqu

Fin de Ejemplo 4,3

fE bmplo 4.4: Calcufar ef Inters Simple de un Monto Dado.


El cdigo G comienza aqu...
j
-)

#inclucie <stdic.
.tta--:
-_

I *

/ I
1

h>

I
1

oi
oi
l

ol

q
ol
ol

.l

I?

?
?

a:-:.:i1"I:.::ese

:.*::.::: 1;: a::.3.\n"),.

::-<: ce ' ::-;=:es, como val_or rea.l-\n" ) ;


-.:=::j (,'r-:,,, :aSa.
,/ - ClcuLo de1 inters
a pagar + /
::tte:es_a_pagar : mon:o * :.t_emDo * tasa / IO0;
/- Los detalles de1 inters se muestran en 1a salida estnd.ar */
printf("Tota1
de] interes sobre el_ Monto gd Anios \
%d Tasa de fnteres %f es %f \n,,, monto,
\
tiempo, tasa, interes_a_pagar),.
,.

Volumen 1: Fundamentos de C

Unidad 4:Construir Fundamentos Slidos

@ Copyright tBM Corp.2005


Los materiales dercurso rio pueden sr reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

en

fntroduccin a la programacin
con C

Gufa del Estudiante

Ef cdigo C termina aqu

;fiff;:'::A:'

usuario v fa entrada det usuario


hace que er prosrama sea ms

Fin de Ejempto 4.4

continuacin se presentan algunos


conceptos fundamenta,res como
nonrbres de
variables, constantes, operadores
y expresiones con un poco
ms de detare.
Ejempto 4.S: preguntas f ndiscretas.

con este programa se pretende inte'ogar


indiscretamente
sobre interrogantes de gran
importancia urtrdrti"" y social
El cdigo C comienza aqu...
1
2
3
4
5
A
u
7
B

a un grupo de personas

#inc.lude <stdio. h>


mainO i

int edad;
f-loat sueldo;
/* Ind.icar al usuario que ingrese
1os datos */
/ r'^
pr.LDtr
^-; ! ("Confiesa
t.u edad y sue-l_do actua-l_ \n,,),.
scanf ("?d ?f ,,, &edad, &sue_ldo)
;
/* ros datos adquiridos ,,or teclados
son mostrad.os por pantar_la _/
("Su edad es: zd, y su
suerdo: ?.1f do_lares \,:r,,, etr= j, s-^e-dc)
:, Jprintf

El cdigo C termina aqu


En el cdigo anterior fa funcin
scanf se usa con dstntos tipos de variaores
La variable edad usa una cadena
a ra
de,ro.mato "2"'v'"""r do o/of. Especficamente vez.
sueldo el ltimo printf permite
en el
establecer
decimares del nmero flotante
desean ser mostrados, es
"r"nto"
sro se mortrrri
,n nico decimar.
"ttu
"*o
Al introducir dos o ms datos,
stos,*1"::1"r separados por caracteres
(el carcter de nueva tnea
de espaciado
se .onriour" como un carcter
de espaciado).
Los caracteres consecutivos que
no sean espaciados componen un
limitar el nmero de los
dato. Es posible
especiricanoo ,n" lngtud mxima
para
dato puede estar compuesto
ese dato. Er
""t""tJlr
por menos caracteres de fos q.ue
especifique ra rongitud y
no se leern los caractet". qr"
ms ari-JJ"n"
cuenta que en este caso los
"ttn sobrant", pru"n rongitud. Hay que tener en
caracieres
ser interpretados de manera
errnea para er siguiente o"to. gn
l" siguiente instruccin:
scanf ( "?3d ?3d ?3d", &a, &b, &c)
;
Si se ingresan los datos: 1 2
3 fas asignaciones son: a=1,
b=2, c=3.
si se ingre sa 123 456 7gg ras asignaciones
son: a=123,b=456, c=7gg
si se ingre sa 1234s67g9 ras asignaciones
son: a=123,b=456, c=Tgg

Unidad : Con

Volumen 1: Fundamentos de C
Copyright tBM Corp. 2005
Los materares der curso ro pueden
sr ieprooucidos en parte
o en su totalidad sin elprevio permis
escrito de lBM.
@

40

o
o
o
o

o0

o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
^_'((l
o\z
O

o
o
o
O

o
o
o
o
o
o
o
O

o
o
o
o/^

o
o
o

Gua del Estudiante

Introduccin a la Programacio con

Si seintroduce1234 56T8glasasignacionesson a=123,b=4,c=S6T y los otros dos


dgitos restantes (B y 9) se ignoran, a no ser que se lean a continuacin en otra

sentencia scanf

Fin de Ejemplo 4.5

3. ldentificadores de Variables
Como se aprendi en la lJnidad 3: Programpr en C
ciertas reglas para los nombres de las variables

Los Primeros pasos, existen

Los nombres que se le dan a los elementos de programacin de C como constantes,


variables y funciones se llaman identificadores. Cuando se crea un nombre para una
variable, se tiene un identificador de variable. Observe la siguiente declaracin:

rnt

emp,.

Esto implica que temp es una variable entera ! temo es un identificador de variable. Los
identificadores pueden usar caracteres. del alfabeto en mayscula as como en
minscula. Sin embargo, los programadores generalmente usan letras minsculas para
los identificadores de las variables. Por otra parte, la siguiente declaracin crea dos
identificadores distintos:

int temp, Temp;


Los identificadores pueden empezar tambin con el carcter subrayado a Sin
embargo, esta no es una prctica comn. Unas cuantas recomendaciones se dan a

continuacin para ayudar a escoger el nombre ms apropiado para una variable.

Escoja nombres de variables que reflejen fa naturaleza de su uso. Los identificadores


sal-ario-basico, ded_imp, cuentaLelf tal vez revelen sus usos inherentes al
reflejar salario bsico, deduccin de impuestos y cuenta de telfono. Sin embargo. Los
nombres de identificadores no tienen ningn otro significado son slo nombres.

Por ejemplo, se puede almacenar el peso de una persona en un identificador llamado


ganancia, pero esto no tiene mucho sentido. Se debe evitar el uso de nombres de
variables como xl2pq34, zxyplz, o el nombre de una mascota, que no reflejen el
uso apropiado. Algunas implementaciones de C permiten slo ocho caracteres,
mientras otras implementaciones permiten 31 caracteres. Es importante desarrollar el
hbito de formar nombres de identificadores que no sean muy cortos ni muy largos y
que sean significativos.
Los identificadores de variables no pueden ser iguales a las palabras reservadas de C
como lnt, float o main. De hecho, las palabras reservadas en C estn en letras
minsculas. No se puede declarar fi-oat como un identificador. Pero se puede declarar
lo siguiente:

l-oat Float;
Tambin se puede tener un identificador tlamado rt-oat. Sin embargo, esto

crea

Volumen 1: Fundamentos de C

C 41

confusin- Por tanto, es mejor evitar el uso de estas palabras. Los siguientes nombres
son identificadores vlidos para variables:
Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

en

Introduccin a la programacin con


A

Gufa delEstudiante

J s.v

KZOZ

q: I : rr

bill_1

SAMPLE

nrrf

Los siguientes nombres no son identificadores vlidos para variables:

9c1oud
salary$
by-pass
first name

No comienza con una letra.


lncluye un carcter especial..

lncluye un carcfer no permitdo


lncluye un espacio.

_.

Considere los siguientes nombres de identificadores:

int administrador_memoria, administracion_memorra,.


Se pueden originar varios problemas con estos nombres de identificadores,
aunque de
acuerdo con las reglas para formar los nombres de identificadores,
estos son
perfectamente vlidos. Si se ejecuta el programa en una
mquina cuyo compilador
acepta slo los primeros ocho caracteres del identificador como significativos,
ambos
identificadores tendr el mismo nombre y por tanto no sern tratados
corno distintos. Es
aconsejable que los nombres de los identificadores sean los suficientemente
largos para
que sean significativos y lo suficientemente cortos para evitar problemas.
A continuacin se aprender acerca de los tipos de datos bsicos en c.

4. Palabras Claves en C
En C, como en cualquier otro lenguaje, existen una serie de palabras

que el usuario no puede utilizar como identificadores (nombres de cfave (keywords)


variables ylo de
. funciones). Estas palabras sirven para indicar al computador que realice una
tarea muy
determinada, desde evaluar una comparacin hasta definir el tipo
de una variable, y
tienen un especial significado para el compilador. El C es un lenguaje
muy conciso, con
muchas menos palabras clave que otros lenguajes. A continuac-n-s" psenta
la lista
de las 32 palabras clave del ANS!,C, algunos compiladores aaden otras palabras
clave, propias de cada uno de ellos. Es imprtante evitrlas como identificadores:

cnar
con

^t ^^
saE

int
long

struct
switch

enum

q1-uL!
rct
r
!v!:ro

fLyPsusr
rrna-l^r

doub-l-e

x-^ - r-

extern

st

return
short
signed
sizeof
static

I Vq L

nn!.i
vv.u-tUC n'.^

for

UgIdUIL
^^a-,-l+

goao

do

if

Unidad 4: Construir Fundamentos Siidos en C

union
unsigned

void
vol_atile
whil_e

Volumen 1: Fundamentos de C

Copyright tBM Corp. 2005


Los materiales dercurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

42

o
o
o
o

Gua del Estudiante

5. Tipos de Datos Bsicos en

arl

o
o
o
o

o
o
o
o

o
o
o
o
o
o
o
O

o
o^
tt'

o
o
O

o
o
o
o
o
o
a
o
o
o
o
o
o
o

t
o
a
o
o

Introduccin a la programacin con C

CO

Antes de continuar se debe entender qu es un tipo de dato. Generalmente,


cuando se
le pregunta a un estudiante qu es un tipo de dato, la respuesta ser ,un int,, ,un
-char'o'un float'- Sin embargo, esto no explica nada acerca del trmino tipo de dato.
Entender el trmino ser de gran utlidad. Un tipo de dato se define
como un conjunto
de valores y operaciones definidas para las var[ables de ese tipo en particular.
Los tipos de datos bsicos en C son int, f loat, char y double.
int es un tipo de
dato y define el conjunto de valores que una variable del tipo inr puede
almacenar, y
tambin el conjunto de operaciones que se pueden usar con tos operandos
enteros.
fl-oat es un tipo de dato dado que define un conjunto de valores, aunque estos
no
pueden serenumeracos como en int, y las operaciones
definidas para esetipo. para
f]oat, las operaciones definidas son +, , *, /. Sin embargo % noest definida.
Cada uno de los tipos de datos bsicos se almacena en forma diferente
en la memoria
de la computadora. Los requerimientos tipicos de memoria para los tipos de
datos
bsicos en C se presentan en la Tabla 4.1. Sin embargo, el nmero de
bytes realmente
asignados para los tipos de datos especficos puede variar de un modelo
de
computadora a otra.

provee el operador sizeof que permite determinar el tamao


de cada tipo de dato
que es soportado por el hardware subyacente.

,^
J

Tipo de Dato

ll

\ n InI
) {f
xi Float
l
C)

(l

\P \-l
(.\r

Double

/.1r.^.
vrrd

a)

Descripcin

Requerimientos
tpicos de Memoria

Entero

2 bytes

Nmero de Punto Flotante

4 bytes

Nmero de punto flotante de


dobie precisin

B bytes

Carcter simple

1 byte

4.r: Tipo de Datos y Espacio Requerido en Memoria


Los caracteres se representan a nivel de mquina como un entero. para
hace) esto. fas
computadoras utilizan el cdigo ASC|l, que tiene un entero estndar
asociado para cada
uno de los caracteres en el rango de la a-2, A-Z-, o-g y todos los caracteres
especiales
como $, oA, * y &. En un solo byte una computadora puede almacenar
nmeros en un
rango de -128 a +127 - Debido a que todos los cdigos son
enteros positivos, se pueden
representar 256 caracteres usando un byte. Los valores utilizados
van desde 0 hasta
255' A-z (maysculas) estn representados desde 05 al g0 mientras que
a-z
(minsculas) estn representados desde 97 al 122. En
cualquier libro de texto de C
encontrar el cdigo ASclt completo que usa una computadora
moderna.
Tabra

Volumen

l:

Fundamentos de C

Unidad 4:Construir Fundamentos Slidos


@

Copyright tBM Corp.2005

Los materiales del curso no pueden sr reproducidos en parte


o en su totalidad sin el previo permiso escrito de lBM.

en

C 3

Introduccin a la progranlacin con

Gufa gel Estudiante

5.1

Calificadores de Tipos de Datos


Los tipos de datos bsicos pueden modificarse usando
calificadores de dato.s. Los
calificadores de tipo de datos son short, long, sigrned
y unsi.gned. Las variables
enteras pueden ser calificadas como short int, long
int,
int o
unsiqned int- Estas variabfes tambin se pueden escribir comosigned
short, longr o

unsiqned para referirse de forma automtica a enteros. Generalmente,


short requiere
menos memoria que slo int, mientras que rong requiere
memoria que slo
int ' Todos estos son dependientes del compilaoor y debenms
ser verificados por el
programador' Un unsigned int utiliza el mismo
espacio de memoria que inr pero
permite almacenar el doble de nmeros.

El calificador unsigrned puede ser agregado a short int


! lonq .r-nr como
unsiqned short int o unsigned lonqr ii:. Algunos compiladores
permiten
que long se pueda usarcomo un calificadorcon
itoat y double como long ffoat
y rong doubre - El significado de estas declaraciones es

compilador que se use.

siempre dependiente del

Diversos compiladores de c tratan a estos calificadores


como tipos de datos diferentes,
por ejemplo long f f oat puede ser lo mismo que
double. y longr doub-l_e puede
ser lo mismo que double o incluso un tamao mucno mayor
al double. un
principiante debe estar siempre atento a que estas
cosas son posibles.
A continuacin se muestran algunos de los beneflcios de
los calificadores
de datos:

Si en un programa se requiere alta precisin para nmeros


de puntos flotantes, se
puede usar el calificador long. As, deciarar
una variable de tipo double ser diferente de
declarar sta como un long double. Para nmeros de punto
flotan long
double

proporciona mejor precisin.

En ciertas aplicaciones, el tamao del programay la memoria


que ste requiere deben
mantenerse al mnimo. si el programa fue a eietutarse
en reloes de pulsera u hornos
microondas inclusive, la memoria definitivamente es
muy pequea. En estos
escenarios, los calificadores short se usan para optimizar
ta memoria disponible.

6. Constantes en C
Existen cinco tipos de constantes en C. Estas son:
Constante enteras.
Constante de punto.flotante.
Constante de carcter.
Constante de cadena.
Constante de enumeracin.

o
.
.
.
.'

A continuacin se discuten los primeras cuatro tip.os de constantes.


El ltimo tipo de
constante, los enumerados, se exprica en el vorumen
6 tJnidad 3: Caractersticas

Adicionales de C.

Unidad 4: Construir

funffi

Volumen 1: Fundamentos de C

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.

44

or

tl'
ol

Gua del Estudiante

6.1

!,c
I

a
q
q
q
a
o
o
o
o
o

Estos pueden ser escritos en tres sistemas numeracin diferentes.

.
.
.

Algunas de las constantes decimales vlidas son.

o
o
o
O

o
o
a
o
a
o
O

-234,

4518

Las siguientes son constantes decimales invlidas

1)?

Las constantes decimales no pueden empezar con 0.


Contiene una coma.

2?S

Contiene un carcter esoecial.


Contiene un guin.

23-

Una constante octal pertenece a la base 8, donde los dgitos 0 y 7 son vlidos. para que
un octal sea viido. debe empezar con un 0 (principalmente para distinguirlo como un
octal) y seguido por cualquier combinacin de dgitos O a 7. Algunos ejemplos de
constantes vlidos de constantes octales son:
t:ZL=

01

-)

011

o Una constante hexacjecimal (base 16) debe empezar con 0x ox y puede ser cualquier
combinacin de dgitos c:i O af 9 y letras A, B, c, D, E y r. Se pueden usar las letras
maysculas o minsculas.

Algunas constantes enteras hexadecimal vlidas son:

0x723

CXa2b4C9 OxFACE

0x.

El tamao de un nmero dpende de la computadora que se use. Por lo general, se


puede tener un rango que va desde 0 a algn valor mximo predefinido, basado en el
nmero de bytes que se usa para almacenar los enteros. En computadoras que usan 2
bytes para almacenar constantes enteras, el rango de los nmeros que se pueden
representar es desde -32768 a +32767. Mientras ms bits estn disponibles para
almacenamiento, un mayor rango de nmeros puede ser representado.

a
o
),
'a0

o
a
o

-. El sistema octal permite los dgitos de o a 7 donde O es siempre el primer dgito. El


sistema hexadecimal permite los dgitos o a 9 y las letras A, B, c, D, E y r, empezando
con 0x y 0X.
o

o
o

Decimal (base 10)


Octal (base 8)
Hexadecimal (base 16).

El sistema decimal permite los dgitos de 0 a 9 y opcionalmente precedido de un signo

:0

Constantes Enteras

Una constante entera es un nmero de valor entero. Este consiste de una secuencia de
dgitos precedido por un signo + o -.

o
o
o

Introduccin a la Proqramacin con C

Volumen 1: Fundamentos de C

Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ber reproducidos en parte
o en su totalidad sin elprevio permiso escrito de lBM.

en C 5

Introduccin a la programacin
con C

Gula del Estudiante

. 6.2

Constantes de punto Flotante


una constante de punto flotante es un nmero
en base 10 que contienen un punto
decimal (') o un exponente o ambos.
Algunas constantes de punto flotante vtidas
son:
0.0
1.0
0.3

1256.43

+25
-3.003

Adems se puede usar la notacin exponenciaf


como sigue:
qta

.;

U. ^^UUJqC4.

cuando

se usa la notacin r, implica que el punto


becimal debe moverse tantas
posiciones a la derecha, s el
exponente es positivl o l" izquierda
s es negativo.
"
Asque, <r--r significa que S 4 x ,g-3 que
es 0.004.
Tambin,

.3E4 significa 2 .3

I o4 que es 23000. 0.

Nota: r puede estar en mayscula o


minscula. Los exponentes son constantes
enteras
en forma decimal y no puede ser un
nmero real. porejemplo, es jnvlido

6.3

10.34

Constantes de Carcter

'3.2.

es vudrqurEr
vo
cuafquier udracler
carcter encerrado entre comilfas simples.
caracteres se fes asigna un nico cdigo
numrico llamado cdigo
cction ASCtI
as.rl
(American Standard Code for fnformation
Interchrng"l.

A los

'Los siguientes ejempros son constantes


de carcter vridos:

")zc
)x\

En un programa en c, estos caracteres


se incluyen en comiflas simples,.como ,a,y,*,
cada tipo de dato del tipo cnar puede
afmacenar solamente un carcter en un
instante de tiempo.

-'
6.4 Constantes
de Cadenas
@consistedeceroomscarcterencerradosencomi|fas
dobles Los siguentes
ejerpro, ,on

hola
nombre

"onstantes

de cadena vridas:

ES

Nota: 'a' es diferente d9 ""., en er primer


caso es el carct er a, yen ef segundo es
caoena a' se aprender ms acerca
de las cadenas Ln c un el volumen 3 unidad
Programar con Arreglos.
Unidad 4: Construir Funoamentos
Slidos!n C

Volumen

l:

Fundanentos de C

@ Copyright tBM Corp. 2005


Los materiales del curso no pueden
sr reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.

ra
1:

46

Or
+

o
o

a
o
o
o
o
a
o

Cuando se usan con operandos enteros, todos los operadores anteriores retornan un
resultado entero.

C)r

o
a

La mayora de ios compiladores de C hacen que el residuo tenga el mismo signo que el
primer operando. -ts t debe ser cuidadosamente interpretado. En la mayora de los
compiladores el residuo ser -:.

o1

o-

o
o
o
o
o
O

o
a
o

operador % es vlido slo cuando ambos operandos son enteros. Cuando uno de los
operandos es un fJ-oat, el resultado ser tambin un ft-oar. Adems, cuando se usa el
operador /, se debe tener mucho cuidado de asegurar que an a/b, b no sea cero. Si se
intenta dividir entre cero, el programa no funcionar. Si uno o ambos operandos son
negativos, entonces el uso de los operadores anteriores resuftar en valores cuyos
signos sern determinados por las reglas del lgebra. Cuando uno de los operandos es
negatrvo, el resultado del operador % no est claro.

O>)*-t
- I/

^A.
/'Una
'

expresin aritmtica es una combinacin de identificadores, constantes y


operadores aritmticos, que opcionalmente tienen parntesis. Considere la expresin
5*a - 5+b.

Qu evala esto?

- (5a) - (5b)

-5 (a-5b)
No debe haber ninguna ambigedad, as que, es necesario aprender la jerarqua de los
operadores. El orden en el que las operaciones se ejecutan depender de la prioridad
de los operadores. Esto se da en laTabla 4.2.

Prioridad

Operadores

Descripcin

o,_

Primero

"/o/o

Segundo
Tercero

+-

Multiplicacin, divisin, mdulo


Adicin. resta

o
o
o
O

o
o
o0
a
a
a
o

Asignacin

Tabla 4.2: Prioridad de los Operadores Aritmticos

Cuando las expresiones tiene operadores de la misma prioridad, digamos * y /, la


evaluacin es de izquierda a derecha. Porejemplo, si la expresin s a*b - c/d, a*b
ser evaluada antes Que c/d. Los parntesis sobrepasan todas las prioridades en las
Volumen 1: Fundamentos de,C

Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso eScrito de lBM.

en

C 47

Introduccin a la

expresones'

sin

con C

Gufa delEstudiante

embargo, dentro de

parntesis, las prioridades


mencionadas
e n cuvo ca s o, a exp
res i n

:Hi::r;, ln::: 1':':: :::.^"1$ ;:"i; "',


ji"J3l::
;t"::3tr1;::,ffi J[1il?;:;Hy:g[*l";ilL"J:#?:ff :
fi "jfi

,los

Ejempto 4.6
Considere fa evaluacln de fa
siguiente expresin.

k:5*10+_*3_75/e_g_2

se muestra fa secuencia en ra que


ros operadores son evafuados:
50 + 7 * 3 _ 15 / q + B _ z
* eva-l_uado

50+2t-fi/4.8_2
50+2I-3+B_2
71 _ 3 + B _ 2
68+g-Z
to _ 2

* eva.l_uado
,/ evaluado
* eval-uado
- evaluado
+ eval_uado
- eva-l_uado
: evaluado

-a

/4

k le es asignado

71

Fin de Ejempto 4.6


Ejempto 4.7
Para Ia siguiente ecuacin cuadrtica:

ax2+ bx + c:

Se determinan las races usando


la formula:

'

-b + square root (b? _ 4ac) /


-b - sguare root (b2 _ 4ac) /

o)

2a
2a

suponga que se traducen en


sentencias de asignacin en fenguaje
c.
= -b + sqrt(b * b - 4-a*c) / (2*a)
;
::::i : _b _ sqrt(b - _
Lootz
b 1*a*c) / (2*a) ;
Verifique la validez de esto.
Fin de Ejemplo 4.7

8' Operadores compuestos de


Asgnacin

c proporciona unos operadores com.puestos


como atajos al escribir las declaraciones de asignacin, que pueden ser utirizados
oe asig;frn. un opr"ooi de asignacin
compuesto consiste generalmente
de un operador aritmtica binario y
un operador de
asignacin simple' Este ejecuta
operacin de un operador binario
en ambos
y da el resultado de esa operacin
at operando izquierdo.

;irffi:fft

T";

precedencia

La decfaracin
= X + 2 es equivalente a X+= 2. LaTabla
4.3 muestra fa fista de
los operadores compuestos
de asignacin ms usados.
Unidad : Co

Votumen
, -^ _- . .
los
materiales

t: runGmEnG?e

@ Copyright tBM Corp. 2OOs


del curso no pueden ser reproOucidos
en parte
o en su totalidad sin elprevio
p"rri.o escto de lBM.

c 4t

o
o
a

Gua del

Estudiante
Operador

o0

o-

o
a
o
o
o
o
o
o
o
o
a
o
a
o
o
o

o.

lr
o
o

Ejemplo

Resta/Asignacin

o
o
o
o

or0

Propsito
Suma/Asignacin

o
o
a
o
o
o
o
o
o
a
o

Introduccin a la programacin con C

)i-

x-

t0

Salida
_l

Multiplicacin/Asignacin

50

Divisin/Asignacin

z:

1\

Mdulo/Asignacin

1t

t
C

Tabla 4.3: Operadores Compuestos de Asignacin

A continuacin se ilustra el uso de estos operadores compuestos de asignacin con un


ejemplo.

Ejemplo 4.8
A continuacin se escribe un programa, que acepta un valor entero por parte def usuario
y muestra el cuadrado del nmero dado.
El cdigo C comienza aqu...
1 #include <stCio. h>

2
3

mairr O

int num,'

1-

5
6 /7
e /*
9
_',t

: rin-t/rrTnnrpq:
r_

-'u ./

r'\
/

scanf ("?d",&num),'
Calcular el cuadrado de1 n-mero dado * /
num*=num;

El cuadrado se nuestra en la salida estandar */


pr:.nif ("Ef cuad::adc es: ii\n", num) ;

'}

=l cdigo C termina aqu


Fin de Ejemplo 4.8

9. Conversin Explicita de Tipos


Considere las siguientes declaraciones:

i,nt x;
float y;
Que sucede con la expresin aritmtica (x - y) z r0? La expresin (x - y)
devuelve un resultado de punto flotante dado que y es un ft-oat. Si uno de los
operandos no es un entero, el operador % no ser vlido. Existen ocasiones donde
estas son ineludibles, y ? debe ser aplicado. En ese caso, se debe convertir
explcitamente el punto flotante a un entero. Esto se hace a travs de lo que se
Volumen 1: Fundamentos de C

Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

en

C 9

lntroduccin a la programacin con

Gufa del Estudiante

denomina operacin de conversin (casting). Se indica explcitamente


al complador que
el operando en cuestin debe ser convertido a otro tipo de
dato. pqr
ejemplo:

((int)

(x - y) ) ?

10

Esto evaluar la expresin conectamente. (x


y) al evaluarse retorna un valor de
punto flotante. Este valor se convierte en un inr a
travs de (int) . Es importante
que el tipo de dato al que se esta convirtiendo est entre parntesis
( ) - El valor de
punto flotante es entonces convertido en un valor int,
sobre el cual se ejecuta el
operador mdulo. Ser ncorrecto s se hubiese scrito la expresin
sin tos parntesis
Para (int) (x - y) , como se muestra a continuacin:

(int) ((x _ y) ? 10)

El compilador anojar un error, ya que la conversin de tipo se


aplica
cual es de cualquier modcl una formacin inconecta de ra expresin.
{t\(\ trJO-

a G_y)zro, y el

10. Conversin lmptcita de Tipos


El lenguaje C realiza una conversin automtca de un tipo de
dato a otro. Esto se llama
conversin implcita de tipo (Automatic type coercion). Mientras que
la conversin de
tipo es explcita, el compilador ejecuta implcitamente conversin
de tipos. La evafuacin
de (x-y) evala a un valor f l-cat es una conversin implcita realizada por el
compilador.

:_nt i, j

,.

ffoat f;
clrr
I

t
L

h.

l|t).
l AAA
!VJV.-:

r.

L.

^.

ch : t,.
Todas las sentencias anteriores son asignaciones vlidas
en c.

' La sentencia = : asigna 1000 a j truncando la porcin decimal de la


constante de punto flotante.
e f = i esvlida ya :se leasigna 100.0 porelcompilador.
' Interesante es, ch i es tambin vlido. i es 100 y cuando se asigna a ch,
ch es ahora

'd

'

dado que el valor ASCII de o es 100.

Una buena prctica de programacin sugiere que el programador


haga siempre una
conversin explcita en lugar de dejar al compilador haga conversn
implcita. El
resultado obtenido en los dos casos es el mismo. La conversin
explicita de tipos es
considerada una buena prctica de programacin por las siguientes
razones:

'
o

Se requiere que el programador haga explicito el tipo de dato


a ser convertido, y
por lo tanto est conciente der cambio de tipo de dato.
Facifita la lectura del program a para otros.

Unidad 4: Construir Fundamentos SOtol

eE

Volumen 1: Fundamentos de C

@ Copyright tBM Corp. 2005


Los materiales der curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

50

o
o
o
o
o
o
o
o

o
o
o

Gua del Estudiante

Introduccin a la proqramacin con

Resumen
Ahora que ha completada esta unidad, Ud. debe ser capaz de..
' Explicar cmo escribir programas que tomen una simple entrada usando la
funcin scanf.

'
a
a
a

Discutir las reglas que gobiernan la creacin de nombres de variables


Examinar las propiedades de los tipos de datos primitivos predefinos de G.
Describir las propiedades y el uso de los diferentes operadores aritmticos.
Describir la jerarqua de las operaciones o ra precedencia de los operadores en
las expresiones aritmticas.

Volumen 1: Fundamentos de C

Unidad 4:Construir Fundamentos Slidos

@ Copyright tBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

en C 51

lntroduccin a la

Unidad 4: Examen de Autoevatuacin


1) cul de las siguientes sentencias
de asignacin es invlida en
x = x + 1;

ai

c?

b) y=y+1:
c) float=pi"r*r;
d) P=24.5"alb

2) curde ras siguientes

a) c = 'c';
b) c ='cat';
c) c = "cat",
d) c = "c';

es una asignacin ur" para

:."'rff:$"":;;:t"ff:,':s nombres de variabtes

char c; ?

senera error de compiracin en un

a) Abu_jafar
b) 123
c) mi nombre
d) miNombre
e) satins
4) Las constantes de punto flotante
pueden ser escritas en c en
a) Forma de fraccin decimal.
b) Forma exponenciat.
c) Como una cadena.
d) Como una concatenacin de 2 enteros.

:XT;:r:i'il:ffi"?r"0"
" a)
b)

c)
d)

una variabte, dectarada en

como

char

namei

Ocho.
Cualquier longitud.
Uno.
Dos.

6) cules de ros siguientes no


son constantes de carc.ter vtidas?
a) "a"
b) "Bill"
\
vta

d)

^l

'8ill"

Unidad:

Constr@

Volumen 1: Fundamentos de C

@ Copyright tBM Corp. 2005


Los materiales del curso no pueden
sr reproOucidos en parte
o en su totalidad sin el previo permis
escrto de f

BM.

52

o
o
o
o

o0

7) En la expresin, 25*d +
ejecutada primero?
a) 25"d
b) x"2
c) x-y
d) c+d

o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
)r;
{{it

oo
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

eo
o
o

B)

lntroduccin a la programacion con C

(>:*2.3+2) / ( (x-y)

i (c+d).2.3)

x es una variable entera. Qu almacear la asignacin x :


a)0
b) 4
c) 4.5
d)5

si

9)Qualmacenarlaasignacina

a) 15
b)3
c)0
d) 18

t5 + 3 z

cul porcin ser

9/2?

5?

10) Cul de los siguientes no es un calificador de tipo de datos?

a) int
b) short
c) long
d) signed

Volumen 1: Fundamentos de C

Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

en C 53

Introdurcin a la PrograTacin con C

Respuestas a la unidad 4: Examen de Autoevaf uacin

1)c
2)a
3) b, cye
4) ayb
5)c
6) a,byd
7)c
8)b

e)d

10)

unidad4,

con"tru@

Volumen 1: Fundamentos de C

Copyright tBM Corp. 2005


Los materales delcurso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

a,

o
o
o
o
o

o0
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin
a la prooramacin con
___

unidad 5: Laboratoro de programacin

enc

Objetivos de Aprend izaje


Alfinal de esta unidad, Ud. ser capaz de:

.
.
.

Trabajar con las construcciones bsicas de C.


Escribir programas para problemas simples.
Trabajar con las sentencias de asignacin a travs oe operadores

O,

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
a

Volumen 1: Fundamentos de C

Unidad 5: Laboratorio de programacin n

@ Copyright tBM Corp. 2005


Los materiales dercurs.o no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de tBM

55

lntroduccin alaP

Gula del Estudiante

Ejercicios de Laboratorio
1)

Escribir un programa en C que tome un enrero negativo lo convierta en un entero


positivo y lo muestre.

2) Dada la velocidad de un tren en kilmetros por hora, escrjba un programa que


muestre la velocidad en millas por hora. (1 mitla es equivalente a 1600 metros.
3) Escriba un programa que tome como entrad,a dos enteros en las variables
intercambie su contenido y los muestre.

xe

y,

Ejercicio Opcional
4)

Dado cualquier nmero entero positivo X, encontrar si su cuadrado termina en el


mismo dgito que el nmero X.
Por ejemplo: 5 cuyo cuadrado es 25.

Unidad 5: Laboratorio de programaCn en C


@

Volumen 1: Fundamentos de C

Copyright tBM Corp. 2005

Los materiales delcurso no pueden ser reproducidos en parte


o en su totalidad.sin el previo permiso escrito de lBM.

lntroduccin a la
Programacin con

(Codigo del Curso: CY320)


Versin 3.0)

Guia del Estudiante

Volum en 2: Estructuras
de Control en C

IBM lT Education Services


Worldwide Certified Materia

lnformacin de la pubficacin

5;i;:?j",i,ilff::

producida utirizando Microsoft


word 2ooo y Microsoft powerpoint

Marcas Registradas
IBM @ es una marca registrada
de Internationaf Business Machines
corporation.
oe roJuctos v seryici, Luo"n ser marcas
resisrradas o

351'":"#p"ililJJ}:*::
ffil::"merciafes
Red Hat

Linux

de otras compaas son mostradas


a continuacin:
corporation
H:T"rt"",-

Edicin Junio 2005

La informacin contenida en este documento


no ha sido sometrda a ninguna prueba
formal de IBM y es distribuida bsicamente 'como
es", sin ninguna garanta ya
expresa o implcita' El uso de esta
sea
informaci" r, imprement-".ion d
cuatquiera de
estas tcnicas es responsabifidad
del comprrooiy o"pender de la habilidad
para su evaluacin e integracin
de ste
en el ambiente oieraoionar del criente.
pesar de que
cada tema ha sido revisado por IBM para
su
hay garanta de obtener el mismo resuftado "r"itltrd en una situacrn especfica, no
o uno simirar a ste en otra srtuacin.
Los
adaptar ests tcncas . ;;;
ambientes lo nr.un bajo su
rpo,
;1fil,ff,*l"intenten

' copyright Internationaf Business Machines


corporation, 2oo5.Alf rights reserved.

;:nfr"$:,?r".:igil:de

ser reproducido en su torafidad o en parre


sin er previo

Instrucciones especiales para la


impresin de este curso.

No deben rernoverse las pginas


en blanco que puedan aparecer en el
final de cada
unidad y entre dos unidads.'estas
nan sido nsertas intencionarmente.

:r
ol

Guia def Estudiante

Intrcduccin a la Droorarracin con

ol

:l o
ol

Contenido
Unidad

OI

ol
of
ol

.l

q
q

?n

o
a
o
o
o
a
o
o
a

o
o
o
o
o
o

Estructura de Control de Decisin

1
1

1. Introduccin
2. Construccin rf Simple
3. La Construccin : i_et se
4. La Contruccn r: Anidado
5 Expresiones y operadores Lgicos y Reracionares
6. Operador Ternario
7. Las Diferentes Formas de Sentencias rf
8. La Estructur? sw :c ... case

rf

t?

l:

Objetivos de Aprendizaje

of

d
d
a

.-)

z-

5
'7

IU
1a
tz

o
t

Resumen

Unidad 1: Examen de Autoevaluacin

LA

Respuestas a ra unidad 1. Examen de Autoevaruacion


unidad 2: Laboratorio Estructuras de contror de Decisin

to

Objetivos de Aprendizaje

29

Ejercicio de Laboratorio

?n

Unidad 3: Construcciones lterativas

21

Objetivos de Aprendizare
1

2.

.Introduccin

Construccin lterativs

J
i..,:. _ _

Resumen

Unidad 3: Examen de Autoevaluacin

q1

Respuestas a ra Unidad 3. Examen de Autoevaruacin

Unidad 4: Laboratorio de Construcciones lterativas

CE

Objetivos de Aprendizale
Ejercicios de Laboratorio

56

Unidad 5: Ms Construcciones lterativas

57

Objetivos de Aprendizaje

1. Introduccin
2' Resolucin de Problemas Usando otras Construcciones
3. Ms acerca de la Sentencia for

5g

lterativas5g

H
\\v

o
o

Losmateria,::_qe:;"#X'Jil,?Y":Tj;,l??3.,cidosenparte
o en su totalidad sin el previo permiso escrito de
lBM.

65

lntroduccin.a la

4.
5.
6.
7.

ramacin con C

Gua del Estudiante

Salir de un Bucle prematuramente


Uso de fa Funcin fncorporada
pow
palabra
La
Reservada

o3
(

continue

ov

La Estructura de la Sentencia
do_whi-te
Resumen

69

Unidad 5: Examen de Autoevaluacin


Respuestas a la Unidad 5:
Examen de Autoevaluacin
Unidad 6: Laboratorio Ms Construcciones
fterativas

73
74
76

77

Objetivos de Aprendizaje
77

Ejercicios de Laboratorio

78

@ Copyright f BM Corp. 2005


Los materiales del curso no pueden
sr reproducidos en parte
o en su totalidad sin el previo p"rrir
escrito de
f

BM.

o
o
o
o

Gua del Estudrante

Unidad 'l: Estructura de Control de


Decisin

oI

o
o
O

o
o

o
o
o
o
O

o
o
o
o
o
o
o

introduccin a la proqramacin con C

Objetivos de Aprend izaje


AI finalizar esta unidad, Ud. ser capaz de:

'
'
.
'
.
.

Definir la necesidad de decisiones en los algoritmos


computadoras.

y en los programas

Desarrollar algoritmos que requieran tomar decisiones basadas en


condiciones
especficas.
Discutir las diferentes formas de la sentencia r i.
Expficar las expresiones relacionales, expresiones lgicas y la precedencia
de
los operadores lgicos.
Explicar el operador ternario.
Discutir la construccin' switch ... case.

?
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
)

o
o
o
o

de

Volumen 2: Estructuras de Controlen C

Unidad 1: Estructura de Controlde

@ Copyright tBM Corp. 2005


Los materiales dercurso no pueden ser reproducdos en parte
o en su totalidad sin el previo permiso escrito de lBM.

Decisin

Introduccin a la Programacin
con

Gufa der Estudiante

1. f ntroduccin
En la unidad anterior, se escribieron programas
que seguan una estructura secuencial
estricta' es decir, ejecutar una sentencia
despus de ra tr". r-o, prs iniciafes que
se
tomaron para aprender a programar fueron
tiles-para fortalecer las bases para
una base sfida no es suficiente pa resorver probremasla

5:3,T,[X?"Jr:ffiH.1rso,

as complejidades surgen cuando se tienen qru


ciertas condiciones se verifiquen y se tomen ,"rotuer problemas que requieren que
decisiones de acuerdo a stas. Los
problemas computacionales generalmente
requieren que el usuario tome acciones
especficas' basadas en si una cierta condicin
se satisface o no. ptr eempfo, para
mostrar el mayor de dos nmeros enteros
A y B, se debe primero verirrcar la condicin
I

antes de que se pueda llegar a la conclusin.

otro ejemplo' consiste en verificar si un estudante


es de sexo femenino o mascurino.
Para descifrar la intenogante es necesario que
er arumno proporcione su sexo como
dato de entrada y ste pase por una condicin
vstsrrrrrrs li'
Yve determne
la [
respuesta a esa
' que
nterrogante.

En esta unidad' se aprender a resolver problemas

que requieren que


condiciones sean venficadas y que las
decis"J;; se tomen estn basadas enciertas
eilas.
Adems se aprender el uso de una construccin
muy til en c, ilamaJa sentencia if
la cual permite convertir los algoritmos que
,
requieren estructuras de control de decisn
programas'
en
La sentencia r est disponibfe para usarse
en diferentes formas, desde
las estructuras de if simple y de if
-ei-se,
hasta las estructuras de if mltipfes y de
if anidados' cada una de estas estructuras ayuda a darre
sentido a los problemas que
requieren control de decisin en su contexto.
'Tambin se estudiarn con ms detalle los
operadores relacionales, las expresiones
relacionares, ros operadores rgicos y
ras expresones rgicas.

2. Construccin

if

Simpfe

El control de decisin abarca desde verificar


condiciones muy smples hasta estructuras
muy complejas' se entendern las estructuras
de contror o oecison
ta ayuda de
algunos ejempros. cada ejempro prantea
probrema, sugiere un"on
un
argoritmo
que
resuelve el problema y provee las entradas
necesarias en funcin de las diferentes
formas de la sentencia if que se requieren para
escribir er programa en c.

Ejemplo

l.l:

Encontrar el Mximo de Dos Enteros

Dados dos nmeros enteros x e y.


El problema consiste. en escribir un programa que
tome como entrada dos. enteros y muestre
cal de los dos tiene el valor mximo.
La
solucin es directa y er argoritro j"r,
probrema
este
se da a continuacin:

Paso l: Tomar como entrada x e y.


Paso 2:Verificar sx > y.
Paso 3: Si es cierto, entonces mostrar

unidadl.esttuffi

x como el mximo,
Volumen 2: Estructuras Oe Control e-n-C

@ Copyright tBM Corp. 2005


Los materales del curso no pueden
ser reproducidos en parte
o en su totaldad sin el previo permiso
escrto de lBM.

,)

.I

:l
II

:T
lt
off
O lt
.h{
^fr
olt
tt
!t

-G_ua

oel Estudiante

.lf

Para comenzar' se discutir la sintaxis y


semntica cje una construccin
La forma general de fa construccin
r simple se da a continuacin:

ol
ol

ti(x

ol

oj
o
o
o

>

r,)

La palabra reservada es

ot

o
o
o
o
o
o
o
a
o
o
o
o
o
o
o
o
o

srmple en c.

En este caso sentencial es una sola sentencia


c, la cal se llama sentencra,,simple,,.
De manera de verificar si x es mayor que
pueoe
.
se
usar la siguienle sentencia:
-i

ol

o,u

if

:f (sl la conciicin es i,=::l:tr.:a.


sentenc: - _,.

:F

Orrs

Paso 4: En caso contraro, mostrar


v como el mximo
Este es uno cie los mtodos para resoiver
este prcblema. Existrrn mltiptes soluciones
pai-a muchos de los problemas que
se van a presentar. Los que aqui se drscuten
los ms simpres que faciritan .orn[rut"r
son
ros objetivos cier aprendizaje.

ofi

o
a
o
o
o
o

Introduccion a la proqramacin con

l:[:.::f

if

y ia conc.icion que se Verifrca es


-,: > 1",. Tambin se re
una expresin relacionai siempre resutta
en

r:i:,:"*,"cionat a >: ),

:,;#;l"":?flj:

construccin

r:

oara escribir

rn prosrama en c que impremente

El cdigo C comienza aqu...


j *:nc-Lucie <s:c: c.
n>

2 nain)

;t)

x es nayo:r aI valor de y
;..
1r:_

^-

;^

9'-rt

hA_.v-

Yue
-!^

eI walor d. y

es: ?d\,n", ),) ;


igrral al val-or

Volumen 2: Estructuras e Controten


C

Unidad

d.e y

l:Estructurffi

@ Copyright fBM Corp. 2O0S


Los materiafes delcurso no pueden
sr reproducidos en parte
o en su totalidad sin el previo permiso
escrito de IBM

er

Note que las dos entradas se tomaron


usando una sola sentenca scanf. El formato
de
cadena *d sd implica que se esperan
dos enteros decimafes. Los dos valores de
entrada se leen en x e y respectivamente.

A continuacin, se

realiza un seguimiento de la ejecucin


de este programa con
considere que ros varores de entrada de
xey
::tJ""jT:"3;""J[:*X,:"'"'pro

printf (',Las entradas son: 3d y ?d\n ,, x, y)


,
i
La sentencia anterior imprimr el siguiente
mensaje:

Las entradas son 72 y 24


Af ejecutar la sentenca if (x
sentencia siguiente (la sentencia printf)
no se ejecuta. cuando se e,ecuta las
sentencia if
(x < y) , sta resulta VERDADERA,
como resultado la

sentenCia, printf ( "El mximo


presenta a continuacin:

El- maximo vat or es:

va-lor

es

?d

\::,,, i,)

siguiente

; se ejeCuta. La salida se

24

si se dan ros varores de x

y = r2, der programa


que ra primera
if (* t y) retornar falso. El siguiente ":: ,::es< evidente
_... se ejecuta y conduce
sentencia ir (x
conduce a verdadero y se ejecuta ra
v)
:#"il,""5"15i,j1
sentenca

printf ("Los numercs scn iguales\;:,,)

,.

Esto resulta en la siguiente salida:

Los numeros son iguales

:::$ffi::fil"rtos
Fin del Ejempto

que se hicieron ilegaron a ros resultados


correctos y er prosrama

l.i

Ejemplo 1.2: Determinar si una persona


es de mayor de edad
Una tienda que expende licores est
interesada en determinar si sus clientes
cumplen o
superan la mayora de edad (21 aos), para
evitar nacer una venta ilegal. El algoritmo
para resolver el problema se
muestra a continuacin:
Paso l: lngresar la edad def cfiente.
Paso 2: si ra edad es mayor o iguar
a 2r, entonces ra persona es mayor de
edad.
Paso 3: si ra edad es menor a 2r, entonces
ra persona
no es mayor de edad.

El programa

que mplementa este algoritmo se


da a continuacin.

unidad 1: Estructura oe cotr' oEEelon

Volumen 2: Estructuras e ContrienC_J

@ Copyright tBM Corp. 20OS


Los materiales delcurso no pueden ser
reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.

o
o

Gua del Estudiante

o
o
o

El cdigo C comienza aqu...

a,

o
o
o
o
o
o
o
o
oI
o
o
o
o
o
o
o

Introduccin a la proqrama3ton con

IE
\v

*_;.C_:Cie

.i*eu::_C.:t)

2 nain O {
:
l:,-_ e:a 1,.
- / * Aceptar Ia e,ciad de1 Clien
te * /
.
::-:,-_:,"_-:.::e.c: _a edad d:_ c-.6
sca:i,,?C,,,&ecad),.
7 /* Verifi_car si 1a ed.ad del cl_rente
es mayor o ign:al a 2l airos *
/
E
(e:ad
ri
>: 2i,
-:

^*r-_ _..
f.

\ :_
--,',--

o ,_,
o
o
o
o
o
o
o
o
o
o
o
o

,_

',a

:on f a niayo::ia cie edad\:,,)

:2i

,.

Ef cdigo C finaliza agu...

Fin del ejempto 1.2


se puede escribr ms de una sentencia en una msma
separadas por el carcter
";"' si se desea eiecutar ms de una sentenca que lnea
siguen a la senienca if, se
deben encerrar todas estas sentencias entre
llaves 1 r. La desventaja de ste mtodo
eS que si eciad
esto usando la construccin if _else.

3. La Construccin

if-else

La forma generar de ra sentencia

rf (condicin)

if-erse

se o,a a continuacin.

sentencian;
j
c l <c I

sentencial;
-centenc1an,.
l

si la condicin es verdadera,

entonces el conjunto de sentencas dentro


de las {},
llamadas sentencias "compuestas",
sern ejectadas. si sta es falsa, entonces
las
sentencias compuestas dentro de las
{ } que siguen al et_se sern ejecutadas.

o
o
o
o
o

o
o
o

senLe: i:aJ,.

Io

c_ : ::.-, + :.-:-.:

A continuacin se muestran argunas construcciones


vridas de

Volumen 2: Estructuras Oe ControiE


C
"(|

Unidad

l:

if_erse:

Estructura Oe ControlOe

@ Copyright tBM Corp. 2005


Los materiafes delcurso no pueden sr reproCucidos
en parte
o en su totalidad sin el previo permiso escrito
de lBM.

Oec,sn

Introduccin a la programacin con C

if(a > 0){


Printf

Gula del Estudiante

"Positivo\n")

"No Positivo\nl')

else i

printf

if (disc < 0){


printf ( "Las raices son imaginarias\")

else

pr

intf (',las raices no son imaginarras\n,,

);

A continuacin se ilustra el uso de estas construcciones a travs


de un ejemplo.
Nota 1: El cero no es ni positivo ni negativo. En los ejemplos
se esperan nmeroq
postvos

como entrada, por lo tanto el ce no ser considerado una


entrada vlida.
Nota 2: En el ejemplo anterior el uso d llaves es innecesario
debido a que cada
condicin al ser verdadera ejecuta una sora sentencia.

Ejemplo 1.3: Encontrar et Mximo entre Dos Enteros

- Revisado

se puede escribir un programa en c que sea ms conciso para este problema


usando
la construccin if-er-se. El programa es auto explicativo.
Paso 1: Ingresar dos nmeros enteros.
Paso 2: Verificar si un nmero es igual a otro.
Paso 3: Si no son iguales verificar si el primer nmero ingresado
es mayor que es
segundo.

Paso 4 : Si la condicin a evaluar en el paso 3 es faisa entonces


el segundo nmero
ingresado es mayor que el primero.

Al momento de ser determinado el mximo vafor entre ios dos nmeros


ingresados,
dicho
dato debe ser mostrado.

El programa C comienza aqu...


1 #inc-l-ude <stdi-o. h>

2 mainO{
3
int x, y;
4 /* Se le inrtis ar usuari-o qlue ingrese e1 wa]-or de cada nmero */
5
printf ( "Ingrese dos numeros. enteros: ,,) ;
6
scanf ( "td 8d", &x, &y) ;
7
printf ("El- val-or de x es: td\n" , x) i
8
printf ( "El va-lor de y es: gd\n,,, fl ;
*
9 / Verificar si nl^.as variables contienen el n'sno va]for *
/
10
rf (x :: O
11
printf ("Los numeros ingresados son iguaJ-es\n,,),.
Unidad 1: Estructura de Control Oe OecsiOn

Volumen 2: Estructuras de Controlen

@ Copyright IBM Corp. 2005


Los materiales dercurso no pueden ser reproducidos en parte
o en su totafidad sn el previo permiso escrito de lBM.

:F
OI

Gua Cel Esiudiante

ol

Verrfi-car

o l(

of
of
ol

ol

rl

ol
ol
ol
oi
ol
el
ol

j'c
a
o
o
o
o
o
o
a
o
o
o
o
o
o
o
o
o-,

a
o
o

tlproglgr"cin

cor: C

> _\'/
-;-!a/tf-!'-11-ul

,/- Verificar

Introduccin a

si el valor de x es mayor que e1 de y , ,.

': ix

of
ol"
ol
ol
ol

__

l-

rL=..-1ll-

si e1 valor dexes

^t ^^
P-::-_:

:_

].=::_:.-a

\a_:cr es: e^^l\'l


que el de Y ",t
i-;_::

aqu...

4. La Contruccin

if

Anidado

Ejemplo l'4: Buscar el Mximo de Tres Nmeros


Enteros sin usar otra variable
cuando se plantea el problema de determinar
ei mximo entre tres nmero, lo comn
es pensar en utilizar una variable auxiliar
oue permit"
el mximo entre la dos
primeras variables y luego ese resuftado
compararlo "h"""nar
con
el
tercer
dato de entrada. El
siguiente cdigo busca rsolver el planreamiento
sin usar otra variable a travs del uso
de una construccin if anidado:
Paso l: Ingresartres nmeros entei-os.
Paso 2:Verificar si los tres nmeros son iguales.
Paso 3: si no son iguales verificar si el primer
nmero ingresado es mayor que es
segundo.
Paso 4: si la condicin a evaluar en e] paso
3 es verdadera, entonces se verifica si
el primer nmero ingresado es_mayor que et tercero.
Si es as ef valor
mximo es el primer ciato cao'o. si n es
as er mximo valor es el tercero.
Paso 5: si fa condicn a evaluar en el paso
3 es farsa, entonces se verifica si el
segundo nmero ingresaoo es mayor que
el tercero. Si es as el mximo
valor es el segundo ciato ciaio. Si n es
mximo valor es el tercero.
"" "i
El cdigo C comienza aqu...
i incl-ude <stdlc. h>
marn O
inj

v t " Lt
Y t -.

r::intf ( "rngresar tres e:---eros separados por


espac-ios: \n,,)
scanf ('?d 3d td,',&x, &y,&z);
,/* Mostrar e1 valor de ros tres nmeros
enteros */
rrl-nrr ("EI va1or de x es: ?ci\n,,, x);
PI -r-nEr ( "81 valor de y es: ?d\n,,, y)
;
n-i-+/?rrr
r,rtnrr("E1 va.for de z es: td\n,,, z);
/* Primero verificar si x es igrral. que y *,/
if (x :: y)
E

^eiFrC

t arrl

t.rr1

Volumen 2: Estructlras Oe ControGnT

Unidad 1: Estructura Oe

Coffi

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden sr
reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.

ntroduccin a la pro

I Estudiante

72 * Cuando x es igrral. . y se verifica


si x es igrua! z */
13
if (x := ,1
1A
prj-ntf ("Los numeros dados son iquates\n,,),.
15 ,/* Verificar qlu.e x es
mayor que y */
16
if(x>y)
I1 /* \/erifi-car si x es mayor qoe z *
/
18
f (x > z)
19
27

22
23

^+ [| rtr1
vrrrrLr
.-L va-Lor maxl_mo eS: gd\n,,, x)

^ri

20

e-lse

,.

,/* Sino z tiene e1 mximo val:or */


i]rrrrL- (..L^ \,a_Lor maximo es: gd\n,,, z);
Y;--i/rt-

g:
^^
^t >e

Verificar
que y es mayor que z - i
i: ty > z)
pr::l:: i "E- _,. --: ;:]:x::.1 s :

24

25
26
21

.:

d\n,,, y)

,.

EI>=

28

)q / *

rf (z > y)
La waria.ble z ti_ene eI nximo val_or -,/
- ^e!-r-__

I :_

-.-:tO:

;aX.;:,:

:S:

?d\::,,,

Z) ;

El cdigo C finatiza aqu...

i:ilil:"8:

;iJff:?fi:ado

er mx,mo varor entre ros dos nmeros insresados,

Fin del Ejempto 1.4

se ha usado una nueva estructura en estos ejempros.


se us un
if.

sentencia

Esto se llama construccn

correlacionar cada

erse

if

andado.

con su correspondiente

if(x>z)
*! r / r.ra
^*i rnLr
( '.L-L ValOr
|Jr

if

i:

dentro de otra

es bastante craro,

maXimO eS: gd\n,,, X)

,.

est emparejado con:

else

printf
La primera sentenca i

if (x >

"Ef valor maximo es: 8d\n", z);

y)

est emparejada con:


el-se

if

(y>z)

Unidadl:Estrrct@

Volumen 2: Estructuras Oe CortrolGn


C

@ Copyright tBM Corp. 2005


Los materales del curso rio pueden
sr reproducdos en parte
o en su totalidad sin el previo permiso
escrito de lBM.

o\

o
O

Gua del Esi-iCiante

o
o

;:"$.:il?,"t;:

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

es una construccin

claridad.

ii
v

Ejempro r's: Determinar si


un Nm"ro ,nru.o de Tres
Dgitos es patndrome
considere la entrada de un nmero
entero positvo de tres dgitos.
si ste es un parndrome
se debe determinar
. ;r;i;;rome es una parabra
o un. nmero que se ree de ra
misma forma de derecha tJ"r
como de derecha a izquierda. por
ejem pro, 121 y
er arsori!1ra oetermnarr
,n
:iiff:r?alndromes
dado es [arndrome es
"nt"ro
Paso l: lngrese un entero positivo
de 3 dgitos num.
Paso 2: Ertraer el digito izquierdo
Paso 3: Si

y el derecho.

rzc;_::_, = d=recho entonces

El cdigo C comienza aqu...


I #l:rl- - j= .s-_t_. .-2
main O i
3

o
o
o
o
o

anterior

En el programa anterior, se pudo


entender er emparejamiento
de ros rf_erse,
,JJ o" ,olno,in por r" "t",
es esenciar
'lgrlas' ya que permite
?:::',"T:"1:::
i:ff'?X'ffiT"0?;;:#;'
proporcion"
una fciL lmprension
rnryo.

,11H,,;"n oT'.."1.J0,"

i
are
^!

1,

(&

or

oi

.i
ol
of
ol
OI

((J

*.-*
.iJji./

p::nLt(,,
^- i ^+.

_:J_:=_,

J:,

num es un palndrome.

j=:+::.c-;

I._,1_,es;: _:.:_j: ::::c erte::c


de 3 diqitos:\n,,),.
5
scarf(',?d,,,A:-:r., ;
6 /* yerficar - que e-!
er :rec
.tume.c de entrada es posa
-)
.., vo * /
:-,
:"=
'
lr(num
=?ll
I

-ri-- -.'

lc

j,,,

lar1vd,:.c,.

I
:

' i :--- .^:' '::::'


:.,,,:._:

posil i vo, numero \

11 ,/* Verificar
qrre
g4 a:.*ts:(j
nme-c ingresado es
a-- el
de 3 dgitos */
1,2
else
13
if (num <: 99 I I :run >999)
{
1,/
p::-.--: (,,D:c
Ld-(J 'ncorrecto' ingrese
un numero \
i5
-----..t
de
3 cigiros\n ,,);

\6]
77
else {
18 7* Mostrar 1 os datos ing-resado5 *
/
19
prrntf (,,La entraia es: gd\n,,,num),.
2a 1* Se extrae eI dgito
izquierde */
2i
:zquie:do=num / 1OO;
22 1* Se extrae e1 dgito
derecho *,/
derecho:numg10,.

VolumenZ,@

Unidadl:

gstruc@

@ Copyright tBM Corp.


2005
Los materiales delcurso
no pueden ,i r"'prooucidos
en parte
o n su totalidad sin elprevio
p"irirJ escrito de lBM.

Introduccin a la programacin con

24 / * verificar
derecho *./
za
26
21

30

Gua del Estudiante

que er d.gito izquierd.o extrado es ign:ar aI dgito

i-f (izquierdo :: ierecho )


,/* Entonces.el nmero es palindrorre */
prrntf("8d es un numero palindrome\n",num);

28

29

el-se

/* Entonces este nmero no es palndromer */


::t;rtf ("?d no es. un nulnero palindrome\n,,,

JI

num) ;

32

El cdigo C finaliza aqu...

Se recomienda que se realce la traza del programa anterior para dos


conjuntos de
entradas diferentes.Es recomendable intentar la{raza con los valres gi3
v sss.
Fin del Ejemplo 1.5

5. Expresiones y operadores Lgicos y Relacionales


Se sabe que la parte crucial de la sentencia if es la condicin y que
ella es cualquier

expresin relacional que conduce a verdadero o falso. Las expre


iones relacionales son

aquellas que se forman con una combinacin de identificadores,


constantes y
expresiones aritmticas, todas enlazadas a travs de un
conjunto de operadores
relacionales. Los siguientes. por ejemplo. son todas expresiones relacionales
vlidas:

A>10
(a-25) <= max

b<=0
(b*b -2.a) < (c.e)/2

5.1

Operadores Relacionales

Algunos de los operadores relacicnales que se pueden usar para formar


expresrones
relacionales son:

Menor que.
Menor o igual que.
Mayor que.
Mayor o igual que.

Todos estos operadores pertenecen al mismo grupo de precedencia que


es menor que
los operadores unarios y aritmticos. La asoctividad de la evaluacin
es de izquierda
a derecha. Los operadores relacionales se usan para formar expresiones
relacionales.
Las expresiones relacionales siempre producen un valor de verdadero
o falso, tal como
se mencion al comienzo de la unidad. En C, las expresiones relacionales producen
1
para verdadero y 0 para falso.

Unidad

'1:

Estructura de Control de DecisiOn

Volumen 2: Estructuras de Controlen

Copyright tBM Corp. 2005


Los materiales der curso no pugden ser reproducidos en parte
o en su totalidad sin el preio permiso escrito de lBM.
@

1O

o
O

Gua del Estudiante

o
o

o
a
o
a

o
o
o

5.3
I

.l
o

o
d
o
o
a

""

a-

o'
o

>e pueden usar ios siguientes operadores


de igualo'acl en expresiones reiacronales.

lgual a
No igual a
Effos pertenecen
de precedencia separado por debajo
de los operadores
relacionales' Esto ".'n.-g'uoc
signifi-ca qr" un-rna expresin que
invorucra operadores relacionales
como operadores de igualdad, los
operadores relacionares se evaran
precedencia' La asociatividad
con una rr.rre
de los operadores es de izquierd"
"ru"ha. ntgunos
ejemplos vfldos del uso de los operadores
oe iguaiJal
pr"runtan" a continuacin:

a
o
o
a

Operadores de !guatdad

r=

o
o
o
o
o

5.2

lntroduccin a la pi-ogramacr^
cc

ExpresionesLgicas

Las expresiones relacionales conectadas


expresiones lgicas que sr3mpre producen por operadores fgicos se oenominan
un varor-Je verdad".- o rtro.
retorna una expresin logica
realmente un eniero: er valor de Er varo qus
representa por el valor 1 y also por
verdadero se
". ei valor O.
5.4 Operadores Lgiccs
oceraoores tgicos, lamados
conectores tsicos, tos

il:rr:'i:r,:rt;f:r::?j;.
6;
r

1,0

;:#::?
l

Y
O

(AND)
(CR)
NO INCT)

isicos para combinar expresiones


rsicas Arsunos

:::'r'".'";fl:j::'
_

::

:._i:

!,

..,

.:

'- :- :, ; :,-::.: l: _-,

El operador lgico a a retorna


el valo
verdaderos, sio retorna er
varor o.
valor de FALSo (rarsr) slo
si ambos

?,

2 l:

0)

;ff :'i".l?H g:X?,ff1H;:ri?il;:"J


operandos son farso, sino retorna
n,"u" r,'0" operadores en ra'ERDADER.
rabra 1 1,

::i::l#,'"'L:i,"#,"':iilU:*:j:,n"
Categora

Operadores

Unarios

++-

Aritmetica (multiplicacin,

*/z

orvtstn, mdulo)

Aritmtica (aOciOn,iuOJEon)
I

+-

Asociatividad
Derecha e izati"rrl
lzquierda a derecha
lzquierda a derecha

----

lzquerda a derecha

VolumenZ:

gstr@

Unidadl:Estructuffi

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden
sr reproOrcidos en parte
o en su totafidad sin el previo permiso
escrito de tBM

Introduccin a la

Gua del Estudiante

lgualdad

lzquierda a derecha

Y (and) lgico

lzguierda a derecha

&&

(or) lgico

lzquierda a derecha

No (not) lgico

lzquierda a derecha

Tabla

Ll:

Jerarqua de Operadores

A continuacin se aprender acerca de un operador que tiene tres trminos, llamado


operador ternario.

6. Operador Ternario
El operador ternario en C es una construccin if de una lnea la cual tiene tres
trminos. Los smbolos interrogacin (?) y dos puntos (:) se usan como operadores

ternarios. Si la condicin evala a verdadero entonces la sentencia despus del signo


de interrogacin (?) se ejecuta, s no la sentencia despus de los dos puntos (:) se
elecuta.

_\ a. 3:_'! e::]a:]e:C: --OnlrC,n Va-lOr FaISO;


Un ejemplo del uso del operador ternario es el siguiente:

? p::nti("

(a::b)

Ig.*a'e"',:."

: ::_::::l"lic

soi-i iguales\n,,);

El operador ternario tambin se puede usar en sentencias de asignacin como sigue:


o-au,

b:8;
y=1:::h\

l-'.

La condicin a == b evala a falso y la sentencia despus del : se ejecuta. Por tanto, x

'toma el valor de 8. Los operadores ternarios permiten el uso conciso de


construcci 1f -ef se simple.

una

Ejemplo 1.6: Usar el Operador Ternario


Es posible escribir un programa ms conciso en C para buscar el mxjmo de dos
nmeros usando el operador ternario. El programa que se presenta a continuacin es

autoexplicativo.

El cdigo G comienza aqu...

1 #include <stdio.h>
2 mainO i
3
int num1, num2;
4 /* Se aceptan 1os dos n.meros de1 usuaro */
5
ori:rtf ("f ngrese l-os dos numeros: \n")
6
scar:f ( " ?d ?d", &num1, &num2 )
-7
/* Se muestran ]-os nmeros ingresados por el usuario */
8
printf("Los numeros dados son: Bd y Bd\n",ituml,num2);
,.

,-

Unidad 1: Estructura de Control de Decisin

Volumen 2: Estructuras de Controlen

@ Copyright IBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

12

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudianie

lntroduccin a la prograinacjon

:o: :

9 /* Yerjfrcar sr e_l nnero1 es mayor


maycr que sl ne:c2 entonces muestrao-"re el- nnero2, s el_ nnercl es
el mensa je despus ciel s- :rrc
r-nt.erroEa:ior (?), en caso contraric
Io
o-!te est despus de l_os oos
Puntos(:) -/
10
(nunl ) l-l,?) ? p::intf("Et ma>:,mc -,'arcr
es: ?d\n"rrumi) :
r:rr1tI (''l r ,a>:.nLc ,,af or es: ici\:t,,, -'rm?', .
^-i-*a,rf-i

.rl

El cdigo C finaliza aqu...


El operador ternaro es equivalente a una stmple
sentenca
el siguiente ejemplo:

I
I

if,

tal como se muesrra en

,/* Verificar
qrre eI noero 1 es mayor que el nmero -/
2
if (nunt>nun2) i
/ * S e1 nmero 1 es rnayor que eI nmero 2
- -i ri,*r
:-. ( L_ ,aX:mO varci es: '::,i:r',,

I
I

efse

O,

* S el nmero 1 no es raayor que


eJ- nero2 - ,/
p:i.tf ("El maxirn: valc: e.'.: :d\,,, run2
)

,.

o
o c
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
5
o
o
o
o

Fin del Ejempto 1.6

Ejempto 1.7 Cantar los Das en un Mes

El usuario ingresa un n,'nero entero entre 1 y 12 que


significa er mes. Aqu 1
representa Enerc 2 r=presenta Febrero y asi
suiesvamente hasta llegar a Diciembre.
El problema cosrst= 3-: escibr un programa que
tome esta entrada y muestre el
nmero oe cas oe ese mes en particular. Asuma
que el mes de Febrero tlene slo 2g
dias Para a'/u'ai a resci\'ai este algoritmo recuerde
la frase usada en la escuela:
"Treinta das iienen Septiembre,
Abril, Junio y Noviembre; todos los dems (excepto
Febrero) tienen 31 das,
Usando esta rima, se puede escribr un programa
para encontrar la cantidad de das de
un mes Daoo que el algoritmo es sencillo s
va a escribir directamente el programa.
El cdigo C comienza aqu...

#'nc-uie <sri1o.h>

jrllc_-l

/ \
{ I

r
J

3 /' se declaran 1as variables


das del mes "/
int mes, dias;
4

Volumen 2: Estructuras de ControGn C

para almacenar eI mes y er nmero de

Undad 1: Estructura e Controt OeEecsio^

@ Copyright tBM Corp.2005


Los materiales del curso no pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso escrito
de lBM.

Introduccin a
_ la_ programacin
.
con C

:_

Gufa del Estudiante

5 /* se acepta er valor del mes por parte del


usua-ro */
6
printf ("Ingrrese el mes, gue se encuentre
entre I y 12 :,,) ;
1
scanf("gd'/ &mes);
8
,/* Verificar Ia va1idez de ]-a entrada */
9
if (mes >: 1 && mes <: 72) t
10 /* A este punto .l-a entrarta
es vl_id.a *,/
11
if(ms5::9 ll mes:=4 il mes_:g ll mes=:11)
72 '/*.Treinta dias tiene septienbre,
Abril , Junio y Nowien-b re * /
13
:
dias 30;
1^

else

f (mes :: 2) /* Excepto Febrero *,/


dias : 28;
else ,/* Todos .]-os dons tienen 31 * /
dias : 31,.
pr_r;-.-L: (,'E-l numero de d_ias en e-lmes ?d es ?i\n,,,mes,

15

t-6
71
18

I9

^-

20

2!

^t ^^

I -

prtr--,.' .'tr'r val_or ingresado no est


entre 1 y 72\n,,)

22

^-l*-i

21

22

rJ'i :<l

ti

,.

El cdigo C finaliza aqu...


Fin del Ejemplo 1.7

'La recomendacin es realizar la traza del programa cudadosamente


con valores
entrada
simples.

de

Ejempfo 1.8 convertir una letra Mayscula en


Mnscula y viceversa
El program a a realizar debe recb; corno entrada
u.na letra que puede ser minscula o
mayscula' cada letra posee una representacin
ASCrt fo que permite manrpular la
entrada y saber con exactitud cual letra ha sido
introducida por el usuario. Los pasos
para resolver el probiema se muestran
a continuacin:
Paso

l:

Paso

3:

Se lee una letra.


Paso 2: Segn el cdigo ASCII se calcula la diferencia
entre
minscula y mayscula de cualquier letra, eso para la representacin
obtener el valor
numrco que permtir hacer la conversin. para
todos los casos ese
nmero es 32.

Siendo a:91 , b:98


--1aa
:!
y A:b5, 8:66, ...,
Z:90 Sg
establecen las condicones oue permiten saber
si la letra introducida es
mayscula o minscula.

Unidad 1: Estructura de Controlde DeCIsn

Volumen 2: Estructuras de

@ Copyright tBM Corp. 2005


Los materiales del curso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito de
lBM.

ConJrolenT-Z

o
o
o
o
o

Guia Cer EstuCiante

Inroduccior a la pro;-ama:rcn co

,l.A.

':ii es ffia/scula, al vafor ASCII que


la representa se le suma la diferenca
mencionada. Er resurtado obtenioo
p"r"
de ros casos representa
et cdigo ASCil de ta conversin
",l"rq;;
de ta tetra
l",
Paso 4' Se muestra en pantafla
la representacin de la letra solicitaca.
El cdigo C comienza aqu...

o
o
o

o
o

=
-

_:_

- _ ..

-: . . :_ : . ; )

l._

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

:.'<l=:l_.,,,ra,',&cn);

i) e-tto"

lo"- ;.:::t:
:

:':=''-'A',)
/" Er resultado entre cualquier
letra
i j (ch-\:97)&& (ch<=I22) ) /- s
{
es mrnscu]a - /
cr-:d-if,. ,/* Se transforma en mayscula ,,/

r^-f
err L!

de direrenc:-a nu-u:'ca enrre rocia


minscura v

v_f

fo
!o
,O

es 32 -/

ri ( icn>:65)&& (ch<:9C)&& (en::o::._;)


i /, S es nayscu1 */
ch+=iif ,/, Se transforma en mi-nscu1a * /

Jrrj,u..

'':u

Core-Lat.i,a

eS:

,:,,.:-,,,,::_i:,

El cdigo C finafiza aqu...


El cdigo anterior utiliza una
varable liamada enrro, cuyo
aporte ar ejercicro segn ras
concjcones estabfecidas en
los rf es impedir que arguna retra
sea considerada
mnscula y maysculaala vez.
Existen otras formas de sentencias
er pranteamiento especificado que o""rionaran if ms adecuadas
prescindir

ifl:oi::"rver

de

Fin def Ejempto LB


A continuacn se expricarn ras
diversas formas de sentencias

if.

fi
;o !,

Si es minscula' al vafor ASCII que


la representa se le resta la diferenca
calculada en el paso 2

Volumen 2: Estructuras Oe ConiroGnT

Unidad

l:

gstru

@ Copyright tBM Corp.2005


Los materiares delcurso fro pueden
sr ieprooucidos en parte
o en su totalidad sin el previo permis
escrto de tBM..

dicha

Gula det.Estudiante

7. Las Diferentes Formas de sentencias ir


se han estudiado varias formas de la sentencia
se listan todas stas en las lneas siguientes:

if

en esta unidad. para conveniencia

f. if (condicin)
Ejecuta una so_l-a sentencia,.
2 - if (condrcin)
Ejecuta una sola sentencia;
else
Eecuta una so.la sentencia,.
3. if (condicin) {
E;ecuta una o ms sentenc.as;
]

efse

Ejecuta

una

rf (condicin)
Ejecuta una sola se:::e:

efse{

if (condicin)
E j ecut a u:-a j:
p I so I

riF-':':

1--:

5.

I i

i f \vvrrqr!rvtt/
lrA

44

^
-^-:l

!\

l_!__-. ^

--3-

^- ^^

^-,

'-t

..--l:

q=nren-

:-+ti-_a u:la

qFntcnni:c.

.'

]
^^
^t >c
sa
E.-

ecuta u:a sola sentencia,.

Es fcil cometer un error en la condicin de la


construccin

el operador incorrecto. Al observar el siguiente piojramaif, principalmente si se usa


escrito en c se reflejan
afgunos de
estos inconvenientes.

Unidad 1: Estructura e Control Oe DecsOn

Volumen 2: Estructuras de Conirol en

@ Copyright tBM Corp. 2005


Los materiales del curso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.

tO

o
o
o
o
a
o
o
o
o
o
o
o
o
o
o
o
o
o

Guia del Estudiante


I

O.

!r

ol

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

t
t

t
lr
li
p

tio

o
o

lntroduccio:l a la p

s"cJ

e-

tj-t

rS
prrtlL--:
-Fi

/ lrrl
t L_L

Ft cdigo C finaliza aqu...

Fi pt-ograma anterior es un programa muy sencllo. se supone


que toma un nmero
postivo y verfca s es cero o difrenie de
tero. Es extremadamente simpre y a prmera
vrsta parece correcto. Asuma que se compla el programa
y se ejecuta.
Se ingresa 2s y el programa muestra como salda
lo sigurente:
numer:o C es ciist j l-.o de :e:c
a intentar pero con er vaior. 2so, o e inciusive
-25. En cada caso, er programa

tr_1

::1,::g:

El numero 0 es Crsin:c oe cero


Note que la salida es la misma tambin para el
valor de entrada o. El problema con el
pi-ograma anterior se debe a que se desea
escribir la primera condicin
sigue:

if (x::

"o1o

C)

En vez de esto, se escribi.

rf (x:

0)

Esta sentencia asigna el valor de 0 a x. De manera que


en la sentencia if, la
astgnacin de 0 a x resulta en un valor falso
sin importar el valor de entrada que
indique el usuario' Dado que la condicin del
ir evala a falso, fa porcn del etse de
la sentencia i f siempre se ejecuta:
et se
a /\\r
^-l
-( Lll numer ?d es distinto de ce:o\n",x);
Irrrnrr
cons ;'ere a continuacin otro eror comn que
ros programadores comenten
frecuentemente. Asuma que se desea escribir
er siguiente cdigo:
if (x > y)

printf ("x es mayor gue y,,);


En rez de esto, escriben el siguiente cdigo:
if (x > y) ;

Printf ("x es mayor gue y',) ;


Volumen 2: Estructuras eEntrot

enT

Unidad

l:

Estructura de Control d

@ Copyright tBM Corp. 2005


Los materiales def cuTo no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito
de tBM.

OecOn

Iz

Lasentenciaprintfseejecutasinimportarsisecump|e|acondicinx>
Esto sucede porque si la condicn evala a vERDADERo,
el computador ejecuta una
sentencia nufa simbolizada por ef carcter ,;, que sigue
a la condicin (x > y). En
cualquier caso, la sentencia printf se ejecuta. Si la
condicin evala a FALS9, la
sentencia nula se salta y la sentencia printf se ejecuta
de todos modos.

El lenguaje c es un gran lenguaje, pero tiene caractersticas que


usuario se mantenga alerta todo el tiempo. Usar scanf("o/od,,, requieren que el
nurn) en vez

scanf("%d', &num) es otro enor comn que cometen ros progrnul


A continuacin se estudiar otra estructura condicional, la
estructura switch

8. La Estructurl

switch

de

- case.

case

una construccin anidada j-: ... er se puede ser difcil de


entender. c provee otra
construccin, la cual permite escribir programas cuando
un nmero de condiciones
alternas debe ser validada. Esta construccin se le denomina
switch... case, y su
sintaxis es la siguiente.
swrtch ii'a_a:- =
.'

'

a= c:

--:
j::.-_=:-l-:S,.

_ ,.
;_^
-_==.-,

. C1S+'.-:

-:.':

:;=:;, "."
ca

se

va r cr:-:

sen:enc:as,.
brea k,.
dof

:rrl

sentencias,.
break;
)

si la sentencia break no est presente la ejecucin fluye rgicamente


siguientes del prximo case, lo cual comnmente no se desea. a las sentencias
A continuacin se
explican con un ejemplo esta construccin para entenderla.
Ejemplo 1.9: lmprimir los Das de la Semana
Escribir un programa que tome como entrada un valor entre y
1 7 e imprima el da de la
semana que coresponde al nmero que se ingres. 1
denota Lt oi" r-ln"s, 2 Martes, y
as sucesivamente. si la entrada no es vlida s debe mostrar
un mensaie.
El cdigo C comienza aqu...

1 #i-nclude <stdio.
2 mainO {

h>

Unidad 1: Estructura de Control de Decisin

Volumen 2: Estructuras de Controlen

@ Copyright tBM Corp. 2005


Los materiales dercurso no pueden ser reproducidos en
oarte
o en su totalidad sin el previo permiso escrito de lBM.

1g

o
o
o
o
o

Gua del Estudiante


_ a:_

E /* Verificar
.inmero
entre 1 v 7 En caso contrario
lndica aJ- usuario*.que el nmeroe,et
es. j-nvlido

oi
oi

:I
o
O

a
o
o
o
o
q
o
q
o
?
?
o
I

?
aut a

l\J
I

,t.

p
D

sv

se

j
*_o/ - \ Ir
^

/nr1
\rru1L,

f b

10

oi

o
a
o
o
o
o
o

-.

^-l-!-/rr-

ol
ol

/r:

atrr

Aceptar e.l- nmero r por parte del usua:.-o


/ crue represent.a
cie Ia semana . /
-_f rr_l ( _n::esar un \-e.c: e:.:-+ : .. 7 cue:dentl:iq.re
urr
&num dia ) ;
-s canf ( " Ed ",

ol
ol

a
o

IntroCuccin a ia proqrarncin co r-

rr
- <
lJ_ ar L !

-<o

ES

l1
r2

13

,1

..

_5

hro:

16

ttt.

-,ir++
P:rrrur

i- r lrr

11

hro:

i.

18

yarrjLr

/tt_.\ :_

l^-^-r..

;;

aq4

F.

a:a:

1.

2I
22

nvi-+
Prtru!

lre

nri

nj- : I tt--

14

23
24

-icf

:, I -.

ttt-'
\ :_

k,.
L

]ra

l,

n-r

r:

25
c

21

L LLaLLZd

el swi-tch

El cdigo C finafiza aqu...

En el cdigo anterior cuando se ntroduce algn


entero fuera del rango de valoi-es
permtido, se despliega un mensaje que
muestra el uso de una vafidacinl En prximas
unldades del curso se estudtarn mejores
formas de validacin que permrtan que el
usuario se recupere de algn ingreso errado
de data.

=:''tch" cas avuda ar prosrama a cambiara ra porcin de cdiso


5:;-:r:::"1u:
Lrurlue :-j:: :- : -,-ar-c: (varor es igual
a 1, 2,3 y as sucesivamente). Esto es
equivalente a io siguienre:
; f /^..*
*r
\lluliL

:r
--c

::

_,

f i ,,r- 1 es l-unes \n,, )


e-lse if".r.a
(num_i.a :: 2)
P::intf ("41 2 es Martes\n"
e-Lse :-f (rur, dla :: 3
,-

,.

Volumen 2: Estructuras

Oetonten

Unidad 1: Estructura de Controf de Decis-

@ Copyright tBM Corp.2005


Los materiales del curso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrto
de lBM.

1e

Introduccin a la programacin con

ef

se -f (num-dia := 1)
printf ( "El 7 es

Gua del Estudiante

Domi_ngo\n")

,.

Fin del Ejempto 1.9

switch case es una construccin sofisticada para situaciones


como se present en el ejempfo anterior donde mltiptes construcciones
if se usan.
La etiqueta case default se usa para imprimir un mensaje
cuando la entrada no es
La construccin

vlda.

La construccin switch -.. case se puede usar slo para


condiciones de igualdad. No
se puede usar para una condicin, tal como if (day_num <:
10). La variable en la
construccin switch
case puede ser cualquiei tipo de dato que puede ser
enumerada (datos alfanumricos), esto significa que los tipos de
datos ffoat y
doubl_e no son tipos de datos vlidos.

Ejemplo 1.10: verificar la validez de una Fecha de Entrada


Dada una fecha como entrada de la forma da, mes

y ao. El programa tiene que


progr"r" c p"r" verificar

verificar si la fecha ingresada es correcta El algoritmo y t


la validez de la fecha se dan a continuacin:

Paso

"

l:

lngresar la fecha como dia, mes. ani-c.


Paso 2: S (dia est entre 11-311, mes entre
t1_12)

Paso 3: Si (mes

es

vlida.

Paso 4: Si no, si

[g, 4,

y ar_: > O)

6,IIl y ef dia

(mes 2 y dia

dia <: 29), entonces la fecha es vlida.


Paso5:Sino,si(meseS[I,3,5,J,B,l0,72]yd1a<

ld

fecha es vlida.
Paso 6: Si no la fecha ingresada no es vlida.
EI programa que implementa el algoritmo se da a continuacin:
EI

cdigo C comienza aqu...

#lnc]ude <stdio.

marn O

int dia/ mes, anio,. /* anj^o equivale a ao */


rnt f echaVal-ida;
/* Aeeptar eI da, mes y ao de parte deJ. usuar:,o */
printf ( "Ingresar el_ Dia (DD) : ,,) ;

5
6

h>

scanf ("Bd", e dia),.

Printf ("fngresar el_ Mes (MM) : ',);

scanf (',?d,,,

10

pri-ntf ("fngrresar el- Anio (yyyy) : ,,);

&mes) ;

Unidad 1: Estructura de ControlOe OecsOn

Volumen 2: Estructuras de Controlen

@ Copyright IBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

20

.lo
o

r)

o
o
o
o
o
o
o
o
o
a
o
o
a
o
o
o
o

Gua del Estudiante

i "
Venficar
-q can

", 6:

li (me-s:: 2 ,!& an'c z 113 ::

=:

:-

oo

__= - -:

fechaValida:
si e]. mes tiene

Veri-ficar
e-se

rf
1i

( (mes

ir

^t

r,r=-- --

*=re::*

, I nes

mes -:9
:

=ur-:t-ll_lc

r;

-^

iecra

r,'a-L .

c= : 2;

.I

- 1^^'

a
o
a
a
o
o
a
o

?d es una echa ccr::ecaa\,r",

d. a,

i_:sCA/

cas e

2: p:r::tf ("?d ?d ?d es ula recha incorreci_a\n",

dra, \

brea k;

t
I

soJc

3: printf("?d
anio);
brea

%d %d es

una fecha incorrecta\n"

^j

k,.

/* Fin del switch */

o
o
o
a^
IU
O

o
a
o

i Ic);
que el da ingresado es rt icic r1-"1\
Verificar ql:e e1 mes i_ngresado es walido (1--L2) *
/
rf ((dia >:1 && Cla <: l-)ee (mes >: _ e mes <
= _. !6-:._-, > 0, i
Aqu el da ingresado puede ser wIrcio, se
verifrca
si g] mes
30 das *,/
if((mes:! llriLes
(cia <: 30 ) )
fechaValjca = _;
'- Verificar si e1 ao es bisiesEo -,1

of

O
O

Introduccn a la progi-amacin con

Volumen 2: Estructuras Oe CotroG-

Unidad 1: Estructura de Control O Decis-

@ Copyright tBM Corp. 2005


Los materiales def curso no pueden sr reproducdos
en parte
o en su totalidad sin el previo permiso escrito
de IBM

Powered by TCPDF (www.tcpdf.org)

Powered by TCPDF (www.tcpdf.org)

Powered by TCPDF (www.tcpdf.org)

Powered by TCPDF (www.tcpdf.org)

Powered by TCPDF (www.tcpdf.org)

Powered by TCPDF (www.tcpdf.org)

Powered by TCPDF (www.tcpdf.org)

ol

or
o
o

Gure dei Estudiante

8)

a
o
o

o
o
o
a
a

l^ --^ ^ la
Hrol-3-iaJrf"rr'uJuuuJIt a

uso ncorrecto?

definido como

flDat

,! f 3l i 3l

cul de los siguientes es un

a) ptol 6i
b) ptli t3l
c) ptll t1l
d) ptrl 21

i0)

Qu define un arregfo declarado corno .:,-- three


a) Un arreglo tridimensional.

Lil t2l t3) ;?

b) Un arreglo bidimensional.
c) Un arregio unidimensional.
d) Un arreglo de O dimensiones.

o
o
a
o
o

o/
o\
o
o
O

o
o
o
o
o
o
o
a

o
o
e
ri
a
_l

t?
o

Votumen

.^

Cul es la forma correcta de acceder a un elemento


Cel arreglo defrnroc cc:nc

9) Para un arreglo

*l

lf

char xf_:l f5l;?


a) x
b) xlll
c) x l-11 | .b, l
d) x [0] t0l

OA
oi
O

lnt-n^l riA^

Unidad2:Rne@
@ Copyright tBM Corp. 2005
Los materales del curso no pueden ser reproducidos
total
o parcialmente sin ef permiso previo escrito
de lBM.

tntroduccin a la prosiramacin con

Gufa del Estudiante

Respuestas a la unidad 2: Examen de Autoevaf uacin

bn6l---

1t
2)c

3)b

aL
:!
s) ayb)
6)d

\'t3"'--'='l!---\
*
\

7)b
8)d
e)b
l0) a

Unidad 2: Arreglos Multi-Dimen;,onales


@ Copyright tBM Corp. 2005
Los materiales dercurso no pueden ser reproducidos en parte
o en su totafdad sin el previo permiso escrito de lBM.

Cua del Estudiante

o
o
a
o

a
o
o

lntroducciol a le ?rocrraot3^ ::

unidad 3: Laboratorio de Arregtos

Objetivos de Aprend izaje


Al final de esta unidad, usted ser capaz
de:
' Emplear tipos de datos estructurados

.
.
'

en ra sorucin de probremas.
Usar areglos unidimensionales y
bidmensionales.
Aplicar arreglos a problemas con matrices.
fv4anipular los elementos de un
arreglo tanto para arreglos unidimensionales
como arreglos multimensionales.

o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
O

o
o.
O;

o
o!

.l
q
q
q

a
o

Volumen S: T

Unidadg:@
, -

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden
ser reproducidos total
o parcialmente sin etpeniriso previo
eicrto de lBM.

,-

Introduccin a la Programacin con C

Gufa del Estudiante

Ejercicios de Laboratorio
l) Escrbir un programa en C que tome 10 enteros positivos

como entrada, los

almacene en un aneglo y los imprima. El programa debe ordenar el arreglo de tal


forma que todos los nmeros impares aparecen en el tope seguido de todos los
nmeros pares (en el mismo orden en cual aparecieron orginalmLnte). Este arreglo
ordenado de esta forma debe tambin imprimirse. Se puede usar otro arreglo pra
resolver el problema.

2)

Considere una matriz cuadrada de orden n


datos de dicha matriz (nmeros enteros)
elementos en el borde.

n. Escribir un programa que lea los


y encuentre la suma de todos los

Los elementos del borde son aquellos que estn en la primera y la ltima fila y
columna. Pueden usar mltiples estructuras iterativas para solucionar este

problema.

3)

Desarrollar un algoritmo que clcule el tringulo de pascal. La disposicin de dicho


tringulo sugiere que cada nmero sea la suma de los dos que estn encima de l:
1

11

121
1331
14641

Unidad 3: Laboratorio de Arreolos

a,

Volumen 3: Tipos de Datos Esi--rcturados en

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

46

o
o
o

Gua del Estudiante

-_

Unidad 4: Estructuras

A
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o (,

tntroduccn a la programac,r:

Objetivos de Aprend izaje


Alfinal de esta unidad, usted ser
capaz de:

'
o
'

Explicar cmo declarar estructuras


en C.
tas estructuras en ra sorucin de probremas

ff;*;j

J;:."

a travs de.

Describir er uso de ros tipos de


datos definidos por e usuario.
Definir uniones y explicar cmo
sus usos difieren del de las estructuras

o
O

o
o
o
o
o
o
q
o

it

?
?
o

I?
p

IfD

('ul

Volumen 3
Unidad 4:

Copyright tBM Corp.200s


Los materia tes det
ser irooucidos
toral
o parcialmente sin et permiso previo ellrto
de lBM.
@

*:l:"j:::d:l

Estructural

47

lntrodurcin a la Prograacin co!

Gufa del Estudiante

l. Introduccin
En las unidades anteriores, se discuti cmo declarar tipos de datos bsicos coro
inr,
! fl-oat, as como las estructuras de datos llamadas aneglos. Se trabaj en
situaciones para solucionar problemas que requeran que se usase slo uno de
estos
tipos de datos o estructuras de datos.

char

Sin embargo, en el mundo real, se deben tratar situaciones para la solucin de


problemas complejos en las cuales se tenga que manipular entidades que
son una
coleccin de elementos de datos, cada uno de un tipo d'iferente. por ejemplo,
en una
universidad donde el registro de un estudiante debe tener, entre otras cosas,
un nmero
de lD (un char), un nombre (un arreglo de cnar), peso (un floar) y ta altura (un
f loat). Los tipos de datos son todos diferentes, pero existe una agrupacin lgica que
es significativa - un registro de estudiante. Para manejartales situaciones, C pvee'un
tipo de dato llamado structure.
Las estructuras, como arreglos, son capaces de manejar mltiples elementos de
datos
usando un nico identificador que los agrupa a todos juntos. Mientras los arreglos
contienen mltiples elementos de datos, todos del mismo tipo, las estructuras contienen
mltiples elementos de datos, cada uno de los cuales puede ser de un tipo diferente
(en
una estructura, los mltiples elementos de datos pueden tambin ser del mismo
tipo. be
manera que, en una estructura, los elementos individuales pueden ser enteros,
cjrcter,
punto flotante o un arreglo. Los elementos de una estructura se denominan
miembros.
Sea una situacin que involucra manejar las fechas de nacimiento de un grupo
dado de

personas.

Hasta ahora, el mtodo conocido para hacer esto era declarar tres varjables
enteras. taf
como sigue:

'

int dia, mes, anio,.


int di-a_nacimiento, mes_nacimiento, anio_nacimiento;

Sln embargo, algunas situaciones pueden requerir que se manejen diferentes


tipos de
fechas, tal como fecha de ingreso al trabajo, fecha de graduaci, fecha de matrimonio
y fecha de la .ltima promocin. Est claro que cad uno de las fechas anteriores
involucra tres componentes da, mes y ao.
Esta es una de las reas en donde las estructuras se usan. Las estructuras permten
que elementos de datos que tenga una lgca comn pero que pueden
ser de diferentes
tipos, sean tratados cohesivamente. Conidere una situacin de solucin de problema
que requiera el manejo de cinco fechas diferentes: nacimiento, ingreso ai trabajo,
matrimonio, ltima promocin y jubilacin. Estas pueden ser manejadaJcomo
sigue:

int
rnt
rnt
int

dia_nacimiento/ mes_nacimiento, anio_nacimiento,. .


dia-ingreso-trabajo, mes_ ingreso_trabajo, anio_ingreso_trabajo,dia_matrimonio/ mes_matrimonio, anio_matrimonio;
dia_ultima_promocion, mes_ u_lti-ma promocion,
anio_ ultima_promocion;
int dia_jubi_Ia:rc:., mes_jubilacion, anio_jubilacion;
Unidad 4: Estructuras

Volumen 3: Tipos de Datos EstruttuEdosEn

@ Copyright tBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

4g

o
o
o
o
cD

o
o
o
o
o

Gui::e,

:s:uCiante

Las operaciones que se hacen con las fechas son todas comunes,
no r:nDci-i3
especfrcada, como por ejemplo 'Encontrar el nmero de das
transcuridcs
fecha ocurri ms temprano'. Las estructui"as ayudan a alcanzar
esta ccnesron

2. Definicin y Uso de Estructuras


Se puede definir una estructura en C como sigue:
struct <nombre de la e-s:t uc-tua)i
nLJ-IIIDrC_1

o
o
o
o

o
o
o
o
o
o
o
e
o
o
JH

b (0
o
o
o
o

,.

m-iemb::c_l;
mi emb::o_..

|;

struct es una paiabra reservada mandatoria El trmino (nombr=


de fa estructura> es cualquier.nombre (usando las reglas para la creacin de un

Aqu, la palabra

identificador) que identifique la estructura. cada uno de los


miembros, tal como
m-embro-l o mj-embro-2 es una declaracn individual para los miembros
de la
estructura' Los miembros pueden ser de cualquier tipo de dato, incluyendo
arreglos y
estructuras en s mismas. En el contexto de estructuras, los
trminos definicin y
declaracin se pueden usar por igual. Se puede decir que se
est definiendo
estructura o declarando una estructura sin ninguna diferenca especfica una
en el

signficado.

A continuacin se presentan algunos ejemplos.

Ejemplo 4.1: Definir una Estructura


^^L-

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

:r:

lrrL

ul-4,

fnt mes;
lnt ai-r-lo,'
j;
Esta es algo que ya se ha visto antes. sta define una estructura
llamad

iecha

con
los miembros dia, mes, y anio, todos los cuales en esre caso, son
enteros. Sin

embargo, no se puede poner

int dia :

28 en una definicin de estructura.

Nota: Lo anterior slo define una estructura. Ninguna variable est declarada
all. para
declarar variables, se puede usar la siguiente declaracin.

sLruct fecha nacimjento, :ngreso_trabajo, jubilacion;


Cuando se dice fecha, se est refiriendo alcomienzo de la posicin
de memoria de la
estructura definida anteriormente. cuando se hace referencia
a las
tal como
nacimiento, ingreso-traba jo.' jubil-acion, se est refiriendovariables
a una estructura
completa que contiene tres miembros.,l,r" desea hacer referencia
a ros miembros
individuales de la estructura en cada variable, se hace lo siguiente:
Volumen 3: TPos Oe Oatos estructurados en C

Unidad 4:

@ Copyright tBM Corp. ZOOS


del grT::1!lr"den'ser iproo
es
Los materiaf
ucidos tora I
o parcialmente sin et permiso previo
de lBM.

"itrito

Estructwas

Gufa del Estudiante

nacimi-ento. dia
j ubilacron. anio

Esto implica que el acceso se hace como sigue:

variab-Ie

ni embro

Ua vez que se ha accedido a los membros individuales


usando el operador . (punto),
se puede hacer uso de los miembros de fa estructura tal como
lo dicta ef tipo de dato del
miembro.
El siguiente es un mtodo para declarar variables de
la estructura fecha:

s-L:ii:: :e:ha nacimiento,

ingreso_trabajo,

jubilaclon;

Las variables de un tipo de estructura individual pueden


tambin ser declaradas como

sigue:

strjc:

<nombre estructura> variabJ_e_1,

var_iable_2, ..., variabJ-e_n,.


La estructura f echa y las variables individuales pueden
ser declaradas como sgue:
<1- - ^r e

F^^L^
_sulO

rnt dia;
int mes,.
int anio;
Jnacimiento, ingreso_trabajo, jubilacion;
El siguiente es otra forma de definirlas.

c),

stattc struct fecha{


'I nl.

air .

int mes,int anio,.


lnacimiento, ingreso_-,rabajc, jubilacion;
Note que las definiciones anterores todas definen la
misma estructura y variables.

Fin del Ejempto 4.1

Unidad 4: Estructuras

Volumen 3: Tipos de

Oatosffi

@ Copyright tBM Corp. 2005


Los materiales dercurso no pueden sr reproducidos
en parte
o en su totalidad sin ef previo permiso escrito de lBM.

o
O
O

o
o
o
o
o
o
o
o
o

Gua del Estudiante

o
o
o
o
o
o
o
o
o
o
o
o

q
q
d

.l
q

q,

r\ I
)

IA

R.

A y B son variables de un tipo de una estructura que es fraccion mixta.


Esto
permite representar fracciones mixtas como por ejemplo 1T
en la estru"tri" 0""0"
parte-entera: 1, numerador: 3 v clenorninacjor: . Tambin se puede definir

esto como sigue:

_struc

int pat:re_eltera,.
I ta nUirLe]:aCiOr;
: :.; denorninacio..
Note que se ha omitido <nombre estructura>, l cuaf es opconal.
Las variables
creadas A y B, tienen las mismas propiedades que la definicin anteror.
Fin del Ejempto 4.2
Ejemplo 4.3: Nombres de personas

Se sabe que generalmente los nombres de las personas se registran como prmer
nombre, segundo nombre y apelldo. Se puede definir una estructura
llamada nonLbre,
con el primer nornbre, segundo nombre y apellido como miembros.

struct

nombre

char pr:'mer [2A) ;


char segundo [20] ;
char apellido [_a 5 ] ;
I

mi-Nombre;

Note que los miembros son arreglos,

cada uno de ellos puede ser de cualquier tipo y


apelfido
varable miNombre como
i:::Nombre.apellido. ste es, sin embargo, un arreglo de caracteres. se debe
acceder a fas partes individuales se usa miNombre.ape]tidoIk],
donde k es un

tamao.

Se puede acceder al

de Ia

enierode0a44.

trn esta estructura se tiene un espacio de 20 caracteres para


el primer y el segundo
ncmbre y otro espacio de 45 caracteres para el apellido. Se puede
cmbiar estos
valores si la aplicacin fo requiriere. Note que esta esiructura
tiene miembros, todos los
cuales son arreglos de tipo char. Por lo general, las estructuras pueden
tener
mtembros de diferentes tipos, ellos tambin pueden ser
algo similares como se mostr

er: ei ejemplo anterior.

Fin del Ejempto 4.3


Volumen3:

TiposOeOffi

Unidad 4: Estructuras 51

-t

IJ
I

_.

c:n

Ejemplo 4-2: La Fraccin Mixta como una Estructura


s'..-J -'. ':.,
. ..:. r. _x:_:
:t: pat:r_e_err: e:a,.
_:.1 numerador,.
i nt cienomi nado:;

o
o
o
o
o
o
o

inti-oduccin a la Proqrara:ron

@ Copyright tBM Corp.2005


Los materiales dercurso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de lBM.

Introduccin a la prgramacin con

Gufa del Estudiante

Ejemplo 4.4: ,-,

struct dir:eccion correo{

) yt

"ttlr"t nombre mrNombr,.


char primera_linea l25l ;
char segunda_f inea l-25) ;
char cafl e[25) ;
char area [30] ;
char ciudad L25l ;
char codigo_postal f 9l ;
char pais l20l;
^.
Y/

Note que una estructura se usa dentro de otra en este


ejemplo. La estructura nombre
se usa dentro de la estructura direccion-co.rreo. Para
acceder al primer carcter
primer

def

nombre de

p, se le debe referir como

p. mrNombre. primer.[

s se requiere imprimir

sque:

O]

la direccin de correo en la variabre p, S pude


usar el sguiente

segmento de programa:

El cdigo C comienza aqu...


Tn^-i-;a- la salida estndar la direcci_n de correo de 1a
-1 //* upllxrrr
estructura */
)
Tnn*i*iL
//, up!!ur_r
eI primer nom.bre */
r
prantf("%s",p.miNombre.primer);
1 /* Se imprime un espacio despus de1 primer nombre */
5
pr:_ntf(" ,,);

r'- fmprimi-r e1 segrrndo nombre a J-a sal.ida estndar *,/


:::ntf ( "8s ", p.miNombre. segundo),.
,'- Se imprirne un espaci_o despus d.e1 segnrnd.o
nonbre *,/
t\.._rflttrr\_

,'- fmprimir a la salida estnda.r e1 ape11i do +


/
-: :' : -_ : i " ? s \ n,,, p . m-iNombre . ape 1 t i cic ),.

Tmn-i;ln-i-prinera
r^.-er!
J-a.
Lnea de la Direccin a 1a salida estndar */
j
::- :^: ("?s\n", p.primera_linea)
,/ - rnpr:-mir 1a seg.una Lnea de
1a Direccin a ra salida estnd ar * /
::-.--_: I "?s\n", p. segunda_]inea)
/- Inp::nir 1a ca1le a J-a sa1ida estndar */

,.

,.

c: - a-:: , " ? *"',:t ", p. cal-.le ) ;


Lu,Lrur- e.t//* Tnn-ii
^1
rea a 1a salida estd.ar *,/
p::::: l "! ",:1", F. a:ea),.
'/- rnprimir el nom-bre de la cru.rad a 1a salid.a estnd.ar */
c:::::i i "?s\,:1", p. c:ucad ),.
Unidad 4: Estructuras

Volumen3:

TiposOe@

@ Copyright tBM Corp. 2005


Los materiales dercurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

o
o
o
o
o
o
o
o
o
o
o

3-':

o'ei :sudiante

rmprirnir eI cdrg'o pcstal de la


ciudad a la sal:-da est.ar
'-!. ,/, Imprimir eI nomlre
ciel pais a la sa]-ida estndar
25
orntf (,,?s\n,,,p.pai5),.
Ef cdigo C finaliza aqu...

Esto ilustra como trabaiar con estructuras


en una situacin de programacin. se
imprimi cada membro e fa estructura
i.
recci on -correo como cadena usando el
especificador de formato ? s.
Fin del Ejempfo 4.4

Ejemplo 4.S: Registro de Estudiante


struct estudiante {

o
o
o

s:tartc: non::a nmbe_es1-ud-iane,.


char nun_id i 9l ;
struc: recna :,ac_mienio,.
f-loat pesc;
fl_oat altu:a;
int iq;

O
O

o
o

:::::Xrrfl::,[?j"

o
o
o
o
o
o
o
a
o
o

dectaracin vrida

st_:-uct externo

struct :rivell {
st-uct nlvel2 {
struct nivel3{
n'i-

*/

l-1

3; ll

stn de declaraci-n

de

Ia estructura

]I2; /* Ein de dec]-aracin de La estrucrura 2 */


Jf 1,. /* En de dec]-aracin de 1a estructura
L */
]ext; /* En de declaacin de -r-a estrrctura
exterz,a */

una estructura puede contener cualquer nmero


de miembros, los cuafes son
estructuras en s mismas. Es tambin posble
tenei varios niveles de estructuras
una estructura. por ejempfo, to siguiente
es una

?
b
o

frlosofia [100]

En esta estructura, se ha declarado una


varable firosofia que es un arregro
de 100
elementos, cada uno de los cuales es
un registro de estudiante definido anteriormente,
con m'embros' se puede referir al ao
oe acmento v ar iq del primer estudante
en
esta cfase como sgue:
fi_Iosofia I O] . naclmi entc. an.1 o
fi-losoflal0l.rq

o
o
o
o
o
o
o

.^uw
^

IntroCucci:n le Proora-r2^r.F
J *
'sv'J"

Volumen a: Tip

Unidad :

,^

_,

. ..

@CopyrightIBMCorp.2005

Los matenales delcurso no pueden


ser reproducdos total
o parciafmente sin elpermiso previo escrito
de lBM.

EstruczuEl

Sg

lntroduccin a la prodramacin con

Gua del Estudante

En una declaracin tan profunda como la anterior, se deben tener


cuidado cuando se
accede a un miembro de la estructu ra. Para acceder a la variable
k declarada en
struct nivel_3, se debe hacer lo siguiente:

ext.11.12.t_3.k
Note que ef nmero de operadores que se usan es tanto corno
ef de definiciones de
estructuras' Es una buena prctica de programacin evitar definiciones
de estructuras
con anjdamiento muy profundos.

Un punto importante a resaltar de la declaracin anterior es que la


variable de la
defincin de la estructura ms interna se crea dentro de la
definicin de la estructura
principal. se han llamado estas como rr, 12 y r3.
Esto es porque no se pueden usar
las estructuras ms interna sin declarar una variable, y no hay forma que
se puedan
declarar variables de las estructuras ms interna fuera de la definicin
de la estructura

prirrcipal.

Fin del Ejempto 4.5

Ejemplo 4.6: Inicializar una Estructura


Considere la siguente estructura.

struc: jrac- : ::. :.:::-_ai


l_n rar:e_::-:e:a/.
'ln-

*--

i-v.

;;;;;,._._:=,..,
j;

se puede asignar valor a la variable en la

continuacin:

declaracin misma como muestra

struct :a,-_-r-.:._:...:.: :a a : lI,3,4j;


se crea una variabre a, como se muestra a continuacin.
a . parte_eni_ e:a = _
a. numeracior - l
:
s.

lan-i
s!rvrrrlrqvL- -^;^-

Esto es justamente una representacin de la fraccn mixta 1Ta.


Tambin se puede
declarar la variable de la estructura separadamente e inicializar
los valores a travs del

programas como sigue:

struct f::accior :L, >::a


1nt parte_e:teua;
int num.eradcr,'
'i nt denomi nador;
]a;
a.parte_entera = 1;
a..numerador : 3;
a.denominador : 4;
Fin del Ejempto 4.6
Unidad 4: Estructuras

Volumen 3: TiposOe

Offi

Copyright tBM Corp. 2005


Los materiales der curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

o
o

Gua del Estudianre

Asuma' que se requiere tornar dos fracciones mixtas como


entrada, sumarlas y mostrar
el resultado' sean las dos fracciones mixtas e : r% y
3 1% respectivamente. para
sumarlas, se debe primero convertir ros nmeros
a la forma numer:ador/cienominado.

74: (4 * 1 + 3) / 4 : 1/4
Esto es lo mismo que
(cie;rominacior * par:e_entera

con esto, se tienen ambos A y B como 1 / 4. EI denominador


es

Ef siguiente es er argoritmo para sumar dos fracciones


mrxtas:

or

Paso

Paso 5: Encontrar el MCM de x y v Paso 6: Formar Z: ( (l,t)CM ,/ X. denominadcr* X. nume-adc:


)
(MC!4/Y. cienoni nador* ) y. rumerador
) /
Paso 7: Convertir z en la fraccin mlxta c.
Paso 8: lmprimir A, 3, y c.

#include <stdio.

o
o

h>

marn O

/* Declaracin de Ias estructuras


srl-uct f raccion_mixta {
rnt parte_entera,.
int numerador;
int denominador,.

MCM

El cdigo C comienza aqu...

El programa en C, basado en el algoritmo anterior,


se desarrolla usando el refinamiento
paso a paso.

l:

Declarar las fracciones mxtas A y B.


Paso 2: lngresar ras dos fracciones mixtas positivas y varidarras.
Paso 3: Covertir e a la forma de fraccin impropia x.
Paso 4: Convertir e a la forma de fraccin impropia v.

a
o
o
o
o
o
a
:l
?\t

+ numeradc-) / denom:-nador

comn, as que ef MCM


es4'Porrotanto' A + B= (7 + 1) / 4:74/1.Eri4/4debeconvertrrseauna
fraccin mixta como 3 (el cual es pa.rte-entera
como un cociente entero) y 2 (ef cual
como mduto de divisin). Et MCM permanece como
el
::-::,::i::.0o,
vervlllraug'!.

o
a
o

Ejemplo 4.2: Sumar Dos Fracciones Mixtas

o
o
o
o
o
a
o
o
o
o

a
o
o
o
o
o
o
o
a
o
o
o
o
o

lntroduccion a la programacin con

1
u

'tn
1t

)7\
)rt

Dl

struct fraccj_on_impropia
int numerador,.
int denominador;

Volumen S:

Unidad 4: Eshucturas 55

@ Copyright tBM Corp. 2005

tos materiares dercurso no pueden ser reproducidos


total
o parcialmente sin el permiso previo escrito de tBM.

Introduccin a la Progiamacin con

72
13

ix, Y, Z;
i-nt u, vt

Gufa del Estudiante

mcm/ mcd;

14 /* Obtener 1os clatos del usuario para 1a primera fraccin mixta A */


15 /* Obtener entrada del usuario para J-a parte entera de fracci */
printf ("rnoresar 1a primera parte entera de l_a fracc:-on \
16
(posi-trvo) \n,');
I1
18
do{
19
scanf ("8d", &A.parte_entera)
20
)while (A.oarte_entera <: O);
2I /* Obtener de1 usuario el- nr:_oerador de 1a fraccin */
prin-,f ("Inqresar e1 primer numerador\n") ;
22
23
do{
24
SC.ri("2i", &A.numerador),.
25
)wh:1e (A.::umelador < 1),.
26 /+ Obtener entrada de1 usuario para eI denominador de la fraccin */
prlnt f ( " lngrr:esa: ef pr-imer denominador\n,,) ;
21
28
cio i
29
scanf ( t' %cjr', &A. denomj-nador)
30
)while(A.ienom.inacjo: <: 0);
31 ,/* Obtener 1os datos de1 usuario para formar J-a segunda fraccin
mi-xta B* /
32 /* obtener entrada de1 usuario para parte entera de la fraccin */
printf("fngresar ra seounda parte entera\n");
. 33
34
do{
35
scanf (,'Zd,', &B.parte_entera) ;
36
)whi1e (B.carte_en'.era <: 0),.
31 ,/* Obtener entrada de1 usuario para el nufierador de Ia fraccin */
38
printf ("Ingresar e!_ segundo numerador\n', ) ;.
39
doi
40
scanf("8d", &B.numerador);
4I
)while (B.numerador < 1),.
42,/* obtener entrad: de1 usuario para e1 denominador de 1a fraccin */
43
prin*'f ("fngresar el segundo denominador\n")
44
do {
45
scanf('8d", &B.denominador);
46
)whJ-]e (B.denominador <: 0);
47 /* convertir la primera fraccin mj-xta (A) a una fraccin inFropia
para formar X */
48
i(e.numerador !: A.denominador) {

,.

,.

,-

Unidad 4: Estructuras

Volumen 3: Tipos de Datos Estructurados en

Copyright IBM Corp. 2005


Los materiales del curso ng pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

56

o
o
o
o
o

Guia oel Estudiante

!=i
:,

o
o
o
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o

tI

10

b
I
p

i .line:a.]ai

,1

:,

lntrodu:cin a la proqramacin cc:

i, .

enOnrl:j-:

)l

nrrmo-:^i--

- .:,.:.::--:_e:l:a:a

- A. J::t!n

- .-.. :_.. :tt::._:r:):.t:

--r1,-r _ .:.-:rurne:at--:,.

c,)

o!-4J!- caJ

r
-

Y'=

grlL=-Gt

Y nnmi-=^--

5q

I
)

56 /* Conwertir 1a
para formar y */
51
-i(3.nj:r,.:ajc:

segrr:nda

\_ r, ;n,:-=--

59

Y. cienoii:,ado
I

6!

-) ^^

:::a

(B) a u.na fraccin

improria

--;^-.

3. deomi nadot

+ 3. numei:acior:;

62

vr.rislLc-c!J_
..- - --;^.-

63

Y. denonr nacior

64
65 /*
66 /*
61 /*
68 ,/*
69 /*
10
17
12

nixta
i

58

6A

fraccin

Determi-nar e1 MGI cie X e y */


Mo"l(u,v) = (u * v) / MCD(u.v) -/
se quiere determrnar el MClc de X.denominador
Y Y-denoe.inador */
Buscar e1 MCD de los dos */
Calcu]-ar el MCD de 1os denomi_nadores d.e X e y
u : X.denominado:,.
v : y. cienom.j nado:,.
wh|le(u l: O && r, l: C)j

14

if (u >: v)
u: u ?

15

efse

16

78

v: v ?
i,f (u :: 0)
mcd : v,.

19

e-1s e

13

11

tc

v,.

u,.

mcd : ui
J

a2 ,/" Calcular e1 MCld de Ios denominadores de X e Y */


t3
mcm : (X.denominador * y.denominador) / mcd;
:,:,/* Calcu1a Z = X + y * /
,a
Z.numerador : (mcm,/ X.denominador)* X.numerador + \
t
(mcm /y. denominador) * y. numerador,.
t;
Z. denominador : mcm;
Volumen3:

TiposOeDffi

Unidad 4: Estructuras 57

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sn elpermiso previo escrito de lBM.

lntroduccin a la Programacin con C

Gua del Estudrane

88 * convertir z a una fraccin mixta para formar c */


89
C.parte_entera : Z.numerador / Z.denominador;
90
C.numerador : Z.numerador \ Z.denominador..
9L
C. denominador : Z. denominador,.
Tnnrii,
//* uulr&tr
c Por salida estndar cuando resulte en noero ente''o */
93 /* l'{anejar casos especiales de una fraccin aqti */
94
if(C.numerador :: C.denominador) .
95
printf ("E_l resu-l-tado es gd\n,,, C.parte entera) ;
96
e_lse {
9- '/ - rmprimir la fraccin mixta c a ra salida estrdar *./
y
p:_ntf (',El- resul_tado es %d y Zd / gd\n,,, \
99
C.parte_entera, C.numerador, C.denomrnador),.
1C0 i
iOi ' /* La funcin main termina aqui *,/
92

El cdigo C finaliza aqu...

Fin del Ejemplo 4.7


Este programa es un poco largo, pero bastante directo. Se ha refnado
cada uno de los
pasos en el aigoritmo en un conjunto de sentencias que
los implementan.

Ejemplo 4.8: calcular el promedio de Notas de los Estudiantes

Para re'forzar la comprensin del uso de estructuras en la solucin


de problemas,
consdere el ejemplo de calcular el Promedio de Notas de los
Estudiantes de una

clase

en particular de una universidad.

En una clase, asuma que hay un mximo de 100 estudiantes. Cada


estudiante est
regstrado en los msmos seis cursos en un semestre. Al final
del semestre, el instructor
asigna letras de calificaciones de la A a la E a cada uno de los
seis cursos de cada
estudiante. Cada uno de los seis cursos es de 3 unidades (horas
crdito). El promedio
de Notas de los Estudiantes se calcula en una escala de 10 puntos. para
aceresto, los
siguiente,s son las notas asociadas con cada uno de las calificaciones
en letras:

410
B

r-

Asuma que un estudiante obtiene las siguientes calificacones


en los seis cursos:
Curso 1
A
Curso 2
Curso 3

D
B

Unidad : Estructtras

Volumen 3:Tipos de Datos

Effi

@ Copyright tBM Corp. 2005


Los materiales der curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

o
o
o
o

Gua del Estudiante

4
Curso 5
Uurso ti
Curso

.r

o
o
o
o
o
o
o
o
o
o
o
a
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
Oi

ol 0
ol
ol
ol
al

toutut

I uut

A
A
E

El Promedio de Notas del Estudiante se carcura como


sigue.
(10 "3 + 4* 3+ I "3 + 10 * 3 + 1C " 3 + 2. 3) /(6 " 3)
(30 + 12 + 24 + 30 + 30 + 6) / .18

132/18=7.33
Todo lo que se debe hacer es sumar la puntuacin de cada curso, multiplicarlo pcr 3
(unidades del curso) y dividirlo por el nmero tctal de unidaoes.
El siguiente es ef argoritmc para sorucicnar este probrema:

Paso

l: Declarar una estructure

para el registro del estudiante.

Paso 2: Declarar un arreglo de 1oc estudiantes para los registros.


Paso 3: Ingresar y varidar ros datos dados por er usuario.
Paso 4: Para todos los estudiantes.
calcular el promedlo de Notas.
imprimir el NoID, I{rmb:e, Gados

y e1 p::omei,o cie Notas.

A continuacin se escribe el program a para realizar esta tarea, aplicando refinamiendo

to

lntroduccin a la

paso a paso y usando cada uno de los pasos del algoritmo.

EI

2
3
4

I
8

10
11

I2
13
'1 A

15
L6

cdigo C comienza aqui...


i*;iclude <stdlo.h>
*-nc-ude <ctype. h>
n,1n O

/+ Declaraci-n de 1as estructuras */


,/* Decrarar rrn arreglo de l"o0 estudiantes para Ios reg.i_stros
scruct reg_rstro_estucii ar:e {
char noid [ 9] ;
char nonrre[5C];
char grados [ 6] ;
float pn,.
] llsta [ 100] ;
Decl-aracin de VarihJ.ss
int- n_est, k, ), num;
double pn;

*7

obtener como entrada de1 usuaro e1 nmero de estucliantes


printf("fngresar
el- numero de estudiantes < 100\n,,);

Volumen 3:

TiposOeffi

Unidad 4:

@ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de lBM.

Estructuras

59

scanf ( "td", &n_


lwhr.Le(n_est < 1 l/ n pqi \ 100);
Obtener las entradas acerca de todos ]-os estudiantes
cr(k : 0,. k < n esr,. k++) {
r \tttr^--^^^--i
frgtg>dl
-v-rrrsr
+
r
it.

.l-^^

para el estudiante zd: \n". \

/* Obtener la entrada del usuari-o del noid */


.:'itaf ("Ingresar el NOID (max 8 caracteres) : \n,')
s:a:f ("tr",lista Ik] .noid) ;
'- Obtener como entrada del usuario e1 nombre
::t:-: j 1,'f rgresar e-l nombre (menor a 50 caracteres)
-

,.

rr\.

entrada del usuario cada uno de 1os 6 cursos */

com

^h!^-^-.

: o; ) < 6; j++){
:f

lush (stdin

,-

p:rntf ("i:rEresar .la nota de1 el_.. \.r


=:\nil
^-,
gv

Cul:so

l-a-tr1

\.
, irl
J,tt,

1
{

scanf (,,?c", &lista Ik] - g.rados t j l t' n- le (:oupper (Iista I k] . grados t j I )


i :oupDe: (lista I k] . grados tj I ) > 'E' );

entradas realizadas para todos 1os estudiantes


el Promecii o de Notas para todos 1os estudiantes
; :'- < :t eS:; k-+) {
:

Promedio de Notas >ara e1 estudj-ante k


estudiante ?d\n',, k+1 );
tr^_:lt^:_ia

_-

t,-r

i^l
uel

J;

= C; i < 6: i-+\f
rtt
:irj ( "?c\n", toupper (Iista Ik] .yraqw)tJ.l
*--i^^
f I1
));
:-: (:oupper (lista Ik] . grados t j I )
num:num*30,.
erse if (toupper(l-ista Ik] .grados ijl )
rRrl
num: num + 24,.
e-lse if (toupper (t_ista Ik] . grados t j I )
vJ
num:num+18;
el-se if (toupper(l-istaIk] .grados tjl )'D'
)
Unidad 4: Estructuras

Volumen 3: Tipos de

Oatoffi

Copyright tBM Corp. 20OS


Los materales dercurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

Q.

o
o
o
o
o
o
o
o
o
o
o
o

:e

o
o
o
o'a
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

t
?t
t
A),

I
I

o
p
i

Introduccin a ia

^t

--..

- Calcular e1 promedio de NoLas


de1 estudante */
pri = (double) num / Ig.O;
- Imprimir los detalJ-es de1 estudiante */
- fraprimir eI noid del esLud,iante /

prantf ("E-I ncid def estudiante es: gs\t,,,


- Imprimir el- nombre del estudiante *,/
prrntf ("Ef nombr:e ciel estudiante es: \
?s\t',, r i.au ik] .nor,be);
- Im-orimir el pN de] estudi-ante -/

o
o
o
o
o
o
O

Esi:Ciante

L_r.:Lr-- t/ lr-:Jl

__1\ o=_L

s:Jc:r,:+

listaIk].ncrd)

es: lE\:_tr,, Fn);

El cdigo C finatiza aqu...

La estructura de registro cel estudiante es bastante


clara.
stempre que fueron necesarias. como se pudo
notar:

se hicieron las validaciones

se acept soro ras retras A hasta

'
'

ra E para ras carificaciones.


Para calcular el Promedio de Notas, se usaron los 'nmeros
mgcos' 30,24, 1g,
12 y 6' stas son las notas asocadas con las respectivas
cafificaciones de la A a
la E, multiplicados por3 unidades (ejempro: 30=
io * 3,24=g"3etc.,.

'

Dado que, num es de tipo entero, antes de calcular


el gpa, se convierte al tpo
f -loat.

Este ejemplo ilustra el uso de estructuras su declpracin


y sus usos en un programa.

Fin del Ejempfo 4.g

Volumen3:Tipo@
.

Unidad 4:

@ Copyright tBM Corp. 2005


Los materiares der curso no pueden ser reproducidos
total
o parcialmente sin el permiso previo escrito de lBM.

Estructuras 6i

l.t.dr""i" l" P.
"

el Estudiante

3. Tipos de Datos Definidos por er usuario


C permite al usuario definir sus propios tipos de datos. La
sentencia

typedef

permite

a
los usuarios definir nuevos tipos de datos que son equivalentes
a
los tipos de datos
existentes. un nuevo tipo de dato puede ser definido como
sigue:

t,pedef tipo_ex. stente nuevo_tipo;

tipo-existente se refiere a cualquier tip'o de dato estndar como int,


char,
otros tipos de datos definidos por el usuario previamente que
estn
disponibles. Ef nombre del nuevo tipo de dato definido porel
usuario es nuevo-rrpo,
siguiendo
Aqu,

fl-oat u

las reglas para formar identificadores. Esto s slo un nombre


nuevo dado a
un tipo de dato previamente definido. No existen diferencias
fundamentales entre el
nuevo tipo de dato o el definido previamente o el tipo
de dato estndar. sea la siguiente
declaracin:
*rat

:--

c--_

- ,

La declaracin anterior define un nuevo tipo de dato flamado


a r-nt. Con esto, se pueden declarar variables como sigue:

anio

que es equivalente

anio A, a, :-*.],:.:-::.:::::c,.
Se puede usar el

t\ipeie

anterior y declarar las siguientes variables tambin:

-l-

En este caso se declara x


arreglo de enteros.

y:

como arreglos del tipo

. se pueden tambin decrarar equivaientemente

typedef inr anio.:,


anio X, y,.

anio,

gu son realmente un

C;
rc siguiente.

_;

A continuacin se presenta cmo se usa la sentencra


;,.,p.1e: con estructuras.

tlpedef strucc

m i oml-. -.

miemb::c_2;

;, ^-"-^ -.

nuevo-t ipo,.

Se puede usar este mtodo para definir un nuevo tipo:

typedef struct {
char noid[9];
char nombre [4 O] ;
int a-ltura,.
Unidad 4: Estructuras

Volumen 3: Tipos Oe

Dato@

Copyright IBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
@

(0.

o
o
o
o

o
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

3 - ;a cel Estudiante

i_ .u
oa
?

::^

Las variables se pueden declarar como sigue:

regi st-o_cie_estudiante alumni, est_pt:i m:_a:t :


Es recomendable hacer uso de la sentenci

Permite definiciones

'

estructuras.

'

No se necesita escribir

struct

Asignar un nomcre

'

,,,..

l_

rypedef por las siguentes razones:

declaraciones concisas

se referencia a una estructura

de varrales basados en

nombre-estruc-r::ra

reoetir1as vpces cuando

a una estructura, que sugiera su propsito,

declaraciones ms legibles.

hace

ras

se llego al final de la drscusin acerca de las estructuras. Es imporlante


notar aqu que
una variable de estructura puede ser pasada y retornada a
una
funcin tal como
cualquier
otro tipo de dato estndar.

4. Uniones
Las uniones son similares a las estructuras. Af igual que
las estructuras, stas contienen
miembros cuyos tipos de dato pueden ser diferenies.
En una unin, los mrembros
comparten el mismo espacio en memoria. La razn principal
para el uso de una unin
es ahorrar espacio en memoria. Esto es especialmente it si,
en una apticacion, slo
uno de los miembros se usa bajo una condicin. Los valores
no tienen que ser
asignados a todos los miembros al mismo tiempo.
rrni
urrr v_:

^^-^
-tulLJj

j=e- :^
irLr

- a_

erJ:)ro_

J;

La manera de crear variables y usarlas es de la misma forma que


Considere por ejemplo, la siguiente definicin de unin:

en strucr.

uni on {

j.nt x,'
float y,.
char z;

o
o
o
o
o
o

Introduccicn a ia Prcci-anracr:

l-

^.

se definen tres variables a, b, y c, fas cuales son uniones.


En la unin, se han definido
tres variables x, y y z (cada una de un tipo difererente).
Cuando
a' debe entender que es una estructura con miembros x, y yse considera la variable
z. En una unin, sin
embargo, los miembros x, y y z de la variable
a comparten el mismo espacio de
oru. un irf ocupa ms memoria que u char, un floar
3:::r:.^taT^:;^1"1:
'rnl"n;i,
ocupa
ms memora que ur int. Existen muchas tareas
o"
que deben

Volumen 3:

Unidad 4:
Corp. 2005
.tos materiales @delCopyright tBM
pueden

curso no
ser reproducidos total
o parcialmente sin elpermiso previo escrito de lBM.

Estructuras

Og

lntroduccin a la

Gufa del Estudiante

hacerse cuando se usan uniones, pero todo esto es tomado en cuenta

por

el

Los miembros de una unin pueden ser de cualquier tipo de datos, arreglos

compilador.

estructuras. Se pueden tambin usar uniones con arreglos. Al usar el 'operadorlunto,


como en las estructuras se hace referencia a cualquier miembro de la unin. Se puede
realizar lo siguiente para hacer referencia a un miembro de una unin:

fl

,l

.t

b.z
Por lo tanto, una unin en C es bastante semejante a una estructura. El uso de unin
depende de s ef ahorro de espacio es vital para la aplicacin

Unidad 4: Estructuras

Volumen 3: Tipos de Datos Estructurados en

@ Copyright tBM Corp. 2005


Los materiales del curso no pueden ser reproducidos en parte
o eR su totalidad sin el previo permiso escrito de lBM.

o
o
o
o
q
o
o
o
o
o

3.:ra

::l

Estuclante

lntroduccin a la Proorarna:i:-

Resu rnen
Ahora que ha compretado esta unidad, usted
debe ser capaz de:
. Explicar cmo declarar estructuras en C.

'
'
'

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Discutir el uso de las estructuras en la solucin


de problemas

programas en C.
Describir er uso de tener tipos de daios definidos
por el usuario.
Definir unones y explicar cmo su uso difiere
del de las estructuras.

travs de

ol

Volumen 3: Tipos e Oatos gstructurados en C

Unidad 4: Estructuras- 65

Copyright

@
tBM Corp.
t::l?!yuo"n' r"i2005
Los materia tes del
irod ucidos tora
"u elpermiso
o parcialmente sin
p*u
de lBM.

""[rito

lntroduccin a la prgramacin con C

Gua del Estudiante

Unidad 4: Examen de Autoevaf uacin


1) Cules de las siguientes son una deflnicin correcta de una estructura?
a) struct {
int struct;
float

y;

t;
' b) struct {
int x;
float y;
) et

C) struct

i n+L a
f,tt

float
l
) st

r.

y;

F.

d) Todas fas anteriores.

2)

Al igual que los arreglos, las estructuras no pueden contener mltples elementos
de datos de diferentes tipos.
a) Verdadero.

b)
3)

Falso.

pueden ser parte de una estructura.


Constantes de cadena.
Variables enteras.

a)
b)
c) Constantes enteras.
d) Constantescarcter.

4) Cules de los siguientes tipos de datos son vlidos dentro de una declaracjn de
unton'1

a) Tipos de datos primitivos.


b) Tipos de datos definidos por el usuario.
c) Ambos (a) y (b).
d) Ninguna de las anteriores . .

Unidad 4: Estructuras

Volumen3:

TiposOeOffi

@ Copyright tBM Corp. 2005


Los materiales def curso no pueden ser reproducidos en parte
o en su totafidad sin el previo permiso escrito de lBM.

o
o
o
o
o

o
o
o
o
o
o
o
a
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o
o
o
O

o
o

Gu, :e_!studiante

-{)

Introduccin e

Programacin con C

considere que se accede a una variabre estructurada


esie caso, cules de los sigurenies identificadores como ..b. c.c
se reieren

estructuras?

lor.

a) a/ b, cyd
b) a. byc
c) a yb
d) Slo a
6)

Considere la siguiente definicin de una estructura.

s:ruct

I nr

float
i

y,.

h.

Es vlida la asignacin a.
a) Verdadero.

b)

x = u.\,, ?

Falso.

La siguiente es una definin vrida de un


tipo estructura

7)

tyoedef struct

i ni- w.

float
.|

a)
b)
8)

mr Prop.i a

y,.
,.

Verdadero.
Falso.

Los tipos de dato definidos por el usuario se


definen usando la palabra reservaoa
de C.
^\ struct
d)

b) -rn i n
c) typedef
d) Ninguna de las anteriores.

cures de ros siguientes es un uso correcto de typedef?

D) :'.'pecie: :.ca: n:\-ar;


c) :','pede: f loat char miVar,.
ul
.{\

-,,^^r^
__r'j-rae

^}a-v
nombre taOl ;
I crtqL

o
o
o

o-J
o
o
o

Volumen S: frpos ae Oatos

EstructuEd[$T
_

UnioaoZlEsiffiEs-

Copyright IBM Corp. 2005

. . ^L-^,^
L*
T:::l?:s-detcubdno
o parcnlmente sin
@

pueden ser reproducidos tota|

elperriso previo escrito ;l-M."-'

En

varrables cje

oz

Introduccn a la pro'gramacin con

l0)

Gua del Estudiante

cules de los siguientes es una definicin correcta de una unin?


^\ untoni
d)

int x;
float y;
char z;
J

rr .

b) union{
int x,.
float y,.
st:ucr jech z;

d) Todas las anteriores

Unidad 4: Estructuras

Volumen 3: Tipos de Datos Eatrturados en

Copyright tBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo perrnso escrito de lBM.
@

6g

o
o
o
o
o
o
o
o
o
O

a
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o
o
o
o
o
o
a
o
a
a
o
o

ot

o'-

o
O

Gua del Estudante

lntroduccin a la Programacin co

Respuestas a la unidad 4: Examen de Autoevatuacin


1) b y c
2)b
3)b
4)c

s)b

6)a
7)a
8)c
e) byd
r0) d

Volumen 3: Tipos de Datos Estructurados en C

Unidad 4:

Copyright tBM Corp. 2005


delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de tBM.
@

Los. materiales

Estructuras

69

Introduccn a la programacin
con C

Gufa del Estudiante

Pgina dejada intencionalmente


en blanco...

0)

Unidad : eltructuras

Volumen g:

@ Copyright tBM Corp. 2005


Los materiales delcurso no pueden
ser reproducidos en parte
o en su totafidad sin elprevio permis
escrto de lBM.

a
o
o
o

Gua oei Estudiante

:cn

UnidaC 5: Laboratorio de Estructuras

0'

a
o
o
o

Introduccin a la Prooran-iacin

Objetivos de Aprend izaje


Al final de esta unidad, usted ser capaz cje.

.
.
.

Usar estructuras en una situcin de solucin de problemas.

Desarrollar algoritmos para un problma que involucra el uso de estructuras.


Escribir un programa en C para impfementar una algoritmo que usa estructuras.

o
o
o

o
O

a
o
o
o
a

o
O

o
o
o
o
o
o
o
o
a
o
o
o
o

or
,OJ
o
o
o

Volumen 3: Tipos de Datos Estruclurados en C

Unidad 5: Laboratorio de

@ Copyright IBM Corp. 2005


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de lBM.

Estructuras

71

Introduccn a la programacin con


C

Gua delEstudiante

Ejercicios de Laboratorio
1)

considere ra estructura de una fraccin mixta, que


se da a continuacin.
struct fraccion_mezciada i
int parte_ent era
int numerador;
int denominador:

,.

It

li,ilr,j."r

fracciones mixtas

y B que son ras entradas suministradas por


er

Escriba un programa que caicule:


La resta deAmenos (A B asignndola
a la fraccin mixta c. La multiplicacin de a por (A B) asignndola
a la fraccin mixta n.
respectivamente, y mustrelas.
. lmprima las fracciones.

Declarar una estructura que consista de


tres miembros:

. Nmero del libro (un entero).


. Cdigo del fibro (un areglo de g caracteres)
. Precio del libro (un valor f ioar).

Escriba un programa que tome como entrada


10 lbros y muestre los detalles de
los mismos.
5)

0,)

Establecer un fistado de suscriptores de


una revista. Los datos de entrada de cada
suscriptor son:

. Nombre.
. Cdula.
. Mes de inscripcin.
. Ao de inscripcin.
Realizar la bsqueda de cada suscriptor por
nombre, Iuego del ingreso de toda la
informacin.

I
:

Unidad 5: Laboratorio de Estructuras

Vofumen 3: Tipos de Datos estructuraOos en


C

Losmateriar"rd"?"c,o,3JXtJii,t"T":"9;"??3or",o"senparre

Fr! ,

=t_\N Ysv.lu5

o en su totalidad sin el previo permiso


escrto Oe

tnli

Z
e

o
o
a
o
o
o
O

o
o
o
o

o
o
a
o
o
o
o
o
o
o
o
o
o'
o
o

E-ry---n-

------------

--nr-

a:I

rt_@

Introduccin a la
Programacin con C

(Cdigo del Curso: Cy320)


Versin 2.0

Gua det Estudiante

Vofumen 3: Tipos de
Datos Estructurados en C

a
o
o
a
o
a
o
o

IBM Learning Services


Worfdwide Certified Material

Informacin de Publicacin
Esta pubficacin ha sido producida usando Microsoft Word
2000 para Windows.

2OOO

y Microsoft powerpoint

Marcas Registradas
IBM @ es una marca registrada de Intemational Btrsiness Machines Corporation.

Otras compaas, productos y nombres de servcos pueden ser marcas comercales o


marcas de servicio de otros.

Marcas Registradas de otras compaas como se muestra


Windows

Microsoft Corporation

Red Hat Linux

Red Hat

Edicin Septiembre de 2002


La informacin contenida en este documento no ha sido someda a ninguna prueba
formal de IBM y es distribuida bsicamente "como es" sin ninguna g"rtf"
i" .""
expresa o implcita. El uso de esta informacin o la implementacin Ol cualquiera
de
estas tcnicas es responsabilidad def comprador y depender de la habilidad de ste
para su evaluacin e integracin en el ambiente operacional del cliente. A pesar
de que
cada tema ha sido revisado por IBM para su exactitud en una situacin especfica,'no
h.ay garanta de obtener el mismo resultado o uno similar a ste en otra sitlacin.
Los
clientes que intenten adaptar estas tcnicas a sus propios ambientes lo hacen bajo su
propio riesgo.

Gopyright International Business Machines Corporation,

derechos

reservados.

ZOO2.

Todos los

Este documento no puede ser reproducido en su totatidad o en parte sin el previo


permiso escrito de lBM.
lnstrucciones especiales para la impresin de ste curso

No deben removerse las pginas en blanco que puedan aparecer al final de cada

unidad y entre dos unidades. stas han sido insertadas intencionalmente.

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Contenido
Unidad

l:

programar con
Arregfos

Objetivos de Aprendizaje

l. lntroduccin

2. Declarar un Aneglo en C
3. Inicializar un Aneglo

4. Desanoffar y programarAfgoritmos
con Aneglos
5. Cadenas de Caracteres en
C
Resumen

24

27

Unidad 1: Examen de Autoevafuacin


Respuestas a fa Unidad l: Examen

28

de Autoevafuacin

30

Unidad 2: Arreglos Mufti-Dimensionales


Objetivos de Aprendizaje

31
31

1. Introduccin

32

2. Resolver problemas con Arreglos


Bidimensionales
Resumen

33

45

Unidad 2: Exmen de Autoevaluacin


Respuestas a fa Unidad 2: Examen
de Autoevaluacin
Unidad 3: Lab. programar con
Arregfos
Objetivos de Aprendizaje
Ejercicios de Laboratorios

Unidad 4: Estructuras
Objetivos de Aprendizaje
1. Introduccin

2. Defrnir y Usar Estructuras


3. Tipos de Datos Defindos por
ef Usuario
4. Uniones
Unidad 4: Examen de Autoevatuacin
Respuestas a la Unidad 4: Examen
de Autoevaluacn
Unidad S: Laboratorio de Estructuras

46
48
49

49
50

5l
51

52
53
67
68
71

74
75

Objetivos de Aprend2aje
Ejercicios de Laboratorios

75
76

o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

fntroduccin a la

ramacin con

Unidad 1: Programar con Arreglos


Objetivos de Aprend izdle
Alfinalde esta unidad, usted ser capaz

'

'
.
'
.

de:
Expficar ef concepto de anegros en ra sorucin
de probremas
Definir qu es un anegto

Describir cmo acceder a un eremento de


un anegro
Explicar cmo usar los aneglos en algoritmos

Desanoilar argoritmos para probfemas que requieren


er uso de aneglos
Explicar cmo convertir algoritmos en programas
C.

o
o
o
o
o
o
o

o
o
o
O

o
o
o
o
o
o
o

Volumen3:Tipos@

Unidad

t:

erogramar

uos materiales del curso no pueden ser reproducldos


toat
o parciafmente sin elpermiso previo es'crito

de fBM.

co@;

l. Introduccin
En las unidades anteriores se estudiaron los.tipos
de datos simples, tas estructuras de
las construcciones iterativs. Esta unidao or'crt"
lorlp"f" 0"t"",
3H:l#:ffJ':iul
Muchas aplicaciones requieren el uso de mltipleg
elementos de datos que tienen una
caracterstica en comn. Argunos ejempros.orrn.
ron,

o
.
'

Las carificaciones obtenidas por ros estudiantes


en una crase.
Los nombres de los empleados en una compaa.

La artura y peso de todos ros pacientes admidos


en un hospitar.
Hasta ahora, el nico mtodo que conoce para
almacenar tas calificaciones es en una
variable' como por g'emplo, notas. pero,'
mo se almacenan las calificaciones de
100 estudiantes?' una forma de hacerlo ei.tener
100.variabfes, como por ejemplo:
notasl, notas2 notas3. Sin embargo, sera ms simple
referirse a rn" coleccin
de calificaciones con un sofo iJentificaooi llamado
notas, y an ser capaz de poder
referirse a ras carificaciones de un estudiante
en particular.

Esto se hace usando una estructura llamada


aneglo. Tcnicamente, los aneglos son
estructuras en memoria que ayudan a almacenaimrtipler
lrniori datos que
tienen una caracterstica comn. un aneglo
r

ir"runca con-un ,Ln nombre,


aungue puede tener mltiples elementos de atos.
Los efementos de "iol'nouiduales
pueden ser de cualquier tipo, tal como
enteros, flotantes o caracteres. pero dentro
del
arreglo, todos fos elementos de datos deben
r"i d" un iolo tipo. si r" t"*n un arreglo
de 50 efementos, todos eilos deben ser de un mismo
tipo, por ejempto int. No se
tener los primeros 20 elementos de tipo de dato int y
et rsto de eilos de tipo
:[:"J
Los arreglos son un almacn de mltiples elementos
de datos. Las dos formas en las
cuales los arregfos se pueden hacer jon:

Una sola dimensin


La Figura

i.1 ilustra un aneglo unidimensional.

.12
.24
ol

.65
of
Figura

Unidad

l:

Programar

l.l: Arregto de Unidimensional

2
@

Copyright tBM Corp.2002

Los materafes del curso no pueden sr reproducidos


en parte
o en su totalidad sin el previo permiso escrito de
lBM.

o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin a la Programacin con C

Dos dimensiones
La Figura 1.2 muestra un arreglo bidimensional.

12

-5

65

88

32

66

o
o
o
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
b

o
o

Figura 1.2: Arreglo Bidimensional

Conocemos acerca de vectores. Un vector no es ms que un arreglo unidimensional.


Por otro lado, un aneglo bidimensional se denomina matnz en matemticas. La
dimensin tambien se denomina el orden de un areglo.

En el aregfo unidimensional que se muestra en ta Figura 1.1, el orden es 5. En el


gneglo bidimensional que se muestra en la Figura 1.2, el orden es 4 x 3, es decir, 4
filas y 3 columnas.

2. Declarar un Arreglo en C
En esta unidad, se va a aprender solamente acerca de los aneglos unidimensionales.
Se puede declarar un aneglo unidimensional de la siguiente form:
int-

[ql

Esto resulta en la reserva de ubicaciones memoria, como se muestra en la Fiqura 1.3.


12

24
2

65
7

<_

f r1
d^ Ll
J

Figura 1.3: Ubicaciones en Memoria de un Arreglo


a
a

a [0] se refiere al primer elemento del areglo


0 . . 4 se refieren a los subndices de un arreglo. Los subndices en el
lenguaje C empiezan en o y terminan en n-t, donde n es el tamao del arreglo.
En a [0] , a s el nombre delaneglo y 0 es elsubndice.

a[0] cualquiera[k]

donde

0 <= J a= 4 reportaunvalorentero.

Volumen 3: Tipos de Datos Estructurados en C

Unidad

l:

Programar con

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducldos total
o parcialmente sin el permiso previo escrito de lBM.

Aneglos

Introduccjn a ta programacin
con C

Gua delEstudiante

Ef ltimo efemento delarreglo


a es referido como

Los aneglos se declaran como


tas variabfes de tipo
de tamao un

:':fr:Xilg?iXffg::

lor

a[a]

int, f loat

"'p""i-Joor

o char, excepto que

oe tml"

0"i""

er nmero de

Los siguientes son atgunas decfaraciones


vfidas de anegfos:
int notas [100J ;

char linea [80] ;


float peso [20] ;
Es tif definir nombres simblicos para
el tamao de
.ros anegros, en vez de estos
(el valoi n,:t"ri*1. Er , ;;Jeoen
oennlr-nt,ibres simbricos
fl:?,r1,mgicos'
#define NSTUD 1OO

#define es una--directiva del

prepocesador. una directiva


del preprocesador
da
anteS d" qr"
*ril"dor inicie er procesamientofe def

$m1:o|,"i|,":touaoor

En el Vofumen 6' Unidad 3 caractersticas


Adicionaleld." c, se aprender
preprocesador y er compitador
acerca del
de c. po' ar,oi, ."r"rn"u.b
aparezca NSTUD en ef programa
que
ser sustituloo'pr e-r'varor de
100.
Nota: La sentencia #define no termina
con un punto y coma (;).
Se puede ahora hacer la siguiente
decfaracin:
int, notas INSTIIDJ ;

;;#irri"rpre

se declara un a'egro de tipo entero


lamado notas con 100 erementos.

3. Inicializar un Arregto

f;;j#:s:

iniciarizar un anegfo

a travs a"

"rign""ion.

taf como se h2o con

ras

int k, num[tOO] ;
for (k=0,.k<1OO,.k++)
num [k] = O;
Todos tos 100 efementos en un
aneglo son inicializados en 0. Tambin,
puede
anesfo en el
de decrararro (normarmente praseanesros

ffif$|:)un

;;;;ni"

int num[5] = {tz, 24, 2, 6s, 7};

Unidad

t: p
@

Copyright tBM Corp.2002

Los materiates del curso no pueden


sr reproOucidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.

o
o

a
o
o
o
O

a
O

o
o
o

o
o
o
o
o
o
o
o
O

o
o
o
o
o
a
o
o
o
a
o

o
o
o
a

Gua del Estudiante

4. Desarrollar y Programar Algoritmos con Arreglos


Ahora que se conocen los fundamentos bsicos sobre los cuales la solucin de
problemas con aneglos puede ser construida y desanollada. En esta seccin se
examinarn un conjunto de ejemplos de desarrollo y programacin de algoritmos

usando aneglos.

Ejempfo 1.1: Almacenar un Arreglo con4,2,3...


Escribir un segmento de programa para colocar en un arreglo 1,2,3...

En otras palabras, para un arreglo num que est declarado en el programa, se debe
hacer que el primer elemento sea 1, el segundo elemento 2, y as suceivamente. Esto
debe resultar en un arreglo que puede vsualizarse como es mostrado en la Fiqura 1.4.
1

4
5

Figure 1.4: El Arreglo num


El sigiente segmento de programa fcilmente hacer esto.

El cdigo C comienza aqu...

/" nI archivo de encabezado con 1as funciones estnd.ar gue


soportan */
/*Ias operaciones de entrada y salida (stdio.h) se incluven */
#include <stdio. h>
/* La funcin main se inicj-a aqui */

maino {
,/* Decl-aracin de variab]-es */
int k, num[100];
/* nI bucle asigna 1 al primer elemento y asf sucesivamenLe */
for (k=0; k <100; k++)
numlkl = k + l-,'
)

/* La funcin main termina aquf */


El cdigo C finaliza aqu...

o
o
O

o
O

o
o
o

Volumen 3: Tipos de Datos Estructurados en C

Unidad 1: Programar con

@ Copyright IBM Corp.2002


Los materiales del cufso no pueden ser reproducldos totat
o parcialmente sin elpermiso prevlo escrito de tBM.

Arreglos

cuandok es 0, se reasigna 1 a num[0] .cuandok


es r-, se feasign? 2 num
Tarbin, se pudo iniciarizar usando num y

[r], y
usando ra siguiente

;::,:ffi:ivamente.

stat.ic int num

trOO

j = {_.};

:r?ff ?"'r?,:"f ;in,l:?,J'l!"i"!L:fl?,":[embarso,


Fin del Ejempto
Ejemplo

este no es un mtodo muy

i.l

l-2: Leer ra Entrada der usuario

ff,Hlffinfl::""

Dentro der Arregro

feer ta entrada de un usuario en un


arregro. Ef siguiente programa

El cdigo C inicia aqu...

i#:.:fiiivo

de encabezado con 1as funciones esrndar

gue

,/*fas operaciones de entrada y salida (stsdio.h)


es inclui do */
#include <stdio.h>
/" La funcin main se inicia aqu */
mainfl {
,/* Declaracin de variab1es */
int k, num[10]
,/*Obtener 10 enteros como entrada del
usuario para los elementos de un arreglo*
/
f or (k = 6; k <t_O; k++)
{
printf("fngrese un valor entero para e1
\
,.

elemenEo ?d: r! , k+1)


scanf ( tr?d", &num [k]

);

l
)

/* La funcin main finaliza

aqu */

El cdigo C finaliza aqu


El programa es bastante directo,
los valores de entrada se suministran del
teclado para
num [0] num [1] , y as sucesivamente.

Despus que el bucle termina, se tiene


'
un
aneglo con los vafores de entrada almacenados
desde num [O] hasta num [9] .
Fin del Ejempto 1.2

uno de los requerimientos ms comunes.


en tas oper:aciones con anegtos es imprimir
et
rormas de imprimii;;;i". en eisiint!"rpro
se
ffifl: ,ffi:iii*:'erabres
Unidad f : Progra
@

Copyright lBM Corp.2002

Los materiales delcurso no pueden s,,el-Or"idos


en parte
o en su totalidad sin ef previo permiso escrito
de lBM.

o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

Elsiguiente segmento de programa


imprime ef contendo de un
a'egro.
Ef cdigo C comienza aqu...

,/*Se incluye el archivo de encabezado


con las *,/
,/* funciones estandar que soportan
1as operacj_ones de *,/
,/* entrada y salida (stdi.h) */
#include <stdio.h>
/* La funcin main inicia aqu *7

O {
/* Declaracin de VariabLes */
inr k, num[1OOJ;
/* EI bucle inlcializa el contenido
del arreglo */
for (k=O- k <100;.k++)
numlkl = k + 1;
/* EI bucle imprime el contenido del
arreglo */
for (k=0; k <100; k++)
printf ( rnum [?dJ = ?d\nu , k, num
tk] ) ;
) /* ru funcin main termina agu */
main

o
o
o
o
o
o
O

Ef cdigo C termina aqu


El programa anterior imprme
fo siguiente:

num[0J =

num[1j = 2
num[2j = 3

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

in con C

Ejemplo 1.3: lmprimir un Arreglo

num[99] = 100
Nota: se us una construccin terat
iva paraimprimir el arregro.
Fin det Ejempto f .3
A continuacin se exprican argunas
operaciones simpfes en ros
afregros.
Ejempro r'4: tmprimir ros Nmeros
rmpares de un Arregro
En este eiempfo' se asume que
el arregfo contiene nmeros
enteros. se quiere que el
5,,f#iliJ$gT:j,:':""1quellos erementos que se;; ni'"ro. impares. Er sisuiente

Vofumen

S:

Unidadt:@z
@

Cooyright tBM Corp.2002

Los materiales detqirso no pueden


ser reproducidos total
o parciafmente sln el permiso previo

"ririto

de fBM.

Introduccin a ta programacin
con C

.
.
.

Paso

Gua del Estudiante

l:

Decfarar el aneglo num tlool .


Paso 2: Leer la entrada en el arreglo
num.
Paso 3: for(k = 0; k <100; k++)

if (num tkl * 2 != O)
printf (..Ed1,,, num tkl ) ;

[f:f impar.
,lJOoritrng. se verifica cada etemento det aneqto para determinar s es un
numero
S es impar, se imprim, ;i.",.;"t, y se
examina el prximo
efemento. del aneglo. El progr"r" que
implementa este algoritmo se muestra
a
continuacin:
El cdigo C inicia aqu...

/*Se incluye el archivo de encabezado con fas *,/


'/* funciones estandar que soportan las operaciones
/* entrada y salida (sEdio.h) */
#include <stdio.h>
/* La funcin mai-n se i.nicia acru */

d,e * /

main O {

,/* Dec]aracin de variabl_es */


int k, num[]-O0l ;
/" nl bucle inici-aliza el arregl0 con la entrada *,/
/* de]- usuario */
for (k = O; k <1OO; k++) {
printf (r'\nfngresar eL valor para ?d: ,,,k+1)
;
scanf ( u?du,

']

&num

[k] ),.

/" AI bucLe recorre el erreo.l^ -,a imprimir los */


/* nmeros impares */
printf (',La lista de los nmeros impares
es:\n,,),.
for (k = O; k <100,.k++)
if (num[k] Z 2 j= 0)
printf (', ?d1n , num [k] ) ;
]

/* La funcin main termina aou */


El cdigo C finaliza aqu

Nota: se tiene que verficar si un nmero dado es divsibfe


entre 2.
entonces se le consdera un nmero impar y
debe imprimirse.
Fin de Ejempto 1.4

Unidad

l:

program
@ Copyright tBM Corp. 2002
Los materiares det curso no pueden ser reproducidos
en parte
o en su totafidad sin el previo permiso escrito
de lBM.

si lo no es,

Gua det Estudante

El cdigo C empieza aquf...

,/*se incluye er archi-vo de encabezado con ras */


'/* funciones es'andar q'ue soport.an J-as operaciones de * /
/* ent.rada y salj.da (stdio.h) */
#include <stdio.h>
/* La funcin main inicia agul */
mainO

/* Este programa intercambia Ios elementos */


/* de un arreglo */
,/* Decl,aracin de 1as variables *,/
int var_num,k, Eop, bot, temp, num[100];
/* EI bucle obtiene el nmero de eLementos de1
arreglo ,, /

*,/

do {

printf (,,fngresar el 1mit,e de1 arreglo\n,,);

scanf ( tr ?d", &var_num) ;


) while (var_num < 1 ll var_num

> r00);
/* EI bucle inicializa e1 arreglo con 1a entrada */
/" del- usuario */
for (k=0; k <= (var_num_1),. k++) {
printf ( ,'f ngrese e1 el_emenLo ?d\n", k+1) ;

scanf ( u?du,

&num

[k] ) ;

/* EI bucle imprime eI arreglo original */


printf ( "El Arreglo original es: \n,,) ;
f

or

k < = (var_num- l_ ) ,. k++ )


Printf (',num[?d] = ?d\nu,k,numtkl

k= 0 ,.

);

/* S,I bucle intercambia e1 contenido del arregiro */


,/* fnicialzacin */
top = 9bot = var_num-1;
while (rop <= 5e {
,/* inEercambia num[t.op] con numlbotj */
remp - num [top] ;
num ltop] = DUrn [bot] ;
num lbot,J = Lemp.
top++; boE--,. /*t.omar eI sig,uienEe elemento */
Unidad

I:

Programar con Arr

10
@

Copyright tBM Corp.2002

Los materiales delcurso nb pueden sr reproducidos


en parte
o en su totalidad sin el previo permiso escrto de lBM.

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o

Gua del Estudiante

Introduccin a la p

amacion con

/* EI bucle imprime el arreglo con l-os elementos */


/* intercambiados *,/
printf("81 Arreglo con 1os elementos \
intercambiados es \n,,) ;
for (k=0,. k <= (var_num_1) ,. k++

printf

(,'num

[*d] ; ?d\n,,, k, num tkl

);

La funcin main termina aq) */


Ef

cdigo C termina aqu

se

a los estudiantes que

recomienda

;ffiffiffi:l::

:,,!fiff,lilentos'

reafcen el seguimento def prog*ma


con un
rambin J"o"n-Larro con un "r"gr" que
tensa

Fin det Ejempto 1.5

A continuacin se presenta un ejemplo. de una operacn


en areglos denominada
tcnica de Bsquea Lineal. rsii tcnica esu
oiro

afgoritmos llamados algoritmos de bsqueda.

de la categora generar

de

Ejemplo 1.6: Bsqueda Lineal de un Arreglo


Dado un arregfo de enteros num que contiene
un nmero mximo de etementos n. Ef
probfema es escribir un programa que
indica ta presencia o la ausencia de una entrada
var-num en un anegfo, buscndolo desde el comienzo
hasta el finat del areglo. Si el
elemento se encuentra, se muestra ra posicn
en
oonoe
se encontr, si no se
encuentra se muestra un mensaje apropiado.
La idea es recorer el arreglo desde
el comienzo y chequear cada elemento de num
con
var-num' siwar-num existe en el aneglo num, se
mlestra la posicin. Si se recore
todo el arregfo y no se encuentra var-num,
se rhuestra un mensaje apropiado. Debido
a que se recone elarreglo completo
en s@uencia desde el principio hasta elfinal,
se le
denomina bsqueda lineaf .
El siguiente es el algoritmo para focalizar
un elemento en un anegto usando el mtodo
de bsqueda fineal:

'
o
o
o

Paso

l:

fngresar n er nmero de erementos en un


anegro
Paso 2:Leer ros n erementos y armacenarros
en eranegfo num
Paso 3: Leer el nmero a ser buscado var
num
Paso 4: x=o

doi
if

(num

[k]

== var_num) {

VolumenS:npos@

Unidad

t:

, ^_
QCopyrighilBCorp.2002
los
materiales del curso no pueden'ser reproducldos

erogramar co
totaf

o parcialmente sln el permiso previo es'crito


de fBM.

A@f

Introduccin a la programacin con C

imprimir

J.a

var_num como k;
break.'

posicin
;-r elemento
__. qe.L

else k++,.
) while (k <= (n-1) );
Paso 5: Si (k > (n- r)) imprimirvar-num

o fue encontrado en elaneglo.

El siguiente programa imprementa este argoritmo,


usando er bucre do_whi1e.

El cdigo C inicia aqu...


/*Se j_ncLuye e1

archivo de encabezado con iras */


,/* funciones estandar que soporEan 1as operaciones de */
z'* e:tiraia y sal j-da (stdio. h) * /
: :rcl_ude <stdio.h>
i, La funcin main inicia acru *./

nal:r O {

/* Este programa implementa la Bsqueda Lj-neaI */


/ * en un arreglo*/
/* Declaracin de Variabl_es *,/
int n, k, numb, a [100J ;
int encontrado = 0;
/'iL bucle obtiene el nmero de eremenLos en el arreglo */
do{
printf (',fngresar el- 1mite de1 arreglo\n,,);
scanf ( u?du, &n) ;

) while (n < 1 ll n > 100);


/* EI bucle inicial-iza el arreglo con la entrada */
/* suministrada por el usuario *,/
for (k=O- ._ (n_1),. laa {
printf ("fngresar elemento td\n",k+1),.
scanf(u?du,catkl);

/* Toma la entrada de1 usuario del nmero a buscar */


printf ("fngrese el nmero a ser buscado\n,,),.
scanf

r'

?dtr , &numb) ;

,/*El, bucle realiza 1a bsgueda Lineal en el arregLo */


,/* e imprime si e1 nmero es encontrado o no t /
'L
-

^.

do{
Unidad

l:

Program
@ Copyright tBM Corp. 2002
Los materiales del curso no pueden sr reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

12

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o
o

if

[k] == numb) {
printf(,?d localizado en 1a posicin
?d \
de1 arreglo \n,,, numb, k)
encont.rado = 1;
,.

k++,.

] while (k .= (n_r ;
if (encontrado != 1)
print.f ( " ?d no f ue encontrado\n
)

* , numb)

,.

/" Ia funcin main termina aqu */


El cdigo C termina aqu
Tambn' se puede implementar
la bsqueda fineaf usando ef
bucfe while o er bucre
La mayor parte der programa
qrjera, excep;o'ra
prcin
que imprementa fa
=;'""'ffi
;;
a una im pre m e ntcin de la
i ffil'

for'

ii_::

|,1#:i:,

;:,:J"T'Ifu

m*ll*;

El cdigo C inicia agu...

,/" Smbolos definidos para hacer e1


cdigo legible */
#defi.ne

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

acon con C

(a

VERDADERO

#define FALSO O
int encontrado = FALSO:
/* No se ha encontrado el nme ro * /
inr k = 9,.
'/* Bsqueda l-lneal en un arreglo usando e1 bucr.e while */
whil-e ( ( !encontrado) && (k <=
n_1) )
{

ir- t numlJ<l == var_numl


encont.rado = VERDADERO;
("io encontrado en la posicin
?d\n,,, \

ei
*!
yrrrLi_

var_num, k) ;
)

else
k++,t

if (!encontrado)
printf ("td no fue encontrado\nr,,var
Ef cdigo C finatiza aquf
Volumen 3

_num);

Unidadt:erog@
@ Copyright tBM Corp.2002
.
Los materiales

det arrso no pueOen'seiieprooucidos


total
o parcialmente sln,et peniso previo
de

"rito

lBM.

l3

Ahora' se puede comparar et mtodo


de imptemenbc* anterior con
el otro mtodo
donde se usaba ta esfuctura do-whil.e.
La implem;5J,, con la estructura
mucho ms legible,..y evita l" no
while eS
seiiten;'A- Este es un programa
estructurado' A continuacin se prenta
muy
"iuiaote
la implem"nt- rsando
ta estructura for.
Ef cdigo C inicia aqu...

= 0;
/t,Este bucle realiza 1a bsgueda lineal
e:l un */
/* arregl.o usando el bucle tor */
for (k=0; k <= (n_l-),. k++)
i
if (var_num == numlkj )
printf ("?d est. localizado en J-a
\
posicin Ad\nu, var_num,k)
;

break;
)

if (k >

(n_1)

printf ("?d no fue encontrado\_,,var

nrrm l

Ef cdigo C finafiza aqu

Nota: Este segmento se compara con


l que tena fa eshuctura do-whi'e.
usa fa
sentencia break para safir del bucle
tan pronto como el elemento
es encontrado.
Fin det Ejempto i.6

continuacin se muestran

:f3i[1",
Ejemplo

y se di::rJg.n. otros ejempros que


van ms ail de ro
*rufn
,oor",as con
"'i,loZi'l]

l:,*j',"Tffi?l?*;:"tgl'i

l-7: convertir un Nmero Decimar

Entero a Ln Binario

Se va a escribir un programa que convierte


un entero decimal positivo dado como
entrada a binario, y lo imprime.
Se va a poder entender
," domina el
slstema de nmeros binarios.
"rt"

""rplJ"riy,

se van a establecer unas pocas su.posiciones


para simpfificar ta materia. slo
aceptarn como entrada entros posiiivos
se
qr" pr.io"i
rpr"sentados
(2
en
16
bits
positivo
sb peoe repiesenrar con 16 bits es
|[??;
2,u-1,l

|'.jrilr.-

'; J;'qr"

ir

considere un entero posivo como


ef 84. Para convertirlo a binario,
se debe dividir entre
2' El residuo' el cualeoe seru"
r, ser ertrf. " ntna dividiendo

etociente

"

Unidad

l:

pro
@

Copyright tBM Corp.2002

Los materiales def curso no pueden


en parte
o en su totalidad sin el previo permiso
"t.,eproOucidos
escrito de
lBM.

tt;

o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
a
o
o
o
o
o
a
o
o
o

Gua def Estudiante


lntroduccin a la programacin cor C
obtenido entre 2, exrrayendo
el residuo hasta que el
cocente mismo sea 0. Esto
muestra en la Figura 1.5.
es

++Figure 1.5: Conversin de


Decimal a Binario

Ef ltimo cocenk

E
@

s1e1'qi''?:fr;j:!,,",i,",'i"**?:?lr1t-".;;:,ii:ffr:;,ff T;33;.Xtr
*ro-"i it il=* ,,,irrr""[""
i.:p, por sus ,;, en insfs).
.;;liiJ,io'qr"
equiiate ; u,!e escribe

caso) debe ser rratado


g?,","*#??era, er

como se muestra a

1010100

,:;l?".1i"r:: iJL",i,fJ':#:':,Ji:i"'"n,"rlo en 16 b*s, se re rerena con ceros a ra


0000000001010100

Elsiguiente es un afgoritmo para


resolver er probrema anterior:
. Paso l: fngresar el entero positivo
var_num
Paso
2:vatidar
que
'
var-num sea postivo y menor
que 32767
o Paso 3: Guardar el valor de var
num en var- guardar
. paso 4: t

Paso 5: mientras (var_num

!- 0){
binario [kJ = Vdr_ num ? 2;
Var-nm = V 11U,n
/ z;

Paso 5: lmprimir

Ef programa

binario

desde la posicin 15 a la

c que rearizaesta tarea se presenta


a continuacn:

Ef cdigo C inicia aqu...

,/*se incluye eJ. archivo de


encabezado con las *
/
/* funciones estandar que soportan
las
operaciones
de */
,/* entrada y salida (stdio.h) */
Volumen 3

unidadt:n@rs
.

Cooyright tBM

Corp.2002
Los materiafes det crso
no pueden l"ir"proorcidos
totat
o parcialmente sin elpermiso
prlr,
de lBM.

"rlrt"

el Estudiante

#include <stdio.h>
/* La funcin main incia aqul */

mainO

/* Este programa convierte un nmero decimal entero

i" ;::i:.::,:""::T: i,il,". .,

int. var_num, var_ guardar, k; .


inr binario tl_61 = io);
printf("fngresar un entero positivo menor
\
que o igual a 32267\n");
scanf

,,

?d,, , &var_num) ;

,/* validar Ia entrada suministrada por eI r, /


/* usuario en var_num */
if (var_num <= O ll var_num > 32767)
ntrnar(u?d est fuera de1 lmit\n,,,var_nlm) ;
else {
/* Se almacena una copia de 1a variabl_e var_num *,/
/* ya gue esta cambiar su val-or ms ade1ante */
guardar_var = var num;
k = 0;
usado
,/*
para acceder a1 elemento en e1 arregl0 binario *,/
,/* Este es eI proceso de convert.ir e1 nmero
/* decimal a binaro */
while(var_num != O) {
/* el residuo es extrado y almacenado */
/* en e1 arreglo */
binario [k++] = var_num ? 2;
var_num -_ var_num /2;
,/* cociente */
]'
/* Imprime e1 binario eguivalente al_ */
/* nmero enE.ero decimal *,/
printf (u El Binario equivalente de ?d es,', var_
g.uardar),.
for (k = rS; k >= 0; k__)
printf (u?t_du, binario tkl ) ;
)
)

/* La funcin main termina aqul */


El cdigo C termina aquf

Unidad

l:

Prograrnar
@ Copyright tBM Corp.2002
Los materiales del curso rio pueden sr reproducidos
en parte
o en su totalidad sin el previo permso escrito de
lBM.

l6

o
o
o
o
o
o
o
O

o
o
O

o
O

o
o
o
o
o
o
o
o

Gua del Estudiante

se pudo' de hecho, enraer los residuos y almacenarlos


en el aneglo desde la posicin
hacia

binario [15]

adelante. En este caso, se puede imprimir los


nmeros binarios
desde 0 hasta 1s' Algo que se debe notaraquies
que, en la ltima sentencia prinrf
se escribi ?rd, indicando que nT919
debe ser imfreso en un campo de r dgto de
ancho. Esto es ro que se quiere "l
para dgitos onarios q" ,on 0 o 1.
Fin del Ejempto 1.7

A continuacin se va a tomar como entrada un


nmero binario y convertirfo a decimal.
Ejempfo 1.8: Convertir de Binario a un Entero
Decimal

En este problema se acepta un nmero binario


como entrada en un aneglo
de 16 bits. se va a convertir esto a un entero decimar
e imprimirfo.

o
a
O

a
a
o
o

binario

Para un nmero binario 1o1o1,su equivalente


entero decimal es elsiguiente:

1x2a + 0 xf + 1x22 +'0x21 + 1x20


El algoritmo que realizaesto es:

.
'
.
o

o
o
a
o
o
o
o
o
o
o
a
a
o
o
o
o

Introduccin a la programacin con C

Paso

l: Declarar el arregfo binario [15]

Paso 2: Ingresar dgitos binarios vidos en arregro

Paso3:num=

binario

Paso 4: peso posicionarder dgito ms a ra


derecha

pesojosicionar _

1
o PasoS:for(k=iS; k>0; k-){/-procesar
e1 nmero desde r-a derecha */
DUrn = num + binario[k]* peso_posicional;
peso3osicional = peso_posicional*2,.
/* Forma e1 prximo peso posicional */

'

Paso 6: rmprimir er decimar equivarente der


nmero binario
Elsiguiente programa implementa el algorimo
anterior:

Elcdigo C inicia aqu...

/*Se incluye e1 archivo de encabezado con las */


'/* funciones estandar gue soportan 1as operaciones de */
,/* entrada y salida (sLdio.h) * /
#include <stdio.h>
/* La funcin main inicia aquf */
main O {

,/* Convertir un binario a decimal *,/


./* Declaracin de Variab].es */

VolumenS:fipos@

Unidadt:erog@

Copyright tBM Corp.2002


no pueden ser reproducldos totat
o parcialmerte sln el permlso prevlo escrfto de
tBM.
@

tos materiales del curso

tz

Introduccin a la programacin con

Gua del Estudiante

int binariotl6l = {o};


int num = 0, k, peso3osj.cional
/* EI bucl,e toma cada dfgito del nmero *./
,/* binario como enLrada del ueuario */
printf ("rngresar un nmero binario de 16 dfgi.tos
\n,,);
printf("\n El programa se mantendr \
aceptando entradas hasta gue \
todos los dlgit.os sean binarios\nn),.
for (k = 0,.k <=15; k++) {
/* Aceptar cada dgit.o como un char y restarLe */
/* el ASCIf de 0 *,/
do{
binario[k] = ( getcharO - ,0' ) ;
/* EI ciclo se ejecula mientra e1 d.igito */
/* sea binario *,/
) while (binariolkl != 0 && binario[kJ != 1);
,.

/" SL peso posicional del dfglto ms a Ia */


/* derecha es L */
peso__posicional = 1;
/* No necesi.ta procesar el bit de signo_ binario [0]
/* Er bucle convierte er- nmero binario a decimal */
for(k=ts; k > 0; k--) {
/* procesar eI nmero desde la derecha */
num = num + binario [k] * peso posicional;
/* Formar el prximo peso posicionl */
pesoSosicional = pesojosicional *2,.

/* ZI bucle imprime el equivalenLe decimal *,/


/* del- nmero binario *,/
prj-ntf ( "E1 equivalente DecimaL de" ) ;
for(k = 0; k <= 15; k++)
printf ( u?du,binario [k] ) ;
Printsf ( " es ?d\n", num) ;
]

/* La funcin main termina agul */


El cdigo C termina aqu
Fin del Ejempfo 1.8

Unidad 1: Programar con Ane


@ Copyright tBM Corp.2002
Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permso escrito de lBM.

18

o
o
o
o
a
o
a
O

o
o

o
o

o
a
o
o
o
o
o
o
o
o
o
a
o
o
o
o
o
o
o
o

o
o
o
o
o
a
o
o
a
o

Gua del Estudiante

Hasta ahora, en los. diferentes ejemplos slo se han usado


enteros. En el siguiente
ejemplo, se ilustra el uso del tipo de dato carcter en areglos para
resolver problemas
que involucran texto.

Ejemplo 1.9: Contar el Nmero de Vocales en un Texto


Considere afgn texto en Espaol (mximo de 5000 caracteres) que
es ingresado por
ef usuario. Et final def texto se indica con ef smbolo $. El problema es escribir

un
programa que cuente el nmero de ocunenias de cada una
de las vocales A, E, l, O y
U, e imprimir la frecuencia de sus ocurencias.

El siguiente es elalgoritmo para resolver el problema:

o
o
'
.
.

Paso

l:

fngresar el texto dentro de un aneglo flamado


Paso 2: lnicializar los contadores para cada vocal

text

Paso 3: Inicalizar k en 0 y leer desde esa posicin en


Paso 4: Leer text [k]
paso 5: mientras (ten[k] != ,$')

rexr

Verificar si cext [k] es una voca],.


Si es verdadero, incrementar el contador
vocal apropiado;

de

x++;

Paso 6: lmprimir los contadores de las vocales


Basados en este afgoritmo, se puede escribir el siguiente progrcma
en c:
El cdigo C inicia aqu...

/* fncluir los archivcs de encabe zad.o * /


/* se tienen las definiciones de ras funciones */
/* usadas dentro de1 programa */
#include <stdio.h>
#include <ct1pe. h>
/* La funcin main inj_cia agu */
main0 {
,/* Declaracin de Variables *,/
char text [S0Oj ;
int k, cont.adorA, contadorE, contadorf, contadorO,
conLadorU;

/* se ingresa er- texto suministrado por e1 usuario *,/


/* en e1 arreglo */
k = 0;
printf("fngresar el t.exto terminando en e1 \
Volumen 3: Tipos

Oe@
.

Unidad

l: Programar

@ Copyright tBM Corp.2OO2


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermlso previo.escrito de lBM.

con

Arregloi tg

Introduccin a la programacin con C

l Estudiante

carcter $\nn);
scanf ( "t.u, &text tkl ) ;
while (Lext [k] ! = '$') {
scanf (ntcr, &text [++k]

);

./* rnicializar
contadorA = 0;
contadorE = e;
contadorf = 0;
contadorO = e;
contadorU = e;

los contadores de vocales * /

/* XI bucle cuenta e1 nmero de ocurrencias


,/* cada vocal en el, texto */
k = 0;
whiLe (text [k] ! = '$') {
if (toupper(text [k] )
'A,)
contadorA++;

else if (toupper (text [k] )

'E,)

contadorE++;
eLse if (toupper (text [k] )
contadorl++;

'f ,)

else if

,O | )

(Eoupper

(text tkl )

contadorO++,.

else if (toupper (text [k] )

,U,)

contadorU++,.
k++,.
)

/* fmprimir eL contador de cada vocaL en el_ texto


printf("El nmero de ocurrencias de a es \

?d veces\n", contadorA) ;
printf("81 nmero de ocurrencias de E es \
?d veces\nrr, contadorE) ;
print.f("El nmero de ocurrencias de f es \
?d veces\nr, conLadorf) ;
printf ( "81 nmero de ocurrencias de O es \
td veces\nr', contadorO),.
printf (t'El nmero de ocurrencias de es \
td veces\nr, contadorU) ;
Unidad

l:

Programat
@ Copyright tBM Corp. 2002
Los materiales del curso no pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.

20

o
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

ib

o
o

Gua del Estudiante

Introduccin a la Programacin con C

/* La funcin main finaliza


El cdigo C finaliza aqu

aqu */

Se pudo tambin consderar usar un aneglo para almacenar los contadores. Los
estudiantes pueden intentar escribir ese programa, y entender de que
forma sera una
buena idea , y de que otras formas no lo ser.
Fin del Ejempto 1.9

continuacin se aborda otro probfema que requiere el uso


de un arreglo
unidimensional. Ef enunciado del problema es, sin embargo,
difernt de los otros
.
enunciados presentados hasta ahora, y no sugiere nada arca
del mtodo que debe
ser adoptado. Este tipo de problema ocurre algunas veces en ta vida
real.
Ejemplo 1.10: lmprimir la Secuencia def Problema del Anilo de Ejecucin
Considere N personas condenadas. que_ estn esperando para
ser ejecutadas. El
verdugo, abunido del mtodo de ejecucin decide seguir et mtooo

iresentado

continuacin:

l hace que todas las w personas condenadas se coloquen en crculo,


con un entero
entre r y N exhibidos en su pecho. La persona con el nmero t est parada
al lado de ta
persona con ef nmero t. y todas las personas con los
nmeros
3.-. en su
pecho estn en un crculo en la direccin de las agujas
del reloj. El verdugo toma un
nmero aleatorio entre t y N, y llama a este elrndividuo. El
entonces dispara a esa
persona cuyo nmero en ef pecho mincide con ste. l
selecciona otro nmero
aleatorio mayor a cero tfamado el prximo. l cuenta el nmero prximo
de
personas vivas en direccin a las agujas, de refoj desde
etrndividuoy
ejecuta
la
persona cuyo nmero en su pecho coincide con el nmero.
De esta *un"r",
mantiene ejecutando a todas las personas. El problema consiste
"u
en tomar como
entrada los nmeros aleatorios elrndividuo y prximo, e imprimir
la secuencia
segn la cuallas personas son ejecutadas. .

1, 2,

Esta claro que se debe mantener el estado de cada una de las personas
n
como viva o
muerta' Se tendr un aneglo tlamado lista que contendr el estado.
Inicialmente,
todas las entradas en el aneglo sern inicializadas en vrvo. Cuando
una persona es
ejecutada, el valor conespondiente en el aneglo se cambia a MUERT9.
lista [k] indica el estado de una persona cuyo nmero en el pecho es k. ruma que

Porejemplo si es 5, elrndividuo es 2 y prximo es 3, la


siguiente es una de las
posibles secuencias en la cuaf ellos sern ecutaOos.

2, 5, 4, t,

Despus gue 5 es ejecutado, se cuentan las personas que todava


estn vivas, se tiene
que mover a 1 en forma circular. Lo siguente es el algoritmo para
resolver este
problema:
Volumen 3: Tipos de Datos E-tructu,,ados; C

Unidad

l:

Programar con

@ Copyright tBM Corp. 2002


Los materiales der cufao no pueden ser reproducrdos totar
o parciafmente sln el permiso previo 6scrito d lBM.

Anegloi

21

lntroduccin a

Paso

fa

l:

amacin con C

Gua del Estudante

lista t1011 para 100 personas


Paso 2:LeerN, ef nmero
de personas condenadas
Paso 3: Iniciafizar la fista desde
t hasta N como vrvo
Paso 4: fngresar elrndividuo
Paso 5: Validar que elrndividuo
est en el rango [1, N]
Paso 6: Ingresar proximo >
o
Paso 7: Ejecutar elrndividuo
Paso 8:

Declarar un anegto

lista[elrndividuo]

Paso 9: lmprimir

uuenro

etrndividuo

Paso l0: Nmero de personas


ejecutadas nuuerros _
1
Paso l1: white (nMuerros <=
n) {
Localizar elfndividuo contando
Las /v^rrtds
prximas personas vivas;
-ss
ejecuEar elrndividuo,.

Lisra [elrndividuo] = MITERTO.


imprimir elfndividuo,.
nlvluertos++,.

]
El siguiente programa impfementa
este algoritmo.

Ef cdigo C inicia aqu...

,/* fncluir los archivos de encabezado */


,/* que tienen Las definiciones de
1as funciones */
,/* usadas dentro del programa */
#include <stdio.h>
/* La funcin main inicia aqu *7
mainQ {
.
/* Ejecucin por Contador ModuL ar */
/* Declaracin de VariabLes */
int l-ista [ror] ; /* No usar 1ist.a
[0J para nada * /
int counE, n, eLfndividuo, k, proximo,
ntvfuertos,.
int. VfVO = 1, MUERTO = O j
entrada der usuario er. nmero
de personas
:i."
( .lngresar eL nmero de personas
condenadas:,,);

j""::::;::
v;

-!
/rLr

', -

scanf ( utdu , &n) ;

if (n<=o) {
prinEf(nfngresar un nmero >

De condenadosrr) ;

Unidad f : progra
22

Copyright tBM Corp.2002


Los materiales def curso no pueden
sr reprooucidos en parte
o en su totalidad sin el previo permiso
escrito Oe lBMl-"'
@

o
o
o
o
o
o
o
o
o
o

Gua del

Estudiante

lista desde 1 a N como VfVO */


/* Inicialzar
for(k = 1; k <= n ,- k++)
listalkl = vrvo;
/* Ingresar ellndividuo y validar sf est

entrelyN"/
oo{
printf("Ingresar 1a primera persona \
a ser ejecutada comprendida [t, ?d]:",n);
scanf ( "?d", &elfndividuo) ;
) while ((elrndividuo < t-) ll (elrndividuo > n));
/* Ingresar eI proximo > 0 * /
printf("fngresar un enetero > 0\n");
do{

o
o
o
o
o
o

a
a
o
o
o

o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Introduccin a la Programacin con C

scanf (u?du, CProximo)


) while (proximo <= o);

/* ejecuEar elfndividuo */
lisLalellndividuol = MERTO;
/*

imnrimir
L

elTnrlirirrn

Lrt\E

*/I

printf ("La persona ejecutada es ?d\n',,ellndividuo)


/* Nmero de ejecutados nMuertos -- I */
nMuertos = 1,.
/* Localizar y ejecutar a todos 1os dems */
while (nMuertos . n) i
/* localizar elfndividuo contando prximo
personas vivas */
^^rtF

1 .

while (count .= proxi'mo ) i


ellndividuo++;
if (ellndividuo > n)
ellndividuo = 1; /* circul-ar*/
if (1ista[ellndividuo] == vrVO)
counE++;
)

/* e)ecutar ellndividuo */
if (lista lellndividuo] == vrvO) {
lista lellndividuo] = MUERTO;
,/* imprimir ellndividuo *,/
printf ( I'La persona ej ecutada\
Volumen 3: Tipos de Datos Estructurados en C

Unidad

l:

Programar con

@ Copyright IBM Corp.2002


Los materiales del clrso no pueden ser reproducdos total
o parcialmente sln el permlso prvio escrito de lBM.

Areglos

23

es\nu, elfndividuo)

#Estudiante
,.

/* fcremenEar el nmero de personas ejecuEadas */

nMuertos ++;
J

/* La funcin main termina aqu ,r/


El cdigo C termina aqu
Ntese que en el programa anterior,,
se han seguido fos pasos del algoritmo,
refnando
cada uno de fos pasos' Este mtodo
es llama"d refinamento paso a paso
(sfepwse
refinement)- Este es un mtodo muy
tir p"-i"rruer probtemas ya que
ayuda a
manejar eficazmente ta complejidad.

Fin det Ejempto

l.l0

5. Cadenas de Caracteres en C
Considere ef siguiente aneglo:

char nombre [30]

Este puede ser considerado corno una


caden a (string) en c. No existe
un tipo de dato
string explcito en c. Este puede ser directamente
lro o escrito como sigue:
scanf (u?"r,, nombre);
printf (',?" ", nombre) ;

' Este no tiene que ser ledo o escrito carcter a carcter


(usando ef formato de cadena
?c)' una vez ledo usando ?s, la cadena
se puede cceoer eremento por eremento
como nombre [i] ' cuando un aneglo
se fee usando er smbofo ?s, ef compilador
inserta un carcter al final para indicar
el fin de la cadena. Este
carcter nu11, y se denota'como

i;, .

carcter se denomina

Ejemplo 1'11: contarel Nmero de


ocurrencias der patrn,to, en un Texto
Dado
Ef siguiente programa cuenta el nmero
de veces que el patrn 'to,se repite
en et texto
El cdigo C inicia aqu...

,/* fncluir los archivos de encabezado */


/* que Lienen 1as definiciones de Las funciones
/* usadas dentro del programa */
#include <sEdio.h>
/* La funcin main inicia aquf *7
main O {
Unidad

l:

*,/

programarc
24
@ Copyright tBM Corp. 2002
Los materiares dercurso no pueden
r"proorcidos
o en su totaldad sin el previo permiso
"i escrito de en parte
fBM.

o
o
o
o
o
a

Gua del Estudiante

/* Declaracin de variables */
char rexro [1000]
inti=0,noTo=O;
/* Obtener Ia entrada del usuario de la palabra
prj-ntf (', f ngresar un palabra grande : \n" ) ;
scanf (tt?s", texto);

o
o
O

/* nI bucl-e cuenta et nmero de veces gue Ia


palabra 'to, ocurre en el texto */
while (texto Ii] ! = ,\O') {
if (toupper(texto[i] )
'T' &&
toupper(texto[i + 1]) =='O')

o
o

o
o
o
o
o
o
o

o
o

cin con C

,.

o
o
o
o
o
o
o
o
o

Introduccin a la

*,/

noTo++,.

t = + 2;
]
e1 se

i++;
l

/* tI nmero de ocurrencia de .to,, se imprime */


printf("E1 nmero de \uto1u en e1 texto dado ?s es \ ?d\n,,,
texto, noTo)
,.

/* La funcin main Lermina aqu */


Elcdigo C termina aqu
Fin del Ejemplo 1.11
Como no hubo necesdad de leer carcter a carcter en el programa anteror, se omt
el bucle.

Existen muchas funciones disponibles para cadenas en


siguientes son algunas de las funciones ms usadas:

la librera srring. h.

Los

Funcin

Descripcin

o
o
a

strlen

Toma una cadena y retoma la longitud de ta misma.

o
o
o
o
o

o
,a
TI
J

,o

sErcpy

Toma dos cadenas como parmetros, copia la


segunda cadena en la primera y retorna la primera
cadena.

strcat

Toma dos cadenas como parmetros, las concatenan


y retoma la cadena concatenada.

Volumen 3: Tipos de Datos Estruc'tunados en C

.t

Unidad

l: Programar

@ Copyright IBM Qorp.2002


Los materiales delcurso no pueden ser reproducldos total
o pardalmente sln el'permiso previoescritode lBM.

con

Arreglos

25

Gua del Estudiante

strcmp

Toma
I vr,r dos
L(JD uduenas
caOenas como parmetros, y las comp_o_
Tro
t" primera
cadena es ms pequea
que la segunda.
Retoma o siambas son iguafes.
o,:'l'1tlTgra cadenaes ms grande que
,T segunda. (se usan
fa
fas. regtas iigijfriIIa
comparar lag dos cadenas)

I*::::..j.:i

3:::

Unidad

l:

Programa
26

Copyright fBM Corp. 2002


Los materiales delcurso no pueden
sr relroOucidos en parte
o en su totafidad sin el previo permiso
escrito
@

de tBM.

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

lntroduccin a la

ramacin con C

Resumen
Ahora que ha completado esta Unidad, usted debe ser apaz de:

.
.

.
o
.

Explicar elconcepto de arreglos en la solucin de problemas


Definir un aneglo
Describir cmo acceder a un elemenlo en un aneglo
Explicar cmo usar aneglos en algoritmos
Desarrollar afgoritmos para problemas que requieren el uso de arreglos
Explicar como convertir algoritmos a programas C

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
i
'o

o
o

Volumen 3: Tipos de Datos Estructurados en C

'

Unidad 1: Programar con

Copyright tBM Corp.2002

Los materiales del crso no pueden ser rcproducldos total


o parcialmente sln el permlso prevlo escrlto de lBM.

Aneglos

2T

Gua detEstudiante

Unidad l: Examen de Autoevaluacin


1) Cuntos elementos tiene un aneglo declarado
inr x l7o) ;?

a) 11
b) 10
c)9
d) 12

'omo

Es vlida la declaracin

2)

a) Verdadero
b) Falso
3)

int

x [o]

Cuntos elementos tiene la declaracin

a)0

inr

LL.J

;?

b)1

c)2
d)

+)

Nada, ya que la declaracin es invlida.


Asuma que un programa en C contiene #define LTMTTE
hacer la declaracin
x [LrMrTE] ; ?

inr

2s.

Es mnecto

a) Verdadero
b) Falso
5)

Cuando se hace referencia a un elemento como x


[3] , realmente se est refiriendo
elemento.

r
a) Tercer
b) Segundo
c) Cuarto
d) Primer
al

'
6)

Cul es el resultado de la sentencia de asignacin en el siguiente segmento de


codigo?

inr x[3j;
x [3] = 25;

a) Se asigna 25 al tercer elemento de x


b) Se asigna 25 alsegundo elemento de x
c) Se asigna 25 a todos los tres elementos de x
d) Esto es invlido, ya que x [3 ] no existe
7) Es vfido el uso de un aneglo en la expresin x tz * k _ 1l _ 3 ;.
a) Verdadero
b) Falso
Unidad

I: Programar con Aneglo


@ Copyright tBM Corp.2002
Los materiales der curso no pueden sr reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

28

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Guia del Estudiante

8)

Introduccin a la

Qu es un aneglo unidimensional?
Una coleccin de datos, todos pertenecientes al mismo tipo, localizados uno
seguido delotro

a)
b)

c)
d)
9)

Una cofeccin de datos, todos pertenecientes


localizados sin un orden particular

Es invlido el uso de la siguiente expresin x


Verdadero

a)
b)

l0)

Una coleccin de datos, todos pertenecientes a multiples tipos de datos,


focalizados uno seguido delotro
Una cofeccin de datos, pertenecientes al mismo tipo localizados sn un orden
particular

a mltiples tipos de datos,

[k++] = k++;

Falso

Considere la declaracin

xlk * 1 t l-21 eS
a) Siempre vfida

int x [10]

En este caso, la referencia al aneglo como

b) vlida slo cuando ra expresin dentro delsubndice


c) Nunca vlida
d) Vlda slo cuando la expresin dentro delsubndice

Volumen 3: Tipos de Datos gstruauraOos en C

est en elrango 0, 9
resulta en el rango 0,

Unidad 'l: Programar con

@ Copyright tBM Corp. 2002


Los materiales del curso no pueden ser reprcducidos total
o parcialmente sin el permlso previo escrito de lBM.

i0

Aneglos

Introduccin a la programacin con C

Respuestas a f a unidad

1)b
2)b
3)b
4)a

l:

Examen de Autoevaf uacin

tc

6)d
7)a
8)a

e)b
l0)

Unidad

l:

Prog.am
30
@

Copyright tBM Corp.2002

Los materiales dercurso no pueden sr reproducidos


en parte
o en su totafidad sin ef previo permiso escrito de fBM.

o
o
o
o
o
o
o
o
o
o
o
o
o

o
O

o
o

ttl
Gua del Estudiante

Introduccin a la Programacin con C

Unidad 2: Arreglos Mult-Dimensionales


Objetivos de Aprendizaie
Al finalde esta unidad, usted ser capaz de:

t-

l'*

.
.
.

Definir qu son aneglos multi-dimensionales


Describir la naturaleza y uso de los aneglos bidimensionales

Explicar la importancia
problemas

.
.
.

de los anegfos bidimensionales en la

solucin de

Describir el uso de los aneglos bidimensionales en los algoritmos


Explicar como declarar, inicialzar y emplear aneglos bidimensionales en C
Discutir la implementacin de algoritmos que empleen aneglos bidimensionales

enC

Ol

ol
ol
o

o
o
o
o
o
o
o
o
o
o
o

o
a
d
el

.ti
Volumen 3: Tipos de Datos Estruc{urados en C

'

@ Copyright IBM

Unidad 2: Aneglos Multi-Dimenslonales

Corp.2002

Los materiales delcurso no pueden serreproducldos total


o parcialmente sln elpermiso previo escrito:d lBM.

3l

studiante

1. Introduccin
se estudi' que en las situaciones donde rgggleren
mlsmo tipo se usa un aneglo unidimension"l.-irsemltiples efementos de datos del
como ejempfo, las catificaciones
de mltiples estudiantes, lo cuales pueden
,,"pr"rnt"rse en un anegfo unidimensional.
Los anegfos unidimensionafes in rt"r"r
u""tores usados en fas matemticas.
En c, una anegfo unidimension"ir"
decrara "'lo" rig;",
int notas tl.oo j ;

un elemento individual de notas se puede


notas [kJ , donde k es un entero entre o y acceder usando un sofo subndice, como
ss.

se aprendi a cmo.dectarar
Programar con Aneglos. gn

usar.
Sneglos unidimensionafes en fa unidad 1
unidad,
dimensionales, para ser precisos"tJ
";iar como usar arregros murtiareglos bidimensionales.

";

Los arreglos multi-dimensionafes se


unidimensionales, cada uno de effos .usan en situaciones donde varios a'eglos
oel msmo iipo, rJ uran para denotar
una entidad
lgica y de significado *rr"io-.- Asuma
armacenar fa fecha de
nacimiento de estudiantes de 'un
saln oe cralls
formato da, mes y ao. una
forma de lograrlo es teniendo tres
"i
aregfos unidmensionales
(En
implementacin se usar anium) . se puedenflamados aia, mes y ao
decrarar
sigue:
"orf
int dia [100] , mes [100] , anium [1Oo]
;
Aftemativamente' se tiene un aneglo
flamado ddn, QU tiene mftiples dimensones
como sigue:

q;";;uiere
;;

la

inr ddntlool i3l;


Esto significa gue la fecha de nacimiento
de 100 estudiantes est registrada en fitas y
cada fila tiene ef da, mes y ano e
n-acmiento " ,;;;irdiante en particular
una de las tres columnas respectivamente.
en cada

considere er siguiente ejempro de arregro


basado en ra cefinicin anterior:
24

1956
1960

1987

Las entradas en este aneglo implican


fo siguiente:
Agosto
1956

24
4 Septiembre
4 Junio

1960
1.9BT

como otro ejempfo, considere fa siguiente


decfaracin:

char paginat2:-l [70);

Unidad 2: A,.reS
@ Copyright tBM Corp.2O02
Los materiales del curso no pueden
r"p.Orcidos en parte
o en su totalidad sin el previo permiso
"r escrito de lBM.

of

o
o
o

o
o
o
o
o
o

Gua del Estudiante

lntroducqin a la programacin con C

Esto significa que una pgina tiene 25 lneas (filas),


y 70 c,aracteres por lnea
(cotumnas). por lo tanto, s se desea un libro
de muchas pginas, se debe declarar
como sgue:

char libro [350j 2sJ t7o)

Este es un arregro tridimensionar y se representa


grficamente en ra Figura 2.1.

o
o

a
o
o
o
o
o
o
o

I
I

o
o
o
o
O

o
o
o
o
o
o

o
o

o
o
o
o

o
o
o
o
o

o
O

Charaqter
Figura

2.1

: Arreglo Tridimensional

La forma general de declaracin de un anegto


bidimensionalse da a continuacin:

tipo_de_dato arreglo [exp1] [exp2] ;

2. Resolver probfemas con Arreglos Bidimensonates


una de las primeras cosas que se debe aprendei cuando
se trata de emplear aneglos
bidimensionales en la.resolucin de problemas
es a declararlos e iniciafzrlos. At igual
:,T.^l:t aregfos unidimensionales, los aneglor or"nrionales se declaran como
stgue:

. inr a [100] [1oo] ;


o char textotZSl 96 . floar numb [10] trel ;
Ya se sabe que los aneglos unidimensionafes

parte de la misma declaracin.

estticos pueden ser iniciafizados como

Los aneglos estticos son aquellos aneglos que


se declaran dentro de una funcin,
ncfuyendo la fucin rnaj_n.

Volumen 3:

TlposOe@

Unidad 2: Anegtos
@

Copyright tBM Crlrp.2002

tos materiales del curso no pueden ser reproducidos total


o parciafmente sin ef permiso previo escrito de lBM.

MulOimesiiles

93

.f

o
o
o

o
o
o
o
O
O

Gua del Estudiante

lntroduccin a la programacin con C

Esto significa que una pgina tene 25 lneas (filas),


y 70 c,aracteres por lnea
(columnas). Por lo tanto, si se desea un fibro
de muchas pginas, se debe declarar
como sigue:

char tibro [350j f2s] t7o)

Este es un aneglo tridimensional y se representa


grficamente en la Figura 2.1.

o
o
o

a
o
o
o
o
o
O

o
o
o
o
o
o
o

o
o
a
o
o
o

o
o

o
O

o
o

Chragter
Figura

2.1 :

Arreglo Tridimensional

La forma general de declaracin de un aneglo


bidimensionalse da a continuacn:

Llpo_de_dato arreglo [exp1] [exp2] ;

2. Resolver Probfemas con Arregtos Bidimensonales


una de las primeras cosas que se debe aprendei cuando
se trata de emplear aneglos
bidimensionales en la.resolubin de problemas
es a declararlos e inicializrlos. Af igual
:,i:.ft areglos unidimensionales, los aneglor r"nrionales se declaran como
stgue:
. j-nL a [100] [100] ;
o char texto tZSl 691

loar

numb []-01

tral

Ya se sabe que los aneglos unidimensionafes


estticos pueden ser iniciatizados como
parte de la misma declaracin.

Los aneglos estticos son aqueffos aneglos que


se declaran dentro de una funcin,
incluyendo la fucin main.

o
o

o
O

o
o

Volumen 3: Tipos

de@

Unidad 2: Anegtos Mult-Omgales 33


@

Copyright tBM Crlrp.2002

tos materiales del curso no pueden ser reproducidos totat


o parcialmente sin elpermiso preo escrito de lBM.

lntroduccin a la programacin con C

Gua del Estudiante

Observe ef siguiente ejemplo:

int tablat3l I4l = if ,2,3,4,s,6,7,g,g, 10,11 ,72];


La declaracin anterior implica que el arregfo tabla tiene tres
filas, donde cada fila tiene
cuatro columnas. En C, el ftimo subndice se incrementa ms
rpidamente que ef
primero, por lo tanto, el subndice de la columna se increment
ms rpido. La
inicializacin sucede como sigue:

tablal0l tol = 1 rablaiol tl.l = 2 tabl t0l t2l = 3 rabla tol t3l 4
=
tabla t1l tgl = s r,abla t1l t1l = 6
tabla t]-l t2l = Z rabla t1l t3l = 8
E,abla t2l tol = 9 abla I2l tll
= 10 tablat2J l2J = 11 tabtai2l t3l = L2
Los.aneglos bidimensionales se pueden inicializar de muchas maneras.
Considere la
siguiente declaracin e inicalizacin:

int rabla t3l i4l =

{t,2,3,4}

{s,6,'I ,B},
{s, ro ,7r,L2}

),

La declaracn anterior iniciatiza el aneglo como la primera


dechracin. Encontramos
tres conjuntos de valores dentro de un pr de llaves. " par
de flaves denota valores
para una fila del aneglo tabla. En el ejemplo anterior,
la primera fila toma
de 1 a 4 para sus cofumnas, la segunda fila toma de 5'a 8'parasus cuatro los valores
la tercera fila toma los valores el 9 a 12 para sus coiumnas. por locolumnas, y
tanto, esta
decfaracin realiza la misma inicializacin como se mostr anteriormente.
Ahora considere el siguiente:

int tabla t3l t4l =

{L,z,z},
{+,s,e},
{z,a,s}

I
l,

La declaracin anterior tiene tres conjuntos de valores encenados


en i i. Los valores l_,
2 y 3 son asignados a las primeras tres columnas de la primera
fila, ."iLioo por un 0 en
la ltima cofumna. Una inicializacsn similar se realiza para
tas fitas 2"v
cuando
explicitamente se proporcionan valores para atgunas tolumnas
en una fila durante la
inicializacin de un aneglo, et resto de las col-rrnas en la
fila automticamente se
inicializa en 0.

li,

Sise declara la tabta como:

int rablat3l t4l = {:-,2,3,4,s,6,7,8,91

Los nueve valores sern asignados al anegfo en el sentido


de ta fila. Se consigue sto
un par de llaves en la declaracin anteriol. Como no existen tfaves
intemas (usadas
para indicar la inicializacin en el sentido de las
filas), los nueves valores son asignados
alaneglo, fifa despus de fila como sigue:

Unidad 2: Arreglos Mrlt-Dime

u
@

Copyright tBM Corp.2002

Los materiales def curso no pueden sr reproducidos en parte


o en su totalidad sin el previo permiso escrito de lBM.

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o

Gua del Estudiante

macion con C

Los primeros cuatro valores

'

fita 1.

'
.
o

aa) son asignados a las cuatro columnas de la

!'o: segundos cuatro valores (5 a S) son asignados a las cuatro cotumnas de la


lafila2.
El ltimo valor (g) es asignado a ra corumna 1 de ra fira
3.
Las columnas 2,3 y 4 de lafifa 3 se inicializan con 0.

Sin embargo, se realiza mejor la inicializac-in de anegfos bidimensionales


grandes
dentro del. programa y no en la etapa de blaracn.
contnuacin se presenta un
ejemplo elcual inicializa un aneglo bidimensionalen 0.

inr rabla [100] tlool , k,I;


for(k=O; k<100;k++)
for(1=0;1<100,'1++)

tabla tkl tll = o;


Nojse que para los arreglos bidimensionales se requieren
dos variables subndices.
Existen dos bucles iterativs para acceder a cada elemento
del aneglo bidimensonal.
Este tipo de formacin de construccin iteratva
i,pi"" cuando se programa con
anegfos bidimensionales.
"r

Se puede tambin iniciatizar el aneglo con los vafores de


entrada dados por el usuario.
ru le asigna

El siguiente segmento de programa-muestra cmo


un aneglo bidimension'"t
entradas dadas por el usuario.

,/* Declaracj-n del ArregJ o */


inr tabla[10] [10], k, l;
/* Acceder a1 arreglo "/
for(k=0,' k<10;k++) {
printf (..fngrese los valores de la Fila ?d\n,,,k),.
for(1=0,. 1<10,. 1++) {
printf (.'fngresar el_ valor de 1a fila ?d \
columna ?d\n,, , k, 1) ;
,
/* Alamacenar elementos en el arregfo */
scanf ( "?d", &Eabla tkl tll ) ;
l
)

En este programa, el usuario se te pide que ingrese


los valores de una fila en particular.
En el.caso de anegfos muy grands, este procedimiento
de leer valores de entrada del
usuario puede ser tedioso. En taf escenaiio, los valores
se leen de un ispositivo oe
almacenamiento secundario (como un disco) ar arregl.
Este aspecto ie cubierto
cuando se estudie el manejo de archivos en el volumen
6, Unidad 1 Manejo de
Archvos en C.

Vofumen 3:

TiposOeffi

Unidad 2: Aneglos MultOme,nsonales 35

@ Copyright tBM Corp. 2002


materiales del curco no pueden ser reproducidos total
o parcialmente sin elpermiso preo escrito de tBM.

los

continuacin, se presenta como imprimir-un.aneglo bidimensional. El siguiente


segmento de programa realiza esh tarea. Aqu, se asume que los valores
estn

disponibles en un arreglo de enteros

inr rabla[10] t1ol , k,I;


f

or (k=0 ,'k<10 ,'k++)

rabla t10l tlol

for (I=0;1<10;1++)
prinrf ("gd ', rabla ikl tll
printf (..\n" ) ;

);

El bucle ms intemo tera sobre


imprimiendo una fila de nmeros en una lnea. Una
vez que una fila es mpresa, un carcter de nueva lnea es impreso, as que prxima
la
fila ser impresa en una nueva lnea. Si el nmero de elemntos
uri fila es muy
grande, ef conjunto completo, no ser impreso en una simple lnea.
"nUna nueva tnea
sera generada automcamente en los casos. Usualmente en la pantalla, una
nueva
lnea ser generada despus que 80 caracteres se han imprimido. En unlmpresora
de
fnea, una nueva lnea podra ser generada despus de j32 caracteres.

Ejempfo 2.1: Yerificar si una Matrz es Simtrica


Una matrza de orden n x n es simtrica si
La siguiente matrz es simtrica:

10532
52257
32 57

ai = dik para todos los valores de k e i.

99

' Aqu la clave es veriflcar


si a1 = aik para todos los elementos en la matrz.An si un
solo elemento que no est en la diagonal, no cumple que es verdadero que
aki = drk,
entonces la matnz no es smtrica. Por ejemplo, en el ejemplo anterior, si la
segunda
la primera fila contiene u 10 en vez dp s, entonces la matriz no es
Tl,.Tl"
{e
simtrica. El siguiente es el algoritmo para verificar si una matrizes simtrica:

.
.
.

Paso 1: fngresar la matriz


Paso 2: x=o; i =o

Paso 3: mientras (no se hayan verificado todos los elementos && no hay
desiguald entre a y aid i

if

(k != i)

if (aki == aik)
incrementar k, i;
e1 se

Ocurre una desigualdad;

Unidad 2: Arreglos M
@ Copyright tBM Corp.2O02
Los materiales delcurso nio pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso esoito
de lBM.

36

lr

o I'
o
o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o
o
?
?
I

Gua del Estudiante

Note que no se estn comparando aki


== aik, cuando k e i son iguales.
Cuando k e i son guales, este es un etemento de la
diagonat. Basados en el
algoritmo, el programa que realiza esta tarea puede
ser desaollado como
sgue:

Ef cdigo C inicia aqu...

,/* Incluir 1os archivos de encabe zad,o * /


/* que tienen las definiciones de 1as funciones */
,/* usadas dentro del programa */
#include <stdio.h>
#define VERDADERo 1
#define FALSO
/* La funcin main se inicia asu */
O

main O {

,/* Declaracin de Variabl es * /


int matriz[tooJ [1oo], n, k, 1,

go_on;

,/* Obtener del usuario el orden de Ia matriz * /

clo

print.f ("Ingresar e1 orden de


y
1 100\n");

l_a

matriz entre \

scanf ( u?du, cn) ;

) while (n < 1 ll n > 1oo);


/* obtener de1 usuario 1os el-ementos de la matrz * /
for(k=0; k< n;k++) {
printf (,, Ingresar 1os. valores de la Fila ?d\n,,,k)
for(1=0;1< n;J.++) {
printf ("fngresar e1 valor fila ?d \

columna ?d\n' , k, 1)
scanf (n?dn, &matriz tkl t1l ) ;
,.

l
/" nI bucLe verifica si es una matriz simtri ca * /

go_on=VERDADERO;k=6;
while (k <= n && go_on == VERDADERO)
1=0;

while (1 <- n && go_on == VERDADERO)


{
if (k ! = 1 && marriz tkl t1l ! = marriz t1l tkl )

tr
T

Volumen 3: Tipos Oe

Oat@

Unidad 2: Aneglos Mutti-Drnensionales


@

Copyright tBM C.orp.2002

Los matefiares del curso no pueden ser reproducdos


total
o parcialmente sln elpermiso preo escrto de lBM.

macin con C

Incrementar k, i;

?,

Introduccin a la

37

go_on = FALSO;
''|

k++;
)

,/* rmprimir si la matriz es s.imt.ri-ca o no a 1a sarida

est.ndar *,/

if (go_on == VERDADERO)
print.f ( "La matrz

es

simtrica\n");

nO

es simtrica\n");

el- se
-i
^ ITtdtriZ
'.ts C rI tttuq
/t rLr

I
t

/* La funcin main termina acru

*,/

El cdigo C termina aqu

Fin del Ejemplo 2.1


Ejemplo 2.2: Multiplicacin de Dos Matrices
Considere dos matrices A y e. La multiplicacin de estas dos matrices
es vlida slo si
el orden de ay B es de la forma m
ny n p respectvamente. Es decr, et nmero
de columnas de a debe ser igual al nmero de filas de e. La matrizresultante
c y debe
ser de orden m
p. La multiplcacin de matrces se defne taf que cada elemento de
Ci j para todo i,
es como sigue:

x
j

cij = t A ik * Bkj para rodo k


El subndice se corre desde k hasta n en la sumatoria anterior.
Considere las siguientes
dos
.

matrices:
10 20
567

30

25
2
1

3021
354
234

El siguiente es la matriz resultante de la multiplicacin de las dos


matrices anterores:

310 420 310 210


144 182 61 53
Se puede ahora desanollar ef algoritmo para realizar fa muttiplicacin
de matrices.

Paso 1: lngresar m,

r,

p el orden de las matrices A y B respectvamente

Unidad 2: Arreglos Multi-Dimensonales Volume

gaipos;e D;ios

Estructurados en C

38

@ Copyright tBM Corp. 2002


Los materiafes del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

o7

o
o
o
o
o
o
o
o
o
O
o
a
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

.
r
.

lntroduccin a la programacron con

paso 2: Ingresar la
matnz a de orden m x n
paso 3: Ingresar la
matrizg de orden n x p
paso 4: rniciafizar todos
ros erementos de c de orden m
paso S: para todo
i

p en

desde 0 hasta m_1


0 hast.a p_1

para todo j de
formar Cij = IA. * Bkj for.k
= O,

-_ n_1

paso 6: lmprimir las


matrcesA, B, y c

*"?:t*:rdn
for

se muestra er segmento de programa que


hace ra murtipricacin de

(i=O; i < m,. i++){


for (j=c; j . p; 7++)
Dulild

U,.

o- (k=O; k -< n; k++)


suma = suma + AIj_l ikl"Btkl
ijl;
ctil ljl = suma,.
f

]
Los estudiantes puede n realizar ef seguimiento
der segmento de programa anterior
con afgunas matrices de ejemplo. par
em")iL"0" usar las matces dadas en
elejemplo.

Fin def Ejemplo 2.2


Ejemplo 2.3: Cafcular laTrazade una
Matrix

Latraza de una matnz se define slo pra


matrces cuadradas, de orden
n L
traza de a se define como fa suma
de todos los elementos oe la diagonal.
considere la
siguiente matrizA, de orden 3 x 3.

nx

all

a12

a21
a31

a22
a32

a13
a23
a33

Los efementos de fa diagonar estn


en negritas . La trazas a+ a22*
d33. Note que ros
elementos de fa diagonaj tenen elmismo
subndice corto a.
Ef siguiente segmento de programa
catcuta latrazade

una mat,-.

El cdigo C inicia aquL..

,/* fncluir 1os archivos de

VolumenS:npos@

encabe zad.o * /

Unidadz:nnffites

. .

@Copyright tBCl;rrp.2002
, ^_ _- .
Los
materafes def curso no pueden ser
reproducidos totaf
o parcialmente sln elpermlso preo
de lBM.

""'"rito

39

Estudiante

/* que t.ienen Las definiciones de Ias funciones */


,/* usadas dentro del programa */
#incLude <stdio.h>
/* La funcin main inicia aguf */
main

()

Declaracin de Variables .*/


int matriz [100] []_OOl , num,l, k, trace;
ObE.ener deldo {

usuario el orden de 1a maLriz * /

printf("fngresar
1 y 100\n',);

el- orden de la mariz entre \

scanf (utdu,&num),.
) while (num < r ll num > 1oo);

,/* Obtener de1 usuario los elementos de la matriz *


/
for(k=9; k< num;k++) {
prinE.f (r'fngresar los valores para la Fila
?d\n",k);
for(1=0;1< num,. 1++) i
printf("fngresar el valor fila
?d col-umna ?d\' , k, 1) ;
scanf ( " ?dtr , &maEriz lkl t1l ) ;
/" sL bucle calcula fa traza de una matrz */
trace = 0;
for(k=O; k <= num-1,.k++)
,
crace = trace + matriz tkl tkl ;
,/* fmprimir en ta salida estndar Ia Eraza
prj-ntf ('La traza es ?d\n,,, trace);

de

1a mat,riz

/* La funcin main finaltza aqul */


El cdigo C termina aqu
Fin del Ejempto 2.3

Unidad 2: Arreg
40
@ Copyright tBM Corp.2002
^_materates delcurs
no pueden

,Los

slr rejroOucidos en parte

o en su totalidad sin el previo permiso


escrito de lBM.

o
o

Gua del Estudiante

o
o
o
o

Ejemplo

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o

!
!

o
p
o
o
o

amacron con C

es Trangurar superior

una matriz x es triangular superior


si todos los elementos debajo de la diagonal
ceros (usuafmente fa diagonal'y
son
fos elementos-p";;;il" no son
estrictamente ceros).
A continuacin se presenia un
matriz de 4 x4 de ejemplo.

12 24 36 48
0 11 22 .33
009998
00065
r:fit#Xi$"nllotoices

de matrices, los siguientes erementos


son cero en una matriz

12 24 36
Xr' 11 22
xr, gg
x^, Xn,

Y
-'31

x,.

48
33
gg

65

Note la forma en la cual fos subndces


proceden
respecto a cada eremento en ra
matriz anterior' Para cada nta,
oese o hasta z, "on
que ef subndice de ra
cofumna vara de 0 hasta fira-i'.
eirr"nt r;g;";dd"irogr"*"
"nlientra
rearizaesta tarea.
El cdigo G inicia aqu...

,/* fncluir 1os archivos de encabezado */


/* que tenen las defini-ciones de las
funciones */
/* usadas dentro del programa */
#include <stdio.n>

#define VERDADERO 1
#define FALSO O
#define ROir 4
#define col, 4

/* La funcin main se inicia

main

aqul */

()

/* DecLaracin de Variables */
int matrizlROWl [COL], !, k, i, j;
int go_on,.
k=1; go_on = vERDADERo;

o
o

2'4: Verificar si ra Matriz

ntroduccin a la pr

Vofumen g:

Tp

Unidadz:nn@tes
@

Cooyright tBM Corp.2002

Los materiafes del qrrsono pueden


b"ir"prodrcidos totat
o parcalmente sin etpermiso previo
de lBM.

"Jrito

41

Gua del Estudiante

/* obcener del ,rrl",


for(k=O; k<4;k++) {
/*prntf ("fngresar e1 valor para La Fila ?d\r
,k);*/
for(1=0;I<4;1++)

printf("rngresar
coLumna ?d\u,k,1) ;

el- valor fila

*d \

scanf ( utdu, &malriz tkl t1l ) ;


)

/* nI

bucLe

verifica si

for(i=t;i<ROW;i++)

es triangular superior */

l_a maEriz

for(j=0,-j<i; j++) {
if (marriz Ii] tjl !=

o)

go_on = FALSO,.
]

/* rmprimir a la salida
superj.or */

estndar si la matriz el triangular

if (go-on == VERDADERO)
prinEf ( "Es Triangular Superior\n
e1 se

printf

r'No

"

,.

es Triangular Superior\n,,

/* La funcin

main Lermina aqu

*/

El cdigo C termina aqu


Fin del Ejempto 2.4

Ejempfo 2.S: Determinar si fos Elementos


de la Diagonal de una Matriz son fos
Mismos que fos Efementos de fa Diagonat en
Cruz.
Considere fa siguiente matnzA, de orden 4
x 4.

all

a13 a14
a23 a24
a33 a34
a43 aU

a12

a22
a32
2

a21
a31
a41

Se debe verificar si

Unidad 2: Arreglos

t,

42
@

Copyright tBM Corp.2002

Los materiales del curso no pueden sr reproOucidos


en parte
o en su totalidad sin el previo permiso escrito de
lBM.

a
o
o
o

Gua del Estudiante

*.

o
o
o
o
o
o
a $
o *
o k
a
o i
o
o tt
o
oI
oI
oi
o
o
o
o
a
a
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

all = a14

422=

a23

Introduccn a la

a33=

a32

a44=

amacin con C

a41

Elsiguiente segmento
de programa freva
a cabo esta tarea.
El cdigo C inicia
aqu...

,/* rnclui

i: *:Fl:"'::':ilii,i:::cabezad' runciones
#incrude .::il;""j;;";;;:"*i"'""
#define VERDADERO 1
#define FALSO 0

!'

/* La funcin
main

()

maj-n

se inicia agui */

,/* Declaracin
inr i , j ,x,r, n"_jj, 11""ot""
j,nt arregLo_matriz
tal Ul ;

,/* Obtener de us
for(i=0 ;i<4;r**r'"tto

",

los elementos de la
matriz * /

for (j =o; j <4; j ++)


i
printf (,'fngresar Valor
para rr.rra td
\
Columna ?d J
\ ,\n,,,i,j);
,."nf ( ,,9 n , &arreglo_matriz
Iij t jt
]
printf ( " \n u,

);

,.

/* MoeLrar 1os elementos


de la matriz * /
for (i=0; i<4,. i++)
{

for(j=o;j<4 ;j++)
I

printf (,,td1u, arreglo_m


acriztil fjl );
Uo,m"

unidad2@1".
_.

@ Copyright lillvl
,l-os
_
C.arp.2002
^_ materiales
det ctl
ser reproducidos total
o parciafmenl" ,nTll^o-pueden
er permiso previo
escrito "l'nr.-*,

43

lntroduccin a la programacin con

Gua del Estudiante

Printf("\n");
)

/* gI ciclo verifica si los elementos de la diagonal y Ia


diagonal en cruz de l_a matriz son iguales o no */
k - 0;
n=4;

L = n -1;
go_on = vERDADERO;
whiLe (k <= n-1 && go_on) {
if (arreglo_marriz tkl tkj

arreglo_maEriz Ikl t1l )

k++,'
'l

--.

)
e

1se

go_on = FALSO;
)

/* rmprimir si los element.os


1a diagonal_ y de la
diagonal cruzada son iguales o no de
a l"a salida estndar */
if (go_on == VERDADERO)
pri_ntf ("La Diagonal y 1a Diagonal en Cruz \
son iguales \n");
eLse

printf("La Diagonal y
no son iguales \n',),.

1a

Diagonal en Cruz \

/* La funcin main finai-iza aquf t,/


Ef cdigo C finaliza aqu

Fin del Ejempto 2.5

Unidad 2: Arreglos
@ Copyright tBM Corp. 2002
Los materiales del curso nb pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso escrito de
fBM.

44

of
o
o
o
a

o
o
o
o

o
a
a
o
o
o
o
o
a
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

lntroduccin a la Programacin con C

Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:

.
r
'
.
'
'

Definiraneglosmulti-dimensionales
Describir fa naturaleza y uso de los arregfos bidimensionales

Explicar

la

importancia

problemas

de los arreglos bidimensionales en la sofucin

de

Describir el uso de fos aneglos bidimensionales en los algoritmos


Explicar como declarar, inicializar y emplear arreglos bidimensionales en
C

Discutir

la

implementacin

bidimensionales en C

de los

algoritmos

que emplean arreglos

o
o
o
a

o
o
a
o
o
O

o
o
o
o

Volumen 3: Tipos Oe OatosEstructr,,adolend

Unidad 2: Aneglos Multi-|)imensionales 45

@ Copyright tBM Corp. 2002


Los materiates del curao no pueden ser reproducidos total
o parcialmente sln elpermiso previo escrito de lBM.

Gua det Estudiante

Unidad 2: Exmen de Autoevatuacin

l)

Un aneglomulti-dimensionaltiene

a) Exactamente dos dimensiones


b) Dos o ms dimensiones
2)

c)

Ambas (a) y (b)


Cmo se denomina un arreglo de orden m
a) Aneglo unidimensional

xnx

p?

b) Aneglobidimensionaf
c) Areglo tridimensionaf
d) Un aneglo en generaf
3)

Cuntos enteros se pueden almacenar en


xLsl aJ?

un

arreglo declarado corTro i_nr

a) 22
b) 20

c)9
d) 12

4) Cmo se

accede
nombre [25] Ieo1 , 2
a) nombre
tj l

a un elemento de un aneglo declarado

como char

til

5)

b)

nombre

c)
d)

nombre

[k]

nombre

tzsl

gs1

cules de fas siguientes declaraciones de arreglos no son vlidas?

a) inr all il;


b) int sala [-2] l,2l ;
c) char xt2sl [890] ;
d) Todas las anteriores
6)

7)

cul de los siguientes es un arreglo de cuatro dimensiones?

inr a[4j;
inr a LAJ [4) ;
inr a aJ lal al ;
inr a l4'J t4l La) la) ;

Un aneglo tridimensionalse asemeja a una lista.


Verdadero

a)
b) Fatso

Unidad 2: Arregrlos M"


@ Copyright tBM Corp- 2002
Los materiales del curso no pueden sr reproducidos
en parte
o en su totafidad sin el previo permiso escrito de lBM.

46

Gua del Estudiante

8)

lntroduccin a la p

macin con C

Cul es la forma correcta de acceder a un elemento del aneglo definido como

char x[3] [s];?


a)x
b) x [1]
c) x [-1] ['b']

d)

9)

x tot tol
Para un aneglo definido como fl_oar
uso inconecto?

pt3l t3l ,

cul de los siguientes es un

a) P tol tol
b) p t1l t3l
c) p t1l t1l
d) pLrl L2l

l0)

Qu define un aneglo declarado como


Un aneglo tridimensionaf

a)
b) Un aneglo bidimensional
c) Un aneglo unidimensional
d) Un aneglo de 0 dimensiones

Volumen 3: Tipos de Datos gstruAulaos en

inr

rhree t"r) t2l Bl ;?

Unidad 2: Aneglos

@ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln el permiso previo escrlto de tBM..

Multi0imensionales

4T

Introduccin a la programacin con C

Gua del Estudiante

Respuestas a ta Unidad 2: Examen de Autoevaf uacin


l)b
2)c
3)b
4)a

ayb

od

T)b
8)d

e)b
10)

Unidad 2: ArreSlos
48
@ Copyrght tBM Corp.2OO2
Los materiales del curso n-o pueden
slr reproOucdos en parte
o en su totaldad sin el previo permiso
escrito de lBM.

o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin a la p

unidad 3: Lab. programar con Arregros


Objetivos de Aprend izaje
Alfinalde esta unidad, usted ser capaz de:

'
.
.
'

Emplear tipos de datos estructurados en


fa sotucin de problemas
Usar anegfos unidimensionales y bidimensionales

Aplicar areglos a problemas con matrices


Manipular los elementos de un areglo tanto para
aneglos unidimensionales
como areglos multimensionales

q
q

q
a

t?
?

t?
t?

O
i

b
p
.O

o
o

Volumen S:

np

Unidad 3: Lab. progrmar con


@

Copyright IBM Corp.20O2

, -_
tos
materiales del cufao no pueden'ser reproducidos
total
parcialmente
o

sin el permlso previo escrito de lBM.

enegtos

49

Gua del Estudiante

Ejercicios de Laboratorios
l) Escribir un programa 9l c que tome 10 enteros positivos como entrada

y los
imprima. El programa debe aneglar
que todos los nmeros
impares aparecen en.er tope se-guido
"i"""glo'Ji"iror*"
de tdo;lo nor"i..-";;("; er mismo
orden en cuaf aparecieron orginlmente). este
aiiegfo ordenado de esta forma
debe tambin imprimirse' se puede ,r"r t-"ngo p"r
resotver
probtema.
2) considere una mariz cuadrada de orden n x rL Etorden n se daefcomo
entrada.
Escribir un programa que toma como entrada la
matnz misma y encuentra la suma
de todos los elementos en el borde.
Los elementos del borde son aquelfos que estn
en la primeray
columnas' Pueden usar multipies estructuras iterativas para la ltima filas y
sotuconar este
problema.

3) considere ef problema de sumar los elementos der borde de una matnzcuadrada


del ejercicio anterior. Escribir un. programa que ro haga,
usando
estructura iterativa para sumar ros eremtos oet
r0".

slo una

Undad 3: Lab. programar


@ Copyright tBM Corp.2002
Los materiales der curso nb pueden sr reproducidos
en parte
o en su totafidad sn el previo permiso escrito de
lBM.

50

olt

o
o
o
o

o
o
o
o
oj*
o
o
o
o
o
o
o

Guia del Estudiante

amacin con

Unidad 4: Estructuras
Objetivos de Aprend izaje
Alfinal de esta unidad, usted ser capaz de:

.
'
.
'

Explicar cmo declarar estructuras.en C

Discutir ef uso de las estructuras en la solucin de probfemas

programas en C

travs

Describir el uso de los tipos de datos definidos por el usuario


Definir uniones y explicar cmo sus usos difieren del de las estructuras

o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

t
o
t
?

Io

Volumen 3: Tipos de Datos gstructuraOos en C

Unidad 4:

@ Copyright tBM Corp. 2002


Los materiates del curso no greden ser reproducidos total
o parcialmente sln el permiso previo escrito de lBM.

Estructuras 5i

lntroduccin a la Programacin con C

l.

Gua del Estudiante

ntroduccin

En fas undades anteriores, se discuti cmo dectarar tipos


de datos bsicos

co[1o inr,
char ! rloat, asf mmo estructuras de datos como arglos. Se traoao
n situaciones
para solucionar problemas que requeran que se usase
slo uno de estos tipos de
datos o estructuras de datos. Esto porque lo que se estaba discutiendo
eian problemas

de tipo simple.

Sin embargo, en el mundo real, se deben tratar situaciones para


ta solucin de
problemas.complejos en las cuafes se tenga que manipular
entidades-que son una
colercin de elementos de datos, cada.uno"d"'r tip ot"ini.-pi-e]empto,
n una
universidad donde el registro de un estudiante debe tener,
entre otras cosas, un nmero
de lD (un crrar), un nombre (un areglo de char), peso (un
float) y la altura (un
float)' Los tipos de datos son todos diferentes, pero existe agrupaciilgica
que es
significativa - un registro de estudiante. Para maejar tales
situaciones, c provee un
tipo de dato llamado structure
Las estructuras, cgmo aneglos, son capaces de manejar
muttiptes efementos de datos
usando un nico identificador que los agrupa a tods junto.
Mientras los a'eglos
contienen mltiples efementos de datos, toos del mismo iipo,
las estructuras contenen
mltipfes elementos de datos, cada uno de los cuafes puede
ser de un tipo diferente (en
una estructura, los mltiples elementos de datos pueben tambin
ser el mismo tipo,
pero sta es una de las formas). De manera que, en
una estructura, los elementos
individuales pueden ser enteros, carcter, punto ilotante o un
areglo. Los elementos de
una estructura se denominan miembros. bea una situacin que
ivotuc manear tas
fechas de nacimiento de un grupo dado de personas.
Hasta ahora, el mtodo conocido para hacer esto era declarar
tres variables enteras, tal
como sigue:

int dia, mes, anio;


int dia_nacimiento, mes_nacimiento, anio_nacimiento,.
Sin embargo, afgunas situaciones pueden. requerir qu se
manejen diferentes tipos de
fechas, tal como fecha de ingreso al trabajo, flcha o graouacin,
fecha de matrimonio
y fecha de fa ttima promocin. Est cfro que cao uno de las
fechas anteriores
involucra tres componentes da, mes y ao.
Esta es una de las reas en donde tas estructuras se usan.
Las estructuras permiten
que elementos de datos que tenga una tgica
comn pero que pueden ser de diferentes
tipos, sean tratados cohesivamente. conidere una situacin
de sofucin e prootema
que requiera el manejo de cinco fechas diferentes nacimiento,
ingreso at trabajo,
matrimonio, ltima promocin y jubilacin. Estas pueden
ser manejadas como sigue:

int dia_nacimiento, mes_nacimiento, anio_nacimiento;


int dia_ingreso_Erabajo, mes_ ingruro_r.lo"io,

ani o_i ngre so_t raba j o ;

int. dia_matrimonio, mes_matrimonio, anio_matrimonio;


Volumen g,
52

O Copyright tBM Corp.20O2


Los materiales delcurso no pueden
ser reproducidos en parte
o en su totaldad sin el previo permiso
escrito de lBM.

of

o
o
o
o
o
o
o
o
o

oo
o
o
o

o
o
o
o
o
o
O

o
o
o

o
o
o
o
o
o
o
o
o
o

o
o
o

Gua del Estudiante

ramacin con C

int dia_ultima_promocion, mes_ ul-tima _promocion, anio


ultima_promocion ;
inr dia_jubilacion,
mes_jubj.lacion, anio_jubi1acion,.
Las operaciones que se hacen con las fechas son todas comunes, no importa fa
fecha
especficada, como por ejemplo 'Encontrar el nmero de das transcunidos' o ,eu
fecha ocuni ms temprano'. Las estructuras ayudan a alcanzaresta cohesin.

2. Definir y Usar Estructuras'


Se puede definir una estructura en C como sigue:
struct <nombre de 1a estructura> {
mi cmtrrn

1 .

*ie*ro-Z;
m]-errlDro_n;

),
Aqu, la palabra

struct es una palabra reservada mandatoria. El trmino <nombre

de 1a estructura>

es cualquier nombre (usando las reglas para la creacin de un


identificador) que identifique ta estructura. Cada uno de los miembros, tal
como
miembro 1 o miembro 2 es una declaracin individual para los miembros de la
estructura Los miembros pueden ser de cualquier tip oe dato, incluyendo aneglos y
estructuras en s mismas. En el contexto de estructuras, los trminos Oefinicln y
declaracin se pueden usar por igual. Se puede decir que se est definiendo una
estructura o declarando una estructura sin ninguna dferencia especifica en el

significado.

A continuacin se presentan algunos ejemplos.


Ejemplo 4.1: Definir una Estructura

struct fecha

Lnt' o].a;

int. mes,.
int anio;
];
Esta es algo que ya se ha visto antes. Esta define una estructura llamad fecha con
los miembfos dia, mes, y anio, todos los cuales en este caso, son enteros. Sin
embargo, no se puede poner int dia = 28 o una defincin de estructura.

Nota: Lo anterior slo define una estructur:a. Ninguna variable est declarada all. para

declarar variables, se puede usar la siguiente declaracin:

struct fecha nacimiento, ingreso_t,rabajo, jubilacion;

?
?

p
p
p
o

Volumen 3: Tipos de Datos EstruAulrados en C

.'

@ Copyright tBM Corp. 2002


Los materiales delcurao no pueden ser reproducldos total
o parcialmente sln elpermiso previo escrfto de lBM.

53

Introduccin a la programacin con

Gua del Estudiante

Cuando se dice fecha, se est refiriendo al comienzo de posicin


ta
de memoria de ta
estructura definida anteriormente. Cuando se hace referencia
a las variabtes tal como
nacimiento, ing.reso-trabajo, jubilacion, se est refiriendo a
estructura
plgleta que contiene tres miembros. Si se desea hacer referencia auna
los miembros
individuales de la estructura en cada variabfe, se hace lo siguiente:

nacimiento. dia
jubilacion- anio
Esto implica que erameso se hace usuarmente como sigue:

variable. miembro
Unavez que se ha accedido a los miembros individuales usando eloperador
(punto),
se puede hacer uso de los miembros de la estructura talccrno lo dict
el tipo de dato del
miembro.

El siguiente es un mtodo para dectarar variables de la estructura


f echai

struct fecha nacimiento, ingreso_trabajo, jubilacion,.


Las variables de un tipo de estructura individuat pueden tambin
ser dectaradas como
sigue:

struct <nombre estructura> vari-able 1,


variate-1, -., variable_n,.
La estructura fecha y las variables individuales pueden ser declaradas
como sigue:
struct fecha {
lnt aia;
i-nt mes,i.nt anio;
] nacimiento, ingreso_Lrabajo, jubilacion,.
Elsiguiente es otra forma de

definirlas.

stsatic struct fecha {


int dia,int mes;
int anio;
nacimiento,
ingreso_trabajo, jubilacion,.
)
Note que las definiciones anteriores todas definen la misma estructura
y variabfes.

Fin del Ejempto 4.i

Volumen 3

il
@ Copyright tBM Corp.2002
Los materiales del curso no pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.

It

o
o
o
o
o

Gua del Estudiante

struct fraccion_mixta

oi
Or

ol
o
o

o
o
o

a
a
o
o
o
o

tT

lo

io

rt
b
p
Ir
p

1nE parte_entera;
int numerador,.
int denominador,.
I

l.
I

)a,B;
A y B son variables de un tipo de
una estructura que
permte representar ftaccione's

es

fraccion mixta. Esto

mixtas como p"i


b 1% en la estructura donde
parte-entera = 1, rlume rador = 3 y denominador
"i.,]rp
= . Tambin se puede definir
esto como t'nl?,,".
t

o
o
o
Or

co-

Ejemplo 4.2: La Fraccin Mixta como


una Estructura

o
o
o
o
o
a
o
a

Introduccin a la programacin

parte_ent.era,.
int numerador;
int denominador;
1nE.

)e,B;
Note que se ha omitido <nombre estructura>,
el cuaf es opcional. Las variables
creadas A y B, tienen ras mismas propiedade,
Jlnni"on anterior.

il;

Fin def Eemplo 4.2


Ejemplo 4.3: Nombres de personas

se sabe que generafmente los nombres de las personas


se registran como
nombre' segundo.nombre

primer

y apelfdo. se puede oennirLna estructuia


llamad nombre,
con el primer nombre, segundo nombre y
apeilido como miembros.

sLruct nombre

cnar primer 120) ;


char segundo [20] ;
char apellido [a5] ,

'

)miNombre,.

Note que los miembros son anegfos,

cadauno

de ellos puede ser de cuafquier tipo y


tamao' se pude acceder al apetlido de
ra variable miNombre @rno
miNombre-apellido. ste es, sin embargo,
un
anegro de caracteres. se debe
acceder a las partes individuales se
usa miNombre.apellidolkl , donde k es un
entero de o a +q .

En esta estructura-s-e
tiene un espacio de 20 caracteres.par_a el primer y el segundo
nombre y otro espacio
de 45 cracterer para el apeffido. se puede
cmbiar estos
valores si la apticacin fo requiriere.
ote que esta eiiructura tiene miembros,
todos los
cuales son anegfos de tipo char. Por general,
lo
las estructuras pueden tenermiembros
de diferentes tipos, etlos tambin puedn
ser'"rgo-"ir1"res
se mostr en ef

"omo

Volumena:npos@
55

. __
Q CopyrighilBM Corp.2002
ros
materiares der curso no pueden'ser reproducidos
o parcialmente sin ef permlso previo

"rt

total

ito de lBM.

lntroduccn a la Programacin con C

Gua del Estudiante

ejemplo anterior.

Fin del Ejemplo 4.3


Ejemplo 4.4: Lista de Direcciones de Correo

struct. direccion correo


"ttrrat

nombre

*r*o*ta,

char primera_linea [25J ;


char segunda_linea l25J ;
char callel2S);
char area [30] ;
char ciudad [25] ;
char codj-go3ostal [9] ;
char pais [20]
,-

) p,

e;

Note que una estructura se usa dentro de otra en este ejemplo. La estructura nombre
se usa dentro de la estructura direccion correo. Para acceder al prmer carcter

del primer nombre de

p,

se le debe referir como sigue:

p. miNombre.primer [0]
Si se requiere imprmir la direccin de coreo en ta varlable p, se puede usar el siguiente
segmento de programa:

Elcdigo C inicia aqu...

/* fmprj.mir a Ia saLida estndar 1a direccin de


correo de 1a estruct.ura */
/* Imprimir eI primer nombre *,/
printf ( " ?s, p.miNombre.primer),.
/" Se imprime un espacio despus del p?imer nombre */
nrinl.
f lll
\', rr\.
/* Imprimir el segundo nombre a Ia salida estndar * /
printf (', ?" n, p. miNombre. segundo) ;
/* Se imprime un espacio despus de1 segundo nombre *,/
7ihf

/ll
\

tr\.
I,

/* Imprimir a La salida estndar e1 ape11id,o */


printf ( "?s\no,p.miNombre. apellido)
,/* Imprimir 1a Primera Lnea de l-a Dierccin
a la salida estndar * /
printf ( uts\nn,p.primera linea) ;
/* fmprimir 1a Seguna Lfnea de la Direccin a
la salida estndar */
,-

Volumen 3: Tipos de Datos Estructurados en C


@ Copyright IBM Corp. 2002
Los materiales delcurso no pueden ser reproducidos en parte
o en su totaldad sin el previo permiso escrito de lBM.

56

of
o
o
o
o
o
o

Gua del Estudiante

o
o
o
O,

o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
O
O

a
o

I
a

"

Introduccin a la p

ramacron co:

printf ( "?s1,,, p. segunda_linea) ;


,/* f mprimir 1a caf l-e a 1a saf ida estnd ar * /
printf ( ', ?s1u , p. ca11e) ;
,/* fmprimir el rea a la salida estndar */
printf (', ?s1u, p. area) ;
,/* rmprimir e1 nombre de 1a ciudad a la salida est.ndar */
printf (n?s1u,p. ciudad ) ;
/* fmprimir e1 cdigo postal de la ciudad a
la sal_ida est.ndar *,/
printf (,'?s1u, p. codigo3ostai) ;
/* rmprimir eI nombre de1 pas a la salida estnd ar * /
printf ( "?s1u,p.pais) ;
Ef cdigo C finaliza aqui

Esto ilustra como trabajar con estruturas en una situacin de programacin.


Se
mprimi cada miembro de la estructura direccion correo como
cadena usando el
especificador de formato ?s.
Fin del Ejempto 4.4
Ejemplo 4.5: Registro de Estudiante

struct estudiante {
struct. nombre nombre_estudiante
char num_id [9] ;
struct fecha nacimiento,.
float peso;
float altura;
int iq,t
)filosofia [100] ;

En esta estructura, se ha dectarado una variable f ilosof ia


Que eS un arTeglo de 100
elementos, cada uno de los cuales es un registro de estudiante
definido anteriormente,
con membros. Se puede referir al ao de nacimiento al iq del primer
estudiante en
!
esta cfase como sigue:

filosof ia [0] . nacimiento. anio


f j_1osof ia I01 . iq

Ul" estrucfura puede contener cualquier nmero de membros, los cuales son
estructuras en s mismas. Es tambin posibte tener varios
niveles de estructuras
anidadas dentro de una estructura. Por ejemplo, to siguiente
sera una declaracn
vlida de una estructura:
struct externo

Volumen3:TiposOe@
@ Copyright tBM Corp. 2002
Los materiales delcurso no pueden ser.reproducldos total
o parcialmente sln el permlso prevlo escrito de lBM.

57

Gua del Estudiante

struct nivel,l {
struct niveL2 {
struct nivel3
int k,.

]r; //pin de la oe"r".]cin de 1a estrucrura


I r ^
t t
I L;
//

-,
r,

].n Oe

f" aecfatacin de La estructura

i fr; // fin de 1a decl_aracin de Ia estructura


l / / pin de la decl-aracin de la estrucEura exEerna

En una decfaracin tan profunda

como fa anterior, se deben tener cuando se accede


a
un miembro de la estructura. Para acceder a la
variable L
k decfarada
vvv's'qvq en struct

nivel3,

se debe hacer lo

siguiente:

o.11.12.13.k
Note que el nmero de operadores que
se usan es tanto como el de definiciones de
estructuras' B una buena prctica de programacOn
evtar definiciones de estructuras
con anidamiento muy profundos.

un punto importante a resaltar de la declaracin anterior


es que la variable de la
defincin de fa estructura ms intema se
crea dentro de ra definicn de la estructura
principal. se han framado estas como
17, 12 y 1:. Esto
porque no se pueden usar
las estructuras ms intema sin decfarar una variabre, es
y
no
hay_ forma que se puedan
declarar variables de las estructurai rrlnt"r"
f;;'oe ra definicin de ra estructura
principal.
Fin del Ejempto 4.5
Ejemplo 4.6: Inicializar una Estructura
Considere la siguiente estructura.

sEruct fracci_on mixta {


rnc parte_encerai
int numerador;
int denominador;
I
t;
Se puede asignar valor a la variabfe

continuacin:

en

la declaracin misma como muestra a

struct. fraccion_ mixta _ = {1,3,4};


Se crea una variable a, como se muestra
a continuacin.
Volumen 3:

Tiposeffi

58
@

Copyright tBM Corp.2002

Los materiales del curso no pueden sir reproducidos


en parte
o en su totalidad sin el previo permiso escrito
de lBM.

o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

lntroduccin a la Proqramacin con

" 1"-i;.::":",

a.denominador =

'

Esto es justamente una representacin de la fraccin mixta 1%. Tambin


se puede
declarar la variable de la estructura separadamente e inicalizar los valores
a
travs del
programas como sigue:

struct fraccion mi.xta {


int partelr"t",
int numerador,.
int denominador;
)";
a-parce_entera = 1,.
a.numerador = 3;
a.denomi.nador = 4,.

Fin del Ejempto 4.6


Ejemplo 4.7: Sumar Dos Fracciones Mixtas
Asuma, que se requiere tomar dos fracciones mixtas como entrada, sumarlas
y mostrar
el resultado. Sean las dos fracciones mixtas A = a3A y B
= 1% respectivamente. para
sumarlas, se debe primero convertir los nmeros a la forma numerador/denominador.

r%= (4*1+3)

/4__7/4

Esto es lo mismo que

(denominador * parte_entera + numerador) denominador


/
Con esto, se tienen ambos A y B como

es4.Porlotanto,

/ 4. El denominador es comn, as que el MCM

A + B= (z + 7) / q= r4/4.Elt+/+debeconvertirseauna

fraccin mixta como 3 (el cual es parte-entera.como un cociente


entero) y 2 (el cual

es el numerador como
denominador.

mdulo

de divisin). El MCM p"*"nu como

el

El siguiente es el algoritmo para sumar dos fracciones mixtas:

.
o
.
.
r
o

Paso 1: Declarar fas fracciones mixtas a y e


Paso 2: Ingresar las dos fracciones mixtas positivas y vatidarlas
Paso 3: Covertira a la forma de fraccin impropia x
Paso 4: Convertir e a la forma de ftaccin impropia v
Paso 5: Encontrar el MCM de x y v
Paso 6: Formar 2=((MCMtx.denominador*)x.numerador +
(MCM/v.denominador)y. n um erador)/M CM

Volumen 3: Tipos de Datos gitructuraos en C


@ Copyright tBM Corp.2002
Los materiales del curso no pueden ser reproducidos totat
o parcialmente sln el permiso previo escrito de lBM.

59

Gufa del Estudiante

o
o

Paso 7: Convertir z en ta fraccin mixta c


Paso 8: lmprimir A, B, y c

El programa en C, basado en el afgoritmo anterior,


se desanolla usando el refinamiento
paso a paso.
El cdigo C inicia aqu...

/* se incJ-uye eI archivo de encaezado con r,as funciones


que */
,/* soport.an las operaciones de entrada y salida (stdio.h) */
#include <st.dio. h>
/* La funcin maj-n se inicia aqu */
main0 i
,/* Declaracin de las estructuras */
struct fraccion_mixca {
int parte_entera;
int numerador;
i-nt denomi.nador,.
)a,B,c;
struct. fraccion_impropia {
inE numerador;
int denominador;

)x,v,z;
int u, v,

mcm, mcd,.

,/* Obtener los datos de1 usuario para la


primera fraccin mixta A */
/* obtener la enlrada del usuario para 1a parte entera
de la fracc1n * /
printf("rngresar J.a primera parte entera de la
fracci_n
(positivo)

\nn ) ;

doi
scanf ( u ?d u , &A. parte_enEera ) ;
) while (A.part.e_entera .= 0);

/* Obtener del usuario eI numerador de la fracci n * /


printf ("Ingresar el primer numerador\n,,)
;
do{
scanf (nEdu, &A.numerador) ;
) while (A.numerador < L),.
Volumen S:

f
60

@ Copyright tBM

Corp. 2002

Los materiales delcurso no pueden


ser reproducidos en parte
o en su totalidad sin el prevo permiso

escrito de lBM.

o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

IO

Introduccin a la Prooramacin con

/* Obtener la enLrada de1 usuario para ef denominador


de 1a fraccin * /
printf ( t'Ingresar e1 primer denominador\n,') ;

do{

scanf (u?du, &A.denominador)


) while (A.denominador <= 91,

o,

Gua del Estudiante

,/* Obtener los datos a"f ,rrrr".io para formar


1a segunda fraccin mixta B* /
Obtener
,/*
la entrada de1 usuario para la
parte ent.era de l_a fraccin * /
print.f ("fngresar 1a segunda parte entera\n,r) ;
do{
( " ?dil, &8. parte_entera),.
(B.parte_enLera
<= 0);
) while

scanf'

/* obt.ener la entrada del usuario para e1 numerador


de la fraccn * /
printf ( "Ingresar e1 segundo numerador\n" ) ;
do{
scanf ( u?du, &B.numerador),.
) while (B.numerador < 1);

/* obtener 1a entrada de1 usuario para eI denominador


Ia fraccin */
printf ("fngresar e1 segundo denominador\n,,)
do{

de

,.

scanf (u?du, &B.denomirador),.


) while (B.denominador <= O)
,.

/* Convertir 1a primera fraccin mixta (A)


a una fraccin impropia para formar X * /
if (A. numerador ! = A. denominador) {
x-numerador = A.parte_entera 'r A.denominador + A.numerador;
X. denomi-nador

A. denominador,.

]
else {

X.numerador = A.parte_entera;
X.denominador = 1;
I

l
Volumen 3: Tipos de Datos gitruaulaOos en C
@ Copyright tBM Corp. 2002
Los materiates del curso no pueden sr reproducldos total
o parcalmente sln lpermlso prevo escrito de lBM.

61

lntroduccin a la programacin con

Gua del Estudiante

/* Convertir la segunda fraccin mixta (B) a


una fraccin impropia para formar y * /
if (A.numerador != B.denominador) {
Y-numerador = B-part.e_entera * B.denominador + B.numerador,.
Y.denominador = B.denominador;
t
I

else {
Y.numerador = B.part.e_entera;
Y.denominador = 1;
]

/*
/*
/*
/*
/*

X e Y */
MCM(u,v) = (u * v) / MCD (u.v) * /
Se guiere determinar e.l MCM de X.denominado y */
Y. denomi.nador * /
Buscar el MCD de los dos */
Determinar eI

MCM de

/* Calcular el_ MCD de Los denominadores de X e y


u = X.denominador;
v = Y.denominador;
while (u != 0 && w r= 0) {
if (u >= v)
U=U?

*,/

e1 se

?u;
v;

mcd

mcd

= u;

a'l ca

,/* Calcular el MCM de los denominadores de X e y */


ftcm = (X.denominador * y-denominador) / mcd.;
/*CalcularZ=X+y*/
Z.numerador = (mcm / X.denominador)* X.numerador + \
(mcm /Y.denominador) * y.numerador;
Z.denominador = mcm;
/* Convertr Z a una fraccin mixta para formar C */
C.parte_entera = Z.numerador / Z.denominador,.
C.numerado = Z.numerador t Z.denominador;
C.denoninador = Z.denominador;
Volumen 3: Tipos de Datos estructuraOos en C
@ Copyright tBM Corp. 2002
Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el prevo permso escrito de lBM.

62

o Tt
o .t
o
o
o
o*
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin a la Programacin con C

,/* rmprimir C en la salida estndar cuando resulte en un nmero


entero *,/
/* Manejar casos especiales de una fraccin aqu */
if (C.numerador == C.denominador)
print.f ('rEl resultado es td\n", C.parte entera) ;

else i
/*imprimir Ia fraccin mixta C a la salida est.ndar*/
printf (',E1 result.ado es ?d y Zd / ?d\n,,, \ C.parte_entera,
C.numerador,
denominador)

C.

]
)

/* La funcin main termina agu */


El cdigo C termina aqu
Fin del Ejempfo 4.7
Este programa es un poco largo, pero bastante directo. Se ha refnado
cada uno de los
pasos en el algortmo en un conjunto de sentencias que
los implementan.

Ejemplo 4-8: calcular el promedio de Notas de los Estudiantes

Para reforzar la cmprensn del uso de estructuras en la solucin


de problemas,
consdere el ejemplo de cafcular el Promedio de Notas de los
Estudiantes de una clase
en particular de una universidad
En una clase, asuma que hay un mximo de 100 estudantes. cada
estudiante est
registrado en los msmos seis cursos en un semestre. Alfinal
del semestre, el instructor
asigna letras de cafificacones de la
a la E para todos los seis cursos de cada
estudante. cada uno de los seis cursos es de 3 nidades (horas
creoiio eipromedio
de Notas de los Estudiantes se calcula en una escala de 10 puntos. para
hacer esto, los
siguientes son es la notas asociada con cada uno de las clalificaciones
en letras:

10

Asuma que un estudiante obtiene las siguientes calificacones


en los ses cursos:
Curso

Curso 2

Curso 3

Curso 4

Volumen 3: Tipos de Datos estructuraOos en C


@ Copyright tBM Corp. 2O02
Los materiales del curso no pueden ser reproducldos total
o pardafmente sln el permlso preo escrfto de lBM.

63

Gua det Estudiante

5
Curso 6
Curso

A
E

Aqu, el Promedio de Notas derEstudiante se


carcura como sigue:
*3
(10 "3 + 4" 3+ 8 " 3 + 10
+ 10 " 3 +2" 3)/(6 - 3)
(30 + lz + 24 +30 + 39 + 6) / 18
132

18

=7.33

Todo lo que se debe hacer es sumar fa puntuacin


de cada curso, multiplicalo por 3
(unidades del curso) y dividirlo por el nmero
tota e unidades. El siguiente es el
algoritmo para solucbnar este prl"ma,

o
'
o
.

Paso r: Decrarar una estructura para er registro


der estudiante
Paso 2:Decrarar un anegro de 100 estudiantes para
fos registros
Paso 3: Ingresar y vafidar ros datos dados por
ef usuario
Paso 4: para todos los estudiantes
{
caleular el- promedio de Notas,.

imprimir el NOfD, Nombre, Grados y el promedio


de Notas;

A continuacin se escribe el program a para realizar


esta tarea, aplicando refinamiendo
paso a paso y usando
cada uno de los pasos del algoritmo.

El cdigo C inicia aqui...

/* fncluir los archivos de encabezado requeridos


por el programa */
#include <stdio-h>
#include <ctype.h>
/* La funcin main se inicia aqui *i
mainO {
,/* Declaracin de las estructuras */
/* DecLarar un arreglo de L00 estudiantes para
registros */
struct registro_estudiante {
char noid [9] ;
char nombre [50J ;
char grados [6] ;
float pn;
i.isra
)
[100] ;

Volumen 3:

TiposOeffi
@ Copyright tBM Corp.2002
Los materiafes dercurs n-o pueden sr relrooucidos
en parte
o en su totalidad sin el previo permiso escrito
de lBM.

1os

64

:r

e)'

Gua del Estudiante

o
o

/* Declaracin de Variables
ir

o,-

ort

Introduccin a la Prooramacin con C

acl-

f.

rI

num'

double pn;

o,

e
C

,/* Obt.ener como entrada de1 usuario el nmero de


esEudiantes * /
printf("fngresar e1 nmero de estudiantes < 100\n',)
do{

o
o

o.
o"
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
O

o
o
I

o
o
o

scanf (r*d",&n_es:),'
) while (n_est < 1 ll n_esc >

1OO)

,/* Obtener del usuario l-as entracas ace:ca de todos


los estudiantes */

for (k = 0; k . n est; k++)


nrin1.

f l,,t-o]o.

d,al--q

{
r:

Y;

k + l-);
,/* Obtener 1a ent.rada del usuar:c cer ::c:c 'r'
printf ( " Ingresar e1 NOID (max t ca:c:eres ) : \n" )
scanf ( u?sn, 1ist.a IkJ . noid) ;
/* Obtener como entrada de1 usuaric ej :,::-.-::e -,,
printf ("Ingresar el nombre (me:1o: a 5C,
caracteres) : t,) ;
scanf ("?"u, lista Ik] .nombre) ;
,/* Obtener como entrada del- usua::c :=:a .:::: oe los
cursos */
,.

for(j=O;j.6t1++){
f f lush (stdi-n) ;
printf("Ingresar
Ia nota iei el Curso \
[A-E]: ?d\h",1+I);
do{
scanf (rr?cr', &1ista [k] .grados Ij] ) ;
] while (toupper (lista [k] . grados t j I ) < ,A, \
| | toupper (lista lkl . grados tj l ) > 'E' ) ;
t

,/* Todas las entradas realizadas para todos


1os estudiantes */
/* Calcular el Promedio de Notas para todos 1os estudiantes
for (k = 0; k < n_es; k++)

Volumen 3: Tipos de Datos Estructurados n C


@ Copyright IBM Corp.2002
Los materiales del curso no pueden ser reproducldos total
o parcialmente sin el permso previo escrito de lBM.

65

Gua del Estudiante

,/* Calcular el n.o*


printf ( "Calif icacin deL est.udiant.e ?d\n,,, k)
num = 0,.
for(j=O;j<6;j++)t
printf ("tc1u, Loupper(1ista[kJ .grados
tjj ) ) ;
if (Eoupper(1isra lkj .grados tj] ) == ,A,)
num = nu.m + 30,.
else if (Eoupper (lista [kJ . grados tj ] )
|B ,
)
num = num + 24;
else if (toupper (lista [k] . grados tj I )
,C, )
num=num+18;
else if (Eoupper(lista [k] .grados tjl )
,D,)
DUtn = num + 12,.
else if (toupper(lisEalkl -grados tjl )
,E,)
num=num+6;
,.

P LI

Calcular e1 promedio de Notas de1 estudiante */


= (icuble) num / te.O;

* f mprini- 1os det.al1es deI estudiant.e */


/* fmprirnir el noid del estudiante */
prrntf ('' Ei noid del estudiante es: \
?s\t", listalkj .:rcid.) ;
,/ * f primi r e1 nombre del estudiante *,/
printf (',r1 :romnre del est.udiante es:
\
?s\L", l-ista [k] .nor.re) ;
,/ * f mprimi r et pN del- esEudiante *,/
nrtntf (,,81 pN del est.udiant.e es: ?g\nu, pn);
,
,/

/* La funcin main termina aqu */


El cdigo C termina aqu

La estructura de registro del estudiante es bastante


crara. siempre que se requrieron
validaciones stas fueron hechas. como se pudo
notar, se acept sofo las letras A
hasta la E para las cafificaciones. Para calcular
et promedio de Notas, se usaron fos
'nrneros mgcos'. 30, 24, 18,
12 6. ;.
notias asocadas con fas
respectvas carificaciones de ta A a ra ,
g
murtipt*d*
i unoaes iei;;]o, 30 = 10
" 3, 24 = 8 * 3 etc.). Dado que, num es de'tipo entro,
antes
w w'vq'qr
carcular c
er gpa, s
convierte al tipo f loat.

;";';s

Volumen

arfip
66

Copyright tBM Corp.2O02

Los materiales delcurs no pueden


en parte
o en su totalidad sin el previo permiso
",,efroOr"idos
escrito de tBM.

>.

,,".

o
o

Gua del Estudiante

o
o
o

Este ejemplo lustra el uso de estructuras, declaracin y sus


usos en un programa.

Fin del Ejempto 4.8

o
o f
o '
o i
o
o

3. Tipos de Datos Definidos por el Usuario

.'

o
oi
I

Ot

ol

e
o
o
o
a
o
a
o
o
o

o
o
o
o
o
o
o
o
o
o

C permite al usuario definir sus propios tipos de datos. La sentencia rypedef


permte a
los usuarios definir nuevos tipos de datos.que son equivalentes ri iipos
de datos
existentes. un nuevo tipo de dato puede ser definido como sigue: "

typedef tipo-existente nuevo_tipo,.

tipo-existente se refiere a cualquier tipo de dato estndar como int, char,


float u otros tipos de datos definidos por ef usuario previamente que estn
disponibles. El nombre del nuevo tipo de dato definido por el usuario
es nuevo-ripo,
siguiendo
Aqu,

las reglas para formar identficadores. Esto es slo un nombre nuevo


dado a
un tipo. de dato previamente definido. No existen diferencias fundamentales
entre el
nuevo tipo de dato o eldefinido previamente o ef tipo de dato estndar.
Note la siguiente

decfaracin:

t.>edef int anio;


La declaracin anterior define un nuevo tipo de dato llamado
a int . Con esto, se pueden declarar variables como sique:

anio

que es equivafente

anj_o A, B, miNacimiento;

typedef anterior y declarar las siguientes


anio X[50j, y[50];

Se puede usar el

Este declaraxy Y como arreglos del tipo


enteros.

anio,

se pueden tambin decrarar equivarentemente


typedef inr anio[50];
anio X, y;

continuacin
estructuras:

variables tambin:

los cuales son realmente un arreglo de

ro siguiente:

se presenta cmo se hace uso de la sentencia typedef

typedef struct

con

miamhra

mlemro Z;

o
a
o
o
o
o
o
o
o

macin con C

miembro_n;

) nuevo-tipo,.
Se puede usar este mtodo para definir un nuevo tipo, tal como se muestra

continuacin:

Volumen 3: Tipos e Datos

Estruct[EdG]d

@ Copyright tBM Corp.2002


Los materiales del curso no pueden ser rcproducidos total
o parcialmente sin elpermiso previo escrito de lBM.

67

Powered by TCPDF (www.tcpdf.org)

oilF

o 't'
o
o
O,.,

Ol

o'
o
o
O*

o
o
o
o

o
o
o
o
o
a
o

Gua del Estudiante

Introduccin a la Programacin con C

Se definen tres variables a, b, y c, las cuales son uniones. En la unin, se han definido
tres variables x, y y z (cada una de un tipo difererente). Cuando se considera la variable
a, debe entender que es una estructura con miembros x, y y z. En una unin, sin
embargo, fos miembros x, y y z de la variable a comparten el mismo espacio de
memoria. Tambin, note que un inr ocupa ms mernoria que un char, y un float
ocupa ms memoria que un int. Existen muchas cosas de mantenimiento que deben
hacerse cuando se usan uniones, pero todo esto es tomado en cuenta por el
compilador

Los miembros de una unin pueden ser de cualquier tipo de datos, aneglos o
estructuras. Se pueden tambin usar uniones con aneglos. Al usar el 'operador punto'
@mo en las estructuras se hace referencia a cualquier miembro de la unin. Se
iuede
realizar lo siguiente para hacer referencia a un miembro de una unin:
a.x
b.z
Por lo tanto, una unin en C es bastarlte semejante a una estructura. El uso de unin
depende de s ef ahorro de espacio es vital para la aplicacin.

o
O

o
o
o
a
o
o
o
o
o
a
o
o
O

o
o
O

o
o
o
o
o

Volumen 3: Tipos de Datos Estructurados en C


@

69

Copyright tBM Corp.2002

Los matedales del curao no pueden ser reproducidos total


o parcialmente sin elpermiso previo escrito de lBM.
t.'

Introduccin a la programacin con

Gua del Estudiante

Resumen
Ahora que ha comptetado esta unidad, usted debe ser capaz
de:
Explicar cmo declarar estructuras en C

.
o

o
.

Discutir el uso de las estructuras en


programas en C

la solucin de problemas a travs de

Describir el uso de tener tipos de datos definidos por el usuario


Definir uniones y explicar cmo su uso difiere del de las estructuras

Volumens'ripoffi
@ Copyright tBM Corp.2002
Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso esctito de lBM.

70

ol
o
o
a

o
o
o
o
a
o

Gua del Estudiante

Unidad 4: Examen de Autoevaluacin

l)

lr
Jt

b) strucr {
int x;
float y;
Ia,b;
C) strucr {
int a;
float y;
) -, b,'

o
'

o
o
o
o

d)

2)

o
3)

Verdadero
Falso
pueden ser parte de una estructura.
Constantes de cadena
Variables enteras

a)
b)
c) Constantes enteras
d) Constantes carcter

4) Cules de los siguientes tipos de datos son vldos dentro de una declaracin de
unin?

a) Tipos de datos primitivos


b) Tipos de datos definidos por el usuario
c) Ambos (a) y (b)
d) Ninguna de las anteriores

o
o

o
o

Todas las anteriores


Al igual que los areglos, las estructuras no pueden contener mltiples elementos
de datos de diferentes tipos.

a)
b)

o
o
o
o
o
o
o

Cules de las siguientes son una definicin correcta de una estructura?

a) srrucr {
int x;
float y;

o
o

Introduccin a la Programacin con C

5)

Considere que se accede a una variable estructurada como a. b. c . d tol En


ste caso, cules de los sguientes identificadores se refieren a variables de
estructuras?

o
o
a
a

a) a, b, cyd
b) a, byc
c) ayb
d) Slo a

a
l-t

!tIt

.l

T
tr
ft

71

Copyright lBMCorp.2002

Los materiales del c{rso no pueden ser reprcducidos total


o parcialmente sin el permlso preo escrito de lBM.

Introduccn a la programacn con

Gufa det Estudiante

Considere fa siguiente definicin de una estructura.


qi-rrr-f

inE x;
float y;

) a,

b,-

Es vfida la asignacin a.

a)
b)

7)

Verdadero
Falso

La sguiente es una definin vrida de un tipo estructura

t.ypedef struct
int x;
float y;
) rnipropia;

a)
b)
8)

x = a.y;?

Verdadero
Falso

Los^tipos de dato definidos por el usuario se definen usando palabra


la
reservada
de C:

a) struct
b) union
c) rypedef
d) Ninguna de las anteriores
9)

l0)

cules de los siguientes es un uso conecto de tpedef


a) typedef miVar f loat;

b) typedef f1oat miVar;


c) tlpedef f loat char miVar,.
d) typedef char nombre [+07 ,

cules de los siguientes es una definicin correcta de una unn?


a) union {

int. x,floaE y,.


char z;
).;
b) union {
int x,.
float. y;
struct fecha z;
)r;
Volumen 3: Tipos e

Oaffi

72
@

Copyright tBM Corp.2002

Los materiales del curso no pueden sr reproducidos en parte


o en su totalidad sin el previo permiso escrito de lBM.

o
o
o

o
o
o
o
o
a

Gua del Estudiante

c)

union u
int x,float y,.
char z;

amacin con C
{

d)

Todas las anteriores

O
O

a
o

o
o
o
o
o
o
o

o
a

o
o
o
o
o

o
o
o
o
o
o
a
a
o
o
o
a

o
o
o
o

o
o
o

r ciu"r-+lo 3: Tipos de Datos Estructurados en C


@ Copyright IBM Corp. 2002
Los materiales del curso no pueden ser reproducldos total
o prcialmente sin elpermiso previo escrito de tBM.

73

Introduccin a la programacn con

Gufa del Estudante

Respuestas a fa unidad 4: Examen de Autoevaluacin

l) byc
2)b
3)b
4)c
5)b
6)a
7)a
8)c
e) byd
l0) d

Volumen 3: Tipos de Datos gstructuraos en

@ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.

74

lntroduccin a la Pr

Gua del Estudiante

q
o

ramaclon cc-

unidad 5: Laboratorio de Estructuras

o
a

Objetivos de APrend izaie

o
o
o
o
o
o

Al final de esta unidad, usted ser capaz de:

.
.
.

problemas
Usar estructuras en una situcin de soluin de
de estructuras
Desanollar algoritmos para un problema que involucra el uso
que usa estructuras
Escribir un programa en C para implementar una algoritmo

o
o
o
O

o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
O

Vol"men 3:Tlpos de Datos Estructurados en C


@

UnlOaO S: taUoratorio de

CoPYright IBM CorP' 2002

Los materiales del crso no pueden ser reproducidos total


o parcialmente sin el permiso previo escrito de IBM'

Estructuras

75

Gua del Estudante

Ejercicios de Laboratorios
l) considere la estructura de una ftaccin mixta, que se da a continuacin.
st.rucE fraccion_mezclada
int parte_entera,.

int numerador;
int denomi-nador,.
I
tt

Usted ya estudi ef algoritmo para sumar fracciones


mixtas. Considere dos
fracciones mixtase y B que son las entradas suministradas
por el usuario. Escriba
un programa que calcule la resta de a menos e (a _
B) , y la multipficacn de
B), asignndoras a tas fracciones mixtas c y o respectivamente,
y

flTulrrJf;r."

2)

Declarar una estructura, que consista de tres


miembros, un nmero del libro (un
entero), codigo del libro (un areglo de 8 caracteresiv
precio del libro (un valor
rloat)' Escriba .un programa qe tome como ent oaet i0
tbro. muestre tos
detalles de fos mismos.

Unidad S:
76

. .

@ Copyright tBM Corp.20o2


,t-os
_, .
^^ materiales
del curso no pueden sr reproducidos en parte
o en su totalidad sin el previo permiso
escrito

de tBM.

anl-xF
I-I--I
rI:-t
r-xtt-

Introduccin a la
Programacin con

TAT
-m
-

ItI

(Codigo del Curso: CY320)


Versin 2.0

(p

--

Gua del Estudiante

Volumen 4: Funciones en

fBM Learning Services


Worldwide Certified Material

Informacin de Pubticacin

Esta publicacin ha sido producida usando Microsoft Vrrd 2000

PowerPoint 2000 para Windows.

Microsoft

Marcas Registradas
IBM @ es una marca registrada de lntemational Business Machines Corporation.

Otras compaas, productos y nombres de servicos pueden ser marcas comerciales


o
marcas de servicio de otros.

Marcas Registradas de otras compaas como se muestra


Windows

Microsoft Corporation

Red Hat Linux

Red Hat

Edicin Septiembre de 2002


La informacin contenida en este documento no ha sdo sometida a ninguna prueba
formal de IBM y es distribuida bsicamente "como es" sin ninguna ganta y" s"a
expresa o implcita. El uso de esta informacin o fa implementain OL cuatquiera
de
estas tcnicas es responsabilidad del comprador y depender de la habilidad de
ste
para su evaluacin e integracin en el ambiente operacionat del cliente. A pesar
de que
cada tema ha sido revisado por IBM para su exactitud en una situacin especfica,'no
h.ay garanta de obtener el mismo resultado o uno similar a ste en otra situacin.
Los
clientes que intenten adaptar estas tcnicas a sus propios ambientes lo hacen bajo
su

propio riesgo.

copyright International Business Machines corpora tion,2002. Todos los


derechos reservados.
Este documento no_pu_ede ser reproducido en su totalidad o en parte sin el previo
permiso escrito de lBM.
lnstrucciones especiales para la impresin de ste curso

No deben removerse las pginas en blanco que puedan aparecer al final de cada
unidad y entre dos unidades. stas han sido insertadas intencionalmente..

ot}

o'=
O,.
o
o
o :a

oli
oj
ol
Or
I

o;

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

3
T

ir

t?
t]
ta

lt

t
.

Gua del

Estudiante

lntroduccin a la programacin con C

Contenidos
Unidad

l:

Funciones

Objetivos de Aprendizaje

1. Introduccin

2. Programar Funciones en C

3. Definir y Usar Funciones en la Solucin de Problemas

4. Clases de Almacenamiento

20

5. Caractersticas de las Clases de Almacenamiento

25

Resumen

26

Unidad

l:

Exmen de Autoevaluacin

Respuestas a la Unidad '1: Exmen de Autoevaluacin

27
29

Unidad 2: Laboratorio de Funciones

3l

Objetivos de Aprendizaje

31

Ejerccios de Laboratorios

32

Unidad 3: Recursin
Objetivos de Aprendizaje

33

1. Introduction

2. Escribir Funciones Recursivas

35

3. Recursin vs. lteracin

48

Resumen

49

Unidad 3: Exmen de Autoevaluacin

50

Respuestas a la Unidad 3: Exmen de Atoevaluacin

52

Unidad 4: Laboratorio de Recursin


Objetivos de Aprendizaje

53

Ejercicios de Laboratorios

T
or
ori

o
o
o

oi
oi
o
o
O

o
o

o
o
o
o

Gua del

Estudiante

Introduccin a la Programacin con

Unidad 1: Funciones
Objetivos de Aprend izaje
Alfinalde esta unidad, usted se capaz de:

.
.
.
.
.
.

Explicar la naturaleza y usos de las funciones


Describir algunas funciones incorporadas de C,

cmo se usan

ldentificar las diferentes partes del encabezado de una funcin


Describir los diferentes tipos de argumentos
Definir los prototipos de funciones y sus usos
Explicar cmo usar las funciones para solucionar problemas

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

r
ro

Volumen 4: Funciones en C

Unidad 1: Funciones en
@ Copyright IBM

Corp.2002

Los materiales delcurao rio pueden ser reproducidos total


o parcialmente sln el permiso previo escrito de IBM

Introduccin a la Programacin con C

Gufa del Estudiante

1. Introduccin

En el Volumen
Estructuras de Control en C, se esfudiaron los pos de datos
estructurados y se aprendi acerca de los aneglos y estructuras. En eita unidad, se
discutir la necesidad y el uso de las funciones enln programa en c.
Una funcin es un programa autocontenido que lleva a cabo una tarea especfica. Un
programa en C es realmente una colercin de una o ms funciones. La main ( es,
)
en efecto, una funcin. Todos los prograrnas en C deben tener una funcin main. La
ejecucin de un programa c inicia con ra ejecucin de fa funcin main.
Una funcn toma cero o ms entradas (tambin denominadas parmetros), lleva a cabo
una tarea especfica y retorna un solo valor como resultado. En esta unidad, se estar
usando las palabras'entradas' y'parmetros' indistntamente.

El lenguaje C soporta algunas funcones incorporadas. Las funciones incorporadas son


aquellas que son parte de la librera estndar de C. Estas son diferentes a ls funciones
definidas por el usuario. Las funciones definidas por ef usuario son aquellas que son
diseadas y escritas por el programador para un uso especfico en las aplicaciones.
Las siguientes son algunas de las funciones incorporadas de C que se han visto y
usado en los volmenes anteriores:

o
.
.
o

printf

scanf
toupper
sqrt

Considere la funcin main ( ) . sta usualmente no tiene ninguna entrada sobre la cual
trab$ar. La funcin
que se ha usado anteriormente, toma una o ms
entradas. Una de las cosas comunes entre main O yprintf O es que ambos llevan a
cabo una tarea especfica y retoma un valor nico como salida (Se aprender acerca de
esto ms adelante en la
,

printf,

unidad).

Ahora se sabe que una funcin tiene las siguientes caractersticas:

.
.

Tiene un nombre nico (un identificador)


Trabaja con cero o ms entradas
Las funciones tambin se pueden invocar desde dentro de otras funciones. Esto se
conoce como llamar (calling) a una funcin y la funcin invocada desde otra funcin es
conocido como la funcin llamada (called).
La funcin ffamada ejecuta las sentencias que son parte de la funcin, ttevando a cabo
la tarea deseada. Luego la funcin retoma a la funbin que la invoc. La ejecucin se
reanuda en la sentencia que sigue inmediatamente despus a la tlamada de la funcn.

Unidad 1: Funcones

Volumen 4: Funciones en
@

Copyright lBM Corp.2002

Los materiales delcurso no pueden ser reproducidos total


o parcialmente sin el permiso previo escrito de IBM

?r

OF
oi$

lntroduccin a la Programacin con C

Gua del Estudiante

o'

o
Q*
:

:t
!

2. Programar Funciones en C
C permite a los programadores definir sus propias funciones para llevar a cabo una
tarea bien definida. Esto se conoce como funciones definidas por el usuario. Algunas de
las caractersticas de C con relacin a las funciones son:

.
.
.
.
.

r'{

a'

O*

o
o
o
a
o
o

o
o
o
o
o
o
o
o

p
o
o

Ofrece un mecanismo para pasar entradas a la funcin.


Ofrece un mecanismo para aceptar las entradas pasadas y luego procesarlas.
Ofrece un mecanismo para retomar un solo valor como resultado.

Ofece un mecanismo para tomar en cuenta numerosas tareas intemas que


pueden estar involucradas en el proceso de invocar una funcin, transferir el
control a la funcin, ejecutar la funcin y retomar a la funcin que la invoc

Pero permanece la pregunta, Por qu. se deben usar las funciones? Las funciones
tienen numerosas ventajas. Algunas de ellas son:

Permite desmmponer un programa grande en partes ms pequeas,


manejables y autocontenidas. Esto se llama modularizacin. La modulanzactn
se puede lograr en C slo a travs de las funciones. Ellos proporcionan una
claridad lgica a los programas al descomponer un programa grande en
pequeas unidades.

Ayudan

o
o
a
o
o
o
o
o
o
a
o
o
o
o

Permite a los usuarios definir funcione.s definidas por el usuario.

evitar repetr la programacin de las mismas instrucciones que

necesitan otros programas o partes de un programa.

.
.

Ayuda a los programadores a construir sus propios conjuntos de funciones en


una librera personalizada.
Permiten que porciones del programa que son dependientes de la mquina sean
separadas de las otras, para facilitar la portabilidad de los programas.

Una vez entendida el por qu las funciones son necesarias, se va a continuacin a dar
una definicin de funciones y aprender a usarlas en fa resolucin de problemas.

3. Definir y Usar Funciones en la Solucin de Problemas


Primero se aprender en qu consiste una funcin, de manera que se pueda definir
una funcn. Una funcin mntiene dos partes principales:

.
.

Encabezado de la funcin
Cuerpo de la funcin

Una encabezado de funcn contiene lo siguiente:

.
.
.

Especficacin del tipo delvalor a ser retomado por la funcin.


Un nombre de funcin (siguiendo las reglas para crear un identificador).

Un conjunto de argumentos (dato pasado como una entrada a una funcin) que
estn separados por comas.

Volumen 4: Funciones en C

Unklad 1: Funciones en

@ Copyright IBM Corp. 2002


Los materiales del q.rso no pueden ser repioduddc total
o parcialmente sln elpermlso previo escrito de IBM

Introduccin a la Programacn con C

Gufa del Estudante

El conjunto de argumentos en un encabezado de funcin es opconal. Cada argumento


es precedido por su declaracin de tipo.

tipo_de_dato nore_de_funcion (tipo arg1, 1po arg2 , ...)

Si una funcin no toma ninguna entrada, el eneabezado tendr un nombre de funcin


seguido por ( ) . Por ejemplo, considere el siguiente encabezado de funcln:

int max(inE x, int y) ;


Se pudo haber omitido d tipo de dato inr para el encabezado de funcin ya que C

asume que todas las funciones retoman inr pot defecto. Sin embargo, nunca se debe
omitir, ya que esto se considera un estilo teribfe de programacn. Los argumentos en
el encabezado de la funcin son x e y, estos se denomin an atgumenftos formales. Se
les llama as porque estos representian los identificadores de las entradas transferidas
desde el programa que hace la llamada a la funcin llamada. Tambin se les conoce
como parmetros, en este aso, parmetros formales. Los identificadores x e y en el
encabezado se consideran 'locales', y no so reconocidos por aquellos que estn fuera
de la funcin.
El cuerpo de la funcin es el conjunto de sentencias encenadas entre llaves { }. Este
conjunto de entencas define la tarea que lleva a cabo la funcin. El cuerpo de la
funcin, como cualquier otro grupo de sentencias compuesta, puede contener
cualquiera de los siguientes tipos de sentencias:

o
.
o
.

Sentencias de asignacin

Sentenciascompuestas

Llamadas a funciones
Cualquier sentencia vfida

El cuerpo puede contener cero o ms sentencias return. Las sentencia


ayudan a pasar el valor del resultado nico al programa que hizo fa tlamada.
La forma generalde la sentenc

rerurn s

return

al siguiente:

return (expresin),.
Esta contiene la palabra reservad rerurn seguido por una expresin opcional. El valor
de la expresin se retoma a la parte que lo invoca del programa. Dado que una

expresin puede resultar en un solo valor, una funcin puede tambin retornar slo un
valor. Si la expresin se omite, la sentencia return no transfiere ningn valor al
programa que lo llama. Slamente transfiere el control al programa que lo invoc.
Algunas funciones se definen como void.

void nombreFuncionO i
sent.encias,.

return,.
)

A pesar que las funciones con tipo void no necesitan tener la sentencia return
explcitamente, se mantiene por dos razones:
Unidad 1: Funciones

Volumen 4: Funciones en

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de tBM

o
O

Gua delEstudiante

Introduccin a la Prooramacin con C

o
o
o
o

La sentencia return se usa cuando hay mftiples condiciones verflcadas en


una funcin y la funcin debe finafizar su ejecucin, cuando una de sus
condiciones se satisface. El siguiente segmento de codigo ayudar a entender
esto claramente:

void Nombre_de_la_Funcion(int x, int y, int z)


if (*'")
{

sentencias;
retrurn,.
1

a'

else if (x t z) {

sentencias;

ral-rrrn.

o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o

o
o
o
O

Se considera una buena prctica de programacin insertar una sentencia

return

an cuando hay un solo punto de retomo en la funcn.

En todos los programas en este curso, la funcin main tiene el tipo de retorno void y
no se usa explcitamente la sentencia return. Se puede, sn embargo, aadir la
sentencia durante la ejecucin en un computador. La sentenca return causa que el
programa que llama inicie la ejecucin a partr de la sentencia que sigue
inmediatamente despus a la llamada de la funcin. El cuerpo de una funcin puede
tener una o ms sentencias

return. A continuacin se presentan algunos ejemplos.

Ejemplo 1.1: Determinar el Mximo de Dos Nmeros Enteros

int max(int x, int y)


j_f (x >= y)
return (x) ;

{
t

el-se
rl.!1rn

lrrl
\I

' '

'
se enne una funcin llamada max que retorna uo int como resultado.
El cuerpo de la funcin es bastante simple, dado que slo verifica cul de las variables
es mayor y retoma el valor.

Fin del Ejemplo 1.1

o
o

i
,

II
t

Volumen 4: Funciones en C

Unidad 1: Funciones en

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermlso previo escrito de IBM

lntroduccin a la Programacin con C

Gufa delEstudiante

Ejempfo 1.2: Determinar si un Entero es lmpar

int. eslmpar(int. x) {
if(xt2!=O)
return (1);
e

/*

veRoADERo

si es impar */

1se
ral-rrrh

/* rar,so si no es impar */

/n\
.
\v I t

Este programa slo verfca si ef residuo de la divisin entre


2es 0. S elresiduo no es 0
entonces ste es un nmero impar y se retoma un valor de verdadero.
que en
c el valor de 1 se considera VERDADERo y elvafor 0 FALSo. Esto es Recuerde
que
lo
la funcin
antenor retoma.

Fin del Ejemplo i.2


Ejemplo 1.3: convertir un carcter de Minscura a Mayscura
cha: ::,:::_a_nay (char en) {
* -,-e.rfica si en est entre a y z */
:j le:: >= 'a' && en <= ,zt){
recurn (en - ra' + tAr) ;

FP1-rrr .

f\

on\
ul/

/* retorna en como est * /

La funcn trabaia basado en que a los caracteres se le


asignan cdigos nicos ASCll,
los cuales pueden tratados como nmeros. Si en.realmente eneLt
carcter .,,
entonces en
ser cero, de este modo se retornar
+
'A' ) retomar slo 'A' . S en tiene el carcter . B, , entonces el valor retomado ser
+ 1, l cual es
dado que los valores ASCII se dan para todo el alfabeto,
en
secuencia. Una vez dicho esto, recuerde que ya se ha usado un
funcin incorporada en
C.llamada toupper en el Volum en 2, lJnidad
Construcciones lterativasque hace la
misma tarea.

'A'

- 'a'

return (in

.a,

'B'

3-

Fin del Ejemplo 1.3


Ejempfo 1.4: Determinar er Mximo comn Divisor de Dos Enteros
int mcd(int x, j-nt. y) {

while (x l= 0 && y t= 0)
if (x r= y)

Unidad

l:

a
>
:

{
:
Funciones

Volumen 4: Funciones en

@ Copyright tBM Corp. 2002


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

oF
o,'
O;

'

Introduccin a la Programacin con

Gua del Estudiante

o
o

x = xZy;

q.

else

q:

y = y*x;

a:

if (x == 0)
return (y) ;

a;
a
o

o
o
o
o
o
o
o
o
o

o
o

o
o
o
o

o
o
o
o

o
o

/*y es

mcd*,/

/*v

m*

e1 se

return (x) ;

ac

Fin del Ejemplo 1.4

Ejemplo 1.5: Determinar el Mnimo Comn Mltiplo de Dos Enteros

int mcm(inE x, int y) {


return ( (x " y) /

mcd

(x,y)

Como se observa, estia es una funcin muy compacta. La funcin explota el hecho de
que el MCM de dos enteros es el producto de los dos nmeros enteros dividido entre su
MCD. Se defini previamente una funcin llamada mcd. Simplemente se usa esa
funcin aqu. En el ejemplo anterior, la funcin mcd apare@ en la expresin:
(

(x " y) /

mcd

(*,y)

La presencia de la funcin en la expresin implica que se invoca a la funcin y sta


retorna el valor de la funcin a ese punto en la expresin. As, si mcd (x, y) retorna un
valot z, entonces mcd (x, y) ser remplazado con el valor z en la expresin.
Fin del Ejemplo 1.5
Ejemplo 1.6: Determinar el Factorial de un Entero

int factorial (int x)


int k,fact;
fact = 1;

/* variables locales */

if (x == o ll x == 1)
return (1);
else {

/* I es e1 resultado */

for(k = 2; k <= x; k++)


fact=fact*k;
return (facE);

o
o
o

to

i
)

Volumen 4: Funciones en C

Unidad

l:

Funciones en

@ Copyright IBM Corp. 2002

?
o
o

Los materiales delcurso no pueden ser reproduddos total


o parcialmente sin el permiso prevo escritode IBM

4
t

lntroduccin a la Programacin con C

Gua del Estudiante

Este programa es autoexplicativo.

Fin del Ejempto 1.6

A continuacin se discute cmo

invoca_ y usar las funcrones definidas por el usuario.


funcin puede ser invocada especifiando el nombre de la funcin 'seguida por
la
-Una
lsta
de argumentos separados por comas. Esto tambin se denomina una llamada
a ta
funcin o llamada a funcin. Si una funcin no requiere de argumentos, se puede
simplemente escribir el nombre de la funcin con O , como r.t f
O . La llamada a
la funcbn puede suceder en una expresin simple o como parte de una expresin
compleja. Los argumentos en la llamada a la funcin se llaman argumento.s acfuales
o
parmetros actuales. Existe una corespondencia uno-a-uno de la ist y
OLf tipo de loi
argumentos formales con los argumentos actuales. Et valor de cada prmetro
actuai
ser pasado como entrada a la funcin llamada a travs del corresponOi"nt" parmetro
formal.

iIler

Ya se ha hecho uso de una funcin, como se mostr anteriormente.


return ( (x * y) /mcd(x,y) ) ;

Una funcin que no retoma nada puede aparecer como una sentencia independiente,
como por ejemplo un printf (. . . ).
Ejempfo 1.7: Generar Nmeros primos
El probfema aqu es aceptar un nmero entero positivo grande NUM, y generar
todos los
nmeros prmos entre2 y NUM. Et siguiente algoritmo resuelve ese probiema:

o
.
o

Paso 1: Deflnir una funcin primo

int x) que verifica si x es primo o no

Paso 2: lngresar y validar mrira


Paso 3: for (todo k desde 2 a NUM)
if (primo (k) == VERDADERO)

prinE k;

Basado en este algoritmo, se puede escribir et program


primos entre z yNUM, como sigue:

a para generar los nmeros

El cdigo C incia aqu...

#include <stdio.h>
#define VERDADERO 1
#define FALSO O

/* verificar si un nmero dado es primo o no * /


int primo (inr x) {
inr k = 2, continuar;
continuar
Unidad 1: Funciones

= VERDADERO;

Volumen 4: Funciones en

@ Copyright IBM Corp.2002


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM

CI

F
%

Introduccin a la Programacin

Gua del Estudiante

c:^ ,

-.-

while (k .= x-1 && contj-nuar == VERDADERO)


if (xBk==0)
cont.inuar = FALSO;

'lr
x-1r
fl&
^t

e1 se

*.** t
,

(continuar

if

I*

return

tt
-I

== VERDADERO)
(VERDADERO);

e1 se

q;

return(FALSO);

o
o
o
o

/* La
main

f rrn

()

i n

m i n

amni aza

* I/

att

{
inf

rrh

printf("Ingresar un nmero positivo \


hasEa el cual se desea comprobar \
'
si exisEen primos " ) ;
/* Aceptar fa enErada desde el usuario */

o
O

oot

scanf (u?du,&num),'
/*Yerifcar gue e1 nmero ingresado es

positivo o no */
if (num<=0 | | num>32?6?) {
print.f("Ingresar un nmero menor \

o
o
o
o
o
o

qve

32767

\n" ) ;

)whi1e (num<=0 | | num>32?67)

prinEf ( "Los Nmeros Primos son: \n


for ( = 2; i <= num; i++)

(primo(i)

==

ra|-rrrn

l1 I

");

VERDADERO)

printf ( *3d\t", i)

-LI

tI

-l

rt

/* La funcin main termina agul */


El cdigo C termina aqu

tl

-IE
-t

T
II

E
t
o

Volumen 4: Funciones en C

Unidad

l:

@ Copyright IBM Corp.2002


Los materiales delcurso no pueden ser reproducldos total
o parcialmente sin elpermlso prevo escrito de IBM

Funciones en

lntroduccin a la Programacin con C

Gua del Estudiante

La funcin es fcil de entender. Simplemente evala s un nmero


dado de entrada es
qrimo o no y retoma por consiguiente vERDADERo o FALso. El programa main
implementa un bucfe para considerar cada uno de los enteros desde 2 a
u, y verifica
siestos son primos o no. sief nmero es primo, este se imprime.

Fin del Ejemplo t.Z

Ejemplo 1.8: Determinar si un Entero es un

p"lndror"

Se va a escribir una funcin para determinar si un entero dado como entrada


es
palndrome. Se sabe que un entero positivo es un palndorme
si los dgtos def nmero
ledos de izquierda a derecha son tos mismo si se leen de derecha
a izq"uierO.
El cdigo C incia aqu...

#i.nclude <stdio.h>
#define VERDADERO 1

#define

FALSO

:-nt pal j-ndrome (int x) {


int izquierdo, derecho, digito, guardar, poswt,.
int k, continuar;
/* Contar el nmero de digitos en x */
digito = O;
guardar = x;
/* tener una copia d,e x * /
while (guardar r= O) {
digito++;
guardar = guardar / tO;
1

/* Aqu digito es el- nmero fle dgitos */


/* Buscar el peso posicional a1 extraer el
dgito izquierdo como lOndigito_t *1
PU-WL

ar'

for (k = 1; k <= (digito - 1);


poswt=poswt*10;

k++)

,/* aplicar e1 proceso de comparacin */


guardar = ;
/* Tomar una copia d.e x */
cont.inuar = VERDADERO;
while (guardar != 0 && cont.i-nuar == VERDADERO)
/* Algito izquierdo *,/
izguierdo = guardar / poswt;
Unidad

l:

Funciones

I
{

Volumen 4: Funciones en

O Copyrght IBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM

lO

or

o
o;
o
o

Gua del Estudiante

Introduccin a la Programacin con C

derecho = guardar Z L0; /* dgito derecho */


if (izguierdo == derecho) {
/* Nuevo x como izquierdo, derecho sacado*/
guardar = (guardar t poswt) / i-0;
poswE = poswt / l.oo;
)/"rin de1 if *y'
else

o.

oi

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

continuar =

)/*rin de1 else*,/


return (continuar);
/"Fn de la funcin palindrome */
main (void) i
int num, continuar;

/* Tomar Ia entrada de parte de1 usuario * /


printf ( "fngresar un nmero entero positivo menor \
qwe 32767:") ;
scanf (u?du,&num),-

/*verificar que eI nmero dado es posit.ivo o no */


if (num<=o I I num>32767) {
print.f("*d no es un nmero entero positivo ",num)
nrintsf

o
o

o
o
o
o
o
o
o
o
o

/rr\

n 9 oc r\'^r

,,6

?2767\n",num);

else

/*fnvocar 1a funcin palindrome para werificar


si una entrada dada es palindrome o no * /
continuar = palindrome (num)

o
o
o
o

o
o

FALSO;

,.

if (conLinuar == VERDADERO)
printf ("?d es un palindrome \n",num),else

printf(utd no es un palindrom\ri",num);
)/*rin de1 else*/
)/*ri-tr del main*/
El cdigo C termina aqui

Volumen 4: Funciones en C

Unidad 1: Funciones en

@ Copyright IBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sn elpermlso previo escrito de IBM

C l1

Introduccin a la Programacin con C

Gua del Estudiante

Para verificar si un entero es un palindrome, se tiene que extraer el


dgito ms a la
izquierda y verificar por igualdad con el dgito ms a la deiecha. Sin
embaigo, dado que
no se sabe cuntos dgitos tiene el enter dado, se requiere primero contr
el nmero
de dgitos usando ndigitos. Slo cuando se hace eso se puede extraer
el dgito ms
El peso posicional de este dgito es 10ndsit-r y'divdieno-ef nmero entre
?)1,:..'i"rd."r.
'lu"-''"-' se obtiene el nmero ms a la
izquierda- Dividiendo el resto entre l0 se obene
el diqito ms a la izquierda. Si los dos dgitos cbinciden, entonces el nmero tiene la
posibifidad de ser un palndrome, de otro nlodo no. Para seguir
adelante, ie oeoe crear
un nuevo nmero descartando el actual dgito ms a la iz{uerda y el igto
ms a la
derecha. Para los pasos subsiguientes, el peso posicional se uru p"r"
el dgito
ms a la izquierda debe ser dividido entre 100 (iecordando que se han "i"",
descartado dos
dgitos).

A continuacin se presenta otra solucin al problema at usar arreglos para encontrar


palndromes.

Elcdigo C inicia aqu...

#include <stdio-h>
#define VERDADERO 1
#define FAISO 0

int. palindrome (inr x) {


int array[100], i, j, digito, continuar;
digito = 0;
i = 0;
/* Extraer cada dgito y almacenarlo en un arreglo */
while (x != 0) {
digito++;
array[i++] =x?10;
'
x = X / iO;
)/*rin de1 bucle */
continuar = rERDADERO,.
i = 0;
/*Comparar e1 primer dgito del arreglo con eI
ltimo dgito*/
for (j = digito - 1; (i < dgito/z) && continuar; ) {
if (array[i] t= arrayljl )
conE.inuar = FALSO;
i++ ; l-- ;
del
for*,/
) /*rin
reC.urn (continuar)

,.

Unidad 1: Funciones

Volumen 4: Funciones en
@

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducidos total


o parcialmente sin el permiso prevo escrito de IBM

12

:r
o

Gua del

Estudiante
)) t,/*Pi

:tt

o
o
o
o
o
o
o
O

o
o
?

,/*Verificar si e1 nmero dado es positivo o no */


if(num > 0 && num<32258) {
/*fnvocar La funcin palndrome para verificar
si una entrada dada es palndrome o no */
conLinuar = palindrome (num);
if (continuar == VERDADERO)
printf ( " *d es un palindrome\n', , num) ;

1se

printf ("*d no es palindrome\n",num)


J/*r.;n

t r

Aal
ss

printf("Ingresar un numero > 0 y < 32768\n ");


]/*Firr de 1a funcin main*,/
El cdigo C termina aqu
Compare este programa con el presentado en el Ejemplo 3.6 delVolumen 2, tnnidad 3
Construcciones lteratvas del Volum en 2. Ambs iesaltan el aspecto bueno de la
resolucin de problemas. Mentras en el primero caso se usaron slo lazos para llegar a
la solucin, en este se usaron arregfos.

End of Example 1.8

Ejemplo 1.9: Determinar que Nmeros primos son palndromes

En este ejemplo se har uso de fas dos funciones ya disponibles para escribir un
programa que verifique por los nmeros primos que son tambin palndromes.
El cdigo C comienza aqu...

tt
?

main O {

ot

:F*/ /
r

else

#include <stdio.h>
#define VERDADERO 1
#define FALSO O

//

int. num, cont.inuar;


/* Tomar 1a entrada del usuario */
printf ("fngresar un nmero ent.ero positivo: r');
scanf ( t' ?d,r , &num) ;
'

n de na I i ndrome*
vrrre

main (void)

Ia *
o
o
o
o
o
o
o
o

Introduccin a la proqramacin con C

inE num,.
printf("Ingresar

o
Volumen 4: Funciones en C

un nmero positivo < 3276g2 n);


Unidad

l: Funciones en C 13

@ Copyright IBM Corp.2002


Los matsiales delcunso no pueden ser reprcducidos total
o parcialmente sln el permiso prevo escrito de IBM

lntroduccn a la Programacin con C

Gua del Estudiante

oot
scanf ( n?du,

] while

(num <=

&num) ;

9 |

num>32767) ;

/* verifcar si e1 entero es un nmero primo asf


tambin un pa1ndrome */
if (primo(num) == VERDAnERO &&
palindrome (num) == VERDADERO)

como

printf("td es tanto primo como palindrome\n,,,num);


else if (primo(num) == VERDADERO &&
palindrome (num) ==

FALSO)

palindrome (num) ==

VERDADERO)

printf("?d es primo, pero no un palindrome\n,,,num)


else if (primo(num) == FALSO &&
printf(u?d no es primo, pero es palindrome\n,,,num);
else

printf("?d no es pri-mo ni palindrome\n",num);


)

int primo(inr x) {
int,k=2,
continuar,.
continuar = VERDADERO;
while (k .= x-1 && continuar == VERDADERO)
if (x?k==0)
continuar = FALSO;
e

1se

k++;
)

if

(conclnuar == VERDADERO)
return (VERDADERO);

e1 se

return

(FALSO) ;

int palindrome (int x) {


int. izquierdo, derecho, digito, guardar, poswE.;
int k, continuar;
/* Contar el- nmero de dlgitos en x */
digito = o;
guardar = x;
/* Hacer una copia de x */
while (guardar != O) {
Unidad 1: Funciones

Volumen 4: Funciones en

@ Copyrght tBM Corp.2OO2


.
Los materiales del clrrso no pueden ser reproducidos total
o parcalmente sin el permiso previo escrito de tBM

14

OF

o
o
o
o
o

or-gr-tro++;

guardar = guardar / to

o:

t)

/* aqui digito es eI nmero de dgi-tos */


/* Buscar e1 peso posicional a1 extraer e1 dgito
izquierdo como londigito-l */
Poswt = 1,'
for (k = r; k .= (digito - 1); k++)
poswt = poswt 't 10;
/* Rea]-:-zar la proceso de comparacn */
guardar = x;
/* Hacet una coPia de x */
continuar = VERDADERO;
while (guardar ! = 0 &&. iontinuar == VERDADERO) {
izguierdo = guardar / poswt; /* dgEo izgulerdo */
derecho = guardar ? 10; /" digito derecho */
if (izguierdo == derecho) {
/* Nuevo x con izguierdo, derecho arrojado*/
guardar = (guardar ? poswt) / ao;
poswt = poswt / LO1;
)/*rin de1 if*/

o
o
o,

o
o

o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o
o
o
o
o

I)
b

Introduccin a la Programacin con C

Gua del Estudiante

else

continuar = FALSO,'
)/*rna of else*/
return (continuar);
)/*rin de Ia funcin palindrome*/
El cdigo C termina aqu

tenan dos funciones primo y


Este programa result muy simple ya que
palindrome. Solamente se tuvo que verifcar ""
s un entero dado como entrada es
primo y palndrome.

Fin del Ejemplo 1.9


Hasta ahora todas las funciones defnidas por el programador precedbn a la funcin
main O
Esto era para permitir que el compilador tuviera definida las funciones
definidas por el programador mucho antes que de que la funcin main ( fuera
accesada. En este mtodo, primero se desarrolla y se colocan las funciones que se
necesitan y despus se enlazan. Esto se llama enfoque bottom-up (de abajo-haca
anba) de solucin de problemas

Existe otro enfoque para resolver problemas, denominado enfoque top4own (de anibahacia abajo). En este mtodo, la funcin main O aparece delante de todas las otras
Volumen 4: Funciones fl 'C

Unidad 1: Funciones en

@ Copyright IBM CorP. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln elpermiso previo bscrito'de IBM

15

lntroduccin a la programacin con C

Gua del Estudiante

funciones definidas por el usuario. Mientras esto


es bueno para los desanolladores, no
permite que un compilador trabaje a menos
sea informado con antelacacin que tales
funciones definidas por el usuario van a ser
accesadas y que van a ser defindas
posteriormente' El compilador es informado
a travs de un prototipo de funcin.
Los prototipos de funcin se especifican af comenzo
de un programa en C, incfusive
antes de la funcin maino. Er 'prototipo de.un-irn
se escribe en forma general
como sigue:

Aqu

el

tipo-de_dat.o nombre_funcion (tipo1 arg7, tipo2


arg2,. . . ) ;
tipo-de-dato es el tipo de dato del elemento retomado por
ta

funcin.
nombre-funcion es el identificador, es decir, el nombre
de la funcin. Los efementos
dentro de los parntesis definen los argum;r
sus tipos.

Los argumentos son


t
justamente nombres mudos (dummy
names) reconcidos dentro del prototipo. Estos
pueden ser omitidos, aunque no es recomendable:

inE

sum

int , int

,.

La sentencia anterior es aceptada, pero se recomienda


el uso de los nombres tambin,
tal como se muestra a continuacin:

int sum(int x, j-nt y),.


Tambin es recomendable usar los mismos nombres
de arg_umentos en el prototipo que
los nombres que sern usados en la lista de
los paameiros formales. Los tipos de datos
de los argumentos.fistados- en el prototipo deben'"n"or
con
el encabezado de la funcin (como parte de los parmetros aquellos que aparecen en
formafes). Los parmetros
actuales en la llamada deben tamin
estos. Los prototipos de
funciones no son obligatorios en c. sin embargo,
"oo".pon"r
r""iln la verificacin d'e errores por
elcompilador.

A continuacin se
,resuelve un problema
definidos) antes concluir la unidad.

adicional (con prototipos de funciones

Ejempfo 1,10: Localizar Fracciones Mlxtas Extraas

g,|,!::Sfficonsiste

'
.
'

en generar alguna fraccin

r,*,"

extraa. Las propiedades que

Todas elras estn formadas sro por enteros


de tres dgitos.
Todas effas representan slo nmeros positivos.

cada parte de la fraccin mixta, es decir, la parte entera,


el numerador
denominador, son todos nmeros que son tanto primo,

el

"i,noioru..
"or
se escribir un programa en c que genere e imprima fracciones
mixtas que satisfagan

las propiedades anteriores.

se sabe que se tienen que formar todas las fracciones


mixtas que se puedan a partir de
enteros positivos de tres dgitos. Pero no todas
estas fracciones mixtas sern vfidas.
Por lo que, lo primero que se debe hacer es
verificar si la fraccin mixta formada es
Unidad

l:

Funciones

Vofumen 4: Funciones en

@ Copyrght tBM Corp.2002


Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermiso previo escrito de tBM

t6

a
a F
IE
t*
o It
o

Gua del Estudiante

Introduccin a la Programacin con C

o
o

vlida.

Si la fraccin mixta es vlida, entonces se debe verificar si todos

sus
componentes (parte entera, numerador y denominador) son primos y palndromes. Si
todas estas condiciones se satisfacen entonces se tiene que imprimir la fraccin mixta,
sino se debe proceder a formar la prxima fraccin mixta candidata.

a
o
o
o

Claramente, se deben desanollar funciones para verificar lo siguiente:

.
.
.

o
a
o

Siuna funcin mixta es vlida.


Siun entero dado como entrada es un nmero primo
Siun entero dado como entrada es un palndrome

El siguiente es el algoritmo para calcular esto:

o
o

Step

1: void main ( ) {

for (i = 100; <= 999; i++)


for(j = r00; j <= 999; j++)
for(k = 100; k <= 999; k++)
formarAcomoyl/k;
(validar_fm
(A) )
if
j,
y k son primos y palindromes)
if(Eodo i,
print A,'

oj
oi
i
i

oi

Or

o
o
o
o
o
o
o
o
o

o
o
o

I
t

di
dt

Paso 2: Definir una funcin llamada


mixta es vlida

.
.

Paso 3: Definir una funcin llamada primo


Paso 4: Definir una funcin llamada

validar

fm que determina s una fraccin

palindrome

Basado en este algoritmo, se puede desanollar el siguiente programa en C:

El cdigo C comienza aqu...

#include <stdi-o. h>


#define VERDADERO 1
#define FALSO 0
int validar_fm(inE num, int den);
int. primo(int x) ;
int palindrome (int x) ;
int validar_fm(int num, int den) {
/*Verifica e1 nmero de la fraccin mixta
if (num < den)
return (IIERDADERO) ;
else
reEurn (FALSO);
Volumen 4: Funciones en C

Unidad

l:

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln el prmso previo escrito de lBM

Funciones en

17

Introduccin a la programacin
con C

] /" r'in
mainO

de

Gua del Estudiante

La funcin validar_fm */

int i, j,

k,.

sc,rucE {

inL parte_completa
j-nt numerador ;
int. denominador
)

for

,.

4,.
(i = 100; <= 999, i++)
{
for(j = rOO; j <= 999; j++)
{
for(k = 100; k <= 999. k++)
{
A.parte_completa = j;
/* Formar A fuera de i, J, k
A.numerador = jA.denominador = k,.
/* verificar
si A es vaLidar fm */

if (validar_fm (A. numerador,A. denominador)


)
/* Verificar si es primo y pa1ndrome*/
if (primo (i) && palindrome (i) cc primo (j
)\
&& pal-indrome ( j ) &c primo (k)
&& \
palindrome (k) )

)/* r'in

prinrf (.?d\r ?d\r td\n,,,


A.part.e_completa, \
A.numerador , A.denominador
j/* rin del bucle for con k */
]/* rin del bucl.e for con j ,t/
] /* Fin del bucl-e for con i *,/

),.

aet main *,/

int palindrome (int x) i


int izquierdo, derecho, digito, guardar,
poswt;
int k, continuar;
,/* Contar el nmero de dgitos en x */
digiLo = 0,.
guardar = ,/* hacer una copia de x */
whil,e (guardar I = 0) i
digito++;
guardar = guardar / l-O;
Unidad

l:

Funciones

Volumen 4: Funciones en

@ Copyright tBM Corp.2002


, ^_
Los
materales del curso no pueden ser reproducidos
totaf
o parcalmente sn ef permiso prevo

estrito de IBM

lg

o
o
o
o
o
o
o
o
o
o
o
o
o

llF
Gua del

Estudiante

Introduccin a la programacin co

It

/* Aqu digito es e1 nmero de dlgitos */


/* Buscar e1 peso poscional al ext.raer el
dlgito izguierdo como l0ndigito-t *7
poswt = 1;
for (k = r; k <: (digitso - 1),. k++)
poswt=poswt*10;
fniciar
e1 proceso de comparacin */
/*
guardar = x;
/* Tomar una copia de x */
continuar = VERDADERO;
whil-e (guardar ! = 0 && conLinuar == VERDADERO) {
,/* digito zquerdo */
izguierdo = guardar / poswt;
/* digito derecho *,/
derecho=guardar?L0;
if (izguierdo == derecho) {
/* Nuevo x con izguierdo, derecho arroj ado* /
guardar = (guardar ? poswt) / lO;
posh/t = poswt. / IOO;

o
o
o
o
o
o

o
o

J/*nin
tt

?
e

*/I

continuar =

FALSO;

)/*Fin de1 else *,/


return (continuar);
)/*Pn de la funcin pa1ndrome */
int primo (int x) {
int. k = 2, continua,r,.
conLinuar = VERDADERO;
.whi1e (k <= x-1 && continuar ==
if(xtk==0)
L.

-.

continuar =

VERDADERO) {

FALSO;

else
k++,'
)

if (continuar == VERDADERO)
return (VERDADERO);
else

return

t
Volumen 4: Funciones n C

It

if

else

o
o
o
o
o
o
o
o
o
a
o

de]

(fALSO) ;

Unidad

f:

@ Copyright IBM Corp.2002


Los materiales del curso no pueden ser reproducictos otat
o parcialmente sn ef permiso previo escrito de IBM

Funciones en

19

lntroduccin a la Programacin con C

Gua del Estudiante

El cdigo C termina aqu

No se escribieron las otras funciones primo y palindrome, ya que se escribieron

anteriormente.

Fin del Ejemplo

l.l0

A continuacin se discute uno de los conceptos ms importantes cuando se


escribe un
programa que usa funciones, las clases de almacenamiento (storage
classes).

4. Gfases de Almacenamento
En C, una variable se declara como sigue:
<tipo-de-dato> nombre-variable;
Junto con la declaracin.de tipo de dato d una variable, se puede tambin
especificar
una clase de almacenamiento en la declaracin. Las clases de almacenamiento
se usan
en C para definir la visibilidad y el tiempo de vida de las variables. La visbilidad
de una
variable se conoce como alcance de una variable. La clase de almacenamiento
ayuda a
entender cmo C trata las variables declaradas dentro y fuera de una funcin.

Elformato de especificacin de una clase de almacenamiento es como sigue:


<clas+de-almacenamiento> <tipo-de-dato> nombre-variable;
Una clase de almacenamiento se usa para especficar al complador el tipo
de memora
que el programa necesita para sus variables. C tiene las siguientes
cjairo clases de

almacenamiento:

. Automatic
. Stat.ic
. External
e RegisLer
4.1. La Clase de Afmacenamiento

automatic

Todas las variabfes declaradas dentro de una funcin, llamadas varables


/ocales (locat),
por defecto conesponde a la clase de almacenamiento automatic.
De otro modo, se
pueden declarar como sraric. Sea el siguiente ejemplo:

inr f1O i
int. i;

f 1oat. f

,.

sent.encial;
sentencia2;
senEencian,.
Unidad

l:

Funciones

Volumen 4: Funciones en

@ Copyright tBM Corp. 2002


Los materiales del curso no pueden ser reproducidos totat
o parcialmente sin el permiso previo escrito de IBM

20

:r
of

Gua del

o
o

Iri
:tt
III

?i
o iF

.li

oli
oioi
oi

o
oi
ol

o
o

o
o

o
o

Introduccin a la Proqramacin con

En el ejemplo anterior, la variable i es una variable automatic. La palabra reservada


auto se puede usar opcionalmente, como auto int i. Cualquer declaracin dentro
de una funcn, donde no se especifica la clase de almacenamiento es, por defecto,
automatic. Las variables automatic declaradas dentro de una funcin obtienen el
espacio asignado slo cuando se invoca la funcin. El compilador fibera el espacio tan
pronto como la funcin retoma.

4.2. La Clase de Almacenamiento srarc


La clase de almacenamiento static le informa al compilador que los valores
almacenados en las variables estn disponibles entre llamadas a funciones. Las
variables automatic pierden los datos cuando la funcin retorna, ya que el espacio
asignado a las varibles se bera. Por ejemplo, si se declara una variable dentro de una
funcin como staric y se le asgna un valor 10, durante el curso de la ejecucin de la
funcin, el vafor 10 se retiene cuando la funcin se nvoca nuevamente. Cualquier
cambio que se haga durante esta invocacin ser retenido durante la prxma
invocacin de la funcin. Un buen ejemplo de su uso es cuando se crean nmeros de
identidad (secuencialmente) a travs de una funcin.
/" BI archivo de encabezado con 1as fuciones estndar
que soportan 1a entrada y salida se incluye (stdio-h) */
#include <stdio.h>
/* Declaracin de funcin *,/
int generarfdno O ;
/* La funcin main inicia aqu */
void mainfl {
int i,/" tI bucle inwoca 1a funcin generarld.no * /
for (i = 1; i <= 10; i++)

a
a
o
o
o
o
o
o
o
o
o

Estudiante

nvi nc t rE1

r:to es *d\ntt , generarldno

O);

'|

/* La funcin main fj,na)-za aqui */


/* La fucin generarfdno inicia aqul */
int generarldno O {
sEatic int idno = 0;
return ++idno,.
]

/* La funcin generarldno finaliza aqo */


Este es un uso simpfe de la clase de almacenamiento static en una funcin. Sin
embargo, en un esfuezo de programacin complejo, es muy importante el uso de la
clase de almacenamiento static. Las variables declaradas como sraric son
Volumen 4: Funciones en C

Unidad 1: Funciones en

@ Copyright IBM Corp.2002


Los materiales det curao no pueden ser reproducidos total
o parcialmente sin elpermlso previo escrito de'lBM

C 2l

Introduccin a la Programacin con C

Gua del Estudiante

inicializadas cuando la funcin se llama la primera vez.


Las llamadas subsecuentes a la
funcin no inicalizan la variable. As, cuando generarrdno (
) es ilamada (cuando es
1 en maino), la variable static idno es inicializada
en 0. Es entonces inciementada y
retomada a la funcin que hizo la llamada. Cuando generarrdno (
se invoca
nuevamente, no se realha nnguna inicalizacin. Ef valor
anterior de idno se retiene y
se incrementa para retomar et prximo valor dg

i.

4.3. La Clase de Almacenamiento

external

Las variables declaradas fuera de la funcin pertenecen a la


clase de almacenamiento
Estas varables son visibles a travs del program a, a partir del punto
que se
hace sus declaraciones. Cualquier cambio que se naga estos
valores afectan al resto
del programa. Vase elsiguiente ejemplo:
/* nr archivo de encabezado con las fuciones estndar

external.

gue soportan la entrada y salida se incluye (stdio.h) */


#include <sLdio.h>
/* Declaracin de funciones */

int f1O;
char f2 O ;
/* Declaracin de una variable external * /
int k;
/* La funcin main j-nicia aqu */
void mainO {
int q;
,/* Variable loca1 de main
/* puede usar sol-o k declarado fuera * /

) *7

/* La funcin main inicia aqu */


/* Declaracin de variable external- */
int ji
.
/* fmplementacin de las funcj-ones */
/* La funcin f1 inicia aqui */
void f1 O {
/* puede usar ambos k y j declarados fuera */
)

/* La funcin f1 finaliza aqu */


/* La funcin f2 inicia aqu */
char f2 O {
i,nt k,'
/* varable local de f2 O */
,/* puede usar local k y exEernal j ,t/
)

/* La funcin f2 finaliza

aqul */

Unidad 't: Funciones

Volumen 4: Funciones en
@

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducidos total


o parcalmente sin elpermiso previo escrito de IBM

22

of

o
o
o
o

o,

o'
o
o
O,*

o
o
o
O

o
o
o
o
o.
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
?

Gua del

Estudiante

lntroduccin a la Programacin con

En el ejemplo anterior, se declararon dos variables external k y j. k es visible main,


f 1 y f2. es visible slo en fry f2. Las variables extemal son visibles en funciones
slo desde el punto de su declaracin. est declarada justo antes de la funcin f 1, y
por lo tanto no es vsible en main. La misma regla tambin aplica para los prototipos de
funciones, ya que los prototipos de funciones conceptualmente son declaracin de
funciones en un programa.

Se declar tambin una variable k en la funcin rz. sta es una variable local. En este
punto, dos variables con el mismo nombre k son visible para f2. Recuerde que la
variable local, altener el mismo nombre que una variable external, siempre sobrescribe
fa variable external. Por lo tanto, la k visible en f2 es la local y no la variable extenal

k.

A fas varables external se les conoce tambin como variables globates (globa|. The
espacio asignado a estas variables permanece durante una ejecucin del programa.
Cualquier cambio que se le haga a una variable extemal ser visible a todas las otras
partes delprograma donde sea visible.

C provee un mtodo para hacer visible a

en main. Usando la palabra reservada


j De este modo main puede hacer uso de j, la cual se
como extern
va a declarar posteriormente. La palabra reservada extern informa at compilador que
aunque an no se ha declarado en main o antes de main, y eventualmente
encontrar una declaracin para ste. Esta caracterstica de C es bastante til en la
resolucin de problemas grandes.

int .

extern

Continuando con esta discusin, es importante sealar que generalmente un programa


grande que resuelve un problema requiere de ms de un archivo C en los cuales se
escriben las funciones.

Elcdigo

G inicia aqu...

/* Archivo1-.c */
int k,'
int m;
void mainO {

/* main escrita en un archivo separado */

/* Archivo2.c* /
int k;
int j;
extern int m;
/* Ias dos funciones declaradas en ste archivo
int f1O {

)
i

t
tf

t
I

int n;
Volumen 4: Funciones en C

Unidad

l:

@ Copyright IBM Corp. 2002


Los materiales delcurso no pueden ser reprcduddos total
o parcialmente sin elpermlso previo scrito de IBM

Funciones en C 23

Introduccin a la programacin con C

Gua del Estudiante

int f2O i
l

,/* Archivo3.h */
/* ros prototipos de funciones estn en ste archivo */
inr f1O;
inr f2 O;
El cdigo C finaliza aqu

Existen tres archvos


.en el segmento de programa anterior. se observan dos
declaraciones de k' Ambas
son dJctaracones vtidls ya que
el cual effas son definidas, muy parecido a la run'qre son locales al archivo en
se tienen variables locales
dentro de la funcin. ta varble j es visible slo
en las funciones definidas en
Archivo2 ' c, mientras que n es visible sto en f2 del Archivo2
. c. Sin embargo, la
variable m es visibre tanto en Archivo2. cas como
Archivol.c ya que se ha
usado la palabra reservada

extern.

Para usar j en Archivol.c, se debe ste


dectarar rr Archivol.c como extern.
Se puede detener que una variable sea declarada como extern
en otro archivo? La
respuesta es s' c provee fa pafabra reservada
static
que permite que al programador
detener que una variable sea declarada como
exrern bn otro archvo. Esto se logra
como sigue:

stat.ic int j ;
/* sIo es visible en eI Archivo2.c */
Esto est en el Archivo2. c. Este es un concepto
mportante en programacin,

llamado ocultamiento de informacn.


4.4. La Clase de Atmacenamiento

regisrer

La clase de almacenamiento register asigna memoria


en los registros de altavelocidad de la cPU. Esto es sl una soficitud
al compila_dor. El compilador asigna
memoria en los registros si tales r_e_oistrgs
para asignacin de
;*se lponiotes
memoria' si no estn disponibles, estas variables
tratbn como variables

Las variables

se

automatic.

declaran normafmente como variabres register


slo cuando se
requere computacones de alta velocidad.
inr f1 (register int a) {

regist.er int i;

El fragmento de codigo anterior muestra que


sfo las variables focal, tanto argumentos y
variables automatic, se pueden declarar como
variabres register.

Unidad 1: Funcionei

Volumen 4: Funciones en

@ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin el permiso previo escrito de IBM

Z4

o
o
o
o

Gua del

o
o I

o
o
o
o

o
o
o
o
o
o
o

t.

Estudiante

lntroduccin a la Programacin con C

5. Caractersticas de las Clases de Almacenamento


Algunas de las caracterstcas de las clases de almacenamiento (storage classes) se
muestran a continuacin:

.
.
.

sraric.
Slo la variables auromaric se pueden declarar como regisrer.
Slo las variables local se pueden declarar como variables

No se puede aplicar dos clases de almacenamientos a una sola declaracin.

stat.ic register int i;


El espacio para variables auromaLic

/* Error */

! register sB asigna en la pila del

sistema.
El espacio para las varables
datos delproceso.

sraric ! exrernal

se asigna en los segmentos de

o
o
O

o
o

o
o
o
o

a
o
a

o
o
o
o
e
a

t
t;
q;

Volumen 4: Funcionesren C

Unidad

l:

@ Copyright IBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo dscrito de IBM

Funciones en C 25

Introduccin a la programacin con C

Gua del Estudiante

Resumen
Ahora que ha compretado esta unidad, usted
debe ser capaz de:
Explicar la naturaleza y uso de las funciones

.
'
o
.
r
.

Describir algunas funciones incorporadas de


sido usadas

c, y las formas en que ellas han

ldentificar las diferentes partes del encabezado


de una funcn
ldentificar los diferentes tipos de argumentos
Definir prototipos de funciones y fistar sus usos
Usar las funciones para solucionar problemas

Unidad 1: Funciones

Volumen 4: Funcionei en
@

Copyright tBM Corp.2002

Los materiales delcurso no pueden ser reproducidos


total
o parcalmente sin ef permiso previo escrito de IBM

C 2A

o
o
o
o
o
o
o
o *t
o *t.
o $
o 'rta
o
o
o

Gua del Estudiante

Unidad

o
o

l: Exmen de Autoevaluacin

1. Eltipo de dato en elencabezado de una definicin de funcin es opcional.


a)
b)

2.

Verdadero
Falso

Cules de las siguentes es la caracterstica de la funcin definida por el usuario?


a) Expresa la naturaleza de la tarea llevada a cabo por la funcin

b) Satisface fas regfas para formar un identificador


c) Esta aparece en el encabezado de la funcin
d) Todas las anteriores

3.

O
I
I
I

4.

:t

formales

c)

Parmetros de prototipos

d)

Parmetrosnormalizados

Cuando se define una funcin, no es necesario declarar los nombres de los

a) Verdadero
b) Falso

iI

actuales

argumentos en la lista de argumentos formales.

o
o
o
o
o
o
o
o
o
o
o

en C

El encabezado de la funcin tiene una lista de identificadores y sus tipos definidos,


separados por comas. Cmo se llaman estm parmetros?

a) Parmetros
b) Parmetros

o
o }}
o
o
o
o

Introduccin a la Programacin con C

5.

En la lista de argumentos formales, dentro de un prototipo de funcin, no

es

necesaro declarar los nombres de los argumentos.

a)
b)
6.

7.

Verdadero
Falso

Dnde debe estar localizada la definicin de funcin?


a) Antes de la funcin main ( )

b)

Despus de la funcin main

c)

En un archivo fuente separado

d)

Ambos (a) y (b)

()

Dnde debe estar localizado el prototipo de funcin?


a) Dentro de la funcin main ( )

b) Como la primera sentencia dentro de la funcin main ( )


c) Justamente antes de la definicin de la funcin en s misma
d) Antes de todre las funciones, incluyendo la funcin main ( )

Volumen 4: Funciones en C

Unidad'l: Funciones en C 27

@ Copyright IBM Corp.2002


Los materiales del cuio no pueden ser reproducidos total
o parcialmente sin el permso previo scrito'de IBM

lntroduccn a la programacin
con C

8.

Gua del Estudiante

Cundo una funcin es invocada.


el conjunto de entradas se pasa
a la funcin a
travs de la fista de variable, lln0"
a) Parmetros formales

b) Parmetros actuales
c) Variables globales
d) Variables locafes

9.

Dentro der cuerpo de ta funcin,


es mandatorio tener
a) Exctamente una sentencia return
b) Af menos una sentenca return

c)
t

Unidad

Cero o ms sentencias

return

5H ilil: ?ffi '#:i[:':.1;Jg:'


a) Verdadero
b) Falso

l:

Funciores

"tros

rorma es
I

deb

e coin cid r

exa cta m e n te co n

Volumen 4: Funciones en

@ Copyright tBM Corp.2OO2


, _^ _
Los
materafes del curso no pueden ser
reproducidos totaf
o parcialmente sin el permiso previo

estrito de IBM

ZA

rt

o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

Respuestas a la Unidad 1: Exmen de Autoevaluacion

ol
ol
oi
oi
ol
ol
I

1)a
2)d
3)b
4)b
5)a
6)d
7)d
8)b
9)c
10)

q
ol

q
q
q

.l

e
o
ef

e
q

Volumen 4: Funciones en C

Unidad 1: Funciones en

@ Copyright IBM CorP.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln el permlso previo escrito de IBM

C 29

Gua del Estudiante

lntroduccin a la Programacin con C

Pgino dejada intencionalmente en blanco...

Unidad 1: Funciones

Volumen 4: Funciones en

@ Copyright IBM CorP. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

30

o
o
o
o
o
o
o
o
o
J$.
o l*
o t..
o

Gua del Estudiante

Introduccin a la Prooramacin con C

Unidad 2: Laboratorio de Funciones


Objetvos de Aprendizaje
Alfinalde esta unidad, usted ser capaz

d:

'

Emplear funciones
.definidas por el usuario para modulanzar los programas
alcanzar una estructura simple

'
.

Escribir funciones para flevar a cabo tareas especficas bien definidas


Usar funciones en la de resducin de problemas

o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o

?
o
o
a

It
5

T
*

,f
O

Volumen 4: Funciones r C

Unidad 2: Laboratorio de Funcores en

@ Copyright tBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln el permlso previo escrito de IBM

C gl

lntroduccin a la programacin con C

Gua del Estudiante

Ejercicios de Laboratorios
1' Escribir un programa en c que imprima una tabla de enteros decimals
desde

r
hasta w (esa es la entrada) junto con su equivalente
en Nmero Romano. Escribir
una funcin que tome un entero decimal como entrada
en Nmero Romano y su entero decimal en un ii;. e imprima el equivalente
se listan a continuacin
los enteros decimafes especficos y su equivarente
en Romano:

2'

10

50

100

500

1000

Considere un texto como entrada en Ingls, d cual


termna en el smbolo $.
Escribir un programa que cuenta el nmero de vocales
y el nmero de
consonantes que aparecen en el texto. Escribir dos
funciones flamadaS esVocal
y esconsonante que tome un carcter como entrada y retome
un valor
vERDADERo o FALso apropiadamente.

Unidad 2: Laboratorio de Funcores

Volumen 4: Funciones en

@ Copyright IBM Corp.2002


Los materiales del curso no pueden ser reproducdos
total
o parcialmente sin el permiso previo escrito de tBM

32

o ttr:t
o
o
o
o
o ,
o .TT
o is.+
o
o i
o
I

oi

Gua del

Estudiante

Introduccin a la programacin con C

Unidad 3: Recursin
Objetivos de Aprend izaje
Af final de esta unidad, Ud. ser eapaz

.
o
o
.

de:'

Explicar qu es recursion
Discutir las diferentes condiciones que deben ser satisfechas para que las
funciones recursivas trabajen correctamente
Describir cmo una funcin recursiva trabaja cuando se ejecuta
Definir el rolde la pila en la ejecucin de ras funciones recursivas

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

tI

p
p

tI.

@ Copyright IBM Corp. 2002


Los materiales delcurso no pueden ser reproddos total
o parcialmerte sin elpermlso previo esctito de IBM

Introduccin a la programacin con C

Gua del Estudiante

1. lntroduction

I-

En fa Unidad
Funciones de este vofumen se discuti cmo los programadores
pueden definir sr-s funciones e invocarlas desde
Cr"ri"r parte de programa c. En
esta unidad, se aprender acerca de un tipo especit oe funcionun
ilamadas funcin
recursiva.
La pafabra 'recursin' se origina de la,raz latina.'re',.Que.
significa 7egresaf,y
latin
significa.'conei. La palabra recursion iittrnte .ignr"-;.*",el sufijo
-'currere',
haca
gtr{s', o'que suceda. otravez, especiafmente en un intervalo especfico,. En
el
contexto
de la programacin de computadoras, la palabra 'recursin'se
rfere ,n" funcion que
es capaz de llamarse as misma.
"
En las unidades anteriores, se estudiaron diferentes tipos de
funciones. Se aprendi a
cmo escribir estas funciones y cmo usarlas e invocarias.
sea er sigue;te mpro:

int miRecursion(int x)

miRecursion (x-1)

,.

Aqu, se ha definido una parte de una funcin llamada miRecursion.


Se puede notar
que fa misma funcin miRecursion es invocada desde
dentro del cuerpo de la
funcin definida.
1.1. Definicin
Una definicin apropiada de recursion ser 'una tcniba
algortmica donde una funcin,
de manera de acometer una tarea, se llama a s mismi con
valores modificados en sus
argumentos'.

En esta definicin, se tienen algunas palabras reservadas que definen


las
caractersticas de recursbn. Recursin es rdalmni una
tcni
que
se
emplea para resolver ciertos problemas. En el contexto
"iitri"" en C, ta
de escribir prg*r",
recursin implica una funcin en c que puede ser llamada
desde dnt del cuerpo de
la msma funcin- La funcin neceariamente debe realizar
una tarea. simptemente
llamando cualquier funcin arbitraria dentro de s misma
no tendr un propsito till.
cuando una funcin se llama a s misma, fo hace con 'vafores
argumentos'. usuatmente, esto se manifiesta en ros pram; modificados de sus
;;]asados a
travs de la framada. En er ejempro anterior, ta ilamada
miRecursion(x-1)muestra
que sta es llamada 'con alguna parte de fa
tarea'como elargumento x_t.
Unidad g: Recursion

Volumen 4: Funcones en
@

CU

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducidos total


o parcialmente sin el permiso previo escrito de tBM

o
o
o
o
o
o 'a
o ',f
o
o ,,;
o It

o
o
o

o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin a la Programacin con

De la definicin anterior, es claro que la recursn implica


un proceso repetitivo, el cual
es autoreferencado. La recursion se encuentra en la vida
oalia tar vel, inctusive se
usa implcitamente.

2. Escribir Funciones Recursivas


A

continuacin se discute como escribii funciones recursivas


en para resdver
problemas' En esta unidad, se aprendern los
funomentos de rapgramlcon usanoo
recursin' empezandg con ejemplos simples de funciones
matemtis, y continuando
con la solucin de problemas complejos.

Ejemplo 3.1: Calcular el Factoriat de un Enetero


cafcular el factorial de.un entero es, q.uils., el ejemplo ms
usado para ensear el uso
de la recursin a los principiantes. se irabajb
en el volumen 2, unidad
3 - construcciones lterativas. Sin embarg, por r"ron"i-du
"jemplo
completitud, se revisar de
nuevo' Ef factoriaf es un trmino matemti que es definido
pr" tbr tos enteros
positivos' Por definicin, ef factorial del entero
0 es 1. para todos los otros enteros
positivos, ef factorialde n es el producto de todos
los enteros desde t hasta n. sea el
siguiente ejemplo:

d;;i

Factoral de
En generaf,

5 = Sx4x3x2x

1 = 120

Factorialde n_(donde n > 0) = nx(n-i) x(n_2)x... x 1


Se escribe elfactorial de n como n r (con'etsigno de
exclamacin) y se lee como
n-factoriaf. As,
n! = nx(n-1) x(n-2)

x... x 1 paratodos losvaloresden >0.

El factorial se puede tambin definr usando induccin

recursivamente, como sigue:

r X (n-1) t (es decir, n murtiprcado


- t(sin = 0)

nJ =

pdrn-r

factoriar,

matemtica,

es

sin > 0)

Esto es conecto y puede ser fcifmente verificado.


considere 5!, por ejempro:

5!

=
=
=
=
=
=
=

Sx4l
Sx4x3!

5x4x3x2l
5x4x3x2x1l
5x4x3x2x1 x}l
5x4x3x2x1 x1
Sx4x3x2x1

(dado que 0! = I por definicin)


(dado que I x 1 = 1 de cualquier modo)

Copyright tBM Corp.2}02


.uos materiales @delcufso
pueden

no
ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

\)

decir.

Introduccin a la programacin con C

Gua del Estudiante

Una definicin formal recursva delfactorial de n


se da a continuacin;

if

qi

(n==0)

return

1;

else

return factorial(n-1)

* n:

Esta es una funcin recursva, ya que factorial


se invoca desde dentro de la misma
funcin. Ahora, se verifica si esio trabaja a travs
de la trazadel programa
Asuma que se invoca factorial con el parmetro
cuando se hace ta verificacin
if (n==o) , la condicin se hace vsRADERo ya que 0.
n es 0. De manera que el valor 1
(el cual es elfactoriar de 0) es retumado por
raroriar.

Ahora, si
ejecuta:

el factoriar se invoca

aon

"i

parmetro 1, la siguiente sentencia se

return factorial (n_1) _ n;


Esto significa que ef factorial (o) se invoca recursivamente. ya
que se sabe que el
factori-al- (0) retornar el vafor 1. Por lo que, la sentencia
a la larga har lo

siguiente:

return factorial- (0) * 1;


Estorealmenteesl * 1= l.porlotantot!

'

Ahora s se invoca factorial


t ), se tiene la sentencia:

(3). Mientrasn >

1.

0 (esto es para varores de

= 3, 2 y

ret.urn factorial (n_1) * n;


La sentencia anterior ser ejecutada recursivamente
cmo:

return factorial(2) * 3;
return factoriaL(1) * 2;
reLurn fact.orial (0) * L;
Este es el mismo que retomar

return 1 * 1 * 2 * 3;
La funcin anterior termina conectamente. Dado que
se tiene el caso base cuando n =
o' elfactorial retorna como 1. La condicin base
rry
importante, ya que perm'te que
un algoritmo termine apropiadamente.
"i
Qu suceder si se invoca esta funcin con un parmetro que no es
mayor o iguaf a 0,
por ejemplo -3? En esta situacin, no existe
un iaso base vlido, por lo tanto la funcin
Unidad 3: Recursin

Volumen 4: Funciones en
@

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducidos


total
o parcialmente sin elpermiso previo escrito de
IBM

g6

o
o
o
o
o
o
o
o

?
Gua del Estudiante

factorial ser invocada indefinidamente con los parmetros -3, -4, -5, y
as
sucesivamente. La funcin recursiva no terminar. Sin embargo, a partir
de un tiempo,
fa funcin amenzar a usar mucha memoria y finalmente se
tga.
Fin del Ejempto 3.1

A continuacin se tratar de consoldar la comprensin de las funciones recursivas

o
o

travs de otro ejemplo simpfe: Encontrar el MCD entre dos nmeros.


Ejempfo 3.2: Encontraret MCD Entre Dos Nmeros:

oo'

MCD(x,y)

o
o
o
o
o
o
o
o
o
o
o
o
o
o

MCD(x-y,y)

six>=y

=
=x

MCD(x,y-x)

six<y
siy=9
six=0

A continuacn se verifica si la definicin es correcta.


t4cD (1_2 ,

L6)

=
=
=
=

(L2,76-72)
MCD (I2-4,4)
MCD (B-4,4 )
MCD (4-4,4)
MCD

,4) ya que 16 > !2


MCD(8,4) ya que 12 > 4
MCD(4,4) ya gue B > 4
MCD (0,4) =
4
l{CD (1-2

=
=

Este resultado coincide con el que se obtuvo anteriormente. A


continuacin se escribir
una funcin recursiva en c que calcula el MCD de dos enteros positivos.

El cdigo C incia aqu...

int

x, int y)
(x==s
if
{
. reEurn y;

mcd(inE

else if (y == o) i
return x;

Volumen

b
b
I

@ Copyright tBM Corp.2002


Los materiales del curco no pueden ser reprodi.rcldos total
o parciafmente sin el permiso previo escrito de IBM

Todos han estudiado el MCD en los cursos de matemticas de la escuela.


Cada uno,
quizs conozca como cafcular el MCD de dos enteros positivos.
srpong ;ue se debe
encontrar el uco (L2 ,76). Cualquiera sea el mtodo que se use, se puede
facilmente
determinar que el McD (l-2, 16 = 4. Uno de los mtooos ms simple"
el
divsor de cada uno de tos enteros. Los divisores de 12 son 1,2,3,4,6y
", "nurerar
12. Los
divisores de 16 son-1, 2,1,8_y 16. A partir de estos se puede observar que
los divsores
comunes de 12 y 16 son 1,
4. Por lo tanto, 4 es et MCD. Pero, existe un mtodo que
.? .y
no requiere enumerar los divisores de cada uno de los nmeros. Esto se
origna de la
siguiente definicin recursiva:

o
a
o
o
o
o
o
o
o
o
o

,r

Introduccin a fa

Introduccin a la programacin con C

Gua del Estudiante

else if

(x >= y
reEurn

) else

mcd

(x-y, y)

,-

reE.urn mcd (x, y-x)

]
)

El cdigo C finaliza aqu

Nota: La verificacin y=9

! x=0 srve como los casos base de la recursin. As que,


mientras no haya varores negativos, ef argoritmo terminar.
Fin del Ejempto 3.2

se fortalecer

er entendrmiento de la recursion con otro ejempro.

Ejemplo 3-3: Encontrar ros Trminos en ra serie de Fibonacci


La serie de Fibonacci es una serie infinita interesante
de nmeros que sigue la forma:
1, 1, 2,3, 5, g, 13,21, 34, 55, y as sucesivamente

si se observa el patrn cuidadosamente se dar cuenta que los primeros


dos nmeros
de la serie de Fibonacci son 1y
prxmo
Ef
nmeroes
siempre
la
suma
de los dos
1.
nmeros anteriores' A continuan,
se'es cribir una funcin recursiv n qr" retorna
el n'n nmero de Fibonacci. por ejemplo, f ibonacci (o ) debe retornar g,
f ibonacci (e)
debe retomar 21,y

frbonacci (ro

La siguiente es la funcin recursiva para retornar


autoexplica.

spg retomar55.

el nmero nth de Fibonacci.

Es

El cdigo C inicia aqu...

int fibonacci (int n) {


if (n <= 2
return 1;
) else {
."rrrrn fibonacci (n-1) +fibonacci (n-2) ;
)
)

El cdigo C finafiza aqu


En esta funcin, se pude notar que s et parmetro de
entrada es menor o igual a 2, se
retoma 1' Esto es porgue los primeros dos trminos de
la serie de Fibonac.] ,on 1 y 1.
Si no' cuando n es mayor que 2, se invoca la funcin f ibonacci
recursivamente para

Unidad 3: Recursin

Volumen 4: Funciones en

O Copyright tBM Corp.2002


Los materales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

3g

ors

o
o

o
o
o
o
o
a

ort

o
a

Gua delEstudiante

lntroduccin a la programacin con

obtener los dos nmeros anteriores, es


decir, f ibonacci (n_l_) y f ibonacci- (n_2)
y se retorna fa suma de esos dos
nmeros, fo cualsatisface la defincin.
Note cuan eregante es ra sofucin. sin
embargo,
es realmente el mtodo ideaf para.solucionr'"ia pesaf de ra eregancia que ruce, no
bio"ra de la bsqueda de los
trminos de la serie de roonacc. Miekas
;rt"
;i;*pto es para entender fas
funciones recursi-vas, es preferible construir
una sotun iterativa para et probfema.
La
razn' es que la funcin iecursiva es ms
costosa en trm.inos.de tiempo de ejecucin,
dado que el nmero de veces qr" ror ,"gistior;eictvacin
y
liberados es afto' una solucin iierativ",."nq*
"on?,iacenados
p*0"
contenei.,,,.l
sentencias
y
pueda

o
o

no lucir tan elegante como fa solucin


en trminos de tiempo de ejecucin.

Fin def Ejempto 3.3

o
a
o
o
o
o
o

o
o
o
o
o
o
a
o
o
o
o
o
a

p
t?

r"drnils

sin embargo, menos costoso

Existen muchos otros ejemplos dond


una solucin recursiva a un problema puede
lucir
elegante, pero es pobre en trminos de
rendimient cuando se ejecuta como
programa' En tales casos, una solucin
un
iterativ leJ" Jur. ,n" opcin ms apropiada.
A continuacin se presenta el uso de la recursin
en ta solucin de problemas ms
compfejos.

Ejemplo 3-4: permutacin de Nmeros para


construir un cuadrado Mgico
El probfema aqu, es construir un cuadrado
de las filas, ras corumnas.y. ras oLwnatesmgico, de orden 3x3, en la cual las sumas
rn
rvvsv iguares.
La Figura 3.1 es un
-- '| to.
'\
ejempfo de un cuadrado magico oe oren
;3.
4

I
2

4
I

Figura 3.1: Cuadrado Mgico de Orden 3x3


El orden de 3x3 no es el nico cuadrado.
mgico que existe, existen otras un cuadrados
mgicos de orden 4x4,5x5, etc., i cuales
sn nieresantes de construir. pero primero,
se aprender como construir un cuadrado
mgico oe iJen gxs.

Ef probfema es asombrosament"
se necesita es arregrar un
conjunto de nmeros (en ste caso
I"9" alloue
"nq1?:g
ls enteros.l
sien
una matriz 3x3 taf que los
efementos en las filas, column". y
las..diagonales-iurren et mismo nmero. pero
estrategia para resofverlo parece'oir'clE;;;;grir.
fa
Existen estrategias, pero el
asuma que no se tiene acceso a ellos.
]or b tando se quiere resorver el
il3[13[t!:

tBM Corp. 2002


,Los_materiafes edefQopyright
curso no pueden'ser

o parcialmenie sin elpermiso previo

reproducidos total
de IBM

"rlrto

Introduccin a la programacin con C

Gua del Estudiante

suponga que se emplea un mtodo que genera todos los


nmeros posibles que pueden
ser arregfados en la matnz 3x3. Entonce, se puede
determinar si un cuadrado mgico
est formada o no-. En otras palabras, se desea una facilidad
por medio de la cual se
puedan encontrar todas las posibles permutacbnes
de
un con;unto oe numeros. La
permutacin es ef aneglo de ciertas unidades
en todos posbles rdenes. La recursin
se puede usar para generar todas las permutacons'de nmer;
q;. pueden ser
aneglados en fa matriz 3x3- lJna vez que un aneglo est listo
en la matrii- 3x3 se puede
siempre verificar si este forma un cuadrado mgi o no.
Cmo se usa la recursin para generar fas permutaciones de un conjunto
de nmeros
dados? Para hacer las cosas imples, pines en ra matriz
3x3
tomo
un arreglo
inidimensional de nueve elementos. Ahora'lo que se
debe hacer
g.n"r".
todas las
posibles permutaciones de los nmeros del I
aig en ef aneglo de ",
nueve elementos. La

sguiente es la lista de las posibles permutaciones:


1

234567 89

1234567

9B

1,2345687

\23456897
r23456978
123456987
987 654327
987

65432t

Realmente, existen unas 362.880 permutaciones disponibles


para

el factorial de nueve
(9!)' No es un nmero pequeo para ser manejado por
cualquier persona sin una
computadora. Ahora, imagine que s-e tienen qr"'g"n"rar
cuadrados mgicos de un
orden mayor, como por
ejempro 4x4, sxs o incrusive'1024x1024.

El primer paso es poder generar las permutaciones anteriores en un


aneglo
unidimensional' una vez que la permutacin es generada,
se
debe
tener
una
funcbn
que verifique si sta es un cuadrdo mgico.
se csita una funcin qr. tonvierta el
aneglo unidimensional (el cual es verifica-do para saber
si es un cuadrado mgico) y lo
imprima como una matriz de 3x3.
Para empezar, se tratar de generar la siguiente
secuencia de nmeros:
171 , J,1-2, 113 , I2t ,I22 ,1_23 ,I3I ,1-32
,1_33 ,
2l-L , 2t_2 ,21_3 ,221- ,222 ,223 ,231_,232
,233 ,
31,L ,3l.2 , 373 , 32L , 322 ,323
,33J- ,332 ,333

con la ayuda de una tcnica ietrativa, se puede hacer esto usando


un conjunto de tres
bucles, tal como se muestra a continuacin:

for (i = 1,. i<=3; i++)


for (j=1;j.=3;j++)
Unidad 3: Recursin

Volumen 4: Funciones en

@ Copyright tBM Corp.2002


.
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

qin

a
o
o

o
o
o
O

o
a

o
o
a

Gua def Estudiante

for (k=1; k <= 3; k++)


printf ( "?dtd?d\rr,' , ,j, k) ;
Asuma que la variabfe de nombre arreslo se dectara globalmente y
su declaracin
como sgue:

int arreglo[s0] i

o
o
o
o
o
o
o
o
o
o
o

o
a
o

permutar (n+1)

else

printf ( "?d?d?d\n", \
arreglo It], arreglo [2],arreg1o t3l
)

Aqu, arreglo tl es un arreglo de enteros, que contiene los valores permutados. para
empezar con esto, se debe invocar a la funcin permutar, con
el valor
permutar(1) -La siguiente secuenca de 3 dgitos ser generada oando de 1 como
se nvoque
fa funcin recursva como permutar ( 1) |
1_II ,1_L2 ,1_I3 , L2!,122 ,1,23 ,1_3L , 132 ,I33
2r1, , 212 , 2I3 ,227_ ,222 , 223 , 23:- , 232 ,233
3a1

,312,

L3 , 32J.,322

,
,

,323 , 33I , 332,,333

A contnuacin, se modificar para permitr la permutacin de los nmeros


del 1 al 9 en
el arreglo de nueve elementos, se puede nacer uso de lo siguiente:

void permutar(int n) {
inti;
for (i=1; i<=9. i++)
arregLo [n] = ;
if (n<9)

permular (n+t_) ;
el-se

Q.

esMagico (arreglo)

I
)

{
Volumen 4

Losmateda."?"?SlljFli'3,[.?,&?o,l*uooostotal
o parcialmente sin el permso previo escrito de IBM

);

return,.

a
a
a
o

inr i
for (i=1; i<=3; i++)
arreglo [n] = i;
if (n<3)

es

si ahora se desea tener una recursn, se puede hacer lo siguiente:


void permutar(int n) i

o
o

lntroduccin a la Programacin con

lntroduccin a la programacin con C

Gua del Estudiante

En esta situacin, arreglo es un aneglo undimensionalcon


nueve elementos enteros
que ndebe ser declarado en el program.
Todos lo que se na hecho de significativo en
codigo anterior es reemplazar
sentencia
con
funcin
esMagico (arreglo) . como antes,. la funcin permutar (
debe
ser invocada
inicialmente con el parmetro de entrada 1.

ef

la

printf
)

la

Cuando un conjunto permutado de nueve nnqeros est


disponible en arreglo, la
funcin esMagico(arreglo)se invoca con arreglo
como un parmetro. Esta
funcin verifica si el equivlente 3x3 de este uo"l
i;*" un cuadrado
mgico, y si es

as, lo imprime.

probrema. En esta sorucin, una cierta permutacn


l',::l!":99:
,l"venunrepeticiones.
de ros
numeros
resulta
Es intil permuiar nfiguraci;-;;titvas de
nmeros y verifica si ellos forman un cuadrado mgico.
As que, de debe modificar ta
funcin anterior para. rechazar repeticrones de nmeros permutados.
Hay muchas
formas de verificar estas repeticions. Ef siguiente
rn proceoimiento

otro arreglo unidimensionar de nueve erementos


"" usados
ilamado

[]

void permurar (int n) {


i:: ! :
fc:: (i=1; i<=9- i++)
/* Verificar si un nmero i es usado */
if (usadolil == o) {
usadolil = 1;
arreglo [n] = j-;
if (n.9)
permutar (n+1)

else

smple que usa

,.

esMagico (arreglo)

usado[i]

,-

= 0;

recurn..
)

nicialmente todos los elementos de este aneglo


se incializan en0, indicando que todos
los nmeros desde 1 al 9 no estn usados. Sr: usado[3]
es 0, implica que 3 no est
usado, I si usado [3] es 1, eglo implica que el nmero
3 ya est usado. As que, todo
lo que necesitan hacer es modfcar ia funcin anterior
taf que un nmero es verifcado
por el aneglo usado- [] antes que este se
use. Si un nmero es ahora usado, se debe
expfictamente inciafizar el correspondiente elemento
det aneglo en 1 dentro de ta
f

funcin.

un punto significativo a notar es la forma en que los valores


del areglo usado [] se
establecen. Se establece en I usado [] dentro de la
funcin cuando el nmero
Unidad 3: Recursin

Volumen 4: Funciones en
@

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducidos


total
o parcialmente sin ef permiso previo escrito de IBM

C 4t

:F
oii
o
o
O'l

^I
-r
-fr

oif

ol:
oi:

o
o
o
o
o

Gua del Estudiante

o
o
o
o
o
o
o
o
o
o
o
o
O

o
o
5

t;L
l-

f.

L
lo

conespondiente va a ser usado. Siempre que fa funcin permutar


se rnyc3
recursivamente, el valor de usado[] permanece en 1 para ta ejecucin
de la funcin
invocada recursivamente. Sin embargo en el retomo e ia funci permutar,
despus
de probar si ef areglo forma un cuadrado mgico, se le asigna a usado
nuevamente
[]
0' Esto permite que se use el mismo nmero-para otras permutaciones. Ahora se sabe
que para ef orden 3X3, exste un total dg ocho posibles cuadrados mgicos
mn los
nmeros det 1 al9.
Ahora se ha presentado el poder de usar la funcin recursiva en la permutacn
de un
conjunto de nmeros.
En este ejemplo, se verifica una gran cantdad de anegfos permutados para
determinar

si ellos forman un cuadrado mgco. En realidad, lJ nrayoria de ests pruebas son


intilies.
considere elprimer aneglo ilustrado en la Figura 3.2.

o
o
o
a
o
o
o
o

lntroduccin a la Proqramacic c:

Figure 3.2: Es este un Arregto de Cuadrado Mgico?

Este absofutamente no forma un cuadrado mgico, ya que la prmera fila


misma
se comienza permutando g-9, luego'7-g-g; oespueJ _7_a_gtotaliza
y as
sucesivamente, con el tope de la fifa siendo 1-2-3. Elte es igualmente obvio que
todas
estas permutacionel.y verificacones del arreglo para un cudrado mgico son
intiles
ya que h configuracin de la primera ftla 1-2- n puede producir un cadrado
mgico
para cualquera del resto de las permutaciones. Inilusive cuando
se alcanza el tope de
fa fila de tres nmeros 1-2-3, se permuta este a 1-3-2, y despus a
x2-1, r1_2 y 2_1_3.
Naturalmente, todas estas permutaciones no, producirn un cuadrado
mgi para
cualquiera de las permutaciones de los nmeros en otras filas. por lo tanto,
se-tiene que
modificar la funcin permurar (
para evitar estas permutaciones intiles que
empiezan con una suma de fila particular que no sea 15.

menos de15.

Cuando se llena los valores para cualquier fila, se debe verificar si la suma

de cada fila
es 15. Si no es as, se puede descartr. Cuando se tienen los primero ar*
nmeros
generados, por ejemplo, se necesita rerificar si la suma de la fila
es 15, cuando el

nmero para el cuarta es generado. Si la suma es 15 se procede gen"ra.


a
el nmero
del cuarto elemento. Si no es as, se necesita regresar (llamado baktracking)
a la fila
previa de tres nmeros y hacer otras permutacines hsta que
se ootnta la suma
como 15. Se necesita hacer esto para cada fila. Si se tiene l conjunto
lor nueve
nmeros, talque la suma de cada fih sea 9, entonces todo lo que
tdne que racerse es
verificar las sumas de las columnas y diagonalen la funcifl esMagico (
).

Volumen
@

Copyright tBM Corp.2002

Los materiales delcurso no pueden ser reproducidos total


o parcalmente sin elpermiso previo escrito de IBM

Introduccin a la programacin con


C

Guia del Estuc a:e

Despus de modificar la funcin, sn embargo,


en vez de alcanzar algo significar:e.
realmente se consigue ms ineficiencias.
La Figura 3'3, por ejempfo, iluska un perfecto
aneglo vlidode una matiu3x3 denvada
de la modificacin de la funcin.

Figure 3.3: Matriz de 3x3

Todas fas sumas de las filas son J5^. Pero,


la primera columna misma revela
ineficiencia dado.qu.e tiene el patrn 1-2-3,e|
cuar no hace qr" l"
sea ls, por lo
tanto convrtie a
fas otrs permutaciones redundantes. por
lo
tanto
loda.sse necesita
modificar an fa funcin permutar ( para
evitar estos tipos de permutaciones que
empiezan con una suma particufar de cofmna
as como la suma de fa flla que no es 15.
El truco es llenar. las filas y las cofumnas altemativamente.
A esta altura ya se est
familianzado con la notaci de matrices
nsum-fr"
,".tene
un aneglo de 3x3 para
llenar' Una de tas formas es llenilas entradas
h
matnz con el n,i-,iro permutado
en el siguiente orden:

ir*

A(1,1),

,2), A(1,3), A(2,r) , A(3,1), A(2,2), A(2,3), o(:


,2), A.,3)
Se necesita verificar la suma de la fila en A(1,3)
. Cuando se ltene en A(3,1), se
A(1

verifica fa suma de fa columna uno. Cuando


se liena A (2 , 3) , se verifica la suma de la
segunda fifa y cuando se,ena A(3,2)
se verifica ra suma de fa corumna dos. y
finalmente' cuando.se flena A(3,3), se verifica
que la suma de la tercera fila, tercera
columna as como las diagonales.

Fin def Ejemplo

3.4

Ahora que se ha aprenddo a crear un cuadrado


mgico con la ayuda de una funcin
modificada' se va a considerar un ftimo ejemplo
oer uio oe la recursin. se dscute
uno
de los ejempfos ms famosos, er probrema
de fas Tones de Hanoi.
Ejemplo 3.S: Las Torres de Hanoi
El famoso problema de las Tones de Hanoi
involucra tres ctavijas, etiquetadas como
A,
B y c y n discos de dim,etro 1,2,3,. .
. n. Er rompecabezas comienza con todos ros
apilados en una de las clavijs por orden de
tamao oecrecente o
hacia

#;::t

"0";o

El probfema es mover todos fos n discos


desde
.la claviiaA (posicin iniciaf) a la cfavija
C (fa posicin finat) obsevando tas sijuientes

regtas:

Undad 3: Recursin

'

Volumen 4: Funciones en

@ Copyright IBM Corp.2OO2


Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermso previo escrito

de IBM

44

olt
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
a
o

I
,

t
I

l?

D
i

tt

|l
t7

p
o

Gua del

.
.

Estudiante

lntroduccin a la Programacin con C

Slo un disco puede ser movido a la vez.


Un disco grande nunca puede ser colocado encima de uno ms pequeo.

El origen del rompecabezas se atribuye a W. RouseBall, un ingls escritor de


matemticas recreativas. Ahora se tratar de entender como este problema se puede
resolver y donde encaja la recursin
El problema es que n discos enen que ser transferidos desde clavija A hasta la cfavija
C siguendo ciertas reglas. Esto puede hacerse a travs de una serie de movimientos
donde el disco tope de alguna clavija (A, B, or C) se coloca en el tope de alguna otra
clavija. Sin embargo, se debe tener cuidado de no colocar un disco en el tope sobre un
disco ms pequeo en la clavija. Un movimiento puede ser especificado como una
instruccin, de la siguiente forma:
Mover eldisco deltope de la clavja X a la clavija Y
Dada una entrada n (el nmero de discos a ser manejados), se tiene qre generar los
movimientos para transferir n discos desde fa posicin inicial en la clavija A al la
posicin finalen la clavija C.
Existe un conjunto de movimientos fegales para lograr la transferencia deseada de los
discos desde la clavija A a la clavija C para cada valor de n? Si se tienen dos clavijas,
por ejemplo, la clavija A y la clavija B (y no la clavija C como el destino final), no se
puede resolver el problema, inclusive para valores tan pequeos como n=2. Esto es
fcil de entender, ya que despus de mover un disco desde A hasta B, todo lo que
puede hacerse, es mover el disco de regreso a A. Nada ms puede hacerse y eso no
ayuda a solucionar el problema.
Se puede solucionar el problema con tres clavijas, A, B y C para n=2? Si, se puede.
Se puede mover el disco ms pequeo desde la clavija A a la clavija B (la clavija
temporal intermedia). Luego, se puede mover el disco ms grande desde la clavija A a
la clavija C (el destno finaf). El paso final es mover eldisco ms pequeo desde B hasta

c.i

La pregunta es si se puede hacer este tipo de transferencia para todos los valores de n.
Se va ver si se tiene una solucn vlida p?ra n=3. Los siguientes son los movimientos
posibles:

o
.
.
.
o
.
.

Mover eldisco deltope de la clavija A (el disco ms pequeo) a ta clavija C


Mover eldisco deltope de la clavija A (ahora el medano) a la clavija B
Mover el disco del tope de la clavja C (el ms pequeo) a la clavija B
Mover el disco deltope de la clavija A (el ms grande) a la clavija C
Mover el disco deltope de h clavija B (el ms pequeo) a la clavija A
Mover eldisco deltope de la clavija B (el de tamao medio) a la clavija C
Mover eldisco deltope de la clavija A (eldisco ms pequeo) a la clavija C

Volumen 4: Funciones en

'

Unidad 3: Recursin en
@

Copyright IBMCnlrp.2002

Los materiales del curso no pueden ser reproddddos total


o parcialmente sin elpermiso previo'esoito de IBM

45

lntroduccin a la programacin con C

Gua del Estudiante

El problema para n=3 eSt sotuconado. Ahora, @nsdere posibilidad


la
de tener n=
discos en la clavija A. Al usar fos movimentos antes menciondos,
se puede resolver
tambin' Por lo tanto, se puede generalizar la idea antes mencionad
a para trabajar con
cuafquier nmero de discos
Sin embargo las siguientes condiciones deben
satisfacerse:

;.

'
o
o
'

El disco ms grande en fa clavija A debe ser movido en el fondo


de la clavija C,
este es eldestino final.
Esto es posible slo cuando todos los discos anteriores a f
son movdos fuera
de la clavija A
Tambin, cuando et disco ms grande est libre para ser
movido, la clavija C
debe estar vaca de forma taf gu se mueva el discb mai gran"
o"ro" la clavija
A hasta la cfavija C
Es importante notar que el disco ms grande ser movido desde
la clavija A a la
clavija C, como se mencion anterioniente, todos los otros discos
deben estar
en la clavija B (con ningn disco corocado sobre un disco ms pequeo

Esto es, se tiene que transferr n-l discos desde la ctavija B (la
clavija temporal) para
permitir la transferencia del mayor de los discos
desde la clavija A a la clavija C. En
otras palabras, hacer el trabajo de transferir n discos, primero
debe hacerse la subactividad de transferir n-1 discos. Aqu es donde se necesita
una recursin para
solucionar el problema.

'

Considere tres variable llamadas desde, hasta y temporat para


llegar a un algoritmo
que ayude a derivar una funcin en C. Las variables
desde, hasta y temporal se
refieren a las tres clavijas en cualquier momento. desde
se refiere ala clava desde,la
variable hasta se refiere a la clavlia hasta y remporat se
refiere a la clavija que
afmacena el disco temporalmente. Los valores de desde y
hasta sern 1, 2, 3. De
la explicacin hasta ahora, se sabe que los vafores de temporatse pueden calcular a
partir de los valores de desde y hasta.
Supngase que las tres clavijas fueron. numeradas
es 6. Esto resulta en la siguiente relacin:

desde + hasta + t.emporal =


Por fo tanto,
recursiva.

temporal = ( 6

desde

, 2 y 3. La suma

de estos nmeros

hasta) . se puede desarrollar

la estrategia

Cuando n = r, la transferencia es comptetada en justamente


un movimiento, es decir,
mover un solo disco desde la clavija inicial a la cfavija final.
Cuando n
r, la transferencia de n discos desde la ctavija A hasta la clavija C puede
hacerse con los siguientes movimientos:

'

'

Tranferif

(n

- l)

discos desde la clavija A a ta ctavija B, usando la clavija C


como almacenamiento temporal.

Unidad 3: Recursin

Volumen 4: Funciones en

@ Copyright tBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin ef permiso previo escrito de IBM

46

o
o
o
a
q
q
o
o

o
o
o
a
o
o
o
o
o
o
o

o
o

Gua del Estudiante

Ahora la clavijaAtienesolo un solo disco, el mayorde todos. Move


desde la clavija A a la clavija C.

Transferir (n - t) discos desde la clavija B a la clavija C, usando la clavija A


como almacenamiento temporal.

usando esta estrategia, se trata de obtener una compresin delalgortmo.


Sea n el nmero total de discos considerados. Sea desde la clavija inicial y hasta la
clavija final de descanso. La clavija temporal donde los discos descansan durante la
transferencia es temporal, elcualse calcula como sigue:

temporal = 6 - desde - hasta

Para mover n discos desde la clavija desde a la clavija hasta, primero debe
verificarse si n = 1. Si es as la solucin es trivial y es un solo movimiento. Si no,
descomponer el problema en tres sub-problemas y solucionarlos en secuencia como
sigue:

o
.
.

Mover

n-

temporal
Mover 1 disco desde la clavija desde hasta la clavija hasta
Mover n - i- discos desde la clavija temporal hasta la clavija hasta
1 discos desde la clavija desde a la clavija

El afgoritmo recursivo se describe en la siguiente funcin en C:

El cdigo C inicia aqu...

#include <stdio.h>
void t.ransferir(int
n, j,nt desde, int hasca/ ;
void transferir(int
n, int desde. int hasta) {
int temporal;
,/*Cuando e1 nmero de disco es uno*/
t
if (n == 1)
printf (r'Mover el disco tope de J_a clavija ?d \
a 1a clavi j a ?d \n" , desde, hasta) ;
else {
,/*Cuando e1 nmero de disco es ms de uno */
temporal = 6 - desde - hasta,.
/* Llamar a 1a funcin transferencia */
transferir (n-1, desde, temporal) ;
printf (,'Mover eI disco Eope de Ia clavija td \
hasta la clavija ?d \nu,desde, hasta),.
/*Llamar a l-a funcin transferencia */
transf erir (n- 1, temporal, hasta)

o
o
o
o
o
O
O

o
o
o
o

o
o
o

,.

b
b
b
b
!o
o

es:e:s:.:

Volumen 4:
@ Copyright IBM @rp.2002
Los materiales del curso no pusdn ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

lntroduccin a la Programacin con C

Gua del Estudiante

El program main ( ) es bastante sencillo.


mainO I
l_nE n.-

,/*Obt.ener la entrada de parte ciel usua::j_o*/


printf("fngresar
el nmero de d:sccs: ,, ;
ugdo,
scanf (
&n)
,/*Verif icar que nmero es Dcs: t i.,,c c :ta * r,
if (n<=o) {
printf (', Ingresar un nne-c Eos:::-,,c\..r,,)
,.

else

/*Llamar Ia. funcin tra:tsfe:::


transferir (n, 1, 3 ) ;

) /*Fin de la funcin main*,/


El cdigo C termina aqu
Se puede analizar ahora cuan bien (o pobremente) trabaja la funcin.
Asuma Que r (n)
es el nmero de movimentos una transferencia genera para n discos
de entrada. La
siguiente relacn se cumple bien y puede verificrse desde la funcin que
se acaba de
escribir.

r(1)
T

(n)

Por lo tanto, T (n)


movmentos.

=1
=

2*T

- 2

(n-1) +

paran>1

1. De esta

relacn,

se ve que se requiere 2o -

Fin del Ejempto 3.5


Despus de discutir la recursin con la ayuda de varios ejemplos,
se va a tratar de
entender la relacin entre recursin e iteracin.

3. Recursin vs. lteracin


Todas las soluciones recursivas pueden normalmente ser resueltas
usando iteraciones,
mientras al inverso no es verdadro. Un cdigo r".rrJuo
compacto, fcil de escribir y
fcil de entender- El cdigo, sin embargo, no ahora tiempo
"s ni espaci. pra problemas
sencillos como elfactoriaf, Fibonacci, etc., las soluciones lterativas
son ms econmicas
en trminos de espacio y tiempo.

Unidad 3: Recursin

Volumen 4: Funciones en
@

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducidos total


o parcialmente sin el permiso previo escrito de IBM

48

o|'
o
o
o
o
o

o
o

o
o
q
o

Gua del

Estudiante

lntroduccin a la Programacin con C

Resumen
Ahora que ha completado esta Unidad, usted debe ser capaz de:
Explicar la recursin
Discutir las varias condciones que necesitan ser satisfechas para que las
funciones recursivas trabajen conetamete
Describir cmo una funcin recursiva trabaja cuando se ejecuta
Definir el rol de la pila en la ejecucin de funciones recursivas

.
o
o
.

o
o
O

o
o
o
o
o
o
o

o
o
o
o
o
o
O

o
o
o
a
o
O

o
?
o
'

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso preo escrito de tBM

Introduccin a la programacin con C

Gua del Estudianie

Unidad 3: Exmen de Autoevaluacin


1) Recursin es una
a) Funcin que se invoca a s msma desde
b) Funcin que invoca a otra funcin

dentro de la misma funcin

c) Funcin que invoca a la funcin mai.n


d) Funcin que no invoca a otra funcin

2) El retorno de funciones

recursivas, cuando el trabajo est terminado, est

basado en ciertas condiciones.

a)
b)

Verdadero
Falso

3) Qu sucede con er siguiente


argumento es -4?

int factorial (inr n)


if (n==0)
TaFrrr

segmento de cdigo, cuando

el varor

{
.

else

return factoriat (n-1) *

n..

a) La funcin recursiva retorna son ilamarse as misma


b) La funcin recursiva se ejecuta dentro de un bucle infinito

c) La funcin recursiva retoma el factorial de 4


d) Ninguna de las anterores
4)

El estado de la funcin en la llamda recursiva se mantieneo


en
a) Una pila

b)

Un Heap

c)

Un rbol

d)

Ninguna de las anteriores


5) Las funciones recursivas son la forma ms eflciente
de resolver probfemas.
a) Verdadero

b)

Falso

o/ La recursin en er programa puede ser eriminada teniendo


a) Bucles for ejecutando un bloque de cdigo

b)

c)
d)

Bucles while ejecutando un bloque de cdigo


Bucles do while ejecutando un bfoque de cdigo
Todas las anteriores

Unidad 3: Recursin

Volumen 4: Funciones en
@

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducdos total


o parcialmente sin el permiso previo escrito de fBM

SO

del

o f
o
o
o
o
o
o
o
o
a

Gua del

7)

8)

o
o
o
o
o
o
o
o
o
o
o
o

c)
d)

9)

Falso

Cules de los siguientes problemas pueden solucionarse usando recursin?


a) Tones de Hanoi

b)

lntroduccin a la Programacin con

Una funcin recursiva no necesita un caso base para estar bien definida y es
@paz de terminar por s misma.
a) Verdadero

b)

o
o
o

Estudiante

Serie de Fibonacci
Sumatoria de una serie desde 0 hasta el infinito

Encontrar el mayor de dos nmeros


Recursin no es un proceso repetitivo.
a) Verdadero

b)

Falso
10) Indique que sucede cuando se ilama a una funcin recursiva

a) La funcin se llama a s misma con elvalor modificado de sus argumentos.


b) lincrementa la eficiencia de un programa.
c) Supera la limitacin del nmero de veces que un ciclo for invoca a una
funcin.

d)

El programa incrementa el rendimiento de la aplicacin.

o
a
o
a
a
a

@ Copyright IBM Corp.2002


Los materiales delcurso no pueden ser reprcducidos total
o parcialmente sin elpermiso previo escrito de IBM

lntroduccin a la programacin
con C

Gua del Estudiante

Respuestas a ta Unidad 3: Exmen


de Autoevaf uacin

1. a

2.a
3.b
4.a
5.b
6.d
7.b
8. ayb
9.b
10. a

Unidad 3: Recursin

Volumen 4: Funciores en

@ Copyright IBM Corp.2O02


, __
uos
materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermiso previo
de IBM

".'"rito

52

o
O

o
o
o
o
o
a
o

o
.if
o
ol'

Gua del Estudiante

Introduccin a la Programacin con C

Unidad 4: Laboratorio de Recursin


Objetivos de Aprend izaje
Al finalde esta unidad, usted ser capaz de:
Solucionar problemas usando la recursin como una tcnica
Desanolfar funciones recursivas en C para solucionar problemas especficos

.
.

Ol
oi''
o
oi
oi
Ol

$
d:
dd:
a
a

o
a
a

Volumen 4: Funciones
@ Copyright IBM C$p.2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permlso previo escrito de IBM

Introduccin a la programacin con C

Gua del Estudiante

Ejercicios de Laboratorios
1.

Escribir una funcin usando recursin para imprimir los nmeros desde
n hasta 0.
n es un entero positivo que es obtiene como entrada.

2.

Escribir una funcin recursiva que imprima una lnea que contenga exactamente
n asteriscos, n se da como entrada.

3.

Escribr una funcin recursiva que acepte un entero positivo pasado


como un
parmetro y devuelva un entero'con dos ocurrencias d cada
dibti;;'rr0".
si oor ejemplo, el nmero 123 es dado como entrada, la salida debe ser
112233.

Unidad 4: Laboratorio de Recursin

Volumen 4: Funciones en

@ Copyright tBM Corp- 2002


.
Los materales del curso no pueden ser reproducidos total
o parcialmente sin el permso previo escrito de IBM

54

oF
o
o
o
o
o
O"

o
o
o
o
o
o
a
o
o
o
o
o
o
o
o
o
o
o
o
o
o

---r-

I--n-

rI-1r-nt-E
---tr<F

-r

Introduccin a la
Programacin con

(Codgo del Curso: CY320)


Versin 2.0

Gua def Estudiante

Vofumen 5: Punteros

enc

o
o
o
o
o

o
o
o
o
o
;o

b
b

lo
lo
,o

o
o

IBM Learning Seruices


Worldwide Certified Material

Informacin de Publicacin

Esta publicacin ha sido producida usando Mcrosoft Word


2000 para Windows.

2O0O

y Microsoft Powerpoint

Marcas Registradas

IBM @ es una marca registrada de International Business Machines Corporation.

Otras compaas, productos y nombres de servicits pueden ser marcas comerciales o


marcas de servicio de otros.

Marcas Registradas de otras compaas como se muestra

Windows

Microsoft Corporation

Red Hat Linux

Red Hat

Edicin Septiembre de 2002

La informacin contenida en este documento no ha sido sometida a ninguna prueba


formal de IBM y es distribuida bsicamente "como es" sin ninguna garanta ya sea
expresa o implcita. El uso de esta informacin o la implementacin de cualquiera de
estas tcnicas es responsabilidad del comprador y depender de la habilidad de ste
para su evaluacin e ntegracin en el ambiente operacional del cliente. A pesar de que
cada tema ha sido revisado por IBM para su exactitud en una situacin especfica, no
hay garanta de obtener el mismo resultado o uno simifar a ste en otra situacjn. Los
clientes que intenten adaptar estas tcnicas a sus propios ambientes lo hacen bajo su

propio riesgo.

Copyright International Business Machines Corporation, 2002. Todos los derechos

reservados.

t,

ot
o'
O,'

Gua del Estudiante

Introduccin a la

o
o

Contenidos

Oir

oif
oi
ol

oi
ol,
o
o
I

Unidad 1: Punteros
Objetivos de Aprendizajes

l.

Fundamentos de Punteros

2. Usar Punteros para Pasar Argumentos a Funciones

Resumen

12

Unidad 1:Examen de Autoevaluacin

13

Respuestas a la Unidad 1: Examen de Autoevaluacin

l5

o
o

Unidad 2: Laboratorios de punteros


Objetivos de Aprendzaje

17

Ejercicios de Laboratorio

18

o
o
o

17

Unidad 3: Punteros Avanzados

19

Objetivos de Aprendizaje

19

o'

1. Introducccin

20

o
o
o
o
o
o
o
o

2. Aritmtca de Drecciones

20

3. Puntero a Puntero

25

4. Aneglo de Punteros

26

o
o
o
o
o
o

5. Puntero a Estructura

6. Puntero a una Funcn

Resumen
Unidad 3:Examen de Autoevaluacin

36

Respuestas a la Unidad 3. Examen de A_ltoevaluacin

?4.

Unidad 4: Laboratorio de Punteros Avanzados


Objetivos de Aprendizaje

39

Ejercicios de Laboratorio

40

I
lD

p
p

!o
lo

lo
fo

lo
lo
I

Volumen 5: Punteros en C

Unidad
Copyright tBM Gorp.2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de lBM.
@

l: Punteros

rt

oF
o:

.t

Gua del Estudiante

lntroduccin a la Programacin con

O'

Unidad 1: Punteros

o
Oi

q
d

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
)

Objetivos de Aprendizajes
Al finafizar esta unidad, usted ser capaz de:
.
Definir los punteros y describir su rol en la resolucin de problemas

.
'
.
'
'

Discutir los conceptos fundamentafes

memoria y referencias

de

punteros, variables, drecciones de

Explicar cmo hacer declaraciones de punteros

Discutir

el uso de tos punteros para pasar parmetros a las funciones

referencias

por

Explicar funciones que pueden recibr aneglos unidimensionales


como argumentos
a travs de punteros

i'olumen 5: Punteros en

@ Copyright tBM Corp. 2002


.
Los materiales del curso
pueden

Unidad 1:

no oueden ser reproducidos


reo
total
o parcialmente sin elpermiso previo escrito de lBM.

Punteros 1

Introduccin a la programacin
con

Fundamentos de punteros

En el vofumen anterior, se estudiaron


fas funciones en c. En este volumen se
discutir
uno de los conceptos ms importanies
de C, OJ prnteios.
un puntero es una variable en c que
representa una direccin de un efemento
de datos
en la memoria' un puntero
un oirecqo

memora donde un efemento de


dato inc' un elemento f l-oat,
"prtJ
"n un arregfo
un.elemento char,
o una estructura se
pueden encontrar. Los punteros
son importanter-;;;,
Son tifes para crear aplicaciones.

'

'

se pueden usar para pasar argumentos a funciones


por referencia.
son tiles para acceder a elementos individuales
de estructuras de datos tales
como anegros, estructuras y tpos de datos
definidos por er ,rruro.
se pueden usar para realizar asignacin dinmica de
memoria, es decir,
reseryar tanta memoria como lo requr=era
la estructura de datos , en vezde estar
timitado por anegtos de dimensoni

v t#n" ii",
Para entender er concepto de punteros,
se discute que sucede cuando
declara en un programa.

int x = 5; s

Este soficita at compilador de C que


haga lo sguiente:
Asignar (o realmente reservar) memoria para
almacenar el entero.
Asociar ef nombre x con la posicn de memora.
Almacenar elvafor entero 5 en esa posicin.

'
.
.

La Figura 1'1 brinda una representacn


grficade qu
X = 5; ' se proveen dos formas en las cuales la variable,sucede con la declaracin inr
contenidos y la direccin son
referenciados con uno de eilos especificaoos
en parntesis.
Nombre de la

variable
(Nombre de la
direccin)

----------->

----------+

Direccin de la
variable
(Direccin de 1a
variabl-e)
A continua",u,

435s8

Grrica para

::,ffintacin

int x -

Valor en fa
posi cin
(Contenido de
1a variable)
s;

("?d1r" , x) ;
Printf """t;:::

se imprime elvaror s. Vase etsiguiente


segmento de codigo:
Print.f ("?u1', &x);

Losmateria,".8"?:llJf

ll,,F,[.""",ii;??:_,;::::,''Pterd-Ez

o parcialmente sin el permiso previo

"rtto

de lBM.

o V
o t
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o

p
lD

Gua del Estudiante

lntroduccin a la Programacin con

El cdigo anterior no imprme elvalor de s, por el contraro


imprme el valor 436s8, el
cual esel nmerodelaposicinactual delavarablex.
Alavariablex seleasignar
una posicin diferente en memoria para diferentes
del mismo programa. En
printf, se us el especificador ?u que significaejecuciones
un entero sin signo, ya que las
direcciones son siempre positivas y almacenaas en una
cefda de memoria sin el bit de
sgno. El operador & es el operadoi de referenca o ,direccin
de'.
Ahora se le asigna &x a otra variabfe.
var_nombre __ &x,.
Como se vi &x S refiere a ta direccin de memoria de x
en vez de su valor. Sin
em!a19o, var-nombre ahora apunta a la direccin de la
ubicacin donde d vator de x
est almacenado, que en este caso es un nt. La Figura 1.2
muesra que var nombre
apunta a memoria

Valor de x, gue
cq

Figura 1.2: Relacn entre var_nombre y x

l.l.

Acceder a Valores Usando punteros

Se puede acceder al valor de la variable x usando el operador


de indireccin. El * se
usa como operador de indireccin en C. Tambin se le denomina
operador de
'desreferencia'. El operador de indireccin provee
el valor de ta variable x

indirectamente a travs de fa variable puntero, y no drectamente


a travs de la variable
misma' Por lo tanto, se puede acceder af valor de x como *var
nombre. Ahora bien,
si se escribe fa siguiente sentencia printf (,,?d1,, *r"r_ro*l;
, ," imprime s.
De manera que ambos x ! *var-no*bt" se refieren
al mismo elemento de datos (es
decir, el contenido de la mismZ posicin de memoria). Considere
fas siguientes

sentencias:

var_nombre = &x;
y = *var_nombre;
La primera sentencia coloca la dreccin de x (o el puntero
de la posicin de x) en la
var_nombre. La sengunda sentencia y = *var_nombre busca el valor
de x, el cual
es 5 / usando *var_nombre y lo asigna a y.
una variable puntero debe ser decfarada antes de que sea usada.
En general, una
declaracin de puntero se hace como sigue:

tipo-de-dato *variable3uncero,.

El tipo-de-dato se refiere al tipo de dato del objeto en

consideracin, y la
es el nombre de la variable puntero que se est declarando. Note
que.se debe preceder el nombre de la variabie puntero
con un carcter
Las
siguientes son afgunas dectaraciones vtidas oe puntros:-

variableiuntero

*.

inL *nombre_var;
float *temp;

Volumen 5: Punteros edr C

Unidad
Copyright tBM Corp.2002
Los materiafes der curso no pueden ser reproducrdos total
o parcialmente sin el permiso previo escrito de IBM
@

l: Punteros

Gua del Estudianie

char

*pva1,.

An cuando las declaraciones anteriores apuntan


a diferentes tipos de datos, las
variables punteros mismas sfo pueden
contener direcciones.
una variable puntero en la mbma decraracin
taf como se muestra a
ffiffij!,#cializar

int x, y,.
int *nombre_var = &x,.
En este caso, se le asigna la direccin de
x a fa variable nombre
var. En este
-;
ejemplo, se han decfarado dos variabres
enteras
;
i" ;ri,L puntero
nombre-war apuntando a una cantidad entera.
" ;,tam-bn
puede
se
tener la siguiente
declaracin, tat como se hizo con otras variables
en C:

int x, y;
int *nombre_var;
nombre_var = &x. /* se Le asigna la
direcci_n

de

x */

Aqu, a nombre_var se le asigna la direccin


de x.
Nota: En la sentenca de asignacin, no se precede
a la variable
rrutt'rrr
' v' rqvru nombre
CafCtef *.
-

var

coo e{

2- usar Punteros para pasar Argumentos


a Funciones
En c' el mtodo^n9ryal de pasar argumentos
a funciones es.a travs de parmetros por
vafor' cuando se pasa un argumenio como
un uri una funcin,-r" ri"." una copia
def elemento de dato dentro e la funcin.
Dentro de ra funcin todas las referencias
a
los argumentos a travs de los parmetros
formales son dirigidos a la copia. De manera
que si se modifica este elemento de
dato,.". r deitro oe la funion la que es
modificada y no la usada en la llamada.
El efecto de esta modificacin no puede ser
llevada a cabo sobre er programa que
ilam a ra funcin. si esto
cmo se
puede escribir una funcin llamada
", "ri,
swap que tome dos variables
enteras como
argumentos e intercambie su contenido?
una de las funciones importantes de los punteros
es que permiten pasar argumentos
por referencia, la cual contiene la
direccn der ;rgr;;"jo, a una funcin.
Este pase por
referencia se hace con punteros. Por pasar punteros
a
funciones
como
argumentos,
se
pasa una referencia en vez de un valor.
El parmetro formar
declarado especificamente con un asterisco ; precedinJoro. corespondiente debe ser
se sabe que cuando se LEan las siguientes funciones,
se estn pasando argumentos a
las funcones como valores (o parretros
por valor):
print.f (',Ho1a\n,, ) ;

Printf ( "?d1' , a) ;
prinLf("tf",
2 * sgrt(a / d));
y = facrorial (100);
Y = factorj-al (2 * a) ;
cuando un argumento se pasa como una referencia
(es decir, cuando un puntero se
pasa a una funcn), fa direccin
del elemento oe o"io s" pasa a fa funcin y
no su
vr rrvqv

l. r ul tt

Volumen 5: pGros-en
Lo

s m a te ri a,". ?"? Slliin i 1,, 3,[ 3T?;? ?3


l,.oo u" o os tota I
o parcialmente sin el permso previo escrto cte
lBM.

C7-

o
o
o
o
o
o
o
o
o
o

Gua def Estudiante

valor' El contenido de la posicin (es decir, el elemento


de dato) se pueder acceder sin
ninguna restriccin dentro de la ferncin. si se hace
cuatquier modificacin al elemento
de dato (el contenilo. de la posicin de memoria usanoo
este puntero, los cambios
realizados sern reflejados tanto dentro de la funin
como en el programa que est
llamando a fa funcin.'
cuando un puntero se usa como un argumento, ofrece
ef acceso y la capacidad de
alterar las variables gfobalmente desde dntro de
la funin. sin
debe ser
cuidadoso cuando se pasan punteros coTo argumentos,
ya "r"r!o,le
que son capaces de
modificar elementos de datos s la.funcion quJ lima.
eso peo"
veces
resultar en un efecto de ondas de cambios en otias
,1. der program "rgun",
A continuacin se presentan algunos ejempfos para entender cmo trabajar
con
punteros.

o
o

o
o

Ejemplo

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

O'

oi
ol
o,l

o
oi
ot

lntroduccin a la Programacin con C

I,
I.

l
I

t,

l.l:

Funcin para tntercambiar de Variabtes

El problema es escribir una funcin para intercambiar el


contenido de dos variables
enteras. Se invoca la funcin como sigue:

intercambiar (ax, ay)

inLercambiar para reafizar esta tarea es como sigue:


void intercambiar(int *p, int *g) {
/* Note los argumentos formales */
int. t.emp,.
/* Contenido de p se almacena en temD */
temp = *p..
/* Contenido de q se mueve a p */

La funcin

*n

*a.

/* Contenido de temp (p) a q */


-g = temp;
return;
Los comentarios exprican ertrabajo de ra funcin
compfetamente.

Fin del Ejempto

l.i

Generalmente, una funcin toma varias entradas y produce


una salida de un solo valor.
As que, las entradas pasadas como argumentos
a la funcin no deben ser modificadas
dentro de la funcin. An si se modifican, sus consecuencias
no deben afectar afuera al
programa que llam a la funcin.
Esto se debe a que todos los parmetros para
una funcin en c son pasados por valor.
En el caso que un vafor modifcado tiene.que rui
run""co fuera en el programa que
llama a la tuncin, una referencia (puntero)
intercambiar, x e y se declaran como variables plnt"ror.a h tuncin. En ra funcin
Ft :f prximo ejemplo, se presenta cmo se pasa un anegto como un parmetro a una
funcin.

; t;;

Volumen 5: punteros en C

Unidad
Copyright IBM Corp.2002
Los materiales derorrso no pueen'seiiproducidos
totat
o parcialmente sin ef permlso previo escrito de IBM
@

It

l: Punteros

ramacn con C

Ejempfo 1.2: sumar todos ros Nmeros rmpares en un Arregro

Considere un arreglo unidimensional llamado vector, que tiene


100 elementos
enteros' Se va a escribir una funcn sum-impar, que toma un
vector como entrada y
retoma la suma de todos sus elementos irnpars- La funcin ma jn (
ser

void

main

como sigue:

O i

int vect.or [100] ;


frirrtr(..La

suma de los elementos impares


sum_impar (vector) ) ;

es ?d\n,,, \

El prototipo de funcin y el argumento formal a la funcin se escribe


como sigue:

int sum_impar(int vector l,l) ; /" No se especifica

tamao */

Tambn se puede escribir como sigue:

,/*Escrito usando notacin de punteros */


int sum_impar(int *vect.or),.
Ambas son formas correctas de especificar la declaracin de la funcn
cuando un
aneglo se pasa como un argumento. Et ltimo se usa con ms frecuencia
que el
primero. En ambos casos, int vector
y *vector declaran slo un puntero como
[]
el argumento formaf. El punto importante notar aqu, es que en c lo;
anegfos se

pasan a las funciones sfo como referencias. El


nombie del arreglo contiene la direccin
base, la cual es la direccin del primer elemento det arreglo. Esta
direccin base se
pasa a la funcin. De manera que, cualquier modificacin
r"
nug en la funcin a
{r"
una aneglo se refleja en la funcin que la invoc.
La funcin para este ejemplo de presenta a continuacin:

int

(int *vector) i
.
lnt sum = O, k;
/" nr bucle carcula ra suma de los nmeros impares *7
/* de 1os elementos de un arreglo*/
for (k = 0; k < 100; k++)
/* verifica si e1 elemento des impar o no */
if (vecrorlkl Z 2 != O)
sum = sum + vector [k]
return (sum),.

sum_impar

,.

Fin del Ejempto 1.2


A continuacin se discute cmo pasar arregtos a la funcin scanf (
).

@ Copyright IBM Corp.2002


Los materiares der curso no pueden ser reproducidos total
o parcialmente sin el permiso prevo escrito de lBM.

j,

a
a
o
o
o
o
o
o
a

o
o
o
o
a
o
o
o;
o:

o
o
o
o
o
O

o
O

o
o

o
a
o
o
O

p
p

l.
o
o
o

Gua del Estudiante

ramacin con C

2.1. Pasar Arreglos a scanf

()

se sabe que para feer variables

int, f 1oat, y char se debe usar la funcin


precedidas por un carcter & , tal como se ilustra a
continuacin:
int x; float p; char

1)

ch,.

scanf (,'*d Zf tc", &x, &p, &ch);


Sin embargo, cuando se intenta feer cadenas en un anegfo,
scanf
carcter c.
char fnombre [45] ;
scanf(*?s,,, fnombre); /* Ntese que no se usa & */

scanf

sr-:nf

O no requiere el

require la dreccin de manera que los elementos de datos


se puedan almacenar

en la ubicacin coffecta. Por to tanto se debe suministrar como


6x, &p y &ch. Dado
que fnombre es el nombre de un.arreglo que representa
una direccn, y no un
efemento de dato o un valor, este no debe star pr"."io por
un & en scanf .
A contnuacin, se
pueden
se
calcular las direcciones en los arreglos y
9slug'.a Tto
ubicar elementos individuales
en tbs arregtos. Tambin rJ i"no"ii
tos

subndices y direcciones trabajan juntos.

"oro

2.2. Aritmtica de Direcciones


Se va a disctfir brevemente fa aritmtica de direcciones. Una
discusin ms detallada
se da en la unidad 3 - Punteros Avanzados de este volumen.
un nombre e anegto es
reafmente un puntero al prmer elemento del areglo. S
caj a es un arreglo
unidmensional, la direccn del primer elemento peoe
ser referenciado como
&caja[0] o slo caja- Las direcciones de los otros elementos
se pueden obtener
como sigue:
zd" elemento

3"'elemento

caj a [1]
&caja [2]

imo elemento

&caja

(i+1)moefemento

ccajalil

Ii -1]

o
o

(caja + r)
(caja + 2)

(caja+i-1)

(caja + i)

Ahora se tienen dos formas de escribir as direcciones


de tos elementos de un arreglo,

ccaja[i] ycaja + i-

Notequelaexpresincaja + ivaasertratadacomouna

expresin especial que suma la direccin del primei


elemento de caj a e i . por lo
tanto, fa expresin caj a + i es una representacin
simblica de ,n, p""ificacin de
direccin, en vez de una expresin aritmtica. se puece
usar esta'expresin sin
importar el tipo de efementos en el areglo. Estr
significa que la expresi caja + i
ser vlida para variabfes char (que toma un byte p=or
elemento) as 6mo f loar (que
toma 8 bytes por elemento).
El sunndice i tambin se llama desplazamiento (offsefl
en este contexto. Si cca j a Ii]
Y (caja + i) se refieren a ra misma direccin, entonces cajatir y *(caja
+ i)
deben referir al mismo contenido de las direcciones,
es decir, el valor del (i+t)mo
elemento de caj a. Entender este concepto proporciona
suficiente informacin para
Volumen 5: punteros en C

Unidad

Copyright tBM Cr:rrp.2002


Los materiales del qrso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
@

l: Punteros

poder escrbir funciones que


tomen un aneglo unidimensional
como entrada y actuar
sobre ste' Los siguientes oo"";"rpros
irustran este punto.
Ejempfo l'4: Encontrar Efementos
en un Arregfo usando una Bsqueda
Lineaf
considere un anegfo de enteros
ftamado caja que tiene 100 elementos.
Ef problema es
escribir una funcin lfamada
busgueda que tome como entrada ta
direccin def primer
elemento del arregfo, el nmeioiJi
o"'"rementoi-eriet arregto y er nmero
que se
en eicur er nmero que se

ff:tr3J:tr"i}yfl::h-*Jil"'gT,'il;1f"?,f

s.e usar un argoritmo simpre, donde.


ra bsqueda se- comienza desde
eremento en er arregfo y se contina
ef primer
buscanob a ir*, der arregro
elemento se encuentre o hasta q;;
hasta que el
r" haya reconioo-tooo el arreglo. Esto se

llama
ff :,T;i3 jffi fl #i,x,:J:,:nn#,,1;#:;"";l"hasta"i,t,;;mento,o

int busqueda (int *caja, int n,


int numb) i
/* n es el tamao del arreg10, numb
es e1 nmero buscado *,/
int k,.
k = 0; /* desplazamient.o para
e1 acceso al arreglo */
while ,O . n) {
if (" (caa + k) == numb)
rerurn (k) ;
el co

k++,.

/* nI controf

del programa se alcanza aqu cuando


el numb no se encontr * /
recurn (-1);

Enel parmetroformal, serecibla_direccindel


prinerelementodel arregro
expresin * (caja + k) ayuda
a acceder secuenciarmente n, r",n*iJs caja.La
oer anegro
de tumo, ya que k va desde o hasta
n-t.
Inciarmente,
cuando
k es 0, se est
-cuando
realmente refiriendo al primer
efemento
t es 1, se accede ar
prximo elemento' y as ucesivamente. der a'egroEn un ouciterativo, si todos los
elementos det
er numb, sto se hace rerurn
paraindicar

fi':t"'l;f"Xifl:J
Ef

(-t)

ffiff:contr

siguiente es el programa completo


que implementa ta bsqueda lineaf:
Elcdigo C incia aqu...

#include <sE.dio. h>


int busqueda (int *caja, int tam,
int
mainO

num),.

Lo

s m a re ri a,". ?"?lll# ll, [0"".,i1


?:;,".
i
o parcialmente sin elpermiso previo
"?

escrito de lBM.

a
o
o

Gua del

Estudiante

inr caja[100], k, tam, num;


/* Leer el tamao del arreglo*/
printf ( "fngresar e1 tamao del arreglo [1, 100] \n', ) ;
oot
scanf (u?d", &tam) ;
) while (tam < r ll tam > 100);
/* Ieer e1 arreglo mismo */
for (k = O; k < tam; ki+) i
printf("fngresar 1os elementos de1 arreqlo\
?d\n", k) ;
scanf ( "?du, ccaja Ik] ) ;

o
O
O

a
a

a
o
a
o

/* Leer el nmero a ser buscado */


printf ("Ingresar e1 nmero gue a buscar\n"),.
scanf(n?d", &num);/* Invocar busqueda e imprimir eI resultado *,/
if (busgueda(caja, tam, num) -= -1)
printf("?d no fue encontrado en eI arreglo\
\ft,,, num) ;

o
o
o
o
o

o
o
o
o
o
o
o
o
o
o

Introduccin a la Prooramacin con C

else

printf("*d fue encontrado en e1 arreglo\


\n", num) ;
)

int

busgueda

*ni:

lin|-

-*J

int k
whi ]e (k < tam)
if

inl-

'

f-qlltr
--

in
rlu

-'.-\
tlull,/

(*(caja + k) == num)
return (k) ;
/*num encontrado en k

ef se
k++;

o
o
o
a
o
o
o
a
o
o
o
o
o

ret.urn (-1) ;

o
o

/*

num no encontrado * /

]
El cdigo C finaliza aqu
Fin del Ejemplo 1.4
En el ejemplo anterior, se ha pasado elaneglo como argumento a la funcih busqueda.
La direccin del primer elemento del aneglo se pasa a la funcin, la cual es aceptada
como un puntero en la funcin.

Volumen 5: Punteros en C

Unidad
Corp.2002
Los materiales del curso no puden sr reproducidos total
o parcalmente sn elpermso previo escrito de IBM

'

@ Copyright IBM

l: Punteros

Introduccin a la Programacin con

Gua del Estudiante

Ejemplo 1.5: ltercambiar los Elementos de un Arreglo

int

Considere
caja t1001 como la entrada. Se debe escribir y usar una funcin una
funcin llamada intercambiar, la cuat anegla el anegb d elementos en orden
inverso. Un algoritmo simple para esto es conlderar el primet elemento (tope) y et
ltimo elemento (base), y intercambiar sus contenidos. Entonces se mueve'at'primo
elemento desde ef tope y al elemento previo a la base y se intercambia sus contenidos.
El proceso contina hasta que la mitad del aneglo se haya recorrido. El siguiente
programa realiza esa la tarea:

Elcdigo C inicia aqu...

#include <stdio.h>
void reverse(int *caja, int n);
void swap (int *x, int *y);
mainO {
i-nt ca j a [100] , k, n;
/* Leer el Eamao deI arreglo */
printf ('t rngresar e1 tamao de1 arreglo [1, 100] \n',
qot
scanf ( u?du, en) ;
) whiJ-e (n < 1 ll n > 1oo);

/* Ieer el arreglo mismo */


for(k=0;k<n;k++)
{
printf("rngresar el elemento ?d del
arreglo\n", k) ;
scanf ( r?d", &caja [k] ) ;
]

,/* Imprimir el arreglo en su ftr*. original


printf ( "f mprimir eI arreglo original\n" )
for (k = 0,. k < n; k++)
print.f ("?d\',, caja [k] ) ;
,.

/* invertir el orden de1 arreglo */


inEercambiar (caja, n) ;
/* imprimir e1 arreglo inverLido */
prinLf ( "81 arreglo invertido es: \n" ) ;
for (k = g; k . n; k++)
printf (,,?d1u , caja [k] ) ;

Copyright IBM Corp.2O02

Los materiales delcurso no pueden ser reproducidos total


o parcialmente sin el permiso previo escrito de lBM.

*,/

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

t?

Estudiante

Gua del

Introduccin a la programacin con C

/* Funcin que intercambia va1ores */


*caja, int n) {
vold intercambiar(int

rnt tope = 0, base,base=n-1;


while (tope < base)
cambiar (caja

COpe++;
base - -

{
+

tope, caja + base)

,-

,.

)
rtrtr.

,z* Funcin que cambia l-os walores */


void cambiar(int *p, int *q) {

int

temp,.

temP

*P,'

*p = *q;
*q = temp,'
return;

p almacenado en temp
l-nn t- cn i n
de q movido a p */
/* Contenido ue
^^ temp (p) a q */
*
//

(1^f
a
vvruvqv

i Aa

de

,/ *

El cdigo G termina aqu

o
o
o
o
o
o
o

Volumen 5: Punteros' en C

Unidad

Copyright IBM Corp.2002


Los materiales del c[Jrso no pueden ser reproducldos total
o parcialmente sin el permiso prcvo escrito de,lBM
@

11

Introduccin a la Programacin con

Gua del Estudiante

Resumen
Ahora que ha completado esta unidad, usted ser capaz de:
Definir punteros, y describir su rol en la resolucin de problemas
Discutir los conceptos fundamentales de punteros, variables, posiciones
de
memorias y referencias
Explicar cmo hacer declaraciones de punteros
Dscutir el uso de punteros para pasar parmetros a funciones por
referencia
Explicar funciones que pueden recbr arreglos unidiemensionaies como
argumentos a travs de punteros.

.
'
'

Copyright tBM Corp.2002

Los materiales del curso no pueden ser reproducidos total


o parcalmente sin el permiso previo escrito de lBM.

Gua del Estudiante

a
o

amacion con

1)

En el parmetro formalde una funcin, cmo se declara

a) int *arreglo
b) int arregto []
c) int arreglo

rf
v5

f'E

2)

arreqro?

d) Todas tas anteriores


Cuando se pasa un arreglo como argumento a una funcin que ha declarado una
variable de puntero en el parmetro formal, fo que realmente se pasa es
Nmero de elementos delareglo
Dimensin delanegfo

a)
b)
c) Los valores enteros que constituyen el arreglo
d) La direccin del primer elemento del arreglo

3) Cules de los siguientes es la fornia correcta de declarar un puntero inreger?


a) int x;
b) int *X,.
c) int 'tx = 3;

4)

d)

Ninguna de las anteriores

Cules de los siguientes son formas correctas de declarar un puntero f


a) float x,.

b) f loat *xi
c) float *x =

5)

d)

3;

Ninguna de las anteriores

Cules de las siguientes son usos vlidos, cuando el arreglo


se declara?
,
a) scanf (.,?c,' , &caja iOl ) ;

b) scanf (..?s" , &caj a)


c) scanf (..?so, caja) ;

6)

loat?

char caja tlol

,.

d)

Ninguna de las anteriores


Variables punteros como int, f
Verdadero

a)
b)

loat, char

pueden solo almacenar direcciones.

Falso

o
o
o

o
o
o
o
o
o
o

Unidad l:Examen de Autoevaluacin

.iI

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Introduccin a la p

\/oJumen 5: Punteros en C

Unidad
Copyright tBM Corp. 2002
Los materiales del c{.rrso no pueden ser reproducidos total
o parcialmente sln el permiso previo escrito de IBM
@

l: Punteros 13

7)

un aneglo se pasa

a una funcin como un parmetro, qu se pasa


ar
:f&fli"
a) Los contenidos def aneglo
b) El contenido def primer elemento def aneglo
c) La dreccin delprimer elemento delarreglo
d) Ninguna de tas anteriores
8) En la llamada a la funcin f i (ep), fa direccin de una ubicacin
de memoria se
est pasando a la funcin.
a) Verdadero
b) Fatso
9) Para la declaracin inr a[100] inr i, cures de
fos siguientes es una
exprecin especial, y no una expresin
aritmtica iegutar.
a) (a + i

b) (*a + j,
c) *(a + jr
d) (*a + *j)

10)

Para la declaracin
la referencia _

inL

t1001 e

inr j,

la expresin *

(a + j )

es equivalente a

a) a Ij -rl
b) a [j +1]
c)a
d) aijl

Pun t'eros

;"

Los materia,", ?"?lllJinli'i[.""?i?;??:;,"J"",


o parcialmente sin el permiso previo escrito
de fBM.

-en

ol
of
olF
oljr
o

ol,
oli
oltlr
ol:
ol,
ol
oi

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del

Estudiante

Introduccin a la program

Respuestas a la unidad

a: ,- ,-- -

l: Examen de Autoevaluacin

1) ayb
2)d
3)b
4)b
5) ayc
6)a
7)c
8)a
9)c
10)

o
o
o
o
a
o
o
o
o
o
a
?
?
o

tI
ti
?
o

Volumen 5: Punteros ten C

Unidad 1:
Copyright IBM Corp.2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

.1

Punteros

15

o ?
o ,f
o
o
o
o
o
o
o

o
o
o

Gua del

Estudiante

Introduccin a la programacrn

cc-

Unidad 2: Laboratorios de Punteros


Objetivos de Ap rend izaje
Af finalizar esta unidad, usted ser capaz de:
Usar punteros para manejar soluciones a problemas
Escribir programas en C que implemente algoritmos que involucran el uso de
punteros

.
.

Pasar aneglos unidimensinales a funciones usando punteros

o
o
o
o
o

o
o
o
o
o
o
a
o
o
o
o
o
o
o
o
o
o

Volumen 5: Punteros en C

Unidad 2: Laboratorios de punteros

@ Copyright IBM Corp. 2002

Los materiales delcurco no pueden ser reproducidos total


o parcialmente sin el permiso previo escrito de IBM

17

Introduccin a la programacin con C

Gua del Estudiante

Ejercicios de Laboratorio
1)

Considere un anegfo unidimensional que contiene


un mximo de 1OO enteros.
Escribia tas siguientes funciones:

a) l-eer-entrada lee los valores del aneglo del usuario .


elementos a ser ledos N.

dado el nmero de

b) ordenar-ascendente toma como entrada un puntero a un anegro,


ra
posicin de inicio y fin der anegro, y
ordena ros elementos en orden
ascendente.

C) ordenar_descendente tOma como entrada un puntero a un


arreglo, la
posicin de inicio V fin del arreglo, y
ordena /os ejernentos en orden
descendente.

d) imprimir-salida toma un puntero


arreglo en la forma taf como est.

a un arreglo corno ent;-ada r;. e rmprime el

Escribir una funcifi main que tome como entrada (indica


rv
ei nmero de elementos en
el arregfo), ingrese los valoies def areglo, imprima
el'arreglo origrnai. orcene la primera
mitad del arreglo en orden ascenden'te, la seguna
mo en orden descendente e
imprima el aneglo asiordenado.

@ Copyright tBM Corp.2002


Los materiales der curso no pueden ser reproducidos total
o parcialmente sn el permiso previo escrito de lBM.

o1

o
o
o
o
o
o
o
o
o
o
O

o
a
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua dei Estudiante

Introduccin a la Proqramacin con C

Unidad 3: Punteros Avanzados


Objetivos de Aprend izaje
Al finalizar esta unidad, usted ser capaz de:
. Explicar la aritmtca de direccbnes
. Describir un puntero a puntero y un arreglo de punteros
. Discutir cmo decfarar y usar punteros con estructuras
' Explicar cmo pasar funciones como argumentos a otras funciones a travs de
punteros

o
o
o
o
o
o
o
o
o
o

o
o
o
o
a

a
o

Volumen 5: Punteros en C

Unidad 3: Punteros
Copyright tBM Corp. 2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo esoito de IBM
@

Avanzados lg

Introduccin a la programacin
con

Gua del Estudiante

l. lntroducccin
Los punteros
:oL importantes en cualquier esfuerz o pararesolver problemas, tal como
se estudi en la
unidad 1 - Punteros. qh est uai, se
aprender un poco ms acerca
de los punteros y sus usos. Para recalcar,
ru pr"'o edrar
para cuafquier
tipo de dato' se t'b"..g.Y9 c provee
tipos de datos estndar como inr, floar
o char.
Le da adems la posibitiaad af programador
de decfarar tipos oe oatoi'definidos por
el
usuario' Estos se definen con fa ayuda
de estiuctuig.v oe_ rlpedefs. Dado que
los
definidos por er rsuario estn prritior,
c p"irit" ar punteros

pr;i;;

:ffi"ir"r"ftos

Debido a que el puntero es otro tipo


de dato en c, se le debe permtir al programador
declarar un puntero de este tipo de dato.
A u""",'", n"a"r"rio pasar funciones como
argumentos a otras funciones. Esto
slo puede nacrse co n la ayuda de punteros,
"u
al
e s
n oa o co n,
c o n p ra
ff ,"5H,. il j,t;['fl: I I i,lli"il ;
" ",
"s,:

;; ;;;

j.

2. Aritmtica de Direcciones
se sabe que un tipo de dato es un.coniunto
sore e//os. Considere la siguient eclaracin:de valores ms las operaciones definidas

int *ptr;

Esto indica que

ptr

es

una variable que pertenece al tipo de


dato int *. inr * es del
tipo de dato puntero' La variable puntero
ptr
puede contene.r cualquier varor que
corresponda a una posicin en la mem
oria I qr"'p"rt"nece al tipo de dato
entero. El
fenguaje c permite sfo dos op"r""ion"s,
adiin y resta, sobre las variables punteros.
Lo importante acerca de los punteros
es que la variable puntero est asociada
con un
tipo de dato. por lo tanto, se pueo

Jecfarar ro ,igun1.

inf

*'iF?.
LL/LL,

. char *cpLr,.
float *fptr,.
Estas tres variables punteros son diferentes
en naturale za, an cuando ellas todas
almacenan la direccin.de una pson
p"r"
r"roi.
la aritmtica de
direcciones' el tipo. de.dato at qle el puntero
".rl est asocado esentender
significante. Este es el
qL,e invorucra
:11Hff"".:i"Yr?$*T or" se usa en er crcuro de ta

"*pi"riJn

La aritmtica de direccjones se usa para


mover el puntero a la prxima posicin
memora (donde la asignacin oe mlmoria
en la
contig-es-runoamental), para acceder
al
elemento afmacenado en esa posicn.
La aritmiica de drecciones normalmente
se
aplica cuando se usa con arreglos. La
aritmtica de dircciones no se puede
usar con
tipos de datos como int o
porque el contenido de la prxima posicin
no se
conoce' Tanto fos aneglos unidimesionales
como r-ooimensionales se almacenan
en posiciones de memoria contiguas.

"Lr

'-

; * 8"?lllJin I l,' F.[&",i',;? ?:;,"


"",'
",
o parcialmente
sin el permiso previo

escrto cte tBM.

A
t

.F
of
o:f

o
o

O
o,l

oj
a
o

o
O

Gua del Estudiante

Introduccin a la P

2.1. Operaciones Usando punteros


Es interesante notarcmo C integra punteros, arreglos yaritmtica de direcciones. Lcs
arreglos en C implcitamente usan aritmtica d direcciones para acceder a sus
elementos. Se dscutir al respecto posteriormente. A continuacin se presenta la

declaracin de un arreglo de enteros que se usar en fa discusn:

int arreglo[10] = {ro,2o,3o,40,So,6O,jO,8o,90,rOO};


'rt *ptr = arreglo;
Se sabe que el nombre de un aneglo almacena la direccin de su oensimo elemento.

Esta direccin se asigna a la variable puntero pLr, como se muestra en la Figura


3.1.

Direccin
de Memoria
de la
Posicin

o
a

o
o

1028
1030

1032

a
a
a

1034
1036

o
o
o
o
o
o
o

o
a
o
o
o

t
t

p
lp
lp

o
o

1038

1040

1M2
1044
1046

ptr
e{emento de arreglo. Se puede

Figura 3.1: Direcciones de la Variable Puntero

ptr

arreglo Y
apuntan al primer
usar
cualquiera de las siguientes cuatro formas para acceder a los elementos d arreqLo:
Ambos

o drr91o [i]
o *(arreglo + i)
. ptr [i]
. *(ptr + i)

En los cuatro mtodos se obtiene el valor almacenado en la posicin (i+1)isima en

arreslo- El lenguaje C aplica aritmtica de direcciones para recuperar el valor


almacendo en la posicin (i+r isirna. para entender cmo se hace, vase
la sintaxis

de las tres posibles operaciones sobre los punteros:


<variable puntero> + <operando entero>
<variable puntero> - <operando entero>

<variablel puntero> - <variabl"e2 puntero>


Volumen 5: Punteros eh C

Unidad 3: Punterc
@ Copyright tBM Crirp. 2002

Los materiales del curso no pueden ser reproducldos totat


o parcialmente sin el permiso previo escrto de IBM

Avanzados

21

Guia del Esiucian:e

2.2. Usar el Operador de Adicin con punteros


En fa primera operacin, la direccin.
en la variable puntero se torna, y se mueve por
e/
nmero representado por un opendo
entero. consioere ro sguiente:
ptr + 4;
Ef valor retornado es otra direccin, ra
cuarse carcura como sigue:

pEr + 4 * sizeof(tipo_de_dato)
si el tipo de dato.es. un integer, y se asume. q*
oo, bytes (se asumir esto para
por et sisiema oprativo p.r" ud" entero, d
ta
;?r"",:",ff r5"HHoJ"Lln "rnados
PCr+4t'2

prr + B
De este modo, si a pcr se re ha asignado
Esto es equivafente

ra direccin roze, Ia expresin ptr


+4
resurtar en 103e, donde ef 5ro eremento
est disponibre. Note que ro:e _ 1028
eS
ocho bytes, y dado que cada entero ocupa dos bytes,
el
nmero
actual
de
elementos
pasado es sfo cuatro' Esta es la
razn porque
de dato asociado con una
variable puntero es importante.
"t-iipo

2.3. Usar ef Operador de Resta con punteros


La segunda operaCi, <variable puntero> _
<operando enteror, trabaja Como el
caso anterior' excepto que resta ef nmero
de ovt"r,-y se posiciona en un elemento
antes de la variable punrero.
La tefcefa OpefaCin, <variabl-e1 puntero> _
<variable2 puntero>, es diferente,
ya que produce como resultado el nmero
oe element, pr"r"ntes entre estos dos
valores punteros. una vez entendjdos r";-;;;,
bsicos de aritmtica de

fl[::':ffi:

;:."3J:sresa

ar ejempro

q," r";f

;;;J" de enteros p"

"orprender

Ya se ha visto que
ptr + 10;
apunta al 10'o efemento despus de ptr.
Da.do euo arrg1o alarnacena la
direccin de
su primer elemento, arreglo + i retorna
ef mismo varoi que prr + i. sin embargo,
existe una diferencia entre los dos, fo cuat
se aprendern en la prxima seccin. para
obtener el elemento en arreglo + i
! prr + i S debe usar er operador de
desreferencia *' Asse indicar * (arregl0
+ i) y * (prr + i) respectivamente.
arregl0
y
son diferentes formas de expresar *(arresl0
+ i) y *(ptr *
respectivamente. As, cuando se dice
er compirador est reafmente
realizando el siguiente cfculo:

i)'

til ptrtil

ptrtii,

"(ptr + i * sizeof(tipo_de_dato))
En ef ejemplo, ptr [4i ef elemento en
fa q.rinta poscin es recuperado usando la
frmula .(ptr + 4. 2) que es so. Aqu,
arreglo
contiene
Lo28 + 4 * zda.1o36, y *(1036) oa ei elemento la direccin Lo2B.por lo que
que est almacenado

en esa
dreccin de memoria, el cul es so.
Nota: usando el operador de desreferencia de
ta direccin se obtiene ef etemento de
esa posicin.

Losmateria,""?"?3llJ"nil,,i[3",ir";??33,,oo,",oostotar
o parcialmente sin el permiso previo escrito
de lBM.

o
o
o
o
o
o
o
o ltt:tl
o
o lrlf
o
o
o

o'
o
o
o
o
o
o

o
o
o
o
o
a
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin a la

ramacin con

Similarmente, arreglotal tambin recupera el elemento s0, ya que usa la misma


frmula subyacente para acceder al elemento.
Sea el sguiente segmento de cdigo.
pr = arreg1o,.

ptr = ptr + 4,.


Printf ("?d1", * (ptr t
pcr=ptr-2;
Printf (u?d\n', * (ptr) ) ;

/* 1-028 asignado a p:ur */


/* plr 1e es ahora asignado 1036 * /
/* salida so * /
./" ptr Ie es asignado ahora 1032 */
/* Ia salida es 30 */

Ya que ptr es una variable puntero, a sta se le puede reasignar nuevos valores.
Se
puede mover hacia ariba o haca abajo en el areglo. Sin embargo, se debe
tener
cudado de no acceder a elementos ms afl de los lmites delareglya que C no
tiene
un mecansmo incorporado para la verificacin de los lmites del angl. Eiprogramador
debe ser, por lo tanto, muy cuidadoso. Tome por ejemplo, las siguierit,es delaracones:

ptr=ptr_4;
"(Ptr=*(Ptr)+10;

Se asignar dentro de ptr el valor 1024, y un valor r-0 ser sumado alelemento en
esa
posicn' Sin embargo, 7024 no est dentro de los lmites del areglo que
se ha
declarado, el cual comenza a partir de roze. Ms an, con este uso nconecto de la
resta en
se pudo haber modificado el valor de alguna otra variable que no se
debera modificar. A pesar de que los punteros son extremadamente tiles en certas
stuaciones, estos pueden ser una pesadilla para el programador si se usan
incorrectamente.

ptr

Para entender las operacones de resta cuando dos variables punteros estn

invofucradas, vase la siguiente declaracin:

int arreglo [10] = {ro ,20 ,30,40,50, 60 ,7o, Bo, g0,100 } ;


in *pt.r1 = arreglo;
int *pEr2 = arreglo + 5;
Se han declarado dos^ varables punteros, cada uno asignada a dos diferentes
poscones eh arreglo. Se muestra en la Figura 3.2.

t
I

i
P

\/olumen 5: Punteros en C

Unidad 3: Punteros Avanzados 23


Copyright tBM Corp.2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

Gua del Estudiante

Direccin
de
Memoria
de la
Posicn

1028
1030

1032
1034
1036
1038
10i0

1042

1044

1M6
Figure 3.2: Dos Variabfes punteros

La expresin ptrz _ prrl resultar


en un vafor entero equivalente al nmero
de
objetos presentes entre estas dos variables.
Ef clcufo se realiza como sigue:
(ptr2 - ptrr) /sizeof (Lipo de
_dat.o)
Esto es iguat a (103g _ 1O2g)/2
10/2
=
=S
Esto significa que hay cinco objectos
enteros desde prrl pLr2. La suma
de fas dos
variables punteros no es significativa por
razones obvias.
se present en fa seccin anterior
punteros' Hasta ahora se ha visto como se realiza la operacin de adicin usando
que usar el nombre del areglo cuando
se reatizan
operaciones
aritmtca de direcciones es fo rro que
usar ef nombre de una
varable puntero (la cual apunta al
reglo) para la
operacin. sin embargo, la
operacin de resla- no debe ser eiecutda
con
ef
nombre
del areglo. El compifador
reserva memoria para tn anegro, y er
espaco ocuaoo por r-Jrr"gro durante
ra
ejecucin del orograma no debe alterarse.
Ef nombre'der aneglo contiene fa direccin
del primer efemen"to, er cur no
,"r cambiado durante la ejecucin det programa.
As' se puede decir que d valoilr!J"
oe L ireccion mntnio"
el nomoi Je-r a'eglo,
una constante' y el-nombre del areglo
"nconstante. Restar un es
significa ui" piit"ro
vator
de a este puntero constante no tenra
"ti, v"
resuttar en una ireccin que
con ra direccin usada en ra opeacion.
Sea por ejempro ra siguiente

rir"

ffi?il:i:

arreglo _

Esta resulta en una posicin que est


antes de roza, que no es parte detarreglo que
se
ha declarado, teniendo en cuenta
!r ,"", resta en aneglos no tiene sentido.
Ahora se aprender como decfarar un puntero
a un puntero.

,-

;";,", 3"? llfin lf F,[o""To,;?


""o parcialmente sin
el permiso previo
'

?33,,

escrito de lBM.

:F
?lf
ril
o1

.ll
:il

Gua del Estudiante

Introduccin a la proqramacin con

3. Puntero a Puntero

:t
oll

Para recalcar, un variable puntero es una variable que contiene la direccin de otra
variable. La variable puntero en s msma puede apuntar a otro puntero, implicando que
se puede tener un puntero a un puntero.
Sea la declaracin de algunas variables:

ol*

int x, *y, **z;


Se sabe que x es una variable entera, e y es una variable puntero entera. **z indica
que es un puntero a una variable puntero entera. Asuma que x est en la posicin 508,

rtr

olt
oll

o
o
o
o
o
o
o
o
O"

o,

y contiene 10. Se muestra en la Figura 3.3.

10

508
Figura 3.3: Dreccin y Gontenido de una Variable puntero

Suponga que se realiza la siguiente sentencia:

Y=&x;
y se asume que y est almacenda en memoria en la posicin L024. La posicin de
memoria de x e y S rTruStran en la Figura 3.4, despus de la sentencia y = &x; S

ejecuta.

o
o
o
o
o

o
o
o

508

s08

!024

Figura 3.4: Posicin de una Variable puntero y su Contenido

Ahora suponga que se escribe la siguiente sentencia:

Z = 6rY;
Se asume que z est asignada en.memoria pn la posicn
memoria de x, y \ z Se muestran en la Figura 3.5.

o
a

10

a
a
a

508

Io
t?

10

::08. Las posiciones

508

L024

r024

33 08

de

Figure 3.5: Posicin de Variables puntero y su Contenido


Note que sise tiene que obtener el valor 1o en x (en ta posicin soe) se debe escribir

printf (*&d, , x) ;

?
?

?
?
o

printf 1"Zd"l'"y)

Se puede tambin obtener el mismo valor tambin a travs de z.


Volumen 5: Punteros en C

Unidad 3: Punteros Avanzados 25


Copyright IBM Corp. 2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

.'

Introduccin a la

Gua del Estudiante

Printf("?d" , **z)

C permite que esto sea extiendapara teer un puntero a un puntero a un punrero


a un
puntero, y as sucesivamente sn imte. Pero esie tipo de definicin tiene
muy po6 uso
prctco. Para la mayoria de las aplicaciones es suficiente saber cmo
usar un puntero
a un puntero.

4. Arreglo de Punteros
En C, se puede tener un aneglo cuyos efementos son todos punteros. Cada uno de
qslo! punteros, por q'emplo, puede a su vez apuntar a un arreglo unidimensional. La
definicin de tal aneglo de punteros apuntando'al msmo tipo de"anegio unioimensional
es realmente la definicin de un arreglo bidimensional.
Un aneglo multi-dimensional puede ser descrito como un arreglo arreglo de punteros.
Tambin se puede definir como un n'ico puntero apuntado ,n grpo de arreglos
almacenados en posiciones de memoria contiguas.
Un areglo bidimensional se puede definiir como un arreglo unidimensional de punteros
con la siguiente definicin:

tipo-de-dato *arreglo [c_exprJ ;


En ef Volumen 3,.Unidad 2 - Arreglos Multi-Dimensionales.

se defini como sigue:

Cipo-de-dato arreglo Ic_expr1] [ c_expr2]

un arreglo de bidimensional

De alguna forma, las dos definiciones anteriores son equivalentes.


Nota:

'
'

El tamao de un areglo es siempre una constante, representada por c_expr

anteriormente.

Los subndces de un arreglo pueden ser de tipos integrales


de dato f loar no se puede usar como subndice de aireglos

inr ! char. El tipo

Se puede extender la definicin del uso de punteros para arreglos mult-dimensionales


como:

tipo-de-dato *arreglo Ic_expr1] [ c'expr2].-.[ c_expr_1J

para un aneglo de n dimensiones. Note que tiene una dmensin menos.


Una definicin
de arreglo equvalente es como sigue:

E.ipo-de-dato *arreglo [c_expr1] [ c_expr2] -..[ c_expr) ;


Suponga que se necesita tener un aneglo bidimensional con cinco fllas y 25 columnas,

conteniendo enteros, se puede tener esto como:


int *x [5]
Aqu x [o] apunta al comienzo de la primera fila. x [1] apunta af comienzo de la
segunda fila, y as sucesivamente, asi como x [4] apunta al comienzo de la quinta
fila.
Debe notar que el nmero de etementos en cada fila (que define el nmero de
columnas, establecidas en este ejemplo en zs) no est defindo exptcitamente.
Actualmente, se pueden tener las filas para que contengan 2s elementos, ms
de zs
elementos, o menos de zs elementos, depende de lo que se desee, pero la definicin
,.

Copyright IBM Corp.2002

Los materiales del curso no pueden ser reproducidos total


o parcalmente sin el permiso previo escrito de lBM.

o
o
o
o
o
o rl
o il
o
o
o
o
o
o
o
o
o
O

o
o
o
o
o

o
o
o
o
o
a
o
o
o
o
o

o
o
?

O
I

?
?

I)
ff

p
P

Gua del

Estudiante

Introduccin a la programacin con

permanece la misma. Esta definicin de arreglos bidimensionales es ms apropiada


cuando se le compara con la convencional.
se puede acceder a un arreglo bidimensional convencional como x t 3 I i 6I . Se puede
tambln acceder a un elemento como se muestra a continuacin:

*(x[3] +

6)

En este caso, x t3l es un puntero alprimer elemento de la fila 3, y (x [3] + 5) apunta


al elemento e (et sptimo elemento en realidad) en la fila :. Por fo tanto la expresin
* (x
+ 6 ) se refiere a x [3] t6l .

[:]

En general, para acceder a x

*(xlil

[iJ I j ] , se puede usar lo siguiente:

+ j)

que se desea tener un areglo tridimensional de enteros, for ejemplo de S x 10


bidimensional de puntros. As que se
tiene lo siguiente:
Su.p_on_ga

x 15. Se puede expresar ste como un arreglo

inr *yIs] [10],


Nota: En este caso, se est tratando con 5 x 10, es decir, 50 punteros, cada uno de los
cuales apunta a un aneglo unidmensional de enteros. Un elemento individual de un
arreglo tridimensional, el cual convencionalmente se accede como lil t j I [k] se
v
,
puede acceder como sigue:
*(ytil tjl + k)
Los anegfos de punteros son muy tiles para almacenar cadena de caracteres. Cada
elemento del arreglo es un puntero a carcter que define el principio de una cadena
separada. As, si se tiene char *a [10] ; S puede tener 10 diferentes cadenas.
Refirindose a su conespondiente puntero se puede acceder a c,ada cadena individual.
Un mtodo convencional para almacenar los 10 primeros nombres de personas es tener

fo siguiente:

char fnombre [10J [30] ;


Se puede tener 10 nombres. Cada uno de estos puede tener un primer nombre tan
largo como 30 caracteres (realmente 2g, y un \o carcter nulo). Una mejor forma de
hacer esto es tener lo siguiente:
,
char *fnombre [tO] ;
fnombre [0J apunta al nombre de la primera persona, fnombre t1] al nombre de la
segunda persona y as sucesivamente. As, no se requiere decir cuntos caracteres
puede tener cada uno de estos nombres, en otras palabias no se tiene que especificar
el tamao mximo de la cadena.Pero tampoco significa que se puede tener cualquier
nmero de caracteres que se desee.
C tiene un operador unario llamado sizeof O, el cual puede determinar ef nmero de
bytes que un elemento de un tipo ocupa. El operador sizeof g toma el nombre del tipo
como entrada y retoma elnmero de bytes ocupados por un elemento de ese tipo como
salida. Esto evita la necesidad de codificar dentro del programa el nmero de bytes que
los tpos ocupan.

consdere elsiguiente ejemplo donde eloperador szeor o se usa:

fnombre[i] = (char *) malloc(30 * sizeof(char));

Volumen 5: Punteros en C

Unidad 3: Punteros Avanzados 27


Copyright tBM Corp.2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
@

se puede acceder a los caracteres individuales en la cadena de caracteres


como

iij tjl en la forma:


* (*fname + i) + j)
Una. clara ventaja de este mtodo de decfarar y
usar las cadenas de caracteres como
punteros a caracteres es cuando se tiee
un rregfo de punteros a cadenas que son
nombres, que deben ser clasificados..En este .r,
suficente tener el arreglo de
punteros ordenados en vez que mover ras cadenar
",
sea un ejemplo de manipulacin de cadenas de caracteres, para
entender mejor el uso
de los punteros a cadenas de caracteres.
fnombre

rirr"r.

Ejemplo 3.1: Usar punteros a Cadenas de Caracteres

La entrada al programa son cuatro cadenas de caracteres.


se requiere hacer lo

siguiente:

'
'

comparar la primera cadena de crracteres con todos las


otras cadenas de
caracteres y verificar si la primera cadena de caracteres
es mayor, menor o gual a
las otras cadenas de caracteres. Mostrar el resultado.
concatenar fas cadenas de caracteres con fa parabra ,cofor'.

Nota: A travs de este ejemplo se aprender el uso de


la librera de de funciones de
cadenas de caracteres (string) definidas o <sLrin9.hr,
as como a asignar memoria
dinmica en C.
El cdigo C inicia aqu...

/* Archivos de cabecera */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define

TAMANO 4

/* La funcin mai.n inicia aqu *7


mainO {
char *strings [1\ajqrvg , st.ring[100]
int i;

/* Toma 1a entrada del usuarj-o para las cadenas */


print.f ( "fngrese ?d strings: \n,,, TAIvIANO) ;
for (i = O; i < TA.|,{ANO,. i++) {
Printf ( "String ?d: ,', i+1) ;
scanf (ntsn,stri_ng);
/* Asignacin de memoria para e1 st.ring, para * /
/t agregar color y para el terminal ,\0, */

O Copyright IBM Corp. 2002


.
Los materiales delcurso no pueden ser reproducidos
total
o parcialmente sin el permiso prevo escrito de lBM.

oF
o

oi*

Gua del Estudiante

Introduccin a la

stringsIi]
= (char *) mal1oc( ( strlen(stri-ng)
+ 6 + 1 ) * sizeof(char) );
strcpy(strings [i], strlng) ;

a
O,;3

ol;
o

)
nrintf

o
o

print.f (',String 1 ?s > String ?d ?s\n',, \


st.rings [0], i+1, strings Iil ) ;
/* Concatenar los strings de ent.radas dado por
usuario */
printf("\nlos strings depus de Ia \

concatenacin son: \n,')

o
o
o
o
o
o
o

o
a

o
o
o

e1

for (i = 0; i . TAI'ANO; i++) {


sLrcat (strings Ii] , " ,') ;
sLrcat (strings Ii] , ,,co1or" )
printf ( "?s\n", strings Ii] ) ;

e1 se

o
o
o
o
o
o

o
a
a
o
o

for (i = r; i . TAMANO; i++)


if (strcmp (strings [0] , strlngs til ) == 0)
printf("String 1 ?s = St.ring td ?s\n",\
strings [0], i+1, strings Ii] ) ;
else j-f (strcmp (strings [0J , strings t j-] ) . O)
printf (,,String 1 ?s < String ?d ?s\n", \
strings[0], i+1, srringsIi] ),.

Oil

/rr\-nt.
\
\r

rr4!!

Oi

macin con

,-

/* La funcin main termina aqui */


El cdigo C termina aqu

se usaron las siguientes cuatro funciones de cadenas de caracteres:

. int strl-en(const char *)! Una funcin que toma un puntero a una
cadena, y retoma la longitud de la cadena.

. char * strcpy(char *, const char *): una funcin que toma dos
cadenas y copia la segunda cadena dentro de la primera cadena.
strcmp (const char
const char *) : una funcin que toma dos
cadenas y retoma 0 siambas denas son iguales, < o si la primera cadena es
menor que la segunda y, > 0 si la primera cadena es mayor que lat segunda.
char strcat (char * const char *): Una fUncin que toma dos
cadenas y concatena (une) las dos cadenas agregando la segunda cadena a la
primera.

o int
.

*,

Volumen 5: Punteros en C

Unidad 3: Punteros Avanzados


Copyright IBM Corp.2002
Los materiales det crlrso no pueden ser reproducidos total
o parcialmente sin el permso prevo escrito de IBM
@

29

Note que algunas de estas funciones toma const char


". Esto implica que el puntero
se declara como una constante, de manera que ningn
cambio se hce al parmetro en
la funcin' Tome por ejemplo, la funcin
donde la primera cadena es
sobrescrita por la segunda cadena. La primera =a..-py
caOea debe ser modificada, mientras la
segunda no debe- De acuerdo a esto, se ven los parmetros
en la peticin char*,

const char*.

cuando se declara un aneglo de punteros, fa'memoria se reserva


slo para el arreglo.
Cada elemento del aneglo es un puntero y por tanto debe tipicamente
estar apuntado a
otras posiciones de memoria. Esta posicines de memoria no son
reservadas cuando
se declara char *strings ITAMANO] ; .
En. el e.Jgmplo anterior, se introdujo una caracterstica significativa
de C, llamada
asignacin dinmica de memoria. Normalm"ni",-i memo-ria
se
signa
cuando el
programa se compila. Pgro la asignacin dinmca
de memoria pospon la asignacin
de memoria al tiempo de ejecucin. La ventaja de esta facilida'd
l"-posibilidad de
crear espacio para las cadenas de caracters. En este ejemplo, "r
se tiene espacio tanto
como se necesita' De manera que se declara una cadena
simple de 100 caracteres, se
lee cada cadena por turno en ste, se calcufa ta fongitud o'e la
cadena y se asigna
memoria basado en el tamao a travs de la siguiente funcin:
voi-d *mal loc (int, tamano)
;

Aqu:

tamano es el espacio requerido, el cual se obtiene por

sizeof (char)

strlen(string)

o str]en (string)
o

retorna la longitud y se multiplica por el tamao del carcter,


elcual es 1 byte.
mal-loc es la funcin que asigna memoria dinmicamente. Retorna void *,y
se ha convertido ? char *, ya que cada eremento de strings
es un puntero a
carcter' mall-oc se puede usar similarmente con todos los
otros punteros en
C.

una vez que la memoria requerida es asignada a travs de marloc,


se usa
simplemente fa funcin srrcpy para copiar er string a
strings
Existe otra
funcin, la cual es til para liberar memoria dinmicamente.
Esta eJ void f ree (void
Esta funcin libera el espacio de memoria asgnado por ma1loc
de manera que
pueda ser asignado nuevamente. Aunque no se ha plicado
esta funcin en el ejemplo,
es muy til en ef desarrollo de aplicaciones try gr"nbes. Es
una bueni piJctica liberar
memoria que no requiera elprograma.

til .

");'

Finalmente, se compara la primera cadena con todos las


otras cadenas y se muestra el
resultado. La comparacin se hace lexcogrficamente, fo cuaf
significa'que ta palabra
es
menor
que
ya
a!9,
que
el
segundo
carcter
p
viene
9P9
antJs de f n el alfabeto.
Este es el mismo mtodb que se us en los diccionaiios. La
sati r pigrrra es ta
siguiente:

fngrese 4 strings:
String 1: green
Unidad 3: Pu

Los materia,"" 8"?llJinll,'3.[f,",i;??33,o0,"oos total


o parcialmente sin el permiso prevo escrito de tBM.

or
oi
ot
o'
o

e
.f
.f
e

a
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o

o
o
o
o
o
o
o

o
o

Gua del Estudiante

Introduccin a la Prooramacin con C

String 2: ye11ow
String 3: blue
Ql- rinn

1.

dra

St.ring 1 green
String 1 green
String 1 green

String 2 yellow
at-rinn

? l.r'l rro

veY

String 4 green

Los strings despus de 1a concatenacin son:


green color
yellow color
blue color
green color
Fin del Ejemplo 3.1

5. Puntero a Estructura
Se puede tambin tener punteros apuntando a estructuras. Suponga que se tiene la
siguiente estructura:
struct persona {
char nombrel45l;
int edad,.
f loat. peso,-

);
Se puede crear una varable e inicializarla como sigue:

struct persona estudiante = {".lack",

!t,

65.5);

Se puede tambin definir un puntero a esta estructura:


ql- rrlcl.

ar<^

* ct- r

Esto permite tener una asignacin a

sptr

como se muestra a contnuacin:

spt.r = &estudiante;
Usando esta variable puntero a una estructura llamada sprr, se puede acceder a c;,da
componente individualde la estructura como se muestra a continuacin:

sptr-

>nombre

sptsr- >edad
spEr- >peso

Se ha accedido a los miembros indviduales de una estructura usando el operador


=echa - >. Se puede pasar el puntero a una estructura o una funcin como un
larmetro, as que dentro de la funcin se puede acceder y usar cada uno de los
-iembros de la estructura.

\/clumen 5: Punteros en C

Unidad 3: Punteros Avanzados


Copyright IBM Corp. 2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
@

3l

lntroduccin a la

cin con C

Ga delEstudiante

6. Puntero a una Funcin


una funcin en c no es una variabF;jl:targo,,
se
como tar. Es posibre definir
punteros a una funcin,
a uai'r"0" ser coloda entrata
arregtos, paiaol a funciones
retomar de las funciones' er
y
uso-trpico o" ,n
una funcin radica en et hecho
de que una funcin misma p,"
ser pasada como un
" argumento a otra funcjn.
situacin se present" t'"n
Tal
funcn, r"rlriJ corno ra primera
tareas usando
funcin,
reariza
funcin. r-a primei-i;..; iicesita
*otra
.ono."i er nomore de ra
segunda funcin
para usarfa oentro e eila. h;o,'!
r,
."g;.J;;;;in
cada vez, cmo manipufa ra primera
-eses diferente
runcn' sto? na rorma
construccin switch -.. case
tener una
e invocar fa segunda funcin ,."r"uni"l
para realizar esto es recibir
La forma ideal
fa funcin en si mJm"-aoro un.
argumento, de esta
la primera funcin ilvoca ta segunoa
funcin rr" tr*s de ra variabrerecibidaforma,
como
de funcin. A continuacon, se nieer
"
mejor
:[;;?r1t"nto
travs de un

p*t

*a

;;;

Fl"#lJ;

a.tr Encontrar

ta Raz cuadrada de un Nmero


usando punreros a

suponga que se tienen cuatro funciones,


que existen independientemente
realiza diferentes
y cada una
o"penJi"noo d a
ta.r, como encontrar ra
cuadrada de un entero
-clculos.
raz
dado d niraoa,
"nir"or,
la.iz cuocade un
dado
de
"noni*'
;:.:X?,.?.:THX1,,?.[H:1"'. "nt"'.o dado de nt,.ou ", pi'l ;; "t"ro
entero dado

Hay adems otra funcin que crea


una tabla de dos columnas,
columna es ef nmero serial y
ta-slgunda column" ti"* ros varores donde ra primera
asociados. Estos
valores se generan oepenoieno
o tipo o" uurin""Iion qr" necesite
verficacin puede ser para la raz
ser hecha; ra
cuadrada, la raz.ao"", etc. Esta
funcin a
funcin recibir
ser lfamada como

,; ogr;"nto; dependiendo

ta

en cuat tabla se genere.

Los siguientes son ros prototipos


de ras cuatro funciones:

.
r
o
.

rnt raizCuadrada (inL) ;


.
inE raizCubica (int;
int esprimo(int);
int espaLi-ndrome (int) ;
Ef siguiente es el programa completo.
una expficacin def uso de fos punteros
funcn' basado en el piogra*;;;;;
continuacn,
,.

sigue ar programa:

Ef cdigo C inicia aqu...

/* Archivos de Cabecera */
#incLude <stdio.h>

#include <math.h>

umen
@ Copyright tBM Corp.20O2
,t-os
__
^_ materiales
del curso no pueOen'seiieproducidos
total
o parcialmente sin el permiso previo
O" lg^r.

"r"rito

teros en C

o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del

o t,
o
o
o
o

o
o'

Programe::- :_-

/* Prototipo de la funcin raizCuadrada */


int raizCuadrada(int x) ;
/* La funcin principal comi-enza aqu */
main0 {
/* Se 1lama da 1a funcin generarTabla con argumento
raizCuadrada * /
generarTabla ( rai zCuadrada)

/* La funcin principal termina aqui*/

o
o
o
o
o
o
o
o
o
o

Introduccin a la

/* Prototipo para 1a funcin generarTabla "/


void generarTabla (inc (*fprr) (int) );

o
o
o
o
o
o
o
o
o
o
o
o
o
o

Estudiante

/* La funcin generarTabla i-nicia agu */


void generarTabla(inE (*fptr) (int)) {
int i;
for (i = f ; i <= 1OOOO,- i++) i
/* Llamando a raizcuadrada */
printf ("?d\t?d\D",i, (*fptr) (i) );
)

/* La funcin generarTabla la funcin finalza aqi *1


/" Ia funcin raizCuadrada inicia aqui */
int raizCuadrada(int x) {
int sqrt = 0;
sqrt = (inL) Pow (x, 0.5) ;
return lsorf.)

/* La funcin raizCuadrada termina agu */


El cdigo C finaliza aqu
Hay dos funciones, main y generarTabla. generarTabla toma un argumento que
es un puntero a una funcin. Se declara un puntero a una funcin como se muestra a
continuacin:

j-nt raizCuadrada(int); /* Funcin normal *,/


int (*fptr) (int) ;
/* Declaracin de un punte_ro
a una funcin *,/
Volumen 5: Punteros en C

'

Unidad 3: Punteros

Copyright IBM Corp. 2002


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el pemso prevo escrito de IBM
@

Avanzados

33

Powered by TCPDF (www.tcpdf.org)

lntroduccin a la programacin con


C
fnt-r

Gua del Estudiante

F.

/* Asignar 1a funcin a un puntero */

Para leer la dec]aracin de un puntero a


una funcin correctamente, es necesario tener
un entendimiento claro de la precedenca de operadores.
Los t l, tinen una mayor
precedencia sobre *. Asi *fprr
se enceTa entre O paradarfe una mayor precedenca
sobre ( ) . Sea la siguiente declaracin:

int raizCuadrada (inC)

se lee 'raizCuadrada s una funcin la cual tor" ,n


entero como argumento y retorna
un entero'' Elnfasis
es en 'es una funcin' primero. considere la
sguiente declaracin:

int *fptr (inr)

se lee'fptr' es una funcin que toma un entero como


argumento y retorna un puntero
a un entero" As, para poner enfatizar primero en 'puntero
el
a una funcin,, la variable
puntero junto con se encierra en (
)
"
.

como un nombre de arreglo es un punlero. a un


arreglo, un nombre de funcin es un
puntero a una funcin. un nombre
de funcin pr"J" i"l. simplemente asignado
a una
variable puntero que se decrara como un puntero
a una funcin (como
apa. _ f).
Pasar raizcuadradad como un argumento
"n
generarTabla
a
es recibido en
generarTabla como fptr, y la funcin raizcuadr-ada
se
invoca
af
deferenciar el
puntero de la funcin tarcomo e muestra
a continuacin:

("fpcr) (i)

Aqu es el argumento entero


un entero se imprime.

*f rpr es raizcuadrada y el valor


retomado el cual es

Fin del Ejempto 3.2

El ejemplo 3'2 revela el poder de los punteros a funcin


en c. La funcin
generarTabla puede ser invocada c9n cualquier
argumento que es una funcin.

La
funcin que se pasa como un argumento
debe satisfacr dos condiciones para que sea
aceptada como un argumento para grenerarTabla.,Las
condiciones Son:
La funcin debe tomar un entero como un
argumento
La funcin debe retomar un entero.
cualquier funcin que satisfaga las dos condicones
anteriores puede ser pasada como
un argumento a generarTabla.

o
.

,-", ;

;";,",

['

;i

3"? lllJin
F[."".j'" ?:3,'"J
o parcalmente sin elpermso previo
"? escrito
",
de" lBM.

P u n te

ror-6-E

o
o
o
o
o
o

o
o
o
o
o
o
o
oi
o

Gua del

Estudiante

Introduccin a la programacin con C

Resumen
Ahora que ha completado esta unidad, usted ser capaz de:
Explicar la aritmica de direcciones
Describir un puntero a puntero y un arreglo de punteros
Discutir cmo declarar y usar punteros con estructuras

.
.
.
.

Explicar cmo pasar funciones como argumentos a otras funciones a travs de


punteros.

o,

o
o
o

a
a
a
o
o
o
o
o
e
O

Volumen 5: Punteros en C

Unidad 3: Punteros

O Copyright IBM Corp. 2002


Los materiales del c{,rso no pueden ser reproducidos total
o parcalmente sin el permiso previo escrito de IBM

Avanzados

35

Introduccin a la Programacin con C

Gua del Estudiante

Unidad 3:Examen de Autoevaluacin


use las siguientes declaraciones para responder las primeras cuatro preguntas.

floar f [10] = {t.t, 2.2,3.3,


floaE*fptrl =f,.
fLoat. *fptr2 = f + 3,.

4.4,5.s};

1) *fprr1 resulta en cul de los siguientes? a) 1.1


b)0
c) Error
d) Ninguna de las anteriores
2) f ++ S vlido.
a) Verdadero
b) Falso
3) fpt 12 - fprrl resulta en cul de los siguientes?
a)0

b)1

c)2
d)3

4) fptr2 = fptrl
a) Verdadero
b) Falso

es una declaracin vlida.

5) ** es usado para desreferenciar


a) Verdadero
b) Falso

6)

el valor apuntado por un puntero a puntero.

Todos los elementos en un areglo pueden contener punteros del


mismo tpo de

dato.

a) Verdadero
b) Falso

7) Cules de los siguientes


a)*
b)
c)

tienen la mayor precedencia?

++

==

d)o

@ Copyright tBM Corp.2002


Los materiares der curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de lBM.

Gua del Estudiante

:!

B)

Cules de los siguientes no pueden ser declarados?


a) Puntero a un arreglo
b) Puntero a una estructura

c)
d)
9)

lntroduccin a la Proqramacin con C

Puntero a una funcin


Ninguna de las anteriores

En la declaracin

int. *pcr ( int

Qu es pcr?

a) Un puntero a funcin
b) Un puntero a puntero
c) Una funcin
d) Ninguna de las anteriores

:H
oll

ql

$
d

10)

En la declaracin
int * (*ptr)

(int "

Qu s prr?

a) Un puntero a puntero
b) Un puntero a una funcin
c) Declaracininvlida
d) Ninguna de las anteriores

o
o
o
o
o
o
o
?
o

Volumen 5: Punteros en C

Unidad 3: Punteros Avanzados


Copyright IBM Corp.2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
@

37

lntroduccin a la Programacin con

c _

Gua der Estudiante

Respuestas a fa unidad 3: Examen de Autoevaf


uacin
1)a

2)b
3)d
4)a
5)a
6)a
7)d
8)d
9)c
10)

pu nte

."" ; ;";",",

lll# ['

?3;,"J"",

;,

?"?
3*g"j',"?
o parcialmente sin ef permiso previo escrito de lBM.

ros-ETre

o --

o - rE
r
o PC
o
o fr
o
o
o
o
o

Gua del Estudiante

o
o
o
o
o
o
o
o
a
o
o
o

amacin con

Unida d 4: Laboratorio de punteros

o
o
o
o

Introduccin a la

Avanzados
Objetivos de Aprend izaje
Al finalizar esta unidad, usted ser capaz de:
Trabajar con diferentes tipos de punteros
Usar punteros en la solucin de problemas

.
.

I
I
I

i
j

I
:

o
o
o
a
a
q

T
T

?
?
?
o
F

?
?
7

Volumen 5: Punteros en C

Unidad 4: Laboratoro de punteros Avarzados


Copyright tBM Corp. 2002
Los materiales del curco no pueden ser reproducldos total
o parcialmente sin el permiso previo escrito de IBM

rarnacin con C

Ejercicios de Laboratorio
1) Considere fa siguiente estructura definida
tlpedef struct {
int dd, mm, yy;

Gua del Estudiante

a continuacion:

rncna;

rlpedef struct {
int idno,.
char nombre [+o]

,.

.ucuA ddn,.

float salario;
int dependientes,.

) rutr,raoo;

a)

Escribir una funcin que rea


fos_datos para 100 empreados.
usted puede
ffJil:'"Hti:[Xp-ara 5 a 1o empr"uoo.'!!ro traoaiar para cuarquier

b)

Escribir una funcin para incrementar


ef sueldo de los empieados
basados en
una entrada der usuario. Las
entradas
sern er-nmero der empreado
porcentaje de incremento
y er
en el sueto -fu;; debe retomar
el
nuevo
Debe mostra*n
de

:il"jff".X]f!Si?ff;.
c)

'"nrul""

enor si er-nero

Escribir una funcin que muestre


los detalles def empleado con
un formato.

teros

anzados

Copyrght tBM Corp.2002


r ^^ ___.
tos
materiales del q.lr so no pueden
ser reproducidos total
o parcialmente sin el permiso prevo
de lBM.
@

"r"rito

de

:t
oil
.l
ol.
.lt
-E

rF

oE
of

otf
olr
.l
ol
oi

E-r-1-hI5
ry-ntI
---5Ir -R
---!I<F,

ntroduccin a la
Programacin con C
f

-*

--n

(Codigo del Curso: Cy320)


Versin 2.0

Gua del Estudiante

o;
ol
o
Ol

o
o
o
o

o
o
o
o
o
o

Volumen 6: Tpicos
Avanzados

I
{

IBM Learning Services


Worldwide Certified Material

nformacin de publicacin
producida usando Microsoft

,t;X3:?:t,l"*:.t'oo

word 2000 yMicrosoft powerpoint

Marcas Registradas
IBM @ es una marca registrada
de fnternational Business Machines
corporation.
y nombres oe servicos pueden
ser marcas comerciales o

;in:"#i?Hff;Tlitg::

Marcas Registradas de otras compaas


como se muestra
Windows

Microsoft Corporation

Red Hat Linux

Red Hat

Edicin Septiembre de

2OO2

La informacin contenida en este


documento no ha sido sometida a ninguna
prueba
formaf de rBM y es distribuioa
osmente ,,como
ninguna garanta ya sea
expresa o impfcita. Ef uso de esra'"":::_":l
"r,'rin
;;"i;rentacinde
cuarquiera de
estas tcnicas es responsabifidad
def,comprador y depender de ta
habilidad
para su evaluacin e integracin
de ste
en ef amoiente operctnat der criente.
A pesar de que
cada tema ha sido evisao por
larr,,l p"r"
exactitud en una situacin especfica,
hay garanta de obtener et msmo
no
resuttaoo o ,no ,rr a ste en
otra
siiuacin.
Los
aoapti si' ii.n"; ;
ambientes n nacen bajo su
;i$,n:$":tenten

,,

il;;;ffi;

copyright nternationar Business Machines


corpora tion, 2002.Todos tos
derechos reservados.
f

5:,f,rfl""":#[j".:18ili0"

ser reproducido en su totaridad


o en parte sin er previo

Instrucciones especiales para la


impresin de ste curso
No deben removerse fas pginas
en blanco que puedan aparecer
al finaf de cada
unidad y entre dos unida"rl

eii",

nn soo

inr,i,t"o",

iienconatmente.

o
o
o

Introduccin a la programacin
con C

o
a

o
a
o lfff
o
o

o
o

?l

I'

p
I

o hr
o
a
o

o
o
o
o
o
o

o
o

o
a

I
I

I
t?
tI
It
I
p
lo
lo
lo
'o

a
o

Gua del Estudiante

Contenidos
Unidad 1: Manejo de Archivo en C
1

Objetivos de Aprendizaje

i.

Introduccin

2. UsarArchivos de Datos en C
3. Archivos de Texto y Binarios

2
14

4. ManipufarArchivos de Datos Sin Formato


Resumen
Unidad 1: Exmen de Autoevaluacin
Respuestas a fa unidad 1: Exmen de

15
18

19

Autoevaruacin

21

Unidad 2: Laboratorio de Manejo d


Archivos en C
Objetivos de AprendLaje

22
22

Ejercicios de Laboratorio

23

Undad 3: Caractersticas Adicionates


de C
Objetivos de Aprendizaje

25
25

1. Introduccin

26

2. Enumeraciones

26

3. Argumentos de la Lnea de Comandos

28

4. Macros

30

5. Directivas del preprocesador

6. Operaciones de Manejo de Bits

Resumen

Unidad 3: Examen de Autoevaluacin


Respuestas a la Unidad 3: Examen de

36

39

40
Autoevatuacin

unidad 4: Laboratorio de caractersticas


Adicionares de
Objetivos de Aprendizaje
Ejercicios de Laboratorio

41

42
42
43

Lrdad 't: Manejo e ArcvoEnlC

V_olumen 6: Tpcos Rvanzados


ii
@ Copyright IBM Corp. 2OO2
,Los
materiales delcurso no pueden ser reproducidos
totaf
o parcialmente sin el permiso previo
de lBM.

"scrito

^l
!F
o
o
o
o

o;

oi

o
o
o
o
o

o
o

Gua del Estudiante

Introduccin a la Programacjn co-

Unidad 1: Manejo de Archivo en C


Objetivos de Aprend izaje
Al finalizar esta unidad, usted ser capaz de:
Reconocer reas en ra.sorucin de probremas que
requieren ra necesidad de
leer y escribir datos en dispostivos de almacenamiento
secundario.
a
Discutir cmo manejar archivos de datos en
C
a
Discutir el mtodo de manejo de archivos orientado
a flujo en c
o
Describir diferente ribreras de funciones que
ayudan crear, reer y a escribir
archvos en disco.

a
a
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o

o
o

Losmarerf ar"r?f S[""li,F*.?Jr,;?of


l,oo,"oostotal
o parcialmente sin elpermiso previo es'oito
cle IBM

Introduccin a la progfamacin con

Gua del Estudiante

l. Introduccin
Algunas aplicaciones. requieren que los datos estn disponibles
para varias ejecuciones
del programa. Ejemptos de estas'aplcaciones son:
Datos sobre empfeados, requeridos por apJicaciones de
nmina de pago.
Datos sobre cuentas delclente, requeridos por los programas
bancarios.
Los datos que se usan en las variables de los programa
duran solamente el tiempo de
duracin del programa. Los datos, almacenado. e la F{AM,
se pieroen ,n" u". que el
programa termina a menos que explcitamente se
coloquen en to dispositivos de
almacenamiento secundario. sin embargo, en los dispositivos
de almacenamiento
secundario mm9 discos y cintas, los datoJse almacenan permanentemente
en la forma
de archivos de dafos- En esta unidad se va consderar slo
archivos de disco cuando
se haga referencia a los dispositivos de almacenamiento secundario.
Los datos que se
mantienen en el dispositivo de almacenamiento secundario
son permanentes, a menos
que sean borados por ef usuario.

'
o

Muchos
.lenguajes de programacin clasifican los archivos de datos como archivos
secuenciales
y archivos de acceso directo o acceso aleatorio. c ofrece dos
tipos

diferentes de archivos de datos. Estos son:

o
'

Archivos de datos orientado a flujo, llamados tambin archivos


estndar.
Archivos de datos orentados a sistema, llamados tambin
archivos de datos
de bajo nivel.

De los dos, los archivos de datos orientados a flujo son los


ms fciles de programar y
manipular. En esta unidad slo se cubrir los archvos de datos
orientados a flujo.
Los archivos de datos orientados a flujo se dividen en
dos categoras. Estas son:

o
.

Archivos de texto.
Archivos de datos sin formato

Los archivos de texto son aquellos que consisten de


una searencia de caracteres, los
cuales pueden ser considerabos oe ilo caracterest oro
una cadena de caracteres
(string) o como nmeros. Varias funciones de lbrera
estn oisponiotes p"
le",
y escribir en archivos de disco.
"r""r,

Los archivos de datos sin formato son aquellos en los cuales


los datos estn
organizados dentro de bloques que consisten de bLs
contiguos. se pueden usar para
representar estructuras de datos ms complejas tales
como aneglos
ciertas funciones especficas de librera estn tambin oisponioies- y estructuras.
transferir
estructuras de datos completas.

i"i"

2. Usar Archivos de Datos en C


Ef lenguaje C ofrece un amplio conjunto de funciones
de librera para crear
archivos de datos.
Unidad

l:

Manejo Oe Archivo en C

utilizar

Volumen 6: Tpcos Avanzados 2

@ Copyright tBM Corp.2002


.
Los materiales

del curso no pueden ser reproducidos total


o parcialmente sin elpermiso previo escrito de IBM

o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

lf
Una de las primera cosas que hay que hacer con los archivos de datos
orientados a
flujo es crear un rea de buffer laimcenamiento temporal). Un rea
de buffer es un
lugar en memoria que se usa para transferir datos desde la memoria
a los dispositivos
de almacenamiento s.ecundario y vceversa. El rea de buffer es la asociacin
entre el
archivo de datos en el dispositivo de almacenamiento icundario y progiama
et
que usa
los datos. Crear un rea de buffer ayuda a que la transferencia de
informacin entre el
dispositivo de almacenamiento secudario y elprograma sea ms
rpida.
t"
I

t
I

t
I

Un rea de buffer se puede crear como


r,.l!.E; *Dut t jt r ;

rigr",

FrLE es un tipo de estrucfura especial que permite la definicin de


un rea de buffer, y
buf
es un puntero que apunta al inicio del rea de buffer. Al uurrSrr
tambin
se denomina puntero a fluio o ftujo. Ntese que siempre debe escribirse
FILE en
maysculas. La estructura especial rrr,s est definid or srdio.h.

f3tr

En C, los archivos de datos deben ser abiertos antes de que puedan


ser procesados e
inclusive creados- Al abrir un archivo se hace una asociacin
entre un nombre de
archivo y el rea del buffer. Tambin especifica cmo los archivos
de datos sern
usados, de acuerdo a la lista que se presenta a continuacin:
Slo lectura
Slo escritura
Lectura/escritura

.
.
o

Existe una funcin de fibrera para abrir archivos ltamada f open.


buffStr
= fopen (nombre-de1-archivo, tipo-de-archivo)

Se deben seguir las reglas para crear nombres de archivos en


un sistema operativo.
Consulte fos manuafes del computador con respecto a las reglas para
crear nombres de

archivos.

El tipo de archivo es una cadena de caracteres (string) que especifica


cmo el archivo
se debe usar. Los diferentes tipos de archivos .e pr"st"n
en la Tabla 1.1.

Abre un archivo que existe, slo


lectura

de

Abre a un nuevo archivo para slo


escritura. S un archivo del mismo
nombre existe, ste ser borrado y un

o
o

nuevo archivo ser creado.

Abre un archivo que existe para


al final del archivo. S el

agregar

archivo no existe un nuevo archivo ser


creado.

oi

Abre un archivo existente para ambos


lectura y escritura.
Volumen

@ Copyright tBM Corp..2002


Los materiales del curso no pueden ser reproducidos total
o parciafmente sln elpermiiso previo escrito de IBM

Abre un nuevo archivo

Dara

escritura/lectura. Si un archivo con el

mismo nombre existe, sfe ser


bonado y un nuevo archivo ser

creado.

Abre

un

archivo que existe

lectura/escritura. Si el archivo no
un nuevo arcfjvo ser creado.
Tabla

l.l:

para

"i"t"

Tipos de Archivo

Cuando la funcin fopen se usa, retoma


un puntero al inicio de ta posicin del rea
de
buffer asocada con el archvo. si, por algun
razn,J archivo no puede ser abierto, se
retoma un valor NULL (cero). Esta condiin
puede'ocr.lrir cuando un archivo de
datos
que ya existe no se.. puede encontrar,
o
cuando
falla er intento de abrir et archvo porque
'caoa
el archivo est daado. Ar finaf oe
progrrr,-un'archivo de datos que ha
sido
abierto debe ser cenado. una funcin de
lbreria llamada fclose permite hacer esto.
fclose (buf f3tr) ,.

Aunque muchos compifadores de c cierran


automticamente todos fos archivos de
datos al final del programa, es mejor si se
cierran los archivos explcitamente.

[:[,/lff,:;
Ejemplo

l.l:

S?5;";X,:ffifn#o,

ejempros para entender los conceptos de


manejo

Cmo Abrir un Archivo de Datos

En este ejempfo, se ilustra cmo los archivos


de datos se pueden abrir en
ef siguiente fragmento de programa. -

c. considere

El cdigo C inicia aqu...

,/* Archivo de cabecera */


#include <stdio.h>
/* La funcin main se inicla
^rurn',
main O {
/* abri-r un archivo *,/
*ptr;
"t"g
ptr = f open ( "myData. daL'r , ,,r,,) ;
/* Cerrar un archivo */
(ptrl

.:tt""u

Unidad 1: Manejo

Oe Rrcnvo

enT

Volumen 6: Tpicos Avanzados


Copyright tBM Corp.2002
-os materiales del curso no pueden
ser reproducidos total
o parcialmente sin el permiso previo escrito
de fBM
@

o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
Or

ot

r
Gua del Estudiante

lntroduccin a la Programacin con C

/" La funcin principal

termina aqu */

El cdigo C termina aqu

A continuacin se analizan cada una de las sentencias anteriores.


La primera sentencia
incluye elarchivo de cabecera llamado srdio.rr. Recuerde que
este aichivo se requiere
siempre que se realizan operaciones de E/S de cualquier
Aqu especficamente,
la estructura rrr,s est definida dentro del archvo declase.
encabezado s.dio.h. La
sentencia rrr,r define una variable puntero llamada buff__pgr.
Este crea un rea de
buffer para el archivo de datos y apunta a la posicin incial
de memoria ocupada por
buff3tr' La sentencia, fopen, abre el archivo lfamado myDara.dar modo slo
lectura y retoma un valor apropiado que es asignado af
lurr3tr. Si fue exitoso abrir el
archivo, fa funcin oPil retorna un puntero al inicio delrea
de buffer, el cual ahora es
asignado ? burr3tr. si no fue exitoso abrir ef archivo (como
," u"r . Ll siguiente
ejemplo), fopen retoma un valor m;lr, (ef cual es cero). El
uurr3rr
apunta al rea de
buffer asocada con-el archivo myDara.dar que fue abiertolcon
esto, todas las
sentencias que se refieren y hacen uso del archivo de datos
usarn rurr]tr en vez
def nombre del archivo. La ltima sentencia, fclose, dena
el archivo de datos. Note
que elbuf f prr tambn se us para cenar el archivo.
Fin del Ejempto

l.i

Ejempfo 1.2:Como Manejarun

fopen Noexitoso

!n gsJe ejemplo, se ilustra dos mtodos para manejar


Considere elsiguiente fragmento de programa en C.

un fopen no

El cdigo C inicia aqu...

* Archivo de cabe cera


#include <stdio.h>
,/

#define NULL

/* La funcin main se inicia aqu */


maino {
/* abrir e1 archivo *,/
FfLE *ptr;
pEr = f open (ttmyData. datrr , r,r+ rt ) ;
if (ptr == NULL)
print.f ( "Error al abrir

de1 archivo\n',),.

else

ol
Losmateriar"r?"?SL"['3[r"""f""??31,*roo"stotal
o parcialmente sin elpermiso previo escrito de IBM

exitoso.

Introduccin a la programacin
con C

Gua del Estudiante

,/* cerrar et archivo


close (ptr ;

*,/

/* La funcin main termina agul*/


El cdigo G termina aqu

como se menciol
ef Ejemplo
1.1 cuando se intenta abrir
-la
un archivo usando un
fopen que no es exitoso,
".1
funcin retorna
u"roi
NuLL.
se verifica si ef vator
retornado por la funcin fopen
es un valor uur,r,."ls" ," definido
aqu el NULL como 0.
un mensaje de error apropiado o"o"^-g:r:g-a1,usuario."si
ef archivo es exitoso se
puede proceder a hacer lci quJ
se queria con el archivo de"or|.
datoi. p"r"'ror, ropen
no ser exitoso si et

!;;f;'"

archivo'mencionado no r"
o si el archivo est daado. Es
que existan otras razon"t poi
tas cuats"n"ni
abrir el archivo no se tenga

"ii"i""t"r

Fin del Ejempfo 1.2

otro mtodo para verificar si un fopen


fue exitoso o no es combinar ra
sentencia f open
dentro de ra sentencia if como
se'muestra
,
r"gr"nto
de
cdigo:
"n
El cdigo C inicia aqu..,

"rrilri"

,/* Archivo de Cabecera */


#include <stdio.h>
#define NIJLL O

/" La funcln main se inicia aqu */


main O {
/ * abrir el, archivo */
*ptr;
"t"6
Ptr = f open ( "myDat.a. dat,, , ,,r+,,)
if (pcr == NULL)
printf (',Error abriendo e1 \
archivo
,.

\n"),.

else i
/* eerrar el archi.vo *,/
fclose (pUr)

Unidad t : rv,raneoEni-EnE

Volumen 6: TpicosTvanzados
Copyrght tBM Corp. 2002
Los materates def
no pueden ser reproducidos total
"Lrso
o parcialmente sin
elpermiso previo estrto de
@

IBM

o
o
o

o
o

o
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

/* La funcin main termina aqu


El cdigo C termina aqu

Note como en este mtodo se ha cofocado fopen


dentro de fa sentencia
La
funcn fopen se eiecuta y retoma un valor, el cuaise
asigna buf
y
fuego se
compara con NULL.

f3rr

Taf como se mencion anteriormente, un archivo


de datos debe ser primero creado
antes de ser usado. A continuacin se aprender a
como crear los archivos de datos.
Los archivos de datos orientados a flujo se pueden
crear de las siguientes formas:
creacn directa del archivo usando un editor de
texto o un procesador de
palabras

'
.

Creacin indirecta

travs de un programa

cuando se crea un archivo de datos a travs de un programa,


generalmente tos datos
se leen primero como entrada def usuario a travi eiiecuotir;
s-'Lscrioen at
archivo de datos. se pueden usar tas siguientes funciones
de tibrera:

.
.

getchar
putc

Ejemplo 1.3: Leer un Archivo de Texto y Mostrarto


En este ejemplo se presenta cmo leer un archivo de
texto desde un dispositivo
almacenamiento secundario y mostrar el texto. se
debe abrir un archivo de texto
existente llamado mvstorv-dat n modo slo de
leciura. Entonces se debe leer
carder por carcter def archivo, mostrando cada
carcter hasta que se encuentre un
carcter ror (fin de archivo).
El cdigo C inicia aqu...

#include <stdi,o.

h>

/* La funcin main se nicia aqul */


main0 {
FfLE *myText.;
/* Area de buffer *,/
char ch,.
/* abrir e1 archivo *,/
myText = fopen("mystory-dat" ,,'r,,) i

o
o
o
o

if(myrext == NULL)
printf (,'Error aI abrir e1 archivo\n,,);
else {

if.

se puede usar cualquiera de los dos mtodos. Al flnal, son los programadores
quienes
deciden culde los mtodos desean emplear.

o
o
o
o
o
o
o

,t7

/* Leer un carcter cada uno a la vez hasta alcanzar EoF e


o{umen
@ Copyright tBM Corp. 2002

tos materiafes dercurso no puedn'ser reproducidos


totat
o parcalmente sin elpermiso previo escrto de
IBM

ntroduccin a la programacin con


C

imprimirlo */
ch = getc (myTexE) ;
while(ch != EOF)
I
t

purchar (ch)

ch =

get.c (myText) ;

/* cerrar el- archivo */


f cl_ose (myText )

,.

)
)

/* La funcin

mai_n

termina aqu */

El cdigo C termina aqu


Las sentencias iniciales que abren un rea de
buffer, abren un archvo y verfcan si el
archivo fue abierto exitosamente o no. La otra
seccin es para teer desde el archivo
hasta que se encuentre el carcter de nor'.
se usa la funcin secc pr feer un carcter
desde el archivo que est abierto. Note que se
le usa
mvrext' La funcin setc (mvrext) fee desde el archivo con la variable puntero a buffer
de texto y reto el carcter a
leerse' cada llamada a getc lee los caracteres
en secuencia. El carcter de fin de
archivo, EoF, rnarca el archivo de texto mismo.
Esto se hace de manera iterativa hasta
que el carcter fedo sea el or'. Note que
el carcter EoF es macro definida en el
archivo de cabecera- La funcin purchar se usa para
mostrar el carcter ledo.

Fin del Ejemplo 1.3


Ejemplo 1.4: Escribir a un Archivo de Datos
En este ejemplo se ilustra un mtodo para escribir
a un archivo de datos. La idea es leer
caracteres del teclado que el usuario ingresa.
Estos caracteres se deben convertir a
maysculas y luego escribirse en el archivo oe'oatoi.
El siguiente segmento de
programa hace eso:
El cdigo C inicia aqu...

#include <st.dio. h>


#incl-ude <ctrpe . h>
/* La funcin main inicia
maln O {
FfLE *myText;

aqu */

int ch,.
,/" abrir el archivo */
myText = fopen(,'mystory.dat",,,w,,
if (myText == rULL)
Unidad 1: Manejo e Archivo en C
@ Copyright

);

Volumen 6: Tpcos Avanzados

tBM Corp.2002

tos materales del curso no pueden ser reproducidos total


o parcialmente sin elpermiso previo escrito de fBM

o
o
o
o
o
o

Gua del Estudiante

printf

("Error en 1a creacin\n,') ;
e.l.se t
printf(rfngrese un texto a ser \
almacenado dentro del archivo\n,,)

ch = getchar|;
while( ch l= '\nr )
ch = toupper (ch)
putc(ch, myText);
ch = getcharO;

o
o

)
t

/* cerrar e1 archivo *,/


fclose (myText);

o
O

q
q
q

I
t

,.

o
o

o
o
o
o
o
o
o
o
o
a
o
o

/* La funcin main finalza aqui * /


Elcdigo C finaliza aqu
Para convertir los caracteres ledos a maysculas,
se usa fa funcin Loupper. Dado que
se usa esa funcin, se debe tambin incluir el archivo
de cabecera cr;:. n. se usa la
funcin setchar para leer un carcter desde et
tecrado. se usa la runion purc para
escribr un carcter en el archvo de datos abierto
en modo escritura. Lo siguiente es el
mtodo para usar
la funcin

putc (ch, myText)

purci

,.

Esta funcin escribe el carcter cn dentro del


archivo de datos asociado con el rea de
buffer, el cual est apuntando por ra variabre puntero

myrexr.

Fin det Ejempto 1.4


Existen muchas funciones q]e ayudan a leer y
escribir archvos de datos. para leer y
se puede' usar tas iuncones de ribrera
geLc purc
respectivamente. Para leer y escribir cadenas
compbts (string) fno p"mente un
carcter) se pueden usar fas funciones de
librera glt" y purs. Altemativamente, para
escribir y leer datos con formato se puede usar
fs"ers o fpurs. El fenguaje C tambin
permite que estructuras complejas
sean ledai y escritas en archivos de datos
drrectamente, a travs de las funciones f scanf
! fprinrf .

escribr caracteres,

Ejemplo 1.5: contar los Espacios y caracteres


en un Archivo de Texto

lste

ejempfo considera ef problema de contar el


nmero de espacios en blanco y
caracteres (diferentes a espacios en blanco)
en un er archivo oe tlto. gl
froblema es
acrir un archivo de texto designado par:a
ledura, pro*"r a leer caracteres det archivo
ce texto hasta que se alcanza elor y mantener
un contador del nmero de espacios y
un conador del nmero de caracteres.
Al final, los coni"otr"r de espacios y caracteres
se imprimen.
--=-

r :

Losmateriar",S"?ff x,*1i,3,[r1"fl;??3l,oa,"ioo,,o*r
o parcialmente sin elpermiso previo esctito de
IBM

Esto refueza el uso de la lectura de un carcter, por


ahora esto
funcin fserc.

se

realiza usando

El cdigo C inicia aqu...

#include <stdio.h>
#incLude <cLype. h>
/* La funcin main se inicia aqu*/
mainO i
Ff LE * t.ext ;
/* abrr un archivo *,/
text = fopen("myText.dat",,,Y,,)

if (rext == NULL)
Pri,ntf ('rError a1 abrir\rr )
else {
ch = n"c(rxr);
while (ch ! = EoF) {
/* vetifica los espacios en blancos,
tabulaciones y caracteres de nueva l-nea *,/
,.

if (ch-=' , ll ch=='\, ll \

ch=='\n'

nspace++,.

if

(toupper (ch) >= ,A, && \


toupper (ch) <= ,2,)
nchar++,.

ch = fgetc(text)

,.

/* cerrar e1 archivo */
fclose (Cext)

,.

printf (', Espacios = ?d

nspace, nchar)

CaracLeres = ?d\n", \

,.

/* La funcin main termina aqu */


El cdigo G termina aqu

Fin del Ejempto i.5

Ejemplo 1.6: crear un Archvo de Notas para una


crase
En ste ejemplo se muestra cmo trabqar con
estructuras y escribrfas a un archivo de
datos. considere fa siguiente estructura para
esta apricacin:

Unidad

l:

Manejo de

Arci;n

C
@ Copyright tBM

Volumen 6: Tpicos Rvanzados 10

Corp. 2002
Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin el permso previo escrito de IBM

ra

o F
o il,
o
o
o
o
o
o
I

o
o
o
o
o
o

o
o
o

Gua del

float

I
I

notas [6]

/* notas de 5 cursos */

;
Suponga datos para un mximo de 100 .estudiantes que deben ser ledos desde el
teclado y escritas en el disco. Se asume el final de la entrada cuando el usuario ingrese
el carcter $ en la primera posicin del idno. Esto es ms realista que tomar enormes
cantdades de datos como entrada desde el teclado. En este ejemplo, se crea un rea
de buffer con una variable puntero, como mark3rr. Entonces se abre un archivo
lfamado history.dat refirndose al archivo de datos de notas. Existe una asociacin
creada entre el archivo history.dar ! la variable puntero in_mark3rr. El archivo de
dato se abre para escritura. Note que se escribe los datos al ahivo?e datos usando la
funcin fprintf. La sintaxis de la funcin rprinrr es similar a la funcin printf, lO
nica diferencia notable es el uso de la variable puntero de flujo como el primer
argumento en la func fprinrf . La cadena de formato usa las mismas caracteristcas
de la funci prinrf .
El cdigo C inicia aqu...

,/* Programa para crear un archj-vo con las not.as de los


estudiantes * /
/* Archivo de cabecera */
#include <stdio.h>
#define SIZE 2
/* Estructura que almacena Ia informacin de un estudiant.e *,/

a
e
o
o
o
o
o
o
o

Introduccin a la programacin con C

struct lista_notas t
char idno [9] ;
char nombre [+5] ;

Estudiante

typedef struct {
char idno [9]
char nombre [45] ;
f loat notas [6]
,.

,.

/* noLas de los seis cursos */

r,rsra_HorAS;

/* Funcin para leer los daEos del usuario y almacenaros en


archivo *,/
vo j-d almacenarDat.os ( ) {
FfLE *in mark3t.r,.
LISTA_NOTAS

in_stud ISIZE]

int j,k;

l,

/* Abrir archivo para escritura *,/


in_mark3tr = fopen( uhist,ory.datt',,,wn)

It

, orumen 6:
@ Copyright IBM Corp. 2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM

un

Introduccin a la programacin con C

Gua del Estudiante

/* Leer t.odos 1os daEos de 1os estudiantes de parte


de1 usuaro */
k = 0;
while (k < srzE) {
Print.f ( "fngresar fDNO\nr)

scanf ( n?ru, j-n_st.ud [k] . idno)

fflush(srdin);
Printf ( "fngresar Nombre\n" ),.
scanf ( u *, u, in_stud [kj . nombre),.
printf("fngresar las noLas de Ios 6 cursos\n,,);
for(j=0;j.6;i++)i
do{

print.f ("Notas de1 Curso No: ?d IO-100j \n,,, j+1);


scanf ("?f u, &in_stud tkl . notas I j ] )
(
(in-stud
)whi1e
[k] -noras tjl <0)' I | (in-sLud lkj .noras tj] ,1oo) ) ;
,.

l
k++,.
)

for (k = O; k < SfZE,. k++) {


fPrintf (in_mark3tr, ', ?s\',, in_stud [k] . idno) ;
fPrintf (in_mark3Lr, ', ?s\', , in stud fkl nml-rra\.
for (j = O; j . 6; j++)
fprintf (in_mark3tr, ',?f \n,,,
in_srud [k] . noLas tj I ) ;
)

* cerrar archivo *,/


fclose (in_mark ptr)
/

,.

/* Funcin para leer datos de1 archivo e imprimirlos */


void recuperarDatos O {
FfLE *out._mark3tr,.
LISTA_NOTAS out_stud ISIZE] ;
int j , k,.

/* Abrir archivo

modo lectura */
out_mark__ptr = fopen ( r'hi-story. dat rr , rrr'r ) .

/* Leer t.odos los datos de estudiantes deL archivo */


k = 0;
while (k < srzE) {
Unidad 1; Manejo de Archvo en C

Volumen 6: Tpicos Avanzados 12

@ Copyright tBM Corp.2002


.
Los materiales

del curso no pueden ser reproducdos total


o parcialmente sin elpermiso previo escrito de IBM

olt
o

o
o
o

Gua def Estudiante

fscanf (out_mark_ptr, "?s?s", out stud IkJ - idno, \


out_stud [k] .nombre) ;
for (j = 0; j < 6; j++)

ol
ol

(out-mark3tr, "tf,, , \
&out_srud [k] - noras ij I ) ;
f scanf

Ol

oi

k++,'

o!

/* cerrar archivo */

(out_mark_ptr ) ;
for (k = 0; k . SIZE; k++) {
printf ("\n?s: ?s\n,',
out_stud [k] . idno, out_stud [k] .nombre) ;
printf ( "Notas en los cursos: \n,,) ;
for (j = 0; J . 6; j++)
printf (*26.2f \n", out_st.ud Ik] .notas ij I ) ;
f c lose

o
o
o
a
o

o
o
o
o

/* La funcin main inicia agu */


mainfl {

3
o
o
o
a
o
o
o
o
?
a
?

I
I
I
b
I
p
l
p
fo

l.
p
lo

almacenarDatos O ;
recuperarDat.os O ;
)

/* La funcin main finaliza aqui */


El cdigo C finaliza aqu

Nota: Cuando se abrieron los archivos no se verfic por NULL. Se requiere que se
incluya una verificacin por NULL cuando se ejecute este programa en la
computadora.
Fin del Ejempto 1.6
Resulta obvio que usar archvos de datos no es slo leer y escrbir archivos
de texto. Se
necesita procesar datos en un archvo de datos, actuali2ar valores que
requieren ser
modiflcados y hacer muchas otras tareas relaconadas. Generalmenie
un archivo de
datos tiene que ser ledo as como se tene que escribir en t. Escribir
un archvo de
datos puede tomar la forma de registros siendo aadidos, regstros
siendo bonados,
c,3ntenido de regstros siendo cambiados o registros siendo
anghdos. riiiguiente es
-1 mtodo pa.a realizar esta actividad:

.
'

'

Tener dos archivos diferentes, uno para entrada y el otro para salida.

La idea es leer del archivo de entrada, hacer el procesamiento y escribir

registros alarchivo de salida.

Una vez que todo esto se ha hecho, bonar el archivo de entrada vejo y

reemplazar ste con un archivo nuevo.

@ Copyright tBM Corp. 2002

Los materiares der .*rrso no pueden ser reproducrdos total


o parcialmente sin el permiso previo esctito de IBM

Gua del

Es::: a^::

Otro mtodo de hacer esto se da a continuacin:


Leer un registro desde el archivo.
Procesarlo y escribirlo de vuelta en el mismo archivo
reemplazando el registro.
Nota: Es difcf feer y escribir datos con formato, en
el mismo archivo de datos.

o
o

3.

Archivos de Texto y Binarios

Los archivos de datos.ledos y escritos a un disco pueden


ser clasificados como texto y
binarios, basado en cmo el archivo se abre p"r"'"J
uso. Los arcnvos oe texto y los
binarios difieren en tres reas:

.
.
.

La forma en que los caracteres de nueva tnea


se manejan.
La forma en que el fin de archivo se maneja.
La forma en que los nmeros se almacenan.

3.1. Manipular los Caracteres de Nueva Lnea


En el modo texto, el carcterde nueva lnea]newline)
se
carro y cambio de lnea' (caniage return cd y tinfeed convierte en un,retorno de
- tr), v
scritos en el
disco' De la misma forma cuado se lee del isco,
l 'retorno
cambio de
lnea' se traduce a un carcter de nueva lnea. cuando
el archivo se abre en modo
binario, estas conversiones no ocurren. Para abnr
un archivo en mooo oinaro, se puede
usar lo siguiente:

i;"*
";;"t

fpCr = f open (,.miArchivo - iat,, ,,,rb,,) ;


se puede usar 'b" para indicar que el archivo es abierto en
modo binario. Adems se
puede especificar "{' para indicar modo texto,
este ltimo puede ser omitido al ser el
vafor por defecto.
3.2. Manpufar et Fin de Archivo (EOF)
cuando se usa en modo texto, se inserta un carcter
corno
valorASCll ze para indicar el fin de archivo. En un archivo, ltimo, un carcter con el
siempie fr"
valorse
encuentra, la funcin read retomar eo' al programa
que to flama. En ""t"
los
archivos
modo binario, no existe un carcter especiaf par
marcar el fin de archivo; El fin de
archivo se deduce por el nmero de caracteres presentes
en la entrada del directorio

delarchivo.

Nota: un nmero afmacenado en modo binario debe


tambn feerse en modo binario. si
se almacenan en modo texto, un nmero vlido como
26 enASClt siempre significar
un EoF, y esto termina ra rectura der archivo
ms temprano.

3.3. Manipular el Atmacenamiento de Nmeros


Se ha usado slo la funcin fprintf hasta ahora para
escribir datos a archivos. un
carcter se almacena como i oe en memoria.
Pero fprinrf no almacena los
nmeros, como dos bytes se neesitan para int y
cuatro bytes para

floae.

Unidad 1: Manejo

Oe Rrcfivo

en C

Volumen 6: Tpicos Avanzados

@ Copyright tBM Corp.2002


.
Los materiales

del curso no pueden ser reproducidos total


o parcialmente sin elpermiso previo escrito de IBM

Los

l4

o
,

il

o
o
o
o
a

il

4. Manipufar Archivos de Datos Sin Formato

oI

ol
o,
Or

oi
oi

lntroduccin a la Programacin con C

numeros se almacenan como cadenas de caracteres. Por ejemplo, un nmero como


5643 se almacena en cuatro bytes. Un nmero punto-flotante como 25 .625 se
almacena en seis bytes. Esto significa que si los archivos texto se usan para
almacenar nmeros grandes, no sern eficientes ya que ocuparn mucho espacio. Una
buena idea es abrir el archvo en modo binario y usar ias funiions f read f write.
1l

a
o

Gua del Estudiante

El.lenguaje C provee una amplia variedad de formas para representar los datos dentro
del programa. Los datos pueden ser almacenados en estructuras de datos complejas
como aneglos, estructuras o uniones. El alcance de los elementos de estos pbs'de

datos est limitado al del programa; estas entidades no existen ms all de la ejcucin
def programa. Puede tenerse un requerimiento de que estos datos sean persistentes
entres dos ejecucones del programa para el cual C provee una solucin a travs de una
facilidad para manipular tipos de datos sin formato.

ot

Es posible hacer fluir cualquier tipo de dato definido en C (aneglos, uniones o


estructuras) a un archivo de datos y recuperar los datos de vuelta d varotes del mismo
tpo de dato, usando las funciones de librera de C rreaa fwrire. Estas funciones son
/
llamadas funciones de lectura / escritura sin formato.

Los archivos de datos sin formato se llaman as porque contienen algn texto sin
formato. No se pueden abrir y ver con un editor de texto.

ol

q
q
q

o
?

?
?

Las funcios f read

! fwrite

requieren de los siguientes cuatro argumentos:


Un apuntador a bloque de datos
El tamao del bloque de datos
El nmero de bloques de datos que estn siendo manipulados
transferencia
Un puntero de flujo
El siguiente es un uso tpico de fwrite.

.
.
'
.

write ( &stud, szeof (Lf

STA .NOTAS )

, mark3tr)

en la

Aqu, scud es la variable estructura del tipo r,rsra_worAs, y markjrr es le puntero de


flujo asociado con el archivo de datos (histort-al.dar en nuestro ejemplo). i- indica el

nmero de bfoques que estn siendo transferidos. El operador


sizeof (LrsrA-NorAs) retoma el nmero de bytes requeridos para una estructura

que es entrada.

Ejemplo 1-7: crear un Archivo de Datos sin Formato de Notas


El cdigo C inicia aqu...

/* Programa para crear un archivo con las notas


de un in_studenE *,/
/* Archvo de Cabecera */
#include <stdio.h>
#define SIZI. 2
Volumen 6: T
@ Copyright tBM Corp.2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM

Gua del Estudante

/* structura in_sLudent */
typedef struct {
char idno [9] ;
char nombre [45]
f loat notas [5]
,/* notas de los 6 cursos */
,.

,.

r,rsra_norAs,.
para obLener dat.os del usuario y almacenarro
'/* Funcin
en un
*,/
archivo

void almacenarDatos O {
FfLE *in_mark3tr;
LISTA_NOTAS

inr j

in_srud ISIZE)

k,.

,/* Abrir archivo modo escritura */


in-mark_ptr = fopen (rhistory.dat,,,,,rb,,,.
/* Leer 10s datos de todos 10s estudiantes de
usuario */
k = 0;
white (k < srzE) {
Prlntf ( "EnLer f DNO\n,') ;
scanf ( " ?s,, , in_stud Ik] . idno) ;
f f Lush (stdin)
printf ( ,,rngrese e1 Nombre\n,, )
,.

scanf ( u?"u, in_stud [kj .nombre),.


printf ("fngresar 1as notas de los 6 cursos
\n,,),.

for(j=o;j.6;j++){
do{

print.f ( "Notas de los Cursos No: ?d


\
[0-100] \n", j+1) ;
.
scanf (">f", &in_studtkl .notas
ijl );
]whi1e( (in_srud[k] .noras tjl<o) I I (in_srudlkl .nocasijjrroo
,
)

k++,.
)

for (k = o; k < SIZE;

k++)

fwrit.e (&in_stud [k] , sizeof

I, in_mark3Lr),.
/* cerrar archivo *,/
f cLose (in_mark3tr)
;

(NOTAS_LIST)

, \

/* Leer 1os datos de1 archivo e imprimi rlos *


/
void recuperarDatos o {
Unidad 1: Manejo ?nrcf,iuo EnE
@ Copyrighr

Volumen 6: Tpjcos- Avanzados 16

tBM Corp.20O2
Los materiales delcurso no pueOen'seiiproducdos
totat
o parcialmente sin el permso previo es;rito
de IBM

ar
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

lntroduccin a la Proqramacin con

FfLE *out_markjtr,.
LISTA_NOTASout_stud ISIZE]

int j, k;
/* Abrir archivo modo lectura */
out_markStr = fopen ( t'history. daE,', r'rb', ),.
/* Leer todos los datos de1 estudiante del archivo*,/
k = 0;
while (k < SIZE) {
fread(&out_scudIk], sizeof (NOTAS LIST), 1,
out_mark3tr) ;

o
o

o
o

k++,'
]

o
o

/* cerrar archivo */
close (out_mark_ptr) ;
for (k = 0; k < SfZE,' k++)
f

printf

"\n?s: ?s\n",

out_stud [k] . idno, out_stud [k] .nombre)

o
o

printf ('rNotas en 1os Cursos : \n" )


for (j = O; j . 6; j++)
printf ("26.2f\n", out_studtkl .notas tjl
,-

);

o
o
o
o
o
o
o
o
o
o

! nico cambio significativo que se ha hecho al ejemplo anterior es el uso de la funcin


:;':-:e en vez de la funcin fprintf. Note que tambn se ha usado otra funcin

:-

/* La funcin main
mainO {
almacenarDatos

comienza
(

antt

* /

);

recuperarDatos O ;
)

/* La funcin main termina aqui * /


El cdigo C termina aqu

.-eda

sizeof o , la cual retoma el rmero

de bytes requeridos para una estructura

es entrada.

:.

Ejemplo 1.7

b
b
fo

t-

p
!o

@ Copyright IBM Corp.2002


Los materiales del crrso no pueden ser reprcduddos total
o parcalmente sln elpermiso prevo escrito de IBM

Introduccin a la programacin con


C

Gua

c:

;_.:_::_:_

Resumen
Ahora que ha compretado esta unidad,
usted debe ser capaz de:
Reconocer reas de sotucin de problemas
que requieran la necesidad de leer y
escribir datos en dispositivos de armacenamiento
secundario
Discutir cmo manipufar archivos de
datos en C
Discutir los
manejar arcnvos rJntaoos a flujo en
liiofos para
c
iunciones'de ribrer qr"
reer y escribr

'
.
'

' ffffJgd'r;ffi:r

Unidad 1: Manejo sArchvo

enT
@ Copyrighr

"vro"n ^'"r""r,

Volumen 6: Tpicos Avanzados 18

tBM Corp.2002
tos materiales def curso no pueden ser reproducidos
totaf
o parcialmente sin ef permiso prevo estrito
de IBM

o
o
o
o

Gua del Estudiante

o
o

Unidad

o
o li
o li
o
o F
o F
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

1)

o
o
o
ol
O,

q
q
q

2)

gets (miString) ;
scanf ( *?s., &mistring) ;
getc (miString) ;
fscanf (fp, ..?s,,, emiString)

Dnde est la estructura llamada FrLE definda como una macro?

a) ctype.h
b) stdio.h
c) siri ncr l

d) stdlib.h

3)

Uno de los mayores problemas de los archivos de datos es que los programadores
tienen que manejar los buffers.

a) Verdadero
b) Fafso

4) Si un archivo se va abrir en modo slo fectura, elarchivo debe existir.


5)

a) Verdadero
b) Falso

Si un archivo se abre en modo escritura, y si el archivo ya existe, el archivo viejo


es borado, y un nuevo archivo se crea.

a)
b)

Verdadero

Falso

6) Cules de las siguientes actividades se realizan cuando un archivo se abre en


modo lectura?

a) Una asociacin se establece entre et nombre del archivo y el reade buffer


b) Una verificacin se hace para determinar si el archivo existe para abrirse para
lectura

c)

Un puntero se crea para apuntar al primer carcter que pueda ser ledo dentro
en elarchivo

d)

Todas las anteriores

{
@ Copyright tBM Corp. 2002
Los materiares dercurso no pueden ser reproducidos totar
o parciafmente sin elpermfso previo escrito de tBM

Exmen de Autoevaluacin

d
q

ramacin con

Asuma que se desea ingresar como entrada una cadena de caracteres (string) y
llevarlo a un aneglo lfamado char miString [so; , Cut de las siguiee
funciones ser la ms adecuada pqra este propsito?

a)
b)
c)
d)

l:

Introduccin a la

7) Cules de las siguientes se puede usar para leer y escribir archivos


formato?

de datos con

a) fscanf
b) fprinrf
c) fread
d) fwrire
8)

cules de los siguientes se puede usar'para leer y escribir archivos


de datos sin
formato?

a) fscanf
b) fprinrf
c) fread
d) fwrire

9) En un archivo de texto, el carcter de nueva lnea es


a) Escrito como es o ledo como es

10)

b) Traducido a los caracteres cn y r.r


c) Traducido slo alcarcter cR
d) Traducido slo alcarcter lp

En un archivo binario, elcarcterde nueva lnea


es
a) Escrito con es o fedo como es

b) Traducido a los caracteres cR y r,r


c) Traducido slo al carcter cR
d) Traducido slo al carcter r,,

Unidad 'l: Manejo e nrcnivo

eE

Volumen 6: Tpicos AvanzadosE


Copyright tBM Corp.2002
Los materiafes del curso no pueden ser reproducidos
total
o parcialmente sin elpermiso previo escrito de IBM
@

o
o
o
o
o
o
o
o
Ot

o
o
o
o
o
a
o
o

Gua del Estudiante

lntroduccin a la Programacin con C

Respuestas a la Unidad 1: Exmen de Autoevaluacin


1)a
2)b
3)b
4)a
5)a
6)d
7) ayb
8) cyd

e)b
10) a

o
o
o
o
o
a
a
a
o
o
o
o
o
o
o
o
o
o
o

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln elpermiso previo escrito de IBM

Introduccin a la programacin con C

G,; a

ce !s:_: =-

Unidad 2: Laboratorio de Manejo de


Archivos en C
Objetivos de Aprend izaje
Al finalde esta unidad, usted ser capaz de:
Usar archivos de datos para solucionar problemas
usar archivos de texto en c para sorucinar probremas
tpicos
Emplear archivos sin formato en un programa en
C

r
.
.

Unidad 2: Laboratorio de Manejo O nrcf,uos en C


Vofumen 6: Tpicos Avanzados 22
.Los materiales @ Copyright tBM Corp.2002
del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

-!-

o
o
o

o
o
o

Gua del Estudiante

Ejercicios de Laboratorio
1) Considere un archivo de texto que contiene oraciones en ef idioma espaol. Los

caracteres de puntuacin comunes son: punto, coma y los signos de interrogacin


que pueden estar todos presentes. El probfema consiste en leer el archivo de texto
y contar ef nmero de ocunencias de palabras de una letra, palabras de dos letras,
palabras de tres letras, palabras de cuatro letras, y todas las otras palabras con
ms de cuatro letras. El programa debe imprimir el nmero de ocurrencia de cada
tipo de palabras, tal como se muestra a continuacin:

o
o
a

Nmero de palabras de una letra = 23

o
o
o

Nmero de palabras de dos letra = 55


Nmero de palabras de tres letra = 124
Nmero de palabras de cuatro letra = 43
Nmero de palabras mayor a cuatro letras = 39

oi
o

oi
o.

oi
oi
ol

Introduccin a la Programacin con C

2)

Considere la estructura llamada nombre que tiene un primer_nombre,


segundo_nombre y apellido, cada mo uno es un aneglo que contiene 45
caracteres. Escribir un programa que crea un archivo de datos sin formato que
contenga una lista de nombres como se mencion anteriormente, que se leen
como entrada desde eltecfado. La entrada se termina cuando el usuario ingresa el
smbolo g como el primer carcter de un nombre. Ahora, usando el mismo archivo
de texto, leer los nombres y crear otro archivo con los nombres ordenado de la
forma ape11ido, primer_nombre y segundo_nombre

o
o

a
a
a
o

?
e

t
?
?

e,^ C 23
@ Copyright IBM Corp. 2002
Los materiales del curso no pueden ser reproducldos total
o parcialmente sin el peniriso previo escrito de IBM

o?
o
o

o
o
o
o
o
o
o
o

o'
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin a la Proqramacjn con C

unidad 3: caractersticas Adicionales de

Objetivos de Aprend izaje .


Alfinalde esta unidad, usted ser capaz de:

.
.
o
.

Declarar y usar enumeraciones en C


Describir los argumentos de la lnea de comandos
Definir las macros y usarlas en los programas
Discutir algunas funcones del preprocesador de C

o
o
o
a
a
o
o
o
o
o
o
o
o
o

'. :l-umen 6:

Avanzados

rc

@ Copyright IBM Corp. 2002


Los materiates der curso no pueden ser reproducidos total
o parcialmente sin el permlso previo escrito de tBM

"

l. lntroduccin

Esta unidad cubre diferentes tpicos

que van desde ra enumeracin hasta


ras directivas
del preprocesador' un progr-a grande
en c Li casi todas t", rr.ltordes que
presentan en e-sta unidad, junto
se
con las estructuras de conirol y tipos de
relevantes estudiados en ta unioa
datos
a l - uaieo-iircnvos en c.

2. Enumeraciones
Existen muchas entidades en un
sistema dado, fas cuares pueden contener
uno de un
conjunto posibfe de vafores. Por ejemplo,
la
puede tener er varor azul,
verde' amari11o, rojo y as sucesivamente.
"tiJJcoror
similarmente. la entidad flor puede
contener el valor rosa' girasol,
y
as
para caprurar estas
sucesivamente.
entidades definidas por utr*io y
sus posibfes vafores, ei rengua.le c provee
un
mtodo poderoso a travs de la enumeracin.
considere fos siguientes casostipo de dato booleano puede ser
un usuario puede pon"o" ii un
o fafso.
,no'0" ras ifiuiI piezas de vestinverdadero
jeans, pantarn,
curtivar no'""" v
una de ras sisuietes: rosa, lirios,

lirio

liilSiij:":',:il:".r"':,:ij:::",

'oio

En todos los casos anteriores hay

conjunto de valores para un tipo de dato


y las variables de esb tipo oe dtounpued
particular
contenei rto ,no de esos de

momento determinado' Para representar


esta situacin del mundo ,..l
en C, se puede usar el tipo de dato
ttamado
enum

"n

varores en un
un programa

La sintaxis es fa siguente:
enum nombre_del_enumerado

{miembrol, miemb:c2, -.., n:er.bron},.


una vez definida la sintaxis, se presenta
una forma de representar el tipo flor
en c.
Ejempfo 3.i: Tipo Flor
suponga que se quiere definir un tipo
de dato prr"
flores. sea fa siguiente oectaracn",
o" enumerados:

los dferentes tipos de


"h""enar
enum flor { rosa, lirio,
margarita, narcisc, c1a;e1 ),
enum flor alicia, jessica, shirley,
stefft;

I::""*:

r'""r"#Slracin

contiene cinco constantesi

rosa, 1irio, marsarira,

Aqu' enum es una palabra reservada.


Nombre-del-enumerado S un nombre
que identifica la enumeracin.
opcionat
miembror., miembroz, etc. son ras constantes
de ta
enumeracin

y deben ser distintos de otro identificador


usado.
se ha definido, arice, jessica, shirlev y
sreffi como variabres der tipo
combinando fos dos anteriores, la
sig;iente crarcon -s equivarente:
enum flower { rosa, 1irio, margarit.a,

jessica, shirley, steffi;

undad3'caract@

fl0r.

narciso, clave1 } alice,

Volumen 6: Tpicos 4vanzados 26


Copyright tBM Corp.2002
Los materiales det curso no pueden ser
rproOuciOos total
o parcialmente sin el permiso previo
estrito de IBM
@

ot
o
a
o
o
o
o
o
o
o
o
o
o
o
o
a
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudante

amacin con C

Nota: El nombre-de1-enumerado specificado no siempre es requerdo.


Lo cualsignifica, que puede tambin ser escrito como sigue:
enum { rosa, lirio,
margarita, narci.so, c1ave1
shirley, stef f i,.

} a1ice, jessica,

Asa rosa se le asigna a o,liriose le asigna 1, margarita se le asigna 2 y as


sucesvamente hasta alcanzar c1ave1, al cual se le asigna +. El usuario pede
sobrescribir la asignacin automtica de los valores enteros para las constantes
enumeradas. Por ejemplo, en una sentencia de asignacin, se puede escribir miembro
= int en la definicin/declaracin de la enumeracin. Sea la siguiente declaracin:
enum flor { rosa=3, 1irio, margarita, narciso=J-0, c1ave1

};
Esto asigna 3 rosa, a 1irio, 9 a margarita, 10 narciso y - aclavel.

Es posible para dos constantes enumeradas tener el mismo vafor entero asignado. Las
variables enumeradas se pueden usar de la misma forma como las variablesLnteras en
trminos de operaciones realizadas sobre elfas y escribir la sentencias de asignacin.

Sin embargo, las constantes enumeradas no pueden ser ledas como entrada o
mostradas como salida.

Fin del Ejemplo 3.1


Una vez visto esto, se presenta otro ejemplo que define la enumeracin de diferentes
marcas de pasta de dientes y define su asociacin con diferentes miembros en una
familia.

Ejemplo 3.2: Tipo de Pasta de Dientes

se puede definir una enumeracin para pasta de diente como sigue:


enum pasta_de_dient.es {co1gate, closeup, forhans, anchor,
pepsodent )

,-

Basado en esto, se puede tener las siguientes sentencias vlidas en c:

Elcdigo C comienza

aqu...

past.a_de_dientes mipasta, miEsposa, miltijo, miHija;


mipasta = col_gate;
myEsposa

= anchor,.
if (miHijo == closeup)

el,se

miHija = (pasta_de_dientes) ( (mipasta + miEsposa) t 2) ;


switch (miHijo) {
case colgate:
case forhans:
I
t

t
t.

b
o
o
l

@ Copyright IBM Corp.2002


Los materiales del curso no pueden ser reproducldos total
o parcialmente sln el permiso previo escrito de IBM

Introduccin a la programacin con


C

Gua del Estudiante

El cdigo C finatiza aqu


Fin det Ejempto 3.2

La enumeracin aumenta ta claridad de fa


fgica def programa. Nmeros mgicos
(valores codificados) usados
i ptograma
-eor tienden a reducir la legiblidad y a hacer
difcil el mantenimiento del p.gtr.
"n
eempL-,"rl," intercara generosarnente e
nmero 3'141en ef prograt, t s
evident p"r" Lr que fee er programa que
-similarmente,
se est
refiriendo al nmero pi'
si se tiene- p representar la pasta de
dientes
colgate, 2 para croseup, etc. s grega.
una
caiga
mayor
para
reer
y
entender
programa' Las variables enumeoo_":.
ef
!,ros.varielayudan a adherirs a ro que es
lgico y normaf, dentro det dominio p"rti"rr"t
oe ua pficacion.
Nota: La enumeracin no provee una nueva
capacidad, es slo una mejora a la claridad
delprograma.

3. Argumentos de ta Lnea de comandos


se sabe que la funcin main ( ) es et punto de
entrada al programa. En los ejemplos
presentados hasta ahora se ha usado
maiL ( ) sin argumentos. Es posible
Que main ( )
tome parmetros de entrada desde fuera.
Esto se lolra teniendo dos argumentos
en la
funcin main ( ) llamados

argc

".s;-t;;;r.

es un variable entera

.];ilrff

un arreglo de punteros a caracteres, o un


arreglo de cadenas de caracteres

Aqu' cada cadena de caracteres en et


arreglo representa un parmetro que est
siendo
pasado a main' argc indica el nmero
de parmetros pasados de esta forma. El
prototipo de la funcio main tene
estoi dos parmetros y se muestra a continuacin:
void main(int argc, char *argv[])
{

Se puede ejecutar un programa c desde


dentro de un men de ompilador para
c
(como en windows), o'deibe el nivel
de So como un comanoo (como en unix). por
ejempfo, en unix, se pude ingresar el program
a paraser ejecutado como sgue:
miprog

3#::nrra

ejecutabfe, aqu, se ilama mipros, er cuar puede


tambin ser Qecutado

miprog colgate anchor


se puede pasar argumgtOs para un programa
a travs de ta fnea de cornandos, como
se muestra a continuacin:
miprog colgate anchor
La versin generafizada del codigo anterior
es como sigue:

unidadg'cara@

Vofumen 6: Tpicos nvanzados 2g

Copyright tBM Corp.2002


Los materales del curso no pueden ser
reproducidos total
o parcialmente sin ef permiso previo
de IBM
@

"rtrito

o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

nombre-de1-programa parametrol parametro2

o
o
o
o
o
o
o
o
o

.--

parametron

Argumentos

Valores

argc
argv [0J
argv [1]
argv [2]

miProg

colgat.e
anchor

Tabla 3.1: Parmetros Asignados a los Argumentos en ta Funcin main


O.

Los argumentos pasados a un programa a travs de la lnea de comandos usuatmente

se delimitan con espacios en blanco o tabulaciones. A continuacin se presentan

algunos ejemptos para entender el uso de la lnea de comandos con argumenios.


Ejemplo 3.3: Usar argc, argv
El cdigo C comienza aqu...

/* Archivo de cabecera */
#include <stdio.h>
/* La funcin main comj-enza aqw */
mai-n(int argc, char *argv[] ) {
int k;
printf (,,E1 valor de argc es ?d\n", argc);
for (k = 0; k . argc; k++)

o
o

/* La funcin main termina aqu */

o
o

o
o
O

o
o

nvi-+/rr^-gv

?d es ?s\n,',

k, argv[k]);

El cdigo C finaliza aqu

Se sabe que argc contiene el nmero de parmetros pasados en la lnea de


comandos, as que se confgura una estructra iterativa que ayude a imprimir los

argumentos.

Fin del Ejemplo 3.3

Iq

Ejemplo 3.4: argc, argv en un Aplicacin Tpica

,t

En el caso anteror, los parmetros son asignados a los argumentos como se muestra
en la Tabla 3.1.

o
o

Introduccn a la Programacin con

En este ejemplo se ilustra el uso de argc y argv en una aplicacin tpica que
copia un
archivo a otro. Sin. embargo, no se escribira h lgica
as
sentncaJ-lue hacen
1
'ealrnente fa copia) sino que simplemente se plesenta la estructura para pasar
alumentos a travs de la lnea de comandos. Hay que recalcar que en un SO como
Ur:ix. se puede decir lo siguiente:

@ Copyright tBM Corp.2002


Los materiales delcurso no pueden ser reproducidos totat
o parcialmente sin el permiso previo escrito de IBM

studiante

cp archivol archivo2
se debe tener la posibitidad de leer los dos nombres
de archivo como argumentos.
siguiente fragmento de programa
hace eso:

El cdigo C comienza aqu...

/* Archivo de cabecera */
#include <stdio.h>
/* La funcin main inicia agu ,t/
main ( int argrc, char *argv []
) {
,/* buffers para dos archivos */
FfLE *in_fi1e, *out_fiLe,.
,/* Abre un archivo para lectura */
in_f i1e = fopen (argv If ] , ,,r,')
if (in_fite == NULL)
printf("Ocurrio un error abriendo e1 archivo\n,,);
,.

eJ.se

out._f i1e = fopen (argv[2] , ,,wr,)


if (our_fit-e == NULL)
printf ("Error en e1 archivo de salida\n,,),.
el-se i
/* copiar el archivo de entrada af
archivo de salida */
,.

/* cerrar e1 archivo */
fclose (in_fi1e) ;
)

/* La funcin main termina aqu */


Ef cdigo C termina aqu

Fin del Ejempto 3.4

4. Macros
se us anteriormente la siguiente sentenca para
definir constantes
#define pf 3.14

ffii5,tgX,toto

Tpicamente en programas, se encuentra


un
de cdigo simpfe,
puede usar para ej_e:utar una tarea particufa.r.fragmento
pr eiempfo, el clculo del el cual se
rea de un
crculo puede ser este segmento o
&'oigo simple. ri l"rigr"" c provee una forma
de
maneiar estos segmentos de codigo simples
usndo las macros para definir una smpfe

Unidad3,Carac@

Volumen 6: Tpicos Avanzados 30

Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermiso previo escrito de
IBM
@

El

ot

o
o

o
o
o

oi
o,

o;
o;
o
o
o

o
O

o
o
o
o
o
o
o

Gua del Estudiante

Una vez presentadas, es importante notar las ventajas de las macros con respecto a las
funciones. Las macros proveen una mejor velocdad de ejecucin en comparacin con
las funciones. El costo adicional de las llamadas a una funcin con respecto al manejo
de la pila, la lfamada y el retomo no estn presentes en las macros. Sin embargo las
macros incrementan el tamao del codigo objeto. Cuando se usan las macros, los
programadores deben decidir entre el tamao del ejecutable y la velocidad de ejecucin.

Las referencias a macros ene tambin ciertas desventajas. Sin embargo, se necesita
entender las macros bien antes de discutir las desventajas. Vase a continuacin
algunos ejemplos del uso de las macros.
Ejemplo 3.5: Una Macro para elRraa de un Crculo

Elcdigo

/* La funcin principal se inicia aqui */


mainfl {
float radio;

o
o
o
o
o
o

I
I

G inicia aqu...

/* Archivo de cabecera */
#include <sLdio.h>
#define area de1 circulo 3.141 * radi-o * radio

oo(

printf ( "Ingresar e1 radio IO-32767) :")


scanf(ugfn, &radio);
)while(radio < 0 ll radio > 32757);
printf ( "El area del circufo es = ?f\n,', \
area_del_circulo)

/* La funcin main fina:..iza aqul */


El cdigo C finaliza aqu
es una macro que define una expresin : . rr * radio *
proceso
radi-o. Durante el
de compilacin, aree del_circulo se sustituye por la
expresin 3.141- * radio * radio.
Aqu

area_deI_circulo

Fin del Ejemplo 3.5


Consdere un caso, donde un grupo de sentencias realiza un trabajo. El conjunto de
expresiones se pudo escribir en ms de una lnea. Cmo se hace para representar los

deC3l

Avanzados

I
Y

expresin o un grupo de expresiones mmo un solo identificador. La funcionalidad


provista por las macros es la misma que las funciones en C, aunque la forma en que el
complador las maneja es un poco diferente a la forma como maneja las funciones.
Cuando la macro es referenciada, la referencia se reemplaza por definicin completa de
la macro. De otra forma las funciones y las macros tienen la misma funcionalidad.

o
o
o
o
o
o

Introduccin a la Programacin con

@ CoPYright IBM CorP. 2002

Los materiales delqJr5o no pueden ser reproducidos total


o parcialmente sin el permso previo escrito de IBM

Introduccin a la programacin con

Gua del Estu6;e^:=

mismos con una macro? En este caso, cada lnea de la macro


debe terminar con ej
carcter barra oblicua (slash).
Ejemplo 3.6: Macros Multi-lnea

A continuacin se escribe una macro que calcula el MCD de dos enteros positivos.
La
macro
presenta
se

a continuacin. Note que la macro requiere mltiples lne'as.

Ef cdigo C inicia aqu...

/* Archivo de cabecera */
#include <stdio.h>
/* Una macro mu1t.i-lnea para MCD */
#define MCD while (x l= 0 && y l= 0) \
if(xt=y)x=x*y;\
elsey=y?x;\
if (x == g respuesta = y; \
else respuesta = x,.
/* La funcin main se inicia aqui */
main O {
int x, y, respuesta,a,b;
/* La entrada x y y aqu */
do{

printf (,'\n Ingresar un entero [1-32't671 :


scanf ( "?d", &x

)whi1e(x<1 I I

x>32767)

,,) ;

do{

pri.ntf ("\n fngresar otro enLero


scanf

)whi1e(y<1 | I

[1-32 7671

");

?d", &y) ;
y>32767);
"

a=X;
h-r'. t
"-l
MCD

printf("McD de ?d y ?d es ?d :

,,

, a,b, respuesta)

/* La funcin principal finalza aqu */


El cdgo C finaliza aqu

Colo se puede

ver en la macro, tas mltiples lneas finalizan con el carcter


\, excepto
la ltima lnea. Esta se trata como una sentenca compuesta.
Tambin note que en la
funcin main, se ha escrito MCD sin la coma. cuando ef compilador
lee esta referencia
de macro, esta referencia se susttuye con elcuerpo de la macro.

Unidad 3: Caracterstcas Adicionales Oe C


Volumen 6: Tpicos Avanzados 32
@ Copyright tBM Corp.2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

a
a
o

o
a
o

Gua del

Estudiante

El cdigo C inicia aqu...

/* Archivo de Cabecera * /
#include <stdio.h>
/* Maero multi-1lnea para MCD */
/* La funcin main inicia aqu */
main O {
int x, y, respuesta,uin,
/* entrada x y y aqti */

o
o

o
o

oot

printf("\n fngrese un entero 17-327671: ");


scanf ( rtd", cx) ;
)whi1e (x<1 | | x>3276'7) ;

o
o

oot

o
o
o
o
o
o

printf

o
o

o
o

\n fngresar otro entero 17-32767J:

");

if (x>=y) x=xZy;
elsey=yZx;
if (x == 0) respuesta = y,else respuesta = x,printf ( UMCD de ?d y ?d es ?;d : ,' , a, b, :espues:a
if(x==0&&y==0)
printf ("\n Ambos enteros ingresados son O,')

o
o

("

scanf (r?d'r,&y);
)whi1e (y<1 | I y>32767) ;
a=x;
b=y;
whil_e (x l= 0 && y != 0)

o
o
o
o
o
o
o

o
a
a
o
a
o
o

lntroduccin a la programacin mn

,.

)'
/*

La funcin

finaliza aqui * /

El cdigo C finaliza aqu


Fin del Ejemplo 3.6
Una referenca a una macro dentro de una programa seala al comprilador reemplazar la

'eferencia por las sentencias contenidas dentro de una definicin de macro. Una
cefinicin de macro puede tambin contener argumentos encerados dentro de
3arntesis, como se muestra a continuacn:
#define MCD(var_x, var_y) while (var_x != 0 && var_y != O)
if (var_x >= var_y) var_x = var_x t var_y,. \

else var_! = var_! t var_x;


\
if (var_x == 0) var_reEpuesta = var_y; \
.:,:-fgn6:

T
@ Copyright IBM Corp. 2002
Los materiales del qrso no pueden ser reproducidos total
o parcialmente sln el permso previo escrito de IBM

IEs:,;: _::

el,se var_respuesta = var_x;


En este caso, la referencia a la macro se asemeja
a la llamada a la funcin, como
(x y) .

MCD

Ahora' que se ha entendido bien et concepto de


macros, se vern las dificultades de
usar macros dentro de los programas. conbcer
tanto Jas desventajasl ventaas de las
macros' ayuda al programador a decidir la conveniencia
de usarfas dentro de los

programas

El uso de fos parntesis dentro de fas macros puede


resultar en efectos secundarios
altamente indeseables. El siguiente es un excelente
ejempro del efecto secundario de
una macro:

#define raizcuadrada (x, y) sgrt (x*x + y*y)


Sse usa este como
raizcuadrada (x+1 , y+2)
se debera tomar

sqrr((x+1)*(x+1) + (y+2)* (y+z))


Pero por la susttucin de ra macro, se obtiene
ro siguiente:
sqrE (x+1*x+1 + y+2*y+2)

La cual no es lo que se desea. Realmente, ninguna


modificacin en el uso de los
parntesis va a rectificar el efecto
secundario ineseado en este caso. Este efecto
secundario ocure principalmente cuando se pasan
aigLmentos a tas macros. Tambin
se consdera el ejempfo 3.6 del MCD usanob
macroJ si un programador quiere usar
recursin' bs macros son una mala seleccin ya
qr" no pueden llamarse as mismas
recursivamente.
sustituir todas las funcones en un programa con
macros no ser posibre por sus
limitaciones inherentes. Las macros, a diferencia
de
las funciones, verifica slo el
nmero de argumentos pasados, no sus
tipos, lo cual
que las validaciones de
-- implica
'
las entradas errores se hace mejor en las
fr;;ir;r.

5. Directivas det preprocesador


El pre-procesamiento es. ef paso, quef precede a la
compilacin. Existen ciertas
directivas, lfamadas
t
prwistas rn c, 1", cuales pueden controlar
lirggtivas
el cdigo objeto producido. La siguite
"orplitao4,
es una tista de estas directivas:
.
.
o
o

o
r

#if
#elif

#e1se

#endif

#ifdef
#ifndef
#1ine

Undad 3: Caracterstcal nOicionZlesle


C

Volumen 6: Tpicos Avanzados


Copyright tBM Corp. 2002
Los materiales del curso no pueden ser reproducidos
total
o parcalmente sin el permiso previo escrito de IBM
@

j4

ot
o
o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o
o
a
a

q
a
)o

Gua del Estudiante

Introduccin a la Programacin con C

o #undef
El preprocesador incluye los siguientes tres operadores especales:

defined
of

.##
Estas directivas pueden aparecer eh cualquer fugar. Sin embargo, se usan
generalmente comienzo de un programa, por complacin condconal del codigo. El uso
ms comn es tener una sentencia de salda amplia e'l el caso del modo dpuracin
(debug) y una salida compacta en el caso del modo release ( versn).
A continuacin se discuten las directivas del preprocesador.

5.1. #ifdef y #endif

o #ifdef significa's definido' (if difined).


o #ifdef hace que un bloque de codigo se procese si el nombre de la macro
est definido.

Elsiguiente es fa forma general de


#

#ifdef ! #endif

i f def nombre_de_la_macro

,/* secuencia de una o

ms

sentencias

#endif
5.2.#indef y #else

. #ifndef
#ifdef.

signfica 'si no definido' (if not cbfined). Exactamente opuesto a

o #else es similar al else

en la estructura de control

if -else en C.

#ifndef DEBUG
/* c6dgo para proveer salida amplia */
#efse

/* cdigo para proveer una salida compacta */


#endif
s.3. #f
La directiva #if se puede usar para probar si el valor
de cero o no.

de

una expresin es dstnto

Lo siguiente es la forma general:

#if

exp

'''otumen 6: T
@ Copyright IBM CorP.2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

Introduccn a la programacn con


C

, E5rUCrenie

/* sentencias (s) * /
#endif
5.4.#etif
La directiva #elif se puede usar para
verificar mltipres condiciones en secuenca
(reduce el nmero de #endif
s).
La forma generalse da a continuacin:

#if expl
/* sentencia (s) *7
#elif exp2
/* sentecias (s *7
#endif

6. Operacones de Manejo de Bits


Se va a estudiar el. siguiente ejemplo para
considere una undado"n"to*"ii'ia'cuat entender ros operadores de mane;o de bits.
pueoe rii*n".tado a cuatro
orspositrvos
de hardware. usando un enter rirnpr" qr"
de. cuatro dgitos.
se puede
representar la existencia o no de
"onririe de narowar-e.
estos dispositivs
s,
er dgito
co'espondiente al dispositivo de hardwar"
r
ert
indica
ra
presen'a
dispositivo, y 0 indica la ausencia
de un
Jel dt:spositivo.",
Los dispositivos y ras posiciones
de ros dgitos se muestran en ra Tara
3.2.
Teclado

Dispositivo de

Ratn

Puerto serial para


rmpresora

Digito I

Digito 0

CD ROM

Digito 3

Digito 2

Tabla 3.2: Posiciones de los Dgitos y


de tos Dispositivos

;:frJfi::ti

larconclusin de la presencia de
tos dispositivos ctaramente se necesita
ta

La manipulacin de bit es una de


las caractersticas nicas.d" c. Esto
se puede aplicar
sofamente a operadores integrares;;;"
char y inr, con signo o sin signo.

Operadores Lgicos de Manejo deBit


Los siguientes son ros operadores
rgicos de manejo de bits:

ii

A
unidad 3'

i!' fl:,ffiff;".31j","

OR

exctusivo oe

o"
mano;;;it

catacte@

Volumen 6: Tpicos 4vanzados


36
Copyrighr tBM Corp.2002
Los materiafes det cuiso no pueden
ser reproOucOos total
o parcalmente sin el permso previo
de fBM
@

"rtrto

o
o
o

o
o
o
o
o
o
o
o
o
o

o
o
o

o
o
o
o
o

Gua del Estudiante

Introduccin a la Programacin con

El operador de manejo de bits AND (&) se usa frecuentemente para enmascarar un


conjunto de bits. Sea elsiguiente ejemplo.

a
= 37 = 0000 0000 0010 0101
b
= 88 = 0000 0000 0101 O11O
a & b = O4 = 0000 0000 0000 0100
Ef operador de manejo de bits oR ( l) se usa para cambiar los bts.

aIb=

119

oooo oooo 0111

o1l_1

El operador de manejo de bits oR exclusivo (^) coloca un I en cada posicin donde


sus operandos tienen bits diferentes y 0 donde los operandos son los mismos.

a ^ b = 115 = oooo oooo 0111


Operadores de Desplazamiento de Bits

oo11

Los siguientes son los operadores de desplazamiento de bits:


o <<- desplazamiento a la izquierda
. >>- desplazamiento a la derecha

Los operadores de splazamento << y >> desplazan al operando, a la izquierda y


derecha, el nmero de posiciones de bits dado por ef operando de la derecha, el cual
debe ser postvo. Por ejemplo:

. x << : desplaza

los bits o

x,

z posiciones a la izquierda, y asigna 0 a los bits

desplazados.
>> z desplaza los bits en
desplazados.

x,

z posiciones a la derecha

. x

o
o
o
o
o
o
o
o
o
o
o
o

6.1. Operadores de Manejo de Bits - Complemento

o
o

Los siguientes son los operadores de complemento de bits:


- el comlemento de uno (unario)

o-

El operador unaro

o,

asigna 0 a los bits

x
= 0010 0110 1011 0111
x << 3 = 0011 0101 1011 1000

por ejemp,o,

Jn;;"#.";;.

,;';;:,suma

que cada bit representa arsuna


informacin acerca del hardware de una computadora. Asuma que el bit 5 (a partir de la
derecha, comienza en 0) representa si la computadora tiene una mpresora nstalada o
no. Si est instalada, el bit 5 de este byte representa un 1, de otro modo un 0. Para
determinar esto, se puede desplazar ef byte dos posiciones a la Zquierda. De manera
que, el ltimo bit de este byte, despus del desplazamiento, ser un 1 o un 0. Se puede
buscar si este es 1 o 0 para verificar si el byte es un nmero positivo o negativo.

(-) convierte cada

1-bit a un O-bit, y un O-bit

a 1-bit.

a = 0010 i-011 0101 0111


-a = L101 0100 1010 1000
@ Copyright IBM Corp. 2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

Introduccin a la programacin
con C

Gua del Estudiante

6.2. Operacones de Manejo de


Bits: Un Ejemplo
Sea el siguiente segmento de codigo:

/* La funcin rotacin a 1a derecha se


:i:c:a aqu */
unsigned int rightrotate(unsignei
i:t: >:, uisigned int n){
unsigned int set., i,.

printf ("Tamao td\nu,sizeci (u::signeC


int) * 8 _ 1);
for( i = 1,. i <= n; i++l {
seE= (xaf)
* P
1\
-

X=X>>1r.

x =x I

Lt

set,.

return

x,.

La funcin anterior torna-x, y el


nmero de posicones a ser desplazadas
a la derecha, y
realza la rotacin' La funn pueJe
pequeo,talcomo:x=B yn a,2,3 ser probad a para un valor entero especfco y
=
x=4 n=i_,2 x=2 n=:,.-..
Hay muchas formas prctcas relacionadas
a las operaciones de manejo de bits, las
cuales van ms all del alcance Oeesia
undad.

Unidad3:

Caracte@

Volumen 6: Tpco-Avanzados 3g
Copyright tBM Corp.2002
Los materales delcurso no pueden
ser reproducidos totaf
o parcialmente sin et permiso previo
estrito de IBM
@

UJ

o
o

o
o
o

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Gua del Estudiante

Introduccin a la

Resumen
Ahora que ha completado esta unida, usted debe ser capaz de:
o Declarar y usar las enumeraciaciones en C
. Describir los argumentos de la lnea de comandos
. Definir las macros y usarlas en los programas
. Dscutr las funcones del Preprocesador de C

o
o
o
O

o
o
o
o
o
o
o
o
o
o
o
o
a
o
o
o
o
o
O

@ Copyright IBM Corp. 2002


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

dil tduur r t!

Gua dei Esruc

-::

Unidad 3: Examen de Autoevaluacin


1) Qu es una directiva del preprocesador?

a) Un mensaje del compilador af usuario


b) Un mensaje del programador af preprocesador
c) Un mensaje delprograma fuente af programa objeto

d)

2)

Todas las anteriores

una macro debe ser restringida a una definicin de una


sora rnea.

a) Verdadero
b) Fatso

3)

Nunca se puede ejecutar operaciones de E/S


con variables enumeradas.
Verdadero

a)
b)

4)

Fatso

si se tiene un identificador llamado scooby, se puede tener


tambin una constante
enumerada llamada scooby.

a) Verdadero
b) Fatso
5)

Se puede pasar valores enumerados a una funcin


a) Verdadero

b)

6)
7)

Fatso

En una macro, slo el nmero de argumentos se verifica pero


no sus tipos
a) Verdadero

b)

Fatso

La macros son realmente dentificadores en esencia.


As que, se pueden pasar a
las funciones como argumentos.
Verdadero

a)
b)

Fatso

8) En el manejo de archvos de datos,

qu es FrLE que se usa para crear un

puntero a un buffer?
Palabra clave
Funciones
Macro
Ninguna de las anteriores
Las macros pueden definirse y utilizarse en forma
recursiva.
Verdadero

a)
b)
c)
d)

e)

a)
b) Falso
10)

La definicin de macro se puede hacer de manera


anidada.
Verdaderos

a)
b)
Unidad

Falso

: CaractersticailEffi

nateGT

Volumen 6: Tpcos Rvanzados 4O


Copyrighr tBM Corp.2002
Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin el permiso previo escrito de IBM
@

o
o
o
o
o
o
o
o
o
o
o
o
o

o
o
o
o

F
>

i
?

D,

E!t

.
E

E
x

tfE

,--

Gua del Estudiante

lntroduccin a la P

Respuestas a la unidad 3: Examen de Autoevaluacin


1)b
2)b
3)a
4)b
5)a
6)a
7)a
8)d

e)b
10)

o
o
o
o
o
o
o
o
o
o
a
o
O

o
o
o
o
o
o
o
o
o
a
o
o
o
o

macin

@ Copyright tBM Corp. 2002


Los materiales delc{rso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

co'

unidad 4: Laboratorio de caractersticas


Adicionales de C
Objetivos de Aprend izaje
Al finatde esta unidad, usted ser
capaz de:
o Leer una descripcin compr"j"
probfema y entender sus implicaciones
usar algoritmos para todas ias0,"-:1
forma oe compte;idad considerndo
todas las
tcn icas de programa cn prenoias
a
;";

'
'

;;#",

$i5T,::5:JH"argoritmos

;f;ilJo::5"ntt 'n

en c usando

"r"rqri"r"

de ras caractersticas

prosrama completamente runcionar


que resuerve el

Unidad 4: Laborao

Los_materiaj",?"i:.?1#llF.[.:?'g":?ll*u",oostotar

o parcialmente sin el permiso previo


escrito cte IBM

fl

o
o
o
o

o
o
o

Gua del Estudiante

o
o
o
o
o
o
o
o

b)

completa en espaol, con las normas de puntacin permitidas.


Modificar elcontenido del archivo de texto y crear un archivo separado con las
slguientes caractersticas :

Todas tas palabras af inico de la sentenca deben estar en maysculas.


Los espacios en blanco deben ser removidos.
Tambin imprimir las estadsticas deltexto, como se menciona a continuacin:
. Nmero de caracteres

'
.

c)

.
r

Nmero de palabras
Nmero de sentencias

o
o
o
o
o
o
a
o
o
o
o
o
o
o
o
o
o
o
o
o
o

ramacin con C

Ejercicios de Laboratoro
1) Escribir un programa compreto en c que haga las siguientes tareas:
a) Tomar un archivo de texto como entrada que puede contener una novela

o
o
o
o
o

Introduccin a la

@ Copyrght tBM Corp. 2002


Los materales delcurso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM

También podría gustarte