Programacion Estructurada en C - Antonakos

2,150 views 188 slides Mar 30, 2015
Slide 1
Slide 1 of 188
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120
Slide 121
121
Slide 122
122
Slide 123
123
Slide 124
124
Slide 125
125
Slide 126
126
Slide 127
127
Slide 128
128
Slide 129
129
Slide 130
130
Slide 131
131
Slide 132
132
Slide 133
133
Slide 134
134
Slide 135
135
Slide 136
136
Slide 137
137
Slide 138
138
Slide 139
139
Slide 140
140
Slide 141
141
Slide 142
142
Slide 143
143
Slide 144
144
Slide 145
145
Slide 146
146
Slide 147
147
Slide 148
148
Slide 149
149
Slide 150
150
Slide 151
151
Slide 152
152
Slide 153
153
Slide 154
154
Slide 155
155
Slide 156
156
Slide 157
157
Slide 158
158
Slide 159
159
Slide 160
160
Slide 161
161
Slide 162
162
Slide 163
163
Slide 164
164
Slide 165
165
Slide 166
166
Slide 167
167
Slide 168
168
Slide 169
169
Slide 170
170
Slide 171
171
Slide 172
172
Slide 173
173
Slide 174
174
Slide 175
175
Slide 176
176
Slide 177
177
Slide 178
178
Slide 179
179
Slide 180
180
Slide 181
181
Slide 182
182
Slide 183
183
Slide 184
184
Slide 185
185
Slide 186
186
Slide 187
187
Slide 188
188

About This Presentation

El curso está orientado a codificar programas en lenguaje C/C++, utilizando un ambiente de trabajo basado en
consola.


Slide Content

PROGRAMACION
ESTRUCTURADA

PRENTICE HALL

PROGRAMACION ESTRUCTURADA
EN C

James L. Antonakos
Kenneth C. Mansfield JR.

Broome Community College

Traducción:

Jess Careetero Pérez
Félix Gareia Carballcira
Fernando Pérez Costoya

Facultad de Informático
Universidad Politécnica de Madrid

Revisión Técnica:
Luis

Facultad de Informática
Universidad Pontificia de Salamanca en Madrid

PRENTICE HALL

Madd + Upper Sade River
Santa de Bogotá + Si

léxico » Nueva Delhi + Rio de Janeiro
oki + Toronto

(SULTORES EDITORIAL

SEBASTIAN DORMIDO BENCOMO,
Departamento de Informática y Automática
UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA

LUIS JOYANES AGUILAR
Departamento de Lenguajes, Sistemas Informáticos ¢ Ingeniería del Software
UNIVERSIDAD PONTIFICIA DE SALAMANCA en Madrid

Resumen del contenido

Boosonswne

FUNDAMENTOS DE ©
PROGRAMACIÓN ESTRUCTURADA |

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES
BUCLES Y RECURSIVIDAD

PUNTEROS, ÁMBITO Y CLASES DE VARIABLES
CADENAS DE CARACTERES

VECTORES Y MATRICES NUMERICAS

ESTRUCTURAS DE DATOS

ENTRADA/SALIDA DE DISCO

ASPECTOS AVANZADOS

APÉNDICES

SOLUCIONES

ÍNDICE

st
103
171
215
259
309
365
443
483
525
593
563

LS

341. ANTONAKOS y K.C. MANSFIELD JR.
Programación estructurada en C

No et penis I epeodvesi total 0 arial de cts obra
Sin sutorició ec de la Er

DERECHOS RESERVADOS
© 1997 sepecto la primera sición en español por
PRENTICE HALL tetona) (UK) Lal

Capes 400, Mayands Avenue

Hemel Hempstead

Horde, HP2 782:

Simon & Schuster Iteration! Group

ISBN: 84-89660-23-9
Depósito legal: M. 11.281-1998
12 reimpresión, 1998

Traducido de
APPLICATION PROGRAMMING IN STRUCTURED €.
PRENTICE HALL, INC

Simon & Schuster Intemational Group

A Viacom Company

© MCMXCVI

ISBN 0-13-520887.9

Edición en español:
Editor: Andrés Otero
Diseño de cubiena: DIGRAF
Composición: Dayo, 5. L.
Impreso por Fares, S.A,

IMPRESO EN ESPAÑA - PRINTED IN SPAIN

Resumen del contenido

Fennpnsen-

FUNDAMENTOS DE ©

PROGRAMACIÔN ESTRUCTURADA
OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES
BUCLES Y RECURSIVIDAD

PUNTEROS, ÁMBITO Y CLASES DE VARIABLES
CADENAS DE CARACTERES

VECTORES Y MATRICES NUMÉRICAS
ESTRUCTURAS DE DATOS

ENTRADA/SALIDA DE DISCO

ASPECTOS AVANZADOS

APÉNDICES

SOLUCIONES

ÍNDICE

51
103
171
215
259

365
443
483
525
533
563

Contenido

1

FUNDAMENTOS DE C

1.1. El entorno de C
¿Por qué C?

Estructura de un programa
Elementos de C

La función prince)
Identificación de cosas
Declaración de cosas

Introducción a los operadores de C

Más prine£ 0)
Leyendo la entrada del usuario
Implementación y depuración de programas: errores de

programación frecuentes
1.12. Programa de aplicación: conversión de temperatura
Programas de aplicación adicionales
1114. Programación en ANSI C

PROGRAMACIÓN ESTRUCTURADA
21. Conceptos de bloque de programa
2.2. Uso de funcion
23. Dentro de una función C
24. jones

3

18
a

2
29
30

34
38

46

si

32
51

69

CONTENIDO.

25. Uso de la directiva raesine 7
2.6... Implementación y depuración de programas: creando sus propios

archivos de cabecera 83

2.7. Programa de aplicación: circuito RL en serie 89

3. OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 103

3.1. Operadores de comparación 104

32. La bifurcación abierta 108

33. La bifurcación cerrada 116

Operaciones booleanas binarias 124

Operaciones lógicas. 130

Conversión de tipos 137

La sentencia switch 139

Más sobre la sentencia switch y el operador condicional 147

Depuración y desarrollo de programas 152

Programa de aplicación: Reparación de un robot 154

Programas de aplicación adicionales 160

4, BUCLES Y RECURSIVIDAD m

4.1. El bucle for

42. Bucle wnite

43. El bucle do while

44. Bucles anidados

4.5. Implementación y depuración de programas
46. Recursividad

4.7. Programa de aplicación: máquina expendedora
48. Programas de aplicación adicionales

5. PUNTEROS, ÁMBITO Y CLASES DE VARIABLES 215

5.1.. Organización de la memoria

5.2. Cémo se utiliza la memoria

53. Punteros

5.4. Paso de variables.

55. El ámbito de las variables

5.6. Clases de variables

5.7. Depuración e implementación de programas
58. Programas de aplicación

6. CADENAS DE CARACTERES

6.
62.
63.

64.

65.
66.
67.
68.

Caracteres y cadenas de caracteres
Inicio de cadenas de caracteres

Paso de cadenas de caracteres entre funciones
‘Trabajo con elementos de cadenas de caracteres
Fonciones para manejar cadenas de caracteres
Ordenación de cadenas de caracteres

Programa de aplicación: formateador de texto
Programas de aplicación adicionales

7. VECTORES Y MATRICES NUMÉRICAS

71
72

73.
74,
75.

Vectores numéricos

Introducción a las aplicaciones con vectores numéricos

Ordenación de vectores numéricos
Matrices numéricas
Programas de aplicación

8. ESTRUCTURAS DE DATOS

Tipos enumerados.
Dar nombre a sus propios tipos de datos
Introducción a las estructuras de datos

Más detalles acerca de las estructuras de datos
La union y vectores de estructuras

Formas de representar estructuras

Estructuras de datos avanzadas

Programa de aplicación: MiniMicro
Programas de aplicación adicionales

9. ENTRADA/SALIDA DE DISCO

Entradwsalida de disco
Más sobre la E/S de disco.

Flujos de datos, punteros a archivos y argumentos de

de mandatos
Programa de aplica
Programas de aplicación adicionales

n: Una base de datos de piezas.

CONTENIDO

259

260
265
267
270
25
284
288
295

309

310
318
323
343
351

366
m
376
381
389
398
400
421
425

443

448

462
470
476

x CONTENIDO

10. ASPECTOS AVANZADOS 483
10.1. Punteros a funciones 484
102. Funciones como argumentos 489
10.3. Funciones con número variable de argumentos 492
104. Aplicaciones modulares 497
105. La utilidad make 506
106. Programas de aplicación adicional 513

APÉNDICES

A. Manual de consulta de C
B. Funciones matemáticas estándar de ANSI C
C. Juego de caracteres ASCIL

SOLUCIONES 533

Prólogo

Introducción

El lenguaje de programación € se está abriendo paso cada día en un número creciente
de curricula de escuelas y facultades técnicas. La necesidad de un libro de texto que
enseñe los conceptos fundamentales de programación necesarios para los estudiantes
de hoy es grande. Todos los estudiantes de tecnología que usan C descubren que es un
lenguaje potente y, sin embargo, fácil de aprender. La habilidad para controlar un
computador a nivel hardware usando un lenguaje de alto nivel como Ces importante y
necesaria, especialmente en la sociedad actual, donde cada vez más tareas son delega
das a los computadores.

El propósito de este libro es describir el lenguaje de programación C a personas sin
conocimientos de programación, usando ejemplos. Las cosas básicas que hace un pro-
gramador (bucles, cálculos, formatos, entrada/salida) son estudiadas en detalle, Casi
200 programas ejecutables y probados son usados para ilustrar los conceptos necesa
fios de €. Este libro es adecuado para estudiantes de cualquier disciplina tecnológica,
particularmente aquéllos que estudian tecnología de los computadores y electrónica.

los

Contenido de los capi

El Capítulo 1 analiza los conceptos fundamentales del lenguaje de programación C. Se
describe todo lo relativo a programación estructurada, variables, operadores, funcio-
es y entrada/salida (EIS).
El Capítulo 2 resalta la forma correcta de
lenguaje C. Los det

scribir un programa estructurado en
les operativos de las funciones son expandidos.

PRÓLOGO.

El Capítulo 3 informa acerca del uso de las distintas sentencias de control, tales
como it, ££...slss y switch, y acerca de las operaciones lógicas.

El Capítulo 4 muestra cómo se escriben los bucles en C. Los ejemplos incluyen el
uso de for, while y do. .-unt1e, así como de bucles anidados.

El Capítulo 5 analiza la relación entre variable, punteros a variables y el espacio de
‘memoria necesitado por variables de ciertos tipos, También se analiza el uso de varia-
bles locales y globales.

El Capítulo 6 ilustra el manejo de cadenas de caracteres en C. Se explica cómo

ciar cadenas de caracteres, su paso como parámetros de función y las funciones
incluidas en C para manejar tiras de caracteres.

El Capítulo 7 estudia los detalles de las matrices numéricas (arrays numéricos) de
una o varias dimensiones. Incluye varias aplicaciones para ordenar matrices, para.
‘mostrar cómo se accede a los componentes de una matriz, cómo se parten y cómo se
pueden pasar entre funciones.

El Capítulo 8 muestra las técnicas básicas de estructuración de datos usando enun
y typede. También se muestran estructuras avanzadas de datos como las listas
Zadas y los árboles binarios.

El Capítulo 9 explica los detalles de la entrada/salida sobre archivos. Se muestra
cómo crear, escribir y leer archivos secuenciales y de acceso directo.

El Capítulo 10 presenta varios temas avanzados, incluyendo el uso de funciones
‘con número variable de parámetros, el paso de funciones como parámetros, la utiliza
ción de lenguaje máquina dentro de un programa C y la utilidad wake.

El disquete adjunto

El disquete adjunto contiene los archivos con el código fuente en lenguaje C de todos
los programas presentados en el libro. Existe un subdirectorio por cada capítulo del
libro. Cada programa ha sido compilado y ejecutado en tres compiladores distintos
para garantizar su corrección.

El directorio raíz contiene un archivo ejecutable llamado Leave. cox que explica
el contenido del disquete en detalle,

Agradecimientos

[Nos gustaría mostrar nuestro agradecimiento a todos los estudiantes que contribuye-
ron con sus comentarios durante la preparación del manuscrito.

También nos gustaría mostrar muestro agradecimiento a nuestro editor Charles
Stewart, por sus consejos y su paciencia, y a su ayudante Meryl Chertoff, por sus
respuestas a nuestras numerosas pregunt

¡mes L. Antonakos
@sunÿbroome.edu

Kenneth C. Mansfield Ir.
mansfiled-kEsunybroome.edu

PRÓLOGO.

Prólogo a la edición en español

Es un placer para nosotros poder presentar ete text a las personas interesadas en el
lenguaje de programación C. Antes de decidimos por su traducción, estudiamos otros
libros de programación en lenguaje C, cligiendo este debido a su orientación a progr
madores noveles y con necesidad de usar el lenguaje C en aplicaciones de tecnología.
Otra razón importante para la elecciôn de este texto fue el uso de In metodología de
programación estructurada para enseñar ete lenguaje. Este aspecto es muy impor

te, porque permite inculcar en los lectores buenos hibitos de programación, especial-
mente necesarios cuando se usa el lenguaje C, porque debido a la flexibilidad de este
lenguaje, existe unatendoncia general a crear programas poco estructurados y difíciles
de ler.

‘A pesar de que ya teníamos experiencia en trabajos de traducción y en programa-
ón con el lenguaje C, la traducción de este texto ha sido wabajosa porque hemos
realizado una amplia reestructuración del mismo, si bien hemos respetado todos los
aspectos fundamentales del texto original. En primer lugar, hemos traducido todos los
programas del libro, de forma que sean más Fáciles de leer y entender, Además, se han
&liminado del texto algunos programas redundantes 0 poco claros y se han fusionado
tros que resultaban demasiado repetitivos con el objetivo de hacer mis ligero el texto.
En cuanto al contenido de los capítulos, se ha respetado cuidadosamente el de todos
ellos, excepto en el caso del Capítulo 10, que está dedicado a los temas avanzados, y
que ha sufido una profunda remodelación. La edición española incluye en este capítur
10 aspectos del lenguaje C que no estaban contemplados en el texto original como son
punteros a Junciones, funciones como parámetros, te. El resultado global es un texto
más ligero y con menos dependencias de los compiladores para computadores perso-
nales, dependencias estas que eran muy patentes en el texto original, y especialmente,
en este capitulo

El disquete que se adjunta contiene los archivos con el código fuente en lenguaje C
de odos los programas presentados en el libro, Existe un subdirectorio por cada eapi-
tulo del libro. Cada programa ha sido compilado y ejecutado en computadores perso
nales, con el sistema operativo MS/DOS, y en estaciones de trabajo con el sistema
operativo UNIX. Para facilitar la compilación de los programas, se incluye en cada

rectrio un archivo make Le que permite compilar todos los archivos del mismo, EL
directorio raíz contiene un archivo ejecutable amado ueeus.con que explica el con-
tenido del disquete en detalle,

Nos gustaría mostrar nuestro agradecimiento todas las personas que han contri
buido con su ayuda y sus comentarios durante la preparación del manuscrio, Este
agradecimiento se dedica especialmente a Vicente Luque y José María Uñón, por su
ayuda en la compilación de los programas originales

Jesús Carretero

jearrete@ f.upm.es
Felix Ga

fgarciaG@ dasifi.upm.es

Fernando Pérez

fperez@fuupmes

Fundamentos de C

Objetivos
Est capítulo le da la oportunidad de aprenderlo siguiente:

1. Por qué se usa el lenguaje de programación C y para qué es necesario usar C en
un computador.
“Algunas órdenes básicas de C y cómo usarlas para construir un programa estruc»
turado,
Cómo reconocer las estructuras de bloque y cómo usarlas para construir programas.
Qué es un bloque de programador y para qué es dt.
Los elementos básicos necesarios para escribir un programa en C.
El propósito de los archivos incluidos (include)
Cómo funciona la función prince 0)

cadores y cómo usarlos.
Las palabras reservadas usadas en C.
40. La importancia de declarar variables y cómo hacerlo.
11. Los métodos que usa C para ejecutar las operaciones aritméticas.
42. Las maneras de formatear la salida usando la función pránt£()
19. La utilización de la función scan£ para recoger datos de entrada del usuario.
14. Algunas razones frecuentes para los problemas que aparecen en un programa C.
15. Los pasos a seguir para desarrollar un programa usando el lenguaje C.

Palabras clave

Entorno C Archivos para incluir
Editor Archivos biblioteca
Compilador Enlazador

Código fuente Sentencia compuesta

1.1.

PROGRAMACIÓN ESTRUCTURADA EN €

Estructura del programa Salida estándar

Bloque de programa Especificador de formato

‘Comentarios Argumentos

Diseño descendente Campo

Memoria del computador Función

‘Componentes léxicos Declaración

Palabra reservada Identificador

Carácter Especificador de tipo

Entero Operador de asignación

Real Prioridad (Precedencia)

Tipo de datos Operador de asignación compuesto

Sentencia Operador aritmético.

Expresión Secuencia de escape

Sentencia simple Especificador de ancho de campo
Notación E (Exponencial)

Contenido

LA. El entomo de C 1.10. Leyendo la entrada det usuario

12. {Por qué C? LIL. Implementación y depuración

13. Estructura de un programa. de programas: errores de

V4. Elementos de C programación frecuentes

15. La función peines (1 1.12. Programa de aplicación:

1.6. Identificación de cosas conversión de temperatura.

1.7. Declaración de cosas 1.13. Programas de aplicación

LS. Introducción a los operadores de C adicionales,

19. Más prince) 1.14, Programación en ANSI

Introducción

Este capítulo le presenta algunas cosas fundamentales del lenguaje C. Aprenderá
mo visualizar valores en la pantalla del monitor y cómo obtener valores desde el
programa de usuario, Este capítulo muestra también cómo hacer operaciones aritméti-
cas básicas en C.

‘Cuando haya completado este capítulo, será capaz de escribir sus primeros progra-
mas relacionados con la tecnología en lenguaje C. El capítulo concluye con el dise
de una aplicación tecnológica real y algunos programas de ejemplo para ilustrar li
aplicaciones tecnológicas de C.

EL ENTORNO DE C
isión global

Esta sección presenta lo que se denomina el entorno de C, Un entorno en program
las distintas herramientas de programación necesarias para 1
ión en particular.

FUNDAMENTOS DEC 3

Cuando se programa en el lenguaje de programación BASIC, el entorno está habi-
tualmente incluido dentro del microcomputador (en su ROM). En este caso, todo lo
que se suele necesitar es encender el computador, empezar a teclear órdenes BASIC y
teclear un mandato que dé instrucciones al computador para ejecutar el programa. Este
no es el caso de otros lenguajes de programación, especialmente C.

El entorno de C

El entorno de C incluye un editor, un compilador, archivos para incluir (includ),
archivos de biblioteca, un enlazador y mucho más. Las funciones de estos compo
nentes son:

+ Editor. Perm

«e introducir y modificar el código fuente C.
Un programa que convierte el programa escrito en C en un códi-
tiende el computador,
+ Archivos para incluir, Archivos formados por muchas definiciones separa-
es que pueden ser útiles al programador en ciertas siwaciones
joteca. Son programas previamente compilados que realizan
funciones específicas. Estos programas se usan para ayudar al programador a
desarrollar programas en C. Por ejemplo, la función C que permite imprimir
texto en la pantalla del computador (a función print) no esti predefinida en el
lenguaje C. Su código está en un archivo de biblioteca. Lo mismo ocur con
tras muchas funciones, tales como las gráficas, las de sonido y las de trabajo
con discos e impresoras, por nombrar unas cuantas, El programador puedo tame
bién crear sus propios archivos de biblioteca con rutinas desarrolladas por
mismo para usarla repetidamente en distintos programas C. Haciendo esto, sc
pueden ahorrar horas en tiempo de programación y evitar muchos errores de
programación.
Enlazador. Esencialmente, el enlazador combina todas las parts necesarias
les como archivos de biblioteca) de un programa C para producir el código
ejecutable final, Los entazadores juegan un papel importante y necesario en
todos los programas C. En programas C grandes, es una práctica habitual romper
«el programa en partes más pequeñas cada una de las cuáles se desarolla por
separado, El enlazador tendrá que combinaras para formar el código del progra-
ma ejecutable final.

‘También será necesario algún tipo de sistema operativo en disco para ayudar a
“almacenar los programas. Las partes principales del entorno del lengu
‘ran en la Figura LL

sección se ha presentado el entorno de C. Ahora el usuario puede tener una
lo que hace falta para introducir un programa C en el computador y de las otras
cosas que son necesarias para que el programa haga lo que quiere el programador.
(para ejecutar el programa).

4 PROGRAMACIÓN ESTRUCTURADA EN C

ET Q
PP Es

Conia uno
gino isos
sur es

ie ‘SION

roben an chino
‘San programa ewe

MYPROGEXE

Figura LI El enorm de C.

FUNDAMENTOS DEC 5

En la siguiente sección usted aprenderá algunas de las razones por las que C es un
lenguaje de programación tan importante y cómo puede usarlo

Repaso de a Sección Lt

1. Explique el propósito de wn editor. ¿Para qué es necesario?
2. Dé la razón por la que usa un compilador.
3. Explique las acciones de un compilador.

1.2. ¿POR QUÉ C?
Antecendentes

Ces un lenguaje de programación cada vez más popular en as industrias, las escuelas.
y como lenguaje de uso personal. Las diversas razones para que esto sea así se mues-
iran en la Tabla 1.1.

Desventajas de C

Debido a que C es un lenguaje versátil, su código puede ser escrito con tal brevedad y
concisiôn que se vuelve casi ilegible, Este estilo de programación no es recomendado
y noes usado en este libro, Debido a su flexibilidad, C le permitirá escribir pro

‘que podrían acabar teniendo errores o pulgas (bugs) muy difíciles de encontrar. Pro-
gramar en C es como tener un coche de carreras con una velocidad límite de 500 kph y
muy pocas restricciones en la autopista hay que ser cuidadosos con el manejo de
‘este poder sin restricciones.

‘Tabla LL. La potencia de €

Ventajas Lo que eto significa para usted

Diseñado para programación arribabajo más ei de diseñar

Diseñado pra sr structurado mis ei de ler y comprender

Permit el diseño modular Meca la apacencia de los programas, deforma que otros
pueden seguros y modiicarios icilmente, Hace mis
illa depuración

Un lenguaje fie Programas más compactos y más épis.

Transporable io de computador servi en
to po con pocos, ningún cambio,

Conteo! del computador Usted tienen control cas absoluto sobre su comparador.

Flexibilidad Se pueden eat (ilmente oros lenguajes y sistemas ope

6 PROGRAMACIÓN ESTRUCTURADA EN C

Programa 11

El aspecto de C
Aqui hay un programa C:

Hinelude <stdio.h>

/* Este es un programa C. Imprime un mensaje en la pantalla
‘el computador

rain)



prinef(-Envienc una resistencia de 10 6hmios."};

3

Se pueden resaltar varias cosas del Programa 1.1. Es fic de leer. Nadie duda de lo

que hará el programa. El programa tiene una estructura que le hace fácil de leer. Hay

algunos símbolos extraños (tales como el /*, que se explicará en breve). Lo que se ve

‘en este programa es el código fuente. Esto es lo que usted, el programador, teclea
En el Programa 1.1 se presentan muchos de los elementos necesarios en un progra

ma C. Estos elementos son las palabras reservadas include, main y print£
‘Cuando se ejecuta el programa, se escribe:

Envieme una resistencia de 10 ohmios

en la pantalla del computador.

Las distintas partes

Como puede verse en la Tabla 1.2, todos los programas C deben tener ciertos compo-

nentes fijos. No se preocupe de los otros elementos (tales como el print) usados en

na 1.1. Han sido usados para indicar en C cómo imprimir la sentencia en el
renderd el significado de estas sentencias y cómo usarlas.

Tabla 12, Panes principales de un peograma C

Elemento, Propós

Finelude <etaio.k» Le indica al compilador que debo nc e archivo de entraide.
cóndor

sain Mara el punto donde el programa C comienza I sjecuchin, Es obligui-
ia en toes os programs.

o Deben spurecr inmediatamente detrás de main, Habitalmene, ante
eos paréness hay formación que será usada por el pograma,

now Ets símbolos son opeionaesy se usan para delimita los comentarios

Los comentarios son anotaciones usadas para clarifier e program a
‘tas personas. Son ignorados por el compilador
‘Cada sentencia C termina cun un punto y coma. Por ahora pued pensar
ue una semencia est formada por un mandato (orde

0 Las llaves son necesarias en todos os programas C Indica el prin
ial de as intrucciones de programa,

FUNDAMENTOS DEC 7

Conclusión

¡Felicidades! Ha visto su primer programa C. Dicho programa imprime un mensaje en
la pantalla, algo que cualquier computador puede hacer fácilmente sin usar C. Ha sido.
pensado para mantener las cosas tan sencillas como sea posible permitiéndole concen-
trarse en los elementos principales de un programa C.
En la próxima sección aprenderá algunas cuestiones importantes acerca de la es-
ted debería usarla,

Repaso de a Sección 12

Describa rs venas del longus de programación €,
Explique qué significa la tansporbiidad cn un lenguaje de programación
Con qué mandato deben empezar todos los programas C?

Ponga un ejemplo de un comentaio en un progama €,

¿Cuil e el propósito de as aves | en un programa C?

1.3. ESTRUCTURA DE UN PROGRAMA

Programa 1.2

Presentación

En este libro, todos los programas € se ajustarán a una estructura específica, Se puede
pensar en la estructura de un programa como en el formato que se usa cuando se
introduce el programa. El Programa 1.1 tenía una estructura:

Hinclude <stdio.h>

+ Esto es un programa C. Imprime un mensaje en la pantalla
del computador */

rain)

dj

print£(“envieno una resistencia de 10 ohnios.*



Cuando se compile y ejecute, este programa imprimirá algo en el monitor (en la
primera linea empezando en la esquina izquierda de la pantalla)

Enviene una resistencia de 10 ohmios.

El Programa 1.1 podí

ía haberse escrito con una estructura.

in:

Hinelude <stdio.h>

1" Bete os un programa en C. Imprime un mensaje en la *
4" pantalla del computador. */
main () (printf("Enviene una resistencia de 10 ohmios

8 PROGRAMACIÓN ESTRUCTURADA EN C

Programa 1.3

Cuando se compile y ejecute, el Programa 1.2 hará exactamente lo mismo que el
Programa 1.1. La diferencia es que la estructura ha cambiado. El Programa 1.2 es un
poco más difícil de leer. Se podría haber escrito el mismo programa así:

include <stdio.h>

main) (printE("enviene una resistencia de 10 ohmios.”|

Una vez más, cuando se compile y ejecute, el Programa 1.3 hará lo mismo, El
asunto es que la estructura de un programa se considera buena cuando permite que la
gente lo lea y entienda fä

Para un programa tan sencillo como el presentado ag
no parece introducie una gran diferencia. Sin embargo,
estructura del programa es muy importante,

la estructura del programa.
programas más grandes, la

Programación estructurada frente a no estructurada

Una de las medidas de un «buen» programa de computador es que pueda ser leído y
comprendido por cualquiera — incluso si esa persona no sabe programar.

Por ejemplo, el primer programa C presentado en este libro era fácil de compren-
der. Se admite que no hacía mucho, pero la cuestión es que si se mantiene una buena
estructura, el programa será más fácil de comprender, modificar y depurar cuando sea
necesario. Un programa no estructurado es aquel en el que no se ha hecho ningún
esfuerzo, o muy poco, para ayudar a la gente a lecrlo y comprenderlo. Recuerdo que la
estructura de un programa no supone ninguna diferencia para el computador, solamen-
te para la gente que tiene que trabajar con él

Bloques de un programa

Se puede pensar que un programa estructurado tiene ciertas partes del programa situa-
‘das en posiciones particulares en el documento del programa. Se puede pensar en estas
posiciones como en bloques de información. Una carta contiene bloques de informa-
ción:

ua
123 Carretera de la Fábrica de Páginas
y EE.UU,

321 Car
Código Fun
43210

Estimado Sr

Envieme una resistencia de 10 ohmios

FUNDAMENTOS DEC 9

Pta: Gracias por la rápida entrega de mi último pedido,
La carta anterior podría haberse escrito de la siguiente forma:

Juan Estudiante 123 Carretera de la Fábrica de Páginas Villa Programa, EE.
01234 La Compañía de Resistencias 321 Carretera dela Página de Fábricas Códi-
20 Fuente, EE.UU, 43210 Estimado St: Envieme una resistencia de 10 ohmios
Sinceramente: Juan Estudiante Pra. Gracias por la rápida entrega de mi Último
pedido.

La diferencia entre ambas cartas es que una está estructurada y la otra no. La carta
no, estructurada costaría menos tiempo de escritura, menos tiempo de impresión y
usaría menos papel. Si se hicieran todas las cartas de esta forma durante un periodo de
tiempo largo incluso podría ahorrarse algo en envíos de correo. Pero serían muy diff
les de leer, no debido al estilo de escritura, sino debido a su estructura.

A continuación se muestra la misma carta, pero esta vez se hace énfasis en la
estructura de bloques:

Juan Estudiante
123 Carretera de la Fábrica de Páginas
Villa Programa, EE.UU.

01235

La Compañía de Resistencias
321 Carretera de la Página de Fábricas

+ Bloque de dirección de

She Fame E. UL = Bloque de dección o destino
43210
Estimado Se: | ~ Bloque de saludo

Envieme una resistencia de 10 ohmios. | ~ Cuerpo dea caña

Sinceramente:
+ Cleo dela cora
Juan Est

10 PROGRAMACIÓN ESTRUCTURADA EN €

Programa 1.4

La estructura de bloques hace la carta más fácil de leer. De forma similar, cuando
se usa la estructura de bloques en programas, también son más fáciles de leer. Al igual
que existe una estructura de bloques establecida para las cartas, en este libro se usará
una estructura de bloques establecida para escribir los programas en C.

El bloque del programador

Cada programa en C bien documentado debe empezar con un bloque llamado bloque
del programador. Está compuesto por comentarios que contienen la siguiente infor-
mación:

Nombre del programa
Programador

Descripción del programa
Explicación de todas las variables.
Explicación de todas las constantes

A estas alturas, usted ya sabe suficiente C como para hacer esto: suponga qu
que eseribir un programa C que resuelva la caída de voltaje en una resister
10 ohmios cuando
ción es:

de
atraviesa una intensidad determinada. La fórmula para esta rela

Donde

V = El voltaje a través de a resistencia medido en voltios
1 = La corriente en la resistencia medida en amperios.
R = El valor de la resistencia medida en ohmios.

El programa C debería empezar con el bloque del programador. Esto se it
el Programa 14,

Hinelude <stdio.h>

m
Programa: Cálculo de voltaje
Desarrollado por : Un buen programador

Descripción: Este programa calcula el voltaje que cae
en una resistencia de 10 ohmios. El usuario debe
introducir el valor de la intensidad.

variables

Y = Voltaje en la resistencia.

Intensidad en la resistencia

FUNDAMENTOS DEC 11

Constantes.
R= 10 (Una resistencia de 10 ohmios)

“Y

del programa que realiza lo descrito arriba */

El Programa 1.4 se compilará y ejecutar, pero no ocurrirá nada porque no se ha
puesto ningún mandato (orden) dentro del programa. El programa tiene solamente
comentaros y las partes esenciales de un programa C. Pero el bloque de programador
está completo. Dice exactamente lo que el programa hará y, igual de importante, defi-
me todas las variables (Ve 1) y el valor de la constante À que serán usadas en el
programa. Cuando se hace un diseño descendente (presentado posteriormente en este
capitulo), definir el problema de programación con palabras es el primer paso esencial
enel diseño del programa. Seleccionar las variables y definilas es otro paso importan-
te. Por ahora, sólo debe saber lo que tiene que estar incluido en un bloque de progra-
mador y conocer la mecánica para escribir ese bloque usando C.

Ventajas y desventajas de la programación
estructurada

La principal desventaja de a programación estructurada afecta principalmente a aque-
líos que han aprendido programar de forma no estructurada. Los viejos hábitos son
difícil de eliminar. Si nunca ha programado antes, la programación estructurado no
tendrá desventajas para usted. Otra desventaja de la programación estructurada es que
hace más largos los programas cortos hechos de forma no estructurada.

En el pasado, la memoria del computador era relativamente cara y limitada. Por
lo que se pagaba por hacer programas tan breves como era posible para ahorrar espa-
io en la memoria del computador. Este noes el caso actualmente, Incluso las calcula:
doras de bolsillo tienen más memoria que muchas de las grandes máquinas antiguas.
Por tanto, no hay ya necesidad de ser breve programando, Hay, sin embargo, necesi:
dad de ser claro programando y de desarrollar buenos hábitos de programación que
rosulten en programas completos que scan fáciles de comprender, modificar y corre»
gir. Este es el propósito de este libro

Lo que aprenda en este texto podrá ser aplicado a cualquier lenguaje estructurado.
como Pascal e incluso BASIC. Cuando complete ete texto, podrá crear programas de
forma eficiente usando técnicas de programación estructura

La Figura 1.2 ilustra la estructura de un programa C completo usando el están-
dar de prototipos ANSI. Los detalles de programación serán tratados en los próxi-
mos capítulos, Por ahora, estudie la estructura del programa para tener una idea ge-
neral.

12. PROGRAMACIÓN ESTRUCTURADA EN C

Directvas | vinciuée <ataio.t
os „> Hnclude seach
| foc)

dove Introducir ot radio

tees 2 feos del efron.
Dotmidinge "7"
Er

Aa shconersval
‘ola aoverar.tacterpuonta( (03 ares,

owas
nen >|

ñ

Figura 12. Estractu de un programa Co

Expiación
ee

PRE aten del eireule ve 4 unidades, "cases

INDAMENTOS DEC 13

Conclusión

En esta sección se ha presentado una idea general de las diferencias entre programa
ción estructurada y no estructurada. Aprenderá mucho más sobre estas áreas, inclu
yendo la potencia de C como lenguaje de programación. Compruebe su nivel de com=
prensión en la sección de repaso siguiente.

Repaso dela Sección 1.3

Defina el nin «estructura» como se sa en programación
Es necesario dar estructura a un programa C para compil
Describa una etuctura de bloque y dé un ejemplo.
Explique ls razones para usar programación estructurada.
Describa un bloque de programador y defina o que debe contener.

propor

ELEMENTOS DE C

Esta sección establece las reglas básicas para los elementos fundamentales de todos
los programas escritos en C. En esta sección verá muchas definiciones nuevas. Éstas
definirán el escenario para el resto de este capi

lo, así. como para el resto del texto.

Lo que C necesita

Para escribir un programa en C. se usa un conjunto de caracteres. Este conjunto inclu

letras mayúsculas y minúsculas del alfabeto inglés, los diez dígitos decimales
del sistema de numeración arábigo y el carácter subrayado (_). Los espacios en blan-
o (tales como espacios entre palabras) se usan para separar los elementos de un pro-
grama C, de forma similar a como se usan para separar las palabras en este libro. Los
espacios en blanco también incluyen el tabulador y el salto de línea, así como otros
caracteres de control que generan espacios en blanco.

Componentes léxicos. En cualquier código fuente C. el elemento más básico reco-
nocido por el compilador es un carácter simple o grupo de caracteres conocido como
componente léxico (token). Esencialmente, un componente léxico es un texto del
programa fuente que el compilador no troccará mis —se trata como unidad funda-
mental. Como ejemplo, en C main es un componente léxico; también lo son la lave
inquierda (O y el signo de sumar (+)

Palabras reservadas en ANSI C. Las palabras reservadas son componentes léxicos
predefinidos que tienen un significado especial para el compilador de C. Sus definicio-
nes no pueden ser cambiadas: por tanto no pueden ser usadas para nada más que la
finalidad que tienen en el programa en que son usadas. Las palabras rescrvadas son las
siguientes:

PROGRAMACIÓN ESTRUCTURADA EN ©

auto double Ane struct break eise
Long switch caso enn register typedef
char extern return union const Float
short unsigned conti for signed vota
default goto sizeot volatile do. se

static while

Tipos de datos. El lenguaje C tiene res tipos de datos principales: números, caracto-
res y cadenas de caracteres. Un carácter es cualquier elemento del conjunto de carac-
teres usado por C. Una cadena de caracteres es una combinación de estos caracteres.

Números usados por C. C usa un amplio rango de números. Los números usados
por C caen en dos grandes categorías generales: enteros (números enteros) y reales
(atimeros con punto decimal), Estas dos grandes categorías puede subdi

se ve en la Tabla 1.3.

Como puede verse en la Tabla 1.3, C ofrece una rica variedad de tipos de datos.
¡Generalmente hablando, cuanto mayor es el rango de valores de un tipo de datos, más.
‘memoria del computador cuesta su almacenamiento, Como regla general, se desea
usar tipos de datos que conserven la memoria al tiempo que satisfagan el propósito
deseado. Por ejemplo, si se necesita un tipo de datos para contar objetos —1ales como
el número de resistencias de los pedidos— el tipo de datos ine será probablemente
“adecuado, Sin embargo, si se está escribiendo un programa con tanta precisión como
sea posible, se podria considerar el uso del tipo doub1e, que puede dar una precisión
de 15 dí

Como puede verse en la Tabla 1.3, algunos tipos de datos tienen el mismo rango de
valores (tal como int y short). Esto es así en un IBM PC, pero pueden tener rangos
distintos en otros computadores.

Tabla 13, Subdivisión delos tipos de datos

dentifiador de ipo Signiiado, Rango de valores (IBM PC)
char carter 1282127

ine entero 32.768 4 32.67

sonore entero conto 327682 32.767

Long entero lag -2.147 483.688 a 2.47 483.697
unsigned char carte sin signo 03255

unsigned estero sin signo 065535

unsigned short nero coro sin signo 03 65335

unsigned Long nero largo sin signo 034204967295

en num, 0465535

pee a (com tante) 3AE #72 38 ( dígitos
doubt real doble LTE + 308 (5 dígito)

tong double real doble largo NIE 41-4932 (15 dígito)

FUNDAMENTOS DEC 15

Sentencias de C

Una sentencia (instrucción) de C controla el flujo de ejecución de un programa. Está
formada por palabras reservadas, expresiones y otras instrucciones. En C, una expre-
sión es una combinación de operandos y operadores que expresa un valor único (tal
como respuesta = 3 + 5:

Hay dos tipos de sentencia en C: sentencias simples y compuestas. Una sentencia.
«compuesta está delimitada por llaves (( )), mientras que una sentencia simple termina.
con un punto y coma (;), A medida que vaya progresando con este libro, se hará más
referencias a sentencias de C.

Conclusión

Eo esta sección se han mostrado los elementos de un programa C. El resto de este
capitulo le mostrará cómo usarlos. Ponga a prueba lo que ha comprendido de esta
sección haciendo los ejercicios de repaso.

Repaso dela Sección 1.4

Indique qué se ua para escribi un programa en €.
Explique lo que es un componente léxico en C.

¿Cuáles son os tipos de datos picipaes usados en C?
Fsplique qué es una palbra reservada. DE un ejemplo.
¿Qué tipo de datos maneja el número mayor?

1.5. LA FUNCIÓN print£ ()

Esta sección presenta la poderosa función peine () usada en C. Es realmente una
Función separada (como main.) es una función) y está incluida en la biblioteca cstän-
dar que tienen todos los sistemas con C.

Lo que hace prints ()

La función peine 1) se usa para escribir información por la salida estándar (normal
mente la pantalla del computador). Ya se usó prine£() en la sección anterior. La
estructura de esta función es:

printf (cadenas de caracteres con espocificadores de formato,
variables o valores):

Los caracteres son delimitados por comillas simples (tal como a) y las cadenas
de caracteres son delimitadas por comillas dobles (tal como “Esto es una cadena de
caracteres-), Un especificador de formato instruye a la función print () sobre la
forma de convertir, dar forma e imprimir sus argumentos, Por ahora, puede pensar en

16 PROGRAMACIÓN ESTRUCTURADA EN C

un argumento como los valores reales que hay entre los paréntesis de la función. Un
especificador de formato empieza con el caracter del porcentaje (8). Por ejemplo:

printf ("Esto es una instrucción de €.

cuando se ejecuta produce:
Esto es una instrucción de €.
Con un especificador de formato y un argumento,

printf ("Bl numero 92 on decimal os %

ee 9203

‘cuando se ejecuta produce:

El numero 92 en decimal es 92
tra forma de producir la misma salida es:
printf ("El numero td en decimal os %d.’, 92, 92):

La Tabla 1.4 muestra los distintos tipos de campos usados por la fu
en los especificadores de formato.

Tabla 14. Especfiadors de formato de tipos usados por print)

Caräcter — Argumento Salida resultante
a entro

3 entero ero con signo en base decimal

> entero ero sin signo en base otal

= entero Entero sn signo en base decimal

x entero Ester sin signo en base hexadecimal usando era minisulas.
fi veal

° real

® at [Némer real con signo usando notación E

9 cea Nünero real con signo en formato e 6 f, pero de tamaño cono,
o real [Numeco eal con signo en formato E 6 pero de tamaño cono,
e carter Un eater individual

2 cadena de caracteres Imprimir cadenas de earactees

+ ringuno Impéime el simbolo &

Programa 1.5

FUNDAMENTOS DEC 17

El Programa 1.5 ilustra el uso de los distintos campos especificadores de tipo de
formato,

include <stdio.h>

maint


print£(-El valor 92 usando el tipo de campo d es 14. \n*
pránt£(“el valor 92 usando el tipo de campo i es Hi. Va”
printf (“Bl valor 92 usando el tipo de campo u es tu. \n,
print£(“BL valor 92 usando ol tipo de campo o es to. Ya”,
Drinc£(-El valor 92 usando el tipo de campo x es tx. Va”
print£(“El valor 92 usando el tipo de campo X es 4%. An”,
printé(-El valor 92.0 usando el tipo de campo £ es LE. \n",
Print (“El valor 92.0 usando el tipo de campo e es te. An”,
printé(-El valor 92.0 usando el tipo de campo E es %E. 19",
printe("21 valor 92.0 usando el tipo de campo g es %g. \n",
print (El valor 92.0 usando ol tipo de campo G es 16. An”,
prince (“El valor 92 usando el tipo de campo ¢ es te. \n*, 92);
print£(-8l caracter *9* usando el tipo de campo c es te. Am”, 9);
printf ("La cadena 92 usando el tipo de campo s es ts. 1a",” 92%

La ejecución del Programa 1.5 produce la sigu

El valor 92 usando el tipo de campo à es 92
El valor 92 usando el tipo de campo i es 92.
El valor 92 usando el tipo de campo u es 92
El valor 92 usando el tipo de campo o es 134.
El valor 92 usando el tipo de campo x es Sc
El valor 92 usando el tipo de campo x es SC.
El valor 92.0 usando el tipo de campo £ es 92.000000
El valor 92.0 usando el tipo de campo e es 9.200008+01
El valor 92.0 usando el tipo de campo E es 9.20000R+01.
El valor 92.0 usando el tipo de campo q es 92.

El valor 92.0 usando el tipo de campo G es 92.

El valor 92 usando el tipo de campo ces \

El caracter '9" usando el tipo de campo € os 9

La cadena 92 usando el tipo de campo s os 92,

Por ahora, no se preocupe acerca del símbolo \n que se ve en cada función
pránt£(). Aprenderá más sobre estos símbolos en este capítulo. Lo que hacen es
causar un retomo de carro y una nueva línea de salida. Sin ellos en el Programa 1.5,
toda la salida estaría junta

18 PROGRAMACIÓN ESTRUCTURADA EN C

Dése cuenta de que para el argumento de tipo carácter se han usado las comillas
simples mientras que para el argumento de tipo cadenas de caracteres se han usado las
comillas dobles, Dése también cuenta de que el valor numérico del backslash (\) es
92, (En el apéndice C encontrará la tabla de caracteres ASCII)

Más de uno

Se puede usar más de un especificador de formato en la función print (1. Sin embar-
o, debe haber al menos tantos argumentos como especificadores de formato; si no,
los resultados serán impredecibles, Se pueden tener más argumentos que especificado-
res de formato; sin embargo, los argumentos extra serán ignorados,

Un ejemplo del uso de varios especificadores de formato es:

printf ("Un caracter es te y un numero es 48.*, ‘a’, 53);

Dése cuenta de que los argumentos se separan mediante comas,

Conclusión

En esta sección se ha presentado la función print£ () de C. Se ha visto cómo usar esta
función para imprimir cadenas de caracteres, caracteres y números. También se ha
visto qué es un especificador de formato y cómo usar varios campos de especificación
de formato. Compruebe lo que ha comprendido de esta sección haciendo los ejercicios
de repaso.

"Repaso de a Sección LS

Defin el propósito de la función prime ()
¿Cómo se distinguen los artères de Is cadenas de caracteres?

Cuál es el propósito de un especiicador de formato en la función print £ {17

Qué es un argumento?

Defina la regla que relaciona el número de especfiadors de formato y de argumentos.

1.6. IDENTIFICACIÓN DE COSAS
Presentación

En esta sección aprenderá cómo usar palabras para especificar partes de su programa
C. También se hard una introducción a las funciones. Verá como dar nombres a cade-
nas de caracteres, valores y partes de su programa. Saber cómo hacer esto hard sus
trabajos de programación mucho mis sencillos en cualquier lenguaje de programas
ión.

FUNDAMENTOS DEC 19

¿Qué es una función?

Una función es una colección independiente de declaraciones y sentencias (instruc-
ciones). Una declaración establece la relación entre el nombre y el tipo de una variable
wotra función. Aprenderá más sobre este tema más tarde en este capítulo, Lo impor-
tante por ahora es que se dé cuenta de que una función se diseña habitualmente para
realizar una tarea. Todo programa C debe tener al menos una función llamada sain ()
Dividir las tareas en’ partes separadas hace que los programas sean más fáciles de
diseñar, corregir y modificar

¿Qué necesita Identificación?

Cuando se crea una función, es mejor darla un nombre descriptivo. Por ejemplo, una
función que calcule la potencia total disipada en una resistencia se podría llamar:

potencia resistencia ()

Esto es

ás descriptivo que llamarla:
funciona 0
Ambos ejemplos usan identificadores para distinguir una función de la otra, Un

identificador no es nada más que el nombre que se da a una parte de un programa C.
Los identificadores pueden usarse para nombrar partes de una Fórmula, como:

total = resietencia_1 + resistencie 2;

Un identificador puede usarse para asignar un valor constante que describa el valor
y pueda ser usado en un programa:

Pr = 3.14159
areacirculo = PI * radio + radio;

Como puede verse en los ejemplos anteriores, los identificadores juegan un impor-
tante papel en un programa €.

Crea

n de sus propios identificadores
Hay algunas reglas a seguir cuando cree sus propios identificadores, Primero. todo
lentificador debe comenzar con una letra del alfabeto (mayúscula o minúscula) o el
subrayado _. El resto del identificador puede utilizar cualquier conjunto de letras
(mayúsculas o minúsculas), dígitos ( a 9) y el subrayado —y esto es todo— no se
permite el uso de otros caracteres. Esto significa que los espacios no están permitidos
en los identificadores, La mayoría de lo sistema de C distinguirá, por lo menos, los
primeros 31 caracteres de un identificado. El Ejemplo 1.1 iustra este punto.

20 PROGRAMACIÓN ESTRUCTURADA ENC

Ejemplo 11 ¿Cuáles de los siguientes son identificadores legales en C?

A feted E. uno por la carretera
Bestel F. El siguiente:
C. Í_por_la_carrotora ES

D. Uno_por_Ja_carrerera
Solución
“Tenga en monte las reglas para identilicadoces explicadas previamente a este ejemplo.

Un identificador legal en €.
Un identficador legal en €.
No es un identificador legal en C. No empieza por una
letra del alfabeto inglés o subrayado.
Uno_por_la_carretera — Un identificador legal en C.
Uno por la carretera No es un identificador legal en C.
Los espacios no están permitidos.

os»

mn me

El_ Siguiente:

El símbolo : no está permitido,
sal en C.

a

Sensibilidad a las mayúsculas y minúsculas

Los identificadores en C son sensibles a las mayúsculas y minúsculas. Esto significa
que C hace distinción entre las letras mayúsculas y minúsculas en un identificador.
Así, en lo que concieme a C, los siguientes identificadores son distintos:

pi Pr Pi pr
Y los siguientes:
Este ESTE este

Todos los identificadores de arriba son legales en C, pero no son iguales. Esto
significa que se debe ser cuidadoso con el uso de los identificadores en C. Por ej
plo, si se define un identificador ps igual a 3,14159, se deben usar las letras minúscu-

ps en cualquier parte del programa donde se espere que el identificador vale:
3,14159. Si se usa ex o Pi, ninguno de los cuales tiene valor asignado, el programa
contendrá errores.

Palabras reservadas

Un identificador no puede deletrearse igual y tener el mismo tipo de letra (mayúscula
© minéseula) que una palabra reservada. El Ejemplo 1.2 ilustra este punto.

FUNDAMENTOS DEC 21

Ejemplo 1.2 Indique cules de los siguientes identificadores son legales y cuáles son palabras resorvadas e
dique si algunos de ellos son iguales

A. teydeoha Do reconstruir
B. continue EB Reconstrair
©. Ley de ohm E. continue

e las reglas para identficadores explicadas previameı

‘ohn Unidemificador legal en €, no reservado,
8. {Una palabra reservada legal en €.

C. Leyde ohn Noes un idemúficador legal en C. Los espacios no están permitidos,
D. reconstruir Un identificador legal en C, no reservado.

E

F

Reconetruiz Un identificador legal en €. no reservado,
“continue Un identifiador legal en €, no reservado. (Si embargo. se parece
tanto a una palabra reservada que no se recomienda su us)

Conclusión

En esta sección se han presentado conceptos importantes para nombrar las partes de un
programa C. Ha aprendido lo que es un identificador y cómo puedo usarse para nom-
brar (identificar) partes de sus programas C. Compruebe su nivel de comprensión de
esta sección realizando la siguiente sección de repaso.

Repaso de la Sección LE

¿Qué es una función C?
¿Qué es un denies?

¿Cuáles son Is reglas par crear sus propos ideiicaores?

¿Cuántos carceres de cualquier idenúfiador son reconocidos por C?

1.7. DECLARACIÓN DE COSAS

En esta sección apy que todas las variables deben ser declaradas. Esto significa
que el compilador debe conocer, por adelantado, antes de usar las variables, el id

cador que se va a usar para cada variable así como el tipo de variable que se está
usando. Al principio, esto puede parecer trabajo extra. Pero encontrará que haciendo.
esto se reducen mucho las posibilidades de cometer errores de progr

22 PROGRAMACIÓN ESTRUCTURADA EN C

Programa 15

Se puede pensar en una variable como en una posición específica de memoria reserva
da para un tipo específico de datos y con un nombre para referen icilmente,
Esencialmente, se usan variables para permitir que la misma posición de memoria
pueda tener diferentes valores del mismo tipo en instantes de tiempo distintos, Por
ejemplo, si se estuviera calculando el voltaje entre los extremos de una resistencia fija
a medida que cambia la corriente, la variable voltaje tendría diferentes valores cada
vez que cambia la corriente.

Declaración de variables

En C, todas las variables deben ser declaradas antes de ser usadas. Para declarar una
variable, es necesario declarar su tipo e identificador. La Tabla 1.5 presenta los especi-
ficadores de tipo fundamentales que se usarán para declarar variables.

El Programa 1.6 ilustra cómo declarar variables.

Finelude <ecaio.he

maint)
char un_caractor + gato declara un carácter.
int un_entero: 7+ Esto declara un entero.
Heat unreal; I Beto declara un real. */

unzentero = 15,
uncreal = 27,6
printf (“te os el caracter.\n-, un_caracter)
Deine£("2d es el entoro.\n", un entero);
Printfitf es el real.\n", unreal)

Tabla LS. Esporfiedores de tipos fundamentals en ©

Enteros Reales Olas tipos
char double conse
onum Box vid

rong

nea

Programa 1.7

FUNDAMENTOS

ES

Cuando se ejecuta, el Programa 1.6 produce:

a es el caracter.
15 es el entero.
27.620000 es el real.

En el programa, las declaraciones de variables son:

char un caracter J+ Esto declara un caracter. */
Ant un_entero; 7+ Esto declara un entero. */
float unreal; 1° Esto declara un real. */

Observe que la declaración de una variable consiste en definir su tipo y su identii-
cador. En el cuerpo del programa, a cada variable se le ha asignado un valor:

un_real = 27.62,

Lo que ha sido hecho con el operador asignación (=). Aprenderá más sobre este
operador en la próxima sección.

Se puede combinar una declaración de variable con el operador asignación, dando
valor a la variable al mismo tiempo que es declarada. Este caso puede verse en el
Programa 1.7

Hinclude <stdio.h>

paint)
û
char uncaracter = ‘at; /* Esto declara y asigna un caractor.

float un_real

15 7+ ssto declara y asigna un entero. */
27.62: /* Bsto declara y asigna un real. */

printf(“te es el caracter.\n’, un_caracter);
Drintf("td es el entero.\n", un entero):
princ£(“8f es el real.\n“, unreal);

Obsérvese que, en cada caso, a la dectaración de variable le sigue un comentario.
que define el propósito de cada variable. Adquirir el hábito de escribir este tipo de
documentación del programa es muy bueno,

24 PROGRAMACIÓN ESTRUCTURADA EN C

Más del mismo tipo
En C, si hay variables del mismo tipo, se pueden declarar como sigue:

int numero 1, nunero2, numero_3:

Aunque esto es legal en €, esta forma de programar no se usará en este texto
porque dificulta la escritura de comentarios para cada variable usada en el programa.

¿Por qué declarar?

‘Cuando se declaran variables, se recoge toda la informución acerca de las mismas en
un lugar determinado del programa, Esto permite a cualquiera leer el código fuente e
identificar rápidamente los datos que se van a utilizar (asumiendo que se han añadido
comentarios que dan una buena explicación). Esto fuerza también a hacer algo de
planificación antes de sumergirse en el código del programa. Otra razón importante
para hacer esto es que evita que se usen variables mal escritas dentro del programa, Si
no hubiese requisitos de declaración, se podría crear un nuevo identificador sin saber-
lo. Cuanto más se programa, y cuanto más complejos y prácticos son los programas,
más se agradece que las variablos deban ser declaradas antes de usarlas.

Repaso dela Sección LT
¿Cómo se puede pensar en una variable en términos de un programa C?
Explique qué significa declarar una vaible

Nombre rs especlicadores de ipo Fundamentales en €

Explique qué significa iniciar una veia

¿Cuál es wa buena razón para declara as variables?

1.8. INTRODUCCIÓN A LOS OPERADORES DE C

En esta sección aprenderá cómo hacer que un programa C actúe sobre variables, Esto
significa que aprenderá a hacer operaciones aritméticas así como otras operaciones
que son específicas de C.

¿Qué son los operadores de C?

Un operador de C permite que el programa haga algo a ls variables. Específicamente,
operador aritmético permite hacer operaciones aritméticas (como una suma, +) sobre
ables. Este sección presentará los operadores más frecuentemente usados en C.

Operadores aritméticos

Los operadores aritméticos frecuentemente usados en C pueden verse en la Tabla 1.

Programa 1.8

FUNDAMENTOS DE

1.6. Operadores atméticos frecuememente usados

imbolo Significado Ejemplo
; ‘Soma respuesta 93 +5 (respuesta — 8)
= Rests respuesta = 5 - 3 (respuesta == 2)
. Moltpicación respuesta =5*3 (respuesta ~ 15)
, División respuesta a 10 / 2 (rospu
1 Modul respuesta "312 (respuesta = 1}
El Programa 1.8 ilustra el uso de los cuatro primeros operadores aritméticos en C.

Hinelude <stdio.t>

main)

t
float nunero_1 = 15.0; — /* Primer operador aritmético. — */
float munero_2 = 3.0; /" Segundo operador aritmético. — */
float respuesta_suma; — /* Respuesta de la suma. Y
float respuesta_resta; — /” Respuesta de la resta. Y
Float respuesta.muleiz — /* Respuesta de la mulriplicación */
float respuesta division: /* Respuesta de la división. “Y

respuesta_suma = nunero_1 + nunero_2
rocpuesto_testa = munoro,.l - numero?
respuescamulei = nunero_l * mumero_2;

rospuesta_dlvision = mumero_1 / mumoro_2;

Drint£(-15 + 3 + FEV" tespuesta_cuma) à
prinef(15 - 3 = 2£n",respuesta_resta);
,

Printf("15 * 3 = ¥£\n*, respuesta multi);
Printti1s / 3 = 4£%n*, respuesta division;

La ejecución del Programa 1.8 produce:

15 + 3 = 18.000000
15 - 3 = 12.000000
15 * 3 = 45.000000
15 / 3 = 5.000000

Observe que todos los números usados en el Programa 1.8 son de tipo float. Es
importante darse cuenta de que en C, la división de variables de tipo int truncará la

respuesta. Esto significa que 5/2 = 2 y que 2/3 =0. El operador resto (2) exige el uso.
de números enteros. Este operador es también llamado operador módulo.

26 PROGRAMACIÓN ESTRUCTURADA EN C

Ejemplo 13

a 17. Precedencia de operadores

Prioridad Opera

Pine 0
Segunda Negación (asignar un número negatico)
Tercera Muliplicación *,Diviión/

Cuarta Soma +, Rests
Consideraciones importantes

© no permite una estructura que haga una asignación inversa. Esto significa que no se
puede hacer una asignación a una expresión:

6-43 = cespuesta; + No permitido:

“Tampoco se puede hacer una asignación a una cons

3 = respuesta; = No permitido;
Ambos intentos producirán errores de compilación.
Prioridad de operaciones

La prioridad de operaciones es simplemente el orden en el que se ejecut
ciones aritméticas. Por ejemplo, considere la expresión:

x= sea

La prioridad de operaciones exige que la división se haga antes que la suma. Si no.
se hiciera así, la operación anterior podría interpretarse de dos formas distinta. Si la
división se hiciera antes daría (5 + 2 = 7). Si la suma se hiciera primero, se sumaría 5 a
4 y la suma sería dividida por 2 (9/2 = 4,5). La interpretación de cualquier expresión
debe ser consistente para obtener resultados fiables y predicables de los programas.
Por ejemplo, si se quiere indicar que 5 se sumará a 4 primero y el resultado será luego
dividido por 2, se deben usar paréntesis:

Keen 2

La Tabla 1.7 indica la precedencia (prioridad) de las operaciones en C.
En todos los casos, las operaciones se ejecutan de izquierda a derecha. El Ejem
plo 1.3 lo ilustra.

Determine los resultados de ls siguientes operaciones:

A Y=6+126*2-1 C ¥=64126"@-1)
B. ¥=G+IMG*2-1 D. ¥=6412(6*2)-1

FUNDAMENTOS

Solución

Usando la Peoridad de operadores, los resultados son:
1
(Operaciones de izquierda a derecha, Prioridad de división).
(Prioridad de la multiplicación)
(Operaciones de izquierda a derecha)

(Las operaciones dentro de los paréntesis e hacen primero).
(Operaciones de izquierda a derecha)
(Prioridad de la multiplicación)

©. Y=6+126*2-0
Gr (Las operaciones dentro de fos paréntesis se hacen primero).
Y2642"1 (Operaciones de izquierda a derecha).
6+2 (Prioridad de la multiplicación)
8
D. ¥=6+1%6*2-1

Y=6+1202=1 (Las operaciones dentro de los paréntesis se hacen primero).
G+i-1 (Prioridad de la división)

Y=6 (Operaciones de izquierda a derecha)

Operadores de asignación compuestos

En C, los operadores de asignación compuestos combinan el operador de asignación
simple con otro operador. Por ejemplo, considere la instrucción:

respuesta + respuesta + 5:

Lo que esta instrucción significa es que a la posición de memoria denominada
«respuesta» se le asignará un nuevo valor igual a su valor anterior más 5. No significa
«respuesta es igual a respuesta más 5» . El signo = no significa igualdad en C: sigr
fica asignado a y se Nama operador de asignación. Así, en el ejemplo anterior, si
respuesta tenía un valor de 10, entonces:

respuesta = respuesta + 5:

hará que el nuevo valor de respuesta sea 15.
La expresión anterior puede acortarse en C usando la

ignacién compuesta:

respuesta += 5;

La Tabla 18 muestra los operadores de asignación compuestos presentados al
principio de esta sección.

28 PROGRAMACIÓN ESTRUCTURADA EN C

Tabla 1.

Asignaciones compuestas fccuenes en C

fiado

Símbolo Ejemplo

Kexer:

El uso de los operadores de asignación compuestos se ilustra en el Prograi

Programa 19 tänelude <stdio.h>

maint)

Ant numero = 10; /* Valor del numero para el ejemplo. */

print£(-Valor del nunero += 5 es 4d" numero):
numero -= 3:
Print! (-Valor del nunero -= 3 08 4d\n* numero) :
printf ("valor del numero "= 3 99 %din",nunero);
numero /= 5,

print ("Valor del numero /= 5 00 %4\n* numero) à
nunero 9 2;
prints (“vaio

del numero die 3 08 ta\n’

numero) +

La ejecución del Programa 1.9 produce:

valor del numero += 5 08 15
valor del numero == 3 en 12
Valor del numero t= 3 es 36
Valor del nunaro /= 5 es 7
Valor del numero t= 3 es 1

Observe la última función prine£() del programa. Para obtener una impresión
del signo 3. se ha usado un doble 2s.

Conclusión

En esta sección se han presentado los operadores aritméticos básicos de C. Aquí habrá.
prendido el significado de un operador de asignación, así como los operadores de

FUNDAMENTOS DEC 29

¡ación compuestos y el orden de prioridad de las operaciones. Compruebe sus
conocimientos de esta sección haciendo la siguiente sección de repaso,

Repaso dela Sección 13
Indi

1 los operadores armés más freevetemente usados en €
2. En, ¿qué hace la división entra con el resto? ¿Cuál esla importancia de eso?
3. En. ¿se pomite lo siguiente: 3 - 2 = resultado; ?Explíqulo.
4
5.

Qué significa la prioridad de una operación?
De un ejemplo de un operador compuesto de asignación sado en €

1.9. MÁS print£()

Esta sección presenta algunos detalles más acerca de la función prince). Ya se ha

usado \n como parte de esta función y se ha indicado brevemente que produce un

retomo de carro y una nueva línea. En esta sección aprenderá más acerca de la poten-
de la función prince 0.

Secuencias de escape

\n es un ejemplo de una secuencia de escape que puede ser usada por la función
peines 1). El símbolo barra invertida o barra inclinada inversa backslash (\) se deno-
‘mina habitualmente carácter de escape, Se puede pensar en una secuencia de escape
usada en fa función prántE () como un escape de la interpretación normal de una
cadena de caracteres, Esto significa que el siguiente carácter después del Y tiene un
significado especial, como se puede ver en la Tabla 1.9.

Los ejercicios interactivos de este capitulo le permitirán practicar con el uso de las
secuencias de escape de print£() en su sistema.

‘Tabla 19, Secuencias de escape

Secuencia Significado
sa ¡Nueva tinea alto de Loca y principio e a siguiente)
ve Tabulador

w Retroceder un carter

ve Retorno de car

se Salio de página

\ Conta simple

e Comilla doble

u ‘area inclinada inversa (invenida) Besta

vt Cédigo ASCII en hexadecimal

asa Código ASCH en octal

‘Nea La coil dol ya ara Inn nao Pcia udn eit poniendo
‘She una ars vend bucles

30 PROGRAMACIÓN ESTRUCTURADA EN C

Especificadores de ancho de campo
La función prinee() le permite for

tear a su salida, Recuerde de los programas
anteriores que cuando se imprimía la salida de un tipo £loar aparecía como:
16.000000; se imprimían los ros de la parte decimal aunque no se necesitaran.
La función príne£() proporciona especificadores de ancho de campo de forma que
se pueda controlar como aparecerán en el monitor los valores que se imprimen. La
sintaxis es:

‘eancho> <digitoss?

Donde

indicador de formato.

<ancho> = Anchura total del campo.

<digitos> = Número de dígitos a la derecha del decimal
= Especificador de formato.

Por ejemplo, la sentencia:
prineé (“El aunero 45.2£ lo usa.”, 6.01;
imprimiría

1 numero — 6.00 10 usa

Observe que el ancho inicia indica cómo se justifica el número (cinco espacios) y
luego se especifica el número de dígitos que siguen al punto d Para ver ejem-
plos adicionales, repase el Programa 1.5,

Conclusión

En esta sección se han presentado más detalles importantes de la función
Ha visto otras secuencias de escape que pueden usarse con la función print£ 0) Y
también algunos especificadores de formato, Compruebe que ha comprendido lo ex-
puesto en esta sección haciendo los ejercicios de repaso.

Repaso dela Sección 19

1. Explique el uso de una secuencia de escape enla loción prince 1}
2. ¿Cómo se lama a veces al carter backslash (\ en I función peine £ 0?

3. Indique es secuencias de escapo usadas en la función pin

4. ¿Qué ex un eseciicaor de ancho de campo tal y como se usa enla función print (17

1.10. LEYENDO LA ENTRADA DEL USUARIO

Presentación

La potencia real de un programa técnico escrito en C es su habilidad para interaccionar
con el usuario. Esto significa que el usuario del programa puede introducir valores de

FUNDAMENTOS DEC 31

variables. Como podrá adivinar, hay una función C predefinida que permite que esto
ocurra,

La función scant)

La función scan£ 1) es una función predefinida que permite a los programas leer la
entrada del usuario desde el teclado. Se puede pensar en ella como en la opuesta a la
función prine£ 0). Su uso se ilustra en el Programa 1.10.

Programa 1.10 tinclude <stdio.h>
a” Recogiendo la entrada de usuario.
ES)


float valor: + Un núnero introducido por el usuario, */

print£(“Introduzca un numero =>
seanf("2E", Avalon);
prámtE(“El valor es => tE", valor);

Cuando se ejecute el Programa 1.10, la salida aparecerá de la siguiente manera
(asumiendo que el usuario del programa introduce el valor 23) :

El valor es => 23.000000

23

Observe que la función scan£() tiene un formato similar al de la función
pránt£ 1). Primero, contiene 32, entre comillas. Esto le dice al programa que se espera
recibir un valor de tipo real. A continuación, se indica el identificador de la variable
donde se almacenará el valor. Esto se hace usando una coma fuera de las comillas y
luego un « (signo ampersand) inmediatamente seguido del nombre del identificador
de la variable (avatox). Ahora, el valor que introduzca el usuario será el valor de la
variable. Observe también que como resultado de usar la función scans () se produce
un retorno de carro.

Especificadores de formato

cificadores de formato de la función sean () son sin
in print 0). Esto se ilustra en la Tabla 1.10.
Debería observarse que tanto el especificador +£ como el te pueden ser usados
ra aceptar notación exponencial o decimal.

lares a los usados para

32 PROGRAMACIÓN ESTRUCTURADA EN €

Programa 1.11

“Tabla 1.10. Espocilicdores de formato de sant 41

Especficador Significado
te "carácter individ

w Estero decimal con sign,

te Notación exponenci

$. Nobciôn en coma Not

%o nic sin signo en base octal

te Fer sin signo cn hase decimal
a noc sin signo en base hexadecn

La función scan£() puede aceptar más de una entrada con una sola sentencia,
como se muestra debajo:

scanf (-2£%dte", amunero_l, Enumero_2, ácaracter!;

En el caso precedente, la variable numero_1 aceptará un tipo £loar, la variable
numero_2 un lipo int y caracter un tipo char, En este caso el usuario del program
debería teclear tres valores separados por blancos. Por ejemplo:

5227180

Debido a que es muy fácil que el usuario del programa cometa errores introducien-
do los datos de esta manera, la petición de múltiples entradas con un único seané () no
se usará en este texto,

Un programa de aplicación

Ya sabe como introducir datos, hacer cálculos básicos y mostrar los resultados, El
Programa 1.11 calcula el voltaje que cae en una resistencia cuando los valores de la
intensidad y la resistencia son conocidos. La relación matemática es

Voltaje = Intensidad x Resistenc

Hinelude <srdio.hst

Y Ley de Ohm “Y
saint
\

float voltaje: [+ Valor dei voltaje Y

float intensidad; — /* Valor de la intensidad. —*/

float resistencia; — /* Valor de la resistencia. */

Printf("Introduzca la intensidad on ampe:
Beant("8E", uinconsidad) à

princ£(-incroduzca la ret
sean (rtf, gresistencial:

stencia en ohmios =>");

FUNDAMENTOS DEC 33

voltaje
prince

intensidad + resistencia; /* Calcula el voltaje, */
El valor del voltajo es 1f voltios”, voltajel:

Asumiendo que el usuario introducirá los valores de 3 para
resistencia, la ejecución del Programa 1.11 daría:

vensidad y 4 para la

Introduzca la intensidad en amperios => 3
Introduzca la resistencia en ohmios => 4
El valor del voltaje es 12.000000 voltios

Hay varios puntos clave a obseı

en lo que concierne a este programa:

+ Todas las variables han sido declaradas y se ha comentado algo de cada una de
elas.

+ Cada función scan£ı) ha usado 4: para indicar que la entrada seria de tipo
Float y ávartabLe para indicar en qué variable se ulmacenaría el valor de entra-
da.

+ El cálculo real ha sido comentado.

+ La función prin £1) ha usado 42 para indicar que la salida numérica seria de
tipo float y el identificador de variable cuyo valor debía ser impreso ha sido.
indicado al final de las comillas,

Lo que ha visto en el programa anterior es un problema fundamental en tecnologí
que ha sido resuelto usando el lenguaje C. Es un problema muy sencillo que puede ser
Fácilmente resuelto en una calculadora de bolsillo. Pero, por ahora, la cuestión es
mantener los problemas sencillos para no entorpecer la comprensión del lenguaje C. A
medida que progrese con el texto, los programas serán mucho más potentes.

Uso de la notación E

Alguna mención debería hacerse acerca del uso de notación E (exponencial) en C.
Como se dijo antes, C acepta la notación E para los tipos reales. Esto es válido tanto
para la entrada como par I salida, Por ejemplo, en el último programa, el usuario del
programa podría haber introducido valores más prácticos como 0.003 amperios para la
intensidad y 2000 ohmios para la resistencia, Esto podría haberse hecho usando la

notación E:
Introdusca la intensidad en anporios => 3E-3
Introduzca la resistencia en ohmios => 223

El valor del voltaje es 6.000000 voltios

Es importante señalar que C acepta tanto la E mayúscula como la minúscula para
este tipo de representación de los datos. Hay otras funciones C. tales como gets),
voit) y ato£(). que pueden ser usadas para realizar conversiones, Examinaremos
estas funciones cuando aprendamos algo sobre las operaciones con cadenas de carac-
tores,

34 PROGRAMACIÓN ESTRUCTURADA EN C

Conclusión

in le ha situado en el punto en que puede empezar a desarrollar algunos
tecnológicos básicos usando el lenguaje C. En la próxima sección aprende-

itméticas usando el lenguajo C. Este será un paso impor-
inte que le pe manejar casi cualquier tipo de fórmula tecnológica. Compruebe
que ha comprendido esta sección haciendo los siguientes ejercicios de repaso.

Repaso de a Sección 1.10

1. Defina el propóso de I función scant 0.
2. ¿Cómo sabe la fonción scant qué ideiicador de variable debe usar par introducir os datos?
3. ¿Se produce un retomo de caro una nuev linea cuando se usa la función sean eC?
4
5

¿Cuántos valores reales por petición deberían se introducidos porel usvario en un programa C?

Explique qué debe ceso para tener valores impresos enla pantalla con otación Es

1.11. IMPLEMENTACIÓN Y DEPURACIÓN
DE PROGRAMAS: ERRORES
DE PROGRAMACIÓN FRECUENTES

Presentación

El material de esta sección está diseñado para ayudarle a minimizar algunos de los
más frecuentes errores que cometen los programadores de C novatos.

Tipos de mensajes de error

Dependiendo del tipo de compilador usado, se recibirán distintos tipos de mensajes de
error. La muyoría de los compiladores producen tres tipos de mensajes de error:

1. Mensajes de errores fatales
2. Mensajes de errores de compilación
3, Mensajes de aviso

Un mensa
comprueba ni

de error fatal termina inmediatamente el proceso de compilación. No
error más y provoca una parada con un mensaje que indica cuál
ás frecuente de este problema. La mayoría de los sistemas C
el cursor a la línea de código fuente donde se «piensa» que ha
error. Puede ocurrir, dependiendo de la naturaleza del error, que donde

localización de errores es perfecto y, además, que no todos los posibles errores son
predecibles. El compilador le estará dando su suposición más probable de lo que está
causando el error. Es asunto suyo determinar exactamente dénde se ha producido el
error y cómo corregirlo.

Programa 1.12

Un mensaje de error de compilación es el resultado de un error menos severo. En
estos casos, el compilador tratará de continuar la compilación y producirá otros men-
sajes de compilación si encuentra más errores de este tipo. En algunos casos, puede no
ser capaz de continuar el proceso de compilación y, como resultado, se producirá un
‘mensaje de error fatal. En cualquier caso, no se produce código objeto y el proceso
termina con la obtención de una lista de mensajes de error. Se puede usar esta lista
como ayuda para determinar la situación de los errores en el código.
Los mensajes de aviso son el resultado de errores de pr
el programa se compile y enlace, pero, en algunos C, no porn
programa se ejecute. Estos mensajes de aviso
referencia que le permita determinar los problemas en su edd

dor cor
fuente.

Sensibilidad a mayúsculas y minúsculas

Recuerde que un aspecto importante de la programación en C es que los identificado-
res son sensibles a su tipografía. Esto significa que C distingue entre letras mayúsculas
y mindsculas. Esta sensibilidad se aplica a todos los identificadores, Por ejemplo, el
Programa 1.12 no se ejecutará porque el programador usa mayúsculas para la primera
Tetra de las variables cuando las declara, pero las olvida cuando las usa en el programa.

1: Ejerplo de mayisculas y minésoulas */
main


oat Uno /* variable del programa inicializada. +/
float Oro; | /* Variable del programa. */

otro = 2 * uno:

Hay dos errores en el Programa 1.12, ambos del mismo tipo. Las variables declara-
das uno Y Otro Usan letras mayúsculas al principio. Sin embargo, en el cuerpo del
programa, el programador las ha olvidado.

otro = 2 * unos

Además, el compilador pensará que éstos son nuevos identificadores que no han
sido declarados.

El punto y coma

Otro error muy frecuente de los programadores de € novatos es la omi
coma. En C, el punto y coma identifica el fin de una sentencia o instrucción, El punto
y coma es realmente parte de las sentencias de C y debe ser incluido en ellas. Un pun-
lo y coma perdido siempre causa que el programa no se ejecute. Sin embargo, un

36 PROGRAMACIÓN ESTRUCTURADA EN C

Programa 1.19

Programa 1.44

punto y coma perdido puede confundir al compilador acerca de la causa del problem

Incluso se pueden obtener mensajes de error producidos por esta causa que no mencio~

nan para nada al punto y coma. Una buena regla a tener en cuenta es que si el mensaje

de aviso no tiene sentido hay que comprobar los puntos y coma en primer lugar.
Por ejemplo, al Programa 1.13 le falta un punto y coma. Sin embargo, el mi

de error (el tipo que se obtiene depende de su

de que el problema viene de un punto y coma

eje
je darse cuenta

1% punto y coma perdido.
mata
(
float uno = 2 /* Variable del programa inicializada. */
float otro; /* Variable del programa. */

otro = 2 * uno;
1" Esto programa no ojecutarát */

Observe que al Programa 1.13 le falta un punto y coma en la declaración de la
variable uno.

La mejor regla a seguir es siempre Ilevar a cabo una buena inspección visual de su
programa C antes de intentar compilarlo. Mire siempre si faltan puntos y comas.

Comentarios incompletos o anidados

Otra fuente común de errores en el código fuente es el uso de comentarios. Estos
errores son habitualmente de dos tipos, En el primero, el usuario escribe un delimit
dor de inicio de comentario /* pero se olvida de escribir el delimitador de
comentario. Este error se puede ver en el Programa 1.14,

J+ Fin de un comentario olvidado. Comentarios Anidados 1
saint)


inicializada.

Float constante_2 1" Variable del progr

float variable_t: /* Variable del programa.

variable_1 = constante_L } constante_t;
Ein del comentario anidado */

Otro comentario */

1% Este programa no ejecutará! */

Ejemplo 14

Programa 1.15

FUNDAMENTOS DEC 37

El Programa 1.14 no ejecutará porque se ha olvidado escribir un delimitador de fin
de comentario */ para el comentario: /* variable del programa. Sin embargo, esto
confunde tanto al compilador que cuando muestra un mensaje de aviso, éste no indica
que el problema está relacionado con el comentario, Esto introduce otra buena regla.
Cuando se obtengan mensajes de error que no se comprenden, después de comprobar
que todas las sentencias tienen su punto y coma, compruebe que todos los delimitado-
res de final de comentario están presentes,

El Programa 1.14 muestra también un ejemplo de comentarios anidados, la segun=
da fuente potencial de errores en los comentarios. Normalmente, este programa no
ejecutará porque uno de los comentarios está contenido dentro de otro. Algunos com-
piladores le permiten configurar el entorno de ejecución de forma que se pueda anidar
comentarios. Sin embargo, esta práctica no es recomendable y no se usará en esto
texto,

El Ejemplo 1.4 le permite practicar para desarrollar su habilidad visual para en-
contrar errores relacionados con los comentarios.

Determine si hay algún error en el siguiente programa que no le permitirá
indique lo que haría para comegirlo(s)

jecutar. Si

17 gay aquí un error? */

sala)

(float Este_Valor = 15; /* Constante del programa. */
float Ese_Valor; /* Variable del programa. */

Eso_Valor = oste_Valor + este_valor

Solución

Reale sin de su código fuente antes de intentarcompitarto
Hacer eto le entrenará para localizar sus propios errores rápidamente. La habilidad para detec»
tar errores se adquiere con gran cantidad de práctica.

Programa 1.15. Errores:

Se han cambiado las mayúsculas y mindsculas en la variable iniializada:

Ese_Valor = este_Valor + este_valor

Se ha perdido un punto y coma al Final de

la sentencia de C:

Valor + oste_valor

El estilo de colocación de las aves no es erróneo, pero no se aconseja pone: las llaves en las
mismas lineas que otras sentencias porque no son ficiles de ver. Una buena práctica de progru-
in en C aconseja dedicar una línea completa para cada llave.

38 PROGRAMACIÓN ESTRUCTURADA EN C

Conclusión

En esta sección se han presentado algunos de los errores de programación más fre-
cuentes cometidos por los programadores de C novatos. Hemos visto que una buena
práctica de la programación requiere que se comprueben cuidadosamente los progra:
mas para ver si faltan puntos y comas, si las mayúsculas y minúsculas están bien
usadas y si faltan 0 sobran delimitadores de comentarios. Compruebe que ha compren-
ido lo aprendido en esta sección haciendo los siguientes ejercicios de repaso.

Repaso dela Sección LI

1
2
A
4

Indique los rs tipos de mensajes de eror que se encuentran en €.
¿Qué tipo de mensajes de error termina el proceso de compilación?
Explique cómo la sensibilidad a mayúsculas y mindsculas puede hacer que un pro
¿Por qué es conveniente mires faltan punts y comas sino se entiendo la causa de un mensaje de
nor

. ¿Qué os un comentario anidado? ¿Es legal?

aa nose ejecu,

1.12. PROGRAMA DE APLICACIÓN:
CONVERSIÓN DE TEMPERATURA

Presentación

El toma de esta sección es el diseño de un programa que convierta una lectura de
temperatura de grados Fahrenheit a grados Celsius Ésta es una conversión muy Fcil
de realizar en muchas calculadoras de bosillo. Se usa aquí para ilustrar algunos ele-
montos Fundamentales en el diseño de un programa. El problema se mantiene sencillo
intencionadamente de forma que no domine el proceso de desarrollo del programa,
pero, aun así cl problema tiene el rigor suficiente como para necesitar la mayoría del
"material nuevo que se ha presentado en este capitulo.

Primer paso: definiendo el problema.

El primer paso, y el más importante, en el diseño de un programa es definir el proble-
ma por escrito. Esta definición debe incluir algunas especificaciones acerca del pro-
grama en sí. Estas especificaciones son:

+ Propósito del programa.
+ Entrada que se necesita (fuente).
+ Proceso sobre la entrada

+ Salida que se necesita (destino)

El problema puede definirse como sigue:

+ Propósito del programa: convertir una temperatura leída de grados
grados Celsius.

Ihrenheit a

Programa 1.16

FUNDAMENTOS DEC 39

+ Entrada que se necesita: temperatura en grados Fahrenheit (fuente: el teclado).

+ Proceso sobre la entrada: temperatura Celsius = 5/9 x (temperatura Fahren“
heit ~ 32),

+ Salida que se necesita:

emperatura en grados Celsius (destino: la pantalla).

Después de leer esta definición, usted (y otros que puedan trabajar con usted)
conocerá claramente el propósito del programa. Es evidente que la información para el
programa será recibida desde el teclado y que consistirá en una lectura de temperatura
en grados Fahrenheit, El programa procesará esta entrada de acuerdo a una fórmula.
muy específica. La salida será impresa en la pantalla del computador. Será la tempera
tura expresada en grados Celsius.

Para este sencillo problema, esta información puede parecer obvia. Sin embargo,
para programas más complejos donde alguna información se recibirá desde el teclado
mientras que otra se recibirá del disco, el proceso puede no ser tan obvio. Definirlo por
escrito de la forma anterior asegura que usted y las personas para las que diseña el
programa están de acuerdo en lo que debe hacerse —y lo que es igual de importante—
lo que no debe hacerse.

Estableciendo los bloques del programa

Una vez completada la definición del problema, el siguiente paso es establecer los
bloques («comentarlos») del programa C. Esto se ilustra en el Programa 1.16.

r
Programa: Conversión de grados Fahrenheit a grados centígrados
Desarrollado por: Cualquier programador

Descripción: Esto programa convierte una temperatura leída on grados
Fahrenheit a su equivalente en grados centígrados.

variables: ninguna

Constantes: ninguna
Y

rain 0)
\

/* Explicar el programa al usuario. */

/* obtener el valor Fahrenheit del usuario. */

/* realizar los cálculos. */

J+ Mostrar la respuesta. */

40 — PROGRAMACIÓN ESTRUCTURADA ENC

El Programa 1.16 es un esbozo que le da al programa un título, proporciona el
nombre del programador y describe lo que hace el programa. El resto es un esbozo de
las principales secciones del programa. Actuará como una guía para desarrollar
el código. Lo más importante es que el esbozo será realmente parte del programa
—los comentarios para cada una de las partes principales del programa. Una vez que
el esbozo esté completo, se almacena en disco y se saca una copia impresa del mismo,
Esta copia impresa puede servir para verificar que el esbozo so ajusta a la intención
original del programa y puede servir como una fuente de documentación,

Observe que las partes esenciales main (y, ( y 2 están incluidas, de forma que el
programa compilará. El programa debería ya compilarse en este punto para asegurarse
de que las secciones comentadas no contienen errores (tales como comentarios anida-
dos, según se explicó en la sección anterior),

El paso siguiente

Una vez que se ha esbozado el programa, el siguiente paso es desarrollar cada sección,

1a en una. Este proceso reduce mucho el tiempo dedicado a la depuración del

a. Para este programa, el primer paso es codificar la explicación el programa,

compilarla y observar la salida. Éste paso se muestra en el Programa 1.17. En este

una nueva función de C llamada pues (). Esta función genera un

salto de línea automático. Es una función muy práctica cuando sólo se quiere imprimir

texto, Esta función necesita la instrucción sinclude <stdio..h> al principio del pro-

Cuando se ejecute el Programa 1.17, el bloque de explicación produce
salida:

iente

Este programa convertira una temperatura Leida on
grados Fahrenheit a su equivalente en
grados centigrados

Introduzca la temperatura en grados Fahrenheit
y el programa hara el resto

La euesti
potent

n es desarrollar el programa paso a paso, lo que reduce la frustración
1 de tratar de descubrir errores en un programa grande, Si hubiese un error en
‘una etapa temprana, el programador sabría que está confinado a esta parte del progra»
ma. Cuando se han eliminado los errores de esta primera parte se puede continuar con
el siguiente paso hasta completar el programa. En todo caso, si hay errores deberán
estar confinados al código más reciente que se ha introducido en el programa (la
excepción a esto se produce cuando el programa usa código antiguo —pero, aun asi,
este método será el preferido).

Programa 1.17

FUNDAMENTOS DEC 41

Terminando el programa

El siguiente paso es codificar y compilar la siguiente parte del esbozo, en la cual se
lee introduce el valor de la temperatura. Cuando se hace esto en el Programa 1.17, la
ejecución dará lo siguiente:

Este programa convertira una temperatura Leida en
grados Fahrenheit a su equivalente en
grados centígrados.

Introduzea la temperatura en grados Fahrenheit
y el programa hara el resto,
Introduzca la temperatura en grados Fahrenheit =>

Si se introduce un valor en este punto del programa se puede comprobar, de nuevo,
que no hay errores de compilación ni de lectura de datos,

El siguiente paso es codificar y compilar la siguiente parte del esbozo, en la cuál se
procesa el valor de la temperatura y se conviene a grados Fahrenheit. Para completar
esto punto hacen falta variables, que deben ser añadidas al bloque de declaración.
Como antes, estas variables serán de tipo feat. Cada variable está comentada, como
se requiere en una buena práctica de la programación. Además, una buena práctica de
programación exige que las variables se incluyan en el bloque del programador, Ob»
serve que se usa el signo en la fórmula para indicar que está realizando una muliplica-
ción,

El último paso de programa se hace cuando se muestran los resultados de los

ie se ha completado el programa, una
versión de cuál puede verse en el Programa 1.17.

hinclude <stdio.h>
7

Programa: Conversión de grados Fahrenheit a grados centigrados
Desarrollado por: Cualquier programador

Descripción: Este prograna convierto una temperatura leida en grados
Fahrenheit a su equivalente en grados centigrados.

variables:
Fahrenheit = Temperatura en grados Fahrenheit
centígrados = Temperatura en grados Celsius

Constantes: ninguna
Y

paint)
c

42 PROGRAMACIÓN ESTRUCTURADA EN C

torp_tahrenhoits
tenp_eentigrados:

licar el programa al usuario. */
puesto");

pute("Esto programa convertira una temperatura leida en")
puts(“grados Fahrenheit a su equivalente en”

puts (“grados centigrados.*):

pastor):

puts(*Intreduzea la temperatura en grados Fahrenheit):
puts (ry el programa hara el resto.)

J+ Obtener el valor Fahrenheit del usuario. */
puren;

Peintf("Introdusca la temperatura on grados Fahrenheit =>
seanf("4E", ütanp_fahrenheit);

/* Realizar los cálculos. */
tenp_centigrados = 5/9 * (temp fal

J+ Mostrar 1a respuesta. */
pues(”=);

cE Una temperatura de %£ grados Fahrenheit Ya”
temp. fahrenheit):
prinef(-es igual a $f grados centígrados. \n°,

tonp_centigrados)

La última parte del programa, la sección «Mostrar la respuesta», ha sido codifi
da y el programa debe compilarse de nuevo para comprobar si existen errores de
programación. Observe que se usa el 2€ para imprimir los tipos reales y que el \n se
usa para indicar que hay que imprimir en una nueva línea. Una vez que se ha hecho
todo esto, queda todavía un paso final muy importante por hacer.

Comprobación de la salida

Hasta este punto del desarrollo del programa, se ha comprobado que no hay errores de
compilación. Sin embargo, para estar seguros de que no hay errores de ejecución, hay
que comprobar el programa para distimos valores de entrada, Los valores de salida
obtenidos se comprueban después para ver su exactitud. Para ellos introducen varios
valores (negativos, positivos y cero) y los resultados se comprueban por varias porso-
nas usando una calculadora, Hacer esto asegura que el programa fue codificado co-
rectamente para producir los resultados pretendidos por los diseñadores del programa.
Una ejecución de prueba del programa da

Este programa convertira una temperatura leida en
grados Fahrenheit a su equivalente en
grados cent igrados

À

FUNDAMENTOS DEC 43

Introduzca la temperatura en grados Fahrenheit
y el programa hara ol resto.
Introduzca la temperatura on grados Fahrenheit => 212

Una temperatura de 212.000000 grados Fahrenheit
5 igual a 0.000000 grados centígrados.

¡Como se demuestra en esta prueba hay un error de ejecución en el programa! Por
eso es importante comprobar el programa con distintos valores y comprobar los resul-
tados. El hecho de que no haya errores de compilación no significa que el programa
haga lo que se pretende de él. Que no haya errores de compilación sólo significa que el
código está pasable, pero no indica nada sobre el diseño del programa. La razón por la
que se obtiene 0.000000 es porque se están usando números enteros en una división
(5/9). Recuerde que cuando se discutieron los enteros en este capítulo se dijo que la
división de enteros no deja resto (no puede, porque son números enteros). Por tanto,
5/9 devolverá un valor 0. Este 0 se multiplica por el término (Fahrenheit - 32), que
‘otra vez vuelve a dar cero (un número multiplicado por 0 da 0). Por tanto, indepen-
dientemente del valor en grados Fahrenheit que se introduzca, el resultado será siem-
pre cero, Para corregir este error, los enteros de la división 5/9 deben convertirse a
valores decimales mediante la simple adición a cada número de un punto decimal
seguido por un cero:

centigrados « 5.0/9.0 * (Fahrenheit - 32)
Conclusión
Es esta sección se le ha presentado su primera oportunidad real de desarrollar un

programa técnico en C. Se le ha presentado el concepto de hacer una descripción
previa por escrito de los requisitos del programa. A continuación se ha visto como
hacer un esbozo del programa real usando comentarios. A partir de este esbozo, se ha
desarrollado y probado cada sección por separado. Una vez que el programa ha sido
completamente codificado, se ha probado su exactitud para distintos valores de en-
trada,

‘Compruebe lo que ha comprendido de esta sección haciendo los ejercicios de repa-
so de la sección,

Repaso de la Sección LIZ

1. {Cul es el primer paso en el desarollo de un programa?
2. Indique qué elements deberan ser incluidos en a definición de problema.
3. Indique el primer paso en I codificación ea del program,
4. Explique el proceso usado para deamollar el programa final,

44 PROGRAMACIÓN ESTRUCTURADA EN C

1.13. PROGRAMAS DE APLICACIÓN ADICIONALES

Programa 1.18

A continuación veremos tres programas adicionales diseñados para mostrar cómo se
pueden realizar cálculos prácticos en C. Muchas veces se necesita un programa senci
llo que realice una tarea por nosotros. Por ejemplo, nosotros no solemos ser muy
buenos haciendo conversiones o problemas matemáticos complejos (tal cómo «¿cuán-
tas horas hay en 25 años?») de memoria.

| Programa 1.18 es un ejemplo de cómo implementar en C conversiones o eäleu-
los. Calcula la resistencia equivalente de dos resistencias colocadas en paralelo.

include <etdio.h

maint)

float rl, /* Resistencia 1 “Y
feat R2 Le Rosisteneia 2 “Y
float REO; /* Resistencia equivalente. */

print£("Introduaca el valor de la resistencia 1 =>");
scant (0€, 481):

print ("Introd

scant (UE 6R2)
prince (*\a")7

REQ = (RL * R2) / (RL + RAI:

print ("Le resistencia equivalente os 4£\n,RED):

ja 01 valor de la resistencia 2 =>“):

Sise ejecuta el Programa 1.18 con RI y R2 igual a 1000 y 4000 ohmios respectiva-
‘mente, se Obtiene;

introduzea el valor de la resistencia 1 => 1000
Introduzca el valor de la resistencia 2 => 4000

La resistencia equivalente es 800.000000

¿Puede pensar en una forma de modificar el programa anterior para resolver pro-
blemas de tipo similar, tal cómo convertir pulgadas cuadradas a metros cuadrados 0
encontrar la resistencia equivalente de tres resistencias colocadas en paralelo?

Otros tipos de cálculos pueden necesitar el uso de funciones matemáticas especia

de la suma, resta, multiplicacié nplo, la pregunt
10 es 200 elevado a la séptima potencia?» requiere habilidades matemáticas
que poca gente puede llevar a cabo sin un lápiz y un papel. Afortunadamente, C viene
equipado con muchas funciones matemáticas adicionales. El Programa 1.19 util
una de estas funciones para calcular el monto total de una inversión en un periodo de
años usando la siguiente fórmula:

Valor acumulado = Cantidad invertida * Interés

|
|
|
|
|
|
|
|
|

Programa 1.19

Programa 120

FUNDAMENTOS DEC 45

Puesto que se necesita elevar un número a una potencia, es necesario usar una
Función diseñada para este propósito. La función que se necesita es powc) y se encuen=
tra en el archivo de definiciones math.h. Examine el Programa 1.19 para ver cómo se
usa la función pow.) en los cálculos.

Hinelude <staio.h>

Hinelude <nath-h>

maint)


float cantidad; /* Dinero a invertir. “Y
float interes; — /* Tasa de interes anual. — */
float annos; 7+ Numero de años. “Y
float total; /* cantidad total acumulada. */

print£(introduzca la cantidad a invertir
scant (“tE", ueantidad) :

printE("Introduzca la tasa de interes anual =>")
scant ("¥E", Linteres) :

prints ("Introduzca el nunezo de annos =>
scant ("88",aannos)

print£(*\n"):

Ínteres /= 100.0;

total = cantidad * pow((1.0 + interes), annos) ;
peintf(*La cantidad total acumulada cs fin", total);

on

Algunas otras funciones útiles que se pueden encontrarse en math. son:

abs() atof() cost) expt) 109
109100 pot) sin) sqreQ) tant)

El Programa 1.20 usa la función sqrt () de math. para
hipotenusa de un triángulo rectángulo.

volar la longitud de la

Hinelude <etdio.n>
Binelude <mach.h>

maint)
¢
oat ladoa, ladob, lados;

printf("Introduzca el lado A => ");
scan ("2£*, £Ladoa) ;
print£("Introduzca el lado 8
scant ("2E", L1adob) ;

46

PROGRAMACIÓN ESTRUCTURADA EN ©

lagoc = sgrtíladoa"ladoa + ladob*ladob)
printfi"\nta longitud de la hipotenusa es 85.16", 1adsc);

Podría merecer la pena modificar el Programa 1.20 para que calculara tambi
todos los ángulos interiores del triángulo. Esto requeriría el uso de las funciones
sin(),cos() y tant) de mach.n. Observe que estas funciones necesitan que el ángulo
de entrada esté en radianes,

1.14. PROGRAMACIÓN EN ANSI C

En 1989, el Instituto Americano de Estándares Nacionales (ANSI) definió un estándar
que describía el lenguaje C. Este estándar garantiza que si se escribe el código C de
acuerdo al estándar ANSI €, ese código debería compilar y ejecutar en cualquier
máquina que proporcione soporte para el ANSI C. Incluso antes de que el lenguaje C
fuese estandarizado, ya era considerado transportable. Esto significa que un progra-
ma C escrito en un tipo de computador puede ser compilado y ejecutado en un tipo
distinto de computador. Por ejemplo, un programa C escrito en un computador perso-
nal debería poderse recompilar y ejecutar adecuadamente en un VAX, una estación de
trabajo SUN, un computador grande (mainframe) IBM o cualquier otro tipo de
‘computador que use ANSI C. Desde que se adopt6 el ANSI-C por la comunidad de
programadores, el nivel de transportabilidad se ha elevado. El estándar ANSI C cubre
las funciones más básicas del lenguaje C, tales como entrada desde teclado y salida a
pantalla, y funciones complejas tales como entrada y salida a archivos.

Cada tipo de computador (también llamado plataforma) utiliza un hardware dife-
rente como base. Por ejemplo, algunos computadores personales usan la arquitectura
80x86 de Inel (8086 hasta el Pentium). mientras que otros usan la 680x0 de Motoro-
la (68000 hasta 68040). Cada función de ANSI C necesita conocimiento acerca del
hardware subyacente en el computador. El estándar ANSI C garantiza que las dife-
rencias en el hardware no afectarán a la forma en que se escriben y ejecutan los
programas. Por ejemplo, el sistema operativo Windows NT ha sido transportado a
varias plataformas hardware sin tener que reescribir ningún programa escrito en el
lenguaje C.

Los programas de este libro seguirán el estándar ANSI-C.

Ejercicios interactivos

DIRECTRICES

La relación de eos ejrcicos requiero tener acceso à un computador con un entorno C. Se han
incluido aquí para permite adquirir una valiosa experiencia y, lo que os más importante, para ene un
realimentación inmediata de loque hacen los conceptos y Órdenes presentados ca ete capitulo. Además
Son divers.

Ejercicios

1. Prediga cuál ser ln said del Programa

FUNDAMENTOS DEC 47

y luego prtelo

Programa 121 Finclude <stdio.
main)
t
prince (“el
peines (rel
priner(al
printf (EL
prints ("EL
printf CL

i

San, 15):
aan. 150
ane, 15):
foin. 15):
ten, 15.017
sein“, 15.005

2. BL Peogeama 1

2 ex muy divonido, Inem predecir su slida y tego, prvéblo

maint)


letra

i

Programa 122 include <etaio.

char letras

>

cn
print£("Esta es td or te or %x.”, letra, letra, Letra}

computador?

3, Calculo Programa 1.23 con lpi y papel. Después, prubelo ;Coineiden sus resultados con los del

Programa 129 include <eeaio.

main)


mo

float resultado =

10;

resultado = 2 * (3 + 51/8 - 3;
Printf("El resultado es @f.\n", resultado);

Intent predecir I side para cada caso provisto en el Programa 124. Después ejects el pros
Asegzese de eseribie lo que le

devo el programa cn sus nots.

Programa 1.28

main)
4

include <stdio.h>
float numero. = 125.728

print£(“En notacion decimal 125.736 = tdi", numero_1);

Print£("en notacion real 125.738
print£(-En notación ciontifica 125.738 = ¥e\n", mumero_1);

REM", nunero_1)

48 PROGRAMACIÓN ESTRUCTURADA EN €

Programa 1.25

Autoevaluación

DIRECTRICES

EE Programa 1.25 ha sido programado en C por un estudiante sin experiencia, Puede con
crores. Responda a ls cuestiones siguientes referidas este programa

Binelude <otdio-h>
Programas Ley de On

Desarrollado por: Un buen programador

Descripción: Este programa soluciona la intensidad en un elrcuito. El

usuario debe introducir el valor del voltaje en el
circuito y la resistencia del cireuito

nd = Intensidad del circulto en amperios.
voltaje = Voltaje del circuito en voltios
resistencia = Resistencia del circuito en ohmios.

Constantes ninguna
Y

main
fi
/* Bloque de declaración */

float voltajes 1° valor del voltaje Y
float intensidad; — /* Valor de la intensidad. — */
float resistencia: — /* Valor de la resistencia. */

Je Explicar el programa al usuario. */
puts ("Este programa calcula el valor de La”):
puts (“intensidad de un eircuito en amperios. -);
pues i=")
putst-Debe introducir el valor del voltaje del eireuito”
puts(ven voltios y la resistencia del circuito en ohmios”);
puts ("à
pats (**);

7" cbrención de los valores de entrada gol usuario. */
printf (‘valor del voltaje del circuito =“

scané("tE", voltase):

Peintfi"valor de la resistencia del circuito = "1
scant (*4f", aresistencia);

[+ Realizar los cálculos, */
intensidad = voltaje / resistencia; — /* Calcular el voltaje.


Ir Mostrar la respuesta, */

|
|
|

pues tn:

puts(-La intensidad en un circuito con una resistencia total”

FUNDAMENTOS DEC 49

print£("do te ohmios y un voltaje total de torn”, resistencia,

voltaje);

print£(*voltios es te amperios. An”, intensidad);



Preguntas

averiguado?

¿Compilar y eccotará el program en su sistema? Sino, ¿por qué no?
Explique loque ace el programa ¿Cómo ha podido averia
¿Cuámos variables hay en el program? ¿De qué tio son? ¿Cómo lo ha averiguado?
Explique por qué se ha usado la función pues () para expli el programa al usuario.

Explique cómo puede el usuario introducir los valores del vole y la resistencia ¿Cómo los ht

De qué manera se mostarán os valores de said? ¿Cómo lo ba averiguado?

Problemas de fin de capítulo
Conceptos generales

Sección 14

2° ¿Qué tipo de programas usa para escribir código.
hun nC?

2. Explique qué progra

ta conviene su código fuente

Sección 12

3. {Con qué deben comenzar todos los programas
en Cr

4. Explique el propósito delos 7° / usados en €.

5. ¿Cómoscindica el principio yet ina de as ins
ions de un programa en el lenguaje C?

Sección 13
©. ¿Qué hace que un programa sea fei de compren
dor, modifie y depurar?
7. Expliq el propósito del bloque del programador.
8, ¿Qué comiene el bloque de programador?
3, LES necesano ener un bloque de progrumador para
ue compile un programa C7

Sección 1.4

10. ¿Qué es un componente léxico en C?

11. indique qué tros símbolos apa delas letras del
alfabeto inglés y os diz dígitos decimals del sie
ina de momeración asbigo pueden usarse par ser
dir un programa C.

12. Explique que signi
ino

un component

Joo ec

Sección 15

18.” ¿Cuáles la principal diferencia en I foma de ep
Sonar earacteres cadenas de carctres en La fa
ción prince?

14, Indique que clemento especifica en la función
rinse) cómo Se vs a convert, imprime y dar
forma a sus argumentos.

15. ¿Cuil es ef nombre dado a los valores reales entre
dos paréntesis de una función?

16. ¿Cuános argumentos debe contener como mínimo
{una función prince 117

Sección 1.6

17... ¿Cuáles el nombre que se da a unn colección de
¡octaaciones o sentencias independiemes en C?

18. Indique con qué deben empezar todos ls deni
dore en €.

19, {Cuintos caractores de un idenifiendor reconoce C?

21. Nombre ts es tipos de speciicadoges de po fun
anenales en C.

122. ¿Cómo se reerva una camiad especie de meno-
Fi en C para recibir un valor psteriorment

28, EnC. ¿qué via que una nueva variable aparesca en
roan como esd un ea de io

24. ¿Cóono se lama 4 la combinación de una declra-
«ión de variable con operador de asignación?

Sección 18
25. Dei
ec.

a un carctersic única def división enters

so

2.

27.
28.

PROGRAMACIÓN ESTRUCTURADA EN C

y un orden enel ques deban eliza as opor
ones aiumáicas? ¿Cómo se denomina

¿Qué significa la senencia de C venus ado + 517
¿Cómo se denomina una sentencia como a el pro
‘lems 272

Sección 19

=.

20,

Qué casa, en una función print). una impor
lame diferencia enla inerpreación de una cadena
de caracteres

Indique el carter dela función print) que es
¿denominado carácter de escape,

31. Indique qué determina cl número de dígitos a La
fecha del punto decimal en un vale impreso con I
función prante 1.

Sección 1.10

82. Ponga un ejemplo del uso de la función scant (1
pa Ter el valor de uns constante constante?
‘Seclacia de tipo rel

33. Explique el propósito dela función scan€ 0) según
se ha desrto en este copllo.

34. Ponga an ele demo Ip valor de a

35. Para la semencia €:

en qué Formato numérico puede lu
rama inti valore

ri del pro

Sección 1.1

ES

El
E

29.

¿Culos son Jos es tipos de errors de compilciön
sados ea C?

Big el cto de un mensaje de error fatal.
{Chiles son Tos res emos más frecuentes prover
‘os por os programadores novatos de C que se an
presentado en este pillo?

“identifican siempro los mensajes de eur cl poble
ma de su programa? Expliqulo,

Sección 1.12

40.

a

Lite ls cuatro dre
st capitulo, que deberan ser definidas por ext
and se diseña un programa,

Indique el primer paso de In codificación de un pro-
poe

Diseño de programas

Ya tien información para desamolla el código fuente de

los siguientes programas. Par todos Tos programas q
(ehe, se espera que siga ls posos descritos e la Sc
ción 112.

42. Esciba un programa C que determine cuintos bis

son necesaros para representa un ene Sn sigo:

«a.

44

45

46,

ar.

Porejemplo, se necesitan nes bits para representar el
sal 7, cuatro bits para representar numeros ene el
By et 13, ete. Use las funciones 109) y 209100
en sn programa. El usario debe inode entero
sin sign.

Construya un programa C que eva
expresiones

CRE

as siguiente

CConstruya un programs que calle la estanca
ducs para una eeueneia en parla. El usuario
¿el programa debe introduce ol valor el inductor y
de frecuencia. La fórmula ara calcular sect
a ducto es

x

Donde:
X, = Resistencia inducida en ohmios
= frecuencia en heros
Valor de la inductancia en henri.

CConsteuys un program C que consiern gendos Cle
sus a grados Fahrenheit La entrada del usuario esla
pera Fhenhöt, La felación es.

SIC + 32

Donde:
“Temperatura en Celsius
“Temperatura en Fahren

Construya un programa © que calcule ea de un
«culo. El usario debe introducir dio del eu

16. Use la siguiente fórmula par el ees

As

Escrita un programa C que calcule La loft delos
lados opuesto y adyacente de un triángulo rectángu-
lo. daa oti de I hipoenusa y un ángulo D),
coma se ve enla Figura 1.2. El usuario debe inrodu-
«ira longitud de I hipotenasay el ángulo (en gs
dos)

Lalo
queso

QA

Lalo adjacent

Figura 1-3. Disgrama para la pregunta 4,

|
|
|
|

2
Programación estructurada

Objetivos
Este capítulo le dla oportunidad de aprender lo siguiente:

Cómo reconocer un programa estructurado en bloques
Cómo desarrollar un programa con estructura de bloques utilizando C.
Un teorema muy importante sobre programación.
El uso de las funciones de C en el desarollo de un programa estructurado en
bloque.
Cómo pasar valores entre funciones.
El significado y uso de un parámetro formal.
ado y uso de un parámetro rel.
ignificado de preprocesamiento y las directivas del preprocesador,
El uso de la directiva saofine.
Cómo desarrolla y grabar sus propios archivos de cabecera.
Cómo utiliza el diseño descendente en el desarrollo de un programa que resucl-
ve un problema tecnológico.

Palabras clave

Bloque de programa Prototipo de una función
Estructura de bloques Lista de parámetros formales
Separador de bloques Paso de valores
Bloque secuencial Parámetro formal
Bloque repetitivo, Parámetro real
Bloque de selección Múltiples argumentos
Llamadas a funciones
Concatenacién de componentes léxicos

Operaciones sobre cadenas de caracteres
Archivo de cabecera Prólogo

si

2.1.

RUCTURADA EN C

Contenido

21. Concepto de bloque de programa 2.6. Implementación y depuraci
2.2. Uso de funciones programas: haci

23. Dentro de una función © archivos de cab

24. Uso de funciones 2... Programa de aplicación:
25. Uso de la directiva kaefine Circuito RL en serie

Introducción

En el Capítulo 1 comenzó a desarrollar sus propios progeamas en C. Aprendió cómo
utilizar C para leer valores del usuario de un programa, realizar operaciones sobre esos
valores y mostrar los resultados por pantalla,

A panir de ahora, obtendrá información que le ayudará a desarrollar programas en
C relacionados con la tecnología que no son fáciles de resolver con una simple calcu-
ladora científica de bolsillo. Esto significa que sus programas serán más grandes y
realizarán muchos tipos de operaciones útiles. Ello hace necesario la introducción del
¡concepto de programación estructurada, lo que le permitirá adquirir buenas técnicas
de programación desde el principio del aprendizaje del lenguaje C. El resto de los
capítulos de este libro harán uso de estos buenos hábitos de programación.

El propósito de este capítulo es ayudar a diseñar programas que sean fáciles
de leer, comprender, depurar y modificar. Por todo ello, este capítulo es muy impor-
tante.

CONCEPTO DE BLOQUE DE PROGRAMA
Presentación

En el Capítulo 1 se presentó el uso de In estructura de bloques en programación. Se vio
que dividir un programa en bloques distintos lo hacía más fácil de leer y modifica.
Recuerde la analogía con la estructura de una carta. La estructura hacía más fácil la
lectura de la mi

Esta sección presenta información más
con estructura de bloques empleando C.

lada sobre el desarrollo de programas

Un ejemplo de descomposición en bloques

Considérese el Programa 2.
en la pantalla, Sin embargı
bloques.

Este programa simplemes
ilustra una de las ca

¡prime una información
acterísticas de una estructura de

|
|
|
|
|
4
|

|
El
{

Programa 24

Programa 22

PROGRAMACIÓN ESTRUCTURADA — 53

Hinelude <staio.h>
2

Programa: Típico programa en C.
Desarrollado por: Un buen programador

Descripción: Este programa ilustra un típico ejemplo de
programa en C no estructurado.

variables: ninguna

Constantes: ninguna
Y
main
(
J+ Explicación del programa al usuario, */

puts ("Este es un programa en C que ilustra el típico”);
pues(“ejamplo de programa no estructurado”)

puts ("Cuando el programa se ejecuta, el usuario no”);
puts(“puede decir si el programa esta o no estructurado, *)à
puts (“solo puede hacerlo el programador.")

puts(*Por tanto, un programa estructurado en C solo es");
putsirutál al programador, al jefe del programador,”);
puts(‘al profesor del programador, a aquellos que “);
puts(*necesiten modi ficar el programa y a aquellos”)
putsI"que convivan con el programador mientras este ");
puts(intenta encontrar errores en el programa.")

Descomponiendo la estructura en bloques

Probablemente, no tenga ningún problema en comprender lo que hace el Progra-
ma 2.1, Simplemente imprime un conjunto de cadenas de caracteres por la pantalla,
Entonces, {por qué estructurarlo?

Deberían considerarse varios aspectos, Primero, el programa parece aburrido.
Cada línca del programa comienza en el mismo lugar —una función puts después de
tra en la misma columna de la izquierda. El uso de párrafos haría más legible y más
interesante la estructura del programa, Esto permitiría distinguir una parte del progt
ma del resto. Cada párrafo puede considerarse como un bloque de programa, donde
cada bloque de programa representa una idea principal dentro del mismo. Este con-
cepto, ya visto en la Sección 1.12, se utilizará de muevo aquí.

El Programa 2.2 muestra cómo hacer el Programa 2.1 un poco más interesante,

Hinelude <stdio.h>
Programa: Típico programa en C.
Desarrollado por: Un buen programador

54 PROGRAMACIÓN ESTRUCTURADA EN C

Descripción: Este programa ilustra la forma más simple
de programa estructurado en bloques.

Variables: ninguna

Constantes: ninguna

mino
fi
1 primer párrato de la explicación. */

putsi*sste es un programa en € que Slustra el típico");
puts (“ejemplo de programa no estructurado”)

/* Pin det párrafo de la explicación. */

/* segundo párrafo de la explicación. */

puts(-Cuando el programa se ejecuta, el usuario no’);
puts ("puede decir si el programa esta o no estructurado, ”);
pues("solo puede hacerlo el programador.*)

1" Pin del segundo párrafo de la explicación. */

/* tercer párrafo de la explicación... +

pute(*Por tanto, un programa estructurado en C solo es
puts(-util al programador, al jefe dol programador, )
puts("al profesor del programador, a aquellos que *)
pues(snecesiten modificar el programa y a aquellos”)
ute (“que convivan con el programador mientras este ")
puts (“intenta encontrar errores en el programa”);

I" Fin del texcor párrafo de la explicación. */

Observe el uso de las líneas discontinuas en el Programa 2.2 para separar los
diferentes bloques del mismo. Nötense también los comentarios al comienzo y al final
de cada bloque. Estos comentarios indican el propósito de cada uno de los bloques del
programa. En este programa tan simple, la estructura añadida no es muy importante
para comprender lo que hace el programa, pero sirve como un modelo a seguir en lo
que resta.

PROGRAMACIÓN ESTRUCTURADA — 55

Definición de estructura de bloques

Tener una estructura de bloques significa que los programas construidos de esta
manera estarán formados por un conjunto de grupos de instrucciones, en vez de una
ista continua de instrucciones, una después de otra. Los programas más grandes del
capítulo anterior se presentaron de esta forma.

Cada grupo o bloque de instrucciones comienza con un comentario que explica lo
que hace el bloque. Un ejemplo del Programa 2.2 es el siguiente:

J segundo párrafo de explicación */

Cada bloque de programa se encuentra definido por unos espacios de separación
denominados separadores de bloques. Un ejemplo de separador de bloques! es el
siguiente

pe

aunque también se pueden utilizar una © más líneas en blanco para separar los diferen-
tes bloques.

El cuerpo de cada bloque de programa se resalta mediante la sangría del mismo.
No es crítico el múmero de espacios dejado a la izquierda, lo que sí es importante es
distinguir el cuerpo del bloque de sus comentarios de comienzo y fin. Un ejemplo del
Programa 22 es el siguiente:

/* Segundo párrafo de la explicación. */

puts(-Cuando el programa se ejecuta, el usuario no’);
puts("puede decir sí el programa esta o no estructurado, ”);
puts(-solo puede hacerlo el programador.*):

[+ Fin del segundo párrafo de la explicación. */

Algunas reglas importantes

Lo que es importante en un programa con estructura de bloques es que no existan
instrucciones de salto. Si no conoce este concepto (si nunca ha utilizado una sentencia
6070) se puede considerar agraciado. La gente comprende más fácilmente las cosas si
puede seguirlas de forma lógica desde un punto a otro. Por tanto, siempre deberían
seguirse las siguientes reglas cuando se realiza programación con estructura de bloques.

Todos los bloques tienen un único punto de entrada al comienzo de los
mismos.

‘Todos los bloques tienen un único punto de salida al final de los mismos.
Cuando el computador Finaliza la ejecución de un bloque, continúa con otro o
finaliza,

2
3.

Y El uso de separadores de bloques es opcional. Con el objetivo de ahorrar espacio no siempre se
utilizan en ls programas de ejemplo.

56 PROGRAMACIÓN ESTRUCTURADA ENC

¿Puede diseñar todos los programas de esta forma? Sí, puede —sin ninguna ex-
cepcién. No hay ninguna excusa para escribir un programa en C que no tenga estructu-
ra de bloques.

Tipos de bloques

Los tres tipos de bloques necesarios, sin importar el lenguaje de programación que se
emplee, son los siguientes:

1. Bloque secuencial
2. Bloque repetitivo.
43. Bloque de selección (o bifurcación).

Un bloque secuenciales el tipo más simple de bloque de programación. Consta de
conjunto de sentencias, una seguida de otra. Un bloque repetitivo permite la gjecu-
ción repetida de una parte del programa. Un bloque de selección ofrece la posibilidad
de realizar una secuencia diferente de instrucciones. Los conceptos de estos tres tipos
diferentes de bloques se ilustran en la Figura 2.1

Conclusión

Esta sección ha puesto de relieve la importancia de la estructura de bloques en progra-
mación y ha ofrecido un ejemplo concreto. Se ha presentado la forma de romper u
programa C en bloques. Compruebe ahora lo que ha comprendido de esta sección

haciendo los ejercicios de repaso de la sección.
Sen cie) (cken)
a] 3
Acción
>)
Assi

ra,

Conceptos de Is es eases de bloques de programación

PROGRAMACIÓN ESTRUCTURADA — 57

Repaso de la Sección 2.1

Explique avonadamente si un compilador requiero que un progama esté estructurado.
Defina el énnino «estructura de bloques»

Indique una forma de comenzar un bloque de programa.
Explique cómo se pueden separa los Moques de un programa.
Explique cómo se puede resalte los bloques de un progama.
Indique los ts tipos diferentes de Bloques en un program

2.2, USO DE FUNCIONES

Presentación

En la última sección se presentó el concepto de programación estructurada en bloques.
En esta sección se verá como diseñar un programa en C con estructura de bloques.
Esta sección servirá como una introducción a este concepto importante de C. A medi-
da que avance en la lectura de este libro tendrá la oportunidad de incrementar su
“comprensión acerca de este concepto.

¿Qué es una función en C?

Una función en C es un segmento independiente de código fuente diseñado para reali-
zar una tarea específica. Todos los programas escritos en C tienen al menos una fun-
ción llamada main). Usted ya ha hecho uso de algunas funciones de biblioteca, tales
como puta), prine£ () y seane()

Haciendo sus propias funciones

Usted puede crear sus propias funciones en C, Esto le permitirá escribir una fun
expresar en C lo que hace. Luego podrá utilizarla de forma repetida al igual que
funciones de biblioteca de C. Esto significa que usted podría crear una fu

define una ni

igual que llama a las funciones pues () y seane() xa. Como puede

deducirse de esto, para llamar a una función, simplement u nombre. Usted

podría crear su propia biblioteca de funciones, grabarlas en su disco y luego invocar

‘en sus programas de la misma forma que hace con pues), printf() Y scan£
Este concepto se ilustra en la Figura 2.2

58 PROGRAMACIÓN ESTRUCTURADA EN C

Sm
= MIS ASUNTOS A1 7 (archivo de cabecera)
=
din mr
Y 1 dé
ee, Lame Î
al progra. Definición de función

Figura 22. Concepto de llamada a función en €.

Programa 23

¿Qué hace una función?

En C, cuando se crea una función diferente a man), primero debe declararse y des-
pués definirse. La declaración de una función se realiza mediante lo que se denomina
prototipo de una función, Un prototipo de función consta del nombre de la función y
de información importante relativa a la misma. Los prototipos de las funciones apare-
cen al comienzo del programa y antes de la función main()

Cuando se define una función, se indica de nuevo el nombre de la función, la
información relativa a la misma (al igual que en el prototipo de la función) y el cuerpo
de la función, que contiene todo el código fuente utilizado por la función. Todo esto se
muestra en el siguiente ejemplo.

Ejemplo. El Programa 2.3 es el programa de la sección anterior pero reescrito con
funciones. Su salida es exactamente la misma que la del programa anterior. Usted
conoce bien lo que hace el programa, concéntrese en cómo lo hace.

Hinelude <stdio.h>
=

Programa: Típico programa en €.
Desarrollado por: Un buen programador

Descripción: Este programa ilustra la forma más simple
de programa estructurado en bloques

PROGRAMACIÓN ESTRUCTURADA — 59

variables:

constantes: ninguna

Prototipos de las funciones:
D

void priner_parrato void);

Esta fuación realiza ol primer párrafo para este “Y
programa “Y
Y
void segundo_parrafo (void);
y+ Esta función roaliza el segundo párrafo para este “Y
7% programa Y

tercer_parrafo (void):
Esta función realiza el tercer párrafo para este “Y
programa Y
“Y
mino

primer_parrafo()7 /* Primer párrafo de la explicación. */
sogundo_parrafot); /* Segundo párrafo de la explicación. */
tercer_parrafo(): Je Tercer párrafo de la explicación. */
exit (0):

void primer_parrafo()

/* Primer páxrato de la explicación. */

puts("Este es un programa on © que ilustra el tipico”);
puts ("ejemplo de programa no estructurado”);

void segundo_ parrafo)
1" Segundo párrafo de la explicación. */
puts(-Cuando el programa se ejecuta, el usuario no“);

Puts(-puede decir si el programa esta o no estructurado, *);
Puts("solo puede hacerlo el progranador.");

J+ Fin del segundo párrafo de explicación. */

60 PROGRAMACIÓN ESTRUCTURADA EN C

void te
a

er_parratot)

1" torcer párrafo de explicación... */

puts(*Por tanto, un programa en C estructurado solo as”);
puts("util al programador, al jefe del programador”):
pues("necesiten modificar el programa y a aquellos”);
puts("que convivan con el programador mientras este”
puts (“intenta encontrar errores en el programa”);

I Fin dol tercer párrafo de explicación. */

Análisis del programa

La clave para analizar el Programa 2.3 es observar lo que contiene la función ain 0:

sain 0
fi
priner_parrafoll; /* Primer párrafo de la explicación. */
segundo parrafo(): /" Segundo párrafo de la explicación. */
tercer_parrafol) 1e Tercer párrato de la explicación. */
exit 10):

En este program la función sain) consta de una serie de llamadas a otras funcio-
nes. La primera de todas ellas es priner_parrato().. La definición de esta función es

la siguiente:

void priner_parrafot)


/* Primer párrato de la explicación.

pars(“Este es un programa on C que ilvstra el típico”);
pate (ejemplo de programa no estructurado”);

Fin del primer párrafo de 1a explicación. */

Esta definición consta de un código de programa encerrado entre llaves (£
y 1). Esto es exactamente lo mismo que se hace en la función reservada de C.
sain. main lleva a cabo el proceso de I la
orden necesario. Este proceso se ilustra en

PROGRAMACIÓN ESTRUCTURADA

ng non inch
‘ra ahr
D Sora

y Fasc
i
Fans
2 Ancona,
Guano ext
flac A
coma vote
ema
pasoo)
“cade sin"!
y
Tancon2()
up de onion"?
y

Figura 23. EI proceso de lamar funciones desde main)

Exist

rica

Definición
none

a

algunas cosas importantes a resaltar. Observe primero las sentencias que

indican lo que hace cada una de las funciones debajo del titulo Prototipos de las

funciones:

/* prototipos de las funciones:

void priner_parrafo(void) :

1% Esta función realiza el primer párrafo para este */

1 programa Y
oe

void segundo_parrafo (void) ;

/* gota función realiza el segundo párrafo para este */
/% prograna Y
|

2 PROGRAMACIÓN ESTRUCTURADA EN C

void tercor_parrafo(void);

/* zeta función réalisa el tercer párrafo para este */
7+ prograna ”
1 1

Observe que las tres funciones defini
gunde_parrato y tercer_parrafo) no se encuentran comentadas (no están ence

en el programa (priner_pazrato,

das entre 7" y =/). Esto significa que representan algún tipo de información para el
“compilador de C. Esta información indica al compilador que existe una función con el
mismo nombre definida más tarde en el programa, Esto es el prototipo de la función.
Cada función tiene un tipo al igual que as variables y las constantes) y en ete progra:
ma su tipo es void, lo que significa que la función no devuelve ningún valor. Bsto se
debe a que la única tarea que realiza la función es imprimir algunas palabras en la
ningún céleulo. La segunda cosa que muestra, es que no hay nada

tros formales (encerrados entre (y ). Este aspecto es muy impor-
tante ya que indica al compilador el tipo y la cantidad de memoria a reservar para estas
funciones. La lista de parámetros formales se decora en este caso como vote, debi-
do a que se encuentra vacía.

El concepto de prototipo de una función se ilustra en la Figura 2.4

Nótese que cada prototipo finaliza con un punto y coma, de forma semejante a
cuando se realiza la llamada a la misma en la función main. Sin embargo, observe
—y esto es importante— que cuando se define una función, Ésta no finaliza con un
punto y coma. Esto es lo mismo que ocurre con main} cuando se define no se finaliza
on un punto y coma.

Observe la estructura de la definición de

la siguiente función:

void primer_parratol)

imer pérrafo de la explicación. */

("Este os un programa en C que ilustra el tipico”);
(“ejemplo de programa no estructurado”);

/+ Fin del primer párrafo de la explicación. */

Lie
aay

ne | mme | opt rome)

ade Meilieue Painevos Paty comes

(tron he defuelin Ouen

Figura 24. Concept de prototipo de función

PROGRAMACIÓN ESTRUCTURADA 63
Suso
Gas mo | tipo | nombre | ipoparl..ipopar mel
i TT tación
fo ae Eis
i 7
Deinen |} Comodeta tite E
|| }
p

Figura 25, Estructura de na definición de función

Esta definición indica el tipo de la función (vosa —puesto que no devuelve ningún
valor—) y su nombre. Este nombre es seguido por los paréntesis (> obligatorios, los
cuales no contienen entre ellos nada como se indicó enla dectración del prototipo (sto
mostraba (vo13)), y no hay punto y coma (como se dijo aneriormente) El cuerpo de
la función se encuentra definido por la apertura de llave ( y el cierre de Ilave ).

La estructura de una definición de función se iustra en la Figura 2.5.

Hay un último punto importante. Considérese de nuevo la función nasa) +

paint)

priner_parratot + /* primer párrafo de la explicacién. */
Segundo_parratol); /* segundo párrafo de la explicación. */
tercer_parrafo(); J+ Tercer párrafo de la explicación. */
exit (0):

La última función a la que se llama es exit (0) ;. exit es una función C que provo-
ca la finalización normal de un programa en C.

Conclusión

Esta sección ha presentado mucha información nueva. La importancia de esta sección
no radica tanto en los detalles exactos (aunque estos son muy importantes cuando se
programa) sino más bien en los conceptos —el concepto de cómo dividir un programa
en partes diseretas denominadas funciones, y como una función, la función main (),
puede llamar a esas funciones en un orden que determina la ejecución del programa.
Comprucbe ahora lo que ha comprendido de esta sección haciendo los ejercicios de
repaso de la sección.

Repaso dela Sección 22

1. ¿Qué es uma funcién en C2
2.. Explique el significado del tipo void. Dé un ejemplo,

64 PROGRAMACIÓN ESTRUCTURADA EN C

3. Indique el significado de protocipo de una función
4. ¿Cuil ese propósito del prooxpo de una función!

5. Explique el sigaiicado de una amado a Tune.

6 ¿Por qué exit (ys a lima función Hamada en sata?

2.3. DENTRO DE UNA FUNCION C

Programa 24

Programa 25

Presentación

En esta sección descubrirá cómo se pueden utilizar las funciones para devolver un
valor. Esto sígnifica que se pueden desarrollar funciones para realizar cálculos con
plejos y devolver los resultados de los mismos a la función que realizó la llamada,

Idea básica

El Programa 24 lee un valor del usuario del programa y lo eleva al cuadrado.

Hinelude <etdio.h>

rainy)

flota numeros + Mimezo a elevar al cuadrado. */
float respuesta; /* El cuadrado del ninero, “Y
prince (-Dene un numero y lo elevaro al cuadrado => *
seant("¥f", Anunero) +
print£(“Bl cuadrado de LE es Rf", numero, respuesta);
exit (0):

Cuando se ejecuta el Programa 2.4 y el usun
del programa es el siguiente:

jo introduce el valor 3, el resultado.

Dane un numero y lo elevare al cuadrado
EL cuadrado de 3.000000 es 9.000000

El Programa 2.5 ilustra cómo hacer el Programa 2.4 empleando una f

Hinelude <acdio.h>

/* Provotipe de función, "7

Float cuadrado(float nunaro) :
1" Esta es la función que eleva un número al cuadrado. */

i
|
i
|

PROGRAMACIÓN ESTRUCTURADA — 65

paint)
float valor: J+ Nümero a elevar al cuadrado, */
float respuesta; /* El cuadrado del núnero. */

print (“Dame un núnero y lo elevare al cuadrado =>”

seant("4E", valor):
respuesta = cuadrado (valor: /+ Wamaga a la función. */
Printf("El cuadrado de 4£ es 2", valor, respuesta);

exit (0):

Float cuadrado(fleat numero)
(

float respuesta; /* EI cuadrado del múnero. */
return(respuesta); /" Devuelve el valor del cuadrado. */

)

Análisis del programa.

El Programa 2.5 consta de una función separada denominada euadrado , Esta nueva

función calcula el eundrado de un número ¿de dónde obtiene ese número? Este númo-

ro se obtiene de la función masa), ¿cómo lo obtiene?, desde la función main’).

¿Cómo se pasa? Se pasa a través de su argumento (un número de tipo £20a:). La
igura 2.6 ilustra cómo se realiza el paso de valores.

En la Figura 2.6 se observa que la lista de parmetros formales contiene
raciones de los parimetros de la función. En este caso, la función sólo tiene uno,
llamado paranetro_1. Este parámetro formal aparece tanto en el prototipo de la fun
ción como en la cabecera de la definición de In función. Sin embargo, cuando se lama
ala función (en este caso desde mant)) su parámetro real no necesita tener el mismo
nombre que su parámetro formal, sólo debe tener el mismo tipo. Por ejemplo, en el
Programa 2.5, el parámetro real es vazoz y el parámetro formal numero. De este modo
los parámetros formales definen los tipos y el número de los parämetros de la fun-
ción, mientras que los parámetros reales se wilizan cuando se llama a la función.

Como se puede observar en la figura, el parámetro formal de la función cuadrado
no es void, esto es, 0 €S cuadrado (void) sino cuadrado! float nunoro). Esta de
claración se realizó por primera vez en la parte de prototipos del Programa 2.5:

Is decla-

y+ prototipo de función. */

ont. cuadrado(float numero) ;
/% Esta es la función que eleva un núnero al cuadrado. */

Observe que en este caso la función devuelve un valor, es decir, no es de tipo vota,
Por lo tanto, es necesario indicar al compilador su tipo, en este caso el tipo de la

66

PROGRAMACIÓN ESTRUCTURADA EN C

Caeser de fon

po rest: E

Pure

Amo
Keen

HE

He Pain ge Pneu

T À ‘ermal

re | heme] rogar Í

ipo vote

Figura 2.6, Pasando un valor de una fnción a ot

unción es £Loae. Esto significa que el valor devuelto por la función después de elevar
el número al cuadrado será de tipo Floar. En esta función el número que se eleva al
cuadrado también debe ser del mismo tipo. Este hecho se indica al compilador en la
declaración del prototipo:

(float nunero) :

La declaración del prototipo para esta función informa al compilador de la existen-
cia de la definición de una función en el programa identificada como cuadrado que
devolverá un valor de tipo float y que realizará su operación (en este caso elevar al
cuadrado) sobre otro número identificado como numero, que es también de tipo float.
Toda esta información es necesaria y se indica en la declaración del prototipo de la
función:

Float cuadrado! float numero) ;

Observe que la dectaración finaliza con un punto y coma
ción se presenta la definición de la función:

bligatorio. A continua»

Float cuadrado(flcat nunero)

/* El cuadrado del múmero. */

float respuost:

|
|
|

PROGRAMACIÓN ESTRUCTURADA — 67

roturn(rospuesta); — /* Devuelve el valor del cuadrado, */

Esta definición de función comienza exactamente igual que su prototipo; la única

diferencia importante es que no finaliza con un punto y coma. Este hecho indica al
compilador que lo que sigue a Continuación en el programa es la definición de una
función. También define su tipo y el tipo de su parámetro, de la misma forma que en el
prototipo. Recuérdese, que el prototipo de la función indica al compilador el tipo de
memoria que tiene que reservar; la definición de la función describe exactamente la
acción que lleva a cabo la misma.

Hay un nuevo término de C que se ha utilizado en esta definición de función. Este

es
retura();

Este término indica al computador el valor a ser devuelto a la función que realizó
la llamada, En este caso se devuelve el valor de la variable respuesta. Para ello, el
identificador de la variable respuesta se sitúa como argumento dentro de return!

return (rospuestal :

que finaliza con un punto y coma obligatorio. Así, esta función tomará un valor de la
función que realizó la llamada. Este valor es de tipo FLoae y se almacena en el identi-
ficador de variable numero. A continuación se realiza el siguiente célcu

respuesta = nunero * numero,

cuyo resultado se almacena en el identificador denominado respuesta. El valor alma-
cenado en respuesta se devuelve a continuación a la función que realizó la llamada
mediante la siguiente sentencia:

return (respuesta) :

Véase a continuación la función main}:

saint)
t
float valor: J+ Minero a elevar al cuadrado. */
float respuesta; — /* El cuadrado dei núnero. Y

print£("Dane un núnero y lo elevare al cuadrado =>“);
seant("8E", Gvalor) :

respuesta = cuadrado(valor); /* Llamada a la función. */
print£(*81 cuadrado de tf es 8°, valor, respuesta):
exit (or:

La función main() utiliza dos variables. Una es el valor del múmero a el
al cuadrado (valor) y la otra se emplea para almacenar el resultado del cálculo (res

os

PROGRAMACIÓN ESTRUCTURADA EN C

puesta). El programa simplemente pide al usuario un número 4 elovar al cuadrado y a
ón Ice ese número del teclado. Estas ucciones se realizan mediante las fün-
ciones printf y scant. Pero véase que ahora el cálculo se lleva a cabo de forma
diferente, puesto que se realiza una llamado a la función que define el cuadrado, El
or de la variable valor se utiliza como parámetro de la función y esta devuelve el
resultado en la variable respuesta. La función exit (0); finaliza la ejecución del
programa.
La Tabl

{itustea algunas de las definiciones importantes acerca de las funciones.

Conclusión

Esta sección ha sido muy importante. De nuevo los detalles han sido menos importan-
tes que los conceptos. Se ha presentado el concepto de paso de valores de una función
a otra, Se ha visto que esto se puede realizar wilizando parámetros que representan un
lugar donde almacenar un valor que se pasa de una función a otra. La se
importante es el empleo de la sentencia de C rotuen() que se utiliza para devolver un
valor a la función que realizó la am

En Ia siguiente sección se verá una aplicación
funciones. Compruebe ahora lo que ha comprendido de esta sección
ejercicios de repaso de la sección.

Repaso dela Sección 23

Indique qué eniende por parimetco de una función,

¿Cuál es la diferencia que exite etre un parimetro formal y un parimetro real? ¿Deben ser os
"nismos? ¿Puedo se diferentes?

3. Explique el significado del paso de valores etre funciones,

as

¿Qué een exe ce pio ws ti cae de a ción dena fr

5. ¿Cómo se devuelve un aloe un función que am aot?

Tabla 2, Definiciones

pomants acer de fociones

Término Ejemplo Comentarios

Parámeros formales (ost. cuadrado_ de (Float numero) numero es un parámetro formal. Indie
dos cuando se define la a que un valore
Función),

Patimeues reales (usados cuadeado Se (valor) ‘valor es un primer el. El
vano se llama ata ne Header wade como parimetto rel
ción denia) ne del indicado como.

Arguments (valores reas vator = 5 ameno porque es
les que separan ala lam. cuadrado. de (valor es pasa a I función
ción llamada) Eundeade it (valor)

|
|
|
|

PROGRAMACION

ESTRUCTURADA 69,

2.4. USO DE FUNCIONES

Programa 25

Presentaciôn

En la última sección se presents la potencia del paso de valores entre funciones, En
esta sección se verá cómo pasar aspectos útiles relacio»
nados con las funciones, Encontrará que la columna vertebral del lenguaje C radica en
las funciones. Se dedicará mucho tiempo a aprender sobre las mismas,

Más de un argumento

El Programa 2.6 ilustra el paso de múniples argumentos entre funciones. Este progra-
ma calcula la reactancia capacitiva de un condensador dado el valor del condensador y

a frecuencia. La Fórmula matemática que permite calcular la reactancia capacitiva de
un condensador es la siguiente:

Xe= MARC)
donde:
2 reactancia del condensador en ohmios.

a frecuencia en hertzios.
1 valor del condensador en

faradios.

Binelude <stdio.h>
/* prototipo de la función. */
float roactoncia_capacitiva(float capacidad, float frecuencia):

(+ zsta función calcula la reactancia capacitiva para un valor
dado de condensador y una frecuencia. */

natal)

float faradios: /* Valor del condensador. */
Hoat herteios; — /* Valor de la frecuencia. */
float reactancia; /* Valor de 1a reactancia.*/

printfi"Introduscn el valor del condensados on faradios =>“);
seanf ("¥£", cfaradios) ;
printf ("Introduzca el valor de la frecuencia en hertzios
Scan ("2E",aheresios)

reactancia + reactancia_capacitiva(faradios, hertzios!

0 PROGRAMACIÓN ESTRUCTURADA EN C

print£("La reactancia de un condensador de te
faradios\n", faradios) ı
printé(ra la frecuencia de te hertzios es Ye ohmiostn",herteios,
rosctancia)
exit (0):
>

float reactancia_capacitivalfioat capacidad, float frecuencia)

float reactancia: Ir La reactancia capacitiva. */
float pi = 3.1815

Feactancia = 1/(2 * pi * frecuencia * capacidad);
return(reactancla) :

Análisis del programa

El Programa 2.6 hace uso de dos funciones: main) y reactancio_capaciriva(). La
«característica principal de este programa es que se pasan dos valores entre las funcio-
nes main() y reactancia_capacizivat) (el valor del condensador y el valor de la
Frecuencia). Esto se consigue utilizando dos parámetros formales para la función
reactancia_capaci tiva ()

float reactancia_capacitiva(float capacidad, float frecuencia);

‘Como se puede observar en este prototipo, los parámetros formales se identifican
como capacidad y frecuencia, ambos declarados de tipo £1oac. La función devuel-
ve un valor, también de tipo float. Vease la definición de la función:

float reactancia_capacitiva(float capacidad, float frecuencia)

float reactancia; + La reactancia capacitiva. */
Float pi = 3.14159;

reactancia = 1/12 * pi * frecuencia * capacidad);
return (reactancia

De nuevo, la cabecera de la función es exactamente la misma que la del prototipo
—con la única excepción de que no finaliza con un punto y coma, El cuerpo de la
función comienza con la llave obligatoria ( y declara dos identificadores. El primero,
roactancia, representa el valor de la reactancia capacitiva calculada y el otro el valor
‘A continuación se realiza el cálculo de la reactancia capacitiva y este valor es

la función que realiza la llamada.
Véase ahora la función main (+

j

PROGRAMACIÓN ESTRUCTURADA — 71

pain)
1
float faradios; /* Valor del condensador. */
float horerios; — /* Valor de la frecuencia, */
float reactaneia; /* valor de la rcactancia. */

Printfi"Introduzea el valor del condensador on faradios
scant ("tE", étaradios) +

printf ("Introduzca el valor de la frecuencia en hertzios =>“):
acanf(“af”, gherezios) :

reactancia » reactancia_capacitiva(faragios, hertzios)

printE("La reactancia de un condensador de te faradios\n*, faradios):

Prinef("a la frecuencia de te hertzios es te ohnios\n",hertzios,
reactancia) :

exie(0):

sain 0 contiene la declaración de tipos de tres variables. Las dos primeras,
feradios y herezios, son introducidas por el usuario por medio de dos llamadas
diferentes a la función scan£(). Cada una de estas variables se encuentra precedida
por el operador obligatorio &. La tercera, reactancia, se utiliza para mostrar el
valor resultante. Una vez introducidos los valores del condensador y la frecuencia, se
lama a la función definida anteriormente pasándole los dos argumentos:

reactancia a reactancia_capacitiva(faradios, hertzios);

El valor devuelto por la función se almacena en la variable reactancia. Este
resultado se visualiza a continuación en la pantalla del computador para que el usuario
del programa pueda observar dicho resultado.

La ejecución del Programa 2.6 produce los resultados que se muestran a continun-
ción (considérese que el usuario del programa introduce los siguientes valores: un
condensador de 1 ‚u y una frecuencia de 5 KHz)

Introduzca el valor del condensador en faradios => 10-6
Introduzca el valor de la frecuencia en hertzion => 5e3
La reactancia capacítiva de un condensador de 1e-6 faradios
a la frecuencia de Se3 hertzios es 3.1831010+001 ohnios.

Llamando a más de una función

Recuerde que en C una función puede llamar a más de una función. En el Programa
2.7 se realizan llamadas a más de una función, Este programa calcula la reactancia

72 PROGRAMACIÓN ESTRUCTURADA EN C

Programa 27

capacitiva de un condensador y la renctancia induetiva de una inductancia, donde la

donde

La reactancia inductiva en ohmios.
La frecuencia en hertzios.
L = La inductancia en henrios.

Hinclude <erdio.h>
Je Prototipos de funciones. */
float reactancia_copacitiva(float capacidad, float frecuencia);

Je esta función calcula la resctancia capacitiva para una valor
dado de un condensador y una frecuencia */

float roactancia_indvetiva(float inductancia, float frecuencia);

/* Bata función calcula la resctancia induc
dado de una inductancia y una frecuencia */

ra para un valor

aint)
¢
float faradios: /* Valor del condensador, */
float henrios; 4° Valor de la inductancia. */
float hertzios: /* valor de la frecuencia. */
float reactancia: 7" Valor de la reactancia. */
printf (*tntroduzca el valor del condensador en faradios => *

scans (28, a€aradios!:
print£("Introduaca ol valor de la inductancia en henrios
Scan£("38" henriosl:
printf (*Introduzca ol valor de la frecuencia en hertzios
seant("¥E",ahertzioa) à

reactancia = reactancia_capacitiva(faradios, hertzios):

print{("ta reactancia de un condensador de ve faradiosta”,
taradios);

print£(za una frecuencia de te hertzios es te ohmios", hertalos,
roactancia)

reactancia = reactancio_inductiva(honrios, hertrios) ;
printf ("La roactancia de una inductancia de to henricsin",heneios):

PROGRAMACIÓN ESTRUCTURADA — 73

Printf("a una frecuencia de te hertzios es te ohmiosin",hes
reactancia) à
exit (or
>

float reactancia_capacitivalfloat capacidad, float frecuencia)

float reactancia; /* reactancia capacitiva. */
Sloat pi = 3.14159;

xoactancio = 1/12 * pi * frecuencia * capacidad);

roturntroactancia) x
>

float reactancia_inductiva(fiont inductancia, float frecuencia)

flcat reactancia; 1% rencrancia inductive, */
float pi = 3.14159;

reactanela = 2 * pi * frecuencia + inductancias
returntreactancia) ;

Análisis del programa

La principal diferencia en el Programa 2.7 es que hay dos funciones aparte de

main). Estas son:

Float reactancia_capacivivalfloat capacidad, float frecuencia);

y

float roactancia_inductiva(£lcat inductancio, float frecuencia);
“Ambas funciones tienen su propia definición. Al igual que antes, cada definición

de función comienza con la misma cabecera que su prototipo, con la excepción reque-
del punto y coma:

float reactancia_capacitivalfloat capacidad, float frecuencia)

float reactaneia; 1% reactancia capacitiva. */
float pi = 3.14159;

reactancia = 1/12 * pi * frecuencia * capneidad);
return(reactancia}:

74 PROGRAMACIÓN ESTRUCTURADA EN C

float reactancia_inductiva(float inductancia, float Frecuencia)

float roactancia; J reactancia inductiva, */
float pi = 3.14159;
roactancia = 2 * pi * frecuencia * inductancia;
return (reactancia)

No hay ninguna diferencia en el orden en que aparezcan estas funciones en el
programa, La llamada a cada una de estas funciones se realiza en la función main ()

roactancia = reactancia_capacitiva(faradios, hertzios!

y

resctencia = resctancia_induccivalhenrios. hertaños) +

Observe que se utiliza la misma variable, reactancta, en ambos casos. Esto se
debe a que el valor almacenado en ella se muestra por pantalla justo después de su
asignación y puede por tanto ser reutilizada

reactancia = reactancia_capacitiva(faradios, hertzios):

printf(-La reactancia de un condensador de te faradiosta”, faradios) ;

printf(*a una frecuencia de te hertzios es %e olhmiosin”,hertaios,
reactancia) ;

reactancia = reactancia_inductiva(hentios, hertzios);
printf (-ta reactancia de una inductancia de de henrios\n*,heneios) ;
‘eactancial;

Llamadas a funciones desde dentro de una función

Una función puede a su vez llamar a otras funciones. Este concepto se ilustra en la
Figura 2.7.

El Programa 2.8 muestra este proceso. Este programa calcula la impedancia de un
circuito LC en serie. La relación matemática es la siguiente:

Z=X,-Xe
donde
La impedancia del circuito en ohmios.

La reactancia capacitiva en ohmios.
La reactancia inductiva en ohmios.

PROGRAMACIÓN ESTRUCTURADA — 75

CT


fucion_10
1

|
|
\

by

À [men
y 4
i facie:
| }
4
| TE
1
uno datación

y

Figura 27. Una fución llamada “Llamando a
ot función”

Ya se conoce la forma de calcular cada una de las reactancias de forma individual
Enel Programa 2.8 se combinan estas dos reactancias en un único valor que representa
la impedancia total del circuito en serie, El punto importante a observar en este progea-
ma es cómo una función que ha sido llamada desde masn() llama a su vez a otras dos
funciones.

Programa28 winciude <stato.n>

7+ prototipos de funciones. */

PD

float reoctancia_capacitivalfloat capacidad, float frecuencia):
/* feta función calcula la reactancia capacitiva para un valor
Gado de un condensador y una frecuencia */

ont reactancia_inductiva(fioat inductancia, float frecuencia);
I" Esta Función Calcula la reactancia inductiva para un valor
dado de una inductancia y una frecuencia */

float impedancia_en_serie(fioat capacidad, float inductancia,

76 PROGRAMACIÓN ESTRUCTURADA EN C

float frecuencia):

[+ Esta función calcula la impedancia en una inductancia y un

condensador en serte */

maint

float faradios: /* Valor del condensador. */
float nenrios: /* valor de la inductancia. */
float hertrios; — /* Valor de la frecuencia. */
float impedancia; — /* Valor de la impedancia. /

print£(-Ineroduzca el valor del

scant("ue”,afaradios);

printf (“Introduzca el valor de la ind

Scanf ("287 ühenrios):

Printfi"Introdusca al valor de la frecuen:

scant (“28",ghertzios) à

impedancia + inpodancia en

print£("La impodnacia del circuito es te ohmios\n“,

exit (0):
,

‘Meat reactancia_capacitiva(float capacidad,

1
float roactancia:
float pi = 3.14159;

return(reactancia) ;


float renetaneia_induetivalfloat inductancia,


float reactanciar
Heat pi = 3.141559;

returntreactancia) :
>

float impedancia_en_serieifloat
float


u
a
a

float react cap:
float react—ind:
float impodanci.

Ir La reactancia inductive. *

condensador on faradios => ")

serie(faradios, henrios, hertzios)

float frecuencia)

La reacrancia capacitiva. */

1/(2 + pi © frecuencia * capaciéad):

float frecuencia)

2 + pi * frecuencia * inductancia,

capacidad, float inductancia,

frecuencia)

Roactancia capacitive resultante.
Reactancia inductiva resultante.
Impedancia resultante. */



neta an henrios =>"):

on hertzios => +);

Ampedancia) :

if

PROGRAMACIÓN ESTRUCTURADA — 77

react_cap * reaccancia_capacitiva(capacidad, frecuencia);
Feact_ind = reactancia induetiva(inductaneia, frecuencia) à
princi (-Reactaneia capacitiva => te ohnios"n", react_cap)?
print#(-Reactancia inductiva => te ohnios'n", react ied);

impedancia = react_ind - react_cap;

rotura (impedancia

Análisis del programa

El Programa 2.8 muestra como una función puede a su vez llamar a otras funciones.

Nótese que no existe ninguna diferencia en el orden en el que se definan las funciones

dentro del programa. La función inpedancta_en_serte es llamada desde main). La

definición de esta función se encuentra al final del programa. Esta función llama a su
dos funciones;

react_cap = reactancia_capacitiva(capacidad, frecuencia);
react_ind = reactancia_inductiva(inductancia, frecuencia);

Observe que cada una de estas dos funciones devuelve el valor calculado a la
Función que realizó la Hamada (impedancia_en_serie). Estos valores se utilizan en el
cálculo de la impedancia. El resultado se obtiene restando los valores de la resctancia
inductiva y la reactancia eapacitiva. Este resultado será negativo cuando el valor de la
reactancia capacitiva sea mayor que el de la reactancia indu

La función inpedoncia_en_verie() devuelve el valor calculado a la función que
la llamó, main (). En ésta, se visualiza el valor final al usuario del programa. Asumien-
do que el usuario del programa intcoduce los siguientes valores: un condensador de I
HR, una inductancia de | mH y una frecuencia de 5 KHz, la ejecución del programa
anterior produciría la siguiente salida:

Introduzca el valor del condensador on faradios => 10-6
Introduzca el valor de la inductancia en henrios => le-3
Introduzca el valor de la frecuencia en hertzios => 502
Reactancia copacitiva => 3.1831010-001 ohmios
Reactancia inductiva => 3.1415900+001 ohmios.

La impedancia del circuito es -4.151115e-001 ohmios.

Cómo se puede llamar a las funciones

La Figura 2.8 ilustra la

diferentes formas en las que una función puede llamar a otras
funciones, Nótese que una función puede llamarse a sí misma, Esto se conoce como
recursividad o recursión. La única restricción es que no se puede definir una función
dentro del cuerpo de otra función.

78

PROGRAMACIÓN ESTRUCTURADA EN C

m m
n 1
ET fun ANT
y onc
if
Ta TAD
i f
[re 3

FTN
( C 1
= somme x

i

Figura 28. Cómo pueden Is funcions llamar a os funciones

Conclusión

En esta sección se ha aprendido más acerca de la estructura de un programa C. Se ha

visto que se puede pasar mis de un valor en la llamada a una función y se ha visto |

además, que una función puede a su vez llamar a más de una función. El orden en el
que se definen las funciones en un programa no es importante. Por último se ha visto
que una función puede a su vez llamar a otras funciones e incluso a sí misma.

PROGRAMACIÓN ESTRUCTURADA — 79

En la siguiente sección aprenderá a definir elementos en sus programas C. Como se
verá, puede almacenar esta información en su propio disco y utilizarla más tarde en
todos sus programas, Compruebe ahora lo que ha comprendido de esta sección hacien-
do los ejercicios de repaso de la sección.

2.5.

Repaso de la Sección 24

Explique azonatamente s unafonción puede pasar más de un valor en la amada à te función
Explique razonadament ses posible que una funció lame a su vez más de una función.
tite alguna diferencia ene orden enel que se fin las funciones en el cuerpo de un programa C?
Explique el significado de una función amada que llama a su vez aot fans,

Qué es la recusvidad?

asen

USO DE LA DIRECTIVA #aefine
Presentación

En la sección anterior se vio más acerca de la potencia de las funciones. En esta
secciôn se muestra como definir sus propias constantes en sus programas. Esto hace
más transportables sus programas, más fáciles de modificar y más fáciles de compren-
der. En esta sección se verá como utilizar esta nueva y potente característica de C.

Idea básica

Observe el Programa 2.9, Este programa calcula el área de un círculo.

Programa29 include <stdio.h>

Hdefine cuadrado (x) x°%
define pr 3.141592
#define arca_circulo(r) PL * cuadrado(r)

main)

float area: Je Area del círculo. +/
float radio; — /* Radio del circulo. */

print£("Dame el radio «>
sean ("38" aradio)

area = area_eirculofradio);

pránt£("El area de un circulo de radio #f\n" radio):
print£(-es tf unidades cuadradasin.”, area);

so

PROGRAMACIÓN ESTRUCTURADA EN C

El Programa 2.9 utiliza tres directivas #ae£ine del preprocesador. La primera
Adefine cuadvado(x) xx
define una macro. Una macro, en este sentido, es simplemente una cadena de elemen-

tos léxicos que serán sustituidos por otra cadena de elementos léxicos. Cuando la
sentencia

cuadrado (x)

“parezca en el programa, el preprocesador la susttui

Como puede observar, los blancos situados a cada lado de la directiva del prepro-
cesador sirven para separar los elementos léxicos a ser sustituidos. Esto se ilustra en a
Figura 2.9.

‘Una macro puede utilizarse en cualquier función de un programa.

La segunda directiva pde£ine se utiliza para definirla constante px (en C conviene
escribir las constantes en mayúsculas), Cualquier aparición de 21 en el programa será
sustituida por el valor 3.141592.

La tercera directiva

#efine area_cireulo(r) Pr*cuadrado(r)

define una operación matemática que incluyo
area_ciroulo calcula el área de un círculo,
La ejecución del Programa 2.9 produce el siguiente resultado:

la macro cuadrado(z). La macro

Dane ol radio => 3
El area de un circulo de radio 3.000000
es 28.274334 unidades cuadradas.

a),

Sinbelo albo
soso. road

‘ae
Figura 29. Consiucción dela sente
aderine.

Programa 210

PROGRAMACIÓN ESTRUCTURADA — SL
Revisando un programa anterior

Recuerde el Programa 2.8 de la sección anterior, que calculaba la impedancia de un

circuito LC en serie, Este programa puede reescribirse de nuevo utilizando directivas

del preprocesador. El Programa 2.10 muestra cómo se puede usar una macro con

pparmetros para definir otras macros con parámetros, En este programa, la impedancia

del circuito LC en serie, se define por medio de fórmulas predefinidas para la reactan-
da capacitiva (denominada ahora x_c) y la reactancia inductiva (x).

include <stdio.h>

fgefine PI 3.

21592

haefine X62.) 1/(2+Pr+£+e)
foefine X11) 2*Pr+E91
Haefine inpedancia serie(e,1.£) X1(.£) - Acto, E)

main)

E

float
float
float
float

printf (-Dane la capacidad =>
scant (ras
printé(-Dane la induetancia =

capacidad; /* valor del condensador en faradios. */

inductancia;/* Valor de la inductancia en henrios “Y
frecuencia; /* Valor de la frecuencia en hortzios Y
imped: /* Valor de la impedancia del circuito en ohmios. */

capacidad)

sean ("8 induetanei a);

prinef (“are la Frecuencia

Scant ("8E*, &Erécuencia) :

imped

= impedancia_serie(eapacidad, inductancia, frecuencia)

primt£(“La impedancia de un circuito LC en serie con urain-);
printE("copacidad de de faradios, *, capacidad)

printf (-y una inductancia de te henrios"n”, inductancia);
printf (res te ohmios. An", imped)

Análisis del programa

1 Programa 2.10 calcula, al igual que el programa dela sección anterior, el valor de la
impedancia de un circuito LC en serie. La diferencia es que en este caso nose ui
funciones para definir las fórmulas sino directivas del preprocesador (macros):

82 PROGRAMACIÓN ESTRUCTURADA EN C

háctine Pr 3.141592
Hdefine X_e(e, €) 1/(29P1 EC)
Hdofine XL (A, £) 2°81 £2

Ndefine fmpedancia_serie(e,1,£) KANN - x ele.f)

El orden en este caso es importante —x_ no puede definirse antes que impedan=
cia_serie ya que ésta hace uso de x_c. Todo lo que se necesita ahora es utilizar la
sentencia defini

impedancia_serie(c,1,£)

en cualquier momento que se quiera calcular la impedancia para este tipo de circuito.

“Asumiendo que el usuario del programa introduce un valor de 2 uF como valor del
condensador, 1 mH{ como valor de la inductancia y una frecuencia de 5 KHz, este
programa producirá la siguiente salida:

Dame la capacidad => 20-6
Dame la inductancia => 1e-3

Dane la frecuencia => 5e3

La impedancia de un circuito LE en serie con una
capacidad de 2.0000000-006 faradios

y una inductancia de 1.0000000-003 henrios

es 155004281001 ohmios

Incluyendo la directiva #aetine

‘Como se verá en la próxima sección sobre implementación y depuración de progra- |
mas, usted puede crear su propio archivo con sus macros y directivas de preprocesador

y grabarlas en disco. wuede dar un nombre al archivo (como. por ejemplo,
miscosas.h). Este archivo podría contener todas las fórmulas electrónicas que necesi-
ta usted asf como cualquier otra fórmula de su área de interés técnico, Más tarde,
cualquier programa C que usted desce escribir podrá hacer uso de estas fórmulas
Todo lo que se necesita es utilizar la directiva de preprocesador #inetuee.

Conclusión

ta ha sido una sección emocionante. Se ha visto un nuevo aspecto del lenguaje C
—una herramienta de programación de gran valor para crear programas técnicos gran-
es y complejos. Encontrará que todas estas directivas del preprocesador se convesti-
rán en muy útiles y familiares, Compruebe ahora lo que ha comprendido de esta sec.
ción haciendo los ejercicios de repaso de la sección. |

Repaso dela Sección 2.5

1. ¿Qué es una dircten del preprocessor?
2. Explique el significado dela directiva include. |

2.6.

PROGRAMACIÓN ESTRUCTURADA — 83

3. ¿Qué es una macro?
4. ¿Cómo se definen normalmente as constantes en €
5. ¡Puede ui parémero con la dtcctiva Ao ine? DÉ un ejemplo.

IMPLEMENTACIÓN Y DEPURACIÓN
DE PROGRAMAS: CREANDO SUS PROPIOS
ARCHIVOS DE CABECERA

Presentación

En esta sección descubrirá como hacer en C sus propios archivos de cabecera (-h).
En ellos puede almacenar todas sus macros de preprocesador. Esto significa que usted
puede crear su propia biblioteca de información para su área de tecnología y usarla en
cualquiera de sus programas

Un ejemplo

Considere el Programa 2.11

Programa 2.11 #include <etdio.h>

define cuadrado(x) xx
Adetine cubotx) xxx

sainl)

float total; /* valor del cuadrado. */
total = cuadrado(5)¿
print£(“8l cuadrado de 5 es tf \nv, total);

Análisis del programa
El Programa 2.11 es similar al presentado en la sección anterior. Este programa utiliza
dos directivas taefine

Adetine cuadrado(x) xx
Heefine eubo(x} re

La primera, define cuadrado(x) como xx y la segunda define cubo (x) como
xxx. La función sain() utiliza la definición cuadrado (x) con el propósito de de-
mostración. La ejecución del programa anterior produce la siguiente salida:

El cuadrado de 5 es 25.000000

$e

PROGRAMACIÓN ESTRUCTURADA EN C

Grabando sus propias directivas #aefine

La Figura
Como

Pinclude

de cubeces

Nótese que

2.10 ilustra cómo recoger las directivas #define del Programa 2.11 y gra
barlas en un
se muestra en la Figura 2.10, ahora podría utilizar este archivo mediante:

wehivo de disco,

“iscosas.h*

cera, Esto indi
nla unidad o directorio activo, Us

se convierte en el Programa 2.12.

Programa 2.12 tinclude
Hinelude 'niscosas.h

maint)
(
A

pes

eetaio.h>

at total /* valor del cuadrado. */
fal = cuadrado(5)7
nes (“Bl cuadrado de $ es 2f\a- total)

Aron bio

Archiv de som
Niscosasi

line eue) ses
‘ie cube

Figura 2.10. Concepto de salar las senencis Fe Eine.

se emplean las dobles comillas en vez de los símbolos <> para encerrar
al preprocesador que busque el archivo
vez hecho esto el programa anterior

Programs 213

PROGRAMACIÓN ESTRUCTURADA — 85

Un programa de muestra

Considere el Programa 2.13. Este programa podría ser utilizado por un fabricante de
circuitos imegrados. Las sentencias 430££ne se refieren a información acerca de algu-
nos elementos empleados en el proceso de fabricación de circuitos integrados.

Hinelude <stdio.h»
Adefine cabecera "Elemento

Peso atomico\n*

#detine Ge -Germanio 75007
Adefino si “silicio 28.09\n"
adetino Au “oro 197.200
sdefino ag clara 107.88\n-
Aactine As “arsenico LAS
Adefine Ge. 72.50
Adefine Si, 28.09
adetine Au, 197.2
fdesine As. 107.88
Adefine As. 14.91

sain
5
float total:

printt (cabecera)

print (Go)
total = Get + Ag!
puesto");

print£(“El poso atonico combinado del germanio y la plata
es Yen’ total):

Análisis del programa

El Programa 2.13 emplea directivas #define para definir las siguientes cadenas de

caracteres:
hdofíno cabecera “Elemento Simbolo Numero atomico Peso atomico\n"
Fdetine Ge “Germanio Ge 32 72.60\n"
Haefine Si “silicio si 14 28.09\n"
Sdetine Au “oro a 73 197.20
sdetine ag “Placa a9 2 107-8810"
Adetine As “arsenico As 33 LPS

Como ejemplo, la primera directiva #define define el componente léxico cabece-
ra como la siguiente cadena de caracteres (nótese el uso de las dobles comillas):

“Elemento Sinbolo Numero atomico Peso atomico\n"

86 — PROGRAMACIÓN ESTRUCTURADA EN €

Observe que la cadena de caracteres finaliza con el carácter de nueva línea \n.
Esto significa que cuando la función priac£() utilice el componente léxico cabace=
a, el compilador sustituirá esta cadena de caracteres. Así

printf cabecera);

produci

Blenento Simbolo Numero atomico Paso atomico

cuando se ejecute el programa, Esto mismo ocurrirá con todos los demás componentes
cos que definan cadenas de caracteres, Por ejemplo,

print (Ge):
producirá

Germanio GE 32 72.60

cuando se ejecute el programa. De esta manera el código fuente de

producirá
Elenento Simbolo Numero atomico Peso atonico
Germanio ce 32 72.60

cuando se ejecute el programa,
‘Ahora el técnico puede Fácilmente mostrar la información
elementos atómicos en el programa introduciendo simplemer
mento en una sentencia de s
El resto de las directivas taefine definen valores numéricos para los componentes
léxicos. Estos valores representan los pesos atómicos para el correspondiente símbolo
del elemento.

específica acerca de los
we el simbolo del ele-

Fáefino Gent 72.60
Héofine Site 22.09
Hdefine Au 197.2
Fdefine Age 107.88
fdefine As me 74.91

De esta manera el componente léxico ces será sustituido por el valor 72.60.
Asumiendo que la variable total es de tipo £Loac.

total = Ge + SL

el preprocesador lo su

rá por
total = 72.60 + 28.09;

|

PROGRAMACION

TRUCTURADA 87

y dará como resultado un valor de 200.69 para la suma de los pesos atómicos de estos
dos elementos.
La ejecución del Programa 2.13 produce la siguiente salida

Elenento Símbolo Numero atonico Peso atomico
Germano Ge ES 72.60
Plata ag a 107.88

El peso atomico combinado dol germanio y la plata es 180.480000

Creando el archivo de cabecera.

Para producir un archivo de cabecera que contenga todas las directivas saetine del
Programa 2.13, debe crearse un programa similar al Programa 2.13 y comprobar que
todas las directivas #aefine producen los resultados esperados en su programa. A.
continuación, se eliminan del programa todas las líneas del mismo a excepción de
aquellas con la directiva hdo£ino. Su programa ahora tendrá la apariencia del Progea-
ma 2.14

Häofine cabecera “Elemento Simbolo Numero atomico Paso atomicora”

Hdefine Ge Germanie Ge 32 72.60\n"
haofine si “silicio si 14 28.09\n"
Fdefine Au "0x0 au 13 197.20
féetine Ag “Plata ag 5 107.080
Adefine As rarsenieo AS ES Lente
Adetine Ge_se 72.60
Sdetine sie 28.09
OS 197.2
reine have 107.88
Sdefine ASHE 74.91

Las directivas #de£ine del Programa 2.13 se grabarán en un archivo denominado
quimica.

Usando su archivo de cabecera

El Programa 2.15 ilustra el uso de su nuevo archivo de cabecera. Observe que su salida
es exactamente la misma que la del Programa 2,13.

Hinclude <etdio.n>
Binelude "quimica.

88 — PROGRAMACIÓN ESTRUCTURADA EN C

mateo
¢
float total

print! (cabecera)
print (Ger

peine ing)
total = Ge,
pate)
princt(

peso combinado del germanio y la plata es 2f\n", toatl:

à invocará las def

jones de su archivo de cabec

La siguiente refere

Hinclude "quimica.b”

archivo a su programa.

Operadores de concatenación de caracteres y de cadena
de caracteres

El estándar ANSI C incluye una operación de preprocesador que permite la concatena
ción de cadenas de caracteres. El operados de concatenacién de cadena de caracteres
4 permite juntar dos componentes léxicos y crear un tercer componente léxico, Por
ejemplo, si utlizase las siguientes directivas Ho £3no en su programa

hácfine ptt 3.14159
ine PEZ 6.20318
define valor(x) Hx

entonces vator (1) seri
3.14159, De la misma manera,
do como 6.28312,

El operador de cadena de caracteres es » y permite crear una cadena de caracteres
de salida de un operando con un profijo ». Esto se lleva a cabo colocando el operando
entre comillas. Por ejemplo, si se define la siguiente directiva #de€ ine al comienzo de
un progra

sustituido por pr_1, que a su vez ha sido definido como
valor (2) sería sustituido por px_2. que ha sido defini-

hacfine valor_presente(x) printE(Ax + = ddr, x)

tonces cuando se des
la siguiente sentenc

lara vator_presente (incremento) el preprocesador genera

printf (incremento? * incremento)

que se reduce a prince ("incremento = td", incremento) y

PROGRAMACK

8

ede ver, ls archivos de cabecera son una potente extensión al lenguaje C. A
medida que desarrolle más programas, su biblioteca de arc a (creados
por usted para su área particular de tecnología) se convertirán en una de sus hera-
mientas de programación más valiosas. Otro aspecto importante acerca de los archivos
de cabecera, es que ellos protegen su código fuente, Una persona que tenga un copia
de su código fuente, sin acceso al código de sus archivos de cabecera, puede h
muy poco para replicar su programa,

"Compruebe ahora lo que ha comprendido de esta sección haciendo los ejercicios
de repaso de la sección.

Repaso de a Sección 26

Andique La ventaja de ereae sus propos archivos de cabecera
Como s ha presetado en sta sección, ¿qué información pueden comener sus archives de cube?
¿Cuál es a extensión quese da a un archivo de cabecera?

Explique cómo puede llamar a su archivo de cabecera desde un programa C.

PROGRAMA DE APLICACIÓN:
CIRCUITO RL EN SERIE

Presentación

Esta sección fe muestra paso a paso el desarrollo de un programa C que utiliza toda la
información que se ha presentado en este capítulo, Se verán las decisiones que se
pueden tomar durante el desarrollo de un programa muy especializado, A medida que
incremente sus conocimientos sobre C y su versatilidad, se dará cuenta de que hay
uchas opciones posibles a a hora de crear su código fuente. Uno de los aspectos más
potentes de este lenguaje es esta versatilidad del código fuente.
Debido a esto, lo que se presenta en este programa de aplicación (así como en los
tros) es un intento de incrementar la legibilidad y comprensión de lo que hace un
programa mientras se conservan las características del lenguaje C.

El problema

Dado el circuito que se muestra en la Figura 2.11, desarrolle un programa C que
calcule la caída de tensión en la resistencia y en la inductancia.

Primer paso —definiendo el problema

Recuerde, del programa de aplicación del Capítulo 1, que el primer paso en el diseño
de un programa de computador es definir el problema por escrito. Como guía, se
pueden considerar como requisitos mínimos los sigu

90 PROGRAMACIÓN ESTRUCTURADA EN C

Figura 2.14. Circuito para cl programa de aplasia,

+ Entrada que se necesita (fuente),
+ Proceso sobre la entrada.
+ Salida que se necesita (destino).

El problema puede definirse como sigue:

+ Propósito del programa: calcular la caída de tensión en voltios en una resistencia
y una inductancia en un circuito RL en serio.
Entrada que se necesita: valores para los siguientes:
= Inductancia en henrios.
= Resistencia en ohmios
~ Tensión de la fuente en voltios.
= Frecuencia aplicada en hestzios. (Fuente: el teclado.)
+ Proceso sobre la entrada: calcular la caída de tensión en voltios en la inductancia
y en la resistencia

Xe = fl.
Z= JR + XD
Y= Us (XZ)
Uy = 0s(RIZ)
donde
X= Resctancia induetiva en ohmios.

recuencia aplicada en hertzios.
alor de la inductancia en henrios.
impedancia del circuito en ohmios.

alor de la resistencia en ohmios.

ida de tensión en voltios en la inductancia
aida de tensión en voltios en la resistencia.
/oltaje de la fuente en voltios.

PROGRAMACIÓN ESTRUCTURADA — 91

+ Salida que se necesita: El valor de la caída de tensión en la resistencia, v, y el
valor de la caída de tensión en la inductancia, v,, (salida por la pantalla)

De esta descripción, debería quedar claro a cualquiera lo que se requiere que haga
«l programa (y, también muy importante, lo que no). El siguiente paso en el desarrollo
de este programa es desarrollar un algoritmo. Puede considerar a un algoritmo de
forma similar a una receta de un paste. Un algoritmo es una explicación paso a paso
de o que el programa hará exactamente, escrito de forma tan concisa como sea posible
(al igual que debería ser escrita la receta de un pastel,

Desarrollando el algoritmo

Una vez definido el problema por escrito, incluyendo las cuatro áreas necesarias (pro=
pósito del programa, entrada que se necesita, proceso sobre la entrada y salida que se
necesita), puede desarrollarse el algoritmo de forma sencilla. La mayoría de los pro-
gramas relacionados con la tecnología seguirán el orden que se muestra a continua»
ción.

“Todo lo que sigue debe comentarse (entre /* y +/, excepto los prototipos de las
funciones) y colocarse en el bloque del programador —algunas veces referido como
prólogo.

1. Información del programa
‘A. Nombre del programa
B. Nombre del progran
IL. Explicación del programa
A. Qué hace el programa
B. Cuál es la entrada que se necesita
C. Qué proceso se va a llevar a cabo
D. Cuáles serán los resultados
Uf, Describir todas las funciones
A. Uso de prototipos de funciones
B. Explicar el propósito de cada prototipo
C. Definir todas las variables y constantes

Los siguientes son los pasos de programación que se utilizan en la mayoría de los
programas técnicos:

IV. Explicar el programa al usuario
A. Propósito del programa
B. Qué necesita hacer el usuario.
C. Qué hace el programa
D. Cuáles serán los resultados finales
V. Obtener la información del usuario
A. Pedir los datos de entrada al usuario
B. Confirmar los datos de entrada,
VI. Llevar a cabo el proceso
A. Realizar el proceso.

92 PROGRAMACIÓN ESTRUCTURADA EN C

VIL. Mostrar los resultados
A. Confirmar lo que el usuario ha introducido.
B. Mostrar todas las unidades
VIH... Preguntar si se quiere repetir el programa
A. Preguntar al usuario si desea repetir el programa
B. Ofrecer la opción de evitar instrucciones

Los contenidos anteriores servirán como guía para el desarrollo de este programa,

Primera codificación

La primera etapa en la codificación del programa consistirá en desarcollar el bloque
del programador, compilarlo, grabarlo en un archivo y a continuación imprimie u
copia, No se produce ninguna salida, pero el propósito es asegurarse de que la docu-
mentación del programa ya ha empezado. Esta primera etapa se muestra en el Progt
ma 2.16

Programa 2.16 tinclude <stdio.n>

Programa: Caída de tensión en circuito AL.
Desarrollado por: Un buen programador

Deseripeién: Este programa calcula la caída de tensión en
voltios en una inductancia y una resistencia en
serio en un clreuito RL. El usuario debe introducir
el valor de la inductancia en henrios, el valor
la resistencia en ohmios, la Frecuencia en
hertzios y la tensión de la fuente en voltios

variables: ninguna
Constantes: ninguna

prototipo!
7

de funciones:

void explicacion_del_prograna (void);
/* eta función explica al usuario la operación que lleva */
/* a cabo el programa, Y

void obtener_valores (void):

J+ esta función lee los valores de la resistencia, la “/
inductancia, el voltaje de la fuente y la frecuencia */
7+ aplicada, y calcula y muestra los resultados. “Y

mino

PROGRAMACIÓN ESTRUCTURADA — 93


1

void explicacion_del_prograna()
c
3

void obtener valores (}



Análisis del programa

El Programa 2.16 incluye el título del programa y el nombre del programador. A
continuación sigue una breve descripción del mismo. Observe que la descripción in-
cluye todas las unidades de las medidas. Observe también, que el programador ha
decidido emplear un único bloque de programación para leer los valores del usuario
del programa, realizar los cálculos y mostrar los valores por pantalla. A medida que se
avance en el desarrollo del programa, puede que se considere este bloque demasiado.
grande, y se decida dividir éste en al menos dos bloques más con el objetivo de mejo-
rar su legibilidad,

Introducción del primer código

El siguiente paso para este programa es realizar la codificación del bloque de explica-
ción para el usuario. Una vez hecho éste, se compila el programa y se ejecuta.
bloque para este programa es el que sigue:

main)
\
explicaciondel programa(); /* explicar el programa al usuario. */
riet)


vola explicacion_del_programal) — /* Explicar ol programa al usuario. */

Printfi"\nin Este prograna calcula la caida de tension\n“
printf(“en una inductancia y una resistencia en serie en\n"):
print£{run cizeuico RL. Debe introducir los valores de lara”);
printé(-resistencia en ohmios, la inductancia en henrios, An”);

printf(-la Frecuencia aplicada en hertzios y el voltaje\n*)
print£(rde la fuente en voltios.\nin”)z

Observe que mai contiene ahora una llamada a la función explicacion
programa (). Ésta se incluye para que se pueda apreciar la salida. Es importante obser=

94 PROGRAMACIÓN E

Programa 2.17

TRUCTURADA EN €

var el empleo de dos caracteres de nueva lines \n al comienzo de la primera función
prints, Esto es una buena costumbre puesto que hace que el texto sea más Fácil de
leer.

Decisión de las fórmulas

El programador debe en este momento decidir si las Fórmulas utilizadas para la solu

ción del problema serán puestas en una función aparte o en un archivo de cabecera. Se

hha decidido crear un archivo de cabecera para estas fórmulas debido a que probable.
me serán empleadas de nuevo en futuros programas.

Las fórmulas se desarrollaron primero utilizando directivas #define como se

muestra a continuación.

Hinelude <stdio.h>
#inelude <mach.h>

saesine Pr 3.141592
Hdefine cuadradoixy x

Heefine KU. 2Prettl

fdefine ZI£,1,x) sart(euadrado(x L(f,1)} + cuadrado(e))

féetine VUES 2.0) ve KOU ZE A)
Hdofine VRE Loree) verziehen)

Estas sentencias se stan al comienzo del programa y antes del bloque del progea-
amador. Observe que los archivos #inelude se utilizan para la entrada/salida y para las
funciones matemáticas. El programador ha seguido las fórmulas que se indicaron an
teriormente.

Añadiendo el bloque de cálculo y de impresión

Una vez tomada la de a para las fórmulas, se ha
decidido emplear un bloque de programa diferente para realizar los cálculos y mostrar
los valores.

Los archivos de cabecera no deberían incluirse hasta que se haya comprobado la
corrección de la información a ser incluida en ellos,

Los resultados combinados de todas las etapas se muestran en el Programa 2.17.

Hinelude <staio.
Hinelude <nath. ho
Haofine PI 3.141592

Hdokine cuadvado(e) xx

Hdefine XL(E,1) 20PI*E"1

Heofine Z1£.1.v) Sart(cuadrado(X_L(£,1)) + euadeado(e))
Fdefine VLIELEEU) ve OLLIE, /2tE Led)
A]

i

PROGRAMACIÓN ESTRUCTURADA

2
programa: Caída de tensión en circuito Ab.
Desarrollado por: Un buen programador

Deseripeiön: Este programs calcula la caida de tensión en
voltios en una inductancia y una resistencia en
serie én un céreuito RL. El usuario debe introducir
el valor de la inductancia en henrios, el valor
la resistencia en ohmios, la frecuencia en
hortzios y la tensión de la fuente en voltios.

variables:
resistencia = Valor de la resistencia en serie en ohmios.
inductancia = Valor de la inductancia en serie en henzios.
Frecuencia = Valor de la frecuencia en hertzios.
voltaje « Valor del voltaje de la fuente en voltios
v_inductancia = Valor del voltaje en la inductancia.
voresiscencia » Valor del voltaje en la resistencia.

Constantes: ninguna

prototipos de funciones.
“Y

float calcular_y_mostrar(float £, float 1, float r, float vir
à
£ = Frecuencia on hertelos
1 = inductancia en henrios.
+ = Resistencia en ohmios.
y = Voltaje de la fuente an voltios
Esta función calcula y muestra la caida de tensión en
la resistencia y en la inductancia.
“Y
void explicacion_del, programa (void);
de
Bota función explica al usuario la operación que lleva
a cabo el programa. */

void obtenar_valores (void);

=
Esta función lee los valores de la resistencia, la
inductancia, el voltaje de la fuente y la frecuencia
aplicada, y calcula y muestra los resultados.



main


explicacion_del_progroma(): /* Explicar el programa al usuario,

9s

96 — PROGRAMACIÓN ESTRUCTURADA EN C

obtener,valoxes (): /* Obtener los valores del cíxcuito. */
exit (oy?

3

void expiicacion del_programa() /" Explicar el prograna al usuario. */


Printfi"\nin Este programa calcula la caida de tension\n");
Print£("on una inductancia y una resistencia en serie ema”)
Printfirun cireuito RL. Debo introducir los valores de law");
Printf("rosisteneia en ohmios, la inductancia an hearios,\n");
Print£i"la Erecuencia aplicada en hercrios y el voltaje\n”
print£("de la fuente en voltios.\n\n"):

1

vola obtener_valores() /* Obtener los valores del circuito. */

Float resistencia; /* valor de la resistencia en serie on ohmios */
float inductancia; /* Valor de la inductancia en serie en hanrios"/
float frecuencia: /* Valor de 1a frecuencia en hertzios “
float voltaje; /" Valor del voltaje de la fuente en voltios */

print£(“introduzca Los siguientes valores:\n");

print ("Rosistencia en ohmios a

Scan (2€, Gresistoncial à

princf(-Inductancia en henries

scant ("8E",4inductancial :
nee("Precuencia en hertzios

seanf ("3E", a frecuencia) :

peinte (*voltase de la fuente en voltios

scant (°2#*,avoltajel:

caleular_y_noserar (frecuencia, inductancia, resistencia, voltajel:
3
float calcular y_mostrar(floar €, float 1, float +, Cleat v)

float v inductancia; — /* Valor del voltaje en la inductancia */
float v_resicteneta: J+ Valor del voltajo en la resistencia */

v_inductancia = V_L(£,1.E.v
7 Calcula el voltaje en la inductancia */

y resistencia
D

VRE Lev
Calcula el voltaje en la resistencia */

peint£(*\n\nPara un circuito RL en serie que conste de una”)

prinef("indvetancia de te henrios y una resistencia de te
Ohmiosin",1,0) 7

print£("con una frecuencia aplicada de te herezios\n". £1;

print£(-y fuente de te voltios, \n".v);

print£("la caida de tension en los componentes es: \n\a"):

PROGRAMACIÓN ESTRUCTURADA — 97

print£("Voltoje en la inductancia => te voltios”,
v inductancia)

print£{-volraje en la resist
v resistencia);

cia => te voltios”,

Análisis del programa

Uno de los aspectos importantes que se han añadido al Programa 2.17 es la explica:
ción de las variables utilizadas como argumentos formales en el prototipo de la fun-
ción que realiza los cálculos y muestra los resultados:

float calcular_y_mostrar(floar £, float 1, float x, float vi;
€ = Precuencia en hertzios
1

inductancia en henrios
Resistencia en ohnios

y = voltaje de la fuente on voleios:

Esta función calcula y muestra la caída de tensión en
la resistencia y on la inductancia,



Observe que los comentarios definen exactamente cada uno de los identificadores
utilizados como parámetros formales en la función. A continuación, como siempre, se
muestra el propósito de la función. Es importante apreciar que el prototipo no se
encuentra comentado entre /* y +7, puesto que éste sirve como una instrucción efecti-
va para el compilador de C.

La función obrener_valores lama a la función caleular_y_mostrar. Los pará
metros reales que utiliza la función que lee los datos del usuario del programa son los

tes:

caleular.yrostrar(frecuencia, inductancia, resistencia, voltaje):

La definición de la función caleular_y_mostrar utiliza la misma cabecera que su
prototipo (con la excepción de que no aparece el punto y coma). Observe de que forma
{an fácil se codifican los cálculos para estas fórmulas complejas:

float calcular y_postrarífloat £, float 1, float x, float v)

float v_inductancia; — /* Valor del voltaje en la inductancia +/
float y resistencia; — /* Valor del voltaje en la resistencia */

v inductancia = VE 12,0:
7X Calcula el voltaje en la inductancia */

vw resistencia = Y_RE-L, rs
/% Calcula el voltaje en la resistencia */

PROGRAMACIÓN ESTRUCTURADA EN €

Print£i"\n\npara un circuito RL en serie que conste de una");

Printf("inductancia de te henrios y una resistencia de te
ohnios\n 2,297

printt(-con una frecuencia aplicada de %e hertaiosta”,£):

prince (-y fuente de 3e voltios, \n* vii

printf (71a caida de tension en los componentes es: \n\n”)z

Print£("voltaje en la inductancia => te voltios\n"

printé(-Voltaje en la resistencia => to voltiosin”,

La salida de este programa muestra los valores introducidos por el usuario em
pleando notación exponencial junto con todas las unidades de medidas. Las soluciones
también se muestran utilizando notación exponencial junto con sus unidades de medid

Programa final

En este programa no se ha presentado al usuario la opción de repetir los cálculos
puesto que no se ha explicado aun la forma de hacer esto en C. La última etapa de la
codificación es crear un archivo de cabecera llamado serie_r1.h que contenga la
siguiente información:

dinelude <stdio.h>
hinclude <nach. >

Adefino PI 3.141592

Adatáno cuadrado) x

Adetine xL(E,1) 2epreen

#dofine ZIE,L,r) sqrt (cuadrado(x_L(f,1)) + cuadradotr))
Adefine VUE, V9 VERLIEREN

fdetine VRIE Lei) ve(e/2(E 1e)

De esta forma el programa final incluirá al comienzo det mismo
sentencias #inetude:

siguientes

Hinelude <stdio.h>
Hinelude <mach.h>
Winelude “serie ei he

Conclusión

Ha recorrido un gran camino en su observación del desarrollo de un programa C. Es
importante que aplique los principios que se han presentado en esta sección a los
programas que usted desarrolle. La planificación cuidadosa y la documentación de
pectos muy importantes de una buena programación. Estas etapas
son seguidas por los programadores profesionales que conocen el viejo dicho: «Cuan-
10 más pronto se empiece a programar, más se tardard en depurar el programa final».

PROGRAMACIÓN ESTRUCTURADA — 99

'Comprucbe ahora lo que ha comprendido de esta sección haciendo los ejercicios
de repaso de la sección.

TRepaso dela Sección 27

Indicar uno de los principales objivos en el desarollo del programa de esta secció,
¿Qué debería incluirse en el bloque del programador?

Explor lara del uso de las diecivas Fda ine.

¿Cuál sl ma coca que se pregunta normalen

al usuario de un programa tecnológico típico?

Ejercicios interactivos

DIRECTRICES

La realización de estos ejoricos require tener aceeso à un computador con un entorno C. Se han
incluido para permi sdquirir una valiosa experiencia y, lo que es más important, para tener una
realimentación inmediata delo que los concepto y mandatos preseniados en este capitulo hacen. Además
Son diverts.

Ejercicios

1. Prediga qué hará el Programa 2.18 y luego prodbelo.

Programa 248 Winclude <stdto.h>

void Primera (void);
void Segunda (void):

saint)
¢
puts(-Esto es main)";
Primera():
;

void Prinera()

puta(-esta es Prineratl")s
Segunda):
;

void Segunda()


puts(-Esta es Segundat)*);
3

2. Fi Programs 2.19 se diferencia dl anterior en que se necesita pre

ects -Beeak par abortale.
La diferencia se encuenta en que la fnción se lama a mis

ex un ejemplo de ecursividad

100 PROGRAMACIÓN ESTRUCTURADA ENC

Programa 2.18

Programa 2.20

Hinelude <etdio.h=
void Recursiva(void):
saint)

Rocursivatı:

vola Recur:

vat

puts ("Este es un ejemplo de recursividad.*);
Recursivatız

rograucin. El Programa 2.20 redefine Órdenes de C. Esos pean
Cabecera denominado nuovo, codigo. Pachelo par domustarso Hees x an

Minclude <eedio.
adefine START maint
Kdofine END )

Hdefine HRITE puts
start

RITE ("Hs esto un programa?)
END

Autoevaluación

DIRECTRICES

Utilice el Programa 2.16 para responder a la siguientes preguntas

Preguntas:
1. ¿Cunas funciones se ham definido en el programa? Nómbrels.
2. ¿Cuáles el número toll de foncions liada en el program? Indique aquellas que o se haa

Prob en pr
3. dique os ide wpa como parimeros formales en el programs,
4. Indique le dencre emplendos como parimeirs reales en el program ¿Qué Rio paca
sables à oe foc?

5. Explique como se pasan valores de un función or utilizando cl Programa 2.16 como ejemplo.
8. ¿Cuántos ideiicaores de variables se uiizan on el programa? Némbelos

7
8

¿Qué cambio mínimo debeia some en l progama para que mostrar st kar de la scala
finduciva Gt)
Explique sTel programa scepta datos introducidos por el usuario en notación exponencial.

E |

PROGRAMACIÓN ESTRUCTURADA — 101

Problemas de fin de capítulo

Conceptos generales

Sección 21

1 pie gus

2. iru no es necoaro wae a
un programa ©?

ae Ugo de loge en acacia de ep
Li are dd programa?

1 QUE tio de logue en La copia de je

Accra Uren dean cio de programa

SC néon mad
‘Ean programa €. sl que nom a comp
9° Hr a fonte qu cn definidos one
6. sigue senc ent prono de una fn
ny Cies emp pars dt I función
{Gao se ez ona mae a una fein?
{Gos frien prova a temo normal de un
rd? gQuE valre iia yrs un er
sta soem?

po

Sección 23
9. Qué tipo se asgna a un función cuando ésta no
suce ningún vor?

10. Indi qu se la en una función ara definir el
mime ÿ tipo de los datos que sera pasados la
Función cuando está ve lama

11. ¿Qué se liza para doolver un valor de una fon
ido a aquell que ai la amada

Sección 24

12. LA qué se llama cundo una funció se llama a x

13. ¡Puede mar on función más de una función

14 Exit alguna diferencia en el onden en el que ls
finciones son llamadas?

15.. ¿Puede una función ala queso ha llamado llamar
Su vez otra función?

Sección 25

16. ¿Qué es una die del preprocesador?

17. dique as directivas del peeproceador que se
presentado en este capil,

18. Explique cómo se define normalmente las constan
went.

19. DE un ejemplo de cómo se ped
"ws com I directiva tats,

liar parie.

Sección 2.6
20, Explique cómo pueNde hacer un archivo con sus

propias directivas wdo£ine pra ar en oros
Programs,

21. ¿Cómo se invoca a un archive de cabecera?
22. ¿Cuáles a entensión aceptada que se da los acti
Vos de cabecera en ©?

Diseño de programas

Es el desarollo de los sigui
iuétodo descrito enla Sección 27. Par cada programa,
document su diseño y manténgalo con su programa, Este
proceso debería incluir e contenido del disehn que indie
¿ue el propósito del programa, In entrada que se necesita,
proceso quese rela sobr a ena y I slid quo se
neces, así como el algoriimo del programa. Asegúrese
¿e que incluye toda ests documentación en su programa
Final, Eta debería conter, al menos el bloque del po:
gramador los protnipos de as funciones y una desc
nein asi como delos parámetros formatos

mts programas haga uso del

‘nied por una font de alimentación. La sch
«ión muemdien a rar es

=

x

onde

P= La potencia entregada en aros,
1 = La Comente de la fuen en amperios.
ES vole dela fuente en voltios

No utilice diecivas tet ine para este progra-
ma, Maga uso de funciones para cda una delas ar
{es importantes del mismo, Una fonción explicará al
ua a taa que eva a cabo el programa, ota
Teer os valores del usuario y los pasara ota fone
«ión que definida fórmula de a potencia,

24. Modifique el programa desarollo en el Proble-
ma 23 para que la ema de la potencia se incluya
a un archivo de cabecera en vez de en una función

25. Desarollo un prog se determine em
mero de bytes que se mecsitan para almacenar una
maz de N por M elementos. Hage eeu para
clememos que ocupen un bit un Bye y dos bytes

26.. Escribi un programa cn € que seule el volumen de
tues haitacione diferentes. Asuna que cada habit
‘ines un rectángulo perfecto, El usuario inroduci
‘et ato, cl ancho y la longitude coda habitación.
EI programa devolverá el volumen para cada hab
tación sí como el volumen total de hss abit

102 PROGRAMACIÓN ESTRUCTURADA EN C

27.. Desarollo un programa en C que calle la atu:
ra de un pacien de un hospital: El usario into
En

El número de dis en el hospital
cost de la consult,

El provi delas medicinas, 20.
Costes diversos

El precio por día.

La deducción del seguro

EE programa debe calcula lo siguiente:

1. El cose out

2. El coste total menos la dedocción del seguro

3. E coste total menos ol cost de as medicinas
y la deduces,

Implemente la siguien frmul como una función:

ee

3

Operaciones sobre datos
y toma de decisiones

Objetivos
En este capítulo podrá aprender:

El significado y uso de los operadores de comparación.
La diferencia entre una bifurcación abierta y una cerrada,
La aplicación práctica de las bifurcaciones abiertas y cerradas.
El uso de operaciones lógicas y binarias en C.
mación de bifurcaciones mediante el uso de operadores lógicos y de
comparación,
Cómo seleccionar una entre varias alternativas.
Cómo trabajar con tipos de datos diferentes y realizar conversiones entre ellos.
El uso de la compilación condicional,
El desarrollo de programas a partir de sus correspondientes diagramas de flujo.

PERO aera

Palabras clave

Operadores de comparación Sentencia if. .else
VERDADERO Sentencia if... else compuesta
FALSO. Operadores binarios

Asignación Operadores Booleanos
Bifurcacién abierta Complemento binario (bit a bit)
Sentencia it AND binario (bit a bit)
Sentencia condicional OR binario (bit a bit)

Sentencia compuesta. XOR binario (bit a bit)
Bifurcación cerrada Desplazamiento de bits

103

104 PROGRAMACIÓN ESTRUCTURADA

AND lógico Conversión de tipos.
OR lógico Valorá
NOT Compilación co

Suplentes del prog

Contenido
3.1, Operadores de comparación 3.8.

rada 39, » y desarrollo de
34. Operaciones Booleanas binarias:
35. Operaciones lógicas 3.10, a de aplicación: La
36. Conversión de tipos reparación de un robot

37. La sentencia switch BIL Pr

amas de aplicación a

Introducción

En este capítulo se mostrará cómo desarrollar programas en C que hagan que el
computador parezca «inteligente». El lector aprenderá a crear programas que 10m
decisiones de forma que su comportamiento pueda depender del valor de un dato que
introduzca un usuario o del resultado de un cálculo previo.

El capítulo comienza explicando las distintas relaciones que pueden existir entre
dos cantidades y cómo dichas relaciones se usan en el proceso de toma de decision
de un programa. Se presentarán los operadores y el simbolismo utilizado en C para
expresar estas rotaciones lógicas.

El capítulo termina con una interesant consiste en eld
rrollo de un programa para la reparación de un robot. Al finalizar el capítulo se podrán
escribir programas que permitan analizar y resolver dentro del
campo de la tecnología.

3.1. OPERADORES RELACIONALES

Presentación

En esta sección se present
a conocer qué rela
rán como Fun

rear programas que

los operadores relacionales de compas
nes existen entre dos cantidades,
1 material expuesto en la pro
capaces de tomar decision

sección donde se apre

Operadores relacionales

or re
lados

Un opera
dos cant

jonal o de comparación es un símbolo que indica una rc
stas cantidades pueden ser variables, constantes o funci

ión entre
nes. Lo in

|

Programa 34

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 105

‘Tabla 3. Operadores relacionales (de comparación usados en ©

Significado Ejemplos VERDADEROS Ejemplos FALSOS
> Mayor que 553 335
0+9>6-2 (1236) > 18
> Mayor igual que 10 >= 10 32-5
= 8482010815
% Menor que 305 FPE
1p eis 9-2<341
e Menor igual que 3615 15.3
Wee 93
ual que
Distimo que

portante es resaltar que dichas relaciones o bien son VERDADERAS o bien FAL-
SAS, pero no hay ninguna otra posibilidad.

La Tabla 3.1 muestra las operaciones de comparación disponibles en C.

Los operadores de comparación devuelven un 1 para indicar una condición VER-
DADERA y un 0 para indicar una FALSA. El Programa 3.1 ilustra este comporta-
miento

Hinelude <staio.n>

maint)


float valor_logico; — /* Valor nunérico de una expresión de

comparación */

printf ("Valores logicos de las siguientes relaciones:\n\n"):
valor_logico = (3 > 5);
printl(=(3 > 5) es da”, valor_logico) +
vator_logico = (5 > 3);
printE(=(5 > 3) 00 An
valor_logico = (2 >= 5);
printE(=(3 >= 5) os Af1n",valor_logico);
valor_logico = (15 >= 325);
printfi"(15 >= 395) es *£1",valor_logico)
valor. logico = 18 < (10-2));
printi(-(B < (10-2)) es tfin",valor_logico)+
valor_logico = 12°3 < 24/3)
printi(*(2*3 < 24/3) es U£\n",valor_logico) :
valor_logico = (10 < 5):
printE(" (10 < 5) es 2£\n",valor_togico):
valor_logico = (24 <* 15);
printi(7(24 <= 15) es t£\n*,valor_logico) ;

valor_logico) :

106 PROGRAMACIÓN ESTRUCTURADA EN C

valor_togico = (36/8 <= 2°3);
printEl"(36/6 <= 292) es AE", valor logice):
valor_logico = (8 == 8):

peintl(*(8 == 8) es YE\n’,valor_lomseo) +
valor_logico = (12+5 == 15);

printE(=(12+5 == 15) es Yen" valor logico!:
valor_iogico « (8 t= 5)

printl(*(B t= 5) os Lin’. valor-logico);
valor_logico = (15 t= 328):
DeintE(=(15 = 323) es fn val

309160) +

Análisis del programa
La ejecución del programa da como resultado;

Valores logicos de las siguientes relaciones
13 > 5) es 0.000000
(5 > 3) es 1.000000
5) es 0.000000
3*5) es 1.000000
(8 < (20-2) es 0.000000
(2:3 < 24/3) es 1.000000
(10 < 5) es 0.000000
(24 <= 15) es 0.000000
(36/6 <= 223) 05 1.000000
8) es 1.000000
= 15) 6s 0.000000
5) 08 1.000000
(15 ta 325) es 0.000000

En esta salida se puede observar que los operadores de comparación devuelven
únicamente dos valores: un I cuando la operación es VERDADERA y un 0 cuando es
FALSA. A continuación se comenta con más detalle el siguiente fragmento del pro- |
grama:

valor_logieo = (3 > 5):
printi((3 > 5) es t£n*,valor_logico);
valor_logico = 15 > 3);

printl(z(5 > 3) es Ain", valox_logico)

La variable vator_togico se h de i
usar oros tipos. En la primera Hnca se |
operación (3 » 51. Esa sentencia es FALSA y, por lo anto, devolverá un 0. que |
muestra en la salida usando un tipo float (22) como 0.000000. En la sogund |

rado de tipo £toac. El lector puede intentar
4 asignando a dicha variable el valor de la

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 107

parte, se asigna a la variable valor_togáco el resultado de la operación (5 > 3).
Puesto que se trata de una sentencia VERDADERA, devolverá un 1 que, ul imprimirlo
como un tipo £loar, aparecerá en la salida como 1.000000.

El resto del programa realiza Operaciones similares a las comentadas.

Igualdad

Puede parecer extraño que en C se use el símbolo «+ (dos iguales o «igual-igual>) para
expresar la relación de igualdad. Es comprensible que muchos de los que empiezan a
trabajar con este lenguaje puedan pensar que el operador = (un nico símbolo igual)
sirve para expresar la relación de igualdad, Sin embargo, este símbolo, a diferencia de
lo que significa en el campo de la matemática, representa una asignación. La Figura
3.1 ilustra el concepto de asignación.

Es importante distinguir entre el operador de asignación (=) y el operador de com-
paración de igualdad (==). El operador de asignación toma el valor correspondiente al
lado derecho de la sentencia de asignación y lo almacena en la posición de memoria de
Ja variable que aparece en el lado izquierdo. El operador de comparación de igualdad.
hace algo totalmente diferente; compara el valor almacenado en una posición de me-
moria con el almacenado en otra. No hay transferencia de datos de una posi

/
mm 1) 5 con

Aia ls estos

ates NOTA: ELopenor
emo Soon
aies Pre

meno, Suma aloquetay
een

Alma ei
ama pci

Figura 31. Concepto de asignación

108 PROGRAMA

CIÓN ESTRUCTURADA EN €

El siguiente ejemplo sirve de repaso del uso de los operadores de comparación.

Ejemplo 3.1

bec

Especifique c

os comparaciones:

D.

Conclusión

En esta sección sc han presentado los operadores de comparación de €, mostrándose
los símbolos que se usan en C para representar dichos operadores, Asimismo. se ha
explicado que dichos operadores sólo pueden tomar dos valores: VERDADERO y
.LSO, que realmente se corresponden con los valores numéricos | y 0 respec
mente. Por último, se ha mostrado la importante diferencia que existe entre el opera-
dor de asignación (=) y el de igual
En la próxima sección se aplica
programas con €
comprensión de los conceptos presentados en esta sección mediante el sig

rendido en esta sección al desarrollo de
s. Antes de pasar a ella, comprucbe su
ne repaso.

Repaso de a Sección St

1. ¿Qué son los operador de comparación?
2. Enumere todos los operadores de comparación de C
3. ¿Qu
4
5

ls conliiones puede omar um operador de comparación?
Eplique qué sigifia que un operador de comparación devuelve un ¥
Fsplique la diferencia etre los símbolos

3.2. LA BIFURCACIÓN ABIERTA

Presentación

ía sección mostrará cómo se usan los operadores de comparación presentados en la
sección anterior para poder tom: de un program.

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 109

La bifurcación abierta presentada en esta sección es quizá el mecanismo de toma
de decisiones más sencillo que proporciona el computador, Aun así, este mecanismo
supondrá un avance importante en los conocimientos de C del lector.

Idea básica

La Figura 3.2 ilustra la idea básica de la bifurcación abierta mostrando dos importan-
tes características de este tipo de bifurcaciones, En primer lugar, el flujo del programa
siempre continúa hacia adelante. En segundo lugar, independientemente de que se
tome o no el camino alternativo, siempre se ejecutará el resto del programa. En el
lenguaje C, este tipo de bifurcación se corresponde con la sentencia ££.

La sentencia ie

sentencia 1£ es de tipo condicional ya que su ejecución depende de una condición,
La sintaxis de esta sentencia es la siguiente:

if (expresion) sentencia

Lo cual significa que si expresion es VERDADERA se ejecutará sontencia,
mientras que si es FALSA no se ejecutará. El Programa 3.2 ilustra el uso de esta

4 tae
E AS
El A

i 3

Figura 32. Concepto de rama ale.

110 PROGRAMACIÓN ESTRUCTURADA EN €

Programa32 finciude <stdio.h>
main)

float mmeroz /* Valor proporcionado por el usuario, "7

print£(“Dene un numero del 1 al 10
Scanf("LE"‚unumero);

$f (numero! > 5)

ECE] numero es mayor que $.\n”)
printl(*el numero leido fue 2f.", numero)

Análisis del programa

Programa 3.2 pide al usuario que introduzca un número del al 10. Si ésto introdu-
ce un número del 1 al 5 (por ejemplo, el 3), el programa imprimirá cl mensaje:

El numero leído fue 3.

Si el usuario introduce un número mayor que 3 (como, por ejemplo, el 7). el

programa mostrará los siguientes mensajes:

El numero 08 mayor que 5.
numero leido fue 7

Se pueda

apreciar el uso de la sentencia ic en el

Ae (numero > 5)

peinte (EL numero es mayor que 5.10")

La expresión es una comparación que evalúa el valor introducido por el usuario |
para determinar si es mayor que 5. Silo es la expresión es VERDADERA y se eject |
tard a siguiente sen

Printfi"El numero es mayor que 5.10);

En caso contrario, no se ejecutará esa sentencia,

Nótese como la sentencia dentro del 1 está sangrada con respecto al resto del
programa. Asimismo, observe la ausencia de un punto y coma entre la expresión y la
sentencia (no hay punto y coma detrás de 1£ (nunero > 5))

Es importante resaltar que el programa siempre avanza hacia adelante y que la
parte condicional podrá ejecu ndiendo de si se cumple la condición.
Sin embargo, con independencia del valor introducido por el usuario, siempre se eje.
cutará el resto del pro; a na Mamada a la
Tunción prince) |

Programa 3.3

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 111

ie
A =] Sache > 100
& ae pote
3
H
E

Voie de ca
cl

Figura 33. Cálculo opcional de disipación de poenci.

Un sentencia compuesta

El Programa 32 ilustró el uso de una condición &£ que incluía una sola sent
Existen situaciones, sin embargo, en las que se necesita desarrollar un programa que
tenga más de una sentencia asociada a una condición. Por ejemplo,
ue lee un valor introducido por el usuario que corresponde con a medi
Je en una resistencia, Como se observa en la Figura 3.3, la condición del programa es
que sé se calculará la potencia disipadaen la resistencia sel voltae es mayor o igual
que 100 voltios.

“Cuando se necesita incluir más de una sentencia en el espacio lógico reservado para
una única sentencia, se usa la sentencia compuesta. Como muestra el Programa 3.3,
se tata simplemente de una secuencia de sentencias encerradas entre Haves {

finelude <stdio.h>

mino
i
float voltaje; J+ voltaje medido en voltios. */
float resistencia; /* Resistencia en ohmios. Y
float potencia; / Potencia calculada en vatios. */

print£(=Introduzca el voltaje medido en voltios =>
scant ("86° avolease) à
LE (voltaje >= 100.0)
{
printE("Uoltaje es mayor o igual que 100 Yin")
print£(-Introduzea ol valor de la resistencia

112. PROGRAMACIÓN ESTRUCTURADA EN C

sean ("86*, resistencia) à
potencia = voltaje * voltaje / resi
print£("La disipación de poter



a es BE vatios.\n

print €(-Confirmacion del valor de entrada de 1£ voltios.”,voltaje)

exit (ora

a Figura 3.4 ilusa el esquema lógico del Programa 3.3.

Toes

|

et

Geary

ECS

ra 34. Construcción lógica del Programa 3.3.

OPERACIONES SOBRE DATOS Y TOMA DE DIE

ISIONES 113

Análisis del programa
Este programa ilustra el uso de la sentencia compuesta:


printf ("Voltaje es mayor o igual que 100 Via”);
printf (*Intreduzca el valor de la resistencia =>
scant ("38 ,aresistencia) y
potencia = voltaje * voltaje / resistencia;
print£("La disipación de potencia es tf vatios.\n",potencia)

Nótese que todo el fragmento está encerrado entre Haves. Lo que está dentro de
estas Tlaves es otro bloque del programa (igual que las llaves usadas en la función
mai (1 0 en cualquier otra función). Para la sentencia 3, este nuevo bloque del pro»
grama es sólo otra sentent ilustra este concepto.

Desde el punto de vista del programa, la operación de compara

n siguient
if (voltaje >= 100.0)
causará la ejecución de una sola sentencia que, en este caso, es compuesta.

Asi, si se ejecuta el Programa 3.3 y el usuario introduce un valor de 25 voltios para
una resistencia de 500 ohmios, la salida ser:

Introdusca el voltaje medido en voltios => 25
confirmacion del valor de entrada de 25.000000 voltios

En este caso el ££ no se ha activado ya que la comparación (relación) voltajo >=
100.0 es FALSA.

Tonos sein omo pea su sen.
Me a eens
compu

Lites dites

fern de

Figura 35. Concept de visualización de un sentencia
compuesta,

11d PROGRAMACIÓN ES

Programa 34

TRUCTURADA ENC

in embargo, si el usuario introduce un voltaje de 125 voltios para una resisten
de 500 ohmios, la salida será:

Introduzca el voltaje medido en voltios => 125
Voltaje es mayor o igual que 100 Y

Introduaca el valor de la resistencia => 500

La disipacion de potencia es 31.250000 vatios.
Confirmación del valor de entrada de 125.000000 voltios

En esta salida puede observarse que sigue ejecutándose el último printe.

Uso de funciones

Puesto que la sentencia 1€ puede utilizarse con una sentencia compuesta, parece I
co preguntarse si puede usarse para llamar a otra función (la cual a su vez podría
contener sentencias 1 € adicionales). Como puede verse en el Programa 3.4, la respues-
ta es afirmativa,

Hinelude <stdio.h>

void calculo_do_potencia(floa voltaje);
maintı


a

x voltajes — /* Voltaje medido en voltios. */

printf ("Introduzca el voltaje medido en vol!
scanf ("8E",avoleaje):
Af (voltaje >= 100.0)

calculo_de_potencia (voltaje!
print£("Confirmacien del valor de entrada de 2£ voltios.".voltaje)
exit (0) 2

void caleulo_de potencia(float voltaje)

Moat resistencia; /" Resistencia en ohmios. “Y
float potencía; /* Potencia calculada en vatios. */

print£("Voltaje es mayor o igual que 100 Via")
print£("Introduzca el valor de la resistencia =>“);

scant ("RE", Lresistencia) ;

potencia = voltaje * voltaje / resistencia,

printf ("ta disipacion de potencia es BE varios.1n”.potencial;

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 115

Análisis del programa

El Programa 34 ilustra una buena técnica de programación al estar dividido en dos
partes. Esto no quiere decir que un programa sea mejor cuantas más partes tenga.
Significa más bien que las diferentes tareas que realiza un programa deben quedar
claramente distinguidas en su código. Este programa se ha dividido poniendo el cálcu-
lo opcional de la disipación de la potencia en una función separada, quedando la.
sentencia 1£ simplemente como:

¿E (voltaje >= 100.0)
caleulo_de_potencia (voltaje)

Lo cual resulta mucho más legible. Esto indica que
usuario es mayor o igual que 100 voltios, se realizará el cálculo de
do para ello el valor del voltaje. Se puede observar que se pasa dicho valor como
argumento de la función. El prototipo de la función que aparece al principio del pro-
grama

void caleulo_ds_poteneialfloat voltaje);

informa al compilador de que se trata de una función vosa (no devuelve ningún valor)
con un argumento de tipo feat. La cabecera de la definición de la función

void caleulo_de potencia(floar voltaje)

es idéntica al protot
ciones del valor de
función que las usa.

(excepto por la ausencia del punto y coma final). Las declaras
la resistencia y de la potencia están ahora incluidas sólo en la

float resistor: — /* Valor en ohnnios de la resistencia */
float pouces Je cálculo de la potencia en watios 7

La salida de este programa es la misma que la del 3.3. La diferencia está en que
este programa se puede leer y depurar con más facilidad.

Conclusión

Esta sección ha presentado el uso de ln sentencia i para construir bifurcaciones abier-
tas. Se ha mostrado que esta sentencia está compuesta de una condición y una senten-
cia, de tal forma que sólo se ejecutará la sentencia si la condición es VERDADERA.

‘Se ha presentado también la sentencia compuesta que consiste en una secuencia de
sentencias encerradas entre llaves que permite incluir varias operaciones dentro de una
sentencia condicional. Asimismo, se ha explicado la posibilidad de realizar llamadas a
otras funciones desde una sentencia it.

En la próxima sección se presentará la bifurcación cerrada. Antes de pasar a ella,
compruebe su comprensión de los conceptos explicados en esta sección mediante el

nie repaso.

116 PROGRAMACIÓN ESTRUCTURADA EN C

Repaso dela Sección 32
1. Describa una bifurcación cords,

2. ¿Cómo funcion una setenen $67

3. ¿Qué cs una sentencia compuesta?

4. ¿Se puedo mar a una función desde una sentencia LE?

3.3. LA BIFURCACIÓN CERRADA

Presentación

Esta sección mostrará el concepto de bifurcación cerrada que extiende la capacidad
de toma de decisiones del programa.

Idea básica

La Figura 3.6 ilustra ta idea básica de la bifurcación cesrada mostrando dos importan:
tes características de este tipo de bifurcaciones. En primer lugar, el flujo del programa
siempre continúa hacia adelante. En segundo lugar, el programa ejecutará una de las
dos alternativas e, independientemente de cuál de las dos se tome, siempre se ejecutará
el resto del programa, En el lenguaje C, este tipo de bifurcación se corresponde con la
sentencia ££... else.

4
i
3
$
É
ñ 5
£
€ ete irate
ENTER
Shovisiesc

Figura 36. Concepto de rama cerrada,

Programa 35

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 117

else

La sentencia ie.

La sentencia it. .eLse es una sentencia de tipo condicional que representa una bifur-
ación cerrada. La sintaxis de esta sentencia es la siguiente:

if (expresion) sentencia, else sentencia,

Lo cual significa que si expresion es VERDADERA se ejecutará sentencia;
mientras que si es FALSA se ejecutará sentencia,. La Figura 3.7 muestra un ejemplo.
de bifurcación cerrada donde la condición es si un número es mayor que 5.0 no.

Sentencia compuesta con ir...ei.

El Programa 3,5 ilustra el uso de una sentencia compuesta dentro de una sentencia
if.,.¢1se. El programa calcula el área de un cuadrado o de un círculo dependiendo.
de lo que seleccione el usuario.

tinclude <stdio.h>
háefino PI 3.141592

sain)
float eleccion; /+ elección del usuario. */

float longitud; /* longitud del lado o del radio. *
float area; 7% ärca on unidades cuadradas. | */

Printf("\n\nkste programa calcula el area dera”):
Print£irun cuadrado o de un circulo.An”);
peintE(*\nBLija un numero:\n*):
print£{-1] Arca de un circulo. 2] Area de un cuadrado. In“);
princ£(-Su eleccion (1 0 2) => “à
Beant ("2€ ‚Leleceson) à
Af (eleccion == 1)

Print£("Dome la longitud del radio del circulo =>
scanf "RE" glongitud) à
area = PI * longitud * longicud:
print£ "Un circulo de radio ¥f tiene un area de *.longitud);
peinte ("té unidados cuadeadas.”.area);

if
ele

Le (eleceion
ñ

2

print£("Deme la longitud de un lado del cuadrado =>
scanf (4€, Longitud) :
area = longitud * longitud;

118 PROGRAMACIÓN ESTRUCTURADA BNC

peinef(-Un cuadrado de longitud £ tiene un area de”.

Longitud)
primt£(raf unidades cuadradas. area) ;

else

printf ("Eleccion incorrecta.\n"):
printf (-Debe ejecutas el programa de muevo\n")
print ("seleccionando un 1 9 un 2.\n’)z

;

printt(*\n\naqui termina el programa que calculan”);

printElrel area de un circulo o un cuadrado.*):

exit (0):

GD)

| =
| LS

os

Figura 37. Ejemplo de bifurcación cer.

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 119

Análisis del programa

Como se puede observar en la Figura 3.8, este programa tiene tres opciones como
queda reflejado en el uso de la construcción i£...eise 4£.

else:

Af (expresion,) sontencia, else if (expresion,) sentencia, else

Esta construcción indica que si expresion, es VERDADERA se ejecutará sen-
sencta, y ninguna de las sentencias restantes. Si expreston, es VERDADERA se

(GD)

Pfc

so
si =
st
Car
cles
dust
sono fe
Pane nar
progr EN

Figura 38, Construcción del Programa 35,

120 PROGRAMACIÓN ESTRUCTURADA EN C

Programa 3.6

ejecutará sentencia, y ninguna más. Si ninguna de las dos expresiones es VERDA.
DERA, se ejecutará sentenesa,. Esto se codifica de la siguiente forma:

if (elección == 1)


{cuerpo de la sentencia compuesta para cascular el área de
un eizeuio)
)
else
Lf teleceion


[cuerpo de la sentencia compuesta para calcular el érea de
un cuadrado]

else
\
(Cuerpo de la sentencia compuesta para imprimir un mensaje
al usuario]
>

Sie usuario invoduce un 1, se ejecutará I sentencin compuesta que calcula |
fea de un cra. Si introduce in 2 se ejecutar a semenca compuesta que ce |
el área de un cuadrado. Para cualquier otro valor, se ejecuta la sentencia compuesta ’
que sigue al dio aise

tesla ausenca de un punto y coma detrás els palabras reservadas 1 y se. |

Uso de funciones

El Programa 3.6 resuelve el mismo problema pero de una forma más estructurada, En
este programa todos las sentencias compuestas se han reemplazado por funciones y.
además, las fórmulas para calcular las áreas se han definido al principio del program
mediante la directiva #define.

include <stáio.h>

Faefine PI 3.141592 1% La constante pi

Héefine cuadrado(x) xx /* área de un cuadrado. */

#dofine circulo(r) Plrre /* área a

void seleccion_del_usuario (vo:
void datos ¢

un circulo. */

D: /* Obtiene la elección del usuario. */
_eireulo(void) 7 obtiene el radio del círculo y
calcula su área. */

void @atos_del_cuadrado(void); /* Obtiene el lado del cuadrado y

void seleccionerroneavoid); /* Notifien una elección errénea *

calcula su área. */

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES

pain)

1 “iminEste programa calcula el area down”
princ£("\n\neste pı eula el area do\n"):

Pinef Cun cuadrado o de un circulo.\n*);
Phueccion.delusuario(): — /* Obtiene la selección del usuario. */
Sejncki-\n\nAqui termina el programa que calculan”);

Prantétrei area de un cireule o un cuadrado.*);

exit (0):

vota selcceion_del_usuario(void) /* Obtiene la elección del usuario. */

Host eleccion; — /* elección del usuario. */

print i“inElija un numero \n-):
printé(*1] Area de un cáreulo. 2) Area de un cuadrado.1n)
Print£ ("Su eleccion (1 0 2) =>“);
Scans ("82”,uoleceion);
ff (eleccion == 1)
datos dol_cireuto():
else
$e (eleceion == 2)
datos_del cuadrado()
else
seleceion_erroneat) à

void datos_del_circulolvoid) — /* Obtione el radio del círculo y
calcula su área. */

float radio; /: radio del círculo, */
float area; 7+ área del círculo en unidades cuadradas. */

print£(*Dene la longitud del radio del circulo
Scan ("£",aradio} 7

area = circulo(radio)

printé(-un circulo de radio IE tiene un area de “,xadio);
print£("S£ unidados cuadradas. *, area);

vold datos_del_eundradotvoid) — /* Obtiene el lado del cuadrado y
calcula su área. */
\
float Lado; /* lado del cuadrado. */
float area: /* área del cuadrado en unidades cuadradas. */

print£(-Dene la longitud de un lado del cuadrado

oh

1

122, PROGRAMACIÓN ESTRUCTURADA EN C

scant ("26", clado);

area = cuadrade (lado):

printf ("Un cuadrado de longitua tf tiene un area de ",1ado);
printf(-t£ unidades cuadradas.”,area)

void seleccion erronea(void) /* Motáfica una elección errónea */

printf (-Bleccion incorrecta.\n"):
prince (*Debe ejecutar el programa de nuevo\n"):
print ("seleccionando un 10 un 2.10");

La Figura 3.9 ilustra a estructura de este programa. Como se observa en dich;
figura, el programa ha sido dividido en bloques asociados a funciones.

os. seo Pen sécion erent)

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 123

Análisis del programa

El programa comienza con las siguientes definiciones:
define Pr 3.141592 [+ La constante pi “Y
Naefine cuadtado(x) #tx /* área de un cuadrado, */

haolino céreulo(r) Pier 7+

ea de un eireulo. */

Obsérvese que cada define tiene asociado un comentario describiendo su propé-
sito. A continuación, se presentan los prototipos:

voié seleccion_del_wsuario(void); /* Obtiene Ja olección del
circulo(voie); / Obtione el radio del
círculo y calcula su
área. */
void dntos_del_cuadrado(vold); /* Obtiene el lado del
cuadrado y calcula su
área. Y
void seleccionerronea(void); /* Notifica una elección
errónea */

vota daros_dol,

Cada prototipo específica su tipo y el tipo de sus argumentos y tiene asociado un
comentario que será el mismo que aparecerá en la cabecera de la definición de la
función. Seguidamente aparece la función main () que tiene una estructura muy sim-
ple:

aia)
û
printf (*\n\nBste programa calcula el area de\n");
peintf (run cuadrado o de un circule.\n");
selecciondelusuario(); — /* Obrieno la selección del
usuario, */
Printf(”\n\naqui termina el programa que calcula\n“);
print£(sol area de un circulo o un cuadrado. -)7
exit (0):

Con esta estructura es muy fácil tener una idea general de lo que hace el programa
leyendo solamente la función main(). Esta función únicamente llama a selec~
cion_del_usuario():

void seleceion.del.usuariolvoi) — /* Obtiene la olección del
usuario. */
1
float eleccion; — /* elección del usuario. */

print (-\nELi ja un numerosa")
peinef(-2] Arca de un circulo. 2) Area de un euadeado. a};
primt£(-Su eleccion (1 0 2) =>“):

PROGRAMACIÓN ES

3.4. OPERACIONES BOOLEANAS BINARIAS (BIT A BIT)

TRUCTURADA EN €

P teleeeion == 1)

PEN

En esta función es fácil observar que primero se le pide al
los dos cáleulos y.

Los_del_cirevio, a
tos requeridos, realiza los cálculos pertinentes y muestra

rio que elija uno d
continuación. se invoca a la función correspondiente (da
losda

Conclusión

En esta sección se ha presentado la construcción if. ‚eis

else. que sen
10 en este capítulo como en posteriores, Compruebe
mente lo presentado en esta sección usando el sig

¿Qué 0x una bifurcación cer

¿Qué diferencia ey entre os somencias LE. ££. e220"?
¿Se pueden us

¿Se pueden real
¿Cómo funciona ta comnucción 12. à

encia compuestas dent de a sentencia 16. o

ar llas à fonciones desde dentro dela sen

Presentación

Esta sección presenta ejemplos que muestran el efecto de las operaciones Booleanas|
binarias (bit abit). Cómo se podrá ver a continuación, este tipo de operaciones permi
ten manipular directamente los bits de los datos almacenados en la memoria del
computador, Muchas aplicaciones pueden requerir el uso de este tipo de operaciones

Por ejemplo. los programas que ucceden directamente à dispositivos hardware.

Manipulación de bits

Las operaciones binarias trabajan sobre los bits individ
ador, Por ello, es importante pensar cı

ales de los datos almac
la representación binaria de los

le

Programa

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 125

‘Tabla 32. Operaciones Boolean

Operador de Bit Significado

NTOawo = Combis un it su opuesto

AND Dinero (abi) & El resultado es 1 si ambos
bits son I

OR binario (bi bi) \ El resultado es Osi ambos
bits son 0

OR EXCLUSIVO binario. A Al resultado es | i ambos

(ita bio bits son diferentes

"números para entender mejor ese tipo de operaciones. Recuerde que un 1 se corres-
ponde con el valor Booleano VERDADERO y un O con el valor FALSO. La Tabla 32
nuestra el comportamiento de varias operaciones Boolcanas.

El Programa 3.7 muestra el uso de las diversas operaciones Booleanas binarias. En
los siguientes apartados se presentan ejemplos de ls diversas operaciones analizando
también el fragmento del programa donde se lleva a cabo dicha operación.

tinelude <stdio.n>

saint)
(
int valor;
inc valor?;
int desplazamiento_izq
print£(“Introduzca un numero hexadecimal del 00 al FF
scanf "ax" ‚avalorl)z
print£("El complemento de %X es => AXIn",valorl, -valorl);
printf ("Introduzca otro numero hexadecimal del 00 al FF =>");
scant("4x",tvalorz)
print£("Bl AND binario de AX y $x produce => *. valori, valor21;
print£(-Ax\n-, valor kvalor2);
print£(“El OR binario de 4% y 3X produce
print£(exia", valor à valor2);
print (“El OR-Exclusivo binario de ex y 4% produce
valor, valor2):
printe(axin", valor = valor2);
Printf("Introduzca el numero de posiciones que se desplazara a");

+. valorı, vator2):

126

Ejemplo 32 — Calcular. complemento bi

PROGRAMACIÓN ESTRUCTURADA EN €

Ane (rte
Sconf "15", adeep)

peintfi"pesplagar VE 14 poslei
valor! ,deeplazamiento,
prine£ (rétine valor! << dosplazamio

Complemento binario (bit a bit)

El complemento binario (o complemento a 1) de un número se calcula cambiando
la representación binaria del número los unos por ceros y viceversa. En el Ejemplo :
se muestran algunos casos.

tes números hexad

rio de los si

Ao BFF Ca
Solución
A. Convert a binario: onoooo

Calcular complex nut

Convert ah F

B. Convert à binario: vat
Caleular complemento al: 00400000

00

& 1oooon
a ron

Convertir a hexadecimal 5

Suponiendo que el usuario introduce el valor A3, el fragmento del Programa 3
correspondiente al complemento binario produciría la siguiente salida:

Introdueca un nunero hexadocin
El complemento de A3 os => SC

2 del 00 al FY => A

AND binario (bit a bit)

1 AND binario entre dos números equiva in AND sobre Las ©
respondientes parejas de bits de as respectivas representaciones binarias de los a
meros, En el Ejemplo 3.3 se muestran algunos casos.

Ejemplo33

Ejemplo 34

OPERACION

SOBRE DATOS Y TOMA DE

ICISIONES — 127

Calcular el AND binario delos siguientes niimeros hexadecimales

A OO&FF BB. FF&AS CC. DIESE
Solución:
A. Convertir a binario: 00000000
am
Calcular AND: 00000000
Convertir hexadecimal: ©
B. Convertir a binario: mm
10100101
Calcular AND: 10100101
Convertir a hexadecimal AS
©. Convenir a binario: 11010011
10001110
Calcular AND: 19000010
Convertir a hexadecimal: a

Suponiendo que el usuario introduce los valores D3 y BE, e fragmento del Progra
ma 3.7 correspondiente al AND binario produciría la siguiente salida

Introduzca un nunero hexadecimal del 00 al FF
Introduzca otro numero hexadecimal del 00 al FF
El AND binario de D3 y dE produce => 82

D

OR binario (bit a bit)

El OR binario entre dos números equivale a aplicar la función OR sobre las corres-
pondientes parejas de bits de las respectivas representaciones binarias de los números,
En el Ejemplo 3.4 se muestran algunos casos.

Calcular el OR binario de los siguientes números hexadecimales:

A. WIE BL FFIAS C D3ISE
Solución:
A. Com 00000000.
wun
Calcular OR: nm
Convertir a hexadecimal FF

B. Convertir a binario: man

10100101

128

Ejemplo 35 Calcular el XOR binario de los

PROGRAMACIÓN ESTRUCTURADA EN C

Calcular OR: mn

Convenir hexadecimal: FE
©. Convenir binario: moon
10001110

Calcular OR: mon

Convertir hexadecimal: Dr

Suponiendo que el usuario introduce los valores DB y SE, elf
ma 3.7 correspondiente al OR binario produciría la siguiente salid

Introduzca un numero Moxadecimal del 00 al P
Introduzca otro numero hexadecimal del 00 al

El OR binario de D2 y BE produce => OF

XOR binario (bit a bit)

El XOR binario entre dos números equivale a aplicar la función XOR sobre las co
rrespondientes parejas de bits de las respet
meros. En el Ejemplo 3.5 se muestran

vas representaciones binarias de los ni-

A OFF B. FEAAS CHE
Solución
A. Convertir a binario: ‘00000000
m
Calcular XOR: UT
Convertir à hexadecimal FF
8 tn
10100101
101010
5A
€. Convertir a binario: Hott
10001110
Calcular XOR: GO ON
Convertir hexadecimal: 5D

el fragmento del Pi

al XOR binario produciría la siguiente salida:

Suponiendo que el usuario introduce los valores D3 y
na 3.7 correspondicl

introduzca un num

E

hoxadecinal del 00 al FF
oduzca otro numoro hexadecimal del OÙ al
OR binario de M3 y BE produce => 5D

vs

Ejemplos

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 129

Desplazamiento de bits

C permite realizar desplazamientos de los bits de un número tanto hacia la izquierda
(operador <<) como hacia a la derecha (operador >>). En el Ejemplo 3.6 se muestran
algunos casos.

Calcular el desplazamiento del número de bits especificado de os siguientes números hexade-
cimales:

A Feed B 5C»3 GOS ced

Solución
A. Convertir a binario: mn
Calcular desplazamiento: 1111100
Convertir a hexadecimal FC
B. Convertir a binario: 1011100,
Calcular desplazamiento: ‘00001011
Convenir a hexadecimal: 08
©. Convertir a binario: (00000101
Calcular desplazamiento: 01010000.
Convenir a hexadecimal: 50

Suponiendo que el usuario introduce el valor 5C y un despla
‘a de 3 bits, el fragmento del Programa 3.7 correspondiente al
«iría la siguiente salida:

ento a la izquier-
splazamiento produ

Introduzca un numero hexadecimal del 00 al FF => Sc
Introduzca el numero de posiciones que se desplazara a la
izquierda el primer muero => 3

Desplazar SC 3 posiciones a la izquierda produce => 280

Conclusión

En esta sección se ha presentado el concepto de operaciones binarias, tanto de tipo
Booleano como de desplazamiento. Compruebe su comprensión de esta sección usan-
do el siguiente repaso.

Repaso dela Sección 34

En que consiste el complemento Binario
GER qué consi el AND binario?

{En qué consiste el OR Binario?

(En qué consiste el XOR binario?

{EN qué consist el desplazamiento de bts?

130 PROGRAMACIÓN ESTRUCTURADA EN €

3.5. OPERACIONES LÓGICAS

prender cómo se usan los operadores lógicos de C. En ella se
Nicarin los conocimientos presentados en la primera parte del capítulo, El uso de los |
‘operadores lógicos aumentará la eapacidad de toma de decisiones de los programas, |

AND lógico |

La operación AND lógico se expr

en C de las

texpresion 44 (exo)

La operación anterior se evaluará como VERDADERA sólo si expresión, es
VERDADERA y expresión, es VERDADERA: en cualquier otro caso so evaluará
como FALSA. No se debe perder de vista que en C un valor FALSO es realmente un
0, mientras que VERDADERO se corresponde con un valor distinto de cero. La Ta.
bla 3.3 resume el comportamiento de esta operación.

Nótese que se usan los simbolos «4 para representar esta ops
dose que aparezcan espacios en blanco entre estos simbolos,
la izquicrd:

El Programa 3.8 ilustra el uso de

ción. no permitién-
nque sia la derecha oa,

la operación AND lógico.

Programa 38 Finciude «=:
float rosultado; —* Resultado de sién 1ógica
resultado = 0 64 0:
prinstt-0 du 0 = Af", resultado!
resuitade bu
prints 1-0 in“. rosuttador
resultado o
peines ti Sein", sesuttado +

#
dar, resultado):
,

3.10 muestra la estructura de este programa.

abla 33. La operación AND.
expresión, expresión; Resultado.
FALSO. FALSO

FALSO. VERDADERO.

VERDADERO FASO

VERDADERO VERDADERO. VERDAD

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES

130

Análisis del programa

La ejecución del Programa 3.8 produce:
044 0 = 0.000000

9 & 1 = 0.000000

1 68 0 = 0.000000

16% 1 = 1.000000

Nótese que la variable resultado cs de tipo £loac. Se recomienda que el lector
pruebo con otros tipos de datos. Esta variable se usa para almacenar el resultado de
cada operación AND.

| Ara

npr do del signin

ip

April ead de asignación

p Asignación

npn cl cesado dea ainsi

Asignación

rn tenia del signin

Figura 3.10. Operaciones del Peogeama 3.13,

132 PROGRAMACIÓN ESTRU

Programa 3.9

TURADA EN €

La primera operaciön (0 «6 0% realiza el AND lógico de dos valores FALSOS
(representados en C como ceros) produciendo como resultado un valor FALSO que
corresponde con un D en la variable rest
Las dos siguientes operaciones «0 ie 19 (1 4:01 se eva también es
. por tanto, un 0 en resul tado,
« tyes la única que produce un valor VERDADERO que correspon

o FALSO

de coman |

La operación OR lógico

La ope

¡ón OR lógico se expresa en © de la siguiente forma:

La operación anterior se evaluará como FALSA sólo si expresión, es FALS
expresión, es FALSA: en cualquier otro caso se evalugrá como VERDADE |
cuerdo de muevo que en C un resultado FALSO es realmente un O mientras que un
resultado VERDADERO se corresponde realmente con un valor distinto de 0. Lal
Tabla 3.4 resume el comportamiento de esta operación.

El Programa 3.9 ilustra el uso de ación OR lógico

Tabta 34 La operación OR

expresión, expresión, Resultado
EN FALsO FALSO,
FALSO. VERDADERO. VERDADERO.
VERDADERO ALSO VERDADERO

VERDADERO VERDADERO. VERDADERO.

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 133

Análisis del programa

La ejecución del Programa 3.9 produce:

= 0.000000

1.000000
1.000000
1.000000

Nétese que la variable resultado es de tipo float. Se recomienda que el lector
prucbe con otros tipos de datos, Esta variable se usa para almacenar el resultado de
cada operación OR.

La primera operación (0 || 0) realiza el OR lógico de dos valores FALSOS (repre-
sentados en C como ceros) produciendo como resultado un valor FALSO que corres-
ponde con un O en la variable resultado

Las tres siguientes operaciones (0 || 1), (|| 0) y (1 || 2) 5e evalúan como VER-
DADERAS almacenándose, por tanto, un | en resultado.

Operaciones lógicas y de comparación (relacionales)

Los operadores de comparación relacionales se pueden usar conjuntamente con los
operadores lógicos, ya que devuelven valores VERDADERO y FALSO que son los
mismos usados por los operadores lógicos. La Tabla 3.5 muestra el orden de prioridad
de los operadores presentados hasta ahora. Este orden indica que el operador ! se
evalúa antes que el *, que a su vez se evalúa antes que el <, y así sucesivamente.
En la tabla se muestra un nuevo operador denominado NOT lógico que se repre-
senta mediante el símbolo ! Obsérvese que la tabla muestra en qué orden se ejecutarán
las operaciones contenidas en una línea de un programa cuando ésta incluya más de
una. El siguiente ejemplo muestra el uso de esta tabla y el de la operación NOT lógico.

Tabla 35. Procedencia en €

Operadores Nombre

: Negación (NOT) lógica

ay Multiplicación y división
Suma y esta
Menor, menor igual, mayor 0 igual, mayor
fava, into

ee Comjunción (AND) lógica

" Disyunción (OR) lógica

134 PROGRAMACIÓN ESTRUCTURADA EN €.

Elemplo 37 Calculs

Solución

A. Se debe analizar primero el valor lógico de la operación contend en los paréntesis
internos. En este eso, (5 == 5), es VERDADERO por lo que no es necesario vlc

resultado de la siguiente operación, puesto que e resultado final de una operación OR:

siempre VERDADERO si al menos uno de los miembros dela expresión OR es VERI

ERO. El compilador de € usa este mismo método de anisis sólo eval

parte de un OR si la primers es FALSA.

Usando el mismo método se determ

tratase de una operación AND, no será necesario evaluar (6 != 7) que sc

RO). puesto que una operación AND con algún miembro FALSO devolverá siem

FALSO. El compilador utiliza el mismo método también en ete caso: sólo se evalua

segunda pate de un AND si la primera es VERDADERA,

Esta expresión usa el operador NOT lógico. La evaluación de

VERDADERA. Puesto que se

segunda parte

do Final será

nero que la expresión ($

primera parte (8 >= 5;
de una Operación AND, Será necesario evaluar
(045 <=21). Al sor ambos paces de In expresión VERDADERAS. el res
imbién VERDADERO.

Programa 3.10 muestra un ejemplo del uso combinado de operaciones de cur
lógicas. El programa leo un número y comprueba sí su valores
i, se imprimirá un mensaje.

centre |

Programa 3.10 #inelude <eedio.n»
maja

float numeros /* Valor proporcionado por el usuario. */

printf("\nindene un numero del 2 al 100
seant ("LE" unumero)

Ef Unusere >" 1.0) 4% [numero <= 10.09)
print£(-El numero leide osta entre 1 y 10



Análisis del programa

Observe la línea del programa que combina una expresión 10

if linunero >> 1.0) 6% (numero <= 10,00)

Esta senter

4 puede interpretarse como muest

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 135

55/1 Valor relacional

se

oor ean

Figura 3.11, Operación

ional gic,

Los paréntesis alrededor de las operaciones de comparación podrían omitirse ya

que el símbolo >= y el

Com!

ación de operaciones lógicas

denen mayor prioridad que el &&. Sin embargo, es reco-
mendable utilizarlos ya que se mejora la claridad del prog

Se puede usar cualquier combinación de operaciones de comparación y lógicas. Por
‘ejemplo, el Programa 3.11 usa una expresión lógica compleja que combina operacio-
nes AND y OR con operaciones de comparación. Dado un número del 1 al 100, esta
sentencia comprueba si el número está incluido en el 10% superior (del 90% al
100%) o en el inferior (del 1 % al 10%).

Programa 3.11 Hinclude <stdio.h>

rain)


float muero; — /* Valor proporcionado por el usuario. */

peint£(*\n\nbene un numero del 1 al 100

ScanE (*2£", anumere) :

SE (((numero >= 1.0) 6% (numero

10.00) 11

{numero >= 90.0) 4% (numero <= 100.0)))

printE("81 munero esta en 1042 inferior © superior de 100.

Programa de aplicación

El Programa 3.12 muestra una aplicación que usa operaciones de comparación y lógi-

‘eas, Este programa lee la temperatura de un proceso introducida por el usuario, aunque
lo podría haber obtenido a través de un sensor de temperatura conectado al computa-
dor, y produce un resultado que depende de la misma. La Figura 3.12 muestra la

estructura del programa.

136

PROGRAMACIÓN ESTRUCTURADA EN €

L

peepee do

ra 0K.

Top

es

"espesura demand bs.

AS

temgo 150
PELAGRO
Figura 3.12. Programa para probar temperatura

Programa 3.12 Hinclude <etaio.n>

aint

float temp; — /* Valor de la temer:

Princf"\n\nDene el valor de la temperatura

scan (-4£ temp) :

3£ ((eemp >= 100.0) áñ { temp <= 120.09)
printf (-Tenperatura correcta, continue el proceso

(temp < 100.0)

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 137

print£ (“Temperatura demasiado baja, aumente la energia.)
Af ((temp > 120.0) && (temp <= 150.0))

print£ ("Temperatura demasiado alta, disminuya la energía.”
se (temp > 150.0)

Printf("Peligro! Desconecte los sistenas.

Conclusión

En esta sección se ha demostrado la potencia que proporciona el uso combinado de
‘operadores de comparación y lógicos, Se han presentado ejemplos muy simples, así
como aplicaciones más complejas. En la próxima sección se explicará otro mecanismo.
que ayuda a la toma de decisiones. Antes compruebe su comprensión de los conceptos
presentados en esta sección mediante el siguiente repaso.

Repaso dela Sección 35

Describe cómo opera el AND lógico ¿Con qué símbolo se representa?
Describir cómo opera el OR lógico ¿Con qué símbolo s represent?

Describe cómo opera el NOT lógico.

Ponga un ejemplo del uso combinado de una oración de comparación y una lógica
Explica cómo se evalían as operaciones AND y OR.

3.6. CONVERSIÓN DE TIPOS

En esta sección se presenta información sobre lo que hasta ahora ha podido parecer un
simple «detalle» pero que, como se verá a continuación, puede llegar a ser muy impor-
tante en programas más complejos.

Tipos de datos

El lector recordará que todo dato en C tiene un tipo. Puede ser int. char 0 cualquier
otro tipo. El lenguaje C permite mezclar tipos de datos, Por ejemplo, se puede sumar
un valor de tipo ine a uno de tipo float.

Cuando se mezclan tipos en una expresión, el compilador converte todas las
variables a un único tipo compatible y a continuación se llevará cabo la operación
Esta conversión se realizará teniendo en cuenta el rango de cada tipo. Las variables de
un tipo de rango inferior se convierten al tipo de las variables con mayor rango. EI
rango de los tipos es el siguient

Rango inferior

-nar,intong,float double => Rango superior

138 — PROGRAMACIÓN ESTRUCTURADA EN €

AS. si se produce tna operación con un valor de tipo cha: y otro
será de tipo inc. St se trata de un tipo € uno int. el resultado será
recomendable, sin embargo. no mezclar tipos y. en el caso de que sea necesario, usa
el mecanismo de conversión de tipos,

resultado

Conversión de tipos

Este mecanismo permite convertir una vari

esta operación. se debe anteponer el nombr

variable, Por ejemplo, si valos estaba de
de la siguiente forma:

de a un determinado tipo. Para expresa
del tipo de dtos deseado al nombre de la
larado como tipo ine, se convertirá à tipo

resultado = (Llostivalo:

La opesación de conversión deber
rango superior a uno inferior, ya que podría produciese
un tipo de datos con menos capacidad de representación.

No se pueden realizar conversiones del tipo vota a cualquier otro tipo, pero si de
‘cualquier otro tipo a vor

nene cuando se pasa de un
pérdida de datos al utilizar

Valor-i

El uécanino valor- (/ralue) suele aparecer cuando se habla de lenguajes de pros

fica ieralmento valor de la part izquierda. refiriéndose a que la operación
de asignación asigna el valor del operando de la parte derecha a la dirección de memo-
ría indicada por el operando de la parte izquierda (valora). Por ejemplo. la sentencia
valor = 3 « 5; us legal en C. Sin embargo. la sentencia 3 + 5 = vazor: no lo es, puesto.
que la expresión que aparece en el lado izquierdo no es un valora (no indica una
dirección de memoria). Por lo tanto, el operando del ado izquierdo de una asjanación |
debe ser una expresión cuyo resultado corresponda con una posición de memoria mo- |
dificable, esto es. una expresión valora |

Conclusión

En esta sección se han presentado algunos detalles importantes del le |
aprendido como trabaja el lenguaje evando se mezclan tipos de datos diferentes. Se ht

visto asimismo cómo convert tipos de datos y se ha explicado el concepto de valor
Compruebe su comprensión de esta sección usando el siguiente repaso,

ica mero tipos de dos
Qué suce sudo se suma un tio in a un tipo €

Especie cómo tajo € orando se mezclan tipos de duos diferents,

3.7. LA

Programa 3.13

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 139

4. ¿Cómo se expresa un conversión de tipo en C?
5. ¿Qué es una expresión valora?

SENTENCIA swzrcH

Presentación

En esta sección se presenta un mecanismo que permite realizar una selección entre
varias posibilidades. En primer lugar, se justficará la necesidad del mismo para pasar
a continuación a definirlo y aplicarlo a un problema.

Selección de una alternativa entre varias

El Programa 3.13 es un ejemplo de selección de una entre varias alternativas. Este
programa muestra una de las tres formas de la ley de Ohm dependiendo de cuál elija el
usuario tecleando la letra correspondiente.

Hinelude <stdio.h>

main 0)
| char eleccions /+ Elección del

prinef("\ninElije la forma de la ley de Ohm que corresponda: Va”) x
Printf{-A} Voltaje 8] Intensidad €] Resistencia\n");
printf (Su eleccion (A, B, © C) => “I?
scant ("2e",keleccion) :
if (eleceton == A)
printf a D + RO):

ra)

printer = V / Re}:

else

if (eleccion
ECR

3)
vie

nt ("Eleccion incorrecta.\n") à

Análisis del programa

La Figura 3.13 ilustra la lógica del Programa 3.13.

10

PROGRAMACION ESTRUCTURADA EN C

[simian |

loción

a)

13. Lógica del Programa 3.13,

Figura.

Como se puede ver en la figura, el programa proporciona al usuario tres alterna
vas mediante el uso de sentencias i£. else. Observe el uso de la variable de tipo
chas en la selección. El usuario debe introducir una de las tres letras mayúsculas
siguientes: A, B, o C.

La selección so realizará usando sentencias de comparación como la

guiente:

le tolección == A)
printe(y an à ary:

Si la selección es igual al carácter A, se ejecutará la función prince). Si el
usuario no selecciona una opción correcta, se ejecutará el peines () asociado al último,
else

printf ("Eleccion incorracta.\n"):

Este tipo de programa, en el que se hace una elección entre varias posibilidades, 6

tan común que existe una sentencia especial en C para este caso. |

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 141

La sentencia switch

La sentencia suiren es una forma más fácil de codificar múltiples sentencias
AE, else, Esta sentencia tiene la siguiente sintaxis:

Switch (expresion)
(
case expresion-constante: (expresión)
default: (expresión)
>

Donde:
switch » Palabra reservada que indica el comienzo de est sen-
tencia.
expresion = Cuslquier expresión legal en C.
{Define el comienzo del cuerpo de la semencia
switch
caso = Palabra reservada que precede a la expresión cons-
tante que corresponde a una alternativa.
expreston-constante » Especifica qué debe cumplirse para que se active la
alternativa.
detaute = Palabra reservada que indica la opción quese levará
2 cabo cuando no se cumpla ninguna alternativa.
} Define el final del cuerpo del switch,

La sentencia switch requiere dos nuevas palabras reservadas: case y break. La
sentencia switch especifica una expresión cuyo valor determina qué alternativa case
se activará. El término break indica cuando termina de ejecutarse el código asociado a
una alternativa, El Programa 3.14 hace lo mismo que el Programa 3.13 pero usando la
sentencia switch en un lugar de varias sentencias i£.. „else.

Programa 3.14 sinelude <stdio.h>

saint)

char eleccion; — /* Blección del usuario. */
Print£("\ninklija la forma de la ley de Ohm que corresponda:\n*);
print£(-Al Voltaje 8} Intensidad C] Resistencia\n");
Printf("su eleccion (A, B, 0 CI =>“):
scant ("de” ‚uoleceion) ;
suitentelecelon)

case ‘AY: print (eV =r Ry
break
case (Be: printer ev RO:
breaks
case “Cs princkien = Y / 1
break;

12

Finelude esta

PROGRAMACIÓN ESTRECTURADA EN €

tlece

Análisis del programa

Este pr
sente

11 muestra que es más Feil leer el el
switch en vez de múltiples sentencias À
Enel programa se observa que la variable elección es do tipo char y que, por amo, |
as etiquetas asociadas a cada case deben ser del mismo tipo CA”, "By °C),
vertambién cómo están sangeadas hacía La izquierda la Have de apertura y a de cier
para que se identifique claramente donde comienza y termina la sentencia teh,
Otro aspecto importante es el comentario que sigue a la llave de cierre que permite
recordar que se tata del fin de una senten ‘on. Es una buena costumbre inchir
un comentario, sobre todo cuando existe una lista de alternativas muy larga, Obsérve-
se también cómo está sangrada la sentencia break para idemificar claramente donde
termina la ejecución de cada alternativa, Como antes. si no se seleccionó ninguns
allemativa válida, el programa ejecutará la sentencia asociada a dofaute

ma cuando se ut a)

defaut

(Elección

Se pueden usar también sentencias compuestas dentro de un

Sentencias compuestas en un switch

Como muestra el Programa 3.15, se pueden usar sentencias compuestas dentro de un
eich. Este programa permite seleccionar al usuario uno de las formas de la ley de
Ohm y realiza los cálculos correspondientes a la misma,

maint)

char eleccion: 1 elecetén dot usuario. +/
float voltaje, /* Voltaje del circuito en voltios
float intensidad; b+ Intenzidad del circuito en amperios. */
float resistencia, istoncia del eireulto on ohnios

print£("imintlija la forma de la Ley de Ohm que es oa
peint£ (sal Voltaje 81 {nd €} Resistencias

Printfi"Su steccion (A, Mm. 00 -

Scan£(-$c-, «ulece

suitenetecelo

nett Introduzca ta À

ampor

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 143

scant ("48 ,gintensidad) :
printé(-Valor de la resistencia en ohmios =>"):
scant("40”,Lresiotencia) ;
voltaje = intensidad * resistencia:
print£(”El voltaje es 2E voltios. *.voltaje);
»
break:
caso “8':(/* Câleulo de la intensidad. */
prints("Introduzea el voltaje en voltios => “I;
Scant ("8E*,avoltaje):
printe(-Valor de la resistencia en ohmios => *);
Bean (“28 ,aresistencial
intensidad = voltaje / resistencia:
prints(“La intensidad es %f amporios.”, intensidad);
1
bres
caso C':{/* Cálevlo de la resistencia. */
print£("Introduzca el voltaje en voltios =>“):
Beant ("8E" voltage):
printé(‘Valor de la intensidad en amperios
scant("4£”, kintensidad);
resistencia = voltaje / intensidad;
printe(sLa resistencia es tf ohmios.
>
break:
default: printé(Eteccion incorrecta.\n"):
prinef(-Bjecute el programa seleccionando A,
Fin del sulteh, */

>

resistencia):

La Figura 3.14 muestra la estructura general del programa.

Obsérvese la estructura de bloque usada en el switch, Esta estructura facilita la
lectura y comprensión del código del programa. Nótese cómo está sangrada la senten
cia compuesta y cómo quedan claramente definidos su comienzo y fin mediante las.
llaves. Fíjese también en la posición del break que identifica donde termina el cuerpo
de cada opción. Aunque al usuario del programa le es indiferente la estructura del
mismo, es muy importante para cualquiera que desce comprender o modificar el pro-
grama que su estructura sea lo más clara posible.

Análisis del programa

¡portante del programa es el uso de sentenci

La característica más i
dentro de un euizen.

avitehteleccion)

case “A's(/* Cálculo del voltaje. */
printf("Introduzca 1a intensidad en amperios

144 PROGRAMACIÓN ESTRUCTURADA EN C

scant ("26", kintonsidad) ;
printf (-valor de la resistencia en ohmios => ");
scant ("2E", gresisvencia)

voltaje = intensidad * resistencia;

print£("El voltajo es tf voltios.” voltaje)

i

break:

=

|
LÉ rt

eV le

'

ce

ed, a
sas Pingu Y

Figura 344, Esrucura gene

dal Programa 35.

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 145

Si se selecciona esta opción (eteccion=*A"), se ejecutará toda la secuencia de
sentencias incluidas en la sentencia compuesta,

‘Como el lector ya habrá imaginado, se pueden incluir llamadas a funciones dentro
de un switch,

Sentencia switch con funciones

Además de poderse incluir sentencias compuestas dentro de un switch, se pueden
también realizar llamadas a funciones desde el mismo. Se deja como ejercicio para el
lector modificar el programa anterior para que en lugar de usar sentencias compuestas
dentro de las opciones del sui en, se definan funciones para cada una de las opciones
y se realicen llamadas a las mismas desde dentro del switch. Con esta estructura
mejorará considerablemente la legibilidad del programa.

Expresión de selección

La expresión que determina qué alternativa del sut von se activa puede ser de tipo Sat
O char, pero no de tipo float.

Sentencias switch anidadas

Se pueden incluir múltiples sut en dentro de otras sentencias sui ch, La Figura 3.15

Conclusión

En esta sección se ha presentado la sentencia switch mostrándose su estructura y las
diferentes formas de usarla. Se ha visto también que se pueden usar sentencias com-
puestas dentro de un suicch, así como realizar llamadas a funciones.

En la próxima sección se presentará la última sentencia que permite realizar toma
de decisiones. Antes de pasar a ella, compruebe su comprensión de esta sección me:
diante el siguiente repaso.

Repaso de la Sección 37

Para qué so usa la sentencia wien?
¿Qué palabras reservadas además del propio swicch, se usan con eta sentencia?
Explique el propósito de I palabra reservada dofaute dentro de una sentencia switch,
¿Se pueden hacer llamadas a funciones dentro de una sentencia sico?

146

PROGRAMACIÓN ESTRUCTURADA EN C

sue)

Figura 345.

ich)

site)

|

Visión conceptual de altematvas dentro de un ewitch.

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 147

38. MÁS SOBRE LA SENTENCIA switch
Y EL OPERADOR CONDICIONAL

Presentación

Esta sección presenta una nueva aplic
ar la exposición de los mecanismos que proporciona el lenguaje C para la toma de
decisiones.

Otro uso de la sentencia switch

Recuerde de la última sección que la sintaxis de la sentencia switch es la siguiente:

witch (expresion)

break:

Como se podrá ver a continuación en el Programa 3.16, la sentencia break es
importante para determinar la lógica del switch. El programa muestra las fórmulas
requeridas para calcular la potencia suministrada por una fuente de potencia en un
circuito serie con tres resistencias, El usuario sólo debe especificar qué parámetros del
circuito se conocen. Nótese que se ha omitido el break del switch.

Programa3.16 ¥inciude <stdlo.n>

maint)
fi
char eleccion; — /* Elección del usuario.

printf(-Este programa muestra las formulas necesarias paraln”)z
print£("calcular la energía que proporciona una fuente de \n*);
printf(svoltaje a un cireuito serie fornado por tres \n”);
printf (“resistencias conociendo el voltaje de la fuente\n");
princf(*\n\nelija usando la letra correspondiente: \n"):
print£l"A) Se conoce el valor de las resistencias.\n"):
printl("B] Se conoce el valor total de la resistencia\n’);
printf (-C} Se conoce el valor total de la intensidad\n
Print£("Su elección =>“);

Scanf ("te ‚Lelecaton)

switch (eleccion)



case ‘A’: printEl-Rt = RL + R2 + RO)

148 PROGRAMACIÓN ESTRUCTURADA EN C

case “Bs printé (re = Ve 7 Rear)

case °C'! printé(-Pe = ve * tee
break;
default : printt(-Eleceion Incorrectat\n)
Y Je Fin del switch. */

Análisis del programa

A continuación se muestran las diferentes respuestas del programa dependiendo de à
elección del usuario

1. El usuario introduce la letra A:

Su elección => à
RES REY R2 Ra
Fes ve / Rt
Pes vet ie

El usuario introduce la letra B:

Su eleccion => a
Te = ve / Re
SES

El usuario introduce la letra C:

Su eleccion => €
ES

4. El usuario introduce la letra T:

Eleccion incor

Lo que ha sucedido se debe a la omisión de la sentencia break

suicch{eleceion)
(
case "A: print£ient = RL + R2 + Rdn“
case *B*: printé(-Te = ve / RE):
caso °C’: peinee(sPe = VE * Te\ar):
break;
default + printé(-Eleceion incorrecta!\n") ;
3 /* Fin del swicen. */

Obsérvese que si el usuario introduce una A, se ejecutarán todas las sentencis
hasta el primer break. Si no existiera este break, se ejecutaría también la sentencia
asociada a default. Como muestra la Figura 3.16, cuando se activa una opción, $
ejecutarán todas las sentencias que aparecen desde ese punto hasta el primer break?
hasta el final del evi ven.

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 149

LZ

me

——

y

y

pl

4 |
LES

a

y

y

|

|

==

T

Figura 3.16. Alernativas sn rule.

El operador condicional

El último mecanismo disponible en C para que un programa pueda tomar decisiones
es el operador condicional cuya sintaxis es la siguiente:

expresion, ? expresion, : expresión,

Lo cual implica que si expresion, es VERDADERA (cualquier valor distinto de
cero), el operador condicional devuelve expresion,. En caso contrario, devuelve ex-
preston,. El Programa 3.17 ilustra el uso de este nuevo operador.

150 PROGRAMACIÓN ESTRUCTURADA EN C

Programa 917 include <stdio.h>

saine
(
ine eleccion: — /* Elección del usuario, /

printEl"Introduzca un 10 un 0
scantíta",koleccion);
cecion? prine£ (“Un uno.1n") + print£(-Un cero.\n);

on

Análisis del programa

En este programa, si el usuario introduce
mostrará lo siguiente:

n 0, se ejecutará

segundo peint£4) que

Si el usuario introduce un 1 (o cualquier valor distinto de 0), se ejecutará el prin
prine£ ( que mostrará lo siguiente:

Lo que ha ocurrido es que el valor de elección ha determinado cuál de las ds

siguientes expresiones se ejecutará.

Una aplicación del operador condicional

la aplicación del operador condicional, se toma como base el circuito eléc]
mostrado en la Figura 3.17.

a,

vormur
PONTE

a 2) um

Figura 3.17, Circuito aplicación para un operador condicional.

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 151

En este circuito, el dispositivo denominado LED (ligt emitting diode, diodo emi-
sor de luz) no conducirá intensidad hasta que el voltaje que se le aplica sea mayor que
2,3 voltios. Cuando esto sucede, los incrementos posteriores del voltaje de la fuente no
implicarán cambios en el voltaje del LED, produciéndose la caída del voltaje restante
cen la resistencia. Para calcular la intensidad de la corriente en el circuito, se divide la
caida de voltaje através de la resistencia entre el valor de la resistencia, Como muestra
el Programa 3.18, este cálculo puede realizarse fácilmente usando el operador condi-
cional.

Programa 3.18

Finelude <stdio.t>

sain)

1

float voltajo_Jed: I" voltaje en el LED en voltios. */
float voltaje resistencia; /* Voltaje en resistencia en voltios. */
float voltaje fuente; + voltaje de la fuente en voltios. */

Float intensidad_cireuito; /* Intensidad en el LED en amperios. */
float resistencia: J+ Valor de la resistencia on ohnios. */

printé(*\m\ninevoduzca el voltaje de la fuente en voltios =>“):

Scant ("af gvoltaje_fuente) ;

printf (-Introduzea el valor de la resistencia en ohmios => “13

acan£ ("2E", aresistencial

voltaje_led = (voltaje_fuente < 2.31? voltaje_fuente ı 2.34

voltaje_resistencia = voltaje_fuente - voltaje_led:

incensidad_cireuito = voltaje_resistencia / resistencia:

printf ("La intensidad total del circuito es f anperios.”,
intonsidad_circuito)

Análisis del programa

Suponiendo que el usu
expresión:

io del programa introduce un valor de 2 voltios, la siguiente

(voltaje_fuente < 2.3)

será VERDADERA. Por tanto, se asignará voltaje_£uente a la variable vorta~
jetea.
‘A continuación, se evalúa la sigui

nte expresión:

voltaje_resistencia = voltaje_fuente - voltaje_lea;

152

PROGRAMACIÓN ESTRUCTURADA EN €

que dará un valor de 0 para el voltaje de la resistencia.
expresión:

idamente se ealeuly jy

& volverá a dar 0, Este es el resultado correcto ya que sí el voltaje en el LED e,
nor de 2,3 voltios, no circulars corriente por el Circuito.

Suponiendo ahora que el ustario introduce un valor mayor que
ejemplo 5 voltios, para el voltaje de la fuente, la expresión siguiente:

3 volts, par

será FALSA. As

sa un valor de 2,3 voltios de



lor de 2.7 voltios para el voltaje de la resisto
rminado por el valor de Ja resistencia que introduzea el

Conclusión

eecidn ha mostrado cómo usar la sentencia si ect variando la utilización del
ba presentado también el operador condicional y un ejemplo de su us.
ye que ha asimilado correctamente los conceptos de esta sección eon els
guiente repaso.

Repaso de I Sección 38

Esplique o foco de omit el

ate sempre se je?
ul
alor cuisines o

pique cómo funciona el eps co

1
2. ¿Qué e necesi
3

Qué valores isos VERDADERO a oy

3.9. DEPURACIÓN E IMPLEMENTACION

DE PROGRAMAS

Presentación

En esta sección se muestra un método para seleccionar qué partes de un pl
serán compiladas y qué partes no, El nombre de este método es compilación cou

I y se usa a menudo cn pro indes que necesitan considerar muchos
«condiciones diferentes,

Dire

iva condicional

Las Tabla 3.6 mues 1 de las directivas de compilación disponibles en €.

Programa 3.19

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 153

‘Tabla 36. Instrucciones de compilación condicional

Instrucción Significado
Este El código que sigue a est insteución e compil en cies circunstancias ero no
rendit TerminaIa compilciôn seleccionada desde el #1 fae amero.

tels0 Presents una opción de compilación

El Programa 3.19 muestra el uso de estas directivas para realizar labores de depu-
ación de un programa.

Hinelude <stdio.h>
Fdetine DEPURACTON — /* Depuración activada. */

maint)



Aitdet DEPURACION /* Si depuración activada, hacer lo siguiente: */

printf(-Seccion de depuracion del programa.\n"):
printé(-Este mensaje aparecera solo si se define DEPURACIÓN. An");
dendi£ DEFURACION /* Fin de la sección de depuración. */

print£("parte principal del programa. a”);
Brint£(-No depende de sí esta definido DEPURACION © non");

diaes DEPURACIÓN
printf (‘Aqui termina la depuración.An")z /* Si depuración
activada. */
Heise DEPURACIÓN
print£("no se ha usado depuracion.\n-): /* Si depuración
desactivada. */
Sendi£ DEPURACIÓN
>

El programa producirá la siguiente salida:

Seccion de depuración del programa.
Este mensaje aparecera solo si se define DEPURACIÓN.
Parte principal del programa

Ho depende de si esta definido DEPURACIÓN © no

Aqui termina la depuración.

Para lograr que el compilador ignore la parte de depuración, sólo se necesita elimi-
nar la definición de ozeuracrow, lo que se puede hacer poniendo dicha definición
entre comentarios:

J+ ¡defino DEPURACIÓN */ /* Depuración activada. */

154

3.10.

PROGRAMACIÓN ESTRUCTURADA EN €

Cuando se hace esto. el programa producirá la siguiente sali

Conclusión

En esta sección se ha mostrado el uso de las directivas de compilación condicional gu
permiten seleccionar qué partes del programa se compilarán. Se trata de una caracte
Fistien que generalmente se usa en programas grandes. Compruebe su comprensión de
esta sección mediante el siguiente fepaso,

Kepa dela Sesión 39

1. ¿En gus comi

à compilación condicio

2. ¡Qué es una directs de compilación?
3. Explique el propósito dela diretiva #3 te
44. ¿Dónde se san normalmente ls revs de compilación condicions?

PROGRAMA DE APLICACIÓN: REPARACIÓN
DE UN ROBOT

Presentación

En esta sección se muestra unt
toma de decisiones ira
mente bastante populares. S

» dentro del campo de In tecnologia de a
na, Los diagramas de reparación son actua:

nats de flujo que dirigen al técnico durant
sta sección muestra cómo desarrllar ut
miento de un diagrama de este tipo para el eu |
¡ción de un robot, Este es un primer paso hacia la reparación dirigida per
‘computador donde éste se encarga de realizar las medidas reales (a través de los ir
cuites de imerfaz correspondientes) y la el problem real.

El robot hipotético

3.8.

El propósito es erear un programa C que replique el comportami
ama, Por motivos de simplicidad, scrá el usuario del programa cl en
uroducir las valores requeridos por el program,

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 155

co
Ry
certs página 2
ai vote en ina ic
Paie de ar | neo ep
oT Te ve
EA = Eu
psy FETES
Desconectar] — | Dsconscarcl mor | [tem aro Les
(mms | bare y voters Ll pis 85 dt mat e |
‘ltrs [mile en Ten. [| in ls epa
pasta de VS
on
Probie ‘Sein creado del
fe dadas laminas
Rojo [= passe
ras Desconec poires | [pcs preci] [Sexi
sid | em ts ‘sai ms |
ES A r.| |? to
“Susie suid Repair
puede bro. EA

Figura 3.18. Diagrama de Majo para un rbot hipottico,

Primer paso

El primer paso siempre es escribir lo siguiente:
+ Propósito del programa

+ Entrada requerida (fuente)

+ Proceso sobre la entrada

+ Salida requerida (destino)

Para el caso del programa que nos ocupar

+ Propósito del programa: Replicar la lógica de reparación de la Figura
pueda interactuar con el usuario.

+ Entrada requerida (fuente): Los valores numéricos que representan los valores del
voltaje medidos en los puntos de prueba. Las restantes entradas requieren una res-
puesta que seleccione entre múltiples opciones.

+ Proceso sobre la entrada: Los valores de entrada introducidos por el usuario dete
minan qué instrucciones se le indicarán al usuario o la finalización del prograr

+ Salida requerida (destino): Las instrucciones que le indican al usuario qué informa
ción debe suministrar al programa.

18 para que

156 PROGRAMACIÓN ESTRUCTURADA EN €

Esto deja claro qué debe hacer (y no hacer) el pro
esarrollar el algorimmo.

Desarrollo del algoritmo

ama ya está i me hecho, puesto que eld

ión es un algoritme gráfico. Lo único que hay que hacer es seguir la

ama. El resto del program serä el prólogo estándar que incluye La informació]
ua, su explicación y la descripción de sus funciones, Esta información.
fase inicial

Fase inicial de desarrollo

En esta fase, el programador debe construir una primera versión que
del programa, el nombre de su autor y el propósito del programa. El nico prototipo]
que aparecerá en el programa será el correspondiente a una Función que explique a

trio el propósito del programa mostrándolo por la pantalla cuando se ejecute el
pr la documentación del programa queda incluida en el mismo]
evitándose tener que consultar otros documentos.

a cl nombre]

Fases intermedias de desarrollo

Durante estas etapas, el programador irá construyendo de forma incremental las di

tintas partes del programa, Deb ficar qué funciones formarán parte del pro
à y especificar sus prototipos. Asimismo. se escribirá la estructura de la función

y con as Mamadas las

progresiva cada una de éstas. En

totalmente especificadas mientras que otras es

les denomina suplentes del program

Programa final

3.20 presenta el desarrollo final del programa de reparación del robot
hipotético. Nótese que en & se han wilizado la mayoría de las técnicas de toma de
decisiones presentadas en este capítulo.

Programa 320

Hineivae cardio.

Repara
Desarrollado por: Robert

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES

Este programa muestra al usuario el proceso de análisis y
Teparación de un robot hipotético. El prograna también
muestra las diferentes facilidades disponibles en el
Tenguaje € para la toma de decisiones

pescripeión:

variables:

pedida Medida en voltios tonada por el usuario
Setado_tue = Valor del estado de la luz introducido por el usuario.

constantes: ninguna

prototipes de funciones:

vota explicar_programa (void);
Este función explica al usuario el funcionamiento del programa.


floor brazotvoidl;
if
Esta función contiene la rutina de servicio de) brazo del robot.

void unidad_de_potencia (void) ;
Esta funeién es la rutina de servicio de la unidad de porencia.

void conprobar_luz (void) +
Esta función muestra las instrucciones para comprobar el estado del

indicador luminoso,

“Y

void desconexión dispositive brazo(void)

Esta función muestra las Instrucciones para comprobar la unidad de

desconexión del dispositivo del brazo.

mine
oat medida; Je Media introsuciéa por el usuario, */

oxplicar_programa(); /* Explicar el programa al usuario. */
medida = brezo(); | /+ valor de la medida del brazo. */

157

158 — PROGRAMACIÓN ESTRUCTURADA EN C
Sf (medida > 35) unidad de_potencia()
else
Sf ((medida <= 35) 6% (medida >= 30)) comprobar_luz()+
else
AE medida < 30) desconexion dispositive brazol):
exit (0):
ä
void explicar_prograna(void) /* Explicar el programa al usuario. */
0
IntEI"\n\nEste programa representa la reparacion\n”);
print£(rde un hipotetico robat.\n“);
printf(-\nla informacion que usted introduzca simulara las An");
printf ("medidas reales que se tonarian directonente del robot.\A");
print£{-\nE programa le ira pidiendo las medidas quen”);
Print£(dobe ir introduciendo. n°) à
3
float brazo(void) — /* Realiza la rutina de servicio del brazo.
A
float medida; /* Medida introducida por el usuario. */
print£(*\nliida el voltaje en el punto de comprobación #\n") :
print£("Su medida en voltios =>");
sean "RE" media) à
return (medida) y

void unidad_de_poteneial) /* Instrucciones de servicio de la unidad de
potencia. */
\
Print£(”\ntonsulte en el manual la prueba de la unidad der”)
Printf("poreneia y reenplace la unidad de potencia del brazo.
+
void comprobar. luzt) — /* Comprobación de indicador de estado. */

int estado_luz; /" Estado de la luz introducido por el usuario. */

Printf("\nIntrodusca en que condicion esta la luz de estado:\n");
prínt£(“1) Rojo 2) Verde 3) Apagado Na”):

print£ ("Introduzca el numero =>");

scant("1a",Lostado_luz) :

ouitehtestado_luz)

ñ

case 1: printé(-Desconecte la alimentacion y reemplacern”);
prinef(rel fusible FL. \n°1;
break:

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 159

case 2 : print£(“Desconecte la alimentación y reenplace\n");
Priatf("la placa del dispositivo del brazo.\n”)z
break:

case 3 + printf (*Reemplace la bombilla.\n"

break:
default + printE(“Seleccion incorrecta!\n");

printf("\nRepita Ja rutina de servicio. \n")

desconexion_dispositivo-brazo() /* Instrucciones del dispositivo
del brazo. */

float medida; — /* Madida hecha por el usuario. */

printf (-Desconecte el dispositivo del brazo y vuelva An"
Drint£("a medir el voltaje en PP#1.\n");

Deint£("Su medida en voltios =>");

Beant ("86 émedi da) +

medida = (medida > 30)? 30 + medida;

Af (medida < 30)


print£("Reemplace la unidad de potencia del brazo. \n“):
Print£("Consulter la página 183 de manual, Juego repitaln”)
prine£(-la prueba SvS."):

>

else

Af (medida == 30)


Printf("Roomplace la placa del circuito del dispositivo\n");
Print£("del brazo. Consulte la pagina 235 del manual den”);
print£(*servicio, luego repita la prueba.*);

Análisis del programa

Obsérvese la estructura de nasa) que básicamente refleja la del diagrama de flujo de
reparación. En dicho diagrama, la primera medida es el voltaje en el punto de prueba
1. A parir de esta medida, el programa puede bifurcar a una dirección de las tres.
posibles, Después de llamar a la función explicar_programa (), se invoca a la fune
ción brazot) cuyo valor devuelto, que es de tipo float, se almacena en la

PROGRAMACIÓN ESTRUCTURADA EN €

variable sedida. El resto del programa queda condi
dentro de la s Construcci

ado por este valor que se uyy
A£....olse ¿£.. else

Sf (medida > 35) unidad_do_potenesat):
else
E (sedida <= 35) Au (medida >" 300) comprobar_ lue 0);

else
TE (medido + 30) donconexien_disposi

De esta forma, la lectura del código de la fu
eral de La estructura del programa.

in maint) proporcion

Se deja el análisis completo de este programa pura la sección de auto-evaluación,
Conclusión
En esta sección se ha presentado un programa de aplicación que ha usado la mayor

de los mecanismos de toma de decisiones disponibles en C. Se ha mostrado de nuevo
la estrategia de desarrollo incremental de programas. Compruebe con el siguiente
repaso si ha entendido correctamente los conceptos de

paso de a Sección 3.10

41 ese primer paso en el desarollo de cl

ic programs?
{Pana qué sirve un diagrama de reparación?
Defina qué es un suplente del progran

¿Qué representan para el program Jos datos introduces por el usario

PROGRAMAS DE APLICACIÓN ADICIONALES

El Programa 3.21 realiza la conversión de un número de decimal a hexadecimal. El
"número introducido por el usuario se divide en dos mitades y cada mitad tiene cua
bits que contienen un número del 0 al 15. Usando un switch, los valores del (0 al 15
se muestran en la pantalla con la letra correspondiente (de la A a la P). q

Programa 3.21 #inelude <stdio.h>

void ahextine nd:

print£i-Introduzen un
Bean (nie enr

entero del 0 at 255 => *

Programa 2.22

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 161
a +n/16: /* Obtiene el valor de los 4 bits superiores. */
b=n416 /* Obtiene el valor de los 4 bite inferiores. */
ahex (a):
hex tb) +



void ahex(int al

Sf (in sa 0) au In <e 9)

printf (-6i-,n)
else
i
suicchin)
\
caso 10 + prinekt-Ar); break:
case 11 : printf(-B"); break:
case 12 + printé(-c"); break:
a prine£("D-); break;
case 14 + printt(-E-); break:
case 15 + printé(#F"; break:
default + printé(-Errort\a");

‘Se muestran a continuación el resultado de dos ejecuciones para ilustrar la conver
sión a hexadecimal realizada con la ayuda de la función ahox)

Introduzca un entero del 0 al 255 => 100
6

En esta primera ejecución, el numero decimal 100 se convierte en hexadecimal
dando un valor de 64, Sin embargo, esta conversión no utiliza la sentencia switch ya
que ninguna de las dos mitades del número es mayor que 9. En la segunda ejecución si
se necesita el switch para convertir la mitad superior del número 200.

introduzca un entero del 0 al 255
co

=> 200

Obsérvese que este program sólo tata números de $ bits. ¿Es posible convertir
números de 16 bits?

En el Programa 3.22 se usa la recursvidad para programar el algoritmo de Bucli-
des (300 a.C),

Hinelude <staio.h>

int euclidtint a, int b):

162 PROGRAMACIÓN

Programa 3.23

STRUCTURADA EN ©
saint)

int mi /* Primer nümero leide */
int ay Segundo nimero leído */

print ("Introduzca el primer numero => *);
scant ("37 2m);

print£(*Introduzca el segundo mune:
Sean (ui, am

print£("\nél MOD de ti y ti os 4i-.m.n.euclid{m,n)); }

on

int euclid(int a, ine bi

se (o << 0
else
return ouclidib,a € bi:
;

El algoritmo de Euclides se usa para encontrar el máximo común divisor (MCD)
de dos enteros. Por ejemplo, ¿cuál es MCD de 40 y 100? Los factores de estos né.
ros son:

|

Como ss pued ser, e mime divisor de ambos números ese 20, La función |

20 encuenta est número de forma recursiva usando el orador resto (La
ción del programa para dicos números produce la siguien salz

ej

Introduzca el primer mumoro => 40
Introduzca el segundo munaco => 100
El XCD de 40 y 100 es 20

Intento también con estas parejas de números: 9 y 27, 9 y 28, 36 y 544,
El Programa 3.23 se ocupa de un tema importante para los usuarios de computado:

ros: la velocidad de la memoria, El programa calcula este parámetro para dos tipos de

sistema de memoria comunes: la memoria caché y la memoria entrelazada,

Hinclude <stdio.h>

float Cachor (void):
Float Rañer (void); main()

main)
ñ

char elaccion; /% Plección del usuario. */

float races /* Tiempo de acceso en nanosegundos. */

print (-Que le gustaria caleuar?\a-):
print£("1) ‘Tiempo medio de acceso a la cache\a):

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 163

print£("2) Tiempo de acceso a la RAM entrelazada\n")
print (“Eleccion ? “à
Scan (3e, Leleceion) ;
switch (eleccion)
case '1* : Tacc = Cacher(); break:
cage 12° : Tace = RAKer(}; break:
dofault : printf(-Perdon. Esa eleccion no es valida.)

>
if (eleccion == +1) [| (eleccion == +27)
Printf("\nEl tiempo de acceso es 4f nanosegundos.”, ace) à

>

float Cacher()

float tac: /* Tiempo de acceso a la cache. */
float ran; /* Tiempo de acceso a la RAM, */
float hit; /* tasa de aciertos. */

Pprint£("Introdusca el tiempo de acceso a cache (en nanoseg.) =>
Sean ("2E", bra);

printE(-Introduzca el tiempo de acceso a RAM (en nanoseg.) => "1;
scant (*2E", gram);

printE("Introdozca 1a tasa de aciert
scant ("267 chit)

return (Unit * tac) + (1.0 = hitht(tae + aml

oy:


float rater()
float /* Nimero de módulos de RAM. */
float ram /* Tiempo de acceso a la RAM. */

printE(-introdurca el numero de modulos de RAM =>
‘scant ("¥6", an)

print£("Introduzca ol tiempo de acceso a RA (en nanoseg.)
scant ("at gram);

return (ram / nl;

En un sistema de memoria caché, se usa una memoria de alta velocidad denon
da caché. Este tipo de memorias son típicamente diez veces más rápidas que las me-
\do de estos dos tipos de memoria proporciona
un tiempo medio de acceso que está comprendido entre los tiempos de acceso de cada
tipo. Este tiempo medio de ucceso está influenciado por un tercer parámetro denomi-
nado tasa de acierto, Una tasa de acierto de 0,85 significa que el 85 % de las veces el
dato pedido se encuentra en la caché y el 15% restante se encuentra sólo en la RAM,
por lo tanto, el tiempo medio de acceso será una mezcla de ambos, Suponiendo que el

164 PROGRAMACIÓN ESTRUCTURADA ENC

Programa 3.24

tiempo de aeceso a la caché es de 10 nanosegundos y el de la RAM de 70 n
dos, la ejecución del programa produce el siguiente resultado:

nosegtn,

21 Tiempo de acceso à la RE enteelazatla

Elección ? À

Introduzca el tiempo de acceso à cacho (en ninosed.)
el tiempo de acceso à RAM fon nanoseg.) == 10
Introduzca la Lasa de actortos => „85

1 tiempo de acceso es 20.499998 nanosegunden

da por varios ml:
los de memoria idénticos conectados de manera que se puedan acceder simula.
mente. Gracias à ello, ch tiempo medio de acceso es el tiempo de acceso de un módulo
dividido por el número de mó muestra à contin saltado producido
por el progeama en este caso,

11 Tiempo medio ache
21 Tiempo de acceso a la RAK entrelazada,

duzca ei numero de moc 1.8
troduzea el tiempo de acceso a RAN (en nanosan.)

Uilice el programs para calcular cuáimos módulos de memoria de 80 ns, se neces
tan para conseguir un tiempo medio de acceso de 16 ns.

El último programa muestra el uso de ls operación AND Dinar ama
se basa en lo que se espone a contimuación. La representación ASCU de La letra “4
tiene el valor hexadecimal 61. La representación de la Tetea "A À valor hevado
«imal AL. Comparemos

Obsérvese que sólo se diferencian en el valor del bit 5. En gener
quier letra minúscula se puede convertir y mayúscula pont
5:40, lo val puede hacerse haciendo un AND binario del cl
Ta OXDE que contiene un 0 en la posición correspondiente al bit 5. El Pr

muestra el uso de esta técnica,
Finelude <stdio.h>
1

Programa 325

Programa 3.26

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 165

m2 ke Onde:
Printf("sete\n”,al.n2);

Este programa produce el siguiente resultado:

ni
m

¿Qui sucederia si se aplica eta estrategia a un código ASCII que no se correspon-
da con una letra (por ejemplo al "0° 0 al =")?

Ejercicios interactivos
DIRECTRICES

La relación de ets ejercicios requiero tener acceso a un computador con un entorno C. Se han
incluido aqu para permite adquirir una valiosa experiencia y, lo que e más important, para tener una
realimentación inmediata de o que hacen os concepts y mandatos presentados en est capítulo. Además
on divenidos

1. Intene averiguar qué imprimé este program.

Hinelude <stdio.h>

pain)
\

printt(-que es esto => 147,15 > 3);
>

2. Et Programa 3.26 usa operadores binarios. Nótese que la entrada están base decimal mientras que la
sald está en base hexadecimal Itene averiguar qué imprimirá este programa.

Hinelude <stdio.h>

saint)

char biti:
char bit

biel = 5
bit2 = 10;
prince("ax\nr, bitlsbit2):

printé(“tx\n", bitiapit2);
peine (rx\n", bielabie2);
prinef (rune, biz):

166 PROGRAMACIÓN ESTRUCTURADA EN C

3. Program 827 muestra el uso del AND lógico. nte averigo

Programa 327 ¥iseiute >

printf ("Que es esto e td" 41 da 271)
=|
4. HY Programa 328 mest el so del OR lógico. Inne argu qué impr ese programa,

Programa 328 ¥inciude <aedio.¥

minti
\

prineélroue en esto => 44,10 12 39905


5. 1 Programa 3.29 comen un sonen lógica compleja. ment aerigu qu

inpeimich seo]

Programa 3.29 #include “sudio.h=

mainly

_togien
Que e

TA
0 + vd variable logica:

6 ue ox más Hi de lc y

Programa 330

Hdefine VERDADERO 1
Fácfino FALSO 0
Haefine AND 4%
Aaefino OR |]
sacfine NOD!

main
c

jar valo

valor_logice = VERDADERO AND VERDADERO;
£ (valor logico) printt ("VERDADERO ) :
else printE(PALSO")

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES 167

7. Lex ol Programa 331 e inten

predecir su sia.

ma 331 vinclude <atdio.t>

La #define VERDADERO 1
Haefine FALSO 0
define AND te
Faetine OR |]
haefine NOP ı

saint)
‘i
int valor_logico;

valor_logico = VERDADERO OR NOT VERDADERO;
switch valor_logico)
c

case FALSO + printé l-FALSO
break:
case VERDADERO : print£ (*VERDADERO") ;

8. Lea el Programa 332 y lego jee.

Programa 932 #inciude <stdio.h>
define VERDADERO 1
define FALSO 0
Adetine AND 44
sdefine OR ||
Heefine nor t
Kdefine Comprueba_Este_Valor switch
Haefine Stop break:
Hdefine ES_El case

paint)
1
int valor_legico:

valor_logico = NOTIVERDADERO OR NOT VERDADERO) AND VERDADERO;
Comprueva_Este_Valor (valor_logico!
1
ES_El FALSO: printE(*BALSO") +
break:
ES_EL VERDADERO + print£ (-VERDADERO-)

168 PROGRAMACIÓN ESTRUCTURADA EN C

Autoevaluación

DIRECTRICES

Responda xls siguientes preguntas acerca del Program 3.20,

Preguntas

¿Cuántas funcions contiene el programa? Enuméreas
{Hay foneiones que contengan Bifurcacioss sbienas? Sh es as, ¿culo
¿Hay funciones que contengan bifueaciones corradas? Sh ex asi cess?
¿Qué funciones coniene un sich?

Explique el significado de la siguiente sentencia

medida + (medida > 30)? 30 :

Qué funciones devuelven valores?

¿Cuántas variables e usan en el programs?

¿Qué valores devuelven dichas funciones?
Por qué la variable extedo. uz no es de tipo #1092?

Problemas del final del capítulo
Conceptos generales

Sección 3.1

1." Espliqu les seis operadores de comparación pre-
sentados en ete capitulo.

2 ¿Qué valor numéro se usa para representar FAL-
SO? ¿Y VERDADERO?

3. Sie simbolo == signi gud. ¿qu siga

4. Indique el eesultado numérico de las siguientes ope-

$

raciones, dado we A=0.B=3y ©
Aw
D Bee
© CoA

Sección 32

5. Esplique el concepto de bifurcación abi

8. ¿Qué seenca se usa para a bifurcación aber?

7. ¿En qué consiste una sentencia compuesta?

8. ¿Se puede Manara una función desde dentro de una
Bifucaciôn aie?

Sección 23

9. Explique el concopto de Biuración ema

10. ¿Qué sentencia se ws par I bifurcación cod?

11. ¿En qué comsist un it. 0120 Compuesto?

12. {Se puedon usa sentencias compuestas e invocar
fopetones desde una semenca
Frame

Sección 24
13. Calculo el complemento Binario de los sin
valores hexadecimal

ac » CE

14, Calcul el AND binario de ls siguientes valores be
xadecimales

Aus Bene Gr
15, Calcule cl OR binario dels siguientes valores es
‘decimals:
A GIS BAIS GF

16, Calculo el XOR binario delos siguientes valores
lim

Aus mars

Sección 38

17. ¿En qué consiste una operación Lis?

19. ¿Qué hace In opcración AND lógico y con qué si
bolo se representa À

19. ¿Qué ace I operación OR lógico y con qué sak
do e represen?

20. ¿Qui hace In operación NOT lóico y con quin
foto se representa

Sección 36
21 flea! sumar un po ine aun tipo has? Co
Se denon a st po de operación

22. ¿Qué tipo de resultado daria la operación ante
20. Explique el propósito de una conversión
2%. ¿Qué es una expresión valor?

Sección 37
SE Esplique cómo se usa la seencia suicen.

2. ¿Paca qué se usa la palabra reservada ease en el

27. ¿Paca qué se usa la palabra reservada becak en el
128. ¡Se pueden sar sentencias compuestas invocar a
Fineones demo de un setter?

Sección 28

2% ¿Para qué se usa la palabra reservada default en el
inten?

30. ¿Explique cómo funcion el operados condicion?

Sección 39

¿Cómo se denomina a una orden dirigida al compi-
lado

32. ¿En qué consiste la compilación condicional?

30. Nombre una directiva de compilación condicio
an

Sección 3.10

3%. Explique cómo usa un técnico un diagrama de Ajo
de reparación?

38. ¿Qué euratersicn del lenguaje C permito desa
follar un programa interactivo que replique el
comportamiento de un diagrama de Nj de pa
cación?

Sección 2.11

36. ¿Se puedo usar ecursivida para most odos los
factores de un número?

37. ¿Cómo se deberían generaliza las técnicas de con.
Versión presentadas pura perl convert a cual
quie base?

OPERACIONES SOBRE DATOS Y TOMA DE DECISIONES — 169

Diseño de programas

Se deter desallar documentación de cda programa
que se esriba Eta documentación debería incluir ls
teas generale el diseño que expliquen el propósito del

a entrada requerida, el proceso sobe dcha en-
trada yl salida requerida, juno con el algoritmo del pro-
grama, Asepirese de que incluye toda esta documentación
Sn a versión final del programa.

88, Desamlle un programa que mues al usuano todos
los tipos de bifrcaiones disponibles

39. sea un programa que genere la tabla de verdad
comespondiené ala siguieme expresión Boolean:

40, Escriba un programa que convie a etal un núme:
10 introducido porel usuario

41. Escriba un programa que determine s un entero es
par o impar.

42. Eseriba un programa que determine si un mümero
representado en binario tien paridad par o impar.

43. Escrita un programa que calcule el tiempo de ejecu-
«ión medio de un microprocesador, El usuario iteo-
‘duced cl número medio de ciclos de rlo por in.
trucción y la frecuencia del reloj. Por ejemplo, 5
«clos de flo pr instrucción con una frecuencia de
feloj de 2 MHz. drá como resultado 2.3 micos
igundos por instrucción. El programa deberá conver
(rel resultado a milisegundos, mirosegundos na.
nosegundos, la unidad que esté más cerca del
resultado,

44. Cros un programa en donde el usuario seeesione el
nombre de una figura (rectóngalo,tngulo cielo
© paralelogramo) y el program presente I (emul
del ren de dicha figura.

4
Bucles y recursividad

Objetivos
Este capítulo le da la oportunidad de aprenderlo siguiente:

El propósito de los bucles en un programa.

Diferentes tipos de bucles
Bueles que se emplean en C.

Aplica
Bueles anidados.
‘Técnicas de depuraci
El desarrollo de

Los detalles de la

senonaun-

cursividad,

La estructura y codificación de los bucles de C.
nes prácticas de los bucles.

zadas en C.
programa técnico complejo que requiere el uso de bucles.

Palabras clave

Bucle for
Sentencia compuesta
Post-ineremento

Pre-incremento

Post-decremento

Pre-decremento

Operador coma

Operador de evaluación secuencial
Bucle hile

Bucle condicional
Bucle centinela.

Bucle do-white

Bucles anidados

Error en tiempo de ejecución
Tr

Función de suto-depuración
Resursividad

Pila en tiempo de ejecución

m

m

4.1.

PROGRAMACIÓN ESTRUCTURADA EN C

Contenido
4.1. Bl bucle for 4.6,
4.2. El bucle white 47.

43. El bucle
4 Bucles
45. Impleme

«depuración de progra

expendedora
48. Programas de aplicación
ai

Introduccion

de que tes tipos diferentes de bloques de programa son todo lo que se necesita
para solucionar un problema. ir lógica de programación, sin importar lo
complejo que sea, Éstos son el bloque secuencial. el bloque de selección y el bloque
10 o de bucles, Ya se han estudiado los bloques de selección en el capitulo
jor y se ha trabajado con los bloques secuenciales desde los primeros capítulos.
En cuanto finalice este capitulo usted ya habrá utilizado los tres tipos de bloque:
Usted descubrirá que una de las ventajas del uso de un computador par el análisis
y solución de problemas tecnológicos reside en la utilización del bloque repetitivo o
de bucles. El uso de un bloque de este tipo le permite comprobar de forma rápida las
condiciones para un intervalo de valores. haciéndole posible indicar fácilmente valo-
res mínimos y máximos,
Este capitulo hace también una introducción a la recursividad para completar el
«concepto de bucles.

EL BUCLE for

Presentación

nimero exacto de veces. E
sología. Ya no estará limitado a solucionar un problema para una única respuesta
ahora será capaz de solucionar un problema cualquier número de veces con valores
diferentes cada vez,

¿Cómo es un bucle cor?

El bucle for de € contiene cuatro partes importantes:

n el que comienza el bucle,
¡ón bajo la cual el bucle continúa.

Programa da

»
sta,
ms

BUCLES Y RECURSIVIDAD 173

Estas partes se ponen en el bucle for de C de la

guiente manera:

+ expresión condicional; expresión de bucle)
1 bucle):

El Programa 4.1 muestra el uso del bucle for. Este programa inerementa en uno el
valor de una variable llamada tiempo cada vez que se ejecute el bucle. El valor inicial
de la variable es 1 y el bucle se repite mientras el valor de la variable tiempo sea
menor o igual que 3. En cuanto la variable tome un valor mayor de 5, el programa
saldrá del bucle,

Hinelude <stálo.h>

paint)
c
int tlampos J+ Variable contador. */
1% El buele comienza aquí. */
forítiempo = 1; tienpo <= 5; tiempo = tiempo + 1)
prinet(*valor del tiempo = ta \n*,ciempo) :
/* El bucle termina aquí. */
peintf(*Fin del bucle.)

La ejecución del Programa 4.1 produce la siguiente sali

valor del tienpo
valor del tiempo = 2
valor del tiempo = 3
Valor del tiempo = 4
valor del tiempo = 5
Pin del bucle

Análisis del programa

El bucle tor en C comienza con la palabra reservada for seguida de la expresión del
bucle, La expresión del bucle se divide en cuatro parte:

+ EI valor con el que comienza el bucle (la expresión inicial)

+ La condición bajo la cual el bucle se repite (la expresión condicional)

+ Los cambios que tienen lugar en cada vuelta del bucle for (la expresión del
bucle)

+ Qué se hace en cada vuelta del bucle (las instrucciones del bucle)

En el caso de este programa, el bucle for que se utiliza es

{tiempo = 1; tiempo <= 5; tiempo = tiempo + 1)
primt£(-valor del tiempo = td \n*,tiempo) à

174 PROGRAMACIÓN ESTRUCTURADA

Programa 42

ifiea que el valor con el que comienza el bucle es «emp: -ondición
Ise repito el bucle es tiempo <= 5 y el cambio que tiene lugar en cada vuelta
es tiempo = tiempo + 2. La estructura del bucle for en C se muestra en
Figura 4.1

‘Observe que la expresión del bucle for no f
e la combinación de la palabra reservada €
sentencia que constituye el cuerpo del bucle forman una única sentencia en C:

Lor (tiempo
prince

+ tiempo «es; clompo » tiempo + 1)
lalor del tienpo = d\n", tienpo);

Más de una sentencia

Para tener más de una sentencia dentro de un bucle £or. es necesario encerrar todas
llas entre llaves { y 3, dando lugar a lo que se denomina una sentencia compuesta. El
uso de una sentencia compuesta se ilustra en el Programa 4.2, Este programa calcula la
distancia cubierta por un cuerpo que cae (en metros por segundos) para los primeros 5
segundos de caida libre. Esta distancia viene dada por la siguiente ecuación:

= 12 af
donde

La distancia en metros,
Aceleración debida a la gravedad (9,78 m/s?)
‘Tiempo en segundos

#inelude <etdio.h»
Adctino à 9.78

ain)
t

int tiempo; /+ Variable contador. */

int distancia; /" Distancia cublorta por el cuerpo que cae. */

(+ El buele comienza aquí */
forítiompo = 1:


distancia = 0,5 * à * tiempo * ciempor
printf (-ta distancia después de 1d segundos es de
accros. Na". distancia);

,
/* sl bucle termina aquí */
eine é(-Fin del bucle."):