fundamentos de programacion - piensa en c

392

Click here to load reader

Upload: jose-r-sanchez

Post on 30-Jul-2016

1.701 views

Category:

Documents


537 download

DESCRIPTION

Libro con OCR activado para realizar busquedas de texto. Autor: Osvaldo Cairo Editorial: PEARSON / PRENTICE HALL.

TRANSCRIPT

Page 1: Fundamentos de programacion - piensa en C

Fundamentos de Programacion

L

Osvaldo Cairo

Page 2: Fundamentos de programacion - piensa en C
Page 3: Fundamentos de programacion - piensa en C

Fundamentos de programackin. Piensa en C

Page 4: Fundamentos de programacion - piensa en C
Page 5: Fundamentos de programacion - piensa en C

Fundamental de prograrnacien. Piensa en C

Osvaldo Cairo Battistutti Profesor-Investigador del

Institute Tecnologico Autonomo de IVI6xico (ITAIVI)

Miembro del Sistema Nacional de Investigadores (SNI), Nivel 1

REVISION TE CNICA:

M. en C. viola Ocarripo Botello E5cuela Superior de Computacion Instituto Politecnico Nacional

141 - xico • Argentina • BraNil • Colombia • Costa Rica • Chile • Ecuador Espana • Guatemala • Panama Puerto Rico • Uruguay •Vcnciuela

Page 6: Fundamentos de programacion - piensa en C

/natos de onalogaciembibliogrAfica

1-- CAIRO, OSVALDO Dupdamentes de programadon. Plena en C

Formats: 1.83 x 233 cm Nginas: 392

PEARSON EDUCACION, Mexico, 2006

ISDN: 970-26-0810-4 Area: Commode&

Editor: Pablo Miguel Guerrero Rosas e-mail: pablo.guerretoOpearsoned.com

Editor de desarrollo: Miguel B. Gutierrez Hernandez Supervisor de produccien: Rodrigo Romero Villalobos Disc.lio de portada: LisandnE Lazzatoni Battistuni

PRIMERA EDICION, 2006

D.R. 0 2006 per Pearson Educacion de Mexico, S.A. de C.V. Atlacomulco 500-5o. Piso Industrial Moto 53519, Naucalpan de Juarez, Edo. de Mexico E-mail: editorial.universidadaiapoarsoned.com

Clunara Nacional de la Industria Editorial !Anil:an& Reg. Ntim. 1031

Prentice-Hall es una mama registrada de Pearson Edueacidn de Mexico, S.A. de C.V.

Reservados todos los domain. Ni la totalidad ni petite de esta publicacidn pueden teptoduchse, legistrarse o transmilir-se, per un sistema de muperacien de inforrnacion„ en ninguna forma ni per ningan media, sea elects nico„ mecanico, fotoqufmico, magnetic+) o elecnoeplico, per fotocopia, graba.cien o cualquier olio, sin permiso previo per escrito del editor.

El pregamo, alquiler o cualquier otra forma de cesion de 1.18* de este ejemplar mquerint tambien la autorizacion par +write del editor ode sus representantes.

ISBN 970-26-0810-4

Imps= en Mexico. Printed in Mexico.

1234567890-09080706

PEARSON

Educacion

Page 7: Fundamentos de programacion - piensa en C

CONTENIDO

Notas del autor xi

Presentacian

Ag radecimientos

xv

Capitulo 1 Algoritmos, diagramas de flujo y pmgramas en C

1.1 Problemas y algoritmos 1.2 Diagramas de flujo ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••..............5

1,2.1. Reglas pua la construcciOn de diagramas de flujo ............. .....7 1.3 Tipos de datos

Identificadores ...............................................,..................... ..... 9 1.3.2. Constantes 1.3.3. Variables MI ,11111111111. MIN MEM MN •11.11111111111111111111111111.• MEM MIN •1111 1111111111111...1111. 10

1.4 Oceradores •••••.......••••••••••••••■ ••••••••••••••••••••••••.......••••••••••••■ ••••••••••.1112 1,4.1. Operadores ariunaicos 1.4.2. Operaclores aritmOticos simplificados ....................................13 1.4.3. Operadores de incremento y decrement° 1.4.4. Expresiones lOgicas • ••• ••■ ••• ••• ••• ••• ••• ••• ••• V" se. 1•••••••••••••• MI MI .11.1 15

1.4.5. Operaclores relacionale,s........................................................15 1.4.6. Operadores lOgicos ..... ...11...11,11111111"•••••••••■■ .11. 11111111116

1.4.7. E operador coma ••••..............•••••••••••..............•••••••••••............16 1.4.8. Prioridades de los operadores ................................................17

Page 8: Fundamentos de programacion - piensa en C

I vi Contenido

1.5. Construccion de diagramas de flujo 1.6. Prograrnas

1,6.1 Caracteres de control 1.6.2. Forrnato de variables ,„,...„... „,..„.„., „„...„...„...„.„.„ • „...„...„25 P'roblernas resueltos ..........................................................................29 Problemas suplernentarios

Capitulo 2 Estructuras algoritmicas selectivas 49

2.1. Introduccion 2.2. La e,structura selectiva simple 1-r 2.3. La estructura selectiva doble if -else 2.4. La estructura selectiva nuiltiple switch 2.5. Esiructuras selectivas en cascada

Problems re-sueltos Problenaas suplernentarios

Capitulo 3 Estrutturas algoritmicas repetitivas 89

3,1, Introduccidn . .89 3.2. La estructura repetitiva for .90 3,3. La estructura repetitiva wh ile ............................. .............................97 3.4. La estructura repetitiva do-while

Capitulo 4 Funciones 137

4.1. Introduccidn 4.2. Variables locales, globales y estalticas 138

4.2.1. Conflicto entre los nombres de las variables ......................143 4.3. Pardmetros por valor y por referencia ............................................146 4.4. Paso de funciones como param' etros 152

Problemas resueltos ••••••••••.........................................................,••••153 Problems suplernentarios

Capitulo 5 Arreglos unidimensionales 175

5,1.1ntroclucckin 5.2. Arreglos unidirnensionale.s 5.3. Declaracidn de arreglos unidimensionale.s ....................................177 5,4. Apuntadores yarreglos 5.5. Arreglos y funciones

Problenaas resudtos Problems suplanentarios

Page 9: Fundamentos de programacion - piensa en C

Contenido vii

Capitulo 6 Arreglos multidimensionales 213

6.1. Introduccidn ••••••••..•••••••••••••—•—••••••••••••••••••••••••••••••••••••••••••••••••••••.213 6.2. Arreglos bidimensionales •..•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••214 6.3. Declaracidn de arreglos bidimensionales 2" .............215 6.4. Arreglos de rna.s de dos dimensions 6.5. Declaration de arreglos tridiruensionale.s

Problernas resueltos ........................................................................225 Problernas suplernentarios

Capitulo 7 Caracteres y cadenas de caracteres 253

7.1. IntrOdUccion 21,111,12211 ,12..11..............11 III CIS

7.2. Caracteres ................. ..... ..... ........ ....... .................. .......... .............254 7.3. Cadenas de caracteres ...........".......................................................257 7.4. Cadenas de caracteres y arreglos ....................................................266

Problernas resueltos •••••••••••••••••••••••••••••••••••••••••••••••••..............--.268 Pnoblerrias suplementarios

Capitulo 8 Btructuras y uniones 287

8.1. Introducgion 8.2. Estructuras ......................................................................................288

8.2.1. Declaration de estructuras .......... ...... ..................................289 8.2.2. Creacidn de sindnirnos o alias 8.2.3. Eslructuras anidadas ............................................................295 8.2.4. Eanicturas con arreglos ..•••••••••• ..11.• ...... .............•••••.298

8.3. Uniones ...••••.•.......................................................•••..••••••••.•...........301 8.3.1. Declaration de uniones Problernas resueltos .304 Problernas suplernentarios 326

Capitulo 9 Arthivos de dates 333

9.1. Introduccion ....................................................................................333 9.2. Archivos de texto y nieloclo de acceso secuencial 9.3. Archivos de acceso directo ............................................................343

Problernas mueltos INN MEM N. "1435 1

Pnoblemas suplementarios

Page 10: Fundamentos de programacion - piensa en C
Page 11: Fundamentos de programacion - piensa en C

A Facundo, Silvia, Maria y Jose

Page 12: Fundamentos de programacion - piensa en C
Page 13: Fundamentos de programacion - piensa en C

PRESENTACION

Este libro esti dedicado a todas aquellas personas que necesitan aprender a re-solver problemas y plantear su soluci6n en un lenguaje de programaciOn, en este caso con el lenguaje C. Los textos no comerciales sabre este tema —cOmo resol-ver problemas— son pocos, y los libros sobre la materia se enfocan en presentar un lenguaje de programaciOn, algunos de manera dithictica, otros no tanto, pero no explican cOmo resolver un problema. Esta es la principal razOn de este libro. Esta caracteristica es fundamental, sobre todo desde el punto de vista ac.ad6mico, porque trata de ensenar, de pacer entender, de pacer ver, al lector, cOmo resolver un problema, y luego c6mo programar esa soluciOn en un lenguaje de progra-macion de alto nivel. En general, aprender a usar una herramienta es sencillo, la mayoritt de los libros se enfoca en ello; pero saber utilizar una herramienta no resuelve el problema: saber manejar una maquina de escribir, por ejemplo, no lo hate a uno escritor.

El libro se compone de nueve capftulos. El primero explicit qu6 es un algoritmo, o6mo se construye un diagrama de flujo y come escribir un programa en C. Los dos siguientes presentan las astructuras algorfttnicas selectivas y repetifivas. El siguiente capitulo presenta el tema de finciones, asociado siempre al concepto de reduccion de problemas. Los capitulos 5 y 6 presentan los arreglos unidimensio-nales y multidimensionates, respectivamente. El capftulo 7 ofrece un panorama sobre los caracteres y cadenas de caracteres, y el 8 sobre estructuras y uniones. Fmalmente, el Ultimo capftulo esta dedicado al estudio de archivos de datos.

Page 14: Fundamentos de programacion - piensa en C

xii Presentacion

Es importante destacar que el nivel de complejidad de los temas aumenta en forma gradual; y cada uno se expone con amplitud y claridad. Para reafirmar lo aprendido se ofrece gran cantidad de ejercicios disefiados expresamente como elementos de ayuda para el antilisis, razonamiento, practica y comprensiOn de los conceptos analizados. Al fmal de cada capftulo encontrara dos secciones: una con problemas resueltos sobre el terra de estudio y otra con problemas para resolver.

Page 15: Fundamentos de programacion - piensa en C

AGRADECIMIENTOS

Muchas personas contribuyeron, de una forma o de otra, en la realizacion de este proyecto; algunos con un enfoque positive se convirtieron en agentes fundamen-tales pars mantener siempre la metivacion y los deseos pot culminarlo.

Quiero agradecer tanto a aquellos que me apoyaron come a los que no lo hicie-ron, y que sin saberlo me enriquecieron notablemente al hacer que me esforzara per demostratle:s que los conocimientos y los pensamientos de bien son los que verdaderamente iluminan el caraino correcto. Caminos hay muchos, correctos pocos.

Vaya un agradecimiento muy especial al Dr, Arturo Femindez Perez, Rector del Institute Tecnolegice Autenerne de Mexico, y al Dr. Marcelo Mejfa Olvera, Director de la Division Academica de Ingenierfas del ITAM.

Page 16: Fundamentos de programacion - piensa en C
Page 17: Fundamentos de programacion - piensa en C

CAPITULO

Algoritmos, diagramas de flujo y programas en C

1.1 Problemas y algoritmos Los humanos efectuamos cotidianamente series de pasos, procedimien-tos o acciones que nos permiten alcanzar algin resultado o resolver algtim problema. Estas series de pasos, procedimientos o acciones, comenzamos a aplicarlas desde que empieza el dia, cuando, por ejem-plo, decidimos banamos. Posteriormente, cuando tenemos que ingerir alimentos tambien seguimos una serie de pasos que nos permiten alcan-zar un resultado especffico: tomar el desayuno. La historia se repite innumerables yews durante el dia. En realidad todo el tiempo estamos aplicando algoriUnos pare resolver problemas.

Page 18: Fundamentos de programacion - piensa en C

I 2 Capitulo 1. Algoritmos, diagramas de flujo y programs en C

mFormalmente definimos un algoritmo coma un conjunto de pasos, procedi-rnlentos o acciones que nos permiten alcanzar un resultado a resolver un problema."

Muchas veces aplicamos el algoritmo de manera inadvertida, inconsciente o au-tomatica. Esto ocurre generalmente cuando el problema al que nos enfrentamos lo hemos resuelto con anteriorklad un gran ntimero de veces.

Supongamos, por ejemplo, que tenemos que abrir una puerta. Lo hemos hecho tantas veces que dificilmente nos tomamos la molestia de enumerar los pasos Pa-ra alcanzar este objetivo. Lo hacemos de manera automalica. Lo mismo ocurre cuando nos subimos a un automeivil, lustramos nuestros zapatos, hablamos por tele:fono, nos vestimos, cambiamos la llanta de un automOvil o simplemente cuando tomamos un vaso con aqua.

EJEWILO 1.1 Construye un algoritmo Para preparar "Chiles morita rellenos con salsa de nuez".1

En Mexico no sal° se rellenan los chiles pablanos. Este deliciosa receta emplea el chile morita sec°, de sabor ahumado. Es importante utilizer el chile =rite,

porous es dificil encontrar sustitutos que igualen su singular sabor.

Ingredientes:

150 g de chiles morita (unos N). 2 cucharadas de aceite. 12 dientes de ajo. 1 ceballa cortada en was fines. 2 tazas de vinagre de vino tinto. Sal. 10 granos de pimienta negra.

1'i2 cucharadas de oregano seco.

185 g de piloncillo rolled°.

Relleno:

1 cucharada de aceite.

112 cebolla finamente picada. 2 dientes de ajo finamente picados.

'or 2 taza (125 g) de tomato finamente picado.

Page 19: Fundamentos de programacion - piensa en C

1.1 Problemas y algoritmos 3 I

'/4 taza (32 g) de almendras peladas y picadas. 1 /4 taza (32 g) de uvas pasas sin semillas. 1 pechuga entera de polio cacida y finamente desmenuzada. 1 cucharadita de sal. If2cucharada de pimiento recien molida.

Salsa:

2 huevas, separadas las claras de las yemas. 2/4 taza (92 g) de harina. Amite para freir. 3/4 taza (92 g) de nueces. 1 taza de crema de leche espesa, no azucarada.

Algorimro(preparacion):

• Lava los chiles y secalos bien. Calienta el aceite en una sarten grande y saltea los chiles, los ajos y la cebolla.

• Ahade el vinagre, la sal, los granos de pimienta, el oregano y el piloncillo, y contin0a salteando durante 12 minutos. Retira del fue-go, deja que se enfrie la mezcla y ponla en una cazuela, preferente-mente de barro, tapada. Refrigera 24 horns.

• Para preparar el relleno, calienta el aceite en una Barton y saltea la cebolla durante cinco minutos o hasta que este transparente. Agrega los ajos, el tomate, las pasas, las almendras y dos cuchara-das del vinagre en el que se cocieron los chiles. Mezcla bien y afia-de el polio, la sal y la pimienta. Cuece a luego lento durante ocho minutos, sin dejar de mover. Reserva. Muele el ajo, la pimienta y un poco de sal y Untaselos a las pechugas.

• Con unos guantes (para evitar que se irrite la piel) corta cada chile a lo largo. Quitales las semillas y desvenalos. Pon el relleno a cada chile con una cucharita. No pongas mucho para evitar que se desparrame al freir los chiles.

• Bate las claras al punto de turron (de nieve). Agrega una a una las ye-mas sin agitar demasiado (para evitar que las claras pierdan volumen).

• En una sarten grande, calienta entre 2 y 3 cm de aceite y dejalo al Fuego hasta que este muy caliente. Pon la harina en un plato y re-vuelca en ella cada chile hasta que este cubierto; sumergelo en el huevo batido e inmediatamente pull's en el aceite. Friel cada chile hasta que se dors por un lado y luego dale vueita para que se dors el otro lado.

• En un procesador de alimentos o similar, haz un pure con las nueces y la crema con una pizca de sal. Sirve los chiles con un poco de la crema de nuez encima de ellos (el resto se presenta en una salsera).

1 Receta veracruzana de Susana Palazuelos. Pam obtener Inas informacion sobre esta y otras recetas, consulte: El gran libro de la cacina mexkana. Recetas de Susana Palazuelias, Editorial Patria, 1999, ISBN: 968-39-0758-X,

Page 20: Fundamentos de programacion - piensa en C

Analisis del pi-able=

Verificacion del algoritmo

Construccion del algoritmo

PROBLEMA

I 4 Capitulo I. Algoritmos, diagramas de flujo y programas en C

En la, figura 1.1 podemos observar las etapas que debemos seguir Para solucionar algdn problema.

Etapa Etapa 2 Etapa 3

RGURA 1.1

liapas para solucionar an problema.

For otra parte, las caracteristicas que deben teller los algoritmos son las siguientes:

Precision: Los pesos a seguir en el algoritrno se deben precisar claramente.

Determinis' Inn: EL algoritmo, dada un conjunto de datos de entrada id'entizo, siernpre debe arrojar los rnisrnos resultados.

Finitud: II algoritmo, independientemenft de la complejidad del mismo, siernpre debe mner longitud finita.

El algoritmo consta de tres secciones o m45dulos principales (figura 1.2),

DATOS DE ENTRADA

PROCESANEENTO DE LOS DATOS

IMPRESION DE RESULTADOS

RGURA 1.2 Modulos o secciones de an algorinno,

Page 21: Fundamentos de programacion - piensa en C

1.2 Diagramas de flujo 5i

1.2 Diagramas de flujo

El diagrama de Rule representa la esquematizaci6n grifica de un algoritmo. En realidad muestra graficamente los pasos o procesos a seguir para alcanzar la solucion de un problema. La construcciOn correcta del mismo es muy importan-te, ya que a partir de dste se escribe el programa en un lenguaje de prograrnacide determinado. En este case utilizaremos el lenguaje C, aunque cabe recordar que el diagrama de flujo se debe construir de manera independiente al lenguaje de programacion, El diagrama de flujo representa la solucion del problema. El pro-grama representa la implementacion en un lenguaje de programacift.

A continuaciOn, en la tabla 1.1 se presentan los simbolos que se utilizaran, junto con una explicacion de los mismos. Estos satisfacen las recomendaciones de la International Organization for Standardization (ISO) y el American National Standards Institute (ANSI).

TABLA 1.1. Simbolos utilizados en los diagramas de flujo

Representation del simbolo Explicacion del simbolo

CD

Se utiliza para marcar el iiicio y elfin del diagrama de flujo.

utiliza para introducir los datos de entrath, Expresa

Representa un proceso. En su interior se colocan asignaciones, operaciones aritmeticas, cambios de valor de celdas en me-rnoria, etc.

utiliza para representar una decision. En su interior se alma-cena una condici(5n, y, dependiendo del resultado, sc sigue par una de las ramas o camincs altemativos. Este simbolo se utili- za con pequerias variaciones en las estructuras selectivas e if -else que estudiaremos en el siguiente capitulo. ad coma en less estructuras repetitivas for, while y do-while, que analiza-

remos en el capitulo 3.

Page 22: Fundamentos de programacion - piensa en C

6 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

Se utiliza pars representar una decision n-uiltiple, swit oh, que analizaremos en el siguiente capitulo. En su interior se almace-na un selector, y, dependiendo del valor de dicho selector, se sigue por una de las rarnas o carninos alternativos.

Sc utiliza pars representar la impresiOn de un resultado. Expre-sa escritura.

I I 0

Expresan in direccion del flujo del diagram.

Express conexion dentro de una uaisma p6gina.

Represents conexion entre pa'gina.s diferentes.

Se utilint pare expresar un modulo de un problem, subpro-blem, que hay que resolver antes de continuar con 0 flujo normal del diagrarna.

A continuation, en la figura 13 se present= los pasos que se deben seguir en la construction de un diagram de flujo. El procesamiento de los datos generalmen-te esta relacionado con el proceso de toma de decisiones. Ademb, es muy co-mb repetir un conjunto de pasos.

Page 23: Fundamentos de programacion - piensa en C

Diagramas de flujo

ENICID

LEO rUPA OE EATCS

1

MOCESASIT ENTO OE LOS acros

FIGURA 1.3

Etapas en is constracei6n de an diagrama dell*

1.2.1. Reglas para la construccion de diagramas de flujo

El diagrama de flujo debe ilustrar griaficamente los pasos o procesos que se deben seguir para alcanzar la soluciOn de un problema. Los simbolos presentados, colo-cados en los lugares adecuados, permiten crear una estructura grafica flexible que ilustra los pasos a seguir para alcanzar un resultado especifico. El diagrama de flujo facilita entonces la escritura del programa en un lenguaje de progra.ma-cion, C en este caso. A continuaci6n se presenta, el conjunto de reglas para la construcciOn de diagramas de flujo:

1. Todo diagrama de flujo debe tener un inicio y un fin.

2. Las lineas utilizadas para indicar la direcciOn del flujo del diagrama deben ser ream: verticales u horizontales.

3. Todas las lineas utilizadas para indicar la direcciOn del flujo del diagrama deben estar conectadas. La conexiOn puede ser a un simbolo que exprese lectura, proceso, decisiOn, impresion, conexiOn o fin del diagrama.

Page 24: Fundamentos de programacion - piensa en C

I 8 Capitulo 1. Algoritmos, cliagramas de flujo y programas en C

4. El diagrama de flujo debe construirse de arriba hacia abajo (top-down) y de izquierda a derecha (right to left).

5.. La notacion utilizada, en el diagrama de flujo debe ser independiente del lenguaje de programacion. La solucion presentada se puede escribir poste-riorrnente en diferentes lenguajes de programacion.

6. Al realizar una tarea compleja, es conveniente poner comentarios que expresen o ayuden a entender lo que hayamos hecho.

7. Si la construed& del diagrama de flujo requiriera m'as de una hoja, debemos utilizar los conectores adecuados y enumerar las paginas correspondientes.

8. No puede llegar ma's de una !Inca a un simbolo determinado.

1.3 Tipos de datos

Los datos que procesa una computadora se clasifican en simples y estructura-dos. La principal caracteristica de los tipos de datos simples es que ocupan solo una casilla de memoria. Dentro de este grupo de datos se encuentran principal-mente los adores, los reales y los caracteres,

TABLA 1.2. Tipos de datos simples 71po de flatus en C Description Rango int Enteros -32,768 a +32,767

float Reales 3.4 X 10-38 a 3,4 X 1038 long Enteros de -2'147,483,648 a 2'147,483,647

largo alcance double Reales de 1.7 X 103" a 1.7 X

cbble precision char airacter Sirribolos del abecedario, ruin-hems

a silribalas e.speciales, que van ericerrados entre cornillas.

Por otra parte, los datos estructurados se caracterizan por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria. Es deck, un dato estructurado tiene varios componentes. Los arregles, cadena de caracteres y

Page 25: Fundamentos de programacion - piensa en C

1.3 Tipos de datos 9 I

registros representan los datos estnicturados ma's conocidos. Estos se estudiaran a partir del capftulo 4,

1.3.1. Identifkadores

Los datos que procesara una computadora, ya sean simples o estructurados, se deben almacenar en casillas o celdas de memoria para utilizarlos posteriormente. A estas casillas o celdas de memoria se les asigna un nombre para reconocerlas: un identificador, el cual se forma por medic de letras, digitos y el caracter de subrayado (_). Siempre hay que comenzar con una letra. El lenguaje de progra-macion C distingue entre minuscules y maydsculas, por lo tanto AUX y Aux son

dos identificadores diferentes. La longitud mas comim de un identificador es de tres caracteres, y generalmente no excede los siete caracteres. En C, dependiendo del compilador que se utilice, es posible generar identificadores mas grandes (con mas caracteres).

Cabe destacar que hay nombres que no se pueden utilizar per ser palabras reserva-das del lenguaje C. Estos nombres prohibidos se presentan en La siguiente table.

TABLA 1.3. Palabras reservadas del lenguaje C auto do got o signed unsigned

break double if six eof void

case else int static volatile

char enum long struct while

con st extern register switch

continue float return typedef

default for short union

1.3.2. Constantes

Las constantes son dates que no cambian durante la ejecucian del programa. Para nombrar las constantes utilizamos identificadores. Existen tipos de constantes de todos los tipos de dates, por lo tanto puede haber constantes de tipo entero, real, caracter, cadena de caracteres, etc, Las constantes se deben definir antes de comenzar el programa principal, y estas no cambiaran su valor durante la ejecuci6n

Page 26: Fundamentos de programacion - piensa en C

10 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

del mismo. Existen dos fonnas tdsicas de definir las constantes: const int nul = 20; /* ConOt int nu2 = 15; /* oonst float rel = 2.18; f* const char cal = 'f'; f*

nul es una constante de tipo entero. *or nu2 as una canstante de tipo entero. */ rel es una constante de tipo real. *i cal as una constante de tipo caracter. */

Otra alternativa es la siguiente: Mdafine nul 20 1* nul es una constante de tipo entero. *i Melina nu2 15 f* nu2 es una constante de tips entero. */ ffidefine rel 2.18 f* rel as una constante de tipo real. *i fdefins cal 'f' f* cal as una constants de tips caracter. */

Otra forma de nombrar constantes es utilizando el metodo enumerador: enum. Los valores en este caso se asignan de manera predeterminada en incrementos unita-rios, comenzando con el cero. enum entonces es dal cuando queremos defmir constantes con valores predeterminados. A continuacion se presenta la forma como se declara un (mum;

enum va8, val, vat, va3 J; /* define cuatro constantes enteras. */

Esta definicion es similar a realizar lo siguiente: const int va0 = 0; const int vai = 1; const int va2 = 2; mist int va3 = 3;

1.3.3. Variables

Las variables son objetos que pueden cambiar su valor durante la ejecucion de un programa. Para nombrar las variables tambien se utilizan identificadores. Al igual que en el caso de las constantes, pueden existir tipos de variables de todos 105 tipos de datos. Por lo general, las variables se declaran en el programa principal y en las funciones (como veremos en la seccion 1,6 y en el capita° 4, respectivamente), y pueden cambiar su valor durante la ejecucion del programa. Observemos a continuation la forma como se declaran: void main(void)

int val, va2; float rel, re2; char cal, ca2;

}

f* Declaracion de variables de tipo entero. */ /* Declaracion de variables de tipo real. */ /* Declaracion de variables de tipo caracter. *f

Page 27: Fundamentos de programacion - piensa en C

1.3 lipos de dates

Una vez que se declaran las variables, dstas reciben un valor a tray& de un bloque de asignsicloo. La asignacion es una, operaciOn destructive. Esto significa que si la variable tenia un valor, Este se destruye al asignar el nuevo valor. El formato de la asignacion es el siguiente:

variable = expreeldn o valor;

Donde expresion puede representax el valor de una expresi6n axitmdtica, cons-tante o variable. Observa, que la instruccion finaliza con punto y coma: ; .

Analicemos a continuacion el siguiente caso, donde las variables reciben un va-lor a traves de un bloque de asignacion. void main(void) {

int val, va2; float rel, re2; char cal, ca2;

val 13; f* Asignacion del valor 12 a la variable val.*/ va2 = val + 15; f* Asignacion del valor 25 (expresidn aritmetica) a va2. */ val = 15; i* La variable val modifica su valor. *f rel = 3.235; f* Asignacion del valor 3.235 a la variable real rel. */ re2 - re1; f* La variable re2 tome el valor de la variable rel. */ cal = 't'; f* Asignacion del caracter 't' a la variable cal. *I

ca2 = '7'; f* Asignacion del caracter '?' a la variable ca2. *1

Otra forma de realizar la, asignaciOn de un valor a una variable es cuando se realiza la declaracion de la misma. Observemos el siguiente caso. void main(void) {

int val = 13, va2 = 15; float ref= 3.25, re2 - 6.485; char cal = 't', ca2 = 's';

1

Fmalmente, es importante destacar que los nombres de las variables deben ser representativos de la funcion que cumplen en el programa.

Page 28: Fundamentos de programacion - piensa en C

12 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

1.4 Operadores Los operadores son necesarios para realizar operaciones. Distinguimos entre operadores aritmeticos, relacionales y lOgicos. Analizaxemos tambi6n operadores aritmeticos simplificados, operadores de incremento y decremento, y el operador coma.

1.4.1. Operadores aritmeticos

Los operadores aritmeticos nos permiten realizar operaciones entre operandos: 'Amen:6, constantes o variables. El resultado de una operacion aritm6tica siempre es un numero. Dario que C distingue entre los tipos de operandos (int y float) que se utilizan en ',Ina operaciOn aritm6tica, en la tabla 1.4 se presentan los opera-dores aritmeticos, varios ejemplos de su use y el resultado correspondiente para cada U130 de estos casos. Es importante observarlos cuidadosamente. Considera que x es una variable de tipo entero (int x) y v es una variable de tipo real (float v).

TABLA 1.4_ Operadores aritmeticos Operador aritrnetico Operacion Ejernplos Resuitados

+ Surna x = 4.5 + 3; x - 7

v - 4.5 + 3; v - 7.5

Resta x=4.5 - 3; x - 1

v = 4.5 - 3; v = 1.5

Multiplicacion x = 4.5 * 3; x = 13

v = 4.5 * 3; v = 13.5

v = 4 * 3; v = 12.0

Division x = 4 / 3; x = 1

x = 4..0 / 3.9; x = 1

v = 4 / 3; v = 1.9

v = 4.9 / 3; v = 1.33

v (float) 4 / 3; v = 1.33

v = ((float) 5 + 3) / 6; v = 1.33

5!6 Modulo(resiclun) x 15 511 2; x 1

v (15 % 2) 2; v = 9.9

v ((float) (15 % 2)) / 2; v 9.5

Page 29: Fundamentos de programacion - piensa en C

+=

. „

*,

1.4 Operadores '3 1

Al evaluar expresiones que contienen operadores aritmdticos debemos respetar la jerarqufa de los operadores y aplicarlos de izquierda a derecha. Si una expresiOn contiene subexpresiones entre pardntesis, d.stas se evaldan primero. En la tabla 1.5 se presenta la jerarqufa, de los operadores aritmdticos de mayor a menor en erden de importancia.

TABLA 1.5. Jerarquia de los operadores aritmeticos

Operador

Op e meld ri

Multiplicacion, division, rtkidulo

Surma, Testa

1.4.2. Operadores aritmeticos simplificados

Un aspecto importante del lenguaje C es la forma come se puede simplificar el use de los operadores aritmeticos. En Is. tabla. 1.6 se presentan los operadores arit-mdticos, la forma simplificada de su use, ejemplos de aplicaciOn y su correspon-diente equivalencia. Considere que x y y son variables de tipo entero (int x, y).

TARA 1.6. Operadores aritmeticos: forma simplificada de use

Forma Operadar simplificada aritrrietico de use Ejernpios Equivalencia Resuitados

x -- 6; x = 6; x =6

y -- 4; y - 4; y - 4 x i— 5; x= x + 5; x =11

x4 Y; x- x + y; x -15

x = 10; x = 10; x = 10 y - 5; y- 5; Y =5 x - = 3; x = x - 3; x = 7

x - = Y; x - x - y; x - 2

x = 5; x = 5; x = 5

y = 3; y = 3; y = 3 x *= 4; x = x * 4; x = 20

x *= y; x = x * y; x = 60

continua

Page 30: Fundamentos de programacion - piensa en C

I 14 Capitulo Z. Algoritmos, diagramas de flujo y programas en C

TARA t6. Continuacion

Operador &it-medal

Forma simplificada de use Ejemplos Equivaiencia Result-odes

i l= x = 25; x = 25; x = 25

y — 3; y — 3; y = 3

x f= 3; x = x f 3; x= 8

x /= Y; x— x / y; x = 2

111 !Its= x = 29; x = 29; x = 20

r = 3; r = 3; Y = 3 x %= 12; x= x% 12; x= 8

x 11= y; x = x gii y; x = 2

1.4.3. Operadores de incremento y decremento

Los operadores de keremento (+0 y decremento (- -) son propios del lenguaje C y su aplicaciOn es muy importante porque simplifica y clarifica la escritura de los programas. Se pueden utilizar antes o despuds de la variable. Los resultados son diferentes, Como se puede observar en los ejemplos de la tabla 1.7. Conside-ra que x y y son variables de tipo entero (int x, y).

TABLA 1.7. Operadores de incremento y decremento Operador Operatien Ejemplos Result-odes ++ Incremento x - 7; x - 7

y = x++; y = 7

x — 8

x 7; x=7

y - ++x; y = x = 8

Decrement° x = 6; x - 6

Y = x--; y = 6

x 5

x 6; x=6

y = --x; Y = 5 x

Page 31: Fundamentos de programacion - piensa en C

1.4 Operadores

15 1

1.4.4. Expresiones logicas

Las expreskmes16gicas o booleanas, llamadas asi en honor del matemAtico George Boole, estiln constituidas por ntimeros, constantes o variables y operadores lOgicos o relacionales. El valor que pueden tomar estas expresiones es 1 —en caso de ser verdaderas— o e —en caso de set falsas. Se utilizan frecuentemente tanto en las estructuras selectivas como en las repetitivas. En las estructuras selectivas se emplean para seleccionar un camino cleterrninado, dependiendo del resultado de la evaluaciOn. En las estructuras repetitivas se usan para determinar bAsicamente si se continua con el ciclo o se interrumpe el mismo.

1.4.5. Operadores relacionales

Los operadores relacionales se utilizan para comparar dos operandos, que pueden ser ntime:ros, caracteres, cadenas de caracteres, constantes o variables. Las constantes o variables, a su vez, pueden ser de los tipos expresados anteriormente. A continuaciOn, en la tabla 1.8, presentamos los operadores relacionales, ejemplos de su use y el resultado de dichos ejemplos. Considera que res es una variable de tipo entero (Int res).

TABLA 1.8. Operadores relacionales Operador relacional Operacian Ejernplos Resultados

= Igual a res = . h . ...... ipi ; res = e

i= Difererite de res ' a' i= ' b • ; res = 1

< Menor que res = 7 c 15; res = 1

> Mayor que res = 22 > 11 ; res = 1

c= MenOr 0 igual que res = 15 c= 2; res = 0

p-= Mayor o igual que res = 35 >=- 20; res = 1

Cabe destacar que cuando se utilizan los operadores relacionales con operandos 16gicos, falso siempre es menor a verdadero. Veamos el siguiente caso:

res - {7 > > {9 > 6); /* 0 > 1 (falso) 0 */

El valor de res es igual a la,

Page 32: Fundamentos de programacion - piensa en C

Resuitados

16

Capitulo 1. Algoritmos, diagramas de flujo y programas en C

1.4.6. Operadores logicos

Por otra parte, los operadores legicos, los wales permiten formular condiciones complejas a partir de condiciones simples, son de conjund6n (&&), disyunciOn (1) y negaciOn (s). En la tabla 1.9 se presentan los operadores 16gicos, ejemplos de su 11.50 y resultados de cliches ejemplos. Considers que x y y son variables de tipo enter° (int x, y).

TAMA 1.9. Operadores lOgicos Operador logic° Operacion Ejemplos

Negacion x (1(7 r 15)); /* (10) 1 */

Y ( 10);

&& ConjuncOn x = (35 > 20) && (20 <= 23); /* 1 && 1 */

y 0 && 1;

DisyunciCm x = (35 > 20) II (20 <= 10); 1* 1 11 a */ Y = 11 1;

La tabla de verdad de estos operadores se presents a continuaci6n.

TARA 1.10. Tabla de verdad de los operadores logjam

P (I P) (.1 (P II (P &&

Verdadero Verdadero Faso Falso Verdadero Verdadero 1 1 0 0 1 1

Verdadero Falso Falso Verdadero Verdadero Falso 1 0 0 1 1 0

Falso Verdadero Verdadero Falso Verdadero Falso 0 1 1 0 1 0

Falso Falso Verdadero Verdadero Falso Falso 0 0 1 1 0 0

1.4.7. El operador coma

La coma (,) utilizada coma operador sirve para encadenar diferentes expresiones. Consideremos que las variables x, v, x y v son de tipo entero (int x, v, z, v). Ob-servemos a continuation diferentes caws en la siguiente tabla.

Page 33: Fundamentos de programacion - piensa en C

1.4 Operadores "I

TARA 1.11. USOS del operador coma

Expreskin Equivalencia Resuitados x- {v =a, v* 5); v= 3 v= 3

x = v * 5; x = 15

• (v += 5, v % 3);

• (y = {15 10), z = {2 ›= y), y z);

x= (y = (1{7 r 15)), z = {35 r 40) && y,

(1{Y && z)));

• = v + 5; v = a x = v Rs 3; x = 2

y = (15 10); y = 1

• = (2 >= y); z = 1

x = y && z; x 1

y = (1(7 a 15)); y = 1

z (35 > 40) && y; z = 0

x = (I(y && z)); x = 1

1.4.8. Prioridades de los operadores

Poor Oltimo, y luego de haber presentado los diferentes operadores —aritm6ticos, relacionales y lOgicos—, se mustra la tabla de jerarquia de los mismos, Cabe destacar que en C, las expresiones se evaltian de izquierda a derecha, pero los operadores se aplican segan su prioridad.

TARA 1.12. Jerarquia de los diferentes operadores

Operadores Jerarquia

>, <=, y-

(mayor)

(manor)

B operador ) es asociativo y tiene la prioridad mgs alts en cualquier lenguaje de programa:ion.

Page 34: Fundamentos de programacion - piensa en C

18 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

1.5, Construccion de diagramas de flujo Un diagrama de flak' muestra, coma selialamos anteriormente, la esquematiza-ei6n grifica de un algoritmo. Su correcta construed& es importante, porque a partir del mismo se debe escribir el programa en un lenguaje de programaciOn cleterminado. Es nuestro interds que comiences a desarrollar habilidad y una capacidad de razonamiento estructurada y flexible que to permita, en la medida que practiques, obtener la soluciOn a los problemas planteados. A continuation se presentaran diferentes problemas y su respectiva soluciOn por medio de diagramas de flujo.

EPERWL0 1.2

Construye un diagram, de flujo que, al recibir los datos A, B, c y o que representan nameros enteros, escriba los mismos en orden inverso.

Datos: A, a, c, o (variables de tipo entero).

Diagrama de flujo 1.1

INICIO

A, B, C, /* Se leen los datos. *1

D, C, B, A /* Se escriben los datos en orden inverso.

Observa que si se ingresan los datos: 10, 20, 30 y 40, la impresiOn produce lo siguiente: 40, 30, 20 y 10.

Page 35: Fundamentos de programacion - piensa en C

1.5 Construccion de diagramas de flujo 19 I

EJEWILO 1.3

Construye un diagrama de flujo que, al recibir comp dates la slave del empleado y los seis primeros sueldos del alio, calcule el ingreso total semestral y el promedio mensual, e imprima la slave del empleado, el ingreso total y el promedio mensual.

Dat05: CLA, S1J1, SU2, 5113, SU4, SUS, SUB

Donde: CLA es una variable de tipo entero que representa la slave del empleado. sui , SU2, SU3, SU4, SU5 y SUB son variables de tipo real que representan los seis sueldos percibidos.

Diagrama de flujo 1.2

INICIO

I CLA, SU1 SU2, SU3 SU4, SUS SUB

/* Lectura de la dave del empleado y los sueldos percibidos. *I

ING (SU1 SU2 + SU3 + SU4 + SU5 + SUB) PRO 4— ING of 6

/* Cgculo del ingreso total y del promedio.

Escribe la dave del empleado, el ingreso total y el promedio. *I

LA, ING, PRO

Donde: ING y PRO son dos variables reales que almacenan el ingreso total y el promedio mensual, respectivamente.

Page 36: Fundamentos de programacion - piensa en C

20 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

En la tabla 1,13 puedes observar los datos y resultados para cinco corridas diferentes.

Corrida Datos Resultados

CLA SU1 SU2 Sal SU4 SUS SUB RIG PRO

1 105 12,167 14,140 13,168 12,167 21,840 12; 167 85,649 14,274.83

2 110 8,750 9,745 9,745 9,745 8,750 11,190 57,925 4,654.16

3 115 21,230 18,340 19,367 /9,367 18,340 22,180 118,824 19,804.00

4 120 9,645 9,645 9,645 9,800 9,645 10,280 58,660 9,776.66

5 lae 11,14e 10,915 12,180 15,670 11,140 12,180 73,225 12,204.16

EJEMPLO 1.4

Constnaye un diagrama de flujo que, al recibir corno datos la base y la Aura de un triangulo, calcule su superficie.

DatOS: SAS, ALT

Donde: BAS y ALT son variables de tipo real que representan la base y la altura de un tti 'Angulo, respectivamente.

Recuerda que la superficie de un trilingulo se calcula aplicando la siguiente formula:

9uperficie (base * altura) / 2

Firmula 1.1

Page 37: Fundamentos de programacion - piensa en C

1.5 Construccion de diagramas de flujo 21 [

Diagrarna de flujo 1.3

INICIO

/BAS, ALT /

SUP 4- BAS * ALT / 2

/* Lectura de datos. *1

1* Meal°, de la superficie. *0'

Escritura de resultado.

V

SUP

EFiND

Donde: SUP e...5 una variable de tipo real que alrnaoena la superficie del tricingulo,

En la tabla 1.14 puedes observar los datos y los respectivos resultados de cinco corridas diferentes.

TABLA 1.14.

corrida Datos Resultado

BAS ALT SUP

1 8.5 6.2 26.35

2 7.9 13.5 53.32

3 15.18 22.0 166.98

4 l 2. 63 7.9 49.88

5 39.40 68.5 1349.45

Page 38: Fundamentos de programacion - piensa en C

22 Capitulo I. Algoritmos, diagramas de flujo y programas en C

1.6. Programas

Un programa, concepto desarrollado por Von Neumann en 194.6, es un conjunto de instrucciones que sigue la computadora, pars alcaniar un resultado especffico. El programa se escribe en un lenguaje de programackin —c en este caso—, a partir del disefio de un diagrama de flujo escrito con anterioridad. El lenguaje de programaciOn esta constituido por un conjunto de reglas sintacticas y semanticas. Las reglas sintacticas especifican la formaciOn de instrucciones validas, mientras que las semanticas especffican el significado de estas instrucciones,

C es un lenguaje de programaci6n de tipo estructurado, que implements por lo tanto soluciones en forma estructurada. En este enfoque la soluci6n de los problemas se disefia de arriba hacia abajo (top-down), y de izquienia, a derecha (left to right). Si la solucion es corrects, el programa sera facil de entender, depurar y modfficar.

La tarea intelectual, la que requiere de un pensamiento profundo, de una capacidad de razonamiento flexible y critica, corresponde a la construcci6n del diagrama de flujo, que representa la soluciOn detallada del problema, La escritura o codfficaci6n del programa, por otra parte, puede resultar una tarea sencilla si conocemos las reglas sintacticas y semanticas que constituyen el lenguaje de programaci6n. Analicemos a continuaci6n el primer programa escrito en el lenguaje C.

Programa 1.1

*Include <stdio.h>

f* Programa 1.1 El siguiente es el primer programa escrito en el lenguaje C. *f

void main (void)

printf( "Mi primer programa en C" );}

Observa que todo programa comienza con las instrucciones que permiten incorporar las bibliotecas necesarias pars correr un determinado programa en C. En este caso, lainstrucciOn:

#in elude <at dio.h

Page 39: Fundamentos de programacion - piensa en C

1.6 Programas 23 I

permite la inclusion de b biblioteca estandar stdio (standard Input Output Header)

de entradalsalida, la cual incluye Las instrucciones print? y scant necesarias para escribir y leer, respectivamente. ❑bserva que todo lo que desees imprimir debe it entre pardntesis ( ) y comillas " ", except° si escribes variables, constantes o una expreskin aritratica, relacional o lOgica.

La siguiente instruccion del programa /* Programa 1.1 ... */ representa la manera de escribir comentarios en el lenguaje C. Observa que todo comentario debe comenzar con 1 * y finalizar con */.

Poor otra parte, los programas se comienzan a ejecutar a partir de un determinado lugar. La instruction:

void main {void)

indica el Lugar a partir del cual se comienza a ejecutar el programa principal (main). El primer void indica que el programa no arrojara resultados de un tipo de datos. El segundo void especifica que el programa no tiene pargrnetros.

Fmalmente, es importante mencionar que todas Las instrucciones deben estar dentro de un bloque (1_ 1) y finalizar con punto y coma (;). Excepto en los casos en que las instrucciones correspondan a las estructuras selectivas, repetitivas o a timbres de funciones.

El programa 1.1 arroja el siguiente resultado:

Mi primer programa en C

1.6.1 Ca racte res de control

Los (sracteres de control producen efectos importantes en la impresion de resultados. Los diferentes caracteres de control se muestran en la siguiente tabla.

Page 40: Fundamentos de programacion - piensa en C

I 24 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

TABLA 1.15. Caracteres de control

Caracter de control Explicacion

‘n Perrnite pasar a una num linea.

It Nrrnite tabular horizonternente,

,o.+ Mrrnite tabular verticalrnente.

\ f Indica avarice de pdgina.

\ a Indica sonido de alerta.

‘ ' Escribe un apostrofe.

\ ' Escribe cornillas.

11 Escribe diagonal invertida.

Por ejemplo, La instruccion:

printf('XX \ nYY \t 27 ‘t RR') ;

produce el siguiente resultado:

xx YY 22 RR

y la instrucciOn:

printf('XX \tYY \n 27 \t RR Ina');

produce este otro:

xx YY 22 RR MY

Page 41: Fundamentos de programacion - piensa en C

1.6.2. Formato de variables

En el lenguaje de programaci6n C, el formato de lecture y escritura de las variables cambia de acuerdo con el tipo de datos que dstas puedan tener. La especificaciOn del formato es obligatoria, al escribir instrucciones de lectura (scans) y escritura {prints). En la tabla 1.16 se presenta el formato de Las variables de acuerdo con su tipo.

TABLA t 1 6. Formato de escritura de las variables

Formato Explicacion

%u Escribe enures sin sign de 2 bytes (unsigned int).

%i Escribe enteros de 2 bytes (int).

/id Irnprime enteros de largo alcance (long).

psi Fseribe reales de 4 bytes (float).

%if Escribe reales de (liable precision, 8 bytes (d DU Ole).

%e Irnprime en forma exponencial.

gtg Imprime en %I o use en funcion del tan:Lino del nornero.

sbc Escribe un caracter de un byte (char).

sras Escribe una cadena de caracteres, que Wrnina con '

Por ejemplo, al defniir las siguientes variables: float x = 6.2555, z 7.2576; int y = 4, t - -5;

la in struccion:

printfr %f %d %f x, y, z, t);

produce el siguiente resultado:

6.255566 4 7.257666 -5

1.6 Programas 25 I

Page 42: Fundamentos de programacion - piensa en C

I 26 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

Observa que el formato de las variables va entre comillas y previo a la escritura de las mismas.

Para el mismo conjunto de variables, la siguiente instrucciOn:

printfC %f 14n %d 14n %f x, y, z, t);

produce este otro resultado:

6.25ssaa 4 7.257600 -5

Es importante destacar que el lenguaje C permite ademds modificaciones al stmbolo %, con et objeto de controlar el ancho de la impresi6n, el ndmero de decimates de un flamer() real, justificar a izquierda o derecha, etc. En La siguiente tabla se presentan algunas expresiones con modificaciones en el format° y la explic.aciOn a las mismas.

TABLA t17. Modificaciones al simbolo %

Karma to Explicackin

%51:1 Escribe un entero utilizando un camp° de cinco digitos. La justificacion fredeterrninada es a la derecha

%- 6d Escribe enteros utilizando un carnpo de seis digitos. La justificacion es a la izquierda.

%4.21 Escribe un real Ulili7and0 un camp° de mar° digitos, dos de ellos serail utilizados Para los decirnales

% -5 21 Escribe un real wili/ando un camp° de cinco digitos, dos de ellos seran utilizados pare los decirnale.s. La ju.sti.ficacion es a la izquierda.

Por ejemplo, pars_ el conjunto de variables definido anteriormente:

float x 6.2555, z 7.2576; Int y = 4, t = -5;

Page 43: Fundamentos de programacion - piensa en C

1.6 Programas

27 I

la instrucciOn:

printf(464.2f \n 965.2e In 965d In x, 7, y, t);

produce el siguiente resultado:

6.25 7.266+66

4 -5

Empmmo 1.5

Observa a continuacion el programa 1.2, luego de haber analizado los caracteres de control, el formato de las variables y las modificaciones al simbolo ch. Cabe destacar que este programa corresponde al diagrama de flujo presentado en el ejemplo 1,2.

Programa 1.2

4include ‹stdio.h>

/* Invierte dates El programa, al recibir coma data un conjunto de dates de entrada, invierte el woorden de las mismos cuando las imprime.

A, B, C y 0: variables de tipo entero. *1

void main(void)

int A, B, C, 0; printf('Ingrese cuatra dates de tips entera: '1; scanf('%d %d %d %d', &A, &B, &C, SD); printf('In %d 26d %d %d ', 0, C, 6, A);

}

Observa que la instruccion de lectura scant necesita del mismo formato de variables que la instrucciOn printf analizada anteriormente. La iinica diferencia radica en que al utilizer la instrucciOn de lectura se debe escribir el simbolo de direcciOn & antes de cads variable.

Page 44: Fundamentos de programacion - piensa en C

28 Capitulo 1. Algoritmos, diagramas de flujo y programs en C

EJENFLO 1.6

A eontinuacion se presenta el programa correspondiente al diagrama de flujo del ejemplo L3.

Programa 1.3

#include <stdio.h

f* Promedia de sueldos. El programa, al recibir comp datos sets sueldos de un empleado, calcula tanto el loingreso tatal coma el pramedio mensual.

CLA: variable de tips enters. 9U1, SU2, SUS, SU4, SUS, SUS, ING, PRO: variables de tipo real. */

void main (void)

int CLA; float 9111, 8U2, SUS, SU4, SUS, SUS, ING, PRO; printf('Ingrese la clove del empleado y los 6 sueldos: kn'); scanfr%d %f %f %f %f 96f 910', &CLA, &SU1, &9J2, &8U3, &8U4, &SUS, &SUS); ING = (SU1 + SU2 + SUS + 8U4 + SUS + SUS); PRO = ING / 6; printf('kn ,id 965.2f %S. 2f', CLA, ING, PRO); }

EFENFLO 1.7

A continuaciOn se presenta el programa correspondiente al diagrama de flujo presentado en el ejemplo 1.4.

Programa 1,4

#include ‹stdia.h>

/* Superficie del triAngula. El programa, al recibir cams datos la base y la altura de un triangulo,

wolalcula su superficie.

BAS, ALT y SUP: variables de tipo real.

void main (void}

{

Page 45: Fundamentos de programacion - piensa en C

Problemas resueltos 29

float BAS, ALT, SUP; printf('Ingrese la base y la altura del triingulo: '); scanf('Pet %I", &SAS, &ALT); SUP = SAS * ALT / 2; printf('NnLa superficie del triangulo es: 9s5.21— , SUP);

Problemas resueltos

Problema PR1.1

AnaLiza cuidadosamente el siguiente programa e indica que imprime. Si to respuesta es correcta, felicitaciones. Si no lo es, revisa nuevamente los diferentes operadores pars que refuerces lo que no hayas aprendido bien.

Programa 1.3

#include <stdio.h>

1' Aplicacion de operadores. */

void main void)

int i= 5, j = 7, k = 3, m1; float x = 2.5, z = 1.8, t;

ml = (( j 96 k) / 2) + 1; m1 +- i; m1 cis= --i; printf('inEl valor de m1 es: cise, ml);

t = ((float) (j k) f 2); t++; x ++7; t -= (x += ++1); printf('%nEl valor de t es: 96.2f', t);

}

El programa genera los siguientes resultados:

El valor de ml es: 2 El valor de t es: .10.50

Page 46: Fundamentos de programacion - piensa en C

I 30 Capitulo Algoritmos, diagramas de flujo y programas en C

Problema PR1.2

Analiza cuidadosamente el siguiente programa e indica qud imprime. Si to respuesta es correcta, felicitaciones. Si no lo es, revisa nuevamente los diferentes operadores para que refuerces lo que no hayas aprendido bien.

Programa 1.6

anclude -‹stdio.h>

/* Aplicacion de operadores. */

void main(void)

int i = 15, j, k, 1;

j = (15 > 1--) > (14 < ++i); printf("E1 valor de j es: %d", j);

k = ! ( .13' != 'd') (!i - 1); printf("E1 valor de k es: %d', k);

1 = (! (34 > (70 % 2)) II 0); printf('‘nEl valor de 1 es: %d", 1);

El programa genera los siguientes resultados:

El valor de j es: 0 El valor de k es: 1 El valor de 1 es: 0

Problema PR1.3

Construye un diagrama de flujo que, al recibir come datos la longitud y el peso de un objet() expresados en pies y libras, imprima los dates de este objeto pero expresados en metros y kilos, respectivamente.

Diatos: PIE, LIB

Donde: PIE es una variable de tipo real que representa la longitud del product() en pies.

LIB es una variable de tipo real que representa el peso del product() en libras.

Page 47: Fundamentos de programacion - piensa en C

Problemas resueltos

31 1

Consideraciones:

• Un pie equivale a 0.30480 metros,

• Una libra equivale a 0.45359 kilograms.

Diagrams de flujo 1.4

PIE, LIB

MET PIE * .39480 KIL A— LIB * 0.45359

MET, KIL

EFIND DOnde: MET y KIL son variables de tipo real que almacenan los datos del objeto en metros y kilogramos, respectivamente.

A continuacion se presenta el programa correspondiente.

Programa 1.7

#include ‹stdio.h,

J* Medidas. El programa, al recibir coma datos la longitud y el peso de un objeto

• expresados en pies y libras, calcula los datos de este objeto pero en lometros y kilogramos, respectivamente.

Page 48: Fundamentos de programacion - piensa en C

I 32 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

PIE, LIB, MET y KIL: variables de tipo real.

void main(void)

float PIE, LIB, MET, KIL; printf(mIngrese los datos del objeto: ');

scanfirnsf V", &PIE, &LIB); MET = PIE * 0.30480; KIL = LIB * 0.45369; printf('InDatos del objeto \oLongitud: 566.2f It Peso: 966.2f", MET, KIL);

I

Problema PR1.4

Construye un diagrama de flujo que, al recibir como datos el radio y la altura de un cilindro, calcule e imprima el area y su volumen.

Datos: RAD, ALT

Donde: RAD +ZS una variable de tipo real que representa el radio del cilindro. ALT es una variable de tipo real que representa la altura.

Consideraciones:

• El volumen de un cilindro lo calculamos aplicando la siguiente formula:

Volumen = a * radial * altura

Formula 1,2

Donde: Tr = 3.141592

• La superficie del cilindro la calculamos como:

Area = 2 * * radio * altura

Formula 1.3

A continuaciOn se presenta el diagrama de flujo correspondiente.

Page 49: Fundamentos de programacion - piensa en C

ProbIernas resueltos 331

Diagrarna de flujo 1.5

RAD, ALT

Nici,-..D

T

VOL 4-- 3.141592 * (RAD ** 2) * ALT ARE 2 * 3.141592 * RAD * ALT

VOL, ARE

-"----------

Donde: VOL es una variable de tipo real que almacena el volumen del cilindro. ARE es una variable de tipo real que almacena el area.

Programa 1.8

#include ‹stdio.h> #include ‹math.h>

i* Valumen y Area del cilindra El programa, al recibir coma datos el radio y la altura de un cilindro,

wicalcula su Area y su volumen.

RAD, ALT, VOL y ARE: variables de tipo real. *1

void main(uoid)

i

Page 50: Fundamentos de programacion - piensa en C

I 34 Capitulo 1. Algoritmos, diagramas de flujo y programs en C

float RAD, ALT, VOL, ARE; printf('Ingrese el radio y la altura del cilindro: '); scanf('96f %f', &RAD, MLT); /* It1_PI es una constante definida en math.h qua contiene el valor de PI */ VOL = M_PI * pow (RAD, 2) * ALT; ARE = 2 * * RAD * ALT; printf('inEl volumen es: 914.2f lit El Area es: gb0.2r, VOL, ARE);

}

Observa que Para realizar el programa fue necesario introducir la biblioteca mat h .h ,

que contiene la funcion pow(x, y) y la constante !LPL En la tabla 1.18 se describen

las funciones ma's importantes de la biblioteca math .h . Las variables x y y son de

tipo double y las funciones regresan tambi6n valores de ese tipo. Cabe destacar

que un error de dominio se produce si un argumento esti fuera del dominio sobre el cual esti definida la funciOn,

Tabla 1.18. Funciones de la biblioteca rnath.h

Funcion Expllcacion

ain(x) Obtiene 0 send de x.

asin{x) Obtiene el arco seno de x.

cos(x) Obtiene el coseno de x.

acos(x) Obtiene el arca coseno de x.

tan(x) Obtiene la tangente de x.

atan(x) Obtiene el arca tangente de x.

exp(x) Funcian exponencial ex, Eleva s (2,718281) a la potencia de x,

labs(x) Devuelve el valor absoluta de x.

Imod(xl,x 2) Obtiene el resto de xi entre x2, ,con el misn►o signo que xi,

log (x) Devuelve el lagaritma natural de x, in (x) , x 0.

10910( x) Devuelve el lagaritma base 10 de x, 10910(x), x 0,

Pdvi{x, y) Potencia, xY x a O,y 0.

sqrt(x) Obtiene la rain cuadrada de x x 0.

Page 51: Fundamentos de programacion - piensa en C

Problemas resueltos

Problema PR1.5

Una persona comprO una estancia en un pais sudamericano. La extension de la estancia estd especificada en acres. Construye un diagrama de flujo que, al recibir COMO date la extensiOn de la estancia en acres, calcule e imprima la extensiOn de la misma en hectareas.

Data: ECA (variable de tipo real que especifica la extension de la estancia en acres).

Consideraciones:

• 1 acre es igual a 4047 rn2.

• 1 hectaiea tiene 10,OOO ni2.

Diagrama de flujo 1.6

rNiao

ECA

ECA ECA * 4047 10000

ECA

Page 52: Fundamentos de programacion - piensa en C

36 Capitulo 1. Algoritmos, diagramas de flujo y programs en C

Programa 1.9

#include ‹stdia.h,

I* Estancia El programa, al recibir coma data la superficie de una estancia expresada

*en acres, la canvierte a hectareas.

ECA: variable de tipo real. */

►void main(void)

float ECA; printf('Ingrese la extension de la estancia: '); scanf('W, &ECA); ECA ECA * 4947 1 10000; printf(Extensibn de la estancia en hectareas: 96.2f', ECA);

I

Problerna PR1.6

Construe un diagrama de flujo que, al recibir oomo datos los trey lados de un triangulo, calcule e imprima su area. Esta se puede calcular aplicando la siguiente formula:

AREA — VAUX * (AUX — LAI) * (Aux — LA2) * (AUX — LA3)

AUX — (LAI + LA2 + LA3) /2

Formula 1.4

Datos: L.A1 , LA2, LA3 (variables de tipo real que expresan lados del triangulo).

Page 53: Fundamentos de programacion - piensa en C

Problernas resueltos 37

Diagrarna de flujo 1.7

(11SUCIO

LA1, LA2, LA3///

AUX *—{LA1 + LA2 + LA3) / 2 ARE{—{AUX * (AUX—LAI) * (AUX —LA2) * (AUX —LA3)) ** 0.5

ARE

Donde: Aux es una variable de tipo real, que se utiliza come auxiliar pals el calculo del area ARE es una variable de tipo real que almacena el area del triangulo.

Programa 1.10

#include .‹stdio.11, #include .(math.h>

/* Area del triangulo El programa, al recibir los tree lados de un triangulo, calcula su area.

LA1, LA2, LA3, AUX y ARE: variables de tipo real.

void main(void) { float LA1, LA2, LA3, AUX, ARE; printf('Ingrese los lados dal triangulo: '); scanf('W f %f', 8LA1, &LA2, &LA3); AUX - (LA1 + LA2 + LA3) / 2; ARE = sqrt (AUX * (AUX-LA1) * (AUX-LA2) * (AUX - L43)); printf('InEl area del triangulo es: 443.2f', ARE

Page 54: Fundamentos de programacion - piensa en C

LA1 ( (X1- X2) ** 2 + (Y1- Y2) ** 2) ** 0.5 LA2 4- ( (X2- X3) ** 2 + (Y2- Y3) ** 2) ** 0.5 LA3 4- ( (X1- X3) ** 2 + (Y1- Y3) ** 2) ** 0.5

PER 4- ( LA1 + LA2 + LA3)

38 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

Problema PR1.7

Construye un diagrama de flujo que, al recibir como datos las coordenadas de los puntos P1, P2 y P3 que corresponden a los v6rtices de un triangulo, calcule su perImetro.

Datos: X1, Y1, X2, Y2, X3, Y3 (variables de tipo real que representan las coordenadas de los puntos P1, P2 y P3).

Consideraciones:

• Para calcular la distancia DIS entre dos puntos datos Pi y P2 aplicamos la siguiente fkinnula:

DIS = V(X1 — X2)2 + (Y1 — Y2)2

Formula 1,5

Diagrama de flujo 1.8

INICIO

/X1 , Yi, X2, Y2, X3, Y3

PER

Page 55: Fundamentos de programacion - piensa en C

Problemas resueltos 39

Donde: LA1, LA2 y LA3 son variables de tipo real que se utilizan para almacenar los resultados de los lades 1, 2 y 3, respectivamente.

PER es una, variable de tipo real que almacena el perimetro del triAngulo.

Programa 1,11

#include ‹stdia.h).

#include cmath.h>

i* Perimetro del triengulo.

El programa, al recibir las coordenadas de los puntos P1, P2 y P3 que

wocorresponden a los vertices de un triangulo, calcula su perimetro.

X1, Y1, X2, Y2, X3, Y3, LA1, LA2, LA3 y PER: variables de tips real. *1

void main(vaid)

11011# X1,Y1,X2,Y2,X3,Y3,LA1,LA2,LA3,PER;

printf('Ingrese la coordenada del punto P1:');

scanfCcisf 96r, &Xi, &Y1 );

printf('Ingrese la coordenada del punto P2:');

scanf('W gsr, &X2, &Y2 );

printf('Ingrese la coordenada del punt° P3:');

scanf('96f gdar, 313, 20'3 );

LA1 = sqrt(pow(X1-X2, 2) + pow(Y1-Y2, 2));

LA2 = sqrt(pow(X2-X3, 2) + pow(Y2-Y3, 2));

LA3 = sqrt(pow(X1-X3, 2) + pow(Y1-Y3, 2));

PER = LA1 + LA2 + LA3;

printf('InEl perimetro del triangula es: 966.3r, PER);

Page 56: Fundamentos de programacion - piensa en C

40 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

Problemas suplementarios

Problema P51.1

Analiza cuidadosamente el siguiente programa e indica pd. imprime:

Programa 1.12

anclude ‹stdio.h>

f* Aplicacion de operadores.

void main(void)

int i, j, k = 2, 1 = 7;

= 9 + 3 * 2; j = 8 96 6 + 4 * 2; i 96= j; printf('‘nEl valor de i es: %d', i);

++1;

--k -= 1++ * 2; printi('tnEl valor de k es: %d', k);

= 5.5 -3 * 2 96 4;

j T (i * 2 - (k = 3, --k)); printf('‘nEl valor de j es: 96d', j);

}

Problema P51.2

Analiza cuidadosamente el siguiente programa e indica que. imprime:

Programa 1.13

#include ‹stdio.h,

/* Aplicacian de operadores. */

void main(void)

int i = 5, j = 4, k, 1, m;

Page 57: Fundamentos de programacion - piensa en C

Problemas suplementarios 41

k = * 3 + --j *2 - 3; printf('‘nEl valor de k es: Aid', k);

1 = ! (11 0 1 8.8, 2) as 1; printf('inEl valor de 1 es: Aid', 1);

m = (k = (1 (12 = (141 11 && k, (k I))); printf('1nE1 valor de m es: m);

}

Problema P51.3

Construye un diagrama de flujo y el correspondiente programa en C que, al reci-bir como datos dos mimeros reales, calcule la suma, testa y multiplicaci6n de di-chos mimeros,

Datos: N1, N2 (variables de tipo real que representan los ntimeros que se ingresan).

Problema P51.4

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como datos el costo de un artkulo vendido y la cantidad de dinero entregada pot- el cliente, calcule e imprima el cambio que se debe entregar al cliente.

DatOS: PRE, PAG

Donde: PRE es una variable de tipo real que representa el precio del producto. PAG es una variable de tipo real que representa el pago del cliente,

Problema P51.5

Construye un diagrama de flujo y el programa correspondiente en C, que al reci-bir Como dato el radio de un circulo, calcule e imprima tanto su area comp la longitud de su circunferencia.

Dato: RAID (variable de tipo real que representa el radio del circulo).

Page 58: Fundamentos de programacion - piensa en C

I 42 Capitulo 1. Algoritmos, diagramas de flujo y programs en C

Cons ideraciones:

• El area de un circulo la calculamos corm:

Area = radio2

Formula 1.6

• La circunferencia del cfrculo la calculamos de la siguiente forma:

Circunferenda = 2 * * radio

F6rmula 1.7

Problema PS1.6

En una caw de cambio necesitan construir un programa, tal que at dar corno dato una cantidad expresada en dOlares, convierta esa cantidad a pesos. Construye el diagrams de flujo y el programa correspondiente.

Dow: CAN (variable de tipo real que representa la cantidad en clolares).

Cons ideraciones:

• Torna en cuenta que el tipo de cambia actual es el siguiente:. 1 &flu —) 12.48 pesos.

Problema PS1.7

Escribe un programa en C que genere una impresi6n, utilizando b instrucciOn prints, coma la que se muestra a continuadon:

XXXX XX

XXX XXX

XXX XX

XXX

Page 59: Fundamentos de programacion - piensa en C

VMS — TSE (Segundos)

DIS(Metros)

VKH = 1000(hora)

VMS * 3600(Kifolnetros)

Problema P51.8

En las olimpiadas de inviemo el tiempo que realizan los participantes en la empetencia de velocidad en pista se mide en minutes, segundos y centesimas. La distancia que recorren se expresa en metros. Construye tanto un diagrama de flujo come un programa en C que calcule la velocidad de los participantes en kilometres per hora de las diferentes competencias.

Datos: CPIS, MIN, SEG, CEN

Donde: CIS es una variable de tipo entero que indica la distancia del recorrido. MI N es una variable de tip° entero que representa el ndmero de minutes. SEC es una variable de tip° entero que indica el 'Amer° de segundos. CEN es una variable de tipo entero que representa el ntimere de centsirnas.

Consideraciones:

• El tiempo deberaos expresarla en segundos, y para hacerlo aplicanbos la siguiente fdrrnula:

TSE = MIN * 60 + SEG + CEN / 100

Formula 1.8

• Luego podernos calcular in velocidad expre.sada en metros sabre segundos (nits):

Formula 1.9

• Para obtener la velocidad en 1011.inietros per tiara (K/h), apliearnos la siguiente Rirrnula:

Problemas suplementarios 43 I

Formula 1.10

Page 60: Fundamentos de programacion - piensa en C

44 Capitulo Z. Algoritmos, diagramas de flujo y programas en C

Problema P51.9

Construye un diagram de flujo y el correspondiente programa en C que calcule e imprima el ntimero de segundos que hay en un determinado ndmem de dfas.

Moo: DIA (variable de tipo enter!) que representa el ndmen-.) de dias),

Problema P51.10

Escribe un programa en C que, al recibir como data un ndmero de cuatro digitos, genere una impresiOn como la que se muestra a continuacion (el ntimero 6352):

6 3 5 2

Problems PS1.11

Construye un diagrama de flujo y el correspondiente programa en C que, al reci-bir como datos el radio, la generatriz y la altura de un cono, calcule e imprima el area de La base, el area lateral, el area total y su volumen.

Datos: RAD, ALT, GEN

Donde: RAG es una variable de tipo real que representa el radio del cono. ALT es una variable de tipo real que indica la altura. GEN es una variable de tipo real que representa La generatriz.

Cons ideraciones:

• in cono tiene La siguiente forma:

FIGURA 1.4

Page 61: Fundamentos de programacion - piensa en C

Problemas suplementarios 45

• El area de la base se calcula de la siguiente forma:

Area base = TE * radio2

F6rmula 1.11

▪ El area lateral se calcula asi:

Area lateral = TE * radio * gene

Formula 1.12

• El area total se calcula como:

Area total = AB + AL

Formula 1,13

• El volumen se calcula de la siguiente forma:

%lumen = * AB * ALM 3

Formula 1,14

Problema P51.12

Construye un diagrama de flujo y el programa, correspondiente en C que, al reci-bir eomo dato el radio de una esfera, calcule e imprima el area y su volumen.

Data: R.6.e (variable de tipo real que representa el radio de la. esfera).

Consideraciones:

• Una esfera tiene la, siguiente forma:

FIGURA 1.5.

Page 62: Fundamentos de programacion - piensa en C

46 Capitulo 1. Algoritmos, diagramas de flujo y programas en C

• El area de una esfera la calculamos de la siguiente forma:

Area = 4 * radio2

Formula 1.15

• EL volumen de una esfera se calcula asi:

Nblumen = —1

* TC * radio' 3

Formula 1.16

Problerna PS1.13

Construye un diagrama de flujo y el correspondiente programa en C que, al reci-bir come dato el lade de un hexaedro o cube, calcule el area de la base, el area lateral, el area total y el volumen.

Dato: LAD (variable de tipo real que representa, el lade del hexaedro).

Consideraciones:

• Un hexaedra a cubs tiene la siguiente forma:

FIGURA 1.6. L L

• Para calcular el area de la base aplicamos la siguiente formula:

Area base = L2

Formula 1.17

• Para calcular 0 area lateral uttlimmos:

Area lateral = 4 * L2

Formula 1.18

Page 63: Fundamentos de programacion - piensa en C

Problemas suplementarios 41

• Para calcular el area total utilizamos:

Area total = 6 * I}

FOrmula 1.19

• Para calcular el volumes utilizauaos:

Volumen =

Formula 1.20

Problema PS1.14

Construye un diagrama de flujo y el respectivo programa en C que, al recibir co-ma datos las coordenadas de los puntos Pi , P2 y P3 que corresponden a los verti-ces de un tricingulo, calcule su superficie.

Datos: xi, vi, X2, Y2, X3, Y3

Donde: XI y Y1 son variables de tipo real que indican las coordenadas del panto Pl. x2 y Y2 son variables de tipo real que representan las coordenadas del pinto P2.

X3 y Y3 son variables de tipo real que indican las coordenadas del pinto P3,

Consideraciones:

• Para calcular el area de un triiingulo dadas las coordenadas de los vertices que la componen, podernos aplicar La siguiente fOrrnula:

1 Area = 2 * I X1 * (Y2 —Y3) + )C2 * (Y3 —Y1) + X3 * (Y1 —Y2) I

Nrmula 1,21

Page 64: Fundamentos de programacion - piensa en C
Page 65: Fundamentos de programacion - piensa en C

CAPITULO 2 Estructuras algoritmicas selectivas

2.1 Introduccion

Las estructuras lOgicas selectivas se encuentran en la soluciOn algoritmica de casi todo tipo de problemas, Estas estructuras se utilizan cuando se debe tomar una decision en el desarrollo de la soluciOn de un problema. La toma de decision se basa en la evaluaciOn de una o mas condiciones que nos serialark como consecuencia la rama a seguir,

Es frecuente que nos encontremos con situaciones en las que debemos tomar varias decisiones. Cuando esto ocurre, decimos que se realizan en cascada. Es decir, se toma una decision, se seriala el camino a seguir, nos encontramos con otra decision, se marca el siguiente camino, y asi sucesivamente. En estos casos practicamente debemos construir un arbol de decisiOn Para plantear b solucion.

Page 66: Fundamentos de programacion - piensa en C

I SO Capitub 2. Estructuras algoritmicas selectivas

Las estructuras algoritmicas selectivas que estudiaremos en este capitulo son las siguientes: 11, if y switch, Cabe destacar que cuando las estructuras selectivas se aplican en caseada, en realidad se utiliza una combination de las estructuras serialadas anteriormente.

2.2 La estructura selectiva simple if

La estructura selectiva if permite que el flujo del diagrama siga por un camino especffico si se cumple una condiciOn determinada. Si al evaluar la condiciOn el resultado es verdadero, entonces se sigue por un camino especifico —hacia abajo— y se ejecuta una operacift o =ion o un conjunto de ellas. For otra parte, si el resultado de la evaluacion es falso, entonces se pasa(n) por alto esa(s) operacion(es). En ambos easos se continua con la secuencia normal del diagrama de flujo. Observemos b representation grAfica de esta estructura:

OPERACION

FIGLl 2.1 Estructura selectiva simple if

Page 67: Fundamentos de programacion - piensa en C

E s true tura selective If

2.2 La estructura selectiva if

511

En lenguaje C, la estructura selectiva if se escribe de la siguiente forma:

/* El cord unto de instrucciones muestra la sintaxis de la 10 estructura if en el lenguaje C. */

if (‹condicion) ‹Dperacion›;

EmparLo 2.1

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir coma data el promedio de un alumna en un curso universitario, escriba aprobado

en caso de que el promedio sea satisfactorio, es decir mayor o igual a 6.

Dato: PRO (variable de tipo real que representa el promedio del alumna).

Diagrama de flujo 2.1

CNICIO ---)

Si

'Aprobada'

------------ -A

Page 68: Fundamentos de programacion - piensa en C

52 Capitulo 2. Estructuras algoritmicas selectivas

En la tabla 2.1 podemos observar el seguimiento del diagrama de flujo para diferentes corridas.

TABLA 2.1.

Namero de Data corrida PRO

Resuttado

1 6.75 aprobado 2 5.90

3 4.00 4 8.80 aprobado

5 9.35 aprobado

A continuacion se presenta el programa correspondiente.

Programa 2.1

#include ‹stdio.h>

If* Promedio curso. El programa, al recibir comp data el promedio de un alumna en un curso

I*universitario, ascribe aprobado si su promedia as mayor a iguai a 6.

PRO: variable de tipo real. *I

void main (void) { float PRO; printfl'ingrese el promedio del alumna: "); scant("9iff", &PRO); if ( PRO = 6)

printf{ '1,nAprobado"); }

LIERUBLO 2.2

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como dato el precio de un producto importado, incremente 11% el mismo si es inferior a $1,500 y que ademis escriba el nuevo precio del producto.

Dato: PRE (variable de tipo real que representa el precio del producto).

Page 69: Fundamentos de programacion - piensa en C

2.2 La est ructura selectiva if 53

Diagrama de fluja 2.2

INICIO

Es truoura selectiva if

PRE

NPR PRE*1 .11

• NPR

Donde: NPR es una variable de tipo real que almacena el nuevo precio del producto.

Programs 2.2

#include <stdio.h> /* Incremento de precio. El programa, al recibir coma data el precio de un product° importado,

wrincrementa 11% el mismo si este es inferior a $1,600. PRE y NPR: variable de tipo real. */

void main(void)

{ float PRE, NPR; printf("ingrese el precio del producto: "); scanf("14", &PRE);

Page 70: Fundamentos de programacion - piensa en C

I 54 Capitulo 2. Estrueturas algoritmicas selectivas

if (PRE < 1500)

{ NPR = PRE * 1.11; printl("InNuevo precio: 417.2f", NPR);

} }

2.3. La estructura selectiva Kahle if-else

La estructura selectiva doble else permite que el flujo del diagrama se bifurque por dos rams diferentes en el punto de la toma de decisiOn. Si al evaluar la condi-cite el resultado es verdadero, entonces se sigue por un camino especffico —el de la izquierda— y se ejecuta una acciOn determinada o un conjunto de ellas. Por otra parte, si el resultado de la evaluaciOn es falso, entonces se sigue por otro camino —el de la derecha— y se realiza(n) otra(s) accion(es). En ambos casos, luego de ejecutar las acciones correspondientes, se continua con la secuencia normal del diagrama de flujo. Observemos la representaciOn grafi' ca de esta estructura.

OPERACION

OPERACION 2

FIGURA 2.2 Extructura selectiva doble if - els e

Page 71: Fundamentos de programacion - piensa en C

Estructura selectiva if-else

1'

"REPROBAIDO"

4

'APROBADO'

2.3 La estructura selectiva doble if -else

55

En el lenguaje C la estructura selectiva doble ii -else se escribe de la siguiente forma:

f* El conjunto de instrucciones muestra la sintaxis de is estructura k11.11- oleo en C. *1

- - if (‹condicidnr)

‹operecionir;

2 else

‹operacion2r;

EJEMPLO 2.3

Construye un diagrams de flujo y el programa correspondiente en C que, al recibir como dato el promedio de un alumno en un curso universitario, escriba aprobado

Si SU promedio es mayor o igual a 6 y reprobado en case contrario.

Daly: PRO (variable de tipo real que representa el promedio del alumno).

Diagrama de flujo 2.3

CHND

Page 72: Fundamentos de programacion - piensa en C

I 56 Capitub 2. Estructuras algoritmicas selectivas

En la tabla 2.2 podemos observar el seguimiento del algoritmo para diferentes corridas.

TABLA 2.2.

Mirnero de Dato

Resuitado corrida PRO

1 4.75 Rcprobado 2 6.40 Aprobado

3 8.85 Aprobado

4 5.90 Reprobado

A continuaciOn se presenta el programa correspondiente.

Programa 2.3

*include cstdio.h>

/* Promedio curso. El programa, al recibir comp data el promedio de un alumno en un curso louniversitario, escribe aprobado si au promedio es mayor o igual a 6, o • reprobado en caso contrario.

PRO: variable de tipo real. */

void main (void) { float PRO; printf('Ingrese el promedio del alumna: '); scanT('W', &PRO); if (PRO >= 6.0)

printfl'ImAprobado'); 0.80

printl("InReprobado');

}

EJEFAPLO 2.4

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir come date el precio de un producto importado, incremente 11% el mismo si es inferior a $1,500, y 8% si fuera mayor o igual a dicho precio; adern65, debe escribir el nuevo precio del producto.

Darn; PRE (variable de tipo real que representa el precio del producto).

Page 73: Fundamentos de programacion - piensa en C

2.3 La estructura selectiva doble if -else 57

Diagra ma de flujo 2.4

CINICKI

2

/ PRE / Estructura selectiva it-else

NPR 4— PRE * 1 .11 NPR PRE* 1 . OB

DO

V

NPR

CHND Donde: NPR es una variable de tipo real que almacena el nuevo precio del producto.

Programa 2.4

#include <stdio.h>

/* increment° de precio. El programa, al recibir comp dato el precio de un product°, incrementa al womiamo 11% si es menor a 1500$ y B% en caso contrario (mayor o igual).

PRE y NPR: variables de tipo real. */

void main(void) { float PRE, NPR; print1CIngrese el precio del producto: "); scanIC261', &PRE); if (PRE < 1509)

NPR - PRE * 1.11; 0100

Page 74: Fundamentos de programacion - piensa en C

V

ACC ONN

SELECTOR

Valor'

ACCIONI

ValorN

V

Valor2

ACCION2

58 Capitub 2. Estructuras algoritmicas selectivas

NPR = PRE * 1.08; printf{' nNuevo precio del producto 5101.2P, NPR);

2.4. La estructura selectiva multiple switch

La estructura selectiva switch permite que el flujo del diagrams se bifurque por varias camas en el punto de la toma de decision. La demi% del camino a seguir depende del contenido de in variable conocida como selector, la cual puede tomar valores de un conjunto previamente establecido. El camino elegido, entonces, dependera del valor que tome el selector. Ad, si el selector toma el valor 1, se ejecutara la accion 1; si toma el valor 2, se ejecutara b, accion 2, y si toma el valor N, se realizara La accion N. A continuacion se presenta la figura que ilustra esta estructura selectiva.

I. D

ACCIONN+1

FIGURA 2.3

Estructura selectiva msittipie switch

Page 75: Fundamentos de programacion - piensa en C

De otra forma

SELECTOR

Valor V

ACCION1

Valor2,3.4 V

ACCION2

NrelOr5.6 V

ACCION3

V

ACCIONx

ACCION y

24 La estructura selectiva multiple switch

5' 1 En el lenguaje C la estructura selectiva multiple switch se escribe de esta forma:

f* El conjunto de instrucciones muestra la sintaxis de la estructura switch *en C. */

. . . SWitChl<selector>)

case ‹valor,› : caccion,›;

break; /* Es necesario escribir break pare no evaluar los *otros cases. */

case <v alor? : z a cci break;

cats <valor? : <accione; break;

} acci6nN„; . . .

Es importante sefialar que la estructura selectiva switch es muy flexible, lo que permite que se pueda aplicar de diferentes formal Per ejemplo, si el selector tomara. un valor distinto de los comprendidos entre 1 y N, entonces se debe seguir el camino etiquetado con Lie otra forma.

• • •

FIGURA 2.4

Evtructura sekctiva milltipk switch

Page 76: Fundamentos de programacion - piensa en C

I 60 Capitulo 2. Estructuras algoritmicas selectivas

En el lenguaje C el diagrama de flujo se escribe de la siguiente forma:

/* El conjunto de instrucciones muestra la sintaxis de la estructura switch Wen C. *f

sWit0h(<selector>) {

case <valor?. : <accione; break;

case ‹valor,r case <valor? ease <valore : <accionir;

break; case <valor? case <valor?' : <acci6113>;

break; default : : ‹accien,›;

break; 1 accion,; - -

/* Para salir del switch */

EJEWL0 2.5

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir coma datos dos variables de tipo entero, obtenga el resultado de la siguiente funciOn:

V' - -NT)

T/5 Si OP

T ** T Si OP 2

6*Tf 2 Si OP - 3, 4

Para cualquier otro case.

Daft's: OP y T

Donde: OP es una variable de tipo entero que representa el calculo a realizar. T es una variable de tipo entero que se utiliza para el cilculo de la fluxion.

Page 77: Fundamentos de programacion - piensa en C

OP, T

De otra forma

Y4-175 4—T ** T *—B * T/2 Y 1

V

3,

OP

1 2

24 La estructura selectiva multiple switch 61 I

Diagrarna de flujo 2.5

lrilCI Est-Kt-um selectiva

switch

c;_D Donde: RES es una variable de tipo real que almacena el resultado de la funciOn.

Programa 2,5

*include ‹etdio.h> *include loath.rp

/* Funcidn maternatica. El programa obtiene el resultado de una funcion.

OP y T: variables de tipo entero. Y: variable de tipo real. */

void main(void) { int OP, T; float Y; printWIngrese Is opcion del calculo y el valor enter*: ');

Page 78: Fundamentos de programacion - piensa en C

I 62 Capitulo 2. Estructuras algoritmicas selectivas

scant( 9191 &OP, &T); awitchi0P)

calm 1: Y = T / 5; break;

Me 2: Y = pnw(T,T); /* La funcion pow seta definida en in blblioteca math.h *1

break; Cale 3: case 4: Y = 6 * T/2;

break; default: Y = 1;

break; 1 printWOResultado: 1117.21', Y); }

EJEPAPLO 2.6

Construye un diagrama de No y el correspondiente programa en C que, al recibir como datos el nivel acadanico de un profesor de una universidad asi como su salario, incremente este ultimo siguiendo las especificaciones de la tabla 2.3 e imprima tanto el nivel del profesor como su nuevo salario.

Datos: NIV y SAL

Donde: NIV es una variable de tipo entero que representa el nivel del profesor. SAL es una variable de tipo real que representa el salario del profesor.

TABLA 2.3.

iVivei Incremento 1 3.5%

2 4.1%

3 4.8% 4 5.3%

Page 79: Fundamentos de programacion - piensa en C

2.4 La estructura selectiva multiple switch

63

Diagrama de flop 2.6

lIN C5ICD Estracture selective

switch

/NIV SAL

NIV

SAL 4- SAL * 1.035

2

SAL 4- SAL * 1.041

3

SAL 4- SAL * 1.84S SAL 4—SAL * 1.153

NIV, SAL

El programa en lenguaje C se escribe de esta forma:

Programa 2.6

#include -‹stdics.tp.

/* Increments de Wafts. El programa, al recibir cams data el nivel de un professr, incrementa su

losalaris en funcion de la tabla 2.3.

NIV: variable de tips enters. SAL: variables de tips real. */

void main void)

float SAL; int NIV; printf('Ingrese el nivel academics del profesor: ');

&NIV);

Page 80: Fundamentos de programacion - piensa en C

I 64 Capitula 2. Estructuras algoritmicas selectivas

printfl'Ingrese el salario: • ; scanfribr, &SAL); WitCh(NIV) print-Wingrese el salario: • ) ; scanWsW, &SAL); switch{NIV)

case 1: SAL = SAL * 1.035; break; MOO 2: SAL = SAL * 1.041; break; case 3: SAL = SAL * 1.04B; break; case 4: SAL = SAL * 1.053; break;

} print1V0 1 1Nivel: 9ed 10luevo salario: 10.21',NIV, SAL);

2.5. Estructuras selectivas en cascada

En el desarrollo de la soluciOn de problemas se encuentran frecuentemente casos en los que, luego de tomar una decision y serialar el correspondiente camino a seguir, es necesario tomar otra decisiOn. Este proceso se puede repetir numerosas veces. Una forma de solucionarlo es aplicando astrexturas selectivas en cascada. Analicernos a continuaciOn diferentes casos.

EFENglist 2.7

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como datos las yentas de tres vendedores de una tienda de discos, escriba las mismas en forma descendente. Considera que todas las yentas son diferentes y no utilices operadores lOgicos para agrupar las condiciones.

Datos: P, S y R (variables de tipo real que representan las ventas de los tres vendedores).

Page 81: Fundamentos de programacion - piensa en C

Estructuras selectivas en cascad.as if-else

Sf

R, 8, P ____,—

25 Estructuras selectivas en cascade 65

Diagrama de flujo 2.7

A continuaci6n se presenta el programa correspondiente,

Programa 2.7

#include <stdio.h>

/* yentas descendentes.

El programa, al recibir corno datos tres valores qua representan las yentas r►de los vendedores de una tienda de discos, ascribe las yentas en ■►orden descendente.

P, S y R: variables de tipo real.. */

Page 82: Fundamentos de programacion - piensa en C

I 66 Capitulo 2. Estructuras algoritmicas selectivas

woid main(void)

{ float P, 5, R; printfl'%nIngrese las yentas de los tree vendedores: '); scanfCter &P, &S, &R); if (P r S)

if (P r R) if 0 r R)

printf('‘nlm El orden es P, S y R: %B.21 068.21 c158.21', P, S, R); else

printif"In‘n El orden es P, R y S: %B.21 %8.21 *68.21', P, R, S); else

printf('‘On El orden es R, P y S: Ps8.21 818.21 R, P, S); else

if IS r R) if (P r R)

printfl'‘n‘n El orden es S, P y R: %8.21 %8.2f 96.8.21', 8, P, R); else

printff"\n‘n El orden es 8, R y P: %8.2f 558.21 %EN— , S, R, P); else

printf("In0 El orden es R, S y P: 501.2f sIsB.2f 9458.2f', R, S, P); I

EFEWL0 2.8

Construye un diagrama de flujo y el programa correspondiente que, al recibir como datos la matricula, la carrera, el semestre que cursa y el promedio de un alumno de una universidad privada de Lima, Pent, determine si el alumno puede ser asistente de alguna de las cameras que se ofrecen en la universidad. si el alumno retine los requisitos planteados en la tabla 2.4, se debe escribir su matricula, la carrera y el promedio correspondiente.

TABLA 2.4

Carrera Sernestre Promedio

Industrial: 1 > 6 8.5

Telernaica: 2 > 5 > 9.0

ComputaciOn; 3 > 6 > 8.8

Mocanica: 4 7 9.0

DatOS: MAT, CAR, SEM y PRO

Page 83: Fundamentos de programacion - piensa en C

De atm forma

"Error an la carrera"

•-_------

25 Es-tructuras selectivas en cascara 67 I

Donde: MAT es una variable de tipo entero que indica la matricula del alumno. OAR es una variable de tipo entero que representa la carrera. SEM es una variable de tipo entero que seftala el semestre que cursa. PRO es una variable de tipo real que indica el promedio del alumno.

Diagram de fluke 2.8

INICIO

ENtructaras selectivas anidadas witch 0 if

/laa.T7 OAR, SRI, PRO

A continuaciOn presentamos el programa correspondiente.

Programa 2.8

#in clucle ‹stdio _Fp.

If* Asistentes.

Page 84: Fundamentos de programacion - piensa en C

I 68 Capitulo 2. Estructuras algoritmicas selectivas

El programa, al recibir comp dates in matricula, la carrera, el semestre 101 el promedio de un alumno de una universidad privada, determine si *este puede ser asistente de au carrera.

MAT, CAR y SEM: variables de tipo entero. PRO: variable de tipo real. */

void main(void)

{ int MAT, CAR, SEM; float PRO; printi('Ingrese matricula: '); scani('%d', &MAT); printfl'Ingrese carrera (1-Industrial 2-Telemetica 3-Computacion 4-Mecanica) : '); scanf('cild', &CAR); printfl'Ingrese semestre: '); scanf('ikid', &SEM); printl('Ingrese promedio: '); scanf('%1', &PRO); WiltchICAR) {

case 1: if (SEM > 6 && PRO ›- 8.5) printl("In%d %d %5.2f', MAT, CAR, PRO);

break; case 2: if (SEM >= 5 && PRO >= 9.0)

printl("Ind sild 165.21, MAT, CAR, PRO); break;

case 3: if (SEM >= 6 && PRO ›-= 8.8) printI('‘n15d led 165.21', MAT, CAR, PRO);

break; case 4: if (SEM ›- 7 && PRO >= 9.0)

printf('Iln%d ged %5.21', MAT, CAR, PRO); break;

default: printf('O Error en in carrera'); break;

}

}

A eontinuacion se presenta una serie de problemas resueltos, disenados wino elementos de ayuda para el analisis y b retencian de los conceptos. Mds adelante se presenta una serie de problemas suplementarios cuidadosamente seleocionados.

Page 85: Fundamentos de programacion - piensa en C

RES 41- R** 4- T 3 + 4 * 0** 2

R, T,

Problemas resueltos

69

Problemas resueltos

Problems PR2.1

Escribe un diagram), de flujo y el correspondiente programa en C que, at recibir como dates trey valores enteros R, T y 0, determine si los mismos satisfacen la siguiente expresiOn, y que, en caso afirmativo, escriba los valores correspondientes de R, T y 0.

R4 - Ts + 4 * 02 < 820

Dates: R, T y 4 (variables de tipo entero).

Diagrarna de flujo 2.9

2

Donde: eva es una variable de tipo real que almacena el resultado de la expresiOn.

Page 86: Fundamentos de programacion - piensa en C

1 70 Capitulo 2. Estructuras algoritmicas selectivas

Progrtuna 2.9

#include rstdio.h,

#include rmath.h>

/* Expresion.

El programa, al recibir comp datos tree valores enteros, establece si los

lomismos satislacen una expresion determinada.

R, Ty 0: variables de tipo entero.

RES: variable de tipo real. */

Void main(Vold)

{

float RES;

int R, T, 0;

printl("Ingrese los valores de R, T y 0: ");

scan11"%d Ald %V, &R, &T, &Q);

RES = pow(R, 4) - pow(T, 3) + 4 * pow(0, 2);

if (RES < B29)

print1('1nR = 515dlytT = %MA 0 = @5d", R, T, 0);

}

Problema PR2.2

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como dato un rainier° entero, determine e imprima si el mismo es par, impar o nub°,

pato: NUM (variable entera que representa el ntimero que se ingresa).

Page 87: Fundamentos de programacion - piensa en C

Problernas resueltos

71i

Diagrama de fluja 2.10

2

Programa 2.10

#include <stdio.h' #include <math.h>

/* Par, impar o nulo.

NUM: variable de tipo entero. *f

void main(vaid) (

int NUM; printf("Ingrese el nUmero: " ) ; scanf("%d", &NUM); if (NUM == 0)

printf("InNulo"); also

if (pow (-1, NUM) ›- 0) printf("\nPar");

else printf("\nImpar");

I

Page 88: Fundamentos de programacion - piensa en C

1 72

Capitulo 2. Estructuras algoritmicas selectivas

Problema PR2.3

Construye un diagrama de flujo y el correspondiente programa en C que permita calcular el precio del billete ida y vuelta en ferrocarril, conociendo tanto la distancia entre las dos ciudades como el tiempo de estancia en la, ciudad destino. Si el nilmero de E1a5 de estancia es superior a 10 y la distancia total (ida y vuelta) a recorrer es superior a 500 km, el precio del billete se reduce 20%. El precio por km es de $0.19.

Datos: ins y TIE.

Ronde: cis es una variable de tipo entero que representa la distancia entre 105 dos ciudades. TIE es una variable de tipo entero que expresa el tiempo de estancia.

Diagrama de flujo 2.11

BIL.4-((DIS* 2) * 0.19) * 0.80 BIL.-(DIS * * 9.19

L

Ronde: BIL es una variable de tipo real que almacena el costo del billete.

Page 89: Fundamentos de programacion - piensa en C

Problemas resueltos

73

Programa 2.11

#include ‹stdio.lp

/* Billete de ferrocarril. El programa calcula el costo de un billets de ferrocarril teniendo en wocuente la distancia entre las dos ciudades y el tiempo de permanencia 'model pasajero.

DIS y TIE: variables de tipo enters. BIL: variable de tipo real. */

void main{void}

int DIS, TIE; float BIL; printfrIngrese la distancia entre ciudades y el tiempo de estancia: ' ) ; scanICU sbd", &DIS, &TIE); if UDIS*2 > 500) && (TIE > 10))

BIL = DIB * 2 * 0.19 * 0.13; else

BIL = DIS * 2 * 0.19; printf("%n\nCosto del billets: BIL); }

Problema PRZ.4

Construye un diagrama de flujo y un programa en C que, al recibir comp datos tres valores enteros T, P y N, permita comprobar la igualdad de la siguiente expresi6n:

[Tr_ T. ipi p

Datos: T, P y N (variables de tipo entero que representan los datos que se ingresan).

Page 90: Fundamentos de programacion - piensa en C

No

74 Capitulo 2. Estructuras algoritmicas selectivas

Diagrama de flujo 2.12

INICIO

T, P, N

"P tiene que ser diferente de cero" ,_ _.------- —

"Se comprueba la igualdad"

--.. ____-------

ir "No se comprueba la igualdarl"

--- ---------

Programa 2.12

#include <stdio.h> #include ‹math.hr

/* Igualdad de expresiones. El programa, al recibir comp datos T, P y N, comprueba Is igualdad de

una expresi6n determinada.

T, P y N: variables de tip entero. */

void main(void) f

Si

Page 91: Fundamentos de programacion - piensa en C

Problernas resueltos 75

int T, P, N; printf('ingrese los valores de T, P y N: "); scanf("%d %d 5,sd", &T, &P, &N); if (P != 0) {

if (pow(T / P, N) == (pow(T, N) / pow(P, N)) printli —MSe comprueba la igualdad');

ate printlfONo se comprueba la igualdad');

2

}

flee printf(''oP tiene que ser dilerente de cero");

Problema PR2.5

Construye un diagrama de flujo y el correspondiente pnograma en C que, al recibir coma data x, calcule el resultado de la siguiente funciOn c imprima los valores de x y v.

4/X — X Si 0 < X 10

Xl — 12 Si 11 < X 25

X2 + (X3 — 18) Si 25 < X S 50

0 Para otro valor de X

Dato: x (variable de tipo entero).

Page 92: Fundamentos de programacion - piensa en C

76 Capitulo 2. Estructuras algoritmicas selectivas

Diagrama de flujo 2.13

Nmio

X

T

r

Y4— X**S-12

'V 4— X** 2+ (X ** 3 —18)

Ir-41

V

X, Y

Donde: x es una variable de tipo real que almacena el resultado de la funciOn.

Programa 2.13

*include <stdio.h> *include lunath.h>

/* Funcidn. El programa, al recibir como data un valor entero, calcula el resultado de r►una funcidn.

X: variable de tipo entero. Y: variable de tipo real. */

Page 93: Fundamentos de programacion - piensa en C

Problemas resueltos 77

void main(void)

float Y; int X; printICIngrese el valor de X: '); scaniCRid', &X); if (X ‹ 0 11 X 50)

= 0; else

if (X <= 10) = 4 1 X - X;

ease if (X <= 25)

pow(X, 3) - 12; 6186

Y = pow(X, 2) + pow(X, 3) - 1B; printl("Wla = sbd‘tY = %B.2f', X, Y); }

Problema PR2.6

Una empresa de telecomunicaciones canadiense ofrece servicio de callback a un precio atractivo. El costo de las llamadas teleiOnicas depende tanto del Lugar de origen de la Ramada como de la zona geogdfica en la que se encuentre el pais destino. En la tabla 2.5 se presenta el costa por 60 segundos Para las llamadas originadas en Mexico. Construye un diagrama de flujo y el correspondiente programa en C que permita calcular e imprimir el costa total de una Ramada telefonica, considerando tanto la zona comp la duraciOn de la llamada.

TABLA 2.5

Ciave

Zona Precio

I Estados Unidos 0.13 2 Canada 0.11 5 America del Sur 0.22 6 America Central 0.19 7 Mexico 0.17 9 Europa 0.17 10 Asia 0.20 15 Africa 0.39 20 Oceania 0.28

Page 94: Fundamentos de programacion - piensa en C

I 78 Capitulo 2. Estructuras algoritmicas selectivas

Datos: CLA y TIE

Donde: CLA es una variable de tipo entero que represents la zona geografica. TIE es una variable de tipo entero que represents la llamado en segundos.

Diagrama de flujo 2.14

CO3 1- TIE • 0.13 /60

5

lir

CO3 1- TIE *C22 / se

/CIA, TIE/

CIA

7.9

10

COSI- TIE *0.17 /60

15

20

V

COSI-TIE•0.99/ fig

De otra frame

w ql■ _1

6

COS 4-TIE•011/ 99 CO3 4- TIE • 0.19 /00 CO3 •- TIE • 0.20/ el CO3 •— TIE • 0.29 /00

CIA, TIE, 003 -La slave es inoorreds"

Donde: cos es una variable de tipo real que almacena el costo de la Hamada.

Programa 2.14

ttinclud e <stdio. h>

/* Telefono. El programa, al recibir coma datos la cisme de la zone geog ranee y el iwrnfimero de segundos de una llamada telefanica, calcula el costa de la misma.

Page 95: Fundamentos de programacion - piensa en C

Problemas resueltos 79 1

CLA y TIE: variables de tipo entero. COS: variable de tipo real. */

void main(vold)

int CLA, TIE; float cos; printlf'Ingresa la clave y el tiempo: '); scan1('%d %d', &CLA, &TIE); satchICLA) {

case 1: COS = TIE * 0.13 / 60; break; case 2: COS - TIE * 0.11 / 60; break; case 5: COS TIE * 0.22 / 60; break; case 6: COS TIE * 0.19 / 60; break; case 7: cas• 9: COS =- TIE * 0.17 / 60; break; case 10: COS = TIE * 0.20 / 60; break; case 15: COS = TIE * 0.39 / 60; break; ORSO 20: COS = TIE * 0.28 / 60; break; default : COS = -1; break;

if (COS 1= -1) printl("In'InClave: WtTiempo: %WhtCosto: %6.21', CLA, TIE, COS);

• 1se printf( —knError en la clave');

Problema PR2.7

En un spa de Lt apan de la Sat realizaron un andlisis de los cLientes registrados en los kiltimos cinco anus con el objeto de conocer los gastos de intemacion de calla cliente. Construye un diagrama de flujo y el correspondiente programa en C que calcule el costo de intemaciOn de un cliente, segtin los datos de la tabla Se sabe que los clientes mayores de 60 atios tienen un descuento de 25% y los clientes menores de 25 anos, de 15%.

TABLA 2.6

Tipo de tratamiento Corfoldienteldia

1 2800

2 1950

3 2500

4 1150

Page 96: Fundamentos de programacion - piensa en C

2

COS 4— DIA *195111

(iqci6)

/TRA, EDA, DIA

TRA

3

COS (— DIA * 25412

De otra 4 forma

COS <— —1

1

COS (— DIA * 286431 COS (— DIA * 1150

L

CLA, TIE, COS

---r----

Pr

No

cos I— COS * 6.85

"La clove as

inearrecta"

80 Capitulo 2. Estructuras algoritmicas selectivas

DatOs: TRA, EDA y DIA

Donde: TRA es una variable de tipo entero que representa el tipo de tratamiento. EDA es una variable de tipo entero que representa la edad del cliente. DIA es una variable de tipo enter° que expresa el namero de (Has.

Diagrama de flujo 2.15

FIND

Donde: cos es una variable de tipo real que representa el costa del tratamiento.

Page 97: Fundamentos de programacion - piensa en C

Problemas resueltos 811

Programa 2.15

#include ‹stdio.tp

1* Spa. El programa, al recibir comp datos el tipo de tratamiento, la edad y el r►nfimero de dias de internacion de un clients en un spa, calcula el costo *total del tratamiento.

TRA, EDA, DIA: variables de tipo entero. COS: variable de tipo real. */

void main(void) { int TRA, EDA, DIA; float COS; printirIngress tipo de tratamiento, edad y dias: '); scanf( d &TRA, &EDA, &DIA); switch(TRA) {

case 1: COS = DIA * 2800; break; case 2: COS =- DIA * 1950; break; case 3: COS = DIA * 2500; break; case 4: COS = DIA * 1150; break; default: COS = -1; break;

if (COS 1.= -1)

if (EDA ,= 60) COS - COS * 0.75;

else if (EDA <= 25)

COS = COS * 0.95; printf( -0Clave tratamiento: s!sd‘t Dias: *Ischt Costo total: 9615.21 ,

TRA, DIA, COS); 1 else

printf("InLa clays del tratamiento es incorrecta');

Problema PRZ.8

En una empresa textil ubicada en La Paz, Bolivia, necesitan un empleado para una sucursal. Construye un diagrama de flujo y el correspondiente programa en C que compruebe e imprima si un empleado deterrainado reline las condiciones necesarias para tal puesto. Las condiciones que establecio la empresa son las siguientes: categoria 3 o 4 y antigiiedad mayor a 5 Mos, o Bien categoria 2 y antigiedad mayor a 7 alias.

Page 98: Fundamentos de programacion - piensa en C

CAT

2 De otta forma

RES 0— 0

0-4

tti

RES 4— 1

3,4

RES 4- 0

"El empleado con slave", CLA, "reime las

condiciones pare el puesto"

"El empleado con chive", CLA, "no mine las

condiciones pare el puesto"

Si

I 82 Capitub 2. Estructuras algoritmicas selectivas

Daw5 CLA, CAT, ANT y SAL

Donde: Cut es una variable de tipo entero que representa la slave del trabajador. CAT es una variable de tipo entero que representa la eategoria del empleado. ANT es una variable de tipo entero que expresa la antigUedad del trabajador en la empresa. SAL es una variable de tipo real que representa el salario del trabajador.

Diagrarna de flujo 2.16

C;TICRD ;

/CLA, CAT, ART, SAL

Page 99: Fundamentos de programacion - piensa en C

Prob le mas resueltos

83 I

Donde: RES es una variable de tipo enter° que almacena la decision sabre el candidato, 1 si reline las condiciones y 0 en case contrario.

Programa 2,16

# include ‹stdio.h>

/* Empresa textil. El programa, al recibir come dates decisivos la categoria y antigOedad de loun empleado, determina si el mismo refine las condiciones establecidas per wit.la empress pars ocupar un nuevo cargo en una sucursal.

CLA, CAT, ANT, RES: variables de tipo entero. SAL: variable de tipo real. */

void main(void)

int CLA, CAT, ANT, RES; printl("LnIngrese Is slave, categoria y antigOedad del trabajador:'); scan1('%d %d %d', &CLA, &CAT, &ANT); switch(CAT) {

case 3: case 4: if (ANT ›- 5)

RES = 1; else

RES = 0; break;

case 2: if (ANT ›= 7) RES = 1;

else RES = 0;

break; default: RES = 0;

break; 1

if (RES) printl("LnEl trabajador con clave 15d refine las condiciones pars el lopuesto', CLA);

else printf("LnEl trabajador con slave %d no refine las condiciones para 'noel puesto', CLA);

Page 100: Fundamentos de programacion - piensa en C

84 Capitulo 2. Estructuras algoritmicas selectivas

Problemas suplementarios

Problema P52.1

El ntmero de sonidos emitidos per un grille en un minuto es una fund& de la temperatura. Es posible entonces determinar el nivel de la temperatura (formula 2.1) utilizando un grille come term6metro. Construye un diagrama de flujo y el correspondiente programa en C que calcule la temperatura con base en el ngmero de sonidos emitidos per el grille.

FA=S/4+40

Formula 2J

Donde: FA representa la temperatura en grades Fahrenheit y S el mimero de sonidos emitidos per minute.

Dato: s (variable de tipo enter° que representa el ngnaero de sonidos emitidos per el grille).

Problema P52.2

Construye un diagrama de flujo y el correspondiente programa en C que, at recibir come date el salmi° de un profesor de una universidad, calcule el increment° del salario de acuerdo con el siguiente criterio y escriba, el nuevo salario del profesor.

Salario < $18,000 = Increment° 12%, $18,000 Salado $30,000 Increment° 8%. $30,000 < Salario $50,000 Increment° 7%. $50,000 < Salario = Increment° 6%.

Date: SAL (variable de tipo real que representa el salario del profesor).

Problema P52.3

Construye un diagrama de flujo y el correspondiente programa en C que determine, at recibir come dates dos nameros enteros, si un ndmero es divisor de otro,

Datos: wI y N2 (variables de tipo entero que representan los dates que se ingresan).

Page 101: Fundamentos de programacion - piensa en C

Problemas suplementarios

85 1

Problema P52.4

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir come dates de entrada tres valores enteros diferentes entre si, determine si los mismos est.in en orden creciente.

Dates N1, N2 y 143 (variables de tipo entero que representan los dates que se ingresan).

Problema P52.5

En una tienda departarnental ofrecen descuentos a los clientes en la Navidad, de acuerdo con el monte de su compra. El criterio para establecer el descuento se muestra abajo. Construye un diagrama de flujo y el correspondiente programa en C que, al recibir come date el monte de la compra del cliente, obtenga el precio real que debe pagar luego de aplicar el descuento correspondiente.

Compra < $800 Descuento 0%. $800 Compra $1500 Descuento 10%, $1500 < Compra $5000 = Descuento 15%. $5000 < Compra Descuento 20%.

Date: com (variable de tipo real que representa el monto de la compra).

Problema P52.6

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir come dates tres mimeros reales, identifique alai es el mayor. Considera que los mirneros pueden ser iguales.

Dates: N1, N2 y N3 (variables de tipo real que representan los ntimeros que se ingresan).

Problema P52.7

Construye un diagrama de flujo y el correspondiente programa en C que permita calcular el valor de fix) segtin la siguiente expresion;

Page 102: Fundamentos de programacion - piensa en C

I 86 Capitulo 2. Estructuras algoritmicas selectivas

Xg

(X2 T-

Si (X mod 4)

14) /X] Si (X mod 4)

= 0

= 1 Y = f (X)

+ 5 Si (X mod 4) .= 2

VT4 Si (X mod 4) = 3

Dato: Y (variable de tipo entero),

Problema P52.8

Construye un diagrama de flujo y el correspondiente programa en C que permita convertir de pulgadas a milirnetros, de yardas a metros y de minas a kilometros.

Datos: MED y VAL

Donde: MED es una variable de tipo entero que se utiliza para el tipo de conversion que se quiere realizar. VAL es una variable de tipo entero que representa el valor a convertir.

Consideraciones:

• 1 pulgada equivale a 25.40 rnilirnetros.

• 1 yarda equivale a 0,9144 metros.

• 1 milla equivale a 1.6093 I:don-100os.

Problema P52.9

Construye un diagrama de flujo y el correspondiente programa en C que permita realizar la conversion de medidas de pesos, longitud y volumen, de acuerdo con la tabla 2.7. Se debe escribir el valor a convertir, la medida en que estd expresado el valor, el nuevo valor y la nueva medida correspondiente.

TABLA 2.7

Medidas de longitud

1 pulgada 25.40 milimetros

1 yarda 0.9144 metros

1 ruilla s 1,6093 kildwittros

Medidas de volume!)

1 pie3 0.02832 metros3

1 yarda3 = 0.7646 metros3

1 pintas 0.56826 litros

Medidas de peso

1 °rim = 28.35 grams 1 libra = 0.45359 kilograrnos

1 ton. inglesa = 1.0160 toneladas

Page 103: Fundamentos de programacion - piensa en C

Problemas suplementarios 87i

TARA 2.7 ContinuaciOn

Medidas de longitud Medidas de volurnen Medidas de peso

1 pulgada2 = 6:452 coritir. Betros2 1 gitIon N. 4,54609 litros

1 pie =0.09290 metros'

1 yarda2 N. 0.8361 metros'

1 acre a 0.4047 hecthreas

1 rnilla2 w 2.59 kilometros2

Datos: MED, SME y VAL

Donde: MED es una variable de tipo entero que representa el tipo de conversion que se va a realizar (longitud, volumen, peso). SHE es una variable de tipo entero que representa dentro de cada tipo de medida, el tipo de conversion que se va a realizar. va. es una variable de tipo enter° que representa el valor que se va a convertir.

Problema PS2.10

En algunas oficinas del gobierno pagan horas extra a los burOcratas, ademas del salario correspondiente. Escribe un diagrama de flujo y el correspondiente programa en C que permita calcular la cantidad a pagar a un trabajador tomando en cuenta su salario y las horas extra trabajadas. Las horas extra se calculan en fund& de la tabla 2.8. Cada trabajador puede terser come mivrinno 30 horas extra, si tienen mas, solo se les pagaran las primeras 30. Los trabajadores con categorfa 4 o mayor a 4 no pueden recibir este beneficio.

TABLA 2.8

Ca tegoria trabajador Hora extra

1 $40

2 $50

3 $85

Page 104: Fundamentos de programacion - piensa en C

I 88 Capitulo 2. Estructuras algoritmicas selectivas

Dam: SAL, CAT y RAE

Donde: sAL es una variable de tipo real que representa el salario del bur6crata. CAT es una variable de tipo entero que representa la categorfa del trabajador. PHE es una variable de tipo entero que representa, el lifter° de horas extra.

Problema P52.11

Construye un diagrama de flujo y el respectivo programa en C que, al recibir como datos tres variables reales que representan los lados de un probable triangulo, determine si esos lados corresponden a un triangulo. En caso de serlo, ademas de escribir el area correspondiente compruebe si el mimic es equilatero, is6sceles o escaleno.

Datos: Ll, L2 y L3 (variables de tipo real que representan los posibles lados de un triangulo).

Consideraciones:

• Si se curnple la propiedad de que la sauna de los dos lados menores es menor a la del 'ado restante, es un trLingulo,

• El 'area se obtiene aplicando la siguiente formula:

AREA VS * (SA) * (SB) * (SC)

Formula 2.2

Problema P52.12

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como dato un nOmero entero de cuatro dfgitos, determine si todos los dfgitos del mimero son pares. Por ejemplo, si el ntmero fuera 5688, no cumplirfa la condiciOn ya que el digito mas significativo —5— serfa impar; si, por el contrario, el ndmero fuera 6244, si cumplirfa, ya que todos los digitos son pares.

Dato: NLIM (variable de tipo entero de cuatro digitos).

Page 105: Fundamentos de programacion - piensa en C

CANTU LO 3 Estructu ras algoritmicas repetitivas

3.1 Introduccion

En la practica, durante b soluciOn de problemas, es muy comtin encontrar, operaciones que se deben ejecutar un ntimero determinado de veces. Si biers las instrucciones son las mismas, los dates varian. El conjunto de instrucciones que se ejecuta repetidamente recibe el nombre de cid°.

Todo ciclo debe terminar luego de repetirse un lifter° finite de veces. Dentro del conjunto de instrucciones siempre debe existir una condici6n de parade o fin de ciclo. En cada iteraciOn del mismo son evaluadas Las condiciones necesarias pare decidir si se debe seguir ejecutando si debe detenerse.

En algunos algoritmos podemos establecer de antemano el niimero de veces que se debe repetir el ciclo. En este case, el nOmero de

Page 106: Fundamentos de programacion - piensa en C

I 90 Capitulo 3. Estructuras algoritmicas repetitivas

repeticiones no depende de las proposiciones dentro del ciclo. La estructura algoritmica repetitiva for se utiliza para resolver problemas en los que conocemos el ruimero de veces que se debe repetir el ciclo.

Pair otra parte, en algunos algoritmos no podemos establecer de antemano el !lamer° de veces que se debe repetir el ciclo. Este ntimero depende de las proposiciones que contenga el MiSMO. La estructura repetitiva while se utiliza para resolver problemas de este tipo.

Otra estructura algoritmica repetitiva es do-while, A diferencia de las estructuras anteriores en las que las condiciones se evaltian al principio del ciclo, en dsta se evakian al final. Esto implica que el conjunto de instrucciones se ejecuta al menos una vez. El do-while es una estructura de menor interds que las anteriores y solo se debe utilizar en ciertos casos, como en la validaciOn de datos de entrada.

En este capitulo estudiaremos las tres estructuras algoritmicas repetitivas que ofrece el lenguaje C; for, while y do-while,

3.2 La estructura repetitiva for

Esta es la estructura algoritmica utilizada para repetir un conjunto de instrucciones un numero definido de veces. Este tipo de estructura se encuentra pdcticarnente en todos los lenguajes de prograinacion. Es similar a la estructura do de Fortran y f or de Pascal.

La estructura for del lenguaje C es muy similar a la estructura while. Sin embargo, por cuestiones didicticas, sOlo aplicarernos la estructura f or en aquellos problemas en los que se cone= previamente el ntimero de veces que se debe repetir el ciclo. La estructura while, por otra parte, sOlo se utilizar en la solucion de aquellos problemas en los que el ntluaer0 de veces que se debe repetir el ciclo dependa de las proposiciones que contenga el mismo. El diagrams de flujo de la estructura algoritmica for es el siguiente:

Page 107: Fundamentos de programacion - piensa en C

3.2 La estructura repetitiva f or 91 1

PROCESO

V 4- (-I-, -) ID

FIGURA 3.1

Estructura reperitiva for.

Donde: v representa la variable de control del ciclo, vi expresa el valor inicial, VF representa al valor final e m representa el incremento o decremento de la variable de control, segCn si el ciclo es ascendente o descendente.

En el lenguaje C la estructura repetitiva for se escribe de la siguiente forma:

Page 108: Fundamentos de programacion - piensa en C

92

Capitulo 3. Estructuras algoritmicas repetitivas

f* El conjunto de instrucciones muestra la sintaxis de la estructura for en C. *f

for (V --- VI; V (<, <=, ›, VF; V V (+, -) ID)

proceso; f* cuerpo de la estructura for *f

Observa que en la estructura for la variable de control del ciclo va desde el valor inicial —VI— hasta el valor final —VF—. En cada iteracion del ciclo el valor de V se incrementa o decrementa de acuerdo con dependiendo si el ciclo es ascendente o descendente.

Nots 1: Es muy importante destacar que hay dos tipos de variables que se utilizan frecuentemente en los ciclos. Estas se conocen como contadores y acumuladores. Los contadores, como su nombre lo indica, sirven para contar, y los acumulado-res, para acumular. Ambas variables se inicializan generalmente en cero antes de iniciar el ciclo, aunque este valor puede ser diferente dependiendo del problema que se vaya a resolver.

EJEPAPLO 3.1

Construye un diagrama de flujo y el prow-arm correspondiente en C que, al recibir como datos los salarios de 15 profesores de una universidad, obtenga el total de la non-Ana.

Datcs:. SAL„ sAL15

Donde: SAL, (1 < is) es una variable de tipo real que representa el salario del profesor i.

Page 109: Fundamentos de programacion - piensa en C

NOM g-

4- 1

MOM 4- NOM + SAL

Estractura repetitiva f or

3.2 La estructura repetitive f or 93

Diagrarna de flujo 3.1

Q.NTITC170

Id— + 1

Donde: I es una variable de tipo entero que representa la variable de control del ciclo. NOM es una variable de tipo real que acumula los salarios. Generalmente, las variables que funcionan como acumuladores se inicializan en cero afuera del ciclo.

Page 110: Fundamentos de programacion - piensa en C

I 94 Capitulo 3. Estructuras algoritmicas repetitivas

Nota 2: Observa que para resolver el problema se lee el salario y se acumula posteriormente para obtener el total. Estas dos operaciones se repiten 15 veces. Este dato lo conocemos de antemano y por esta razOn utilizamos la estructura for.

En la tabla 3.1 se puede observar el segtamiento del algoritmo.

TAB LA 3.1. Seguimiento del algoritmo

I Datos Resultados SAL NOM

1 0

Inicio del ciao --). 2 12500,00 1000,00

3 13600,50 26100.50

4 12800.80 38901.30

5 5600,50 44501,80

6 750040 5200240

7 2750040 79502,60

8 19600.00 99102,60

9 8500,00 107602,60

10 32800,90 140403,50

11 2764035 168043.85

12 16830.40 184874.25

13 19650,70 204524,95

14 1560040 220124.95

15 975030 229875.25

Fin del ciclo 16 11 SOO 90 241676.15

A continuation se presenta el programa correspondiente.

Page 111: Fundamentos de programacion - piensa en C

3.2 La est ruct ura repetitive for 95

Programa 3.1

anclude ‹stdia.11,

/* Mains. El programa, al recibir las salarias de 15 profesores, obtiene el total de la monamina de la universidad.

I: variable de tipo entero. SAL y NOM: variables de tipo real. */

void main(void)

int I; float SAL, NOV; NOM = 0; for {1=1; l<=15; I++)

printfrOngrese el salario del profesar%d:It', 1); scanf('90', &SAL); NOM = HUM + SAL;

printf{"knEl total de la ['lamina es: 96.2f", NOM);

EPERUILO 3.2

Escribe un diagrama, de flujo y el correspondiente programa. en C que, at recibir come datos N 1111MerOS enteros, obtenga solamente la, suma de los ndmeros positives.

Dalos: N, NUM,, NUM,

Donde: N es una variable de tipo entero que representa, el numeric, de datos que se ingresan, Num, (1 N) es una variable de tipo entero que representa at ndmero i.

Page 112: Fundamentos de programacion - piensa en C

96 Capitulo 3. Estructuras algoritrnicas repetitivas

Diagrama de flujo 3.2

Esttuctura repetitiva for

1 4— 1

Donde: i es una variable de tipo entero que representa al contador del tido. MA es una variable de tipo entero que se utiliza pare sumac los nameros positives. Observa que sum se inicializa en cero antes de comenzar el cid°.

Page 113: Fundamentos de programacion - piensa en C

3.3 La estructura repetitiva a MILE 97 [

Programa 3.2

#include ‹stdia.h,

i* Suma positives. El programa, al recibir coma dates N numeros enteras, obtiene in suma de los wienteros pasitivas.

I, N, MUM, SUM: variables de tipo entero. */

void main(void)

int I, N, NUM, SUM; SUM - 2; printfirIngrese el nomera de datos:kt'); scanf('96d', &N); for (I=1; I<=N; I++)

printf('Ingrese el data rainier° 96d:1t', I); scanf('964', &NUM); if (NUM a 2)

SIN SUM + HUM;

} printfl'inLa suma de los nhmeros pasitivas es: lcd', SUM);

}

3.3. La estructura repetitiva while

La estructura algoritmica repetitiva while permite repetir un conjunto de instruc-clones. Sin embargo, el mimero de veces que se debe repetir depende de las proposiciones que contenga el ciclo. Cada vez que corresponde iniciar el ciclo se evahla una condicion, siesta es verdadera (diferente de cero) se continua con la ejecucidn, de otra forma se detiene.

Hay una gran cantidad de casos en los que podemos aplicar la estructura repetitiva while. Supongamos que debemos obtener el importe total de los pagos que reali-zamos en el ultimo ales, peto no sabemos cuktos fueron. Debemos entonces sumar los mismos hasta que no encontremos 'Ets. Consideremos ahora que tenemos que obtener el promedio de calificaciones de un examen que realizaron un grupo de alumnus, pero no sabemos con exactitud cuantos lo aplicaron. Tenemos que sumar todas las calificaciones e it contando el ntimero de alumnus para posteriormente cal-cular el promedio, El ciclo se repite mientras tengamos calificaciones de alumnus.

El diagrama de flujo de la estructura repetitiva while es el siguiente:

Page 114: Fundamentos de programacion - piensa en C

Faiso

PROCESO

• •

PI 4—MODEFICACION DE PI

PI 4-PROPOSICION INICIAL

98 Capitulo 3. Estructuras algoritmicas repetitivas

• • •

FiGuRA 3.2 Enructura repeal:ha while.

Donde: PI representa la proposicion inicial. Debe tener un valor verdadero (dife-rente de cero) inicialmente pars que el ciclo se *cute. Ademas, dentro del ciclo siempre debe existir un enunciado que afecte la condiciOn, de tal forma que aqul no se repita de manera infinita

En el lenguaje C la estructura repetitiva while se escribe de la siguiente forma:

f* Estructura repetitive while. El conjunto de instrucciones muestra la sintaxis de la estructura while en el wasnguals C. */

PI = proposicibn inicial; while (PI)

/* PI debe tener un valor verdadero pare que el ciclo se wrejecute *1

Page 115: Fundamentos de programacion - piensa en C

1 SPA <— a

EStrUalra tepetitiva while

-r

/ FAG

FAG

3.3 La estructura repetitiva a WHILE 99

process; 1* cuerpo de la estructura while *1 . . . PI = mddificacian de PI; . . .

}

EPEPMDLO 33

Construye un diagrama de flujo y el programa correspondiente en C que, at reci-bir como datos los pagos efectuados en el ultimo mes, permita obtener la suma de los rnismos.

Datos: PAG, PAG2J - -

Donde: PAG, es una variable de tipo real que representa at page ntimero i. Se ingresa 0 come Ultimo date para indicar que ya no hay DAS pages que contempbr.

Diagrarna de flujo 3.3.

WICIO

3

Page 116: Fundamentos de programacion - piensa en C

I 100 Capitulo 3. Estructuras algoritmicas repetitivas

Ronde: SPA es una variable de tipo real que se utiliza para acumular los pagos y se inicializa en cero,

Programa 3.3

#include astdio.ha

1* Suma pagos. EL programa, al recibir comp datos un conjunto de pagos realizados en el Ultimo 'Ewes, obtiene la suma de los mismos.

PAG y SPA: variables de tipo real. It I

void main(void)

float PAG, SPA; SPA = 2; printf('Ingrese el primer pago:‘V); scanf('W, &PAG); while (PAG) 1* Observe que la condicion es verdadera mientras el Pogo es diferente de cero. *f

SPA = SPA + PAG; printf('Ingrese el siguiente pago:it '); scanf('9sf', &PAG); 1* Observe que la proposicion que modifica la condicion es una lecture. *1

} printfroEl total de pagos del mes es: 96.21—, SPA); }

EJ E Par 10 3A

Construye un diagrama de flujo y el programa correspondiente en C que, al re-cibir como datos un grupo de nameros naturales positivos, calcule el cuadrado de estos mimeros. Imprima el cuadrado del mimero y al final la suma de los cuadrados.

Datos: HUM1 , NUM,, NUM,, ..., 0

Donde: mum, es una variable de tipo entero que representa al mimero positivo t. El fin de los datos esta dada par 0,

Page 117: Fundamentos de programacion - piensa en C

CUA 4- NUM ** 2 WC 0- sue + CUA

NUM , CUA ----E-----

3.3 La estructura repetitiva a WHILE 101 1

Diagrarna de flujo 3.4.

SUe 4,- 0

ailliCtUra repetitiva while 1

/ lailA /

L sue

EFIND Donde: CUA es una variable de tipo enters extendido (long) que almacena el cua-

drado del flamer° que se ingresa, sue es una variable de tipo long que se utiliza para almacenar la sums de los cuadrados.

Page 118: Fundamentos de programacion - piensa en C

I 102

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 3.4

#include ‹stdia.h> #include ‹math.h>

/* Suma cuadrados. EL programa, al recibir coma datas un grupa de enteras pasitivas, abtiene el ucuadrada de las mismas y la sumo carrespandiente a dichas cuadrados. */

void main(void)

int NUM; long GIA, SUC = 0; printf('knIngrese un aimera enter° -0 pare terminar-:kt'); scanf(',isd', &HUM); while (NUM) /* Observe clue la condicibn es verdadera mientras el enters es diferente de cero. *1

{ CUA - paw (NUM, 2); printf('M al cube es fisld', NUM, CUA); SUC = SUC CUA; printf('InIngrese un nUmero enters -2 pare terminar-:kt'); scanf('9od', &NUM);

} printf('‘nLa suma de los cuadrados es gad', SUC);

}

3.4. La estructura repetitiva do-while

Otra de las estructuras algoritmicas repetitivas en el lenguaje C es do -wh ile Es una estructura que se encuentra prkticamente en cualquier lenguaje de programa-cio'n de alto nivel, similar al repeat de los lenguajes Pascal y Fortran. A diferencia de las estructuras for y while, en las cuales las condiciones se evaldan al principio del ciclo, en dsta se evaltian al final. Esto implica que el ciclo se debe ejecutar port° menos una vez,

La estructura es adecuada cuando no sabemos el ndmero de veces que se debe repetir un ciclo, pero conocemos que se debe ejecutar por lo menos una vez. Es deck, se ejecuta el conjunto de instrucciones una vez, y luego cada vez que co-rresponde iniciar nuevamente el ciclo se evaltian las condiciones, siempre al final del conjunto de instnicciones. Si el resultado es verdadero (diferente de cero) se continua con la ejecuci(m, de otra forma se detiene.

La estructura repetitiva do-while tiene una menor importancia que las estructuras repetitivas estudiadas en primer t6rmino. Sin embargo, puede utiiizarse de manera

Page 119: Fundamentos de programacion - piensa en C

3.4 La estructura repetitiva DO-MILE 103 I

eficiente para vetificar los dates de entrada de un program En la siguiente figura se presenta la estructura repetitiva do - while:

i 4 .

PROCESO

1

MODIFICACION DE P

FIGURA 3.3

atntetura repetitiva do - wh ile.

Donde: P representa la condiciOn inicial. Debe tener un valor verdadero (diferente de cero) para que el conjunto de instrucciones se pueda volver a ejecutar. Siempre debe existir un enunciado dentro del ciclo que afecte la condici6n, para que dste no se repita de manera infinita.

En lenguaje C, la estructura repetitiva do -while se escribe de la siguiente forma:

/* Estructura repetitive da-while. El canjunta de instruccianes muestra la sintaxis de la estructura do -while en al •►lenguaje C. *I . . . de {

process; /* cuerpo de la estructura do-while. *I

mdificacion de P;

1 while {P) f P debe tener un valor verdadero para que el ciclo se vuelva a ejecutar * r

. . .

3

Page 120: Fundamentos de programacion - piensa en C

I 104 Capitulo 3. Estructuras algoritmicas repetitivas

EJEhump 3.5

A continuaciOn se resuelve el problems del ejemplo 3.3 aplicando la estructura repetitiva do -wh ile. Supongamos que debemos obtener la sums de los pagos rea-lizados en el ultimo mes, pero no sabemos exactamente cuantos fueron. Los dates se expresan de la siguiente forma:

Date's: PAG, , PAG2, ... , 9

Donde: PAGi es una variable de tipo real que representa al page nOmero i. Se ingresa 0 coma dltimo dato para indicar que ya no hay Mk pages que contemplar.

Diagrama de flujo 3.5

INICIO

ans..6-8

Estructura repetitiva

do-while

SPA

PAG

Page 121: Fundamentos de programacion - piensa en C

3A La estructura repetitive DO-WHILE 105 I

Donde: SPA es una variable de tipo real que se utiliza para acumular los pagos.

Note 3: Observa que al rnenos debemos ingresar un pago para que no ocurra un error de electron% en el programa.

A continuacit% se presenta el programa en el lenguaje C.

Programa 3.5

#include ‹stdio.h>

i* Suma pagos.

El programa obtiene la soma de los pagos realizados al Ultimo mes.

PAG y SPA: variables de tipo real.*/

void main(void)

float RAG, SPA = O; printf('Ingrese el primer pago:‘t'); scanf('W, &PAG); i* Observe que al utilizer la estructura do-while al menos se necesita un do

SPA = SPA PAG; printf('Ingrese el siguiente pago -O pare terminar-:It '); scanf('kr, &PAG);

1 while (PAG);

printf('InEl total de pagos del mes es: %.2f', SPA);

1

pago.*i

EiEhUaLG 3.6

Escribe un diagrama de flujo y el correspondiente programa en C que, al recibir como datos los salarios de los profesores de una universidad, obtenga tanto la nO-mina coma el promedio de los salarios.

Dal-Os:SAL, SAL2 SAL3 ,..., 0

Donde: SALT es una variable de tipo real que representa el salario del profesor 1. El fm de datos esta dado pot- O.

Page 122: Fundamentos de programacion - piensa en C

v NOM 4— NOM + SAL

I 4— I + 1

SAL

1 106 Capitulo 3. Estructuras algoritmicas repetitivas

Diagrama de flujo 3.6

INICIO

ii,

NOM 4-0 I q-0

No

PRO'— NM i I

NON, PRO

Estructura repetitiva do-while

Donde: 1 es una variable de tipo entero que se utiliza para contar el niirnero de salad° s, NOM es una variable de tipo real que almacena la suma de los salaries. PRO es una variable de tipo real que obtiene el promedio.

Page 123: Fundamentos de programacion - piensa en C

3.4 La estructura repetitiva DO-MILE

Pro as 3.6

#include <stdia.h,

i* Maria de prafesores. El pragrama, al recibir coma datos los salarias de los profesores de una Ilwuniversidad, obtiene la nomina y el promedio de los salarios.

I: variable de tips enter°. SAL, NOM y PRO: variables de tipo real. */

void main(void) {

int I = 2; float SAL, PRO, NOM = 2; printf('Ingrese el solaria del prafesar:W); /* Observe que al mentos se necesita ingresar el solaria de un profesor pare que

ocurra un error de ejecucion del pragrama. */ scanf('961— , &SAL); do

NOM = NOM + SAL; I = I + 1; printf('Ingrese el salario del profesor -3 pare terminar- :\t"); scanf("gisr, &SAL);

while (SAL); PRO = NOM f I; printf('lnN6mina: 56.2f It Promedio de salarios: 9 .2f', NOM, PRO);

La estructura repetitiva do -while,. COMO ViMOS anterionnente, tiene una menor importancia que las estructuras repetitivas for y while. Sin embargo, se puede utilizar de manera eficiente para verificar los datos de entrada del programa. Observemos a continuaciOn el siguiente ejemplo.

EJEMPLO 3.7

Escribe un diagrama de flujo y el correspondiente programa en C que, al recibir como datos los N lanzamientos del martillo de la atleta cubana ganadora de la medalla de oro en las (limas olimpiailas celebradas en Atenas, calcule el prome-dio de dichos lanzamientos.

Datos: N, LAN„, LAN,, LAN

Donde: N es una variable de tipo entero que representa los lanzamientos de la atleta, a N .z 11. SAL, es una variable de tipo real que representa el lanzamiento i de la atleta.

Page 124: Fundamentos de programacion - piensa en C

Estractura repetitiva

do-while

Estructura repetitiva for

SLA4-SLAf N

SL&

SLA SLA + LAN I <— I +

108 Capitulo 3. Estructuras algoritmicas repetitivas

Diagrama de flujo 3.7

Page 125: Fundamentos de programacion - piensa en C

Problemas resueltos

109 I

Donde: r es una variable de tipo entero que se utiliza para el control del ciclo. SLA es una variable de tipo real que almacena los N lariZaMientOS. Al final se utiliza esa misma variable para almacenat el promedio de los lanzamientos.

Programa 3.7

#include stdia.h>

or* Lanzamiento de martin°. El programa, al recibir coma data N lanzamientas de martillo, calcula el pramedio iwde los lanzamientos de la atleta cubana.

I, N: variables de tipo enter°. LAN, SLA: variables de tipa real. "1

void main(void)

int I, N; float LAN, SLA = 0; do

printf('Ingrese el rawer° de lanzamientos:It'); scanf('%d', &N);

} while (N 1 11 N > 11); /* Se utilize la estructura do-while pare verificar que el valor de N sea micorrecto. *I for (I=1; lc=N; I++)

printf('OIngrese el lanzamiento %d: , I); scanf('W, &LAN); SLA = SLA + LAN;

} SLA = SLA f N; printf('\nEl pramedio de lanzamientos es: 96.21", SLA);

}

Problemas resueltos

Problema PR3.1

Construye un diagrama de flujo y el correspondiente programa en C que, al reci-bir como data un niimero entero N, calcule el factorial de dicho mimero. Recuerda que el Factorial (0)es 1, el Factorial 1 ) es 1, y el Factorial (it) se calcula como to

Factorial(n-1),

Dato; NUN (variable de tipo enter° que representa el mimero que se ingresa),

Page 126: Fundamentos de programacion - piensa en C

'Error en

el 91_0_1._

FAC A— FAC * I

1 I- 1 + 1

1

r

110 Capitulo 3. Estructuras algoritmicas repetitivas

Diagrama de flujo 3.8

Donde: FAC es una variable de tipo entero que se utiliza pars alniacenar el factorial. I es una variable de tipo entem que se utiliza para el control del ciclo.

Programs 3.8

# include <stdio.h>

1* Factorial. EL programa calcula el factorial de un 'limier° entero.

FAC, I, NUN: variables de tipo entero. *,

void main(void) 4 int I, NUM; long FAC; printf("‘nIngrese el numero: '); scanf("%d°, &NUM); if (NUN >= 8)

1 FAC = 1; for (I=1; I <= NUM; I++)

Page 127: Fundamentos de programacion - piensa en C

Problemas resueltos 111 I

FAG t= I; printf(-1E1 factorial de 9gd es: 961T, NUM, FAC);

else printfrthError en el data ingresado');

Problema PR3.2

Ecribe un diagrama de flujo y el correspondiente programa en C que obtenga y escriba tanto los tdrminos cow la sums de los tbminos de la siguiente serie:

Diagrarna de flujo 3.9

2, 7, 10, 15, 18, 23, - ., 2500

3

CAME-1 SSE4— 0

1 4- 2

SSE 4— SSE + I

Sf

14-1 +5 CAM 4—

14— I+ 3 CAM[— 1

SSE

Page 128: Fundamentos de programacion - piensa en C

I 112 Capitulo 3. Estructuras algoritmicas repetitivas

Donde: I es una variable de tipo enter° que se utiliza para incrementar el valor de los t&minos de la serie. ssE es una variable de tipo entero que se utiliza para sumar los te'ffnfrios. CAM es una variable de tipo enter° que se utiliza para distinguir el valor a sumar.

Programa 3.9

#include stdio /I>

1* Serie. EL programa imprime los terminos y obtiene la suma de una determinada eerie.

I, SSE y CAM: variable de tipo entero. *1

void main(void)

int I = 2, CAM = 1; long SSE = 421; while (I ‹= 252e)

SSE = SSE + I; printf('‘t 96d I);

if (CAN)

I += 5; CAM--;

I. else

I += 3; CAM++;

} printf('‘nLa suma de la eerie es: 961d', SSE); }

Pro bienria PR3.3

Escribe un diagrama de flujo y el correspondiente programa en C que, al recibir como datos N nlimero5 enteros, obtenga la suma de los ntimeros pares y el prome-dio de los impares.

Datos: N, NLI111, NUM2 , NIJ(

Donde: N es una variable de tipo entero que representa el ntimero de datos que se ingresa. NUM, (1 s i s N) es una variable de tipo entero que representa al niimer° enter° L

Page 129: Fundamentos de programacion - piensa en C

No

I

ProbIernas resueltos 1131

Diagrarna de flujo 3.10

No

No

i

_IF

'Error en el Valor de N'

--------- I K— I + 1

SPA +—SPA + NUM BIM ., SIM + NUM CIM d—CIM + -I

SPA, SIM f CIM ,-----

Donde: I es una variable de tipo entew que se utiliza para el control del ciclo. SPA y BIM son variables de tipo entero que se utilizan para sumar los pares e impares, respectivamente. cim es una, variable de tipo entero que se utiliza para contar los impares.

Page 130: Fundamentos de programacion - piensa en C

114

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 3.10

Oinclude cstdio.h, Oinclude qmath.h>

/* Pares e impares. EL programa, al recibir comp datos N nUmeros enteros, obtiene la suma de los wbriimeras pares y calcula el promedia de los impares.

I, N, NUM, SPA, SIM, CIM: variables de tipo entero. *or

void main(void)

int I, N, NUM, SPA - 0, SIM - 0, CIM = 0; printf('Ingrese el nfimero de Batas que se van a procesar:4t'); scanf('gsd', &N); if (N > 2)

{ for (1=1; I <= N; I++)

{ printf('‘nIngrese al nOmera %d: ', I); scanf('%d', &NUM); if (NUM)

if (pow(-1, HUM) 5 2) SPA = SPA + HUM;

else

SIM = SIM + NUM; CIM++;

} 1 printf('‘n La suma de los nfimeras pares es: 96d', SPA); printfr‘n El promedio de nomeros impares es: %5.2f', (flost)(SIM / CIM);

} else

printf('in El valor de N es incorrecto');

}

Problema PR3.4

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como datos las calificaciones de un grupo de alumnos que presentaron su examen de admision para ingresar a una universidad privada en I1 /4/16xico, calcule y escriba el mimero de calificaciones que hay en cada uno de los siguientes rangos:

0 . . . 3.99 4...5.99 6 „ , 7,99 8, „ 8,99 9 . .. 10

Page 131: Fundamentos de programacion - piensa en C

R14-0 R2t— 0 R34— 0 R44— 0

R5 4— 0

4 / CAL

R14-R1 +1

R21—R2+1

R3 4— R3 + 1

T R4 4— R4 + 1 R5 •c— R5 + 1

i

CAL

Problernas resueltos 1151

Datos: CAL„ CAL,, ... , -I (CAL, es una variable de tipo real que representa la ca-lificacion del alumno 1).

Diagrania de flujo 3.11

1sTICICD

R1, R2, R3, R4, R5

Donde: RI, R2, R3, R4 y 115 son variables de tipo entero que funcionan corn° acumuladores.

3

Page 132: Fundamentos de programacion - piensa en C

#include cstdio.h>

l* Examen de admision. E1 programa, al recibir como dates una serfs de calificacianes de un examen, wirobtiene el range en que se encuentran estas.

RI, R2, R3, R4 y R5: variable de tipo enters. CAL: variable de tips real. *f

void main(void) 4 int R1 - 2, R2 - 2, R3 - 0, R4 - 0, R5 - 0; float CAL; printf('Ingresa is calificacian del alumna: ' ) ; scanf('W, &CAL); while (CAL != -1)

if (CAL < 4) R1 ++;

else if (CAL .‹ 6)

R2++; else

if (CAL < 9) R3++;

else if (CAL c 9)

R4++; else

RS++; printf('Ingresa la calificacion del alumna: '); scanf('%f', &CAL);

} printf('00..3.99 = %d', R1); printf('04..5.99 = %d', R2); printf('06..7.99 = %d', R3); printf('08..8.99 %d', R4); printf('1n9..10 %d', R5);

I 116

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 311

Problema PR3.5

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como dato un entero positivo, obtenga e imprima la sucesiOn de ULAM, la cual se llama asi en honor del raatematico S. Ulam.

Sucesi6n de ULAM

1. Inicia con cualquier entero positivo. 2. Si el ntimero es par, dividelo entre 2. Si es impar, multiplIcalo pot 3 y agregale 1. 3. Obten sucesivamente ntimeros enteros repitiendo el proceso.

Page 133: Fundamentos de programacion - piensa en C

No

Sf

SI

No

NUM <— MA or 2

MA .1— NUM * 3 + 1

4,

NUM ---------

Problernas resueltos 117 I

Al final obtendras el ndmero 1. Per ejemplo, si el entero inicial es 45, la secuencia es la siguiente: 45, 136, 68, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.

Dato: N (variable de tipo entero que representa el entero positive que se ingresa).

Diagrarna de flujo 3.12

INICIO --;-- NUM

"NUM debe ser un entero positivo"

------r---

V SI

NUM

FIN

Page 134: Fundamentos de programacion - piensa en C

1118

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 3,12

#include ‹stdio.h> #include cmath.h>

f* Serie de ULAM. El programa, al recibir camp data un enter° positivo, obtiene y escribe wirla serie de ULAM.

MJM: variable de tipa entera. *f

void main(void) { int NUM;

printf('Ingresa el nhmero pare calcular la serfs: '); scanf('fisd', &NUM); if (NUM 0)

printf('InSerie de ULAMkn'); printf('%d lit', NUM); while (NUM != 1) {

if (pow(-1, NUM) > 0) HUM - NUM 1 2;

else NUM = NUM * 3 + 1;

printf('W kt', NUM); }

} else

printf('kn HUM debe ser un entero positive); }

Probteam PR3.6

Escribe un diagrama de flujo y el correspondiente programa en C que calcule e imprima los primeros 50 raimeros de Fibonacci. Recuerda que Fibonacci(0) es 0, Fibonacci(1) es 1, y Fibonacci(n) se calcula como Fibonacci(n-1) + Fibonacci(n-2).

Ejemplo de la serie: 0, 1, 1, 2, 3, 5, 8, 13, • . .

Page 135: Fundamentos de programacion - piensa en C

PRI 4- SEG •g-

I 4— 3

PRI, SEG

No

SIG 4— PRI + SEG PRI 4— SEG

SEG 4— SIG

I 4— I + 1

Problemas resueltos

1191

Diagrarna de flujo 3.13

Donde: I es una variable de tipo entero que representa la variable de control del ciclo. Se iniciali7a en 3, dado que hay dos asignaciones previas al inicio del ciclo. PRI, SEG y SIG son variables de tipo entero que representan los valores que se suman para obtener el siguiente valor de la serie (ma).

Page 136: Fundamentos de programacion - piensa en C

I 120

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 3.13

#include <stdio.h>

irk Fibonacci. El programa calcula y ascribe los primeros 52 nUmeros de Fibonacci.

I, PRI, SEG, SIG: variables de tipo entero. *1

void main(void)

int I, PRI - 0, SEG - 1, SIG; print-Wit %d ‘t gisd', PRI, SEG); for (I = 3; I< - 52; I++)

SIG - PRI I. SEG; PRI = SEG; SEG = SIG; printf('it %d', SIG);

1 I

Problems PR3.7

Los organizadores de un acto electoral solicitaron realizar un programa de compute para manejar el conteo de los votos. En la eleccion hay cinco candidatos, los cua-les se representan con los valores comprendidos de 1 a 5. Construye un diagrama de flujo y el correspondiente programa en C que permita obtener el mimero de votes de cada candidate y el porcentaje que obtuvo respecto al total de los votan-tes. El usuario ingresa los votos de manera desorganizada, tal y coma se obtienen en una elecci6n, el final de datos se representa pot un cero. Observa coma ejemplo la siguiente lista:

2 5 5 4 3 4 4 5 1 2 4 3 1 2 4 5 0

Donde: 1 representa un voto para el candidate 1, 3 un voto para el candidate 3, y asf sucesivamente.

Dates: VOT1, VOT2,..., 0 (variable de tipo entero que representa el voto a un candidato).

Page 137: Fundamentos de programacion - piensa en C

C34- C3 + 1 1054- C5 + 1 Cl Cl + 1

SVO 4-(C1 +C2+ C3 +C4 +C5+ MU)

P01 1- (C1 f MO)* 100 P024- (C2 MO)* 100 P03 1- (C.3 f MO)* UN P041- (C.4 f SVO) 2 100 P05 4- (C51 SVO)* 140 PON 0- (NU I SVO) 100

De airs forms

VOT

VOT

C44- C4 + 1 C2 -4- C2 +1

T C1 C24- C3 C44-005*--g N11,0

C1, P01, C2, P02, C3, P03

C4, PO4, C5, P05, NU, PON

Problemas resueltos 1211

Diagrarna de flujo 3.14

IHICID

Made: Ci C2, CS, C4, C5 y NU son variables de tipo entero que funcionan corm acumuladores (de los votos de los candidatos). svo es una variable de tipo entero que cuenta todos los votos registrados. PO1 , P02, PO3, PO4, P05 y PON son variables de tipo real utilizadas para almacenar el porcentaje de votos.

Nati Observa que para obtener el porcentaje dividimos entre svo. Si svo fuera cero, es decir si no hubiaamos ingresado ningdn data, entonces tendriamos un error ya que dividiriamos entre cero.

Page 138: Fundamentos de programacion - piensa en C

#include ‹stdia.h>

f* Eleccien. El programa obtiene el total de votes de cede candidata y el porcentaje mboorrespandiente. Tomblin considera votes nulos.

VOT, Cl, C2, C3, C4, C5, NU, SVO: variables de tipo enter°. P01, P02, P03, PO4, P05, PON: variables de tip° real.*/

void mein(void)

int VOT, C1 = 6, C2 = 2, C3 = 6, C4 = 2, C5 2, NU = 2, SVO; float P01, P02, PO3, PO4, P05, PON; printf('Ingrese el primer vote: '); scanf(464', &VOT); while (VOT)

switch(VOT)

case 1: C1++; break; case 2: C2++; break; case 3: C3++; break; case 4: C4++; break; case 5: C5++; break; default: NU++; break;

} printf('Ingrese el siguiente vote -2 pare terminar-: '); scanf('W, &VOT);

1 SVO - C1 + C2 + C3 + C4 + C5 + NU; P01 = ((float) C1 f SVO) * 162; P02 = ((float) C2 f SVO) * 192; P03 = ((float) C3 f SVO) * 102; PO4 = ((float) C4 f SVO) * 122; P05 = ((float) C5 f SVO) * 192; PON = ((float) NU f SVO) * 126; printf('inTatal de votes: 96d', SVO); printf('inknCandidate 1: sid votes Porcentaje: C1, P01); printf('knCandidato 2: printf('inCandidato 3:

96d %d

votes votes

Porcentaje: Porcentaje:

265.21-, %5.21-,

C2, C3,

P2); P3);

printf('kneandidata 4: gsd votes -- Porcentaje: 965.2r, C4, PO4); printf('knCandidato 5: %d votes -- Porcentaje: 965.2f', C5, P05); printf('inNules: %d votes -- Porcentaje: 965.21-, NU, PON);

}

I 122

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 314

Page 139: Fundamentos de programacion - piensa en C

Diagrama de flujo 3.15

I.—I+ 2

RES .—RES+ (4.0 / I) 3

RES 0—RES + (4.0/ I)

Problernas resueltos 123 I

Problema PR3.8

Construye un diagrama de flujo y el correspondiente programa en C que calcule el valor de II utilizando la siguiente serie:

4 4 4 4 4 n = 1 - 3 + 5

— 7

+ 9— — • • •

La diferencia entre la serie y II debe ser menor a 0.0005. Imprime el ntimero de tdrminos requerido para obtener esta precision.

C FN.)

Donde: i es una variable de tipo entero que incrementa de dos en dos, en calla vuelta del ciclo, el divisor. Comienza en 1. c es una variable de tipo enter° utilizado para contar los terminos de la serie. B es una variable de tipo enter° utilizada para decidir si hay que sumar o restar en la serie.

Page 140: Fundamentos de programacion - piensa en C

I 124 Capitulo 3. Estructuras algoritmicas repetitivas

RES es una variable real de doble precision que almacena el resultado de la serie.

Pro ms 3.15

# include ‹stdio.h, # include <math>

/* Calculo de P. El programa obtiene el valor de P aplicando una aerie determinada.

I, B, C: variables de tipo entero. RES: variable de tipo real de doble precision. *i

void main(void)

int I = 1, B = a, C; double RES; RES = 4.0 / 1; C = 1; while ((fobs (3.1415 - RES)) x a.aaas)

I +=. 2 ; if (B) {

RES += (double) (4.6 f I); B=O;

} else

RES -= (double) (4.0 f I); = 1;

} C++;

} printf('ONDmero de terminos:96d', C); }

Problema PR3.9 A la clase de Estructuras de Datos del profesor Lopez asiste un grupo numeroso de alumnos. Construye un diagrama de flujo y el correspondiente programa en C que irnprima la rnatricula y el promedio de las cinco calificaciones de cada alumno. Ade-mas, debe obtener b matricula y el promedio tanto del mejor comp del peer alumno.

Datos: MATI , CAL10 , CAL12, CAL, 5, CAL14, CAL 5

MAT2, CAL20 , CALF 2, CAL21 , CAL24 , CAL 5

• . •

Page 141: Fundamentos de programacion - piensa en C

IiliP1:104-g IFPRO 4-11

.1.

MAT

No

Si

LIAPRO 11E11.4T, MEMO

IANIO PFIO MOAT IIIAT

IMEPRO 1- PRO IIELIAT 1- MAT

IWT

SUM 4- i

No

Si

CALI /

SUP 4- SUM + CAL I 4- I + 1

PRO 4- sna j

NAT, PAM

Problernas resueltos 125 1

Donde: MAT, es una variable de tipo entero que representa la matricula del alumno i. El fin de datos esta dado par O. CALI.] es una variable de tipo real que representa la calificacion j del alumno i.

Diagrarna de flujo 3.16

M)

Donde: I es una variable de tipo entero que representa, la variable de control del ciao intern°. sum es una variable de tipo real utilizada come acumulador.

3

Page 142: Fundamentos de programacion - piensa en C

I 126 Capitulo 3. Estructuras algoritmicas repetitivas

MAPRO y MEPRO son variables de tipo real utilizadas para almacenar el me-jor y el peer promedio. MAMAT y MEMAT son variables de tipo entero utili7adas para almacenar las matriculas de los alumnos con inejor y peor promedio. PRO es una variable de tipo real utilizada para almacenar el promedio de un alumno.

Programa 316

#include <stdia.h>

f* Calificaciones. EL programa, al recibir un grupa de calificacianes de un alumna, abtiene el pro-mono de calificacianes de coda una de alias y, edemas, los alumnae con el major y pear pramedio.

I, MAT, MEMAT y MEMAT: variables de tipo enter°. CAL, SUM, MAPRO, MEPRO y PRO: variables de tip real.*/

void main(void)

int I, MAT, MEMAT, MEMAT; float SUM, PRO, CAL, MAPRO = 0.0, MEPRO = 11.0; printf('Ingrese la matricula del primer alumna:‘t'); scanf('std% &MAT); while (MAT)

9JM - 0; for (I 1; I< 5; I++)

printfritIngrese la calificacion del alumna:

11; scanf('961—, &CAL); 9JM += CAL;

} PRO = SUM i 5; printf('1nMatriculaAd‘tPromedio:965.2f% MAT, PRO); if (PRO MAPRO)

MAPRO PRO; MEMAT - MAT;

} if (PRO < MEPRO)

MEPRO = PRO; MEMAT = MAT;

} prirrtf('WnIngrese la matricula del siguiente alumna:

; scanf('%d', SWAT);

) printf('inknAlumna con mejar Promedia:‘ftdM9s5.2f', MEMAT, MAPRO); printf('ininAlumna con pear Promedia:It%d\t\96.2r, MEMAT, MEPRO);

Page 143: Fundamentos de programacion - piensa en C

4

1

J 4-J + i

4.

Problernas resueltos 127 I

Problema PR3.10

Construye un diagram de flujo y el correspondiente programa en C que, al reci-bir coma data un entero positivo, escriba todos los tuimeros perfectos que hay entre 1 y el ndmero dado, y que ademds imprima la cantidad de ndmeros perfec-tos que hay en el intervalo. Un ntimero se considera perfecto si la suma de todos sus divisores es igual al propio ndmero.

Dato: NUM (variable de tipo entero que representa, al nflmero lfmite que se ingresa).

Diagrarna da flujo 3.17

EINICDDI

I<-1

Page 144: Fundamentos de programacion - piensa en C

I 128 Capitulo 3. Estructuras algoritmicas repetitivas

Donde: I y J son variables de tipo entero que se utilizan para controlar los ciclos. sum es una variable de tipo entero utilizada para sumar los divisores. c es una variable de tipo entero que representa el limite del interval°.

Programa 3.17

#include cstdio.h>

1* Numeras perfectos. El programa, al recibir como data un nOmero entero positivo como limite, obtiene los ngimeros perfectos que hay entre 1 y ese numero, y ademis imprime cuintos nu-meros perfectos hay en el intervalo.

I, J, NUM, SUM, C: variables de tipo entero. */

void main(void)

int I, J, NUM, SUM, C = 2; printiThnIngrese el nUmera limite: '1; scanf('%d', &HUM); for (I = 1; I K= NUM; I++)

SUM = 2; for (J = 1; J <= (I 1 2); J++)

if ((I % J) == 2) SUM += J;

if (SUM == I)

printf('inged es un rawer° perfecto', I); C++;

1 } printf('inEntre 1 y %d hay %d nrimeros perfectos', HUM, C);

}

Problemas suplementarios

Problema P53.1

Escribe un diagrama de flujo y el correspondiente programa en C que permita gene-ral- la tabla de multiplicar de un mimero entero positivo N, comenzando desde 1.

Dato: N (variable de tipo entero que representa el mirnero del cual queremos ob-tener la tabla de multiplicar).

Page 145: Fundamentos de programacion - piensa en C

Problemas suplementarios 129 1

Problema P53.2 Escribe un diagrama de flujo y el correspondiente programa en C que, al recibir coma dato un Mimero entero N, calcule el resultado de la siguiente serie:

1 + 1 + 1 + 1 + +

2 3 4

Date: N (variable de tipo entero que representa el mimero de taminos de la serie).

Problema P53.3 Escribe un diagrama de flujo y el correspondiente programa en C que, al recibir coma data un ntimero entero N, calcule el resultado de la siguiente serie:

1 / 1 * 111 * ...1*/) 1

2 3 4

Data: N (variable de tipo entero que representa el mimero de terminos de la serie).

Problema P53.4 Construye un diagrama de flujo y el correspondiente programa en C que, al reci-bir coma datos N rulmeras naturales, determine cuAntos de ellos son positives, negativos a nulos.

Dates: N, NUM,, NUM2 , NUNN

Donde: N es una variable de tipo entero. NUM, (i N) es una variable de tipo entero que representa al ntiimero i.

Problema P53.5 Construye un diagrama de flujo y el correspondiente programa en C que calcule e imprima la productoria, de los N primeros mimeros naturales,

N

"rr i iii

Date: N (variable de tipo entero que representa el mimero de naturales que se ingresan).

Problema P53.6 Construye un diagrama de flujo y el correspondiente programa en C que, at re-cibir come datos el peso, la altura y el sexo de N personas que pertenecen a un

Page 146: Fundamentos de programacion - piensa en C

130 Capitulo 3. Estructuras algoritrnicas repetitivas

estado de la Repdblica Mexicana, obtenga el promedio del peso (edad 2 18) y el promedio de la altura (edad 2 18), tanto de la poblaci6n masculina come de la femenina.

DatOS: N, PES„ ALT„ SEX„ PES2 , ALT2 , 91a2,„ PEEN , ALTN, SEXN

Donde: N es una variable de tipo enter° que represents el amero de personas. PES„ es una variable de tipo real que indica el peso de la persona i

N). ALT, es una, variable de tipo real que expresa la altura de la persona (1 N). SEX, e5 una variable de tipo entero que representa el sexo de la persona i (1 s i E N). Se ingresa i si es hombre y 0 si es mujer.

Problema P53.7

Escribe un diagrama de flujo y el correspondiente programa en C que, al recibir come date un ndmero enter° N, obtenga el resultado de la siguiente serie;

1' - 22 + - + NN

Data: N (variable de tipo enter° que representa el narnero de tairrinos de la serie).

Problema P53.8

Escribe un diagrama de flujo y el correspondiente programa en C que, al recibir come datos N valores de V, obtenga el resultado de la siguiente funciOn:

X2 + 15

— Y2 12

Si 0 <

Si 15 < X

15

30 Y=f(X)

4 * )0/ X2 +8 Si 30 < X 60

Si Se <

Dates: N, X„

Donde: N es una, variable de tipo enter°. X, es una variable de tipo enter° que indica el valor de 1a, (1 N).

Page 147: Fundamentos de programacion - piensa en C

Problemas suplementarios 131 I

Problema P53.9

En el centro meteorolegico ubicado en Baja California Sur, en Mexico, Bevan los registros de los promedios mensuales de temperaturas de las principales regiones del pais. Existen seis regiones denominadas NORTE, CENTRO, SUR, GOLFO, PACiFICO

y CARIBE. Construye un diagrama de flujo y el correspondiente programa en C que obtenga lo siguiente:

a. El promedio anual de cada region. b. El mes y registro con la mayor y menor temperaturas, y que ademas indique a

clue zona pertenecen estos registros. c. Determine cull de las regiones SUR, PACfFICO y CARIBE tienen el mayor pro-

medio de temperatura anual.

Datos: NOR„ CEN,, SUR„ GOL„ PAC,, CAR,,..., NORD, CEN12 , SURD, GOLD ,

PAC12 , CARD.

Donde: NOR, , CENT , SUR,, GOL,, PAC, , CAR, son variables de tipo real que repre-sentan los promedios de temperaturas en calla una de las regiones.

Problema P53.10

Una empresa dedicada a la yenta de localidades por telefono e Internet maneja seis tipos de localidades para un circo ubicado en la zona, sur de la, Ciudad de Mexico. Algunas de las zonal del circo tienen el mismo precio, pero se manejan diferente para administrar eficientemente la asignaciOn de los asientos. Los pre-cios de cada localidad y los datos referentes a la yenta de boletos para la prOxima funcion se manejan de la siguiente forma:

Daws: Li, L2, L3, L4, L5 y L6

CLA, , CAN,

CLA,, CAN,

,

Donde: Li , L2, L3, L4, L5 y L6 son variables de tipo real que representan los precios de las diferentes localidades. CLA, y CAN, son variables de tipo entero que representan el tipo de localidad y La cantidad de boletos, respectivamente, de la yenta i.

Escribe un diagrama de flujo y el correspondiente programa. en C que realice lo siguiente:

Page 148: Fundamentos de programacion - piensa en C

I 132

Capitulo 3. Estructuras algoritmicas repetitivas

a. Calcule el monto correspondiente de cada yenta. Obtenga el ndmero de boletos vendidos para, cada una de las localidades,

c. Obtenga la recaudacion total.

Problema P53.11

En una bodega en Tarija, Bolivia, manejan informaciOn sobre las cantidades pro-ducidas de cada tipo de vino en los dltimos arios. Escribe un diagrama de flujo y el correspondiente programa en C que permita calcular lo siguiente:

a. El total producido de cada tipo de vino en los dltimos arios, b. El total de la producciOn anual de los dltimos arios.

Darns: N, VIN y „

Donde: N es una variable de tipo entero que representa el ndmero de arios. VIN,,, es una variable de tipo real que representa la cantidad de litres de vino en el ario i del tipo j N, is j s 4).

Problema P53.12

Se dice que un nrimero N es prime si los anicos enteros positivos que lo dividen son exactamente 1 y N. Construye un diagrama de flujo y el correspondiente pro-grama en C que lea un ndmero entero positive NLAd y escriba todos los ndmeros primos menores a dicho nrimero.

Data: NUM (variable de tipo enter° que representa al ndmero enteric, positivo que se ingresa).

Problema P53.13

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir come datos dos ndmeros enteros positives, obtenga e imprima todos los ndmeros primos gemelos wmprendidos entre dichos ndmeros. Los primes gemelos son una pareja de ndmeros primos con una diferencia entre sf de exactamente dos. El 3 y el 5 son primes gemelos.

Darns: Ni , N2 (variables de tipo enter que representan los ndmeros enteros pa-sitivos que se ingresan).

Page 149: Fundamentos de programacion - piensa en C

Problemas suplementarios 133

Problema P53.14

Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como date una x cualquiera, calcule el sen ix) utilizando la siguiente serie:

,i x' X3 + )0 r sen(x) - it Si r 51 71 + -

..

La diferencia entre la serie y un nuevo Vermin. ° debe ser menor o igual a 0.001. Imprima el fltmero de terminos requerido para obtener esta precisiOn.

Dato: x (variable de tipo entero que representa el flamer° que se ingresa).

Problema PS3.15

Construye un diagrama de flujo y el correspondiente programa en C que calcule el maxim* coman divisor (MCD) de dos ntimeros flatmates Ni y N2. El MCD entre dos mlmeros es el natural mss grande que divide a ambos.

Datos: NI , N2 (variables de tipo entero que representan los nilmeros que se ingresan).

Problema P53.16

Construye un diagrams de flujo y el correspondiente programa en C que, al recibir como date un nOmer° entero positive, escriba una figura come b, que se muestra a continuaciOn (ejemplo para N = CI:

1 12 1 2 3 1 2 A 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 1 2 3 12 1

Dato: N (variable de tipo entero que representa el ndmery que se ingresa).

Page 150: Fundamentos de programacion - piensa en C

134 Capitulo 3. Estructuras algoritmicas repetitivas

Problema P53.17

Construye un diagrama de flujo y un programa en C que, al recibir como data un

flamer° entero positivo, escriba una figura como la que se muestra a continua-don (ejemplo para N = 7):

1

1 2 1

1 2 3 2 1 1 2 3 4 3 2 1

1 2 3 4 5 4 3 2 1

1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 7 6 5 4 3 2 1

Dato: N (variable de tipo entero que representa el fluffier° que se ingresa).

Problem P53.18

Construye un diagrama de flujo y un programa en C que, al recibir como dato un

ndmero entero positivo, escriba una figura como la que se muestra a continua-eion (ejemplo para N = 7):

1 2 3 4 5 6 7 7 6 5 4 3 2 1

1 2 A 4 5 6 6 5 4 3 2 1

1 2 3 4 5 5 4 3 2 1

1 2 3 4 4 3 2 1

1 2 3 3 2 1

1 2 2 1

1 1

Dato: N (variable de tipo entero que representa el ndmero que se ingresa).

Page 151: Fundamentos de programacion - piensa en C

Problemas suplementarios 135

Problema P53.19

Construye un diagrama de flujo y el correspondiente programa en C que genere una figura comp la que se muestra a continuaciOn:

1 232

34543 4567654

567898765 6789010876

7890123210987 890123454321098

90123456765432109 0123456789876543210

Problema P53.20

Construye un diagrama de flujo y el correspondiente programa en C que escriba todos los valores positivos de T, P y R que satisfagan la siguiente expresiOn.

7*T4 - 6*F4 12*R5 < 5850

Nokt: T, P y R solo pueden tomar valores positivos.

Page 152: Fundamentos de programacion - piensa en C
Page 153: Fundamentos de programacion - piensa en C

CAPiTULO

Funciones

4.1. Introduction

Para resolver problemas complejos yfo de gran tamaiio es conveniente utilizar el concept° de reduction de problems. De esta forma, el problema, se descompone en subproblemas, los cuales a su vez pueden descomponerse en subsubproblemas, y asi continuar hasta que el pro-blema original queda roducido a un conjunto de actividades basicas, que no se pueden o no conviene volver a descomponer. La soluciOn de cada una de estas actividades basicas permite, luego, aplicando razonamiento hacia atras, la solucion del problema final.

En el lenguaje de programaciOn C la soluciOn de un problema se ex-presa por medio de un programa; la soluciOn de un subproblema, por medio de una funcien. El use de funciones tiene multiples ventajas: facilitan la lectura y escritura de los programas, permiten el trabajo

Page 154: Fundamentos de programacion - piensa en C

1 138

Capital') 4. Funciones

en paralelo —diferentes programadores se pueden encargar de diferentes funcio-nes—, facilitan la asignacion de responsabilidades, permiten que el cOdigo de la funcidn se escriba solamente una vez y se utilice tantas veces coma sea necesario, facilitan el mantenimiento de los programas, etc.

De esta manera, un programa en C esta constituido por un programa principal y un conjunto de funciones. El programa principal consta generalmente de pocas lineal, las cuales pueden ser llamadas a funciones. L.a Hamada a una funckin in-dica al procesador que debe continuar con el procesamiento de la funciOn. Una vez que dsta, concluye, el control regresa al punto de partida en el programa, prin-cipal. Par otra parte, la funci45n se escribe de forma similar al programa princi-pal, peso con diferencias principalmente en el encabezado de la misma. Una funci6n resuelve un subproblema de forma independiente y se ejecuta solo cuan-do recibe una lbmarla desde el programa principal o desde otras funciones. El lenguaje de programaciOn C permite que una funciOn pueda incorporar llamadas a otras funciones.

La comunicaciOn entre las funciones y el programa principal, al igual que entre las mismas funciones, se lleva a cabo por media de pardmetros por valor, parame-lros por referenda y variables globales. Estas dltimas son menos utifirndns par razones de eficiencia y seguridad en la escritura de programa& En los dos Ultimos capitulos utilizamos funciones que pertenecen a bibliotecas del lenguaje C. Par ejemplo, la funci6n pow que se encuentra en la biblioteca math . h se ha utilizado en numerosas ocasiones. Pero cabe aclarar que las funciones que utilizaremos en este capitulo son diferentes, porque tienen la particularidad de que nosotros mis-mos las desarrollaremos. Es deck, no se encuentran en ninguna biblioteca del lenguaje C.

4.2. Variables locales, globales y estaticas Las variables son objetos que pueden cambiar su valor durante la ejecuciOn de un programa. En el lenguaje de programacion C podemos distinguir entre tres ti-pos de variables: locales, gjobales y estadcas. Las variables locales son objetos definidos tanto en el programa principal coma en las funciones y su alcance esta limitado solamente al programs principal o a la funcion en la cual estAn defini-das. Par ejemplo, cada variable local definida en una funciOn comienza a existir s610 cuando se llama a esa, funcion, y desaparece cuando el control regresa al

Page 155: Fundamentos de programacion - piensa en C

4.2 Variables locales, globales y estarticas 139 1

programa principal. Puesto que no retienen su valor, deben ser inicializadas cada vez que se ejecuta la funciOn, de otra forma contendrain basura.

C permite ademis defmir variables locales a un bloque —conjunto de instruccio-nes—, las cuales desaparecen luego de ejecutar el bloque. Cabe destacar que las variables locales tienen prioridad sobre las variables globales. Es decir, si tene-mos una variable global entera i y una variable local entera tambi6n denomina-da I en una funcion, cada vez que utilicemos la variable en la funciOn estaremos hacienda referenda a la variable local. Incluso una variable local defmida en un bloque tiene prioridad sobre una variable local definida obviamente con el mis-mo nombre en la misma funcion.

Pot otra parte, las variables globales son objetos definidos antes del inicio del programa principal y su alcance es rimy amplio, ya que tiene influencia tanto en el programa principal comp en todas las funciones.

Fmalinente, las variables esaticas son similares a las locales, pero conservan su valor durante la ejecucion del programa. Es decir, comienzan a existir cuando se llama a la funcion y conservan su valor aun cuando el control regresa al progra-ma principal.

En el lenguaje C una funcion se escribe de la siguiente forma:

/* El conjunto de instrucciones muestra la sintaxis de una wpfunoleon en el lenguaje C. */

tip° -do - result ado Nombre -de -funcidn (Pa rametros)

instrucciones; /* cuerpo de la funcion. 1, 1

Donde: tipo •do• rosult ado representa el tipo de resultado que devuelve la bunch% (entera, real, caracter, cadena de caracteres, etc,); si no regresa ningtin resultado, entonces se escribe la palabra reservada void.

Nombre- de- funclan representa el nombre de la funcion. Es conveniente utilizar un nombre representativo de lo que realiza la funciOn.

Parilmetros se utiliza para indicar la lista de paeAmetros que recibe la funciOn (los analizaremos en la seccion 4.3).

insrrucclones representa, COMO su nombre lo indica, al conjunto de instrucciones que pertenecen a la funcion

Page 156: Fundamentos de programacion - piensa en C

I 140 Capitulo 4. Funciones

A continuation presentamos diferentes ejemplos para clarificar los conceptos anteriores. Cabe destacar que a partir de este capitulo, por cuestiones basica-mente didacticas y dando por sentado que ya conoces y puedes desarrollar dia-gramas de flujo, ornitiremos el use de estos en la soluciOn grifica de los diferentes problemas.

EJENFLO 4.1

Escribe un programa que calcule, utilizando una funciOn, el cubo de los 10 pri-meros mimeros naturales,

Programa 4.1

#include <stdio_h›

/* Cubo-1. El programa calcula el cube de los le primeros numeros naturales con la ayuda de una funcien. En la solution del problema se utiliza una variable global, aunque esto, come veremos mis adelante, no es muy recomendable. */

int cubofvoid); 1* Prototipo de funcien. */ int I; /* Variable global. */

void main(void) { int CUB; for (I = i; I <= le; I++) {

CUB = cubo(); /* Llamada a la funcion oubo. */ printf('llnEl cube de sIld es: Illd', I, CUB);

} } int cubo(void) /* Declaration de la funcien. */ /* La funcien calcula el cube de la variable global I. */ { return (I*I*I); }

Observa que la segunda instruction del programa:

int cubo(void);

Page 157: Fundamentos de programacion - piensa en C

El cubo de 1 El cubo de 2 El cubo de 3 El cubo de 4 El cubo de 5 El cubo de 6 El cubo de 7 El cubo de B El cubo de 9 El cubo de 14

es: 3 es: es: 27 es: 64 es: 125 GS: 216 es: 343 es: 512 es: 729 es: 1000

4.2 Variables locales, globales y estaticas 1411

es un prototipo de la funcion. Puesto que esta funcion se declara posteriormente, pero se utiliza en el programa principal, el compilador del lenguaje C requiere estar enterado de la existencia de la misma. Toma nota de que el tipo de la fun-ciOn es entero (int) y no tiene pardmetros. Las funciones pueden regresar resulta-dos de diferentes tipos de datos o bien no regresar ninguno, en cuyo caso al inicio se debe incluir la palabra reservada void.

Linea

int I;

indica que I es una variable global de tipo entero. Observa que la variable global se defini6 antes del programa principal.

La instruccion

CUB = cubo();

expresa que el resultado de la funcion cubo(} se asigna a la variable local CUB.

Observa la forma de invocar o Hamar a la funcion. Cabe destacar que es posible evitar el use de la variable local CUB escribiendo el resultado del llamado a la funcion cubo como se muestra a continuacion:

printlf'%nEl cubo de Sd es: 115(1', cubo());

Fmalmente, ya en la funcion cubo, la instruccion:

return II*1*I);

regresa el resultado obtenido al programa principal. Siempre que la funci6n es de un tipo de datos determinado es necesario utilizar un ret urn Para regresar tanto el resultado como el control al programa principal.

A continuaciOn se muestra el resultado que arroja el programa:

Page 158: Fundamentos de programacion - piensa en C

I 142 Capitulo 4. Funciones

EiEIIFLO 4.2

Observa lo que sucede en la soluciOn del problema anterior al declarar una varia-ble local en la funcion cube.

Programa 4.2

#include <stdio.h>

/* Cubo-2. El programa calcula el cubo de los 10 primeros nUmeros naturales con la ayuda de una funcion. */

int cubo{void}; /* Prototipo de luncion. */ int I; /* Variable global. */

void main(void)

{ int CUB; for (I = 1; I z= 1D; I++) {

CUB = cubo{); /* Liamada a la lunciOn cubo. printf("hnEl cubo de pod es: %d', I, CUB);

}

int cubo{vold} /* Declaracion de la funcion. *1 /* La funcion calcula el cubo de la variable local I. */ {

int I = 2; /* Variable local entera I con el mismo nombre wg.que la variable global. */

return (I*T*I);

}

El resultado que arroja el programa es el siguiente:

El cubo de 1 es: B El cubo de 2 es: B El cubo de 3 es: B El cubo de 4 es: B El cubo de 5 es: B El cubo de 6 es: B El cubo de 7 es: B

Page 159: Fundamentos de programacion - piensa en C

4.2 Variables locales, globales y estarticas 143

El cubo de B es: B El cubo de 9 es: B El cubo de 10 es: B

La variable local I tiene prioridad sabre la variable global que tiene el mismo nombre y par esta razkin siempre calcula el cubo del rnimero enter° 2.

4.2.1. Conflicto entre los nombres de las variables

Las variables locales, tal y como lo analizamos anteriormente, tienen prioridad sabre las globales que cuentan con el mismo nombre. Es deck, si existe una va-riable global entera I y una variable local entera con el mismo nombre, cada vez que utilicemos la variable en la funcion estaremos haciendo referencia a la variable local. Sin embargo, puede ocurrir que en algunos casos necesitemos hacer referencia a la variable global. En esos caws debemos incorporarle pre-viamente a la variable global el simbolo 2, de tal forma que si queremos hacer referencia a la variable global I, debemos escribir: : :1.

EJEWILO 4.3

❑bservemos a continuation el siguiente programa, el cual utiliza en una misma funcion dos variables con el mismo nombre, una local y otra global.

Programa 43

*include cstdio.h>

/* Conflicto de variables con el mismo nombre. */

void filvaid);

/* Prototipo de lunci6n. */

let K = 5;

/* Variable global. */

void main (void) {

int I; for (I - 1; I <- 3; I++)

110 ;

void fl{void}

Page 160: Fundamentos de programacion - piensa en C

I 144 Capitulo 4. Funciones

/* La funcift utilize tanto la variable local I comp la variable .global I. */ {

int K = 2; /* Variable local. */ K t= K; printf("10nE1 valor de la variable local es: %el', K); ::K = ::K + K; /* Uso de ambas variables. */ printfr\nEl valor de la variable global es: %d', ::K);

}

Los resultados que arroja el programa son los siguientes:

El valor de la variable local es: 4 El valor de la variable global es: 9

El valor de la variable local es: 4 El valor de la variable global es: 13

El valor de la variable local es: 4 El valor de la variable global es: 17

A continuaciOn se presenta un ejemplo en el cual se utilizan variables locales, globales y estAticas.

EiElaWL0 4.4

En el siguiente programa podemos observar el use de variables locales, globales y estaticas. Incluse, en la funciOn f4 se hate referenda tanto a la variable local como a la variable global que tienen el mismo nombre,

Programa 4.4

*include <stdio.h>

/* Prueba de variables globales, locales y estiticas. El programa utiliza funciones en las que se usan dilerentes tipos de rirvariables.

int flivoia); iftt f21VOid);

Page 161: Fundamentos de programacion - piensa en C

int 13(vold); int f4(void);

int K 3;

void main(void) { int I; for (I = 1; I <- 3; I++)

{

/* Prototipos de funciones. */

/* Variable global. */

printf('‘nEl resultado de la funcion 11 es: %d', 11()); printf("InEl resultado de la funcion 12 es: %d', 12()); printfrImEl resultado de la funcion 13 es: %d', 13()); printf("InEl resultado de la funcion 14 es: %el', 14());

} }

int f/(void) /* La funcidn fl utiliza la variable global. */ { K += K; return (K);

1

int f2(vold) /* La funcion f2 utiliza la variable local. */

int K = 1; K++; return (K);

1

int f3(void) /* La lunci6n f3 utiliza la variable estetica. */ { static int K = a; K += 2; return 1K);

int fAt{void} /* La funciOn f4 utiliza dos variables con el mismo nombre: local upy global. */ { int K = 5; K = K + ::K; /* Uso Is la variable local (K) y global (::K) */ return (K);

4.2 Variables locales, globales y estarrticas

1451•

Page 162: Fundamentos de programacion - piensa en C

I 146

Capitulo 4. Funciones

Los resultados que arroja el programa son los siguientes:

El resultado de la luncien 11 es: 6 El resultado de la funcion 12 es: 2 El resultado de la funcion 13 es: le El resulted° de la funcion 14 es: 11

El resultado de la luncitm 11 es! 12 El resulted° de la funcion 12 es: 2 El resulted° de la funcion 13 es: 12 El resultado de la funcion 14 es: 17

El resultado de la luncion 11 es: 24 El resultado de la luncion 12 es: 2 El resultado de la funcion 13 es: 14 El resultado de la funcion 14 es: 29

4.3. Pararnetros por valor y por referencia

La comunicaciOn entre las funciones y el programa principal, o bien entre las mismas funciones, se lleva a cabo mediante variables globales y parimetros por valor y por referenda. El use de variables se estudiO ampliamente en la seccion anterior, y en dsta nos concentraremos en los parAmetros por valor y por referenda.

Los parametros por valor permiten pasar datos entre el programa principal y las funciones, e incluso entre las mismas funciones. En el parAmetro se escribe una copia de la variable original. Si el parAmetro sufre una alteration en la funcidn que lo recibe, la variable original no se ve afectada.

Los parimetros por referencia tambidn permiten la comunicacidn entre el pro-grama principal y las funciones, o entre las mismas funciones. Sin embargo, en este caso, en lugar de escribir una copia de la variable en el parametro se escribe la direcciOn de la misma. Si el parametro sufre una alteration en la funcide que lo recibe, la variable original tambidn se ve afectada. En C, las llarnadas por refe-

rencia se realizan mediante apuntadores. Un apuntador es una variable que con-tiene la direction de otra variable y se representa por medio de operadores de direction (a) e indirection (*).

Observemos a continuation diferentes ejemplos para clarificar estos conceptos.

Page 163: Fundamentos de programacion - piensa en C

4.3 Parametros por valor y por referencia 147 1

EJEMPLO 4.5

Escribe un programa que calcule el cubo de los 10 primeros ntimeros naturales, utilizando una ftmci6n y realizando la comunicacion mediante pararaetros pot valor.

Pro ma 4.5

*include <stdio.hr

/* Cubs-3. El programa calcula el cubs de los 10 primeros numeros naturales con la

ayuda de una luncion y utilizando parametros por valor.

int cuboiint); /* Prototipo de funciOn. El parimetro es de tipo enters. */

void main(void) { int I; for II = 1; I c= 10; I++)

printf("InEl cubo de I esAd', cubo(I)); /* Llamada a la funcion cubo. El peso del parametro es par valor. */

1

int cubolint K) /* K es un parametro por valor de tips enters_ */ /* La funcion calcula el cubs del parimetro K. *, {

return (K*K*K);

Observa que la instrucciepn:

int cubo(int);

es un prototipo de funcion que inforrna al compilador que el parametro que se utilizati es por valor y de tipo enters.

La siguiente instrucciOn permite escribir el resultado de la funciOn_ Observa que el paracThetly que se utiliza es una copia de la variable I.

printl("knEl cubs de gisd es: %d', cubo{I));

Page 164: Fundamentos de programacion - piensa en C

I 148 Capitulo 4. Funciones

Finalmente, ya en la funcion cubo, la instrucd6n:

return (K*K*K);

regresa el resultado obtenido al programa principal.

EJEPIS3L4 4.6

Observemos a continuadon el siguiente programa, el cual utiliaa ahora parame-tros por referenda.

Programa 4.6

#include ‹stdio.h>

/* Prueba de parametros por referencia. */

void flant *); /* Prototipo de luncitm. El parametro es de tip entero y por referencia --observa el use del operador de indirecci6n. */

void mainivoid) { int I, K = 4; for (I = 1; I <= 3; I++) {

printl( —WnValor de K antes de llamar a la funcion: %d', ++K); printf('OValor de K despues de llamar a la funcion: fif&K)); /* Llamada a la funclon fl. Se pasa la direccion de la variable K,

por media del operador de direccidn: &. */

}

void flint *R) f* La luncion fl recibe un parametro per referencia. Cada vex que el Imp parametro se utilixa en la funciim dabs it precedido por el operador de

Indlreccidn. */ {

*R += *R; I.

La instrucci6n:

void fliint *);

Page 165: Fundamentos de programacion - piensa en C

4.3 Parametros por valor y por referenda 149 1

es un prototipo de funcift que inforrna al compilador que el parametro que se va a utilizar es por referencia y de tipo entero. Se utiliza el operador de indi-recciOn:

La siguiente instrucciOn permite escribir el resultado de la funciOn. Observa que en la Hamada a la funciOn se utiliza un parametro por referenda. La direcciOn de la variable se pasa mediante el operador de direcciOn: a.

printlf'%nValor de K despuis de llamar a la luncion: 15d', 11f&K));

Finalmente, ya en la funciOn 11, cada vez que se utiliza el parametro por referen-cia, se debe anteponer at mismo el operador de indireccOn. El resultado que arroja el programa es el siguiente:

Valor de K antes de llamar a la funcion: 5 Valor de K despues de llamar a la funcilint 10

Valor de K antes de llamar a la luncIdn: 11 Valor de K despuis de llamar a la funcion: 22

Valor de K antes de llamar a la funcion: 23 Valor de K despuis de llamar a la funcion: 46

EJEMPLO 4.7

Analicemos a continuacion el mismo programa del ejemplo anterior, pero utili-zando ahora parSrnetros por valor en lugar de para.'. netros por referenda.

Programa 4,7

#Include <stdio.h>

/* Prueba de parametros por valor. */

int 11 (int); /* Prototipo de funciOn. El parametro GS por valor y de tipo entero. */

void main(void) { int I, K = 4; for (I = i; I <= 3; I++)

Page 166: Fundamentos de programacion - piensa en C

I 150 Capitulo 4. Funciones

printIVIkOnValor de K antes de Ilamar a la luncion: 511(1', ++K); printl("InValor de K despues de Ilamar a la funcion: 11{K)); /* Llamada a la luncion f1. Se pasa una copia de la variable K. */

} }

int -Mint R) { R += R; return (R);

}

El resultado que arroja el programa es el siguiente:

Valor de K antes de llamar a la funcion: 5 Valor de K despues de Ilamar a la funcion: 10

Valor de K antes de Ilamar a la funcilin: 6 Valor de K despues de Ilamar a la funcion: 12

Valor de K antes de Ilamar a Is funcion: 7 Valor de K despues de Ilamar a is funcion: 14

A continuaciOn presentamos un programa en el que se combinan variables locales y globales, y parainetros tanto pot valor como pot referencia.

EFE IYU LO 4.8

Analiza cuidadosarnente el siguiente programa e indica qu6 imprime.

Programa 4.8

#include ‹stdio.h>

/* Combinacion de variables globales y locales, y parimetros por valor y por referencia. */

int a, b, c, d; /* Variables globales. */

void funcionl(int *, int *); /* Prototipo de funcidn. Observa que los dos parametros son par up referencia. */

Page 167: Fundamentos de programacion - piensa en C

4.3 Parametros por valor y por referencia 151

int luncion2(int, int *); /* En este prototipo el primer parametro as por valor y el segundo por up referencia. */

void main1vo1d) { int a; /* Nota que a es una variable local. */ a = 1; /* Se asigna un valor a la variable local a. */ b = 2; /* Se asignan valores a las variables globales b, 0 y d. */

- 3; d = 4; print1('1n%d %d %d %d', a, b, c, d); funcion1 (&b, &c); print11'0%d %d %d %d', a, b, c, d); a = funcion2(c, &d); printf1'0%d %d %d %d', a, b, c, d); }

void funcionl(int *b, int *c) { int d; a = 5; /* Observa que se hace referencia a la variable global a. */ d = 3; /* Nota que se hace referencia a la variable local d. */ 1*b)++; 1*c) += 2; print-1'1' 1 1%d %d %d %d', a, *b, *c, d);

int funcion2(int c, Int *d) { int b; at+; b - 7; c += 3; 1*d) += 2; print-1'1'0%d %d %d %d', a, b, c, *d); return fc);

Compara to resultado con el que presentamos a continuacion,

1 2 3 4 5 3 5 3 1 3 5 4 6 7 B 6 8 3 5 6

Page 168: Fundamentos de programacion - piensa en C

152 Capituio 4. Funciones

4.4. Paso de funciones corm parametros

En la practica encontramos problems cuyas soluciones se podrian formular fa-cilmente si pudiramos pasar funciones como parimetros. Por fortuna, en el len-guaje de programaci6n C es posible realizax esta actividad, es decir, pasar una funciOn a otra funciOn como parametro por referencia —en el parametro se es-cribe la direcci6n de la funcion—. Debemos recordar que en C Las llamadas per referenda se llevan a cabo por medio de apuntadores, y un apuntador no es lugs que una variable que contiene la direcciOn de otra variable o de una funcion y se representa por medio de los operadores de direcciOn (a) e indirecciOn (*). Este paso de una funciOn como parametro permite que una funciOn se transfiera a otra como si fuera simplemente una variable.

Extirm 4.9

En el siguiente programa pasaremos una funciOn a otra funciOn como parametro por referencia. Nota que la funciOn Control recibe como parametro una funciOn. Dependiendo de cual sea esta, realiza la Hamada a la funciOn correspondiente suma o Resta.

Programa 4.9

#include <stdio.n>

/* Paso de una luncidn coma parimetro por relerencia. */

irrt Sumafint X, int Y) /* La lunclon Suma regresa la suma de los parametros de tip entero

X y Y. */ { return (X+Y); }

int Resta(int X, int Y) /* Esta funcion regresa la resta de los parametros de tip* entero • x y Y. */ { return {X-Y);

Page 169: Fundamentos de programacion - piensa en C

Problemas resueltos 1531

int Control(int (*apf) (int, int), int X, int Y) /* Esta funcift recibe como parametro otra funcion --la direcci6n— y

dependiendo de cull sea data, llama a la funcion Soma 0 Rasta. */ { int RES; RES = (*api) (X, Y); /* Se llama a in funcion 8uma o Resta. */ return (RES); }

Void main(VOld) { int RI, R2; R1 = Control(Suma, 15, 5); /* Se pasa comp parametro la luncibn Bums. */ R2 Control(Resta, 10, 4); /* Se pasa comp parametro in luncift Rasta.*! printf("InResultado 1: %el', R1); print1('OResultado 2: %d', R2); }

Problemas resueltos

Problema PR4.1

Escribe un programa en C que, at recibir como datos dos ntimeros enteros, deter-mine si el segundo tuimero es mtiltiplo del primero.

Datos; Nui, NU2 (variables de tipo entero que representan los ntimeros que se ingresan).

Programa 4.10

# include ‹stdio.h>

I* Milltiplo. El programa, al recibir coma datos dos numeros enteros, determina si imp el segundo es milltiplo del primero. */

int multiplo(int, int); /* Prototipo de funcidn. */

void main(void) {

int NU1, NU2, RES; printWOIngresa los dos nilmeros: '); scanI('%4 &NU1, &NU2); RES = multiplo(NU1, NU2);

Page 170: Fundamentos de programacion - piensa en C

154 Capituio 4. Funciones

if {RES) printf("thEl segundo ntimero es matiplo del primero");

else printf("1E1 segundo ntimero no es matiplo del primers");

}

int multiploamt N1, int N2) /* Esta funcitm determine si N2 es mdltiplo de N1. */ { int RES; if ((N2 N1) == 0)

RES = 1; else

RES = 0; return (RES); }

Problema PR4.2

Escribe un programa en C que, al recibir como data un nilmero entero positivo, determine el mayor divisor de cliche flamer°.

DWG: NW (variable de tipo enter° que representa el flamer° que se ingresa).

Programa 4,11

include ‹stdio.h>

/* Mayor divisor. El programa, al recibir como data un nUmero entero positivo, calcula

su mayor divisor. */

int mad(int); /* Prototipo de funcion. */

void main(void) { int NUM, RES; printf("InIngresa el n6mero: "); scan-WU', &NUM); RES - matl(NUM); print1C 1 1E1 mayor divisor de crsd es: %V', NUM, RES); 1

int mad(int Ni) /* Esta funcion calcula el mayor divisor del rainier° Ni. *f

Page 171: Fundamentos de programacion - piensa en C

Problemas resueltos 1551

int 1 = (Ni i 2); /* 1 se inicializa con el miximo valor posible que puede ser divisor in. de Ni- */ stile (N1 Rs I) /* El ciclo se mantiene activo mientras (111 ts I) sea distinto de cero.

Cuando el resultado sea 0, se detiene, ya que se habra encontrado el mayor divisor de N1. */

I--; return I;

Problema PR4.3

Escribe un programa en C que, al recibir comp datos dos mimeros enteros, deter-mine el miximo coman divisor de dichos ntimeros.

DalOs: NU1, NU2 (variables de tipo entero que representan los ntimeros que se ingresan),

Programa 4.12

# include ‹stdio.h>

/* Maximo comUn divisor. El programa, al recibir comp dates dos nameros enteros, calcula el maxima

comun divisor de dichos raimeros. */

int mcd(int, int);

void mein(void) { int NU1, NU2, RES; printi('ImIngresa los dos n6meros enteros: '); scanf('sEd &NU1, &NU2); RES = mcd (NU1, NU2); printi('\nEl maxima comiln divisor de y es: cEd', NU1, NU2, RES); }

int mcd ita Ni, int N2) /* Esta funcion calcula el maxima comon divisor de los nameros N1 ws• y N2. */ {

int I; if (N1 ‹ N2)

I = N1 / 2;

Page 172: Fundamentos de programacion - piensa en C

I 156

Capitulo 4. Funciones

else I = N2 / 2;

/* I se inicializa con el maxim° valor posibls que puede ser divisor op de N1 y N2. */ while ((Ni % I) fi (N2 % I)) /* El ciclo se mantiene activo mientras (N1 % 1) o (N2 % I) sean

distintos de cero. Cuando el resultado de la evaluacion sea 0, el ur. ciclo se detiene ya que se habri encontrado el maxima comdn divisor.

I--;

return I; }

Prob bum PR4.4

Escribe un programa en C que, al recibir como datos N nitmeros enteros, deter-mine cudntos de estos nUmeros son pares y cuantos impares.

Dator N, NUMI, NUM2,..., NUM(

Donde: N es una variable de tipo entero que representa el nUmero de datos que se ingresan.

NUM, es una variable de tipo entero que representa al nUmero i (1 N) .

Programa 4,13

#include ‹stdio.h, #include cmath.lp-

/* Pares e impares. El programa, al recibir como datos N numeros enteros, caicula cuintos %IP de silos son pares y cuintos impares, con la ayuda de una funcion. *f

void parimp(int, int *, int *); /* Prototipo Is funcion.

void man{void}

int I, N, NUM, PAR = 0, IMP = 0; printICIngresa el nOmero de datos: '); scan-WU', &N); for (i =1; I = N; It+) {

printl{'Ingresa el numero I); scanir%d', &NUM); parimp(NUM, &PAR, &IMP);

Page 173: Fundamentos de programacion - piensa en C

/* Llamada a la funclon. Paso de parSmetros por valor y por relerencia *I

} printl("InWimero de pares: PAR); printICONCImero de impares: IMP); }

void parimp(int NUM, int *P, int *I) I* La foncidn incrementa el parametro o 'I, segdn sea el nftero par

o 1mpar. *I { iRt RES; RES = pow(-1, NUM); if (RES > 0)

*P += 1; siii

if (RES < 0) *I += 1;

Problema PR4.5

Escribe un programa en C que, at recibir las calificaciones de un grupo de alum-nos que presentaron su examen de ad mision para ingresar a una universidad pri-vada en la Ciudad de Mexico, calcule y escriba el mimero de calificaciones que hay en cada uno de los siguientes rangos:

0 . . . 3.99

4 . . . 5.99

6 . . 7.99

8 . . . 8.99

9 . . . 10

DatOS: CAL„ CAL,„.„ -1 {CAL, es una variable de tipo real que representa la caLifi-caci6n del alumna i).

Programa 4.14

/*Include ‹stdio.hr

/* Rango de calificaciones.

Problemas resueltos 157 [

Page 174: Fundamentos de programacion - piensa en C

I 158 Capitulo 4. Funciones

El programa, al recibir comb date una aerie de calificaciones, obtiene el range en el que se encuentran.*/

void Rango{int); /* Prototipo de luncion. */

int RA1 = 5; int RA2 = 5; int RA3 = D; /* Variables globales de tip entero. *i int RA4 = 5; int RA5 = 0; /* El use de variables globales no es muy recomendable. En estos

problemas se utilizan Unicamente con el objetivo de que el lector mr. pueda observer is forma en que se aplican. */

void main{voLd}

{ float CAL; printICIngresa la primers calificacion del alumna: ) ; scanICsisr, &CAL); while (CAL != -1) {

Rango(CAL); /* Llamada a is funciOn Rsngo. Se pass un paremetro per valor. */

print1('Ingresa la siguiente calilicacion del alumno: '); scanf('%1', &CAL);

} printl("Ine..3.99 = %d', RA1); printl("14..5.99 = %d', RA2); printl("In6..7.99 = %d', RA3); printl("InB..B.99 = %d', RA4); printl("In9..10

= %d', RA5); }

void Rango(int VAL) /* La funcion increments una variable dependiendo del valor del 'EP parametro VAL. */ { if (VAL < 4)

RAI++; else

if (VAL < 6) RA2++;

else if (VAL < B)

RA3++; else

if (VAL < 9) RA4++;

else RAS++;

Page 175: Fundamentos de programacion - piensa en C

Problernas resueltos 159

Problema PR4.6

Escribe un programa en C que calcule e imprima la productoria de los N prime-ros ndmeros naturales.

Dato: NW (variable de tipo entero que representa el mimero de naturales que se ingresan, 1 c NUM 5 100).

Pregame 4.15

include ‹stdio.h,-

/* Productoria. El programa calcula la productoria de los N primeros nOmeros naturales. */

int Productoria(int); /* Prototipo de funcidn. * 1

void main(void) { int NUM;

/* Se escribe un do-eftile pare verilicar que el numero del cual as

'EP quiere calcular la productoria sea correcto. */ do {

printirIngresa el nUmero del cual quieres calcular la productoria: ');

scanir9dd', &NUM); } Mine (NUM ›100 NUM c 1); printiClynLa productoria de si5d es: smr, NUM, Productoria(NUM)); }

int Productoria(int N) /* La funcidn calcula la productoria de N. *1

{ int I, PRO = i; for (I = 1; I N; I++)

PRO *= I; return (PRO); }

Problema PR4.7

Escribe un programa que, al recibir come dates 24 ndmeros reales que represen- tan las temperatures registradas en el exterior en un periodo de 24 floras, encuentre,

Page 176: Fundamentos de programacion - piensa en C

I 160 Capitulo 4. Funciones

con la ayuda de funciones, la temperatura promedio del dfa, asi como la tempe-ratura maxima y la minima con el horario en el cual se registraron.

Dodos: TEM„ TEM, (variables de tipo real que representan las tempe- raturas).

Programs 4.16

*include ‹stdio.hp- *include ‹math.h>

/* Temperaturas. El programa recibe come dates 24 numeros reales que representan las ▪ temperaturas en el exterior en un periodo de 24 horas. Calcula el

promedio del dia y las temperaturas maxima y minima con la Nora en la ▪ que se registraron. */

void Acutem(float); void Maxima(float, int); void Minima(float, int);

/* Prototipos de funciones. */

float ACT = 0.0; float MAX = -50.0; /* Variables globales. */ float MIN = 60.0; 1st HMAX; 1st HMIN;

/* Variables globales. ACT se utiliza para acumular las temperaturas, ft. per esa razor' se inicializa en cero. MAX se utiliza para calcular la ft maxima; se inicializa en -50 para que el primer valor que as ingress

modilique su contenido. MIN se usa para calcular la minima; se inicializa con un valor muy alto para quo el primer valor ingresado modilique su contenido. HMAX y HMIN se utilizan para almacenar el horario en que se produjeron las temperaturas maxima y minima, respectivamente. */

void main void) { float TEM; int I; for = 1; I = 24; I++) {

print1('Ingresa la temperatura de la hora ', I); scaniCimi— , &TEM); Acutem(TEM); Maxima(TEM, I); /* Llamada a las funciones. Paso de parimetros

per valor. */ Minima(TEM, I);

Page 177: Fundamentos de programacion - piensa en C

Problemas resuettos 161 I

print? ( ''OPromedio del dia: %5.21', (ACT / 24)); printf( —0Mixlma del dia: %5.2f ItHora: %d', MAX, HMAX) ; printf ( '‘nMinima del din: %5.21 tHora: %d', MIN, HMIN);

}

void Acuten(flont T) /* Esta funcion acumula las temperaturas en la variable global ACT

INF para posteriormente calcular el promedio. */ {

ACT f= T; 1

void Mnxina(flont T, int H) /* Esta funcift almacena la temperatura maxima y la horn en que en

produjo en las variables globales MAX y HMAX, respectivamente */

{ if (MAX c T)

{ MAX = T; MAX = H;

}

}

void Minima(tiont T, int H) /* Esta funcidn almacena In temperatura minima y la hora en que se produjo en las variables globales MIN y HMIN. */

if (MIN r T) {

MIN = T; HMIN = H;

}

Problema PR4.8

En el centro meteorolOgico ubicado en Baja California Sur, en Mexico, se regis-tran los promedios mensuales pluviales de las principales regiones del pais. Exis-ten seis regiones denominadas NORTE, CENTRO, SUR, GOLFO, PACfFICO y CARIBE.

Escribe un programa en C que obtenga lo siguiente, solo para las regiones GOLFO,

pAcfFico y CARIBE:

a) El promedio anual de las trey regiones.

b) La region con mayor promedio de lluvia anual (considera que los promedios de lluvias son diferentes).

Page 178: Fundamentos de programacion - piensa en C

162 Capitulo 4. Funciones

Datips:GOL,PAC„CAR„GOL2,PAC,,CAR2,...,00L12 ,PAC,27 CARu

Donde: GOL, PAC, y CAR, on variables reales que representan las lluvias mensua- les de las diferentes regiones f1 12),

Programa 4.17

#include ‹stdio.h>

/* Lluvias. El programa permits calcular el promedio mensual de las lluvias caidas en up tree regiones importantes del pais. Determina tambien cull es la regiOn wp con mayor promedio de lluvia anual. */

void Mayor{float, float, float); /* Prototipo de funcidn. */

void main(void) { int I; float GOL, PAC, CAR, AGOL = 0, APAC = 0, ACAR = 0; for (I =1; I <= 12; It+) {

printIrMnIngresa las lluvias del mes %d', I); printff —ORegiones Golfo, Pacifico y Caribe: '); scanI('M %f %I', &GOL, &PAC, &CAR); AGOL += GOL; APAC +- PAC; ACAR += CAR;

} printlf'WmPromedio de Iluvias Region Golfo: %6.21', (AGOL / printIrlInPromedio de Iluvias Region Pacifico: %6.21 {APAC printif"InPromedio de Iluvias Region Caribe: %6.21 \n', (ACAR MayorfAGOL, APAC, ACAR); /* Se llama a la funcion Mayor. Paso de parimetros par valor. }

void Mayor(float R1, float R2, float R3) /* Esta funcion obtiene la region con mayor promedio de lluvia anual. */

{ if (R1 > R2)

if (R1 > R3) printf('‘nRegion con mayor promedio: Region Golfo. Promedio:

%6.2f', R1 / 12);

else printff' 14nRegion con mayor promedio: Region Caribe. Promedio:

%6.21', R3 / 12);

else

Page 179: Fundamentos de programacion - piensa en C

Problemas resueltos 1631

if (R2 > R3) printlr\nRegion con mayor promedio: Region Pacifico. Promedio:

c156.2f', R2 / 12);

also printfr\nRegion con mayor promedio: RegiOn Caribe. Promedlo:

t16.2f', R3 i 12);

}

Problema PR4.9

Eseribe un programa en C que imprima todos los valores de T, P y a que satisfa-gan la siguiente expresiOn:

15*T4 + 12*P6 t 9*Ole < 5500

Nota: Observa que las tres variables solo pueden tomar valores enteros positivos.

Programa 4.18

#Include <stdio.hr #include <math.h>

/* Expresion. El programa ascribe los valores de T, P y Q que satisfacen una determinada

expresion.*/

int Expresion(int, int, int); /* Prototipo de luncion. */

void main{void)

int EXP, T = 0, P = 0, Q = 0; EXP = Expreeion(T, P, 0); while (EXP < 5500)

while (EXP < 5500)

while (EXP < 5500) {

printf("InT: sIsd, P: hd, 0: %d, Resultado: T, P, 0, EXP); Ott; EXP = Expresion(T, P, 0);

} Ft++;

0 = 0;

Page 180: Fundamentos de programacion - piensa en C

I 164 Capitulo 4. Funciones

EXP = Expresion(T, P, 0);

T++; P = 0; 0 = 0; EXP = Expresion(T, P, 0);

} }

int Expresion(int 1, int P, int 0) /* Esta funciem obtiene el resulted° de la expresion pare los valores

de T. P y 0. */ { int RES; RES = 15 * pow(T,4) + 12 * pow(P,5) + 9 * pow(0,6); return (RES);

Problerna PR4.1O

Sigue y analiza cuidadosamente el siguiente programa e indica qu6 imprime. Si tus resultados coincides con los presentados, felicitaciones. Si son diferentes, re-visa principalmente la aplicacian de los parametros por referencia, porque tal vez hay alglin concepto que min no dominos.

Programa 4,19

Oinclude ‹stdio.h>

/* Funciones y parametros. */

int a, b, c, d;

/* Variables globales. */

Void funcionl(int, int *, int *); /* Prototipos de funciones. */ int luncion2(int *, int);

void main(void) { int a; a- 1; b - 2; c - 3; d 4; printl("Inskid %d sIsd "Ad', a, b, c, d); a funcion2 (&a, c);

Page 181: Fundamentos de programacion - piensa en C

Problemas resueltos 165i

printfr1n%4 odd %d %d', a, b, c, d);

}

void funcionl(int r, int *b, int *c

{ int d; a = *c; d = a + 3 + *b; if (r) {

*b = *b + 2; *c = *c + 3; printf('%n%d %d %d %4', a, *b, *c, d);

} able {

*b = *b + 5; *c = *c + 4; printf('%n%d %d %d %d', a, *b, *c, d);

int funcion2(int *d, int c) { int b;

a = 1; b = 7; funcion1(-1, d, &b); i* Observa que el parametro d que enviamos a fundiOn1 es por referencia. uP. Es equivalents escribir &•d a escribir solaments d. */

printir%n%d %d %d %d', a, b, c, *d); c += 3; (*d) += 2;

printI('%n%d %d %d %d', a, b, c, *d); return ic); 1

El programa genera 10S siguientes resultados:

1 2 3 4 7 3 10 11

7 10 3 3 7 10 6 5 6 2 3 4

Page 182: Fundamentos de programacion - piensa en C

166 Capitulo 4. Funciones

Problema PR4.11

Analiza cuidadosamente el siguiente programa e indica que imprime. Si tus re-sultados coinciden con los presentados, felicitaciones, Si son diferentes, revisa principalmente la aplicacion de los parilmetros por referencia, porque tal vez hay algdn concepto que adn no dominas

Progrsana 4.20

# include <stdio.h>

/* Funciones y parametros. */

int F1 (int , int *);

int A = 3; int B = 7; int C = 4; int D = 2;

/* Prototipo de funcift. */

/* Variables globales. */

void main(v0i0) { A = Fl (C, &D); printf(" 1 1%d #sd cbd %I", A, B, C, D); C = 3; C = Fl (A, &C); printf('IlAd %dSd Sd', A, B, C, D); I

int Mint X, int *Y)

{ int A; A = X * *Y; C++; B += *Y; printI('IAd %d Rid 96(1', A, B, C, 0); *Y"; return (c); }

El programa genera los siguientes resultados:

B 9 5 2 5 9 5 2

15 13 4 2 5 13 4 2

Page 183: Fundamentos de programacion - piensa en C

Problemas resueltos 167 1

Prob Iema PR4.1 2

Sigue y analiza cuidadosamente el siguiente programa e indica clue" imprime. Si tus resultados coinciden con los presentados, felicitaciones, Si son diferentes, re- visa principalmente la aplicaciOn de los paraiThetros pot referenda, porque segu-ramente hay alglin concepto que min no dominas

Programa 4.21

* include zstdio.h>

/* Funciones y parimetros. */

int z, y;

/* Variables globales. */

int Flflloat); void F2(float, int *); /* Prototipos de funciones. */

void main(void)

int w; float x; z = 5;

Y = 7; w = 2; x = (float)y / z; printf('ImPrograma Principal: %d %d '.2f %d', z, y, x, w); F2 ix, &w); printf("mPrograma Principal: gbd %d %.2f %d', z, y, x, w);

int Fl(float x) { int k; if (x1= 0) {

k z - y; x++;

} else

k = z + y; printf("LnFl: gbd %11 %.21 z, y, x, k); return(k);

void F2{float t, int *r) {

Page 184: Fundamentos de programacion - piensa en C

168 Capitulo 4. Funciones

int y;

Y = 5; = 0;

print1('1 1F2: %d %d %.21 %d', z, y, t, *r); if (z = 0) {

z = (*r) * 2; t = (float) z / 3; printl("InIngresa el valor: '); scanf('%d', r); i* El usuario debe ingresar el valor 6 */ print7("InF2: %d %d %.2f %d", z, y, t, *r);

} else {

z = (*r) * 2; printli'1 1F2: %d %d %.2f %d', z, y, t, *r);

} *r = F1(t);

}

El programa genera los siguientes resultados:

5 7 1.40 2 0 5 1.40 2 4 5 1.33 6 4 7 2.33 -3 4 7 1.40 -3

Problemas suplementarios

Nola: Todos los problemas deben resolverse eon la ayuda de funciones. Evita utilizar variables globales, ya que no es una buena praztica.

Problerna PS4.1

Escribe un programa que, al dar corm datos N mimeros enteros (1 < N < 500), obtenga el promedio de los mimeros pares e impares.

Dato: N, NUM" NUFA2, NUM,.

Donde: N es una variable de tipo enter° clue representa el numero de datos NEPA, es una variable de tipo entero que representa el niunero que se ingresa.

Page 185: Fundamentos de programacion - piensa en C

Problemas suplementarios 169 1

Problema P54.2

Escribe un programa en C que lea un mirnero entero NCJM y calcule el resultado de la siguiente serie:

1* 1 / 1* 1 / (*, If) 1 2 3 4

Dato: NUM (variable de tipo entero que representa el mimero de terminus de la serie).

Problema P54.3

Construye un diagrama de flujo y un programa en C que, al recibir coma data un mimero entero N, calcule el factorial de dicho mimero.

Dato: Num (variable de tipo entero que representa el flamer° que se ingresa).

Problema P54.4

tin individuo invierte en un banco un capital especifico y quiere saber cuanto ob-tendra al cabo de cierto liempo, si el dinero se coloca a una determinada tasa de inters mensual. Escribe el programa correspondiente.

Datos: MES, CAP, TAS

DOnde: HES es una variable de tipo entero que se utiliza para indicar el mini= de meses al que se colocara la inversion. CAP es una variable de tipo real que representa el manta inicial. TAS es una variable de tipo real que indica la tasa de inters mensual,

Problema P54.5

Escribe un programa en C que, al recibir coma data un nlimero entero N, obtenga el resultado de la siguiente serie:

11 - + 38 + 1411

Dato: N (variable de tipo entero que representa el mimero de terminus de la serie).

Page 186: Fundamentos de programacion - piensa en C

170 Capitulo 4. Funciones

Problema P54.6

Escribe un programa en C que, al recibir come data una X cualquiera, calcule el cos( x) utilizando la siguiente serie:

1C2 le

1- — — + - -

21 4! 6!

La diferencia entre la serie y un nuevo tdrmino debe ser menor o igual a 0001. Imprima el flamer° de t6rminos requerido para obtener esta precisiOn.

Dato: x (variable de tip() entero que representa el flamer° que se ingresa).

Problem P54.7

Se dice que un flamer() N es primo si los anicos enteros positives que to dividen son exactamente 1 y N. Escribe un programa en C que, al recibir come date un flamer() enter° positive, determine si Este es un ntimero prime.

Dato: NUM (variable de tipo entero que representa el namero enter° positive que se ingresa).

Problem P54.8

Se dice que un flamer° es considerado perfecto si la sums de sus divisores ex-cept° el mismo, es igual al propio ntimero. Escriba un programa, que obtenga e imprima todos los nameros perfectos comprendidos entre 1 y N.

Dato: N (variable de tipo entero que representa el ruimero enter° positive que se ingresa).

Problerna P54.9

Escribe un programa en C que, al recibir come date un namero entero de cuatro *Res, lo imprima en forma inversa come se muestra a continuaciOn —el name-ro considerado es el 9256.

6 5 2 9

Date: N (variable de tipo enter° que representa el flamer° entero positive que se ingresa).

Page 187: Fundamentos de programacion - piensa en C

Problemas suplementarios 1711

Problema P54.10

Escribe los resultados que se obtienen al ejecutar el siguiente programa:

Programa 4.22

#include ‹ettlio.h,

/* Funcionee y parkmetros. */

int a, b, c, d;

int palfint, int);

void main(void) {

/* Prototipo de luncion. *1

a = 2; c 3; d = 5; a - pale, d); printlf'%n$A %d clsd %d', a, b, c, d); b = 4; b = pal{ b, a); printif'%nctd %d %d %d', a, b, c, d);

int palfint x, int y) { int c; b = x * y; c = b + y; x++;

= * iY 1); printf( -0%d Psd %11 gsd', b, c, x, y); return fx);

Page 188: Fundamentos de programacion - piensa en C

172 Capitulo 4. Funciones

Problema P54.11

Examina cuidadosamente el siguiente segment° de programa:

Program 4,23

#include <stdio.h>

void trueque(int

int ty)

{ int tem; tem = *x; *x *y;

*y = tem; }

int suma(int x) {

return (x + x);

1

y determina cuales de las siguientes llamadas a las funciones son correctas si x, y y z son variables de tipo entero.

1. trueque(suma Six);

2. trueque(3, 4);

3. suma(10);

4. y = suma(10);

5. z = trueque(&x, &y);

6. trueque(&x, &y);

Problema P54.12

Escribe los resultados que se obtienen al ejecutar el siguiente programa:

Programa 4.24

#include <stdin.h>

/* Parametros y funciones. */

int fi(woid); int f2(void); /* Prototipos de funciones. */

Page 189: Fundamentos de programacion - piensa en C

Problemas suplementarios 173 j

int 13(woid); int 14(woid); int K = 5;

✓oid main(void) { int I; for {I = 1; I <= 4; I++} {

printl("In\nEl resultado de la luncion 11 es: %d', T1()); printl("InEl resultado de la funcion 12 es: %d', f2());

resultado de la funcidn 13 es: %d', f3()); print1('1nEl resultado de la funciOn 14 es: %d', 14());

}

int f1(void) {

K *= K return (K); }

int 12(woid) { int K = 3; K++; return (K);

}

int 13(void)

{ static int K = 6; K += 3; return (K);

int 14{woid} { int K = 4; K = K + ::K; return (K);

Page 190: Fundamentos de programacion - piensa en C
Page 191: Fundamentos de programacion - piensa en C

CAPiTULO

Arreg los un id imensionales

5.1. Introduccion

En la practica es frecuente que enfrentemos problemas cuya solucift seria muy dificil de hallar si utilizAramos tipos simples de dittos para resolverlos. Es deck, dates que ocupan una sob casilla de uaemoria. Sin embargo, muchos de estos problemas se podrian resolver f mente si aplickamos en cambia tipos estructurados de dates, los cuales ocupan un grupe de casillas de uaemoria y se identifican con un nombre. Los arreglos que estudiaremos en este eapftulo constitu-yen un tipo estructurado de dates.

Los dates estructurados tienen varies cempenentes, cada uno de los cuales puede ser un tipo simple de date a bien un tipo estructurado de date, pere es importante recordar que los componentes del nivel mas No de un tipo estructurado siempre serail tipos simples de dates.

Page 192: Fundamentos de programacion - piensa en C

I 176

Capitub 5. Arregios unidimensionales

Formalmente definimos un arreglo de la siguiente manera:

"Un arreglo es una colecciOn finita, horniDgenea y ordenada de elementos."

porque todo arreglo tiene un 'finite, es deck, se debe determinar cual es el nOmero mAximo de elementos del arreglo. Homogenea, porque todos los ele-mentos del arreglo deben ser del mismo tipo. Ordenada, porque se puede deter-minar cual es el primer elemento, cull' el segundo, y asf sucesivamente.

5.2. Arreglos unidimensionales

Formalmente definimos un arreglo unidimensional de la siguiente manera:

"Un arreglo unidimensional es una coleccidn finita, homog6nea y ordenada de dates, en Ia que se hace referenda a cada elemento del arreglo per

rnedlo de un IndIce. Este ultimo indica Ia casIlla en Ia qua se encuentra el elemento."

Un arreglo unidimensional permite almacenar N elementos del mismo tipo (enteros, males, caracteres, cadenas de caracteres, etc.) y acceder a ellos por medio de un Indice. En los arreglos unidimensionales se distinguen dos par- teS los eomponentes y el indite. Los componentes hacen referencia a los elementos que se almacenan en cada una de las celdas o casillas. El indice, por su parte, especifica la forma de acceder a cada uno de estos elementos. Para pacer referencia a un componente de un arreglo de-bemos utilizar tanto el nombre del arreglo como el rndice del elemento. En la figura 5.1 se puede observar la representaciOn graifica de un arreglo unidi-mensional.

Page 193: Fundamentos de programacion - piensa en C

5.3 Declaracion de arreglos unidimensionales

177 I

Arreglo

i L Segundo element() H

N-6simo element°

Primer elemento

FI6i 5.1 Representacion grafica de un arregio unidimensional

En la figura 5,2 se muestra el arrest() unidimensional A que contiene 10 elemen-tos de tipo entero. El primer indice del arreglo es el 0, el segundo, el 1, y asf sucesivamente. Si queremos weeder al primer elemento del arreglo debemos escribir A[9], pero si requerimos acoeder al quinto elemento debemos escribir A[4], Por otra pane, se puede observar que el valor de A[7] es 4, el de A[3+5]

es —5, el resultado de A[2] + A[5] es 2, y el resultado de AM * A[9] eS 32.

15 23 B 14 0 —6 11 4 —5 B

IIIII itfili A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[B] A[9]

FIGURA 5.2 Indices y componentes de un arreglo unidimensional

5.3. Declaracion de arreglos unidimensionales

Los arreglos ocupan espacio en memoria, que se reserva en el momento de reali-zar la declaraciOn del arreglo. A continuaciOn presentamos diferentes formas de declarar arreglos, con la explicacidn correspondiente.

A

Page 194: Fundamentos de programacion - piensa en C

dinclude ‹stdio.lp

/* Cuenta-numeros. El programa, al recibir come dates un arreglo unidimensional de tip() . entero y un numero entero, determine cuintas veces se encuentra el upndmero en el arreglo. *1

void mainivaid) { int I, NUM, CUE 0; int ARRE[100]; for (I=0; Ic100; I++)

/* Declaracion del arreglo */

printf('Ingrese el element° %d del arreglo: I+1); scanf('%d', &ARRE[I]); /* Lecture -asignacien-- del arreglo *1

} print1('1nlnIngrese el nUmero que se va a buscar en el arreglo: '); scanli'slid', &NUM); for (I=0; ION; I++)

if (ARRE[I] m-m- NUM) /* Comparacitin del nOmero con los elementos del • arreglo */

CUE++; printf("In‘nEl shid se encuentra skid veces en el arreglo', NUM, CUE);

I 178 Capitulo 5. Arregbs unidimensionales

void main(void)

{ . . .

int A[10]; float B[5];

1* Definicion de un arregla de tipo enter° de 10 elementos. *1 1* Befinicien de un arregla de tipo real de 5 elementos. *1

Una vez que se defmen los arreglos, sus elementos pueden recibir los valores a travel de multiples asignaciones, o bien, como ocurre frecuentemente en la prac-tica, a travel de un ciclo. Observemos a continuacion el siguiente ejemplo.

EFEWLO 5.1

Construye un programa que, al recibir como datos un arreglo unidimensional de 100 elementos de tipo entero y un mirnero entero, determine cuAntas veces se en-cuentra este mimero dentro del arreglo.

Datos: ARRE[1 en] , NUM (donde ARRE es un arreglo unidimensional de tipo entero con capacidad para almacenar 100 valores enteros y NMI es una variable de tipo entero que representa el nUmero que se buscara en el arreglo).

Programa 5.1

Page 195: Fundamentos de programacion - piensa en C

5.3 Declaracion de arreglos unidimensionales 179 1

Otra forma de asignar valores a los componentes de un arreglo es al realizar la declaracion del mismo. A continuaci6n presentamos diferentes casos con la ex-plicaciOn correspondiente, junto con figural en las que se muestran los valores que toman los diferentes componentes del arreglo.

int A[10] = 01; 1* Todas las companentes del arreglo se inicializan en 0. ki

0 0 0 0 0 0 0 0 0 0

fi fi fi 1 T fi fi T I A(0) A(1] A[2] A(3] A(4] A[5] A(6] A(7) Ate] A(9]

FIGURA 5.3

Declatacion del arreglo unidimensional A

int B[5] - {5}; /* El primer componente del arreglo se inicializa con el nomera 5 y el recta con 40. *or

5 0 0 0 0

I I I t I B(0] 8(1] 8(2] B[3] B(4]

FIGURA 5.4

Declaracion del arreglo unidimensional B

int C[5] = (6, 23, 8, 4, 11}; i* Cada componente del arreglo recipe un valor. La asignacion se realize en forma

wfrconsecutiva. *1

6 23 B 4 11

fi I fi C Ea] C[1] C[2] C[3] C[4]

FIGL 5.5

Declartwion del arreglo Uniciimensionat c

A

C

Page 196: Fundamentos de programacion - piensa en C

I 180 Capitulo 5. Arregbs unidimensionales

ant 0[5] - {6, 23, 8, 4, 11, 35}; i* Este asignacian genera un error de w■sintaxis que se detecta en la oompilacion. El error ocurre porque el arregla . tiene capacidad solamente pare 5 componentes y hay 6 elementos que se quiere imasignar. *I

Int E[] = 21, 48, 5, 111; 1* En este caso, como se amite el tamaho del w■arreglo en la definicion, se considers que el aimera de elementos del arregla wes igual al nhmero de elementos que existen en la lista per asignar. */

33 21 48 5 11

E(0) E[1]

Flume 5.6 Deciattwicin del arregio unidimensional E

fi

E(2) E(3] E(4]

EJEIMLO 5.2 Los organizadores de un acto electoral de un pais sudamericano solicitaron un programa de computo para mane jar en forma electrOnica el conteo de los votos. En la elecciOn hay cinco candidatos, los cuales se representan con los valores del 1 al 5. Construye un programa en C que permita obtener el mirnero de votes de cada candidate. El usuario ingress los votos de manera desorganizada, tal y como se obtienen en una elecciOn; el final de datos se representa con un cero. Observa la siguiente lista de ejemplo:

2 5 5 4 3 4 4 5 1 2 4 3 1 2 4 5 0

Donde: 2 representa un voto para el candidato 2, 5 un voto para el candidate 5, y asi sucesivamente.

Dates: o (variable de tipo entero que representa el voto a un can- didato).

Programa 5.2

#include ‹stdio.hp-

/* Eleccion. El programa almacena los votos emitidos en una elecciOn en la que hubs cinco .candidatos e imprime el total de votes que obtuvo cada uno de silos. *1

E

Page 197: Fundamentos de programacion - piensa en C

void main{vold} {

int ELE[5] = {0}; imelementos. Todos int I, VOT; printlf'Ingresa el scanif'fbd', &VOT); While (VOT) {

if (fVOT r 0) &&

.correcto. */ ELE[VOT-1]++; /* Los votes se almacenan en el arreglo.

w+Recuerda que la primera posicion del arreglo es 0, por esa raxeln a la . variable VOT se le descuenta 1. Los votes del primer candidata se wwalmacenan en la posician O. */

else printf(" 1 1E1 voto ingresada es incorrecto.'0');

printff'Ingresa el siguiente vote (0 - Para terminar): '); scanff'sisd', &VOT);

} printf('WnResultados de la Eleccion\n'); for (I = 0; I <= 4; I++)

printfinneandidato kmd: I+1, ELE(I]);

/* Oeclaracion del arreglo enter') ELE de cinco sus elementas se inicializan en 0. */

primer vote (0 Para terminar): ');

{VOT < 6)) /* Se verifica que el voto sea

54 Apuntadores y arreglos

1811

5.4. Apuntadores y arreglos

Un aptmtador es una variable que contiene la direcciOn de otra variable y se re-presenta por medio de los operadores de direccion (&) e indirecci6n (*). El pri-mer° proporciona la direcciOn de un objeto y el segundo permite el acceso al objeto del cual se tiene la direceion.

Los apuntadores se utilizan mucho en el lenguaje de programaciOn C, debido principalmente a que en muchos casos representan la Unica forma de expresar una operacion determinada. Existe una relaciOn muy estrecha entre apuntadores y arreglos. Un arreglo se pass a una funcion indicando unicamente el nombre del arregio, que representa el apuntador al mismo.

Para comprender mejor el concepto de apuntadores, observemos a continuaciOn diferentes instrucciones con su explicacion correspondiente. Luego de cada gru-po de instrucciones se presenta una tabla en la que puedes observar los valores que van tomando las variables.

int X = 3, Y = 7, 2[5] = {2, 4, 6, B, 118}; • • •

Page 198: Fundamentos de programacion - piensa en C

I 182 Capitulo 5. Arreglos uniclimensionales

TABLA 5.1. Apuntadores, variables y valores

Variable Valor

X 3

7

Z[0] 2

7[1] 4

7[2]

7[3]

7[4] 10

int *IX; f* IX represents un apuntador a un entero. */ IX = 8,X; f* IX apunta a X. IX tiene la direccion de X. *f Y = *IX; f* Y tome el valor de X. Y recibe el contenido de la uPdireccion almacenada en IX, es decir, el valor de X. Ahora Y es 3. */ *IX = 1; f* X se modifica. Ahora X vale 1. . . .

TABLA 5.2. Apuntadores, variables y valores

Variable Valor

X 1 3

7[0] 2

Z[1] 4

Z[2] 6

2[3] B

z [4] 10

. . . IX = 82[2]; Y = *IX; *IX = 15; . . .

f* IX apunta al tercer elemento del arreglo Z. */ f* Y tome el valor de Z[2], ahora vale 6. *1 f* Z[2] se modifica, ahora vale 15. */

TABLA 5.3. Apuntadores, variables y valores

Variable Valor

X 1

6

Z[0] 2

7[1] 4

7[2] 15

2[3]

2[4] 10

Page 199: Fundamentos de programacion - piensa en C

54 Apuntadores y arreglos 183

X = *IX + 5; f* X se modifica, ahora vale 3[2] + 5 m 2a. Recuerde que *IX wpcontiene el valor de Z[21. *1 *IX = *IX - 5; Z[2] se modifica, ahora vale 10. */ . . .

TABLA 5.4. Apuntadores, variables y valores

Variable Valor

X 20

Y 6

Z[0]

Z[1] 4

Z[2] 10

Z[S]

Z[4] 10

++*IX; 1* 3[2] se modifica, se incrementa en 1. 3[2] ahora vale 11. */ *IX += 1; 1* 3[2] se vuelve a modificar, ahora vale 12. Observe que mbambas instrucciones se pueden utilizer para hacer exactamente lo mismo. */

TABLA 5.5. Apuntadores, variables y valores

Variable Valor

X 2a

Y 6

Z[0] 2

Z[1] 4

Z[2] 12

Z[3]

Z[4] 10

X = *(IX + 1); 1* X se modifica. El apuntador IX se despiaza una posicion y accede temporalmente wra 3[3], por lo tanto X tome este valor (a). Observe que IX no se reasigna. */ Y = *IX; 1* Y se modifica, tome el valor de Z[2] (12). */ . . .

Page 200: Fundamentos de programacion - piensa en C

I 184

Capitulo 5. Arregbs unidimensionales

TABLA 5.6. Apuntadores, variables y valores

Variable Valor

X B

V 12

7[0] 2

7[1] 4

7[2] 12

7[3] B

7[4] 10

IX = IX + 1; f* Observa taro forma de mover el apuntadar. En este caso IX 86 d68151828 una w posiciOn, pero a diferencia del caso anterior, ahora se reasigna. IX apunta .ahora al cuarto element° de Z (Z[3]). */ Y = *IX; or* Y se modifica, toma ahora el valor de Z[3] (8). *1 . . .

TABLA 5.7. Apuntadores, variables y valores

Variable Valor

X B

12

7[0] 2

7[1] 4

7[2] 12

7[3] B

7[4] 10

IX = IX + 4; f* IX se modifica. Observe que el apuntador se desplaza cuatro posiciones y cae wen una direcciOn que se encuentra afuera del arregla. Esto ocasiona un error w que no senala el compilador de C. */ Y =*IX;

i* Y se modifica, toma el valor (basura) de una celda w incorrecta. Este es un error que no sehala el compilador del lenguaje C. *f

Page 201: Fundamentos de programacion - piensa en C

5.4 Apuntadores y arreglos

185 [

TABLA 5.8. Apuntadores, variables y valores

Variable Valor

9268

Z[0] 2

Z[1] 4

7[2] 12

Z[3]

Z[4] /0

IX = &X;

1* IX apunta a la variable enters X. *1 IX = IX + 1;

1* IX se mueve una posicion y cae ahora en una celda iwincarrecta. *1 X = *IX;

f* X toma el valor (basura) de la celda a la que apunta IX. */

TABLA 5.9. Apuntad ores, variables y valores

Variable Valor

20679

9263

Z[0]

7111 4

Z[2] 12

Z[3] a Z[4] /0

EJELO 53

En el siguiente programa se presentan todos los casos que se ana]izaron en ]a secciOn anterior,

Programa 5.3

Ifinclude ‹stdio.h>

/* Apuntadores, variables y valores. */

void main(vaid)

Page 202: Fundamentos de programacion - piensa en C

I 186 Capitulo 5. Arreglos unidimensionales

int X - 3, Y - 7, 2[5] = {2, 4, 6, 8, 10}; printf( -0X = skd ‘t Y 96d 4t 2[0] = %d ‘t 2[1] = skd it 2[3] - %d it 2[4]

%V, X, Y,

2[0], 2[1], 2[2], 2[3], 2[41);

int *IX; 1* IX represents un apuntador a un entero. *1 IX - &X; 1* IX apunta a X. IX tiene la dim:doll:5n de X. *1 Y = *IX; 1* Y tome el valor de X, ahora vale 3. *1 *IX - 1; f* X se modifica, ahora vale t. *1 printf('OX = 9dd 4 -t Y = gsd it 2[0] = 96d 11t 2[1] = %d VI 2[2] %d 2[3] = gsd W it 2[4] =

9eld', X, Y, 2[0], 2[1], 2[2], 2[3], 2[4]);

IX = 82[2]; 1* IX apunta al tercer elemento del arreglo 2. *1 Y = *IX; 1* Y tame el velar de 2[2], ahora vale O. *1 *IX - 15; I* 1[21 se modifica, ahora vale 15. *1 printf('‘nX - = %d ‘t 2[0] - %d 11t 2[1] - %d Vt 2[2] - %d It 2[3] - %d ww4t 2[4] -

9eld', X, Y, 2[2], 2[1], 7[2], 2[3], 2[41);

X - *IX + 5; 1* X se modifica, ahora vale 1[2] 5 = 26. Recuerda que *IX w+cantiene el valor de Z[21. *1 *IX = *IX - 5; 1* 1[2] se modifica, ahora vale 10. *I printf( -0X = 96d 'IA Y = %d 4t 2[0] = Skd 'it 2[1] = 96d IA 2[2] = %d 4t 2[3] = %d writ 2[4] =

• ', X, Y, 2[0], 2[1], 7[2], 2[3], 2[41);

++*IX; 1* 1[2] se modifica, se incrementa en 1. 1[2] ahora vale 11. *I *IX += 1; /* 2[2] se vuelve a modificar, ahora vale 12. */ printf('InX ‘t Y = %d kt 2[0] = %d lit 2[1] - %d ‘t 2[2] - %d It 2[3] = %d writ 2[4] -

9c1, X, Y, 2[0], 2[1], 2[2], 2[3], 2[4]);

X = *(IX + 1); 1* X se modifica. El apuntador IX accede temparalmente a wia[3], par la tante X tome este valor (8]. Observe que IX no se reasigna *1 Y= *IX; 1* Y se modifica, toma el valor de I[2] (12). *1 printf('M = and 4t Y = gsd it 2[0] = %d 11t 2[1] = gsd It 2[2] = %d It 2[3] = gsd writ 2[4] =

geld', X, Y, 2[0], 2[1], 2[2], 2(31, 2[41);

IX = IX + 1; 1* IX se modifica. Observe la forma de mover el apuntadar. Ahora IX apunta al cuarto elemento de 2 (2[31]. */

= *IX; 1* Y se modifica, Odra vale 1[3] (8). *1 printf('M - %d it Y = %d \t 2[0]- %d It 2[1] = 96d It 7[2] = %d It 2[3] = 26d O 4t 2[4]

• ', X, Y, 7[0], 2[1], 7[2], 7[3], 2[41);

Page 203: Fundamentos de programacion - piensa en C

5.5 Arreglos y funciones 187 1

IX = IX + 4; i* IX se modifica. Observe que el apuntador se mueve 44 posicianes y cae en una direccion afuera del arreglo. Este ocasionara un imerror. *1 Y - *IX; 0" Y se modifica, tama el valor (basura) de una celda imincorrecta. Es un error que no sehala el compilador del lenguaje C. *0, printfClnX - It Y = 96d It Z[0]= %d lit Z[1] = %d It 2[2] = %d It Z[3] = 964 - It 7[4] =

9oLd', X, Y, Z[6], 2[1], 2[2], 2[3], 2[4]);

IX - &X 1* IX apunta a la variable entera X. *i IX = IX + 1; 0" IX se mueve una position y cae en una celda incorrecta. *f X = *IX; 1* X toma el valor (basura) de la celda a la que apunta IX.*or printf('InX = cd it Y = ged It 2[0]- gsd It 2[1] = %d It 2[2] - %d It 2[3] - gisd wrlit 2[4] =

9dd', X, Y, 701, 7[1], 2[2], 7[3], 7[4]];

5.5. Arreglos y funciones

El lenguaje de programacion C utiliza pardihetros por referencia para pasar los arreglos a las funciones. Cualquier modification que se realice a los arreglos en las funciones afecta su valor original. En la Hamada a la funcio-n solo se debe incluir el nombre del arresto, que es un apuntador. No se deben incluir los cor-chetes porque ocasionan un error de sintaxis.

EJEWL0 5.4

Escribe un programa en C que calcule el producto de dos arreglos unidimensio- nales de tipo entero y almacene el resultado en otro arreglo unidimensional.

Datos: VE1(1 0] , VE2(10] , VE3(10) (arreglos unidimensionales de tipo entero con capacidad para 10 elementos. En VE3 se alinacena el resultado del produc-to de los vectores VE1 y VE2),

Programa 5.4

Oinclude ‹stdio.h>

i* Product° de vectores. El programa calcula el product° de dos vectores y almacena el resultado 'men otro arreglo unidimensional. *1

mut int MAX = 1 0 ; /* Se define una constante para el tamale de los wrarreglas. *or

Page 204: Fundamentos de programacion - piensa en C

I 188 Capitulo 5. Arreglos unidimensionales

Void Lecture(int VEC[], int T); void Imprime(int VEC[], int T); 1* Prototipos de funciones. *1 Vold Producto(int *X, int *Y. int *Z„ int T); /* Observe que en los wpperemetros, pare indicar quo la qua se recite es un arreglo, se puede escribir

ImpiEO[] o *VEC. *I

void mein(void)

int VEl[MAY], VENMAX], VE3[MAX]; f* Se declaran tres arreglos de tipo enter° de 10 elementas. */ Lectura(VE1, MAX); 1* Se llama a la funcian Lecture. Observe quo el paso del arreglo a la funcion mwes par referencia. Shlo se debe incluir el nombre del arreglo. *1 Lectura(VE2, MAX); Producto(VE1, VE2, VE3, MAX);

1* Se llama a la funcion Producto. Se pasan los nombres de los tres arreglos. *1 printf('‘nProducto de los Vectores'); Imprime(VE3, MAX); }

Void Lectura(int VEC[], int T)

I* La funcion Loctura se utilize para leer un arreglo unidimensional de T wrelementos de tipo enter°. */

int I; printf(''); for (7=0; I<T; I++)

printf('Ingrese el element° %d: ', 7+1); scanf('ged', SVEC[7]);

} }

void Imprime(int VEC[], Int T) 1* La funcion Inorimo se utilize pare imprimir un arreglo unidimensional de T imelementos de tipo enter°. *I int I;

for (I=0; I<T; I++) printf('InVECNI: 96d', 7+1, VEC[7]);

}

void Producto(int *X, int *Y, int *7, int T) 1* Este funcion se utilize pare calcular el product° de dos arreglos w+unidimensionales de T elementos de tipo entero. *I

int I; for(l=a; I<T; l++)

Z[I] = X[I] * Y[I];

Page 205: Fundamentos de programacion - piensa en C

5.5 Arreglos y funciones 1891

EJEIWULO 5.5

En un arreglo unidimensional se almacenan las calificaciones obtenidas por un grupo de 50 alumnos en un examen. Cada calificaciOn es un mimero entero com-prendido entre 0 y 5, Escribe un programa que calcule, almacene e imprima la frecuencia de cada una de las calificaciones, y que ademas obtenga e imprima la frecuencia mss alta. Si hubiera calificaciones con la misma frecuencia, debe obtener la primera ocurrencia.

Dato: CAL[50] {CAL es un arreglo unidimensional de tipo entero que almacenara las 50 calificaciones de los alumnos).

Programa 5.5

Ninclude ‹stdia.h,

/* Frecuencia de calificaciones. El programa, al recibir coma dates las calificaciones de un grupo de 50 rialumnas, obtiene la frecuencia de coda una de las calificaciones y ademas iwescribe cu01 es la frecuencia mss alta. *1

const int TAM = 50;

void Lectura(int *, int); void Frecuencia(int , int, int , int); 1* Protatipas de funciones. *1 void Impresian(int *, tat); void Mayar(int *, int);

void main(void)

int CAL[TAN], FRE[6] f01; i* OeclaraciOn de las arreglas. *1 Lectura(CAL, TAM); f* Se llama a la funcion Lecture. *1 Frecuencia(CAL, TAN, FRE, 6); 1* Se llama a la funcion Frecuencia, se paean ambos arreglos. */ printf('InFrecuencia de Calificacionesin'); Impresian(FRE, 6); Mayor(FRE, 6);

}

void Lectura(int VECH, int T) /* La funcion Lecture se utilize pare leer el arreglo de calificaciones.

int I; for (I=C ICI; I++) {

printf('Ingrese la calificacion -0:5- del alumna %d: 1+1); scanf('gsd', SLVEC[I]);

}

Page 206: Fundamentos de programacion - piensa en C

I 190 Capitulo 5. Arreglos unidimensionales

} Void Impresian(int VECH, int T) 1* La funcion Lippman se utilize pare imprimir el arregla de frecuencias. *i

int I; for (1=2; I<T; I++) printnVEC[U]: %d', I, VEC[I]);

}

void Frecuencia(int A[], int P, int 8[], int T) 1* Este funcion calcula la frecuencia de calificaciones. *1

int 1; for (1=2; 1<P; I++)

if ((AM >= 2) &di (A[I] < 6)) 1* Se valida que la calificacion sea w.correcta. *1 R[A[1]1++; or* Observa la forma de almacenar e incrementar las

upfrecuencias. *I }

void Mayar(int *X, int T) 1* Esta funcion obtiene la primera ocurrencia de la frecuencia mas alta. *1

int I, MFRE = 2, MVAL = X[2]; for (1=1; I<T; I++)

II (MVAL < X[I])

MFRE - I; MVAL = X[I];

} printf('IninMayor frecuencia de calificaciones: %d %d', MFRE, MVAL); }

Problemas resueltos

Problema PR5.1

Escribe un programa que, al recibir como dato un arreglo unidimensional de nti- meros reales, obtenga como resultado la suma del cuadrado de los mimeros.

Data: VEC[122] (arreglo unidimensional de tipo real de 100 elementos).

Page 207: Fundamentos de programacion - piensa en C

Problemas resueltos

Programa 5.6

#include ‹stdia.h, #include ‹math.h>

1* Suma-cuadradas. El programa calcula la suma del cuadrado de los elementas de un arregla miunidimensional de 120 elementos de tipo real. *I

mum int MAX = 100; /* MAX se utilize pare reserver el especio maxima que padre ocupar el arreglo. *I

void Lectura(float *, int); I* Prototipos de funciones. *1

double Suma(flOat *, int);

void main(void)

float VEC[MAX]; double RES; Lectura(VEC, MAX); RES = Suma(VEC, MAX); i* Se llama a la funcion Muria y se almacena el resultado en la variable RES. *I wwprintf('‘n‘nSume del arreglo: 116.21P, RES);

}

void Lecture(float A[], int T) i* La funciOn Lecture se utilize pare leer un arreglo unidimensianal de T welementos de tipo real. */

int I; for (I=0; 1<T; I++)

printf('Ingrese el element° sisd: ', 7+1); scarf(' f', SA[71);

} }

double Suma(float A[], int T) /* La funcion Sumo se utilize pare calcular la sumo del cuadrado de los micamponentes de un arreglo unidimensianal de T elementos de tipo real. */

fat I; double AUX = 0.0; for (I=0; 1<1; 1++)

AUX += pow(A[1], 2); return(AUX);

191]

Page 208: Fundamentos de programacion - piensa en C

192 Capitulo 5. Arreglos unidimensionales

Problema PR5.2

Escribe un programa en C que, al recibir como dato un arreglo unidimensional desordenado de N enteros, obtenga como salida ese mismo arreglo pero sin los elementos repetidos,

Data. ARREC N] (arreglo unidimensional de tipo entero de N elementos, 1 s N s 100),

Programa 5.7

Afinclude <stdia.h,

f* Arreglo sin elementos repetidas. El programa, al recibir coma data un arregla unidimensianal desardenada de N ✓►elementos, obtiene como salida ese mismo arregla pero sin los elementas srepetidos. */

void Lectura(int *, int); i* Prototipas de funciones. *1 void Imprime(int *, int); void Elimina(int *, int *); 1* Observe que en el protatipo de Elimina, el segundo parimetra es par •referencia. Esto, porque el tamana del arreglo puede disminuir. *or

void main(void)

int TAM, ARRE[109]; or* Se escribe un do-while pare verificar que el tamana del arreglo que se ✓►ingresa sea corrects. */ do {

printf('Ingrese el tamer, del arregla: '); scanf('%d', &TAM);

} while (TAM 122 1 TAM < 1 ); Lectura(ARRE, TAM); Elimina(ARRE, &TAM);

1* Observa que el tamano del arregla se pose par referencia.*1 Imprime(ARRE, TAM);

void Lectura(int A[], int T) f* La funcian Whim se utilize pare leer un arregla unidimensional de T ✓►elementos de tipo entero. *or

printf('‘n'); int I; for (I=2; I<T; I++)

Page 209: Fundamentos de programacion - piensa en C

Problernas resueltos 193 I

printfrIngrese el element° god: 1+1);

manf("964", &A[I]);

void Imprime(int A[], int T) /* La funcion Imprime se utilize pare escribir un arreglounidimensional, sin wirepeticiones, de T elementas de tipa entero. */

tot I; for (I=0; 1<T; I++)

printfi'linA[U]: %d", I, A[I]);

}

void Elimina(iot kJ, int *T) I* Este funcifin se utilize pare aliminar las elementas repatidas de un arregla miunidimensianal de T elementos de tips enters. *I

int I = 3, K, L; while (1 < (*T-1))

4 K = I + 1;

While (K <= (*T-1))

{

if (A[I] == A[K])

for (L = K; L < (*T-1); L++) A[L] = A[L+1];

*T = *T -1;

} else

K++;

5

} }

Problema PR5.3

Escribe un programa en C que almacene en un arreglo unidimensional de tips entero los primeros 100 ntimeros primos.

Page 210: Fundamentos de programacion - piensa en C

Minclude <stdio.h>

1* Primps. El programa almacena en un arreglo unidimensional los primeros 140 nomeros .primps. */

oonst int TAN = 102;

void Imprime(int, int); 1* Protatipos de funciones. *1 Void Prima(int, int *);

void main(void)

int P[TAM] = {1,2}; int FLA, J = 2, PRI = 3; while (J <= TAM)

FLA - 1; Primo(PRI, &FLA); ',prima. *1 if (FLA)

P[J] = PRI; J++;

} PRI += 2;

} Imprime(P, TAM); }

1* Se llama a la funcion que determina si PRI es

1* Si FLA es 1, entonces PRI es prim *1

void Prima(int A, int *8) 1* Esta funcion determina si A es prima, en cuyo case el valor de *IB no se wraltera. *1 4 int DI = 3; While (*8 && (01 < (A i 2))) 4

if ((A 96 DI) == 2) *El = 0;

DI++; } }

Void Imprime(int Primos[], int T) 1* Esta funcion imprime el arreglo unidimensional de numeros primps. *1

int I; for (1=9; I<T; I++)

printf(*knPrimos[U]: 9sd', I, Primos[I]);

I 194

Capitulo 5. Arreglos unidimensionales

Programa 5.8

Page 211: Fundamentos de programacion - piensa en C

Problemas resueltos 1951

Problema PR5.4

Btisqueda secuencial en arreglos desordenados, La bilsqueda secuencial en arreglos desordenados consiste en revisal- element() por elemento, de izquierda derecha, hasta encontrar el date buscado o bien hasta Begat al final del arreglo, to que ocurra primero. Cuando et procedimiento concluye con e'xito, se proporcio-na la posiciOn en la cual fue encontrado el elemento. En caso contrario, se regresa a la para indicar que el elemento no the localizado.

Datos: VEC(N], ELE

Donde: VEC es un arreglo unidimensional de tipo entero de N elements, 1 5 N < 1 em, y ELE una variable de tipo entero que representa el elemento a buscar.

Programa 5.9

Oinclude ‹stdio.h>

/* Busqueda secuencial en arreglos desordenados. */

const int WAX-102;

void Lectura(int, int); i* Prototipos de funciones. *1 int Ausca(int *, int, tat);

void main(VOid)

int RES, ELE, TAM, VEC[MAX]; do

prirrtf('Ingrese el taw° del arreglo: ');

scanf('9dd', &TAM);

} (TAN,MAX TAN O); /* Se verifica que el tamano del arreglo sea

wwcorrecta. *i Lectura(VEC, TAY); printf('inIngrese el elemento a buscar: '); scanf('sisd', &ELF); RES = Busca(VEC, TAM, ELE); /* Se llama a la funcian que busca en el wiparreglo. *or if (RES) /* Si RES tiene un valor verdadero --diferente de 2--, se ascribe la posicton men la que se encontr6 el elemento. "1

printf('inEl elemento se encuentra en in posicion 94d', RES); 0190

printf('‘nEl elemento no se encuentra en el arreglo');

1

Page 212: Fundamentos de programacion - piensa en C

196 Capitulo 5. Arreglos unidimensionales

void Uectura(int A[], int 1) 1* La funcion LOCUM se utilize pare leer un arreglo unidimensionel de T imelementas de tip° enter°. */

int I; for (1=6; I<T; I++)

printf(Ingrese al elements ', 1+1); scanfriad', &A[1]);

}

}

int Busca(int A[], int T, int K) 1* Este funcion localize en el arreglo un element° determined°. Si el element° Imes encontrada, regresa la posiciOn correspandiente. En caso cantrario, regresa 10. *1

int I - a, SAN = 0, RES; while (I ‹ T && !BAN)

if (4[I] K) SAN++;

else I++;

if (BAN) RES - I + 1; 1* Se asigna I+1 dada que las pasiciones en el arregla comienzan desde wpcera. *1

else RES = BAN;

return (RES);

}

Problema PR5.5

Blisqueda secuencial en arreglos ordenados en forma creciente. La baqueda se-cuencial en arreglos ordenados en forma creciente es similar al proceso de bdsqueda en arreglos desordenados. La diferencia radica en el use de una nueva condicidn para controlar el proceso de bdsqueda, El me.todo se aplica revisando elemento por elemento, de izquierda a derecha, hasta encontrar el dato buscado (e'xito), hasta que el elemento buscado sea menor que el elemento del arreglo con el cual se esta comparando (fracaso), o bier hasta llegar al final de los datos disponibles (fracaso); siernpre lo que ocurra primers. Cuando el procedimiento concluye con .xito, se proporciona la posicion en la cual fue encontrado el elemento. En caso contrario, se regresa 0 para indicar que el elemento no fue localizado. Cabe destacar que si el arreglo esti ordenado en forma decreciente, en el programa solo hay que inoclificar la condiciOn de menor que por la de mayor que.

Page 213: Fundamentos de programacion - piensa en C

*include <stdio.h>

/* Busqueda secuencial en arreglos ordenados en forma creciente. */

wrist int MAX-100;

void Lectura(intl int); /* Prototipos de lunciones. *f int Buscafimt *, int, int);

void mainfvold) { int RES, ELF, TAM, VEC[MAX]; do {

printf('Ingrese el tamaho del arreglo: '); scanff'sbd', &TAM);

1 While (TAM > MAX d TAM < 1); /* Se verilica que el tamano del arreglo sea correcto. */ LecturafVEC, TAM); printICIhnIngrese el elemento a buscar:'); scanff'10', &ELE); RES = Susca(VEC, TAM, ELE);

warreglo. */ if (RES) /* Si RES tiene un valor verdadero --diferente de 0--, se ascribe la ✓eposlcion en la que se encontr6 al elemento. */

element') se encuentra en la posiclon: RES); else

printlf"InEl elemento no se encuentra en el arreglo');

void Lectura(int AO, int T) /* La funciein Lecture an utilize pare leer un arreglo unidimensional de T wwelementos de tipo entero. */ { int I; for 0=0; I<T; I++) {

printli'Ingrese el elemento 11511: I+1); scanfridd', &AM);

/* Se llama a la funcion que busca en el

Problemas resueltos 1971

Diatos:VEC[N], ELE

Donde: VEC es un arreglo unidimensional de tipo entero de N eleMent0S, 1 100,

y ELE una variable de tipo entero que representa el elemento a buscar,

Programa 5.10

Page 214: Fundamentos de programacion - piensa en C

198 Capitulo 5. Arreglos unidimensionales

int Buscafint A(], int T, int E) /* Esta luncion se utilize para localizar el elemento E en el arreglo wunidimensional A. Si se encuentra, la funcion regress la posicion correspondiente. En caso wicontrario regress 0. */

int RES, I = 0, BAN = 0; While f(I < T) && (E ›= A(I]) && !BAN) /* Observe que se incorpora una nueva condicidn. */

if (A(I] E) BAN++;

else I++;

if (BAN) RES = I + 1; /* Se asigna I+1 dad° que las posiciones en el arreglo comienzan des de cero. */

else RES = BAN;

return (RES); }

Problema PR5.6

Busqueda binaria. La btisqueda binaria consiste en dividir el intervalo de bds-queda en dos partes, comparando el elemento buscado con el central. En caso de ser diferentes se redefmen los extremos del intervalo, segtin sea el elemento cen-tral mayor o menor que el buscad°, disminuyend° de esta forma el espacio de basqueda. El proceso concluye cuand° el elemento es encontrad°, o bien, cuand° el intervalo de btisqueda se anula. Esto implica que el elemento no se encuentra en el arreglo. Cabe destacar que el metod° funciona anicamente para arreglos ordenados. Con cada iteracion del mdtodo, el espacio de btisqueda se reduce a la mitad, par l° tanto, el namer° de comparaciones que se deben realizar disminuye notablemente. Esta disminucion resulta ma's significativa cuanto ma's grande es el tam 'ari° del arreglo.

Datos: VEC(N], ELE

Donde: VEC es un arreglo unidimensional de tipo entero de N elementos, 1 < N <

100, y ELE una variable de tipo entero que representa el elemento a buscar.

Page 215: Fundamentos de programacion - piensa en C

Problemas resueltos 199

Programa 5.11

*include ‹stdio.h

/* Busqueda binaria. */

mat int MAX-100;

Void Lectureants int); 1* Prototipos de funciones. */ int Binarialint *, int, int);

void main(v014)

int RES, ELE, TAM, VEC(MAX]; 40

printf{'Ingrese el temano del arreglo: ' ) ; scanf('%d', &TAM);

} (TAM>MAX 1 TAMO); /* Se verifica que el tamaho del arreglo sea

wcorrecto. */ Lectura(VEC, TAM); printl("inIngrese el elemento a buscar: '); scanf('%d', &ELE); RES = Binaria{VEC, TAM, ELE); i* Se llama a la funcion que busca en el

ft arreglo. */ if (RES) /* Si RES tiene un valor verdadero --diferente de 0--, se ascribe la wrposlcion en la que se encontro el elemento. */

printf('%nEl elements, se encuentra en la posicidn: %d', RES); else

printf('%nEl elements) no se encuentra en el arreglo');

void Lectura(int A[], int T) /* La funcion Lecture se utilize pare leer un arreglo unidimensional de T Imelementos de tipo entero. *

int I; for (I=0; I<T; Its)

printf('Ingrese el elemento %d: scanf('%d°, &A[I]);

}

int Sinariaiint Au, int T, int E) /* Este funcion se utilize pare realizar una busqueda binaria del .elemento E en el arreglo unidimensional A de T elementos. Si se w encuentra el element°, la luncion regresa la posicion correspondiente. wwEn cams contrario, regresa 0. */

Page 216: Fundamentos de programacion - piensa en C

1200 Capitulo 5. Arregios unidimensionaies

int ELE, IZO = 0, CEN, DER = T-1, BAN = 0; ((IZO <= DER) && (!BAN))

{ CEN = (IZQ + DER) / 2; if (E == A[CEN]}

BAN = CEN; else

if (E 5 A[CEN]) IZC = CEN + 1;

OHM DER = CEN - 1;

return (BAN);

}

Problerna PR5.7

Ordenacion por insercion directa (forma creciente), Este es el maodo que utilizan generalmente los jugadores de cartas cuando las onlenan, de ahi que tambien se le conozca con el nombre de Mitodo de la baraja. La idea central del mdtodo consiste en inserter un elemento del arreglo en La parte izquierda del mismo que ya se encuentra ordenada. El proceso se repite desde el segundo hasta el endsimo elemento.

Observemos a continuacion un ejemplo en la tabla. 5.10 parre ilustrar el mdtodo. Consideremos un arreglo unidimensional A de tipo enter° de ocho elementos.

TABLA 5.10. OrdenaciOn par inserciOn directa

Pasadas A[0] A[1] A[2] A[3] A[4] AM A[6] AM

la. 12 34 22 11 54 36 19 7

2a. 12 34 22 11 54 36 19 7

3a. 12 22 34 11 54 36 19 7

4a. 11 12 22 34 54 36 19 7

5a. 11 12 22 34 54 36 19 7

6a. 11 12 22 34 36 54 19 7

7a. 11 12 19 22 34 36 54 7

8a. 7 11 12 19 22 34 36 54

Page 217: Fundamentos de programacion - piensa en C

Problemas resueltos 2011

Data: VEC(N] (arreglo unidimensional de tipo entero de N elementos, 1 N s -too).

Programa 5.12

*include -‹stdio.rp

/* Ordenaciton por insercidn directa. */

oonst int MAX = 100;

void Lectura(int *, int); Void Ordenafint *, int); Void Imprime(int *, int);

void main(void) { int TAM, VEC[MAX]; do {

/' Prototipos de lunciones. */

printiCIngrese el tamaho del arreglo: '); scanWsbd', &TAM);

While (TAM>MAX 1 TAM<Th /* Se verilica que el tamand del arreglo sea wwcorrecto. */

Lectura(VEC, TAM); OrdenaNEC, TAM); ImprimefVEC, TAM); }

void Lectura(int int T) /* La funcion Leotura se utilize pare leer un arreglo unidimensional de T .elementos de tipo entero. */ { int I; for (I=0; I<T; I++) {

printfl'Ingrese el element° 511d: ', I + 1); scanf("tild', &A.[I]);

} }

void Imprime(int AEL int T) /* Esta funciOn se utilize pare escribir un arreglo unidimensional wwordenado de T elementos de tipo enter°. */ { int T; for (I=0; I<T; I++)

printIC 101A(16d]: glsd', I, AU));

Page 218: Fundamentos de programacion - piensa en C

202 Capitulo 5. Arreglos unidimensionales

void Ordena(int A(], int 1) /* La luncion Ordena utilize el metodo de insercion directa pare ordenar win elementos del arreglo unidimensional A. */

int AUX, L, I; for (I-1; I<T; I++)

AUX = A[I]; L = I - 1; While ((L 0) && (AUX < Aft))) {

A[L+1] = A[L]; L--;

1 A[L+1] = AUX;

Problerna PR5.8

Ordenacion por selection directa (forma creciente). Es el mejor de los meto-dos simples de ordenacidn (intercambio —burbuja— e inserciOn). La idea basics del metodo consiste en buscar el elemento Ends pequeiio del arreglo y colocarlo en la primers posiciOn. Luego se busca el segundo elemento mss pequeiio y se coloca en la segunda posiciOn; y as1 sucesivamente hasta que todos los elementos del arreglo queden oydenados.

En la tabla 5.11 se presenta un ejemplo pars ilustrar al metodo. Consideremos un arreglo unidimensional A de tipo entero de ocho elementos.

TABLA 5.11. Ordenacion por seleccion directa

Pasadas AP] AN Af2] Af3] AM] NS] A(63 AM la. 12 34 22 11 54 36 19 7

2a. 7 34 22 ii 54 36 19 12

3a, 7 11 22 34 54 36 19 12

4a, 7 11 12 34 54 36 19 22

5a, 7 11 12 19 54 36 34 22

6a, 7 11 12 19 22 36 34 54

7a. 7 11 12 19 22 34 36 54

8a. 7 11 12 19 22 34 36 54

Page 219: Fundamentos de programacion - piensa en C

Problemas resueltos 203 I

Data: VEC(N] (arreglo unidimensional de tipo entero de N elementos, 1 N s 100}.

Programa 5.13

*include ‹stdio.hp

/* Ordenacion por seleccift directa. */

oonst int MAX = 100;

Void Lectura(int *, int); void Ordena(int *, int); void Imprime(int *, int);

void main(vold) { int TAM, VECIMAX]; do {

/* Prototipos de lunciones. */

printf('Ingress el tamano del arreglo: '); scanff'Ild', &TAM);

1 while {TAMMAX 1 TAM0}; /* Se verifica que el tamano del arreglo sea

.correcto. */ Lectura{VEC, TAM}; Ordena{VEC, TAM); Imprime{VEC, TAM}; }

Void Lecturs(imt AO, int T) /* La funcion Lootura se utiliza para leer un arreglo unidimensional de T .elementos de tipo entero. */ { int I; for (I=0; I<T; I++) {

printf{'Ingrese el element's ', I+1); scanI{'U', &AM};

}

void Imprime(int AO, int T) /* Esta funcion se utiliza para escribir un arreglo unidimensional wwordenado de T elementos de tipo entero. */

int I; for (I=0; Ter; I++)

printf("InA(U): %d', I, ACID;

Page 220: Fundamentos de programacion - piensa en C

I 204 Capitulo 5. Arreglos unidimensionales

void Ordena(int A(], int T) /* La luncion Ordona utilize el metodo de seleccion directa pare ordenar . los elementos del arreglo unidimensional A. */

int I, J, MEN, L; for (I=1; I < (T-1); It+)

MEN = A[I]; L I; for (J=(If1); J<T; J+.1-)

if (A[J] < MEN)

MEN AM; L = J;

}

AR] = A[I]; AU] MEN;

} }

Problema PR5.9

Construye un programa que, al recibir un arreglo unidimensional de tipo entero que contiene calificaciones de examenes de alumnus, calcule lo siguiente:

a) ta media aritmaica. Esta se calcula como la suma de los elementos entre el niimero de elementos,

b) La varianza. Esta se calcula como la suma de los cuadrados de las desvia-clones de la media, entre el mimero de elementos.

c) La desviacidn estdndar. Se calcula como la raiz cuadrada de la varianza.

d) La mods. Se calcula obteniendo el mimero con mayor frecuencia.

Data: ALU(N) (arreglo unidimensional de tipo entero de N elementos, 1 S N S 1 IN).

Programa 5.14

#include <stdio.h> #include <math.lp-

/* Estadistico. El programa, al recibir comp dato un arreglo unidimensional de enteros . que contiene calificaciones, calcula la media, la varianza, la wPdesviacion estinder y la mode. */

Page 221: Fundamentos de programacion - piensa en C

Problemas resueltos 205]

const int MAX = 100;

Void Lecture(int *, int); float Mediaiint *, int); float Verianzalint *, int, float); float Desviecion(float); Void Frecuencialint *, int, int *); int Modalint *, int);

void main(void)

{ int TAM, MOD, ALU[MAX], FRE[11] = {0}; float MED, VAR, DES; do {

11, Prototipos de lunciones. */

printICIngrese el temeho del arreglo: '); scan1{'%d', &TAM);

1 While (TAM > MAX M TAM < 1); /* Se verilice que el temeno del arreglo sea correcto. */ Lectura(ALU, TAM); MED = Media(ALU, TAM); VAR = Verianza(ALU, TAM, MED); DES - Desviacion{VAR); Frecuencia(ALU, TAM, FRE); MOD = Moda(FRE, 11); print1('ImMedia: %.2f', MED); printf("LnVerianza: %.2f', VAR); printf("LnDesviacion: %.2f', DES); printl("mModa: %d', MOD); }

void Lectura{int AD, int T) /* La funcion Lecture se utilize pare leer un arreglo unidimensional de T wwelementos de tipo entero. */ {

int I; for (1=0; I<T; I++)

{ printfi'Ingrese el elemento scan1('%d', &A[I]);

}

Pleat Media(int A[], int T) /* Este funclOn se utilize pare caicular la media. */

Page 222: Fundamentos de programacion - piensa en C

1206 Capitub 5. Arreglos uniclimensionales

int I; float SUM = 0.0; for (I=0; I < T; I++)

SUM 4= A[I]; return (SUM i T);

float Varianza(int A[], int T, float M) /* Esta funciOn se utiliza para calcular la varlanza. */

int I; float SUM = 0.0; for (I=0; I < T; I++)

SUM += pow ((ACI] - M), 2); return (SUM / T); }

float Desviacion(float V) /* Esta funcion se utiliza para calcular la desviacidn estandar. */ { return (sqrt(V)); }

void Frecuanoia(lat Al], int P, int 8()) /* Esta 'Puna& se utiliza para calcular la frecuencia de calillcaciones. *1

{ int I; for (I=0; I < P; I++)

B[A(In++; }

int Moda(int A[], int T) /* Esta funcion se utilize para calcular la moda. */ { int I, MOD = 0, VAL = A[0]; for (1=1; I<T; I++)

if (MOD < AU]) {

MOD = I; VAL = A[I];

1 return (MOD);

Problerna PR5.1O

Analiza cuidadosamente el siguiente programa y obt& los resultados que se ge-neran al ejecutarlo.

Page 223: Fundamentos de programacion - piensa en C

Problernas resueltos 207

Programa 515

*include ‹stdio.h>

I* Apuntadores y arreglos */

void main(void)

{ int X = 5, Y = B, V[5] - {1, 3, 5, 7, 9}; int *AY, *AX; AY = &Y; X = *AY;

*AY = V[3] + V[2]; printfr\nX=%d Y=9td V[0]=%11 V[1]=%d V[4]=5151", X,

Y, V[0], V[1), V121, V[3], V[4));

AX = &V[V[0]*V[1]); X = *AX;

= *AX * V[1]; *AX = *AY - 3; printf("knX=Pad Y= Dad V[0]=41d V[1]=Rid V[4]=sbd', X,

Y, V[8], V[1], V[2], V(3], V[4]);

V[2]=5,6d V[3.1= 515d

V[21 %d V[3]=%d

Compara los resultados que hayas obtenido con los que se presentan a conti-nuaciOn:

X=8 Y=12 V[8]=1 V[1]=3 V[2]=5 V[3]=7 V[4]=9 X=7 Y-21 V[8]-1 V[1]-3 V[2]-5 V[3]-18 V[4]-9

Problema PR5.11

Analiza cuidadosamente el siguiente programa y obtdn los resultados que se ge-neran al ejecutarlo.

Programa 5.16

#include <stdio.h>

/* Apuntadores y arreglos */

void main(void)

Page 224: Fundamentos de programacion - piensa en C

1208 Capitub 5. Arreglos unictimensionales

lot V1[4]= {2, 3, 4, 7}, V2[4] = {6}; int *AX, *AY; AX = &V1[3]; AY - &V2[2]; V1[V2[0]-V1[2]]= *AY; *AY- *AX - V1[9]; printfrOV1[9]=gad V1[1]=Pdd V11 2]=26d V1[3]=5 ,ad \tV2[03=-tad V2[1]=sisd V2[2]=5 d

V2[3]-edd', V1[9],V111 LV1[2],V1[3],V2101,V2[1], V2f21,V2[31); V2[1] = ++*AX; V2[3] - (*AY1++; *AX += 2; printfrOV1[0]=9sd V1[1]=9A V1I 2]=9/bid V1[3]=9sd \tV2[9]=414 V2[1] =96d V2[2]=%d

V2[3]=9dd', V1[0],V1[1 LV1[2],V1[3],V2[9],V2[1], V2[21,V2(31);

}

Compara los resultados que hayas obtenido con los que se presentan a conti-nuacion:

V11[0]=2 V1(1)=3 V1[21=8 V1(3)=7 V2[01-6 V2[11=9 V2[21=5 V2[31=8

V1[0]=2 V1[1]=3 V1[2]-8 v1[21-10 v2[0]-6 v2(1ime. v2[2)-6 V2(31-5

Problem PR5.12

Analiza cuidadosamente el siguiente programa y obten los resultados que se ge-neran al ejecutarlo_

Programa 5.17

#include <stdio.h>

/* Apuntadores y arreglos *1

void main(void) { ant V1[4] = {1, 3, 5, 7}, V2[41= f2,41; Int *AX, *AY; AX - 8V1[21; AY F.V2(2]; V2[2] = *(AX+1); V2[3] - *AX; AX = AX + 1; V1[0] = *AX; printfrOV1[9]=9sd V1[1]=96d V1[2]= 96d V1[3]=9sd ktV2[0]=414d V2(11=944

Page 225: Fundamentos de programacion - piensa en C

Problemas resueltos

209 I

V1[45] ,V1 [1 ),V1[2] ,V1[3] ,V2[e] , V2[1], V2[ 2] , V2[3] ) ; V1[2] = *AY; V1[1] = - -*AY; AX = AX + 1; V1[3] - *AX; printIC \ nV1[9]=964:1 V1[1]=115c1 V1[2]=11g1 V1[3]=96d ItV2[8]Acl V2[1 ]!fsd

V2[2]-51frd V2[3](1' , V1 [6], V1 [1] ,V1 [2] ,V1 [3] ,V2[0],V2[1],V2[2] , V2[3] ) ; }

Compara, los resultados que hayas obtenido on los que se presentan a conti-nuation:

V1[6]-7 V1[1]-3 V1[2]-5 V1[3]-7 V2[2]-2 V2[1]-4 V2[2]-7 V2[3]-5

V1[6]-7 V1[1]-6 V1[2]=7 V1 [3]-basura V2[6]-2 V2[1]-4 V2[2]-6 V2[3]-5

Problemas suplementarios Nola: Todos los problemas deben ser resueltos con la ayuda de funciones.

Problema P55.1

Escribe un programa que, al (tar como dato un arreglo unidimensional de narneros enteros, determine cthintos de ellos son positivos, cuAntos negativos y cudntos nulo s.

Dato: VEC[N] (arreglo unidimensional de tipo entero de N elementos, 1 N s 160.

Problema P55.2

Escribe un programa que reciba como entrada un arreglo unidimensional ordena-do de N enteros y obtenga come salida ese mismo arreglo pero sin los elementos repetido s.

pato: VEC( N] (arreglo unidimensional de tipo entero de N elementos, 1 s N -- 100),

Page 226: Fundamentos de programacion - piensa en C

210 Capitulo 5. Arregios uniclimensionales

Problema P55.3

Escribe un programa que almacene en un arreglo unidimensional los primeros 100 mimeros de Fibonacci e imprima el arreglo correspondiente.

Problenna P55.4

Escribe un programa que inserte y elimine elementos en un arreglo unidimensio-nal de tipo entero que se encuentre desordenado. Considera que no se pueden in-sertar elementos repetidos.

Datos: VEC[N], ELE

Donde: VEC es un arreglo unidimensional de tipo enter° de N elementos, iKNK lag, y ELE una variable de tipo entero que expresa el ndmero que se va insertar a eliminar.

Problem P55.5

Escribe un programa que inserte y elimine elementos en un arreglo unidimensio-nal de tipo entero que se encuentre ordenado en forma creciente. Toma en cuenta que no se pueden insertar elementos repetidos.

Datos: VEC[NI, ELE

Donde: VEC es un arreglo unidimensional de tipo enter° de N elementos, i s N <

lee, y ELE una variable de tipo entero que represents el nUmero que se va a insertar o eliminar.

Problema P55.6

En un arreglo unidimensional de tipo real se almacenan las calificaciones de un grupo de N alumnos que presentaron un examen de admi.ion a una universidad. Escribe un programa que calcule e imprima lo siguiente:

a) El promedio general del grupo.

b) El porcentaje de alumnos aprobados (todos aquellos alumnos cuyo puntaje su-pere los 1300 puntos).

c) El ndmero de alumnos cuya calificaciOn sea mayor o igual a 1500.

Dato: AIX' NI (arreglo unidimensional de tipo real de N elementos, N E 194

Page 227: Fundamentos de programacion - piensa en C

Problemas resueltos 2111

Problema P55.7

En un arreglo unidimensional de tipo real se tienen almacenadas las toneladas mensuales de cereales cosechadas durante el alio anterior en una estancia de la pampa Argentina. Escribe un programa que calcule e imprima lo siguiente:

a) El promedio anual de toneladas cosechadas.

b) LCuantos meses tuvieron una cosecha superior al promedio anual?

c) qud mes se produjo el mayor Fulmer° de toneladas?i,Cubtas fueron?

Dato: cosc12] (arreglo unidimensional de tipo real de 12 elementos).

Problema P55.8

Construye un programa en C que, al recibir come dates dos arreglos unidimen-sionales de tipo entero, desordenados, de N y FA elementos respectivamente, genere un nuevo arreglo unidimensional ordenado en forma descendente de N+M elementos de tipo entero, mezclando los dos primeros arreglos.

Datos: VEC1( VEC2(M)

Donde: VEC1 y VEC2 son dos arreglos unidimensionales de tipo entero de N y elementos, respectivamente, 1< N 5 100, 1 M S 100,

Problema PS5.9

Construye un programa en C que, al recibir como dates dos arreglos unidimensio-nales de tipo entero, ordenados en forma ascendente, de N y FA elementos respecti-vamente, genere un nuevo arreglo unidimensional ordenado en forma ascendente de N+M elementos de tipo entero, mezclando los dos primeros arreglos.

Datos: VEC1(N], VEC2(M)

Donde: VEC1 y VEC2 son dos arreglos unidimensionales de tipo entero de N y elementos, respectivamente, 1 5 N 5 100, 1 M 5 100,

Problema P55.10

Construye un programa en C que, al recibir come dates dos arreglos unidimen-sionales de tipo entero, el primero ordenado en forma ascendente y el segundo

Page 228: Fundamentos de programacion - piensa en C

I 212 Cap/tub 5. Arreglos unidimensionales

en forma descendente, de N y M elementos respectivamente, genere un nuevo arreglo unidimensional ordenado en forma ascendente de Ni-M elementos de tipo entero, mezclando los dos primeros arreglos.

Datos: VECI IN), VEC2[M]

Donde: VEC1 y VEC2 son dos arreglos unidimensionales de tipo enter° de N y elementos, respectivamente, 1 s N 5 Fee, 1 5 FA 5 100.

Problerna P55.11

Escribe un programa en el lenguaje C que almacene en un arreglo unidimensio-nal los primeros 30 tuitneros perfectos. Un namero se considera perfecto si la su-ma de los divisores, excepto 1 mismo, es igual al propio ntimero. El 6, par ejemplo, es un ntimero perfecto.

Prob!erne P55.12

Escribe un programa en C que, al recibir como dato un arreglo unidimensional de tipo entero de N elementos, determine si el arreglo es patrndrotne•Por ejem-plo, el arreglo VEC que se muestra a continuaciOn es palindrome:

2 4 5 4 2

Dato: VEC(N) (arreglo unidimensional de tipo entero de N elementos,i N s 100.

Page 229: Fundamentos de programacion - piensa en C

CAPITULO

Arreglos multidimensionales

6.1. Introduccion

Los arreglos que estudiamos en el capftulo anterior reciben el nombre de unidimensionales porque para acceder a un elemento del arreglo 5,610 tenemos que utilizar un indice. Existen tarabi6n arreglos con multiples dimensiones, a cuyos elementos se debe acceder utilizando multiples indices. El ndmero de dimensiones del arreglo depende tanto de las caracteristicas del problema que se va a resolver, come de las facilidades del lenguaje de programacion que se utilice para implemental- la solucion. Sin duda, los arreglos bidimensionales —conocidos tarabidn come matrices— son los arreglos multidimen-sionales nuis utilizados y los que trataremos principalmente en este capitulo.

Page 230: Fundamentos de programacion - piensa en C

214 Capitub 6. Arreglos multidimensionales

6.2. Arreglos bidimensionales

Formalmente definimos un arreglo bidimensional de la siguiente manera:

"Un arreglo bidimensional es una coleccian finita, homog6nea y ordenada

de datos, en Ia que se hace referenda a cada element° del arreglo par media de dos indices. El prirnero de los indices se utiliza para indicar Ia fila,

y el segundo, para indicar Ia columna."

Un arreglo bidimensional permite almacenar N x M elementos del mismo tipo (enteros, reales, caracteres, cadenas de caracteres, etc.) y acceder a cada uno de duos. Al igual que en los arreglos unidimensionales, se distinguen dos panes im-portantes: los compenentes y los indices. Los primeros hacen referencia a los elementos que se almacenan en cada una de sus casillas, y los segundos, por otra parte, especifican la forma de acceder a cada uno de los elementos. Para hacer referencia a un componente de un arreglo bidimensional debemos utilizar tanto el nombre del arregto, wino los rndices del element° (fila y columna).

En la figura 6.1 se puede observar la representaci6n grafica de un arreglo bidi-mensionaL

Arreglo bidimensional

rrimera fila

segurda fila

mesima fila - •

primers columna

Eegunda columna

enesima columns

FiGuRA 6.1 Representacion grcifica de un arreglo bidimensional.

Page 231: Fundamentos de programacion - piensa en C

6.3 Declaration de an-eglos bidimensionales 2151

En la figura 6.2 se muestra el arreglo bidimensional A que contiene 18 elementos de tipo entero. Observa que el arreglo tiene tres fibs y seis columnas, A cada ele-ment° del arreglo se accede por media de dos indices. El primero se utiliza para las fibs y el segundo para las columnas. Si queremos acceder al elemento de la primera fila y la primera columna, debemos escribir Apj (0]; si en cambio queremos acceder al quinto elemento de la primera file, debemos escribir A(03(4]. El valor de A(1][5] es 4, el valor de A[2] (1 + 2] es 0, el resultado de A[2][2] + A(1)(5] eS y el resultado de A(0)(4] * A(2)(1] es -6.

A[0][0] A[0][11 A[0][2] NO1[3] AM[4] APJ[5]

8 6 4 1 -2 3

4 3 0 -4 2 4

2 3 5 0 2 1

r A[2][0) A[2][1) A[2][2] A[2)[3] A[2)[4] A[2][5]

FlaUltA 6.2 indices y componerues de UR arreglo bidimensional,

6.3. Declaracion de arreglos bidimensionales

El espacio que los arreglos ocupan en memoria se reserva en el momenta de realizar la declaracidn de los mismos. A continuaci6n presentamos diferentes formas de declarar arreglos, con su explicacion correspondiente.

void main(void)

lot A[5] (12]; f* Declaracion de un a mega° bidimensianal de tip enter° de 5 files y le columnas. *i

float A[5][5]; or* Declaracidn de un arreglo bidimensional de tipo real de 5 files y 5 columnas. */

A

Page 232: Fundamentos de programacion - piensa en C

I 216 Capitub 6. Arreglos multidimensionales

Una vez que se definen los arreglos, sus elementos pueden recibir los valores a travel de multiples asignaciones, o bien, como ocurre frecuentemente en la prkti-ca, por media de un ciclo y la lectura correspondiente de los valores. Analicemos el siguiente ejemplo.

EJENWLO 6.1

E,scribe un programa en C que, al recibir como dato un arreglo bidimensional cuadrado de tipo entero de dimension 10, imprima la diagonal de dicha matriz,

Data: MAT[13)(1e) (arreglo bidimensional de tipo entero que alinacena 100 elementos).

Programa 6.1

#include 4stdio.h,

f* Diagonal principal. EL programa, al recibir COM data una matriz de tipo enters, ascribe la diagonal principal. */

const int TAN = 13;

void Lectura(int [][TAM], int); /* Pratotipo de funciones. */ void Imprime(int [][TAM], int);

f* Observe que siempre as necesaria declarer el nomero de columnas. Si no lo wiPhaces, el compilador me rcari un error de sintaxis. *i

void main(void)

int MAT[TAM][TAM]; Lectura(MAT, TAM); Imprime(MAT, TAM); }

void Lectura(int AMTAMI, int F) irk La funcion Lectors se utilize pare leer un arreglo bidimensional. Observe oque solo se debe pasar como parimetro el numero de files ya que la matriz Imes cuadrada. */

int I, J; for (1=6; I4F; I++)

for (d=2; JzF; d++)

printf('Ingrese el element° %d I+1, d+1);

scanf('%d', &A[I]Id]);

}

Page 233: Fundamentos de programacion - piensa en C

6.3 Declarat=ion de arreglos bidimensionales 217 i

void Imprime(int AMTAM], int F) /* La funcion limprime se utilize pare escribir un arregla bidimensional Imcuadrado de F files y columnes. *or

int I, J; for (I-0; I<F; I++)

for (J=0; J<TAM; J++) if (I == J)

printfrinDiaganal %d %d: %d J, A[I][J]);

Otra forma de asignar valores a los componentes del arreglo es al realizar la defi-nicion del mismo. A continuacift presentamos diferentes cases con su explica-cion correspondiente y una figura en la que se pueden observar los valores que toman los diferentes componentes del arreglo bidimensional.

int A[3][6] = {0}; ir* Todos los componentes del arreglo se inicializan con 2. *i

A[0][0] A[0][1] A[0][2) A[0][3] A[0][4] A[0][5]

0 0 0 0 0 3

0 0 0 0 0 0

0 0 0 0 0 0

A[2][0] A[2][1] A[21[2] A[2][3] A[2][4] A[2][5]

FIGURA 6.3 Declaracion del arreglo bidimensional A.

int B[3][6] = 13,4,6,8}; /* Los primeros cuatro componentes de is primers file •se inicializan con los valores: 3,4,6 y 8. El rests con 0. */

A

Page 234: Fundamentos de programacion - piensa en C

1218

Capitulo 6. Arreglos multidimensionales

A[0][0] A[0][1] A[0][2] A[0][31 A[0][4) A[0][5]

3 4 6 8 0 0

0 0 0 0 0 0

o o 0 0 0 0

t t t A121[0] A[2][1] A[2)[2] A[2)[3] A[2][4] A[2][51

FIGUR.A 6.4

Declaracidn del arregio bidirnensional B.

int C(31[6] = {6, 23, 8, 4, 11, 33, 21, 2, 6, 12, 23, 4, 8, 2, 1, 6, 9, 15}; /* Cada components del arreglo recite un valor. La asignacion se realize file a wo-fila.*/

int C[3][6] - -(16, 23, 8, 4, 11, 33}, {21, 2, 6, la, 23, 4}, {8, 2, 1, 6, 9, 15)}; J* La asignacian anterior tambi6n se puede realizer de esta forma. *i

C[0][0] C[0][1] C[0][2] C[0][3] C[0][4] C[0][5]

Jr

6 23 8 4 11 33

21 0 6 10 23 4

8 2 1 6 9 15

t t t C[2][0] C[2][1] C[2][2] C[2.1[3], C[2][4] C[2][5]

AGURA 6.5

Declanxidn del arreglo bidimensional C.

B

C

Page 235: Fundamentos de programacion - piensa en C

6.3 Declaracian de arreglos bidimensionales 219 1

int C[3][6] {i6, 23, 8, 4, 11, 35, 81}; f* Este declaracian genera un error mode sintaxis, ya que la file tiene espacio pare secs elementos y se asignan wwsiete. 1*

Observemos a continuacion otro ejemplo.

LEEPMPLO 6.2

Escribe un programa en C que, al recibir dos arreglos bidimensionales MA y FAII de MxN elementos cada uno, calcule la suma de ambos arreglos, almacene el resulta-do en otro arreglo bidimensional e imprima, ademas, el resultado obtenido,

Datos: MA[M](N), ME(M)(N) (arreglos bidimensionales de tipo entero de Mx N elementos, 1 m s 50 y 1 5 N 5 50.

Programa 6.2

clude zstdio.h>

i* Suma matrices. El programa, al recibir como dates dos arreglos bidimensionales del mismo lotamano, calcula la suma de ambos y la almacena en un tercer arreglo imbidimensional. *1

const int MAX = 50;

f* Prototipo de funciones. */ void Lecture(int [][MAX], int, int); void Suma(int [)[MAX], int [][MAX], int [][MAX], int, int); void Imprime(int [][MAX], int, int);

void main(void)

int MA[MAY][MAX], M8[MAX][MAX], MC[MAX][MAX]; /* Declaracion de los tree arreglos *1 int FIL, COL; do

printf('Ingrese el nUmero de files de los arreglos: '1; scanf('96d', &FIL);

} while (FIL, MAY fi FIL‹ 1); i* Se verifica que el nOmero de files sea correcto. *f da

printf('Ingrese el nnmero de columnas de las arreglos: '); scanf('osd', &COL);

} while (COL MAX 11 COL < 1 ); /* Se verifica que el nOmero de columnas sea correcto. *f printf('‘nLectura del Arreglo MA‘n'); Lectura(MA, FIL, COL);

Page 236: Fundamentos de programacion - piensa en C

I 220 Capitulo 6. Arreglos muitidimensionales

printfrinLectura del Arreglo MBIn'fl Lectura(MB, FIL, COL); Sumo (MA, MB, MC, FIL, COL); printf('‘nImpresian del Arreglo MC‘n'); Imprime (MC, FIL, COL);

}

void Lectura(int AMMAX], int F, int C) /* La funcion Lectura se utilize pare leer un arreglo bidimensional entero de F .files y C oolumnas. */

int I, J; for (1=2; I<F; I++)

for (J=2; J<C; J++)

printf('Ingrese el elemento %d %d: I+1, J+1); scanf('%d', SiA[11[J]);

1

void Suma(int M1MMAX],int M2[][MAX],int M3MMAX], int F, int C) f* La funcion Sumo se utilize pare sumer los arreglos y almacener el resultado ften un tercer arreglo bidimensional. */

int I, J; for (7=2; I<F; I++)

for (J=2; J<C; J++) M3[1][J]= M1[1][J] + M2[1][J];

}

void Imprime(int AMMAX], int F, int C) f* La funcion I.priue se utilize pare escribir un arregla bidimensional de tipo 'mentor° de F files y C columnas. */

int I, J; for (7=2; I<F; I++)

for (J=2; J<C; J++) printf('‘nElemento %d %d: %d I, d, A[1][J]);

}

6.4. Arreglos de nibs de dos dimensiones

Los arreglos de mils de dos dimensiones son similares a los bidimensionales, excep-to porque cada element° se debe referenciar par medic) de tres o mas indices. Los arreglos de tres dimensiones se conocen comp tridimensionales. Cabe destacar que los arreglos de mas de tres dimensiones se utilizan muy poco en la practica.

En la figura 6,6 se muestra el arreglo tridimensional A que contiene 18 elementos de tipo entero. Observa que el arreglo tiene tres filas, dos columnas y tres pianos de pro-

Page 237: Fundamentos de programacion - piensa en C

AMMO) ARHOJE01 A[2][0][0]

6.5 Dec[aracion de arreglos tridimensionales

221

fundidad. A cads element° del arreglo se accede por medic, de tres indices. El primer Indice se utiliza para las filas, el segundo para las columnar y el tercet° para la pro-fundidad. Si queremos acceder al element° de la primera fila, la primera columna y el primer piano de profundidad debemos escribir A[0] [0]; si en cambia queremos acceder al element° de la tercera fila, la segunda columna y la segunda profundidad eseribimos A( 2)(1) [1], El valor de A(1] [1] ( 2) es 2, el de A [2] [ 0](2) es 3., el resulta-

d0deA[1][1][1] A[0][1][2]e54, yeldeArmilli] * A[2][1][0] es 12.

AM,:::;01,111111111" A[][1][]

Ar A; A

ArOvin APVArr iLli

maullre- AMMO' A[1][Ii[Oi API[li[0]

A[0][1][1]

A

Haulm 6.6 indices y components arreglo tridimensional.

6.5. Declaracion de arreglos tridimensionales

La declaracion de los arreglos tridimensionales, y en general de aquellos de ma's de dos dimensiones, es similar a la de los arreglos bidimensionales. espacio que los arreglos ocupan en memoria se reserva en el moment° de realizar la declaradon de los mismos. Observemos a continuacion las siguientes declaraciones.

void main(void)

int A[5][10][3]; /* Declaracian de un arreglo tridimensional de tips wtentera de 5 files, 10 columnas y 3 planes de profundidad. *or

float A[5][5][6]; /* Declaracion de un arregla tridimensional de tips .real de 5 files, 5 calumnas y 6 pianos de profundidad. *1

Page 238: Fundamentos de programacion - piensa en C

I 222

Capitulo 6. Arreglos multidimensionales

Una vez que se defmen los arreglos, sus elementos pueden recibir los valores a tra-y& de multiples asignaciones, o bien, como mencionamos anteriormente, a travel de un ciclo y la correspondiente lectura de valores. Veamos el siguiente ejemplo.

EJEFMLO 6.3

En una universidad se almacena informacion sabre el namero de alumnos que han ingresado a sus ocho diferentes carreras en los dos semestres lectivos, en los altimos cinco arms. Escribe un programa en C que calcule lo siguiente:

a) El ario en que ingres6 el mayor n4mero de alumnos a la universidad,

b) La carrera que recibi6 el mayor nrimero de alumnos el Ultimo ario.

c) ,En clue ario b carrera de Ingenierfa en ComputaciOn recibi6 el mayor nrimero de alumnos?

Data: UNI( a] 2] s) (arreglo tridimensional de tipo entero que almacena informaciOn sabre el ingreso de alumnos a una universidad).

Observa ademAs que las carreras de la universidad tienen un valor nume'rico asociado:

1. Contabilidad.

2. AdministraciOn.

3. Economia.

4. Relaciones Intemacionales.

5. Matematica,s,

6. Ingenierfa en Computaei6n,

7. Ingenierfa Industrial.

8. Ingenierfa en Telemdtica.

Programa 6.3

#include 4stdio.h,

f* Universidad. El programa, al recibir informacion sabre el nOmera de alumnos qua hen ingresada ima sus ocho diferentes carreras en los dos semestres lectivos de los oltimos imcinco anon, obtiene informacian util pare el departamenta de escolar. *i

coast int F = B, C - 2, P - 5; f* Se declaran constantes pare la file, la calumna y la profundidad. *1 void Lectura(int (][C][P], int, int, int);

Page 239: Fundamentos de programacion - piensa en C

6.5 Declaracion de arreglos tridimensionales 223 i

void Funcion1(int [][C][P], int, int, int); void Funcion2(int [][C][P], int, int, int); void Funcion3(int [][C][P], int, int, int); 1* Prototipo de funciones. Cada prototipo de funcion carresponde a uno de los miincisos. *i

void main(void)

int UN1[F][C][P]; Lectura(UNI, F, C, P); Funcion1(UNI, F, C, P); Funcian2(UNI, F, C, P); Fu Funcion3(UNI, 6, C, P); /* Se coloca el 6 coma parimetro ya que es in clave de in Ingenieria en imp-Computacian. *1 }

void Lectura(int AM[C][P], int F1, int Ca, int PR) /* La funcion Lecture se utilize pare leer un arregla tridimensional de tipo wientero de FI files, CO oolumnas y PR prafundidad. Observe que al ser motridimensianal se necesitan tres ciclos pare recorrer el arreglo. *f

int K, I, J; for (K-9; K<PR; K++)

for (I=0; I<F1; I++) for (J=0; J<CO; J++)

{ printf('Aho: 96dItCarrera: gahtSemestre: %d K+1, 1+1, J+1); scanf('%d', &A[I][J][K]);

} }

void Funcion1(int A[][C][P],int F1, int CO, int PR) 1* Este funcion se utilize pare determiner el aho en el que ingres6 el mayor monhmera de alumnae a la universidad. Observe que el primer ciclo externs .corresponde a los arms. *1

int K, I, J, MAY = 0, AC = -1, SUM; for (K=3; K<PR; K++) J* Per coda Om se sums el ingreso de los dos semestres de las achy carreras. A or

SUM = 0; for (1=0; IcF1; I++)

for (J=0; J<CO; J++) SUM += A[I][J][K];

if (SUM MAY)

MAY = SUM; AO = K;

}

Page 240: Fundamentos de programacion - piensa en C

I 224 Capitulo 6. Arreglos multidimensionales

} printf(''kninAfia con mayor ingress de alumnos: %d Alumnos: %d', A0+1, MAY);

}

void Funcion2(int A[][C][P],int FI, int CO, int PR) /* Esta funcion se utiliza para determinar la carrera quo recibid el mayor worhmero de alumnos el Ultimo aho. Observa que no se utiliza un ciclo para los implanos de la profundidad, ya que es un data (PR). */

int I, J, MAY - 6, CAR = -1, SUM; for (1-0; I<FI; I++) 4

ELIM = 0; for (J=0; d<CO; d++)

SUM += A[I][..][PR-1]; if (SUM > MAY)

MAY - SUM; CAR = I;

} } printf('‘n‘nCarrera con mayor nfimera de alumnos: %d Alumnos: CAR+1,

MAY); }

void Funcion3(int A[][C][P],int FI, int CO, int PR) /* Esta funcion se utiliza para determinar el afia en el clue la carrera oIngenieria en Computacian recibia el mayor n6mero de alumnos. Observa clue no use utiliza un ciclo pare trabajar can las files, ya quo es un data (FI). *f

int K, J, MAY - 0, AO = -1, SUM; for (K=0; K<PR; K++)

SUM = 0; for (J=0; J<CO; J++)

SUM += A[FI-1][d][K]; if (SUM MAY)

MAY = SUM; AO- K;

} printf('‘n‘nAho can mayor ingreso de alumnos: %d Alumnos: sisd', A0+1, MAY);

}

A continuaciOn presentamos una serie de problemas resueltos y despue's de estos veremos problemas suplementarios cuidadosamente seleccionados.

Page 241: Fundamentos de programacion - piensa en C

Problemas resueltos

225

Problemas resueltos

Problema PR6.1

Escribe un programa en C. que, al recibircomo date un arreglo bidimensional (matriz) cuadrado, determine si el mismo es snnetrieo. Recuerda que se consi-dera sim6trico si cumple la siguiente condicion: Amp) =AM[ I].

Dato: MAT(N] (NJ (donde MAT es un arreglo bidimensional de tipo enter° de Nxid elementos, 1 5 N 5 100

Programa 6.4

#include <stdia.h>

i* Simi-trim El programa, al recibir Emma data un arregla bidimensional cuadrado, determine si el misma es simitrica. *or

const int MAX =- 160;

void Lectura(int [][MAX], int); 1* Protatipas de funciones. *I int Simetrica(int [][MAX], int);

void main(void)

int MAT[MAMMAX], N, RES; do

printf('Ingrese el tenni.° del arregla: '1; scanfl'96d', &N);

I while (N MAX q N < 1); 1* Se verifica que el tamana del arregla sea

velida. *or Lecture (MAT, N); RES = Simetrica(MAT, N); if (RES)

printf(LnEl arregla bidimensional es simetrica'); else

printf(LnEl arregla bidimensianal no es simetrice);

void Lectura(int AMMAX], int T) I* La funcion Lecture se utilize pare leer un arregla bidimensional cuadrado de tip enter° de T files y T columnas. *i

Page 242: Fundamentos de programacion - piensa en C

226 Capitulo S. Arreglos multidimensionales

int I, J; for (1=0; I<T; I++)

for (J=0; J<T; J++)

printf('Fila: gol‘tCalumna: scanf('%d', SA[11[J1);

%d', 1+1, J+1);

int Simetrica (int AMMAX] , int T) f* La funcion Sisitrico se utilize pare determiner si el arregla bidimensional Iwcuadrado as simitrica. Si es simetrica regresa 1, en caso cantraria, 0. wiserva que en el segundo cicla solamente se recarre la matriz triangular oinferiar, sin la diagonal principal. */

int I = 0, J, F = 1; while ((I < T) && F)

J = 0; while ((J < 1) F)

if (.4[1][J] == A[J][I]) J++;

else F = 2;

I++; :i return (F);

:i

Problema PR6.2

A la clase de Estructuras de Datos del profesor Serrano asiste un grupo numero-so de alumnos. El profesor Serrano es muy exigente y aplica cuatro examenes durante el semestre. Escribe un programa en C que resuelva lo siguiente:

a) El promedio de calificaciones de cada alumno.

b) El promedio del grupo en cada examen,

c) El examen que tuvo el mayor promedio de calificaciOn,

Mao: AR! [N, 4] (donde ALU es un arreglo bidimensional de tipo real de N filas y cuatro columnas que almacena calificaciones de alumnos, 1 N 50).

Page 243: Fundamentos de programacion - piensa en C

Problemas resueltos 227 i

Programa 6.5

#include <stdia.h,

J* Alumnos. El programa, al recibir un arreglo bidimensional que contiene informacian imsobre calificaciones de alumnus en cuatro materias diferentes, obtiene wPresultados estadisticos. */

const int MAX = SO; const int EXA = 4;

void Lecture(flost [MAXI[EXA], int); void Funcion1(float (MAX][EXA], int); void Funcion2(float [MAX][EXA], int);

void main(void)

int HAL; float ALU[MAX][EXA]; do

/* Prototipos de funciones. */

printf('Ingrese el nomero de alumnus del grupo: •); scanf(•%d•, &NAL); /* Se verifica que el nOmero de alumnus del grupo sea valid°. */

while (NAL > MAX :: HAL < 1); Lectura(ALU, HAL); Funcionl(ALU, NAL); Funcion2(ALU, NAL); }

void Lectura(float AMEXA], int N) J* La funcion Lecture se utilize pare leer un arreglo bidimensional de tipo real de N files y EXA columnas. */

int I, J; for (I=e; I<N; I++)

for (Jma; J<EXA; J++)

printf(•Ingrese la calificacion %d del alumna %d: J+1, 7+1); scanf('risf•, &A[II(JI);

} }

void Funcion1(float AMEXA], int T) J* Este funcion se utilize pare obtener el pramedia de cede estudiante. *1

int I, J; float SUM, PRO; for (I=a; I<T; I++)

Page 244: Fundamentos de programacion - piensa en C

I 228 Capitulo 6. Arreglos multidimensiortales

Sl1M - a; for (..1-0; J<EXA; J++)

SUM += A[I][J]; PRO = SUM 1 EXA; printf('‘nEl promedio del alumna %d es: 965.2r, 7+1, PRO);

} }

void Funcion2(float AMEXA], int T) 1* Esta funcion se ntillza tanto pare abtener el promedia de cads examen, asi oomo tambien el examen quo obtuvo el promedio mas alto. *1 4 int I, J, MAY; float SUM, PRO, MPRO = a; printf('‘n'); for (J=O; J<EXA; J++)

SUM - a; for (I=0; 7.<7; I++)

SUM += A[I][J]; PRO = SUM 1 T; if (PRO > MPRO)

MPRO - PRO; MAY = J;

} printf('‘nEl promedio del examen 96d es: kr, J+1, PRO);

} printf('‘n‘nEl examen con mayor promedio es: %d ‘t Promedio: 965.2V, MAY+1, mwMPRO); }

Problema PR6.3

Escribe un programa en C que intercambie lay N columnas de un arreglo bicli-mensional. Los elementos de la primera columna se intercambian con los de la tiltima, los de la segunda con los de la periltima, y asi sucesivamente.

Dato: MAT [M][N] (arreglo bidimensional de tipo real de m filar y N columnas, M E 50 y N S 50,

Page 245: Fundamentos de programacion - piensa en C

#include <stdia.h>

/* Intercambia. El programa intercambia las columnas de un arreglo bidimensional. Los wielementos de la primers columns se intercambian con los de la Ultima, 'aps de la segunda can los de la penAltima, y asi sucesivamente. *or

conet int MAX = 59;

void Lectura(float [][MAX], int, int); void Intercambia(float [][MAX], int, int); void Imprime(float [][MAX], int, int);

void main(void)

int F, C; float MAT[MAX][MAX]; do

printf('Ingrese el rainier° de files: '); scanf('9dd', & F);

} while (F > MAX F < 1); /* Se verifica que el do

J* Protatipos de funciones. *1

flamer° de files sea correct°.

printf('Ingrese el rainier° de columnas: '); scanf('9dd', &C);

} while (C > MAX 11 C < 1 );

Lectura(MAT, F, C); Intercembia(MAT, F, C); Imprime(MAT, F, C); }

f* Se verifica que el niimera de columnas sea 000rrecto. *f

void Lectura(float AfIrMAXI, int F, int C) I* La funcian Lecture se utilize pare leer un arreglo bidimensional de tips o real de F files y C columnas. *or

int I, J; for (I=; I< F; I++)

for (J=2; .I C; J++)

printf('Ingrese al element° %d 964: 1+1, J+1); scanf('0', &A[I][J]);

} } void Intercambia(floet AMMAXI, int F, int C) i* Este funcion se utilize pare intercambiar las columnas del arreglo

Problernas resueltos 229 I

Programa 6.6

Page 246: Fundamentos de programacion - piensa en C

I 230 Capitulo 6. Arreglos multidimensionales

bidimensianal. Observe que el indice carrespandiente a las columnas solo se nave haste la mitad del arregla. */ { int I, J; float AUX; f* Observe clue en esta funciOn el indice I se utilize pare las columnas, y el indice J pro las files. */ for (I=9; I c (C 1 2); I++)

for (J=9; Jc F; d++)

PUX = A[d][I]; AIJI[I] = A[d][C-I-11; AIJI[C-I-1]=AUX;

}

void Imprime(float AMMAXI, int F, int C) f* La funcion Inprise se utilize pare escribir un arregla bidimensianal de tipo Ureal de F files y C columnas. */

int I, d; for (I=9; I‹ F; I++)

for (d=9; J<C; J++) printfr‘nElementa 'd 96d: 965.21—, 1+1, J+1, A[I][J]);

}

Probteam PR6.4

En la f&rica de lacteos TREGAR, localizada en Gobemador Crespo, Santa Fe, Argentina, se proporcionan las Yentas mensuales de sus 15 principales productos de la siguiente manera:

1, s, ise 1, s, se 1, 8, vas 1, 8, 30

2, S, SO

.1, .1, .1

Observa que el primer valor de la transaccift corresponde al mes, el segundo al pro-ducto y el tercero a la cantidad vendida del mismo. La primera transacci6n indica que en el mes I se vendieron ise unidades del producto s, Observa que en un mis-mo mes se pueden tenet- diferentes Yentas de un mismo producto (transacciOn 2).

Page 247: Fundamentos de programacion - piensa en C

Problemas resueltos 231 I

Se conocen ademas los precios de yenta de cada uno de los productos. Escribe un programa en C que calcule lo siguiente:

a) El monto de yenta anual de cada uno de los productos. b) El monto total de yentas de la Mbrica de lacteos.

c) El tipo de producto que mas se ha vendido y el monto de las yentas.

Datos: MES,, PROI , CAN,

11E52, PRO2, CAN,

-1, -1, -1

ODS,, COS2, cos15

Ronde: MES, es una variable de tipo entero que pace referencia al mes de produccion de la transaccion i, 1 5 MES 5 12. PRO, es una variable de tipo entero que indica el tipo de producto, 1 5 PRO 5 15.

CAN es una variable de tipo entero que representa las yentas del producto PRO en la transacciOn i. co; es una variable de tipo real que representa el costo de producto 1, 1 a i 5 15.

Programer 6.7

ifinclude <stdia.h>

J* Fabrica de lacteos. El programa, al recibir coma datas las yentas mensuales de diferentes ✓iproductos, obtiene informacion estadistica valiosa pare la empresa. */

void Lectural(int [15][12]); void Lectura2(float, int); void Funcion1(int [][12], int, int, float *, float *); /* Prototipos de .funciones. */ void Funcion2(float *, int); void Funcian3(float *, int);

void main(void)

int FAB[15][12] = lel; float 0)8[15], VEN[15]; Lectura1(FAB); Lac-tura (COS, 15]; Funcian1(FAB, 15, 12, COS, VEN);

/* Inicializacion en 0 del arregla FAB. *i

Page 248: Fundamentos de programacion - piensa en C

I 232 Capitulo 6. Arreglos multidimensionales

Funcion2(VEN, 15); Funcion3(VEN, 15);

} void Lectural(int A[][12]) irk Este funcion se utilize para almacenar en el arreglo bidimensional las udiferentes transaccianes qua representan las yentas de las diferentes wqraductos. El fin de datos esti dada par -1. */

int MES, PRO, CAN; printfr‘nIngrese mes, tips de producta y cantidad vendida: '); scanf('%d %d gad', SMES, &PRO, &CAN); while (MES!- -1 && PRO!= -1 && CAN1=-1)

A[MES-1][PRO-11 += CAN; printf('Ingrese mes, tips de producto y cantidad vendida: '); scanf('tsd kd %d', &MES, &PRO, WAN);

} }

void Lectura2(float A[1, int N] 1* Esta funcion se utilize pare leer las precios de yenta de los diferentes ▪ roductos. */

int I; for (1=6; I.N; I++)

printf('Ingrese costa del product° %d: 1+1); scanfrgsr, &MID;

} }

void Funcionl(int A[][12], int F, int C, float V1[1, float V2[1] /* Este funcion se utilize pare calcular el monto de yenta anual de cede uno *KIP los praductas. Observe qua el resulted° se almacena en un arreglo o unidimensional clue se utilizers posteriarmente. */

int I, J, SUM; print-1('11.r); for (1=6; I‹ F; I++)

SUM = for (.1=0; J<C; J++)

SUN += A[I][J]; V2[I] = V1[I] * SUM; printfrOTotal de yentas del prnducto slad: gs8.2r, 1+1, V2[I]);

} }

void Funcian2(float A[1, int C] /* Esta funcion se utilize pare calcular el manta total de yentas de la fibrica. *1

Page 249: Fundamentos de programacion - piensa en C

Problemas resueltos 233 I

int I; float SJM = 2.2; for (1=9; 1<C; I++)

SUM += A[I]; printf('InlinTatal de ventas de la fabrica: %.2f', SUM);

void Funciona(float A[], int C) /* Esta funcion se utiliza para obtener el tips de praducto que mss se ha vendido 'my el manta de las yentas de dicho products. *1

int I, TPR = 2; float YEN = A[2]; for (1=1; IcC; I++)

if [YEN < A[I])

TPR = I; YEN = A[I];

} printf('InlinTipo de Producto mks vendido: %d It Yentas: %.2f", TPR + 1, YEN];

}

Problema PR6.5

Escribe un programa en C que, at recibir coma data una matrix, calcule su tras-puesta. La traspuesta de una matrix se obtiene at escribir las filas de la matrix como columnas.

Dato: MAT EM] [N] (arm* bidimensional de tip entem de 1m filas y N columnas, 1.50y1.5.0),

Programa 6.8

tiinclude <stdio.h>

/* Traspuesta. El programa calcula la traspuesta de una matrix. *1

conat int MAX = SO;

void Lectura(int [][MAX], int, int); void Traspuesta(int [][MAX],int [][MAX], int, int); 1* Prototipos de funcianes. */ void Imprime(int [][MAX], int, int);

void main(void)

Page 250: Fundamentos de programacion - piensa en C

1234 Capitulo 6. Arreglos muitidimensionales

int MAT[MAX][MAX], TRA[MAXHMAX]; int FIL, COL; do

printf('Ingrese el nnmero de files de la matriz: ' ) ; scanf('gsd', &FIL);

} while (FIL P, MAX 11 FIL < 1); 1* Se verifica que el numero de files sea correcto. *1 do 4

printf('Ingrese el nfimero de columnas de la matriz: .1; scanf('gsd', &COL);

} while (COL > MAX 11 COL < 1); f* Se verifica que el nomero de columnas sea carrecto. *1 Lectura(MAT, FIL, COL); Traspuesta(MAT, TRA, FIL, COL); Imprime(TRA, COL, FIL); }

void Lectura(int AMMAXI, int F, int C) 1* Feta funcion se utilize pare una matriz de tip entero de F files y C ftoolumnes. *1 4 int I, J; for (1=0; I<F; I++)

for (d-W, J<C; J++)

printf('Ingrese el element° acd %d: ', 1+1, J+1); scanfr%d', &A[I][J]);

} }

void Traspueste(int Mi[][MAX],int 1.12[][MAX],int F, int C) 1* Feta funcion se utilize pare calcular la traspuesta. *or

int I, J; for (1=0; I< F; I++)

for (J=0; J<C; J++) M2[J][I] = M1[I][J];

}

void Imprime(int AMMAXI, int F, int C) 1* Feta funcion se utilize pare escribir una matriz de tip° entera de F files fty C columnas --en este ceso la traspuesta. *1 4 int I, J; for (I=0; I<F; I++)

for (,J=0; J<C; J++) printfrinElemento %d: %d 10, J+1, A[I][J]);

Page 251: Fundamentos de programacion - piensa en C

Problemas resueltos 2351

Problema P116.6

Escribe un programa en C que, at recibir como data un arreglo bidimensional cuadrada (matrix), asigne valores a un arreglo tmidimensional aplicando el si-guiente criteria:

MAITIM Si{/963) =

MATUM Si(P13) = 2 1.1

MAITAU14± MOM [JD ,f1)

De otra forma

Data: MAT(N)(N) (arreElOtddimemi011a ClUdrakodetip enter°, 1 N < 50),

Programa 6.9

Ninclude <stdia.h>

or* Asigna. El programa, al recibir un arreglo bidimensianal cuadrada, asigna elementos en wpfuncion dal modulo (residua) a un arregla unidimensional. */

void Lectura(int [][12], int); void Calcula(int [][12], float [I, int); float Mod2(int [][1O], int, int); float Mod1(int [][1O], int); float Mod2(int [][1O], int, int); void Imprime(float [12], int);

void main(void)

int MAT[12][12],TAM;

float 4EC[12]; do

/* Protatipos de funciones. *I

printf('Ingrese el tamano de la matriz: '); scanf('ikd', &TAM);

} while (TAM >12 11 TAM < 1); Lectura(MAT, TAM);

Page 252: Fundamentos de programacion - piensa en C

I 236 Capitulo 6. Arreglos multidimensionales

Calcula(MAT, VEC, TAM); Imprime(VEC, TAM); }

void Lectura(int A[][16], int N) ir* La funcion Lecture se utiliza para leer un arreglo bidimensional cuadrado o de tip entera. */

int I, J; for (7=0; I<N; I++)

for (J=2; J<N; J++)

printf('Ingrese el element° gdd %d: 1+1, J+1); scanfr%d', &A[I][J]);

} }

void Calcula(int A[][16],float B[], int N) f* Esta funcion se utiliza tanto para calcular el modulo entre el indice dal

o arreglo unidimensional y 3, comp para Hamar a las funciones O 00rrespondientes para resolver el problema. */

int I; for (7=2; I<N; I++)

switch (7%3)

case 1: B[l] = Nadi (A,7); break;

case 2: 8[1] = Mod2 (A,I,N); break;

default: B[I] = Mode (A,I,N); break;

}

float Mod0 (int A[][10],int K, int M)

f* Esta funcion calcula el cociente entre una productoria y una sumatoria.

int I; float PRO = 1.2, SUM = 2.2; for (7=2; I<M; I++)

PRO *= A[7][K]; SUM += A[7][K];

} return (PRO / SUM); } float Mod1(int A[][12], int N) /* Esta funcion obtiene el resultado de una sumatoria. *1

Page 253: Fundamentos de programacion - piensa en C

Problernas resueltos 237

int I; float SJM = 8.0; for (1=8; .1<=N; I++)

SUM += A[N][I];

return (SUM);

float Mod2 (int A[][18];int N, int M) /* Esta funcidn D'Alene el resultado de la productoria. *1

int I; float F90 = 1.0; for (1=N; I<M; I++)

PRO *= A[I][N]; return (PRO);

void Imprime(float 13[], int N) /* Esta funcion se utiliza para escribir un arreglo unidimensional de tipo

.real de N elementos. *f

int I; for (1=8; 1.4N; I++)

printf(2 nElemento %d: 96.2# I, B[I]);

Problems PR6.7

Escribe un programa en C que genere un cuadrado migico (CM). Un CM se representa por medic de una matrix cuadrada de orden N, impar, y contiene los ntmeros comprendidos entre I y N* N. En un CM la suma de cualquiera de las fi-las, columms y diagonales principales siempre es b. misma. El cuadrado mtigico se genera aplicando los siguientes criterios:

1. El primer amen:, (1) se coloca en la celda central de la primers fila.

2. El siguiente atm= se coloca en ]a celda de la fda anterior y columna posterior.

3. La fila anterior al primero es el ultimo. La columna posterior a la Ultima es la primera.

4. Si el ntmero es un sucesor de un maltiplo de N, no aplique La regla 2. Coloque el ntmero en la celda de la misma columna de la Ma posterior.

6

Page 254: Fundamentos de programacion - piensa en C

I 238

Capitulo 6. Arreglos multidimensionales

Programa 6.10

#include <stdio.h>

1* Cuadrado magic°. E1 programa genera un cuadrado magic° siguienda las criterias enunciados imanteriarmente. *I

coast int MAX = 50;

void Cuadrado(int [][MAX], int); void Imprime(int [][MAX], int); f* Pratatipos de funciones. *i

void main(void)

int CMA(MAXMMAXI,TAM; do

printf('Ingrese el tamahn impar de la matrix: '); scanf('gsd', &TAM);

} while ((TAM > MAX TAM < 1) && (TAM % 2)); 1* Se verifica el tamaho del arregla y el orden (impar) del misma. *I Cuadrado(CMA, TAM); Imprime(CMA, TAM);

}

void Cuadrado(int AMMAX],int N) ir* Esta funcion se utiliza para formar el cuadrado magica. *or { int I = 1, FIL = 0, COL = N f 2, HUM = H * N; while (I NUM) -[

A[FIL][COL] = I; if (I%N != 2) {

FIL = (FIL - 1 + N) gg. N; COL = (COL + 1) gis H;

} else

FIL++; I++;

} }

void Imprime(int AMMAX], int N) /* Esta funcion se utilize para escribir el cuadrado magica. *f

int I, J; for (1=0; IcH; I++)

for (,J=0; J<N; J++) printfr‘nElemento gdd: gsd',I+1, J+1, A[I][d]);

Page 255: Fundamentos de programacion - piensa en C

Problemas resueltos 239 1

Problema P116.8

Escribe un programa en C que, at recibir como datos los valores mensuales del alio 2004 de las acciones de los cinco fondos de inversiOn que maneja una casa de bolsa de la Ciudad de Mexico, y por otra parte los precios de esas acciones al 31 de diciembre del alio 2003, realice lo siguiente:

a) Calcule el rendimiento anual de los cinco fondos de inversiOn.

b) Obtenga el promedio anual de las acciones de cada uno de los fondos de inversion.

Obtenga el fondo que obtuvo el mayor rendimiento, asi como el que obtuvo el peor rendimiento. Escribe ademas los porcentajes correspondientes.

ilah9: FON (5][12], PRE[5]

Wade: FON es un arreglo bidimensional de tipo real de cinco filar y 12 colum-nas, que almacena el valor mensual de las acciones de los cinco fondos de inversion.

PRE es un arreglo unidimensional de tipo real de cinco elementos, que almacena el precio de las acciones de los fondos al 31 de diciembre del ario 2003,

Programa 6,11

ifinclude ‹stdio.h,

/* Casa de bolsa. El programa, al recibir coma datos los precios mensuales de las acciones de sus .cinco fondos de inversion, ademis del precio de las acciones al 31 de diciembre .del 2203, genera informacian estadistica impartante pare la empress. *1

void LecturaM(float [][12], int, int); void LecturaV(float *, int); void Fl(float [][12], int, int, float *, float *); i* Protatipos de funciones. *1 void F2(float [][12], int, int); void F3(float *, int);

void main(void)

float FON[5][12], PRE[5], RENS];

i* REN es un arreglo unidimensional de tipo real que se utilizara pare almacenar 4el rendimiento anual de los fondos de inversiOn. */

Page 256: Fundamentos de programacion - piensa en C

I 240 Capitulo 6. Arreglos multidimensionales

LecturaM(FON, 5, 12); LectureV(PRE, 5); F1(FON, 5, 12, PRE, REN); F2(FON, 5, 12); F3(REN, 5);

}

void LecturaM(float A[][12], int F, int C) /* Este funcion se utilize pore leer un arreglo bidimensional de tipo real de F . files y C columnes. */

int I, J; for (1=0; IMF; I++)

for (J=0; J<C; J++)

printf(•Precia fonda %dtt mes %d: 1+1, J+1); scanfricr, &A[I][J]);

}

}

void LecturaV(flost A[], int T) ir* Este funcian se utilize pare leer un arreglo unidimensionel de tipo real de T o elementas. */

int I; printf('‘n'); for (1=0; IcT; I++)

printf('Precia Fonda %d al 31/12/2203: 1+1); scanf('%f', &A[I]);

}

void Fl(float A[][12], int F, int C, float B[], float V(])

f* La funcion Fl se utilize pare calculer el rendimienta anual de las 'rondos de . inversion. El resultedo se elmecena en el arreglo unidimensional W. *i int I; printf('‘nRENDIMIENTOS ANUALES OF LOS FONOOS'); for(I=0; IcF; I++)

V[I] = (A[I][C-1] - BM) f R[I] * 100; printf(•linFondo %d: %.2f', 1+1, V[I]);

}

void F2(float A[][12], int F, int C)

f* Este funcion calcule al promedio anuelizedo de las acciones de los diferentes o fondas. */

Page 257: Fundamentos de programacion - piensa en C

Problemas resueltos 241 1

int I, J; float SUM, PRO; printf(inOPROMEDIO ANUALIZADO DE LAS ACCIONES DE LOS FONDOS'); for(I=2; I<R; I++)

SUM = 2; for(J=2; ..14C; J++)

SUM += A[l][J]; PRO = SUM / C; printf('0Fondo %d: %.2f', I+1, PRO);

} }

void F3(float A[], int F) /* Esta funcian permite calcular los tondos con el mejor y pear rendimiento.

float ME = A[2], PE = A[B]; int II 2 P 2, I; for (I=1; I<F; I++)

if (A[I] > ME)

ME = A[I]; M = I;

} if (A[I] 4 PE)

PE = A[I]; P= I;

} } printf('OOMEJOR Y PEOR FONDO DE INVERSION'); printf(inMejor fando: %d‘tRendimiento: M+1, ME); printf('OPeor fonds: WtRenaimiento: %6.2f', P+1, PE);

}

Problema PR6.9

En el arreglo tridimensional LLU se almacenan las lluvias mensuales registradas en milimetros, en las 24 provincias de Argentina, durante los dltimos 10 arios. Escribe un programa en C que permita resolver lo siguiente:

a) La provincia que tuvo el mayor registro de precipitaciOn pluvial durante los Ciltimos 10 arms.

b) La provincia que tuvo el menor registro de lluvias en el ultimo alio.

c) El mes que tuvo el mayor registro de lluvias en la provincia 18 en el quintet aria

Page 258: Fundamentos de programacion - piensa en C

1 242

Capitub 6. Arreglos multidimensionales

Nail: En todos los casos se debe escribir adernas el registro de lluvias correspondiente.

Dato: LLU ( 24 ( 12) ( 18) (arreglo tridimensional de tipo real que ahnacena bs lluvias mensuales en las 24 provincias durante los illtirnos 10 Mos).

Programa 6,12

#include cstdio.h

f* Lluvias. El programa, al recibir comp data un arregla tridimensional que contiene •informaci4n sabre lluvias, genera informacian estadistica. */

coast int PRO = 24; coast int MES = 12; coast int ANO = 10;

void Uectura(float [PROINESHANOI, int, int, int); void Funcian1(float (PRO][MESHANO] , int, int, int); void Funcion2(float (PRONMESHAA01, int, int, int); /* Pratotipos de funciones. *1 void Funcian3(flost (PRO][MESHANO] , int, int, int);

void main(void)

float LLU[PRO][MESHANO]; Lectura(LLU, PRO, MES, Ai0); Funcion1(LLU, PRO, MES, 1440); Funcian2(LLU, PRO, MES, ANO); Funcion3(LLU, 18, MES, 5); }

void Lectur (float AMMESHANO], int F, int C, int P) f* Este funcion se utilize pare leer un arreglo tridimensional de tipo real de urF filas, C columnas y P pianos de profundidad. *f

int K, I, J; for (K=0; KO; K++)

for (I=0; IcF; I++) for (..J=0; J<C; J++)

printf('Aho: 96dItProvincia: fisd‘tMes: K+1, 7+1, J+1); scanf('%f', &A[7][J1[K]);

} }

void Funcionl(float AMMESHANO],int F, int C, int P) f* Este funcion se utilize para localizer la pravincia que tuvo al mayor registro ode precipitecian pluvial en los Ultimos 10 afios. Escribe edemas el registro iworrespondiente. */

Page 259: Fundamentos de programacion - piensa en C

Problemas resueltos 243

int I, K, J, EMAY = -1; float ELLU - -1.2, SUM; for (I=2; 1<F; I++)

SJM = 2.2; for (K=2; K<P; K++)

for (J=2; J<C; J++) SUM += A[1][J][K];

SiN 1= P * C; if (SUM > ELLU)

{ ELLU = SUM; MAY = 1;

}

} printf('Nn‘nProvincia con mayor registro de lluvias: %d', EMAY+1); printf('InRegistro: 96.21", ELLU); }

void Funcion2(float AMMESHANO],int F, int C, int P) /* Esta funcion se utilize para localizar la provincia que tuvo el manor registro ode lluvias en el Ultimo aria. Escribe ademas el registro correspandiente. *f

int I, J, EMEN; float ELLU = 1202, SUM; for (1=2; 1<F; I++)

SJM = 0; for (J=2; J<C; J++)

SUM += A[1][J][P-1]; 9,1M 1= C; if (SUM < ELLU)

ELLU = SUM; MEN = 1;

} } printf('In‘nProvincia con menor registro anual de lluvias en el Ultimo oho: tcd',

MEMO); printf('InRegistra anual: ELLU); }

void Funcion3(float AMMESHAg0],int F, int C, int P) i* Esta funcian se utiliza pare localizar el mes con mayor registro de lluvias en ola pravincia 18 en el quint° aflo. Escribe ademas el registro carrespandiente. */

int J, EMES = -1; float ELLU = -1.0;

Page 260: Fundamentos de programacion - piensa en C

244 Capitulo 6. Arreglos multidimensionales

for (J=O; J<C; J++)

{ if (A[F-1][J][P-1] ELLU)

ELLU A[F-1][J][P-1]; SUES = J;

} } printf('WnMes: %d Lluvias: EMES+1, ELLU); }

Probierna PR6.1O

En el arreglo tridimensional PRO se almacenan las yentas mensuales de los UM-m05 ocho anos de los tres departamentos de una empresa, textil: hi1os, toms y ficra_Escribeun programa en C que obtenga lo siguiente:

a) Las Yentas totales de la empresa en el segundo alio.

b) El departamento que tuvo las mayores yentas en el ultimo alio, incluyendo tambi6n el importe de las Yentas.

c) El departamento, Ines y alio con la mayor yenta, incluyendo el importe de las Yentas,

Daft): Pao (12)(3)(B) (donde PRO es un arreglo tridimensional de tipo real que almacena las Yentas mensuales de los tres departamentos en los ultimos ocho anos).

Programa 6.13

#include ‹stdio.h>

1* Empresa textil. E1 programa, al recibir un arreglo tridimensional que cantiene informacion o sobre las yentas mensuales de tree departamentos en los oltimos ocho afros, wrgenera informacion estadistica valiosa pare la empresa. */

coast int MES = 12; coast int DEP = 3; coast int ANG = B;

void Lectura(float [MES][DEPHANO], int, int, int); void Funcionl(float [MES][DEP][ANO], int, int, int); void Funcion2(float [MES][DEPHANO], int, int, int); 1* Prototipas o de funciones. */

Page 261: Fundamentos de programacion - piensa en C

Problemas resueltos 245 j

void Funcion3(float (MES][DEPHAP10], int, int, int);

void main(void)

float PRONESI[DEP][Ai0]; Lectura(PRO, MES, DEP, Ai0); Funcion1(PRO, MES, DEP, 2); Funcian2(PRO, MES, DEP, Ai0); Funcion3(PRO, MES, DEP, ANO);

}

void Lectura(float AMDEPHAi01, int F, int C, int P) /* La funcion Lecture se utiliza pare leer un arregla tridimensional de tips moreal de F files, C oolumnas y P pianos de prafundidad. *f

int K, I, J; for (K=9; K<P; K++)

for (7=2; I<F; I++) for (J=2; J'C; J++)

printf('Afia: %chtMes: %chtDepartamenta: %d K+1, 7+1, J+1); scanf('%f', &A[7][J][K]);

} }

void Funcion1(float AMDEPHANOLint F, int C, int P) f* Este -Nina& se utiliza pars obtener is yentas tatales de la empress mien el segundo afia. *f

int I, J; float WM = 2.2; for (I=2; l<F; I++)

for (d=2; J<C; J++) SUM += A[7][J][P-1];

printf('InlinVentas totales de is empress en el segundo ana: %.2f', SUM); }

void Funcian2(float AMDEPHANOLint F, int C, int P) /* Esta funcion se utiliza pars obtener el departamento que tuvo las mayores ftventas en el Ultimo aha. Genera ademas el imparte de las yentas. *or

int I, J; float SJM1 = 2, SUM2 = 2, SUMS = 2; for (1=9; I<F; I++)

for (d=2; J‹; J++) switch (JO)

case 1: SUM1 += A[I]p1[P-1];

break; case 2: SUM2 += Ap1[..11[P-1];

break;

Page 262: Fundamentos de programacion - piensa en C

I 246 Capitulo 6. Arreglos multidimensionales

ease 3: SUM3 A[l][d][P-1]; break;

if (SUM1 SUM2) if (SUM1 SUM3)

printf('ul‘nDepartamento con mayores ventas en el ultimo afia: kilos'); printf(' Ventas:%.2f', SUM1);

} else

printf('IWADepartamento con mayores vemtas en el Ultima Licra'); printf(' Ventas:%.2f', SUM3);

} else

if (SUM2 SUM3) {

printf('WoDepartamento con mayores ventas en el Ultima afia: Lanes'); printf(' Ventas:%.2f', SUM2);

else {

printf('In‘nDepartamemto con mayores ventas en el Ultimo afia: Licra'); printf(' Ventas:%.2f', SUM3);

void Funcion3(float AMDEPHAP10],int F, int C, int P) 1* Esta funcian se utilize pare obtener el departamento, mes y afio con la mayor mPventa. Escribe tamblen el manta de las yentas. *1

int K, I, J, DE, ME, AN; float VEN - -1.0; for (K=O; K<P; K++)

for (I=0; I< F; I++) for (J=0; J<C; d++)

if 04[I][d][K] VEN)

VEN = A[l][d][K]; OE - d; ME = I; AN- K;

printf('MnDepartamenta: 949VAMes: WtAfia: 0E+1, ME+1, AN+1); printf('‘tVentas: %.2r, VEN); }

Page 263: Fundamentos de programacion - piensa en C

Problemas suplementarios 247

Problemas suplementarios

Problema P56.1

Escribe un programa en C que coloque un 1 en las diagonales principales de una matriz cuadrada. El resto se debe completar con O. Observa la figura. 6.7, que muestra, come debe quedar 1.a matriz.

1 0 0 1

o t t 0

o 1 1 0

1 0 0 1

Fiiw 6.7

Matrix cuadrada.

Dato: NATI N]lr N] (arreglo bidimensional cuadrado de NxN &mentos, 1 s N 190.

Problem P56.2

Construye tut programa que, al recibir los montos de Yentas mensuales de cinco departamentos de una falNica, proporcione la siguiente informaciOn:

a) Las Yentas mensuales de la fabrica, incluido el monto anual.

b) El departamento que tuYo la mayor yenta en el mes de julio, incluyendo el

monto de la yenta.

c) El mes en el que se obtuvieron las mayores y menores yentas del departamento 3.

Dato: VEN[5][ 123 {arreglo bidimensional de tipo real que almacena Las yentas mensuales de cinco departamentos de una Unica).

6

Page 264: Fundamentos de programacion - piensa en C

I 248 Capitulo 6. Arreglos multidirnensionales

Problema PS6.3

Escribe un programa que intetvambie las FA filas de un arreglo bidimensional. Los elementos de la primera, fda se intercambian con los de la Ultima fda, los del se-gundo con los de la pendltima, y asi sucesivamente.

Dow: MAT [M] [N] (arreglo bidimensional de tipo real de PA fibs y N columnar, 1 sM s50 y -F

Problema P56.4

Construye un programa en C que, al recibir una matrix cuadrada impar, determine si la misma se puede considerar un cuadrado migico. Los criterion pant formar un cuadrado magic() se especifican en el problems PR6,7,

Dato: CUA (N] [N] (arreglo bidimensional cuadrado impar de NxN elementos, N c 109).

Problema P56.5

Escribe un programa que, al recibir come dates dos arreglos bidimensionales AIM] [N] y B[ N] [ P], calcule el product° de dichos arreglos y almacene el resultado en el arreglo bidimensional C[M] [P],

Datos: A[MI CNr B[N][P] (arreglos bidimensionales males de MxN y NxP eleMent0S,

respectivamente, i 5 FA 59, 1 < N , 1 P 50,

Problema PS6.6

Escribe un programa en C que, al recibir coma dates dos arreglos bidimensiona-les enteros ADIJ ZIA] y a[N] [M], calcule la sums de A Mk la traspuesta de B

(A + BT} y almacene el resultado en el arreglo bidimensional c.

Datos: A[M][N] , N] [ M] (arreglos bidimensionales enteros de MxN y NXM

elementos, respectivamente, 1 5 M 5 56, 1 5 N

Problema P56.7

Escribe un programa. en C que, al recibir come date un arreglo bidimensional de tipo entero, recorra este arreglo en forma de espiral. Observa la siguiente figura.

Page 265: Fundamentos de programacion - piensa en C

. or

I,

4 1

.. I

*

-.-__•,. V

Problemas suplementarios

2491

FIdURA 6.8 Recorrido en forma de espiral en una matriz.

Dato: MAT [M] [N] (arreglo bidimensional de tipo real de radas y N columnas, 1 M 56 y 1 N< 54

Problema P56.8

Escribe un programa en C que, al recibir como dato un arreglo bidimensional de tipo entero, recorra este arreglo columna a columna, tal como se observa en la siguiente figura.

nava 6.9 Recorrido columna a columna en una matriz.

Dato: MAT [in [N] (arreglo bidimensional de tipo real de m filas y N columnas, 1 M 559 y i <N s se).

Page 266: Fundamentos de programacion - piensa en C

250 Capitol° 6. Arreglos multidimensionales

Problerna P56.9

Escribe un programa en C que pennita resolver el problema de las ocho reinas. Este es un problema muy conocido por los amantes del ajedrez. Consiste en co-locar oche reinas en un tablero de ajedrez vacfo (8 x 8) de forma que ninguna de ellas puefia, atacar a las restantes. Es decir, ningdn par de minas puede estar en la misma fila, columna o diagonal.

Problerna P56.10

Escribe un programa en C que permita, resolver el problema del recorrido del ea-balk. Al igual que el problema anterior, e'ste tambi6n es muy conocido por los aficionados al ajedrez. El problema consiste en recorrer en forma completa el tablero de ajedrez (8 x 8) con el caballo, tocando solamente una vez cada En total el recorrido complete consiste de 64 movimientos.

Problerna P56.11

En La Secretarla de 'rurismo de Wilco se alma.cena information sobre el flame-r° de visitantes mensuales de los 10 principales centres turisticos del pals, en los dltimos cinco afies, Construye un programa en C que proporcione la siguiente information;

a) El total de visitantes a cada uno de los centres turfsticos.

b) Los centres turlsticos mis y mews visitados en los dltimos cinco allos, junto con el ndmero de visitantes a calla uno de egos centres.

c) El mes del Ultimo alio con mayor y menor afluencia turistica, junto con el flamer° de visitantes.

Hato: SEC[191[121[5] (arreglo tridimensional de tipo entero que contiene informa-cite sobre los visitantes a los centres turisticos mss importantes del pals).

Probierria P56.12

En la Federation Mexicana de Fdtbol se lleva informacian sobre el ndmero de asistentes mensuales en los diet estadios mss importantes del pals durante los dl-times cinco afios. Construye un programa que genere la siguiente information:

Page 267: Fundamentos de programacion - piensa en C

Problemas suplementarios 251 I

a) El ntimero de asistentes del Ultimo alio en cads estadio, ordenados de mayor a menor.

b) Los estadios que tuvieron b mayor y menor afluencia de pablico en los Illtimos cinco arms, junto con el ndmero de asistentes.

c) El mes del ultimo alio en que calla estadio tuvo la mayor afluencia de pablico, junto con el amero de asistentes.

Data. FUT[7] [1 2][51 (arreglo tridimensional de tipo entero que contiene informa-dOn sobre asistentes a los estadios de fiitbol ink importantes del pals).

6

Page 268: Fundamentos de programacion - piensa en C
Page 269: Fundamentos de programacion - piensa en C

CAPITULO

Caracteres y cadenas de caracteres

7.1. Introduccion

Los datos que una computadora puede procesar se clasifican en simples y estructurados, Esta clasificacion se origina en el niimero de celdas o casillas de memoria que se necesitan para almacenar un dato. Los datos simples tienen la particularidad de ocupar una sob casilla —posiciOn— de memoria. Los enteros, los reales y los caracteres son ejemplos de tipos de datos simples.

Poor otra parte, los datos estructurados ocupan un gnipo de casillas de memoria, Un dato estructurado tiene varios componentes, que pueden ser tipos de datos simples, o bien, estructurados. Los componentes del nivel mas bajo de un tipo estructurado son siempre tipos de datos

Los arreglos —capftolos 5 y 6—, los regimes —capitol° 8— y las cadenas de caracteres son ejemplos de tipos de dates estructurados.

En este capftulo estudiaremos los caracteres y las cadenas de caracteres.

Page 270: Fundamentos de programacion - piensa en C

1 254 Capitulo 7. Caracteres y caderwas de caracteres

7.2. Caracteres Un caracter'* es un tipo de dato simple que representa un mimero, una tetra o cualquier caracter especial disponible del teclado de la mAquina. Cuando se asigna un caracter a una variable tipo char, este siempre se debe escribir entre apO st rofo s ".

EJENFLO 7.1

En el siguiente programa podemos observar diferentes formal para declarar un caracter, aslcomo las funciones de entrada (getchar y scant) y salida (putchar y prints} que permiten trabajar con ellos. Las funciones pertenecen a la biblioteca estAndar de entradalsalida st dio.h.

Programa 7.1

include ‹stdio.h>

1* Funciones pare el manejo de caracteres de la bibliateca StdiCh */

void main(void)

char p1, p2, p3 = '$'

i* Oeclaracidn de las variables tipo caracter p1, p2 y p3. Observe que a p3 se le wwasigna el simbolo $ */ printfrknIngrese un caracter: '); pl=getchar();

1* Se u-tiliza la funcion getchar para leer un caracter. */ putchar(p1);

i* Se u-tiliza la funcion putchar para escribir un unaracter. */ printf('kr0); fflush(stdin); 1* Luego de leer un caracter siempre as conveniente escribir la funcion fflush

*Tara limpiar el Wer, porque generalmente queda con basura y genera un error wpm la ejecucihn del programa. El error se produce porque cuando se ingresa un .data se aprime el return y luego cuando volvemos a leer un caracter a una w■cadena de caracteres se tome a ese return coma el nuevo dato ingresado. *or

printf('knEl caracter p3 es: '); putchar(p3); i* Se utilize la funcion ',Litchi'', pare escribir el caracter almacenado en p3. */

printf('kn');

* La palabra caracter, imariablentente debe it acentuada; pero par comideracian a los usuarios de infonnatica, que suelen usarla sin went°, en este libro la aplicaremos de esta manera.

Page 271: Fundamentos de programacion - piensa en C

7.2 Caracteres 2551

printf('inIngrese atm caracter: '); fflush(stdin); scanf('%c', 42); i* Se puede utilizer scanf con el formato de variable %c pare leer un caracter. */ printf('%c', p2); /* Se puede utilizer printf con el format° de variable %c pare escribir un •caracter. *1

EJEWILO 7.2

En la tabla 7.1 se presenta un resumen de las funciones mas importantes para el manejo de caracteres de la biblioteca etYln.b.

TABLA 7.1. Funciones de la biblioteca ctypa

FunciOn Explicacion

isdigit(p) Regresa 1 si p es un digit° y 0 en caw contrario.

isalpha(p) Regresa 1 si p es una letra y 0 en caw contrario.

is lower (p} Regresa I si p es una letra rnintiscula y 0 en caw conirario.

isupper(p) Regresa 1 si p es una letra n3ayiiscula y 0 en caw contrario.

tolower(p) Convierte de marlscula a rniniiscula. Si la letra es mintiscula no nudifica su valor.

toupper(p) Convierte de mirniscula a rria3rtiscula. Si la letra es mayascula no naodifica su valor,

Veamos en el siguiente programa la aplicacion de las principales funciones de esta biblioteca,

Programa 7.2

N include -cstdio.h> N include cctype.h>

/* Funciones pare el manejo de caracteres de la biblioteca otype.h. */

void main(void)

Page 272: Fundamentos de programacion - piensa en C

256 Capitulo 7. Caracteres y caderias de caracteres

char p1; printf('InIngrese un caracter para analizar si este es un digito: '); p1 = getchar(); if (isdigit (p1)) I* La funcidn isdigit regresa 1 si pi cc un digito y 0 en caso contrario. *1

printf('occ es un digito In', p1); else

printf('‘c no es un digito In', p1);

fflush(stdin); printf('InIngrese un caracter para examiner si este es una letra: '); p1 = getchar(); if (isalpha (pi)) 1* La funcian isalpha regresa 1 si pi es una letra y 2 an caso cantrario. */

printf('%c es una letra In', pi); else

printf('om no es una letra In', p1);

fflush(stdin); priatf('InIngrese un caracter para examiner si este es una letra minuscula: ")r p1 = getchar(); if (isalpha (p1))

if (islower (p1)) /* La funcion islower regress 1 si p1 es una letra minuscula y 2 en can uPcontrario. La funcion isupper, par otra parte, regresa 1 si p1 es una letra maybscula wiy 2 en caso contrario. */ printf('gisc es una letra minuscula In', p1);

else printf('gisc no as una letra minuscula In', p1);

else

printf('%c no es una letra In', p1);

fflush(stdin); printf('InIngrese una letra para convertirla de mayuscula a minnscula: '); p1 = getchar(); if (isalpha (p1))

if (isupper(p1)) printf('%c fue convertida de mayOscula a minuscula In', tolower(p1)); 1* La funcion talower convierte de mayuscula a minuscula. Si la .Tetra es minuscula no la madifica. La funcion taupper, por otra parte, -convierte de minuscula a mayuscula. Si la letra es may6scula no la wqmdifica. *1

else printf('%c as una letra minOscula In', p1);

else

printf('%c no es una letra In', p1);

}

Page 273: Fundamentos de programacion - piensa en C

7.3 Cadenas de caracteres 257 I

7.3. Cadenas de caracteres

Una cadena de caracteres es un tipo de datos estructurado compuesto por caracte-res. En el lenguaje de programacion C, una cadena de caracteres se define come un arreglo de caracteres que termina con el caracter nulo (1 O ). El acceso a una cadena se realiza por medic de un apuntador que sefiala al primer caracter de la cadena. Cuando se asigna una cadena de caracteres a una variable de tipo char, esta se debe escribir entre comillas " ". Observemos a continuacion los siguientes ejemplos.

EIEPAPLO 73

En el siguiente programa podemos observar diferentes maneras para declarar ca-denas de caracteres y asignarles valores. Estudiaremos las funciones de entrada y salida de la biblioteca stdio.h: gets, scan-f, puts y prfntf.

Programa 7.3

Winclude ‹stdia.h>

I* Funciones pare el manejo de cadenas de caracteres de la biblioteca atdio.h. *1

void main(void)

char *cad2 = 'Buenas dias'; f* En este cam se asignan 11 caracteres mss el mocaracter de termination 'kg' a la posician de mamoria a la que apunta la wpvariable cadg --apuntador del tipo cadena de caracteres. *I

char cad1[22] = 'Hola'; 1* Se asignan cuatro caracteres mss el caracter imde terminacion a la variable tipo char cad1. Observe que cad1 tiene espacio wiTara 29 caracteres.*/

char cad2[] = 'Mexico'; f* En este case se asignan seas caracteres (mils wpel caracter de terminacion) a la variable cad2. Observe que cad2 no tiene espacio ftreservado coma cad1; par la tanto, acepta cualquier 'lumen de caracteres. *I

char cad3[] = '1', 'e', 'n', 'v', 'n', '1', 'd', 'a', 'kr}; /* Observe otra forma de asignacion de valores a la variable cad3. *1

char cad4[22], cad5[26], cad.6[2611;

printf('knLa cadene cadg es: '); puts(cad2); I* La funcion puts es la mss apropiada para escribir cadenas de caracteres. wwObserva qua esta funcian baja automaticamente una Linea despues de imprimir wda cadene. *or

Page 274: Fundamentos de programacion - piensa en C

258 Capitulo 7. Caracteres y cadenas de caracteres

printf('OLa cadena cadl es: '); printf('siss', cadl); 1* La funcion printf, can el fermata de variable %s, tambien se puede utilizar uPpara escribir cadenas de caracteres. Baja automiticamente una linea despues wrde escribir la cadena.*/

printf('‘nLa cadena cad2 es: '); puts(cad2); printf('‘nLa cadena cad3 es: '); puts(cad3);

printf('knIngrese una linea de texto --se lee can gets--: kr!'); f* La funcian gets as la mis aprapiada para leer cadenas de caracteres. gets(cad4); printf('OLa cadena cad4 es: '); puts(cad4); fflush(stdin);

printf('knIngrese una linea de texto --se lee can scanf--: '); scanf(9)6e, cad5); f* La funcian scanf, can el formato de variable sbs, tambien se puede utilizer wpara leer una cadena de caracteres, aunque can algunas restriccianes. Si la iwcadena esta formada par varies palabras sala lee la primera. Par ejamplo, si wqueremos ingresar la cadena 'Buenas dies', solo lee la palabra 'Buenos', par w alla esta funcitin unicamente es Ortil si conocemos can anticipacidn que la wicadena qua vamos a leer esta formada par una sola palabra. */ printf('knLa cadena cad5 es: '); printf('968', cad5); fflush(stdin);

char p; int i = 9; /* La declaracion de variables siempre se debe realizar en la parte inicial del wiprograma. En este caso se colocan en esta seccion (char p e int i = 9) para moque puedas observer la relacion directa can las lineas de pragramacion qua se immuestran a continuacion. */ printf('‘nIngrese una linea de text° --se lee cads caracter can getchar--: wpor* Se utilize la funcian getchar pare leer caracteres de la linea de texto y w asignarlos a 101 variable de tipo cadena de caracteres cad6. Observe que se leen . caracteres mientras no se encuentre al caracter que indica fin de linea 'kn'. */

while ((p = getchar())!= 'kn') cad6(i++] = p;

cad6(i] 'kW; f* Al final de la cadena se incarpara el caracter de terminacion NULL pare w indicar el fin de la misma. *or printf('OLa cadena cad6 es: '); puts(cad6);

}

Page 275: Fundamentos de programacion - piensa en C

7.3 Cadenas de caracteres 259

EFE Pal LO 7A

En el siguiente programa podemos observar algunas foams particulares, correc-tas e incorrectas, pars declarar cadenas de caracteres y asignarles valores.

Programa 7,4

#include <stdia.h>

I* Declaracion de cadenas de caracteres y asignacion de valores. *I

void main(void)

char *cede; cad = 'Argentina';

I* La declaracibn y la asignacion son correctas. *1 puts(cadO);

cadO = 'Brasil'; or* Corrects. Se madifica el contenido de la 'mid& en memoria a la que apunta *Os variable cadO --apuntador de tips cadena de caracteres. *1 puts(cadO);

char *cad1; gets(*cad1); gets(cad1); I* Incorrecto. Ambas lectures generan un error en la ejecucion del programa. ImPara que un apuntador de tipo cadena de caracteres se pueda utilizer con la wfuncion de lecture gets, es necesaria inicializarlo como se hace en la siguiente .-instruction. *1

char *cadl = "; gets(cadl); I* Corrects. Primers se le asigna un valor a la posicihn de memoria a la que imapunta cads. Luega podemos modificar el contenido de esta posicibn de memoria ftutilizando la fund& gets. *1

char cad1[]; 1* Incorrecto. Se genera un error en la compilation del programa, porque no • se reserve el especia correspondiente. *1

char cad2[20] r 'Mexico'; or* Correct°. */ puts(cad2); gets(cad2); I* El valor de una cadena (declarada coma cadenallongitudl) se puede modificar *Tor media de lectures a utilizando funcianes de in biblioteca string.h (ejempla 7.6). */ puts(cad2);

Page 276: Fundamentos de programacion - piensa en C

260 Capitulo 7. Caracteres y cadenas de caracteres

cad2[10] = 'Guatemala'; I* Incorrecto. Gbserva cuidadosamente el casa anterior y analiza la diferencia Uque exists con este. Aqui se produce un error en la compilation del programa, oal tratar de asignar la cadena de caracteres 'Guatemala' al caracter 11 de la ocadena. *1 }

EJ ESOP LO 7.5

En el siguiente programa podernos observar la aplicackin de algunas funciones (at oi, atol, strtod, at ol, strtol) para el manejo de caracteres de la biblioteca stdlib.h.

Programa 7.5

*include ‹stdio.h> *include ‹stdlib.h>

/* Funciones para el manejo de caracteres de la biblioteca stdlib.h.

void main(void) { int i; double d; long 1; char cad0[20], *cadl;

printlf"knIngrese una cadena de caracteres: '); gets(cad0);

atoi(cad0); /* La funcion atoi convierte una cadena de caracteres que contiene ndmeros a oun valor de tipo enters. Si la cadena comienza con otro caracter o no ocontiene nnmeros, regresa 0 o el valor queda indefinido. */ printf("knsbs ).t 414', cadO, i+3); /* Se imprime el valor de i+3 para demostrar que i ya fue convertido a un oentero.*/

print1('ImIngrese una cadena de caracteres: '); gets(cad0); d = atoficad0); /* La funcion atof convierte una cadena de caracteres que contiene nimeros oreales a un valor de tipo double. Si la cadena comienza con otro caracter op no contiene nUmeros, regresa 0 o el valor queda indefinido. */ printl("In4ss It %.211 cadO, d+1.50);

d = strtod(cadO, &cad1);

Page 277: Fundamentos de programacion - piensa en C

7.3 Cadenas de caracteres 261

/* La funcion strtod convierte una cadena de caracteres que contiene numeros oreales a un valor de tipo double. El resto de la cadena se almacena en el imsegundo argument° de la luncion, acadi, un apuntador de tipo cadena de .caracteres. Si la cadena no contiene nfteros o comienza con otro caracter, .regresa 0 o el valor queda indefinido. */ printl("In%s ‘t %.211', cad0, d+1.50); putsicad1);

1 = atolicad0); /* La Tuna& atol convierte una cadena de caracteres que contiene numeros a oun valor de tipo long. Si la cadena no contiene nOmeros o comienza con wiotro caracter, regresa 0 o el valor queda indefinido. */ printfr\n%s 'It %Id ', aide, 1+10);

1 = strtol(cadO, &cadl, 0); /* La funcion strtol convierte una cadena de caracteres quo contiene nUmeros a owl valor de tipo long. El rest° de la cadena se almacena en el otro argument° wide la funcion, iicad1. El tercer argumento se utiliza para indicar que la • cadena puede estar en formato octal, decimal o hexadecimal. Si la cadena no ocontiene n6meros o comienza con otro caracter, regresa 0 o el valor queda .indefinido. */ print1C\n%s It %Id', cadO, 1+10); putsicadl);

}

En la siguiente tabla se muestran los resultados que arroja este programa.

TABLA 7.2. Funciones de la bib' ioteca stdlib.h

Corrida Funcion cad0

cad1 Int double long (i+3) (d+1.50) (1+2)

1 atoi(catl) 7sst 10

1 atol (cad) 7sst 8.5

1 strtodicad, &cadl) 7sst set 8.5

1 atol(cad) 7sst 9

1 strtol(cad, &cad1, 0) 7sst sat 9

2 atoi(cad) 7.B9sst 30 10

2 atof(cad) 7.B9sst 30 9.39

2 strtod(cad, &cadl) 7.B9sst 30 set 30 9.39

2 atol(cad) 7.B9sst 30 9

2 strtol(cad, &cadl, 0) 7.B9sst 30 .B9sst 30 9

(Condn4a)

Page 278: Fundamentos de programacion - piensa en C

I 262 Capitulo 7. Caracteres y caderwas de caracteres

TABLA 7.2. (Continuacion)

Corrida Funtion cede

cad1 int double long

(i+a) (d+1.50) (1+2)

3 atoi(cad) s77 3

3 atof(cad) 877 1.50

3 strtod(cad, &cadl) s77 877 1.50

3 atol(cad) 877 2

3 strtol(cad, &cadl, 0) s77 s77 2

EJEPAPLO 7.6

En el siguiente programa podemos observar la aplicaciOn de las principales funciones (strcpy, strncpy, strcat, strncat) para el manejo de cadenas de carac-teres de la biblioteca string .h.

Programa 7.6

#include ‹stdlo.h> #include ‹strIng.h>

/* Funciones de la biblioteca string.h para el manejo de cadenas de caracteres. */

wail main(void)

char *cad0 = 'viola Mikxico'; char cad1[20], cad2(20], cad3(20] buenos diasill';

strcpyfcadl, cad0); /* La funcion strcpy permits copiar una cadena de caracteres completa. En este -caso se copia la cadena call a call. Si el espacio reservado para call es ftmenor que el de call, se genera un error en la ejecucion del programa. */ printlf'%nPrueba de la funcion strcpy. Se copia la cadena cad0 a cadl:

cadl);

strcpyfcadl, cad3); printir1nPrueba de la funcion strcpy. Se copia la cadena cad3 a cadl: imp4m\n', cadl);

strcpyfcadl, 'XX'); printff —OPrueba de la funcion strcpy. Se copia la cadena XX a cadl: ImAm‘n', call);

strncpy(cad2, can, 4);

Page 279: Fundamentos de programacion - piensa en C

7.3 Cadenas de caracteres 263 [

cad2[4] "W; /* La luncion strncpy permits copiar un numero determinado de caracteres a 'metre, cadena de caracteres. En este caso se copian 4 caracteres de in cadena 'wea' --segundo argumento— a cad2 —primer argumento. Siempre se debe wincorporar al final de la cadena el caracter de termination. Si el espacio w+reservado para cad2 es manor que lo que se pretends copiar, se genera imun error en in ejecucion del programa. */ printf('oPrueba de la funcion strncpy. Se copian 4 caracteres de cads a • cad2: %Wm',

cad2);

strncpy(cad2, cad3, 3); cad2[3] '10'; printi('oPrueba de la luncion strncpy. Se copian 3 caracteres de cad3 a ftcad2:

cad2);

strcat(cadO, cad3); /* La funcion strcat permits incorporar una cadena de caracteres a otra twcadena dada. En este caso se agrega la cadena cad3 a cad'. Si el espacio ftreservado para cad. es manor a lo que se debe almacenar se genera un error urde ejecucion. */ printf('‘nPrueba de in funcion strcat. Se incorpora la cadena cad3 a cadO: 1,490,11', cads);

strcat(cadl, ' YY'); orintf('%nPrueba de la funcion strcat. Se incorpora in cadena YY a cadl: wIss\n', cadi);

strcat(cad2, "); strncat(cad2, 'ma, 4); printi('oPrueba de la lunciim strncat. Se incorporan 4 caracteres de can, twa cad2:

%Wm', cad2); /* La luncion strncat permits incorporar un nUmero determinado de caracteres mra una cadena. En este caso se agregan cuatro caracteres de in cadena cads mwa cad2. Si el espacio de cad2 es manor a lo que se debe almacenar ocurre imun error de ejecucion. *1

cad, = strstr(cadO, 'Whico'); print1('‘nPrueba de la funcion strstr. Se trata de localizar la cadena wiNexico dentro de cads: %Film', cads); /* La funcift strstr se utiliza para localizar una cadena de caracteres dentro .de otra cadena. Si la encuentra, regresa un apuntador al inicio de la uprimera ocurrencia de in cadena localizada. De otra forma, regresa NULL. */

cads = strstr(cade, 'Guatemala'); printl( -0Prueba de la funcion strstr. Se trata de localizar la cadena 43uatemala dentro de cad,: cad0);

Page 280: Fundamentos de programacion - piensa en C

264 Capitulo 7. Caracteres y cadenas de caracteres

En la siguiente tabla se muestran los resultados del programa.

TABU Funciones de la biblioteca string .h

Pu nick; n cads cadl cad2 cad3

Hola Mexico , buenos dias I I I

strcpy(cadl, can) Hole Mexico

strcpy(cadl, cad3) , buenos dias I I I

strcpy(cadl , 'XX') XX

strncpy(cad2, cad3, 3) , b

strncpy(cad2, cadO, 4) Hole

strcat(cad2, cad3) Hala Mexico, buenos dias! I I

strcat(cadi, ' YY') XX YY

strcat(cad2, ") Hala

strnoat(cad2, cad2, 4) Hola Hola

cad2 strstr(cada, 'Mexico')

Mexico, buenos dias! I I

cad2 = strstr (NULL)

(cadO, "Guatemala" )

E1EWL03 7.7

En el siguiente programa podemos observar la aplicaciOn de otras funciones im-portantes (st romp, st rlen, st re hr) pant el manejo de cadenas de caracteres de la biblioteca string .h.

Programa 7.7

#include ‹stdia.h> #include <string .h>

/* Ortras lunciones de la biblioteca string .h Para el manejo de cadenas. */

weid main (void) { int i; char cadet(22] = "Hola Mexico";

Page 281: Fundamentos de programacion - piensa en C

7.3 Cadenas de caracteres 265

char cad1[20] = 'Hola Guatemala'; char cad2(20] = 'Hula Venezuela'; char char

cad3[20] *c, c3;

= 'Hola Mixico';

• = strcmp(cadel, cadi); /* La luncion strcmp permits comparar dos cadenas de caracteres. Si la wprimera cadena —en este case cads— es mayor a la segunda wregresa un valor positive; si es manor, un valor negative y de otra forma, we. *

printf('‘nResultado de la comparacien --cads y cadl--: i);

• strcmp(cadO, cad2); printl('‘nResultado de la comparacien —can y cad2--: i);

• stremp(cadO, cad3); printl("aiResultado de la comparacien --cads y cad3--: slid', i);

• strlen(cad0); /* La luncion strlen obtiene la longitud --el nUmero de caracteres-- de wwuna cadena. */ printICIalLongitud cadena cadO: slid', I);

• strlenfcad1); printif' 14nLongitud cadena cadl: i);

c = strchr(cadl, 'G'); /* c es un apuntador de tipo caracter. */

/* La funcien strchr busca la posicion en la qua se encuentra un wwdeterminado caracter en la cadena de caracteres. Si lo encuentra regresa wun apuntador a la primera ocurrencia del caracter en la cadena, de otra wforma regresa NULL. */ if (c != NULL) {

c3 = *c; /* 03 tams el contenide de la celda de memoria a la wipe apunta c.*/

printf("LnEl valor de c3 es: c3); }

c strchr(cad2, 'V'); if (c != NULL) {

c3 = *c; printiClaiEl valor de c3 es! %c', c3);

}

Page 282: Fundamentos de programacion - piensa en C

1 266

Capitulo 7. Caracteres y cadenas de caracteres

En la tabla 7.4 se muestran los resultados que arroja el programa.

To L& 7.4. Otras funciones de la biblioteca st ring. h Funchin cads cad] cad2 icad3 i c3

Hole

Mexico

Hala

Guatemala

Hole

Venezuela

Hole

Mexico

i = strcmp(cadO, cad3} 6

i =strcmp(cadO, cad3) -9

i = strcmp(cade, cad3 0

i = strlen(cadO) 11

i = strlen(cadO) 14

c = strchr(cad1, 'G')

c3= *c G

c = strchr(cad1, 'V')

c3= *c V

7.4. Cadenas de caracteres y arreglos Una cadena de caracteres es un tipo de dates estructurado compuesto por carac-teres. En el lenguaje de programaci6n C una cadena se define como un arreglo de caracteres que termina con el caracter nulo e e Por otra parte, un arreglo uni-dimensional se define come una colecciOn finitai homogalea y ordenada de da-tes, en la que se hace referencia, a cada element° del arreglo per medic de un fndice. El indice se utiliza pate indicar la columna correspondiente. Finalmente, un arreglo bidimeosional se define come una coleccidn finite, homog6nea y or-denada de dates, en la que se hace referenda a cada element° del arreglo por me-dio de dos indices. El primer Lidice se utiliza para. indicar la fila y el segundo pars indicar la columna.

Las cadenas de caracteres se pueden almacenar ficilmente en cualquier tip° de arreglo. Utilizando una representaciOn de este tip° se pueden resolver de manera eficiente una gran cantidad de problemas La finica caracteristica importante que debemos considerar es la. siguiente: "Dada que una cadena se define coma un arruglo unidimensional, si queremos almacenar cadenas de caracteres en arre-gios unidimensionales debemos frabajar de forma similar a coma to hacemos

Page 283: Fundamentos de programacion - piensa en C

7.4 Cadenas de caracteres y arreglos 267 1

con arregtos bidimensionales". En las filas almacenamos las cadenas y en las columnas los caracteres de cada cadena, Es decir, si queremos almacenar un gru-po de 10 cadenas de caracteres de 30 caracteres como maximo en el arreglo uni-dimensional CAR, dste lo debemos declarar de la siguiente forma:

char CAR[101(301;

El primer indice se utiliza para indicar la fib y el segundo para sefialar el carac-ter de la cadena. Si, en cambio, quisi6ramos almacenar cadenas de caracteres en arreglos bidimensionales, tendriamos que trabajar de forma similar a como lo ha- cemos con arreglos tridimensionales. Sin embargo, esta representaciOn es muy pow utilizada. Observemos a continuaciOn el siguiente ejemplo:

EJEPAPLO 7.8

Escribe un programa en C que, al recibir como dato un arreglo unidimensional de tipo cadena de caracteres, determine el rainier° de miraisculas y mayilsculas que hay en cada cadena.

Dato: FM(N)(M) (donde FRA representa el arreglo unidimensional de cadena de caracteres, 1 5 N 5 22, 1 5 M s SO,

Programa 7.8

*include ‹stdio.h> *include ‹string.h> *include ‹ctype.h>

/* Minfisculas y mayCiscules. El programa, al recibir comp dato un arreglo unidimensional de tipo wrcedena de caracteres, determine el numero de minilsculas y mayusculas . que hay en cada cadena. */

void minymay(char cad); 11 Prototipo de funcidn. */

void main(void)

int I, n; char FRA[20][50]; /* Observe comp se declare el arreglo unidimensional de cadena de . caracteres. */

printf("hnIngrese el numero de files del arreglo: '); scani('ksd', &n);

Page 284: Fundamentos de programacion - piensa en C

268 Capitulo 7. Caracteres y cadenas de caracteres

for (1=0; 1<n; i++)

/* Para cada lila se lee la cadena correspondiente. printlf'Ingrese la linea f6d de texto: 1+1); Illushistdin); gets(FRA(1));

} printl("\n‘n'); for (1=0; icn; 1++)

minymayfFRA[1]);

void minymaylchar *cadena) /* Esta lunclon se utiliza para calcular el nUmero de minfisculas imy mayusculas que hay en cada cadena. */

int 1 = 0, mi = 0, ma = 0; while(cadena[1] 1= "10')

if fislower(cadena(1))) mi++;

else if (1supperfcadena[1]))

ma++; 1++;

} print1('1noUmero de letras minusculas: m1); printl(lInNOmero de letras mayusculas: gsd', ma);

}

Problemas resueltos

Problerna PR7.1

Escribe un programa en C que, al recibir como datos una cadena de caracteres y un caracter, determine cudntas veces se encuentra el caracter en la cadena.

flaws: cad (5e), car (donde cad representa una cadena de 50 caracteres como ma-xim y car el caracter).

Page 285: Fundamentos de programacion - piensa en C

Problemas resueltos

269

Programa 7.9

#include <stdio.h>

/* Cuenta caracteres. El programa, al recibir comp datos una cadena de caracteres y un caracter, .cuenta cuintas veces se encuentra el caracter en la cadena. */

int cuenta(char *, char); /* Prototipo de funcidn. */

void mainivold)

char car, cad[50]; int res; printl("InIngrese la cadena de caracteres: '); gets(cad); filush(stdin); printiClInIngrese el caracter: '); car = getchar(); res = cuenta(cad, car); printICIIMAc se encuentra %d veces en la cadena car, res, cad);

}

int cuenta(char *cad, char car) /* Esta funcion se utiliza pare obtener el ndmero de veces que se encuentra gel caracter en la cadena. */

{ int i = 0, r= 0; while Icad[1] 1= '1,0')

if (cad[i] == car) r++;

i++;

} return (r); }

Problema PR7.2

Escribe un programa en C que, al recibir como datos cadenas de caracteres que contienen realer, obtenga la suma y el promedio de dichos mimeros.

Dams: cad,[10], cad2[10], cad,(10), ...,

Donde: cad e] representa la cadena i de 1e caracteres como maxima.

Page 286: Fundamentos de programacion - piensa en C

I 270 Capitulo 7. Caracteres y caderwas de caracteres

Nola: Observa que antes de leer cada cadena se le pregunta al usuario si desea in-gresarla Si su respuesta es afirrnativa —5— entonces se lee, de lo contrario ya no se ingresan ma's cadenas de caracteres.

Programa 7,10

*include ‹stdio.hp. #include ‹stdlib.h>

/* Suma y promedio. El programa, al recibir camp datos varies cadenas de caracteres que .contienen reales, los suma y obtiene el promedio de los mismos. */

woid main(woid)

char c, cad[10]; int i = 0; float sum = 0.0; printff'%nDesea ingresar una cadena de caracteres (S/N)? '); c = getchar(); while (c == 'S')

printi("InIngrese la cadena de caracteres: '); Iflush(stdin); gets(cad); i++, sum += atof(cad); printl("InDesea ingresar otra cadena de caracteres (S/N)? '); c = getchar();

printf('%nSuma: gi5.21', sum); printlf'%nPromedio: 111.2f', sum / I);

Problerna P117.3

Escribe un programa en C que, al recibir coma datos una cadena de caracteres y una posiciOn de la cadena, determine si el caracter correspondiente a la posiciOn dada es una tetra mindscula.

Dams: cad[503, n (donde cad representa una cadena de 50 caracteres y n una variable de tipo entero que representa la posiciOn en la cadena).

Page 287: Fundamentos de programacion - piensa en C

Problemas resueltos

211 [

Programa 7.11

# include ‹stdio.h> # include <ctype.h>

l* Verifica. El programa, al recibir comp datos una cadena de caracteres y una posicidn es-pecifica en la cadena, determine si el caracter correspondiente es una letra mindscula. */

void main(void) { char p, cad(50); int n; printf("LnIngrese la cadena de caracteres (maxim° 50): '); gets(cad); prIntf("LnIngrese la posicion en la cadena que desea verificar: '); scanfirstid', &n); if ((n 0) && (n < 50)) {

p = cad(n-1); if (islower(p))

printlf"%ncilc es una letra mindscula', p); else printf("InIsc no es una letra minuscule', p);

} else

printlf' 10E1 valor ingresado de n es incorrecto'); }

Problema PR7.4

Escribe un programa en C que determine el ralinero de letras mindsculas y ma-ydsculas que existen en una frase.

Pato: cad(50] (donde cad representa la cadena —frase— de 50 caracteres).

Programa 7,12

*include ‹stdio.h> *include ‹ctype.h>

/* Cuenta letras mindsculas y maydsculas. El programa, al recibir comp data una 'Prase, determine el ndmero de letras mcminusculas y maydsculas que existen en la frase. */

void main(void) { char cad(50]; int 1 = 0, mi = 0, ma - 0;

Page 288: Fundamentos de programacion - piensa en C

272 Capitulo 7. Caracteres y caderias de caracteres

printi("LnIngrese la cadena de caracteres {maxima 50 caracteres): getsfcad); whilefcad[i] I= "10') {

if lislawer (cad[i])) mi++;

else if (isupper (cad[1]))

ma++; itt;

printiCIWInNumero de letras mintisculas: 06d', mi); printf('WOmero de letras mayfisculas: %El', ma); }

Problerna PR7.5

Escriba un programa en C que, al recibir comp dato una cadena de caracteres, determine la longitud de la misma sin utilizar la funciOn

Data:. cad 50] (donde cad representa la cadena de 50 caracteres).

Programa 7.13

#include ‹stdio.h>

1* Calcula longitud. El programa calcula la longitud de la cadena sin utilizer la funcian strlen. *1

int cuenta(char *); /* Pratotipo de funcion. *I

void main(void)

int i; char cad[50]; printnIngrese la cadena de caracteres: gets(cad);

= cuenta(cad); printf('‘nLangitud de la cadena: %d', i); }

int cuenta(char *cadena) f* La funcian calcula la longitud de la cadena. It I

int c = 0; while (!cadena[c] == ' 1 1')

c++; return (c); }

Page 289: Fundamentos de programacion - piensa en C

Problemas resueltos

273

La recursividad constituye una altemativa para resolver este problema. A con-tinuacion se mueara la solucion sugerida.

Programa 7,14

#include <stdio.h>

/* Calcula longitud en forma recursiva. El programa calcula de manera recursive in longitud de in cadena sin utilizer mile funcion strlen. */

int cuenta(char *); /* Protatipo de funcien. *f

void main(void)

int i; char cad[62]; printf('1nIngrese in cadena de caracteres: ' ) ; gets(cad);

= cuenta(cad); printf('InLongitud de in cadena: %d', i);

int cuenta(char *cadena) /* Este funcien calcula in longitud In in cadena en forma recursive. Es Imimportante tener conocimientos tanto In piles coma In recursividad pare iwoomprender in solution propuesta, aunque esta sea muy simple. Observe que momientras no lleguemos al ultimo caracter de in cadena, incrementamos la wicuenta en uno y llamamos a la funcian can el siguiente caracter. *I

if (cadena[0] == '19') return 2;

else return (1 + cuenta Ocadena[1]));

}

Problema PR7.6

Escribe un programa en C que, al recibir comp dato una, cadena de caracteres formada por niimeros y letras, en ese Orden, imprima en forma sucesiva cada Tetra tantas veces coma lo indique el ruimero que le precede. Por ejemplo, si la cadena es la siguiente:

3p6c4a5q

El programa debe imprimir:

pppccccccaaaaqqqqq

Page 290: Fundamentos de programacion - piensa en C

# include <stdia.h> # include <ctype.h

/* Decodifica. El programa decodifica una cadena de caracteres compuesta por nbmeros y .Tetras. */

void interpreta(char *); or* Prototipo de funcian. *or

void main(void)

char 00[521; printnIngrese la cadena de caracteres: '); gets(cad); interpreta(cad);

}

void interpreta(char *cadena) f* Este funcion se utilize pare decadificar la cadena de caracteres. */

int i = a, j, k; while (cad[i] != 'l0')

if (isalpha (cad[i])) f* Be utilize isalpha pare observer si el caracter Imes una Tetra. */

k T cad[i - 1] - 48; i* En la variable entera k se almacena el ascii del nOmera --convertido open caracter— que nos interesa, menos 4B que correspande al ascii wpdeldigita 0. *or for (.1 = 2; l < k; j++)

putchar(cad[i]);

I 274 Ca pitulo 7. Ca racte res y caderwas de caracteres

Restrieckin: Los mimeros est& formados por un solo digito (0...9).

Dato: cad(50) (donde cad representa la cadena de 50 caracteres).

Programa 7.15

Problema PR7.7

Escribe un programa en C que, al recibir corno datos dos cadenas de caracteres, determine cuAntas veces se encuentra la segunda cadena en la prirnera. Por ejemplo, si la primera cadena es la siguiente:

sasaasassassssassas

Page 291: Fundamentos de programacion - piensa en C

Problemas resueltos 2751

y la segunda cadena es:

sas

el programa debe regrew: 5

Datos: cada[50], cad1[50] (donde cad y cad1 represent= las cadenas de 50 caracteres coma maxim)

Programa 7.16

ifinclude cstdio.h> #include ‹string.h>

/* Cuenta cadenas. El programa, al recibir dos cadenas de caracteres, calcula a imprime cuantas

ft veces se encuentra la segunda cadena en la primera. */

void main(void)

char cad1[521, cad2[50l, *cada "; int i = a; printf('In Ingrese la primera cadena de caracteres: '); gets(cadl); printf('In Ingrese la cadena a buscar: '); gets(cad2); stropy(cada, cadl); I* Se copia la cadena original a cada. *I cede = strstr (cada, cad2); i* En cada as asigna el apuntador a la primera ocurrencia de in cadena cad2. . si no existe se almacena NULL.*! while (cada != NULL)

i++;

cada - strstr (cada + 1, cad2); f* Se modifica nuevamente in cadena, moviendo el apuntador una

wiposicibn. */

printf('InEl nbmero de veces clue aparece in segunda cadena es: 96d', i); }

Problema PR7.8

Escribe un programa que, al recibir coma date una linea de texto --cadena de caracteres--, escriba esa, linea en forma inverse, Por ejemplo, si la linea de texto dice;

Hama Mexico

Page 292: Fundamentos de programacion - piensa en C

I 276 Capitulo 7. Caracteres y caderwas de caracteres

El programa debe escribic

ocixiM aloH

pato: fra(50) (donde f ra representa la cadena de 50 caracteres como maximo)

Programa 7.17

#include <stdio.h> *include <string.lp.

f* Cadena invertida. EL programa obtiene la cadena invertida. 111

char * inverso(char *); or* Prototipo de funcian. */

void main(void) 4 char fra[52], aux[521; printf('‘nIngrese la linea de texts: '); gets(fra); strcpy(aux, inverso(fra)); /* Se capia a aux el resultada de la funcian wpinversa. */ printf('‘nEscribe la linea de texts en forma inversa: '); puts(aux); }

char * inverso(char *cadena) f* La funcian calcula el inverso de una cadena y regresa el resultado al iwprograma principal. *f 4 int i = 2, j, Ion; char cad; lon = strlen(cadena); .1 = lon-1; while (i < Mon - 1) f 2)) 1* Observe que el reemplazo de las caracteres se debe realizar solamente fthasta la mitad de la cadena. *1 {

cad = cadena[i]; cadena[i] = cadene[j]; cadena[j] = cad; i++;

I - -; } return (cadena);

}

En el siguiente programa se presenta otra forma de resolver el problema, pero ahora de manera recursiva.

Page 293: Fundamentos de programacion - piensa en C

Problemas resueltos

2771

Program 7.18

#include ‹stdia.h,

J* Cadena invertida resuelta en forma recursiva. */

void inversa(char *); f* Protatipo de funcidn. */

void main(void)

char fra[52]; printf('InIngrese la linen de texts: '); gets(fra); printf('InEscribe la lines de text° en forma inverse:

;

inverso(fra);

void inverso(chsr *cadena) J* La funcien inverse abtiene precisamente el inversa de la cadena. La solucien uppresentada es simple, pera para comprenderla es necessria tener conacimientos .tanto de piles coma de recursividad. Observe que mientras no se encuentre el mwcaracter de termination de la cadena, se llama a la funcion recursive can Niel apuntador al siguiente caracter de la cadena. Par atra parte, queda wipendiente de ejecutar --almacenado en una pile— el caracter al cual apunta mi*cadena. */

if (cadena[2]!= '11')

inversa(&cadena[1]); putchar(cadena[2]);

I

Problema PR7.9

Escribe un programa en C que, al recibir como data una cadena de caracteres, determine cuantas palabras se encuentran en dicha cadena. Cada palabra se separa pot media de un espacio en blanco. Por ejemplo, si la cadena es la siguiente:

Mexico es la novena economia del mundo

El programa debe escribir que hay siete palabras.

Data. fra(52] (donde fra representa la cadena de 50 caracteres como maxima).

Page 294: Fundamentos de programacion - piensa en C

I 278

Capitulo 7. Caracteres y cadenas de caracteres

Programa 719

#include ‹stdio.h> #include ‹string.h> ifinclude ‹ctype.h,

f* Cuenta palabras. El programa calcula el nUmero de palabras clue hay en la cadena de caracteres. */

int cuentap(char *); /* Pratatipa de funcion. */

void main(void)

int i; char tra[50]; printf('‘nIngrese la Linea de texto: '); gets(fra); strcat(fra,"); F* Se agrega un espacio en blanco al final de la

imcadena. */ = cuentap(fra);

printf('‘nLa linen de texts tiene cisd palabras', i); }

int cuentap(char *cad)

f* La funcian cuenta el flamer° de palabras clue hay en la cadena de • caracteres. */ char *cadO = "; int i 0; cad0 = strstr(cad,");

/* Se localize el primer espacio en blanco en la wpcadena. */

while (stremp(cad, "))

strcpy(cad, cad0); i++; cadO = strstr (cad + 1,"); or* Se busca un espacio en blanco a partir de la siguiente posician. */

} return (1); }

Problema PR7.10

Eseribe un programa en C que, al recibir como date un arreglo unidimensional de tipo cadena de caracteres, encuentre la cadena de mayor longitud sin utilizar la funciOn strien, y que imprima tanto la cadena como el ntimero de caracteres de la misma.

Page 295: Fundamentos de programacion - piensa en C

Problemas resueltos

279 I

LAM: FRA[n][m] (donde FRA representa el arreglo unidimensional de cadena de caracteres7 1 5 n s 20, 1 m s 50).,

Programa 7.20

#include ‹stdio.hp. #include ‹string.h>

int longitud(char cad); f* Prototipa de funcion. *I

void main(void)

int i, n, 1 = -1, p, t; char cad[50], FRA[20][50]; printfrinIngrese el rainier.° de filas del arreglo: ' ) ; scanf(46d', &n); for (1=0; i<n; i++)

printf('Ingrese la linen %d de texto. Maxima 50 caracteres: i+1); fflush(stdin); gets(FRA[1]); /* Se lee la cadena de caracteres dentra del ciclo.

} printf( —in'); for (1.41; 1<n; i++)

strcpy(cad, FRAM); t - longitud (cad); if (t 5, 1)

{ 1 = t;

P = i; }

} printf('‘nLa cadena can mayor longitud es: '); puts(FRA[p]); printf('InLongitud: 96d', 1);

}

int longitud(char *cadena) i* Este tuna& calcula la longitud de la cadena. Es idintica a la funcion wicuenta del programa 7.13. *f

int cue m 0; while (! cadena[cue] == 'le')

cue++; return (cue);

Page 296: Fundamentos de programacion - piensa en C

1 280 Ca pitulo 7. Ca racte res y caderwas de caracteres

Probtema PR7.11

E5cribe un programa en C que, al recibir come dato un arreglo unidimensional de tipo cadena de caracteres, intercambie las filas del arreglo: da altima con to pritnera, la pentiana con la segwida, y asi sucesivatnente.

faro: FRA[n] [ n] (donde FRA representa el arreglo unidimensional de cadena de caracteres, 1 n 5 20, 1 S in 30).

Programa 7.21

#include <stdio.h> #include <string.h,

void intercambia(char FRA[][30], int); or* Prototipo de funcian. */

void main(void)

int i, n; char FRA[20][30]; printf('‘nIngrese el almero de filas del arreglo: '); scanf('%d', &n); for (i-O; icn; i++)

printf('Ingrese la linen de texto nfimera %d: 1+1); fflush(stdin); gets(FRA[1]);

} printf('‘n‘n'); lntercambia(FRA, n); for (1=0; ion; i++)

printf('Impresian de In linen de texto %d: ', 1+1); puto(FRA[1]);

} }

void intercambia(char FRAM30], int n) /* Esta foul& intercambia las filas del arreglo. */

int i, j; j n - 1; char md[30]; for (1=0; i < (n12); i++)

strcpy(cad, FRAM); strcpy(FRA[1], FRAM); strcpy(FRA[j], cad); j--

Page 297: Fundamentos de programacion - piensa en C

Problemas suplementarios

281 1

Problemas suplementarios

Problema P57.1

Escribe un programa en C que, al recibir como dato una cadena de caracteres, imprima todos los caracteres impares de la cadena.

Dato: cad( 50] (donde cad representa la cadena de 50 caracteres como maximo).

Problema P57.2

Desarrolla un programa en C que, al recibir como dato una cadena de caracteres, escriba solamente los digitos que se encuentren en las posiciones pares.

Dato: cad( 50] (donde cad representa la cadena de 50 caracteres como maximo).

Problema P57.3

Escribe un programa en C que, al recibir como dato una cadena de caracteres cuya longitud maxima sea 30, complete dicha cadena con el caracter si la ca-dena no alcanza el maximo correspondiente. Por ejemplo, si recibe la cadena:

Estructuras de Datos

el programa deberia modificar e impriinir la cadena:

Estructuras de Datos

Dato: cad ( 30] (donde cad representa la cadena de 30 caracteres como maximo).

Problema P57.4

Construye un programa que, al recibir como dato una cadena de caracteres que exprese una fecha en format° (ddimmiaa), genere otra cadena con la mis-ma fecha pero con forrnato (dd de nombre del mes de aaaa). Por ejemplo, si la fecha se ingresa de esta forma:

06/08/05

Page 298: Fundamentos de programacion - piensa en C

282 Capitulo 7. Caracteres y cadenas de caracteres

la nueva cadena debe indicar lo siguiente!

N de Agosto de 2005

Dato: cad (30) (donde cad representa la cadena de 30 caracteres como maxima

Problema P57.5

Escribe un programa que, al recibir coma data una cadena de caracteres, con-vierta el primer caracter de cada palabra si 6sta fuera una letra, de mindscula a mayCtscula. Por ejemplo, si la cadena es la siguiente:

Estructuras de datos, and 2003, edition 2

el programa debe imprimic

Estructuras De battle, Afro 2883, Edict& 2

alto: cad [501 (donde cad representa la cadena de 50 caracteres).

Problema P57.6

Escribe un programa en C que, al recibir como datos cadenas de caracteres, determine cual es la de mayor longitud.

Datos; cad11281, cad21201, calia l281, s

Donde: cad, representa la cadena i de 20 caracteres como mkirno.

Nota: Observa que antes de leer cada cadena se le pregunta al usuarlo si desea ingresarla. Si su respuesta es afirmativa —5—, entonces se lee, de lo contraxio ya no se ingresan ma's cadenas de caracteres.

Problema P57.7

Desarrolla un programa en C que, al recibir como dato un ndmero telefonico en formate, de cadena, lo convierta y escriba de la siguiente manera:

Wilmer° telefdnico: 5256284000

Nueva cadena: (52).5-6284000

Dato: cad (38l (donde cad representa la cadena de caracteres).

Page 299: Fundamentos de programacion - piensa en C

Problemas suplementarios

283 1

Problema P57.8

Escribe un programa en C que, al recibir come dates dos cadenas de caracteres, forme una tercera cadena intercalando las palabras de las cadenas recibidas. Per ejemplo, si las cadenas son las siguientes:

aa ab ac al ap ar ap bc bd be

el programa debe generar una cadena como la siguiente:

aa ap ab bc ac bd al be ap ar

Dates: cadl [50], cad2[591 (donde cadi y cad2 representan las cadenas de 50 caracteres come mtiximo).

Problema P57.9

Escribe un programa en C que, al recibir coma data una cadena de caracteres, imprima la cadena en forma inversa. Por ejemplo, si la cadena es la siguiente:

mundo del economia novena la es Mexico

el programa debe imprimirla, de esta forma:

Mexico as la novena economia del mundo

Date: cad 50] (donde cad representa la cadena, de 50 caracteres come maxima

Problema P57.10

Desarrolla un programa en C que, al recibir come dates varias cadenas de carac-teres, escriba solo aquellas que tengan at inicio la fecha del dfa de hoy. Todas las cadenas tienen el siguiente formato:

06/118/2965 cadena

Datos: cad11591, cad,[59], caii2 [50], S

Donde: cad, representa La cadena i de 50 caracteres come maxim°.

Nokr: Observa que antes de leer calla cadena se le pregunta al usuario si desea, ingresarla. Si su respuesta es afirmativa —5—, entonces se lee, de lo contrario ya no se ingresan ma's cadenas de caracteres.

Page 300: Fundamentos de programacion - piensa en C

1 284 Capitulo 7. Caracteres y caderwas de caracteres

Problema P57.11

Escribe un programa en C que, al recibir come date un arreglo unidimensio-nal de cadenas de caracteres, imprima la cadena que tiene el mayor mimero de vocales.

Date: ARC(101(5e] (donde ARC representa un arreglo de cadena de caracteres de 10 fdas y cada cadena puede tener 50 caracteres come Maximo).

Problems P57.12

Escribe un programa en C que, al recibir come date un arreglo unidimensional de cadenas de caracteres, imprima la cadena que tiene el mayor rnimero de letras maytisculas.

Date: ARC [10 ] (50] (donde ARC representa un arreglo de cadena de caracteres de 10 filas y cada cadena puede tenet- 50 caracteres coma miximo).

Problema P57.13

Escribe un programa en C que, al recibir come date un arreglo unidimensio-nal de cadenas de caracteres, imprima el mimero de palabras que hay en cada cadena.

Date: ARCM 0] (503 (donde ARC representa un arreglo de cadena de caracteres de 10 filas y cada cadena puede tener 50 caracteres come maxima).

Problema P57.14

Escribe un programa en C que, at recibir come date un arreglo unidimensio-nal de cadenas de caracteres, imprima la frecuencia con que aparecen las pala-bras en funcidn de la longitud de las mismas. Per ejemplo, si el arreglo almacena las siguientes cadenas de caracteres —tomadas del libre Et amor en los tiempos de colera, de Gabriel Garcia Mirquez—:

Era inevitable, el olor de las almendras amargas Is recordaba siempre el destino de los amores contrariados. El doctor Juvenal Urbino lo percibio desde que entre, en la casa todavia en penumbras, adonde habia acudido de

urgencia a ocuparse de un caso que para o1 habia dejado de ser urgente

desde hacia muchos aflos.

Page 301: Fundamentos de programacion - piensa en C

Problemas suplementarios 285 1

El programa debe imprimir lo siguiente:

Longitud de la palabra Frecuencia

1 1

2 15

3 6

4 5

5 6

6 6

7 a

B 3

9 3

19 1

11 0

12 1

Dato: ARC[29][ 0,9] (donde ARC representa un arreglo de cadena de caracteres de 20 filas y calla cadena puede tener 80 caracteres como miximo)

7

Page 302: Fundamentos de programacion - piensa en C
Page 303: Fundamentos de programacion - piensa en C

CAPITULO 8 Estructuras y uniones

8.1. Introduccion

Cuando estudiamos arreglos en los capftulos 5 y 6, observamos que representan un tipo de dates estructurado y permiten resolver un gran flamer() de problemas en forma efectiva, Definimos a los arreglos coma una colecch5n finita, homogenea y ordenada de elementos. En este capftulo estudiaremos dos tipos de dates estructurados que se distinguen fundamentalmente de los arreglos porque sus elementos pueden ser heterogeneos, es deck pueden pertenecer —aunque no necesariamente— a tipos de dates diferentes. Estas estructuras de dates reciben el nombre de estructuras y =Jones,

Page 304: Fundamentos de programacion - piensa en C

1 288

Capitulo 8. Estructuras y uniones

8.2. Estructuras

Las estructuras, conocidas genenamente con el nombre de registros, represen-tan un tipo de datos estructurado. Se utilizan tanto para resolver problemas que involucran tipos de datos estructurados, heterogdneos, como para almacenar in-formacidn en archivos —como veremos en el siguiente capita°. Las estruduras tienen varios componentes, calla uno de los cuales puede constituir a su vez un tipo de datos simple o estructurado. Sin embargo, los componentes del nivel ma's bajo de un tipo estructurado, siempre son tipos de datos simples. Formalmente definimos a una estructura de la siguiente manera:

"Una estructura es una coleccion de elementos finite y heterogenea."

Huila porque se puede determinar el namero de componentes y beterogenea por-que todos los elementos pueden ser de tipos de datos diferentes. Cada componente de la estructura se denomina campo y se identifica con un nombre tinico. Los campos de una estructura pueden ser de tipos de datos diferentes como ya hemos mencionado, simples o estructurados; por lo tanto, tambi6n podrfan ser nuevamente una estructura. Para hazer referenda a un campo de una estructura siempre debe-mos utilizar tanto el nombre de la variable tipo estructura como el nombre del campo, En la figura 8.1 se muestra, la representacidn grlfica de una estructura.

Estructura Nombre de la variable tipo estructura

• • •

Segundo campo

Primer campo N-esimo camp()

FIGURA 8.1

Representacion grdfica de una estructura

Page 305: Fundamentos de programacion - piensa en C

8.2 Estructuras

289

EFEPAIILO 8.1

Considerernos que por cada alumna de una universidad debemos almacenar la si-guiente informacion:

• Matricula del alumna (entera).

• Nombre del alumna (cadena de caracteres).

• Carrera del alumna (cadena de caracteres).

• Promedia del alumna (real).

• Dircccidn del alumna (cadena de caracteres).

La estructura de datos adecuada para almacenar esta informaciOn es la estructu-ra. Cabe aclarar que no es posible utilizar un arreglo para resolver este proble-ma, porque sus componentes deben ser del mismo tipo de datos. En la figura 8,2 se muestra la representaci6n g 'rdfica de este ejemplo.

Alumna

Matricula Nombre Carrera Promedio

Domicilio

FIGURA 8.2 Representacion grafica de la estnicturu del ejemplo 8-1

El primer campo de la estructura es Matricula; el segundo, Nombre; el tercero, carrera, y asi sucesivamente. Si queremos acceder entonces al primer campo de la estructura debemos escribir variable -d e -t ipo -sett-Li ctura -Alumno.Matricula.

Si en cambio queremos hacer refe:rencia al domicilio del alumno escribimos variable -de -tipo -estructura -Alumno.Domicilio,

8.2.1. Declaration de estructuras

Observemos a continuacion diferentes formas de declarar estructuras con la ex-plicacion correspondiente,

EJERWLO 8.2

En el siguiente programa podemos observar la forma en que se declara la estruc-tura del ejemplo 8.1, asi coma tambidn diferentes formas en que los campos reci-ben valores.

Page 306: Fundamentos de programacion - piensa en C

1 290

Capitulo 8. Estructuras y uniones

Programa 8.1

Oinclude cstdia.h, Oinclude ‹string.h,

1* Estructuras-1. EL programa muestra la manera en que se declare una estructura, asi coma la wwforma en que se tiene acceso a las campus de las variables de tip° estructura wirtanta pare asignacidn de valares coma pars lecture y escritura. *1

struct alumna

1* Declaraci6n de la estructura. *1

int matricula; char nombre[22]; char carrera[22]; 1* Campos de la estructura. */ float promedio; char direccion[20];

}; 1* Observa que is declaracion de una estructura termina can punto y

iwcoma. *I

void main(void)

f* Observa que las variables de tips estructura se declaran coma cualquier otra o variable. al, a2 y a3 Kin variables de tipa estructura alumna. *1 o struct alumna al = {122, 'Maria', 'Contabilidad', 8.9, 'Queritaro'}, a2, a3; f* Los campas de al reciben valares directamente. *1

char mn[22], car[22], dir[22]; int mat; float pro;

1* Los campus de a2 reciben valares par media de una lecture. *1

printf('inIngrese la matricula del alumna 2: '); scanfl'fisd', 8,a2.matricula); fflush(stdin); printf('Ingrese el nambre del alumna 2:'); gets(a2.nambre); printf('Ingrese la carrera del alumna 2: '); gets(a2.carrera); printf('Ingrese el promedia del alumna 2: '); scang's6r, 8,a2.promedia); fflush(stdin); printf('Ingrese is direccion del alumna 2: '); gets(a2.direccian);

f* Las campos de a3 reciben valares par media de asignaciones. printf('‘nIngrese la matricula del alumna 3: '); scanf('96d', Banat); a3.matricula = mat; fflush(stdin); printf('Ingrese el nombre del alumna 3: '); gets(nom);

Page 307: Fundamentos de programacion - piensa en C

8.2 Estructuras 2911

strcpy(a3.nombre, nom); printf('Ingrese is carrera del alumna 3: '); gets(car); strcpy(a3.carrera, car); printf('Ingrese el promedia del alumno 3: '); scanf('kr, &pro); a3.promedio = pro; fflush(stdin); printf('Ingrese is direcciin del alumna 3: '); gets(dir); stropy(a3.direccian, dir);

f* Observe la forma en que se imprimen los campos de ai y a2. */ printf('InDatos del alumna 10'); printf('%dkn', al.matricula); puts(al.nambre); puts(al.carrera); printf('%.2f0', al.promedia); puts(al.direccion);

printf('indatos del alumna 20'); printf('%dkn', 02.matricula); puts(a2.nombre); puts(a2.carrera); printf('%.2f0', a2.promedia); puts(a2.direccian);

or* Observe otra forma de escribir las campos de la variable de tipo estructura 53. */ printf('knOatos del alumna 31n'); printf('% it %s it %s kt %.2f it %s', 0.matricula, a3.nombre, a3.carrera,

a3.pramedio, a3.direccion);

1

EJEWL0 83

In el siguiente programa podemos observar diferentes formas en que los campos de las variables declaradas como apuotadores de una estructura reciben valo-res, asi coma tambidn el acceso a los campos de estas variables.

Programa 8.2

ffinclude ‹string.h5

or* Estructuras-2. El programa muestra la manera en que se declara una estructura, asi coma la .forma en que se tiene acceso a los campos de los apuntadares de tipo estructura motanto pare lectura coma pare escritura. Se utiliza ademas una funcion que o recibe coma parametra un apuntadar de tipo estructura. *f struct alumna or* Declaracidn de la estructura. *f i

Page 308: Fundamentos de programacion - piensa en C

I 292 Capitulo 8. Estructuras y uniones

int matricula; char mambre[20]; char carrera[20]; float pramedia; char direccion[20];

};

I* Campos de la estructura alumna. */

void Uectura(struct alumna *); /* Prototipo de funcion. *1

void main(vaid)

struct alumna 0 = {120, 'Maria', struct alumna *03, *a4, *a5, a6; 1* Observa quo las variables *03,

'Contabilidad', B.9, 'Queretaro'};

*a4 y *a5 se declaran coma mpuntadares de w+tipo estructura alumna. a6 es una variable de tips estructura alumna. */

a3 = &AO; f* En este caso al apuntador de tipo estructura alumna a3 ftse le asigna la direccion de la variable de tipo estructura alumna, al. *1

04 = new (struct alumna); /* Hata quo al apuntador ail es necesario asignarle una direccion de memoria. o Para tener access a los campus de un apuntador de tipo estructura, utilize una wwde los dos farmatos siguientes:

apuntador-›camps a bien

(*apuntador)..campo

En la lectura de los campos de la variable a4 se utilizan coma ejemplo ambos wpformatos. */ printfl'inIngrese la matricula del alumna 4: • ) ; scanf('ciad', &(*a4).matricula); fflush(stdin); printf('Ingrese el nombre del alumna 4: '1; gets(a4->nombre); printf('Ingrese la carrera del alumna 4: • ) ; gets((*a4).carrera); printf('Ingrese promedia del alumna 4:

; scanf('W, 3a4-;-promedia); fflush(stdin); printf('Ingrese la direccidn del alumna 4: '); gets(a4-direccion);

as = new (struct alumna); Lectura(a5); f* En este casa se pass el apuntador de tipo estructura alumna 15 a la funcion Lectura. *1

Lectura(826); I* En este coca se pass la variable de tipo estructura alumna a6, mwa la funcion Lecture. Observa qua en este case debemos utilizar el aperador de imdireccion pare preceder a la variable. *I printf('inDatos del alumna 3'); 1* Observa la forma de escribir los campus de los apuntadores de tipo .estructura. *1

Page 309: Fundamentos de programacion - piensa en C

8.2 Estructuras 293j

printf('gallit960.t96sit96.2fkt96s', a3->matricula, a3->nombre, a3->carrera, 4e3-,-promedio, a3->direccion);

printf('infiatos del alumna 40'); printf('96d‘fts‘tgiss‘t96.2f‘t96s', a4-'matricula, a4->nombre, a4->carrera,

wq4->promedio, e4-,direccian);

printfirindatos del alumna 50'); printf('cidlitsissitgissitkrktIss', a6-'matricula, a6->nombre, a6->carrera,

4a5->promedia, a5->direccion);

printf('Indatos del alumna 60'); /* Observe is forma de escribir los campos de is variable tips estructura. */ printf('96d 1"0.tcissitik..2fitga', a6.matricula, a6.nombre, a6.carrera,

■►a6.promedia, a6.direccion); I

void Lectura(etruct alumna *a) /* Esta funcion permits leer las campos de un apuntadar de tipo estructura imalusno. *1

printf(inIngrese la matricula del alumna: '); scanf('sbd', &(*a).matricula); fflush(stdin); printfirIngrese el umbra del alumna: '); gets(a->nombre); fflush(stdin); printf('Ingrese la carrera del alumna: '); gets((*a).carrera); printf('Ingrese el promedio del alumna: '); scanf('cisr, &a->pramedia); fflush(stdin); printf('Ingrese la direccinn del alumna: '); gets(a->direccian); 1

8.2.2. Creation de sinonirnos o alias

La instruccian typedel perrnite al usuario definir alias o SinonimOS, es deck, nue-vos tipos de datos equivalentes a los ya existentes. El objetivo de esta instrucci6n consiste en utilizar nombres [Ms apropiados y mds cortos para los tipos de datos, puesto que evitamos escribir la palabra struct en la declaracion de las variables.

La instrucciOn t ypedef se puede utilizar tanto con tipos de datos simples como con estructurados. Con los tipos de datos simples su use no resulta muy practico, ma's bier es redundante. Per ejemplo, si tenemos que declarar cinco variables de tipo entero, Cl 5 C2, C3, C4 y Cs, para un problema en particular, lo hacemos de esta forma:

Page 310: Fundamentos de programacion - piensa en C

typedef struct

int matricula; char nambre[20]; char carrera[20]; float pramedia; char direccion[28];

} alumna;

/* Oecleraci6n de la estructura utilizanda typodoll.* f

I* aluino es el nueva tipo de datos creada par el .usuaria. *I

void Lecture (alumna *); /* Protatipo de funcion. Observe que al hater creada Niel tipo de date's definido par el usuaria alumni', se elimina la necesidad de Iwescribir la palabra struct antes de alumna en el parametra. *or

void main(void)

alumna aO = 028, 'Maria', 'Contabilidad', 8.9, 'Queritarcel, *a3, *a4, *a5, a6; f* En este caso se evite escribir la palabra struct en la declaracidn de las

tipa alumna. *or . . .

294

Capitulo 8. Estructuras y uniones

int C1, C2, C3, C4, C5;

Si en cambio utilizaramos la instruccion typedef, tendriamos que escribir las siguientes instrucciones:

typedef int cantadar;

I* Se declare un tipa de dates definida par el • usuaria, contador en este casa, equivelente al tipa de data . int. */

void main(void) . . . cantadar C1, C2, C3, C4, C5; /* Posteriormente, ya sea en el programa principal a en una funcion, wodeclaramas las variables Cl, C2, C3, C4 y CS coma de tips contador. *f . . .

En los tipos de datos estructurados, especificamente en las estructuras, su use es importante ya que elimina la necesidad de escribir reiteradamente la palabra struct

cada vez que hacemos referencia a una variable o apuntador de tipo estructura. Observemos a continuaciOn la modificaciOn que realizamos al programa 8.2.

Page 311: Fundamentos de programacion - piensa en C

8.2 Estructuras

295 1

8.2.3. Estructuras anidadas

Las estructuras representan un tipo de datos estructurado, que tiene par lo tanto varios componentes. Cada uno de estos componentes puede a su vez ser un tipo de datos simple o estructurado. Las estructuras anidadas se presentan cuando en b declaraciOn de una estructura, per lo menos uno de sus componentes es una estructura. Observemos el siguiente ejemplo.

EPERWL0 8.4

Consideremos que en una empresa requieren almacenar la siguiente informacidn de cada empleado:

• Nombre del ernpleado (cadena de caracteres).

• Departarnerto de la empresa (cadena de caracteres).

• Sueldo (real). • Dornicilio

• Calle (cadena de caracteres).

• Numero (entero).

• COdigo Postal (entero).

• LocaWad (cadena de caracteres).

A continuacion se observa la representaciOn grafica, de esta estructura:

Empleado

Nombre Departamento 1 Sueldo

Domicillo

Calle NGmero CP Localidad

FIGURA 8.3

Representac fon grilfica de una estructura anidada

El programa, muestra la manera coma se declara una estructura anidada, asi come la forma de acceso a los campos de cada una de las variables o apuntado-res de tipo estructura, tanto para, lea= coma para escritura. Observa que para la lectura de los dates de alguna,s variables y apuntadores de tipo estructura se utiliza una funciOn.

Page 312: Fundamentos de programacion - piensa en C

#include ‹stdio.h> string.h>

1* Estructuras-3. El programa muestra la manera en qua se declare una estructura anidada, asi Immo la forma de acceso a los campus de las variables o apuntadores de tipo uestructura, tanto pare lecture coma pare escritura. Se utilize ademAs una o funcion clue recite coma paremetro un apuntador de tipo estructura. *,

typedef struct

i* Declarecion de la estructura domicilio utilizando o un typedef. *i {

char calle[20]; int numero; int cp; char localidad[20];

} domicilio;

struct empleado f* declaration de la estructura anidada empleado. */

};

char nambre[22]; char departamento[29]; float sueldo;

domicilio direccion; I* direccion es un campo de tipo estructura wPdomicilio de la estructura empleado. *i

void Lectura(struct empleado *a) ir* Funcian clue permite leer los campus de un apuntador de tipo estructura o empleado. *1

printf('inIngrese el metre del empleado: '); gets(a->nombre); fflush(stdin); printfl'Ingrese el departamento de la empresa: '1; gets(a->departamenta); printf('Ingrese el sueldo del empleado: '); scanf('W, aa->sueldo); fflush(stdin); printf('---Ingrese la direccion del empleado---'); printf('‘nitCalle: '); gets(a-direccion.calle); printf(ANUmero: '); scanf('96d', aLa->direccion.numero); printf(Codigo Postal: '); scanf('iler, ata->direccion.cp); fflush(stdin); printf('‘tLocelidad: ');

X 296

Capitulo 8. Estructuras y uniones

Programa 83

Page 313: Fundamentos de programacion - piensa en C

8.2 Estructuras

297

gets(a->direccion.localidad);

void main(void)

struct empleada eia = {'Arturo', 'Campras', 16532.75, 'San Jeronimo', 122, ft32192, 'Toluca'};

struct empleada *el, *132, e3, e4; /* Se declaran diferentes variables y apuntadares de la estructura empleado opera que el lector pueda apreciar tambien las diferentes formes en que las o campos reciben valores. */

or* En al programa principal se leen los campas de una variable, e3, y un wiapuntador de tipo estructura, *el. *f el = mew (struct empleada); printf('‘nIngrese el nombre del empleada 1: '); scanf('%s', Wel).nombre); fflush(stdin); printf('Ingrese el departamento de la empresa: '); gets(el->departamento); printf('Ingrese el suelda del empleada: '); scanf("%r, 8,e1->sueldo); printf('---Ingrese la direction del empleada---'); printf('inlitCalle: '); fflush(stdin); gets(el--nlireccion, calle); printfrAll(Imera: '); scanf(Nd', &el->direccion.numera); printf('1tCodigo Postal: '); scanf(Nd', &el->direccion.cp); printf('ItLocalidad: '); fflush(stdin); gets(el-,direccian.localidad);

printf('%nIngrese el nombre del empleada 3: '); scanf('%s', &e3.nombre); fflush(stdin); printf('Ingrese el departamento de in empresa: '); gets(e3.departamenta); printf('Ingrese el sueldo del empleada: '); scanf('lsr, 8te3.sueldo); printf('---Ingrese la direction del empleada---'); printf('inlitCalle: '); fflush(stdin); gets(e3.direccian.calle); printf('itliumera: '); scanf(Nd', 8e3.direccian.numero); printf('1tCodigo Postal: '); scanf(Nd', &e3.direccion.cp); printf('ItLocalidad: "); fflush(stdin); gets(e3.direccion.localidad);

Page 314: Fundamentos de programacion - piensa en C

1298 Capitulo 8. Estructuras y uniones

f* En la funcien Lecture se leen los tempos de una variable, e4, y un apuntador o de tipo estructura, *52. */ e2 = new (struct empleado); Lectura(e2);

Lectura(&e4);

printf('\nOatos del empleado 1\n'); printf('galtgalt%.2ntsssit9oiltg6dIkties', el->nombre, el->departamento, 1.081>suelda, e1->direccion.calle, e1->direccion.numero, el->direccion.cp, wHM->direccion.localidad);

printfi'lLnDatos dal empleado printf('96s\tgalkt%.2nt4selktgaikt4sdins', e4.nombre, e4.departamento, e4.sueldo, 4e4.direccion.calle, e4.direccion.numero, e4.direccion.cp, e4.direccion.localidad); }

8.2.4. Estructuras con arreglos

Existen numerosos casos en la vida real en los que para resolver un problema de manera eficiente necesitaanos utilizar estructurns combinadas con arreglos. Observemos el siguiente ejemplo, en el que uno de los campos de h estructura es a su vez otro arreglo.

ExLo 8.5

En una escuela almacenan la informaciOn de sus alumnus utilizando arreglos unidimensionales. La siguiente informaciOn de coda, alumno se guarda en una estructura:

• MatrIcula (entero).

• Nombre y apellido {cadres de caracteres). • Prornedios de las materias (arreglo unidirnensional de reales).

MAO: ARRE(N) 41.011de ARRE es un arreglo unidimensional de tipo ALUMNO, 1 S N 5 100.

Escribe un programa en C que obtenga lo siguiente:

a) La matricula y el promedio de calla alumni).

b) Las matriculas de los alumnos cuya calificaciOn en h tercera materia sea mayor a 9.

c) El promedio general de ]a rnateria 4.

Page 315: Fundamentos de programacion - piensa en C

8.2 Estructuras 2991

Prognuna 8.4

#include <stdia.h, #include <string.h>

1* Escuela. El programa genera informacion estadistica de los alumnos de una escuela. *f

typedef struct 1* Oeclaracian de la estructura alumna utilizando un .typedef. *I

int matricula; char nombre[33]; float cal[5]; /* Observe quo el campo de la estructura alumna as un arreglo imunidimensional. *1

alumna;

void Lectura(alumno, int T); void F1(alumno *, int TAM);

/* Prototipos de funciones. *f

void F2(alumno *, int TAN); void F3(alumno *, int TAN);

void main(void)

alumna ARRE[52]; 1* Se declare un arregla unidimensional de tipo alumni). */ int TAN; do

printf('Ingrese el Umiak' del arreglo: '); scanf('90', &TAM);

I while (TAN 5. 52 TAM < 1); 1* Se verifica qua el tamaho del arreglo sea

.corrects. *or

Lectura(ARRE, TAM); F1(ARRE, TAM); F2(ARRE, TAM); F3(ARRE, TAM);

}

void Lectura(alumno A[], int T) /* La funcion Lecture se utilize pare leer un arregla unidimensional de tipo imestructura alumna de T elementos. *1

int I, J; for (I-2; I<T; I++)

printf('‘nIngrese las dates del alumna 964'1 1+1); printf('\nIngrese la matricula del alumna: '); scanf('gsd', &A[I].matricula);

Page 316: Fundamentos de programacion - piensa en C

I 300 Capitulo 8. Estructuras y uniones

fflush(stdin); printfrIngrese el nombre del alumno:'); gets(A[I].nombre); for (J-1; J.5; J++)

printf('Wngrese la calificacibn %d del alumna %d: J+1, 7+1); scanf('%f', &A[7].cal[JI);

void F1(alumno A[], int T) f* La funcion Fl obtiene la matricula y el promedio de cada alumna. *1 { int I, J; float SUM, PRO; for (1=9; I<T; I++) {

printf('OMatricula del alumna: 96e, A[I].matricula);

SUM - 0.0; for (J=0; J<5; J++)

SUM = SUM + A[I].cal[J]; PRO = SUM f 5; printf('‘t‘tPramedia: 96.2r, PRO);

void F2(alumno A[], int T) f* La funcion F2 obtiene las matriculas de las alumnos cuya calificacion en la •tercera materia es mayor a 9. */ { int I; printf('‘nAlumnos con calificacian en la tercera materia > 9'); for (I=9; IcT; I++)

if (A[I].cal[2] > 9) printnMatricula del alumna: 96d', A[l].matricula);

}

void F3(alumno A[], int T) 1* Esta funcion obtiene el pramedio general del grupo de la materia 4. *1 4 int I; float PRO, SUM = 0.0; for (I=0; I<I; I++)

SUM = SUM + A[I].cal[3]; PRO = SUM 1 T; printf('in‘nPromedia de la materia 4: 96.21—, PRO);

Page 317: Fundamentos de programacion - piensa en C

8.3 Uniones 301 i

8.3. Uniones Las uniones representan tambidn un tipo de clatos estructurado. Son similares a las estructuras. Sin embargo, se distinguen fundamentahnente de 6stas porque sus miembros comparten el mismo espacio de almacenamiento en la memoria inter-na rapida de la computadora. Son muy ladles para ahorrar memoria. Sin embargo, es necesario considerar que solo pueden utilizarse en aquellas aplicaciones en que sus componentes no reciban valores al mismo tiempo. Es deck, solo uno de sus componentes puede recibir valor a la vez. El espacio de memoria reservado para una union corresponde a la capacidad del campo de mayor tartaric).

Fotmalmente definimos una union de la siguiente manera:

'Una union es una coleccion de elementos finita y heterogAnea, en la cual solo uno de sus componentes puede recibir valor a la vez.'

8.3.1. Declaration de uniones

La declaracion de uniones es similar a la de estructuras. Observemos a continua-cion en el siguiente ejemplo la forma de declarar uniones.

EJEMPLO 8.6

Supongamos que debemos almacenar la siguiente infonnacift de cada alumno de una universidad:

• Matrfcula del alumna {antes). • Nombre del alumna (cadena de caracteres).

• Carrera del alumna (cadena de caracteres). • Promedio del alumna (real).

• Tele'fono celular (cadena de. caracteres).

• Correa electronic° (cadena de caracteres).

El programa muestra la manera en que se declara una union, asi como la forma en que se tiene acceso a los campos de cada una de las variables de tipo union, tanto para lectura como para escritura. Observa que en algunas variables de tipo estructura se utiliza una funciOn para la lectura de los datos.

Page 318: Fundamentos de programacion - piensa en C

#include ‹stdio.h> string.h,

1* Unianes. EL programa muestra la manera como se declare una union, asi cams la forma de ftecceso a los campos de las variables de tipo union tanto pare asignacion w oe valores coma pare lecture y escritura. *or

union Batas 4

char celular[15]; char correo[22];

1;

typedef atruct

/* Declaracion de una union. *1

or* Declaracion de una estructura utilizanda typedef. *1

int matricula; char nombre[22]; char carrera[22]; float promedia; union datos personales; or* Observe que uno de los campos de la estructura alumno es una union. */

} alumna;

void Lectura(alumno a); f* Pratatipa de funcion. *1

void main(void)

alumna al - {128, 'Maria', 'Cantabilider, 8.9, '5-158-42-50'}, a2, a3; /* Observe que solo al primer componente de una union puede recibir valores par o madio de este tipo de asignacianes. *1

f* Para que puedas observer las diferentes formes en que los campos de las . variables de tipo estructura alumna reciben valores, ingresamos las valares wwde los campos de tree formes diferentes. Los campos de al reciben valores Imdirectamente, los campos de a2 se leen en el programa principal, y los campos wirde a3 reciben valores a traves de una funcion. *1 printf('Alumno 2\n'); printf('Ingrese la matricula: '); scanfl'fisd", &a2.matricula); fflush(stdin); printf('Ingrese el nombre: '); gets(a2.nombre); fflush(stdin); printf('Ingrese la carrera: '); gets(a2.carrere); printf('Ingrese el promedia: "); scanf('96r, 3a2.promedia); fflush(stdin);

I 302 Capitulo 8. Estructuras y uniones

Programa 8.5

Page 319: Fundamentos de programacion - piensa en C

printf('Ingrese el correo electr6nico: '); gets(a2.personales.correa);

/* Observa que en la variable a2 de tips estructura alumna el Segundo campo de la ft union recibe un valor. */

printf('Alumno 30'); Lectura(&a3); f* Se llama a una funcion pare leer los campos de la variable a3. *1

/* Impresion de resultadas. */ printf('‘ndatos del alumna 10'); printf('96d0', ai.matricula); puts(al.nombre); puts(al.carrera); printf('96.2f0', al.promedio); puts(al.personales.celular); /* Observe que ascribe el valor del telefano celular asignado. *1 imputs(al.personales.correo); } 1* Observe qua si tratamas de imprimir el campo oorreo, ascribe basura. *1

strcpy(ail.persanales.correa, 'hgimenezehotmail.com'); or* Se ingresa ahora un valor al segundo camps de la union de la variable ma. *1

puts(aa.personales.celular); or* Ahora escribe basura en el campo del telefono celular. *1 puts(ae.personales.correa); 1* Escribe el contenido del camps (hgimenezfhotmail.com). *1

printf('ifflatas del alumna 20'); printf('96d0', a2.matricula); puts(a2.nombre); puts(a2.carrera); printf('96.2f0', a2.promedia);

puts(a2.personales.celular); puts(a2.personales.correo);

i* Escribe basura. *i f* Escribe al cantenido del segunda campo. *1

printf('Ingrese el telefona celular del alumna 2: '); fflush(stdin); gets(a2.personales.celular);

puts(a2.personales.celular); i* Escribe el telefono celular ingresado. *1 puts(a2.personales.correa); /* Ahara ascribe basura. */

printf('‘ndatos del alumna 30'); printf('96d0', a3.matricula); puts(a3.nambre); puts(a3.carrera); printf('96.2f0', a3.promedio); puts(a3.personales.celular); puts(a3.personales.carrea);

}

/* Escribe basura. *1

8.3 Uniones 303

Page 320: Fundamentos de programacion - piensa en C

I 304 Capitulo 8. Estructuras y uniones

void Uectura(alumna *a) /* La funcion Lecture se utilize para leer los tempos de tins variable de tipo ftestructura alumna. */

printf('nIngrese la matricula: '); scanf('ciad', &(*a).matricula); fflush(stdin); printf('Ingrese el nambre: "); gets(a->nombre); fflush(stdin); printf('Ingrese la carrere: '); gets((*a).carrera); printf('Ingrese el promedia: '); scanf("96f", &a->pramedio); printf('Ingrese el telefona celular: '); fflush(stdin); gets(a-personales.celular);

}

Problemas resueltos

Problema PR8.1

Una comercializadora farmacdutica distribuye productos a distintas farmacias de la Ciudad de Me'xieo. Para elo almacena en un arreglo unidimensional, ordenado de menor a mayor en funciOn de la dome, toda la information rebtiva a sus pro-ductos:

• Claw del product° (entoro).

• Nombre del product() (cadena de caracteres).

• Existencia (entero).

• Precio unitario (real).

Dato: Iry (N] (donde Iry es un arreglo unidimensional de tipo PRODUCT° de N

elementos, i 5 N 1 De),

Realise un programa en C que construya los siguientes modulos:

a) Yentas, El modulo registra la yenta de diferentes productos a un cliente —farrnaciam ❑btiene el total de la yenta y actualiza el inventario corres-pondiente. El fm de datos para la yenta de un cliente es 0.

b) Reabastecimiento. Este modulo permite incorporar productos —cantidades-al inventario. El fin de datos es 0,

Page 321: Fundamentos de programacion - piensa en C

Problemas resueltos 305

c) Nuevos Productos. El modulo permite incorporar nuevos productos al inventario. Los productos se encuentran ordenados en el arreglo per su slave. El fin de dates es 0.

Inventario, El modulo permite imprimair el inventario complete,

En la siguiente figura se muestra la representaciOn grafica de la estructura, de da-tos necesaria para resolver este problema.

INV: Arreglo unidimensional de tips estructura product°

INV

[dave I nombre precio existencia I dave nombrel precio existencia

dave nombre I precio existencia

Product° 1

Producto 2

Producto 100

Fstructura producto

FlaUltA 8.4 Reptesentacidn gtrifica de la estructura de dams necesaria para el probkma PR8.1

Programa 8.6

#include ‹stdio.h> #include ‹string.h>

J* Comercializadora farmaceutica. El programa maneja information sabre yentas, inventario, reabastecimiento y .nuevos productos de una comercializadara farmaceutica. */

typedef atruct

int clove; char nombre[15]; float precis; int existencia;

} producto;

f* Declaracia de la estructura product°. *i

void Lectura(producto *, int); /* Prototipos de funciones. void Ventas(producto *, int); void Reabastecimiento(producta *, int); void Nuevas_Productos(praducto *, int *); void Inventaria(praducto *, int);

Page 322: Fundamentos de programacion - piensa en C

I 306 Capitulo 8. Estructuras y uniones

void main(void)

producto INV[100]; f* Se declara un arregla unidimensianal de tipo estructurs product°. *I int TAM, OPE; do

printf('Ingrese el nosier° de productos: •); scanf('sisd', &TAM);

} while (TAN > 100 fl TAM < 1); ir* Se verifica que el nOmero de productos ingresadas sea correct°. *i Lectura(INV, TAM); printf('‘nIngrese operation a realizar. 1n1t1t1 Ventas \n‘tU 2 - olleabastecimiento Wtkt

3 - Nuevas Productas InU‘t 4 - Inventario ILn\t‘t 0 - Salir: '); scanf('gisd', &OPE); while (OPE)

switch (OPE) {

case 1: Ventas(INV, TAN); break;

case 2: Reabastecimienta(INV, TAM); break;

case 3: Huevos_Praductos(IHV, &TAM); ir* Se pasa al par metro por referencia, porque se puede modificar al imprilmero

de elementos del arregla en la funcion. *I break;

case 4: Inventario(IMV, TAM); break;

1; printf('inIngrese operacian a realizer. \W1tkt1 - Ventas 1n1t1t 2 ImAeabastecimiento

knktit 3 - Nuevos Productos ‘n‘t‘t 4 - Inventaria 4rOcht a - Salir: '); scanf('sisd', &OPE);

} }

void Lectura(producta A[], int T) 1* Esta funcion se utilize pare leer un arregla unidimensional de tipo

tructure product° de T elementos. *1

int I; for (1=0; ITT; I++)

printf('inIngrese information del product° 7+1); printf('in‘telave: '); scanf('gsd', &A[I].clave); fflush(stdin);

Page 323: Fundamentos de programacion - piensa en C

Problernas resueltos 307

printf('‘tNombre:"); gets(A[I].nombre); printf('‘tPrecio:"); scanfr%f°, &A(I].precia); printftExistencia: "); scanf("%d', &A[I].existencia);

void Ventas(producto A[], int T] /* Esta funcion se utilize pars manejar las vents a un cliente. Se ingresan iipproductos y cantidades, el fin de datos esta dado per el cero. Mamas de wpobtener el total de las yentas, se actualize el inventario. */

int CLA, CAN, I, RES; float TOT, PAR; printf("lnIngrese clove del producto -3 pare salir-: '1; scanf("0", &CLA);

TOT = 3.0; while (CLA)

printfrlitCantidad: '); scanf("%d", &CAN); I = 3; while ((I < T) && (A[I].clave < CLA)) I* Se realize una busqueda pare localizar is clove del producto. *f

I++; if ((I == T) 11 (A[I].clave CLA))

printf('uiLa clove del producto es incorrecta"); else

if (A[I].existencia >= CAN) /* Se analiza si el stock es suficiente pare satisfacer el pedido. if

A[I].existencia -= CAN; ir* Se actualize el stock del producto. */ PAR = A[I].precio * CAN; TOT += PAR;

} else

printf('InNo existe en inventario la cantidad solicitada. Solo hay %d', A[I].existencia);

printf(' linLos lleva 1 - Si - No?: "); scanf("%4', &RES); if (RES)

PAR = A[I].precio * A[I].existencia; A[I].existencia = 3; /* El stock queda en cero. *I TOT += PAR;

Page 324: Fundamentos de programacion - piensa en C

I 308 Capitulo 8. Estructuras y uniones

printf('‘nIngrese la siguiente slave del producto -9 pare salir-:); scanf('9ed', &CLA);

} printf('tATotal de la yenta: gisr, TOT); }

void Beabastecimiento(producto A[], int T) f* Este funnier' se utilize pare reabastecer al inventario. *1

int CLA,CAN,I; printf('tLnIngrese slave del product° -2 pare salir-: '); scenf('oW, &CLA); while (CLA) {

I = 2; while ((I < T) && (A[I].clave < CLA))

I++; if ((I==T) (A[I].clave CLA))

printf('‘nLa slave del products ingresada es incorrecta'); else {

printf('ILtCantidad: '); scanf( -9sd', &CAN); A[I].existencia += CAN;

} printf('tAIngrese atra slave del producto pare salir-: '); scanf('9ed', &CLA);

} }

void Nuevas_Praductos(producta AM, int *T) f* Fete funcion se utilize pare incorporar nuevos productos al inventaria. 'waled° que los productos se encuentran ordenados par slave, puede suceder que u-el inserter un nuevo producto hays que mover los elementos del erreglo pare oque continuen ordenados. *1

int CLA, I, J; printf('‘nIngrese slave del products -2 pare salir-: '); scenfrke, &CLA); while ((*T < 30) && (CLA))

1=0; while ((I < *T) && (A[I].clave < CLA))

i* Msqueda de la posicion que le corresponds a CLA en el arregla. *1 I++;

if (I == *T) /* Se inserta el element° en la Ultima posicion. */

A[I].clave = CLA; printf('tLtNombre:'); fflush(stdin); gets(A[I].nombre);

Page 325: Fundamentos de programacion - piensa en C

Problemas resueltos 309 [•

printf('ktPrecio:'); scanf('isr, &A[I].precio); printf('ktCantidad: '); scanfri9r, &A[I].existencia); *T = *T + 1;

} else

if (A[l].clave == CLA) printf('knEl product° ya se encuentra en el inventario');

else

for (.7=*T; J>I; J--) f* Se inserta el nuevo producto en el arreglo. Se mueven una pasician

ima is derecha los elementos del arreglo que tengan una slave de product° mayor a la ingresada. *1

A[J] = A[d-1]; A[l].clave = CLA; printf('ktNombre:'); fflush(stdin); gets(A[I].nombre);

printf('ktPrecio:'); scanf('W, &A[I].precio); printf('ktCantidad: '); scanfrsbd', &A[l].existencia); *T *T + 1;

} printWknIngrese otra slave de producto -2 pare salir-: ' ) ; scanf('gisd', &CLA);

} if (*T == 30)

printf('knYa no hay 'Bawl° pare incorporar nuevos praductos');

void Inventario(producto AM, int T) J* Este funcion se utilize pare escribir la informacian almacenada en --el oinventario— un arreglo unidimensional de tipo estructura producto de T ftelementos. *1

int I; for (I= I<T; I++)

printWknClave: A[I].clave); printf('ktilombre: 96a', A[I].nombre);

printf('ktPrecia: A[I].precio); printf('ktExistencia: 9ed kn', A[I].existencia);

Page 326: Fundamentos de programacion - piensa en C

Pro r1141

I 310 Capitulo 8. Estructuras y uniones

Problema PR8.2

En una escuela guardan la informaciOn de sus alumnos utilizando arreglos unidi- mensionales. Se registra la siguiente informaciOn de cada alumno en una estructura:

• Matricide del alumna (emzra).

• Nombre- y apellido (cadera de caracteres). • Materias y prornedios (arreglo unidimemianal de estructura).

• Maeda (cadena de caracteres).

• Prom-di° (real).

Darr): ALU[N j, donde ALU es un arreglo unidimensional de tipo ALUM° (1 < N < 50.

Escribe un programa en C que obtenga lo siguiente:

a) La matricula y el promedio general de cada alumno.

b) Las matriculas de Ws alumnos cuya calilicaci6n en la tercera materia sea mayor a 9.

c) El promedio general de la materia 4.

Nola: H problema es similar al del ejemplo 8.5. Varia en la forma de almacenar las calificaciones del alumno. Ademas de estas, aparece el nombre de la materia.

En la siguiente figura se muestra la representacion grAfica de la estructura de da-tos necesaria para resolver este problema.

ALU: Arreglo unidimensional de tipo estructura alumno

Fstnictura alumno K

ALU

ma cal

matrinoml I 1 rnattrinom -nr1T-n onr-7 m

Alumna 1/ Alumna 2 Alumno 50

Estructura matpro cal: Arreglo unidimensional de tipo estructura matpro

FiGuRA 8.5 Reptesentacion grdfica de la estructura de datos necesaria para resolver el problema PR8.2

Page 327: Fundamentos de programacion - piensa en C

Problemas resueltos 311

Prognma 8.7

#include ‹stdia.h> #include <string.h

/* Escuela. El programa genera informacion importante de las alumnos de una escuela. */

typedef struct

or* Declaracion de la estructura matpro. *,

char mat[20]; /* Materia. */ int pro; /* Pramedio. */

} matpro;

typedef struct

f* Declaracion de la estructura alumna. */

int matri; /* Matricula. */

char nom[20]; /* Hombre del alumna. */ matpro cal[5]; /* Observe que cal as un arreglo unidimensional de tips

.estructura aatpro --la estructura definida en primer termina. */

} alumna;

void Lectura(alumno * , int); void F1(alumno *, int); void F2(alumna *, int);

/* Protatipas de funcianes. */ void F3(alumno *, int);

void main(void)

alumno ALU[50]; f* ALU as un arreglo unidimensional de tipo alumna. *f int TAM; do

printf('Ingrese el tamefla del arreglo: '); scanfr964', &TAM);

} while (TAM > 50 H TAM < 1); /* Be verifica que el tamano del arreglo sea

wrcorrecta. */

Lectura(ALU, TAM); F1(ALU, TAM); F2(ALU, TAM); F3(ALU, TAM);

}

void Lectura(alumno A[], int T) f* Este funcibn se utilize pare leer la informacion de un arreglo unidimensional .de tipo estructura alumna de T elementos. */

Page 328: Fundamentos de programacion - piensa en C

I 312 Capitulo 8. Estructuras y uniones

int I, J; for(I-1; I<T; 1++)

printf('inIngrese los datos del alumna 26d', 1+1); printf('InIngrese la matricula del alumna: '); scanf('iad', &A[I].matri); fflush(stdin); printf('Ingrese el nombre del alumna:']; gets(A[I].nom); for (J=0; J<5; J++) {

printf('‘tMateria %d: J+1); fflush(stdin); gets(A[I].cal[J].mat); printf(Promedia J+1); scanfr%d', SLA[I].cal[J].pro);

void F1(alumno A[], int T) 1* Esta funcion se utiliza pare abtener la matricula y el promedio general de wpcada alumna. *1

int I, J; float SUM;

for (1=0; I<T; I++)

printf('‘nMatricula del alumna : %d', A[I].matri); SUM = 0.0; for (J=0; J<5; J++)

SUM = SUM + A[1].calkfl.pro; SUM - SUM f 5; printf('itPromedia: 96.2f', SUM);

void F2(alumno AM, int T) 1* Esta funcion se utiliza pare abtener las matriculas de los alumnae cuya iwcalificacien en la tercera materia es mayor a 9. *1

int I; printf('‘nAlumnos con calificacion mayor a 9 en la tercera materia'); for (1=0; I<T; I++)

if 04[1].cal[2].pro > 9) printf('‘nMatricula del alumna : %d', A[I].matri);

void F3(alumno A[], int T) f* Esta funcion se utiliza para obtener el pramedia general de la cuarta materia. *I

Page 329: Fundamentos de programacion - piensa en C

Problemas resueltos 313 I

int I; float SJM = 2.2; for (I-9; 1<T; I++)

SUM = SUM + A[I].cal[S] .pro; SUM .= SUM 1 T; printf('in‘nPromedio de la cuarta materia: %.2r, SUM);

}

Problema PR8.3

En un hospital almacenan la siguiente informacion de sus pacientes:

• Nombre y apellido (cadena de caracteres). • Edad (entero). • Solo (caracter), • Condicion (entero). • Domicilio (estructura).

• Calle (cadena de caracteres). • Nurnero (entero). • Colonia (cadena de caracteres). • CCidigo Postal (cadena de caracteres). • Ciudad (cadena de caracteres).

• Tele'fono (cadena de caracteres).

Dato: HOSPITAL(N) (donde HOSPITAL es un arreglo unidimensional de tipo estructura PACIENTE, i N s 122).

Nag,: Condicion se refiere al estado de salud en que ingresa el paciente. Los valores que toma condicion van de 1 a 5, y 5 representa el maxima grado de gravedad.

Escribe un programa en C que genere lo siguiente:

a) El porcentaje tanto de hombres coma de mujeres registrados en el hospital.

b) El niimero de pacientes de cada una de las categorlas de condicion,

c) El nombre y teleTono de todos los pacientes que tuvieron una condicion de ingreso de maxima gravedad (5).

En la siguiente figura se muestra la representacion grafi' ca de la estructura de datos necesaria para resolver este problema.

Page 330: Fundamentos de programacion - piensa en C

dom.

1111

cal cia TIMM col cp

1 d - I I Odall$0101COR tel

Paciente 2 Paciente 100

eon sexo 1111

dom Paciente I

edadsexo tel nom nom

#include ‹stdio.h> #include 4string.h,

f* Hospital. El programa genera information acerca de los pacientes de un hospital. *f

typedef struct

char cal[20]; int num; char pol[2S]; char cp[5]; char ciu[26];

domicilio;

I* Declaracion de la estructura dosicilio. * f

/* Calle. */ i* Niimero. */ i* Colonia. */ or* Cadigo Postal. /* Ciudad. */

typedef struct or* Declaration de la estructura paciente. *1

char nom[29]; or* Sambre y apellida. *i int edad; char sexo; int can; domicilia dom;

char tel[10]; paciente;

or* Candicihn. *f i* Observa clue el camps des es de tipo estructura

*f /* Telefon°. */

void Lectura(paciente *, int); void Fl(paciente *, int); void F2(paciente *, int); void F3(paciente *, int);

void main(void)

or* Prototipos de funciones. */

314 Capitulo 8. Estructuras y uniones

HOSPITAL: Arreglo unidimensional de tipo estructura paciente

Estruct urn paciente z' ..... , . ..„ + HOSPITAL

Estructura domiciiiu

FIGURA &6

Representacion grdfica de la estructura de datos necesaria para resolver el problem PR8.3

Programa 8.8

Page 331: Fundamentos de programacion - piensa en C

Problemas resueltos 315 j

paciente HOSPITAL[M]; f* Arregla unidimensional de tipo estructura impaciente. *or int TAM; do

printf('Ingrese el rainier° de pacierrtes: '); scarrWkd', STAN);

1 while (TAM > 5O TAN .‹ 1); f* Se verifica qua el tamaho del arreglo sea

wipcorrecta. */ Lectura(HOSPITAL, TAM); F1(HOSPITAL, TAN); F2(HOSPITAL, TAN); F3(HOSPITAL, TAN);

}

void Lectura(paciente A[], int T) /* Este funcifin se utilize pare leer un arreglo unidimensional de tipo woestructura paciente de T elementos. *f

int I; for (I=2; ITT; I++)

printf('‘n‘titPaciente %d', 1+1); fflush(stdin); printf('ONombre: '); gets(A[1].nom); printf('Eded: '); scarrf('%d', SA[I].edad); printf('Sexo (F-H): '); scanf('gisc', SA[I].sexa); printf('Condicion (1..5): '); scarrf('%d', SA[1].con); fflush(stdin); printWILtCalle: '); gets(A[I].dom.cal); printf('ILtNhmero: '); scanf('gsd', SA[1].dom.num); fflush(stdin); prirrtf('Malania: '); gets(A[I].dom.col); fflush(stdin); printf('‘tCadigo Postal: '); gets(A[I].dom.cp); fflush(stdin); printf('1tCiudad: '); gets(A[I].dam.ciu); fflush(stdin); printf('Telefono: '); gets(A[I].tel);

}

void F1(paciente A[], int T)

Page 332: Fundamentos de programacion - piensa en C

I 316 Capitulo 8. Estructuras y uniones

f* Esta funcien se utiliza pare obtener el porcentaje tanto de hombres coma de wroujeres registrados en el hospital. *1

{ int I,FEM, MAS, TOT; for (1=0; I<T; I++)

switch (A[I].sexo)

case 'F': FEN++; break;

case IP: MAS++; break;

} TOT = FEN + NAS; printf('tLnParcentaje de Hombres: 96.2f s', (flost)MAS 1 TOT * 100); printf('nParcentaje de Mujeres: 96.2#5,e, (float)FEN or TOT * 100); }

void F2(paciente AM, int T) f* Esta funcion se utiliza pare obtener el nhmero de pacientes clue ingresaron al wrhospital en coda una de las categorias de condician. *1

int I, C1 = 0, C2 = 2, C3 = 0, C4 = 0, C5 = 2; for (1=0; I<T; I++)

switch (A[l].con)

case 1: C1++; break;

case 2: C2++; break;

case 3: C3++; break;

case 4: C4++; break;

case 5: C5++; break;

} printf('ON(Imero pacientes en candici6n 1: 96d', C1); printf(ANUmero pacientes en condician 2: fisd', C2); printf('‘nNUmera pacientes en condition 3: %d', C3); printf('‘nNUmero pacientes en condician 4: %d', C4); printf('‘ndamero pacientes en condicion 5: 96d', C5); }

void F3(paciente A[], int T) f* La funcion F3 se utiliza pare generar el nombre y telefono de todos las w+pacientes qua tuvieran una condicifin de ingreso de maxima gravedad (5). *1

int I; printf('timPacientes ingresados en estado de gravedad'); for (1=0; I<T; I++)

if (4[I].con == 5) printfC\nNombre: gastirtTel6fana: A[I].nom, A[I].tel);

Page 333: Fundamentos de programacion - piensa en C

Problema PR8.4

Una empresa de bienes rakes de Lima, Per6,11eva informadOn sobre las propieda-des que tiene disponibles tanto para yenta come para rent.

• alive de la propiedad (cadena de carackeres). • Superfieie cubierta (real). • Superficie terreno (real). • CaraderLstRas (cadena de caracteres). • Ubicacidn geografica.

• Zona (cadena de caracteres). • Calle (cadena de caracteres). • Colonia (cadena de caracteres).

• Precio (real). • Disponibilidad (caracter).

Data PROPI Et NJ (donde PROPIE es un arreglo unidimensional de typo estructura PROPI MACES, i 5 N 180),

Escribe un programa en C que realise lo siguiente:

a) Un listado de las propiedades disponibles para yenta en la zona de Mfraflores aiyo valor oscile entre 450,000 y 650,000 nuevos soles.

b) Al recibir una zona geogrlfica y un cierto range respecto at monto, obtenga un listado de today las propiedades disponibles para rents.

Nota: El listado debe mostrar lo siguiente: slave de la propiedad, superficie cu-bierta, superficie total, cara.cteristicas, calle, colonic y precio.

En la siguiente figura, se muestra la representacion grafica de la estructura de da-tes necesaria para resolver este problema.

Problernas resueltos 317 I

Page 334: Fundamentos de programacion - piensa en C

#include cstdia.h> #include ‹string.h>

f* Sienes raices.

El programa maneja informacion sobre las propiedades que tiene una empresa imde bienes raices de la ciudad de Lima, Pero, tanto para vents comp para torenta. */

typedef struct

char zona(20];

char callepel; char colo(20];

} ubicacian;

typedef struct

{ char clave[5];

float sou; float ste; char car[5411]; utlicacion ubi;

float precio; char dispo;

} propiedades;

/* Declaraciem de la estructura ubicacion.*/

/* Colonia. *f

/* Declaracion de la estructura propiedades.*/

f* Superficie cubierta. *I i* Superficie terrena. *1 /* Caracteristicas. *1

/* Observa que este camp° as de tipo estructura ubicaciors. */

/* Disponibilidad. */

void Uectura(propiedades , int); void Fl(propiedades *, int); void F2(propiedades *, int);

f* Prototipos de funciones. *f

to CSC dispo ubd

1 I pecioldispo

318 Capitulo 8. Estructuras y uniones

PRONE: Arreglo unidirnensional de tipo estructura propiedades

MOVIE

lo lave

Propiedad 1 /

Propiedad 2

Propiedad 100

Zan calk ea.)

Enructuradomicilia

Ft~unA &7

Reptesentaelein grafica de la estructura de datos necesaria para resolver el probletna PR8.4

Programs 8.9

Estructura propiedader;

11,

scu ste clove Sell I Ste I Cir precioldiT'D SPA Ste air

Page 335: Fundamentos de programacion - piensa en C

Proble m as resueltos 319

void main(uoid)

propiedades PROPIWOO]; /* Se declare un arreglo unidimensional de tipo estructura propiedades. */ int TAM; do

printf('Ingrese el nbmero de propiedades: '); scanf('96d', SIAN);

} while (TAM > lea H TAM < 1); /* Se verifica que el tamano del arreglo sea correcto. */ Lectura(PROPIE, TAN); F1(PROPIE, TAM); F2(PRGPIE, TAM);

}

void Lectura(propiedades AM, int T) /* Esta funcian se utilize pare leer un arreglo unidimensional de tipo estructura impropiedades de i elomentos. */

int I; for (I=; 1<r; I++)

printf('WtIngrese datos de la propiedad 9eid', I + 1); printWOClave: '); fflush(stdin); gets(A[l].clave); printf('Superficie cubierta: '); scanf('261— , &A[l].scu); printf('Superficie terreno: '); scanf('961— , EA[l].ste); printf('Caracteristicas: '); fflush(stdin); gets(A[l].car); printf('qZona: '); fflush(stdin); gets(A[l].ubi.zona); printWILtCalle: '); fflush(stdin); gets(A[l].ubi.calle); printWqColonia: '); fflush(stdin); gets(A[l].ubi.colo); printf('Precia: '); scanf('261", &A[l].precio); printf(Misponibilidad (Venta-V Renta-R): '); scanf('9sc', 8A[I].dispo);

Page 336: Fundamentos de programacion - piensa en C

I 320 Capitulo 8. Estructuras y uniones

void F1(propiedades AM, int T) 1* Este funcion se utilize pare generar un listado de las propiedades U disponibles pare yenta en la zone de Miraflores, cuyo valor oscila entre mw452,000 y 654,00e nuevos soles. *1

int I; printf('‘MtitListado de Propiedades pare Venta en Miraflores');

for (1=6; IcT; I++) if ((A[I].dispo == 'V') 24 (strcmp (A[I] ubi.zon a, 'Miraflores') == 0))

if ((A[I].precio = 45e200) && (A[I].precio

00200))

printf('‘nClave de la propiedad: ');

puts(A[I].clave); printf('‘nSuperficie cubierta: %f', A[I].scu); printf('inSuperficie terreno: gar, A[I].ste); printf('‘nCaracteristicas: '); puts(A[I].car); printf('Calle: '); puts(A[I].ubi.calle);

printf('Colonia: '); puts(A[I].ubi.colo); printf('Precio: A[I].precio);

} }

void F2(propiedades A[], int T)

f* Al recibir coma dates una zone geogrifica de Lima, Peru, y un cierto rango wirespecto al manta, este funci6n genera un listado de todas las propiedades o disponibles pare renta. *1

int I; float li, ls; char zon[23];

printf('‘n‘titListado de Propiedades pare Renta'); printf('inIngrese zone geogrifica: '); fflush(stdin); gets(zon); printf('Ingrese el limite inferior del precia:'); scanf('W, &li); printf('Ingrese el limite superior del precia:');

scanf('W, &is); for (1=e; ITT; I++)

if ((A[I].dispn == 'R') && (strcmp (A[I].ubi.zana, zon) —2)) if ((A[I].precia P.= li) && (A[I].precio c= Is))

printf('linClave de la propiedad: '); puts(A[I].clave);

printf('inSuperficie cubierta: %d', A[I].scu); printf('‘nSuperficie terreno: gad', A[I].ste);

Page 337: Fundamentos de programacion - piensa en C

Problemas resueltos 321 1

printf('OCaracterieticas: '); puts(A[1].car); printf('Calle: '); puts(A[1].0i.calle); printf('eolonia: '); puts(A[I].ubi.colo); printf('Precio: %.2f', A[1].precio);

} }

Problema PR8.5

En una empresa de articulos dome'sticos almacenan la siguiente informacidn de cada uno de sus vendedores:

• Nilmero vendedor (entero). • Nombre y apellido (cadena de caracteres). • Ventas del afro (arreglo unidirnensional de reales). • Domicilio (estructura).

• Calle y Milner° (cadena de caracteres), • Colonia (cadena de caracteres). • Codigo Postal (cadena de caracteres). • Ciudad (cadena de caracWres),

• Salario mensual (real). • Clave forma de pago (entero), • Forma de pago (union).

• Banco (estructura). • Nombre del banco (cadena de caracteres). • Ntimero de cuenta (cadena de caracteres).

• Ventanilla (caracter).

DatO: VENDEDDRES[N] (donde VRIDEDORES es un arreglo unidimensional de tipo estrueturaVENDEDOR, 1 S NiaO),

Notas: yentas del ano es un arreglo unidimensional de 12 elementos de reales, en el que se almacenan las ventas de los empleados en cada uno de los meses. Forma de page es una union en la que se almacena la forma de pago al emplea-do: cuenta de cheques, nOmina o ventanilla, En los dos primeros casos se utiliza una estructura para ahnacenar el nombre del banco y el ntirner0 de cuenta del empleado.

Page 338: Fundamentos de programacion - piensa en C

I 322

Capitulo 8. Estructuras y uniones

Escribe un programa en C que realise lo siguiente:

a) Obtenga las ventas totales anuales de cada uno de los empleados.

b) Incremente 5% el salad° a todos aquellos empleados cuyas yentas anuales superaron $1,500,000.

c) Liste el ntimero de empleado, el nombre y total de yentas, de todos aquellos vendedores que en el ano vendieron menos de $300,000.

d) Liste el ntimero de empleado, el nombre del banco y el minter° de cuenta de todos aquellos empleados a quienes se les deposita en cuenta de cheques.

En la siguiente figura se muestra la representaciOn grAfica de la estructura de da-tos necesaria Para resolver este problema,

VENDEDORES: Arreglo unidimensional de tipo estructura vendedor Fstructura vendedor,

VENDEDORES

num 110

sal da num 1:101:11 sal cia num sal cla

Vendedor 1 Vendedor 2 Vendedor 100

yenta

norm _Union fpago == no ncu

Eirtructura Wilco Eirtrudura banco domi

col cP dui

ftrucitradandMo

FIGURA &8 Representacion grcifica de la estructura de datos necesaria para resolver ei problem PR8.5

Programa 8.10

#include ‹stdio.h> #include qrtring.h>

f* Vendedores. El programa maneja informacihn sabre las yentas que realizan los vendedores de

iwarticulos domesticos de una importante empresa de la Ciudad de Mexico. *f typedef struct or* Declaracion de la estructura banco. */

Page 339: Fundamentos de programacion - piensa en C

Problemas resueltos 323

char noba[12]; char nucu[12];

} 'moo;

typedef union

banco che; banco nomi; char yenta;

} fpago;

typedef atruct

char cnu[22]; char col[22]; char cp[5]; char ciu[15];

} domicilia;

typedef atruct 4

int num; char nom[20]; float ven[12]; domicilio demi; float sal;

fpago Patio; int cla;

} vendedar;

1* Nombre del banco. *i 1* Homer° de cuenta. */

1* Declaration de la union fpago. *I

I* Cheque. Campo de tipo estructura banco. *I 1* Melina. Campo de tips estructura banco. *I 1* Ventanilla. *I

1* neclaracian de la estructura domicilio. *I

I* Calle y rainier°. *I 1* Colonia. *i 1* Codigo Postal. *f 1* Ciudad. *1

1* DeclaraciOn de la estructura vendedor. *1

1* Him ern de vendedar. *1 f* Nombre del vendedar. *I 1* Ventas del afro. Arreglo unidimensional de tipo real. *1 1* domi es de tips estructura domicilio. *1

f* Salaria mensual. *or I* pago as de tips m iGn fpago. *I 1* Clave forma de pago. *1

void Lectura(vendedor *, int); void F1(vendedor *, int); void F2(vendedor *, int); void F3(vendedor *, int); void F4(vendedar *, int);

/* Prototipos de funciones. *1

void main(void)

vendedar VENDEDORES[100]; or* Declaracion dal arreglo unidimensional de tipo estructura vendedor. *1 int TAM; da

printf('Ingrese el namero de vendedares: '); scanfi'9dd', &TAM);

} while (TAM > lea I I TAM < 1); i* Se verifica que el nomero de elementos del arregla sea correct°. */ Lecture (VENDEDORES, TAM); F1 (VENDEDORES, TAN); F2 (VENDEDORES, TAM);

Page 340: Fundamentos de programacion - piensa en C

I 324 Capitulo 8. Estructuras y uniones

F3 (VENDEDORES, TAM); F4 (VENDEDORES, TAM); printf('oltFIN DEL PROGRAMA');

}

void lactura(vendedar A[], int T) 1* Esta funcion se utiliza pare leer un arregla unidimensional de tipa imestructurs vendedor de T elementas. */ { int I, J; for (1=a; I<T; I++)

printf('‘n‘tIngrese datas del vendedor 9sd', 1+1); printf('‘nNfimera de vendedor: '); scanfr96d', &A[1].num); printf('Nombre del vendedor: '); fflush(stdin); gets(A[I].nom); printf('Ventas del oho: kn'); for (J=a; J02; J++)

printf('ktMes ', .1+1); scanfr261—, 8LA[1].ven[J]);

1 printf('Domicilia del vendedor: '); printf('ItCalle y numero: '); fflush(stdin); gets(A[I].dami.cnu); printf('‘tColania: '); fflush(stdin); gets(A[I].domi.col); printf('ItCodiga Postal: '); fflush(stdin); gets(A[I].domi.cp); printf('Iteiudad: '); fflush(stdin); gets(A[I].domi.ciu); printf('Salario del vendedor: '); scanf('sisr, &A[1].sal);

printf('Forma de Pago (Banco-1 N6mina-2 Ventanilla-3):

; scanf('sd', &A[1].cla); switch (.4[1].cla)

case 1:{ printfMtNambre del banal:

; fflush(stdin);

gets(A[1].pago.che.noba); printfMtNOmera de cuenta:

; fflush(stdin);

gets(A[1].pago.che.nucu);

}

Page 341: Fundamentos de programacion - piensa en C

Problem as resueltos 325 I

break; case 2:i

printfr‘tHombre del Banco:

; fflush(stdin);

gets(A[I].pago.nomi.naba); printfr‘tkimera de cuenta: ' ;

fflush(stdin); gets(A[I].pago.nomi.nucu);

} break;

case 3: A[I].paga.venta = 'S'; break;

}

} }

void F1(vendedor AM, int T) i* Esta funcion se utilize para generar las yentas totales anuales de cads uno wide los vendedores de la empresa. *i

int I, J; float SUM; printfr\n‘t‘tVentas Totales de los Vendedores'); for (I-3; I<T; I++)

printf('‘nVendedor: %d', A[l].num); SUM = 0.2; for (J=6; J<12; J++)

SUM += A[1].ven[d]; printf('‘nVentas: %.2f1n', SUM);

} }

void F2(vendedor A[], int T) i* Este funcion se utilize para incrementar 5% el miliaria de todos aquellos mivendedares cuyas yentas anuales superaron $1,540,323. *1

int I, J; float SUM; printf rintchtIncremento a los Vendedores con Ventas n 1,503,2 for (I-3; I<T; I++)

SUM = 0.0; for Wei; J<12; J++)

SUM += A[I].ven[J]; if (SUM > 1506206.02)

A[I].sal = A[I].sal * 1.35; printfr‘nNUmero de empleado: %d‘nVentas: %.2fInNuevo salario: %.2f',

A[l].num, SW, A[I].sal);

}

Page 342: Fundamentos de programacion - piensa en C

I 326 Capitulo 8. Estructuras y uniones

void F3(vendedor A[], int T) irk Este funcion se utilize pare generar un listada de tadas aquellos a+vendedores que en el Oa vendieran menas de pakage. */

int I, J; float SUM; printf('‘n‘titVendedares con Yentas < ,999'); for (1=2; I<T; I++) 4

SUM = 2.9; for (d=9; d<12; d++)

SUM += A[I].ven[d]; if (SUM < maaacee)

printf('‘nWimera de empleado: 96dInNambre: %s‘riVentas: A[1].num, A[I].nam, SUM);

} }

void F4(vendedor A[], int T) 1* Este funcion se use pare imprimir el nfimera de empleada, el nambre del w■banco y el nOmera de cuenta de tadas aquellas empleados a quienes se les wirdepasita su smack' en cuenta de cheques. *i 4 int I; float SUM; printf('‘n‘titVendedares can Cuenta en el Bence); for (1=0; I<T; I++)

if (A[I].cla -= 1) printfC\nNOmero de vendedor: %din Banco: gss\nCuenta: %s', mwA[1].num,

A[I].pago.che.natka, A[I].paga.che.nucu); }

Problemas suplementarios

Problema P58.1

}In importante banco, cuya casa central se encuentra ubicada en Quito, Ecuador, Ileva la informacion de sus clientes en un arreglo unidimensional. Este se encuentra ordenado en funciOn del nilmero de cuenta. El banco almacena la siguiente infor-mation de cada cliente:

Page 343: Fundamentos de programacion - piensa en C

Problemas suplementos

327

• Ntimero de cuenta (entero extendido). • Nombre del cliente (cadena de caracteres). • Domicilio (estructura).

• Calle y rulmero (cadena de caracteres). • Codigo Postal (cadena de caracteres). • Colonia (cadena de caracteres). • Ciudad (cadena de caracteres). • Telefono (cadena de caracteres).

• Saldo (real).

Dato: CLI[N] (donde CLI es un arreglo unidimensional de tipo estructura CLIENTE de N delnentOS, i s N 104

ESCribe un programa en C que realice las siguientes operaciones:

a) Depositos. Al recibir el mimero de cuenta de un cliente y un monto determinado, debe actualizar el saldo.

b) Retires. Al recibir el mlinero de cuenta de un cliente y un monto determinado per medio de un cheque o un retire de un cajero, el programa debe actuali-zar el saldo. El cajero no puede pagar el cheque o autorizar el retire si el saldo es insuficiente.

Natty El programa debe reali7ar y validar diferentes transacciones. El fin de datos se expresa al ingresar el ntimero 0.

Problema P58.2

La Fecleracion Mexicana de Fdtbol (FEMEXFUT) almacena en un arreglo unidi-mensional la informacion de la tabla de posiciones de sus tomeos apertura y clausura. Las estadisticas se ordenan logicamente en funcian de los puntos. Se almacena la siguiente informaciOn de cada equipo:

• Nombre del equipo (cadena de caracteres). • Partidos jugados (entero). • Partidos ganados (entero). • Partidos empatados (macro). • Partidos perdidos (entero). • Gales a favor (entero). • Gales en contra (entero), • Diferencia de gales (entero). • Puntos (entero).

Page 344: Fundamentos de programacion - piensa en C

I 328

Capitulo 8. Estructuras y uniones

Dato: FureoL[291 (donde FUTBOL es un arreglo unidimensional de tipo estructura EOUIP0).

Escribe un programa en C que actualice la information despues de cada fecha. El programa recibe la informaciOn de la siguiente manera:

Amirica 0 - Puebla 2

Cruz Azu 1 3 - Veracruz 2

Necaxa 2 - Monterrey 3

Despues de actualizar la information, el programa debe escribir la nueva tabla de posiciones, ordenada en funci6n de los puntos de cada equipo.

Problerna P58.3

En una, universidad de Barranquilla, en Colombia, almacenan la informaciOn de sus profesores utilizando arreglos unidimensionales. La siguiente information de cada profesor se almacena en una estructura:

• Niimero de empleado (entero). • Nombre y apellido (cadena de caracteres). • ❑epartamento al que pertenece (cadena de caracteres). • Puesto que ocupa (cadena de caracteres). • Grady academic° (cadena de caracteres). • Nacionalidad (cadena de caracteres). • Salado (arreglo unidirnensional de reales).

Dato: EMP LEI N] (donde EMPLE es un arreglo unidimensional de tipo estructura PROFESOR, 1 5 N 200.

Nola: Salado es un arreglo unidimensional de tipo real de 12 posiciones que almacena los ingresos mensuales de los profesores. Considera alemtis que en la universidad existen cuatro departamentos: Economia, Derecho, Computation y Administration.

Escribe un programa en C que obtenga lo siguiente:

a) El nombre, departamento al que pertenece y nacionalidad del profesor que mas gan6 el alio anterior. Tambien debe escribir el ingreso total del profesor.

Page 345: Fundamentos de programacion - piensa en C

Problemas suplementos

329

b) El manta total pagado a los profesores extranjeros (nacionalidad diferente a Colombia) y el porcentaje respect° al monto total erogado par la universidad.

c) El departamento que ma's egresos —page de salarios— tuvo el ail° anterior,

Problema P58.4

En una empresa ubicada en Santiago de Chile almacenan la siguiente infonnacion de cada uno de sus empleados:

• litimera de empleado (entero), • Nombre y apellido (cadena de caracteres). • Departarnerao (cadena de caracteres). • Domicilio (estructura).

• Calle y ntImero (cadena de caracteres).

• Colonia (cadena de caracteres). • Cddigo Postal (cadena de caracteres), • Ciudad (cadena de caracteres). • Telefono (cadena de caracteres).

• Salario raensual (real).

Date: EMPLEN] (donde EMPLE es un arreglo unklimensional, ordenado en funciOn del numero de empleado, de tipo estructura EMPLEADO, 1 s N 5 100,

Escribe un programa en C que contemple los siguientes mciclulos:

a) Altas. Al recibir el flamer° de un empleado, debe darlo de alta incorporando logicamente todos los datos del empleado.

b) Rajas. Al recibir el rnimero de un =plead°, debe darlo de baja.

c) Listado. Al recibir el nombre de un department°, debe escribir el mimero de cada uno de sus empleados, sus nombres y salaries correspondientes.

Problema P58.5

Una tienda especializada en articulos electn6nicos vende come maxim 100 produc- tos diferentes. La informacion de cada product° se ahnacena en una estructura:

• Clave del product° (entero). • Nombre del pmducto (cadena de caracteres). • Existencia (entero).

Page 346: Fundamentos de programacion - piensa en C

I 33° Capitulo 8. Estructuras y uniones

Dato: TIENDA[N] (donde TIENDA es un arreglo unidimensional de tipo estructura Producto de N elementos, 1 N < 100).

Escribe un programa que actualice la informacidn de acuerdo con las siguientes transacciones:

OPE1 CLA1 CAN,

OPE2 CLA2 CAN2

. . .

'0' 0 0

Donde:

OPE, es una variable de tipo caracter que representa el tipo de operacien que se realiza; 'C' eompras, 'V yentas, CLA, es una variable de tipo entero que representa la clave del producto. CAN, es una variable de tipo entero que significa la cantidad del product°.

Problerna P58.5 En una escuela privada de la Ciudad de Mexico almacenan la informaciOn de cada uno de sus alumnos en un arreglo unidimensional de tipo estructura. Se almace-na la siguiente inforinacion de cada alumno:

• MatrIcula del alumno (entero). • Nombre y apellido (cadena de caracteres). • Domicilio (estructura).

• Calle y ntinwro (cadena de caracteres). • Codigo Postal (entero). • Colonia (cadena de caracteres). • Ciudad (cadena de. caracteres). • Telefono (cadena de caracteres).

• Nivel de Estudios (estructura). • Nivel (cadena de caracteres). • Grado (entero). • Saldn (cadena de caracteres). • Calificaoiones (arreglo unidimensional de estructuras).

• Materia (cadena de caracteres). • Promedio (real).

Data: ESCUELA[N] (donde ESCUELA es un arreglo unidimensional de tipo estructura Alma°, 1 < N c 1000),

Page 347: Fundamentos de programacion - piensa en C

Problemas suplemerttos 331 I

Nola: Cada alumno tiene siete material en sus cursos.

Escribe un programa en C que realice lo siguiente:

a) Al recibir como data la matricula de un alumno, calcule e imprima el pro-medio general del mismo.

b) Al recibir como dates el nivel de estudios (primaria, secundaria o preparato-ria), el grade y el salOn, liste la matricula de todos los alumnus, el nombre y su promedio.

c) Al recibir como daps el nivel de estudios (primaria, secundaria o prepara-toria), el grade y el salon, obtenga el alumno que tiene el mayor promedio. Debe escribir la matrfcub, su nombre y el promedio correspondiente.

8

Page 348: Fundamentos de programacion - piensa en C
Page 349: Fundamentos de programacion - piensa en C

CAPiTULO ✓

Archivos de datos

9.1. Introduccion

En la actualidad es coma procesar voltimenes de informaci6n tan grandes que es practicamente imposible almacenar los datos en la memoria interna rapida —memoria principal— de la computadora. Estos datos se guardan generalmente en dispositivos de almacenamien-to secundario como cintas y discos, en forma de archivos de datos, los cuales nos permiten almacenar la infonnacion de manera permanente y acceder a ella o naodificarla cada vez que sea necesario.

Los archivos de datos se utilizan cuando el volumen de datos es sig-nificativo, o Bien, cuando la aplicacion requiere de la permanencia de los datos aun despuas de terminar de ejecutarse. En la actualidad, practicamente todas las aplicaciones requieren almacenar datos en un archivo; por ejemplo, las aplicaciones de los bancos, casas de

Page 350: Fundamentos de programacion - piensa en C

334 Capitulo 9. Archivos de datos

lfneas ace'reas para la reservacion de vuelos y asientos, hospitales, hoteles, escuelas, etc.

Los archivos de datos se almacenan en dispositivos perif6ricos, como las cintas y los discos. En la mayoria de los casos, estos dispositivos no se encuentran fisi-camente en el Lugar en el que trabajamos con la computadora. Por lo tanto, las operaciones de bOsqueda, insercion, modificaciOn y eliminaciOn que se realizan sobre archivos tienen un alto costo en cuanto al tiempo.

Por ejempl°, imagina que to encuentras de vacaciones en Europa y deseas con-sulter el saldo de tu tarjeta de crddito en un cajero automatic°. Seguramente para ti es una operaciOn inmediata, de unos pocos segundos, pero la informaciOn debe viajar a travel del oc6ano Atlantic° para consultar el saldo que tienes en tu cuenta en una maquina que se encuentra en Mi6xico y luego debe regresar a Europa para informarte cual es tu saldo. El tiempo indudablemente juega un papel fun-damental. No olvides que ademas del tiempo de ida y vuelta entre Europa y Am6rica, debes considerar el tiempo que se necesita para localizar tu cuenta en la computadora, considerando que los grandes bancos mexicanos tienen mss de oche millones de cuentahabientes.

Una forma de optimizar estas operaciones es utilizar medios de comunicaciOn como la fibra optica yio el sateite entre la terminal y el servidor en el que se en-cuentra la informaci6n, y estructuras de datos poderosas, como arboles-B, para localizar la informacidn dentro del archivo o b base de datos correspondiente.

El format° de los archivos generalmente es de texto o binaria, y la forma de acce-so a los mi.s. mos es secuendal o de acme direct°. En los primeros lenguajes de alto nivel coma Pascal existfa practicamente una relaciOn directa, entre el format° del archivo y el melodo de acceso utilizado. Sin embargo, las cosas han cambia-do con el tiempo, en el lenguaje C existen funciones que permiten trabajar con m6todos de acceso direct° sun cuando el archivo tenga un format° tipo texto. La. relaci5n que existe actualmente entre el format° del archivo y el m6todo de acceso no es muy clara.

9.2. Archivos de texto y metodo de acceso secuencial

En los archivos de text() los datos se almacenan en format° texto y ocupan posi-clones consecutivas en el dispositivo de almacenamiento secundario. La Cinica

Page 351: Fundamentos de programacion - piensa en C

9.2 Archivos de texto y metodo de acceso secuencial 335

forma de acceder a los componentes de un archivo de texto es hacerio en forma secuencial. Es deck, accediendo al primer componente, luego al segundo, y asi sucesivamente hasty llegar al Ultimo, y por consiguiente al fm del archivo. Un elemento importante cuando se trabaja con archivos de texto es el drea del btifer, que es el Lugar donde los datos se almacenan temporalmente mientras se transfie-ren de la memoria al dispositivo secundario en que se encuentran o viceversa.

El lenguaje de programaciOn C no impone restricciones ni fonnatos especificos pa-ra almacenar elementos en un archivo. Adonis, proporciona un conjunto extenso de funciones de biblioteca para el manejo de archivos. Es importante senalar que antes de trabajar con un archivo debemos abrirlo y cuando terminamos de trabajar con el debemos cerrarlo por seguridad de la informacian que se haya almacenado. En el lenguaje C un archivo Wesicamente se abre y cierra de la siguiente forma:

/* El conjunto de instrucciones muestra la sintaxis pare abrir y ce-rrar un Aarchivo en

el lenguaje de programacion C. */

. . FILE *apuntador_archivo; apuntador_archivo = fopen (nombre_archivo, 'tipo_archivo'); if iapuntador_archivo I= NULL) {

proceso; /* trabajo con el archivo. *1 Iclose(apuntador_archivo);

} else

print-1'1'Na as puede abrir el archivo');

La primera instruccion:

FILE *apuntador_archivo;

indica que apuntador_archivo es un apuntador al inicio de la estructura FILE, area del butt que siempre se escribe con maylisculas. La segunda instruccian:

apuntador_archivo = fopen (nombre_archivo, 'tipo-archivo');

pern:Lite abrir un archivo llamado nombre_archivo que puede ser una variable de ti-po cadena de caracteres, o bien, una constante sin extension o con extension txt para realizar actividades de tipo_archivo. ❑bserva que la funciOn fopen tiene dos argumentos: el nombre del archivo y el tipo de archivo, que puede ser de lectura, escritura, etc. En la siguiente tabla se muestran los diferentes tipos de archivos.

Page 352: Fundamentos de programacion - piensa en C

336

Capitulo 9. Archivos de dates

TABLA 9.1. Tipos de archivos

Typo de archly° ExplicaciOn

•r- • Se abre an archive solo para lectura.

• w •

Se abre un archive solo para escritura. Si el archive ya existe, el apuntador se coloca al inicio y sebre.scnle, destruyendo al archive anterior.

•a• Se abre un archive para agregar nuevos dates al final. Si el archive no existe, crea uno nuevo.

•rt. Se abre un archive pars realizar rnedificaciones. Permite leer y escribir. El archive tiene que existir.

• wt • Se abre un archive para leer y escribir. Si 0 archive existe, el apuntador se coloca al inicio, sobrescribe y destruye el archive anterior.

• at• Se abre un archive para lectura y para incorporar nuevos dates al final. Si 0 archive no existe, se crea Imo nuevo.

La siguiente instruceion:

if (apuntador_archivo i= NULL)

permite evaluar el contenido del apuntador. Si e'ste es igual a NULL, implica que el archive no se pudo abrir, en cuyo caso es conveniente escribir un mensaje para no-tificar esta situacion. Por otra parte, si el contenido del apuntador es distinto de NULL entonces se comienza a trabajar sobre el archive. Pot ultimo, la instruccion:

fame (apuntador_archivo);

se utiliza para cerrar el archivo.

Analicemos a continuaciOn diferentes ejemplos que nos permitirk co.mprender perfectamente tanto el manejo de los archivos de texto, come el maxi° de acceso secuencial.

EJENFLO 9.1

En el siguiente programa podemos observar b forma come se abre y cierra an archive de texto, y la manera como se almacenan caracteres. Se recomienda el use de las instrucciones getc y fgetc para lectura de caracteres, asi come put c y I put c para escritura de caracteres.

Page 353: Fundamentos de programacion - piensa en C

9.2 Archives de texto y metodo de acceso secuencial

337 1

Programa 9.1

#include ‹stdia.h,

or* Archives y caracteres. El programa ascribe caracteres en un archive. *1

void main(void)

char p1; FILE *ar; ar =fopen('arc.txt', 'w'); f* Se abre el archive aro.tXt pare escritura. *f if (ar != NULL)

While ((p1=getchar()) != f* Se escriben caracteres en el archive mientras no se detecte el caracter wrque indica al fin de la linen. */

fputc(p1, ar); fclose(ar); or* Se cierra el archive. *f

} also

printf('No se puede abrir el archiva'); }

EFEIYFLO 9.2

En el siguiente programa podemos observar la forma comp se leen caracteres de un archive. Se introduce la instruccion I que se utiliza para verificar el fm del archive.

Programa 9.2

#include astdia.h,

/* Archives y caracteres. El programa lee caracteres de un archive. *f

Void main(void)

char p1; FILE *ar; if ((ar = fopeWarc.txt', 'r')) != NULL) f* Se abre el archive para lecture. *f wpf* °Marva que las dos instrucciones del programa 9.1 necesarias pare abrir un imarchivo y verificar que rite en realidad se hays Warta, se pueden agrupar mien una sela instruccion. */

Page 354: Fundamentos de programacion - piensa en C

I 338 Capitulo 9. Archivos de datos

While (!feef(ar)) 1* Se leen caracteres del archive mientras no se detecte el fin del

• archivo. *1

p1 m fgetc(ar); /* Lee al caracter del archive. *f putchar(p1); 1* Oespliega el caracter en is pantalla. *1

} fclese(ar);

} else

printf('No se puede abrir el archivo');

}

Email.° 93

En el siguiente programa podernos observar la forma coma se manejan las cadenas de caracteres en un archivo. Se introducen las instrucciones ?gets y fputs para lectura y escritura de cadenas de caracteres, respectivamente,

Programa 9.3

#include <steie.h>

1* Archives y cadenas de caracteres. El programa ascribe cadenas de caracteres en un archive. *f

void main(void) 4 char cad[50]; int res; FILE *ar; if ((ar = fapen('arc.txt', '10)) != NULL) 1* Se afire el archive pars escritura. En la misma instruccien se verifies si se ■.pude abrir. *1

printf('ininesea ingresar una cadena de caracteres? Si-1 No-0:'); scanf('96d', &res); While (res)

fflush(stdin); printf('Ingrese la cadena: '1; gets(cad); fputs(cad, ar);

1* Observa la forma coma se ascribe la cadena en el wrarchiva.*/

printf('‘nalesea ingresar otra cadena de caracteres? Si-1 No-0:'); scanf('grd', &res); if (res)

Page 355: Fundamentos de programacion - piensa en C

9.2 Archives de texto y metodo de acceso secuencial 339 I

fputs('in', ar); /* Se indica un salt° de linea, except° en la oltima cadena. Si na use hiciera esta indicacii5n, la funcion fputa pegaria las cadenas y widuega tendrlamos dificultades en al momenta de leerlas. Par atra w•parte, si realizaramos este salts de linea al final de la bltima w.cadena, en la escritura se repetiria la Altima cadena. *I

} fclose(ar);

} else

printf('No se puede abrir el archivo'); }

EJEPAPLO 9A

En el siguiente programa podemos observar la forma wino se leen las cadenas de caracteres de un archly°.

Programa 9.4

include ‹stdio.h>

or* Archives y cadenas de caracteres. El programa lee cadenas de caracteres de un archly°. *I

void main(vaid) 4 char cad[56]; FILE *ap; if ((ap=fopen ('arc.txt', 'r')) != NULL) I* Se afire el archly° para lectura y se verifica si se abrio carrectamente. *f

while (Ifeaf(ap)) I* Ventres no se detecte el fin de archive se siguen leyenda cadenas de wicaracteres. *I

fgets(cad, SO, ap); /* Observe que la instruccion para leer cadenas requiere de tres

imangumentos. *I puts(cad); I* Despliega la cadena en la pantalla. *I

} fclose(ap);

} 0190

printf('No se puede abrir el archivo');

Page 356: Fundamentos de programacion - piensa en C

1 3" Capitulo 9. Archivos de datos

Exhumo 9.5

Escribe un programa en C que, al recibir come dates la matricula y cinco califi-caciones de N alumnos de un curse universitario, almacene la informacion en el archive tal comp se presenta a continuacion.

Datos: N

MAT„ CAL,„ CAL,,, CAL, a, CAL,,,, CAL,

MATa, CAL2 CALI ,a CAL2,43 CAL2,5

MATH , CALK,,, CALN,„ CAL

Donde: N es una variable de tipo entero que represents el nOmero de alumnos, K N 35.

MAT, es una variable de tipo enter° que representa la matricula del alumno i. CALm es una variable de tipo real que indica la calificacion j del alumno i.

Note; En el programa se puede observar la forma come se mane jan las variables enteras y reales en un archive. Se introducen las instrucciones Iscanf y fprintf

para lectura y escritura, respectivamente.

Programa 9.5

Oinclude ‹stdio.h>

f* Archivos con variables enteras y reales. EL programa alvecena dates de un grupo de alumnos en un archly°. */

void main(void) { int 1, j, n, mat; float cal; FILE *ar; printfr\nIngrese el nailer° de alumnos: '); scanf('96d', &n); f* Se asume quo el valor quo ingresa el usuario este conprendido antra 1 y 35. *1 if ((or - fopen('ara.txt', 'w')) !m NULL) {

fprintf(ar,'5,1 n); I* Se ascribe el nCmiero de alumnos en el wparchivo. *f

for i<n; i++)

printf('‘nIngrese la matricula del alumno 96d: ", i+1); scanf('cisd', &mat); fprintr(ar," 1,606d *, mat); f* Se ascribe la matricula en el

lwarchivo. *1

Page 357: Fundamentos de programacion - piensa en C

9.2 Archives de texts y metodo de access secuencial 341 j

for (I-6; J<5; j++) {

printfr‘nCalificackan 911d: ', 1+1); scanf('W„ &cal);

fprintf(ar,'96.2f ', cal); i* Se escriben las calificaciones en Impel archivo. */

} fclase(ar);

else printf(Ila se puede abrir el archivo');

}

EJEMPLO 9.6

Escribe un programa en C que lea de un archive el mimero de alumnos 00, la matricula y las cinco calificaciones de cada uno de ellos, y que imprima en pan-talla la matricula y el promedio de cada alumno.

Programa 9.6

ffinclude <stdia.h>

or* Archivos con variables enteras y reales. El pragrama lee datos de alumnos almacenados en un archivo y ascribe la Immatricula y el promedio de sada alumna. *1

void main(void)

int i, j, n, mat; float cal, pro; FILE *ar; if ((ar = foper('arc9.txt% 'r')) != NULL)

fscanf(ar, '96d', &n);

f* Se lee el valor de n. 111

for (i - 0; i < n; i++)

fscanf(ar, '96d', &mat); /* Se lee la matricula de cede alumna. */ printf('oddit', mat); pro - 0; for (j=0; j<5; j++) {

fscanf(ar, '96r, &cal); f* Se lean las cinco calificaciones wwdel alumna. */

pro += cal;

} printf('‘t fis.2f ', pro / 5); /* Se ascribe el promedia de cada

loalumno. */ printf('in');

Page 358: Fundamentos de programacion - piensa en C

342 Capitulo 9. Archivos de datos

1 fclose(ar);

else printf('No se puede abrir el archive);

}

EJEMPLO 9.7

Escribe un programa en C similar al anterior, pero con la diferencia de que debe utilizar una funcion para realizar la lectura del archivo. Este, por otra parte, se debe abrir y cerrar en el programa principal.

Programa 9.7

#include ‹stdio.h>

1* Archivos can variables enteras y reales. El programa lee infarmacion de las alumnus de una escuela, almacenada en un oarchivo. Utiliza una funcian pare realizar la lecture, pera el archive se abre 'my cierra desde el programa principal. *f

void promedio(FILE *); 1* Prototipo de funcion. Se pass un archiva coma parametro. *1

Void main(void)

FILE *ar; if ((ar = fopen('arcS.txt', 'r')) != NULL)

{ pramedia(ar); 1* Se llama a is funcian prosedio. Observe la forma

im• CM110 se pass el archiva coma parametro. *1 fclose(ar);

} else

printf('ilo se puede abrir el archiva'); }

void promedia(FILE *arl) /* Observa is forma coma se recibe el archivo. */ 1* Este funcion lee los datos de los alumnus desde un archiva, e imprime tanto 4 la matricula como el pramedio de cads alumna. */

int i, J, n, mat; float pro, cal; fscanf(arl, &n); for (i=O; i<n; i++)

Page 359: Fundamentos de programacion - piensa en C

9.3 Arthivos de acceso directo 343

fscanf(arl, '%d', &mat); printf('96d\t', mat); pro = 2;

for (1 = 1 < 5; 1") {

fscanf(arl, '90', &cal); pro += cal;

} printf('\-t S.2f pro / 5); printf('kn');

}

}

9.3. Archivos de acceso directo Los archives de acceso direct() almacenan los datos en bloques de longitud fija. Esta caracteristica es muy importante porque nos permite tener acceso directa-mente a un bloque del archivo —siempre que conozcamos la posiciOn en la que se encuentra-- sin tener que recorrer el archivo en forma secuencial hasta zar el bloque. Un bloque tiene siempre la misma longitud en te'rrainos de bytes y generabuente representa una estructura de datos tipo registro, conocido en C simplemente como estructura, aunque tambien puede almacenar un arreglo completo. Otra caracteristica importante de los archivos de acceso directo es que podemos modificar con facilidad el archivo, ya que el programa cuenta con diver-sas funciones para ello. Recordemos que en los archivos de texto tenfamos que generar un nuevo archive cads vez que necesit.ibamos actualizarlo —modificado.

En el lenguaje C un archive de acceso directo se abre y cierra de b siguiente forma:

/* El conjunto de instrucciones muestra la sintaxis para abrir y terror un mParchive de acceso directo en el lenguaje de programacian C. *1

FILE *apuntador_archivo; apuntador_archiva = fopen (nombre_archiva, 'tipo_archivo'); if (apuntador_archivo != NULL)

proceso;

/* Trabajo con el archive. *1

fclose(apantadar_archivo); } else

printf('No se puede abrir el archive');

Page 360: Fundamentos de programacion - piensa en C

#include ‹stdio.h>

1* Alumnus. EL programa almacena variables de tips estruatura alumna en un archive. *1

typede struct {

int matricula; char nombre[20]; int carrera; float pramedio;

}alumna;

1* Declaracion de la satructura !amino. *or

void escribe(FILE *); /* Prototipo de funcion. *1

void main(void)

344

Capitulo 9. Archivos de datos

Observa que este conjunto de instrucciones es identico al que hemos presentado para abrir y cerrar archivos de text°, Los tipos de archivos, por otra parte, son id6rnicos a los que se mostraron en la tabla 9.1.

Analicemos a continuaciOn diferentes ejemplos que nos permitirin comprender el manejo de archivos de acceso directo.

E.IEPWLO 9.8

En el siguiente programa podemos observar la forma en que se abren, cierran y almacenan bloques —estructuras— en un archive de acceso directo. Observa el use de la funciOn fivrite para escribir un bloque en el archive.

Cada bloque en este programa representa una estriaCtiira que se utiliza para almacenar infonnaciOn sobre los alumnos de una escuela. Los campos de la estnictura son los siguientes:

• Matricula del alumno (entero).

• Nombre del alumno (cadena de caracteres).

• Carrera en la que esti inscrito (entero).

• Promedio del alumno (real).

Observa que para indicar la carrera en la que esti inscrito el alumno se utiliza: 1 para Economia, 2 para Contabilidad, 3 para Derecho, 4 para Ingenieria en Com-putacion y 5 para Ingenieria Industrial.

Programa 9.8

Page 361: Fundamentos de programacion - piensa en C

9.3 Archives de acceso directo 345

FILE *or; if ((ar = fopen ('ad1.dat', 'w•)) != HULL)

escribe(ar); else

printf('\nEl archive no se puede abrir'); fclose(ar);

void escribe(FILE *ap) J* Esta funcien sirve pare leer los datos de las alumnos utilizando una wieetructura tipo alumni), clue se almacenara posteriormente en un archive.

alumna alu; int i = 2, r; printf('W.Oesea ingresar informacidn sobre alumnos? (S1-1 No-2): '); scanf('%d', &r); While (r)

i++; printf('Matricula del alumno %d: i); scanf('%d', &alu.matricula); printf('Nombre del alumna 264: i); fflush(stdin); gets(alu.nombre); printf('Carrera del alumna sisd: i); scanf('W, &alu.carrera); printf('Promedio del alumno 96d: i); scanf('W, Salu.promedio);

fwrite(&alu, sizeol(alumno), 1, ap); f* Observa que la funcian fwrite tiene cuatro argumentos. El primer° se ImPutiliza pare indicar la variable tipo estructura que se desea almacenar; el . segundo muestra el tamale de esa variable en terminos de bytes; el tercero w■seeala el ngimera de variables que se leerin o almacenarin en el dispositivo wde almacenamiento secundaria, y el Ultimo representa el apuntador al inicio de . la estructura FILE. *f

printfl'InMesea ingresar infermacien sabre mas alumnos? (Si-1 No-2): '); scanf('god', &r);

EFEWL0 9.9

Escribe un programa en C que, al recibir come date el archive de datos que se gener5 en el programa anterior, lea los registros del archive y escriba la informa-don de cada estructura en la pantalla de la computadora.

Dam: ad 1 d at

Page 362: Fundamentos de programacion - piensa en C

346 Capitulo 9. Archivos de datos

Nota: En este programa pedennes observar la forrna en que se utiliza la instruc-ciOn f read Para leer bloques de un archive.

Programa 9.9

#include ‹stdio.h>

1* Alumnos. El programa lee bloques —variables de tips estructura SLAM— de un archivo imde acceso directo. *1

typedef struct { int matricula; char nombre[2e]; int carrera; float promedia;

} alumno;

/* Declaracion de la estructura alumna. */

void lee(FILE *); 1* Pratotipa de funcion. *f

void main(void)

FILE *ar; if ((ar = fopen ('ad1.dat', 'r')) != NULL)

escribe(ar); else

printf('‘nEl archivo no se puede abrir'); fclose(ar); }

void lee(FILE *ap) 1* Este funcien se utilize pare leer bloques de un archive de acceso direct°. *1

{ alumno alu;

fread(241u, sizeof(alumno), 1, ap); ir* Observa que la funcion fried tiene los mismas argumentos que la funcion o ferite del programa anterior. 'rambler' es importante tamar note de que cuando wiptenemos que leer los registros de un archivo utilizando una estructura o repetitiva como el while, debemos realizar una primera lecture antes de Iwingresar al ciclo y limo las siguientes dentro del ciclo, pero coma filtima 4instrucci6n del misma. Esto se debe a que la logica que siguen las o instrucciones twits y fried as moyarse y leer o escribir, segun sea el caso. . Si no lo hicieramos de este forma, terminariamos escribiendo la informacian • del Ultimo registro dos veces. Vamos a realizar un ejempla sencillo pare imoomprobar esto. */

while (!feof (ap ) )

Page 363: Fundamentos de programacion - piensa en C

*include ‹stdio.h,

/* Alumnos. El programa pregunta al usuario el numero de registro que desea wcnodilicar, obtiene el nuevo promedio del alumna y modifica tanto el .registro comp el archivo correspondiente. *i

typedef atruct {

int matricula; char nombre[20]; int carrera; float promedio; alumno;

/* Declaration de la eatructura alumna. */

void modilicafFILE *); /* Prototipo de funcion. */

void mainfvoi0)

FILE *ar; if ((ar = fopen ("adl.dat', 'r+')) i= NULL)

modificafar); else

printf(' 1 1E1 archivo no se puede ahrir'); fclose(ar);

9.3 Archives de acceso directo

347 1

printfrinMatricula: %d', alu.matricule); printf('ItCarrera: %d', alu.carrera); printf('itPromedio: Wit alu.promedio); puts(alu.nambre); fread(&alu, sizeOf(alumno), 1, ap);

I

EJEWLO 9.10

Dade come date el archive de acceso directo generado en el programa 9.9, construya un programa en C que le pregunte al usuario el mimero de registro del alumno en el cual se debe modilicar el promedio, obtenga este valor, y modifique tanto el registro come el archive correspondiente.

Dato: adl.dat

Nota: En el siguiente programa podernos observar la forma en que se utiliza la inStrUccion (seek.

Page 364: Fundamentos de programacion - piensa en C

1 348 Capitulo 9. Archivos de datos

void modifica(FILE *ap) i* Este funcien se utiliza pare modificar el promedio de un alumna. *i { int d; alumna alu; printfl'ImIngrese el nftero de registro que desea modificar: '); i* Observa que el lenguaje C almacena el primer registro en la imposicion cero. Per lo tante, si desea modificar el registro n, twdebe buscarlo en la posicion n-1. */ • scanf('Rld', &d);

fseek(ap, (d-1)*sizeaf(alumne), 0); /* Observa que la instruccien f000k tiene tree argumentos. El primer° up-Indica que el apuntador se debe posicionar al inicio del FILE. imbEl segundo sehala el nUmero de bloques que debe moverse, en terminos ode bytes, para llegar al registro correspondiente. Nota que el imprimer registro ocupa la posicien 0. Finalmente, el tercer argument° • muestra a partir de que posicien se debe mover el bloque de bytes: Imse utiliza el 0 pare indicar el inicio del archive, 1 para expresar • que se debe mover a partir de la posicion en la que actualmente se imencuentra y 2 pare indicar que el movimiento es a partir del fin del mikarchivo. */

fread(&alu, 81Z601(alumno), 1, ap); /* Lunge de posicionarnos en el registro que nos interesa, lo wileemos. */

printWOIngrese el promedio correct° del alumna: '); scanf('slsr, &alu.promedie); /* Modificamos el registro con el

winuevo promedio. */

fseek(ap, (d-1)*sizeof(alumno), 0); /* Nos tenemos que posicionar nuevamente en el lugar correcto pare imescribir el registro modificado. Observe que si no hacemos este o reposicionamiento escribiriamos el registro actualizado en la iwsiguiente pesicien. */

fwrite(&alu, sizeof(alumno), 1, ap); }

EJEPAPLO 9.11

Escribe un programa en C que, al recibir como date el archivo de acceso direct° ad5.dat, incremente 10% el salad° de cada empleado que haya tenido yentas ma-yores a $1,000,000 durante el aiio. Los campos de b estructura que se utilizan para almacenar la informacion de los empleados son los siguientes:

• Clave del empleado (entero).

• Departamento en que trabaja (entero).

Page 365: Fundamentos de programacion - piensa en C

9.3 Archivos de access direct°

349 1

• Salado (real).

• Yentas (arreglo unidimensional de reales).

pato; ad5.dat

Nota; En el siguiente programa podemos observar la forma en que se utilizan las instrucciones It'll, aim./ y rewind.

Programa 9,11

#include ‹stdio.h>

/* Incrementa salaries. El programa incrementa el salario de los empleados de una empresa --actualiza el archive cerrespondiente— si sus yentas son superiores al millon de pesos anuales. */

typedef *trust {

int clave; int departamento; float salario; float ventas(12);

}empleado;

/* Declaracien de la estruotura empleado. */

void incrementa(FILE *); /* Prototipo de funcien. */

void main(void) { FILE *ar; if ((ar = fopen('ad5.dat', 'r+')) i= NULL) /* El archive se abre en la medalidad para leer y escribir. */

incrementa(ar); else

printI('OE1 archive no se puede abrir');

rewind(ar); /* La funcien rewind se utiliza para posicionarnos en el inicio del iwarchivo cada vex que sea necesario. En este programa no tiene ninguna imutilidad, solo se escribiel para explicar su use. */

fclose(ar); 1

void incrementa(FILE *ap) /* Esta funciem se utiliza para incrementar el salario de todos aquellos *empleados que hayan tenido yentas anuales per mss de $1,000,000. oActualiza ademas el archive correspondiente. */

Page 366: Fundamentos de programacion - piensa en C

I 350 Capitulo 9. Archivos de datos

int 1, j, t; float sum; empleado ample;

t = mizeof(empleado); /* La luncion sizeof se utilize pare conocer el tamatio de la ostrootura • omploado. */

Iread(&emple, sizeoffempleado), 1, ap); 1* Se lee el primer registro ftdel archivo. */

whilefifeoffap))

= ftellfap) / t; /* La funcion (tell se utilize pare conocer la posicion de nuestro ftepuntador en el archly°. La variable 1 nos proporciona en este case oeltamaho de todos los bloques que existen debajo de nuestra oposici6n. Siconocemos el tameno de cede bloque, entonces podemos oobtener el nUmerode bloques que hay exactamente debajo de nuestra ftposici6n. */

sum = 0; for {j=0; j<12; j++)

sum += emple.ventes[j]; /* Se caiculan las yentas de cads ovendedor. */

if (sum > 1000000) {

emple.selario = emple.salario * 1.10; /* Se incrementa el oselario. */

fseekfap, (1-1)*sizeoffempleado), 0); /* Nos posicionamos para escribir el registro actualized°. */ Iwritef&emple, BlZOOffempleado), 1, ap); Iseek(ap, i*sizeof(empleado), 0); 1* Nos posicionamos nuevamente pare leer el siguiente registro. wwEsta instruccion no deberia ser neceseria, pare la funcion ofwrite se comporta a veces de manera inestable en aigunos mwcompiladores de C. Para asegurarnos que siempre funcione wcorrectemente, realizamos este nuevo reposicionamiento. */

} freadf&emple, SizeOffempleado), 1, ap);

}

Page 367: Fundamentos de programacion - piensa en C

Problemas resueltos 351 I

Problemas resueltos

Problema PR9.1

Escribe un programa en C que, al recibir come date el archive de text() libro .txt

que contiene el texto del primer capitule de un libro, incorpore los siguientes ca-racteres a cliche archive: Fin del texto' . Utiliza funciones para el man* de caracteres.

Data; libro.txt

Programa 9.12

*include <stdio.hr

/* Incorpora caracteres. El programa agrega caracteres al archive libro.txt. */

void main(void) { Oar pi; FILE *ar; ar = lopenClibro.txt', .a.); /* Se abre el archive con la °poi& pare incorporar caracteres. */ if (ar != NULL) {

while ((pi = getchar()) I= 'lyn') Iputc(pi, ar);

Iclose(ar);

1 else

printf("Ne se puede abrir el archive"); }

Problema PR9.2

Construye un programa en C que, al recibir come dates una cadena de caracteres almacenada en el archive de texto arch .t xt y un caracter, determine cuantas ve-ces se encuentra el caracter en el archive.

Dates: arch .txt, car (donde car representa el caracter que se ingresa).

9

Page 368: Fundamentos de programacion - piensa en C

I 352

Capitulo 9. Archivos de datos

Programa 9.13

Afinclude ‹stdia.h>

1* Cuenta caracteres. El programa, al recibir coma data un archivo de text° y un caracter, cuenta gel rigimeno de veces que se encuentra el caracter en el archivo. *1

int cuenta(uner); 1* Prototipo de funciin. */

void main(V014) {

int res; char car; printf('inIngrese el caracter que se va a buscar en el archivo: '); car = getchar(); res = cuenta(car); if (res != -1)

printf('‘n‘nEl caracter %c se encuentra en el archivo %d veces', car, res); oleo

printf('Ho se pudo abrir el archivo');

}

int cuenta(char car) 1* Este funci6n determine cuintss veces se encuentra el caracter en el w•archivo. *1 { int res, con = char p; FILE *ar; if ((ar fopen ('arc.txt', 'r')) I= HULL) 1* Se afire el archivo para

Imlectura. */

{ while (!feof(ar)) f* Se trabaja con al archivo mientras no se Ilegue

'Biel fin de este. *1

p = getc(ar); if (p == car) 1* Se realize la comparacion de los caracteres. *1 oon++;

} fclose(ar); res = con;

} else

res = -1; return (res);

Page 369: Fundamentos de programacion - piensa en C

Problemas resueltos 353

Problema PR 9.3

Escribe un programa en C que, al recibir como dato el archivo de texto arc5.-Ext for-mado por cadenas de caracteres, determine el ndunero de tetras mintisculas y maytisculas que existen en el archivo. Utiliza solamente funciones que lean carac-teres, no cadenas de caracteres,

Dato: arc.txt

Programa 9.14

#include cstdio.lp. #include <ctype.h

I* Letras minusculas y mayrisculas. El programa, al recibir coma data un archivo formed° por cadenas de caracteres, im-determina el nfimero de letras minOsculas y mayOsculas que hay en el archivo. *i

void minymay(FILE *); I* Prototipo de funciOn. *i I* Observa que esta funcion va a recibir un archivo como parametro. *1

void main(void)

char p; FILE *ar; if ((ar = fopen('arc5.txt', 'r")) != NULL)

minymay(ar); I* Se llama a la funcion alnyeay. Se pace el archivo ar como parametro. */

fclase(ar); } 'lee

printf('do se pudo abrir el archivo'); }

void minymay(FILE *arc) I* Esta funci6n cuenta el rainier° de minbsculas y maykisculas que hay en el .archivo arc. */

int min = 2, may = 2; char p; while (Ffeof(arc)) {

p = fgetc(arc); f* Se utilize la funcion fgetc() Para leer caracteres .del archivo. *I

if (islower(p)) min++;

Page 370: Fundamentos de programacion - piensa en C

354 Capitulo 9. Archivos de datos

else 11 (isupper(p))

may++;

printf('inNrimero de minuscules: %d', min); printf('InNAmera de mayuscules: 96d', may);

}

Problema PR 9.4

Escribe un programa en C que resuelva el problema anterior, pero ahora utilizan-do funciones que lean cadenas de caracteres.

Dato: arc .txt

Programa 9.15

#include ‹stdio.h> #include ‹ctype.h>

/* Letras minuscules y mayilsculas. El programa, al recibir coma data un archivo formado por cadenas de imcaracteres, determine el nUmera de letras minhscolas y mayfiscolas que hay 'men el archivo. */

Wad minymay(FILE *); 1* Pratatipa de tondo'''. */

void main(void)

FILE *ap; if ((ap = fopen ('arc.txt', 'r')) != NULL) {

minymay(ap); fcloselap);

} else

printf('No se puede abrir el archive); }

void minymay(FILE *apl) /* Este foncion se utilize pare leer cadenas de caracteres de un archiva Imy Guitar el nOmero de letras minuscules y mayilsculas qua existen en el wparchivo. */ {

char cadpe]; int i, mi = 0, ma = 3;

Page 371: Fundamentos de programacion - piensa en C

Problernas resueltos

355 [

While (!feof(ap1))

fgets(cad,341,ap1); f* Se utilize la funcion fgets() pare leer cadenas de caracteres del wparchivo. *1 i=0; while (cad(i] !=

if (islower(cad(i])) mitt;

else if (isupper{cad[i]))

ma++; i++;

}

} printf('AnAnNamero de letras minuscules: %eV, mi); printf('AnNOmero de letras may6scoles: cbd", ma);

}

Problema PR 9.5

Escribe un programa en C que, al recibir come date el archive de text() arc2.txt

compuesto per cadenas de caracteres, que pueden contener ndmeros reales, obtenga la suma y el promedie de cliches numeres. For ejemplo, el archive se po-d& presenter de la siguiente forma:

169.2419as.3499.sasa409.56

abc268.148.268.398.46

367.107.267.367.40

ilatO: arc2.txt

Programa 9.16

Oinclude <stdio.h> Oinclude ‹stdlib.h>

1* Sums reales. El programa lee cadenas de caracteres de un archivo, detects aquellas que tocamienzan con numeras, los suma y calcula el pramedio de los mismos.

void sumypro(F1LE *); /* Prototipo de funcion. */

Page 372: Fundamentos de programacion - piensa en C

356 Capitulo 9. Archivos de datos

void main(V014) { FILE *ap;

if ((ap=fopen('arc2.txt', 'r')) != NULL)

sumypro(ap); 1* Se llama a la funcian sumypro. Se pasa al archive ap corm parametro. *f fclase(ap);

} else

printf('No se puede abrir el archivo');

}

void sumypro(FILE *ap1) I* Esta funcian lee cadenas de caracteres de un archivo, detecta aquellas Imque comienzan con nomeros, y obtiene la sums y el promedia de dichos wwnOmeros. *1

{ char cad[30]; int i = O; float sum m 0.0, r; while (!feof (ap1)) {

fgets(cad,30,ap1); f* Se lee la cadena del archivo. *I r = atof(cad); 1* Recuerda que la funcian stof oonvierte una cadena de caracteres que w contiene nOmeras reales a un valor de tipo double. Si is cadena comienza U-con otro caracter a no contiene nameros, regresa a a el valor queda wiindefinido. *I if (r)

sum 1.= r; }

printf('inSuma: %.2f', sum); if (i) /* Si el valor de 1 es distinta de cern, calcula el promedia.

printf('‘nPromedio: sumii);

1

Problema PR 9.6

Desarrolla un programa en C que, al recitdroorne dato ci archivo tole arc .txt compuesto porcadenasdecaracteres en lasciwpoofeaparecerlapalabrarnexico escrita con nlindsculas, cada vez que 'malice la palabra maxico en una cadena, la reemplace por su forma correcta —la primera tetra con mapisculas— y escrilba la nueva cadena en el archive arci.txt.f)bservaque la palabra maxico se puede

Page 373: Fundamentos de programacion - piensa en C

Problemas resueltos 357

encontrar varias veces en una mismacadena.Porejenaplo,elandhive se podria presentardela siguiente forma: es mexico lindo mexico

mexico es maravilloso mexico

me gusts is gente de mexico

mexico mexico mexico

y debe quedar en el archive arc2 .txt de la siguiente forma: es Mexico lindo Mexico

Mexico es maravilloso Mexico

no gusts la gents de Mexico

Mexico Mexico Mexico

Dale: arc.txt

Programa 9.17

#include ‹stdio.hs #include ‹ctype.h> #include ‹string.h>

1* Reemplaza palabras. El programa lee cadenas de caracteres de un archivo y cads clue vex clue Imencuentra la palabra Mexico escrita en forma incorrecta --la primera con uminbscula— is reemplaza par su forma corrects y ascribe is cadena en otro ft archivo. *I

void cambia(FILE *, FILE *); 1* Prototipo de funci6n. Se pasan dos archivos coma parSmetras. *f

void main(void)

FILE *ar; FILE *ap; ar = fopen('arc.txt', 'r'); I* Se abre el archivo ar'c.txt pare lecture. *I Op = fopen('arcl.txt', Ni'); f* Se abre el archivo arcl,txt para escritura. *1

if ((or != NULL) && (op 1= NULL))

cambia(ar, ap); fclase(ar); fclase(ep);

} else

printf('Na se pueden abrir los archivos'); }

Page 374: Fundamentos de programacion - piensa en C

void cambia(FILE *ap1, FILE *ap2) { I* Esta funcian reemplaza en la cadena de caracteres la palabra maxim escrita .con minbsculas --la primera letra— par su forma correcta y ascribe la cadena Ode caracteres en un nuevo archive. */ int i, j, k; char cad[30], *cad1=", *cad2=", aux[30]; while (!feof(apl)) {

fgets(cad, 30, Bpi); strcpy(cad1, cad);

cad2 = strstr(cad1, 'mexico'); /* Localize la subcadena aiXICO .en me. *1

W11110 (cad2!=NULL)

cad2[0]=W; /* Reemplaza la letra minascula par la may0scula. */ i = strlen(cadl); j = strlen(cad2); k = i - j; /* En k se almacena la diferencia de las longitudes de

miles cadenas cadi y cad2. *f

if (k)

strncpy(aux, cad1, k); /* Se copia la subcadena de k caracteres de cad1 a aux —desde el iminicio de cadl haste el caracter anterior a mimic*. */ aux[k] strcat(aux, cad2); strcpy(cad1, aux);

) 0180

strcpy(cad1, cad2); cad2 = strstr(cad1, 'imexico');

} fputs(cadl, ap2); /* Se ascribe la cadena correcta en el archly° ap2. */

I 358 Capitulo 9. Archivos de datos

Problema PR 9.7

Construye un programa en C que, al recibir como datos los archivos ordenados arc9.dat y arc10.dat que contienen informaciOn sobre la matricula y tres califi-caciones de los alumnus de una escuela, Enezcle los dos archivos anteriores considerando el orden asoendente de las matrIculas y forme un tercer archivo, arch dat, ordenado tarnbi6n logicamente en fiancion de las rnatriculas. Cabe

Page 375: Fundamentos de programacion - piensa en C

Problemas resueltos 359

destacar que la matricula de cada alumno es un valor entero y las ties califica-clones son valores reales. Por ejemplo, los archivos se podrian presenter de la siguiente forma: are9.dat

55 6.7 7.8 7.8

67 7.2 8.8 7.8

85 7.7 8.7 8.9

93 8.7 9.9 9.6

MMOSIAlt 31 8.7 6.7 8.9

45 7.8 7.6 5.8

61 7.8 9.8 9.9

82 8.8 9.9 9.7

96 8.9 9.1 9.9

99 9.3 9.6 9.8

La mezcla de los mismos debe quedar como se muestra a continuaciOn: arc11.det

31 8.7 6.7 8.9

45 7.8 7.6 5.8

55 6.7 7.8 7.8

61 7.8 9.8 9.9

67 7.2 8.8 7.8

82 8.8 9.9 9.7

85 7.7 8.7 8.9

93 8.7 9.9 9.6

96 8.9 9.1 9.9

99 9.3 9.6 9.8

Datos: arc9.dat, arc19.dat

Programa 9.18

include ‹stdio.h>

I* Mazola. El programa mezcla, respetando el orden, dos archives que se encuentran wwordenades en forma ascendents considerando la matricula de los alumnus. *I

Vold mezcla(FILE *, FILE *, FILE *); /* Prototipo de funcien. *1

Page 376: Fundamentos de programacion - piensa en C

I 360 Capitulo 9. Archivos de datos

void main(void) {

FILE *ar, *ar1, *ar2; ar = fopen(•arc9.dat', 'r'); ar1 = fopen(•arc10.dat', 'r'); ar2 = fapen(•arcll.dat', 'w'); if (((ar != NULL) && (ar1 NULL)) && (ar2 != NULL)) {

mezcla(ar, ar1, ar2); fclase(ar); fclose(arl); fclase(ar2);

1 else

printf(•Na se pueden abrir las archives'];

}

void mezcla(FILE *ar, FILE *ar1, FILE *ar2) /* Esta funcion mezcla, respetanda el arden, dos archives clue se encuentran wwardenadas en funcidn de la matricula. *I {

int i, mat, matt, b=1, 61=1; float ca[3], ca1[3], cal; lyhila (((!feaf(ar)) !b) && ((!feaf(ar1)) 1131)) {

if (b) i* Si la benders b esta encendida, se lee del archive ar is wqmtricula y las tres calificaciones del alumna. *I

fscanf(ar, &mat); for (i=3; i<3; i++)

fscanf(ar, '4cf•, Sica[i]); b = a;

} if (61) i* Si is bandera 61 estA encendida, se lee del archive ar

wila matricula y las tres calificacianes del alumna. *f

fscanf(ar1, &mat1); for (i=0; i<3; i++)

fscanf(ar1, Bica1M); b1 =0;

} if (mat < mat1)

fprintf(ar2, '91adit', mat); for (i=O; i<3; i++)

fprintf(ar2, '1f1t•, ca[i]); fputs(•1n•, ar2); b = 1;

Page 377: Fundamentos de programacion - piensa en C

} else

fprintf(ar2, mati); for (1=0; i<3; i++)

fprintf(ar2, ca1[1]); fputs('‘n', ar2); b1=1;

{ fprintf(ar2, 'M it', mat); for (1=6; 1,43; i++)

fprintf(ar2, "515f1t', ca[i]); fputs('In', ar2); while (!feof(ar)) {

fscanf(ar, '9a1", &mat); fprintf(ar2, 'Pled\t', mat); for (i=O; 143; 1++)

fscanf(ar, '910', &cal); fprintf(ar2, 'WU', cal);

} fputs('In', ar2);

fprintf(ar2, mati);

for (1=0; i<3; i++) fprintf(ar2, '96f\t', ca1[1]);

fputs('In', ar2); while (!feof(ar1))

fscanf(ar1, '96W, &Nati); fprintf(ar2, mati); for (i=0; 1.;3; i++)

fscanf(ar1, "96r, &cal); fprintf(ar2, '51sflit', cal);

1 fputs('In', ar2);

Problemas resueltos 361 1

Page 378: Fundamentos de programacion - piensa en C

#include astdia.h,

f* Ordena de manor a mayor. El programa ordena de manor a mayor en funcian de la matricula, creanda un . nuevo archivo, un archivo de acceso directo campuesto par estructuras y wpordenada de mayor a manor. *1

typedsf struct {

int matricula; char nombrepal; int carrera; float promedia;

} alumno;

/* Oecleracidn de la estructura slump. *1

void ordena(FILE *, FILE *); /* Prototipo de funcian. */.

Void main(V014) { FILE *arl, *ar2; art fopen('ad5.dat', 'r'); ar2 = fapen('ad6.dat', 've); if ((erl Im NULL) && (ar2 != HULL))

ordena(arl, ar2); else

printf('ILnEl a los archivos no se pudieron abrir'); fclose(arl); fclose(ar2);

}

I 362

Capitulo 9. Archivos de datos

Problema PR 9.8

Escribe un programa en C que, al recibir como data el archivo de acceso directo ads .dat que contiene registros de los alumnos de una escuela, ordenados de ma-yor a menor en funcift de su matricula, genere un nuevo archivo pero ahora ordenado de 'Timor a mayor, tambkn en funcion de la matricula. Los campos de las estructuras almacenadas en el archivo son los siguientes:

• Matricula del alumno (entero).

• Nombre del alumno (cadena de caracteres).

• Carrera en la que e.sta inscrito (entero),

• Promedio del alumna (real).

Dato: ad5.dat

Programa 9.19

Page 379: Fundamentos de programacion - piensa en C

Problemas resueltos 363 j

✓oid ordena(FILE *apt, FILE *ap2) f* Esta funcibn ordena de manor a mayor un archivo compuesto par estructuras,

'wen funcitin de su matricula, y genera un nuevo archly°. *1

alumna alu; int t, n, i; t = siza0f(alumno); fseek (ap1, sizeof(alumna), 2); n (ftell(ap1) / t) - 1; 1* Se D'Alene el numern de registros que componen el archivo. El valor de n, wia su vez, se utilizara pare posicionarnos en el archivo. */ rewind(ap1); for (i - (n-1); i ›= 2; i--) 1* Se utilize un ciclo descendents. *1

fseek(ap1, i * sizeot(alumno), 2); fread(&alu, 012001(alumno), 1, ap1); fwrite(&alu, sizoof(alumno), 1, ap2);

} }

Problema PR 9.9

En el archivo de acceso direct° esc.dat se almacena la informaciOn de los alum-nos de una escuela utilizando estructuras. Se registra la siguiente informacion de cada alumno:

• Matricula del alumna (entero).

• Nombre y apellido (cadena de caracteres).

• Materias y promedios (arreglo unidimensional de estructura),

• Materia (cadena de caracteres).

• Promedio (real).

Escribe un programa en C que obtenga lo siguiente:

a) La matricula y el promedio general de cada alumna.

b) Las matriculas de los alumnus cuyas calificaciones en la tercera materia sean mayores a 9.

c) El promedio general de la materia 4,

rkoo: esc.dat

Page 380: Fundamentos de programacion - piensa en C

364 Capitulo 9. Archivos de datos

Programa 9.20

Afinclude ‹stdia.h>

f* Escuela. programa, al recibir comp data un archiva de acceso directs que contiene

w■informacion de los alumnos de una escuela, genera informacion estadistica ■►impartante. *1

typedef struot

{ char materia[26]; int calificacian;

} matcal;

typedef struot {

f* Declaracian de la estructura metal. */

/* Oeclaraciin de la estructura alumna. *1

hat matricula; char nombre[23]; matcal cal[5]; /* Observa que un camps de esta estructura es a su vez estructura. *f

} alumna;

void Fi(FILE *); void F2(FILE *);

1* Prototipos de funciones. *1 float F3FILE *);

void main(void) { float pro; FILE *ap; if ((ap = fopen('esc.dat', 'r')) != NULL) {

Fl(ap); F2(ap); pro m F3(ap); printf('\ninPROMEDIG GENERAL MATERIA 4: 96r, pro);

1 else

printf('\nEl archiva no se puede abrir'); fclose(ap);

1

void F1(FILE *ap) f* La funcion ascribe la matricula y el promedio general de cada alumna. *f { alumna alu;

mss; float sum, pro; printf('‘nMATRICULA y PROMEDIOV);

Page 381: Fundamentos de programacion - piensa en C

Problemas resueltos 365

freed (aalu, sizeof(alumna), 1, ap); while (!feof(ap))

printf('‘ratricula: Psd', alu.matricula); sum = 2.2; for (j=2; j<5; j++)

sum += alu.cal[j].calificacion; pro = sum / 5; printf('itPromedia: 96f', pro); fread(aalu, 102001(alumno), 1, ap);

} }

void F2(FILE *ap) f* La funcian ascribe la matricula de las alumnas cuya calificacian en la utercera materia es mayor a 9. *f { alumna alu; int j; rewind(ap); printf('‘n‘nALUMNOS CON CALIFICACION > 9 EN MATERIA 3'); fread(aalu, alinef(alumno), 1, ap); While (!feof(ap))

if (alu.cal[2].calificacion 9) printf('‘nMatricula del alumna: 96d', alu.matricula);

fread(841u, SiZ001(alumno), 1, ap); } }

float F3(FILE *ap) Esta funcion abtiene el pramedio general de la materia 4.

alumna alu; int i = 2; float sum = 0, pro; rewind(ap); fread(8alu, sizeof(alumno), 1, ap); while (Ifeaf(ap))

J.++; sum += alu.cal[3].calificacion; fread(Zialu, sizeof(alumno), 1, ap);

} pro = (float)sum f i; return (pro); }

Page 382: Fundamentos de programacion - piensa en C

366 Capitulo 9. Archives de dates

Problema PR 9.10

En un archivo de acceso direct(' se almacena la informacion de los alumnos que presentaron el examen de admisiOn a una universidad privada de la Ciudad de Me-xico. Se almacena la siguiente informacion de cada alumno en una estructura:

• Clave del alumno (entero).

• Nombre del alumno (cadena de caracteres).

• Carrera universitaria (entero).

• Promedio de preparatoria (real).

• CalificaciOn examen de admisiOn (real).

• Telefono (cadena de caracteres).

Observa que para indicar la carrera en la que se quiere inscribir el alumno, se utili-za: 1 para Economia, 2 para Contabilidad, 3 para Derecho, 4 para Ingenieria en Computacion y 5 para Ingenieria Industrial.

Escribe un programa en C que realice lo siguiente:

a) ❑btenga el promedio general del examen de admisiOn.

b) Genere un archivo de alumnos admitidos pot cada carrera. Se consideran ad-mitidos aquellos alumnos que sacaron por lo menos 1300 puntos en el examen de admisiOn y su promedio de preparatoria sea mayor o igual a 8, o bien ague-Hos que tengan un promedio mayor o igual a 7 pero que en el examen hayan sacado un puntaje superior a 1399 puntos.

c) Obtenga el promedio del examen de admision de los alumnos admitidos en cada carrera,

Dato: alu .dat

Programa 9,21

#include ‹stdio.h>

I* Examen de admision. El programa, al recibir coma data un archiva de access direct(' que cantiene w informacian sabre los alumnus que presentaron el examen de admisian a una wuniversidad, genera informacion impartante para el Departamento de Cantral .Escalar. *1

Page 383: Fundamentos de programacion - piensa en C

Problemas resueltos 367 j

typedef stroct

f* Oeclaracion de la aatroctora alumna. *1

int clove; char nombre[20]; int carrera; float promedio; float examen; char telefono[12];

} alumna;

float F1(FILE *); void F2(FILE *,FILE *, FILE *, FILE *, FILE *, FILE *); void F3(FILE *, FILE *, FILE *, FILE *, FILE *); /* Prototipos de funciones. *or

void main(void)

float pro; FILE *ap, *c1, *c2, *c3, *c4, *c5; ap = fopen('alu1.dat', 'r'); /* Observa que los archives carl.dat, car2.dat, car3.dat, car4.dat y car5.dat uPse Oren en la madalidad pare escribir y leer. *f c1 = fopen('car1.dat', 'we); c2 = fopen('cor2.dat', 'we);

c3 = fopen('car3.dat', 'we); c4 = fopen('card.dat', 'we); c5 foper('car5.dat', 'w+'); if ((ap!-NULL) && (c11AULL) && (c2!=NULL) && (c3!-NULL)

(c4!=NULL) && (c51=NULL))

{ pro = F1(ap); printf('‘nPROMEDIO EXAMEN OE ADMISION: 96.2P, pro); F2(ap, c1, c2, c3, c4, c5); F3(c1, c2, c3, c4, c5);

} .111

printWinEl o los archivos no se pudieron abrir'); fclose(ap); fclose(c1); fclose(c2); fclose(c3);

fclose(c4); fclose(c5);

}

float Fl(FILE *ap) /* Este funcion obtiene el promedio del examen de admision. */ { alumna alu; float sum = 0, pro; int i = 0;

Page 384: Fundamentos de programacion - piensa en C

368 Capitulo 9. Archivos de datos

fread(Balu, eizeoflalumno), 1, ap); While (!feof(ap))

i++; sum += alu.examen;

fread(Balu, eizeof(alumno), 1, ap);

} pro = sum / i; return (pro);

}

void F2(FILE *ap, FILE *c1, FILE *c2, FILE *c3, FILE *c4, FILE *c5) 1* Esta funcion genera un archivo de los alumnos admitidos en coda una de *las carreras de la universidad. *1

alumna alu;

rewind(ap); fread(&alu, sizeot(alumno), 1, 8p); while (!feof(ap)) {

f* Se analiza si el candidate es admitido a la universidad. *f 11 (((alu.exemen ›= ma) && (alu.promedio 5.= B)) ((alu.examen ›= 41462) (alu.promedia 5.= 7)))

switch (alu.carrera)

case 1: rwrite(&alu, elioof(alomna), 1, c1); break;

case 2: fwrite(Salu, sizeol(alumno), 1, c2); break;

case 3: fwrite(Balu, sizeot(alomno), 1, c3); break;

case 4: fwrite(Balu, 111001(alomna), 1, c4); break;

case 5: rwrite(201u, 812001(alumno), 1, c5);

break;

1 } fresd(8alu, eizeof(alumna), 1, ap);

1 }

void F3 (FILE *c1, FILE *c2, FILE *c3, FILE *c4, FILE *c5) f* Esta funcion se utilize pare obtener el promedio que consiguieron los oalumnos admitidos en cads una de las carreras. *1

alumna alu; float cal[5], sum; Int i, j;

Page 385: Fundamentos de programacion - piensa en C

Problemas resueltos 369

i = 2; sum = 0; rewind(c1); 1* Es impartante pasicionarse al inicia del archly°, puss

wde la oantrario se generaria un error al ejecutar el programa. */ fread(&alu, 142001(alumno), 1, c1); While (Ifeaf(c1))

{ f++;

sum += alu.examen; fread(2.alu, sizeof(alumna), 1, c1);

1 if (i)

cal[2] = (sum / i); Sias

cal[2] = 2;

rewind(c2);

sum = 2;

= 0; fread(aalu, Siz001(alumno), 1, c2); while (Ifeaf(c2)) {

i++;

sum += alu.examen;

fread(34a1u, sizeof(alumno), 1, c2);

1 if (i)

cal[1] = (sum f i); else

cal[1] = 0;

rewind(c3); sum = 2; = 0;

fread(8alu, sizeof(alumno), 1, c3); While (!fecif(c3)) {

i++;

sum += alu.examen; fread(&alu, eizeol(alumna), 1, c3);

1 if (i)

cal[2] = (sum f i);

also ca1[2] = 3;

rewind(c4); sum = 2; = 0;

Page 386: Fundamentos de programacion - piensa en C

I 370 Ca pit ulo 9. Arc hivos de datos

fread(8alu, sizaat(alumna), 1, c4); while (!feof(c4)) {

i++;

sum += alu.examen; fread(&alu, Bizeaf(alumno), 1, c4);

1 if (1)

cal[3] = (sum 1 i); ass

cal[3] 2;

rewind(c5); sum - 0; i = 2; fread(&alu, sizeof(alumno), 1, c5);

(Ifeof(c5)) {

i++;

sum 1— alu.examen; fread(8alu, sizeof(alumno), 1, c5);

1 if {i)

cal[4] = (sum 1 i); 2122

cal[4] = 2; 1* Se imprimen las promedios de los alumnus admitidas en cada carrera. */ for (i=O; i<5; i++)

printf('InPromedia carrera %.2r, 1+1, cal[i]);

1

Problemas suplementarios

Problema P59.1

Escribe un programa en C clue, at recibir como data un archivo de texto formado par cadenas de caracteres, determine la longitud de la cadena MaS grande sin utili zar la funcion strlan,

Daw: arc1.-txt

Page 387: Fundamentos de programacion - piensa en C

Problemas suplementarios 371 1

Problema P59.2

Escribe un programa en C que, al recibir como data el archivo arc .txt compuesto por cadenas de caracteres, calcule el ruirnero de cada una de las vocales que se en-cuentra en el archivo. Por ejemplo, si el archivo contiene las siguientes cadenas de caracteres:

Mexico es la novena econamia del mundo,

pero tiene mis pobres que la mayoria de las poises europeas

can macraeconomias peores que la de Mexico.

El programa debe dar los siguientes resultados: a: 11

e: 19

1: 7

o: 17

u: 4

Data; arc.txt

Problema P59.3

Escribe un programa en C que, al recibir camp dato un archivo de texto compues-to pot cadenas de caracteres, determine cuantas palabras hay en el archly°. Cada palabra se separa pot media de un espacio en blanco. For ejemplo, si el archivo es el siguiente:

sa sa sa yacusa yacusa

le mando le mando le mando al maestro

El programa debe escribir que hay 13 palabras.

auto: arc.txt

Problema P59.4

Escribe un programa en C que, al recibir corn° dates una cadena de caracteres y el archive de text° arc2.txt, compuesto tarribie'n por cadenas de caracteres, determine

Page 388: Fundamentos de programacion - piensa en C

I 372

Capitulo 9. Archivos de datos

cua'xitas veces se encuentra la primera cadena de caracteres en el archive. Por ejem-p10, si el archive es el siguiente:

arc2.txt

sasaasassassssassas

ssssaaabbbsassbsasbbbasssss

sssssaaaaaaasssssasssassbbbsbsb

sssssabsabsbbbbsbabsas

y la cadena de caracteres es: sas

el programa debe regresar: la

Datos: cad(50] y arc2.dat (donde cad representa la cadena de 50 caracteres come

maximo)

Problema P59.5

Escribe un programa en C que, al recibir come date un archive de texto compues-to per cadenas de caracteres, forme un nuevo archive en el cual las cadenas apa-rezCan intercambiadas: Ia tiltima con la primera, is penatima con is segunda, y ash sucesivamente.

Data: arc.txt

Problema PS9.6

Escribe un programa en C que, al recibir come date el archive doc .dat compuesto per cadenas de caracteres, revise la ortografia del mismo y verifique si se cumplen las siguientes reglas ortograficas: antes de b va in, no n; antes de p va in, no it, y finalmente, antes de v va n, no m,

pato: doe dat

Problerna PS 9.7

Escribe un programa en C que, al recibir como dato el archive de acceso directo ads_ dat que contiene los registros de los alumnus de una escuela —algunos estan

Page 389: Fundamentos de programacion - piensa en C

Problemas suplementarios 373

repetidos- ordenados de mayor a menor en funciOn de su matrfcula, genere un nuevo archivo pero sin registros repetidos. Los campus de las estructuras ahnace-nadas en el archivo son los siguientes:

• Matricula del alumno (entero).

• Nombre del alumno (cadena de caracteres). • Carrera en la que est4 inscrito (entero).

• Prornedio del alumno (real).

Dato: ad5.dat

Problema P59.8

Construye un programa en C que, al recibir como dato el archive, arc .dat que contiene informaciOn sabre la matricula y tres calificaciones de los alumnus de una escuela, ordene ese archivo en forma ascendente considerando la matricula del alumno y genere un nuevo archivo arc 1.dat. Cabe destacar que la matricula del alumno es un valor entero y las tres calificaciones son valores reales. Por ejemplo, si el archivo se presenta de la siguiente forma:

arc .dat

51 8.7 6.7 8.9

15 7.8 7.6 5.8

11 7.8 9.6 9.9

32 B.B 9.9 9.7

96 8.9 9.1 9.9

29 9.3 9.6 9.B

despu6s de la ordenaci6n debe quedar de la siguiente forma:

arc1.dat

11 7.8 9.6 9.9

15 7.8 7.6 5.8

29 9.3 9.6 9.8

32 8.8 9.9 9.7

51 8.7 6.7 8.9

96 8.9 9.1 9.9

pato: arc .dat

Page 390: Fundamentos de programacion - piensa en C

1374 Capitulo 9. Archivos de datos

Problerna P59.9

Una comercializadora que distribuye pinturas e impermeabilizantes coma princi-pales productos, ubicada, en la ciudad de Monterrey, en Mexico, almacena, en un archive de acceso direct°, ordenado de menor a mayor en funeion de la slave, Coda la informacion relativa a sus productos:

• Clave del product() (entero).

• Nombre del product° (cadena de caracteres).

• Existencia (entero). • Precio unitario (real).

Escribe un programa en C que construya los siguientes modulos:

a) Yentas. El mOdulo registra la yenta de diferentes productos a un cliente —tienda. Obtiene el total de la yenta y actualiza el inventario correspondiente. El fin de datos para la yenta de un cliente es 0,

b) Reabastecirniento. Este modulo permite actualizar el inventario al incorporar productos cantidades— at mismo. El fin de datos es 0.

c) Nuevos Productos. El mOdulo permite incorporar nuevos productos al inventa-rio, El fin de datos es 0, Observa que estos se deberan. insertar en la posicion que les corresponde de acuerdo con su slave. Es probable que deba generar un nuevo archivo para resolver este modulo.

d) lnventario. El modulo permite imprimir el inventario complete.

Data: cam. dat

Problerna P59.10

En un hospital de Quito, en Ecuador, almacenan la inforrnaciOn de sus pacientes en un archive de acceso direct°, pacient BS dat, que se encuentra ordenado en forma ascendente en funcion de la slave del paciente. Los dates de cada hospita-lizado se almacenan en una estructura, cuyos campos son los siguientes:

• Clave del paciente (entero).

• Nombre y apellido (cadena de caracteres).

• Edad (entero).

Page 391: Fundamentos de programacion - piensa en C

Problemas suplementarios 375 1

* Sexo (caxacter). • CondiciOn (entero).

• Domicilio (estructura).

• Calle (cadena de caracteres).

• Ndmero (entero).

• Colonia (cadena de caracteres).

• 05digo Postal (cadena de caracteres).

• Ciudad (cadena de caracteres).

• Tel6fono (cadena de caracteres).

Escribe un programa, en C que obtenga lo siguiente:

a) El porcentaje tanto de hombres como de mujeres registrados en el hospital.

b) El nUmero de pacientes de cada una de las categorias de condiciOn.

c) El namero de pacientes que hay en cada categoria de edad: 0-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-89, 90-99, >=100.

Kota: Observa que Condition se refiere al estado de salud en que ingres6 el pa-ciente. Los valores que toma Condicion van de 1 a 5, y 5 representa el maxima grado de gravedad.

Data: pacientes.dat

9

Page 392: Fundamentos de programacion - piensa en C

PEARSON

Educacitin

ESBN 970-e6-C161.0- 1-

II

Eats' olare time urti treCIVIEN Cirianialtb einteil&r. liar arrterKkir y ham ver el leztdr, dot:.

pesclveir un "Nem. cOrno gnat su soluc6n, y I u ego DO mo pilog r mar osl a solucion

Iuti I izenc un iengkiale de programacion de gitd

Caractoristicas 13131.0 texto

6 Se expitca ClIA es Ur algoiiinic. cd.rna construsre Cliagrama 04:1 IIu y Min se

puede escribir un programa en C.

• SE ralesienien tea astrucEuras algoiltrnicas settled:iv= y FE4381i11WE.

• Se des ilk el %ma de Pencilyies. occiadas siempre al ceneeele de feduccion

Oa pi-tat-Awn

* prepenlan IQ* arrggli;g, uniclimen5igmales, y Kipg.411Kigimente

estudian los cairacteres y eadena& de marader.as y las estri_reguras y unionas.

SO

M#u3fl F arthrme c1116.5.

El nkoni de ixinVellad de o ienras iraisdcs an cede capiquk) aurrwAte en lorme gradual. Los ieelas

se exponen con amplt.E1 y claticlad. El aprenclizaja se realirma con gran cerdiclad de ejerolcios

diserkAdol; ey.presanynce ccmo elarnentos de ayucla imrra el anillIsis, razonarnieinto, practice y

entendimie-PRO Cie los coincepRos analizacros, Cada cedilla:143~a .c.tnidDs. secoones, tow cxxi

raublemas re uetlr F eLi terra de e$1.xlio yr OtLH in riFokilerrae a irecAvei

Visileinos en: maw. pejMoneducaa itirkret