algoritmosyprogramac++vol2

February 14, 2017 | Author: fernatru123 | Category: N/A
Share Embed Donate


Short Description

Download algoritmosyprogramac++vol2...

Description

Algoritmos y su Codificación enC++

Volumen 2

César Liza A vila

Grupo. Creadores lV/nTllJnn.r1n

tu naturaleza Creativa

w



•• .... . ....

.

.. .

.

.:

1 /

DEDICATORIA

Datos de catalogación bibliogrÚ¡:;

Liza Avila, Cesar Algoritmos y su Codificación en C++. Volumen 2

A mis padres: Dr. César Liza Ortíz y Nery Avila Acosta por el esfuerzo constante en la formación de sus hijos.

Editorial Creadores . Trujillo, Perú, 2002

Sin su ejemplo y apoyo nunca hubiera llegado a ser un profesional de éxito y mucho menos haber publicado algún • libro.

Tema: Programación de computad'0ras Formato: 14.5 x 20.5

Páginas: 234

A mis amigos y colaboradores: LoudesDíaz, limar Goicochea, Kevin Llontop y Alfredo del Castillo, por su importante crítica y aporte en el contenido del libro. A mi querido amigo, que ya no está con nosotros, Rogelio Briceño.

Algoritmos y su Codificación en CH. Vol 2. Primera Edición, Agosto 2002

El contenido de esta obra esta protegido por ley. Queda prohibida la Jeproducción total o parcial de este libro, por cualquier medio, sin permiso escrito del autor.

A mi modelo, amiga y futura colega: Ana Luisa Doig Ascate, que adorna nuestra portada con sus lindos ojos y bella sonrisa.

© 2002, Derechos Reservados por César liza Avila.

Al fotógrafo y amigo: Víctor Torres García, por captar la belleza de nuestra modelo.

Distribución y Ventas Editorial Creadores Av. América Norte 401 - Trujillo. Teléfono (044) 221363

Al diseñador de la portada: Javier Asmat, mi gratitud por su amistad y el buen gusto en el diseño de la portada.

e-mail: [email protected] Web Site: ww~ocities.cQj;lCesar li?-ª

j

DILE NO A LA PIRATERÍA Escribir un libro cuesta muchas horas de esfuerzo intelectual. Publicarlo y distribuirlo . constituye un esfuerzo económico muy grande donde no se espera obtener grandes ganancias económicas. Si copias este libro cometes un delito y además matas la difusión del conocimiento técnico contribuyendo a que nuestro Perú siga siendo subdesarrollado.

NO COPIES MIS LIBROS Hemos detectado que debido al gran éxito alcanzado por nuestros libros, éstos se encuentran fotocopiados y anillados listos para su VENTA ILEGAL en muchos "centros de fotocopiado" frente a Universidades e Institutos. Cuando menos lo esperen, los visitaremos cayéndoles con todo el peso de la ley

PRESENTACION

f:sta obra es la continuación de "Algoritmos y su Codificación en C++", y viene a completar el vacío que existía respecto a temas que no tratamos en ella. Manejo de caracteres, arreglos bidimensionales, estructuras, uniones, enumeraciones, manipulación de bits, generación de números aleatorios, simulación, punteros, asignación. dinámica de memoria, y archivos, son tratados mediante más de 81 ejemplos completos de' programación. Asimismo, encontrará más de 140 ejercicios propuestos que le servirían para practicar lo aprendido, y que serán de valiosa ayuda para los docentes en la elaboración de prácticas y exámenes. Para la compilación de los programas' presentados en este libro, utilizamos el Microsoft Visual C++, en aplicaciones en modo consola, pero puede utilizar otros compiladores haciendo pequeñas modificacionés al código. En este segundo volumen, no utilizamos los diagramas N/S, pues consideramos que el programador tiene la suficiente madurez lógica y puede estructurar la solución al problema para luego pasar a su codificación. El primer capítulo, trata sobre las cadenas de caracteres, que son implementadas en C/C++ como arreglos, donde cada uno de sus elementos es un carácter. Es importante su estudio puesto que el hombre se comunica con palabras más que con números, y la computadora solo utiliza números para todo, inclusive para representar cada una de las letras, ya sea mediante el código ASCII o su sucesor el UNICODE. Los arreglos bidim'Emsionales o matrices, constituyen un elemento importante en matemáticas pues permiten resolver un amplio conjunto de problemas con muchísimas aplicaciones reales, así como almacenar datos que necesitan 2 dimensiones para ser identificados. El segundo capítulo, aborda este tema mediante numerosos ejemplos.

I

/1

Las estructures, uniones '1 enumeraciones son tratadas en el tercer capítulo. Las estructuras son construcciones en C/C++, que permiten agrupar un conjunto de atributos de diferentes tipos de datos, en una única variable; las estructuras constituyen los predecesores de las clases. Las uniones definen en una misma zona de memoria uno o más elementos, permitiendo su ahorro; mientras que las enumeraciones hacen mas claro nuestro programa, ya que podemos usar nombres en vez de números.

CONTENIDO

Presentación"."., ... ,.................................. ' .... ,.. ,." .. , ............ ,............. ', .• ,"" 7

CAPITULO 1: Cadenas de Caracteres ..................................... " ..... 15 Muestre la tabla de códigos ASCii i .1 1.2 Programa que muestre el uso de las secuencias de escape 1.3 Convierta una palabra en mayúsculas a minúsculas 1.4 Muestre la suma de verificación de un mensaje 1.5 Dada una cadena numérica obtenga el número que representa 1.6 lea una frase y muéstrela palabra por palabra 1.7 Cree su propia función para ingresar caracteres desde teclado 1.8 Encripte una cadena sumando sus ASCII con los dela clave 1.9 Encripte una cadena con una tabla de equivalencia 1.10 Diga como es alfabéticamente, una palabra respecto a otra 1.11 Programa que utiliza las macros y funciones provistas en ctype.h 1.12 Uso de las funciones estándar provistas en el archivo string.h 1.13 Diga si una palabra es palíndroma

En el cuarto iCaJ~ítuio, mostramos cómo g,enerar filúmems ~Iieator¡os con distribuciones tales como ?oisson, V Normal; abordando problemas mediante la técnica conocida como Simulación Montecarlo.

la manipulación de bits, la tratamos en el quinto capítulo, y es uno de mis favoritos, pues en él, mostramos cómo la computadora almacena y procesa internamente los datos operando sobre bits; además existen muy pocos libros que traten adecuadamente este tema, y lo tratan con escasos ejemplos. Este libro es la excepción pues mostramos diversas e interesantes aplicaciones. Los datos que usamos y los programas que ejecutamos en una computadora, ocupan memoria. Mediante los punteros podemos acceder a cualquier zona de memoria asignada a nuestro programa. Asimismo, mostramos como usar la asignación dinámica, para reservar la memoria necesaria según como la vayamos necesitando. Estos temas son tratados en el sexto capítulo.

CAPITULO 2: Arreglos Bidimensionáles ......................................... 41 Lea una matriz con f filas y c columnas y iuego la imprímala 2.2 Encuentre la transpuesta de una matriz 2.3 Genere una matriz identidad de orden n 2.4 Dada una matriz diga si ésta es una matriz triangular superior 2.5 Dada dos matrices obtenga la matriz ampliada 2.6 Inserte un vector en una columna determinada de una matriz 2.7 ¿Cuál es la producción mensual de un grupo de fábricas? 2.8 Posiciones a las que se mueve la reina en un tablero de ajedrez 2.9 Suma de dos matrices 2.10 Producto de dos matrices 2.11 Determinante de una matriz 2.12 Resuelva un sistema de ecuaciones simultáneas 2.13 Inversa de una matriz 2.14 Programa que juega "tres en raya" 2.15 Lea un conjunto de palabras en una matriz y ordénelas

2.1

En el sétimo y último capítulo, mostramos cómo hacer persistentes nuestros datos en archivos; así como, analizar e interpretar ¡os diversos formatos de almacenamiento, abriéndonos la puerta a un mundo de aplicaciones. Espero que la presente, supere la acogida que tuvo el primer volumen. Le rogamos que cualquier crítica, sugerencia, o inquietud, la . dirija a la siguiente dirección electrónica: [email protected];.QI!L que gustosos la responderemos con el ánimo de mejorar cada día. Asimismo, le invitamos a visitar nuestra página web www.geocities.com/cesarJi;¡;:a.

César Liza Avila

"-'-, I

,~.

l CAPITULO 3: Estructuras Uniones y Enumeraciones ........ 89 3.1 Suma de dos números complejos ¿A cuánto debe venderse cada kilo para no ganar ni perder? 3.2 3.3 Encuentre el valor numérico de un polinomio f(x) 3.4 Busque una fecha y diga cuál fue su temperatura 3.5 Gestione los datos de un conjunto de alumnos ;3.6 Programa que permita al usuario resolver un crucigrama 3.7 Defina, en una misma zona de memoria, un entero y un flotante 3.8 Pida un número de día de la semana, y muestre el nombre del día 3.9 Lea una moneda y diga a cuántos céntimos equivale 00 • • •

oo • • • • • • • •

CAPITULO 4: Manipulación de 8Its ........................................ 115 4.1 Muestra el uso de operadores a nivel de bits: -, &, I , ", « y » 4.2 Lea un número, muestre sus bits tal como se ven en memoria 4.3 Encripte un mensaje por manipulación de bits con XOR 4.4 Programa que genera una baraja de cartas. Use campos de bits Programa que lee una hora y obtiene el número que la representa 4.5 4.6 Lea un número que represente una fecha válida y obtenga la fecha Lee una hora y da el número que la representa. Campos de Bits 4.7 4.8 Muestre cada bit de un punto flotante de simple precisión 4.9 Estándar IEEE 754 de un flotante de simple precisión 00 • • • •

CAPITULO 5: Generación de Números Aleatorios y Simulación ...... 143 5.1. Genera números aleatorios por el Método Congruencial Lineal 5.2. Genera aleatorio discreto en [O, RAND_MAX], [O, a-1], y [a, b] 5.3. Genera aleatorio en el intervalo continuo entre [0,1] Y [a, b] 5.4. Caminata aleatoria de borrachito, a igual distancia de casa-cantina 5.5. Ley Fuerte de los Grandes Números Calcule la integral definida de una función f(x), por simulación 5.6. 5.7. Calcule el valor de PI, por simulación 5.8. Obtenga los números ganadores del siguiente sorteo de la Tinka 5.9. Genera aleatorios con Distribución Poisson y media lambda 5.10. Genera aleatorios con Distribución Exponencial y media 1/1-1 5.11. Genera aleatorios con Distribución Normal 5.12. Genera una permutación aleatoria (mezcla) de n elementos 5.13. Genera combinación aleatoria de n elementos, en grupos de r

t

CAPITULO 6: Punteros y Asignación Dinámica de Memoria ........... 173 6.1 Declare variables y muestre sus direcciones de memoria 6.2 Función que intercambia dos valores 6.3 Lea coordenadas cartesianas, y conviértalas a polares 6.4 Direcciones de memoria que ocupan los elementos de un arreglo 6.5 Usando arreglos y punteros, lea n elementos y ordénelos 6.6 Lea una palabra y reemplace una letra por otra 6.7 Determine si una palabra es palíndroma 6.8 Concatene 2 palabras Ordene los elementos de arreglo, usando un arreglo de punteros 6.9 6.10 Función que lee n empleados, usando un puntero a una estructura 6.11 Arreglo dinámico de n flotantes 6.12 Puntero a función 6.13 Función que intercambia dos valores. Use referencias

CAPITULO 7: Archivos ...............................................................201 7.1 Lea una serie de caracteres y cree un archivo con ellos 7.2 Lea el nombre de un archivo y muestre su contenido por pantalla 7.3 Lea un archivo y cópielo hacia otro 7.4 Divida un archivo en otros, similar al Hacha 7.5 Lea una serie de registros y guárdelos en un archivo 7.6 Construya un Visor Hexadecimal 7.7 Comprima un archivo por reducción de caracteres repetidos 7.8 Lista los archivos comprimidos en *.ZIP 7.9 Dada una carpeta, muestre los directorios y archivos que contiene

Acerca del Autor Otras Obras del Autor. Distribución y Ventas

Cadenas de Caracteres

Cadena de Caracteres 15

Solución: Es conocido que las computadoras son capaces de almacenar solo CEROS y UNOS, es decir números en binario. Pero el humano además de números utiliza símbolos, por lo que fue necesario codificarlos, para que sean almacenados en las computadoras. Por ejemplo, podríamos decir que si almacenamos el número en binario 0100 0001 (equivalente a 65 en decimal) estaremos almacenando la letra 'A'. Otro grupo de programadores pudo haber definido como código de 'A' el número 0000 0000, esto trajo, allá por la década del 60, la necesidad de definir un estándar. Este estándar se llama Tabla de Códigos ASCII (American Standar Code for /Ilformation /nterchallge, Estándar Americano de Codificación para el Intercambio de Información), la cual nos proporciona una lista de códigos a los que se les ha asociado un símbolo, que permite que los equipos y programas puedan intercambiar información con otros equipos y programas. La Tabla de Códigos ASCII original contiene 128 códigos (del O al 127), puesto que este es la máxima combinación de valores que se puede obtener con un byte (8 bits) sin ocupar el bit del signo (2 7). Posteriormente, se amplió esta tabla para más símbolos como los caracteres con tilde, a esta tabla se le conoce como Tabla de Códigos ASCII Extendida y consta de 256 símbolos (del O al 255), pues esta es la máxima cantidad de valores que se pueden conseguir con un byte (28) usando inclusive el bit del signo. Como es de esperarse los 128 primeros caracteres de la Tabla ASCII Extendida son los mismos que la Tabla ASCII original. En la Tabla ASCII los 32 primeros caracteres (del O al 31) son caracteres de control, esto es; realizan una acción, en vez de mostrar un símbolo.

© César Liza Avila. Mis libros son económicos, no hay razón para copiarlos.

m

16 Algoritmos y su Codificación en C++. Volumen 2.

Cadena de Caracteres f7

César Liza Avila

--_._-~~-_._-

IDee Hex

Tabla de Códigos ASCn

128 129 130 131

:l~

132 133 134 135 136 137 138 139 1"10 141 1"12 1"13 1"14 145 1"16 147 148 149 150 151 152 153 154 155 156 157 158 159

80

IChal:

Ji)'ee lBIex

r;

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 . 180

81

Ü

82 83 8"1 85 $6 87 88 89

é

SA 8B BC 8D .8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F

a a a

a C;

é

e

e i

i i

ii.

A É ·;.w:l}lle(9ad[tll~:N.I:JLL;) .

"

La función cadToMin( ) aprovecha el hecho que las cadenas de caracteres siempre terminan en NULL. Esta función toma uno a uno los caracteres y si están en mayúsculas, esto es su código está entre 65 y 90, les suma 32 para convertirlas a minúsculas (cad[i] = cad[i] + 32). Recuerde que, todo cambio que haga una función sobre un arreglo, será conocido por el resto del programa, por ello no es necesaria la sentencia return para devolver la nueva cadena. Esto es, debido a que los arreglos se pasan a las funciones por referencia. Comprenderá más sobre ello en el capítulo sobre punteros.

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liza Avila. Mis libros son económicos,

110

hay razón para copiarlos.

\1

22 Algoritl1lo.! y su Codi/icllt"ión en C++. Volumen 2.

César Liza A vi/a

Solución: .Las sumas de verificación, son técnicas no criptográficas que permiten detectar errores en la transmisión de mensajes. Consiste en calcular un valor (checksum) a partir de una serie de caracteres. Cuando enviamos un mensaje, también enviamos su checksum, el destinatario puede entonces calcular el cbecksum al mensaje y compararlo con el checksum recibido, si fueran distintos habrá un error en la transmisión del mensaje. Un ejemplo de sumas de verificación son los CRC's o Códigos de Redundancia Cíclica, como el CRC-32, o el Protocolo de Datagrama de usuario UDP, entre otros. Un algoritmo sencillo para calcular el checksum es sumar los códigos ASCII (o UNICODE) y obtener la suma como residuo de 232, es decir para el caso que la suma sobrepase el límite de los enteros (4 bytes ó 32 bits) la suma de verificación contendrá el residuo respecto a 232 •

Cadena de Caracteres 23

Los algoritmos de suma de verificación están per¡sados para la transmisión de mensajes por canales no maliciosos, pues es fácil alterar el mensaje sin que varíe el checksum. Los llamados CCV (cryptographic check values) evitan esto, y son simílares a las sumas de verificación con la diferencia que usa una función hjlsh para que dos mensajes diferentes no ·~~¡í~~:t··~~~·~~~'¡#~IP .•,.,. " ..... , ·'·illÍmplt~~tPl'~I~"IJtr~ci.I· tengan el mismo checksum. .. Estos algoritmos son de dominio público, no hay claves y cualquiera puede cal,?ularlas. Entre ellos podemos resaltar: SHA-l (Secure Hash Algorithm), RIPEMD-160, MDS (Message Digest A 19orithms) , de ellos el

desde el teclado y los alm~cena en frase hasta un máximo de LIM. El ingreso termina cuando se presiona enter y, a diferencia de cin, éste último además termina la lectura, con el primer espacio en blanco o con la tecla tab, por lo que cin no puede usarse para ingresar una frase. La función checkSum( ), toma cada carácter ( for (i=O; frase[i]; i++) ) calculando la suma de sus códigos ASCII, (s+=frase[i] ) esto es a pesar que frase[i] es de tipo charo En C/C++/C# no debemos preocupamos por obtener del residuo respecto a 2 32, puesto que para tipos unsigned, cuando rebasamos este límite, automáticamente se regresa la cuenta a cero.

más usado es el MD5 implementado, por ejemplo, en el MD5Summer (www.md5summer.org). en el fileAlyzer (http://www.safcr-nclwOrking.org/es/ downJoadlindex.html, de paso le sugiero descargar en la misma página el Spybot Search & Destroy excelente software detector de spywares o software espía). Muchas páginas en Internet muestran los MD5 qe los archivos, con el fin que el usuario al descargarlos compruebe que no han sufrido alteraciones (por ejemplo, la página de descarga del Spybot - Search & Destroy usa los MD5). Programas como los antivirus, usan un CCV para actualizarse, otros 10 crean para archivos ejecutables y notar si han sido alterados. El uso común hace que tanto los checksum como los CCV sean llamados solo checksum, pero usted ya conoce las diferencias. Para autenticar el emisario, se usan los llamados MAC (Códigos de Autenticación de Mensajes). En ellos tanto el emisor como el receptor comparten una clave, lo que permite al recept9rverificar si el documento es auténtico y que fue enviado por quien dice enviarlo. Es similar a una función hash, es decir se aplica a un mensaje y genera un valor MAC, pero las hash no tienen claves, mientras que las MAC si. Entre ellos destaca CBC-DES, HMAC, UMAC, PMAC. Una técnica aún más poderosa son las firmas digitales, que permiten al receptor verificar la autenticidad e integridad del mensaje, es decir el emisor no puede negar la autoría del mensaje, pues es el único poseedor de la clave, a diferencia de las MAC donde la clave es compartida por varias entidades. Ejemplos de algoritmos para firmas digitales tenemos: RSA, ESIGN (Efficient digital SIGNAture), MacEliece, entre otros.

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liza A vilo. Mis libros son económicos, no hay razón para copiarlos.

.

. La

sentencIa ,>' ;;i~;!f:j!~i;boDiFiCA¿í.{J~~( . .

cm.gethne(cad, LlM) lee caracteres

1 24 Algoritmos)! su Codificación en C+ +. Volumen 2.

Cadena de Cara(:teres 25

César LiGa A ]lila

Solución: Cada carácter de la cadena ingresada, por ejemplo "581", es un símbolo que representa un número, pero no es el valor del número. Así '8' es el carácter ocho, y no el valor 8. Nuestro programa debe lograr que a partir de la cadena "581" de tipo mar I ], obtengamos el valor de 581 de tipo Ini.

rt!~f!~~~ '~~Im!t~~~ 48

'O'

49 50 51 52 53 54 55 56 57

'1 ' '2' '3'

'4'

'5' '6' '7' '8'

'9'

Para ello nos apoyamos en el subconjunto mostrado de la Tabla ASCII, del cual deducimos, que si deseamos el valor numérico correspondiente al "carácter número", necesitamos restar 48 a cada ASCn que represente el número. 1'5' I'8' 1'1' INULL I La cadena "581" se representaría como: Pero internamente se almacenará como: Si restamos 48 a cada código y lo multiplicamos por su valor posicional correspondiente tendremos: (5348)xl0x10 + (56-48)xl0 + (49-48) 581

=

\

".' ...•..... CODIFIcÁCtoNEN'Ó++ " ' .

ltlnCludeéÍíminaArras(Irt n)'" . ' ; ' ; .. :''',' o.. ' : ' '" : ," • ~-> .~ : >"::j>:,~ ,~:: ·~\~,S. \

'1'.:

Ce:)

>:,j;

César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liz,o A vila. Mis libros son económicos, no hav Tacón para copiarlos.

74 Algoritmos y su Codificación en C+ + Volumen 2.

César Liza Avila

Básicamente la función eliminaAdelante( ), es la misma que la usada al calcular la determinante (problema 2.11), solo que el intercambio ya no se hace solo de la matriz cuadrada de coeficientes sino que incluye la columna de los términos independientes ( intercambiaFilas(i, piv, n+1,m)

) y las operaciones de reducción o eliminación también afectan a esta columna ( for(k=i+l;

Arreglos Bidimensionales 75

Solución: Sean A y B dos matrices cuadradas de orden n, tales que AB = BA = 1, donde 1 es la matriz identidad. Se dice que B es la matriz inversa de A y se denota como B =A't, o lo que es lo mismo A es la inversa de B esto es A = B- I . Una matriz posee inversa cuando es cuadrada (filas = columnas) y la determinante de la matriz es diferente de cero ( IAI ::f:. O ) Para obtener la matriz inversa, tomamos la matriz original, una matriz identidad del mismo orden, y con ellas formamos la matriz aumentada. Luego procedemos a realizar eliminaciones hasta conseguir que la zona ocupada por la matriz original se convierta en una matriz identidad. La matriz inversa estará dada por la zona donde se ubicaba en un prif!~ipio la matriz identidad. Por ejemplo, sean las matrices A y su matriz identidad correspondiente 1:

A=[~¡J

k=O; i--) ) y obtenemos el valor del término independiente ( t = m[i][n] ), al cual debemos restar la sumatoria de todas las otras incógnitas multiplicadas por sus coeficientes ( for(j=i+l; j",/'

n ,',

void I¡:eCotTIpias{iut Ui struet compra 9[ { ., ' fór{i~V~Ó;"i1U; if+)" ," .,.~. ';':';;>'

»: /.: ' ..

···~~t~:h;~:;.ot: o ':;{,

~~1óti~t,'~1ruc;t lUo~olntoll)~

. "{o:,"

""rcttllct~6I!ó¡yÍi9:. [J,;.flq(l.tJ;.; .-'-"~=-==- ,_.::...._..;;.. .';. 2.~' .' '::'Iv.

. o,

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liza AvUa. Mis libros son económicos, no hay razón para copiarlos.

96 Algoritmos y su Codificaci6n en C++. Volumen 2.

César Liza Avila

Estructuras, Uniones y Enumeraciones 97

En leeDias( ), observe como se referencia a carla parte de las estructura anidada. Por ejemplo en x[i].f.dia, representa el miembro día de la fecha (f) de la medición xci]. El doble. lo usamos porque f es una estructura anidada dentro de otra.

Solución: .Primero, definimos la estructura fecha, la que es anidada dentro de struct medicion. Como tomamos la temperatura de varios días necesitamos un arreglo capaz de almacenar la fecha y la temperatura de esa fecha (struct

medicion x[MAX]). En main( ), una vez ingresadas las fechas y sus temperaturas, leemos la fecha (f) cuya temperatura nos interesa. El número de días (n), la fecha (f) cuya temperatura deseamos y los datos de las fechas y temperatura (x) son pasadas como parámetros a buscarFecha( ), la cual devuelve la temperatura del día pedido en caso de encontrar la fecha, ó -1 en caso de no encontrarla. © CésarLiza A vila. No mates la producción intelectual, no copies éste libro.

En buscarFecha( ), no es posible comparar toda la estructura con una sola instrucción, por ejemplo no podemos hacer if(x[i] ""= f), (aunque esto lo podríamos hacer en C++/C#, sobrecargando el operador =::::); es por ello que comparamos cada una de sus partes ii' (x[i].f.d.ia == f.dia &&

x[i].f.mes == f.mes && x[i].f.allnio == f.mmio ).

En caso de encontrar la fecha pedida, retornará su temperatura. Si termina de recorrer todos los elementos sin encontrar la fecha retornamos -1.

© César Liza A vi/a. Mis libros son econámicos, no hay razón para copiarlos.

"

98 Algoritmos v su Codificación en C++. Volumen 2.

Estructuras, Uniones y Enumeraciones 99

César Liz.a Avila

Solución: Este conjunto de operaciones históricamente se les como conoce d.e mantenimiento registros y en la actualidad se le conoce como CRUD (create, read, update, delete). El

programa usa un fecha,· para almacenar fechas y un struct alumno para los datos del alumno. Note como esta última estructura es capaz de almacenar notas de varios trabajos para un mismo alumno, para esto usa el arreglo

struct

trabajo[ ]. El bucle infinito permite (while(l){ que siempre regresemos al menú a menos que la elijamos opción 6.

n,

En caso de seleccionar ingreso (case 1) comprobamos que no rebasemos la cantidad máxima de elementos en el arreglo (nO 11 nreg>n) antes de invocar a consulta( ). De igual manera para modifica( ) y elimina( ), aunque esta última función· puede cambiar el número de alumnos y por ello retoma un nuevo valor para ll.

Las funciones ingreso( ), y consulta( ), se explican por si solas. © César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liza Avila. Mis libros son económicos, no hay razón para copiarlos.

--------------------------~----------------

100 Algoritmos y su Codificación en C++. Volumen 2.

César Liza Avila

Estructuras, Uniones y Enumeraciones 101

De manera similar en elimina( ), debemos mostrar el registro que deseamos " eliminar para que el usuario tenga la última oportunidad de arrepentirse, en caso de confirmar la eliminación, debemos desplazar cada elemento del arreglo una posición hacia atrás, sobrescribiendo el elemento a eliminar. Evidentemente, tendremos un elemento menos (n--) debiendo comunicar a maine ) el cambio mediante return n. En modifica( ) es recomendable mostrar los datos actuales, por ello invocamos a consulta( ); y luego, sobrescribimos el número de registro deseado mediante la función ingresa( ).

La función listado(), no necesita mayor explicación.

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liz.a Avila. Mis libros son económicos, no hay razón para copiarlos.

- - - - - - - - - - - - _ ..

_~---------

102 Algoritmos y su Codificación en C++. Volumen 2.

Estructuras, Uniones y Enumeraciones 103

César Liza A vi/a

Solución: Cada elemento crucigrama es palabra que se despliega a partir de una posición (fil, col) y hacia una dirección (vertical, horizontal). Asimismo, tendrá una descripción que será usada como pista para determinar la palabra, y por último el estado que indica si la ha sido palabra descubierta o no. Para englobar todos estos atributos definimos el struct palabra. Las palabras por adivinar las el colocarnos en arreglo leyenda. Observe el cálculo de nroPreg, en base al operador sizeof( ), dividiendo la cantidad de bytes .de todo el arreglo entre la cantidad de bytes de cada elemento. Esto es recomendable puesto que podernos reducir o aumentar el número de palabras y el programa automáticamente calculará cuántas filas tendrá el arreglo. © César Liza Avila. No mates la producción intelectual, no copies éste libro.

l")or otro lado, es necesario el patrón del crucigrama; es decir, qué casillas podrán contener letras y que casillas no. Esto lo indicamos en cruci[ ][ ] usando y el respectivamente. Luego, calculamos el número de filas n = sizeof(cruci)/ COL. Usamos el operador sizeof( ), para poder alterar la inicialización de cruci[ ][ ], sin preocupamos de cambiar el número de filas. El programa entra en un bucle que termina cuando todas las palabras han sido descubiertas while( verEstado(nroPreg,leyenda)

).

Ya dentro del bucle mostramos el crucigrama, imprimimos la leyenda y permitimos al usuario elegir la pregunta. La función verEstado( ), recorre cada fila de leyenda preguntando si hay alguna palabra sin descubrir. Observe el uso del tipo bool no existente en e, pero si en C++/C# (recuerde que en e, o significa falso, mientras que diferente de cero significará verdadero). © César Liza Avila. Mis libros son económicos, /la hay razón paro copiarlos.

104 Algoritmos y su Codificación en C++. Volumen 2.

Estructuras, Uniones y Enumeraciones 105

César Liza A vila

Las funciones impCruci( ) e impLeyenda( ), no necesitan mayor explicación. Al elegir la opción debemos mostrar si es vertical u . horizontal, y la descripción para que el usuario nos de su respuesta. Si ésta es correcta entonces cambiamos el estado, y llenamos el crucigrama con la Si la palabra. dirección es horizontal avanzamos las columnas llenando letra por letra la palabra. En caso contrario, será vertical y debiendo avanzar por filas.

Solución: Una union, es una forma de organizar nuestros datos, similar a una estructura, pero a diferencia de éstas, los miembros de la union comparten la misma zona de memoria. Como sabe, los miembros de una estructura se almacenan uno detrás de otro, en posiciones consecutivas de memoria, pero en una union, sus miembros se almacenan empezando en la misma posición de memoria, esto es, se solapan en memoria. En otras palabras, en un determinado momento solo puede existir uno de los miembros de la union, mientras que en una estructura existirán todos sus miembros. Esto tiene la ventaja del ahorro de memoria cuando las variables que definimos solo tomarán algún grupo de atributos y otros no. El tamaño de memoria que ocupa una union, s~rá el tamaño de la variable más grande. Al igual que con los miembros de una estructura, para acceder a los miembros de una union se usa el operador punto. Por ejemplo, si modelamos el caso que algunos trabajadores ganan por hora y otros ganan un sueldo fijo, tendremos: Usando una estructura: struct pago { fIoat pagoxhora; double sueldo; };

Usando una union: union pago { fIoat pagoxhora; double sueldo; };

[1111

111111 ,

~ . pagoxhora sueldo

WIIIIII "-v--'

pagoxhora

'---y---I sueldo

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

..

© César Liza A vila. Mis libros son económicos, no hay razón para copiarlos.

106 Algoritmos y su Codificación en C+ +. Volumen 2.

Estructuras, Uniones y Enumeraciones 107

César Liza Avila

Sohlldón: ih~;;;meración, es un tipo de dato formado por un conjunto conocido de constantes enteras a las cuales se le ha dado un nombre. Las enumeraciones proporcionan claridad en el código puesto que es mejor leer su descripción en lugar de un número. Se definen de manera parecida a las estructuras pero en vez de struct usamos la palabra enum. Por defecto, el primer elemento de la enumeración es 0, numerándose consecutivamente, aunque se puede especificar el valor de cada uno de los elementos de la enumeración.

El programa hace lo pedido. Definimos en una misma zona de memoria un entero y un flotante; esto es, ambos ocupan 4 bytes (en compiladores de 32 bits) y, en este caso, toda la unión ocupa 4 bytes. Al leer un entero (cin»x.entero) le indicamos a la computadora que lo ingresado lo almacene en 4 bytes, usando el formato de entero. Luego éstos mismos 4 bytes los mostramos (cout«x.flotante), pero interpretándolos con formato de punto flotante de simple precisión (IEEE 754). ¡Los mismos 4 bytes los interpretamos de dos formas diferentes! En la segunda parte del programa hacemos lo mismo, leemos un flotante, almacenándolo en 4 bytes, luego mostramos esos mismos bytes como enteros. El programa muestra la definición de una enumeración que contiene el número de días, así como la utilización de dicha enumeración. Así, dom=O, lun=l, . '" sab=6. Podríamos haber escrito los números en vez de los nombres, case 4, equivaldría a case jue, pero evidentemente resulta más claro el programa cuando colocamos nombres en lugar de números.

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liza Avila: Mis libros son económicos, no hay razón para copiarlos.

~-------------------------------

-------

---

-

108 Algoritmos y su Codificación en C++. Volumen 2.

Estructuras, Uniones y Enumeraciones JW9

César Liza Avila

1.

Solución: Las enumeraciones, pueden también tomar valores diferentes de números consecutivos, tal como observamos en este ejemplo:

Calcule la suma de dos fracciones. Simplifique lafracción antes de dar la respuesta. Use estructuras. 2. Se tiene una lista de personas con dni, nombres y apellidos. Muestre aquellas personas que son homónimas. Homónimos son personas que tienen los mismos nombres y apellidos. 3. Se tiene la siguiente estructura: struct alumno { char nrocarnet[11 ], char nombre[25], float prom; };

4. 5.

6.

7. 8.

9. Note que, a diferencia de las estructuras y uniones, los elementos de un tipo enumerado se separan con comas.

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

Escriba un programa que lea n alumnos. Luego diga cuál es el promedio general. ¿Quién(es) tiene(n) el mejor promedio y quién(es) el peor? Se tiene un conjunto de datos, se desea obtener una tabla que muestre cuántas veces se repite cada elemento. Use una estructura. La moda de un conjunto de datos es el elemento que más se repite. Encuentre la moda y cuántas veces se repite. Considere el caso en que existan varias modas. Sugerencia: use una estructura que contenga el valor y el número de veces que el elemento se repite. En un almacén, calcule el monto total de inversión y diga qué artículo es el que tiene mayor inversión. Considere la estructura: struct articulo { char descripción[ 30}; float preciounitario; int cantidad; }; \ Se tiene un polinomio y=f(x) se pide obtener su integral y su derivada. Calcule el valor numérico de un polinomio f(x, y). Sugerencia: use un arreglo donde cada elemento es del tipo estructura con atributos: el coeficiente del término, el grado de x, y el grado de y. Se tiene un arreglo con los resultados de los encuentros de un campeonato de fútbol (equipo local, equipo visitante, goles equipo local, goles del equipo visitante). Dado un equipo diga cuál es su

© César Liza Avila. Mis libros son económicos, no hay razón para copiarlos.

~--------------------------------

--~-.--~-

no Algoritmos y su Codificación en C++.

JO.

11.

12.

13.

14.

15.

16.

Volumen 2.

César Liza A vila

puntaje. El equipo ganador obtiene por partido ganado 3 puntos, si hay empate cada equipo obtiene 1 punto. Se desea gestionar una lista de articulos considerando atributos como: código, descripción, cantidad en stock y costo. Defina una lista utilizando estructuras y arreglos donde cada elemento representa un artículo y haga un menú que invoque a las siguientes funciones: (a) ingreso de artículo, (b) mostrar todos elementos de la lista, (e) modificar los datos de un artículo, (d) eliminar, (e) búsqueda y (f) salir. Use un tipo enumerado para cada opción del menú. Por ejemplo . case 1, sería case ingreso. Se tiene la siguiente estructura: struct articulo { float precio Venta; int cantidad Vendida; }; que almacena datos de venta de un determinado producto. Escriba un programa que ajuste los datos históricos de venta a la recta de regresión y= ax + b; luego, estime la cantidad de artículos (y) para precio dado (x). Sugerencia: use las fórmulas de regresión lineal que aparecen en el Capítulo 7 de mi libro "Algoritmos y su Codificación en C++", Volumen 1. Se tiene la siguiente estructura: struct alumno { chal' nombre[40]; int promedio; }; Escriba un menú para (a) leer alumno, (b) ordenar los alumnos por nombre; (c) ordenar los alumnos por promedio, y (d) listar los alumnos. Use una enumeración para cada opción del menú. Cree una enumeración con los estados del agua. Luego lea n temperaturas del agua y determine el porcentaje en que el agua estuvo en cada uno de sus estados. Una fábrica produce pernos. Cada perno debe tener un diámetro d y una longitud 1, pero se permite un error de ± 0.5 mm para el diámetro y ± 1 mm para la longitud. Lea una serie de pernos y muestre aquellos que son defectuosos. Se considera como defectuosos aquellos que no cumplan alguna de éstas condiciones. . Lea un mes y un año y determine cuántos días tiene ese mes, considere los años bisiestos. Use una enumeración para los meses. ¿ Cuántos días hay entre dos fechas? Use un struct y un enum.

© César Liza AviLa. No mates la producción intelectual, no copies éste libro.

Estructuras, Uniones y Enumeraciones] 11

17. Un punto se representa mediante por una abscisa (x) y una ordenada (y). Lea 2 puntos y determine sus coordenadas polares, la distancia entre ellos y, la ecuación de la recta que pasa por esos dos puntos. 18. Un volumen de una biblioteca puede ser fihro o revista. Esrr.iba un programa que permita ingresar un volumen y mostrar sus datos. Cualquier volumen tiene código, mio, fipo (libro O revista). Si es una revista tendrá además un lSSN, nombre, y un mes de publicación. mientras que si es un libro tendrá un !ISBN. autor y el número de capítulos. Sugerencia: use estructuras y uniones. struct volumen { chal' codigo[JO}; int annio; chal' tipo; uníon detalle v;

unían detalle { struct revista; struct libro;

J;

J; struct revista { char ISSN[ll]; chal' nombre[30]; int mes; };

struct libro { charlSBN/ll]; chal' autor/30}; int nroCap; };

19. Una variante de las uniones fue introducida en el C++ y es llamada union anónima. Una union anónima, declara un conjunto de miembros que se inician en la misma dirección de memoria, pero que no se les da un nombre y se puede acceder directamente a sus elementos. El siguiente enunciado sugiere el uso de una unión anónima: En una empresa trabajan empleados y obreros. Los empleados tienen un sueldo fUo, mientras que los obreros ganan por hora. Lea los datos de n trabajadores y luego lístelos mostrando el mOlltopagado a cada uno y el total pagado por la empresa. Sugerencia: use las estructuras mostradas.

© César Liza Avila. Mis libros son económicos, no hay razón para copiarlos.

·r 112 Algoritmos y su Codificación en C++. Volumen 2.

struct trabajador { char codigo[6]; int anniolngrpso; char tipo; unton { struct empleado; struct obrero;

J; };

César Liza Al/ita

struct empleado { char puesto[20}; float sueldo;

}; struct obrero { float valorHora; int horasTrab; };

20. Se tienen las siguientes figuras geométricas: circunferencia (radio), cuadrado (ladlJ) y rectángulo (2 lados). Escriba un menú en el que el usuario escoja unafigura geométrica y calcule su área. Use una union y una enumeración.

Manipulación de Bits

\

© César Liza A vi/a. No mates la producción intelectual, no copies éste libro.

Manipulación de bits] 15

Solución: Antes de presentar el programa necesitamos comprender como se almacenan los números enteros. Almacenamiento de números enteros El formato de almacenamiento de enteros reserva el último bit (el bit más significativo, esto es el bit más a la izquierda) para indicar que el número es negativo. Si el último bit es O, el número será positivo, si es 1 será negativo. A manera de ilustración tomaremos el tipo short ¡nt (16 bits). Por ejemplo, si el número es a = 239, entonces se almacenará corno: a = 0000 0000 1110 1111 Los números negativos se almacenan, por cuestiones de eficiencia, como complemento a dos. Para calcular el complemento a dos, tomamos el positivo del número, invertimos sus bits y luego le sumamos 1. Por ejemplo, si el número es -240, y tomamos su positivo, tendremos: 240 en binario es : 0000 0000 1111 0000 invirtiendo sus bits: 1111 1111 0000 1111 + le sumamos 1 0000 0000 0000 0001 tendremos

1111 1111 0001 0000

es decir el short ¡nt -240 se almacenará como 1111 1111 0001 0000. Note como el bit más significativo es 1, con lo cual el número se interpreta como negativo, y por ende estará almacenado como complemento a dos.

© César Liza Avila ..Mis libros son económicos, no hay razón para copiarlos.

116 Algoritmos y su Codificación en C++. Volumen 2,

César Liza Avila

La razón para que las computadoras usen el complemento a dos es para calcular fácilmente una diferencia, como si fuera una suma. Asf,

Manipulación de bits H 7

NEGACIONLos bits O se pasan al, Y los bits 1 pasan a ser O.

~

0000 0000 1111 0000 + 1111 1111 000 1 0000

240+ 240

o

7'

I 0000 0000 0000 0000

el desbordamiento se pierde

OPERADORES A NIVEL DE BITS Los operadores a nivel de bits trabajan sobre cada uno de los bits de la variable, y los operandos deben ser de algún tipo entero (char, short, int, long y sus combinaciones con signed y unsigned).

Si a= 000000001110 Illl -a= 1111 1111 00010000 como el negado de a, tiene el ultimo bit en 1, se interpreta como complemento a dos, o sea: si negamos tendremos le sumamos 1:

1111 1111 0001 0000 0000 0000 1110 1111 ----------------------.".---

0000 0000 1111 0000 7

6

5

4

que en decimal será: 2 + 2 + 2 + 2 = 240, como tenía el bit del signo en 1, entonces será -240.

Para entender como se obtiene cada resultado, necesitamos mostrarlos a nivel de bits. Tomemos por ejemplo, a= 239 y b=3, que en binario serán: a = 0000 0000 1110 1111 0000 0000 0000 0011 b

=

Veamos cada una de las operaciones sobre sus bits:

CONJUNCION &: Si los dos bits están en 1, entonces la conjunción resultará 1, en los defilás casos dará O. .. I Si a= 239 y b=3, entonces su conjunción a nivel de bits será: \

=

a 000000001110 1111 & b = 0000 0000 0000 0011 a & b = 0000000000000011 que en decimal será: 2 1 + 2° ::: 3

© César Liza A vUa. No mates la producción intelectual, no copies éste libro.

© César Liza Avila. Mis libros son económicos, no hay razón para copiarlos.

H8 Algoritmos y su Codificación en C++. Volumen 2.

Manipulación de bits 119

César Liza A vila

DESPLAZAMIENTO A IZQUIERDA «

DISYUNCIONI Si los dos bits son 0, entonces la disyunción resultará 0, en los demás casos resultará 1.

El operador « desplaza los bits de un número, una cantidad de posiciones a la izquierda, haciendo que los bits más significativos (los más a la izquierda) desaparezcan y los bits menos significativo se rellenen con O. Si a= 239 y b=3, entonces:

Si a= 239 y b=3, entonces su disyunción a nivel de bits será: a 0000 0000 1110 1111 b 0000 0000 0000 0011

=

a

= =

000000001110 1111

a« b = 00000111 0111 1000 10

que en decimal será: 2 + 29 + 28 + 26 +2 5 +24 +23 = 1912

alb= 0000000011101111

Note que desplazar una posición a la izquierda equivale a multiplicar el número por 2 (en el ejemplo 239*23 = 1912).

EXCLUSION A Si los dos bits son diferentes, entonces la exclusión resultará 1, en los demás casos resultará «J.

DESPLAZAMIENTO A DERECHA » El operador » desplaza los bits de un número, una cantidad de posiciones a la derecha, haciendo que los bits menos significativos (los más a la derecha) desaparezcan y los bits más significativo se rellenen con o. Si a= 239 y b=3, entonces:

Si a= 239 y b=3, entonces su exclusión a nivel de bits será:

a b a

1\

b

= 0000 0000 1110 1111 =

a

1\

= 0000

0000 1110 1111

a» b = 0000 0000 0001 1101

0000 0000 0000 0011

= 0000000011101100

que en decimal será: 2 + 2 + i + 2 +2 = 236

Note que desplazar una posición a la derecha equivale a dividir el número entre 2 (en el ejemplo 239/2 3 = 29).

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liza A vi/a. Mis libros son económicos, no hay razón para copiarlos.

7

6

3

2

c_~.~

~~_-"CC~~c·~·

_ _ _- - - "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

120Algoritmos y su Codificación en C++. Volumen 2.

César Liza A vila

Manipulación d(' bits j 21

El programa muestra el resultado de aplicar cada uno de los operadores a nivel de bits, compárelos con los resultados obtenidos en la explicación anterior.

Solución: Antes de resolver el problema hablemos un poco sobre los números hexadecimales y su relación con los números binarios. Números Hexadecimales En base 16, son válidos los dígitos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, R, F; donde A=lO, B=11, C=12, D=13, E=14 Y F=15.

e, D, E Y

En programación de bajo nivel (cercana a la máquina) se acostumbra a utilizar la base 16, en lugar de la base 2, ya que presenta un equivalente directo con la base 2, pero al contrario de ésta última, es mucho más fácil de manejar. En base hexadecimal cada 4 dígitos binarios equivalen a un dígito hexadecimal. Por ejemplo: El número en base 2: 0001 1111 equivale a lF en hexadecimal. El número en base 16: A2 equivale a 10100010 en binario. Hemos utilizado el tipo snort ini: (16 bits) solo pues cuestiones didácticas, bien podríamos haber utilizado cualquier tipo entero. Debe recordar que los operadores a nivel de bits solo pueden ser usados con tipos enteros.

En C/C++/C# los números hexadecimales van precedidos de Ox, así lF se escribirá OxlF, mientras que A2 se escribirá OxA2. Note que:

No debe confundir los operadores « y » cuando se usan con con! o con el ciD, para evitar confusiones en el programa anterior usamos los paréntesis.

Un byte usará 2 dígitos hexadecimales Dos bytes usará 4 dígitos hexadecimales Cuatro bytes usará 8 dígitos hexadecimales Así el entero 1 (de tipo int o sea 4 bytes) será en hexadecimal OxOOOOOOOl Un valor en base lOse puede imprimir en hexadecimal dentro de un programa mediante hex, por ejemplo couí«hex«28, imprimirá le. Las direcciones de memoria se acostumbran a mostrar en hexadecimal.

© César Liza Avila. No mates la producción intelectual, no copies éste libro.

© César Liza A vi/a. A1is libros son económicos, /10 hay razón para cO/liar/os.

Manipulación ¡de hiTS 123

César [,iza /lvi/a

J22 AI¡;oritmos v su Codificación en C+ + Volumen 2,

Ya en nuestro programa leemos un entero (32 hits) e invocamos a la función impBits( ) con el positivo y el negativo del valor leído.

Por ejemplo, si ingresamos 79 en binario será

En impBits( ), se define una máscara en la cual solo 1 bit está encendido 1000 0000 0000 0000 0000 0000 0000 0000, sabiendo que 4 dígitos 'binarios equivalen a un dígito hexadecimal tendremos: 80000000, que en C/C++/C# se representaría como Ox80000000.

79(10\ 0= 1001111(2)

El impresión se basa en tomar la máscara y hacer un AND a nivel de bits (&) con cada bit de

11, para ver cuales están en 1. Es necesario que la máscara sea del tipo unsigned puesto que si fuera int, el último bit se reservaría para el signo y, por lo tanto, no podría almacenar un número tan grande como Ox80000000 arrojando la inicialización un error pues estaría fuera del rango válido de enteros.

Sin embargo, para obtener la representación de -79 en 32 bits tendremos: Luego de asignar 1 al bit más conIlÜCACloN EN'C+¡.··.· , mask significativo ( # includé. Ox8000000 ), mediante un bucle .\lbig inlpBits(int); recorremos de izquierda a , \:,oid máin(~í?íd) derecha, cada uno de Jos 32 bits { int ni ." ." .... cout«"iÍlgr,esenro: ";.' cin»n.; de n, haciendo un AND con co~t« n«"="~ imPBits( n)) .. cada uno de ellos. Sólo en caso cóut
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF