Sei sulla pagina 1di 456

I fntroduccin a fa

Programacin con
(Cdigo det Curso Cy320)
Versin 3.0

I
I

I
I
Sumario del Curso
;(c
f

BM lT Education Services
f

Worldwide Certified Material


Informacin de la Publicacin
Esta pubfcacin ha sido producida usando Microsoft Word 20OO y Microsoft powerpoint I
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 uccin a la programacin con C
I Nombre def Curso
o
o
I lntroduccin a la programacin con C
o
Duracin
o
o La duracin de este curso es de 74 horas.
o
o Propsito
o Ef propsito de- este curso es ayudar al estudiante a desanollar
o habilidades para
programar con c y para este fin, e.ste cu.rso proporciona informacin
detallada acerca
o de los diferentes elementos de c. El objetvo orifo
. brindarle una slida base de los
conceptos y fa programacin con c. El curso comienza
o conceptos bsicos de computacin,
con una introduccin a los
o .desde
el concepto de algoritmos a travs de una
definicin de un programa hasta los de lenguajes oe frogramacin y compiladores.
o
A travs del curso, el estudiante se familiariza conel
o uso de importantes construcciones
de c, tales como fos diferentes tipos de la sentencia
o if, la construccin switch, la
funcin s-canf, etc' Adems, aprende el uso de construcciones
iterativas para la
O solucin de problemas y podr usar las construcciones
iterativas como la sentencia for
y la sentencia while. Tambin se introduce
o el concepto de arreglos en c, y se aprende
a usar los diferentes tipos de aneglos para resolver problemas.
o el curso, se aprende acerca de las estructuras y uniones medida que progresa
O ,i conceptos de funciones, recursin, punteros, mnejo
de
en C. Se introducen los
archivos, manejo de los
or argumentos de lnea de comandos, as como se
enumerados y tambin como usar rnacros.
estdia acerca oe ios tipo, de dato
o
o Junto con las sesiones de teora, se tienen sesiones
de laboratorios, donde se podr
I practicar todo lo 9!e se aprende en el saln
de C.
oe ctase y aRnar las habilidades en el uso
o
o Prerrequisitos
o
o Para poder entender los conceptos tratados en
este curso, se debe tener conocimiento
acerca de sistemas operativos, y conocer acerca
o es esenciar para rograr un mejor aprovechamiento
de un sistema operativo como Linux
o der curso.

o
o
oi
ol,
olr
oll
oll
-fr
-.ta
Ii I,

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
,I
escrito o" rgla.
Introduccin a la Programacin con C ei Curso

Objetivos del Curso


Al final de este curso Ud. ser capaz de:

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


ta :s
como un programa, lenguajes de programacin, compiladores, afgoritmos,
etc
a Usar los diferentes tipos de sentencias i f en el esfrerzo de resolver probJernas
o Emplear la construccin swirch para esribir programas c.
a Escribir programas usando las funciones printf y scanf de c.
a Resolver problemas usando el concepto de arreglos.
o Emplear el concepto de estructuras en la solucin de problemas.
a Definir el tipo de dato enumeracin y usarlo en el esfuerzo de resolver
problemas.
o Definir recursin en C"
o Definir el concepto de una unin y us.arlo para resolver problemas
en c.
O Trabajar con directivas del preprocesador en C.
a Trabajar con el concepto del manejo de archivos en C.
a 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
Sumario del Curso
o lntroduccin a la macin con C
o
o Contenido del Curso
o
o
Volumen l: Fundamentos de C
o Unidad l: Introduccin a ta programacin
o Objetivos de Aprendizaje
o 1. Introduccin
o 2. Qu son Algoritmos?
o 3. Tipos de Algoritmos
o 4. Organizacin Elemental de la Computadora
o 5. eu es un programa de Computadora?
o 6. por qu se Necesita un Lenguaje de programacin?
o 7. Compiladores
Resumen
o
Unidad 1. Examen deAutoevaluacin
o
Respuestas a ra unidad 1: Examen de Autoevaruacin
o
unidad 2: Laboratorio de rntroduccin a ra programacin
o
Objetivos de Aprendizaje
o
Eje16i6ie5 de Laboratorio
o
Unidad 3: Programacin en C _ Los primeros pasos
o
d (o Obleiivos de Aprendizaje
i inti-oduccln
o 2 La Evolucin de C
o 3 Pnmeros pasos para Escribr un programa en C
o lr,1s Acerca de Declaraciones
o 5. Ms Acerca de los Operadores
o 6 Compilacin de programas hechos en lenguaje C
o Resumen
o Unidad 3: Examen de Autoevaluacin
o Respuestas a ra unidad 3: Examen de Autoevaruacin
o Unidad 4: Construir Fundamentos Slidos en C
O Objetivos de Aprendizaje
o 1. lntroduccin
o 2. Aceptar Entradas del Usuario
o 3. ldentificadores de Variables
o 4. Palabras Claves en C
o 5. Tipos de Datos Bsicos en C
o 6. Constantes en C
o 7. Operadores Aritmticos
,o
a @ Copyright tBM Corp. 2005
Los materiales del curso no puedbn iLr reprocucidos
en parte o en su totaridad sin ef .previo permiso escritode
rBM.
*rr::e_g{re
8. Operadores Compuestos de Asignacin
9. Conversin Explcita de Tipos
10. Conversin lmplcita de Tipos
a
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 C


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 y Relacionales
6. Operador Temario
7 .
Las Diferentes Formas de Sentencias i f
8. La Estructura switch ... case
Resumen
Unidad 1: Examen de Autoevaluacin
Respuestas a ra unidad 1: Examen de Autoevaruacin
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
I
Sumario delCurso
o Introduccin a la amacin con C
a Unidad S: Ms Construccones lterativas

:f
o
Objetivos de Aprendizaje
1. Introduccin
2' Resolucin de Problemas Usando Otras Construcciones
lteratrvas
o 3. Ms acerca de la Sentencia for
O 4. Safir de un Bucle prematuramente
o 5. Uso de la Funcin ncorporada ptw 1
f

o 6. La palabra Reservada continue


a 7. La Estructura de la Sentencia do_white
o Resumen
o Unidad 5: Examen de Autoevaluacin
o Respuestas a ra undad 5: Examen de Autoevaruacin
o unidad 6: Laboratorio Ms construcciones tterativas
o Objetivos de Aprendizaje
o Ejercicios de Laboratorio

o volumen 3: Tipos de Datos Estructurados en c


o
o Unidad l: Programacin con Arregfos
o Objetivos de Aprendizaje
a
:(o
!\ rv
1. Introduccin
2. Declarar un Arreglo en C
o 3. Inicializar un Arreglo
o 4. Desarroilar y programar Argoritmos con Anegros
o 5. Cadenas de Caracteres en C
o Resumen

O Unidad 1: Examen de Autoevaluacin


Respuestas a ra unidad 1. Examen de Autoevaruacin
o
o Unidad 2: Arreglos Multidimensionales
o Objetivos de Aprendizale
o 1. Introduccin
o 2. Resorver probiemas con Anegros Bidimensionares
Resumen
O
Unidad 2: Examen de Autoevaluacin
o Respuestas a ra unidad 2: Examen de Autoevatuacin
o unidad 3: Laboratorio de programacin con Arregtos
o Objetivos de Aprendizaje
o! Ejercicios de Laboratorio

l\.f
'E
x-
x @ Copyright tBM Corp.2005
a
-
Los materiales dglarrso no puedbn ser reproducidos
en parte o en su totaridad sin el previo permiso escrito
t oe rgir.
o
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 i

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 n 4: Funciones en C


Unidad l: Funciones
Objetivos de Aprendizaje
1. Introduccin
2. programar Funciones C
3' Definicin y Uso de Funciones
en ra sorucn de probremas
4. Clases de Almacenamiento
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
v
en parte o en su totardad sin ser reproducidos
erjrvio p"-*'ro escrito de rBM.
I
a Sumario delCurso
fntroduccin a la programacin con C
o
I
o
o
I Volumen 5: punteros en
Unidad 1: Punteros
C

o Objetivos de Aprendizaje
o l.Introduccin
I 2. Fundamentos de punteros .
I 3. uso de punteros para pasar Argumentos a ras Funciones
o Resumen
o Unidad 1:Examen de Autoevaluacin
o Respuestas a ra unidad 1: Examen de Autoevaruacin
o Unidad 2: Laboratorio de punteros
o Objetivos de Aprendizaje
a Ejercicios de Laboratorio
o Unidad 3: Punteros Avanzados
o Objetivos de Aprendizaje
o 1. Introduccin
o 2. Aritmtica de Direcciones
o 3. Puntero a puntero
o 4. Arreglo de punteros
o /0 5. Puntero a Estructura
o 6. Puntero a una Funcin
o Resumen
o Unidad 3:Examen de Autoevaluacin
a Respuestas a ra unidad 3:Examen de Autoevaruacin
o unidad 4: Laboratorio de punteros Avanzados
o Objetivos de Aprendizaje
a Ejercicios de Laboratono
o
o Vof umen O: Tpicos Avanzados en C
o Unidad 1: Manejo de Archivos en C
o
Objetivos de Aprendizaje
Or
1. Introduccin.
oi
2. Uso de Archivos de Datos en C
d 3. Archivos de Texto y Binarios
q 4. Manipular Archivos de Datos sin Formatos
e Resumen
dx Unidad 1: Examen de Autoevaluacin
ot-
.-l !

^tE [
t- 7
@ Copyright tBM Corp. 2OOs
-'tr Los materiales del curso no pueObnr reproducidos
.T
T' en parte o en su totafidad sin e[ previo penniso
escrft J" rafrr.
I'

o
o dei Curso
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.
oi
a Sumario del Curso
Introduccin a la
a ramacin con C

o0
O
Descripcin de Unidades
o (Nota: La duracin de cada Unidad
es de 2 horas)
Or
ol I
Volumen l: Fundamentos de C
ol Unidad l: Introduccin a la programacin
ol
ol Esta unidad proporciona una introduccl
como algoritmos, organizacin elemental ?
q computacin a travs de conceptos tales
ol ::ilffii"?:'
de ta corputadora y qu es un programa
Tambin se discute acerca de tos renguaes de
oe'piogr;acin y et rot der
o1
ol
I

unidad 2: Laboratorio de Introduccin a ra programacion


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

ol unidad 3: programacin en c
- Los primeros pasos
ol En la primera parte, se discute la evolucin
del lengule de programacin c y el mtodo
para escribir a partir de algoritmos programas
o/ programa en C tambin se establece. en c. r-os erment.'o."os de un
./
Unidad 4: Construir Fundamentos Slidos
o/ en C
Algunos de los elementos bsicos que
van a construir un fundamento sfido en
rl 0
:i( discuten tales co.mo. variables, expresiones c se
artmticas, sentencias de asignacin y
tipos de datos primitivos. tambien, se da
una introduccin de cmo aceptar entradas
ol del usuario a travs de la funcin scanf.
oi Unidad S: Laboratorio de programacin
en C
ol Esta unidad trata acerca de la solucin
de problemas a travs programas bsicos
o los conceptos aprendidos en las unidades
anteriormente,
en c
.l ?',f:li: especiatmente ta

o
o Vof ume n 2: Estructuras de Controf en C
q 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;;;
facilidades de c que se estudian
aqu prr,
i#i"s;ffi," bremas. Las
imptementacin
I
que involucran el control de decisin "yria'ia if, sentencias de algoritmos
ion l"'."nt"n""
? operadores relacionales, operadores
fgicor y
if
anidadas,
relacionales. Se introduce la
? construccin switch de C. "*prron"r
? unidad 2: Laboratorio de Estructuras de
contror de Decisin
? se proveen ejercicios que invotucran estructuras
? 5ffiti::':o bsicas de controt de
_^
K(lL
I,U
:'\-
@ Copyright fBM Com. 2005
It Los materiates dglixrso no pueon ser
reproctucidos
? en parte o en su totatidad sin er prwio permso
t) escrtt" lgM.

o
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
::*,,"ffi""#?'i::J"J-* !n
ta
arsoritmos. se oiscute v-r.-a-,"n unidad
".," ra

unidad 4: Laboratorio de construccones


rterativas
se proporciona problemas simples. que
C que necesitan iteraciones uJanOo requieren la implementacin de programas en
la construccn
- whit_e, esto para
conceptoslos conceptos aprendidos en reforzar los
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
discute y usa la construccin
for de c y ras sentencias break y continue.
do_whi1e. se
unidad 6: Laboratorio de Ms construcciones
fterativas
Ef nfasis de esta unidad es
en la impfementacin de.programas
resolver probfemas especficos compretos en c para
usando las estiuciuras terativas
de la unidad 5.
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 arregros
;1,'ilil:,il3l3i. en c con arresros
Unidad 2: Arreglos Muttidimensionales
se ilustra el uso de arreglos multidim_ensionales
varios ejempfos. En los elemplos (arreglos bidimensionales) a
r ,""n travs de
problemas con matrices.
Unidad 3: Laboratorio de Arreglos

m;ggJ:t:#: lT,$:?:1;;;]e
nrooramacin con arresros en c 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 en la unidad 4, esta unidad provee
ejercicios de faboratorio que ieil;;;"; escribir programas con estructuras.

@ Copyright tBM Corp. 2005 10


Los materiates detcl9 n9 pr"On
en parte o en su totalidad sin el previo "ur reproducidos
f"rmiso escrito de lBM.
I
o
o ogramacn con C
o Volume n 4: Funciones
o1 en C
Unidad l: Funciones
o
o Esta unidad- introduce la naturale-za
probfemas' se discuten y ef uso de ras funciones en
arjus.runc'ioner-in"oipor"das fa sorucin de
o ejemplos se ilustra cmo de .-A travs de varios
d;fi;;r runcones o"r']r""f"ro_ y a
o usarros en ra sorucin de
o i#:5#::rJf,:'"#,#",i::,;!:*"::lf m;if p""nio,o"-c-i",","o,"o-I"n",.
o Unidad 2: Laboratorio de Funciones
o
que requieran escribir
o ,t;iT:'i:"t[J;,i"?T:1['J;rlaboratorio runciones especricas
o Unidad 3: Recursin
o Esta unidad discute fa naturale
za general de la recursin y su
o rof en la solucin de
o 5i?l'33?;"1,.?t3:|,il;n"a;f:[i:3'5f"T'"XJi,,"o. r"nen,-.u'ru,t,." er mtoJo
o Unidad 4: Laboratorio de Recursin
o Esta unidad provee ejercicios
j.:^_,1?::qtorios que requieren escribir funciones
recursivas en c y usarras para
o rsorver probremas simpres.
o Volumen S: punteros en
o C
a'a Unidad l: punteros
o Esta unidad introdu.ce los
conceptos fundamentares detrs
o fos punteros en c. frustra
;-;;'d;
ros puntero, un J-p""o
de ta natura reza yer uso de
especiarmente pasar arregfos de argumentos a funciones
o a funciones como una referencia.
o Unidad 2: Laboratorio de punteros
o A travs der uso d,ufg: conceptos
tT,g:r:"jares de punteros
o u,l, aprendidos en ra Unidad
o
I :H :'J'
" "
:#:',
ff,J*J ff
ff" trSIll j:: *:,; u, oo o d e pa s a r rs
u m e nto s a

o Unidad 3: punteros Avanzados


o se discuten afgunas de fas facilidades
operacione. d" avanzadas der uso de ros punteros
o punteros ?:l!eros, o"nn, v usar arregro de punteros, puntero
a estructuras y paso de fucione.
como
a punteros,
o .orJJffientos a otras funciones.
Unidad 4: Laboratorio de punteros
o Avanzados
o A travs del uso de
.fos conceptos
unidad 3' fos elercicios fundamentafes de fo-s punteros
-l"oootorios aprendidos en ra
o argumentos a funciones
o" p"-"i- refo.zar ,l de pasar
o
como punters y usarros dentro
de tas mismas. "l
o
o
fll
J
o @ Copyright tBM Corp.2005 11
Los materales def a1s9 no p*Onr,reproducidos
O en parte o en su totafidad sin
eirevlo-imiso escrito de-rBM
o
o
Introduccin a fa ramacin con C
Sumario dei Curso
Vof umen 6: Tpicos Avanzados
en C
Unidad l: Manejo de Archivos
en C
Esta unidad detalfa los mtodos para
secundario para leer y escribir usar ros dispositivos de atmacenamiento
J*J" io"^p.girslramoen se oscut"
t ;;";; en c. eJpm""rente. se discuten fos
definir archivos oe dtos ,tooo para
"l archivos de
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
la bse conceptuaf aprendida ar manejo de
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
adems unas pocas directivas
dL comandos y el uso de las macros.
l pro.esa.dor y sus usos. son dscuten
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

@ Copyright IBM Corp. 2005


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

.'a
o

O
ntroduccin a la
f

o Programacin en C
(Cdigo del Curso: Cy32O)
ol Versin 3.0)
Ol
o
ol Gua del Estudiante
o
o
oj
o
oj
oi
oi
o1
oi
o1
oi
),1 r'>.
:'((E
ri '"- Fundamentos de C
o
o
o
o
o
.{
a
q

BM fT Education Services
f

Worldwide Certified Material


Informacin de la publicacin
producida utilizando Microsoft word
rt8i!::j",ff;?:#: 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. o

Marcas comerciares de otras compaas


son mostradas a contnuacin
Windows Microsoft Corporation
Red Hat Linux Red Hat

Edicin Junio 2005

:ijlt:T":jg? :"T"nid:.,"n este documento no ha s,:: s:^.::i:a


,;;-;t';" ;;-; -.." -. "^' : :'-'i a
==
Et uso de esta infornracin o la i_.
::f::?tcnicas
estas ?.implcita. -==_u_.=;:^-
es responsabiridad der cornprador y oeoe.os:a = ,-__
para su evatuacin e integracin en r5
"ro,!'" "oirl-.;r;;:=.: ::-:,-
cada tema ha sido revisado por rBM"ipara
su exactrtud en una S.,,2^.
I
propo
nra^i^
riesgo.
-:^^-^
;.,;;;i;1.

copyright International Business Machines corporation,


2005. All rights reserved.
ser reproducido en su totaridad o en parte
;:n*t":ffX.".:iJ,il:de sin er previo
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
Gua def Estudiante
o lntroduccin a la programacin
o .lf :
o Contenido
o Unidad i: Introduccin a la programacin
o Objetivos de Aprendizaje
o 1. Introduccin 1

o 2. eu son Algoritmos? 2

o 3. Tipos de Algoritmos 2

o 4. Organizacin Elementaf de la Computadora 4

o
5. eu es un programa de Computadora? 5

o
6 por qu se Necesita un Lenguaje de programacin?
7. Compifadores x
o Resumen o
o Unidad 1: Examen de Autoevafuacin 10
o Respuestas a ra unidad l: 11
Examen de Autoevaruacin
o unidad 2: Laboratorio de Introduccin IJ
a fa programacin
o Objetivos de Aprendizaje l5
o Ejercicios de Laboratorio 15
o Unidad 3: programacin en
C Los primeros pasos
16
O Objetivos de Aprendizaje 17
o 1. lntroduccin
.11
IT

ot 2. La Evofucin de C 18
o @ 3. prmeros pasos 18
para
Escribr programa en
o' 4. Ms Acerca de Declaraciones un C

ol 5. Ms Acerca de fos Operadores 3

oi 6. Compifacin de programas Hechos en 24


/ Lenguaje C
Resumen 28
oi 24
Unidad 3: Examen de Autoevatuacin
Respuestas a fa Unidad l
3: Examen de Autoevafuacin
Unidad 4: Construir Fundamentos 34
Slidos en C
Objetivos de Aprendizaje 35
1. Introduccin 36
2. Aceptar Entradas del Usuario 36
3. ldentificadores de Variables 36
4. palabras Claves
en C
41
5. Tipos de Datos Bsicos
en C
42
6. Constantes en C 43
7. OperadoresAritmticos 44
8. Operadores Compuestos
de Asignacin
47
9. Conversin Expficita de Tipos 48
10. Conversin lmplcita de Tipos 49
50

@ Copyright tBM Corp.


Los materiales delcurso no pueden 2004
sr reproOucidos en parte
o en su totalidad sin el previo permis'escrito
deIBM
Introguccin a la prograrnacin con C

Resumen
I

Unidad 4: Examen de Autoevaluacin


Respuestas a ra unidad 4: Examen de Autoevaruacin
Unidad 5: Laboratorio de programacin en C
AA
G
c5
Objetivos de Aprendizaje
Ejercicios de Laboratorio c,A
Ejercicios Opcional
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 Gua del Estudlante
lo lntroduccin a la programacin con C
lo
ol
o
Unidad 1: f ntroduccin a ta
o
Programacin
o Objetivos de Aprend izaje
o
o Al final de esta unidad, Ud. ser capaz
de:.
ol . Definir el trmino algoritmo.
o . Discutir los diferentes tipos de algoritmos.
O
. Describir fa organizacin de una computadora.
' Definir ra necesidad de construir programas
Ol para una computadora.
o ' Discutir ros diferentes nveres de ros renguajes
de programacin.
Ol
. Definir qu es un compilador y describir
su rol.
oi
ol
r1
ol
o/
q
!'o
t
q
t
?
o
+
t?
?
I
p
I
p
lr
b
l:
p
,I-
vt Votumen@
tnr
Unidadt:lnt@
@ popyright fBM Com. 2005
tr Los materiares dercurs r pueen
si rlprooucioos en parte
o en su totalidad sin el previo permisoes*ito
ft de.f BM
I
fntroduccin a la

l. lntroduccin
Los problemas a. resofver por
medio de una computadora pueden (
simpfes a los ms compleios. variaroesde los n::s
En su nivel ms simpfe, fos problemas
pueden ser tan senciflos computaciona,es
como encontrar el promedio
calcular el inters simple generado de un conjunto de nmeros 3
por alguna a"uo"- por otra parte
compfejos corno encontrar una pueden ser tar
solucion un cnunto de
simultneas' la multipticacn ecuaciones oiferenciares
de una matrizo contar ra frecuencia
texto' A un nivel mucho ms especializado, de una parabra en un
como reconocer las huellas
rtorput"dora puede resorver probremas
digitales o la vo,zJ" ,n inooiduo,
juego de guena o jugar simurar stuaciones en un
un partldo de ajedrez de alta
caridad.
una computadora es una herramienta
poderosa que es capaz de
simurtneamente. sin embargo, hacer varias tareas
es sro una ,a!rin" y no posee
pensar' solamente puede implementar ra capacidad de
programador' De all que programador instrucciones que le ha dado el usuario o
el no puede darle a ra compttadora
que sean ambiguas por naturaleza. instruccjones
Todar ";;l;l"ion", deben
sin ambigedades. De aquse fi"n defrnirJas y
origina er concepto de argor:itmo. ""i
2. Que son Atgoritmos?
un matemtco persa lfamado Abu
Jafar Mohammed lbn Musa Al
este mtodo en.el siglo ll DC y Khwarizmi desarroll
demostr su efec{ividad. cuando
conocieron su mtodo, se referan ros franceses
a ste como ef mtodo de Al
Khwarizmio como un
la palabra fue transformadaa ro que
lfr";il"Posteriormente, se conoce como un
A continuacin se discuten algunos
ejemplos de algoritmos.
.
1.1 Ejemplos de Afgoritmos
y entender los algoritmos y
su naturarezase presentan los siguientes
;ffiffItrender
Ejempfo 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
Paso 3: Si er mayor encontrado er mayor es B.
en er paso 2 es menor que c entonces
ahora es c' En caso contrario er mayor
et r"yortnido en el paso 2
se conserva.
Fin de Ejempto l.l

Unidad r,r"Oor""
Volumen t: funGmEntos Oe Cl
@ Copyright fBM Corp. 2005
Los materiales del curso no pueden s, reproOucidos
o en su totardad sin er previo permiso en parte
escrito oe rgl-"-
I
o
Gua del Estudiante
o Introduccin a la programacin
6ei 6.
a Ejempto 1.2
o
o
I Suponga que se tienen que determinar
entero no negativo es primo
si un nmero entero dado es pnmo
o no. Un
si es divisible solamente entre y
o para determinar si un nmero
n es primo, se oeoe
I s mismo. por lo tanto,
los nmeros entre 1 y n. Ef frobar la divisibifidad de n para todos
o algoritmo para esto es como sigue:
a Paso l: Obtener ef entero n
corr.to entrada.
o Paso ur";o:::' ste es divisible poi t" variabre j,
O
't .si
ra cuaf armacena varores entre

1ffiT;;i,ffi:,"l Jrffi j
Paso t,
< n_1), entonces er entero n'o S primo,
o
Fin de Ejempfo 1.2
O
Ejempto 1.3
o
o suponga que se tienen que encontrar
las races de la ecuacin de segundo
o ax2 + bx * c : o, donde ros coeficientes .,
grado
;t ; r"" varores de entrada.
o Ef algoritmo para resolver ste problema
es como sigue.
o Paso l: obtener como entrada fos
varores de ros coeficientes, a,
o Paso 2: Calcular discriminante b, y c.
= b2 _ 4ac
o Paso 3: Sier discriminante <
paso 4: Si eldiscriminante
0, ras races son imaginarias. parar.
o = 0, las races son iguales,
raizj. : raiz2 _ _b / 2a- pafar
J@ Paso S: De otro modo, las races
o son:
o - + sqr.t (discriminante ) / 2a y
a -D - sqrt(drscriminante) / 2a
o Fin de Ejempto 1.3
o Ejempto 1.4
a Asuma que se debe contar ef
nmero de ocurrencias de tas
o documento' El proceso para resolver vocales en el texto de un
este problema es bastante sencillo.
o carcter a la vez en el texto y
verifique si es una vocaf. si fo
Tome un
es, unton"", ,antenga un
contador de esa vocal en
a iarticufar, en caso contrario salte ese carcter.
contine
o [1iill". :,* :x'x:l. ;;' ;; ; r" re vi s a d o E, a,s o rit m o p a ra
:1' : :il?,ffj *,.'
o Paso 1: lnicializaf contA, contE.
"

o contr, conto y contU a cero.


Paso 2: Leer ef primer
I carcter deltexto.
Paso 3: Repetir ros siguientes pasos
hasta tegar af finar det texto.
o si er carcter = A a entonces incrementar
a en uo contA.
t si er carcter = E e entonces incrementar
en uDo conrE.
a sier carcter = | i entonces incrementar
en uno contr.
'l
{y votumen@
Unidad l
p
b . :
ros
@ Copyright fBM Corp. 20OS
materiafes dercurso no pueoen
.,
aL.
si prooucioos en parte
o en su totafidad sin elprevio.permis
T escrito de IBM
t'o
Si el carder = O o entonces incrementar
en uo conto.
Si ef carcter = U u entonces incrementar
en uno contu.
Caso contrario saltar el carcter C
Leer el siguiente carcter.
Paso 4: Mostrar el contenido d
contA, contE, cont- r _
contO y contU.
Fin del Ejempto 1.4
Los ejemplos presentados ilustran
que los afgoriimos involucran cmputos
verificacin por igualdad o diferencia d; dos cantidades, flevando
aritmticos,
condicionalmente un conjunto
de.pasos, y la repeticin de fa ejecucon
a cabo
en una condicin. A cntnuacn se oe un conjunto
i:::firff:ados aprendern tos diferentes tipos

3. Tipos de Atgoritmos
En la vida real se encuentran diferentes
tipos de algoritmos. una clasificacin
ayuoa a comprender la naturaleza simple
subyacente oe tos afgoritmos y los
problemas para los que son tipos de
ms adecuados. Esta cfasificacin tambin
escoger un mtodo apropiado para permite
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
tiempo largo en terminar la tarea tomar un
asignada, pero terminarn definitivamente
tiempo finito' Estos algoritmos
siempre dan un resuftado que depende
en un
entrada' En otras pafabras, nicamente de la
pr"u determinar el resultado exacto
""
entradas' La mayora de algoritmos s se conocen ras
que se encuentran en la vida realpertenecen
categora' Encontrar tas races de a esta
una ecuacin cuadrtica, determinar todos
nmeros primos entre I y I mifln los
y encontrar la inversa de una matriz
todos ejemplos de algoritmos cuadrada son
finitos beterminsticos.
3.2 Algoritmos Finitos No Determinsticos
Estos son algoritmos que terminan
en una cantidad finita de
o entradas, ef resultado del alsoritmotiempo. sin embargo, para
puede no ser nico y
;n":|jf,i:o3"ot
considere un algoritmo para generar
un nmero aleatorio- Existe un mtodo
probado llamado el generadr matemtico
congruente multiplicativo, el cual es
forma xt = (aX'-' ) mod m donde una funcin de la
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.

o
t Guia del Estudiante
lntroduccin a la programacin con C
o
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
se supone que genera nmeros aleatorios.
el propsito del algoritmo, ya que

O 3.3 Afgoritmoslnfinitos
o Los algoritmos infinitos son aquetlos que no terminan,
ya sea porque una condicin de
a termnacn no fue especificada o porque la condicin
no fue satisfecha para ef conjunto
o de datos de entradas dado. Usualmente ios algoritmos
infinitos son aquellos donde las
condiciones de terminacn no estn especificaas
a apropadamente.
o sin embargo, tambin existen algoritmos infinitos tiles.
La tarea de monitorear ta
o temperatura en un reactor nuclear es un algoritmo
infinito, claramente, esta tarea es
continua y debe seguir mientras el reactor est
o ejecutndose a menos que haya un estmuro externo
trabajando. La tarea se mantiene
que to detenga.
o
otro ejemplo de un algoritmo infinto es fa tarea de enumerar
o del nmero pi. se sabe que elmtodo para carcur"r
todos dgitos decimales
o un ,n nmero
infinito de dgitos en su parte no entera. Este"inJr!;;;;rli
es especialmente tl para los
o matemticos.
o A continuacin se discute que es una computadora.
o
o 4. orga nizacin Efemental de la computadora
o una computadora es un dispositivo electrnico que
ayuda a la resolucin de problemas
a ', computacionales a travs de un algortmo, describiendo
t:t3
sin ambigedades los pasos
involucrados' Los computadores se usan para
una gran variedad de propsitos y se
cfasifican en diferentes categoras. analgicor,
o digit"fur, personales, servidores,
supercomputadoras. etc.
o un sistema de computadora moderno consiste de un sistema
o procesadores, memoras y dispositivos interconectado de
de entrada / safida. A continuacin se discute
O una organizacin elemental de una computador,
denominado sr'sfem a simple orientado
o a bus.
o La undad central de Procesamiento (cPU)
es el componente vitaf de la computadora.
o su funcin es ejecutar las instrucciones almacenad,
la memoria principal: las
o obtiene, las examina y ejecuta una clespus
de la otra. "n
o La cPU consiste de varias partes importantes.
Tiene una unidad de control que es
o responsable de traer las instrucciones de la
memoria principal y determinar el tipo de
o instruccin' La unidad Aritmtico Lgica (ALU)
", unas de
antmticas y lgicas. La cPU posee tambin
t"p"= realizar operaciones
o almacenamiento temporal de alta velocidad
pocas localidades de
llamados 'registros'. Los registros se usan
para almacenar resultados intermedios y tos
datos necesarios para llevar a cabo las
? instrucciones.
o
5
Volumen l: funarnetoGE Unidad t:ltroOucco aGFroqra,r:rc -:
$o
It @ Copyright fBM Corp. 2005
Los materiales def curs n-o pueden ser iepiooucoos
? o en su totalidad sin'el previo permiso escrfto de
en parte
o lBM.

o
Introduccin a la programacin con C 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
Central de Oispositrvo
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, los que permiten
almacenar instrucciones y datos de forma semi-permanente.
Se discuten a continuacin otros dispositivos de almacenamiento conocidos
como
dispositivosde almacenamiento secundario.
Los dispositivos de almacenamiento secundarios pueden almacenar instrucciones
decir, algoritmos y datos por un largo perodo de tiempo. De cierta
es
forma, se les puede
0
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 I
usuario a travs de dispositivos de salida. Un dispositivo de salida
ayuda a leer los I
datos resultados de la memoria principal. Los dispositivos de salida que pueden
conectarse a una computadora son de diferentes formas y capacidades.
dispositivos de salida ms utilizados son: el VDU (Visual Display
Algunos de los tl
Unit), impresoras, l
plotters y dispositivos de sonido.
tl

t
Unidad 2:Laboratorio de IntroduccOn aGFrogramacion
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
I Gua del Estudiante
o lntroduccin a la
o se presenta una visin
a
o
I flff:::'"cin muy simpte de cmo un sistema de
computador

' Los datos e instrucciones para llevar a cabo una tarea deben estar disponibles al
o computador' Estos son provistos ya
por fos dispositivos dl entraoa,
o "".
los ingresa, o por fas uidades'de
armac"n"r"nto secundarios
cuando
;iH:il" como
o
o
' La cPU enva una a la
""i:l^ para entidad. -apropiada, dispositivo de entrada o
secundario, que estn disponibre r"f inrirr"ciones y datos
o :'ina"J::liento
o o La entidad' dispositivo de entrada o almacenamiento
travs del bus a la memoria principal. secundario, los enva a
o
o ' h*:#.entonces lee fas instrucciones en una secuencia bien definida de la
o ' La cPU ejecuta las instrucciones usando la ALU y los registros, y enva los
o resultados a la memoria principal
a travs J"iorr.
o ' Los resuftados que estn disponibfes
dispositivos de safida va el b.us.
en la memoria principal se envan
a los
o
o ' una seal a la memora principal para que
5: Sy":t"n to enve at dispositivo
o
o 5. Que es un programa de Computadora?
o Un programa de computador"
de un algoritmo en un tenguaje
o apropado para usar en una computdora.
"t-f1,.1:presentacin
Por lo tanto, consiste de un conjunto
o instrucciones que estn bien definidas de
y sin ambigedades. por ejemplo,
para dividir un nmero entre un programa
o otro nmero consist de una secuencia
que le indican a fa computadora que de instrucciones
o nmeros como entrada, la computadora
realice la divisin. cuando se ingresan
dos
lleva a cabo las instruccones con
programa y obtiene el resultado. la ayuda del

Los programas de computadora se desarrollan


para resolver problemas especficos.
Estos programas tambin se les denomina
programas de computadora'
software. Existen muchos tipos de
Algunos de ellos se escriben para ayudar
funcionamento de un sistema a controrar el
de computadora y optimizar el uso de sus
estos se les denomina programas recursos. A
del sistem y Lr'personas que desarrollan
de programas se fes ilama programadores ste tipo
de sistem.
Existen programas que llevan a
cabo la solucin de un probtema en particular
conjunto de problemas relacionados. o un
se les denominan programas de aplicacin. rJna
gran mayora de programas de computadora
programas de aplicacin van estn dentro de esta ategora. Los
desde programas simples que calculan
aquelfos que resuefven un sistema el factorial hasta
complejo de ecuciones diferenciales
jugar un juego de ajedrez. o que pueden

de computadoras se escriben en un tenguaje


de programacin
"t",::,f#:ramas
Votumen@ 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:
6. Por gu se Necesita un Lenguaje
de programaci n?
un afgoritmo debe poder ser tfevado
a una computadora. un oronl"r, rearizaesto (
travs de un conjunto de instrucciones. a
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
;r1;3:.::::." ctara, bien definida y sin

Los lenguajes naturales como el Ingls


son muy
semntica y tienden a ser try .otpticados'p"r" ricos en sintaxis (gramtica) y
aprendices y usuarios' Ms an, fos ros desanolradores y para ros
fenguajes naturares tenden a ser
debido al uso de "lenguaje figurativo'y-"rica'. por muy ambiguos
ejempfo ra sentencia "arguien
no suiere decr literalmente que arsuien
:,'nt[,o"ilffiI"' estir p"r"; si no que
Los computadores son esencialmente
dispositivos bsicos gue pueden
solamente tareas simples realizar
tales como adicin, sustraccin, multiplicacin,
La manera como las instrucciones se divisin, etc.
comunica al computador, debe ser por
muy simple' Para permitir una comunicacin fo tanto
bien definida, el lenguaje debe ser
en su sintaxis y semntica. Ef renguaje limitado
no debe ser ambiguo. Es por eso, que
necesita un lenguaje de programacin se
semntica restringida y de natuialeza
de computadora con una sintaxis simple,
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 0
En ef nvel bsico' una computadora
' y 1' necesita trabajarcon nmeros binarios,
Las instrucciones que se escriben es decir, 0
en forma binaria se dicen que estn
de mquina' El lenguaie de mquina en lenguaje
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
;f::::i:rfl"" ffilputadora instrucciones en

6.1.2 Lenguaje Ensamblador


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

Unidad 2:Laboratoro O
Volumen 1: Fundamentos de C
B
@Copyrght tBM Corp. 2005
Los materiales delcurso no pueden
?
ser reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.
O
a
o cin a la programacin con C
o 6.1.3 Lenguajes de Atto Nivel
Los lenguaies de alto nivef son necesarios para poder
: manera ms simple en comparacin con los lenguajes
expresar las instrucciones de una
o de mquina y ensamblador, Los
programas de computadoras se escriben
usualmente en un lenguaje de afto nivel cuyo
o conjunto de instrucciones es ms compatible con
los lenguajes natlrales. La sintaxis y
a semntica del lenguaje de alto nivel deben ser
tal que contribuyan a especificar
instrucciones bien definidas que no sean anibiguas.
o
o' se han desarrollado un gran nmero de lenguales de
alto nivel. Literalmente son cientos
o de estos lenguajes. Algunos de ellos son muy populares,
mientras que otros no. La
mayora de los lenguaies de alto nvel son lenguajes
o Pascal' FORTRAN. c++. Java. etc. Estos pueoei
de propsito general como c,
o ,rrru para escribir programas para
una amplia varieoaC de aplicaciones.
o Los lenguajes de a/to nlvel penenecen a una
de las dos siguientes categoras:
O
o 6.1.4 Lenguaje de programacin Orientado a Objetos
o El software orrentaoc a objetos es acrca.de
objetos. un objeto es un "dispositivo,,, que
recibe y envia mensales Los objetos realmente
o instrucciones de computador. y los datos,
contienen un cdigo, una secuencia de
q
i
la informacin sobr io, qru opera las
Instrucclones Generalnrente. el cdigo y los
embargc en lcs lenguajes de programacin orientados se mantienen separados. sin
datos
o
o estn fusionaics en un obleto. El,l" los lenguaes a objetos, el cdigo y los datos
ob.letos que g3zan de popuJaridad estn
oe programacin orientados a
C++ y.lua]--
3o 6.1.5 Lenguaje procedimentaf
o Es un leng;a.ie donde el programador da.a la
computadora una secuencia de pasos
o segurccs unc ce otro para oblener la safida
d"r""i". Los lenguajes procedimentales
mas populares incluyen Basic, pascal C.
o v
o 7. Compifadores
o una computadcra solamente puede ejecutar instrucciones
t programa se na escrito
en lenguaje mquina. si un
en c, las instrucciones no podrn ser llevadas
t por los circuitos electrnicos de la computadora.
ienguale c deben ser traducidas en una
a cabo fcilmente
Las instrucciones escritas en el
a secuencia de nstrucciones en el lenguaje
mquina de la computadora. La entidad que
o.{ realiza esta traduccin de un fenguaje de
alto nivel a lenguaje mquina se llama compitador.
o
te
Un compilador es un programa de computadora
escrrto en un lenguaje de alto nivel como
y
que toma como entrada un programa
C lo traduce a un conjunto de instrucciones
;* en el lenguaje de mquina de la computadora.
O

f
?
u
l#ffi81 -:>t@->
rl
Compiladtr

Figura 1.2. programa Convertido a Lenguaje


Progama
Eeculabte
de Mquina.
Mqr
I
Volumenr@
I
E

Unidadt:lt@
l
.'- @ Copyright fBM Corp. 2005
Los materiales dercuqo no pueden sr'reproducidos
en parte
- '-
,v 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.
. Discutir los diferentes tipos de algoritmos.
.
.
Describir la organizacin. de una computadora.
Definir la necesidad de escribir programas en una computadora.
i
o Discutir los diferentes niveles de los lenguajes de programacin. ilfr
. Definir qu es un compilador y describir su rol.
: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
Gua del Estudiante
o Introduccin a la
o
o0 Unidad l: Examen de Autoevatuacin
o 1) Cul de las siguientes es la funcin principal de la computadora?
o a) Resolver problemas no computacionales.
b) Resolver problemas que son imposibles para los humanos de resolver.
o c) Resolver una variedad de probremas computacionares.
o d) Todas las anteriores.
o
o 2) Cul de fos siguienteses un proceso paso a paso bien-definido para resolver
problema, enunciado de una manera clara y no un
o ambigua?
o a) Mtodo.
b) Algoritmo.
o c) Tecnologa.
o d) Programa.
o
o 3) Un algoritmo desarrollado para encontrar todos los nmeros primos que existen
a entre 1 y 1 milln es un ejemplo de:
o a) Un algoritmo infinito.
b) Un algoritmo finito determinstico.
o c) Un algoritmo no determinstico.
o d) Ambas (b) y (c)
o
),A
_i (3
4) Un algoritmo usado en un sistema de computadora para
monitorear los signos
O'.- vitales de un paciente en la Unidad de Cuidados lntensivos
(como presin
sangunea y pulso) es un ejemplo de:
o a) Un algoritmo infinito.
O b) Un algoritmo finito, determinstico.
o c) Un algoritmo no determinstico.
o d) Ambos (b) y (c)
o
6\
o cules de las siguientes entidades usualmente contene ra cpu?
o a) La memoria primaria, el bus y la Unidad de Control.
o b) Solamente la Unidad Aritmtico Lgica (ALU).
c) La Unidad de Controt y la ALU.
o d) La Unidad de Control, ALU y algunos registros.
o
O o/ Por qu a fa memoria principal de una computadora
se le llama almacenamiento
o vof til?

a a) Pierde los contenidos almacenados cuando se apaga la fuente de poder.


o b) Retiene los contenidos afmacenados an despus e apagar ta fuente poder.
c) Es sumamente sensible a fluctuaciones de fuente de poder etctrico. de
o d) Ninguna de las anteriores.
o
o_
0
O
Volumen l: funOametosE Unidadl:lntroOu@
@ Copyright tBM Corp. 2005
a Los materiales dercurbo no pueden'r reproducidos
en parte
o en su ttalidad sin elprevio permiso escrito de lBM.
O
a
Introduccn a la programacin
con C
Gufa delEstudiante
7) 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.
8) cul de los siguientes es la entidad en un sistema de
computadora que permite ra
entre ta CpU, ta ,"',oii"'-'prir"ri" y
tos dispositivos de
$[ttr3r",,,::,
a) El almacenamiento secundaro.
b) La Unidad de Control.
c) Ef bus del sistema.
d) Ambos (b) y (c).

9) cules de los siguientes son algunas de las caractersticas


lenguaje de programacin de computadoras? principales de un
a) No son ambiguos.
b) Sintaxis y semntica restringida.
c) Sintaxis y semntica no restringida.
d) Ambos (a) y (b).
10) Qu es un compilador?
a) un dispositivo, de hardware que traduce un programa
lenguaje de alto nivel a ,n de computadora escrito en
lenguaje mquina.
b) un programa que traduce "n un programa de computadora escrito
de alto nivel a lenguaje de mquina. en un lenguaje
0
c) un ser humano que acta como intermediario
computadora y la comptadora mismo. entre el usuario de una
d) un mtodo de describir el lenguaje de programacin
usuarios potenciales. de computadora a los

Unidad 2:Laboratorio Oe tnt@ Volumen 1: Fundamehtos Oe C lZ


@ Copyrght IBM Corp. 2005
Los rnateriales delcurso no pueden ser reproducidos
v
o en su totalidad sin el previo permiso en parte
escrito de lBM.
Gua del Estudiante
Introduccin a la programacin con C

Respuestas a la Unidad i: Exarnen de Autoevatuacin


1)c
2)b
3)b
4)a -
s)d
6)a
7)c
8)c
e)d
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
v
ser reproducidos en parte
o en su totalidad sin elprevio permiso
escrito
de lBM.
oI
a':
Gua del Estudiante
o ramacin con C
o
-L,
t-
(,
unida d 2: Laboratorio de f ntroduccin a
o fa Programacin
o
o Objetivos de Aprend izaje
o
Af final de esta unidad, Ud. ser capaz de:
o
o . Resolver problemas sistemticamente.
o . Escribir algoritmos para una tarea dada.
. Aplicar diferentes afgoritmos a distintos tipos de problemas
o esfuerzos en su resolucin.
que requieran
o . Generar un aigoritmo para una subtarea repetitiva.
o
o
o
o
o
o
o
o
j(,
t-,. .\

I
o
o
o
c
o
I
a
o
a
a
o
o
o
o
o
a
(t-l
I' Volumen l: Fundamentos OeC Unidadt:lntroducc@
o @ Copyright tBM Corp. 2005
o Los materiales detcurso no pueden sr reprooucidos
o en su totafidad sin el previo peimiso escrito
en partb
o de lBM.

o
Guia del Estudante
Ejercicios
trJercfcios de Laboratorio
1) Expficar paso a paso' ef proceso
para preparar caf
en una cafetera erctrica
2) Escribi*n
"'g:1lT-o gu.e jnoieue a.un granjero cmo transportar un robo,
6
I#,i"iJi:il'i:n,i"*";i':#1,ff ff,fi;:: fts una cabra
en el oote, y sin deiar a, ,obo
3)
ff:il,ff,.i:x1""x1;iln:,;ffif':i:',4;,il:x:" sus edades, ra edad promed
oy
4)
ff#;ff:i,t'" para senellT:::r^:!,* 1 y,2ooo'sue sean parndromes
que son isuafes s
oe orechal iJrl"lqueffos sJ""n o"lJir",;il? o"ru.h, o
"ot
por ejempro, ros nmeros
121, 4334 y 151151 son todos parndromes.

Unidad r'r"Oo
Volumenl:@
,^
los
@
materiales delcu
Copyright
tBM Corp. 2005 v
oensutot"r0"'!?J,"rij|,3"J"itr j:Tlj.:ili"",,E[rl"n"
lr!
ro,
lo Gua def Estudiante
Introduccin a la proqramacin con C
lo
lo
ol Unidad 3: Programacin en C
o
o
Los Primeros pasos
o Objetivos de Aprend izaje
o
Alfinal de esta unidad, Ud. ser capaz
o de:
o . Describir la evolucin de C.
' Discutir cmo escribir algoritmos en C para resolver problemas
o simples.
' Explcar los dferentes componentes de un programa simpre
o 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
io
fo
ItL Volumen 1: Fundamentos erc
TU Unidad 3:Progra

fo @ Copyright tBM Corp. 2005


fo Los materiates derburso no pueden sr reproducidos
en parte
I o en su totalidad sin el previo permiso escrito de lBM.
o
o
Introduccin a la ramacin con C
Gua del Estuo s^:.
f. lntroduccin
Esta unidad presenta una introduccin
programacin c' Es muy a ra programacin usando er renguaje
importante desarrollar slioas ce
que son las bases para telncas-iu"orogr"racrn, ya
convertirse en buenos ingenieros
programacin contribuye de software. Er renguaje de
programacin y proporciona
a ese v. que tiene una buena estructura de
.propti"
los fundamentos
como c++ y Java pueden aprenderse- ,otr" los cuales otros renguajes tares
Es tambin un fenguaje que
en ra comunidad de programadores, se usa ampriamente
adems de ser er renguaje
construyen los sistemas oprativos con er que se
ms popufares.
2. La Evolucin de C
Ef lenguaie de programacin
Dennis
c 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
conjunto especfico de aplicaciones. se desarrollaban para su uso en
El lenguaje ronrnnru un
ejemplo' fue desarrollado para rronma'inerurt"tion) por
aplicaciones cientficas
coBol (common Business orieted v'0" ""ru era. El fenguaje
Lenguage) fue desarrofrado para
comerciales y de negocios apricaciones
Tambin se reafLarn'esfuezos
de programacin que sirvieran para JeJarroilar renguajes
como lenguajes de propsito genera
rango de aplicaciones' uno
de los primeroi
I para un amprio
el desarrollo del lenguaje ALGOL concertados en esta direccin
"rrr"os
(ALGOrithmic r-anguage). ALGOL nunca
fue
popular fuera del ambiente rfeg a ser
acadmico y";;; ;;";;"riado
Programacin c.ombinado (cPL)
y nacerlo tif sin embargo, fue desarrollado para reoucir
ef lenguaje cpl resuftante tuvo
abstracto. Ef Lenguaje de
ra abstraccin de ALGoL i,l
demasiados problemas,
eia dircir o"
.o'f,',1:::ni,-:':ff:istlas' "pr"no"r v
resurtaba dircir desarrorar
Martin Richards' en la Universidad
de cambridge, intent reducir
lenguaje cpl a soro unas pocaiy fas caractersticas der
tires. ri; fr;';"mado BcpL
result ser demasiado simple (Basic cpl). pero
y sin'mucho poder. Ar mismo
AT&T trabaiaba en una simplificacin momento Ken Thomson en
permaneci sin uso hasta que de cpl y oesarroil el renguaje B. Tambin
Dennis Ritchie
y desarroll C, con sus propias caractersticas oe B y BCpL,
"oroin-r"s
adiciones al lenguaje.
Hoy en da' Ia especificacin
de las caractersticas de c, su
proporciona el American sintaxis y semntica ras
National standards rnsttute
medio con estructuras de alto itus,l c es un fenguaje de nivel
nivel comparabres intfuso
Pascaf y FoRTRAN' y caracterisicas 1e mejores) a tas que dispone
que toman ventaja de las de bajo niver que ayudan a escribir programas
caraciersticas a nivel de mquina.

Unidad a,O
Volument:f@
@ Copyright fBM Corp.
Los materiales delcurso no pueden 2005 v
ser reproOucidos en parte
o en su totalidad sin elprevio permis
escrito de tBM.
o 't
o
Gua del Estudiante
o Introduccin a la programacin ccn C
o 3. Primeros pasos para Escribir un programa
a 0 en c
Los pasos bsicos para escribir un programa
o de computadora en c son los siguientes:
Paso l: Leer y entender el contexto del problema
o gue requiere una solucin
mediante un programa de computadora.
o Paso 2: Desarroilar un argoritmo para resorver probrema.
o ef
Paso 3: Verificar el algoritmo para su ralidez.
o Paso 4: Convertir el algoritmo a fenguaje C
o Paso s: probar y verifcar er programa c para
su vafidez.
o Nota: El paso 4 requiere el conocimiento de las
estructuras de un programa en c, es
o decr, los elementos der renguaje, su sintaxis y
semnticas.
o Para poder desarrollar un programa en lenguaje
o denominado archivo fuente con extensin ".c"
c, ro primero es crear un archivo
n cuatquier editor de texto conocido.
O 3.1 Estructura de un programa:
o cuando se escribe el programa se recomienda usar
o 1 f]amadas a bibfiotecas
er siguiente formato:

o 2 dec-Iaracin de funcicnes (prototipos de funciones)


o 3 decl-aracin de varj-ai:,es giobales
o 4 mainOi
o 5 dec,laracin cle.._a:iabl-es focales
6 senl_encias
o (0 1j
o 8 definicrr Ce i::.:_::.:-.
o Cualquier aplicacin hecha en lenguaie C debe
constar de una funcin principal
o denominada ri,ai:-. que ser la primeia en
ser llamada. En la estructura anterior elmain
o comprende desde la linea 4 a la lnea 7.
o 3.2 Variables y Sentencias:
O La manera ms simple o'e almacenar los datos
es en una entidad llamada variable.
o Las variables son nombres que se les dan a
las focalidades
donde un elemento de dato puede almacenarse. puede en la memoria principal
localidades de memoria como un conjunlo
ser til pensar en estas
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
c impone atgunas reglas en la construccin de
los nombres de variabres. Estoi se ristan
a contnuacin:
' *"t.l":?t:t3,:
carGler " "
variables siempre deben empezar con una retra,
esto incruve
ye al
;.::l:,TbT, es buena
variabfes que empiecenion letras
pirrJ;;;."r[r*
.prdicab" ol
mn,:rrii f:;;
Volumen faFundamenGrdeE
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'
lntroduccin a la programacin
con C
Gufa del Estudiae
' un nombre de variable puede estar formado-
arfabeto y/o dgitos de 0 af g y/o
por una secuencia de fetras def
carctei "_" (subrayado).
er
' El estndar ANSI c establece que fa
variable puede ser de cuarqu.ier
como por ejemplo abu jafar_mbh"rr"_ior_i"r"[xn""*rr,= rongitrrd,
fos primeros 31 caracter so ,, pero sdo
s"m""i"";
' No se permiten comas niespacios
en un nombre de variable.
smbofos especiafes, otro
h;?$s:;: 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
alfabeto' Las sentencias de declaracin retras def
ayudan adefinir ro que se puede
o" variable' En el caso, de querer almacenar un entero, armacenar en
i[:tot" se decrara como
irrt num;

en c que indica se est haciendo una


ffjnlT|.." ;:;?::n:,:J:ilada 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
de
una resra simpre para rormar ra sentencia
::i:J":":n:::::Z:::, de asisnacin
<nombre de l_a variab]-e>
= <expresin>
El smbolo = s l operador de
asignacin. La entidad a la izquierda
nombre de variabre, tar del : es cualquer
r.,t. La entidad a fa derecha der : es cuarquier
expresin aritmtica - As "oro
que para almacenar por ejemplo
sentencia de la siguiente manera: 15 en nLm, se escribe ra
n'' : _:
Y
Li
Ejemplo 3.r
Extraer fos Dgitos Individuares
de un Entero de Dos Dgitos
I
r
considere un entero positivo de dos .l
dgitos num. Los dgitos individuales il:
deben extraer y mostrar como resultado. del nmero se ei
$
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
izquierda es 2 y el dgito de fa ierecha de fa
es s. cimo sL extraen ?, 2s dividido
da el cociente 2' se observa entonces entre 10
que para cualquier entero positivo
la divisin entre '10 esulta en el dgito de dos dgitos,
de la izquieiJa. El resto de fa misma
entonces conesponde al dgito de divisin
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.
o
o Gua del Estudiante
o Introduccin a la
o es 5' Por fo tanto, para cualquier nmero entero positvo
de dos dgitos, el residuo de
o 0 una divisin entre 10 da el dgito de la derecha.
o Por lo tanto el algortmo puede escrbirse como
sigue:
O Paso l: Sea num elentero positivo de dos dgitos.
o Paso 2: El dgito ms a la izquierda de num
es elcociente de la divisin entre 10.
o Paso 3: El dgto ms a la derecha de :rum es
el residuo de la divisin entre 10.
o Paso .f: Mostrar er dgito ms a ra izquierda y
er dgito ms a ra derecha.
Ol Ahora se presenta el algoritmo escrito de una forma
compacta, orientado a un cierto
o valor para num:
o Paso l: num = 25.
o' Paso 2: Dgito ms a la izguierda num / 10.
=
o Paso 3: Dgto ms a ra derecha residuo de
= num / i0.
!i Paso 4: Mostrar er dgito ms a ra.izquierda y
er dgito ms
a ra derecha.
oi A continuacin se estructura elconjunto de sentencias
en c para ef algoritmo anterior.
ot El cdigo C comienza aqu...
ol I /* Se incluye 1a J-ibrera predefinida (stdio-h) +/
oi 2 #inc_lude <stdio. h>
al 3 /* La funcj-n principal- se inicia aqui */
4 mainO{
ol 5 int num,-
)r ? 6 int digito_izguiefdo,-
o 7 int dlgito_derecho,.
o 8 / * La varia-b1e se inici-ali-za con er valor
25 * /
9 num = 25;
o 10 /* EI dgito rzquierdo se extrae */
o ii org:to__izquie:cio : nuli. / _A;
o -2 ,'- E! dgito derecho se extrae _/
o -: :-:---._l=::::r: ::.._:. - r..i:. _-,-10,.
,- ,.- Los digitos son enviados a la sal-i_d.a
o estndar +/
::::::: ";r cr qtac :-zg.r:e:ic es ?d\n,,, digito_izqu'erdo),.
-5
o ::-:^:: ("a1 c:qric cierecio es ?d\n,,, digito
:: derecho) ;
o
o El cdigo C finaliza aqu...
o Fin de Ejemplo 3.1
o
Felicitacionesl, se ha desanollado el primer programa en
o importante de lecciones por aprender a partir
c. Existe un nmero
a oe ios primeros pasos que se han dado
aqu' Para resolver un problema, se debe desarrollar
primero un algortmo. se puede
o escribir el algoritmo de manera que empfee
trminos y sintaxs similares a c
o Posteriormente se tiene que verifcar si el algoritmo
est correcto o no. A continuacin
o se convierte el algoritmo a un programa en -c.
Este programa consste de una funcin
a
u, fil
l\lu
Volumen l: punOamiffi 3:ProgramacOnffi
o @ Gopyright tBM Corp.2OOs

o Los materiares dercurso nb pueden'sr reproducidos


o en su totalidad sin el previo permiso eiscrfto
en parte
o de IBM'.

o
main gue se inicia llevando a cabo tas
instrucciones dentro de elfa. En la funcin
las sentencias en C estn encerrada main,
entre tfaves {}.
En el programa existen dos partes
diferentes: una parte de declaracin y
ejecutabfe' En elejemplo la parte una parte
decfarativa consta o!|", siguientes sentencias:
int num,.
int digito_izguierdo,.
int digito_derecho;
Esto indica que tres variabres enteras
,amoas nlun, digito_izguerdo
digito-derecho se usan en este programa. y
almacenamiento
La comput"o"r"-..;"espacios oe
en la memoria principal para estas
variables cuando fa funcin main
a trabajar' se puede pensar que ellas
son corno casiilas en
;iliJ," fa memoria
num digito_i zquierdo digito derecho

La otra parte de la funcin main es la parte ejecutable. Esta consiste de las


";::'":'r;"r'?:
f *ni""'",
COmPUtadorA cicnr rfa on
* ", h; l, ; # ffi ;";"' :'' ", . l'3'J', n'3
":f :::i^ :" ^ :: i
p
::fi 3l'?':'i :^"11 i :"
num
;ffi;:
"1,'"i'" "il
25
En este punto, ras^rocafidades digito_izguierdo
vafores en etos- si se trata de
y digito derecho no tienen f,
mostrar er contenid, d"
en esta etapa, la computadora mostrar r;;il;;#"
la funcin
argn varor sin sgnificado para este
:;T::
La ejecucin de la siguiente sentencia
es como sigue:
digito_izquierdo : num ,/10;
Esto asigna 25/ic, que es z alavariable diqito _r zquierdo .
u,, Cr g: to_i 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 derecho.
num digrto_i zguierdo digito_derecho
5
2
5

Unidad 3:prog
Volumen l: funOmEtos oe C zZ
@ Copyright tBM Corp. 2OO5
Los materiafes del curso no pueden
ser reproducidos en parte
o en su totafidad sin elprevio permiso
escrito de lBM.
oH
aii
O
f Gua del Estudiante
Introduccin a la p
o s:_lni_f ("El- dig:-to izguierdo es ?d\n,,, digrto_izquierdo) ,.

o 0
i,
1|| Muestra el siguiente mensaje.
O' EJ- digito izquierdo es
oj Qu sucede con la siguiente sentencia?
2

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


ol ,.

ol Muestra el mensaje
I

oJ El digito derecho es 5
ot Todas fas sentencias en la funcin main se han ejecutado y
el programa termina.
o Ahora se puede mejorar el programa recin escrito si se
aprende un poco ms sobre C
ol y sus capacidades' Para comenzar se aprender
un poco ms acerca de las sentencias
o de declaracin.

o 4. Ms Acerca de Declaraciones
o Cuando se declaran mltiples variables enteras, no se
o necesita declararlas
separadamente. se puede combinar su declaracin en una sola sentencia como se
o muestra a continuacin:
o _..: :::::./ c:!r- r!c_izquierdo, digito_derecho;
q En otras palabras, se pueden declarar variables en
una sola sentencia con la lista de
a variables separadas por comas. El int especifica que
una variable entera se est
o,,, declarando se asigna espacio de almacenamiento de manera que
O'*0 puedan almacenar alf i. En estas variables se puede
los enteros se
asignar cualquier entero vlido. Es
vlido asignar --:, -2-:: 1,* -901 a una variabre
o decrarad corT.ro inr.
o 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.
o pueden definir otros tipos de datos, como
A parte de las variables enreras se
a una variable de nmero real o una variable de
prnio lcrante tal como se muestra a continuacin:
o _---;a; pi, saf ario,.
o
Esta deciaracin crea dos variables de punto flotante que
o reales cie la forma 3.747 o -0. o0o2s6. Los datos
pueden almacenar nmeros
o variable entera se fe asigna un valor real.
son truncados cuando a una
o Pero qu sucede si se hace lo siguiente?
pt = 2;
O
En ste caso, la constante entera z serconvertida
o a la forma flotante 2.0 y asignada a
la variable pi. Es de saber que esta locatidad asignada
o un l" rurJ; una casilla
ms grande que lo requerido para una variable entera. ",
O
se han explicado los tipos de datos int
y float. El lenguaje c provee otro tipo de
o -
dato llamado char Este permite almacenar caracteres
constantes como las letras del
o alfabeto A- z 'Z,losdgitos 0 - gyalgunos caracteresespeciales
O z, &, etc. Las variables char se declaran de la siguiente forma:
como G, $, #,
o
Volumen 1: FundametosE
@ Unidad 3:Programa
o @ Copyright tBM Corp. 2005
a Los materiales detcuqo no puden sr reproducidos
o en su totalidad sin el previo permiso escrlto de
en larte
o lBM.

o
Introduccin a la

cnar vocal, consonante;


Las siguientes asignaciones
son vldas.
voca]: ,a,; (
consonante = 'et;
. vocaf : consonante,.
Nota: Las constantes caracteres estn
dentro de comif{as smples. se
e (una vocal) a la variable consonante. !e asign la fetra
Esto dado que no
alguno en el nombre de la variable, "" "orr""io existe signficado
ms que su tipo. solamente acta
etiqueta para poder referenciar
a una locafidad de memora. sin embargo,como una
programador debe escoger
un nombre de variabfe que;;;r;; un buen
,';,-o=offio para er cual
adecuado tramar r" u"r"ire
;:,fi:JiJil'::';r*:"es " sananci" v-r"roar alr fas
5. Ms Acerca de fos Operadores
Hay que reordar que para haflar
el residuo de fa divisin de num entre
siguiente expresin: 10, se us la
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 fr-- rr
aritmtica anterior indica que la
encuentra en su interior se evaluar
primero. c ofrece un amprio
expresin que se r))
operadores para hacer la programacin conjunto de
ms sencilra. por ejempro er operador
' se denota a travs del smbol g y mduro
ste se usa paia ootener er residuo
hacer
de una divisin
uso de ste operador mduro directamente
::tffir::#:de tar como se muestra

num ? 10
se lee num mduro 10, y
devuerve er residuo de ra divisin
10 'Er primer programa en c presentado entera de num entre
puede ser ahora reescrito basado
discusin anterior acerca de declaraciones en la
y operadores.
El cdigo C comienza aqu...
1 #include <stdio.h>
2 mainO i
3 /* Declaracin de varialles en una
4 so]-a lnea *,/
int num, digito_izquierdo, digito_derecho;
5 /* La variable n.m se inici-ait=.'"".-";';:.
6 num : 25; de 2s */
'7 /* El dgito j_zquierdo se extrae */
8 digito_izqurerdo = num / :aO;
Unidad S:ero
votumenl@
@ Copyright tBM Corp. 2005
Los materiafes del curso no pueden
v
sr reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.
o
o
Guia dei Estudiante
o f ntroduccin a Ia pr

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


operador mdu ro
I
* /
o 3.g,ac_ie:echo -. :t lri : i0,.
-| E1 dg'i-to izq'ierdo se muestra en la salida
o -t ') "* estandar ./
Drr-ntr ("r:1 drgito izquierdo es td\n", ciigi.rc
^-l
*!

o r? /* Er dgito rzguierdo) ,.
derecho se muestra en Ia sari. estndar *,/
o !4 },rlrrL.i_
^-i*-r (/rrrl -1 orgrto derecho es ?C\n',, digito derecnol
..
_5
o I

a Ef cdigo C termina aqu...


o Nota: Los comentarios se escriben entre
/* y */,y ef compiladorde.C los ignora.
o Los comentarios se usan para mejo rar la legibilidad
del programa. Es una buena
o prctica escrbr comentarios para explicar programa,
el ro cual tambin sirve como una
o documentacin del programa. sin embargo,
evite usar comentarios triviales tales como.
o ,/* Asigrnar 25 a nu-n. -,/
o num : 25;
.
/* Aarlir 1 a num */
o num : nUm + 1;
o Estos comentarios no aaden valor. A continuacin
o se presentan otros ejemplos.
o Nota: Es mportante resaltar que todo mensaje dirigido
a la salida estndar en un
cdigo en c trabaja con el alfabeto ingls lo que
o vocales acentuadas, fa letra ,', entre otros.
imprica que no se pueden incluir
o Ejemplo 3.2: Invertir ros Dgitos de un Entero de
o Dos Dgitos
o 0 Asuma que se desea tomar como entrada un
que lo componen y mostrar el resultado. Por
entero de dos dgitos, invertir los dgitos
o ejemplo, si la entrada es gg, entonces el
resultado ser 68. Er algoritmo para este probfema
o es muy senciilo.
Paso l: lngresar un nmero entero de dos dgitos
c Paso 2: Ertraer el oiqiro_izquierdo.
num.
o Paso 3: Extraer el oigito cieecno.
o Paso 4: usando el concepto de peso posicional
o de enteros decimales, se puede
formar num_.invertido como sigue:
o num_invertido = digito_derecho *
o 1O + digito rzquierdo:
Paso 5: Mostrar el valor de num_inverti-do.
o
o Esto es precisamente un algoritmo que necesita
ser convertido a C, tambin usa
algunos pasos ya discutidos anteriormente. Er programa
o continuacin:
en c se muestra a
o
o
o
o
o
o^ Volumen l: fuE-entos de C
de Unidad 3:Prog

a @ Copyright tBM Corp. 2005


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

o
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 */
1 num = 89,.
8 digito_izquierdo : num / J_O;
9 ve-su.lO: nUm 810;
^.i ^i
+^ i^-^^L

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) ;


L4 I

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


q,
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.
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. :
Paso 3: 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
+ digito_izquierdo.
Paso 7: Mostrar num.
Paso 8: Mostrar num invertido.

Unidad S:erog
Volumen '1: Fundamentos de C 26 \\
O Copyright tBM Corp. 20OS
v
Los materiales del curso nb pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso escrito
de fBM.
of
a Gua del Estudiante Introduccin a la programacin con C
o -._._
o Siempre que un programa tenga una sentencia larga, la lnea se puede dividir
oi
o
mltiples lneas. Cada lnea de la sentencia multilinea se termina con el carcter
en
de
diagonal inversa (\). Esta declaracin o expresin larga escrita en mltiples lneas.
terminada con un diagonal inversa, se trata como una sentencia compuesta.
o Esta
facilidad permite escribir un programa bien formateado. El programa en C se muestra
a
o continuacin:
o El cdigo de C comienza aqu ...
o 1 #include <stdio. h>
a 2 mainO{
o 3 int nurn, dtg-ito_rzoui erdc, Crcito_riedlo,.
4 int digrto_de:echo, temp, nun inver:rcic,.
o 5 num : 734;
o 6 /* E1 dgito ms a 1a izquierda se extrae */
o 7 digito_izqurerdo : nun / 100,.
o 8 /* Los dos dgrtos ms a Ia derecha se extraen * /
o 9 temp : num ? iOO;
I0 /* E1 dgito del medio se extrae */
o 11 dig'ito_medjo - -renp,/ iC,.
o 72 /* EI dgito ms a la derecha se extrae * /
o 13 digito_de::echo : i_enp ?. ,C;
o 14 /* El- nmero inverti-do se calcula. se usa eI carcter de diagronal
o inversa Para sel)arar las s!-gruientes sentencias en dos 1neas */
o3 15 num-invertido : irg---c_cie:ec:-: - rco + dlgito medio * 10
o" I6
I1
+ digito_izquiercic;
printf ("El dai,c c:::qr:.a1 es : !,o\rr,", ium) ;
o !8 prtntf ("El dalo i::r-:::ii: :s : r.d.,..", num invertido) ;
o rg l
o Ef cdigo C finaliza aqu...
o Se recomienda ir a travs de cada sentencla del programa en secuencia para diferentes
o entradas, asignndole diferentes valores a ia variable num y observar cmo el programa
o se comporta para diferentes valores. Se puede pensar en otro algoritmo para realizar
o la misma tarea?.
o Fin del Ejemplo 3.3
o Antes de seguir con otros ejemplos, se explca cmo convertr el programa C a un
O cdigo que entienda la mquina.
o
o
o
o
o
o
q Volumen 1: Fundamentos de C
J Unidad 3:Programacn en C-Lm
c @ Copyright tBM Corp. 2005
Los materiales delcurso no pueden ier reproducidos en parte
o o en su totalidad sin elprevio permiso escrito de lBM.
o
o
6- compilacin de programas Hechos
en Lenguaje
En Linux la compilacin se hace usando programa
c
del programa en c como un argumento. La
ef
el programa compita sin errores. El compil"ori
ces
cc, que genera un archivo a.out si
cc, y toma el nombre del archivo
extensin que se usa para los archivos que
I
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,
pginas man de Linux. use las
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 ) / g

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.
10 eguivalente a ?f \
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
formato contiene un o/of, el cual indica que
sentL"" pirtr se nota que en la cadena de
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 c
Los materiales del curso no pueden sr reproducidos
en parte
o en su totaldad sin el previo permiso
escrito de f BM.
o
o
Gua dei Estudiante
o Introduccin a la programacin ccn C

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


o 3 El siguiente programa en c calcula el rea de un crculo
dado el radio. El algoritmo es
o simple, ya que se conoce la frmula para calcular el rea
dado el radio del circulo. El
o rea de un crculo vienedado porlafrmula, Area rf .
= Donde Tres aproximadamente
3'14159 y r es el radio de la circunferencia. El programa puede
a escribirse como sigue:
O El cdigo en C comienza aqu...
o 1 #inc]ude <stdio. h>
2 inr main (void) {
o 3 f -l oa! area / raot o,.
o 4 r:ad o : 32 . 15:
o 5 at:ea : 3.14159 * ac-: , :-cic,.
o 6 printf ( "para e-l :ad:c .,
: , = r area es :
/j
O
El cdigo C termina aqui...
o
Fin de Ejempto 3.S
o
O Ejemplo 3.6: Cafcutar ef Inters Simple de un Monto Dado
o Escribir un programa en C que calcule la cantidad a pagar
del monto principal para un
f: 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
o tasa.
o Se sabe que:
rnteres a-paja: =::_. - tiempo * tasa/100
:0
o
El programa que realtza los ciculos es ef siguiente:
El cdigo C comienza aqu...
o
c
o
o
o
o
o
o : -::- : ':
El inters a pagar es calcu1 ad.o */
? ' :.:e:-es_a_paga: : principal * tiempo *
tasa /IOO;
a
i
P t
Los detalles del i_nters a >agar se muestra.r +/
p:r-ntf ("Principal-: %C\n", principal) ;
prrntf ("Numero de anios: ?d\n,,, tiempo) ,.
15 prrntf ( "Tasa de interes: ?f \n", tasa)
P printf("\nCantidad de intereses a pagar: Bf\n,,,
,.

p \
1'1 interes_a_pagar)
p ,.

t lh
llLt Volumen 1: FundametosE C
rtf Unidad 3:ProgramacO

b @ Copyright tBM Corp. 2005


b Los materales dercurso no pueden sr reproducidos
en parte
o en su totalidad sin el previo permso escrito de lBM.
O
Gufa del Estudiante
Ef cdigo C finafiza aqu...
Para la cadena de impresin
de la sentencia printf , se usa zd o
orden y af tipo de variables que zf de acuerdo ar
es principal, que es un int,
se est imprimiendo. n-qu, la primera
luego tiempo, que tambin es
interes-a-pagiar se van a imprimir, se usa un
variable a imprimir
int. cuando tasa y
zf yaque ambos son dertipo f toat.
I ;
i

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 o
hexadecimal)
int (notacin octal sin signo)
zx, zx int (notacin hexadecimal sin signo)
irt (notacin decimal sin signo)

?f ?e ?;E Zq ?G '.F -
^

,_:i5-: ;-

fabla 3.1: Cadenas de Formato para


>rrntf y scanf i
Ef uso de secuencias de caracteres
de escape se muestra en raTabra
3.2
I
.l
I

Carcter de alerta (timbre


\b I 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
c
si prooucidos en parte
o en su totalidad sin elprevio permiso
escrto de lBM.
O
O
Guia oel Estudante
o lntroduccin a la Prooramacin con C

o
.l
a
Resumen
Ahora que ha completada esta unidad, Ud. debe ser capaz de.
a . Establecer la evolucin de C.
a . Discutir cmo escribir algoritmos en C para solucionar problemas simples.
o . Explicar las diferentes componentes de un programa C simple.
o
o
.\--
o -).vtr\
a \
'\-- -

o \ r-. l': \

o \,.\J \.
o 1 , ..-.)\
o
o *+ \'.r ).r
o
a
a
o :\1
\. _\')-.s')
O^ '*.-'-\ \-\\r

.R
?v
o ---:--_, \ \-- \ *-.> l\

o
c .. "\.. --: \i !;l) , . \-_ti\ --f) \. i'<--- \ \ r9-
. " j'.\ -l
-\ --.
o . r,- J

O
o
o
O
o
t
f

Ip
b
I
I
p
lt s, Voiumen 'l: Fundamentos de C
r,rL! Unidad 3:Programacn en C - Los Primeros pasos 3.1
-tE

p @ Copyright tBM Corp. 2005


t Los materiales delcurso no pueden ser reproducdos en parte
o en su totalidad sin el previo permiso escrito de lBM.
IL
Introduccin a la programacin con C 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. 0l
d) Ken Thomson.
5) En qu ao fue desarroltado el lenguaje C?
a) 1970.
b) 1971.
c) 1972.
d) 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 C a2


@ Copyright IBM Corp. 2005
e
Los materiales der curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
I
o
a ;- : cei Estudlante Introduccin a la Proqramacin con C

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


lr "cual
:t
ov b) Il
o c) o
a a) Ninguna de los anteriores.
o
8) Cul de los siguientes smbolos se usa para separar las sentencias en un programa
o en C?
o a) Punto (.).
o b) Punto y coma (;).
a c) Dos puntos (:).
o d) Ambas (a) y (b)
a
9) Cul de los siguientes no es un tipo de dato vlido en C?
o a) int
O
b) float
o c) char
o d) text
o
a 10) sea x una variable entera. cul ser el resultado de la asignacin r/3?
a a) 0.33
a b) 0.30
!tv
IJ' c)0
d) Un valor indefinido
o
o
o
o
a
o
o
o
o
o
o
a
o
a
o
o
o
e0 Volumen 1: Fundamentos de C Unidad 3:Programacin en C - Los Primeros pasos 33
o @ Copyright IBM Corp. 2005
o Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o
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 C a

@ Copyright tBM Corp. 2O0S


e
Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
O
o -:-r cl Estudiante Introduccin a la Proqramacin con C

o
o0 Unida d 4: Construir Fundan'lentos
o Slidos en C
o
o Objetivos de Aprend izaje
o
o Al final de esta unidad, Ud. ser capaz de.
o ' Explicar cmo escribir programas que tomen una entrada simple usando la
o funcin scanf.
o a Discutir las reglas que rigen fa creacin de nombres de variabies.
o a Discutir las propiedades de algunos de los tipos de datos primitivos pre-
definidos.en C.
o a Describir las propiedades y usos de varios operadores aritmticos.
o a Describir la jerarqua de las operaciones o precedencia de operadores en una
o expresin aritmtica.
o
o
o
o
o
a.
cr
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o
Volumen 1: Fundamentos de C Unidad 4:Construir Fundamentos Slidos en C 35
@ Copyright IBM Corp. 2005
o Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o
lntroduccin a fa
acin con C
Gula del Estudiante
l. f ntroduccin
En la unidad 3: Programar
enc - Los Primerosp^1os,
los datos de entrada
estaan drsponibfes p;;;;;i se escribieron programas
programa donde
asignacin' Esto no es a travs de una sentencia
ioear, y" qr" tiene varias'lmiacon;.';;; de
ejempro, se desea
:i T['i:"1 :'?ffi[
versin ejecutabfe o" "T
:: "^:#*: oir".J",5i ri e n e q u e e d ta
t itij:.,'f
",", compifarfos
rcesarios, ". y oot.n"i r i

progt"r; ,nl
. nuevamente.
2. Aceptar Entradas def
Usuaro
En la tJnidad 3: Programar
los datos de entrada
en c - los Primerospasos, se
estaoan'olponiotes p"rt"t escribieron programas
programa donde
asignacin' Esto no es a travs de una sentencia
ioear, ya que tiene varias de
ejecutar el programa rimitaciones. si, por elempfo,
con un cnjunto o" u"ior".-iu se desea
0",o, diferents, se tiene que
editar
il,.3ii ;1I.1,,:T:';"
Lo que realmente se necesita
?":;" *: :l*: iff s a ros,
"::e pr,.r o, y obte
"o, ner un a

e o s e e m e n to s . ; ;
p ro p o rc i o n

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


I r

::'""ffi; ilT,j;jx:u:: Ljjff d se nd n o,"r,


a a p re
; ::, i:*:id
e r

Existen muchas
"0,
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 r
una de , rr*'1"::Trf,!:ilJ:g:n'"'a que constituye ta tibrera
a esta fibrera s printf.
De las funciones propias
de la librera stdio.h existe
una que permite obtener
;::'i1til::::il:'"";ff: ra r,n"on scanr
's,"'"on"idera un escenario donde
ra
se
variable flamada num
se puede en una
"r'"""narro
scanf (',9d,,, &num) ,. ";.:[?1""f:j#:H"
"n;uv
cuando esta funcin,se
ejecuta, se espera que
vez que ef vafor se obtiene er usuario
oi,tr"ro, urtJ r ;;;."" ingrese un entero vfido. una
num' La cadena de caracte;";;;;"ada en ra variabre entera ffamada
formato' ca indica que en comifras en et scanr
se ,ama cadena de
'ubcacin'de fa variaole entero decimar ,, ;;;;';.
un
La funcin scanr requiere
''t* en-.,i"?or", o" r"nur"-q*ue ra
pueoa atmacenar er
i"*io,''"i'] varor
n""" ustamenle esto, pasa en
iii&1it;9;,iJ"l,tilmm*"' '"
.':;::"H:;T::i[U*:":,*,Ti:,SilTH"';lTiJ,J,;tifu
la

i;:T_"j: j
Unidad '
Vofumen l, punOamentos
e C 36
O Copyright IBM Corp.
Los materales delcu 2005
oensu,o,",,o"o'!?li,"r?J,:ff
trJ:tJ3j,i3i""',El,l,n"
o
o
Gua del Estudiante Introduccin a la Programacin con
o C

o Ahora, asuma que se desea leer la entrada del usuario en dos variables pesc ! e.r:j
o0 donde eiai S de tipo de dato rnr- f pe-sc s :-.,:-,. Se debe usar las siguientes
o sentencias:
o scanf ( " gd", &edad) ;
scanf ( ,'% f ',, &peso )
o o/of
,.

Note que se usa para leer peso ya que es de tipo float. En esta unidad, se discute
o cmo obtener las entradas del usuario. Se aqumir que todas las entradas del usuario
o para los programas son vlidas. Las valdaciones de las entradas del usuario se discute
o en el Volumen 2, Unidad 1 - Estructura de Control de Decisin.
o Considere el siguiente ejemplo:
o El cdigo C comienza aqu...
o 1 f tn:lucie <s-_ i_ . h>
o -)
-
t -- \
t-11,r)
-- 1

o 3 in: e':ut:a,-
1 i - Se tona eI valor de 1a variable como entrada del usuario -
o 5 sca.-i i"?C", &altura) ,.
z

o /- Se impr:-me dicho walor en J-a salida estndar */


o 7 c:-:,:j ("?d\n", altura);
o Ei
o El cdigo C termina aqu...
o 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
3a 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
o valor corresponCrente a lo que espera el programa.
o
Considere el siguiente cdigo. Cuando el programa se ejecuta, se le indica al usuario
o que Ingrese un valor mediante la primera sentencia prinrf que se ejecuta. De esta
o forma el usuario puede ingresar la entrada que el programa requiere. La salida
o mcstrada es ciai-amente til y no simplemente un nmero.
o El cdigo C comienza aqu...
o =_
_ ^ --: ' : -_ :_ _. :-:
o
o =____-l

o /- Se le rndrca al usuario que hacer "/


o a:':-i: 1".;E:ese su altura en cent j_metros\n',);
o /* Obtener eI valor de Ia variab]-e cono entrada de1 e1 usuario
I tt9Atl
qenf
&aftura);
o
o 8 /* rnprinir el walor de l-a variable a 1a sarida estndar */
9 printf ("La al-tura en centimetros es ?cl \n". l-_ura)
o 10 )
,.

o El cdigo C termina aqu...


o
dl Volumen 1: Fundamentos de C Unidad 4:Construir Fundamentos Slidos en C 37

o @ Copyright IBM Corp. 2005


o Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o
Introduccn a la programacin con C 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 *,/
rr
'1 ?
prrnti
^-r --r (/ 'r"El dtgito izqu_:-ei-do es:
?d\n,,, digito_izguierdo) ;
74 printf ("Fl drg:to deecho es: %d\n,,, digito derecho)
,.
t5 I -
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
7 usuari-o */
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 ?n

. 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.
o
o
Gua del Estudiante
o Introduccin a la programacin con C
o !.: fahrenheit, cer,sjus :

o 0
o El cdigo C termina aqu
o Fin de Ejemplo 4.2
o Ejemplo 4.3: calcular el rea de un crculo Dado el Radio
a El cdigo C comienza aqu...
o 1 #rncl-ude <stdio. h>
o 2 marnO {
o 3 f loat area, radi o,.

o 4 Indicar aJ. usuario que l_ngrese 1os datos */


O 5 printf ("Increse e_L raC. c ie -l-a ci rcunf eencla\n,,) ;
6 obtener el valor de Ia vanable como entrada del usuario * /
o 7 scanf ("%f',,,iradio);
o 8 /* Calcular e1 rea del crc1o -/
a 9 area : 3. 11159 * rad.io - :acii_c,.
o 10 /* Se muestra el radio de entrada y rea cal_culada */
o 11 crlntf ("\n El radio ingresacio es: n.r,,,:aCl-o);
O 72 Prlntf ( " \n El area es : .: " , are) :
t< |
o
El cdigo C termina aqu
o
o Fin de Ejemplo 4,3
a 0 fE bmplo 4.4: Calcufar ef Inters Simple de un Monto Dado.
o El cdigo G comienza aqu...
O, j #inclucie <stdic. h>
o -)
.tta--:
-_
I * / I
1
I
1

o
oi
oi l

ol
q a:-:.:i1"I:.::ese e :.*::.::: 1;: a::.3.\n"),.
ol
ol ::-<: ce ' ::-;=:es, como val_or rea.l-\n" ) ;
-.:=::j (,'r-:,,, :aSa.
.l ,/ - ClcuLo de1 inters
,.

a pagar + /
q ::tte:es_a_pagar : mon:o * :.t_emDo * tasa / IO0;
I? /- 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 en C

@ Copyright tBM Corp.2005


Los materiales dercurso rio pueden sr reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
fntroduccin a la programacin
con C
Gufa del Estudiante
Ef cdigo C termina aqu

usuario v fa entrada det usuario


;fiff;:'::A:' hace que er prosrama sea ms
Fin de Ejempto 4.4
A continuacin se presentan algunos
conceptos fundamenta,res como
variables, constantes, operadores nonrbres de
y expresiones con un poco
ms de detare.
Ejempto 4.S: preguntas f ndiscretas.
con este programa se pretende inte'ogar
indiscretamente a un grupo de personas
sobre interrogantes de gran
importancia urtrdrti"" y social
El cdigo C comienza aqu...
1 #inc.lude <stdio. h>
2 mainO i
3 int edad;
4 f-loat sueldo;
5 /* Ind.icar al usuario que ingrese
1os datos */
u
A pr.LDtr
^-; ! ("Confiesa
/ r'^
t.u edad y sue-l_do actua-l_ \n,,),.
7 scanf ("?d ?f ,,, &edad, &sue_ldo)
;
B /* ros datos adquiridos ,,or teclados
son mostrad.os por pantar_la _/
("Su edad es: zd, y su
:, Jprintf suerdo: ?.1f do_lares \,:r,,, etr= j, s-^e-dc)
;
El cdigo C termina aqu
En el cdigo anterior fa funcin
La variable edad usa una cadena
scanf se usa con dstntos tipos de variaores
a ra
de,ro.mato "2"'v'"""r do o/of. Especficamente vez.
0
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
Al introducir dos o ms datos, "*o
(el carcter de nueva tnea
stos,*1"::1"r separados por caracteres
se .onriour" como un carcter de espaciado
de espaciado).
Los caracteres consecutivos que
limitar el nmero de los
no sean espaciados componen un
dato. Es posible
especiricanoo ,n" lngtud mxima
dato puede estar compuesto ""t""tJlr
por menos caracteres de fos q.ue para ese dato. Er
no se leern los caractet". qr" especifique ra rongitud y
ms ari-JJ"n"
cuenta que en este caso los "ttn sobrant", pru"n rongitud. Hay que tener en
caracieres
errnea para er siguiente o"to. gn ser interpretados de manera
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
40
@ Copyright tBM Corp. 2005
Los materares der curso ro pueden
e
sr ieprooucidos en parte
o en su totalidad sin elprevio permis
escrito de lBM.
o
o
Gua del Estudiante
o Introduccin a la Programacio con C

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


o0 dgitos restantes (B y 9) se ignoran, a no ser que se lean a continuacin en otra
sentencia scanf
o .

o Fin de Ejemplo 4.5


o 3. ldentificadores de Variables
o Como se aprendi en la lJnidad 3: Programpr en C Los Primeros pasos, existen
o ciertas reglas para los nombres de las variables
-
.

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


o variables y funciones se llaman identificadores. Cuando se crea un nombre para una
o variable, se tiene un identificador de variable. Observe la siguiente declaracin:
o rnt L emp,.
o Esto implica que temp es una variable entera ! temo es un identificador de variable. Los
o identificadores pueden usar caracteres. del alfabeto en mayscula as como en
o minscula. Sin embargo, los programadores generalmente usan letras minsculas para
o los identificadores de las variables. Por otra parte, la siguiente declaracin crea dos
identificadores distintos:
o
int temp, Temp;
o
o Los identificadores pueden empezar tambin con el carcter subrayado a Sin
embargo, esta no es una prctica comn. Unas cuantas recomendaciones se dan a
o continuacin para ayudar a escoger el nombre ms apropiado para una variable.
^-
_'((l Escoja nombres de variables que reflejen fa naturaleza de su uso. Los identificadores
o\z
sal-ario-basico, ded_imp, cuentaLelf tal vez revelen sus usos inherentes al
O reflejar salario bsico, deduccin de impuestos y cuenta de telfono. Sin embargo. Los
o nombres de identificadores no tienen ningn otro significado son slo nombres.
o Por ejemplo, se puede almacenar el peso de una persona en un identificador llamado
o ganancia, pero esto no tiene mucho sentido. Se debe evitar el uso de nombres de
O variables como xl2pq34, zxyplz, o el nombre de una mascota, que no reflejen el
o uso apropiado. Algunas implementaciones de C permiten slo ocho caracteres,
o 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
o que sean significativos.
o
Los identificadores de variables no pueden ser iguales a las palabras reservadas de C
o como lnt, float o main. De hecho, las palabras reservadas en C estn en letras
o minsculas. No se puede declarar fi-oat como un identificador. Pero se puede declarar
o lo siguiente:
O l-oat Float;
f
o Tambin se puede tener un identificador tlamado rt-oat. Sin embargo, esto crea
o confusin- Por tanto, es mejor evitar el uso de estas palabras. Los siguientes nombres
o son identificadores vlidos para variables:
o/^
Volumen 1: Fundamentos de C Unidad 4:Construir Fundamentos Slidos en
v C 41
o @ Copyright IBM Corp. 2005
o Los materiales del curso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
Introduccin a la programacin con C Gufa delEstudiante

A J s.v

KZOZ q: I : rr nrrf
bill_1 SAMPLE
Los siguientes nombres no son identificadores vlidos para variables:
9c1oud No comienza con una letra.
salary$ lncluye un carcter especial..
by-pass lncluye un carcfer no permitdo _.

first name 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:
doub-l-e int struct
x-^ - r- ^t ^^
saE long switch
enum rct
!v!:ro q1-uL!
r fLyPsusr
rrna-l^r
cnar extern return union
con st I Vq L short unsigned
nn!.i
vv.u-tUC n'.^ for signed void
UgIdUIL
^^a-,-l+ goao sizeof vol_atile
do if static whil_e

Unidad 4: Construir Fundamentos Siidos en C Volumen 1: Fundamentos de C 42

@Copyright tBM Corp. 2005


e
Los materiales dercurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o
o Gua del Estudiante Introduccin a la programacin con C
o
arl 5. Tipos de Datos Bsicos en CO
o Antes de continuar se debe entender qu es un tipo de dato. Generalmente,
cuando se
o le pregunta a un estudiante qu es un tipo de dato, la respuesta ser ,un int,, ,un
o -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
o como un conjunto
de valores y operaciones definidas para las var[ables de ese tipo en particular.
o Los tipos de datos bsicos en C son int, f loat, char y double.
o int es un tipo de
dato y define el conjunto de valores que una variable del tipo inr puede
almacenar, y
o tambin el conjunto de operaciones que se pueden usar con tos operandos
enteros.
o fl-oat es un tipo de dato dado que define un conjunto de valores, aunque estos no
o pueden serenumeracos como en int, y las operaciones
definidas para esetipo. para
o f]oat, las operaciones definidas son +, , *, /. Sin embargo % noest definida.
o Cada uno de los tipos de datos bsicos se almacena en forma diferente
en la memoria
o 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
o asignados para los tipos de datos especficos puede variar de un modelo
bytes realmente
o computadora a otra.
de
o c provee el operador sizeof que permite determinar el tamao
O de cada tipo de dato
que es soportado por el hardware subyacente.
o
o^ ,^ Tipo de Dato Descripcin Requerimientos
tt'

o
J
ll
\ n InI
C)
Entero
tpicos de Memoria
2 bytes
) {f
xi Float \
o l (l
Nmero de Punto Flotante 4 bytes
O Double Nmero de punto flotante de
\P \-l dobie precisin
B bytes

o (.\r
/.1r.^. 4
vrrd
o a) Carcter simple 1 byte

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


Tabra

o Los caracteres se representan a nivel de mquina como un entero. para


hace) esto. fas
o 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
o como $, oA, * y &. En un solo byte una computadora puede almacenar
especiales
a rango de -128 a +127 - Debido a que todos los cdigos son
nmeros en un
enteros positivos, se pueden
o representar 256 caracteres usando un byte. Los valores utilizados
van desde 0 hasta
o 255' A-z (maysculas) estn representados desde 05 al g0 mientras que
a-z
o (minsculas) estn representados desde 97 al 122. En
cualquier libro de texto de C
o encontrar el cdigo ASclt completo que usa una computadora
moderna.
o
o
o
t
o
Volumen l: Fundamentos de C

@
Unidad 4:Construir Fundamentos Slidos

Copyright tBM Corp.2005


en C 3

a Los materiales del curso no pueden sr reproducidos en parte


o en su totalidad sin el previo permiso escrito de lBM.
o
o
Introduccin a la progranlacin con C 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,
unsiqned int- Estas variabfes tambin se pueden escribir comosigned int o
unsiqned para referirse de forma automtica a enteros. Generalmente,
short, longr o
menos memoria que slo int, mientras que rong requiere
short requiere
int ' Todos estos son dependientes del compilaoor y debenms memoria que slo
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
siempre dependiente del
compilador que se use.
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
principiante debe estar siempre atento a que estas
al double. un
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
puede usar el calificador long. As, deciarar de puntos flotantes, se
una variable de tipo double ser diferente de
declarar sta como un long double. Para nmeros de punto
proporciona mejor precisin. flotan long double o
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
escenarios, los calificadores short se usan para optimizar
muy pequea. En estos
ta memoria disponible.
6. Constantes en C
Existen cinco tipos de constantes en C. Estas son:
o Constante enteras.
. Constante de punto.flotante.
. Constante de carcter.
. Constante de cadena.
.' Constante de enumeracin.
A continuacin se discuten los primeras cuatro tip.os de constantes.
El ltimo tipo de
constante, los enumerados, se exprica en el vorumen
Adicionales de C.
6 tJnidad 3: Caractersticas

Unidad 4: Construir funffi Volumen 1: Fundamentos de C 44


@ Copyright tBM Corp. 2005
Los materiales delcurso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.
or
tl'
Gua del Estudiante Introduccin a la Proqramacin con C
ol
e 6.1 Constantes Enteras

!,c
I
I
Una constante entera es un nmero de valor entero. Este consiste de una secuencia de
dgitos precedido por un signo + o -.
a I Estos pueden ser escritos en tres sistemas numeracin diferentes.
q . Decimal (base 10)
q . Octal (base 8)
q . Hexadecimal (base 16).
a El sistema decimal permite los dgitos de 0 a 9 y opcionalmente precedido de un signo +
o o -. El sistema octal permite los dgitos de o a 7 donde O es siempre el primer dgito. El
o sistema hexadecimal permite los dgitos o a 9 y las letras A, B, c, D, E y r, empezando
o con 0x y 0X.
o Algunas de las constantes decimales vlidas son.
o 9 4518 -234, 0
O
Las siguientes son constantes decimales invlidas
o
1)? Las constantes decimales no pueden empezar con 0.
O
o Contiene una coma.
2?S
o Contiene un carcter esoecial.
o 23- 4 Contiene un guin.
Una constante octal pertenece a la base 8, donde los dgitos 0 y 7 son vlidos. para que
:0 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
o constantes vlidos de constantes octales son:
o t:ZL= -) 01 011
O .

o o Una constante hexacjecimal (base 16) debe empezar con 0x ox y puede ser cualquier
o 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.
o
O Algunas constantes enteras hexadecimal vlidas son:
o 0x723 CXa2b4C9 OxFACE 0x.
o El tamao de un nmero dpende de la computadora que se use. Por lo general, se
a puede tener un rango que va desde 0 a algn valor mximo predefinido, basado en el
o nmero de bytes que se usa para almacenar los enteros. En computadoras que usan 2
a 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
o almacenamiento, un mayor rango de nmeros puede ser representado.
O
a
o
),
Volumen 1: Fundamentos de C Unidad 4:Construir Fundamentos Slidos en C 5
'a0
o @ Copyright IBM Corp. 2005
a Los materiales delcurso no pueden ber reproducidos en parte
o en su totalidad sin elprevio permiso escrito de lBM.
o
Introduccin a la programacin
con C
Gula del Estudiante
. 6.2 Constantes de punto Flotante
una constante de punto flotante es un nmero I
decimal (') o un exponente o ambos.
0.0
1.0
en base 10 que contienen un punto
Algunas constantes de punto flotante vtidas
son: I
0.3
1256.43
+25

-3.003
t
Adems se puede usar la notacin exponenciaf
como sigue: .;
qt- 1

a a

^
U. ^^-
UUJqC4.
cuando se usa la notacin r, implica que el punto
posiciones a la derecha, s el becimal debe moverse tantas
exponente es positivl o l" izquierda
s es negativo.
Asque, <r--r significa que S 4 x ,g-3 que "
es 0.004.
Tambin, 2 .3E4 significa 2 .3 x I o4 que es 23000. 0.
Nota: r puede estar en mayscula o
minscula. Los exponentes son constantes
en forma decimal y no puede ser un enteras
nmero real. porejemplo, es jnvlido
10.34
6.3 Constantes de Carcter '3.2.

es vudrqurEr
vo cuafquier udracler
carcter encerrado entre comilfas simples.
A los caracteres se fes asigna un nico cdigo Or
(American Standard Code for fnformation
numrico llamado cdigo as.rl
cction ASCtI
Interchrng"l. +
'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 de cadena vridas:
hola "onstantes
nombre
ES
a
Nota: 'a' es diferente d9 ""., en er primer
caso es el carct er a, yen ef segundo es
caoena a' se aprender ms acerca ra
de las cadenas Ln c un el volumen 3 unidad
Programar con Arreglos. 1:

Unidad 4: Construir Funoamentos


Slidos!n C Volumen l: Fundanentos de C 46
@ 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.
o Cuando se usan con operandos enteros, todos los operadores anteriores retornan un
o resultado entero.
a C)r
operador % es vlido slo cuando ambos operandos son enteros. Cuando uno de los
o O>)*-t
- I/
operandos es un fJ-oat, el resultado ser tambin un ft-oar. Adems, cuando se usa el
o operador /, se debe tener mucho cuidado de asegurar que an a/b, b no sea cero. Si se
o intenta dividir entre cero, el programa no funcionar. Si uno o ambos operandos son
o negativos, entonces el uso de los operadores anteriores resuftar en valores cuyos
a signos sern determinados por las reglas del lgebra. Cuando uno de los operandos es
o negatrvo, el resultado del operador % no est claro.
o La mayora de ios compiladores de C hacen que el residuo tenga el mismo signo que el
a primer operando. -ts t debe ser cuidadosamente interpretado. En la mayora de los
o1 compiladores el residuo ser -:.

o- ^A.
/'Una expresin aritmtica es una combinacin de identificadores, constantes y
operadores aritmticos, que opcionalmente tienen parntesis. Considere la expresin
o ' 5*a - 5+b.
o
o Qu evala esto?
o - (5a) - (5b) o

o -5 (a-5b)
O 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
o de los operadores. Esto se da en laTabla 4.2.
a
o Prioridad Operadores Descripcin
o,_ Primero "/o/o Multiplicacin, divisin, mdulo
a Segundo +- Adicin. resta
Tercero
o Asignacin

o Tabla 4.2: Prioridad de los Operadores Aritmticos

o 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
O
ser evaluada antes Que c/d. Los parntesis sobrepasan todas las prioridades en las
o
o Volumen 1: Fundamentos de,C Unidad 4:Construir Fundamentos Slidos en
o0 C 47

a @ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
a o en su totalidad sin el previo permiso eScrito de lBM.
a
o
Introduccin a la
con C
Gufa delEstudiante
expresones' sin embargo, dentro de parntesis, las prioridades
:Hi::r;, ln::: 1':':: :::.^"1$ ;:"i; "',
,los mencionadas
fi "jfi ji"J3l:: e n cuvo ca s o, a exp
res i n
;t"::3tr1;::,ffi J[1il?;:;Hy:g[*l";ilL"J:#?:ff :
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 * eva.l_uado
50+2I-3+B_2
71 _ 3 + B _ 2 ,/ evaluado
68+g-Z * eval-uado
to _ 2
-a - evaluado
/4
+ eval_uado
k le es asignado - eva-l_uado
71 : evaluado
Fin de Ejempto 4.6
Ejempto 4.7
Para Ia siguiente ecuacin cuadrtica:
ax2+ bx + c: O

Se determinan las races usando


la formula:
-b + square root (b? _ 4ac) / 2a o)
-b - sguare root (b2 _ 4ac) / 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
compuesto consiste generalmente
oe asig;frn. un opr"ooi de asignacin
de un operador aritmtica binario y
asignacin simple' Este ejecuta un operador de
operacin de un operador binario en ambos
y da el resultado de esa operacin
at operando izquierdo. T";
;irffi:fft precedencia
La decfaracin x
= X + 2 es equivalente a X+= 2. LaTabla
los operadores compuestos 4.3 muestra fa fista de
de asignacin ms usados.

Unidad : Co
Votumen t: runGmEnG?e c 4t
, -^ _- . .
los
@ Copyright tBM Corp. 2OOs
materiales del curso no pueden ser reproOucidos
o en su totalidad sin elprevio en parte
p"rri.o escto de lBM.
t
o Gua del Estudiante Introduccin a la programacin con C
o
a Operador Propsito
o0 )i-
Ejemplo
l
Salida

o Suma/Asignacin _l

O
Resta/Asignacin
x- t0
5
o
o Multiplicacin/Asignacin 50
o
o Divisin/Asignacin

o z: Mdulo/Asignacin
1\ - 1t t

o C

a Tabla 4.3: Operadores Compuestos de Asignacin


o A continuacin se ilustra el uso de estos operadores compuestos de asignacin con un
o ejemplo.
o Ejemplo 4.8
o A continuacin se escribe un programa, que acepta un valor entero por parte def usuario
o y muestra el cuadrado del nmero dado.
o El cdigo C comienza aqu...
a 1 #include <stCio. h>
o 2 mairr O {

or0 3 int num,'


o- 1-
5
: rin-t/rrTnnrpq:
r_
scanf ("?d",&num),'
-'u ./ - r'\
/ |

o 6 /- Calcular el cuadrado de1 n-mero dado * /


a 7 num*=num;
o e /* El cuadrado se nuestra en la salida estandar */
9 pr:.nif ("Ef cuad::adc es: ii\n", num) ;
o _',t
'}

o
o =l cdigo C termina aqu
Fin de Ejemplo 4.8
o
o 9. Conversin Explicita de Tipos
o Considere las siguientes declaraciones:
o i,nt x;
a float y;
o Que sucede con la expresin aritmtica (x - y) z r0? La expresin (x - y)
a devuelve un resultado de punto flotante dado que y es un ft-oat. Si uno de los
o operandos no es un entero, el operador % no ser vlido. Existen ocasiones donde
o estas son ineludibles, y ? debe ser aplicado. En ese caso, se debe convertir
o explcitamente el punto flotante a un entero. Esto se hace a travs de lo que se
o.
Volumen 1: Fundamentos de C Unidad 4:Construir Fundamentos Slidos en C 9

a @ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos en parte
lr o en su totalidad sin el previo permiso escrito de lBM.
o
o
lntroduccin a la programacin con C 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 a G_y)zro, y el
cual es de cualquier modcl una formacin inconecta de ra expresin.

{t\(\ trJO-
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 h.
I
t
L
:

-
l|t).
l AAA
!VJV.-: ^.
c
| - r.

L _ 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:
' Se requiere que el programador haga explicito el tipo de dato
por lo tanto est conciente der cambio de tipo de dato.
a ser convertido, y
o Facifita la lectura del program a para otros.

Unidad 4: Construir Fundamentos SOtol eE Volumen 1: Fundamentos de C 50


@ 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 Estudiante Introduccin a la proqramacin con
o C

o Resumen
o
Ahora que ha completada esta unidad, Ud. debe ser capaz de..
o
o ' Explicar cmo escribir programas que tomen una simple entrada usando la
funcin scanf.
o Discutir las reglas que gobiernan la creacin de nombres de variables
o '
a Examinar las propiedades de los tipos de datos primitivos predefinos de G.
o a Describir las propiedades y el uso de los diferentes operadores aritmticos.
o a 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 en C 51


@ 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.
lntroduccin a la

Unidad 4: Examen de Autoevatuacin


1) cul de las siguientes sentencias
de asignacin es invlida en c?
ai
x = x + 1;
b) y=y+1:
c) float=pi"r*r;
d) P=24.5"alb
2) curde ras siguientes es una asignacin ur" para
a) c = 'c'; char c; ?
b) c ='cat';
c) c = "cat",
d) c = "c';

:."'rff:$"":;;:t"ff:,':s nombres de variabtes 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.

una variabte, dectarada en c


:XT;:r:i'il:ffi"?r"0"
" a) como char namei
Ocho.
b) Cualquier longitud.
c) Uno.
d) Dos.

6) cules de ros siguientes no


son constantes de carc.ter vtidas?
a) "a"
b) "Bill"
\ ^l
vta
d) '8ill"

Unidad: Constr@ Volumen 1: Fundamentos de C


52
@ 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.
o
o
- lntroduccin a la programacion con C
o
o 7) En la expresin, 25*d + (>:*2.3+2) / ( (x-y) i (c+d).2.3) cul porcin ser
o0 ejecutada primero?
a) 25"d
o
o b) x"2
c) x-y
o d) c+d
o
o B) x es una variable entera. Qu almacear la asignacin x :
si 9/2?
o a)0
o b) 4
o c) 4.5
o d)5
o 9)Qualmacenarlaasignacina t5 + 3 z 5?
o a) 15
o b)3
o c)0
o d) 18
o
10) Cul de los siguientes no es un calificador de tipo de datos?
o
o a) int
)r; b) short
{{it c) long
o- d) signed
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
eo Volumen 1: Fundamentos de C Unidad 4:Construir Fundamentos Slidos

@ Copyright IBM Corp. 2005


en C 53

o Los materiales del curso no pueden ser reproducidos en parte


o en su totalidad sin el previo permiso escrito de lBM.
o
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) a

unidad4, con"tru@ Volumen 1: Fundamentos de C

@ Copyright tBM Corp. 2005


a,
Los materales delcurso no pueden ser reproducidos
en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o
Gua del Estudiante
o Introduccin
___ a la prooramacin con C
o
o unidad 5: Laboratoro de programacin
o0
o enc
o Objetivos de Aprend izaje
o
o Alfinal de esta unidad, Ud. ser capaz de:
O . Trabajar con las construcciones bsicas de C.
o . Escribir programas para problemas simples.
o . 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
o
o
o
o
o
o
Volumen 1: Fundamentos de C Unidad 5: Laboratorio de programacin n
3 C 55
o @ Copyright tBM Corp. 2005
o Los materiales dercurs.o no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de tBM
o
a
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 xe y,
intercambie su contenido y los muestre.

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.
0 lntroduccin a la
Programacin con C
(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 I
lnformacin de la pubficacin
producida utirizando Microsoft
5;i;:?j",i,ilff:: word 2ooo y Microsoft powerpoint
I
Marcas Registradas
IBM @ es una marca registrada
de Internationaf Business Machines
corporation.
oe roJuctos v seryici, Luo"n ser marcas
351'":"#p"ililJJ}:*:: resisrradas o

de otras compaas son mostradas


ffil::"merciafes a continuacin:
corporation
Red Hat Linux H:T"rt"",-

Edicin Junio 2005

La informacin contenida en este documento


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

ser reproducido en su torafidad o en parre


;:nfr"$:,?r".:igil:de sin er previo

Instrucciones especiales para la


impresin de este curso.
No deben rernoverse las pginas
en blanco que puedan aparecer en el
unidad y entre dos unidads.'estas final de cada
nan sido nsertas intencionarmente.
:r
ol Guia def Estudiante
Intrcduccin a la Droorarracin con C
ol
Contenido
:l o Unidad l: Estructura de Control de Decisin
ol Objetivos de Aprendizaje
1

of 1. Introduccin
1

rf 2. Construccin rf Simple
.-)
z-

OI
ol 3. La Construccin : i_et se 5
of 4. La Contruccn r: Anidado '7

ol 5 Expresiones y operadores Lgicos y Reracionares


q 6. Operador Ternario
IU
1a
.l 7. Las Diferentes Formas de Sentencias rf
tz

q 8. La Estructur? sw :c ... case


o
q t
Resumen
d
d Unidad 1: Examen de Autoevaluacin 1
LA

a Respuestas a ra unidad 1. Examen de Autoevaruacion

t? unidad 2: Laboratorio Estructuras de contror de Decisin


Objetivos de Aprendizaje

to

29
?n Ejercicio de Laboratorio ?n
Unidad 3: Construcciones lterativas
21

o Objetivos de Aprendizare
a 1 .Introduccin
J
o 2. Construccin lterativs i..,:. _ _ e

o Resumen
o Unidad 3: Examen de Autoevaluacin q1
a Respuestas a ra Unidad 3. Examen de Autoevaruacin
o Unidad 4: Laboratorio de Construcciones lterativas
o CE

a Objetivos de Aprendizale
I Ejercicios de Laboratorio
56
o Unidad 5: Ms Construcciones lterativas
57
o Objetivos de Aprendizaje
o 1. Introduccin
o 2' Resolucin de Problemas Usando otras Construcciones
5g
o lterativas5g
o 3. Ms acerca de la Sentencia for 65
H
\\v
o Losmateria,::_qe:;"#X'Jil,?Y":Tj;,l??3.,cidosenparte
o o en su totalidad sin el previo permiso escrito de
lBM.
o
I
lntroduccin.a la ramacin con C
Gua del Estudiante
4. Salir de un Bucle prematuramente
5. Uso de fa Funcin fncorporada
pow (
o3
)
6. La palabra Reservada continue
o

7. ov
La Estructura de la Sentencia
do_whi-te
69
Resumen
Unidad 5: Examen de Autoevaluacin 73

Respuestas a la Unidad 5: 74
Examen de Autoevaluacin
Unidad 6: Laboratorio Ms Construcciones 76
fterativas
Objetivos de Aprendizaje 77

Ejercicios de Laboratorio 77
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
Gua del Estudrante
o introduccin a la proqramacin con C

o
oI Unidad 'l: Estructura de Control de
o Decisin
o
O Objetivos de Aprend izaje
o AI finalizar esta unidad, Ud. ser capaz de:
o
o ' Definir la necesidad de decisiones en los algoritmos y en los programas de
computadoras.
o
' Desarrollar algoritmos que requieran tomar decisiones basadas en
o especficas.
condiciones
o . Discutir las diferentes formas de la sentencia r i.
O
' Expficar las expresiones relacionales, expresiones lgicas y la precedencia
o los operadores lgicos.
de
o . Explicar el operador ternario.
o . 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 Volumen 2: Estructuras de Controlen C
)
Unidad 1: Estructura de Controlde Decisin j
o @ Copyright tBM Corp. 2005
o Los materiales dercurso no pueden ser reproducdos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o
Introduccin a la Programacin
con c 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
tomaron para aprender a programar fueron se
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
I
ciertas condiciones se verifiquen y se tomen ,"rotuer problemas que requieren que
problemas computacionales generalmente decisiones de acuerdo a stas. Los
requieren que el usuario tome acciones
especficas' basadas en si una cierta condicin
mostrar el mayor de dos nmeros enteros
se satisface o no. ptr eempfo, para
A y B, se debe primero verirrcar la condicin
antes de que se pueda llegar a la conclusin.
otro ejemplo' consiste en verificar si un estudante
Para descifrar la intenogante es necesario que es de sexo femenino o mascurino.
er arumno proporcione su sexo como
dato de entrada y ste pase por una condicin
nterrogante. ' que
Yve determne la [
vstsrrrrrrs li' respuesta a esa

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
en programas' La sentencia r est disponibfe para usarse
las estructuras de if simple y de if en diferentes formas, desde
-ei-se, hasta las estructuras de if mltipfes y de
if anidados' cada una de estas estructuras ayuda a darre
requieren control de decisin en su contexto. sentido a los problemas que
,)
'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
resuelve el problema y provee las entradas
un probrema, sugiere un"on argoritmo que
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.
solucin es directa y er argoritro j"r, La
este probrema se da a continuacin:
Paso l: Tomar como entrada x e y.
Paso 2:Verificar sx > y.
Paso 3: Si es cierto, entonces mostrar
x como el mximo,
unidadl.esttuffi Volumen 2: Estructuras Oe Control e-n-C
I
@ 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
tt
!t -G_ua
oel Estudiante
Introduccion a la proqramacin con
lt C
off Paso 4: En caso contraro, mostrar
v como el mximo
O lt Este es uno cie los mtodos para resoiver
.h{
^fr pai-a muchos de los problemas que este prcblema. Existrrn mltiptes soluciones
se van a presentar. Los que aqui se drscuten
olt los ms simpres que faciritan .orn[rut"r
ros objetivos cier aprendizaje.
son
ofi
.lf Para comenzar' se discutir la sintaxis y
La forma general de fa construccin
semntica cje una construccin
r simple se da a continuacin:
if srmple en c.

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


:F sentenc: - _,.
ol En este caso sentencial es una sola sentencia
ol De manera de verificar si x es mayor que
c, la cal se llama sentencra,,simple,,.
. se pueoe usar la siguienle sentencia:
ol ti(x >
-i
r,)
ol
ot La palabra reservada es if y ia conc.icion que se Verifrca es
r:i:,:"*,"cionat a >: ), -,: > 1",. Tambin se re
o l:[:.::f una expresin relacionai siempre resutta
en
a
o construccin r: oara escribir rn prosrama en c que impremente
o :,;#;l"":?flj: er

o El cdigo C comienza aqu...


o j *:nc-Lucie <s:c: c. n>
Orrs 2 nain) I
o,u 3

o
o :
o
o , ;t) )
o x es nayo:r aI valor de y
o
o ;.. 9'-rt

a 1r:_ ^- ;^
_.v-
hA-
Yue
-!^
eI walor d. y * /
o
o es: ?d\,n", ),) ;
igrral al val-or d.e y
o
o
o
o
o
o
o
oj Volumen 2: Estructuras e Controten
C Unidad l:Estructurffi
o @ Copyright fBM Corp. 2O0S
o Los materiafes delcurso no pueden
sr reproducidos en parte
o en su totalidad sin el previo permiso
o escrito de IBM
Note que las dos entradas se tomaron
usando una sola sentenca scanf. El formato
cadena *d sd implica que se esperan de
dos enteros decimafes. Los dos valores de
entrada se leen en x e y respectivamente.

A continuacin, se
I
realiza un seguimiento de la ejecucin
de este programa con
considere que ros varores de entrada de
::tJ""jT:"3;""J[:*X,:"'"'pro xey
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,
sentenCia, printf ( "El mximo
como resultado la siguiente
va-lor es : ?d \::,,, i,) ; se ejeCuta. La salida se
presenta a continuacin:
El- maximo vat or es: 24
si se dan ros varores de x y = r2, der programa
sentencaif (* t y) retornar falso. El siguiente ":: ,::es< evidente que ra primera
_... se ejecuta y conduce
sentencia ir (x v) conduce a verdadero y se ejecuta ra
:#"il,""5"15i,j1
printf ("Los numercs scn iguales\;:,,) ,.

Esto resulta en la siguiente salida:


Los numeros son iguales
c
que se hicieron ilegaron a ros resultados
:::$ffi::fil"rtos correctos y er prosrama

Fin del Ejempto 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
superan la mayora de edad (21 aos), para cumplen o
para resolver el problema se evitar nacer una venta ilegal. El algoritmo
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 c 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 Introduccin a la proqrama3ton con C
o El cdigo C comienza aqu...
o a,
IE
\v .i*eu::_C.:t)
o -
2 nain O {
*_;.C_:Cie

o : l:,-_ e:a 1,.


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

-: ^*r--
_ _.. --,',--
\ :_ c_ : ::.-, + :.-:-.:
oI I
f. ^
,_

o ',a
:on f a niayo::ia cie edad\:,,)
o :2i ,.

o Ef cdigo C finaliza agu...


o
o Fin del ejempto 1.2
o se puede escribr ms de una sentencia en una msma
o ";"' si se desea eiecutar ms de una sentenca que lnea separadas por el carcter
siguen a la senienca if, se
deben encerrar todas estas sentencias entre
o eS que si eciad
llaves 1 r. La desventaja de ste mtodo
o ,_, esto usando la construccin if _else.
o
o 3. La Construccin if-else
o La forma generar de ra sentencia if-erse se o,a a continuacin.
o rf (condicin) {
o senLe: i:aJ,.
o
o j
sentencian;
o c l <c I
o sentencial;
o
o -centenc1an,.
l
o
O si la condicin es verdadera,entonces el conjunto de sentencas dentro
llamadas sentencias "compuestas", de las {},
o sentencias compuestas dentro de las
sern ejectadas. si sta es falsa, entonces
las
{ } que siguen al et_se sern ejecutadas.
o
o A continuacin se muestran argunas construcciones
vridas de if_erse:
o
o
Io "(|
Volumen 2: Estructuras Oe ControiE
C Unidad l: Estructura Oe ControlOe Oec,sn S

@ Copyright tBM Corp. 2005


o Los materiafes delcurso no pueden sr reproCucidos
en parte
o en su totalidad sin el previo permiso escrito
o de lBM.
o
Introduccin a la programacin con C
Gula del Estudiante
if(a > 0){
Printf ( "Positivo\n") ;
)
else i
printf ( "No Positivo\nl') ;
)
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
postvos
se esperan nmeroq
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
segundo.
es mayor que es
o
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 C 6

@ 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
__ Introduccin a tlproglgr"cin cor: C
ol Verrfi-car si el valor de x es mayor que e1 de y , ,.
o l(
of ': ix > _\'/

of -;-!a/tf--
!'-11-ul \ l- rL=..-1ll- \a_:cr es: e^^l\'l

ol ,/- Verificar si e1 valor dexes que el de Y ",t

of ^t ^^

r
ol" P-::-_: :_ ].=::_:.-a i-;_::

ol aqu...
ol
ol
ol 4. La Contruccin if Anidado
rl Ejemplo l'4: Buscar el Mximo de Tres Nmeros
ol cuando se plantea el problema de determinar
Enteros sin usar otra variable
ol es pensar en utilizar una variable auxiliar
ei mximo entre tres nmero, lo comn
oue permit"
ol primeras variables y luego ese resuftado
compararlo "h"""nar
con el
el mximo entre la dos
tercer dato de entrada. El
oi siguiente cdigo busca rsolver el planreamiento
sin usar otra variable a travs del uso
de una construccin if anidado:
ol Paso l: Ingresartres nmeros entei-os.
el Paso 2:Verificar si los tres nmeros son iguales.
ol
j'c Paso 3: si no son iguales verificar si el primer
segundo.
Paso 4: si la condicin a evaluar en e] paso
nmero ingresado es mayor que es

3 es verdadera, entonces se verifica si


a el primer nmero ingresado es_mayor que et tercero.
Si es as ef valor
o mximo es el primer ciato cao'o. si n es
as er mximo valor es el tercero.
o Paso 5: si fa condicn a evaluar en el paso
3 es farsa, entonces se verifica si el
segundo nmero ingresaoo es mayor que
o valor es el segundo ciato ciaio. Si n es
el tercero. Si es as el mximo
o El cdigo C comienza aqu... "" "i
mximo valor es el tercero.
o
o i incl-ude <stdlc. h>
marn O
a inj
{
v t " Lt
o Y t -.

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


o scanf ('?d 3d td,',&x, &y,&z);
espac-ios: \n,,) ;
o ,/* Mostrar e1 valor de ros tres nmeros
o enteros */
rrl-nrr ("EI va1or de x es: ?ci\n,,, x);
E t arrl

o PI -r-nEr ( "81 valor de y es: ?d\n,,, y)


^eiFrC
t.rr1

;
o r,rtnrr("E1 va.for de z es: td\n,,, z);
n-i-+/?rrr

o /* Primero verificar si x es igrral. que y *,/


o if (x :: y)
o-, Volumen 2: Estructlras Oe ControGnT
J Unidad 1: Estructura Oe Coffi
a @ Copyright tBM Corp. 2005
Los materiales delcurso no pueden sr
o reproducidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.
o
t
f 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 ^+ [| rtr1
vrrrrLr
^ri .-L va-Lor maxl_mo eS: gd\n,,, x)
,.
20 e-lse
27 ,/* Sino z tiene e1 mximo val:or */
22
i]rrrrL- (..L^ \,a_Lor maximo es: gd\n,,, z);
Y;--i/rt-

23 g: ^^
^t >e
24 Verificar que y es mayor que z - i
25 i: ty > z)
26 pr::l:: i "E- _,. --: ;:]:x::.1 s : .:
d\n,,, y) ,.
21 EI>=

28 rf (z > y)
)q / * La waria.ble z ti_ene eI nximo val_or -,/
- ^-
e!-r-__ I :_ -.-:tO: ;aX.;:,: :S: ?d\::,,, Z) ;

El cdigo C finatiza aqu...

er mx,mo varor entre ros dos nmeros insresados,


i:ilil:"8: ;iJff:?fi:ado o\
Fin del Ejempto 1.4

se ha usado una nueva estructura en estos ejempros.


if.
sentencia
se us un i: dentro de otra
Esto se llama construccn if andado.
correlacionar cada erse con su correspondiente if es bastante craro,
if(x>z)
^*i rnLr
|Jr ( '.L-L ValOr
*! r / r.ra
maXimO eS: gd\n,,, X) ,.

est emparejado con:


else
printf ( "Ef valor maximo es: 8d\n", z);
La primera sentenca i f
if (x > y)
est emparejada con:
el-se
if (y>z)

Unidadl:Estrrct@ Volumen 2: Estructuras Oe CortrolGn


C T
@ 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
Gua del Esi-iCiante
o
o
O ;:"$.:il?,"t;: ,11H,,;"n oT'.."1.J0,"
anterior es una construccin ii
o En el programa anterior, se pudo
o entender er emparejamiento
de ros rf_erse,
,JJ o" ,olno,in por r" "t",
o i:ff'?X'ffiT"0?;;:#;'
proporcion"
?:::',"T:"1:::
'lgrlas' ya que permite es esenciar
o rnryo. claridad. una fciL lmprension v
o Ejempro r's: Determinar si
un Nm"ro ,nru.o de Tres
o Dgitos es patndrome
considere la entrada de un nmero
entero positvo de tres dgitos.
o si ste es un parndrome
. ;r;i;;rome es una parabra se debe determinar
misma forma de derecha tJ"r o un. nmero que se ree de ra
o como de derecha a izquierda. por
ejem pro, 121 y
er arsori!1ra oetermnarr
o :iiff:r?alndromes ,n dado es [arndrome es
o "nt"ro
Paso l: lngrese un entero positivo
de 3 dgitos num.
o Paso 2: Ertraer el digito izquierdo
y el derecho.
o Paso 3: Si rzc;_::_, = d=recho entonces
o El cdigo C comienza aqu...
num es un palndrome.

o I #l:rl- - j= .s-_t_. .--


o 2 main O i
O 3 i *.-*
are
^! .iJji./
a 1, ^- i ^+.
p::nLt(,, /
_:J_:=_, J:, j=:+::.c-;

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

o I -ri-- -.'
j,,,
i I
' i :--- .^:' '::::' posil i vo, numero \
o , l- -
ar1vd,:.c,. : :.,,,:._: ;
o lc ]
or 11 ,/* Verificar qrre g4 a:.*ts:(j
a-- el nme-c ingresado es
de 3 dgitos */
oi 1,2 else
.i
ol
13
1,/
if (num <: 99 I I :run >999)
p::-.--: (,,D:c
{

Ld-(J 'ncorrecto' ingrese


i5 -----..t un numero \
of de 3 cigiros\n ,,);
\6]
ol 77 else {
OI 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,.
((J VolumenZ,@
Unidadl: gstruc@
@ Copyright tBM Corp.
Los materiales delcurso 2005
no pueden ,i r"'prooucidos
o n su totalidad sin elprevio en parte
p"irirJ escrito de lBM.
Introduccin a la programacin con C Gua del Estudiante
24 / * verificar que er d.gito izquierd.o extrado es ign:ar aI dgito
derecho *./
za i-f (izquierdo :: ierecho )
26 ,/* Entonces.el nmero es palindrorre */
21 prrntf("8d es un numero palindrome\n",num);
28 el-se
29 /* Entonces este nmero no es palndromer */
30 ::t;rtf ("?d no es. un nulnero palindrome\n,,, num) ;
JI I

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
o
. 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 C


@Copyright tBM Corp. 2005
1O
?
Los materiales der curso no pugden ser reproducidos en parte
o en su totalidad sin el preio permiso escrito de lBM.
o
O Gua del Estudiante
o lntroduccin a la pi-ogramacr^
cc C

o 5.2 Operadores de !guatdad


I o >e pueden usar ios siguientes operadores
de igualo'acl en expresiones reiacronales.
o lgual a
a r= No igual a
O Effos pertenecen de precedencia separado por debajo
I relacionales' Esto ".'n.-g'uoc
signifi-ca qr" un-rna expresin que de los operadores
invorucra operadores relacionales
o como operadores de igualdad, los
operadores relacionares se evaran
precedencia' La asociatividad con una rr.rre
a de los operadores es de izquierd"
ejemplos vfldos del uso de los operadores "ru"ha. ntgunos
oe iguaiJal pr"runtan" a continuacin:
""
o a-

o 5.3 ExpresionesLgicas
o
O I Las expresiones relacionales conectadas
expresiones lgicas que sr3mpre producen por operadores fgicos se oenominan
o I retorna una expresin logica un varor-Je verdad".- o rtro.
realmente un eniero: er valor de Er varo qus
o
". ei valor O.
representa por el valor 1 y also por verdadero se
o I
5.4 Operadores Lgiccs
o
o i il:rr:'i:r,:rt;f:r::?j;. oceraoores tgicos, lamados
.l
o 6; Y (AND)
conectores tsicos, tos

1,0 r O (CR)
a NO INCT)
o isicos para combinar expresiones
o ;:#::? :::'r'".'";fl:j::' rsicas Arsunos
a l _ : :: :._i: !,
..,
.:
o' '- :- :, ; :,-::.: l: _-,
, ^ ?, 2 l: 0)
o El operador lgico a a retorna
el valo
o verdaderos, sio retorna er
varor o. ;ff :'i".l?H g:X?,ff1H;:ri?il;:"J
d valor de FALSo (rarsr) slo
si ambos operandos son farso, sino retorna
o ::i::l#,'"'L:i,"#,"':iilU:*:j:,n" n,"u" r,'0" operadores en ra'ERDADER.
rabra 1 1,
o
a Categora Operadores
Unarios Asociatividad
++- Derecha e izati"rrl
Aritmetica (multiplicacin,
orvtstn, mdulo) */z lzquierda a derecha
Aritmtica (aOciOn,iuOJEon)
I +- 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
O (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:
(a::b) ? p::nti(" 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\ 2 : . 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 una
construcci 1f -ef se simple.
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 C 12

@ 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.
o
o Gua del Estudianie
o lntroduccin a la prograinacjon :o: :
o 9 /* Yerjfrcar sr e_l nnero1 es mayor
maycr que sl ne:c2 entonces muestrao-"re el- nnero2, s el_ nnercl es
o r-nt.erroEa:ior (?), en caso contraric el mensa je despus ciel s- :rrc
Io o-!te est despus de l_os oos
o Puntos(:) -/
10 (nunl ) l-l,?) ? p::intf("Et ma>:,mc -,'arcr
o es: ?d\n"rrumi) :
r:rr1tI (''l r ,a>:.nLc ,,af or es: ici\:t,,, -'rm?', .
o .rl l
^-i-*a,rf-i

o
o El cdigo C finaliza aqu...
o I
El operador ternaro es equivalente a una stmple
o
I

el siguiente ejemplo:
sentenca if, tal como se muesrra en
o ,/* Verificar qrre eI noero 1 es mayor que el nmero -/
I
2
o I if (nunt>nun2) i
o / * S e1 nmero 1 es rnayor que eI nmero 2
o - -i ri,*r
:- -. ( L_ ,aX:mO varci es: '::,i:r',,
o l

o efse {
* S el nmero 1 no es raayor que
O, / eJ- nero2 - ,/
p:i.tf ("El maxirn: valc: e.'.: :d\,,, run2
o ) ,.

]
O
o Fin del Ejempto 1.6
o c Ejempto 1.7 Cantar los Das en un Mes
o
o El usuario ingresa un n,'nero entero entre 1 y 12 que
representa Enerc 2 r=presenta Febrero y asi significa er mes. Aqu 1
o suiesvamente hasta llegar a Diciembre.
El problema cosrst= 3-: escibr un programa que
o tome esta entrada y muestre el
nmero oe cas oe ese mes en particular. Asuma
que el mes de Febrero tlene slo 2g
o dias Para a'/u'ai a resci\'ai este algoritmo recuerde
la frase usada en la escuela:
o "Treinta das iienen Septiembre,
Abril, Junio y Noviembre; todos los dems (excepto
o Febrero) tienen 31 das,
o Usando esta rima, se puede escribr un programa
o un mes Daoo que el algoritmo es sencillo s
para encontrar la cantidad de das de
va a escribir directamente el programa.
o
o El cdigo C comienza aqu...
o - #'nc-uie <sri1o.h>
o rllc_-l
j- / \
{ I
r
J

o 3 /' se declaran 1as variables para almacenar eI mes y er nmero de


das del mes "/
o 4 int mes, dias;
o
o
o
5
o
I Volumen 2: Estructuras de ControGn C
Undad 1: Estructura e Controt OeEecsio^

@ Copyright tBM Corp.2005


Los materiales del curso no pueden sr reproducidos
o o en su totalidad sin el previo permiso escrito
en parte
de lBM.
o
o
_ la_ programacin
Introduccin a . 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);
C
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
15 f (mes :: 2) /* Excepto Febrero *,/
i
t-6 dias : 28;
71 else ,/* Todos .]-os dons tienen 31 * /
18 dias : 31,.
I9 pr_r;-.-L: (,'E-l numero de d_ias en e-l-
I -
mes ?d es ?i\n,,,mes,
^- -
rJ'i :<l
20 ]
2! ^t ^^

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


ti
^-l*-i
entre 1 y 72\n,,) ,.
21 I

22 1

El cdigo C finaliza aqu...

Fin del Ejemplo 1.7

'La recomendacin es realizar la traza del programa cudadosamente


entrada simples. con valores 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:
Se lee una letra.
Paso 2: Segn el cdigo ASCII se calcula la diferencia
minscula y mayscula de cualquier letra, eso para la representacin
entre
numrco que permtir hacer la conversin. para
obtener el valor
todos los casos ese
nmero es 32.
Paso 3: 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 ConJrolenT-Z
@ 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.
o
o Guia Cer EstuCiante
o Inroduccior a la pro;-ama:rcn co
C

o ,l.A. Si es minscula' al vafor ASCII que


la representa se le resta la diferenca
calculada en el paso 2
o
':ii es ffia/scula, al vafor ASCII que
O la representa se le suma la diferenca
mencionada. Er resurtado obtenioo
o p"r" de ros casos representa
et cdigo ASCil de ta conversin ",l"rq;;
de ta tetra l",
o Paso 4' Se muestra en pantafla
la representacin de la letra solicitaca.
o El cdigo C comienza aqu...
o _:_ - _ .. -: . . :_ : . ; )
o -
=
l._ -

O
o
o
o :.'<l=:l_.,,,ra,',&cn);
o de direrenc:-a nu-u:'ca enrre rocia
lo"- ;.:::t: i) e-tto" minscura v
o
: :':=''-'A',)
o /" Er resultado entre cualquier
letra es 32 -/
i j (ch-\:97)&& (ch<=I22) ) /- s
o J
{ es mrnscu]a - /
cr-:d-if,. ,/* Se transforma en mayscula ,,/
o r^-f -
o err L! v_f ,

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


o
o
I l
ch+=iif ,-
i /, S es nayscu1 */
/, Se transforma en mi-nscu1a * /
o Jrrj,u.. '':u Core-Lat.i,a eS: ,:,,.:-,,,,::_i:,
o ;

o El cdigo C finafiza aqu...


o El cdigo anterior utiliza una
varable liamada enrro, cuyo
o concjcones estabfecidas en aporte ar ejercicro segn ras
los rf es impedir que arguna retra
o mnscula y maysculaala vez.
Existen otras formas de sentencias
sea considerada
o er pranteamiento especificado que o""rionaran if ms adecuadas
ifl:oi::"rver prescindir de dicha
o
o Fin def Ejempto LB
o A continuacn se expricarn ras
o diversas formas de sentencias if.
o
o
o
o
o
fi
;o !,
Volumen 2: Estructuras Oe ConiroGnT
Unidad l: gstru

@ Copyright tBM Corp.2005


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

o
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 I
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
j

4 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 f \vvrrqr!rvtt/
44 lrA I i ^ r
!\

. t t j
-^-:l l_!__-. ^ ^-,

--3- '-t ..- q=nren-


--l: r -

^- ^^ |

:-+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
afgunos de
escrito en c se reflejan
estos inconvenientes.

Unidad 1: Estructura e Control Oe DecsOn


Volumen 2: Estructuras de Conirol en C tO
@ 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.
o
o Guia del Estudiante
lntroduccio:l a la p
o
o I

a ?
o
o
o
o
o s"cJ e-
o rS
tj-t

o prrtlL-
-Fi --: / lrrl
t L_L
o
o Ft cdigo C finaliza aqu...
o
o Fi pt-ograma anterior es un programa muy sencllo. se supone
postivo y verfca s es cero o difrenie de que toma un nmero
o tero. Es extremadamente simpre y a prmera
vrsta parece correcto. Asuma que se compla el programa
y se ejecuta.
o Se ingresa 2s y el programa muestra como salda
O. lo sigurente:
tr_1numer:o C es ciist j l-.o de :e:c
!r
a intentar pero con er vaior. 2so, o e inciusive
ol ::1,::g: -25. En cada caso, er programa
o El numero 0 es Crsin:c oe cero
o Note que la salida es la misma tambin para el
valor de entrada o. El problema con el
o pi-ograma anterior se debe a que se desea
escribir la primera condicin sigue:
o if (x:: C) "o1o
o En vez de esto, se escribi.
o rf (x: 0)
o Esta sentencia asigna el valor de 0 a x. De manera que
o astgnacin de 0 a x resulta en un valor falso
en la sentencia if, la
o sin importar el valor de entrada que
indique el usuario' Dado que la condicin del
ir evala a falso, fa porcn del etse de
o la sentencia i f siempre se ejecuta:
o et se
o Irrrnrr
^-l -- ( Lll numer ?d es distinto de ce:o\n",x);
a /\\r

o cons ;'ere a continuacin otro eror comn que


ros programadores comenten
o frecuentemente. Asuma que se desea escribir
er siguiente cdigo:
o if (x > y)
o printf ("x es mayor gue y,,);
o En rez de esto, escriben el siguiente cdigo:

t if (x > y) ;
t Printf ("x es mayor gue y',) ;
li
p
lr
t Volumen 2: Estructuras eEntrot enT Unidad

@ Copyright tBM Corp. 2005


l: Estructura de Control d OecOn Iz

t- Los materiales def cuTo no pueden ser reproducidos


en parte
io o en su totalidad sin el previo permiso escrito
de tBM.
o
o
Lasentenciaprintfseejecutasinimportarsisecump|e|acondicinx>
Esto sucede porque si la condicn evala a vERDADERo,
el computador ejecuta una
sentencia nufa simbolizada por ef carcter ,;, que sigue
cualquier caso, la sentencia printf se ejecuta. Si la
a la condicin (x > y). En e
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
scanf("%d', &num) es otro enor comn que cometen ros progrnul nurn) en vez de

A continuacin se estudiar otra estructura condicional, la


estructura switch - case.
8. La Estructurl switch 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
sintaxis es la siguiente.
switch... case, y su
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
explican con un ejemplo esta construccin para entenderla.
A continuacin se
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. h>
2 mainO {

Unidad 1: Estructura de Control de Decisin Volumen 2: Estructuras de Controlen C 1g

@ Copyright tBM Corp. 2005


Los materiales dercurso no pueden ser reproducidos en
oarte
o en su totalidad sin el previo permiso escrito de lBM.
o
o Gua del Estudiante
o IntroCuccin a ia proqrarncin co r-

o _ a:_
atrr /r: -.

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


ol cie Ia semana . / / crue represent.a

ol -_f rr_l ( _n::esar un \-e.c: e:.:-+ : .. 7 cue:dentl:iq.re


^-l-!-/rr-

urr

ol E /* Verificar
-s canf ( " Ed ",

.inmero
&num dia ) ;

ol lndica aJ- usuario*.que el nmeroe,et entre 1 v 7 En caso contrario


es. j-nvlido
se 1e

oi 9 sv f b /nr1
\rru1L,
j
*_o/ - \ Ir
^

oi 10 -<o rr - <
lJ_ ar L ! ES

oi l1
r2
a 13
: S

o ,1 .. -,ir++ ttt. j
P:rrrur \
O _5 hro: l .

o 16
i- r lrr L !
a 11 hro: i. .

o 18 yarrjLr
: /tt_.-
\ :_ .

o l^-^-r..

o ;; aq4 F. nvi-+
Prtru!
ttt-'
\ :_

o 2I lre a k,.

o 22 a:a: 1. nri
14
nj- : I tt--
L
-
\

23

:I
]ra l, -

24 -icf :, I -. n-r r:
25
o c L LLaLLZd el swi-tch
O 21 )

a El cdigo C finafiza aqu...


o
o En el cdigo anterior cuando se ntroduce algn
permtido, se despliega un mensaje que entero fuera del rango de valoi-es
o unldades del curso se estudtarn mejores
muestra el uso de una vafidacinl En prximas
formas de validacin que permrtan que el
o usuario se recupere de algn ingreso errado
de data.
q
o 5:;-:r:::"1u: =:''tch" cas avuda ar prosrama a cambiara ra porcin de cdiso
Lrurlue :-j:: :- : -,-ar-c: (varor es igual
a 1, 2,3 y as sucesivamente). Esto es
q equivalente a io siguienre:

o ; f /^..*
*r \lluliL
:r
--c
^ :: _,

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


I

? e-lse if".r.a
(num_i.a :: 2)
,-

? P::intf ("41 2 es Martes\n"


o ) ,.

e-Lse :-f (rur, dla :: 3


i )

? .

aut a Volumen 2: Estructuras Oetonten


l\J
I
C Unidad 1: Estructura de Controf de Decis-

,t. @ Copyright tBM Corp.2005


p Los materiales del curso no pueden ser reproducidos
o en su totalidad sin el previo permiso escrto
en parte
D de lBM.
Introduccin a la programacin con C Gua del Estudiante

ef se -f (num-dia := 1)
printf ( "El 7 es Domi_ngo\n") ,.

Fin del Ejempto 1.9


La construccin switch case es una construccin sofisticada para situaciones
como se present en el ejempfo anterior donde mltiptes construcciones
La etiqueta case default se usa para imprimir un mensaje
if se usan.
cuando la entrada no es
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
verificar si la fecha ingresada es correcta El algoritmo y t progr"r" c p"r" verificar
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 y ar_: > O)
t1_12)
Paso 3: Si (mes es [g, 4, 6,IIl y ef dia
vlida.
Paso 4: Si no, si (mes 2 y dia o
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...


1 #lnc]ude <stdio. h>
) marn O {
3 int dia/ mes, anio,. /* anj^o equivale a ao */
4 rnt f echaVal-ida;
5 /* Aeeptar eI da, mes y ao de parte deJ. usuar:,o */
6 printf ( "Ingresar el_ Dia (DD) : ,,) ;
7 scanf ("Bd", e dia),.
8 Printf ("fngresar el_ Mes (MM) : ',);
9 scanf (',?d,,, &mes) ;
10 pri-ntf ("fngrresar el- Anio (yyyy) : ,,);
Unidad 1: Estructura de ControlOe OecsOn Volumen 2: Estructuras de Controlen C 20
@ 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.
.lo
Gua del Estudiante
o Introduccn a la progi-amacin con C

I i "
-q can i Ic);
( !
C ", 6:

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

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


o __= - -:
fechaValida:
o Veri-ficar si e]. mes tiene
a e-se
o rf ( (mes - ir r,r=-- -- j *=re::* , I nes
o 1i mes -:9
o =ur-:t-ll_lc
: r;

o
of
^t -^

iecra r,'a-L . c= : 2;
o
.I

I - 1^^'

a
o
a
?d es una echa ccr::ecaa\,r",
a d. a,
o i_:sCA/
o cas e 2: p:r::tf ("?d ?d ?d es ula recha incorreci_a\n",
dra, \
a
o brea k;
t soJc 3: printf("?d %d %d es una fecha incorrecta\n"
I
^ \
^j
anio);
O brea k,.

O ] /* Fin del switch */


o
o
o
a^ Volumen 2: Estructuras Oe CotroG-
IU Unidad 1: Estructura de Control O Decis-

O @ Copyright tBM Corp. 2005


Los materiales def curso no pueden sr reproducdos
o o en su totalidad sin el previo permiso escrito
en parte
de IBM
a
o
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 Gure dei Estudiante
lnt-n^l riA^
"rr'uJuuuJIt a
l^ --^ -
^ la Hrol-3-iaJrf- lf
o 8)
.^

o Cul es la forma correcta de acceder a un elemento


Cel arreglo defrnroc cc:nc
char xf_:l f5l;?
OA a) x
oi b) xlll
a c) x l-11 | .b, l
o d) x [0] t0l
O
9) Para un arreglo definido como flDat
o ,! f 3l i 3l , cul de los siguientes es un
o uso ncorrecto?
a) ptol 6i
o b) ptli t3l
o c) ptll t1l
o d) ptrl 21
a
a i0) Qu define un arregfo declarado corno .:,-- three
Lil t2l t3) ;?
O a) Un arreglo tridimensional.
o b) Un arreglo bidimensional.
o c) Un arregio unidimensional.
a d) Un arreglo de O dimensiones.
o
o
o/
o\
o
o
O
o
o
o
o
o
o
o
a
o
o
e
ri
a
_l
Votumen
Unidad2:Rne@
*l @ Copyright tBM Corp. 2005
Los materales del curso no pueden ser reproducidos
t? o parcialmente sin ef permiso previo escrito
total
de lBM.

o
tntroduccin a la prosiramacin con C Gufa del Estudiante

Respuestas a la unidad 2: Examen de Autoevaf uacin


1t
2)c
bn6l---
3)b
aL \'t3"'--'='l!---\
:!
s) ayb) \ *
6)d
7)b
8)d
e)b
l0) a

Unidad 2: Arreglos Multi-Dimen;,onales

@ Copyright tBM Corp. 2005


O
Los materiales dercurso no pueden ser reproducidos en parte
o en su totafdad sin el previo permiso escrito de lBM.
o
o Cua del Estudiante
lntroducciol a le ?rocrraot3^ :: - ,-
O
I A unidad 3: Laboratorio de Arregtos
o D
o Objetivos de Aprend izaje
a
o Al final de esta unidad, usted ser capaz
de:
I ' Emplear tipos de datos estructurados en ra sorucin de probremas.
a . Usar areglos unidimensionales y
t .
bidmensionales.
Aplicar arreglos a problemas con matrices.
a ' fv4anipular los elementos de un
arreglo tanto para arreglos unidimensionales
o como arreglos multimensionales.
o
O
o
t
o
o
o
o
o
d
o
o
o
o
o
o
o
o
o
o
O
I
o
o.
O;
o
o!
.l Volumen S: T
Unidadg:@
q
q , - @ Copyright IBM Corp. 2005
Los materiales delcurso no pueden
ser reproducidos total
q o parcialmente sin etpeniriso previo
eicrto de lBM.
a
o
I

I
Introduccin a la Programacin con C Gufa del Estudiante
I

Ejercicios de Laboratorio
I

l) Escrbir un programa en C que tome 10 enteros positivos como entrada, los c


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

forma que todos los nmeros impares aparecen en el tope seguido de todos los I

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 I

resolver el problema. I

2) Considere una matriz cuadrada de orden n x n. Escribir un programa que lea los
I

datos de dicha matriz (nmeros enteros) y encuentre la suma de todos los


elementos en el borde.

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:

11
121
1331
14641
a,

Unidad 3: Laboratorio de Arreolos Volumen 3: Tipos de Datos Esi--rcturados en C 46

@ Copyright IBM Corp. 2005


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
tntroduccn a la programac,r:
o -_
O
o A Unidad 4: Estructuras
o Objetivos de Aprend izaje
o
o Alfinal de esta unidad, usted ser
capaz de:
o . Explicar cmo declarar estructuras
en C.
o
o ' tas estructuras en ra sorucin de probremas
ff;*;j J;:." a travs de.
o o Describir er uso de ros tipos de
datos definidos por e usuario.
o ' 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
q
o
it
i
?
?
o
Volumen 3

I? ('ul
@ Copyright tBM Corp.200s
Los materia tes det*:l:"j:::d:l
Unidad 4:

ser irooucidos
Estructural 47

p o parcialmente sin et permiso previo ellrto toral


de lBM.

IfD
lntrodurcin a la Prograacin co! C Gufa del Estudiante

l. Introduccin
En las unidades anteriores, se discuti cmo declarar tipos de datos bsicos coro
inr,
char ! 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.

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
como sigue:
enteras. taf o
' 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:
intdia_nacimiento/ mes_nacimiento, anio_nacimiento,. .
rnt dia-ingreso-trabajo, mes_ ingreso_trabajo, anio_ingreso_trabajo,-
rnt dia_matrimonio/ mes_matrimonio, anio_matrimonio;
int 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 C 4g

@ 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.
o
o Gui::e, :s:uCiante
o
o Las operaciones que se hacen con las fechas son todas comunes,
no r:nDci-i3
especfrcada, como por ejemplo 'Encontrar el nmero de das
cD a fecha ocurri ms temprano'. Las estructui"as ayudan a alcanzar
transcuridcs :r:

esta ccnesron
o
o 2. Definicin y Uso de Estructuras
o Se puede definir una estructura en C como sigue:
o struct <nombre de la e-s:t uc-tua)i
o nLJ-IIIDrC_1 ,.

O m-iemb::c_l;
o
o mi emb::o_..
o |;
o struct es una paiabra reservada mandatoria El trmino (nombr=
Aqu, la palabra
o de fa estructura> es cualquier.nombre (usando las reglas para la creacin de un
identificador) que identifique la estructura. cada uno de los
o miembros, tal como
m-embro-l o mj-embro-2 es una declaracn individual para los miembros
o estructura' Los miembros pueden ser de cualquier tipo de dato, incluyendo
de la
arreglos y
o estructuras en s mismas. En el contexto de estructuras, los
trminos definicin y
o declaracin se pueden usar por igual. Se puede decir que se
est definiendo
estructura o declarando una estructura sin ninguna diferenca especfica una
o signficado.
en el
o A continuacin se presentan algunos ejemplos.
e
JH
o Ejemplo 4.1: Definir una Estructura
o ^^L- r

O
,

lrrL ul-4,

o fnt mes;
o lnt ai-r-lo,'
j;
o
o Esta es algo que ya se ha visto antes. sta define una estructura
llamad con iecha
o los miembros dia, mes, y anio, todos los cuales en esre caso, son
enteros. Sin
o embargo, no se puede poner int dia : 28 en una definicin de estructura.

o Nota: Lo anterior slo define una estructura. Ninguna variable est declarada
all. para
o declarar variables, se puede usar la siguiente declaracin.
o sLruct fecha nacimjento, :ngreso_trabajo, jubilacion;
o Cuando se dice fecha, se est refiriendo alcomienzo de la posicin
de memoria de la
o estructura definida anteriormente. cuando se hace referencia
a las
o nacimiento, ingreso-traba jo.' jubil-acion, se est refiriendovariables tal como
a una estructura
completa que contiene tres miembros.,l,r" desea hacer referencia
o individuales de la estructura en cada variable, se hace lo siguiente:
a ros miembros
o
o Volumen 3: TPos Oe Oatos estructurados en C
b (0 @ Copyright tBM Corp. ZOOS
Unidad 4: Estructwas 9

o Los materiaf es del grT::1!lr"den'ser iproo


o o parcialmente sin et permiso previo
ucidos tora I
de lBM.
o "itrito
o
Gufa del Estudiante
nacimi-ento. dia
j ubilacron. anio
Esto implica que el acceso se hace como sigue:
variab-Ie . ni embro
I
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
l

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 Gua del Estudiante
inti-oduccin a la Proqrara:ron c:n C
O
Ejemplo 4-2: La Fraccin Mixta como una Estructura
O
s'..-J -'. ':.,
o . ..:. r. _x:_:
:t: pat:r_e_err: e:a,.
o _.

_:.1 numerador,.
o i nt cienomi nado:;
o IA R.
o A y B son variables de un tipo de una estructura que es fraccion mixta.
o permite representar fracciones mixtas como por ejemplo 1T
Esto
o en la estru"tri" 0""0"
parte-entera: 1, numerador: 3 v clenorninacjor: . Tambin se puede definir
o esto como sigue:
o _struc I

o int pat:re_eltera,.
O I ta nUirLe]:aCiOr;
o : :.; denorninacio..
o
o Note que se ha omitido <nombre estructura>, l cuaf es opconal.
Las variables
o creadas A y B, tienen las mismas propiedades que la definicin anteror.
o Fin del Ejempto 4.2
o Ejemplo 4.3: Nombres de personas
o
o Se sabe que generalmente los nombres de las personas se registran como prmer
nombre, segundo nombre y apelldo. Se puede definir una estructura
o con el primer nornbre, segundo nombre y apellido como miembros.
llamada nonLbre,
o
o struct nombre I

char pr:'mer [2A) ;


o char segundo [20] ;
o char apellido [_a 5 ] ;
o I mi-Nombre;
o
o
Note que los miembros son arreglos, y
cada uno de ellos puede ser de cualquier tipo y
tamao. Se puede acceder al apelfido de Ia
varable miNombre como
o i:::Nombre.apellido. ste es, sin embargo, un arreglo de caracteres. se debe
o acceder a fas partes individuales se usa miNombre.ape]tidoIk],
donde k es un
o enierode0a44.
q trn esta estructura se tiene un espacio de 20 caracteres para
el primer y el segundo
q ncmbre y otro espacio de 45 caracteres para el apellido. Se puede
cmbiar estos
d 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
.l mtembros de diferentes tipos, ellos tambin pueden ser
tener
algo similares como se mostr
er: ei ejemplo anterior.
q Fin del Ejempto 4.3
q, Volumen3: TiposOeOffi
r\ I
) Unidad 4: Estructuras 51
-t
@ Copyright tBM Corp.2005

IJ Los materiales dercurso no pueden ser reproducidos total


o parcialmente sin elpermiso previo escrito de lBM.

I
Introduccin a la prgramacin con c Gufa del Estudiante
Ejemplo 4.4: ,-,
struct dir:eccion correo{
"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;
]
) yt ^.
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
defprimer nombre de p, se le debe referir como sque:
p. mrNombre. primer.[ O]

s se requiere imprimir la direccin de correo en la variabre p, S pude


usar el sguiente
segmento de programa:
El cdigo C comienza aqu...
-1 //* upllxrrr
Tn^-i-;- a- la salida estndar la direcci_n de correo de 1a
estructura */
L
) //, up!!ur_r
Tnn*i*i- eI primer nom.bre */
r prantf("%s",p.miNombre.primer);
1 /* Se imprime un espacio despus de1 primer nombre */ a
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 ),.
/ r^.-er!
Tmn-i;- l-
J-a. prinera
n-i--
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 3-': o'ei :sudiante
o IntroCucci:n le Proora-r2^r.F
J * 'sv'J" .^-
uw ^
rmprirnir eI cdrg'o pcstal de la
o ^ - ciudad a la sal:-da est.ar -

o '-!. ,/, Imprimir eI nomlre


ciel pais a la sa]-ida estndar
o 25 orntf (,,?s\n,,,p.pai5),.
o Ef cdigo C finaliza aqu...
o
Esto ilustra como trabaiar con estructuras
o imprimi cada membro e fa estructura
en una situacin de programacin. se
o especificador de formato ? s.
i. recci on -correo como cadena usando el
o Fin del Ejempfo 4.4
o
O Ejemplo 4.S: Registro de Estudiante
o struct estudiante {
o s:tartc: non::a nmbe_es1-ud-iane,.
o char nun_id i 9l ;
O struc: recna :,ac_mienio,.
f-loat pesc;
O
fl_oat altu:a;
o int iq;
o J frlosofia [100] ;
O
En esta estructura, se ha declarado una
o varable firosofia que es un arregro
elementos, cada uno de los cuales es de 100
un registro de estudiante definido anteriormente,
o con m'embros' se puede referir al ao
oe acmento v ar iq del primer estudante
o esta cfase como sgue: en
o fi_Iosofia I O] . naclmi entc. an.1 o
o fi-losoflal0l.rq
o una estructura puede contener cualquer nmero
de miembros, los cuafes son
o estructuras en s mismas. Es tambin posble
tenei varios niveles de estructuras
una estructura. por ejempfo, to siguiente
O :::::Xrrfl::,[?j" es una dectaracin vrida
o st_:-uct externo {
o struct :rivell {
o st-uct nlvel2 {
o struct nivel3{
o n'i- V -

o l-1 3; ll stn de declaraci-n


*/ de Ia estructura
o 3

a
]I2; /* Ein de dec]-aracin de La estrucrura 2 */
o
o Jf 1,. /* En de dec]-aracin de 1a estructura
L */
]ext; /* En de declaacin de -r-a estrrctura
exterz,a */
?
? I Volumen a: Tip

@CopyrightIBMCorp.2005
Unidad : EstruczuEl Sg

? ,^ _, . ..
t
b
Los matenales delcurso no pueden
ser reproducdos total
o parciafmente sin elpermiso previo escrito
de lBM.

o
I

I
lntroduccin a la prodramacin con C Gua del Estudante
I

En una declaracin tan profunda como la anterior, se deben tener


cuidado cuando se I
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
declarar variables de las estructuras ms interna fuera de la definicin
se puedan
prirrcipal.
de la estructura

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 a a
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
@
o
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
lntroduccion a la programacin con C
o
Ejemplo 4.2: Sumar Dos Fracciones Mixtas
o
o Asuma' que se requiere tornar dos fracciones mixtas como
entrada, sumarlas y mostrar
o el resultado' sean las dos fracciones mixtas e : r% y
3 1% respectivamente. para
o sumarlas, se debe primero convertir ros nmeros
a la forma numer:ador/cienominado.
o 74: (4 * 1 + 3) / 4 : 1/4
a Esto es lo mismo que
o (cie;rominacior * par:e_entera
o + numeradc-) / denom:-nador
o con esto, se tienen ambos A y B como 1 / 4. EI denominador
es
comn, as que ef MCM
es4'Porrotanto' A + B= (7 + 1) / 4:74/1.Eri4/4debeconvertrrseauna
o fraccin mixta como 3 (el cual es pa.rte-entera
o como un cociente entero) y 2 (ef cual
como mduto de divisin). Et MCM permanece como
a ::-::,::i::.0o,
vervlllraug'!. el

o Ef siguiente es er argoritmo para sumar dos fracciones


a mrxtas:

or Paso l:
Declarar las fracciones mxtas A y B.
a Paso 2: lngresar ras dos fracciones mixtas positivas y varidarras.
o Paso 3: Covertir e a la forma de fraccin impropia x.
o Paso 4: Convertir e a la forma de fraccin impropia v.
o Paso 5: Encontrar el MCM de x y v -
o Paso 6: Formar Z: ( (l,t)CM ,/ X. denominadcr* X. nume-adc:
) +
o (MC!4/Y. cienoni nador* ) y. rumerador
) / MCM
o Paso 7: Convertir z en la fraccin mlxta c.
o Paso 8: lmprimir A, 3, y c.
a El programa en C, basado en el algoritmo anterior,
se desarrolla usando el refinamiento
o paso a paso.
o El cdigo C comienza aqu...
o
o #include <stdio. h>
) marn O
o J
{

/* Declaracin de Ias estructuras * /


o 1 srl-uct f raccion_mixta {
a : rnt parte_entera,.
o A
int numerador;
o 1
int denominador,.
o u )7\
)rt Dl

o o struct fraccj_on_impropia {
o 'tn
int numerador,.
o 1t int denominador;
a Volumen S: f
:l
?\t
Unidad 4: Eshucturas 55
I

? . @ Copyright tBM Corp. 2005


tos materiares dercurso no pueden ser reproducidos
I total
o parcialmente sin el permiso previo escrito de tBM.
o
o
Introduccin a la Progiamacin con C Gufa del Estudiante

72 ix, Y, Z; I

13 i-nt u, vt mcm/ mcd;


14 /* Obtener 1os clatos del usuario para 1a primera fraccin mixta A */ C
15 /* Obtener entrada del usuario para J-a parte entera de fracci */
16 printf ("rnoresar 1a primera parte entera de l_a fracc:-on \
I1 (posi-trvo) \n,');
18 do{
19 scanf ("8d", &A.parte_entera) ,.

20 )while (A.oarte_entera <: O);


2I /* Obtener de1 usuario el- nr:_oerador de 1a fraccin */
22 prin-,f ("Inqresar e1 primer numerador\n") ;
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 */
21 prlnt f ( " lngrr:esa: ef pr-imer denominador\n,,) ;
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 */ 3
. 33 printf("fngresar ra seounda parte entera\n");
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 C 56

@ Copyright IBM Corp. 2005


O
Los materiales del curso ng pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o Guia oel Estudiante lntrodu:cin a la proqramacin cc: C
o !=i i .line:a.]ai
o ,1
- .:,.:.::--:_e:l:a:a - A. J::t!n r --r1,-r _ .:.-:rurne:at--:,.
:, i, . enOnrl:j-: - .-.. :_.. :tt::._:r:):.t:
o :, i
;

o c,) o!-4J!- caJ t

o )l nrrmo-:^i-- - r Y'=
grlL=-Gt

o
- =

Y nnmi-=^--

o 5q )
I

o 56 /* Conwertir 1a segrr:nda fraccin nixta (B) a u.na fraccin improria


o para formar y */
o 51 -i(3.nj:r,.:ajc: i

o 58 \_ r, ;n,:-=--
- :::a - 3. deomi nadot + 3. numei:acior:;
o 59 Y. cienoii:,ado --;^-.
6A I
o 6! -) ^^ (

o 62 vr.rislLc-c!J_
..- - --;^.-
o 63 Y. denonr nacior
o 64 )

O 65 /* Determi-nar e1 MGI cie X e y */


o 66 /* Mo"l(u,v) = (u * v) / MCD(u.v) -/
o 61 /* se quiere determrnar el MClc de X.denominador
Y Y-denoe.inador */
o 68 ,/* Buscar e1 MCD de los dos */
o 69 /* Calcu]-ar el MCD de 1os denomi_nadores d.e X e y
o 10 u : X.denominado:,.
o 17 v : y. cienom.j nado:,.
12 wh|le(u l: O && r, l: C)j
o 13 if (u >: v)
O
14 u: u ? v,.
o 15 efse
o 16 v: v ? u,.
o 11 i,f (u :: 0)
o 78 mcd : v,.
o 19 e-1s e
o tc mcd : ui
o J

o a2 ,/" Calcular e1 MCld de Ios denominadores de X e Y */


o t3 mcm : (X.denominador * y.denominador) / mcd;

o :,:,/* Calcu1a Z = X + y * /
,a Z.numerador : (mcm,/ X.denominador)* X.numerador + \
o
t (mcm /y. denominador) * y. numerador,.
o
tI t; Z. denominador : mcm;

Volumen3: TiposOeDffi
10 Unidad 4: Estructuras 57

b
I
@ Copyright tBM Corp. 2005
Los materiales delcurso no pueden ser reproducidos total
p o parcialmente sn elpermiso previo escrito de lBM.
I
o
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,.
92 //* uulr&tr
Tnnrii, 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 *,/
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


consdere el ejemplo de calcular el Promedio de Notas de los
de problemas,
Estudiantes de una
e
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 q

r- n
D 4
E 2

Asuma que un estudiante obtiene las siguientes calificacones


en los seis cursos:
Curso 1 A
Curso 2 D
Curso 3 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 Gua del Estudiante
o lntroduccin a la I d toutut I uut l

o Curso 4 A
.r Curso 5 A
o Uurso ti E

o El Promedio de Notas del Estudiante se carcura como


sigue.
o (10 "3 + 4* 3+ I "3 + 10 * 3 + 1C " 3 + 2. 3) /(6 " 3)
o (30 + 12 + 24 + 30 + 30 + 6) / .18
o 132/18=7.33
o
Todo lo que se debe hacer es sumar la puntuacin de cada curso, multiplicarlo pcr 3
o (unidades del curso) y dividirlo por el nmero tctal de unidaoes.
o
o El siguiente es ef argoritmc para sorucicnar este probrema:
o Paso l: Declarar una estructure para el registro del estudiante.
o Paso 2: Declarar un arreglo de 1oc estudiantes para los registros.
a Paso 3: Ingresar y varidar ros datos dados por er usuario.
o Paso 4: Para todos los estudiantes.
o calcular el promedlo de Notas.
o imprimir el NoID, I{rmb:e, Gados y e1 p::omei,o cie Notas.
o A continuacin se escribe el program a para realizar esta tarea, aplicando refinamiendo
o paso a paso y usando cada uno de los pasos del algoritmo.

to EI cdigo C comienza aqui...


i*;iclude <stdlo.h>
o 2 *-nc-ude <ctype. h>
o 3 n,1n O {
o 4 /+ Declaraci-n de 1as estructuras */
o 5 ,/* Decrarar rrn arreglo de l"o0 estudiantes para Ios reg.i_stros
o 6 scruct reg_rstro_estucii ar:e {
o I char noid [ 9] ;
o 8 char nonrre[5C];
o 9 char grados [ 6] ;
o 10 float pn,.
11 ] llsta [ 100] ;
o
o I2 Decl-aracin de VarihJ.ss *7
o 13 int- n_est, k, ), num;
o '1 A
double pn;
o 15 obtener como entrada de1 usuaro e1 nmero de estucliantes * /
o L6 printf("fngresar el- numero de estudiantes < 100\n,,);
Oi
ol 0 Volumen 3: TiposOeffi Unidad 4: Estructuras 59

ol @ Copyright IBM Corp. 2005


Los materiales delcurso no pueden ser reproducidos total
ol o parcialmente sin el permiso previo escrito de lBM.
ol
al
scanf ( "td", &n_
lwhr.Le(n_est < 1 l/ n pqi \ 100);
Obtener las entradas acerca de todos ]-os estudiantes
I
cr(k : 0,. k < n esr,. k++) {
r \tttr^--^^^-
--i
-v-rrrsr frgtg>dl .l-^^
para el estudiante zd: \n". \
r + it.

/* 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\.

-
^h!^-^-. com entrada del usuario cada uno de 1os 6 cursos */
: o; ) < 6; j++){
:f lush (stdin ) ,-

p:rntf ("i:rEresar .la nota de1 el- Cul:so l-a-tr1 \


_.. \.r
=:\nil , irl
J,tt,
\.

^-,
gv 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
: tr^_:lt^:_ia
estudiante ?d\n',, k+1 );
_- 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
@ Q.
Los materales dercurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso escrito de lBM.
o
o :e Esi:Ciante
o Introduccin a ia

o
o ^t --..

o
o )
- Calcular e1 promedio de NoLas
de1 estudante */
o pri = (double) num / Ig.O;
o - Imprimir los detalJ-es de1 estudiante */
o - fraprimir eI noid del esLud,iante -
/
o prantf ("E-I ncid def estudiante es: gs\t,,, listaIk].ncrd)
o - Imprimir el- nombre del estudiante *,/
;

o prrntf ("Ef nombr:e ciel estudiante es: \


o ?s\t',, r i.au ik] .nor,be);
o - Im-orimir el pN de] estudi-ante -/
o L_r.:Lr-- t/ lr-:Jl __1\ o=_L s:Jc:r,:+ es: lE\:_tr,, Fn);
o i
o
O El cdigo C finatiza aqu...
o La estructura de registro cel estudiante es bastante
o stempre que fueron necesarias. como se pudo
clara. se hicieron las validaciones
notar:
o
' se acept soro ras retras A hasta
o'a ra E para ras carificaciones.

o ' 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
o la E, multiplicados por3 unidades (ejempro: 30=
cafificaciones de la A a
io * 3,24=g"3etc.,.
o ' Dado que, num es de tipo entero, antes de calcular
el gpa, se convierte al tpo
o f -loat.
o Este ejemplo ilustra el uso de estructuras su declpracin
y sus usos en un programa.
o
Fin del Ejempfo 4.g
o
o
o
o
o
o
o
o
o
o
t Volumen3:Tipo@
?t
A),

t . @ Copyright tBM Corp. 2005


Unidad 4: Estructuras 6i

I
I

I
Los materiares der curso no pueden ser reproducidos
total
o parcialmente sin el permiso previo escrito de lBM.
o
p
i
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
los usuarios definir nuevos tipos de datos que son equivalentes a typedef permite
existentes. un nuevo tipo de dato puede ser definido como
a los tipos de datos
sigue:
t,pedef tipo_ex. stente nuevo_tipo;
Aqu,tipo-existente se refiere a cualquier tip'o de dato estndar como int,
fl-oat u 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 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


anio que es equivalente
a r-nt. Con esto, se pueden declarar variables como sigue:
anio A, a, :-*.],:.:-::.:::::c,.
Se puede usar el t\ipeie anterior y declarar las siguientes variables tambin:
-l-

En este caso se declara x y: como arreglos del tipo anio, gu son realmente un
arreglo de enteros.
C;
. se pueden tambin decrarar equivaientemente rc siguiente.
typedef inr anio.:, _;
anio X, y,.
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@ (0.


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.
o
o 3 - ;a cel Estudiante
o Introduccicn a ia Prcci-anracr: ::^ C

o
I
o Las variables se pueden declarar como sigue:
o regi st-o_cie_estudiante alumni, est_pt:i m:_a:t :
,,,.. l_ ;
o Es recomendable hacer uso de la sentenci
rypedef por las siguentes razones:
o
o ' Permite definiciones y declaraciones concisas de varrales basados en
estructuras.
o ' No se necesita escribir struct nombre-estruc-r::ra reoetir1as vpces cuando
o se referencia a una estructura
o ' Asignar un nomcre a una estructura, que sugiera su propsito, hace ras
o declaraciones ms legibles.
o se llego al final de la drscusin acerca de las estructuras. Es imporlante
notar aqu que
O una variable de estructura puede ser pasada y retornada a
una funcin tal como
cualquier otro tipo de dato estndar.
o
o 4. Uniones
o
o Las uniones son similares a las estructuras. Af igual que
las estructuras, stas contienen
miembros cuyos tipos de dato pueden ser diferenies.
o En una unin, los mrembros
comparten el mismo espacio en memoria. La razn principal
para el uso de una unin
o es ahorrar espacio en memoria. Esto es especialmente it si,
en una apticacion, slo
o uno de los miembros se usa bajo una condicin. Los valores
asignados a todos los miembros al mismo tiempo.
no tienen que ser
o rrni - ^^-^
urrr v_: e- :^
o -tulLJj j=- - a_

erJ:)ro_
o irLr

o J;
o La manera de crear variables y usarlas es de la misma forma que
o Considere por ejemplo, la siguiente definicin de unin:
en strucr.
o uni on {
o j.nt x,'
o float y,.
o char z;
o l- h ^.
o se definen tres variables a, b, y c, fas cuales son uniones.
o tres variables x, y y z (cada una de un tipo difererente).
En la unin, se han definido
Cuando
o a' debe entender que es una estructura con miembros x, y yse considera la variable
embargo, los miembros x, y y z de la variable
z. En una unin, sin
o a comparten el mismo espacio de
o oru. un irf ocupa ms memoria que u char, un floar !
i_ .u
oa
3:::r:.^taT^:;^1"1:
ocupa ms memora que ur int. Existen muchas tareas
Volumen 3:
o"
'rnl"n;i,
que deben
Unidad 4: Estructuras Og

? .tos materiales @delCopyright tBM Corp. 2005


curso no pueden

I
ser reproducidos total
o parcialmente sin elpermiso previo escrito de lBM.
?
lntroduccin a la Gufa del Estudiante

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, arreglos o
e
fl
estructuras. Se pueden tambin usar uniones con arreglos. Al usar el 'operadorlunto, ,l
.t
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:

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 C 6

@ 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 3.:ra ::l Estuclante
lntroduccin a la Proorarna:i:-
o
o Resu rnen
q
o Ahora que ha compretado esta unidad, usted
debe ser capaz de:
o . Explicar cmo declarar estructuras en C.
o ' Discutir el uso de las estructuras en la solucin
de problemas a travs de
o programas en C.
o ' Describir er uso de tener tipos de daios definidos
por el usuario.
o ' Definir unones y explicar cmo su uso difiere
del de las estructuras.
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
ol

Volumen 3: Tipos e Oatos gstructurados en C


o @ Copyright tBM Corp.
Unidad 4: Estructuras- 65

Los materia tes del t::l?!yuo"n' r"i2005


irod ucidos tora
"u elpermiso I
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 r.

float y;
l
) st
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) Falso.
3) pueden ser parte de una estructura.
a) Constantes de cadena.
b) Variables enteras.
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 Gu, :e_!studiante
Introduccin e
o l Programacin con C

o -{) considere que se accede a una variabre estructurada


o esie caso, cules de los sigurenies identificadores como ..b. c.c lor. En
estructuras?
se reieren a varrables cje
o
o a) a/ b, cyd
o b) a. byc
o c) a yb
o d) Slo a
o 6) Considere la siguiente definicin de una estructura.
o s:ruct {

a I nr

o float y,.
i h.
o
o Es vlida la asignacin a. x = u.\,, ?
o a) Verdadero.
o b) Falso.

o 7) La siguiente es una definin vrida de un


tipo estructura
o tyoedef struct {

i ni- w.
o float y,.
o mr Prop.i a
o a)
.|

Verdadero.
,.

o b) Falso.
o
8) Los tipos de dato definidos por el usuario se
o de C.
definen usando la palabra reservaoa
o d)
^\ struct
o b) -rn i n
o c) typedef
o d) Ninguna de las anteriores.
a
o 9 cures de ros siguientes es un uso correcto de typedef?
o
o D) :'.'pecie: :.ca: n:\-ar;
O c) :','pede: f loat char miVar,.
o ul
.{\ -,,^^r^
__r'j-rae I crtqL
^}a-v nombre taOl ;
o
O
o
o Volumen S: frpos ae Oatos EstructuEd[$T
o UnioaoZlEsiffiEs- oz
o-J . . ^L-^,^
L* _
@ Copyright IBM Corp. 2005
o T:::l?:s-detcubdno
o parcnlmente sin
pueden ser reproducidos tota|
elperriso previo escrito ;l-M."-'
o
o
Introduccn a la pro'gramacin con C Gua del Estudiante

l0) 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 C 6g

@ Copyright tBM Corp. 2005


e
Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo perrnso escrito de lBM.
o
o Gua del Estudante lntroduccin a la Programacin co C
o
o Respuestas a la unidad 4: Examen de Autoevatuacin
o
o 1) b y c
o 2)b
3)b
o 4)c
o s)b
O
6)a
a 7)a
o 8)c
o e) byd
o r0) d
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 Volumen 3: Tipos de Datos Estructurados en C Unidad 4: Estructuras 69

o'- Los. materiales


Copyright tBM Corp. 2005
@
delcurso no pueden ser reproducidos total
o o parcialmente sin el permiso previo escrito de tBM.
O
o
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 Gua oei Estudiante Introduccin a la Prooran-iacin :cn C
o
o UnidaC 5: Laboratorio de Estructuras
0'
a Objetivos de Aprend izaje
o
o Al final de esta unidad, usted ser capaz cje.
o . Usar estructuras en una situcin de solucin de problemas.
O . Desarrollar algoritmos para un problma que involucra el uso de estructuras.
o . Escribir un programa en C para impfementar una algoritmo que usa estructuras.
O
o
o
o
o
O
a
o
o
o
a

O
o
O
o
o
o
o
o
o
o
o
a
o
o
o
o
or
,OJ Volumen 3: Tipos de Datos Estruclurados en C Unidad 5: Laboratorio de Estructuras 71

@ Copyright IBM Corp. 2005


o Los materiales del curso no pueden ser reproducidos total
o o parcialmente sin elpermiso previo escrito de lBM.
o
Introduccn a la programacin con
C
Gua delEstudiante

Ejercicios de Laboratorio
1) considere ra estructura de una fraccin mixta, que
se da a continuacin. 0
struct fraccion_mezciada i
int parte_ent era ,.

int numerador;
int denominador:
It

fracciones mixtas e y B que son ras entradas suministradas por


li,ilr,j."r er

Escriba un programa que caicule:


g
La resta deAmenos (A B asignndola -
a la fraccin mixta c-
. La multiplicacin de a por (A B) asignndola
e *
respectivamente, y mustrelas.
a la fraccin mixta n.
. 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.
0,)
5) 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
:

I
f

Unidad 5: Laboratorio de Estructuras


Vofumen 3: Tipos de Datos estructuraOos en
C Z
e
Losmateriar"rd"?"c,o,3JXtJii,t"T":"9;"??3or",o"senparre
Fr! , o en su totalidad sin el previo permiso
escrto Oe tnli
=t_\N Ysv.lu5
O
o
o
a
o Introduccin a la
o E-ry-
o ----
----
---n-
a:I
Programacin con C
------
- (Cdigo del Curso: Cy320)
O - rt_@ Versin 2.0
o --nr-

o Gua det Estudiante


o
o
o
o
a
o
o
o
o
o
o
o
o Vofumen 3: Tipos de
o
o' Datos Estructurados en C
o
o
I
a
o
o
a
o
a
o
o
I
IBM Learning Services
Worfdwide Certified Material
Informacin de Publicacin
Esta pubficacin ha sido producida usando Microsoft Word 2OOO y Microsoft powerpoint
2000 para Windows.

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"
expresa o implcita. El uso de esta informacin o la implementacin Ol cualquierai" .""
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, ZOO2. Todos los


derechos reservados. .

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 Contenido
o Unidad l: programar con
Arregfos
o Objetivos de Aprendizaje
o l. lntroduccin I

o 2
2. Declarar un Aneglo en C
o J
o 3. Inicializar un Aneglo
4
o 4. Desanoffar y programarAfgoritmos
con Aneglos q
o 5. Cadenas de Caracteres en
C
24
o Resumen
o 27
Unidad 1: Examen de Autoevafuacin
o Respuestas a fa Unidad l: Examen
de Autoevafuacin
28
o Unidad 2: Arreglos Mufti-Dimensionales
30
o Objetivos de Aprendizaje
31
o 31
1. Introduccin
o 32
2. Resolver problemas con Arreglos
o Bidimensionales
33
o Resumen
45
o Unidad 2: Exmen de Autoevaluacin
46
o Respuestas a fa Unidad 2: Examen
de Autoevaluacin
o Unidad 3: Lab. programar con
Arregfos
48

O Objetivos de Aprendizaje
49
o Ejercicios de Laboratorios
49
o 50
Unidad 4: Estructuras
o 5l
o Objetivos de Aprendizaje
51
o 1. Introduccin
52
o 2. Defrnir y Usar Estructuras
53
o 3. Tipos de Datos Defindos por
ef Usuario
o 4. Uniones
67

o Unidad 4: Examen de Autoevatuacin


68
o Respuestas a la Unidad 4: Examen
71
o de Autoevaluacn
Unidad S: Laboratorio de Estructuras
74
o 75
Objetivos de Aprend2aje
o 75
o Ejercicios de Laboratorios
76
o
o
o
o
o
o
o
o
o Gua del Estudiante
fntroduccin a la ramacin con C
o
o Unidad 1: Programar con Arreglos
o
o Objetivos de Aprend izdle
o Alfinalde esta unidad, usted ser capaz
o de:

o ' Expficar ef concepto de anegros en ra sorucin


de probremas
o Definir qu es un anegto

o ' Describir cmo acceder a un eremento de


un anegro
o . Explicar cmo usar los aneglos en algoritmos

o ' Desanoilar argoritmos para probfemas que requieren


er uso de aneglos
o . 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
o
o
o
o
o
O
o
o Volumen3:Tipos@
o Unidad t: erogramar co@; r

o uos materiales del curso no pueden ser reproducldos


o o parciafmente sin elpermiso previo es'crito
toat
de fBM.
o
o
l. Introduccin
En las unidades anteriores se estudiaron los.tipos
de datos simples, tas estructuras de
las construcciones iterativs. Esta unidao or'crt"
3H:l#:ffJ':iul lorlp"f" 0"t"",

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,'
100 estudiantes?' una forma de hacerlo ei.tenermo se almacenan las calificaciones de
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
tienen una caracterstica comn. un aneglo lrniori datos que
aungue puede tener mltiples elementos de atos.
r ir"runca con-un ,Ln nombre,
Los efementos de "iol'nouiduales
pueden ser de cualquier tipo, tal como
enteros, flotantes o caracteres. pero dentro
arreglo, todos fos elementos de datos deben del
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
cuales los arregfos se pueden hacer jon:
de datos. Las dos formas en las

o Una sola dimensin


La Figura i.1 ilustra un aneglo unidimensional.
.12
.24
ol
.65
of
Figura l.l: Arregto de Unidimensional

Unidad l: Programar *
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 Gua del Estudiante Introduccin a la Programacin con C
o . Dos dimensiones
o
La Figura 1.2 muestra un arreglo bidimensional.
o
o
o 12 -5 u
o u 5 65
o q
o 7 88

o 8 32 66
O
o Figura 1.2: Arreglo Bidimensional
o
Conocemos acerca de vectores. Un vector no es ms que un arreglo unidimensional.
o Por otro lado, un aneglo bidimensional se denomina matnz en matemticas. La
o dimensin tambien se denomina el orden de un areglo.
o En el aregfo unidimensional que se muestra en ta Figura 1.1, el orden es 5. En el
o gneglo bidimensional que se muestra en la Figura 1.2, el orden es 4 x 3, es decir, 4
o filas y 3 columnas.
o
o 2. Declarar un Arreglo en C
o En esta unidad, se va a aprender solamente acerca de los aneglos unidimensionales.
o Se puede declarar un aneglo unidimensional de la siguiente form:
o int- [ql

O Esto resulta en la reserva de ubicaciones memoria, como se muestra en la Fiqura 1.3.


o
o 12

o 24
o 2
o
65
o
o 7 <_ f r1
d^ Ll J

o Figura 1.3: Ubicaciones en Memoria de un Arreglo


o a a [0] se refiere al primer elemento del areglo
o a 0 . . 4 se refieren a los subndices de un arreglo. Los subndices en el
o lenguaje C empiezan en o y terminan en n-t, donde n es el tamao del arreglo.
o En a [0] , a s el nombre delaneglo y 0 es elsubndice.
o a[0] cualquiera[k] donde 0 <= J a= 4 reportaunvalorentero.
o
o Volumen 3: Tipos de Datos Estructurados en C Unidad l: Programar con Aneglos 3
o
@ Copyright IBM Corp. 2002
o Los materiales del curso no pueden ser reproducldos total
b o parcialmente sin el permiso previo escrito de lBM.
o
o
Introduccjn a ta programacin
con C
Gua delEstudiante
. Ef ltimo efemento delarreglo
a es referido como a[a] -
Los aneglos se declaran como
tas variabfes de tipo
de tamao un
int, f loat o char, excepto que
:':fr:Xilg?iXffg:: lor "'p""i-Joor
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
(el valoi n,:t"ri*1. Er , ;;Jeoen.ros anegros, en vez de estos
fl:?,r1,mgicos' oennlr-nt,ibres simbricos
#define NSTUD 1OO
#define es una--directiva del prepocesador. una directiva
anteS d" qr" - del preprocesador
*ril"dor inicie er procesamientofe def
da
$m1:o|,"i|,":touaoor
En el Vofumen 6' Unidad 3 caractersticas
preprocesador y er compitador - Adicionaleld." c, se aprender
acerca del
de c. po' ar,oi, ."r"rn"u.b ;;#irri"rpre
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 ;
se declara un a'egro de tipo entero
lamado notas con 100 erementos.

3. Inicializar un Arregto
iniciarizar un anegfo a travs a"
f;;j#:s: "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,
ffif$|:)un
anesfo en el ;;;;ni"
de decrararro (normarmente praseanesros
puede

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
o Gua del Estudiante

a 4. Desarrollar y Programar Algoritmos con Arreglos


o
o Ahora que se conocen los fundamentos bsicos sobre los cuales la solucin de
o problemas con aneglos puede ser construida y desanollada. En esta seccin se
examinarn un conjunto de ejemplos de desarrollo y programacin de algoritmos
O usando aneglos.
a
Ejempfo 1.1: Almacenar un Arreglo con4,2,3...
O
o Escribir un segmento de programa para colocar en un arreglo 1,2,3...
o
En otras palabras, para un arreglo num que est declarado en el programa, se debe
o hacer que el primer elemento sea 1, el segundo elemento 2, y as suceivamente. Esto
o debe resultar en un arreglo que puede vsualizarse como es mostrado en la Fiqura 1.4.
o 1
o
o 3

o 4
5
o
o
o Figure 1.4: El Arreglo num
O
El sigiente segmento de programa fcilmente hacer esto.
o
o El cdigo C comienza aqu...
o /" nI archivo de encabezado con 1as funciones estnd.ar gue
o soportan */
o /*Ias operaciones de entrada y salida (stdio.h) se incluven */
#include <stdio. h>
a /* La funcin main se inicj-a aqui */
o maino {
o ,/* Decl-aracin de variab]-es */
o int k, num[100];
a /* nI bucle asigna 1 al primer elemento y asf sucesivamenLe */
o for (k=0; k <100; k++)
o numlkl = k + l-,'
o )

o /* La funcin main termina aquf */


a El cdigo C finaliza aqu...
O
o
o
O Volumen 3: Tipos de Datos Estructurados en C Unidad 1: Programar con Arreglos s
o @ Copyright IBM Corp.2002
O Los materiales del cufso no pueden ser reproducldos totat
o o parcialmente sin elpermiso prevlo escrito de tBM.
o
o
cuandok es 0, se reasigna 1 a num[0] .cuandok
es r-, se feasign? 2 num [r], y
Tarbin, se pudo iniciarizar usando num y
;::,:ffi:ivamente. usando ra siguiente

stat.ic int num trOO j = {_.};

:r?ff ?"'r?,:"f ;in,l:?,J'l!"i"!L:fl?,":[embarso, este no es un mtodo muy

Fin del Ejempto i.l


Ejemplo l-2: Leer ra Entrada der usuario Dentro der Arregro
feer ta entrada de un usuario en un
ff,Hlffinfl::"" arregro. Ef siguiente programa

El cdigo C inicia aqu...

de encabezado con 1as funciones esrndar


i#:.:fiiivo 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
num [0] num [1] , y as sucesivamente. teclado para
' Despus que el bucle termina, se tiene
aneglo con los vafores de entrada almacenados un
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
ffifl: ,ffi:iii*:'erabres se

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 Gua del Estudiante
o in con C
o Ejemplo 1.3: lmprimir un Arreglo
o Elsiguiente segmento de programa
o imprime ef contendo de un
a'egro.
o Ef cdigo C comienza aqu...

o ,/*Se incluye el archivo de encabezado


con las *,/
o ,/* funciones estandar que soportan
1as operacj_ones de *,/
o ,/* entrada y salida (stdi.h) */
o #include <stdio.h>
/* La funcin main inicia aqu *7
o main O {
o /* Declaracin de VariabLes */
o inr k, num[1OOJ;
o /* EI bucle inlcializa el contenido
o del arreglo */
for (k=O- k <100;.k++)
O numlkl = k + 1;
o /* EI bucle imprime el contenido del
arreglo */
o for (k=0; k <100; k++)
o printf ( rnum [?dJ = ?d\nu , k, num
tk] ) ;
o ) /* ru funcin main termina agu */
Ef cdigo C termina aqu
o
o El programa anterior imprme
fo siguiente:
O num[0J = 1
o num[1j = 2
O num[2j = 3
o
o
o
o num[99] = 100
o Nota: se us una construccin terat
iva paraimprimir el arregro.
o Fin det Ejempto f .3
o
o A continuacin se exprican argunas
operaciones simpfes en ros
afregros.
o Ejempro r'4: tmprimir ros Nmeros
rmpares de un Arregro
o
o En este eiempfo' se asume que
el arregfo contiene nmeros
enteros. se quiere que el
o 5,,f#iliJ$gT:j,:':""1quellos erementos que se;; ni'"ro. impares. Er sisuiente
o
o
Vofumen
o S:
Unidadt:@z
o @ Cooyright tBM Corp.2002
o Los materiales detqirso no pueden
ser reproducidos total
o parciafmente sln el permiso previo
o "ririto
de fBM.
o
O
Introduccin a ta programacin
con C
Gua del Estudiante
. Paso 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 ) ;
,lJOoritrng. se verifica cada etemento det aneqto para determinar s es un
[f:f impar.
numero S es impar, se imprim, ;i.",.;"t, y se
efemento. del aneglo. El progr"r" que examina el prximo
implementa este algoritmo se muestra
continuacin: a

El cdigo C inicia aqu...

/*Se incluye el archivo de encabezado con fas *,/


'/* funciones estandar que soportan las operaciones d,e * /
/* entrada y salida (sEdio.h) */
#include <stdio.h>
/* La funcin mai-n se i.nicia acru */
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


entonces se le consdera un nmero impar y entre 2. si lo no es,
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.
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++ )


k= 0 ,.

Printf (',num[?d] = ?d\nu,k,numtkl );

/* S,I bucle intercambia e1 contenido del arregiro */


,/* fnicialzacin */
top = 9-
bot = 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
Gua del Estudiante
o Introduccin a la p amacion con C
o
o /* EI bucle imprime el arreglo con l-os elementos */
o /* intercambiados *,/
o printf("81 Arreglo con 1os elementos \
intercambiados es \n,,) ;
o
for (k=0,. k <= (var_num_1) ,. k++
o printf (,'num
o [*d] ; ?d\n,,, k, num tkl );
]
o La funcin main termina aq) */
o Ef cdigo C termina aqu
o
o se recomienda a los estudiantes que reafcen el seguimento def prog*ma
con un
o rambin J"o"n-Larro con un "r"gr" que
;ffiffiffi:l:: :,,!fiff,lilentos' tensa
o
Fin det Ejempto 1.5
o
o A continuacin se presenta un ejemplo. de una operacn
o tcnica de Bsquea Lineal. rsii tcnica esu en areglos denominada
oiro de la categora generar de
afgoritmos llamados algoritmos de bsqueda.
o
o Ejemplo 1.6: Bsqueda Lineal de un Arreglo
o
Dado un arregfo de enteros num que contiene
o probfema es escribir un programa que
un nmero mximo de etementos n. Ef
indica ta presencia o la ausencia de una entrada
o var-num en un anegfo, buscndolo desde el comienzo
hasta el finat del areglo. Si el
o elemento se encuentra, se muestra ra posicn
en oonoe se encontr, si no se
encuentra se muestra un mensaje apropiado.
o
o La idea es recorer el arreglo desde
el comienzo y chequear cada elemento de num
o var-num' siwar-num existe en el aneglo num, se con
mlestra la posicin. Si se recore
o todo el arregfo y no se encuentra var-num,
a que se recone elarreglo completo
se rhuestra un mensaje apropiado. Debido
o denomina bsqueda lineaf .
en s@uencia desde el principio hasta elfinal,
se le
o
El siguiente es el algoritmo para focalizar
o de bsqueda fineal:
un elemento en un anegto usando el mtodo
o
o ' Paso l:
fngresar n er nmero de erementos en un
anegro
o o Paso 2:Leer ros n erementos y armacenarros
en eranegfo num
o o Paso 3: Leer el nmero a ser buscado var
num
o o Paso 4: x=o
o doi
o if (num [k] == var_num) {
o
o VolumenS:npos@ Unidad t: erogramar co A@f t
! , ^_ QCopyrighilBCorp.2002
t

o los materiales del curso no pueden'ser reproducldos


totaf
o o parcialmente sln el permiso previo es'crito
de fBM.
o
o
Introduccin a la programacin con C

imprimir J.a posicin ;-r elemento


__. qe.L
var_num como k;
break.'
)
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
12

@ 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 acon con C
o if [k] == numb) {
(a

o printf(,?d localizado en 1a posicin


?d \
de1 arreglo \n,,, numb, k)
o encont.rado = 1;
,.

o )
o k++,.
o ] while (k .= (n_r ;
o if (encontrado != 1)
o print.f ( " ?d no f ue encontrado\n * , numb)
o
,.
)

o /" Ia funcin main termina aqu */


El cdigo C termina aqu
o
o Tambn' se puede implementar
la bsqueda fineaf usando ef
o for'La mayor parte der programa
qrjera, excep;o'ra
bucfe while o er bucre
ii_::
=;'""'ffi prcin que imprementa fa
a ;;
o |,1#:i:, i ffil' ;:,:J"T'Ifu m*ll*;
a una im pre m e ntcin de la

o El cdigo C inicia agu...


O ,/" Smbolos definidos para hacer e1
o cdigo legible */
#defi.ne VERDADERO 1
o #define FALSO O
o int encontrado = FALSO:
o /* No se ha encontrado el nme ro * /
o inr k = 9,.
o '/* Bsqueda l-lneal en un arreglo usando e1 bucr.e while */
whil-e ( ( !encontrado) && (k <=
o {
n_1) )
o ir- t numlJ<l == var_numl
o
o encont.rado = VERDADERO;
o ("io encontrado en la posicin
yrrrLi_
ei *!

o var_num, k) ; ?d\n,,, \
o )
o else
o t
k++,-

o I

if (!encontrado)
o printf ("td no fue encontrado\nr,,var
o Ef cdigo C finatiza aquf
_num);
o
o Volumen 3
o Unidadt:erog@ l3
o . @ Copyright tBM Corp.2002
Los materiales
o det arrso no pueOen'seiieprooucidos
o parcialmente sln,et peniso previo total
o de
"rito
lBM.

o
o
Ahora' se puede comparar et mtodo
de imptemenbc* anterior con
donde se usaba ta esfuctura do-whil.e. el otro mtodo
La implem;5J,, con la estructura
mucho ms legible,..y evita l" no
seiiten;'A- Este es un programa while eS
estructurado' A continuacin se prenta
"iuiaote muy
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;
)
I
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.
sentencia break para safir del bucle usa fa
tan pronto como el elemento
es encontrado.
Fin det Ejempto i.6

A continuacin se muestran y se di::rJg.n. otros ejempros que


van ms ail de ro
:f3i[1", l:,*j',"Tffi?l?*;:"tgl'i "'i,loZi'l] *rufn ,oor",as con
Ejemplo l-7: convertir un Nmero Decimar Entero a Ln Binario
Se va a escribir un programa que convierte
entrada a binario, y lo imprime. un entero decimal positivo dado como
Se va a poder entender
slstema de nmeros binarios.
"rt" ," domina el
""rplJ"riy,
se van a establecer unas pocas su.posiciones
aceptarn como entrada entros posiiivos para simpfificar ta materia. slo
se
positivo
qr" pr.io"i rpr"sentados ir
en 16 bits (2
|[??; |'.jrilr.- '; J;'qr"
sb peoe repiesenrar con 16 bits es
2,u-1,l

considere un entero posivo como


ef 84. Para convertirlo a binario,
2' El residuo' el cualeoe seru" se debe dividir entre
r, ser ertrf. " ntna dividiendo
" etociente

Unidad l: pro

@ Copyright tBM Corp.2002


Los materiales def curso no pueden
o en su totalidad sin el previo permiso en parte
"t.,eproOucidos
escrito de lBM.
tt;
a
o
Gua def Estudiante
o lntroduccin a la programacin cor C
o obtenido entre 2, exrrayendo
el residuo hasta que el
o muestra en la Figura 1.5. cocente mismo sea 0. Esto
es
o
o
o

E
o
o +-
o
o
o
+-
o
o
o Ef ltimo cocenk
Figure 1.5: Conversin de
Decimal a Binario @
o s1e1'qi''?:fr;j:!,,",i,",'i"**?:?lr1t-".;;:,ii:ffr:;,ff T;33;.Xtr
caso) debe ser rratado
*ro-"i it il=* ,,,irrr""[""
o .;;liiJ,io'qr"
g?,","*#??era, er i.:p, por sus ,;, en insfs).
equiiate ; u,!e escribe
como se muestra a
o
o 1010100

o
o ,:;l?".1i"r:: iJL",i,fJ':#:':,Ji:i"'"n,"rlo en 16 b*s, se re rerena con ceros a ra
o 0000000001010100
o Elsiguiente es un afgoritmo para
resolver er probrema anterior:
o . Paso l: fngresar el entero positivo
o var_num
o ' Paso 2:vatidar que var-num sea postivo y menor
o Paso 3: Guardar el valor de var que 32767
o . paso 4: t num en var- guardar
o = o
o Paso 5: mientras (var_num
o !- 0){
o binario [kJ = Vdr_ num ? 2;
Var-nm = V 11U,n
o )
/ z;
o o Paso 5: lmprimir
o binario desde la posicin 15 a la
O
Ef programa c que rearizaesta tarea se presenta
o a continuacn:
a Ef cdigo C inicia aqu...
a ,/*se incluye eJ. archivo de
o encabezado con las *
/* funciones estandar que soportan /
o ,/* entrada y salida (stdio.h) */ las operaciones de */
o
o Volumen 3
unidadt:n@rs
o
a . @ Cooyright tBM
Los materiafes det crso Corp.2002
no pueden l"ir"proorcidos
o o parcialmente sin elpermiso
prlr, totat
de lBM.
o "rlrt"
o
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
l6
@ 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.
o
o Gua del Estudiante
o Introduccin a la programacin con C

o se pudo' de hecho, enraer los residuos y almacenarlos


en el aneglo desde la posicin
o binario [15] hacia adelante. En este caso, se puede imprimir los
desde 0 hasta 1s' Algo que se debe notaraquies nmeros binarios
o se escribi ?rd, indicando que nT919
que, en la ltima sentencia prinrf
,
debe ser imfreso en un campo de r dgto de
o ancho. Esto es ro que se quiere "l
para dgitos onarios q" ,on 0 o 1.
O
Fin del Ejempto 1.7
o
o A continuacin se va a tomar como entrada un
nmero binario y convertirfo a decimal.
O Ejempfo 1.8: Convertir de Binario a un Entero
Decimal
o
O En este problema se acepta un nmero binario
como entrada en un aneglo binario
de 16 bits. se va a convertir esto a un entero decimar
o e imprimirfo.
o Para un nmero binario 1o1o1,su equivalente
entero decimal es elsiguiente:
o
1x2a + 0 xf + 1x22 +'0x21 + 1x20
o
o El algoritmo que realizaesto es:
o . Paso l: Declarar el arregfo binario [15]
o
o ' Paso 2: Ingresar dgitos binarios vidos en arregro
binario
. Paso3:num= o
O
o Paso 4: peso posicionarder dgito ms a ra
pesojosicionar _
o o PasoS:for(k=iS; k>0; k-){/-procesar
derecha 1
o e1 nmero desde r-a derecha */
DUrn = num + binario[k]* peso_posicional;
a peso3osicional = peso_posicional*2,.
o /* Forma e1 prximo peso posicional */
o ]
o ' Paso 6: rmprimir er decimar equivarente der
nmero binario
o Elsiguiente programa implementa el algorimo
o anterior:

o Elcdigo C inicia aqu...


o /*Se incluye e1 archivo de encabezado con las */
a '/* funciones estandar gue soportan 1as operaciones de */
a ,/* entrada y salida (sLdio.h) * /
o #include <stdio.h>
o /* La funcin main inicia aquf */
main O {
o
,/* Convertir un binario a decimal *,/
o ./* Declaracin de Variab].es */
O
o
a VolumenS:fipos@ Unidadt:erog@ tz
O @ Copyright tBM Corp.2002
a tos materiales del curso no pueden ser reproducldos totat
o parcialmerte sln el permlso prevlo escrfto de
a tBM.
o
o
Introduccin a la programacin con C 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


18

@ 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.
o
o Gua del Estudiante
o
o Hasta ahora, en los. diferentes ejemplos slo se han usado
enteros. En el siguiente
a ejemplo, se ilustra el uso del tipo de dato carcter en areglos para
que involucran texto.
resolver problemas
o
a Ejemplo 1.9: Contar el Nmero de Vocales en un Texto
O 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
o 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.
o
o El siguiente es elalgoritmo para resolver el problema:
o o Paso l:
fngresar el texto dentro de un aneglo flamado
o text
o Paso 2: lnicializar los contadores para cada vocal
a
o ' Paso 3: Inicalizar k en 0 y leer desde esa posicin en rexr
. Paso 4: Leer text [k]
o . paso 5: mientras (ten[k] != ,$')
o {
Verificar si cext [k] es una voca],.
o Si es verdadero, incrementar el contador
o vocal apropiado;
de

o x++;
o )
o o Paso 6: lmprimir los contadores de las vocales
o Basados en este afgoritmo, se puede escribir el siguiente progrcma
en c:
a El cdigo C inicia aqu...
o /* fncluir los archivcs de encabe zad.o * /
o /* se tienen las definiciones de ras funciones */
o /* usadas dentro de1 programa */
o #include <stdio.h>
o #include <ct1pe. h>
o /* La funcin main inj_cia agu */
o main0 {
o ,/* Declaracin de Variables *,/
I char text [S0Oj ;
t int k, cont.adorA, contadorE, contadorf, contadorO,
conLadorU;
o /* se ingresa er- texto suministrado por e1 usuario *,/
o /* en e1 arreglo */
o k = 0;
o printf("fngresar el t.exto terminando en e1 \
o
a Volumen 3: Tipos Oe@ Unidad l: Programar con Arregloi tg
o
o . @ Copyright tBM Corp.2OO2
Los materiales del curso no pueden ser reproducidos total
a o parcialmente sin elpermlso previo.escrito de lBM.

o
t
Introduccin a la programacin con C
l Estudiante
carcter $\nn);
scanf ( "t.u, &text tkl ) ;
while (Lext [k] ! = '$') {
scanf (ntcr, &text [++k] );
)
./* rnicializar los contadores de vocales * /
contadorA = 0;
contadorE = e;
contadorf = 0;
contadorO = e;
contadorU = e;

/* 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] ) 'f ,)
contadorl++;
else if (Eoupper (text tkl ) ,O | )
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
20
@ 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
Gua del Estudiante
o Introduccin a la Programacin con C

o )

o /* La funcin main finaliza aqu */


o El cdigo C finaliza aqu
o Se pudo tambin consderar usar un aneglo para almacenar los contadores. Los
o estudiantes pueden intentar escribir ese programa, y entender de que
forma sera una
o buena idea , y de que otras formas no lo ser.
o Fin del Ejempto 1.9
O
o A continuacin se aborda otro probfema que requiere el uso
de un arreglo
unidimensional. Ef enunciado del problema es, sin embargo,
o .
enunciados presentados hasta ahora, y no sugiere nada arca
difernt de los otros
del mtodo que debe
o ser adoptado. Este tipo de problema ocurre algunas veces en ta vida
real.
o Ejemplo 1.10: lmprimir la Secuencia def Problema del Anilo de Ejecucin
o
o Considere N personas condenadas. que_ estn esperando para
ser ejecutadas. El
o verdugo, abunido del mtodo de ejecucin decide seguir et mtooo
iresentado a
continuacin:
o
o l hace que todas las w personas condenadas se coloquen en crculo,
con un entero
o 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
o pecho estn en un crculo en la direccin de las agujas
nmeros 1, 2,
3.-. en su
o del reloj. El verdugo toma un
nmero aleatorio entre t y N, y llama a este elrndividuo. El
entonces dispara a esa
o persona cuyo nmero en ef pecho mincide con ste. l
selecciona otro nmero
o aleatorio mayor a cero tfamado el prximo. l cuenta el nmero prximo
de
personas vivas en direccin a las agujas, de refoj desde
o persona cuyo nmero en su pecho coincide con el nmero.
etrndividuoy ejecuta la
De esta *un"r",
o mantiene ejecutando a todas las personas. El problema consiste
en tomar como "u
o entrada los nmeros aleatorios elrndividuo y prximo, e imprimir
la secuencia
segn la cuallas personas son ejecutadas. .
o
o Esta claro que se debe mantener el estado de cada una de las personas
n como viva o
o muerta' Se tendr un aneglo tlamado lista que contendr el estado.
Inicialmente,
o 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.
o lista [k] indica el estado de una persona cuyo nmero en el pecho es k. ruma que
o
o 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.
o
o 2, 5, 4, t, 3

o 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
o problema:
resolver este
o
o Volumen 3: Tipos de Datos E-tructu,,ados; C
Unidad l: Programar con Anegloi 21
o
ib @ Copyright tBM Corp. 2002
Los materiales der cufao no pueden ser reproducrdos totar
o parciafmente sln el permiso previo 6scrito d lBM.

o
o
lntroduccin a fa amacin con C
Gua del Estudante
Paso l: lista t1011 para 100 personas
Declarar un anegto
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: lista[elrndividuo] = uuenro
Paso 9: lmprimir etrndividuo
Paso l0: Nmero de personas
ejecutadas nuuerros _
1
Paso l1: white (nMuerros <=
n) {
Localizar elfndividuo contando
Las /v^rrtds
-ss prximas personas vivas;
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
int counE, n, eLfndividuo, k, proximo,[0J para nada * /
ntvfuertos,.
int. VfVO = 1, MUERTO = O j

j""::::;:: entrada der usuario er. nmero


:i." de personas
v;
/rLr
-!

( .lngresar eL nmero de personas
/
', -
condenadas:,,);
scanf ( utdu , &n) ;
if (n<=o) {
prinEf(nfngresar un nmero >
0 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 Gua del Estudiante Introduccin a la Programacin con C
o
o
o
/* Inicialzar lista desde 1 a N como VfVO */
o for(k = 1; k <= n ,- k++)
o listalkl = vrvo;
o /* Ingresar ellndividuo y validar sf est
o entrelyN"/
o oo{
O printf("Ingresar 1a primera persona \
o a ser ejecutada comprendida [t, ?d]:",n);
o scanf ( "?d", &elfndividuo) ;
o ) while ((elrndividuo < t-) ll (elrndividuo > n));
o /* Ingresar eI proximo > 0 * /
printf("fngresar un enetero > 0\n");
o do{
o scanf (u?du, CProximo) ;
a ) while (proximo <= o);
a /* ejecuEar elfndividuo */
o lisLalellndividuol = MERTO;
o I
/* imnrimir
Lrt\E
L elTnrlirirrn */I

o printf ("La persona ejecutada es ?d\n',,ellndividuo)


o /* Nmero de ejecutados nMuertos -- I */
nMuertos = 1,.
o /* Localizar y ejecutar a todos 1os dems */
o while (nMuertos . n) i
o /* localizar elfndividuo contando prximo
o personas vivas */
o ^^rtF -
1 .

o while (count .= proxi'mo ) i


o ellndividuo++;
o if (ellndividuo > n)
o ellndividuo = 1; /* circul-ar*/
o if (1ista[ellndividuo] == vrVO)
counE++;
o
)
o /* e)ecutar ellndividuo */
o if (lista lellndividuo] == vrvO) {
o lista lellndividuo] = MUERTO;
o ,/* imprimir ellndividuo *,/
o printf ( I'La persona ej ecutada\
o
o Volumen 3: Tipos de Datos Estructurados en C Unidad l: Programar con Areglos 23

o @ Copyright IBM Corp.2002


o Los materiales del clrso no pueden ser reproducdos total
o parcialmente sln el permlso prvio escrito de lBM.
o
o
o
#Estudiante
es\nu, elfndividuo) ,.

)
/* 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,
cada uno de fos pasos' Este mtodo refnando
es llama"d refinamento paso a paso
refinement)- Este es un mtodo muy (sfepwse
tir p"-i"rruer probtemas ya que
manejar eficazmente ta complejidad. ayuda a

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
string explcito en c. Este puede ser directamente un tipo de dato
lro o escrito como sigue:
scanf (u?"r,, nombre);
printf (',?" ", nombre) ;
' Este no tiene que ser ledo o escrito carcter a carcter
?c)' una vez ledo usando ?s, la cadena (usando ef formato de 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 se denomina
carcter nu11, y se denota'como ,
i;, .

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
"i escrito de en parte
o en su totaldad sin el previo permiso
fBM.
o
o Gua del Estudiante Introduccin a la cin con C
o
o /* Declaracin de variables */
o char rexro [1000] ,.

a inti=0,noTo=O;
/* Obtener Ia entrada del usuario de la palabra *,/
O prj-ntf (', f ngresar un palabra grande : \n" ) ;
o scanf (tt?s", texto);
o
O /* nI bucl-e cuenta et nmero de veces gue Ia
o palabra 'to, ocurre en el texto */
o while (texto Ii] ! = ,\O') {
o if (toupper(texto[i] ) 'T' &&
o toupper(texto[i + 1]) =='O') {
noTo++,.
o t = + 2;
o ]
o e1 se
o i++;
o l
t
o /* tI nmero de ocurrencia de .to,, se imprime */
o printf("E1 nmero de \uto1u en e1 texto dado ?s es \ ?d\n,,,
texto, noTo) ,.
O
]
o /* La funcin main Lermina aqu */
o
Elcdigo C termina aqu
o
o Fin del Ejemplo 1.11
o Como no hubo necesdad de leer carcter a carcter en el programa anteror, se omt
o el bucle.
o
Existen muchas funciones disponibles para cadenas en la librera srring. h.
o siguientes son algunas de las funciones ms usadas:
Los
o
O Funcin Descripcin
o strlen Toma una cadena y retoma la longitud de ta misma.
o
a sErcpy Toma dos cadenas como parmetros, copia la
segunda cadena en la primera y retorna la primera
o cadena.
o
o strcat Toma dos cadenas como parmetros, las concatenan
y retoma la cadena concatenada.
o
o
o Volumen 3: Tipos de Datos Estruc'tunados en C Unidad l: Programar con Arreglos 25
,a .t @ Copyright IBM Qorp.2002
TI Los materiales delcurso no pueden ser reproducldos total
J o pardalmente sln el'permiso previoescritode lBM.
D
,o
o
Gua del Estudiante

strcmp Toma
I vr,r dos
L(JD uduenas
caOenas como parmetros, y las comp_o_
Tro
t" primera
I*::::..j.:i
que la segunda.
cadena es ms pequea
Retoma o siambas son iguafes.
o,:'l'1tlTgra cadenaes ms grande que
fa 3:::
,T segunda. (se usan
fas. regtas iigijfriIIa
comparar lag dos cadenas)

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.

I
o
o Gua del Estudiante lntroduccin a la ramacin con C
o
o Resumen
o
o Ahora que ha completado esta Unidad, usted debe ser apaz de:
o . Explicar elconcepto de arreglos en la solucin de problemas
o . Definir un aneglo
o Describir cmo acceder a un elemenlo en un aneglo
o . Explicar cmo usar aneglos en algoritmos
o o Desarrollar afgoritmos para problemas que requieren el uso de arreglos
o . 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
o
o
Volumen 3: Tipos de Datos Estructurados en C
o Unidad 1: Programar con Aneglos 2T
o ' @ Copyright tBM Corp.2002
i Los materiales del crso no pueden ser rcproducldos total
'o o parcialmente sln el permlso prevlo escrlto de lBM.

o
o
Gua detEstudiante

Unidad l: Examen de Autoevaluacin


1) Cuntos elementos tiene un aneglo declarado inr x l7o) ;?
a) 11 'omo
b) 10
c)9
d) 12
2) Es vlida la declaracin int x [o] ;
a) Verdadero
b) Falso
3) Cuntos elementos tiene la declaracin inr x LL.J ;?
a)0
b)1
c)2
d) Nada, ya que la declaracin es invlida.
+) Asuma que un programa en C contiene #define LTMTTE
2s. Es mnecto
hacer la declaracin inr
x [LrMrTE] ; ?
a) Verdadero
b) Falso
5) Cuando se hace referencia a un elemento como x
[3] , realmente se est refiriendo
r
al
elemento.
a) Tercer
' b) Segundo
c) Cuarto
d) Primer
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


28
@ 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.
o
o Guia del Estudiante Introduccin a la
o
o 8) Qu es un aneglo unidimensional?
o a) Una coleccin de datos, todos pertenecientes al mismo tipo, localizados uno
seguido delotro
o
o b) Una coleccin de datos, todos pertenecientes a multiples tipos de datos,
focalizados uno seguido delotro
o c) Una cofeccin de datos, pertenecientes al mismo tipo localizados sn un orden
o particular
o d) Una cofeccin de datos, todos pertenecientes a mltiples tipos de datos,
o localizados sin un orden particular
o 9) Es invlido el uso de la siguiente expresin x [k++] = k++;
o a) Verdadero
o b) Falso
o l0) Considere la declaracin int x [10] . En este caso, la referencia al aneglo como
xlk * 1 t l-21 eS
O
a) Siempre vfida
o b) vlida slo cuando ra expresin dentro delsubndice
o c) Nunca vlida
est en elrango 0, 9
o d) Vlda slo cuando la expresin dentro delsubndice
o resulta en el rango 0, i0
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o Volumen 3: Tipos de Datos gstruauraOos en C
Unidad 'l: Programar con Aneglos n
o @ Copyright tBM Corp. 2002
o Los materiales del curso no pueden ser reprcducidos total
o parcialmente sin el permlso previo escrito de lBM.
o
o
o
Introduccin a la programacin con C

Respuestas a f a unidad l: Examen de Autoevaf uacin


1)b
2)b
3)b
4)a
tc
6)d
7)a
8)a
e)b
l0) b

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.
ttl
o
o
Gua del Estudiante
o Introduccin a la Programacin con C

o
o Unidad 2: Arreglos Mult-Dimensionales
o
o Objetivos de Aprendizaie
o Al finalde esta unidad, usted ser capaz de:
o
o . Definir qu son aneglos multi-dimensionales

o t-
l'*
. Describir la naturaleza y uso de los aneglos bidimensionales

o . Explicar la importancia de los anegfos bidimensionales en la solucin de


problemas
o . Describir el uso de los aneglos bidimensionales en los algoritmos
o . Explicar como declarar, inicialzar y emplear aneglos bidimensionales en C
O
. Discutir la implementacin de algoritmos que empleen aneglos bidimensionales
o enC
o
Ol
o
ol
ol
o
o
o
o
o
o
o
o
o
o
o
o
o
a
d
el
q
.ti
Volumen 3: Tipos de Datos Estruc{urados en C Unidad 2: Aneglos Multi-Dimenslonales 3l
' @ Copyright IBM Corp.2002
Los materiales delcurso no pueden serreproducldos total
o parcialmente sln elpermiso previo escrito:d lBM.

o
studiante

1. Introduccin
se estudi' que en las situaciones donde rgggleren
mlsmo tipo se usa un aneglo unidimension"l.-irsemltiples efementos de datos del
de mltiples estudiantes, lo cuales pueden como ejempfo, las catificaciones
,,"pr"rnt"rse en un anegfo unidimensional.
Los anegfos unidimensionafes in rt"r"r
En c, una anegfo unidimension"ir" u""tores usados en fas matemticas.
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 y
usar.
Programar con Aneglos. gn Sneglos unidimensionafes en fa unidad 1
"; -
unidad,
dimensionales, para ser precisos"tJ ";iar como usar arregros murti-
areglos 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
lgica y de significado *rr"io-.- Asuma una entidad
nacimiento de estudiantes de 'un
q;";;uiere armacenar fa fecha de
forma de lograrlo es teniendo tres
saln oe cralls ;; formato da, mes y ao. una
"i
aregfos unidmensionales
(En la implementacin se usar anium) . se puedenflamados aia, mes y ao
decrarar sigue:
int dia [100] , mes [100] , anium [1Oo]
;
"orf
Aftemativamente' se tiene un aneglo
flamado ddn, QU tiene mftiples dimensones
como sigue:
inr ddntlool i3l;
Esto significa gue la fecha de nacimiento
cada fila tiene ef da, mes y ano e de 100 estudiantes est registrada en fitas y
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 I 1956
4 1960
-
A
6 1987
Las entradas en este aneglo implican
fo siguiente:
24 Agosto 1956
4 Septiembre 1960
4 Junio 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 Gua del Estudiante
lntroducqin a la programacin con C
o Esto significa que una pgina tiene 25 lneas (filas),
o (cotumnas). por lo tanto, s se desea un libro
y 70 c,aracteres por lnea
de muchas pginas, se debe declarar
como sgue:
o
o char libro [350j 2sJ t7o) ;
o Este es un arregro tridimensionar y se representa
grficamente en ra Figura 2.1.
o
o
O
o
o
a
o
o
o
o
o
o I
o I

I
o I

o Charaqter
o Figura 2.1 : Arreglo Tridimensional
o La forma general de declaracin de un anegto
bidimensionalse da a continuacin:
o tipo_de_dato arreglo [exp1] [exp2] ;
O
o 2. Resolver probfemas con Arreglos Bidimensonates
o una de las primeras cosas que se debe aprendei cuando
se trata de emplear aneglos
o bidimensionales en la.resolucin de problemas
es a declararlos e iniciafzrlos. At igual
o :,T.^l:t aregfos unidimensionales, los aneglor or"nrionales se declaran como
stgue:
o . inr a [100] [1oo] ;
o o char textotZSl 96 -
o . floar numb [10] trel ;
o Ya se sabe que los aneglos unidimensionafes
o parte de la misma declaracin.
estticos pueden ser iniciafizados como

o Los aneglos estticos son aquellos aneglos que


o ncfuyendo la fucin rnaj_n.
se declaran dentro de una funcin,
o
o
o Volumen 3: TlposOe@ Unidad 2: Anegtos MulOimesiiles
o 93
Copyright tBM Crlrp.2002
o @
tos materiales del curso no pueden ser reproducidos total
o o parciafmente sin ef permiso previo escrito de lBM.
o
O
.f
o
o Gua del Estudiante
lntroduccin a la programacin con C
o Esto significa que una pgina tene 25 lneas (filas),
o (columnas). Por lo tanto, si se desea un fibro
y 70 c,aracteres por lnea
de muchas pginas, se debe declarar
como sigue:
o
o char tibro [350j f2s] t7o) ;
o Este es un aneglo tridimensional y se representa
grficamente en la Figura 2.1.
O
O
o
o
o
a
o
o
o
o
o
O
I
o I

I
o I

o Chragter
o Figura 2.1 : Arreglo Tridimensional
o La forma general de declaracin de un aneglo
bidimensionalse da a continuacn:
o Llpo_de_dato arreglo [exp1] [exp2] ;
o
o 2. Resolver Probfemas con Arregtos Bidimensonales
o una de las primeras cosas que se debe aprendei cuando
se trata de emplear aneglos
a bidimensionales en la.resolubin de problemas
es a declararlos e inicializrlos. Af igual
o :,i:.ft areglos unidimensionales, los aneglor r"nrionales se declaran como
stgue:
o . j-nL a [100] [100] ;
o o char texto tZSl 691 -
o . f loar numb []-01 tral ;
o Ya se sabe que los aneglos unidimensionafes
o parte de la misma declaracin.
estticos pueden ser iniciatizados como

O
Los aneglos estticos son aqueffos aneglos que
o incluyendo la fucin main.
se declaran dentro de una funcin,
o
o
o Volumen 3: Tipos de@ Unidad 2: Anegtos Mult-Omgales 33
o
@ Copyright tBM Crlrp.2002
O tos materiales del curso no pueden ser reproducidos totat
o o parcialmente sin elpermiso preo escrito de lBM.
o
o
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
inicializacin sucede como sigue:
ms rpido. La

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},
I
{z,a,s}
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
explicitamente se proporcionan valores para atgunas tolumnas
tas fitas 2"v li,
cuando
en una fila durante la
inicializacin de un aneglo, et resto de las col-rrnas en la
fila automticamente se
inicializa en 0.

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
para indicar la inicializacin en el sentido de las
intemas (usadas
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
Gua del Estudiante
o macion con C
o ' Los primeros cuatro valores ( aa) son asignados a las cuatro columnas de la
o fita 1.
o ' !'o: segundos cuatro valores (5 a S) son asignados a las cuatro cotumnas de la
lafila2.
o . El ltimo valor (g) es asignado a ra corumna 1 de ra fira
3.
o o Las columnas 2,3 y 4 de lafifa 3 se inicializan con 0.
o Sin embargo, se realiza mejor la inicializac-in de anegfos bidimensionales
grandes
o dentro del. programa y no en la etapa de blaracn.
contnuacin se presenta un
ejemplo elcual inicializa un aneglo bidimensionalen 0.
o
o inr rabla [100] tlool , k,I;
o for(k=O; k<100;k++)
for(1=0;1<100,'1++)
o tabla tkl tll = o;
o
Nojse que para los arreglos bidimensionales se requieren
O Existen dos bucles iterativs para acceder a cada elemento
dos variables subndices. .

o del aneglo bidimensonal.


Este tipo de formacin de construccin iteratva i,pi"" cuando se programa con
o anegfos bidimensionales. "r
o Se puede tambin iniciatizar el aneglo con los vafores de
entrada dados por el usuario.
o El siguiente segmento de programa-muestra cmo
un aneglo bidimension'"t ru le asigna
o entradas dadas por el usuario.
o ,/* Declaracj-n del ArregJ o */
o inr tabla[10] [10], k, l;
o /* Acceder a1 arreglo "/
o for(k=0,' k<10;k++) {
printf (..fngrese los valores de la Fila ?d\n,,,k),.
o for(1=0,. 1<10,. 1++) {
o printf (.'fngresar el_ valor de 1a fila ?d \
o columna ?d\n,, , k, 1) ;
o ,
/* Alamacenar elementos en el arregfo */
o scanf ( "?d", &Eabla tkl tll ) ;
o l
o )
o En este programa, el usuario se te pide que ingrese
los valores de una fila en particular.
o En el.caso de anegfos muy grands, este procedimiento
de leer valores de entrada del
usuario puede ser tedioso. En taf escenaiio, los valores
o almacenamiento secundario (como un disco) ar arregl.
se leen de un ispositivo oe
o Este aspecto ie cubierto
cuando se estudie el manejo de archivos en el volumen
6, Unidad 1 Manejo de -
o Archvos en C.
o
o
o
o Vofumen 3: TiposOeffi Unidad 2: Aneglos MultOme,nsonales 35
o @ Copyright tBM Corp. 2002
o los materiales del curco no pueden ser reproducidos total
o o parcialmente sin elpermiso preo escrito de tBM.

o
o
A 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 rabla t10l tlol .

inr rabla[10] t1ol , k,I;


f or (k=0 ,'k<10 ,'k++) {
for (I=0;1<10;1++)
prinrf ("gd ', rabla ikl tll );
printf (..\n" ) ;
)

El bucle ms intemo tera sobre r


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 ai = dik para todos los valores de k e i.


La siguiente matrz es simtrica:

10532
52257
32 57 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
Tl,.Tl" {e la primera fila contiene u 10 en vez dp s, entonces la matriz no es
simtrica. El siguiente es el algoritmo para verificar si una matrizes simtrica:
. Paso 1: fngresar la matriz a
. Paso 2: x=o; i =o
. Paso 3: mientras (no se hayan verificado todos los elementos && no hay
desiguald entre a y aid i lr

if (k != i) {
if (aki == aik)
incrementar k, i;
e1 se

. Ocurre una desigualdad;

Unidad 2: Arreglos M
36

@ Copyright tBM Corp.2O02


Los materiales delcurso nio pueden sr reproducidos
en parte
o en su totalidad sin el previo permiso esoito
de lBM.
o I'
o Gua del Estudiante
o Introduccin a la macin con C
o Incrementar k, i;
o ]
O Note que no se estn comparando aki
== aik, cuando k e i son iguales.
o Cuando k e i son guales, este es un etemento de la
diagonat. Basados en el
algoritmo, el programa que realiza esta tarea puede
o ser desaollado como sgue:
o Ef cdigo C inicia aqu...
o ,/* Incluir 1os archivos de encabe zad,o * /
o /* que tienen las definiciones de 1as funciones */
o ,/* usadas dentro del programa */
o #include <stdio.h>
o #define VERDADERo 1
o #define FALSO O

o /* La funcin main se inicia asu */


main O {
o ,/* Declaracin de Variabl es * /
o int matriz[tooJ [1oo], n, k, 1, go_on;
o
o ,/* Obtener del usuario el orden de Ia matriz * /
o clo i
o print.f ("Ingresar e1 orden de l_a matriz entre \
o y
1 100\n");
o scanf ( u?du, cn) ;
o ) while (n < 1 ll n > 1oo);
o /* obtener de1 usuario 1os el-ementos de la matrz * /
o for(k=0; k< n;k++) {
o printf (,, Ingresar 1os. valores de la Fila ?d\n,,,k)
;
O for(1=0;1< n;J.++) {
o printf ("fngresar e1 valor fila ?d \
o columna ?d\n' , k, 1) ,.

o scanf (n?dn, &matriz tkl t1l ) ;


o
o l
I
/" nI bucLe verifica si es una matriz simtri ca * /
oI go_on=VERDADERO;k=6;
? while (k <= n && go_on == VERDADERO)
{
? 1=0;
?, while (1 <- n && go_on == VERDADERO)
{
tr if (k ! = 1 && marriz tkl t1l ! = marriz t1l tkl )
T
H Volumen 3: Tipos Oe Oat@ Unidad 2: Aneglos Mutti-Drnensionales 37
@ Copyright tBM C.orp.2002
Los matefiares del curso no pueden ser reproducdos
total
o parcialmente sln elpermiso preo escrto de lBM.

o
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");
el- se
-i '.ts C rI tttuq
/t rLr ^ ITtdtriZ nO es simtrica\n");
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 x x
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 xp. La multiplcacin de matrces se defne taf que cada elemento de
Ci j para todo i, j
es como sigue:

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 30 25 3021
567 2 354
1 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.
o 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 Gua del Estudiante
o lntroduccin a la programacron con C
o paso 2: Ingresar la
matnz a de orden m x n
o . paso 3: Ingresar la
matrizg de orden n x p
o r paso 4: rniciafizar todos
ros erementos de c de orden m
o . paso S: para todo
x p en o
i desde 0 hasta m_1
o para todo j de 0 hast.a p_1
o formar Cij = IA. * Bkj for.k
= O, -_ n_1
o o paso 6: lmprimir las
matrcesA, B, y c
O
se muestra er segmento de programa que
o *"?:t*:rdn hace ra murtipricacin de
a for (i=O; i < m,. i++){
o for (j=c; j . p; 7++)
o Dulild = U,.
{

o fo- (k=O; k -< n; k++)


o suma = suma + AIj_l ikl"Btkl
ijl;
o ctil ljl = suma,.
o )

o ]
o Los estudiantes puede n realizar ef seguimiento
der segmento de programa anterior
con afgunas matrices de ejemplo. par
o elejemplo.
em")iL"0" usar las matces dadas en
o
o Fin def Ejemplo 2.2
o Ejemplo 2.3: Cafcular laTrazade una
Matrix
o
o Latraza de una matnz se define slo pra
traza de a se define como fa suma
matrces cuadradas, de orden
n L nx
o siguiente matrizA, de orden 3 x 3.
de todos los elementos oe la diagonal.
considere la
o
o all a12 a13
o a21
o a22 a23

o a31 a32 a33


o Los efementos de fa diagonar estn
en negritas . La trazas a+ a22*
o elementos de fa diagonaj tenen elmismo
subndice corto a.
d33. Note que ros

o
Ef siguiente segmento de programa
o catcuta latrazade una mat,-.
o El cdigo C inicia aquL..
o ,/* fncluir 1os archivos de encabe zad.o * /
o
o VolumenS:npos@
Unidadz:nnffites 39
o
o , ^_ _- .
Los . . @Copyright tBCl;rrp.2002
materafes def curso no pueden ser
reproducidos totaf
o parcialmente sln elpermlso preo
o de lBM.
""'"rito
o
o
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 del- usuario el orden de 1a maLriz * /


do {
printf("fngresar el- orden de la mariz entre \
1 y 100\n',);
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 de 1a mat,riz


prj-ntf ('La traza es ?d\n,,, trace);
)
/* La funcin main finaltza aqul */
El cdigo C termina aqu

Fin del Ejempto 2.3

Unidad 2: Arreg
40

^_materates delcurs
,Los @ Copyright tBM Corp.2002
no pueden slr rejroOucidos en parte
o en su totalidad sin el previo permiso
escrito de lBM.
o 7
o Gua del Estudiante
o f ntroduccin a la pr amacron con C
o Ejemplo 2'4: Verificar si ra Matriz es Trangurar superior
o una matriz x es triangular superior
o si todos los elementos debajo de la diagonal
! ceros (usuafmente fa diagonal'y son
fos elementos-p";;;il" no son
o !
A continuacin se presenia un
matriz de 4 x4 de ejemplo.
estrictamente ceros).
o 12 24 36 48
o 0 11 22 .33
o
o 009998
o 00065
o r:fit#Xi$"nllotoices de matrices, los siguientes erementos
son cero en una matriz
o
o 12 24 36 48
o Xr' 11 22 33
o Y
-'31 xr, gg gg
o
o
x,. x^, Xn, 65
Note la forma en la cual fos subndces
o matriz anterior' Para cada nta,
proceden respecto a cada eremento en ra
o cofumna vara de 0 hasta fira-i'.
oese o hasta z, "on
eirr"nt r;g;";dd"irogr"*"
*
que ef subndice de ra
"nlientra
o rearizaesta tarea.
El cdigo G inicia aqu...
o
o ,/* fncluir 1os archivos de encabezado */
o /* que tenen las defini-ciones de las
funciones */
/* usadas dentro del programa */
o
#include <stdio.n>
o
o #define VERDADERO 1
o #define FALSO O
o #define ROir 4
o #define col, 4
o
o /* La funcin main se inicia aqul */
o main ()

o {

o /* DecLaracin de Variables */
int matrizlROWl [COL], !, k, i, j;
a int go_on,.
o k=1; go_on = vERDADERo;
O
o
Vofumen g:
o Tp
Unidadz:nn@tes
o @ Cooyright tBM Corp.2002
41

p Los materiafes del qrrsono pueden


b"ir"prodrcidos totat
o parcalmente sin etpermiso previo
o de lBM.
"Jrito
o
o
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 el- valor fila *d \
coLumna ?d\u,k,1) ;
scanf ( utdu, &malriz tkl t1l ) ;

)
/* nI bucLe verifica si l_a maEriz es triangular superior */
for(i=t;i<ROW;i++) {
for(j=0,-j<i; j++) {
if (marriz Ii] tjl != o)
go_on = FALSO,.

]
/* rmprimir a la salida estndar si la matriz el triangular
superj.or */
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 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 2 a43 aU
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
F
Gua del Estudiante
o *.
Introduccn a la
o all = a14 422= a23
amacin con C

o a33= a32 a44= a41


Elsiguiente segmento
o de programa freva
a cabo esta tarea.
o El cdigo C inicia
aqu...
o ,/* rnclui
o
o
a $
f i: *:Fl:"'::':ilii,i:::cabezad' runciones
#incrude .::il;""j;;";;;:"*i"'""
* /

o *
o k #define VERDADERO 1
#define FALSO 0
a !'

o i /* La funcin maj-n se inicia agui */


o main ()
o tt {
o t

oI 2
,/* Declaracin
",
r

oI inr i , j ,x,r, n"_jj, 11""ot""


oi j,nt arregLo_matriz
tal Ul ;
o
o : ,/* Obtener de us los elementos de la
for(i=0 ;i<4;r**r'"tto matriz * /
o {
o for (j =o; j <4; j ++)
a i
a printf (,'fngresar Valor
para rr.rra td
o Columna ?d J
\ ,\n,,,i,j);
\
o ,."nf ( ,,9 n , &arreglo_matriz

o ] Iij t jt );
o printf ( " \n u, ,.

o
)
o
o /* MoeLrar 1os elementos
o for (i=0; i<4,. i++) de la matriz * /
o {
o for(j=o;j<4 ;j++)
o I
o printf (,,td1u, arreglo_m
acriztil fjl );
o
Uo,m"
o
o unidad2@1".
43
o ,l-os _ _.
^_ materiales
@ Copyright lillvl
det ctl
C.arp.2002
ser reproducidos total
o o parciafmenl" ,nTll^o-pueden
er permiso previo
escrito "l'nr.-*,
o
lntroduccin a la programacin con C Gua del Estudiante

I
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


diagonal cruzada son iguales o no de 1a diagonal_ y de la
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 1a Diagonal en Cruz \
no son iguales \n',),.
)
/* La funcin main finai-iza aquf t,/
Ef cdigo C finaliza aqu

Fin del Ejempto 2.5

Unidad 2: Arreglos
44
@ 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.
of
o
o Gua del Estudiante lntroduccin a la Programacin con C
o
a Resumen
o Ahora que ha completado esta unidad, usted debe ser capaz de:
o . Definiraneglosmulti-dimensionales
o
o r Describir fa naturaleza y uso de los arregfos bidimensionales

o ' Explicar la importancia de los arreglos bidimensionales en la sofucin de


problemas
a . Describir el uso de fos aneglos bidimensionales en los algoritmos
a
o ' Explicar como declarar, inicializar y emplear arreglos bidimensionales en
C
' Discutir la implementacin de los algoritmos que emplean arreglos
o bidimensionales en C
o
o
o
a
o
o
o
o
o
o
o
o
o
o
o
o
O
o
o
o
a
o
o
a
o
o
O Volumen 3: Tipos Oe OatosEstructr,,adolend Unidad 2: Aneglos Multi-|)imensionales 45
o @ Copyright tBM Corp. 2002
o Los materiates del curao no pueden ser reproducidos total .

o o parcialmente sln elpermiso previo escrito de lBM.


o
Gua det Estudiante

Unidad 2: Exmen de Autoevatuacin


l) Un aneglomulti-dimensionaltiene
a) Exactamente dos dimensiones
b) Dos o ms dimensiones
c)Ambas (a) y (b)
2) Cmo se denomina un arreglo de orden m xnx p?
a) Aneglo unidimensional
b) Aneglobidimensionaf
c) Areglo tridimensionaf
d) Un aneglo en generaf
3) Cuntos enteros se pueden almacenar en un arreglo declarado corTro i_nr
xLsl aJ?
a) 22
b) 20
c)9
d) 12
4) Cmo se accede a un elemento de un aneglo declarado como char
nombre [25] Ieo1 , 2
a) nombre til
tj l
b) nombre
c) nombre [k]
d) nombre tzsl gs1
5) 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) 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) ;
7) Un aneglo tridimensionalse asemeja a una lista.
a) Verdadero
b) Fatso

Unidad 2: Arregrlos M"


46
@ 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.
Gua del Estudiante lntroduccin a la p macin con C

8) 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) x tot tol
9) Para un aneglo definido como fl_oar pt3l t3l , cul de los siguientes es un
uso inconecto?
a) P tol tol
b) p t1l t3l
c) p t1l t1l
d) pLrl L2l
l0) Qu define un aneglo declarado como inr rhree t"r) t2l Bl ;?
a) Un aneglo tridimensionaf
b) Un aneglo bidimensional
c) Un aneglo unidimensional
d) Un aneglo de 0 dimensiones

Volumen 3: Tipos de Datos gstruAulaos en i Unidad 2: Aneglos Multi0imensionales 4T

@ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln el permiso previo escrlto de tBM..
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
t ayb
od
T)b
8)d
e)b
10) a

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 Gua del Estudiante
o Introduccin a la p

o unidad 3: Lab. programar con Arregros


o
o
o Objetivos de Aprend izaje
o Alfinalde esta unidad, usted ser capaz de:
o
o ' Emplear tipos de datos estructurados en
fa sotucin de problemas
. Usar anegfos unidimensionales y bidimensionales
o . Aplicar areglos a problemas con matrices
o
o ' Manipular los elementos de un areglo tanto para
como areglos multimensionales aneglos unidimensionales
o
o
o
o
o

q
q
q
a
t?
?
I
t?
t?
I
O
i
?
Volumen S: np
F Unidad 3: Lab. progrmar con enegtos 49
b , -_ @ Copyright IBM Corp.20O2
p tos materiales del cufao no pueden'ser reproducidos
total
o parcialmente sin el permlso previo escrito de lBM.
.O
o
o
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
"i"""glo'Ji"iror*"
impares aparecen en.er tope se-guido 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
Escribir un programa que toma como entrada la entrada.
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
problema. sotuconar este
3) considere ef problema de sumar los elementos der borde de una matnzcuadrada
del ejercicio anterior. Escribir un. programa que ro haga,
estructura iterativa para sumar ros eremtos oet usando slo una
r0".

Undad 3: Lab. programar


50
@ 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.
olt
o
o Guia del Estudiante
amacin con C
o
o Unidad 4: Estructuras
o
o Objetivos de Aprend izaje
o Alfinal de esta unidad, usted ser capaz de:
o
oj* . Explicar cmo declarar estructuras.en C
o ' Discutir ef uso de las estructuras en la solucin de probfemas
programas en C
a travs
o . Describir el uso de los tipos de datos definidos por el usuario
o
o ' 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
o
o
o
o
t
o
t Volumen 3: Tipos de Datos gstructuraOos en C
Unidad 4: Estructuras 5i
@ Copyright tBM Corp. 2002
Los materiates del curso no greden ser reproducidos total
? o parcialmente sln el permiso previo escrito de lBM.

Io
lntroduccin a la Programacin con C
Gua del Estudiante

l. f ntroduccin
En fas undades anteriores, se discuti cmo dectarar tipos
de datos bsicosco[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


problemas.complejos en las cuafes se tenga que manipular ta solucin de
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
pero sta es una de las formas). De manera que, en ser el mismo tipo,
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,
matrimonio, ltima promocin y jubilacin. Estas pueden - ingreso at trabajo,
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 Gua del Estudiante
ramacin con C
o int dia_ultima_promocion, mes_ ul-tima _promocion, anio
o ultima_promocion ;
o inr dia_jubilacion, mes_jubj.lacion, anio_jubi1acion,.
o Las operaciones que se hacen con las fechas son todas comunes, no importa fa
fecha
o especficada, como por ejemplo 'Encontrar el nmero de das transcunidos' o ,eu
fecha ocuni ms temprano'. Las estructuras ayudan a alcanzaresta cohesin.
o
o 2. Definir y Usar Estructuras'
o-
Se puede definir una estructura en C como sigue:
o
o struct <nombre de 1a estructura> {
mi cmtrrn 1 .
o *ie*ro-Z;
o
o m]-errlDro_n;
o ),
o Aqu, la palabra struct es una palabra reservada mandatoria. El trmino <nombre
o de 1a estructura> es cualquier nombre (usando las reglas para la creacin de un
o identificador) que identifique ta estructura. Cada uno de los miembros, tal
como
o 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
O estructuras en s mismas. En el contexto de estructuras, los trminos Oefinicln y
o declaracin se pueden usar por igual. Se puede decir que se est definiendo una
o estructura o declarando una estructura sin ninguna dferencia especifica en el
significado.
o
o A continuacin se presentan algunos ejemplos.
o Ejemplo 4.1: Definir una Estructura
o struct fecha {
o Lnt' o].a;
a

o int. mes,.
o int anio;
o ];
o Esta es algo que ya se ha visto antes. Esta define una estructura llamad fecha con
o los miembfos dia, mes, y anio, todos los cuales en este caso, son enteros. Sin
o embargo, no se puede poner int dia = 28 o una defincin de estructura.
o Nota: Lo anterior slo define una estructur:a. Ninguna variable est declarada all. para
o declarar variables, se puede usar la siguiente declaracin:
o struct fecha nacimiento, ingreso_t,rabajo, jubilacion;
t
i
? Volumen 3: Tipos de Datos EstruAulrados en C
53
? .'
p @ Copyright tBM Corp. 2002
Los materiales delcurao no pueden ser reproducldos total
p o parcialmente sln elpermiso previo escrfto de lBM.
p
o
Introduccin a la programacin con C 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
plgleta que contiene tres miembros. Si se desea hacer referencia auna estructura
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
se puede hacer uso de los miembros de la estructura talccrno lo dict
.
(punto),
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
Gua del Estudiante
o Introduccin a la programacin co- C

o Ejemplo 4.2: La Fraccin Mixta como


una Estructura
o struct fraccion_mixta {
o 1nE parte_entera;
o int numerador,.
o I
int denominador,.
o l.
)a,B;
o A y B son variables de un tipo de
I
una estructura que es fraccion mixta. Esto
permte representar ftaccione's
a mixtas como p"i
parte-entera = 1, rlume rador = 3 y denominador b 1% en la estructura donde
"i.,]rp
o esto como t'nl?,,". = . Tambin se puede definir
a t
o parte_ent.era,.
1nE.
o int numerador;
o int denominador;
Or )e,B;
oi Note que se ha omitido <nombre estructura>,
el cuaf es opcional. Las variables
Or creadas A y B, tienen ras mismas propiedade,
il;
Jlnni"on anterior.
ol Fin def Eemplo 4.2
o
o Ejemplo 4.3: Nombres de personas
o se sabe que generafmente los nombres de las personas
o nombre' segundo.nombre se registran como
y apelfdo. se puede oennirLna estructuia
primer
o con el primer nombre, segundo nombre y
apeilido como miembros.
llamad nombre,

a sLruct nombre {
a cnar primer 120) ;
o char segundo [20] ;
o char apellido [a5] , '
o )miNombre,.
o Note que los miembros son anegfos, y cadauno
t tamao' se pude acceder al apetlido de
miNombre-apellido. ste es, sin embargo,
de ellos puede ser de cuafquier tipo y
ra variable miNombre @rno
a acceder a las partes individuales se
un anegro de caracteres. se debe
t entero de o a +q .
usa miNombre.apellidolkl , donde k es un

tT 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
a
j
valores si la apticacin fo requiriere. cmbiar estos
ote que esta eiiructura tiene miembros,
cuales son anegfos de tipo char. Por general, todos los
lo lo las estructuras pueden tenermiembros
de diferentes tipos, etlos tambin puedn
io ser'"rgo-"ir1"res se mostr en ef
"omo
rt Volumena:npos@
b
p 55

. __
ros Q CopyrighilBM Corp.2002
Ir materiares der curso no pueden'ser reproducidos
total
p o parcialmente sin ef permlso previo
"rt
ito de lBM.
o
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 {
nombre *r*o*ta, .
"ttrrat
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. \', rr\.
f lll

/* Imprimir el segundo nombre a Ia salida estndar * /


printf (', ?" n, p. miNombre. segundo) ;
/* Se imprime un espacio despus de1 segundo nombre *,/
7ihf f /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 56

@ Copyright IBM Corp. 2002


Los materiales delcurso no pueden ser reproducidos en parte
o en su totaldad sin el previo permiso escrito de lBM.
of
o
Gua del Estudiante
o Introduccin a la p ramacron co:
o printf ( "?s1,,, p. segunda_linea) ;
o ,/* f mprimir 1a caf l-e a 1a saf ida estnd ar * /
o printf ( ', ?s1u , p. ca11e) ;
o ,/* fmprimir el rea a la salida estndar */
printf (', ?s1u, p. area) ;
o
,/* rmprimir e1 nombre de 1a ciudad a la salida est.ndar */
o printf (n?s1u,p. ciudad ) ;
o /* fmprimir e1 cdigo postal de la ciudad a
O,
" la sal_ida est.ndar *,/
o printf (,'?s1u, p. codigo3ostai) ;
o /* rmprimir eI nombre de1 pas a la salida estnd ar * /
o printf ( "?s1u,p.pais) ;
o Ef cdigo C finaliza aqui
o Esto ilustra como trabajar con estruturas en una situacin de programacin.
o mprimi cada miembro de la estructura direccion correo como
Se
cadena usando el
o especificador de formato ?s.
o Fin del Ejempto 4.4
o
o Ejemplo 4.5: Registro de Estudiante
o struct estudiante {
o struct. nombre nombre_estudiante ;
o char num_id [9] ;
o struct fecha nacimiento,.
o float peso;
o float altura;
o int iq,-
)filosofia [100] ; t
o
o 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
o definido anteriormente,
con membros. Se puede referir al ao de nacimiento al iq del primer
o esta cfase como sigue:
! estudiante en

o filosof ia [0] . nacimiento. anio


o f j_1osof ia I01 . iq
O Ul" estrucfura puede contener cualquier nmero de membros, los cuales son
O estructuras en s mismas. Es tambin posibte tener varios
niveles de estructuras
a anidadas dentro de una estructura. Por ejemplo, to siguiente
vlida de una estructura:
sera una declaracn
o
t struct externo {

o
I Volumen3:TiposOe@ 57
@ Copyright tBM Corp. 2002
I Los materiales delcurso no pueden ser.reproducldos total
a o parcialmente sln el permlso prevlo escrito de lBM.

o
Gua del Estudiante
struct nivel,l {
struct niveL2 {
struct nivel3 {
int k,.

]r; //pin de la oe"r".]cin de 1a estrucrura 3

I r ^ t t
I L; // -,
r, ].n Oe f" aecfatacin de La estructura 2

i fr; // fin de 1a decl_aracin de Ia estructura 1


l / / pin de la decl-aracin de la estrucEura exEerna
En una decfaracin tan profunda
como fa anterior, se deben tener cuando se accede
un miembro de la estructura. Para acceder a la a
nivel3, se debe hacer lo
k decfarada
variable L vvv's'qvq en struct
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


defincin de fa estructura ms intema se es que la variable de la
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
declarar variables de las estructurai rrlnt"r"
y no hay_ forma que se puedan
principal.
f;;'oe ra definicin de ra estructura

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 en la declaracin misma como muestra a
continuacin:
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
Gua del Estudiante
o lntroduccin a la Proqramacin con C

o =
'
o " 1"-i;.::":",
o a.denominador = 4

o Esto es justamente una representacin de la fraccin mixta 1%. Tambin


se puede
o declarar la variable de la estructura separadamente e inicalizar los valores
programas como sigue: a travs del
o
o struct fraccion mi.xta { .
int partelr"t",
o int numerador,.
o int denominador;
o )";
o a-parce_entera = 1,.
o a.numerador = 3;
o a.denomi.nador = 4,.
o Fin del Ejempto 4.6
o
Ejemplo 4.7: Sumar Dos Fracciones Mixtas
o
o Asuma, que se requiere tomar dos fracciones mixtas como entrada, sumarlas
y mostrar
o el resultado. Sean las dos fracciones mixtas A = a3A y B
= 1% respectivamente. para
o sumarlas, se debe primero convertir los nmeros a la forma numerador/denominador.
o r%= (4*1+3) /4__7/4
o Esto es lo mismo que
o (denominador * parte_entera + numerador) denominador
o /
o Con esto, se tienen ambos A y B como 7 / 4. El denominador es comn, as que el MCM
o es4.Porlotanto, 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
o es el numerador como mdulo de divisin). El MCM p"*"nu como el
o denominador.
o El siguiente es el algoritmo para sumar dos fracciones mixtas:
o
o . Paso 1: Declarar fas fracciones mixtas a y e
o o Paso 2: Ingresar las dos fracciones mixtas positivas y vatidarlas

o . Paso 3: Covertira a la forma de fraccin impropia x


o . Paso 4: Convertir e a la forma de ftaccin impropia v
o r Paso 5: Encontrar el MCM de x y v
o o Paso 6: Formar 2=((MCMtx.denominador*)x.numerador +
o (MCM/v.denominador)y. n um erador)/M CM
o
o Volumen 3: Tipos de Datos gitructuraos en C
59
o @ Copyright tBM Corp.2002
o Los materiales del curso no pueden ser reproducidos totat
o o parcialmente sln el permiso previo escrito de lBM.

o
Gufa del Estudiante
o Paso 7: Convertir z en ta fraccin mixta c
o 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


(positivo) fracci_n
\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
Los materiales delcurso no pueden
Corp. 2002
ser reproducidos en parte
o en su totalidad sin el prevo permiso
escrito de lBM.
o
o F
i Gua del Estudiante
o Introduccin a la Prooramacin con
o /* Obtener la enLrada de1 usuario para ef denominador
o de 1a fraccin * /
o printf ( t'Ingresar e1 primer denominador\n,') ;
o do{
o scanf (u?du, &A.denominador) ;

o ) while (A.denominador <= 91,


o ,/* Obtener los datos a"f ,rrrr".io para formar
o 1a segunda fraccin mixta B* /
o ,/* Obtener la entrada de1 usuario para la
o, I
parte ent.era de l_a fraccin * /
o print.f ("fngresar 1a segunda parte entera\n,r) ;
o do{
o ( " ?dil, &8. parte_entera),.
scanf'
o ) while (B.parte_enLera <= 0);
o /* obt.ener la entrada del usuario para e1 numerador
o de la fraccn * /
o printf ( "Ingresar e1 segundo numerador\n" ) ;
o do{
o scanf ( u?du, &B.numerador),.
o ) while (B.numerador < 1);
o
o /* obtener 1a entrada de1 usuario para eI denominador de
o Ia fraccin */
printf ("fngresar e1 segundo denominador\n,,)
o ,.

do{
o scanf (u?du, &B.denomirador),.
o ) while (B.denominador <= O)
o ,.

o /* Convertir 1a primera fraccin mixta (A)


o a una fraccin impropia para formar X * /
o if (A. numerador ! = A. denominador) {
o x-numerador = A.parte_entera 'r A.denominador + A.numerador;
o X. denomi-nador = A. denominador,.
o ]
else {
o
X.numerador = A.parte_entera;
o X.denominador = 1;
o I
l
o
o Volumen 3: Tipos de Datos gitruaulaOos en C
61
o
t @ Copyright tBM Corp. 2002
Los materiates del curso no pueden sr reproducldos total
IO o parcalmente sln lpermlso prevo escrito de lBM.
o
lntroduccin a la programacin con C 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;
]

/* Determinar eI X e Y */
MCM de
/* 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 */

/* 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;

mcd = v;
a'l ca

mcd = u;
]
,/* 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


62

@ Copyright tBM Corp. 2002


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el prevo permso escrito de lBM.
o Tt
o .t
o Gua del Estudiante Introduccin a la Programacin con C
o ,/* rmprimir C en la salida estndar cuando resulte en un nmero
o entero *,/
o* /* Manejar casos especiales de una fraccin aqu */
if (C.numerador == C.denominador)
o print.f ('rEl resultado es td\n", C.parte entera) ;
o else i
o /*imprimir Ia fraccin mixta C a la salida est.ndar*/
o printf (',E1 result.ado es ?d y Zd / ?d\n,,, \ C.parte_entera,
o C.numerador, C. denominador) ;

o ]
o )
/* La funcin main termina agu */
o
El cdigo C termina aqu
o
o Fin del Ejempfo 4.7
o Este programa es un poco largo, pero bastante directo. Se ha refnado
o pasos en el algortmo en un conjunto de sentencias que
cada uno de los
los implementan.
o
Ejemplo 4-8: calcular el promedio de Notas de los Estudiantes
o
o Para reforzar la cmprensn del uso de estructuras en la solucin
de problemas,
o consdere el ejemplo de cafcular el Promedio de Notas de los
Estudiantes de una clase
en particular de una universidad
o
o En una clase, asuma que hay un mximo de 100 estudantes. cada
estudiante est
o registrado en los msmos seis cursos en un semestre. Alfinal
del semestre, el instructor
o asigna letras de cafificacones de la A
a la E para todos los seis cursos de cada
estudante. cada uno de los seis cursos es de 3 nidades (horas
o creoiio eipromedio
de Notas de los Estudiantes se calcula en una escala de 10 puntos. para
hacer esto, los
o siguientes son es la notas asociada con cada uno de las clalificaciones
en letras:
o A 10
o B 8
o C 6
o
D 4
o
E 2
o
o Asuma que un estudiante obtiene las siguientes calificacones
en los ses cursos:
o Curso 1 A
o Curso 2 D
o Curso 3 B
o Curso 4 A
o
o Volumen 3: Tipos de Datos estructuraOos en C
63
o @ Copyright tBM Corp. 2O02
o Los materiales del curso no pueden ser reproducldos total
o o pardafmente sln el permlso preo escrfto de lBM.
o
Gua det Estudiante
Curso5 A
Curso 6 E
Aqu, el Promedio de Notas derEstudiante se
carcura como sigue:
(10 "3 + 4" 3+ 8 " 3 + 10 *3 + 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
(unidades del curso) y dividirlo por el nmero de cada curso, multiplicalo por 3
tota e unidades. El siguiente es el
algoritmo para solucbnar este prl"ma,
o Paso r: Decrarar una estructura para er registro
der estudiante
' Paso 2:Decrarar un anegro de 100 estudiantes para
fos registros
o 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 1os
registros */
struct registro_estudiante {
char noid [9] ;
char nombre [50J ;
char grados [6] ;
float pn;
) i.isra [100] ;

Volumen 3: TiposOeffi
64
@ 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.
:r
e)' I Gua del Estudiante Introduccin a la Prooramacin con C
o /* Declaracin de Variables * /
o ir acl- f. i
rI num'

o,- double pn;

ort
o,
,/* Obt.ener como entrada de1 usuario el nmero de
esEudiantes * /
e printf("fngresar e1 nmero de estudiantes < 100\n',)
C do{
o scanf (r*d",&n_es:),'
o ) while (n_est < 1 ll n_esc > 1OO)

o.
o" ,/* Obtener del usuario l-as entracas ace:ca de todos
o los estudiantes */
o for (k = 0; k . n est; k++) {
nrin1. f l,,t-o]o. r d,al--q r: Y;
o k + l-);
=

o ,/* Obtener 1a ent.rada del usuar:c cer ::c:c 'r'


o printf ( " Ingresar e1 NOID (max t ca:c:eres ) : \n" ) ,.

o scanf ( u?sn, 1ist.a IkJ . noid) ;


o /* Obtener como entrada de1 usuaric ej :,::-.-::e -,,
o printf ("Ingresar el nombre (me:1o: a 5C,
o caracteres) : t,) ;
o scanf ("?"u, lista Ik] .nombre) ;
o ,/* Obtener como entrada del- usua::c :=:a .:::: oe los 6
cursos */
o for(j=O;j.6t1++){
o f f lush (stdi-n) ;
o printf("Ingresar Ia nota iei el Curso \
o [A-E]: ?d\h",1+I);
o do{
o scanf (rr?cr', &1ista [k] .grados Ij] ) ;
o ] while (toupper (lista [k] . grados t j I ) < ,A, \
o | | toupper (lista lkl . grados tj l ) > 'E' ) ;

o t
o ,/* Todas las entradas realizadas para todos
o 1os estudiantes */
o
o /* Calcular el Promedio de Notas para todos 1os estudiantes
O
for (k = 0; k < n_es; k++)
o {

! Volumen 3: Tipos de Datos Estructurados n C 65


o @ Copyright IBM Corp.2002
o Los materiales del curso no pueden ser reproducldos total
I
o o parcialmente sin el permso previo escrito de lBM.
o
o
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;
]

Calcular e1 promedio de Notas de1 estudiante */


P LI = (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
'nrneros mgcos'. 30, 24, 18, et promedio de Notas, se usaron fos
12 6. ;.
respectvas carificaciones de ta A a ra ,
t ;";';s
notias asocadas con fas
murtipt*d* g
i unoaes iei;;]o, 30 = 10
" 3, 24 = 8 * 3 etc.). Dado que, num es de'tipo entro, antes
convierte al tipo f loat.
w w'vq'qr
carcular c
er gpa, s -

Volumen arfip
66

. @ Copyright tBM Corp.2O02


Los materiales delcurs no pueden >. ,,".
en parte
",,efroOr"idos
o en su totalidad sin el previo permiso escrito de tBM.
o
o
Gua del Estudiante
o macin con C
o Este ejemplo lustra el uso de estructuras, declaracin y sus
usos en un programa.
o Fin del Ejempto 4.8
o
o f 3. Tipos de Datos Definidos por el Usuario
o ' .'
C permite al usuario definir sus propios tipos de datos. La sentencia rypedef
o i los usuarios definir nuevos tipos de datos.que son equivalentes ri iipos
permte a
o de datos
existentes. un nuevo tipo de dato puede ser definido como sigue: "
o typedef tipo-existente nuevo_tipo,.
o
oi Aqu,tipo-existente se refiere a cualquier tipo de dato estndar como int, char,
I float u otros tipos de datos definidos por ef usuario previamente que estn
Ot disponibles. El nombre del nuevo tipo de dato definido por el usuario
es nuevo-ripo,
ol siguiendo las reglas para formar identficadores. Esto es slo un nombre nuevo
dado a
e 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.
o decfaracin:
Note la siguiente
o t.>edef int anio;
o
La declaracin anterior define un nuevo tipo de dato llamado anio
a a int . Con esto, se pueden declarar variables como sique:
que es equivafente
o anj_o A, B, miNacimiento;
a
o Se puede usar el typedef anterior y declarar las siguientes variables tambin:
o anio X[50j, y[50];
o Este declaraxy Y como arreglos del tipo anio, los cuales son realmente un arreglo de
o enteros.
o se pueden tambin decrarar equivarentemente ro siguiente:
o typedef inr anio[50];
o anio X, y;
o
o A continuacin se presenta cmo se hace uso de la sentencia typedef con
estructuras:
o
typedef struct
o {
miamhra 1 .
o mlemro Z;
o
O miembro_n;
o ) nuevo-tipo,.
a Se puede usar este mtodo para definir un nuevo tipo, tal como se muestra
o continuacin:
a

o
o Volumen 3: Tipos e Datos Estruct[EdG]d 67
o @ Copyright tBM Corp.2002
o Los materiales del curso no pueden ser rcproducidos total
o parcialmente sin elpermiso previo escrito de lBM.
o
o
Powered by TCPDF (www.tcpdf.org)
oilF
o
o 't' Gua del Estudiante Introduccin a la Programacin con C

o Se definen tres variables a, b, y c, las cuales son uniones. En la unin, se han definido
o tres variables x, y y z (cada una de un tipo difererente). Cuando se considera la variable
O,., 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
Ol ,
memoria. Tambin, note que un inr ocupa ms mernoria que un char, y un float
o' ocupa ms memoria que un int. Existen muchas cosas de mantenimiento que deben
o hacerse cuando se usan uniones, pero todo esto es tomado en cuenta por el
compilador
o
O* Los miembros de una unin pueden ser de cualquier tipo de datos, aneglos o
t 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
o realizar lo siguiente para hacer referencia a un miembro de una unin:
iuede
o a.x
o b.z
o Por lo tanto, una unin en C es bastarlte semejante a una estructura. El uso de unin
o depende de s ef ahorro de espacio es vital para la aplicacin.
o
o
o
o
a
o
o
O
o
o
o
a
o
o
o
o
o
a
o
o
O
o
o
O Volumen 3: Tipos de Datos Estructurados en C 69
o @ Copyright tBM Corp.2002
o Los matedales del curao no pueden ser reproducidos total
o o parcialmente sin elpermiso previo escrito de lBM.
t.'
o
o
Introduccin a la programacin con C Gua del Estudiante

Resumen
Ahora que ha comptetado esta unidad, usted debe ser capaz
de:
. Explicar cmo declarar estructuras en C
o Discutir el uso de las estructuras en la solucin de problemas a travs de
programas en C
o 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 70

@ Copyright tBM Corp.2002


Los materiales delcurso no pueden ser reproducidos en parte
o en su totalidad sin el previo permiso esctito de lBM.
ol
o
o Gua del Estudiante Introduccin a la Programacin con C
a
o Unidad 4: Examen de Autoevaluacin
o l) Cules de las siguientes son una definicin correcta de una estructura?
o a) srrucr {
o int x;
a float y;
o lr
Jt

I b) strucr {
o int x;
o ' float y;
o Ia,b;
O
C) strucr {
int a;
o float y;
o ) -, b,'
o d) Todas las anteriores
o 2) Al igual que los areglos, las estructuras no pueden contener mltiples elementos
o de datos de diferentes tipos.
o a) Verdadero
o b) Falso
o 3) pueden ser parte de una estructura.
o a) Constantes de cadena
o b) Variables enteras
o c) Constantes enteras
o d) Constantes carcter
o 4) Cules de los siguientes tipos de datos son vldos dentro de una declaracin de
unin?
o
o a) Tipos de datos primitivos
o b) Tipos de datos definidos por el usuario
o c) Ambos (a) y (b)
o d) Ninguna de las anteriores
o 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
o estructuras?
o a) a, b, cyd
o b) a, byc
a c) ayb
a d) Slo a
al-t
!tIt 71

.l . @ Copyright lBMCorp.2002
Los materiales del c{rso no pueden ser reprcducidos total
T
tr
o parcialmente sin el permlso preo escrito de lBM.

ft
o
Introduccn a la programacn con C Gufa det Estudiante

O Considere fa siguiente definicin de una estructura.


qi-rrr-f (

inE x;
float y;
) a, b,-

Es vfida la asignacin a. x = a.y;?


a) Verdadero
b) Falso
7) La sguiente es una definin vrida de un tipo estructura
t.ypedef struct {
int x;
float y;
) rnipropia;
a) Verdadero
b) Falso
8) 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) 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 ,

l0) 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 Gua del Estudiante
amacin con C
o c) union u {
o int x,-
o float y,.
o char z;
o I

a 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 r ciu"r-+lo 3: Tipos de Datos Estructurados en C
73
o
@ Copyright IBM Corp. 2002
o Los materiales del curso no pueden ser reproducldos total
o o prcialmente sin elpermiso previo escrito de tBM.
o
o
Introduccin a la programacn con C 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 i 74

@ 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. a
$

lntroduccin a la Pr ramaclon cc-


Gua del Estudiante
*
q
o unidad 5: Laboratorio de Estructuras
o
a Objetivos de APrend izaie
I
Al final de esta unidad, usted ser capaz de:
o
o . Usar estructuras en una situcin de soluin de
problemas

. de estructuras
o Desanollar algoritmos para un problema que involucra el uso
. que usa estructuras
o 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 UnlOaO S: taUoratorio de Estructuras 75
Vol"men 3:Tlpos de Datos Estructurados en C
o @ CoPYright IBM CorP' 2002
o Los materiales del crso no pueden ser reproducidos total
o o parcialmente sin el permiso previo escrito de IBM'

o
O
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,
flTulrrJf;r." y

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
detalles de fos mismos. i
tbro. muestre tos

Unidad S:
76

,t-os . .
_, .
^^ materiales
@ Copyright tBM Corp.20o2
del curso no pueden sr reproducidos en parte
o en su totalidad sin el previo permiso
escrito
de tBM.
a-
Introduccin a la
nl-xF
I-I---
I TAT
Programacin con C
rI:-t
r-xtt-
(Codigo del Curso: CY320)
-m ItI (p
- Versin 2.0
--

Gua del Estudiante

Volumen 4: Funciones en
c

fBM Learning Services


Worldwide Certified Material
Informacin de Pubticacin

Esta publicacin ha sido producida usando Microsoft Vrrd 2000 y Microsoft


PowerPoint 2000 para Windows.

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 i
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 I

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,. Gua del Estudiante lntroduccin a la programacin con C
o
o
o :a Contenidos
oli Unidad l: Funciones
oj t Objetivos de Aprendizaje 1
ol 1. Introduccin 2
Or .
I
2. Programar Funciones en C 3
o;
3. Definir y Usar Funciones en la Solucin de Problemas
o 3

o 4. Clases de Almacenamiento 20
o 5. Caractersticas de las Clases de Almacenamiento 25
o Resumen 26
o Unidad l: Exmen de Autoevaluacin 27
o Respuestas a la Unidad '1: Exmen de Autoevaluacin 29
o Unidad 2: Laboratorio de Funciones 3l
o Objetivos de Aprendizaje 31
o Ejerccios de Laboratorios 32
o
Unidad 3: Recursin
o
o Objetivos de Aprendizaje 33
o 1. Introduction u
o 2. Escribir Funciones Recursivas 35
o 3. Recursin vs. lteracin 48
o Resumen 49
o Unidad 3: Exmen de Autoevaluacin 50
o Respuestas a la Unidad 3: Exmen de Atoevaluacin 52
o
Unidad 4: Laboratorio de Recursin
o
o Objetivos de Aprendizaje 53
o Ejercicios de Laboratorios u
o
o
o
t
O
3
T
ir
t?
t]
ta
lt

o
T
or
ori Gua del Estudiante Introduccin a la Programacin con c
o
o
o Unidad 1: Funciones
oi
oi
o Objetivos de Aprend izaje
o Alfinalde esta unidad, usted se capaz de:
O . Explicar la naturaleza y usos de las funciones

o . Describir algunas funciones incorporadas de C, y cmo se usan


o . ldentificar las diferentes partes del encabezado de una funcin
o . Describir los diferentes tipos de argumentos
o . Definir los prototipos de funciones y sus usos
o . 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
o
o
o
t Volumen 4: Funciones en C Unidad 1: Funciones en C I
a
@ Copyright IBM Corp.2002
Los materiales delcurao rio pueden ser reproducidos total
r o parcialmente sln el permiso previo escrito de IBM
ro
o
Introduccin a la Programacin con C Gufa del Estudiante

1. Introduccin
En el Volumen 2 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 printf
. scanf
. toupper
o sqrt
Considere la funcin main ( ) . sta usualmente no tiene ninguna entrada sobre la cual
trab$ar. La funcin printf, 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 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 C 2

@ Copyright lBM Corp.2002


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM


?r
OF
oi$ Gua del Estudiante lntroduccin a la Programacin con C
o'
o
2. Programar Funciones en C
Q*
C permite a los programadores definir sus propias funciones para llevar a cabo una
:
:t
!
tarea bien definida. Esto se conoce como funciones definidas por el usuario. Algunas de
las caractersticas de C con relacin a las funciones son:
. Permite a los usuarios definir funcione.s definidas por el usuario.
r'{ .
a' .
Ofrece un mecanismo para pasar entradas a la funcin.
Ofrece un mecanismo para aceptar las entradas pasadas y luego procesarlas.
O*
o . Ofrece un mecanismo para retomar un solo valor como resultado.

o . Ofece un mecanismo para tomar en cuenta numerosas tareas intemas que


pueden estar involucradas en el proceso de invocar una funcin, transferir el
o control a la funcin, ejecutar la funcin y retomar a la funcin que la invoc
a Pero permanece la pregunta, Por qu. se deben usar las funciones? Las funciones
o tienen numerosas ventajas. Algunas de ellas son:
o . Permite desmmponer un programa grande en partes ms pequeas,
O manejables y autocontenidas. Esto se llama modularizacin. La modulanzactn
se puede lograr en C slo a travs de las funciones. Ellos proporcionan una
o claridad lgica a los programas al descomponer un programa grande en
o pequeas unidades.
a . Ayudan a evitar repetr la programacin de las mismas instrucciones que
o necesitan otros programas o partes de un programa.
o . Ayuda a los programadores a construir sus propios conjuntos de funciones en
una librera personalizada.
o
o . Permiten que porciones del programa que son dependientes de la mquina sean
separadas de las otras, para facilitar la portabilidad de los programas.
o
Una vez entendida el por qu las funciones son necesarias, se va a continuacin a dar
o una definicin de funciones y aprender a usarlas en fa resolucin de problemas.
a
o 3. Definir y Usar Funciones en la Solucin de Problemas
o
Primero se aprender en qu consiste una funcin, de manera que se pueda definir
o una funcn. Una funcin mntiene dos partes principales:
o . Encabezado de la funcin
O
. Cuerpo de la funcin
o
Una encabezado de funcn contiene lo siguiente:
o
o . Especficacin del tipo delvalor a ser retomado por la funcin.

o . Un nombre de funcin (siguiendo las reglas para crear un identificador).

o . Un conjunto de argumentos (dato pasado como una entrada a una funcin) que
estn separados por comas.
o
o Volumen 4: Funciones en C Unklad 1: Funciones en C 3
o
I

@ Copyright IBM Corp. 2002


Los materiales del q.rso no pueden ser repioduddc total
p o parcialmente sln elpermlso previo escrito de IBM
o
o
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 Sentencias de asignacin
. Sentenciascompuestas
o Llamadas a funciones
. Cualquier sentencia vfida
El cuerpo puede contener cero o ms sentencias return. Las sentencia return
ayudan a pasar el valor del resultado nico al programa que hizo fa tlamada.
La forma generalde la sentenc rerurn s 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 C 4

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de tBM
o
O
o Gua delEstudiante Introduccin a la Prooramacin con C
O
o . La sentencia return se usa cuando hay mftiples condiciones verflcadas en
o una funcin y la funcin debe finafizar su ejecucin, cuando una de sus
o condiciones se satisface. El siguiente segmento de codigo ayudar a entender
o esto claramente:
void Nombre_de_la_Funcion(int x, int y, int z) {
if (*'") {
sentencias;
retrurn,.
1
)

a' else if (x t z) {
a sentencias;
a ral-rrrn.

O )

o
o .
)
Se considera una buena prctica de programacin insertar una sentencia
o return an cuando hay un solo punto de retomo en la funcn.
o En todos los programas en este curso, la funcin main tiene el tipo de retorno void y
o no se usa explcitamente la sentencia return. Se puede, sn embargo, aadir la
o sentencia durante la ejecucin en un computador. La sentenca return causa que el
o 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
o tener una o ms sentencias return. A continuacin se presentan algunos ejemplos.
o
o Ejemplo 1.1: Determinar el Mximo de Dos Nmeros Enteros
o int max(int x, int y) {
o j_f (x >= y)
o return (x) ; t
el-se
o rl.!1rn lrrl .
o \I
' '

o '
o se enne una funcin llamada max que retorna uo int como resultado.
o El cuerpo de la funcin es bastante simple, dado que slo verifica cul de las variables
o es mayor y retoma el valor.
o
Fin del Ejemplo 1.1
O
o
o
i
,
Volumen 4: Funciones en C Unidad 1: Funciones en C 5
)
@ Copyright IBM Corp. 2002

II
t
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermlso previo escrito de IBM

o
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); /* veRoADERo si es impar */
e 1se
ral-rrrh /n\ .
\v I t /* rar,so si no es impar */
)

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 Recuerdelo que 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 - 'a'
ser cero, de este modo se retornar
+ return (in .a,
;
'A' ) retomar slo 'A' . S en tiene el carcter . B, , entonces el valor retomado ser
'A' + 1, l cual es 'B'
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 3-
Construcciones lterativasque hace la
misma tarea.

Fin del Ejemplo 1.3

Ejempfo 1.4: Determinar er Mximo comn Divisor de Dos Enteros


int mcd(int x, j-nt. y) { a
>

while (x l= 0 && y t= 0) {
:

if (x r= y) ?

{
:
Unidad l: Funciones Volumen 4: Funciones en C 6

@ Copyright tBM Corp. 2002


Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
oF
o,'
O; '
Gua del Estudiante Introduccin a la Programacin con C

o
o x = xZy;
q. else
q: y = y*x;
a: )
a if (x == 0)
return (y) ; /*y es mcd*,/
a
a; e1 se
return (x) ; /*v ac m* /
a
)
o
Fin del Ejemplo 1.4
o
o Ejemplo 1.5: Determinar el Mnimo Comn Mltiplo de Dos Enteros
o int mcm(inE x, int y) {
o return ( (x " y) / mcd (x,y) ) ;
o )

o Como se observa, estia es una funcin muy compacta. La funcin explota el hecho de
o que el MCM de dos enteros es el producto de los dos nmeros enteros dividido entre su
o 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:
o
o ( (x " y) / mcd (*,y) )

o La presencia de la funcin en la expresin implica que se invoca a la funcin y sta


I 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.
o
o Fin del Ejemplo 1.5
o Ejemplo 1.6: Determinar el Factorial de un Entero
o
int factorial (int x)
o int k,fact;
{
/* variables locales */
o fact = 1;
o if (x == o ll x == 1)
o return (1); /* I es e1 resultado */
o else {
o for(k = 2; k <= x; k++)
o fact=fact*k;
o return (facE);
o
to
i
)
Volumen 4: Funciones en C Unidad l: Funciones en C 7

@ Copyright IBM Corp. 2002


Los materiales delcurso no pueden ser reproduddos total
? o parcialmente sin el permiso prevo escritode IBM 4
o t

o
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
-Una la
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 iIler
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
parmetros actuales. Existe una corespondencia uno-a-uno de la ist y o
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.
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 Paso 1: Deflnir una funcin primo ( int x) que verifica si x es primo o no
. Paso 2: lngresar y validar mrira
o Paso 3: for (todo k desde 2 a NUM)
if (primo (k) == VERDADERO)
prinE k; .
Basado en este algoritmo, se puede escribir et program a para generar los nmeros
primos entre z yNUM, como sigue:

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 = VERDADERO;

Unidad 1: Funciones Volumen 4: Funciones en CI


@ Copyright IBM Corp.2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM
F
% Gua del Estudiante Introduccin a la Programacin c:^ ,
-.-
o while (k .= x-1 && contj-nuar == VERDADERO) t

'lr
^t
if (xBk==0)
x-1r cont.inuar = FALSO;
e1 se

fl& ,
t
*.** t

I*
if (continuar == VERDADERO)
return
tt
-I

e1 se
(VERDADERO);

q; return(FALSO);
o )
o /* La f rrn i n m i n amni aza att * I/

o main () {
o inf rrh i

o printf("Ingresar un nmero positivo \


o hasEa el cual se desea comprobar \
' si exisEen primos " ) ;
o
/* Aceptar fa enErada desde el usuario */
O oot
o scanf (u?du,&num),'
o /*Yerifcar gue e1 nmero ingresado es
o positivo o no */
o if (num<=0 | | num>32?6?) {
o print.f("Ingresar un nmero menor \
qve 32767 \n" ) ;
o
)
o
)whi1e (num<=0 | | num>32?67) ;
o
I prinEf ( "Los Nmeros Primos son: \n ");
o for ( = 2; i <= num; i++)
I f (primo(i) == VERDADERO)

t printf ( *3d\t", i) ;

-LI ra|-rrrn l1 I .

tI
-l
)
/* La funcin main termina agul */
rt
tl
El cdigo C termina aqu

-IE
-t
Volumen 4: Funciones en C Unidad l: Funciones en C
T 9

@ Copyright IBM Corp.2002


II Los materiales delcurso no pueden ser reproducldos total
o parcialmente sin elpermlso prevo escrito de IBM
E
t
o
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 O

:-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
I

/* 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); k++)
poswt=poswt*10;

,/* aplicar e1 proceso de comparacin */


guardar = ; /* Tomar una copia d.e x */
cont.inuar = VERDADERO; I
while (guardar != 0 && cont.i-nuar == VERDADERO) {
/* Algito izquierdo *,/
izguierdo = guardar / poswt;

Unidad l: Funciones Volumen 4: Funciones en C lO

O Copyrght IBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM
*
I
or
o
o; Gua del Estudiante Introduccin a la Programacin con C
o
o derecho = guardar Z L0; /* dgito derecho */
o. if (izguierdo == derecho) {
oi /* Nuevo x como izquierdo, derecho sacado*/
o guardar = (guardar t poswt) / i-0;
o poswE = poswt / l.oo;

o )/"rin de1 if *y'


else
o continuar = FALSO;
o )/*rin de1 else*,/
o return (continuar);
o /"Fn de la funcin palindrome */
o
o main (void) i
o int num, continuar;
o
o /* Tomar Ia entrada de parte de1 usuario * /
printf ( "fngresar un nmero entero positivo menor \
o qwe 32767:") ;
o scanf (u?du,&num),-
o
o /*verificar que eI nmero dado es posit.ivo o no */
o if (num<=o I I num>32767) {
o print.f("*d no es un nmero entero positivo ",num)
o nrintsf /rr\ n 9 oc r\'^r ,,6 ?2767\n",num);

o )

o else {

o /*fnvocar 1a funcin palindrome para werificar


si una entrada dada es palindrome o no * /
o continuar = palindrome (num) ,.

o
o if (conLinuar == VERDADERO)
o printf ("?d es un palindrome \n",num),-
o else
o printf(utd no es un palindrom\ri",num);
o )/*rin de1 else*/
o )/*ri-tr del main*/
o El cdigo C termina aqui

o
o
o Volumen 4: Funciones en C Unidad 1: Funciones en C l1
o
@ Copyright IBM Corp.2002
o Los materiales del curso no pueden ser reproducidos total
o o parcialmente sn elpermlso previo escrito de IBM
o
o
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
?)1,:..'i"rd."r. El peso posicional de este dgito es 10ndsit-r y'divdieno-ef nmero entre
'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-- ;
) /*rin del for*,/
reC.urn (continuar) ,.

Unidad 1: Funciones Volumen 4: Funciones en C 12

@ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso prevo escrito de IBM
:r
o
Gua del Estudiante

)) t,/*Pi n de na I i ndrome*
vrrre //
Introduccin a la proqramacin con C

main (void)
:tt {
int. num, cont.inuar;
/* Tomar 1a entrada del usuario */
printf ("fngresar un nmero ent.ero positivo: r');
scanf ( t' ?d,r , &num) ; '

Ia * T ,/*Verificar si e1 nmero dado es positivo o no */


if(num > 0 && num<32258) {
I a /*fnvocar La funcin palndrome para verificar
o si una entrada dada es palndrome o no */
o conLinuar = palindrome (num);
o if (continuar == VERDADERO)
o printf ( " *d es un palindrome\n', , num) ;
1se
o e

printf ("*d no es palindrome\n",num)


o J/*r.;n
t r Aal
ss :F*/ /
r
;

o else
o printf("Ingresar un numero > 0 y < 32768\n ");
O ]/*Firr de 1a funcin main*,/
o El cdigo C termina aqu
o
o 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 -
o resolucin de problemas. Mentras en el primero caso se usaron slo lazos para llegar a
o la solucin, en este se usaron arregfos.
o End of Example 1.8
o
Ejemplo 1.9: Determinar que Nmeros primos son palndromes
O
o En este ejemplo se har uso de fas dos funciones ya disponibles para escribir un
o programa que verifique por los nmeros primos que son tambin palndromes.

? El cdigo C comienza aqu...


t
tt
#include <stdio.h>
#define VERDADERO 1
#define FALSO O
I
? main O {
ot inE num,.
printf("Ingresar un nmero positivo < 3276g2 n);
o
Volumen 4: Funciones en C 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, &num) ;
] while (num <= 9 | num>32767) ;

/* verifcar si e1 entero es un nmero primo asf como


tambin un pa1ndrome */
if (primo(num) == VERDAnERO &&
palindrome (num) == VERDADERO)
printf("td es tanto primo como palindrome\n,,,num);
else if (primo(num) == VERDADERO &&
palindrome (num) == FALSO)
printf("?d es primo, pero no un palindrome\n,,,num)
else if (primo(num) == FALSO &&
palindrome (num) == VERDADERO)
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) t
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 C 14

. @ Copyrght tBM Corp.2OO2


Los materiales del clrrso no pueden ser reproducidos total
o parcalmente sin el permiso previo escrito de tBM
OF
o
o Gua del Estudiante Introduccin a la Programacin con C
o
o or-gr-tro++;
o guardar = guardar / to
o: t)
o /* aqui digito es eI nmero de dgi-tos */
o /* Buscar e1 peso posicional a1 extraer e1 dgito
o izquierdo como londigito-l */
o, Poswt = 1,'
for (k = r; k .= (digito - 1); k++)
o poswt = poswt 't 10;
o /* Rea]-:-zar la proceso de comparacn */
o guardar = x; /* Hacet una coPia de x */
o continuar = VERDADERO;
o while (guardar ! = 0 &&. iontinuar == VERDADERO) {
o izguierdo = guardar / poswt; /* dgEo izgulerdo */
o derecho = guardar ? 10; /" digito derecho */
o if (izguierdo == derecho) {
o /* Nuevo x con izguierdo, derecho arrojado*/
guardar = (guardar ? poswt) / ao;
o poswt = poswt / LO1;
o
)/*rin de1 if*/
o else
o continuar = FALSO,'
o )/*rna of else*/
o return (continuar);
o )/*rin de Ia funcin palindrome*/
o El cdigo C termina aqu
o
o Este programa result muy simple ya que tenan dos funciones primo y
palindrome. Solamente se tuvo que verifcar ""
s un entero dado como entrada es
o primo y palndrome.
o
Fin del Ejemplo 1.9
o
o Hasta ahora todas las funciones defnidas por el programador precedbn a la funcin
a main O . Esto era para permitir que el compilador tuviera definida las funciones
o 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
o necesitan y despus se enlazan. Esto se llama enfoque bottom-up (de abajo-haca
o anba) de solucin de problemas
o Existe otro enfoque para resolver problemas, denominado enfoque top4own (de aniba-
o hacia abajo). En este mtodo, la funcin main O aparece delante de todas las otras
t
I) Volumen 4: Funciones fl 'C

@ Copyright IBM CorP. 2002


Unidad 1: Funciones en C 15

Los materiales del curso no pueden ser reproducidos total


b o parcialmente sln elpermiso previo bscrito'de IBM
I
o
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
antes de la funcin maino. Er 'prototipo de.un-irn de un programa en C, incfusive
se escribe en forma general
como sigue:
tipo-de_dat.o nombre_funcion (tipo1 arg7, tipo2
arg2,. . . ) ;
Aqu el tipo-de-dato es el tipo de dato del elemento retomado por
nombre-funcion es el identificador, es decir, el nombre ta
funcin.
de la funcin. Los efementos
dentro de los parntesis definen los argum;r
justamente nombres mudos (dummy t sus tipos.Los argumentos son
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
actuales en la llamada deben tamin formafes). Los parmetros
funciones no son obligatorios en c. sin embargo,
"oo".pon"r
,
estos. Los prototipos de
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,


denominador, son todos nmeros que son tanto primo,
el numerador y el
"i,noioru..
"or
se escribir un programa en c que genere e imprima fracciones
las propiedades anteriores. mixtas que satisfagan

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 C t6
@ Copyrght tBM Corp.2002
Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermiso previo escrito de tBM
a
a F
IE
t*
o It Gua del Estudiante Introduccin a la Programacin con C
o I
i

o vlida. Si la fraccin mixta es vlida, entonces se debe verificar si todos sus


o componentes (parte entera, numerador y denominador) son primos y palndromes. Si
a todas estas condiciones se satisfacen entonces se tiene que imprimir la fraccin mixta,
sino se debe proceder a formar la prxima fraccin mixta candidata.
o
o Claramente, se deben desanollar funciones para verificar lo siguiente:
o . Siuna funcin mixta es vlida.
o . Siun entero dado como entrada es un nmero primo
a . Siun entero dado como entrada es un palndrome
o
El siguiente es el algoritmo para calcular esto:
o
o . Step 1: void main ( ) {
for (i = 100; <= 999; i++)
,

o i

o I for(j = r00; j <= 999; j++)


for(k = 100; k <= 999; k++)
oj i
formarAcomoyl/k;
oi
i

if (validar_fm (A) )
oi I
l

if(Eodo i, j, y k son primos y palindromes)


Or ;
print A,'
o )
o . Paso 2: Definir una funcin llamada validar fm que determina s una fraccin
o mixta es vlida
o . Paso 3: Definir una funcin llamada primo
o . Paso 4: Definir una funcin llamada palindrome
o Basado en este algoritmo, se puede desanollar el siguiente programa en C:
o
El cdigo C comienza aqu...
o
o #include <stdi-o. h>
o #define VERDADERO 1
o #define FALSO 0
int validar_fm(inE num, int den);
o int. primo(int x) ;
o int palindrome (int x) ;
I int validar_fm(int num, int den) {
I /*Verifica e1 nmero de la fraccin mixta
t if (num < den)
q return (IIERDADERO) ;
di else
dt reEurn (FALSO);
Volumen 4: Funciones en C Unidad l: Funciones en C 17

@ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln el prmso previo escrito de lBM
Introduccin a la programacin
con C
Gua del Estudiante

] /" r'in de La funcin validar_fm */


mainO {
int i, j, k,.
sc,rucE {
inL parte_completa ,.

j-nt numerador ;
int. denominador
) 4,.
for (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 = j-
A.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) )
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 *,/
)/* r'in 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 C lg
@ Copyright tBM Corp.2002
, ^_
Los materales del curso no pueden ser reproducidos
totaf
o parcalmente sn ef permiso prevo estrito de IBM
o llF
o
o Gua del Estudiante Introduccin a la programacin co c
o
o It
o I
/* Aqu digito es e1 nmero de dlgitos */
o /* Buscar e1 peso poscional al ext.raer el
o I
dlgito izguierdo como l0ndigito-t *7
o poswt = 1;
o for (k = r; k <: (digitso - 1),. k++)
poswt=poswt*10;
o fniciar e1 proceso de comparacin */
/*
o guardar = x; /* Tomar una copia de x */
o continuar = VERDADERO;
o whil-e (guardar ! = 0 && conLinuar == VERDADERO) {
o ,/* digito zquerdo */
o izguierdo = guardar / poswt;
o /* digito derecho *,/
o derecho=guardar?L0;
o if (izguierdo == derecho) {
d /* Nuevo x con izguierdo, derecho arroj ado* /
guardar = (guardar ? poswt) / lO;
o posh/t = poswt. / IOO;
o J/*nin
tt
de] if */I
o else
O continuar = FALSO;
o )/*Fin de1 else *,/
o return (continuar);
o )/*Pn de la funcin pa1ndrome */
L.
-.

o int primo (int x) {


o int. k = 2, continua,r,.
conLinuar = VERDADERO;
o .whi1e (k <= x-1 && continuar == VERDADERO) {
o if(xtk==0)
o continuar = FALSO;
o else
a k++,'
o )
if (continuar == VERDADERO)
? return (VERDADERO);

I
else
? return (fALSO) ;
e
t
Volumen 4: Funciones n C Unidad f: Funciones en C 19

@ Copyright IBM Corp.2002


Los materiales del curso no pueden ser reproducictos otat
o parcialmente sn ef permiso previo escrito de IBM

It
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 C 20

@ Copyright tBM Corp. 2002


Los materiales del curso no pueden ser reproducidos totat
o parcialmente sin el permiso previo escrito de IBM
:r
of Gua del Estudiante Introduccin a la Proqramacin con C
o
o I

Iri
III
:tt
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,
?i
o iF automatic. Las variables automatic declaradas dentro de una funcin obtienen el
.li espacio asignado slo cuando se invoca la funcin. El compilador fibera el espacio tan
pronto como la funcin retoma.
oli 4.2. La Clase de Almacenamiento srarc
oi-
oi La clase de almacenamiento static le informa al compilador que los valores
almacenados en las variables estn disponibles entre llamadas a funciones. Las
oi variables automatic pierden los datos cuando la funcin retorna, ya que el espacio
o asignado a las varibles se bera. Por ejemplo, si se declara una variable dentro de una
oi 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
ol cambio que se haga durante esta invocacin ser retenido durante la prxma
o invocacin de la funcin. Un buen ejemplo de su uso es cuando se crean nmeros de
o identidad (secuencialmente) a travs de una funcin.
o /" BI archivo de encabezado con 1as fuciones estndar
que soportan 1a entrada y salida se incluye (stdio-h) */
o
#include <stdio.h>
a
/* Declaracin de funcin *,/
a int generarfdno O ;
o /* La funcin main inicia aqu */
o void mainfl {
o int i,-
o /" tI bucle inwoca 1a funcin generarld.no * /
o for (i = 1; i <= 10; i++)
nvi nc t rE1 r:to es *d\ntt , generarldno
o '|
r
O);
o
o /* La funcin main fj,na)-za aqui */
o /* La fucin generarfdno inicia aqul */
o int generarldno O {
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 C 2l


@ Copyright IBM Corp.2002
Los materiales det curao no pueden ser reproducidos total
o parcialmente sin elpermlso previo escrito de'lBM
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 (
1 en maino), la variable static idno es inicializada
) es ilamada (cuando es i
en 0. Es entonces inciementada y
retomada a la funcin que hizo la llamada. Cuando generarrdno (
nuevamente, no se realha nnguna inicalizacin. Ef valor
se invoca )
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
external. 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
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 ( ) *7
/* puede usar sol-o k declarado fuera * /
)
/* 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 C 22

. @ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcalmente sin elpermiso previo escrito de IBM
of
o
o Gua del Estudiante lntroduccin a la Programacin con C
o
o En el ejemplo anterior, se declararon dos variables external k y j. k es visible main,
o, j
f 1 y f2. es visible slo en fry f2. Las variables extemal son visibles en funciones
j
slo desde el punto de su declaracin. est declarada justo antes de la funcin f 1, y
o' 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
o funciones en un programa.
o Se declar tambin una variable k en la funcin rz. sta es una variable local. En este
O,* punto, dos variables con el mismo nombre k son visible para f2. Recuerde que la
o variable local, altener el mismo nombre que una variable external, siempre sobrescribe
o fa variable external. Por lo tanto, la k visible en f2 es la local y no la variable extenal
k.
o
A fas varables external se les conoce tambin como variables globates (globa|. The
o espacio asignado a estas variables permanece durante una ejecucin del programa.
O Cualquier cambio que se le haga a una variable extemal ser visible a todas las otras
o partes delprograma donde sea visible.
o C provee un mtodo para hacer visible a j
en main. Usando la palabra reservada
o extern como extern int .
j De este modo main puede hacer uso de j, la cual se
va a declarar posteriormente. La palabra reservada extern informa at compilador que
o j
aunque an no se ha declarado en main o antes de main, y eventualmente
o. encontrar una declaracin para ste. Esta caracterstica de C es bastante til en la
o resolucin de problemas grandes.
o Continuando con esta discusin, es importante sealar que generalmente un programa
o grande que resuelve un problema requiere de ms de un archivo C en los cuales se
escriben las funciones.
o
o Elcdigo G inicia aqu...

o /* Archivo1-.c */
o int k,'
o int m;
o void mainO { /* main escrita en un archivo separado */
o
)
o /* Archivo2.c* /
o int k;
o int j;
o extern int m;
o /* Ias dos funciones declaradas en ste archivo
? int f1O {
) i
)

o int n;

t Volumen 4: Funciones en C Unidad l: Funciones en C 23

@ Copyright IBM Corp. 2002


Los materiales delcurso no pueden ser reprcduddos total
tf o parcialmente sin elpermlso previo scrito de IBM
t
t
I
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


declaraciones de k' Ambas.en el segmento de programa anterior. se observan dos
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
respuesta es s' c provee fa pafabra reservada en otro archivo? La
detener que una variable sea declarada como
static que permite que al programador
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
velocidad de la cPU. Esto es sl una soficitud en los registros de alta-
al compila_dor. El compilador asigna
memoria en los registros si tales r_e_oistrgs
;*se lponiotes
memoria' si no estn disponibles, estas variables para asignacin de
tratbn como variables
Las variables se
declaran normafmente como variabres register
slo cuando se
automatic.
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 C Z4
@ Copyright tBM Corp.2002
Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin el permiso previo escrito de IBM
o
o
o Gua del Estudiante lntroduccin a la Programacin con C
o
o
o I 5. Caractersticas de las Clases de Almacenamento
o t. Algunas de las caracterstcas de las clases de almacenamiento (storage classes) se
? muestran a continuacin:
o
o . sraric.
Slo las variables local se pueden declarar como variables

o . Slo la variables auromaric se pueden declarar como regisrer.


o . No se puede aplicar dos clases de almacenamientos a una sola declaracin.
o stat.ic register int i; /* Error */
o El espacio para variables auromaLic ! register sB asigna en la pila del
sistema.
o El espacio para las varables sraric ! exrernal se asigna en los segmentos de
o datos delproceso.
o
o
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: Funciones en C 25

@ Copyright IBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo dscrito de IBM
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

' Describir algunas funciones incorporadas de


sido usadas
c, y las formas en que ellas han
o ldentificar las diferentes partes del encabezado
de una funcn
. ldentificar los diferentes tipos de argumentos
r Definir prototipos de funciones y fistar sus usos
. Usar las funciones para solucionar problemas

Unidad 1: Funciones
Volumen 4: Funcionei en C 2A
@ Copyright tBM Corp.2002
Los materiales delcurso no pueden ser reproducidos
total
o parcalmente sin ef permiso previo escrito de IBM
o
o
o Gua del Estudiante Introduccin a la Programacin con C
o
o
o Unidad l: Exmen de Autoevaluacin
o 1. Eltipo de dato en elencabezado de una definicin de funcin es opcional.
o *t a) Verdadero
o *t. b) Falso
o $ 2. Cules de las siguentes es la caracterstica de la funcin definida por el usuario?
o 'rta a) Expresa la naturaleza de la tarea llevada a cabo por la funcin
o b) Satisface fas regfas para formar un identificador en C
o c) Esta aparece en el encabezado de la funcin
o d) Todas las anteriores
O 3. El encabezado de la funcin tiene una lista de identificadores y sus tipos definidos,
o separados por comas. Cmo se llaman estm parmetros?
o a) Parmetros actuales
O b) Parmetros formales
o c) Parmetros de prototipos
o }}I
d) Parmetrosnormalizados
o
I
I

I
4. Cuando se define una funcin, no es necesario declarar los nombres de los
argumentos en la lista de argumentos formales.
o :

a) Verdadero
o b) Falso
o 5. En la lista de argumentos formales, dentro de un prototipo de funcin, no es
o necesaro declarar los nombres de los argumentos.
o a) Verdadero
o b) Falso
o 6. Dnde debe estar localizada la definicin de funcin?
o a) Antes de la funcin main ( )
o b) Despus de la funcin main ()

o c) En un archivo fuente separado


o d) Ambos (a) y (b)
o 7. Dnde debe estar localizado el prototipo de funcin?
o a) Dentro de la funcin main ( )
o 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 ( )

iI
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

:t
lntroduccn a la programacin
con C
Gua del Estudiante

8. Cundo una funcin es invocada.


el conjunto de entradas se pasa
travs de la fista de variable, lln0" a la funcin a
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) Cero o ms sentencias return
t o
rorma es
5H ilil: ?ffi '#:i[:':.1;Jg:' "tros
I deb e coin cid r
exa cta m e n te co n

a) Verdadero
b) Falso

Unidad l: Funciores
Volumen 4: Funciones en C ZA
@ Copyright tBM Corp.2OO2
, _^ _
Los materafes del curso no pueden ser
reproducidos totaf
o parcialmente sin el permiso previo
estrito de IBM
rt
o
o
o Gua del Estudiante

o
o
o Respuestas a la Unidad 1: Exmen de Autoevaluacion
o 1)a
o 2)d
o 3)b
o 4)b
o 5)a
ol 6)d
ol 7)d
oi 8)b
oi I
9)c
ol 10) a
ol
q
ol
q
q
q
.l
e
o
ef
e
q

Volumen 4: Funciones en C Unidad 1: Funciones en C 29

@ Copyright IBM CorP.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sln el permlso previo escrito de IBM
lntroduccin a la Programacin con C Gua del Estudiante

Pgino dejada intencionalmente en blanco...

Unidad 1: Funciones Volumen 4: Funciones en C 30

@ Copyright IBM CorP. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
O
o
o Gua del Estudiante Introduccin a la Prooramacin con C
o
o
o Unidad 2: Laboratorio de Funciones
o
o
o Objetvos de Aprendizaje
o Alfinalde esta unidad, usted ser capaz d:
o l*
J$.
' Emplear funciones
.definidas por el usuario para modulanzar los programas
o t.. alcanzar una estructura simple
o ' Escribir funciones para flevar a cabo tareas especficas bien definidas
o . 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
t
It
5
Volumen 4: Funciones r C
T Unidad 2: Laboratorio de Funcores en C gl
* @ Copyright tBM Corp. 2002
Los materiales del curso no pueden ser reproducidos total
,f o parcialmente sln el permlso previo escrito de IBM
O
a
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
hasta w (esa es la entrada) junto con su equivalente
desde r
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
los enteros decimafes especficos y su equivarente
se listan a continuacin
en Romano:
1 I

5 V

10 X

50 I

100 c
500 A

1000 m
2' Considere un texto como entrada en Ingls, d cual
termna en el smbolo $.
Escribir un programa que cuenta el nmero de vocales
consonantes que aparecen en el texto. Escribir dos
y el nmero de
funciones flamadaS esVocal
y esconsonante que tome un carcter como entrada y retome
vERDADERo o FALso apropiadamente. un valor

Unidad 2: Laboratorio de Funcores


Volumen 4: Funciones en C 32
@ Copyright IBM Corp.2002
Los materiales del curso no pueden ser reproducdos
total
o parcialmente sin el permiso previo escrito de tBM
o ttr:t
o
o Gua del Estudiante Introduccin a la programacin con C
o
o
o , Unidad 3: Recursin
o .TT
o is.+
o I
Objetivos de Aprend izaje
o i Af final de esta unidad, Ud. ser eapaz de:'
o . Explicar qu es recursion
oi o Discutir las diferentes condiciones que deben ser satisfechas para que las
funciones recursivas trabajen correctamente
o o Describir cmo una funcin recursiva trabaja cuando se ejecuta
o . 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
F
p
p
t
tI.
D

@ 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
En fa Unidad I-
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
-'currere',
significa.'conei. La palabra recursion iittrnte .ignr"-;.*",el sufijo
haca
gtr{s', o'que suceda. otravez, especiafmente en un intervalo especfico,. En
de la programacin de computadoras, la palabra 'recursin'se el contexto
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
caractersticas de recursbn. Recursin es rdalmni una las
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
travs de la framada. En er ejempro anterior, ta ilamada ;;]asados a
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

t
o
o
F
o Gua del Estudiante
Introduccin a la Programacin con C
o
o De la definicin anterior, es claro que la recursn implica
o 'a un proceso repetitivo, el cual
es autoreferencado. La recursion se encuentra en la vida
o ',f usa implcitamente. r
oalia tar vel, inctusive se

o
o ,,; 2. Escribir Funciones Recursivas
o It A continuacin se discute como escribii funciones recursivas
en para resdver c
problemas' En esta unidad, se aprendern los
o funomentos de rapgramlcon usanoo
recursin' empezandg con ejemplos simples de funciones
o con la solucin de problemas complejos.
matemtis, y continuando
o Ejemplo 3.1: Calcular el Factoriat de un Enetero
o
o cafcular el factorial de.un entero es, q.uils., el ejemplo ms
usado para ensear el uso
o de la recursin a los principiantes. se irabajb d;;i
3 - construcciones lterativas. Sin embarg, por r"ron"i-du
en el volumen 2, unidad
"jemplo
o nuevo' Ef factoriaf es un trmino matemti que es definido
completitud, se revisar de
pr" tbr tos enteros
o positivos' Por definicin, ef factorial del entero
0 es 1. para todos los otros enteros
o positivos, ef factorialde n es el producto de todos
los enteros desde t hasta n. sea el
siguiente ejemplo:
o
o Factoral de 5 = Sx4x3x2x 1 = 120
En generaf,
o Factorialde n_(donde n > 0) = nx(n-i) x(n_2)x... x 1
o Se escribe elfactorial de n como n r (con'etsigno de
exclamacin) y se lee como
o n-factoriaf. As,
o
o
n! = nx(n-1) x(n-2) x... x 1 paratodos losvaloresden >0.
o El factorial se puede tambin definr usando induccin matemtica, es decir.
recursivamente, como sigue:
o
o nJ = r X (n-1) t (es decir, n murtiprcado pdrn-r factoriar, sin > 0)
o - t- (sin = 0)
o Esto es conecto y puede ser fcifmente verificado.
considere 5!, por ejempro:
o 5!
o = Sx4l
o = Sx4x3!
o = 5x4x3x2l
o = 5x4x3x2x1l
o = 5x4x3x2x1 x}l
o = 5x4x3x2x1 x1 (dado que 0! = I por definicin)
t = Sx4x3x2x1 (dado que I x 1 = 1 de cualquier modo)
?

.uos materiales @delcufso


Copyright tBM Corp.2}02
pueden
no ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

\)
Introduccin a la programacin con C
Gua del Estudiante

Una definicin formal recursva delfactorial de n


se da a continuacin;
= a qi _

if (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
if (n==o) , la condicin se hace vsRADERo ya que 0. cuando se hace ta verificacin
n es 0. De manera que el valor 1
(el cual es elfactoriar de 0) es retumado por
raroriar.
Ahora, si el factoriar se invoca aon parmetro 1, la siguiente sentencia se
ejecuta: "i
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
siguiente:
a la larga har lo
return factorial- (0) * 1;
Estorealmenteesl * 1= l.porlotantot!
= 1.

' Ahora s se invoca factorial (3). Mientrasn > 0 (esto es para varores de n
t ), se tiene la sentencia: = 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
por ejemplo -3? En esta situacin, no existe mayor o iguaf a 0,
un iaso base vlido, por lo tanto la funcin

Unidad 3: Recursin
Volumen 4: Funciones en C g6

. @ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermiso previo escrito de IBM
o ?
o
o Gua del Estudiante Introduccin a fa
o
o factorial ser invocada indefinidamente con los parmetros -3, -4, -5, y
o sucesivamente. La funcin recursiva no terminar. Sin embargo, a partir
as
de un tiempo,
o fa funcin amenzar a usar mucha memoria y finalmente se
tga.
o Fin del Ejempto 3.1
o
A continuacin se tratar de consoldar la comprensin de las funciones recursivas
o travs de otro ejemplo simpfe: Encontrar el MCD entre dos nmeros.
a
o
Ejempfo 3.2: Encontraret MCD Entre Dos Nmeros:
o-
o' Todos han estudiado el MCD en los cursos de matemticas de la escuela.
Cada uno,
o 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
a facilmente
o )
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
o 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,
o .? .y
4. Por lo tanto, 4 es et MCD. Pero, existe un mtodo que
no requiere enumerar los divisores de cada uno de los nmeros. Esto se
o siguiente definicin recursiva:
origna de la

o
o MCD(x,y) = MCD(x-y,y) six>=y
o = MCD(x,y-x) six<y
o
o =x siy=9
o six=0
o A continuacn se verifica si la definicin es correcta.
o
t4cD (1_2 , L6) = (L2,76-72) ,4) ya que 16 > !2
o MCD l{CD (1-2
= MCD (I2-4,4) MCD(8,4) ya que 12 > 4
o MCD (B-4,4 )
= MCD(4,4) ya gue B > 4
o = MCD (4-4,4)
=
MCD (0,4) =
= 4
o Este resultado coincide con el que se obtuvo anteriormente. A
o continuacin se escribir
una funcin recursiva en c que calcula el MCD de dos enteros positivos.
o
El cdigo C incia aqu...
o
o int mcd(inE x, int y) {
o if (x==s {
o . reEurn y;
)
o
t else if (y == o) i
return x;
t
,r Volumen
.
b @ Copyright tBM Corp.2002
Los materiales del curco no pueden ser reprodi.rcldos total
b o parciafmente sin el permiso previo escrito de IBM
I
a

o -
Introduccin a la programacin con C
Gua del Estudiante

)
else if (x >= y {
reEurn mcd (x-y, y) ,-

) else {
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 Ef prxmo nmeroes
1. siempre la suma de los dos
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 spg retomar55.
La siguiente es la funcin recursiva para retornar el nmero nth de Fibonacci.
autoexplica. 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 C 3g

. O Copyright tBM Corp.2002


Los materales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
ors
o
o Gua delEstudiante
lntroduccin a la programacin con
o C

o obtener los dos nmeros anteriores, es


o decir, f ibonacci (n_l_) y f ibonacci- (n_2)
y se retorna fa suma de esos dos
nmeros, fo cualsatisface la defincin.
o
Note cuan eregante es ra sofucin. sin
o embargo,
es realmente el mtodo ideaf para.solucionr'"ia pesaf de ra eregancia que ruce, no
a trminos de la serie de roonacc. Miekas
;rt"
bio"ra de la bsqueda de los
;i;*pto es para entender fas
ort funciones recursi-vas, es preferible construir
razn' es que la funcin iecursiva es ms
una sotun iterativa para et probfema.
La
o costosa en trm.inos.de tiempo de ejecucin,
dado que el nmero de veces qr" ror ,"gistior;eictvacin
a liberados es afto' una solucin iierativ",."nq*
p*0" "on?,iacenados
y
contenei.,,,.l sentencias
o pueda no lucir tan elegante como fa solucin
en trminos de tiempo de ejecucin.
r"drnils y
sin embargo, menos costoso
o
O Fin def Ejempto 3.3
o Existen muchos otros ejemplos dond
a elegante, pero es pobre en trminos de
una solucin recursiva a un problema puede
lucir
rendimient cuando se ejecuta como
o programa' En tales casos, una solucin
iterativ leJ" Jur. ,n" opcin ms apropiada.
un

o A continuacin se presenta el uso de la recursin


o en ta solucin de problemas ms
compfejos.
o Ejemplo 3-4: permutacin de Nmeros para
o construir un cuadrado Mgico
o El probfema aqu, es construir un cuadrado
de las filas, ras corumnas.y. ras oLwnatesmgico, de orden 3x3, en la cual las sumas
o ejempfo de un cuadrado magico oe oren
rn
-- '| to.
rvvsv iguares.
'\ La Figura 3.1 es un
;3.
o
o
o 4 8
o I 4

a I

o 2 7 o
o Figura 3.1: Cuadrado Mgico de Orden 3x3
o
El orden de 3x3 no es el nico cuadrado.
o mgicos de orden 4x4,5x5, etc., i cuales
mgico que existe, existen otras un cuadrados
sn nieresantes de construir. pero primero,
o se aprender como construir un cuadrado
mgico oe iJen gxs.
a
Ef probfema es asombrosament"
I conjunto de nmeros (en ste caso"nq1?:g I"9" alloue
ls enteros.l
se necesita es arregrar un
p efementos en las filas, column". y sien una matriz 3x3 taf que los
las..diagonales-iurren et mismo nmero. pero
estrategia para resofverlo parece'oir'clE;;;;grir. fa
t? Existen estrategias, pero el
asuma que no se tiene acceso a ellos.
p il3[13[t!: ]or b tando se quiere resorver el

,Los_materiafes edefQopyright tBM Corp. 2002


curso no pueden'ser reproducidos total
o parcialmenie sin elpermiso previo
de IBM
"rlrto
o
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
permutacin es ef aneglo de ciertas unidades
de un con;unto oe numeros. La
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
inidimensional de nueve elementos. Ahora'lo que se
3x3 tomo un arreglo
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 9
\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


unidimensional' una vez que la permutacin es generada, aneglo
que verifique si sta es un cuadrdo mgico. se debe tener una funcbn
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 C qin

. @ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
a
o
o Gua def Estudiante lntroduccin a la Programacin con C
o
o for (k=1; k <= 3; k++)
o printf ( "?dtd?d\rr,' , ,j, k) ;
O Asuma que la variabfe de nombre arreslo se dectara globalmente y
su declaracin
o como sgue:
es

a int arreglo[s0] i
o -
si ahora se desea tener una recursn, se puede hacer lo siguiente:
o void permutar(int n) i
a inr i
o for (i=1; i<=3; i++)
o arreglo [n] = i;
{

a if (n<3)
o permutar (n+1) ;
o else
o printf ( "?d?d?d\n", \
o arreglo It], arreglo [2],arreg1o t3l );
o
return,.
o
)
o
o 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
o el valor
permutar(1) -La siguiente secuenca de 3 dgitos ser generada oando de 1 como
o fa funcin recursva como permutar ( 1) |
se nvoque
o 1_II ,1_L2 ,1_I3 , L2!,122 ,1,23 ,1_3L , 132 ,I33
o 2r1, , 212 , 2I3 ,227_ ,222 , 223 , 23:- , 232 ,233
,

,
o 3a1 ,312, 3 L3 , 32J.,322 ,323 , 33I , 332,,333
a A contnuacin, se modificar para permitr la permutacin de los nmeros
o del 1 al 9 en
el arreglo de nueve elementos, se puede nacer uso de lo siguiente:
void permutar(int n) {
a inti;
a for (i=1; i<=9. i++) {
a arregLo [n] = ;
o if (n<9)
e el-se
permular (n+t_) ;

Q.
esMagico (arreglo)
, ;

t )
I

{
Volumen 4

Losmateda."?"?SlljFli'3,[.?,&?o,l*uooostotal
o parcialmente sin el permso previo escrito de IBM

a
lntroduccin a la programacin con C
Gua del Estudiante

En esta situacin, arreglo es un aneglo undimensionalcon


que ndebe ser declarado en el program. nueve elementos enteros
Todos lo que se na hecho de significativo en
ef codigo anterior es reemplazar la
sentencia con printf funcin la
esMagico (arreglo) . como antes,. la funcin permutar (
inicialmente con el parmetro de entrada 1. debe )
ser invocada

Cuando un conjunto permutado de nueve nnqeros est


disponible en arreglo, la
funcin esMagico(arreglo)se invoca con arreglo
funcin verifica si el equivlente 3x3 de este uo"l
como un parmetro. Esta
as, lo imprime.
i;*" un cuadrado mgico, y si es

l',::l!":99:
numeros ,l"venunrepeticiones.
resulta
probrema. En esta sorucin, una cierta permutacn
de ros
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.
formas de verificar estas repeticions. Ef siguiente Hay muchas
rn proceoimiento smple que usa
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 {
esMagico (arreglo) ,-

usado[i] = 0;

)
recurn..
)
nicialmente todos los elementos de este aneglo
f
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
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 C 4t
. @ Copyright tBM Corp.2002
Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin ef permiso previo escrito de IBM
:F
oii Gua del Estudiante lntroduccin a la Proqramacic c: - _
o
o conespondiente va a ser usado. Siempre que fa funcin permutar
O'l se rnyc3
recursivamente, el valor de usado[] permanece en 1 para ta ejecucin
^I
-r de la funcin
-fr invocada recursivamente. Sin embargo en el retomo e ia funci permutar,
despus
oif 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
O que para ef orden 3X3, exste un total dg ocho posibles cuadrados mgicos
ol: nmeros det 1 al9.
mn los
oi: Ahora se ha presentado el poder de usar la funcin recursiva en la permutacn
o conjunto de nmeros.
de un
o
En este ejemplo, se verifica una gran cantdad de anegfos permutados para
o determinar
si ellos forman un cuadrado mgco. En realidad, lJ nrayoria de ests pruebas son
o intilies.
considere elprimer aneglo ilustrado en la Figura 3.2.
o
o
2
o 1 3

o 4 5 6
a
7
o 8 a

o Figure 3.2: Es este un Arregto de Cuadrado Mgico?


o Este absofutamente no forma un cuadrado mgico, ya que la prmera fila
o misma
menos de15. se comienza permutando g-9, luego'7-g-g; oespueJ _7_a_gtotaliza y as
o 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
o ya que h configuracin de la primera ftla 1-2- n puede producir un cadrado intiles
mgico
o para cualquera del resto de las permutaciones. Inilusive cuando
se alcanza el tope de
o 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
o mgi para
cualquiera de las permutaciones de los nmeros en otras filas. por lo tanto,
se-tiene que
o modificar la funcin permurar ( )
para evitar estas permutaciones intiles que
o empiezan con una suma de fila particular que no sea 15.
o Cuando se llena los valores para cualquier fila, se debe verificar si la suma
de cada fila
o 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
o es 15, cuando el
nmero para el cuarta es generado. Si la suma es 15 se procede gen"ra.
a el nmero
o del cuarto elemento. Si no es as, se necesita regresar (llamado baktracking)
a la fila
o 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
O lor nueve
nmeros, talque la suma de cada fih sea 9, entonces todo lo que
tdne que racerse es
o verificar las sumas de las columnas y diagonalen la funcifl esMagico (
).
o
5
t;L Volumen

@ Copyright tBM Corp.2002


l-
f. Los materiales delcurso no pueden ser reproducidos total
o parcalmente sin elpermiso previo escrito de IBM
L
l-
o
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.

1 5 I
2 6 7
3 4 8

Figure 3.3: Matriz de 3x3


Todas fas sumas de las filas son J5^. Pero,
ineficiencia dado.qu.e tiene el patrn 1-2-3,e|
la primera columna misma revela
tanto convrtie a
cuar no hace qr" l"
fas otrs permutaciones redundantes. por
ir*
sea ls, por lo
loda.s-
modificar an fa funcin permutar ( para lo tanto se necesita
empiezan con una suma particufar de cofmna
) evitar estos tipos de permutaciones que
as como la suma de fa flla que no es 15.
El truco es llenar. las filas y las cofumnas altemativamente.
familianzado con la notaci de matrices A esta altura ya se est
nsum-fr"
llenar' Una de tas formas es llenilas entradas ,".tene un aneglo de 3x3 para
en el siguiente orden:
d h matnz con el n,i-,iro permutado

A(1,1), ,2), A(1,3), A(2,r) , A(3,1), A(2,2), A(2,3), o(:


A(1
,2), A.,3)
Se necesita verificar la suma de la fila en A(1,3)
verifica fa suma de fa columna uno. Cuando
. Cuando se ltene en A(3,1), se
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 I

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
de los ejempfos ms famosos, er probrema uno
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
B y c y n discos de dim,etro 1,2,3,. . A,
. n. Er rompecabezas comienza con todos ros
apilados en una de las clavijs por orden de
tamao oecrecente o
#;::t hacia
"0";o
El probfema es mover todos fos n discos
desde
C (fa posicin finat) obsevando tas sijuientes .la claviiaA (posicin iniciaf) a la cfavija
'
regtas:
Undad 3: Recursin
Volumen 4: Funciones en C 44
@ Copyright IBM Corp.2OO2
Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermso previo escrito de IBM
olt
o
o Gua del Estudiante lntroduccin a la Programacin con C
o
o . Slo un disco puede ser movido a la vez.
o . Un disco grande nunca puede ser colocado encima de uno ms pequeo.
o
o 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
o resolver y donde encaja la recursin
o
El problema es que n discos enen que ser transferidos desde clavija A hasta la cfavija
o C siguendo ciertas reglas. Esto puede hacerse a travs de una serie de movimientos
o donde el disco tope de alguna clavija (A, B, or C) se coloca en el tope de alguna otra
o 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
o instruccin, de la siguiente forma:
o
Mover eldisco deltope de la clavja X a la clavija Y
o
o Dada una entrada n (el nmero de discos a ser manejados), se tiene qre generar los
o movimientos para transferir n discos desde fa posicin inicial en la clavija A al la
posicin finalen la clavija C.
o
o Existe un conjunto de movimientos fegales para lograr la transferencia deseada de los
o 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
o puede resolver el problema, inclusive para valores tan pequeos como n=2. Esto es
o fcil de entender, ya que despus de mover un disco desde A hasta B, todo lo que
o puede hacerse, es mover el disco de regreso a A. Nada ms puede hacerse y eso no
ayuda a solucionar el problema.
o
o Se puede solucionar el problema con tres clavijas, A, B y C para n=2? Si, se puede.
o 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
o la clavija C (el destno finaf). El paso final es mover eldisco ms pequeo desde B hasta
o c.i
o
La pregunta es si se puede hacer este tipo de transferencia para todos los valores de n.
o Se va ver si se tiene una solucn vlida p?ra n=3. Los siguientes son los movimientos
o posibles:
o o Mover eldisco deltope de la clavija A (el disco ms pequeo) a ta clavija C
o . Mover eldisco deltope de la clavija A (ahora el medano) a la clavija B
a . Mover el disco del tope de la clavja C (el ms pequeo) a la clavija B
o . Mover el disco deltope de la clavija A (el ms grande) a la clavija C
I o Mover el disco deltope de h clavija B (el ms pequeo) a la clavija A
,
.
t
I .
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

l? Volumen 4: Funciones en C Unidad 3: Recursin en C 45


D
i
tt ' @ Copyright IBMCnlrp.2002
|l Los materiales del curso no pueden ser reproddddos total
t7 o parcialmente sin elpermiso previo'esoito de IBM
p
o
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:

' El disco ms grande en fa clavija A debe ser movido en el fondo


este es eldestino final.
de la clavija C,
o Esto es posible slo cuando todos los discos anteriores a f
son movdos fuera
de la clavija A
o 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
clavija C, como se mencion anterioniente, todos los otros discos
la clavija A a la
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 sub-
actividad 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 temporat-
se 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:
1 , 2 y 3. La suma de estos nmeros

desde + hasta + t.emporal = 6

Por fo tanto, temporal = ( 6 - desde - hasta) . se puede desarrollar la estrategia


recursiva.

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 C 46
@ Copyright tBM Corp. 2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin ef permiso previo escrito de IBM
.
o
o Gua del Estudiante
o
o . Ahora la clavijaAtienesolo un solo disco, el mayorde todos. Move es:e:s:.:
a desde la clavija A a la clavija C.
q . Transferir (n - t) discos desde la clavija B a la clavija C, usando la clavija A
q como almacenamiento temporal.
o usando esta estrategia, se trata de obtener una compresin delalgortmo.
o
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
o transferencia es temporal, elcualse calcula como sigue:
o temporal = 6 - desde - hasta
o
Para mover n discos desde la clavija desde a la clavija hasta, primero debe
a verificarse si n = 1. Si es as la solucin es trivial y es un solo movimiento. Si no,
o descomponer el problema en tres sub-problemas y solucionarlos en secuencia como
o sigue:
o o Mover n- temporal
1 discos desde la clavija desde a la clavija
o . Mover 1 disco desde la clavija desde hasta la clavija hasta
o . Mover n - i- discos desde la clavija temporal hasta la clavija hasta
o El afgoritmo recursivo se describe en la siguiente funcin en C:
o
o El cdigo C inicia aqu...
o #include <stdio.h>
o void t.ransferir(int n, j,nt desde, int hasca/ ;
o void transferir(int n, int desde. int hasta) {
o int temporal;
o ,/*Cuando e1 nmero de disco es uno*/
if (n == 1) t
o printf (r'Mover el disco tope de J_a clavija ?d \
O
a 1a clavi j a ?d \n" , desde, hasta) ;
O else {
o ,/*Cuando e1 nmero de disco es ms de uno */
o temporal = 6 - desde - hasta,.
o /* Llamar a 1a funcin transferencia */
o transferir (n-1, desde, temporal) ;
o printf (,'Mover eI disco Eope de Ia clavija td \
o hasta la clavija ?d \nu,desde, hasta),.
o /*Llamar a l-a funcin transferencia */
transf erir (n- 1, temporal, hasta)
o ,.

b
b Volumen 4:
b
b @ Copyright IBM @rp.2002
Los materiales del curso no pusdn ser reproducidos total
b
!o
o parcialmente sin el permiso previo escrito de IBM

o
lntroduccin a la Programacin con C
Gua del Estudiante

l
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: ,, ;
scanf ( ugdo, &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) =1
T (n) = 2*T (n-1) + 1 paran>1
Por lo tanto, T (n) - 2 1. De esta relacn, se ve que se requiere 2o - 1
movmentos.

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 C 48

. @ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
o|'
o
o Gua del Estudiante lntroduccin a la Programacin con C
o
o
o Resumen
o Ahora que ha completado esta Unidad, usted debe ser capaz de:
o . Explicar la recursin
o o Discutir las varias condciones que necesitan ser satisfechas para que las
o funciones recursivas trabajen conetamete
q o 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
a
o
O
o
I
o
?
o

' @ Copyright IBM Corp. 2002


Los materiales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso preo escrito de tBM

l
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 dentro de la misma funcin
b) Funcin que invoca a otra 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) Verdadero
b) Falso
3) Qu sucede con er siguiente segmento de cdigo, cuando el varor
argumento es -4? del
int factorial (inr n) {
if (n==0)
TaFrrr 1 .

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) Bucles while ejecutando un bloque de cdigo
c) Bucles do while ejecutando un bfoque de cdigo
d) Todas las anteriores

Unidad 3: Recursin
Volumen 4: Funciones en C SO

. @ Copyright tBM Corp.2002


Los materiales del curso no pueden ser reproducdos total
o parcialmente sin el permiso previo escrito de fBM
o f
o
o Gua del Estudiante lntroduccin a la Programacin con C
o
o 7) Una funcin recursiva no necesita un caso base para estar bien definida y es
o @paz de terminar por s misma.
o a) Verdadero
o b) Falso
o 8) Cules de los siguientes problemas pueden solucionarse usando recursin?
a a) Tones de Hanoi
o b) Serie de Fibonacci
o c) Sumatoria de una serie desde 0 hasta el infinito
o d) Encontrar el mayor de dos nmeros
o 9) Recursin no es un proceso repetitivo.
o a) Verdadero
o b)Falso
o 10) Indique que sucede cuando se ilama a una funcin recursiva
o a) La funcin se llama a s misma con elvalor modificado de sus argumentos.
o b) lincrementa la eficiencia de un programa.
o c) Supera la limitacin del nmero de veces que un ciclo for invoca a una
funcin.
o
o d) El programa incrementa el rendimiento de la aplicacin.

o
o
o
o
O
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 C 52
@ Copyright IBM Corp.2O02
, __
uos materiales del curso no pueden ser reproducidos
total
o parcialmente sin elpermiso previo
de IBM
".'"rito
o F
O
o Gua del Estudiante Introduccin a la Programacin con C
o
o
o Unidad 4: Laboratorio de Recursin
o
o Objetivos de Aprend izaje
a
Al finalde esta unidad, usted ser capaz de:
o .
.if
o .
Solucionar problemas usando la recursin como una tcnica
Desanolfar funciones recursivas en C para solucionar problemas especficos
ol'
o
Ol-

oi''
o
oi
oi
Ol

$
d:
d-
d:
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
parmetro y devuelva un entero'con dos ocurrencias d cada
como un
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 C 54

. @ Copyright tBM Corp- 2002


Los materales del curso no pueden ser reproducidos total
o parcialmente sin el permso previo escrito de IBM
oF
o
o
o
o Introduccin a la
o --I--n-
--r-
-
rI-1-
-
r-nt- -r Programacin con C
O" -E
- (Codgo del Curso: CY320)
o ---tr<F Versin 2.0
o
o Gua def Estudiante
o
o
o
a
o
o
o
o
o
o
o
o
o Vofumen 5: Punteros
o
o
enc
o
o
o
o
o
o
o
o
o
o
o
o
o
;o IBM Learning Seruices
b Worldwide Certified Material
b
lo
lo
,o
o
o
I

Informacin de Publicacin
I

Esta publicacin ha sido producida usando Mcrosoft Word 2O0O y Microsoft Powerpoint I

2000 para Windows.


I

Marcas Registradas I

IBM @ es una marca registrada de International Business Machines Corporation. I

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

marcas de servicio de otros. I

I
Marcas Registradas de otras compaas como se muestra
I

Windows Microsoft Corporation


I

Red Hat Linux Red Hat


I

Edicin Septiembre de 2002 I

La informacin contenida en este documento no ha sido sometida a ninguna prueba I

formal de IBM y es distribuida bsicamente "como es" sin ninguna garanta ya sea I

expresa o implcita. El uso de esta informacin o la implementacin de cualquiera de I


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 I

cada tema ha sido revisado por IBM para su exactitud en una situacin especfica, no I

hay garanta de obtener el mismo resultado o uno simifar a ste en otra situacjn. Los I

clientes que intenten adaptar estas tcnicas a sus propios ambientes lo hacen bajo su
propio riesgo. I

Copyright International Business Machines Corporation, 2002. Todos los derechos I

reservados. I

t,
ot
o' Gua del Estudiante
O,' Introduccin a la

o
o Contenidos
Oir Unidad 1: Punteros
oif Objetivos de Aprendizajes
oi l. Fundamentos de Punteros
1

2
ol 2. Usar Punteros para Pasar Argumentos a Funciones
oi 4
I
Resumen
ol, 12
Unidad 1:Examen de Autoevaluacin
o 13
o Respuestas a la Unidad 1: Examen de Autoevaluacin l5
o Unidad 2: Laboratorios de punteros 17
o Objetivos de Aprendzaje 17
O Ejercicios de Laboratorio 18
o Unidad 3: Punteros Avanzados 19
o Objetivos de Aprendizaje
o 19
1. Introducccin
o' 20
2. Aritmtca de Drecciones
o 20
o 3. Puntero a Puntero 25
o 4. Aneglo de Punteros 26
o 5. Puntero a Estructura
o 6. Puntero a una Funcn
o Resumen
o Unidad 3:Examen de Autoevaluacin 36
o Respuestas a la Unidad 3. Examen de A_ltoevaluacin ?4.
o
Unidad 4: Laboratorio de Punteros Avanzados
o
o Objetivos de Aprendizaje 39
o Ejercicios de Laboratorio 40
o
o
I
lD
p
p
p
!o
lo Volumen 5: Punteros en C Unidad l: Punteros i
lo @ Copyright tBM Gorp.2002
Los materiales del curso no pueden ser reproducidos total
fo o parcialmente sin el permiso previo escrito de lBM.
lo
I

lo
o
rt
oF
o:
.t Gua del Estudiante
lntroduccin a la Programacin con C

O'
o Unidad 1: Punteros
Oi
q Objetivos de Aprendizajes
d
t .
Al finafizar esta unidad, usted ser capaz de:
.
o Definir los punteros y describir su rol en la resolucin de problemas

o ' Discutir los conceptos fundamentafes de punteros, variables, drecciones de


memoria y referencias
o . Explicar cmo hacer declaraciones de punteros
o
o ' Discutir el uso de tos punteros para pasar parmetros a las funciones por
referencias
o
o ' Explicar funciones que pueden recibr aneglos unidimensionales
a travs de punteros
como argumentos

o
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'olumen 5: Punteros en c
o . @ Copyright tBM Corp. 2002
Unidad 1: Punteros 1
o Los materiales del curso pueden
no oueden ser reproducidos
reo total
o parcialmente sin elpermiso previo escrito de lBM.
o
o
)
Introduccin a la programacin
con

L Fundamentos de punteros
En el vofumen anterior, se estudiaron
fas funciones en c. En este volumen se
uno de los conceptos ms importanies discutir
de C, OJ prnteios.
un puntero es una variable en c que
representa una direccin de un efemento
en la memoria' un puntero de datos
dato inc' un elemento f l-oat,
"prtJ
un oirecqo memora donde un efemento de
un.elemento char,"n un arregfo
pueden encontrar. Los punteros o una estructura se
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
reseryar tanta memoria como lo requr=era memoria, es decir,
la estructura de datos , en vezde estar
timitado por anegtos de dimensoni
v t#n" ii",
Para entender er concepto de punteros,
declara en un programa.
se discute que sucede cuando 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
referenciados con uno de eilos especificaoos contenidos y la direccin son
en parntesis.

Nombre de la
variable
-----------> x
(Nombre de la
direccin)
----------+ Valor en fa
5 posi cin
Direccin de la
variable (Contenido de
(Direccin de 1a 435s8 1a variable)
variabl-e)

-
Grrica para int x - s;
A continua",u, ::,ffintacin
Printf """t;:::
("?d1r" , x) ;
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
de lBM.
"rtto
o V
o t
Gua del Estudiante
o lntroduccin a la Programacin con C

o El cdigo anterior no imprme elvalor de s, por el contraro


imprme el valor 436s8, el
o cual esel nmerodelaposicinactual delavarablex.
Alavariablex seleasignar
una posicin diferente en memoria para diferentes
o printf, se us el especificador ?u que significaejecuciones del mismo programa. En
un entero sin signo, ya que las
o direcciones son siempre positivas y almacenaas en una
cefda de memoria sin el bit de
o sgno. El operador & es el operadoi de referenca o ,direccin
de'.
o Ahora se le asigna &x a otra variabfe.
o var_nombre __ &x,.
o 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
o ubicacin donde d vator de x
est almacenado, que en este caso es un nt. La Figura 1.2
o muesra que var nombre
apunta a memoria
o
o Valor de x, gue
o cq q

o
o Figura 1.2: Relacn entre var_nombre y x
o
o l.l. Acceder a Valores Usando punteros
o 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
o 'desreferencia'. El operador de indireccin provee
operador de
o el valor de ta variable x
indirectamente a travs de fa variable puntero, y no drectamente
a travs de la variable
o misma' Por lo tanto, se puede acceder af valor de x como *var
nombre. Ahora bien,
o si se escribe fa siguiente sentencia printf (,,?d1,, *r"r_ro*l;
, ," imprime s.
De manera que ambos x ! *var-no*bt" se refieren
o al mismo elemento de datos (es
decir, el contenido de la mismZ posicin de memoria). Considere
o sentencias:
fas siguientes
o var_nombre = &x;
o y = *var_nombre;
o La primera sentencia coloca la dreccin de x (o el puntero
de la posicin de x) en la
o 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.
o una variable puntero debe ser decfarada antes de que sea usada.
o En general, una
declaracin de puntero se hace como sigue:
o tipo-de-dato *variable3uncero,.
o El tipo-de-dato se refiere al tipo de dato del objeto en consideracin, y la
I variableiuntero es el nombre de la variable puntero que se est declarando. Note
p que.se debe preceder el nombre de la variabie puntero *.
con un carcter Las
siguientes son afgunas dectaraciones vtidas oe puntros:-
lD inL *nombre_var;
p float *temp;
o
!

Volumen 5: Punteros edr C


Unidad l: Punteros 3
@ Copyright tBM Corp.2002
Los materiafes der curso no pueden ser reproducrdos total
o parcialmente sin el permiso previo escrito de IBM

o
Gua del Estudianie
char *pva1,.
An cuando las declaraciones anteriores apuntan
variables punteros mismas sfo pueden a diferentes tipos de datos, las
contener direcciones.
una variable puntero en la mbma decraracin
ffiffij!,#cializar taf como se muestra a
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
nombre-war apuntando a una cantidad entera.
enteras ;
" ;,tam-bni" ;ri,L puntero
declaracin, tat como se hizo con otras variables
se puede tener la siguiente
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
' v' rqvru nombre
rrutt'rrr var coo e{
CafCtef *. -

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
los argumentos a travs de los parmetros a
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
puede escribir una funcin llamada cmo se
argumentos e intercambie su contenido?
swap que tome dos variables ", "ri,
enteras como
una de las funciones importantes de los punteros
por referencia, la cual contiene la es que permiten pasar argumentos
direccn der ;rgr;;"jo, a una funcin.
referencia se hace con punteros. Por pasar punteros Este pase por
pasa una referencia en vez de un valor. a funciones como argumentos, se
El parmetro formar
declarado especificamente con un asterisco ; precedinJoro. corespondiente debe ser
se sabe que cuando se LEan las siguientes funciones,
las funcones como valores (o parretros
se estn pasando argumentos a
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
pasa a una funcn), fa direccin (es decir, cuando un puntero se
del elemento oe o"io s" pasa a fa funcin y
no su
vr rrvqv l. r ul tt
Volumen 5: pGros-en C7-
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.

-
o
o
o Gua def Estudiante
lntroduccin a la Programacin con C
o valor' El contenido de la posicin (es decir, el elemento
de dato) se pueder acceder sin
o ninguna restriccin dentro de la ferncin. si se hace
cuatquier modificacin al elemento
o de dato (el contenilo. de la posicin de memoria usanoo
este puntero, los cambios
realizados sern reflejados tanto dentro de la funin
o llamando a fa funcin.'
como en el programa que est
o cuando un puntero se usa como un argumento, ofrece
ef acceso y la capacidad de
o alterar las variables gfobalmente desde dntro de
la funin. sin debe ser
cuidadoso cuando se pasan punteros coTo argumentos,
o ya "r"r!o,le
que son capaces de
modificar elementos de datos s la.funcion quJ lima.
o resultar en un efecto de ondas de cambios en otias
eso peo" veces
,1. der program "rgun",
o A continuacin se presentan algunos ejempfos para entender cmo trabajar
con
o punteros.

o Ejemplo l.l: Funcin para tntercambiar de Variabtes


o I, El problema es escribir una funcin para intercambiar el
o I.
enteras. Se invoca la funcin como sigue:
contenido de dos variables
o intercambiar (ax, ay) ;
o l
;

o I La funcin inLercambiar para reafizar esta tarea es como sigue:


o t, void intercambiar(int *p, int *g) {
o /* Note los argumentos formales */
o int. t.emp,.
o /* Contenido de p se almacena en temD */
temp = *p..
o /* Contenido de q se mueve a p */
o *n
- *a.

o /* Contenido de temp (p) a q */


o -g = temp;
o return;
o
o Los comentarios exprican ertrabajo de ra funcin
compfetamente.
o
o
Fin del Ejempto l.i
Generalmente, una funcin toma varias entradas y produce
o As que, las entradas pasadas como argumentos
una salida de un solo valor.
O' a la funcin no deben ser modificadas
dentro de la funcin. An si se modifican, sus consecuencias
oi programa que llam a la funcin. no deben afectar afuera al

ol Esto se debe a que todos los parmetros para


una funcin en c son pasados por valor.
o,l En el caso que un vafor modifcado tiene.que rui
llama a la tuncin, una referencia (puntero)
run""co fuera en el programa que
o ; t;;
intercambiar, x e y se declaran como variables plnt"ror.a h tuncin. En ra funcin
oi
ot Ft :f prximo ejemplo, se presenta cmo se pasa un anegto como un parmetro a una
funcin.

Volumen 5: punteros en C
Copyright IBM Corp.2002
@
Unidad l: Punteros s
Los materiales derorrso no pueen'seiiproducidos
totat
o parcialmente sin ef permlso previo escrito de IBM

It
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 ) como sigue:
void main O i
int vect.or [100] ;

frirrtr(..Lasuma de los elementos impares es ?d\n,,, \


sum_impar (vector) ) ;

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
primero. En ambos casos, int vector
que el
[] y *vector declaran slo un puntero como
el argumento formaf. El punto importante notar aqu, es que en c lo;
pasan a las funciones sfo como referencias. El anegfos se
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
una aneglo se refleja en la funcin que la invoc.
{r" r" nug en la funcin a

La funcin para este ejemplo de presenta a continuacin:


int sum_impar (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),.
)

Fin del Ejempto 1.2


A continuacin se discute cmo pasar arregtos a la funcin scanf (
). !
j,

@ Copyright IBM Corp.2002


Los materiares der curso no pueden ser reproducidos total
o parcialmente sin el permiso prevo escrito de lBM.
a
a Gua del Estudiante
o ramacin con C

o 2.1. Pasar Arreglos a scanf ()


o se sabe que para feer variables int, f 1oat, y char se debe usar la funcin sr-:nf
o precedidas por un carcter & , tal como se ilustra a
continuacin:
1)

o int x; float p; char ch,.


o scanf (,'*d Zf tc", &x, &p, &ch);
a Sin embargo, cuando se intenta feer cadenas en un anegfo,
scanf O no requiere el
carcter c.
a char fnombre [45] ;
o scanf(*?s,,, fnombre); /* Ntese que no se usa & */
o scanf require la dreccin de manera que los elementos de datos
o se puedan almacenar
en la ubicacin coffecta. Por to tanto se debe suministrar como
6x, &p y &ch. Dado
o que fnombre es el nombre de un.arreglo que representa
una direccn, y no un
a efemento de dato o un valor, este no debe star pr"."io por
un & en scanf .
o A contnuacin, se se pueden
9slug'.a Tto
ubicar elementos individuales
calcular las direcciones en los arreglos y
o en tbs arregtos. Tambin rJ i"no"ii tos
subndices y direcciones trabajan juntos. "oro
o; 2.2. Aritmtica de Direcciones
o:
o Se va a disctfir brevemente fa aritmtica de direcciones. Una
se da en la unidad 3 - Punteros Avanzados de este volumen.
discusin ms detallada
I reafmente un puntero al prmer elemento del areglo. S
un nombre e anegto es
caj a es un arreglo
o unidmensional, la direccn del primer elemento peoe
ser referenciado como
I &caja[0] o slo caja- Las direcciones de los otros elementos
como sigue:
se pueden obtener
o
zd" elemento caj a [1] o (caja + r)
o e

3"'elemento &caja [2] o (caja + 2)


o
o
o imo elemento &caja Ii -1] o (caja+i-1)
O (i+1)moefemento ccajalil o (caja + i)
o Ahora se tienen dos formas de escribir as direcciones
de tos elementos de un arreglo,
O
ccaja[i] ycaja + i- Notequelaexpresincaja + ivaasertratadacomouna
expresin especial que suma la direccin del primei
o elemento de caj a e i . por lo
tanto, fa expresin caj a + i es una representacin
simblica de ,n, p""ificacin de
o direccin, en vez de una expresin aritmtica. se puece
usar esta'expresin sin
o 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
a toma 8 bytes por elemento).
elemento) as 6mo f loar (que
o El sunndice i tambin se llama desplazamiento (offsefl
en este contexto. Si cca j a Ii]
o Y (caja + i) se refieren a ra misma direccin, entonces cajatir y *(caja
O deben referir al mismo contenido de las direcciones,
+ i)
es decir, el valor del (i+t)mo
o elemento de caj a. Entender este concepto proporciona
suficiente informacin para
o
p Volumen 5: punteros en C
p @ Copyright tBM Cr:rrp.2002
Unidad l: Punteros T

l. Los materiales del qrso no pueden ser reproducidos total


o parcialmente sin el permiso previo escrito de IBM
o
o
o
poder escrbir funciones que
tomen un aneglo unidimensional
sobre ste' Los siguientes oo"";"rpros como entrada y actuar
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.
escribir una funcin lfamada Ef problema es
busgueda que tome como entrada ta
elemento del arregfo, el nmeioiJi direccin def primer
o"'"rementoi-eriet arregto y er nmero
que se
ff:tr3J:tr"i}yfl::h-*Jil"'gT,'il;1f"?,f en eicur er nmero que se
s.e usar un argoritmo simpre, donde.
ra bsqueda se- comienza desde
eremento en er arregfo y se contina
buscanob a ir*, der arregro
ef primer
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


expresin * (caja + k) ayuda
prinerelementodel arregro
a acceder secuenciarmente n, r",n*iJs caja.La
de tumo, ya que k va desde o hasta oer anegro
realmente refiriendo al primer
n-t. Inciarmente, cuando
-cuando k es 0, se est
efemento t es 1, se accede ar
prximo elemento' y as ucesivamente. der a'egro-
En un ouciterativo, si todos los
elementos det
fi':t"'l;f"Xifl:J er numb, sto se hace rerurn
ffiff:contr (-t)
paraindicar

Ef 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 num),.

mainO {

s m a re ri a,". ?"?lll# ll, [0"".,i1


Lo
i
o parcialmente sin elpermiso previo
?:;,".
"?
escrito de lBM.


{
a Gua del Estudiante Introduccin a la Prooramacin con C
o
o inr caja[100], k, tam, num;
o /* Leer el tamao del arreglo*/
printf ( "fngresar e1 tamao del arreglo [1, 100] \n', ) ;
O
oot
O
scanf (u?d", &tam) ;
a ) while (tam < r ll tam > 100);
a /* Ieer e1 arreglo mismo */
a for (k = O; k < tam; ki+) i
o printf("fngresar 1os elementos de1 arreqlo\
a ?d\n", k) ;
o scanf ( "?du, ccaja Ik] ) ;
o )

a /* Leer el nmero a ser buscado */


printf ("Ingresar e1 nmero gue a buscar\n"),.
o scanf(n?d", &num);-
o /* Invocar busqueda e imprimir eI resultado *,/
o if (busgueda(caja, tam, num) -= -1)
o printf("?d no fue encontrado en eI arreglo\
o \ft,,, num) ;
o else
o printf("*d fue encontrado en e1 arreglo\
o \n", num) ;
o )
int busgueda lin|- *ni: * inl- f-qlltr
-- in
rlu -'.-\
tlull,/ I
o int k
-*J ' 1

o whi ]e (k < tam) {


o if (*(caja + k) == num)
o return (k) ; /*num encontrado en k * f
o ef se
o k++;
O ]
o ret.urn (-1) ; /* num no encontrado * /
o ]
o El cdigo C finaliza aqu
a Fin del Ejemplo 1.4
o
En el ejemplo anterior, se ha pasado elaneglo como argumento a la funcih busqueda.
o La direccin del primer elemento del aneglo se pasa a la funcin, la cual es aceptada
o como un puntero en la funcin.
a
o
o
o
Volumen 5: Punteros en C
' Unidad l: Punteros I
Corp.2002
@ Copyright IBM
o Los materiales del curso no puden sr reproducidos total
o parcalmente sn elpermso previo escrito de IBM
o
o
o
Introduccin a la Programacin con C Gua del Estudiante

Ejemplo 1.5: ltercambiar los Elementos de un Arreglo

Considere int 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 t?
o
Gua del Estudiante Introduccin a la programacin con C
o
o /* Funcin que intercambia va1ores */
o vold intercambiar(int *caja, int n) {
o rnt tope = 0, base,-
o base=n-1;
while (tope < base) {
o cambiar (caja + tope, caja + base)
o COpe++;
,-

-
o base - - ,.

o )
o rtrtr.

o )

o
o ,z* Funcin que cambia l-os walores */
void cambiar(int *p, int *q) {
o int temp,.
o temP = *P,' //
* (1^f a
vvruvqv p almacenado en temp
i Aa de
o *p = *q; ,/ *
l-nn t- cn i n de q movido a p */
o *q = temp,' /* Contenido ue ^^ temp (p) a q */
o return;
o )
o El cdigo G termina aqu
o
o
o
o
o
o
o
o
o
o
o

Volumen 5: Punteros' en C Unidad 11


Copyright IBM Corp.2002
@
Los materiales del c[Jrso no pueden ser reproducldos total
o parcialmente sin el permiso prcvo escrito de,lBM
Introduccin a la Programacin con C Gua del Estudiante

Resumen
Ahora que ha completado esta unidad, usted ser capaz de:
o 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 Introduccin a la p amacion con C

a
o Unidad l:Examen de Autoevaluacin
.iI 1) En el parmetro formalde una funcin, cmo se declara arreqro?
a) int *arreglo
rf
v5 b) int arregto []
c) int arreglo
f'E
:
d) Todas tas anteriores
q 2) Cuando se pasa un arreglo como argumento a una funcin que ha declarado una
O variable de puntero en el parmetro formal, fo que realmente se pasa es

o a) Nmero de elementos delareglo


o b) Dimensin delanegfo

o c) Los valores enteros que constituyen el arreglo


o d) La direccin del primer elemento del arreglo
o 3) Cules de los siguientes es la fornia correcta de declarar un puntero inreger?
o a) int x;
o b) int *X,.
o c) int 'tx = 3;
o d) Ninguna de las anteriores
o 4) Cules de los siguientes son formas correctas de declarar un puntero f loat?
o a) float x,.
o b) f loat *xi
o c) float *x = 3;
o d) Ninguna de las anteriores
o 5) Cules de las siguientes son usos vlidos, cuando el arreglo char caja tlol
o se declara?
o a) scanf (.,?c,' , &caja iOl ) ; ,

o b) scanf (..?s" , &caj a) ,.

o c) scanf (..?so, caja) ;


o d) Ninguna de las anteriores
o 6) Variables punteros como int, f loat, char pueden solo almacenar direcciones.
o a) Verdadero
o b) Falso
o
o
o
o
o
o \/oJumen 5: Punteros en C
o Unidad l: Punteros 13
@ Copyright tBM Corp. 2002
o Los materiales del c{.rrso no pueden ser reproducidos total
o parcialmente sln el permiso previo escrito de IBM
o
o
o
7) un aneglo se pasa
a una funcin como un parmetro, qu se pasa
:f&fli" ar

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
est pasando a la funcin. de memoria se
a) Verdadero
b) Fatso
9) Para la declaracin inr a[100] inr i, cures de
exprecin especial, y no una expresin fos siguientes es una
aritmtica iegutar.
a) (a + i
b) (*a + j,
c) *(a + jr
d) (*a + *j)
10) Para la declaracin inL a t1001 e inr j,
la referencia _
la expresin * (a + j ) es equivalente a

a) a Ij -rl
b) a [j +1]
c)a
d) aijl

Pun t'eros -en c 1 4


Los materia,", ?"?lllJinli'i[.""?i?;??:;,"J"",
o parcialmente sin el permiso previo escrito
de fBM.
;"
ol
of
olF Gua del Estudiante Introduccin a la program a: ,- ,-- -
oljr Respuestas a la unidad l: Examen de Autoevaluacin
o
ol, 1) ayb
oli 2)d
oltlr 3)b
ol: t 4)b
ol, 5) ayc
ol 6)a
7)c
oi
o 8)a
o 9)c
o 10) d

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
a
o
o
o
o
o
a
?
?
o
tI Volumen 5: Punteros ten C
.1 @ Copyright IBM Corp.2002
Unidad 1:

Los materiales delcurso no pueden ser reproducidos total


Punteros 15

o parcialmente sin el permiso previo escrito de IBM


ti
?
o
o
o ?
o ,f Gua del Estudiante Introduccin a la programacrn cc- _

o
o Unidad 2: Laboratorios de Punteros
o
o Objetivos de Ap rend izaje
o
o Af finalizar esta unidad, usted ser capaz de:

o . Usar punteros para manejar soluciones a problemas

o . Escribir programas en C que implemente algoritmos que involucran el uso de


punteros
o . Pasar aneglos unidimensinales a funciones usando punteros
o
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 17


@ Copyright IBM Corp. 2002
Los materiales delcurco no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
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 . dado el nmero de
elementos a ser ledos N.
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
posicin de inicio V fin del arreglo, y
arreglo, la
ordena /os ejernentos en orden
descendente.
d) imprimir-salida toma un puntero a un arreglo corno ent;-ada r;. e rmprime el
arreglo en la forma taf como est.
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 Gua dei Estudiante Introduccin a la Proqramacin con C
o
o
o Unidad 3: Punteros Avanzados
o
o Objetivos de Aprend izaje
o
o Al finalizar esta unidad, usted ser capaz de:
o . Explicar la aritmtca de direccbnes
o . Describir un puntero a puntero y un arreglo de punteros
o . Discutir cmo decfarar y usar punteros con estructuras
O ' Explicar cmo pasar funciones como argumentos a otras funciones a travs de
punteros
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 Volumen 5: Punteros en C
o Unidad 3: Punteros Avanzados lg
@ Copyright tBM Corp. 2002
o Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo esoito de IBM
a
a
o
Introduccin a la programacin
con C 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
de los punteros y sus usos. Para recalcar, aprender un poco ms acerca
tipo de dato' se t'b"..g.Y9 c provee
ru pr"'o edrar pr;i;;
para cuafquier
tipos de datos estndar como inr, floar
Le da adems la posibitiaad af programador o char.
de decfarar tipos oe oatoi'definidos por
usuario' Estos se definen con fa ayuda el
de estiuctuig.v oe_ rlpedefs. Dado que
definidos por er rsuario estn prritior, los
:ffi"ir"r"ftos c p"irit" ar punteros a
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,
j.
ff ,"5H,. il j,t;['fl: I I i,lli"il ; ;; ;;;
e s
"u
n oa o co n,

al
c o n p ra
r

" ",
"s,:
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
corresponda a una posicin en la mem
ptr puede contene.r cualquier varor que
oria I qr"'p"rt"nece al tipo de dato
fenguaje c permite sfo dos op"r""ion"s, entero. El
adiin y resta, sobre las variables punteros.
Lo importante acerca de los punteros
es que la variable puntero est asociada
tipo de dato. por lo tanto, se pueo con un
Jecfarar ro ,igun1.
inf *'iF?.
LL/LL,

. char *cpLr,.
float *fptr,.
Estas tres variables punteros son diferentes
almacenan la direccin.de una pson en naturale za, an cuando ellas todas
r"roi. p"r"
".rl est asocado esentender
direcciones' el tipo. de.dato at qle el puntero la aritmtica de
significante. Este es el
:11Hff"".:i"Yr?$*T or" se usa en er crcuro de ta qL,e invorucra
"*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
elemento afmacenado en esa posicn. al
La aritmiica de drecciones normalmente
aplica cuando se usa con arreglos. La se
aritmtica de dircciones no se puede
tipos de datos como int o usar con
porque el contenido de la prxima posicin
"Lr
conoce' Tanto fos aneglos unidimesionales no se
como r-ooimensionales se almacenan
en posiciones de memoria contiguas.

'- "",' ; ; * 8"?lllJin I l,' F.[&",i',;? ?:;,"


",
o parcialmente sin el permiso previo escrto cte tBM.

A
t
.F
of
o:f Gua del Estudiante Introduccin a la P

o 2.1. Operaciones Usando punteros


o Es interesante notarcmo C integra punteros, arreglos yaritmtica de direcciones. Lcs
O arreglos en C implcitamente usan aritmtica d direcciones para acceder a sus
o,l elementos. Se dscutir al respecto posteriormente. A continuacin se presenta la
oj 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};
a 'rt *ptr = arreglo;
o -
Se sabe que el nombre de un aneglo almacena la direccin de su oensimo elemento.
o Esta direccin se asigna a la variable puntero pLr, como se muestra en la Figura
3.1.
O
o Direccin
o de Memoria
de la
a Posicin
o 1028
o 1030
! 1032
a
1034
a
a 1036

I 1038
o 1040
o 1M2
o 1044
o 1046
o
o ptr
Figura 3.1: Direcciones de la Variable Puntero

o Ambos arreglo Y ptrapuntan al primer e{emento de arreglo. Se puede usar


cualquiera de las siguientes cuatro formas para acceder a los elementos d arreqLo:
o o drr91o [i]
a o *(arreglo + i)
o . ptr [i]
o
. *(ptr + i)
o
t 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
t almacendo en la posicin (i+r isirna. para entender cmo se hace, vase
la sintaxis
b de las tres posibles operaciones sobre los punteros:
t <variable puntero> + <operando entero>
p <variable puntero> - <operando entero>
I <variablel puntero> - <variabl"e2 puntero>
p Volumen 5: Punteros eh C Unidad 3: Punterc Avanzados 21
lp @ Copyright tBM Crirp. 2002
lp Los materiales del curso no pueden ser reproducldos totat
I o parcialmente sin el permiso previo escrto de IBM

o
o
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
nmero representado por un opendo e/
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
;?r"",:",ff r5"HHoJ"Lln "rnados ta

PCr+4t'2
prr + B
Esto es equivafente
De este modo, si a pcr se re ha asignado
ra direccin roze, Ia expresin ptr
resurtar en 103e, donde ef 5ro eremento
est disponibre. Note que ro:e _ 1028
+4
ocho bytes, y dado que cada entero ocupa dos bytes, eS
pasado es sfo cuatro' Esta es la el nmero actual de elementos
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> _
ya que produce como resultado el nmero <variable2 puntero>, es diferente,
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
su primer elemento, arreglo + i retorna direccin de
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
desreferencia *' Asse indicar * (arregl0
! prr + i S debe usar er operador de
+ i) y * (prr + i) respectivamente.
arregl0 til ptrtil
y son diferentes formas de expresar *(arresl0
+ i) y *(ptr *
i)' respectivamente. As, cuando se dice
ptrtii,
er compirador est reafmente
realizando el siguiente cfculo:
"(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 Gua del Estudiante Introduccin a la ramacin con
o C

o Similarmente, arreglotal tambin recupera el elemento s0, ya que usa la misma


frmula subyacente para acceder al elemento.
o
Sea el sguiente segmento de cdigo.
o pr = arreg1o,.
o /* 1-028 asignado a p:ur */
ptr = ptr + 4,.
o ltt:tl Printf ("?d1", * (ptr t
/* plr 1e es ahora asignado 1036 * /
/* salida so * /
o pcr=ptr-2; ./" ptr Ie es asignado ahora 1032 */
o lrlf Printf (u?d\n', * (ptr) ) ; /* Ia salida es 30 */
o Ya que ptr es una variable puntero, a sta se le puede reasignar nuevos valores.
Se
o 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
o tiene
un mecansmo incorporado para la verificacin de los lmites del angl. Eiprogramador
o' debe ser, por lo tanto, muy cuidadoso. Tome por ejemplo, las siguierit,es delaracones:
o ptr=ptr_4;
o "(Ptr=*(Ptr)+10;
o Se asignar dentro de ptr el valor 1024, y un valor r-0 ser sumado alelemento en
esa
o 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
o resta en ptr se pudo haber modificado el valor de alguna otra variable que no se
o debera modificar. A pesar de que los punteros son extremadamente tiles en certas
o stuaciones, estos pueden ser una pesadilla para el programador si se usan
incorrectamente.
o
Para entender las operacones de resta cuando dos variables punteros estn
o invofucradas, vase la siguiente declaracin:
o int arreglo [10] = {ro ,20 ,30,40,50, 60 ,7o, Bo, g0,100 } ;
o in *pt.r1 = arreglo;
a int *pEr2 = arreglo + 5;
o Se han declarado dos^ varables punteros, cada uno asignada a dos diferentes
poscones eh arreglo. Se muestra en la Figura 3.2.
o
o
o
o
o
o
o
O
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
objetos presentes entre estas dos variables. de
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
variables punteros no es significativa por de fas dos
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
operaciones aritmtca de direcciones es fo rro que se reatizan
usar ef nombre de una
varable puntero (la cual apunta al
reglo) para la
operacin de resla- no debe ser eiecutda rir"
operacin. sin embargo, la
con ef nombre del areglo. El compifador
reserva memoria para tn anegro, y er
espaco ocuaoo por r-Jrr"gro durante
ejecucin del orograma no debe alterarse. ra
Ef nombre'der aneglo contiene fa direccin
del primer efemen"to, er cur no
As' se puede decir que d valoilr!J"
,"r cambiado durante la ejecucin det programa.
oe L ireccion mntnio" el nomoi Je-r a'eglo,
una constante' y el-nombre del areglo
significa ui" piit"ro "nconstante. Restar un es
de a este puntero constante no tenra vator
"ti, v" {
resuttar en una ireccin que
con ra direccin usada en ra opeacion.
ffi?il:i: Sea por ejempro ra siguiente
arreglo _ 4
Esta resulta en una posicin que est
antes de roza, que no es parte detarreglo que
ha declarado, teniendo en cuenta se
!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 ' ?33,,
el permiso previo escrito de lBM.
:F Gua del Estudiante _ Introduccin a la proqramacin con
?lf
ril 3. Puntero a Puntero
c

o1
.ll
:il 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
rtr
:t
oll se puede tener un puntero a un puntero.

olt Sea la declaracin de algunas variables:


int x, *y, **z;
oll Se sabe que x es una variable entera, e y es una variable puntero entera. **z indica
ol* que es un puntero a una variable puntero entera. Asuma que x est en la posicin 508,
o y contiene 10. Se muestra en la Figura 3.3.
o
10
o
o 508
o Figura 3.3: Dreccin y Gontenido de una Variable puntero
o
Suponga que se realiza la siguiente sentencia:
o
o Y=&x;
y se asume que y est almacenda en memoria en la posicin L024. La posicin de
O" memoria de x e y S rTruStran en la Figura 3.4, despus de la sentencia y = &x; S
o, ejecuta.
o 10 508
o
o s08 !024
o Figura 3.4: Posicin de una Variable puntero y su Contenido
o
Ahora suponga que se escribe la siguiente sentencia:
o Z = 6rY;
o Se asume que z est asignada en.memoria pn la posicn
o ::08. Las posiciones de
memoria de x, y \ z Se muestran en la Figura 3.5.
o
o 10 v 508 L024
a
a 508 r024 33 08
a
Figure 3.5: Posicin de Variables puntero y su Contenido
a
Io Note que sise tiene que obtener el valor 1o en x (en ta posicin soe) se debe escribir
printf (*&d, , x) ;

t?
I

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
.'
l
?
Copyright IBM Corp. 2002
@
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM

?
o
Introduccin a la Gua del Estudiante

Printf("?d" , **z) ;
C permite que esto sea extiendapara teer un puntero a un puntero a un punrero
puntero, y as sucesivamente sn imte. Pero esie tipo de definicin tiene
a un
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. un arreglo de bidimensional
se defini como sigue:
Cipo-de-dato arreglo Ic_expr1] [ c_expr2] ;
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 inr ! char. El tipo
de dato f loar no se puede usar como subndice de aireglos
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.
U
o
o
Gua del Estudiante Introduccin a la programacin con
o C

o permanece la misma. Esta definicin de arreglos bidimensionales es ms apropiada


cuando se le compara con la convencional.
o
o rl 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:
o il *(x[3] + 6)
o En este caso, x t3l es un puntero alprimer elemento de la fila 3, y (x [3] + 5) apunta
o al elemento e (et sptimo elemento en realidad) en la fila :. Por fo tanto la expresin
o * (x [:] + 6 ) se refiere a x [3] t6l .
o En general, para acceder a x [iJ I j ] , se puede usar lo siguiente:
o *(xlil + j)
o Su.p_on_ga que se desea tener un areglo tridimensional de enteros, for ejemplo de S x 10
x 15. Se puede expresar ste como un arreglo
o tiene lo siguiente:
bidimensional de puntros. As que se

o inr *yIs] [10],


o Nota: En este caso, se est tratando con 5 x 10, es decir, 50 punteros, cada uno de los
O cuales apunta a un aneglo unidmensional de enteros. Un elemento individual de un
o arreglo tridimensional, el cual convencionalmente se accede como lil t j I [k] se
puede acceder como sigue:
v ,
o *(ytil tjl + k)
o Los anegfos de punteros son muy tiles para almacenar cadena de caracteres. Cada
o elemento del arreglo es un puntero a carcter que define el principio de una cadena
o 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.
o
Un mtodo convencional para almacenar los 10 primeros nombres de personas es tener
o fo siguiente:
o char fnombre [10J [30] ;
o Se puede tener 10 nombres. Cada uno de estos puede tener un primer nombre tan
o largo como 30 caracteres (realmente 2g, y un \o carcter nulo). Una mejor forma de
a hacer esto es tener lo siguiente:
o char *fnombre [tO] ; ,

o 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
o puede tener cada uno de estos nombres, en otras palabias no se tiene que especificar
o el tamao mximo de la cadena.Pero tampoco significa que se puede tener cualquier
o nmero de caracteres que se desee.

o 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
o 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
O los tpos ocupan.
I
consdere elsiguiente ejemplo donde eloperador szeor o se usa:
? fnombre[i] = (char *) malloc(30 * sizeof(char));
?
I)
Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 27
ff @ Copyright tBM Corp.2002
Los materiales del curso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
p
P
o
se puede acceder a los caracteres individuales en la cadena de caracteres
como
fnombre 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 ",rirr"r.
sea un ejemplo de manipulacin de cadenas de caracteres, para
entender mejor el uso
de los punteros a cadenas de caracteres.
Ejemplo 3.1: Usar punteros a Cadenas de Caracteres

La entrada al programa son cuatro cadenas de caracteres.


siguiente:
se requiere hacer lo

' comparar la primera cadena de crracteres con todos las


caracteres y verificar si la primera cadena de caracteres otras cadenas de
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
Gua del Estudiante
oi* Introduccin a la macin con C

t stringsIi] = (char *) mal1oc( ( strlen(stri-ng) \


a + 6 + 1 ) * sizeof(char) );
O,;3 strcpy(strings [i], strlng) ;
ol; I
)

o nrintf
rr4!!
/rr\-nt.
\ \r / ,

Oi for (i = r; i . TAMANO; i++)


O if (strcmp (strings [0] , strlngs til ) == 0)
Oil printf("String 1 ?s = St.ring td ?s\n",\
strings [0], i+1, strings Ii] ) ;
o else j-f (strcmp (strings [0J , strings t j-] ) . O)
o printf (,,String 1 ?s < String ?d ?s\n", \
t strings[0], i+1, srringsIi] ),.
e1 se
o print.f (',String 1 ?s > String ?d ?s\n',, \
o st.rings [0], i+1, strings Iil ) ;
o
o /* Concatenar los strings de ent.radas dado por e1
o usuario */
o printf("\nlos strings depus de Ia \
o concatenacin son: \n,') ;
o for (i = 0; i . TAI'ANO; i++) {
o sLrcat (strings Ii] , " ,') ;
sLrcat (strings Ii] , ,,co1or" )
o ,-

printf ( "?s\n", strings Ii] ) ;


o
)
o )
o /* La funcin main termina aqui */
o El cdigo C termina aqu
o
I se usaron las siguientes cuatro funciones de cadenas de caracteres:
o . int strl-en(const char *)! Una funcin que toma un puntero a una
o cadena, y retoma la longitud de la cadena.
o . char * strcpy(char *, const char *): una funcin que toma dos
a cadenas y copia la segunda cadena dentro de la primera cadena.

a o int strcmp (const char *,


const char *) : una funcin que toma dos
cadenas y retoma 0 siambas denas son iguales, < o si la primera cadena es
o menor que la segunda y, > 0 si la primera cadena es mayor que lat segunda.
o . *
char strcat (char * const char *): Una fUncin que toma dos
,
o cadenas y concatena (une) las dos cadenas agregando la segunda cadena a la
o primera.
a Volumen 5: Punteros en C Unidad 3: Punteros Avanzados
o Copyright IBM Corp.2002
@
29

o Los materiales det crlrso no pueden ser reproducidos total


o parcialmente sin el permso prevo escrito de IBM
o
o
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


asignacin dinmica de memoria. Normalm"ni",-i memo-ria de C, llamada
programa se compila. Pgro la asignacin dinmca
se signa cuando el
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:
o tamano es el espacio requerido, el cual se obtiene por strlen(string) *
sizeof (char) .

o str]en (string) retorna la longitud y se multiplica por el tamao del carcter,


elcual es 1 byte.
o 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,
simplemente fa funcin srrcpy para copiar er string a
se usa
funcin, la cual es til para liberar memoria dinmicamente.
strings til .
Existe otra
Esta eJ void f ree (void
");' Esta funcin libera el espacio de memoria asgnado por ma1loc
pueda ser asignado nuevamente. Aunque no se ha plicado
de manera que
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.

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
9P9 es menor que a!9, ya que el segundo carcter p viene 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 Gua del Estudiante Introduccin a la Prooramacin con C
ot
o' String 2: ye11ow
o String 3: blue
e Ql- rinn 1. dra

.f St.ring 1 green String 2 yellow


.f String 1 green at-rinn
veY ? l.r'l rro

e String 1 green String 4 green


a
o Los strings despus de 1a concatenacin son:
o green color
o yellow color
o blue color
green color
o
o Fin del Ejemplo 3.1
o
o 5. Puntero a Estructura
o
Se puede tambin tener punteros apuntando a estructuras. Suponga que se tiene la
o siguiente estructura:
o struct persona {
o char nombrel45l;
o int edad,.
o f loat. peso,-
o );
o Se puede crear una varable e inicializarla como sigue:
o struct persona estudiante = {".lack", !t, 65.5);
o Se puede tambin definir un puntero a esta estructura:
ql- rrlcl. ar<^ * ct- r .
o
o Esto permite tener una asignacin a sptr como se muestra a contnuacin:
spt.r = &estudiante;
o
Usando esta variable puntero a una estructura llamada sprr, se puede acceder a c;,da
o componente individualde la estructura como se muestra a continuacin:
o sptr- >nombre
o sptsr- >edad
o spEr- >peso
o Se ha accedido a los miembros indviduales de una estructura usando el operador
o =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
o -iembros de la estructura.
o
o
o \/clumen 5: Punteros en C Unidad 3: Punteros Avanzados 3l
o Copyright IBM Corp. 2002
@
o Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
o
o
o
lntroduccin a la cin con C
Ga delEstudiante
6. Puntero a una Funcin
una funcin en c no es una variabF;jl:targo,,
se
punteros a una funcin,
a uai'r"0" ser coloda entrata como tar. Es posibre definir
arregtos, paiaol a funciones
retomar de las funciones' er
de que una funcin misma p,"
uso-trpico o" ,n p*t una funcin radica en et hecho
y
situacin se present" t'"n
ser pasada como un " argumento a otra funcjn.
tareas usando
*a funcn, r"rlriJ corno ra primera
funcin,
Tal
reariza
funcin. r-a primei-i;..; iicesita
segunda funcin *otra
para usarfa oentro e eila. h;o,'! .ono."i er nomore de ra
cada vez, cmo manipufa ra primera r, ."g;.J;;;;in -eses diferente
runcn' sto? na rorma
construccin switch -.. case
e invocar fa segunda funcin ,."r"uni"l tener una
para realizar esto es recibir La forma ideal
fa funcin en si mJm"-aoro un.
la primera funcin ilvoca ta segunoa argumento, de esta
funcin rr" tr*s de ra variabrerecibidaforma,
de funcin. A continuacon, se nieer" como
:[;;?r1t"nto mejor ;;;
travs de un
a.tr Encontrar ta Raz cuadrada de un Nmero
Fl"#lJ; usando punreros a

suponga que se tienen cuatro funciones,


que existen independientemente
realiza diferentes o"penJi"noo d a y cada una
cuadrada de un entero
-clculos. ta.r, como encontrar ra
dado d niraoa, "nir"or, raz
la.iz cuocade un dado
"noni*'
;:.:X?,.?.:THX1,,?.[H:1"'. "nt"'.o dado de nt,.ou ", pi'l ;; "t"ro ;de
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
valores se generan oepenoieno asociados. Estos
verficacin puede ser para la raz
o tipo o" uurin""Iion qr" necesite ser hecha; ra
cuadrada, la raz.ao"", etc. Esta
funcin a ser lfamada como ,; ogr;"nto; dependiendo funcin recibir ta
en cuat tabla se genere.
Los siguientes son ros prototipos
de ras cuatro funciones:
. rnt raizCuadrada (inL) ; .
r inE raizCubica (int; ,.

o int esprimo(int);
. int espaLi-ndrome (int) ;
Ef siguiente es el programa completo.
funcn' basado en el piogra*;;;;; una expficacin def uso de fos punteros
continuacn, a
sigue ar programa:
Ef cdigo C inicia aqu...

/* Archivos de Cabecera */
#incLude <stdio.h>
#include <math.h>

umen teros en C
@ Copyright tBM Corp.20O2
,t-os __
^_ materiales del curso no pueOen'seiieproducidos
o parcialmente sin el permiso previo total
O" lg^r.
"r"rito
o
o
Gua del Estudiante Introduccin a la Programe::- :_-
o _

o /* Prototipo para 1a funcin generarTabla "/


o void generarTabla (inc (*fprr) (int) );
o
o /* Prototipo de la funcin raizCuadrada */
int raizCuadrada(int x) ;
o
o /* La funcin principal comi-enza aqu */
o main0 {
o /* Se 1lama da 1a funcin generarTabla con argumento
o raizCuadrada * /
o generarTabla ( rai zCuadrada) ;

o )

o /* La funcin principal termina aqui*/


o /* La funcin generarTabla i-nicia agu */
o void generarTabla(inE (*fptr) (int)) {
o int i;
o for (i = f ; i <= 1OOOO,- i++) i
o /* Llamando a raizcuadrada */
o printf ("?d\t?d\D",i, (*fptr) (i) );
o )

o )

o /* La funcin generarTabla la funcin finalza aqi *1


o
/" Ia funcin raizCuadrada inicia aqui */
o int raizCuadrada(int x) {
o int sqrt = 0;
o sqrt = (inL) Pow (x, 0.5) ;
o return lsorf.) :

o )
o /* La funcin raizCuadrada termina agu */
o
o El cdigo C finaliza aqu
o
Hay dos funciones, main y generarTabla. generarTabla toma un argumento que
o es un puntero a una funcin. Se declara un puntero a una funcin como se muestra a
o continuacin:
o j-nt raizCuadrada(int); /* Funcin normal *,/
o int (*fptr) (int) ; /* Declaracin de un punte_ro
O a una funcin *,/
o t,
o Volumen 5: Punteros en C
' Unidad 3: Punteros Avanzados 33
o Copyright IBM Corp. 2002
@
o Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el pemso prevo escrito de IBM
o
o
o'
Powered by TCPDF (www.tcpdf.org)
lntroduccin a la programacin con
C Gua del Estudiante
fnt-r 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.
precedencia sobre *. Asi *fprr Los t l, tinen una mayor
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
variable puntero que se decrara como un puntero a una
Pasar raizcuadradad como un argumento
a una funcin (como apa. _ f).
a generarTabla "n
es recibido en
generarTabla como fptr, y la funcin raizcuadr-ada
puntero de la funcin tarcomo e muestra se invoca af deferenciar el
a continuacin:
("fpcr) (i)
i
Aqu es el argumento entero
! *f rpr es raizcuadrada y el valor
retomado el cual es
un entero se imprime.

Fin del Ejempto 3.2


El ejemplo 3'2 revela el poder de los punteros a funcin
generarTabla puede ser invocada c9n cualquier en c. La funcin
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:
o La funcin debe tomar un entero como un
argumento
. La funcin debe retomar un entero.
cualquier funcin que satisfaga las dos condicones
un argumento a generarTabla.
anteriores puede ser pasada como

P u n te ror-6-E 3
,-", ; ;";,",3"? lllJin ['
F[."".j'" ?:3,'"J
o parcalmente sin elpermso previo
"? escrito ",
;i
de" lBM.
o
o Gua del Estudiante Introduccin a la programacin con C
o
o Resumen
o Ahora que ha completado esta unidad, usted ser capaz de:
o . Explicar la aritmica de direcciones
o . Describir un puntero a puntero y un arreglo de punteros
o . Discutir cmo declarar y usar punteros con estructuras
o . Explicar cmo pasar funciones como argumentos a otras funciones a travs de
o punteros.
o
o
o
o
oi
o
o,
o
o
o

a
a
a
o
o
o
o
o
e
O

Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 35


O Copyright IBM Corp. 2002
Los materiales del c{,rso no pueden ser reproducidos total
o parcalmente sin el permiso previo escrito de IBM
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, 4.4,5.s};
floaE*fptrl =f,.
fLoat. *fptr2 = f + 3,.
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 es una declaracin vlida.
a) Verdadero
b) Falso
5) ** es usado para desreferenciar el valor apuntado por un puntero a puntero.
a) Verdadero
b) Falso
6) Todos los elementos en un areglo pueden contener punteros del
mismo tpo de
dato.
a) Verdadero
b) Falso
7) Cules de los siguientes tienen la mayor precedencia?
a)*
b) ++
c) ==
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 lntroduccin a la Proqramacin con C

:! B) Cules de los siguientes no pueden ser declarados?


a) Puntero a un arreglo
b) Puntero a una estructura
c) Puntero a una funcin
d) Ninguna de las anteriores
9) 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
10) En la declaracin
:H int * (*ptr) (int "
oll
ql Qu s prr?
a) Un puntero a puntero
$ b) Un puntero a una funcin
c) Declaracininvlida
d
I d) Ninguna de las anteriores
I
o
o
o
o
o
o
o
?
o
o
I

Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 37


Copyright IBM Corp.2002
@
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin el permiso previo escrito de IBM
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) b

pu nte ros-ETre
."" ; ;";",", ?"? lll# [' 3*g"j',"? ?3;,"J"", ;,
o parcialmente sin ef permiso previo escrito de lBM.
o --
o - rE
o PC
r Gua del Estudiante Introduccin a la amacin con C
o I

o fr i
Unida d 4: Laboratorio de punteros
o Avanzados
o
o
o Objetivos de Aprend izaje
o Al finalizar esta unidad, usted ser capaz de:
o . Trabajar con diferentes tipos de punteros
o . Usar punteros en la solucin de problemas
o
o
o
o I
I

o I

o i

o j

o I
:

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

?
?
o
F
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
7
p
I
rarnacin con C
Gua del Estudiante

Ejercicios de Laboratorio
1) Considere fa siguiente estructura definida
a continuacion:
tlpedef struct {
int dd, mm, yy;
) 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
una entrada der usuario. Las basados en
porcentaje de incremento entradas sern er-nmero der empreado
en el sueto -fu;; debe retomar y er
Debe mostra*n el nuevo
:il"jff".X]f!Si?ff;. de enor si er-nero
'"nrul"" de
c) Escribir una funcin que muestre
los detalles def empleado con
un formato.

teros anzados
r ^^ ___.
Copyrght tBM Corp.2002
@
tos materiales del q.lr so no pueden
ser reproducidos total
o parcialmente sin el permiso prevo
de lBM.
"r"rito
:t
oil
.l
ol.
.lt E-r- ntroduccin a la
f

rF
-E -* -1-h-
I- 5
--n Programacin con C
oE ry-ntI
---5Ir -R
(Codigo del Curso: Cy320)

of ---!I<F, Versin 2.0

otf
olr Gua del Estudiante
.l
ol
oi
o;
ol
o
Ol
o
o
o
o
o Volumen 6: Tpicos
o
o Avanzados
o
o
o
o
o

O
I
a
I
I
{

IBM Learning Services


Worldwide Certified Material
f 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
;in:"#i?Hff;Tlitg:: ser marcas comerciales o

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
formaf de rBM y es distribuioa prueba
osmente ,,como ninguna garanta ya sea
expresa o impfcita. Ef uso de esra'"":::_":l "r,'rin
estas tcnicas es responsabifidad ;;"i;rentacinde cuarquiera de
def,comprador y depender de ta
para su evaluacin e integracin habilidad de ste
en ef amoiente operctnat der criente.
cada tema ha sido evisao por A pesar de que
hay garanta de obtener et msmo
,,
larr,,l p"r" exactitud en una situacin especfica,
no
resuttaoo o ,no ,rr a ste en
otra
;i$,n:$":tenten
aoapti si' ii.n"; ; il;;;ffi; siiuacin.
ambientes n nacen bajo su
Los

copyright nternationar Business Machines


f

derechos reservados. corpora tion, 2002.Todos tos

ser reproducido en su totaridad


5:,f,rfl""":#[j".:18ili0" o en parte sin er previo

Instrucciones especiales para la


impresin de ste curso

No deben removerse fas pginas


en blanco que puedan aparecer
unidad y entre dos unida"rl al finaf de cada
eii", nn soo inr,i,t"o", iienconatmente.
o
o
o Introduccin a la programacin
con C
Gua del Estudiante
o
a Contenidos
o Unidad 1: Manejo de Archivo en C
a 1

o lfff Objetivos de Aprendizaje


1
o ?l
I' i. Introduccin
p 2
o I
2. UsarArchivos de Datos en C
2
o L 3. Archivos de Texto y Binarios
14
o I 4. ManipufarArchivos de Datos Sin Formato
o hr Resumen
15

o b
Unidad 1: Exmen de Autoevaluacin
18

a Respuestas a fa unidad 1: Exmen de


19
Autoevaruacin
o Unidad 2: Laboratorio de Manejo d
21
o Archivos en C
22
Objetivos de AprendLaje
o 22
o Ejercicios de Laboratorio
23
o Undad 3: Caractersticas Adicionates
de C
25
o Objetivos de Aprendizaje
o 25
1. Introduccin
o 2. Enumeraciones
26
o 3. Argumentos de la Lnea de Comandos
26
o 4. Macros
28
a 30
I 5. Directivas del preprocesador
u
I 6. Operaciones de Manejo de Bits
36
a Resumen ,

I Unidad 3: Examen de Autoevaluacin


Respuestas a la Unidad 3: Examen de
39
40

t? unidad 4: Laboratorio de caractersticas


Autoevatuacin
Adicionares de c
41

42
Objetivos de Aprendizaje
tI Ejercicios de Laboratorio
42
43
It
I
p
lo
lo
lo Lrdad 't: Manejo e ArcvoEnlC
V_olumen 6: Tpcos Rvanzados
@ Copyright IBM Corp. 2OO2 ii
'o ^
,Los
materiales delcurso no pueden ser reproducidos
o o parcialmente sin el permiso previo
de lBM.
totaf

a "scrito
o
^l
!F
o
o Gua del Estudiante
Introduccin a la Programacjn co- C
o
o Unidad 1: Manejo de Archivo en C
o;
oi Objetivos de Aprend izaje
o
o Al finalizar esta unidad, usted ser capaz de:
o Reconocer reas en ra.sorucin de probremas que
o requieren ra necesidad de
leer y escribir datos en dispostivos de almacenamiento
secundario.
o a Discutir cmo manejar archivos de datos en
C
a Discutir el mtodo de manejo de archivos orientado
o o Describir diferente ribreras de funciones que
a flujo en c
o archvos en disco.
ayudan crear, reer y a escribir
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
a Losmarerf ar"r?f S[""li,F*.?Jr,;?of
o l,oo,"oostotal
o parcialmente sin elpermiso previo es'oito
cle IBM
o
o
Introduccin a la progfamacin con C 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.
o
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
de archivos de dafos- En esta unidad se va consderar slo en la forma
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.

Muchos
.lenguajes de programacin clasifican los archivos de datos como archivos
secuenciales y archivos de acceso directo o acceso aleatorio. c ofrece dos
diferentes de archivos de datos. Estos son: tipos

o Archivos de datos orientado a flujo, llamados tambin archivos


estndar.
' Archivos de datos orentados a sistema, llamados tambin
de bajo nivel.
archivos de datos

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
organizados dentro de bloques que consisten de bLs los datos estn
contiguos. se pueden usar para
representar estructuras de datos ms complejas tales
ciertas funciones especficas de librera estn tambin oisponioies- y estructuras.
como aneglos
estructuras de datos completas. i"i"
transferir

2. Usar Archivos de Datos en C


Ef lenguaje C ofrece un amplio conjunto de funciones
archivos de datos.
de librera para crear y utilizar

Unidad l: Manejo Oe Archivo en C Volumen 6: Tpcos Avanzados 2


.
Los materiales
@ Copyright tBM Corp.2002
del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM
o
o
o
r
lf
o
Una de las primera cosas que hay que hacer con los archivos de datos
o flujo es crear un rea de buffer laimcenamiento temporal). Un rea
orientados a
de buffer es un
o lugar en memoria que se usa para transferir datos desde la memoria
a los dispositivos
o 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
o et que usa
los datos. Crear un rea de buffer ayuda a que la transferencia de
informacin entre el
o dispositivo de almacenamiento secudario y elprograma sea ms
rpida.
o t" Un rea de buffer se puede crear como rigr",
o t
I
r,.l!.E; *Dut t jt r ;
o I FrLE es un tipo de estrucfura especial que permite la definicin de
un rea de buffer, y
o t
I
buf f3tr
es un puntero que apunta al inicio del rea de buffer. Al uurrSrr
tambin
o 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.
o
o 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
o entre un nombre de
archivo y el rea del buffer. Tambin especifica cmo los archivos
o de datos sern
usados, de acuerdo a la lista que se presenta a continuacin:
o . Slo lectura
o . Slo escritura
o o Lectura/escritura
Existe una funcin de fibrera para abrir archivos ltamada f open.
o
o buffStr = fopen (nombre-de1-archivo, tipo-de-archivo) ;
o 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
o archivos.
crear nombres de
o
El tipo de archivo es una cadena de caracteres (string) que especifica
o se debe usar. Los diferentes tipos de archivos .e pr"st"n
cmo el archivo
en la Tabla 1.1.
o
o
o
o Abre un archivo que existe, slo de
o lectura
o Abre a un nuevo archivo para slo
O escritura. S un archivo del mismo
nombre existe, ste ser borrado y un
o nuevo archivo ser creado.
o Abre un archivo que existe para
o al final del archivo. S el
agregar
o 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 para


lectura/escritura. Si el archivo no
un nuevo arcfjvo ser creado. "i"t"
Tabla l.l: Tipos de Archivo
Cuando la funcin fopen se usa, retoma
un puntero al inicio de ta posicin del rea
buffer asocada con el archvo. si, por algun de
razn,J archivo no puede ser abierto, se
retoma un valor NULL (cero). Esta condiin
puede'ocr.lrir cuando un archivo de
que ya existe no se.. puede encontrar, datos
o cuando
'caoa falla er intento de abrir et archvo porque
el archivo est daado. Ar finaf oe progrrr,-un'archivo de datos que ha
abierto debe ser cenado. una funcin de sido
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,:; S?5;";X,:ffifn#o,
ejempros para entender los conceptos de
manejo

Ejemplo l.l: 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


main O { ^rurn',

/* 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 r
o
o Gua del Estudiante
lntroduccin a la Programacin con C
o )
o /" La funcin principal termina aqu */
o El cdigo C termina aqu
o
o A continuacin se analizan cada una de las sentencias anteriores.
La primera sentencia
incluye elarchivo de cabecera llamado srdio.rr. Recuerde que
o siempre que se realizan operaciones de E/S de cualquier
este aichivo se requiere
o Aqu especficamente,
la estructura rrr,s est definida dentro del archvo declase. encabezado s.dio.h. La
o sentencia rrr,r define una variable puntero llamada buff__pgr.
Este crea un rea de
o 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
o lectura y retoma un valor apropiado que es asignado af
o lurr3tr. Si fue exitoso abrir el
archivo, fa funcin oPil retorna un puntero al inicio delrea
de buffer, el cual ahora es
o asignado ? burr3tr. si no fue exitoso abrir ef archivo (como
ejemplo), fopen retoma un valor m;lr, (ef cual es cero). El
," u"r . Ll siguiente
o buffer asocada con-el archivo myDara.dar que fue abiertolcon
uurr3rr apunta al rea de
o sentencias que se refieren y hacen uso del archivo de datos
esto, todas las
usarn rurr]tr en vez
o def nombre del archivo. La ltima sentencia, fclose, dena
el archivo de datos. Note
o que elbuf f prr tambn se us para cenar el archivo.

o Fin del Ejempto l.i


o
Ejempfo 1.2:Como Manejarun fopen Noexitoso
o
o
o !n gsJe ejemplo, se ilustra dos mtodos para manejar
Considere elsiguiente fragmento de programa en C.
un fopen no exitoso.
o El cdigo C inicia aqu...
o
* Archivo de cabe cera
o ,/ * /
#include <stdio.h>
o
o #define NULL 0
o
o /* La funcin main se inicia aqu */
o maino {
o /* abrir e1 archivo *,/
o FfLE *ptr;
o pEr = f open (ttmyData. datrr , r,r+ rt ) ;
o if (ptr == NULL)
o print.f ( "Error al abrir
de1 archivo\n',),.
Or
else {
ot
ol

Losmateriar"r?"?SL"['3[r"""f""??31,*roo"stotal
o parcialmente sin elpermiso previo escrito de IBM

o
Introduccin a la programacin
con C
Gua del Estudiante

,/* cerrar et archivo *,/


fclose (ptr ;

]
/* La funcin main termina agul*/
El cdigo G termina aqu

como se menciol ef Ejemplo 1.1 cuando se intenta abrir


fopen que no es exitoso,
".1 -la un archivo usando un
funcin retorna u"roi
retornado por la funcin fopen NuLL. se verifica si ef vator
es un valor uur,r,."ls" ," definido
un mensaje de error apropiado o"o"^-g:r:g-a1,usuario."si aqu el NULL como 0.
puede proceder a hacer lci quJ ef archivo es exitoso se
se queria con el archivo de"or|.
datoi. p"r"'ror, ropen
no ser exitoso si et archivo'mencionado no r"
que existan otras razon"t poi o si el archivo est daado. Es
tas cuats"n"ni
!;;f;'" 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
dentro de ra sentencia if como sentencia f open
, se'muestra r"gr"nto de
El cdigo C inicia aqu..,
"n "rrilri" cdigo:

,/* 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 /* La funcin main termina aqu ,t7
o El cdigo C termina aqu
o
o Note como en este mtodo se ha cofocado fopen
dentro de fa sentencia if.
La
o funcn fopen se eiecuta y retoma un valor, el cuaise
compara con NULL.
asigna buf f3rr
y fuego se
o
o se puede usar cualquiera de los dos mtodos. Al flnal, son los programadores
quienes
o deciden culde los mtodos desean emplear.
o Taf como se mencion anteriormente, un archivo
de datos debe ser primero creado
o antes de ser usado. A continuacin se aprender a
como crear los archivos de datos.
Los archivos de datos orientados a flujo se pueden
o crear de las siguientes formas:
o ' creacn directa del archivo usando un editor de
palabras
texto o un procesador de
o .
o
Creacin indirecta a travs de un programa
cuando se crea un archivo de datos a travs de un programa,
o se leen primero como entrada def usuario a travi eiiecuotir; generalmente tos datos
o s-'Lscrioen at
archivo de datos. se pueden usar tas siguientes funciones
de tibrera:
o . getchar
o . putc
o Ejemplo 1.3: Leer un Archivo de Texto y Mostrarto
o En este ejemplo se presenta cmo leer un archivo de
o texto desde un dispositivo
almacenamiento secundario y mostrar el texto. se
debe abrir un archivo de texto
o existente llamado mvstorv-dat n modo slo de
leciura. Entonces se debe leer
carder por carcter def archivo, mostrando cada
o carcter ror (fin de archivo).
carcter hasta que se encuentre un
o
o El cdigo C inicia aqu...
o #include <stdi,o. h>
o
o /* La funcin main se nicia aqul */
o main0 {
o FfLE *myText.; /* Area de buffer *,/
o char ch,.
o /* abrir e1 archivo *,/
myText = fopen("mystory-dat" ,,'r,,) i
o if(myrext == NULL)
o printf (,'Error aI abrir e1 archivo\n,,);
O else {
o
o /* Leer un carcter cada uno a la vez hasta alcanzar EoF e
o
o o{umen

o @ Copyright tBM Corp. 2002


tos materiafes dercurso no puedn'ser reproducidos
totat
o o parcalmente sin elpermiso previo escrto de
IBM
o
o
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.
programa hace eso: El siguiente segmento de

El cdigo C inicia aqu...


#include <st.dio. h>
#incl-ude <ctrpe . h>
/* La funcin main inicia aqu */
maln O {
FfLE *myText;
int ch,.
,/" abrir el archivo */
myText = fopen(,'mystory.dat",,,w,, );
if (myText == rULL)

Unidad 1: Manejo e Archivo en C


Volumen 6: Tpcos Avanzados B
@ Copyright tBM Corp.2002
tos materales del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de fBM
o t
o
o Gua del Estudiante

o printf ("Error en 1a creacin\n,') ;


o e.l.se t
o printf(rfngrese un texto a ser \
o almacenado dentro del archivo\n,,) ;
o ch = getchar|;
o while( ch l= '\nr ) {
ch = toupper (ch)
o putc(ch, myText);
,.

o ch = getcharO;
o )
o t

o /* cerrar e1 archivo *,/


o fclose (myText);
o )

o /* La funcin main finalza aqui * /


o Elcdigo C finaliza aqu
o Para convertir los caracteres ledos a maysculas,
o se usa fa funcin Loupper. Dado que
se usa esa funcin, se debe tambin incluir el archivo
de cabecera cr;:. n. se usa la
o funcin setchar para leer un carcter desde et
tecrado. se usa la runion purc para
o escribr un carcter en el archvo de datos abierto
en modo escritura. Lo siguiente es el
o mtodo para usar la funcin purci l

o putc (ch, myText) ,.

a Esta funcin escribe el carcter cn dentro del


archivo de datos asociado con el rea de
o buffer, el cual est apuntando por ra variabre puntero
myrexr.
o Fin det Ejempto 1.4
o Existen muchas funciones q]e ayudan a leer y
O escribir archvos de datos. para leer y
escribr caracteres, se puede' usar tas iuncones de ribrera
t respectivamente. Para leer y escribir cadenas geLc purc
compbts (string) fno p"mente un
y
q carcter) se pueden usar fas funciones de
librera glt" y purs. Altemativamente, para
escribir y leer datos con formato se puede usar
q permite que estructuras complejas
fs"ers o fpurs. El fenguaje C tambin
q sean ledai y escritas en archivos de datos
drrectamente, a travs de las funciones f scanf
I ! fprinrf .
Ejemplo 1.5: contar los Espacios y caracteres
en un Archivo de Texto
t lste ejempfo considera ef problema de contar el
caracteres (diferentes a espacios en blanco)
nmero de espacios en blanco y
en un er archivo oe tlto. gl
acrir un archivo de texto designado par:a froblema es
I ledura, pro*"r a leer caracteres det archivo
ce texto hasta que se alcanza elor y mantener
un conador del nmero de caracteres.
un contador del nmero de espacios y

t se imprimen.
Al final, los coni"otr"r de espacios y caracteres

r :
--=-

Losmateriar",S"?ff x,*1i,3,[r1"fl;??3l,oa,"ioo,,o*r
o parcialmente sin elpermiso previo esctito de
IBM
d
t
o I
Esto refueza el uso de la lectura de un carcter, por
funcin fserc.
ahora esto se realiza usando ra

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 CaracLeres = ?d\n", \
nspace, nchar) ,.

)
/* 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 Volumen 6: Tpicos Rvanzados 10


@ Copyright tBM
Corp. 2002
Los materiales del curso no pueden ser reproducidos
total
o parcialmente sin el permso previo escrito de IBM
o F
o il,
o I
Gua del Estudiante Introduccin a la programacin con C
o struct lista_notas t
o char idno [9] ;
o char nombre [+5] ;
o float notas [6] ; /* notas de 5 cursos */
o ;
o Suponga datos para un mximo de 100 .estudiantes que deben ser ledos desde el
o 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
o cantdades de datos como entrada desde el teclado. En este ejemplo, se crea un rea
o de buffer con una variable puntero, como mark3rr. Entonces se abre un archivo
o lfamado history.dat refirndose al archivo de datos de notas. Existe una asociacin
o 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
o funcin fprintf. La sintaxis de la funcin rprinrr es similar a la funcin printf, lO
o nica diferencia notable es el uso de la variable puntero de flujo como el primer
o argumento en la func fprinrf . La cadena de formato usa las mismas caracteristcas
de la funci prinrf .
o
o El cdigo C inicia aqu...
q ,/* Programa para crear un archj-vo con las not.as de los
a estudiantes * /
a /* Archivo de cabecera */
e #include <stdio.h>
#define SIZE 2
o
/* Estructura que almacena Ia informacin de un estudiant.e *,/
o
o typedef struct {
o char idno [9] ,.

o char nombre [45] ;


o f loat notas [6] ,. /* noLas de los seis cursos */
o ] r,rsra_HorAS;
t
I /* Funcin para leer los daEos del usuario y almacenaros en
archivo *,/
un

) vo j-d almacenarDat.os ( ) {
I
I
FfLE *in mark3t.r,.
P LISTA_NOTAS in_stud ISIZE] ;
I int j,k;
l,
/* Abrir archivo para escritura *,/
It in_mark3tr = fopen( uhist,ory.datt',,,wn)
I ;

, orumen 6:
@ Copyright IBM Corp. 2002
Los materiales delcurso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM

o
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 ] ) ,.

)whi1e ( (in-stud [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,. I

I
/* Abrir archivo modo lectura */
I
out_mark__ptr = fopen ( r'hi-story. dat rr , rrr'r ) .
I

/* Leer t.odos los datos de estudiantes deL archivo */ I

k = 0; I

while (k < srzE) { (

{
Unidad 1; Manejo de Archvo en C
Volumen 6: Tpicos Avanzados 12 (
.
Los materiales
@ Copyright tBM Corp.2002
del curso no pueden ser reproducdos total I
o parcialmente sin elpermiso previo escrito de IBM
I

{
r
olt
o
o Gua def Estudiante
o fscanf (out_mark_ptr, "?s?s", out stud IkJ - idno, \
o out_stud [k] .nombre) ;
ol for (j = 0; j < 6; j++)
ol f scanf(out-mark3tr, "tf,, , \
Ol &out_srud [k] - noras ij I ) ;
oi k++,'

o! )
/* cerrar archivo */
o (out_mark_ptr ) ;
f c lose
o for (k = 0; k . SIZE; k++) {
o printf ("\n?s: ?s\n,',
o out_stud [k] . idno, out_stud [k] .nombre) ;
a printf ( "Notas en los cursos: \n,,) ;
o for (j = 0; J . 6; j++)
o printf (*26.2f \n", out_st.ud Ik] .notas ij I ) ;
o
o )

o
/* La funcin main inicia agu */
O mainfl {
3 almacenarDatos O ;
o recuperarDat.os O ;
o )
o /* La funcin main finaliza aqui */
a El cdigo C finaliza aqu
o
o 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
o computadora.
Fin del Ejempto 1.6
o
? Resulta obvio que usar archvos de datos no es slo leer y escrbir archivos
de texto. Se
a necesita procesar datos en un archvo de datos, actuali2ar valores que
requieren ser
modiflcados y hacer muchas otras tareas relaconadas. Generalmenie
? un archivo de
I datos tiene que ser ledo as como se tene que escribir en t. Escribir
datos puede tomar la forma de registros siendo aadidos, regstros
un archvo de

I c,3ntenido de regstros siendo cambiados o registros siendo


siendo bonados,
anghdos. riiiguiente es
I -1 mtodo pa.a realizar esta actividad:
. Tener dos archivos diferentes, uno para entrada y el otro para salida.
b
I
p
' 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
l
p
reemplazar ste con un archivo nuevo.

fo @ Copyright tBM Corp. 2002


l.
p
Los materiares der .*rrso no pueden ser reproducrdos total
o parcialmente sin el permiso previo esctito de IBM

lo
o
Gua del Es::: a^::
Otro mtodo de hacer esto se da a continuacin:
o
Leer un registro desde el archivo.
o
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.

3. Archivos de Texto y Binarios


Los archivos de datos.ledos y escritos a un disco pueden
binarios, basado en cmo el archivo se abre p"r"'"J ser clasificados como texto y
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
-
disco' De la misma forma cuado se lee del isco,
- tr), v i;"*
scritos en el
lnea' se traduce a un carcter de nueva lnea. cuando
l 'retorno ";;"t
cambio de
el archivo se abre en modo
binario, estas conversiones no ocurren. Para abnr
un archivo en mooo oinaro, se puede
usar lo siguiente:
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. Los

Unidad 1: Manejo Oe Rrcfivo en C Volumen 6: Tpicos Avanzados l4


.
Los materiales
@ Copyright tBM Corp.2002
del curso no pueden ser reproducidos total
o parcialmente sin elpermiso previo escrito de IBM
o
, I:

o il Gua del Estudiante


il lntroduccin a la Programacin con C
o numeros se almacenan como cadenas de caracteres. Por ejemplo, un nmero como
o 5643 se almacena en cuatro bytes. Un nmero punto-flotante como 25 .625 se
o almacena en seis bytes. Esto significa que si los archivos texto se usan para
a 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.
a 1l

o 4. Manipufar Archivos de Datos Sin Formato


o
oI El.lenguaje C provee una amplia variedad de formas para representar los datos dentro
a I 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
ol datos est limitado al del programa; estas entidades no existen ms all de la ejcucin
o, def programa. Puede tenerse un requerimiento de que estos datos sean persistentes
Or entres dos ejecucones del programa para el cual C provee una solucin a travs de una
facilidad para manipular tipos de datos sin formato.
oi
oi 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
ol tpo de dato, usando las funciones de librera de C rreaa fwrire. Estas funciones son
ot /
llamadas funciones de lectura / escritura sin formato.
q Los archivos de datos sin formato se llaman as porque contienen algn texto sin
q formato. No se pueden abrir y ver con un editor de texto.
q Las funcios f read ! fwrite
requieren de los siguientes cuatro argumentos:
q . Un apuntador a bloque de datos
I . El tamao del bloque de datos
o ' El nmero de bloques de datos que estn siendo manipulados en la
t .
transferencia
Un puntero de flujo
o El siguiente es un uso tpico de fwrite.
o
f write ( &stud, szeof (Lf STA .NOTAS ) , L , mark3tr) ;
? Aqu, scud es la variable estructura del tipo r,rsra_worAs, y markjrr es le puntero de
0 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
I 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,.
'/* Funcin
archivo *,/
para obLener dat.os del usuario y almacenarro
en un
void almacenarDatos O {
FfLE *in_mark3tr;
LISTA_NOTAS in_srud ISIZE) ;
inr j , 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 (NOTAS_LIST) , \
I, in_mark3Lr),.
/* cerrar archivo *,/
f cLose (in_mark3tr)
;
)
/* Leer 1os datos de1 archivo e imprimi rlos *
void recuperarDatos o { /

Unidad 1: Manejo ?nrcf,iuo EnE


Volumen 6: Tpjcos- Avanzados 16
@ Copyrighr
tBM Corp.20O2
Los materiales delcurso no pueOen'seiiproducdos
totat
o parcialmente sin el permso previo es;rito
de IBM
ar
o
o Gua del Estudiante lntroduccin a la Proqramacin con C
o FfLE *out_markjtr,.
o LISTA_NOTASout_stud ISIZE] ;
o int j, k;
o
o /* Abrir archivo modo lectura */
o out_markStr = fopen ( t'history. daE,', r'rb', ),.
o /* Leer todos los datos de1 estudiante del archivo*,/
o k = 0;
o while (k < SIZE) {
fread(&out_scudIk], sizeof (NOTAS LIST), 1,
o out_mark3tr) ;
o k++,'
o ]
o /* cerrar archivo */
o fclose (out_mark_ptr) ;
t for (k = 0; k < SfZE,' k++) {
o printf ( "\n?s: ?s\n",
o out_stud [k] . idno, out_stud [k] .nombre) ;

o printf ('rNotas en 1os Cursos : \n" ) ,-

for (j = O; j . 6; j++)
I printf ("26.2f\n", out_studtkl .notas tjl );
O
o )
o /* La funcin main comienza antt * /

o mainO {
o almacenarDatos ( );
o recuperarDatos O ;
o )

o /* La funcin main termina aqui * /


o El cdigo C termina aqu
o ! nico cambio significativo que se ha hecho al ejemplo anterior es el uso de la funcin
o :;':-:e en vez de la funcin fprintf. Note que tambn se ha usado otra funcin
t .-eda
:-
sizeof o , la cual retoma el rmero
es entrada.
de bytes requeridos para una estructura
o
t = - :. Ejemplo 1.7
t
p
p
b
b
fo
@ Copyright IBM Corp.2002
t- Los materiales del crrso no pueden ser reprcduddos total
p o parcalmente sln elpermiso prevo escrito de IBM
!o
o
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
. Discutir cmo manipufar archivos de
datos en C
secundario

' Discutir los


liiofos para manejar arcnvos rJntaoos a flujo en
c
' ffffJgd'r;ffi:r iunciones'de ribrer qr"
reer y escribr
"vro"n ^'"r""r,

Unidad 1: Manejo sArchvo enT Volumen 6: Tpicos Avanzados 18


@ Copyrighr
tBM Corp.2002
tos materiales def curso no pueden ser reproducidos
totaf
o parcialmente sin ef permiso prevo estrito
de IBM
o
o
r
o n Gua del Estudiante Introduccin a la ramacin con C
o
o Unidad l: Exmen de Autoevaluacin
o
o 1) Asuma que se desea ingresar como entrada una cadena de caracteres (string) y
o li llevarlo a un aneglo lfamado char miString [so; , -
Cut de las siguiee
funciones ser la ms adecuada pqra este propsito?
o li I
a) gets (miString) ;
o I

b) scanf ( *?s., &mistring) ;


o F
o F c) getc (miString) ;
o d) fscanf (fp, ..?s,,, emiString) ;

o 2) Dnde est la estructura llamada FrLE definda como una macro?


o a) ctype.h
o b) stdio.h
o c) siri ncr l
o d) stdlib.h
o 3) Uno de los mayores problemas de los archivos de datos es que los programadores
tienen que manejar los buffers.
o
o a) Verdadero
o
b) Fafso
o 4) Si un archivo se va abrir en modo slo fectura, elarchivo debe existir.
o a) Verdadero
o
b) Falso
5) Si un archivo se abre en modo escritura, y si el archivo ya existe, el archivo viejo
o es borado, y un nuevo archivo se crea.
o a) Verdadero
o b) Falso
o 6) Cules de las siguientes actividades se realizan cuando un archivo se abre en
o modo lectura?
o a) Una asociacin se establece entre et nombre del archivo y el reade buffer
ol b) Una verificacin se hace para determinar si el archivo existe para abrirse para
lectura
O,
q c) Un puntero se crea para apuntar al primer carcter que pueda ser ledo dentro
en elarchivo
q d) Todas las anteriores
q
d
q

@ Copyright tBM Corp. 2002


Los materiares dercurso no pueden ser reproducidos totar
o parciafmente sin elpermfso previo escrito de tBM

?
o
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
formato? de datos sin
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
b) Traducido a los caracteres cn y r.r
c) Traducido slo alcarcter cR
d) Traducido slo alcarcter lp
10) 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 Gua del Estudiante lntroduccin a la Programacin con C
o
o Respuestas a la Unidad 1: Exmen de Autoevaluacin
o
o 1)a
o 2)b
Ot 3)b
o 4)a
o 5)a
o 6)d
o 7) ayb
o 8) cyd
a e)b
o 10) a
o
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:
r 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

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
t
o Gua del Estudiante Introduccin a la Programacin con C
o
o Ejercicios de Laboratorio
o 1) Considere un archivo de texto que contiene oraciones en ef idioma espaol. Los
o caracteres de puntuacin comunes son: punto, coma y los signos de interrogacin
o 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,
I palabras de tres letras, palabras de cuatro letras, y todas las otras palabras con
o ms de cuatro letras. El programa debe imprimir el nmero de ocurrencia de cada
o tipo de palabras, tal como se muestra a continuacin:

a Nmero de palabras de una letra = 23

o Nmero de palabras de dos letra = 55


o Nmero de palabras de tres letra = 124
o Nmero de palabras de cuatro letra = 43
oi Nmero de palabras mayor a cuatro letras = 39
o 2) Considere la estructura llamada nombre que tiene un primer_nombre,
oi segundo_nombre y apellido, cada mo uno es un aneglo que contiene 45
o. 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
oi como entrada desde eltecfado. La entrada se termina cuando el usuario ingresa el
oi smbolo g como el primer carcter de un nombre. Ahora, usando el mismo archivo
ol de texto, leer los nombres y crear otro archivo con los nombres ordenado de la
forma ape11ido, primer_nombre y segundo_nombre
o
o
o

O
a
I
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 Gua del Estudiante Introduccin a la Proqramacjn con C
o
o unidad 3: caractersticas Adicionales de
o
o c
o
o Objetivos de Aprend izaje .
o
o Alfinalde esta unidad, usted ser capaz de:
o' . Declarar y usar enumeraciones en C
o . Describir los argumentos de la lnea de comandos
o Definir las macros y usarlas en los programas
o . Discutir algunas funcones del preprocesador de C
o
o
o
o
o
o
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
del preprocesador' un progr-a grande ras directivas
presentan en e-sta unidad, junto en c Li casi todas t", rr.ltordes que
con las estructuras de conirol y tipos de se
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
conjunto posibfe de vafores. Por ejemplo, uno de un
la puede tener er varor azul,
verde' amari11o, rojo y as sucesivamente. "tiJJcoror
similarmente. la entidad flor puede
contener el valor rosa' girasol,
entidades definidas por utr*io y
lirio
y as sucesivamente. para caprurar estas
sus posibfes vafores, ei rengua.le c provee
mtodo poderoso a travs de la enumeracin. un

considere fos siguientes casos-


un usuario puede pon"o" ii un tipo de dato booleano puede ser
,no'0" ras ifiuiI piezas de vestinverdadero o fafso.
jeans, pantarn,
curtivar no'""" v
liilSiij:":',:il:".r"':,:ij:::", una de ras sisuietes: rosa, lirios,
'oio
En todos los casos anteriores hay
y las variables de esb tipo oe dtounpued
conjunto de valores para un tipo de dato
particular
contenei rto ,no de esos de varores en un
momento determinado' Para representar
esta situacin del mundo ,..l un programa
en C, se puede usar el tipo de dato
ttamado enum . "n
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" los dferentes tipos de
flores. sea fa siguiente oectaracn", "h""enar
o" enumerados:
enum flor { rosa, lirio, margarita, narcisc, c1a;e1 ),
enum flor alicia, jessica, shirley,
stefft;
contiene cinco constantesi rosa, 1irio, marsarira,
I::""*: r'""r"#Slracin
Aqu' enum es una palabra reservada.
Nombre-del-enumerado S un nombre
que identifica la enumeracin. opcionat
miembror., miembroz, etc. son ras constantes
enumeracin y deben ser distintos de otro identificador de ta
usado.
se ha definido, arice, jessica, shirlev y
combinando fos dos anteriores, la sreffi como variabres der tipo fl0r.
sig;iente crarcon -s equivarente:
enum flower { rosa, 1irio, margarit.a,
jessica, shirley, steffi; narciso, clave1 } alice,

undad3'caract@
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 Gua del Estudante amacin con C
o Nota: El nombre-de1-enumerado specificado no siempre es requerdo.
o
Lo cualsignifica, que puede tambin ser escrito como sigue:
o enum { rosa, lirio, margarita, narci.so, c1ave1 } a1ice, jessica,
o shirley, stef f i,.
o Asa rosa se le asigna a o,liriose le asigna 1, margarita se le asigna 2 y as
o sucesvamente hasta alcanzar c1ave1, al cual se le asigna +. El usuario pede
o sobrescribir la asignacin automtica de los valores enteros para las constantes
o enumeradas. Por ejemplo, en una sentencia de asignacin, se puede escribir miembro

o = int en la definicin/declaracin de la enumeracin. Sea la siguiente declaracin:


enum flor { rosa=3, 1irio, margarita, narciso=J-0, c1ave1
o };
Esto asigna 3 rosa, a 1irio, 9 a margarita, 10 narciso y - aclavel.
o
o 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
a trminos de operaciones realizadas sobre elfas y escribir la sentencias de asignacin.
o Sin embargo, las constantes enumeradas no pueden ser ledas como entrada o
o mostradas como salida.
o Fin del Ejemplo 3.1
o
Una vez visto esto, se presenta otro ejemplo que define la enumeracin de diferentes
o marcas de pasta de dientes y define su asociacin con diferentes miembros en una
o familia.
o Ejemplo 3.2: Tipo de Pasta de Dientes
o
o se puede definir una enumeracin para pasta de diente como sigue:
enum pasta_de_dient.es {co1gate, closeup, forhans, anchor,
o pepsodent ) ,-

o
Basado en esto, se puede tener las siguientes sentencias vlidas en c:
o
o Elcdigo C comienza aqu... I

o past.a_de_dientes mipasta, miEsposa, miltijo, miHija;


o mipasta = col_gate;
myEsposa = anchor,.
o
if (miHijo == closeup)
o {

o
)
o el,se
o miHija = (pasta_de_dientes) ( (mipasta + miEsposa) t 2) ;
o switch (miHijo) {
o case colgate:
o case forhans:
I I
t


t
t.

h
@ Copyright IBM Corp.2002
p Los materiales del curso no pueden ser reproducldos total
b
l
o parcialmente sln el permiso previo escrito de IBM
o
o
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
difcil el mantenimiento del p.gtr.
"n -eor tienden a reducir la legiblidad y a hacer
nmero 3'141en ef prograt, t s
eempL-,"rl," intercara generosarnente e
-similarmente, evident p"r" Lr que fee er programa que
refiriendo al nmero pi' se est
colgate, 2 para croseup, etc. s grega. I
si se tiene- p representar la pasta de
dientes
programa' Las variables enumeoo_":. una caiga mayor para reer y entender 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
tome parmetros de entrada desde fuera. Que main ( )
Esto se lolra teniendo dos argumentos
funcin main ( ) llamados en la
".s;-t;;;r.
argc es un variable entera

un arreglo de punteros a caracteres, o un


arreglo de cadenas de caracteres
.];ilrff
Aqu' cada cadena de caracteres en et
arreglo representa un parmetro que est
pasado a main' argc indica el nmero siendo
prototipo de la funcio main tene
de parmetros pasados de esta forma. El
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
(como en windows), o'deibe el nivel
de So como un comanoo (como en unix). por
c
ejempfo, en unix, se pude ingresar el program
a paraser ejecutado como sgue:
miprog
ejecutabfe, aqu, se ilama mipros, er cuar puede
3#::nrra 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 Gua del Estudiante Introduccn a la Programacin con C
o nombre-de1-programa parametrol parametro2 .-- parametron
o En el caso anteror, los parmetros son asignados a los argumentos como se muestra
o en la Tabla 3.1.
o Argumentos Valores
o argc 3
o argv [0J miProg
o argv [1] colgat.e
o argv [2] anchor
o Tabla 3.1: Parmetros Asignados a los Argumentos en ta Funcin main
O.
o
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
o algunos ejemptos para entender el uso de la lnea de comandos con argumenios.
o Ejemplo 3.3: Usar argc, argv
o
o El cdigo C comienza aqu...
o /* Archivo de cabecera */
o #include <stdio.h>
o /* La funcin main comj-enza aqw */
o mai-n(int argc, char *argv[] ) {
o int k;
o printf (,,E1 valor de argc es ?d\n", argc);
for (k = 0; k . argc; k++)
o nvi-+/rr^-gv ?d es ?s\n,', k, argv[k]);
o )
o /* La funcin main termina aqu */
o El cdigo C finaliza aqu
o
O Se sabe que argc contiene el nmero de parmetros pasados en la lnea de
o comandos, as que se confgura una estructra iterativa que ayude a imprimir los
argumentos.
o
Fin del Ejemplo 3.3

I
Iq Ejemplo 3.4: argc, argv en un Aplicacin Tpica

,t 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

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


ffii5,tgX,toto definir constantes
#define pf 3.14
Tpicamente en programas, se encuentra
un
puede usar para ej_e:utar una tarea particufa.r.fragmento de cdigo simpfe,
pr eiempfo, el clculo del el cual se
crculo puede ser este segmento o rea de un
&'oigo simple. ri l"rigr"" c provee una forma
maneiar estos segmentos de codigo simples de
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
ot
o
o Gua del Estudiante Introduccin a la Programacin con C

o expresin o un grupo de expresiones mmo un solo identificador. La funcionalidad


o provista por las macros es la misma que las funciones en C, aunque la forma en que el
o complador las maneja es un poco diferente a la forma como maneja las funciones.
oi 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; 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
o; 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
o macros incrementan el tamao del codigo objeto. Cuando se usan las macros, los
o programadores deben decidir entre el tamao del ejecutable y la velocidad de ejecucin.
o Las referencias a macros ene tambin ciertas desventajas. Sin embargo, se necesita
o entender las macros bien antes de discutir las desventajas. Vase a continuacin
O algunos ejemplos del uso de las macros.
o Ejemplo 3.5: Una Macro para elRraa de un Crculo
o
Elcdigo G inicia aqu...
o
o /* Archivo de cabecera */
#include <sLdio.h>
o
#define area de1 circulo 3.141 * radi-o * radio
o
o /* La funcin principal se inicia aqui */
o mainfl {
O float radio;
o oo(
o printf ( "Ingresar e1 radio IO-32767) :") ;

o scanf(ugfn, &radio);
o )while(radio < 0 ll radio > 32757);
o printf ( "El area del circufo es = ?f\n,', \
area_del_circulo) ;
o
o )
/* La funcin main fina:..iza aqul */
o
El cdigo C finaliza aqu
o
o Aqu area_deI_circulo es una macro que define una expresin : . rr * radio *
o radi-o. Durante el proceso de compilacin, aree del_circulo se sustituye por la
o expresin 3.141- * radio * radio.

e Fin del Ejemplo 3.5


I Consdere un caso, donde un grupo de sentencias realiza un trabajo. El conjunto de
I t expresiones se pudo escribir en ms de una lnea. Cmo se hace para representar los
q I

Avanzados deC3l
@ CoPYright IBM CorP. 2002
I Los materiales delqJr5o no pueden ser reproducidos total
o parcialmente sin el permso previo escrito de IBM

Y
o
Introduccin a la programacin con C 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 sepresenta 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 [1-32 7671 ; ");
scanf 1 "?d", &y) ;
)whi1e(y<1 | I 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 Gua del Estudiante lntroduccin a la programacin mn C

o El cdigo C inicia aqu...


a
/* Archivo de Cabecera * /
o #include <stdio.h>
o /* Maero multi-1lnea para MCD */
o /* La funcin main inicia aqu */
main O {
o int x, y, respuesta,uin,
o /* entrada x y y aqti */
o oot
o printf("\n fngrese un entero 17-327671: ");
scanf ( rtd", cx) ;
o
)whi1e (x<1 | | x>3276'7) ;
o oot
o printf (" \n fngresar otro entero 17-32767J: ");
o scanf (r?d'r,&y);
o )whi1e (y<1 | I y>32767) ;
o a=x;
o b=y;
o whil_e (x l= 0 && y != 0)
I if (x>=y) x=xZy;
o elsey=yZx;
if (x == 0) respuesta = y,-
I else respuesta = x,-
o printf ( UMCD de ?d y ?d es ?;d : ,' , a, b, :espues:a ) ;
o if(x==0&&y==0)
I printf ("\n Ambos enteros ingresados son O,') ,.

o
o )'
o /* La funcin finaliza aqui * /
o El cdigo C finaliza aqu
o Fin del Ejemplo 3.6
o
o 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
o 3arntesis, como se muestra a continuacn:
a #define MCD(var_x, var_y) while (var_x != 0 && var_y != O) \
a if (var_x >= var_y) var_x = var_x t var_y,. \
o else var_! = var_! t var_x; \
a if (var_x == 0) var_reEpuesta = var_y; \
o
o .:,:-fgn6: T
@ Copyright IBM Corp. 2002
o Los materiales del qrso no pueden ser reproducidos total
o o parcialmente sln el permso previo escrito de IBM
o
o
IEs:,;: _::
el,se var_respuesta = var_x;
En este caso, la referencia a la macro se asemeja
MCD(x y) . a la llamada a la funcin, como
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
programas de usarfas dentro de los
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
parntesis va a rectificar el efecto modificacin en el uso de los
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
recursivamente.
qr" no pueden llamarse as mismas
sustituir todas las funcones en un programa con
macros no ser posibre por sus
limitaciones inherentes. Las macros, a diferencia
nmero de argumentos pasados, no sus
de las funciones, verifica slo el
las entradas errores se hace mejor en las
fr;;ir;r.
-- implica
tipos, lo cual ' que las validaciones de

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:
. #if
. #elif
o #e1se
o #endif
#ifdef
o #ifndef
r #1ine

Undad 3: Caracterstcal nOicionZlesle


C Volumen 6: Tpicos Avanzados j4
@ Copyright tBM Corp. 2002
Los materiales del curso no pueden ser reproducidos
total
o parcalmente sin el permiso previo escrito de IBM
ot
o
o Gua del Estudiante Introduccin a la Programacin con C
o o #undef
o
El preprocesador incluye los siguientes tres operadores especales:
o
defined
o
of
o
o .##
o Estas directivas pueden aparecer eh cualquer fugar. Sin embargo, se usan
generalmente comienzo de un programa, por complacin condconal del codigo. El uso
o ms comn es tener una sentencia de salda amplia e'l el caso del modo dpuracin
o (debug) y una salida compacta en el caso del modo release ( versn).
o A continuacin se discuten las directivas del preprocesador.
o
5.1. #ifdef y #endif
o
o o #ifdef significa's definido' (if difined).
o o #ifdef hace que un bloque de codigo se procese si el nombre de la macro
o est definido.
o Elsiguiente es fa forma general de #ifdef ! #endif :

o
o # i f def nombre_de_la_macro
o ,/* secuencia de una o ms sentencias * /
o
#endif
o
o 5.2.#indef y #else
o . #ifndef signfica 'si no definido' (if not cbfined). Exactamente opuesto a
o #ifdef.
o o #else es similar al else en la estructura de control if -else en C.
o #ifndef DEBUG
o /* c6dgo para proveer salida amplia */
o #efse
o /* cdigo para proveer una salida compacta */
o #endif
o s.3. #f
o
La directiva #if se puede usar para probar si el valor de una expresin es dstnto
o de cero o no.
o
o Lo siguiente es la forma general:

o #if exp
a
a
q '''otumen 6: T
@ Copyright IBM CorP.2002
Los materiales delcurso no pueden ser reproducidos total
a o parcialmente sin el permiso previo escrito de IBM

)o
I
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
de hardware. usando un enter rirnpr" qr" orspositrvos
representar la existencia o no de de. cuatro dgitos.
- se puede
"onririe de narowar-e.
estos dispositivs
co'espondiente al dispositivo de hardwar" s, er dgito
r ert indica ra presen'a de un
Jel dt:spositivo.",
dispositivo, y 0 indica la ausencia
Los dispositivos y ras posiciones
de ros dgitos se muestran en ra Tara
3.2.

Teclado Dispositivo de Ratn Puerto serial para


CD ROM rmpresora
Digito 3 Digito 2 Digito I Digito 0
Tabla 3.2: Posiciones de los Dgitos y
de tos Dispositivos
larconclusin de la presencia de
;:frJfi::ti tos dispositivos ctaramente se necesita
ta

La manipulacin de bit es una de


las caractersticas nicas.d" c. Esto
sofamente a operadores integrares;;;" se puede aplicar
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 i!' fl:,ffiff;".31j","
OR exctusivo oe
o" *
mano;;;it

unidad 3' catacte@ Volumen 6: Tpicos 4vanzados


@ Copyrighr tBM Corp.2002 36
Los materiafes det cuiso no pueden
ser reproOucOos total
o parcalmente sin el permso previo
de fBM
"rtrto
o
o
o Gua del Estudiante Introduccin a la Programacin con C

o El operador de manejo de bits AND (&) se usa frecuentemente para enmascarar un


o conjunto de bits. Sea elsiguiente ejemplo.
o a = 37 = 0000 0000 0010 0101
o b = 88 = 0000 0000 0101 O11O
o a & b = O4 = 0000 0000 0000 0100
o Ef operador de manejo de bits oR ( l) se usa para cambiar los bts.
o
o aIb= 119 = oooo oooo 0111 o1l_1

o 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.
o
o a ^ b = 115 = oooo oooo 0111 oo11

o Operadores de Desplazamiento de Bits


o Los siguientes son los operadores de desplazamiento de bits:
t o <<- desplazamiento a la izquierda
o . >>- desplazamiento a la derecha
o Los operadores de splazamento << y >> desplazan al operando, a la izquierda y
o derecha, el nmero de posiciones de bits dado por ef operando de la derecha, el cual
o debe ser postvo. Por ejemplo:
o . x << : desplaza los bits o x, z posiciones a la izquierda, y asigna 0 a los bits
desplazados.
o . x >> z desplaza los bits en x, z posiciones a la derecha y asigna 0 a los bits
o desplazados.
o
o x = 0010 0110 1011 0111
x << 3 = 0011 0101 1011 1000
o
o
o 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
o derecha, comienza en 0) representa si la computadora tiene una mpresora nstalada o
o no. Si est instalada, el bit 5 de este byte representa un 1, de otro modo un 0. Para
o 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
o buscar si este es 1 o 0 para verificar si el byte es un nmero positivo o negativo.
o
o 6.1. Operadores de Manejo de Bits - Complemento
o Los siguientes son los operadores de complemento de bits:
o - el comlemento de uno (unario)
o- El operador unaro (-) convierte cada 1-bit a un O-bit, y un O-bit a 1-bit.
o, 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

o
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\ - - Lt I
X=X>>1r.
x =x I set,.
)
return x,.

I
La funcin anterior torna-x, y el
nmero de posicones a ser desplazadas
realza la rotacin' La funn pueJe a la derecha, y
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
cuales van ms all del alcance Oeesia
a las operaciones de manejo de bits, las
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 Gua del Estudiante Introduccin a la dil tduur r t! !

o
o Resumen
o Ahora que ha completado esta unida, usted debe ser capaz de:
o o Declarar y usar las enumeraciaciones en C
o . Describir los argumentos de la lnea de comandos
o . 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
O
o
o
o
o
o
o
o
o
o
o
o
o
a
o
o
@ Copyright IBM Corp. 2002
o Los materiales delcurso no pueden ser reproducidos total
o o parcialmente sin el permiso previo escrito de IBM
o
O
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) Todas las anteriores
2) 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.
a) Verdadero
b) Fatso
4) 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) Fatso
6) En una macro, slo el nmero de argumentos se verifica pero
no sus tipos
a) Verdadero
b) Fatso
7) La macros son realmente dentificadores en esencia.
As que, se pueden pasar a
las funciones como argumentos.
a) Verdadero
b) Fatso
8) En el manejo de archvos de datos, qu es FrLE que se usa para crear un
puntero a un buffer?
a) Palabra clave
b) Funciones
c) Macro
d)Ninguna de las anteriores
e) Las macros pueden definirse y utilizarse en forma
recursiva.
a) Verdadero
b) Falso
10) La definicin de macro se puede hacer de manera
anidada.
a) Verdaderos
b) Falso

Unidad 3 : 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
F> Gua del Estudiante lntroduccin a la P macin co' C

o i
o ?

D,
Respuestas a la unidad 3: Examen de Autoevaluacin
E-
o !t
1)b
o .
E
2)b
o E
x
tf-
3)a
o E 4)b
o ,-- 5)a
o E 6)a
o 7)a
o 8)d
o e)b
o 10) b

o
o
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 @ Copyright tBM Corp. 2002
Los materiales delc{rso no pueden ser reproducidos total
o o parcialmente sin el permiso previo escrito de IBM
o
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"
usar algoritmos para todas ias0,"-:1 probfema y entender sus implicaciones
forma oe compte;idad considerndo
tcn icas de programa cn prenoias todas las
a ;"; ;;#",
' en c usando de ras caractersticas
$i5T,::5:JH"argoritmos "r"rqri"r"
' prosrama completamente runcionar
;f;ilJo::5"ntt 'n que resuerve el
I

I
Unidad 4: Laborao
{

Los_materiaj",?"i:.?1#llF.[.:?'g":?ll*u",oostotar I

o parcialmente sin el permiso previo


escrito cte IBM I

fl
O
o
Gua del Estudiante
o Introduccin a la ramacin con C

o
o Ejercicios de Laboratoro
o 1) Escribir un programa compreto en c que haga las siguientes tareas:
o a) Tomar un archivo de texto como entrada que puede contener una novela
completa en espaol, con las normas de puntacin permitidas.
o b)
t Modificar elcontenido del archivo de texto y crear un archivo separado con las
slguientes caractersticas :
o ' Todas tas palabras af inico de la sentenca deben estar en maysculas.
o . Los espacios en blanco deben ser removidos.
o c) Tambin imprimir las estadsticas deltexto, como se menciona a continuacin:
o . Nmero de caracteres
o . Nmero de palabras
O r Nmero de sentencias
o
o
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 . @ Copyrght tBM Corp. 2002
Los materales delcurso no pueden ser reproducidos total
o o parcialmente sin elpermiso previo escrito de IBM

Potrebbero piacerti anche