Issuu on Google+

Fundamentos de Programacion

L

Osvaldo Cairo


Fundamentos de programackin. 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 • Cos ta Rica • Chile • Ecuador Espana • Guatemala • Panama Puerto Rico • Uruguay •Vcnciuela


/natos de onalogaciembibliogrAfica 1-CAIRO, OSVALDO Dupdamentes de programadon. Plena en C PEARSON EDUCACION, Mexico, 2006 ISDN: 970-26-0810-4 Area: Commode& Formats: 1.83 x 233 cm

Nginas: 392

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 transmilirse, 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


CONTENIDO xi

Notas del autor Presentacian

xv

Ag radecimientos 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

MIN •1111 1111111111111...1111. 10

MI ,11111111111. MIN MEM MN •11.11111111111111111111111111.• MEM

1.4 Oceradores •••••.......••••••••••••••■ ••••••••••••••••••••••••.......••••••••••••■ ••••••••••.1112 1,4.1. Operadores ariunaicos

1.4.2. Operaclores aritmOticos simplificados 1.4.3. Operadores de incremento y decrement°

...........................

1

.4.4. Expresiones lOgicas • ••• ••■ •••

••• ••• ••• ••• ••• •••

.........13

V" se. 1•••••••••••••• MI MI .11.1 15

1.4.5. Operaclores relacionale,s........................................................ 15 1.4.6. Operadores lOgicos 1.4.7. E operador coma ••••..............•••••••••••..............•••••••••••............16 1.4.8. Prioridades de los operadores ................................................17 ........11...11,11111111"•••••••••■■ .11.111111111 16


Contenido

I vi

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

.89 3,1, Introduccidn . 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 152 4.4. Paso de funciones como param ' etros 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


vii

Contenido

213

Capitulo 6 Arreglos multidimensionales

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

253

Capitulo 7 Caracteres y cadenas de caracteres 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 287

Capitulo 8 Btructuras y uniones

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 .............•••••.298 8.2.4. Eanicturas con arreglos 8.3. Uniones ...••••.•.......................................................•••..••••••••.•...........301 8.3.1. Declaration de uniones .304 Problernas resueltos 326 Problernas suplernentarios ..•••••••••• ..11.•

......

333 Capitulo 9 Arthivos de dates 9.1. Introduccion ....................................................................................333 9.2. Archivos de texto y nieloclo de acceso secuencial 9.3. Archivos de acceso directo ............................................................343 Problernas mueltos Pnoblemas suplementarios INN MEM N.

"1435 1


A Facundo, Silvia, Maria y Jose


PRESENTACION Este libro esti dedicado a todas aquellas personas que necesitan aprender a resolver 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 resolver 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 programacion 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 unidimensionales 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.


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.


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 fundamentales pars mantener siempre la metivacion y los deseos pot culminarlo. Quiero agradecer tanto a aquellos que me apoyaron come a los que no lo hicieron, 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.


CAPITULO Algoritmos, diagramas de flujo y programas en C 1.1 Problemas y algoritmos Los humanos efectuamos cotidianamente series de pasos, procedimientos 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 ejemplo, decidimos banamos. Posteriormente, cuando tenemos que ingerir alimentos tambien seguimos una serie de pasos que nos permiten alcanzar 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.


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

I2

mFormalmente definimos un algoritmo coma un conjunto de pasos, procedirnlentos 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 Para 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. cebolla finamente picada. 2 dientes de ajo finamente picados. 'or 2 taza (125 g) de tomato finamente picado.

1 12


1.1 Problemas y algoritmos

taza (32 g) de almendras peladas y picadas. 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.

'/4 1 /4

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

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 fuego, deja que se enfrie la mezcla y ponla en una cazuela, preferentemente 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 cucharadas del vinagre en el que se cocieron los chiles. Mezcla bien y afiade 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 yemas 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 revuelca 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,

3

I


I4

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.

PROBLEMA

Analisis del pi-able=

Construccion del algoritmo

Etapa

Etapa 2

Verificacion del algoritmo 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

RGURA 1.2 Modulos o secciones de an algorinno,

IMPRESION DE RESULTADOS


1.2 Diagramas de flujo

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 importante, 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 programa 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

CD

Explicacion del simbolo 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 mernoria, etc. utiliza para representar una decision. En su interior se almacena una condici(5n, y, dependiendo del resultado, sc sigue par una de las ramas o camincs altemativos. Este simbolo se utilie za con pequerias variaciones en las estructuras selectivas if -else que estudiaremos en el siguiente capitulo. ad coma en less estructuras repetitivas for, while y do-while, que analizaremos en el capitulo 3.

5i


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 almacena 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. Expresa escritura.

II 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, subproblem, 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 generalmente esta relacionado con el proceso de toma de decisiones. Ademb, es muy comb repetir un conjunto de pasos.


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, colocados 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.macion, 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.


I8

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 posteriorrnente 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 estructurados. 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 principalmente los adores, los reales y los caracteres, TABLA 1.2. Tipos de datos simples 71po de flatus en C Description int Enteros float Reales long Enteros de largo alcance double Reales de cbble precision char airacter

Rango -32,768 a +32,767 3.4 X 10-38 a 3,4 X 1038 -2'147,483,648 a 2'147,483,647 1.7 X 103" a 1.7 X 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


1.3 Tipos de datos

9I

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 programacion 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 reservadas 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


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; const char cal = 'f';

/* /* f* f*

nul nu2 rel cal

es as es as

una una una una

constante de tipo entero. *or canstante de tipo entero. */ constante de tipo real. *i constante de tipo caracter. */

Otra alternativa es la siguiente: Mdafine nul 20

Melina nu2 15 ffidefine rel 2.18 fdefins cal 'f'

1* nul es una constante de tipo entero. *i f* nu2 es una constante de tips entero. */ f* rel as una constante de tipo real. *i 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 unitarios, 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


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, constante o variable. Observa, que la instruccion finaliza con punto y coma: ; . Analicemos a continuacion el siguiente caso, donde las variables reciben un valor a traves de un bloque de asignacion. void main(void) { int val, va2; float rel, re2; char cal, ca2; val va2 val rel re2 cal ca2

= = = = =

13; val + 15; 15; 3.235; re1; 't'; '7';

f* f* i* f* f* f* f*

Asignacion del valor 12 a la variable val.*/ Asignacion del valor 25 (expresidn aritmetica) a va2. */ La variable val modifica su valor. *f Asignacion del valor 3.235 a la variable real rel. */ La variable re2 tome el valor de la variable rel. */ Asignacion del caracter 't' a la variable cal. *I 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; re2 - 6.485; float ref= 3.25, 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.


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 operadores 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). Operadores aritmeticos Operador aritrnetico Operacion

TABLA 1.4_

+

Ejernplos

Resuitados

x = 4.5 + 3;

v - 4.5 + 3;

x - 7 v - 7.5

Resta

x=4.5 - 3; v = 4.5 - 3;

x - 1 v = 1.5

Multiplicacion

x = 4.5 * 3;

x = 13 v = 13.5 v = 12.0

Surna

v = 4.5 * 3; v = 4 * 3;

Division

x = 4 / 3; x v v v v

5!6

Modulo(resiclun)

x v v

= 4..0 / 3.9; = 4 / 3; = 4.9 / 3; (float) 4 / 3; = ((float) 5 + 3) / 6;

x x v v v v

= = = = = =

1 1 1.9 1.33 1.33 1.33

x 1 15 511 2; (15 % 2) 2; v = 9.9 ((float) (15 % 2)) / 2; v 9.5


'3 1

1.4 Operadores

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 Op emeld ri

Operador

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 correspondiente equivalencia. Considere que x y y son variables de tipo entero (int x, y). TARA 1.6. Operadores aritmeticos: forma simplificada de use Operadar aritrrietico

Forma simplificada de use +=

Ejernpios x -- 6; y -- 4; x i— 5; x4 Y;

Equivalencia

Resuitados

x = 6; y - 4; x= x + 5; x- x + y;

x y x x

x = 10 Y =5 x=7 x-2

=6 -4 =11 -15

.„

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

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

*,

x = 5;

x = 5;

x=5

y = 3; x *= 4;

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

y= 3 x = 20 x = 60

x *= y;

continua


I 14

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

t6. Continuacion Forma Operador simplificada &it-medal de use

TARA

i

111

l=

!Its=

Ejemplos

Equivaiencia

Result-odes

x = 25; y — 3; x f= 3;

x = 25; y — 3; x = x f 3;

x

x— x / y;

x = y = x= x =

/=

Y;

25 3 8 2

x = 29; r = 3; x %= 12;

x = 29;

x = 20

r

= 3; x= x% 12;

Y = 3 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. Considera que x y y son variables de tipo entero (int x, y). TABLA 1.7. Operadores

Operador ++

de incremento y decremento Operatien Ejemplos x - 7; Incremento

Decrement°

Result-odes x - 7

y = x++;

y = 7 x — 8

x 7; y - ++x;

x=7 y = x = 8

x = 6;

x - 6

Y = x--;

y = 6

x 5 x 6; y = --x;

x=6 Y = 5 x


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). Operadores relacionales Operador relacional Operacian

TABLA 1.8.

Ejernplos

Resultados

Igual a

res =

. h . ......

i=

Difererite de

res

' a'

<

Menor que

res = 7 c 15;

res = 1

>

Mayor que

res

= 22 > 11 ;

res = 1

c=

MenOr 0

res = 15 c= 2;

res = 0

p-=

Mayor o igual que

res

res = 1

=

igual que

i=

;

res

=

e

' b• ;

res

=

1

ipi

= 35 >=- 20;

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

El valor de res es igual a la,

/* 0 > 1 (falso)

0

*/


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

16

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). Operadores lOgicos Operador logic째 Operacion Ejemplos

TAMA 1.9.

Negacion

&&

ConjuncOn

DisyunciCm

Resuitados

x

(1(7 r 15));

Y

( 10 );

/* (10)

1 */

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

0 && 1;

x=

(35 > 20) II (20 <= 10);

Y =

1* 1 11

a

*/

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)

Verdadero Verdadero Faso

1

1

0

(.1

(P II

(P &&

Falso Verdadero Verdadero 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 0

Falso 0

Verdadero 1

Verdadero 1

Falso 0

Falso 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). Observemos a continuation diferentes caws en la siguiente tabla.


"I

1.4 Operadores

TARA 1.11. USOS del operador coma

Expreskin x- {v =a, v*

5);

(v += 5, v % 3);

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

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

Equivalencia

Resuitados

v= 3

v= 3

x = v * 5;

x = 15

• = v + 5;

v=

x = v Rs 3;

x=2

y = (15

z);

&& y,

10);

y= 1

• = ( 2 >= y);

z=1

x = y && z;

x

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

(1 {Y && z)));

a

(35 > 40) && y;

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

1

y= 1 z=0 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 (mayor)

>, <=,

y-

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


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 esquematizaei6n 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,

D, C, B, A

/* Se leen los datos. *1

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


1.5 Construccion de diagramas de flujo

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â&#x20AC;&#x201D; ING of 6

LA, ING, PRO

/* Cgculo del ingreso total y del promedio.

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

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

Donde: ING

19 I


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 CLA

1

105

2

110

3

115

4

120

5

lae

SU1

SU2

Sal

Resultados SU4

SUS

SUB

12,167 14,140 13,168 12,167 21,840 12; 167 8,750

9,745

9,745

9,745

8,750 11,190

21,230 18,340 19,367 /9,367 18,340 22,180 9,645

9,645

9,645

9,800

9,645 10,280

11,14e 10,915 12,180 15,670 11,140 12,180

RIG

PRO

85,649 14,274.83 57,925

4,654.16

118,824 19,804.00 58,660

9,776.66

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:

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

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

9uperficie

(base * altura) / 2

Firmula 1.1


1.5 Construccion de diagramas de flujo

Diagrarna de flujo 1.3

INICIO

/BAS, ALT /

SUP 4-

BAS * ALT / 2

/* Lectura de datos. *1

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

V Escritura de resultado.

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 BAS

ALT

Resultado 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

21 [


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 â&#x20AC;&#x201D;c en este casoâ&#x20AC;&#x201D;, 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


1.6 Programas

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. â?&#x2018;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.

23 I


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 22 MY

YY RR


1.6 Programas

25 I

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 (scan s) y escritura {prints). En la tabla 1.16 se presenta el formato de Las variables de acuerdo con su tipo. Formato de escritura de las variables Formato Explicacion

TABLA t 1 6.

%u

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

/id psi

%if

Escribe enteros de 2 bytes (int). Irnprime enteros de largo alcance (long). Fseribe reales de 4 bytes (float). Escribe reales de (liable precision, 8 bytes (d DU Ole).

%e

Irnprime en forma exponencial.

gtg

Imprime en %I o use en funcion del

sbc

Escribe un caracter de un byte (char).

sras

Escribe una cadena de caracteres, que Wrnina con '

tan:Lino del nornero.

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

la

7.2576;

in struccion:

printfr %f %d %f

x, y, z, t);

produce el siguiente resultado:

6.255566 4 7.257666 -5


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 Int y = 4, t = -5;

7.2576;


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 â&#x20AC;š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: scanf('%d %d %d %d', &A, &B, &C, SD); printf('In %d 26d %d %d ', 0, C, 6, A); }

'1;

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.


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

28

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 â&#x20AC;š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}

{


Problemas resueltos

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â&#x20AC;&#x201D; , 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++; ++7; x 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

29


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 -â&#x20AC;š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('â&#x20AC;&#x2DC;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: en pies.

PIE es

una variable de tipo real que representa la longitud del product()

LIB es

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


Problemas resueltos

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.

31 1


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

I 32

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

RAD, ALT

una variable de tipo real que representa el radio del cilindro. es una variable de tipo real que representa la altura.

RAD +ZS ALT

Consideraciones: â&#x20AC;˘ El volumen de un cilindro lo calculamos aplicando la siguiente formula:

Volumen = a * radial * altura

Formula 1,2 Donde: Tr = 3.141592 â&#x20AC;˘ La superficie del cilindro la calculamos como:

Area = 2 *

* radio * altura

Formula 1.3 A continuaciOn se presenta el diagrama de flujo correspondiente.


ProbIernas resueltos

Diagrarna de flujo 1.5

Nici,-..D

T RAD, ALT

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 â&#x20AC;šstdio.h> #include â&#x20AC;šmath.h> 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. i*

RAD, ALT, VOL y ARE: variables de tipo real. void main(uoid)

i

*1

331


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

I 34

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

Obtiene 0 send de x.

ain(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, Devuelve el valor absoluta de x.

labs(x) Imod(xl,x 2) log (x)

Obtiene el resto de xi entre

misnâ&#x2013;şo signo que

x2, ,con el

Devuelve el lagaritma natural de x, in (x) , x

10910( x) Pdvi{x,

Expllcacion

y)

sqrt(x)

Devuelve el lagaritma base 10 de x, Potencia, xY x a O,y Obtiene

la rain cuadrada de x x

0.

10910(x), x

0.

0.

xi,

0,


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: â&#x20AC;˘ 1 acre es igual a 4047 rn2. â&#x20AC;˘ 1 hectaiea tiene 10,OOO ni2. Diagrama de flujo 1.6

rNiao

ECA

ECA ECA * 4047 10000

ECA


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

36

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


Problernas resueltos

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

37


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

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)

PER


Problemas resueltos

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 â&#x20AC;š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);

39


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;


Problemas suplementarios

k = * 3 + --j *2 - 3; printf('â&#x20AC;&#x2DC;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, printf('1nE1 valor de m es: m); }

(k

I)));

Problema P51.3 Construye un diagrama de flujo y el correspondiente programa en C que, al recibir como datos dos mimeros reales, calcule la suma, testa y multiplicaci6n de dichos 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 recibir 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).

41


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

I 42

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


Problemas suplementarios

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. 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. MI N

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

VMS —

DIS(Metros) TSE (Segundos)

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

VKH =

VMS * 3600(Kifolnetros) 1000(hora) Formula 1.10

43 I


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

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

ALT es

Cons ideraciones: â&#x20AC;˘ in cono tiene La siguiente forma:

FIGURA 1.4


Problemas suplementarios

• 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 recibir 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.

45


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:

1 Nblumen = — * TC * radio' 3 Formula 1.16

Problerna PS1.13 Construye un diagrama de flujo y el correspondiente programa en C que, al recibir 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


Problemas suplementarios

• 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 coma datos las coordenadas de los puntos Pi , P2 y P3 que corresponden a los vertices de un tricingulo, calcule su superficie.

Datos: xi, vi,

X2, Y2, X3, Y3

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,

Donde: XI

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

41


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.


I SO

Capitub 2. Estructuras algoritmicas selectivas

Las estructuras algoritmicas selectivas que estudiaremos en este capitulo son y switch, Cabe destacar que cuando las estructuras las siguientes: 11, if 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 â&#x20AC;&#x201D;hacia abajoâ&#x20AC;&#x201D; 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

2.1 Estructura selectiva simple if FIGLl


2.2 La estructura selectiva

511

if

En lenguaje C, la estructura selectiva if se escribe de la siguiente forma: /* El cord unto de instrucciones muestra la sintaxis de estructura if en el lenguaje C. */

la

10

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

E s true tura selective If

Si 'Aprobada' ------------A


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 corrida 1

Data

Resuttado

PRO

6.75

aprobado

2

5.90

3 4

4.00 8.80

aprobado

5

9.35

aprobado

A continuacion se presenta el programa correspondiente. Programa 2.1 #include â&#x20AC;š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).


2.2 La est ructura selectiva if

Diagrama de fluja 2.2 INICIO

PRE

NPR

Es truoura selectiva if

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

53


Capitulo 2. Estrueturas algoritmicas selectivas

I 54

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 condicite 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

2.2 Extructura selectiva doble if - els e FIGURA

OPERACION 2


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;

else ‹operacion2r;

2

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

Estructura selectiva if-else

1' "REPROBAIDO"

'APROBADO'

4

CHND


Capitub 2. Estructuras algoritmicas selectivas

I 56

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

Mirnero de corrida 1

Dato

Resuitado

PRO

2

4.75 6.40

Rcprobado 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 â&#x20AC;˘ 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).


2.3 La estructura selectiva doble if -else

57

Diagra ma de flujo 2.4

C

INICKI

/ PRE /

Estructura selectiva it-else

2

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: "); scanIC 261', &PRE);

if

(PRE < 1509) NPR - PRE * 1.11; 0100


Capitub 2. Estructuras algoritmicas selectivas

58

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

SELECTOR

ValorN

Valor' Valor2 ACCIONI

ACCION2

V ACCIONN+1

FIGURA 2.3

Estructura selectiva msittipie

switch

V ACC ONN


'1

24 La estructura selectiva multiple switch

En el lenguaje C la estructura selectiva multiple

switch se

5

escribe de esta forma:

f* El conjunto de instrucciones muestra la sintaxis de la estructura switch *en C. */ . . . SWitChl<selector>) case ‹valor,› break; case <v alor? break; cats <valor? break;

: caccion,›; /* Es necesario escribir break pare no evaluar los *otros cases. */ : z a cci : <accione;

} 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.

SELECTOR

Valor V ACCION1

NrelOr5. 6

Valor2,3.4

De otra forma

V

V

V

ACCION2

ACCION3

ACCIONx

ACCION y

FIGURA 2.4 Evtructura sekctiva milltipk switch


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?. break; case ‹valor,r case <valor? ease <valore break; case <valor? case <valor?' break;

default : break;

: <accione; /* Para salir del switch */

: <accionir;

: <acci6113>;

: ‹accien,›;

1 accion,;

-

-

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: T/5

Si OP

T ** T Si OP 2 V' - -NT) 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.


24 La estructura selectiva multiple switch

61 I

Diagrarna de flujo 2.5 lrilCI Est-Kt-um selectiva switch OP, T

V OP

1

2

3,

De otra forma

■ Y4-175

4—T ** T

*—B * T/2

Y

1

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*: ');


Capitulo 2. Estructuras algoritmicas selectivas

I 62

scant( 9191 awitchi0P)

&OP, &T);

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 2

3.5% 4.1%

3 4

4.8% 5.3%


2.4 La estructura selectiva multiple switch

63

Diagrama de flop 2.6 C5ICD lIN Estracture selective switch /NIV SAL

NIV 2

SAL 4- SAL * 1.035

3

SAL 4- SAL * 1.041

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; NIV; printf('Ingrese el nivel academics del profesor: '); &NIV);

int


Capitula 2. Estructuras algoritmicas selectivas

I 64

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

â&#x20AC;˘ ;

â&#x20AC;˘);

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;

}

print1V01 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).


25 Estructuras selectivas en cascade

65

Diagrama de flujo 2.7

Estructuras selectivas en cascad.as if-else

Sf

R, 8, P ____,—

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

*/


Capitulo 2. Estructuras algoritmicas selectivas

I 66

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

Industrial: 1

>6

Promedio 8.5

Telernaica: 2

>5

> 9.0

ComputaciOn; 3

>6

> 8.8

7

9.0

Mocanica: 4

DatOS: MAT, CAR, SEM y PRO


25 Es-tructuras selectivas en cascara

67

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

De atm forma

"Error an la carrera" â&#x20AC;˘-_------

A continuaciOn presentamos el programa correspondiente. Programa 2.8 #in clucle â&#x20AC;šstdio _Fp. If* Asistentes.

I


Capitulo 2. Estructuras algoritmicas selectivas

I 68

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.


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

Dates:

R, T

<

820

y 4 (variables de tipo entero).

Diagrarna de flujo 2.9

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

R, T,

Donde: eva

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

2


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


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) â&#x20AC;ş- 0) printf("\nPar");

else printf("\nImpar");

I


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.


Problemas resueltos

73

Programa 2.11 #include â&#x20AC;š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; 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); }

float

');

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


74

Capitulo 2. Estructuras algoritmicas selectivas

Diagrama de flujo 2.12

INICIO

T, P, N

No

Si

"P tiene que ser

diferente de cero" ,_ _.------- â&#x20AC;&#x201D; ir

"Se comprueba la igualdad" --.. ____-------

"No se comprueba la igualdarl" --- ---------

Programa 2.12 #include <stdio.h> #include â&#x20AC;š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 void main(void)

f

tip entero.

*/


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

X2 + (X3 — 18)

Si 25 < X S 50

0

Para otro valor de X

Dato: x (variable de tipo entero).

25


76

Capitulo 2. Estructuras algoritmicas selectivas

Diagrama de flujo 2.13

Nmio X

T Y4— X**S-12

r '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. */


Problemas resueltos

77

void main(void) float Y; int X; printICIngrese el valor de X: '); scaniCRid', &X); if (X â&#x20AC;š 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â&#x20AC;&#x2DC;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 2 5 6 7 9 10 15 20

Estados Unidos Canada America del Sur America Central Mexico Europa Asia Africa Oceania

0.13 0.11 0.22 0.19 0.17 0.17 0.20 0.39 0.28


Capitulo 2. Estructuras algoritmicas selectivas

I 78

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

/CIA, TIE/

CIA

5

7.9

6

10

15

20

De otra frame

w

V CO3 1- TIE • 0.13 /60

CO3 1- TIE *C22 / se

COSI- TIE *0.17 /60

COSI-TIE•0.99/ fig

ql■

_1

lir COS 4-TIE•011/ 99

CO3 4- TIE • 0.19 /00

CIA, TIE, 003

CO3 •- TIE • 0.20/ el

CO3 •— TIE • 0.29 /00

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


Problemas resueltos

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%. 2.6 Tipo de tratamiento

TABLA

Corfoldienteldia

1

2800

2

1950

3

2500

4

1150

79 1


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

(iqci6) /TRA, EDA, DIA

TRA 1

2 COS 4— DIA *195111

COS (— DIA * 286431

De otra forma

4

3 COS (— DIA * 25412

COS (— DIA * 1150

COS <— —1

No "La clove as inearrecta"

cos I— COS * 6.85

Pr CLA, TIE, COS L

---r----

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


Problemas resueltos

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

COS = DIA * 2800; break; COS =- DIA * 1950; break; COS = DIA * 2500; break; COS = DIA * 1150; break; default: COS = -1; break;

case 1: case 2: case 3: case 4:

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.

811


Capitub 2. Estructuras algoritmicas selectivas

I 82

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

/

CAT 3,4 2

De otta forma RES 0â&#x20AC;&#x201D; 0

RES

4â&#x20AC;&#x201D; 1

RES 4- 0 0-4

tti Si "El empleado con slave", CLA, "reime las condiciones pare el puesto"

"El empleado con chive", CLA, "no mine las condiciones pare el puesto"


Prob le mas resueltos

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

83

I


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


Problemas suplementarios

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

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

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;

85 1


Capitulo 2. Estructuras algoritmicas selectivas

I 86

Xg

Si (X mod 4) = 0

(X2 T- 14) /X]

Si (X mod 4) = 1

Y = f (X) + 5 VT4

Dato: Y

Si (X mod 4) .= 2 Si (X mod 4) = 3

(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

Medidas de volume!)

Medidas de peso

1 pulgada 25.40 milimetros 1 pie3 0.02832 metros3 1 °rim = 28.35 grams 1 yarda 0.9144 metros 1 yarda3 = 0.7646 metros3 1 libra = 0.45359 kilograrnos 1 ton. inglesa = 1.0160 1 ruilla s 1,6093 kildwittros 1 pintas 0.56826 litros toneladas


Problemas suplementarios

87i

TARA 2.7 ContinuaciOn

Medidas de longitud

Medidas de volurnen

1 pulgada2 = 6:452 coritir . Betros2

1 gitIon N. 4,54609 litros

1

Medidas de peso

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


Capitulo 2. Estructuras algoritmicas selectivas

I 88

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:

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

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


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


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:


3.2 La estructura repetitiva f or

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:

91

1


Capitulo 3. Estructuras algoritmicas repetitivas

92

f*

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

for (V --- VI; V (<, <=, ›, proceso;

VF; V f*

*f

V (+, -) ID)

cuerpo de la estructura for

*f

Observa que en la estructura for la variable de control del ciclo va desde —VF—. el valor inicial —VI— hasta el valor final 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 acumuladores, 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.


3.2 La estructura repetitive f or

93

Diagrarna de flujo 3.1

Q.NTITC170 NOM g-

Estractura repetitiva f or

4- 1

MOM 4- NOM + SAL

Idâ&#x20AC;&#x201D; + 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.


Capitulo 3. Estructuras algoritmicas repetitivas

I 94

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 SAL

1 Inicio del ciao --).

Fin del ciclo

Resultados NOM 0

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

16

11 SOO 90

241676.15

A continuation se presenta el programa correspondiente.


3.2 La est ruct ura repetitive for

Programa 3.1 anclude â&#x20AC;š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.

95


96

Capitulo 3. Estructuras algoritrnicas repetitivas

Diagrama de flujo 3.2

Esttuctura repetitiva for 1 4â&#x20AC;&#x201D; 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°.


3.3 La estructura repetitiva

a MILE

Programa 3.2 #include â&#x20AC;š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 instrucclones. 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 realizamos 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 calcular el promedio, El ciclo se repite mientras tengamos calificaciones de alumnus. El diagrama de flujo de la estructura repetitiva while es el siguiente:

97 [


98

Capitulo 3. Estructuras algoritmicas repetitivas

• •

PI 4- PROPOSICION INICIAL

Faiso

PROCESO

PI 4—MODEFICACION DE PI FiGuRA

3.2

Enructura repeal:ha while.

representa la proposicion inicial. Debe tener un valor verdadero (diferente 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

Donde: PI

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


3.3 La estructura repetitiva a WHILE

process;

99

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 recibir 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

1 SPA<â&#x20AC;&#x201D; a

FAG

-r / FAG

EStrUalra tepetitiva while

3


I 100

Capitulo 3. Estructuras algoritmicas repetitivas

Ronde:

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

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:â&#x20AC;&#x2DC;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â&#x20AC;&#x201D;, SPA); }

EJ E Par10

3A

Construye un diagrama de flujo y el programa correspondiente en C que, al recibir 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

El fin de los datos esta dada par 0,

t.


3.3 La estructura repetitiva a WHILE

Diagrarna de flujo 3.4.

SUe 4,- 0 ailliCtUra repetitiva while

1 / lailA

/

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

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

L

sue

EFIND Donde: CUA es

una variable de tipo enters extendido (long) que almacena el cuadrado del flamer째 que se ingresa, sue es una variable de tipo long que se utiliza para almacenar la sums de los cuadrados.

101 1


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

*1

}

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 programacio'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 corresponde 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


3.4 La estructura repetitiva

103 I

DO-MILE

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

3

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 â&#x20AC;˘â&#x2013;ş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


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 realizados 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

PAG

SPA

do-while


3A La estructura repetitive

DO-WHILE

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 â&#x20AC;š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:â&#x20AC;&#x2DC;t'); scanf('W, &PAG); i* Observe que al utilizer la estructura do-while al menos se necesita un pago.*i 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

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 nOmina coma el promedio de los salarios. Dal-Os:SAL, SAL2 SAL3 ,..., 0

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

Donde: SAL T

105 I


1 106

Capitulo 3. Estructuras algoritmicas repetitivas

Diagrama de flujo 3.6

INICIO

ii, NOM 4-0 I q-0

v NOM 4— NOM + SAL I 4— I + 1

Estructura repetitiva do-while

SAL

No PRO'— NM i I

NON, PRO

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.


3.4 La estructura repetitiva

Pro

DO-MILE

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°. NOM y PRO: variables de tipo real. */

SAL,

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 promedio de dichos lanzamientos. Datos: N, LAN„, LAN,,

LAN

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.

Donde: N


108

Capitulo 3. Estructuras algoritmicas repetitivas

Diagrama de flujo 3.7

Estractura repetitiva do-while

Estructura repetitiva for

SLA4-SLAf N

SL&

SLA SLA + LAN I <â&#x20AC;&#x201D; I +


Problemas resueltos

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: scanf('W, &LAN); SLA = SLA + LAN;

, I);

} 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 recibir 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),

109 I


110

Capitulo 3. Estructuras algoritmicas repetitivas

Diagrama de flujo 3.8

'Error en el 91_0_1._

FAC A— FAC * I

1 I- 1 + 1

1

r

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

*,


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: 2, 7, 10, 15, 18, 23, -

., 2500

3 Diagrarna de flujo 3.9

CAME-1 SSE4— 0

14- 2

SSE 4— SSE + I

Sf 14-1 +5 CAM 4—

14— I+ 3

CAM[— 1

SSE


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 if (CAN)

I);

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 promedio 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


ProbIernas resueltos

1131

Diagrarna de flujo 3.10

No

I No

_IF 'Error en el Valor de N'

I K— I + 1

---------

No

i

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

SPA +—SPA + NUM

SPA, SIM fCIM

,-----

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.


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


1151

Problernas resueltos

Datos: CAL„ CAL,, ... , -I (CAL, es una variable de tipo real que representa la calificacion del alumno 1). Diagrania de flujo 3.11

1sTICICD R14-0 R2t— 0 R34— 0 R44— 0 R5 4— 0

4 / CAL

3

R14-R1 +1 R21—R2+1 R3 4— R3 + 1 T

R4 4— R4 + 1

R5 •c— R5 + 1

i

CAL

R1, R2, R3, R4, R5

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


I 116

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 311 #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 .â&#x20AC;š 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);

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.


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

No

V

SI

NUM "NUM debe ser un

entero positivo" ------r---

Sf

No

SI

NUM <â&#x20AC;&#x201D; MA or 2

MA .1â&#x20AC;&#x201D; NUM * 3 + 1

4, NUM ---------

FIN


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, • . .


Problemas resueltos

1191

Diagrarna de flujo 3.13

PRI 4- SEG •g-

PRI, SEG

I 4— 3

No

SIG 4— PRI + SEG PRI 4— SEG SEG 4— SIG I 4— I + 1

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


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 â&#x20AC;&#x2DC;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 cuales 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 votantes. 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).


Problemas resueltos

1211

Diagrarna de flujo 3.14 IHICID

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

VOT De airs forms

Cl

Cl + 1

C2 -4- C2 +1

C34- C3 + 1

C44- C4 + 1

VOT

1054- C5 + 1

SVO 4-(C1 +C2+ C3 +C4 +C5+ MU) P01 1- (C1 f MO)* 100 P02 4- (C2 MO)* 100 P03 1- (C.3 f MO)* UN P04 1- (C.4 f SVO) 2 100 P05 4- (C51 SVO)* 140 PON 0- (NU I SVO) 100

C1, P01, C2, P02, C3, P03 C4, PO4, C5, P05, NU, PON

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.


I 122

Capitulo 3. Estructuras algoritmicas repetitivas

Programa 314 #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 float P01, P02, PO3, PO4, P05, PON; printf('Ingrese el primer vote: '); scanf(464', &VOT); while (VOT)

2, NU = 2, SVO;

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: printf('knCandidato 2: 96d votes Porcentaje: 265.21-, printf('inCandidato 3: %d votes Porcentaje: %5.21-, printf('kneandidata 4: gsd votes -- Porcentaje: 965.2r, printf('knCandidato 5: %d votes -- Porcentaje: 965.2f', printf('inNules: %d votes -- Porcentaje: 965.21-, }

C1, P01); C2, P2); C3, P3); C4, PO4); C5, P05); NU, PON);


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 + — + ——••• 5 7 9

n = 1 -3

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

I.—I+ 2

RES 0—RES + (4.0/ I)

RES .—RES+ (4.0 / I) 3

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.


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. Ademas, debe obtener b matricula y el promedio tanto del mejor comp del peer alumno. Datos:

, 5,

MATI , CAL10 , CAL12, CAL

CAL14, CAL 5

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

• . •


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

IiliP1:104-g IFPRO 4-11

.1. MAT

3

No

Si SUM 4-

i

LIAPRO 11E11.4T, MEMO No

Si CAL I

/

PRO 4-

sna j

NAT, PAM SUP 4- SUM + CAL I 4- I + 1

IANIO PFIO MOAT IIIAT

IMEPRO 1- PRO IIELIAT

1- MAT

IWT

M)

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.

Donde: I


I 126

Capitulo 3. Estructuras algoritmicas repetitivas

y MEPRO son variables de tipo real utilizadas para almacenar el mejor 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. MAPRO

Programa 316 #include <stdia.h> f* Calificaciones. EL programa, al recibir un grupa de calificacianes de un alumna, abtiene el promono 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: scanf('961— , &CAL); 9JM += CAL;

11;

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


Problernas resueltos

Problema PR3.10 Construye un diagram de flujo y el correspondiente programa en C que, al recibir 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 perfectos 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

4

1

J 4-J + i

4.

127 I


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 numeros 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 general- 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 obtener la tabla de multiplicar).


Problemas suplementarios

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 + + 3

2

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 2

*

111

* ...1*/) 1

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 recibir 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 recibir come datos el peso, la altura y el sexo de N personas que pertenecen a un

129 1


Capitulo 3. Estructuras algoritrnicas repetitivas

130

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,„

Donde: N

PEEN , ALTN , SEXN

es una variable de tipo enter° que represents el amero de personas. una variable de tipo real que indica el peso de la persona i

PES„ es

N).

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.

ALT,

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

Si 0

12

<

15

Si 15 < X

30

Si 30 < X

60

Y=f(X) 4 * )0/ X2 +8

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


Problemas suplementarios

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 promedio 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 representan 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 precios 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,

,

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.

Donde: Li , L2, L3, L4, L5 y L6

Escribe un diagrama de flujo y el correspondiente programa. en C que realice lo siguiente:

131 I


Capitulo 3. Estructuras algoritmicas repetitivas

I 132

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 producidas 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 â&#x20AC;&#x17E;

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 N, is j s 4). vino en el ario i del tipo j

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 programa 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. Ni , N2 (variables de tipo enter que representan los ndmeros enteros pasitivos que se ingresan).

Darns:


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:

sen(x

,i x' X3 + )0 ) - it Si r 51

r 71

+-

..

. 째 debe ser menor o igual a 0.001. La diferencia entre la serie y un nuevo Vermin 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:

(variables de tipo entero que representan los nilmeros que se ingresan). NI , N2

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 123 12A4 12 3 4 5 12 3 4 56 12 3 4 5 12 3 4 12 3 12 1 Dato: N (variable de tipo entero que representa el ndmery que se ingresa).


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 continuadon (ejemplo para N = 7): 1 12 1 12 3 2 1 12 3 4 3 2 1 12 3 4 5 4 3 2 1 12 3 4 5 6 5 4 3 2 1 12 3 4 5 6 7 6 5 4 3 21

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 continuaeion (ejemplo para N = 7): 1234 5 6 7 12A4 5 6 1234 5 1234 123 12 1

Dato:

N

7 6 5 4 3 2 1 6 5 4 3 2 1 5 4 3 2 1 4 3 2 1 3 2 1 2 1 1

(variable de tipo entero que representa el ndmero que se ingresa).


Problemas suplementarios

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

Nokt:

T, P

12*R5 < 5850

y R solo pueden tomar valores positivos.

135


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 problema 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 expresa 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


Capital') 4. Funciones 1

138

en paralelo â&#x20AC;&#x201D;diferentes programadores se pueden encargar de diferentes funcionesâ&#x20AC;&#x201D;, 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 indica 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, principal. Par otra parte, la funci45n se escribe de forma similar al programa principal, peso con diferencias principalmente en el encabezado de la misma. Una funci6n resuelve un subproblema de forma independiente y se ejecuta solo cuando 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, paramelros 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 mismos 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 tipos 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 definidas. 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


4.2 Variables locales, globales y estarticas

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 instrucciones—, las cuales desaparecen luego de ejecutar el bloque. Cabe destacar que las variables locales tienen prioridad sobre las variables globales. Es decir, si tenemos una variable global entera i y una variable local entera tambi6n denominada 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 mismo 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 programa 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. representa el nombre de la funcion. Es conveniente utilizar un nombre representativo de lo que realiza la funciOn.

Nombre- de- funclan

se utiliza para indicar la lista de paeAmetros que recibe la funciOn (los analizaremos en la seccion 4.3).

Parilmetros

insrrucclones representa, COMO su nombre

que pertenecen a la funcion

lo indica, al conjunto de instrucciones

139 1


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 basicamente didacticas y dando por sentado que ya conoces y puedes desarrollar diagramas 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 primeros mimeros naturales, Programa 4.1 #include <stdio_hâ&#x20AC;ş /* 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);

int I;

1* Prototipo de funcien. */ /* 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);


4.2 Variables locales, globales y estaticas

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 funciOn es entero (int) y no tiene pardmetros. Las funciones pueden regresar resultados 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: El El El El El El El El El El

cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo

de de de de de de de de de de

1 es: 3 2 es: 3 es: 27 4 es: 64 5 es: 125 6 GS: 216 7 es: 343 B es: 512 9 es: 729 14 es: 1000

1411


I 142

Capitulo 4. Funciones

EiEIIFLO 4.2

Observa lo que sucede en la soluciOn del problema anterior al declarar una variable 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}; int I;

/* Prototipo de luncion. */ /* 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); } /* Declaracion de la funcion. *1 int cubo{vold} /* La funcion calcula el cubo de la variable local I. */ { /* Variable local entera I con el mismo nombre int I = 2; wg.que la variable global. */ return (I*T*I); }

El resultado que arroja el programa es el siguiente: El El El El El El El

cubo cubo cubo cubo cubo cubo cubo

de de de de de de de

1 2 3 4 5 6 7

es: es: es: es: es: es: es:

B B B B B B B


4.2 Variables locales, globales y estarticas

El cubo de B es: El cubo de 9 es: El cubo de 10 es:

B B 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 variable 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 previamente 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

â?&#x2018;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); let K = 5;

/* Prototipo de lunci6n. /* Variable global. */

void main (void)

{ int I; for (I - 1; I <- 3; I++) 11 0

;

void fl{void}

*/

143


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: El valor de la variable global es:

4 9

El valor de la variable local es: El valor de la variable global es:

4 13

El valor de la variable local es: El valor de la variable global es:

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


4.2 Variables locales, globales y estarrticas

int 13(vold); int f4(void); int K

3;

/* Prototipos de funciones. */

/* Variable global. */

void main(void) { int I; for (I = 1; I <- 3; I++) { printf('â&#x20AC;&#x2DC;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);

145 â&#x20AC;˘ 1


I 146

Capitulo 4. Funciones

Los resultados que arroja el programa son los siguientes: El El El El

resultado de la luncien 11 es: resultado de la funcion 12 es: resultado de la funcion 13 es: resulted째 de la funcion 14 es:

6 2

le 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 El El El

resultado resultado resultado resultado

de la de la de la de la

luncion 11 es: 24 luncion 12 es: 2 funcion 13 es: 14 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 programa 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 referencia se realizan mediante apuntadores. Un apuntador es una variable que contiene 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.


4.3 Parametros por valor y por referencia

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 parac Thetly que se utiliza es una copia de la variable I. printl("knEl cubs de gisd es: %d', cubo{I));

147 1


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 parametros por referenda.

Programa 4.6 #include â&#x20AC;š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( â&#x20AC;&#x201D;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 *);


4.3 Parametros por valor y por referenda

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 indirecciOn: 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 referencia, 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 utilizando 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);

void

*/

/* Prototipo de funciOn. El parametro GS por valor y de tipo entero. */

main(void)

{

int I, K = 4; for (I = i; I <= 3; I++)

149 1


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 â&#x20AC;š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. */


4.3 Parametros por valor y por referencia

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; /* Observa que se hace referencia a la variable global a. */ a = 5; 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

5 1 6 8

3 3 7 3

3 5 5 B 5

4 3 4 6 6

151


152

Capituio 4. Funciones

4.4. Paso de funciones corm parametros En la practica encontramos problems cuyas soluciones se podrian formular facilmente si pudiramos pasar funciones como parimetros. Por fortuna, en el lenguaje de programaci6n C es posible realizax esta actividad, es decir, pasar una funciOn a otra funciOn como parametro por referencia â&#x20AC;&#x201D;en el parametro se escribe la direcci6n de la funcionâ&#x20AC;&#x201D;. 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 y Y. */ { return {X-Y);

â&#x20AC;˘ x


Problemas resueltos

int Control(int (*apf) (int, int), int X, int Y) /* Esta funcift recibe como parametro otra funcion --la direcci6nâ&#x20AC;&#x201D; y dependiendo de cull sea data, llama a la funcion Soma 0 Rasta. */

{ int RES; RES = (*api) (X, Y); return (RES);

/* Se llama a in funcion 8uma o Resta. */

}

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, determine 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 â&#x20AC;š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);

1531


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

Ni) /* Esta funcion calcula el mayor divisor del

int mad(int

rainier° Ni. *f


Problemas resueltos

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, determine el miximo coman divisor de dichos ntimeros. (variables de tipo entero que representan los ntimeros que se ingresan),

Dal Os: NU1, NU2

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;

1551


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

return }

Prob bum PR4.4 Escribe un programa en C que, al recibir como datos N nitmeros enteros, determine 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

Programa 4,13 #include â&#x20AC;š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 *);

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

/* Prototipo Is funcion.

N) .


Problemas resueltos

/* Llamada a la funclon. Paso de parSmetros por valor y por relerencia *I

} printl("InWimero de pares: printICONCImero de impares:

PAR); IMP);

}

void parimp(int NUM, int *P, int *I) I* La foncidn incrementa el parametro o 1mpar. *I

o 'I, segdn sea el nftero par

{

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 alumnos que presentaron su examen de ad mision para ingresar a una universidad privada 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 . . . DatOS: CAL„ CAL,„.„ -1 {CAL, es

caci6n del alumna i). Programa 4.14 /*Include ‹stdio.hr /* Rango de calificaciones.

10

una variable de tipo real que representa la caLifi-

157 [


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


Problernas resueltos

159

Problema PR4.6 Escribe un programa en C que calcule e imprima la productoria de los N primeros ndmeros naturales. Dato:

(variable de tipo entero que representa el mimero de naturales que se ingresan, 1 c NUM 5 100). NW

Pregame 4.15

include â&#x20AC;š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 quiere calcular la productoria sea correcto. */ do { printirIngresa el nUmero del cual quieres calcular la productoria: '); scanir9dd', &NUM);

as

'EP

} Mine (NUM â&#x20AC;ş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 representan las temperatures registradas en el exterior en un periodo de 24 floras, encuentre,


I 160

Capitulo 4. Funciones

con la ayuda de funciones, la temperatura promedio del dfa, asi como la temperatura maxima y la minima con el horario en el cual se registraron. Dodos: TEM„ raturas).

TEM, (variables

de tipo real que representan las tempe-

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; /* Variables globales. */ float MAX = -50.0; 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; = 1; I = 24; I++) for { 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);


Problemas resuettos

print? ( ''OPromedio del dia: %5.21', (ACT / 24)); printf( â&#x20AC;&#x201D;0Mixlma del dia: %5.2f ItHora: %d', MAX, HMAX) ; printf ( 'â&#x20AC;&#x2DC;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 registran los promedios mensuales pluviales de las principales regiones del pais. Existen 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).

161 I


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


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 satisfagan 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: Ott; EXP = Expresion(T, P, 0); } Ft++; 0 = 0;

T, P, 0, EXP);


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, revisa principalmente la aplicacian de los parametros por referencia, porque tal vez hay alglin concepto que min no dominos. Programa 4,19 Oinclude â&#x20AC;šstdio.h> /* Funciones y parametros. */ int a, b, c, d;

/* Variables globales. */

Void funcionl(int, int *, int *); int luncion2(int *, int);

/* Prototipos de funciones. */

void main(void) { int a; a- 1; b - 2; c - 3; d 4; printl("Inskid %d sIsd "Ad', a, b, c, d); funcion2 (&a, c); a


Problemas resueltos

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 &â&#x20AC;˘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

7 7 7

3 10 10

6

2

3 10 3

4 11 3

6

5

3

4

165i


166

Capitulo 4. Funciones

Problema PR4.11 Analiza cuidadosamente el siguiente programa e indica que imprime. Si tus resultados 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. */ /* Prototipo de funcift. */

int F1 (int , int *); int A = 3; int B = 7; int C = 4;

/* Variables globales. */

int D = 2; 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 { int A; A= X

X,

int

*Y)

* *Y;

C++; B += *Y; printI('IAd %d Rid 96(1', A, B, C,

0);

*Y"; return (c); }

El programa genera los siguientes resultados: B 5 15 5

9 9 13 13

5 5 4 4

2 2 2 2


Problemas resueltos

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, revisa principalmente la aplicaciOn de los parai Thetros pot referenda, porque seguramente 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 return(k);

void F2{float t, int *r) {

z, y, x, k);

167 1


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 0 4 4 4

7 5 5 7 7

1.40 1.40 1.33 2.33 1.40

2 2 6 -3 -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 < obtenga el promedio de los mimeros pares e impares. Dato: N,

NUM" NUFA2,

N < 500),

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.


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 / 2 3 4

Dato:

(*, If) 1

(variable de tipo entero que representa el mimero de terminus de la serie). NUM

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 obtendra 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 el resultado de la siguiente serie: 11 -

+ 38

+

N, obtenga

1411

Dato: N (variable de tipo entero que representa el mimero de terminus de la serie).


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

1

- — — 21 4!

le 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 except° el mismo, es igual al propio ntimero. Escriba un programa, que obtenga e imprima todos los nameros perfectos comprendidos entre 1 y N. Dato:

(variable de tipo entero que representa el ruimero enter° positive que se ingresa). N

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 namero considerado es el 9256. 6 5 2 9

(variable de tipo enter° que representa el flamer° entero positive que se ingresa).

Date: N


Problemas suplementarios

Problema P54.10 Escribe los resultados que se obtienen al ejecutar el siguiente programa: Programa 4.22 #include â&#x20AC;šettlio.h, /* Funcionee y parkmetros. */ int a, b, c, d; int palfint, int); void main(void)

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

/* Prototipo de luncion. *1

1711


172

Capitulo 4. Funciones

Problema P54.11 Examina cuidadosamente el siguiente segment째 de programa: Program 4,23 #include <stdio.h> void trueque(int

ty)

int

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


Problemas suplementarios

int 13(woid); int 14(woid); int K = 5; â&#x153;&#x201C;oid main(void) { int I; f or {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);

173 j


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 constituyen 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.


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 elementos del arreglo deben ser del mismo tipo. Ordenada, porque se puede determinar 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 parlos eomponentes y el indite. Los componentes hacen teS 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 debemos 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 unidimensional.


5.3 Declaracion de arreglos unidimensionales

177 I

Arreglo

L

i

H Segundo element()

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.

A

15

23

B

14

0

IIIII

—6

11

4

—5

B

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 realizar la declaraciOn del arreglo. A continuaciOn presentamos diferentes formas de declarar arreglos, con la explicacidn correspondiente.


I 178

Capitulo 5. Arregbs unidimensionales

void main(void) { . . . int A[10]; 1* Definicion de un arregla de tipo enter° de 10 elementos. *1 float B[5]; 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 practica, 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 encuentra 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 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);


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 explicaciOn correspondiente, junto con figural en las que se muestran los valores que toman los diferentes componentes del arreglo. int A[10]

A

1* Todas las companentes del arreglo se inicializan en 0.

= 01;

0

0

0

fi

0

fi

fi

0

0

0

0

0

0

1

T

fi

fi

T

I

ki

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

I

0

0

I

t

I

8(2]

B[3]

B(4]

I

B(0]

8(1]

FIGURA 5.4

Declaracion del arreglo unidimensional B int C[5] = (6, 23, 8, 4, 11}; wfrconsecutiva.

C

*

Cada componente del arreglo recipe un valor. La asignacion se realize en forma

1

6

C Ea] FIGL

i*

23

C[1]

5.5

Declartwion del arreglo Uniciimensionat c

B

4

11

fi

I

fi

C[2]

C[3]

C[4]


I 180

Capitulo 5. Arregbs unidimensionales

ant 0[5] - {6, 23, 8, 4, 11, 35}; i* Este asignacian genera un error de wâ&#x2013; 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 21, 48, 5, 111; 1* En este caso, como se amite el tamaho del Int E[] = wâ&#x2013; 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

E

21

48

5

11

fi E(0)

E[1]

E(2)

E(3]

E(4]

Flume 5.6 Deciattwicin del arregio unidimensional E

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

Donde: 2 representa un voto para el candidato 2, 5 un voto para el candidate 5, y asi sucesivamente. o (variable de tipo entero que representa el voto a un can-

Dates: didato). Programa 5.2 #include â&#x20AC;š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


54 Apuntadores y arreglos

void main{vold} {

int ELE[5] = {0}; /* Oeclaracion del arreglo enter') ELE de cinco imelementos. Todos sus elementas se inicializan en 0. */ int I, VOT; printlf'Ingresa el primer vote (0 Para terminar): '); scanif'fbd', &VOT); While (VOT) {

if (fVOT r 0) && {VOT < 6)) /* Se verifica que el voto sea .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]);

5.4. Apuntadores y arreglos Un aptmtador es una variable que contiene la direcciOn de otra variable y se representa por medio de los operadores de direccion (&) e indirecci6n (*). El primer° 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 grupo 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}; •

1811


I 182

Capitulo 5. Arreglos uniclimensionales

TABLA 5.1. Apuntadores, variables y valores Variable X

Valor 3 7

Z[0]

2

7[1]

4

7[2] 7[3] 7[4] int *IX; IX = 8,X;

Y = *IX;

10

f* IX represents un apuntador a un entero. */ f* IX apunta a X. IX tiene la direccion de X. *f 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

7[0]

2

3 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 X

Valor 1 6

Z[0]

2

7[1]

4

7[2]

15

2[3] 2[4]

10


54 Apuntadores y arreglos

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

183


Capitulo 5. Arregbs unidimensionales

I 184

TABLA 5.6. Apuntadores, variables y valores

Variable

Valor

X

B

V

12 2

7[0] 7[1] 7[2] 7[3]

4 12

7[4]

10

B

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 X

Valor B 12

7[0]

2

7[1] 7[2]

4 12

7[3] 7[4]

10

B

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


5.4 Apuntadores y arreglos

TABLA 5.8. Apuntadores, variables y valores

Variable

Valor 9268

Z[0]

2

Z[1]

4

7[2]

12

Z[3] Z[4]

IX = &X; IX = IX + 1; iwincarrecta. *1 X = *IX;

/0

1* IX apunta a la variable enters X. *1 1* IX se mueve una posicion y cae ahora en una celda 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 Z[2]

4 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 â&#x20AC;šstdio.h> /* Apuntadores, variables y valores. */ void main(vaid)

185 [


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; *IX - 15; printf('‘nX ww4t 2[4] -

1* Y tame el velar de 2[2], ahora vale O. *1 I* 1[21 se modifica, ahora vale 15. *1 = %d ‘t 2[0] - %d 11t 2[1] - %d Vt 2[2] - %d It 2[3] - %d

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; printf('InX

/* 2[2] se vuelve a modificar, ahora vale 12. */ ‘t Y = %d kt 2[0] = %d lit 2[1] - %d ‘t 2[2] - %d It 2[3] = %d

writ 2[4] c1, X, Y, 2[0], 2[1], 2[2], 2[3], 2[4]);

9

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


5.5 Arreglos y funciones

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] =

oLd', X, Y, Z[6], 2[1], 2[2], 2[3], 2[4]);

9

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] =

dd', X, Y, 701, 7[1], 2[2], 7[3], 7[4]];

9

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 corchetes porque ocasionan un error de sintaxis. EJEWL0 5.4

Escribe un programa en C que calcule el producto de dos arreglos unidimensionales de tipo entero y almacene el resultado en otro arreglo unidimensional. Datos:

VE1(1 0] , VE2(10] , VE3(1 0)

(arreglos unidimensionales de tipo entero con capacidad para 10 elementos. En VE3 se alinacena el resultado del producto 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 ; wrarreglas. *or

/* Se define una constante para el tamale de los

187 1


I 188

Capitulo 5. Arreglos unidimensionales

Void Lecture(int VEC[], int T); void Imprime(int VEC[], int T); 1* Prototipos de funciones. *1 /* Observe que en los Vold Producto(int *X, int *Y. int *Z„ int T); 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];


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 comprendido 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 â&#x20AC;š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: scanf('gsd', SLVEC[I]); }

1+1);


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 ntimeros reales, obtenga como resultado la suma del cuadrado de los mimeros. Data: VEC[122] (arreglo unidimensional de tipo real de 100 elementos).


191 ]

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); double Suma(flOat *, int);

I* Prototipos de funciones.

*1

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


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); } 122 1 TAM < 1 ); while (TAM 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++)


Problernas resueltos

printfrIngrese el element째 god:

193 I

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

} }

Problema PR5.3 Escribe un programa en C que almacene en un arreglo unidimensional de tips entero los primeros 100 ntimeros primos.

5


I 194

Capitulo 5. Arreglos unidimensionales

Programa 5.8 Minclude <stdio.h> 1* Primps. El programa almacena en un arreglo unidimensional los primeros 140 nomeros .primps. */ oonst int TAN = 102; 1* Protatipos de funciones. *1

void Imprime(int, int); Void Prima(int, int *); void main(void)

int int

P[TAM] = {1,2}; FLA, J = 2, PRI = 3; while (J <= TAM) FLA - 1; Primo(PRI, &FLA); ',prima. *1 if (FLA)

1* Se llama a

la

funcion que determina si PRI es

1* Si FLA es 1, entonces PRI es prim *1

P[J] = PRI; J++; } PRI += 2; } Imprime(P, TAM); } 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]);


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 proporciona 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 y ELE una variable de tipo entero que representa el elemento a buscar.

<

1 em,

Programa 5.9 Oinclude ‹stdio.h> /* Busqueda secuencial en arreglos desordenados. */ const int WAX-102;

void Lectura(int, int); int Ausca(int *, int, tat);

i* Prototipos de funciones. *1

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


196

Capitulo 5. Arreglos unidimensionales

void Uectura(int A[], int 1) La funcion LOCUM se utilize pare leer un arreglo unidimensionel de T imelementas de tip° enter°. */

1*

int

I; for (1=6; I<T; I++) printf(Ingrese al elements scanfriad', &A[1]);

', 1+1);

} } int Busca(int A[], int T, int K) Este funcion localize en el arreglo un element° determined°. Si el element° Imes encontrada, regresa la posiciOn correspandiente. En caso cantrario, regresa 10. *1

1*

a, SAN = 0, RES; (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); int I

-

while

}

Problema PR5.5 Blisqueda secuencial en arreglos ordenados en forma creciente. La baqueda secuencial 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.


Problemas resueltos

1971

Diatos:VEC[N], ELE Donde: VEC es

un arreglo unidimensional de tipo entero de N eleMent0S, 1 y ELE una variable de tipo entero que representa el elemento a buscar,

100,

Programa 5.10 *include <stdio.h> /* Busqueda secuencial en arreglos ordenados en forma creciente. */

wrist int MAX-100; void Lectura(intl int); int Buscafimt *, int, int);

/* Prototipos de lunciones. *f

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); /* Se llama a la funcion que busca en el warreglo. */ if (RES) /* Si RES tiene un valor verdadero --diferente de 0--, se ascribe la â&#x153;&#x201C;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: scanfridd', &AM);

I+1);


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. */ E) if (A(I] 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 bdsqueda 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 central 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 tamari° ' 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.


Problemas resueltos

Programa 5.11 *include ‹stdio.h /* Busqueda binaria. */

mat int MAX-100; Void Lectureants int); int Binarialint *, int, int);

1* Prototipos de funciones. */

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

199


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. 5a.

11 11

12 12

22

34

54

36

19

22

34

54

36

19

7 7

6a.

11

12

22

34

36

54

7

7a.

11

12

19

22

34

36

19 54

8a.

7

11

12

19

22

34

36

54

7


Problemas resueltos

Data: VEC(N] (arreglo unidimensional de tipo entero de N elementos, 1

2011

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

/' Prototipos de lunciones. */

void main(void)

{ int TAM, VEC[MAX]; do {

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


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; 0) && (AUX < Aft))) While ((L { 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 â&#x20AC;&#x201D;burbujaâ&#x20AC;&#x201D; 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] 12 la.

AN 34

Af2] 22

Af3] 11

2a. 3a, 4a, 5a, 6a,

34 11 11 11 11 11 11

22 22 12 12 12 12 12

ii 34 34 19 19 19 19

7a. 8a.

7 7 7 7 7 7 7

AM]

NS]

A(63

AM

54 54 54 54 54 22 22

36 36 36 36 36 36 34 34

19 19 19 19 34 34 36 36

7 12 12 22 22 54 54 54

22


Problemas resueltos

Data: VEC(N] (arreglo unidimensional de tipo entero de N elementos, 1

203 I

N s 100}.

Programa 5.13 *include â&#x20AC;šstdio.hp /* Ordenacion por seleccift directa. */ oonst int MAX = 100; Void Lectura(int *, int);

void Ordena(int *, int); void Imprime(int *, int);

/* Prototipos de lunciones. */

void main(vold) { int TAM, VECIMAX]; do { 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;


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


Problemas resueltos

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

11, Prototipos de lunciones. */

void main(void) { int TAM, MOD, ALU[MAX], FRE[11] = {0}; float MED, VAR, DES; do

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

205 ]


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 generan al ejecutarlo.


Problernas resueltos

207

Programa 515 *include â&#x20AC;šstdio.h> I* Apuntadores y arreglos */ void main(void) { int X = 5, Y = B, V[5] - {1, 3, 5, 7, 9}; *AY, *AX; AY = &Y; X = *AY;

int

*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 continuaciOn: 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 generan al ejecutarlo. Programa 5.16 #include <stdio.h> /* Apuntadores y arreglos */ void main(void)


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 continuacion: 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 generan 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


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 continuation: 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 ordenado 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),


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 unidimensional de tipo entero que se encuentre desordenado. Considera que no se pueden insertar 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 unidimensional 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 supere 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


Problemas resueltos

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 unidimensionales 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 unidimensionales de tipo entero, ordenados en forma ascendente, de N y FA elementos respectivamente, 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 unidimensionales de tipo entero, el primero ordenado en forma ascendente y el segundo

2111


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 unidimensional los primeros 30 tuitneros perfectos. Un namero se considera perfecto si la suma 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â&#x20AC;˘Por ejemplo, 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.


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 â&#x20AC;&#x201D;conocidos tarabidn come matricesâ&#x20AC;&#x201D; son los arreglos multidimensionales nuis utilizados y los que trataremos principalmente en este capitulo.


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 importantes: 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 bidimensionaL Arreglo bidimensional rrimera fila segurda fila

â&#x20AC;˘

mesima fila - â&#x20AC;˘

primers columna Eegunda columna enesima columns FiGuRA

6.1

Representacion grcifica de un arreglo bidimensional.


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 element째 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

A

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]; float A[5][5];

f* Declaracion de un a mega째 bidimensianal de tip enter째 de 5 files y le columnas. *i or* Declaracidn de un arreglo bidimensional de tipo real de 5 files y 5 columnas. */


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 prktica, 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], void Imprime(int [][TAM], f* Observe que siempre as wiPhaces, el compilador me

int); /* Pratotipo de funciones. */ int); necesaria declarer el nomero de columnas. Si no lo 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 scanf('%d', &A[I]Id]); }

I+1, d+1);


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 definicion del mismo. A continuacift presentamos diferentes cases con su explicacion 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]

A

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 â&#x20AC;˘se inicializan con los valores: 3,4,6 y 8. El rests con 0. */


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

B

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

C

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.


6.3 Declaracian de arreglos bidimensionales

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 resultado en otro arreglo bidimensional e imprima, ademas, el resultado obtenido, Datos:

(arreglos bidimensionales de tipo entero de Mx N 1 5 N 5 50. elementos, 1 m s MA[M](N), ME(M)(N)

50 y

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: scanf('96d', &FIL);

'1;

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

219 1


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: scanf('%d', SiA[11[J]);

I+1, J+1);

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, excepto 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-


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 profundidad. 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 resultaA[0][1][2]e54, yeldeArmilli] * A[2][1][0] es 12. d0deA[1][1][1]

,: :;01,111111111"

AM

A[][1][]

Arr A;iLli A A[0][1][1] APVAr in ArOv

AMMO) ARHOJE01 A[2][0][0]

maullre- AMMO' A[1][Ii[Oi API[li[0] 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


Capitulo 6. Arreglos multidimensionales

I 222

Una vez que se defmen los arreglos, sus elementos pueden recibir los valores a tray& 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);


6.5 Declaracion de arreglos tridimensionales

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 scanf('%d', &A[I][J][K]);

K+1, 1+1, J+1);

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

223 i


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

CAR+1,

} 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.


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 considera sim6trico si cumple la siguiente condicion: Amp) =AM[ I]. Dato: MAT(N] (NJ (donde MAT es un arreglo bidimensional de tipo enter째 de elementos, 1 5 N 5 100

Nxid

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); int Simetrica(int [][MAX], int);

1* Protatipas de funciones. *I

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


226

Capitulo S. Arreglos multidimensionales

int I, J; for (1=0; I<T; I++) for (J=0; J<T; J++) printf('Fila: golâ&#x20AC;&#x2DC;tCalumna: %d', 1+1, J+1); scanf('%d', SA[11[J1);

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

(donde ALU es un arreglo bidimensional de tipo real de N filas y cuatro columnas que almacena calificaciones de alumnos, 1 N 50). AR! [N, 4]


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

/* Prototipos de funciones. */

void main(void) int HAL; float ALU[MAX][EXA]; do 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 scanf('risf•, &A[II(JI);

%d

del alumna %d:

J+1, 7+1);

} } 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++)


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 biclimensional. 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]

ME

(arreglo bidimensional de tipo real de m filar y

50 y

N S 50,

N

columnas,


Problernas resueltos

229 I

Programa 6.6 #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);

J* Protatipos de funciones. *1

void main(void) int F, C; float MAT[MAX][MAX]; do printf('Ingrese el rainier° de files: '); scanf('9dd', & F);

} while (F > MAX do

F < 1); /* Se verifica que el flamer° de files sea correct°.

printf('Ingrese el rainier° de columnas: '); scanf('9dd', &C);

} while (C > MAX

11

C < 1 );

f* Se verifica que el niimera de columnas sea 000rrecto. *f

Lectura(MAT, F, C); Intercembia(MAT, F, C); Imprime(MAT, F, C);

} 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: scanf('0', &A[I][J]);

1+1, J+1);

}

} void Intercambia(floet AMMAXI, int F, int C) i* Este funcion se utilize pare intercambiar las columnas del arreglo


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, 1, 1,

s, ise s, se 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 producto 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 mismo mes se pueden tenet- diferentes Yentas de un mismo producto (transacciOn 2).


Problemas resueltos

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,

Ronde:

cos15

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.

es una variable de tipo entero que representa las yentas del producto en la transacciOn i. co; es una variable de tipo real que representa el costo de producto 1, 1 a i 5 15. CAN

PRO

Programer 6.7 ifinclude <stdia.h> J* Fabrica de lacteos. El programa, al recibir coma datas las yentas mensuales de diferentes â&#x153;&#x201C;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

231 I


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: scanfrgsr, &MID;

1+1);

} } 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


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 traspuesta. 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); void Imprime(int [][MAX], int, int); void main(void)

1* Prototipos de funcianes. */


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

.1;

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


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 siguiente criteria:

MAITIM

Si{/963) =

MATUM

Si(P13) = 2

1.1

De otra forma

MAITAU14Âą MOM [JD ,f1)

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

/* Protatipos de funciones. *I

void main(void) int MAT[12][12],TAM; float 4EC[12]; do printf('Ingrese el tamano de la matriz: ');

scanf('ikd', &TAM); }

while (TAM >12 11 TAM < 1); Lectura(MAT, TAM);


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: scanfr%d', &A[I][J]);

1+1, J+1);

} }

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


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 filas, 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


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


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]

es un arreglo bidimensional de tipo real de cinco filar y 12 columnas, que almacena el valor mensual de las acciones de los cinco fondos de inversion.

Wade: FON

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 â&#x20AC;š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 void void void void

LecturaM(float [][12], int, int); LecturaV(float *, int); Fl(float [][12], int, int, float *, float *); F2(float [][12], int, int); F3(float *, int);

i* Protatipos de funciones. *1

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


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: scanfricr, &A[I][J]);

1+1, J+1);

} } 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: scanf('%f', &A[I]);

1+1);

}

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


Problemas resueltos

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â&#x20AC;&#x2DC;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

241 1


Capitub 6. Arreglos multidimensionales

1 242

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 â&#x20AC;˘informaci4n sabre lluvias, genera informacian estadistica. */

coast int PRO = 24; coast int MES = 12; coast int ANO = 10; void void void void

Uectura(float Funcian1(float Funcion2(float Funcian3(flost

[PROINESHANOI, int, int, int); (PRO][MESHANO] , int, int, int); (PRONMESHAA01, int, int, int); /* Pratotipos de funciones. *1 (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â&#x20AC;&#x2DC;tMes: scanf('%f', &A[7][J1[K]);

K+1, 7+1, J+1);

} }

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


Problemas resueltos

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;

243


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 UMm05 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 â&#x20AC;š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); o de funciones. */

1* Prototipas


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 scanf('%f', &A[7][J][K]);

K+1, 7+1, J+1);

} }

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â&#x20AC;š; J++) switch (JO) case 1: SUM1 += A[I]p1[P-1]; break; case 2: SUM2 += Ap1[..11[P-1]; break;


Capitulo 6. Arreglos multidimensionales

I 246

ease 3: SUM3 break;

A[l][d][P-1];

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 printf(' Ventas:%.2f', SUM3);

Licra');

} 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: printf('‘tVentas: %.2r, VEN);

}

0E+1, ME+1, AN+1);


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.

Fiiw

1

0

0

1

o

t

t

0

o

1

1

0

1

0

0

1

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:

{arreglo bidimensional de tipo real que almacena Las yentas mensuales de cinco departamentos de una Unica).

VEN[5][ 123

6


Capitulo 6. Arreglos multidirnensionales

I 248

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

(arreglos bidimensionales males de MxN y , 1 P 50, respectivamente, i 5 FA 59, 1 < N

A[MI CNr B[N][P]

NxP eleMent0S,

Problema PS6.6 Escribe un programa en C que, al recibir coma dates dos arreglos bidimensionales 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:

bidimensionales enteros de MxN y NXM elementos, respectivamente, 1 5 M 5 56, 1 5 N A[M][N] ,

N] [ M] (arreglos

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.


Problemas suplementarios

2491

I,

.

or 4

1

..

I

6.8 Recorrido en forma de espiral en una matriz.

FIdURA

Dato:

MAT [M] [N] (arreglo

1

M 56

y1

bidimensional de tipo real de radas y N columnas,

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.

*

-.-__â&#x20AC;˘,.

V

nava 6.9 Recorrido columna a columna en una matriz. Dato:

MAT

1

[in [N] (arreglo bidimensional de tipo real de m filas y N columnas, M 559 y i <N s se).


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 colocar 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 eabalk. 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 flamer째 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 informacite 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 dltimes cinco afios. Construye un programa que genere la siguiente information:


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 informadOn sobre asistentes a los estadios de fiitbol ink importantes del pals).

6


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.


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.


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

FunciOn

ctypa 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 void main(void)

otype.h.

*/


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('â&#x20AC;&#x2DC;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: " 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); )r

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


7.3 Cadenas de caracteres

7.3. Cadenas de caracteres Una cadena de caracteres es un tipo de datos estructurado compuesto por caracteres. 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 cadenas de caracteres y asignarles valores. Estudiaremos las funciones de entrada y salida de la biblioteca stdio.h: gets, scan-f, puts y pr fnt f. Programa 7.3 Winclude â&#x20AC;š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

257 I


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

}


7.3 Cadenas de caracteres

259

EFE Pal LO 7A

En el siguiente programa podemos observar algunas foams particulares, correctas 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'; puts(cadO);

I*

La declaracibn y la asignacion son correctas.

*1

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 â&#x20AC;˘ 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);


260

Capitulo 7. Caracteres y cadenas de caracteres

cad2[10] = 'Guatemala'; 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

I*

}

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 â&#x20AC;šstdio.h> *include â&#x20AC;š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);


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

1

strtodicad, &cadl)

7sst

1

atol(cad)

7sst

1

strtol(cad, &cad1, 0)

7sst

2

atoi(cad)

7.B9sst 30

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

8.5 set

8.5 9

sat

9 10

(Condn4a)


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

atof(cad)

877

3

strtod(cad, &cadl)

s77

3

atol(cad)

877

3

strtol(cad, &cadl, 0)

s77

3 1.50 877

1.50 2

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 caracteres 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 imp4m\n', cadl);

a

cadl:

strcpyfcadl, 'XX'); printff —OPrueba de la funcion strcpy. Se copia la cadena XX a cadl: ImAm‘n', call); strncpy(cad2, can, 4);


7.3 Cadenas de caracteres

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

263 [


264

Capitulo 7. Caracteres y cadenas de caracteres

En la siguiente tabla se muestran los resultados del programa. TABU

Funciones de la biblioteca

Pu nick; n

string .h

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 importantes (st romp, st rlen, st re hr) pant el manejo de cadenas de caracteres de la biblioteca string .h. Programa 7.7 #include â&#x20AC;š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";


7.3 Cadenas de caracteres

char char char char

265

cad1[20] = 'Hola Guatemala'; cad2(20] = 'Hula Venezuela'; cad3[20] = 'Hola Mixico'; *c, c3;

• = strcmp(cadel, cadi); /* La luncion strcmp permits comparar dos cadenas de caracteres. Si la w primera cadena —en este case cads— es mayor a la segunda w regresa 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: c = strchr(cadl, 'G');

i); /* 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 w un 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 w ipe 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); }


Capitulo 7. Caracteres y cadenas de caracteres

1 266

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 Hole Mexico

Hala Guatemala

Hole Venezuela

icad3

i

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, c3= *c

'G')

c = strchr(cad1, c3= *c

'V')

c3

G

V

7.4. Cadenas de caracteres y arreglos Una cadena de caracteres es un tipo de dates estructurado compuesto por caracteres. 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 unidimensional se define come una colecciOn finitai homogalea y ordenada de dates, 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 ordenada de dates, en la que se hace referenda a cada element째 del arreglo por medio 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 arregios unidimensionales debemos frabajar de forma similar a coma to hacemos


7.4 Cadenas de caracteres y arreglos

con arregtos bidimensionales". En las filas almacenamos las cadenas y en las columnas los caracteres de cada cadena, Es decir, si queremos almacenar un grupo de 10 cadenas de caracteres de 30 caracteres como maximo en el arreglo unidimensional 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 caracter de la cadena. Si, en cambio, quisi6ramos almacenar cadenas de caracteres en arreglos bidimensionales, tendriamos que trabajar de forma similar a como lo hacemos 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);

267 1


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â&#x20AC;&#x2DC;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:

(donde cad representa una cadena de 50 caracteres como maxim y car el caracter). cad (5e), car


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.


I 270

Capitulo 7. Caracteres y caderwas de caracteres

Nola: Observa que antes de leer cada cadena se le pregunta al usuario si desea ingresarla 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).


Problemas resueltos

Programa 7.11 # include ‹stdio.h> # include <ctype.h>

l* Verifica. El programa, al recibir comp datos una cadena de caracteres y una posicidn especifica 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 maydsculas 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;

211 [


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 â&#x20AC;šstdio.h>

1* Calcula longitud. El programa calcula la longitud de la cadena sin utilizer la funcian strlen. 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('â&#x20AC;&#x2DC;nLangitud de la cadena: %d', i); } int cuenta(char *cadena) f* La funcian calcula la longitud de la cadena. int c = 0; while (!cadena[c] == ' 1 1') c++; return (c); }

It I

*1


Problemas resueltos

La recursividad constituye una altemativa para resolver este problema. A continuacion 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

273


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 # 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 = while

a, j, k; (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â&#x20AC;&#x201D; que nos interesa, menos 4B que correspande al ascii wpdeldigita 0. *or for (.1 = 2; l < k; j++) putchar(cad[i]);

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


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 â&#x20AC;š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


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. char * inverso(char *);

111

or* Prototipo de funcian.

*/

void main(void) 4 char fra[52], aux[521; printf('â&#x20AC;&#x2DC;nIngrese la linea de texts: '); gets(fra); strcpy(aux, inverso(fra)); /* Se capia a aux el resultada de la funcian wpinversa. */ printf('â&#x20AC;&#x2DC;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.


Problemas resueltos

2771

Program 7.18 #include â&#x20AC;š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â&#x20AC;&#x201D; 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).


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.


Problemas resueltos

LAM:

FRA[n][m]

279 I

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


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: fflush(stdin); gets(FRA[1]);

1+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--


Problemas suplementarios

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 cadena 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 misma fecha pero con forrnato (dd de nombre del mes de aaaa). Por ejemplo, si la fecha se ingresa de esta forma: 06/08/05

281 1


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, convierta 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; cad1 1281, cad21201, calia l281,

Donde:

cad,

s

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 â&#x20AC;&#x201D;5â&#x20AC;&#x201D;, 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).


Problemas suplementarios

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:

(donde caracteres come mtiximo). cadl [50], cad2[591

cadi

y

cad2

representan las cadenas de 50

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 caracteres, 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: cad1 1591, cad,[59], caii2 [50], Donde: cad, representa

S

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 â&#x20AC;&#x201D;5â&#x20AC;&#x201D;, entonces se lee, de lo contrario ya no se ingresan ma's cadenas de caracteres.

283 1


1 284

Capitulo 7. Caracteres y caderwas de caracteres

Problema P57.11 Escribe un programa en C que, al recibir come date un arreglo unidimensional 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 unidimensional de cadenas de caracteres, imprima el mimero de palabras que hay en cada cadena. Date:

(donde ARC representa un arreglo de cadena de caracteres de 10 filas y cada cadena puede tener 50 caracteres come maxima). ARCM 0] (503

Problema P57.14 Escribe un programa en C que, at recibir come date un arreglo unidimensional de cadenas de caracteres, imprima la frecuencia con que aparecen las palabras en funcidn de la longitud de las mismas. Per ejemplo, si el arreglo almacena las siguientes cadenas de caracteres â&#x20AC;&#x201D;tomadas del libre Et amor en los tiempos de colera, de Gabriel Garcia Mirquezâ&#x20AC;&#x201D;: 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.


Problemas suplementarios

285 1

El programa debe imprimir lo siguiente: Longitud de la palabra

Dato:

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

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


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 â&#x20AC;&#x201D;aunque no necesariamenteâ&#x20AC;&#x201D; a tipos de dates diferentes. Estas estructuras de dates reciben el nombre de estructuras y =Jones,


Capitulo 8. Estructuras y uniones

1 288

8.2. Estructuras Las estructuras, conocidas genenamente con el nombre de registros, representan un tipo de datos estructurado. Se utilizan tanto para resolver problemas que involucran tipos de datos estructurados, heterogdneos, como para almacenar informacidn 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 porque 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 debemos 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 FIGURA 8.1

Representacion grdfica de una estructura

N-esimo camp()


8.2 Estructuras

289

EFEPAIILO 8.1

Considerernos que por cada alumna de una universidad debemos almacenar la siguiente 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 estructura. Cabe aclarar que no es posible utilizar un arreglo para resolver este problema, porque sus componentes deben ser del mismo tipo de datos. En la figura 8,2 se muestra la representaci6n grdfica ' 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 explicacion correspondiente, EJERWLO 8.2

En el siguiente programa podemos observar la forma en que se declara la estructura del ejemplo 8.1, asi coma tambidn diferentes formas en que los campos reciben valores.


Capitulo 8. Estructuras y uniones

1 290

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

1*

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


8.2 Estructuras

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 valores, asi coma tambidn el acceso a los campos de estas variables. Programa 8.2 ffinclude â&#x20AC;š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

2911


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', 'Contabilidad', B.9, 'Queretaro'}; struct alumna *03, *a4, *a5, a6; 1* Observa quo las variables *03, *a4 y *a5 se declaran coma mpuntadares de w+tipo estructura alumna. a6 es una variable de tips estructura alumna. */

f* En este caso al apuntador de tipo estructura alumna a3 a3 = &AO; 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


8.2 Estructuras

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, nuevos 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:

293j


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 â&#x20AC;˘ 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.

typedef struct

/* Oecleraci6n de la estructura utilizanda typodoll.* f

int matricula; char nambre[20]; char carrera[20]; float pramedia; char direccion[28]; } alumna;

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


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 Domicillo Nombre

Departamento

1

Sueldo 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 apuntadores 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.


Capitulo 8. Estructuras y uniones

X 296

Programa 83 #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 o un typedef. *i

i* Declarecion de la

estructura domicilio utilizando

{ 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: ');


8.2 Estructuras

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('â&#x20AC;&#x2DC;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);

297


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.


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

1*

typedef struct

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); void F2(alumno *, int TAN); void F3(alumno *, int TAN);

/* Prototipos de funciones.

*f

void main(void) alumna ARRE[52]; int TAN; do

1*

Se declare un arregla unidimensional de tipo alumni). */

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('â&#x20AC;&#x2DC;nIngrese las dates del alumna 964'1 1+1); printf('\nIngrese la matricula del alumna: '); scanf('gsd', &A[I].matricula);


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: scanf('%f', &A[7].cal[JI);

J+1, 7+1);

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


8.3 Uniones

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 interna 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 continuacion 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.

301 i


I 302

Capitulo 8. Estructuras y uniones

Programa 8.5 #include â&#x20AC;š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

/* Declaracion de una union.

*1

4 char celular[15];

char correo[22]; 1; typedef atruct

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


8.3 Uniones

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('â&#x20AC;&#x2DC;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); puts(a2.personales.correa);

i* Escribe el telefono celular ingresado. *1 /* Ahara ascribe basura. */

printf('â&#x20AC;&#x2DC;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

}

303


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 productos: • 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 correspondiente. El fm de datos para la yenta de un cliente es 0. b) Reabastecimiento. Este modulo permite incorporar productos —cantidadesal inventario. El fin de datos es 0,


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 datos necesaria para resolver este problema. INV: Arreglo unidimensional de tips estructura product° INV [dave I nombre precio existencia I dave nombrel precio existencia

Product° 1

Producto 2

dave nombre I precio existencia

Producto 100

Fstructura producto 8.4 Reptesentacidn gtrifica de la estructura de dams necesaria para el probkma PR8.1

FlaUltA

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

f* Declaracia de la estructura product°. *i

int clove; char nombre[15]; float precis; int existencia; } producto; void void void void void

Lectura(producto *, int); /* Prototipos de funciones. Ventas(producto *, int); Reabastecimiento(producta *, int); Nuevas_Productos(praducto *, int *); Inventaria(praducto *, int);


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° printf('in‘telave: '); scanf('gsd', &A[I].clave); fflush(stdin);

7+1);


Problernas resueltos

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; PAR = A[I].precio * CAN; TOT += PAR;

ir*

Se actualize el stock del producto. */

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

307


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) Este funnier' se utilize pare reabastecer al inventario.

f*

*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 scanf('9ed', &CLA);

pare salir-: ');

} } void Nuevas_Praductos(producta AM, int *T) 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

f*

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


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


I 310

Capitulo 8. Estructuras y uniones

Problema PR8.2 En una escuela guardan la informaciOn de sus alumnos utilizando arreglos unidimensionales. 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 datos necesaria para resolver este problema.

ALU: Arreglo unidimensional de tipo estructura alumno

K

Fstnictura alumno matrinoml

I

1

ALU

nr1T-n

rnattrinom-

Alumna 1/

Alumna 2

ma

cal onr7 m Alumno 50

r1141 Pro 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


Problemas resueltos

311

Prognma 8.7 #include â&#x20AC;šstdia.h> #include <string.h /* Escuela. El programa genera informacion importante de las alumnos de una escuela. */ typedef struct char mat[20]; int pro; } matpro;

or* Declaracion de

la

estructura matpro. *,

/* Materia. */ /* Pramedio. */

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 void void void

Lectura(alumno * , int); F1(alumno *, int); F2(alumna *, int); F3(alumno *, int);

/* Protatipas de funcianes. */

void main(void) alumno ALU[50]; int TAM; do

f* ALU as un arreglo unidimensional de tipo alumna. *f

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


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


Problemas resueltos

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:

(donde HOSPITAL es un arreglo unidimensional de tipo estructura PACIENTE, i N s 122).

HOSPITAL(N)

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.

313 I


314

Capitulo 8. Estructuras y uniones

HOSPITAL: Arreglo unidimensional de tipo estructura paciente

..... ..„,

Estruct urn paciente

+

z'

.

sexo eon

HOSPITAL tel nom edadsexo

1d-

1111

Paciente I

Paciente 2

II

nom O dall$0101COR

dom.

1111

tel

Paciente 100

dom cal TIMM col cp

cia

Estructura domiciiiu

FIGURA &6

Representacion grdfica de la estructura de datos necesaria para resolver el problem PR8.3

Programa 8.8 #include ‹stdio.h> #include 4string.h,

f* Hospital. El programa genera information acerca de los pacientes de un hospital. *f I*

typedef struct char cal[20]; int num; char pol[2S]; char cp[5]; char ciu[26]; domicilio;

or* Cadigo Postal. /* Ciudad. */

or* Declaration de la estructura paciente.

or* Sambre

y

apellida.

or* Candicihn. *f i* Observa clue el camps des es de tipo estructura /* Telefon°. */

void Lectura(paciente *, int); void Fl(paciente *, int); void F2(paciente *, int); void F3(paciente *, int); void main(void)

*1

*i

*f char tel[10]; paciente;

*f

/* Calle. */ i* Niimero. */ i* Colonia. */

typedef struct char nom[29]; int edad; char sexo; int can; domicilia dom;

Declaracion de la estructura dosicilio.

or* Prototipos de funciones. */


Problemas resueltos

paciente HOSPITAL[M]; impaciente. *or int TAM; do

f* Arregla unidimensional de tipo estructura

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)

315 j


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


Problernas resueltos

Problema PR8.4 Una empresa de bienes rakes de Lima, Per6,11eva informadOn sobre las propiedades 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 cubierta, superficie total, cara.cteristicas, calle, colonic y precio. En la siguiente figura, se muestra la representacion grafica de la estructura de dates necesaria para resolver este problema.

317 I


318

Capitulo 8. Estructuras y uniones

PRONE: Arreglo unidirnensional

Estructura propiedader;

de tipo estructura propiedades MOVIE

11, lo lave

to dispo clove

scu ste CSC

Propiedad 1 / Zan

precioldiT'D

Sell I Ste I Cir

Propiedad 2

ubd

SPA Ste air 1

I

pecioldispo

Propiedad 100

calk ea.)

Enructuradomicilia Ft~ unA &7

Reptesentaelein grafica de la estructura de datos necesaria para resolver el probletna PR8.4

Programs 8.9 #include cstdia.h> #include â&#x20AC;š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;

/* Declaraciem de la estructura ubicacion.*/

/* Colonia. *f

typedef struct

/*

Declaracion de la estructura propiedades.*/

{ char clave[5]; float sou; float ste; char car[5411]; utlicacion ubi; float precio; char dispo; } 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


Proble m as resueltos

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â&#x20AC;&#x201D; , &A[l].scu); printf('Superficie terreno: '); scanf('961â&#x20AC;&#x201D; , 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);

319


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) if ((A[I].precia P.= li) && (A[I].precio c= Is))

—2))

printf('linClave de la propiedad: '); puts(A[I].clave); printf('inSuperficie cubierta: %d', A[I].scu); printf('‘nSuperficie terreno: gad', A[I].ste);


Problemas resueltos

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). (donde VRIDEDORES es un arreglo unidimensional de tipo estrueturaVENDEDOR, 1 S NiaO),

DatO: VENDEDDRES[N]

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 pag e es una union en la que se almacena la forma de pago al empleado: 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.

321 1


Capitulo 8. Estructuras y uniones

I 322

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 datos necesaria Para resolver este problema, VENDEDORES: Arreglo unidimensional de tipo estructura vendedor Fstructura vendedor, VENDEDORES num 110

sal

da

sal cia

num 1:101:11

Vendedor 1

Vendedor 2

num

sal cla Vendedor 100

yenta

== norm

no

ncu

_Union fpago

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


Problemas resueltos

char noba[12]; char nucu[12]; } 'moo;

1* Nombre del banco. *i 1* Homer째 de cuenta. */

typedef union banco che; banco nomi; char yenta; } fpago;

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

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

1* neclaracian de la estructura domicilio. *I I* Calle y rainier째. *I 1* Colonia. *i 1* Codigo Postal. 1* Ciudad. *1

*f

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

Lectura(vendedor *, int); F1(vendedor *, int); F2(vendedor *, int); F3(vendedor *, int); 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);

323


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

;

;

;


Problem as resueltos

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

}

325 I


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[I].nam, SUM); } }

A[1].num,

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 w irdepasita 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 information de cada cliente:


Problemas suplementos

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

(donde CLI es un arreglo unidimensional de tipo estructura CLIENTE de delnentOS, i s N 104

CLI[N] N

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 actualizar 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 unidimensional 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).

327


Capitulo 8. Estructuras y uniones

I 328

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.


Problemas suplementos

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:

(donde EMPLE es un arreglo unklimensional, ordenado en funciOn del numero de empleado, de tipo estructura EMPLEADO, 1 s N 5 100, EMPLEN]

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 productos diferentes. La informacion de cada product° se ahnacena en una estructura: • Clave del product° (entero). • Nombre del pmducto (cadena de caracteres). • Existencia (entero).

329


°

Capitulo 8. Estructuras y uniones

I 33

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: 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°.

OPE,

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

(donde ESCUELA es un arreglo unidimensional de tipo estructura Alma°, 1 < N c 1000), ESCUELA[N]


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 promedio general del mismo. b) Al recibir como dates el nivel de estudios (primaria, secundaria o preparatoria), 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 preparatoria), el grade y el salon, obtenga el alumno que tiene el mayor promedio. Debe escribir la matrfcub, su nombre y el promedio correspondiente.

8


CAPiTULO â&#x153;&#x201C; 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 â&#x20AC;&#x201D;memoria principalâ&#x20AC;&#x201D; de la computadora. Estos datos se guardan generalmente en dispositivos de almacenamiento 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 significativo, 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


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 fisicamente 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 consulter 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 fundamental. 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 encuentra 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 acceso 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 cambiado 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 posiclones consecutivas en el dispositivo de almacenamiento secundario. La Cinica


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 transfieren de la memoria al dispositivo secundario en que se encuentran o viceversa. El lenguaje de programaciOn C no impone restricciones ni fonnatos especificos para 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 cerrar un Aarchivo en el lenguaje de programacion C. */

. . FILE *apuntador_archivo; apuntador_archivo = fopen (nombre_archivo, 'tipo_archivo'); if iapuntador_archivo I= NULL) {

proceso; Iclose(apuntador_archivo);

/* trabajo con el archivo.

*1

}

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 tipo cadena de caracteres, o bien, una constante sin extension o con extension txt para realizar actividades de tipo_archivo. â?&#x2018;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.


Capitulo 9. Archivos de dates

336

Tipos de archivos Typo de archly°

TABLA 9.1.

•r- •

ExplicaciOn

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 notificar 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.


9.2 Archives de texto y metodo de acceso secuencial

Programa 9.1 #include â&#x20AC;š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'); if (ar != NULL)

f*

Se abre el archive aro.tXt pare escritura. *f

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 que se utiliza para verificar el fm un archive. Se introduce la instruccion I 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. */

337 1


I 338

Capitulo 9. Archivos de datos

While (!feef(ar)) Se leen caracteres del archive mientras no se detecte el fin del • archivo. *1

1*

p1 m fgetc(ar); putchar(p1);

/* Lee al caracter del archive. *f Oespliega el caracter en is pantalla.

1*

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


9.2 Archives de texto y metodo de acceso secuencial

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

339 I


"

Capitulo 9. Archivos de datos

1 3

Exhumo 9.5

Escribe un programa en C que, al recibir come dates la matricula y cinco calificaciones 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

MATH , CALK,,, CALN,„

Donde:

N

CALI ,a CAL2,43 CAL2,5

CAL

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. una variable de tipo real que indica la calificacion j del alumno i.

CALm es

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 for

n);

I* Se ascribe el nCmiero de alumnos en el wparchivo. *f

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


9.2 Archives de texts y metodo de access secuencial

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 pantalla 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); for (i - 0; i < n; i++)

f* Se lee el valor de n.

111

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

341 j


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 â&#x20AC;š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â&#x20AC;˘ 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++)


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 printf('kn');

pro / 5);

} }

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 directamente a un bloque del archivo â&#x20AC;&#x201D;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 diversas funciones para ello. Recordemos que en los archivos de texto tenfamos que generar un nuevo archive cads vez que necesit.ibamos actualizarlo â&#x20AC;&#x201D;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; fclose(apantadar_archivo);

/* Trabajo con el archive.

} else printf('No se puede abrir el archive');

*1


Capitulo 9. Archivos de datos

344

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 Computacion y 5 para Ingenieria Industrial. Programa 9.8 #include ‹stdio.h>

1* Alumnus. EL programa almacena variables de tips estruatura alumna en un archive. *1 typede struct

1* Declaracion de la satructura !amino. *or

{ int matricula; char nombre[20]; int carrera; float pramedio; }alumna;

void escribe(FILE *);

void

main(void)

/* Prototipo de funcion.

*1


9.3 Archives de acceso directo

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 informadon de cada estructura en la pantalla de la computadora. Dam: ad 1 d at

345


Capitulo 9. Archivos de datos

346

Nota: En este programa pedennes observar la forrna en que se utiliza la instrucciOn 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; void lee(FILE *);

/* Declaracion de la estructura alumna. */

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


9.3 Archives de acceso directo

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.

*include â&#x20AC;š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

/* Declaration de la eatructura alumna. */

{ int matricula; char nombre[20]; int carrera; float promedio; alumno; 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);

347 1


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 mayores 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).


9.3 Archivos de access direct°

• 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

int

/* Declaracien de la estruotura empleado. */

clave; departamento;

float salario; float ventas(12); }empleado;

void

incrementa(FILE *);

/* Prototipo de funcien. */

void main(void) { FILE *ar; ((ar = fopen('ad5.dat', 'r+')) i= NULL) /* El archive se abre en la medalidad para leer y escribir. */ incrementa(ar);

if

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

349 1


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 w correctemente, realizamos este nuevo reposicionamiento. */ } freadf&emple, SizeOffempleado), 1, ap); }


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 caracteres 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 veces se encuentra el caracter en el archive. Dates:

arch .txt, car (donde

car representa el caracter que se ingresa).

9


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.

int cuenta(uner);

1*

*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) oon++; } fclose(ar); res = con; }

else res = -1;

return (res);

1*

Se realize la comparacion de los caracteres.

*1


Problemas resueltos

Problema PR 9.3 Escribe un programa en C que, al recibir como dato el archivo de texto arc5.-Ext formado por cadenas de caracteres, determine el ndunero de tetras mintisculas y maytisculas que existen en el archivo. Utiliza solamente funciones que lean caracteres, 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); if (islower(p)) min++;

f* Se utilize la funcion fgetc() Para leer caracteres .del archivo. *I

353


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 utilizando funciones que lean cadenas de caracteres. Dato:

arc .txt

Programa 9.15 #include â&#x20AC;šstdio.h> #include â&#x20AC;š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; ((ap = fopen ('arc.txt', 'r')) != NULL) { minymay(ap); fcloselap);

if

}

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;


Problernas resueltos

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 pod& 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 â&#x20AC;š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. */

355 [


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


Problemas resueltos

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

357


I 358

Capitulo 9. Archivos de datos

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.

*/

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 calificaciones 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


Problemas resueltos

destacar que la matricula de cada alumno es un valor entero y las ties calificaclones 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

45

7.8

7.6

8.9 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

45

7.8

7.6

8.9 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 â&#x20AC;š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

359


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, b1 =0;

Bica1M);

} if (mat < mat1) fprintf(ar2, '91adit', mat); for (i=O; i<3; i++) fprintf(ar2, '1f1t•, ca[i]); fputs(•1n•, ar2); b = 1;


Problemas resueltos

}

else fprintf(ar2, (1=0; i<3; i++) fprintf(ar2, fputs('â&#x20AC;&#x2DC;n', ar2); b1=1;

mati);

for

ca1[1]);

{ fprintf(ar2, 'M it', mat); (1=6; 1,43; i++) fprintf(ar2, "515f1t', ca[i]); fputs('In', ar2); while (!feof(ar))

for

{ 9a1", &mat); fscanf(ar, ' fprintf(ar2, 'Pled\t', mat); for (i=O; 143; 1++) fscanf(ar, ' 910', &cal); fprintf(ar2, 'WU', cal);

} fputs('In', ar2);

mati); fprintf(ar2, (1=0; i<3; i++) 96f\t', ca1[1]); fprintf(ar2, ' fputs('In', ar2); while (!feof(ar1))

for

96W, &Nati); fscanf(ar1, ' mati); fprintf(ar2, for (i=0; 1.;3; i++) fscanf(ar1, "96r, &cal); 51sflit', cal); fprintf(ar2, ' 1 fputs('In', ar2);

361 1


Capitulo 9. Archivos de datos

I 362

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 mayor 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 #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

/* Oecleracidn de la estructura slump. *1

{ int matricula; char nombrepal; int carrera; float promedia; } alumno; 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); }


Problemas resueltos

✓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 alumnos 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

363 j


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;

f* Declaracian de la estructura metal. */

typedef struot /* 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 *); float F3FILE *);

1* Prototipos de funciones. *1

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


Problemas resueltos

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

}

365


Capitulo 9. Archives de dates

366

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 Mexico. 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 utiliza: 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 admitidos 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 agueHos 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


Problemas resueltos

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('â&#x20AC;&#x2DC;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;

367 j


Capitulo 9. Archivos de datos

368

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 â&#x20AC;ş= ma) && (alu.promedio 5.= B)) ((alu.examen â&#x20AC;ş= 41462) (alu.promedia 5.= 7))) switch (alu.carrera) case 1: rwrite(&alu, break; case 2: fwrite(Salu, break; case 3: fwrite(Balu, break; case 4: fwrite(Balu, break; case 5: rwrite(201u, break;

elioof(alomna), 1, c1); sizeol(alumno), 1, c2); sizeot(alomno), 1, c3); 111001(alomna), 1, c4); 812001(alumno), 1, c5);

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;


Problemas resueltos

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;

369


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â&#x20AC;&#x201D; 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


Problemas suplementarios

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 encuentra 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 compuesto 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

371 1


Capitulo 9. Archivos de datos

I 372

cua'xitas veces se encuentra la primera cadena de caracteres en el archive. Por ejemp10, 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 compuesto per cadenas de caracteres, forme un nuevo archive en el cual las cadenas aparezCan 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 â&#x20AC;&#x201D;algunos estan


Problemas suplementarios

repetidos- ordenados de mayor a menor en funciOn de su matrfcula, genere un nuevo archivo pero sin registros repetidos. Los campus de las estructuras ahnacenadas 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

15

7.8

7.6

8.9 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

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:

9.6

arc .dat

9.9

373


1374

Capitulo 9. Archivos de datos

Problerna P59.9 Una comercializadora que distribuye pinturas e impermeabilizantes coma principales 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 inventario, 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 hospitalizado se almacenan en una estructura, cuyos campos son los siguientes: • Clave del paciente (entero). • Nombre y apellido (cadena de caracteres). • Edad (entero).


Problemas suplementarios

* 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 paciente. Los valores que toma Condicion van de 1 a 5, y 5 representa el maxima grado de gravedad. Data: pacientes.dat

375 1

9


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

6

13131.0 texto

Se expitca ClIA es Ur algoiiinic. cd.rna

construsre

Cliagrama 04:1 IIu y Min se

puede escribir un programa en C. â&#x20AC;˘ SE ralesienien tea astrucEuras algoiltrnicas settled:iv= y FE4381i11WE.

â&#x20AC;˘ 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

ESBN 970-e6-C161.0- 1II

PEARSON

Educacitin

Visileinos en: maw. pejMoneducaa itirkret