Fundamento de Programacion en C++

270
INICIANDO PROGRAMADORES CON Christian Mori C++ PRIMERA EDICION Análisis y Resolución de problemas .nET

Transcript of Fundamento de Programacion en C++

Page 1: Fundamento de Programacion en C++

INICIANDO PROGRAMADORES CON

Christian Mori

C++

PRIMERA EDICION

Análisis y Resolución de problemas .nET

Page 2: Fundamento de Programacion en C++

Esta es la entrega que ofrece una amplia enseñanza

acerca de la resolución de problemas computacionales

en lenguaje C++.Net.

Este libro muestra ejercicios diseñados didácticamente

para la fácil asimilación del estudiante.

Además se incluye ejercicios de maratón, exámenes y

ejercicios para aplicaciones actuales.

Con este libro Usted podrá culminar su carrera

de ciencias informáticas sin morir en el intento.

Page 3: Fundamento de Programacion en C++

Contenido

UNIDAD 1

Capítulo 1: Sistemas de procesamiento de datos

1.1 Conceptos de la programación

1.1.1 Programa

1.1.2 Programación

1.1.3 Programador/Desarrollador

1.1.4 Sistema

1.1.5 Sistema de Información

1.1.6 Dato

1.1.7 Información

1.1.8 Software

1.1.9 Hardware

1.2 Ejecución de un programa

1.2.1 Representación sencilla de la ejecución de un programa

1.3 Lenguajes de Programación

1.4 Evolución los lenguajes de Programación

1.4.1 Lenguajes de Alto nivel

1.4.2 Lenguajes de bajo nivel

1.5 Tipos de lenguajes de programación

1.5.1 En función de la forma de programar

1.5.2 Orientados al problema

1.5.3 Según su campo de aplicación

Capítulo 2: Metodología para solución de problemas computacionales

2.1 Pasos para la solución de problemas computacionales

Page 4: Fundamento de Programacion en C++

2.1.1 Definición del problema

2.1.2 Análisis de la solución

2.1.3 Diseño de la solución

2.1.4 Codificación

2.1.5 Prueba y Depuración

2.1.6 Documentación

2.1.7 Mantenimiento

2.2 Tipos de errores

2.2.1 Error sintáctico de software

2.2.2 Error de lógica de programador

2.2.3 Error fatal en tiempo de ejecución

2.2.4 Error interno de software

Capítulo 3: Fases de la programación

3.1 Elementos de un programa

3.1.1 Tipos de datos en C++

3.1.2 Identificadores

3.1.3 Conceptos básicos al nombrar variables

3.1.4 Asignación de variables

3.1.5 Operadores

3.1.6 Prioridad de Operadores

3.1.7 Entrada y Salida

3.2 Manejo de Expresiones

3.2.1 Transformación de expresiones algebraicas a computacionales

3.2.2 Declaración de Variables

3.2.3 Datos Enteros vs Datos Reales

3.2. 4 Partes de la división

3.2.5 División Entera vs división real

3.2.6 Resultados de la división

3.2.7 Análisis de almacenamiento de la división con resultados numéricos

Page 5: Fundamento de Programacion en C++

3.2.8 Residuo (Modulo)

Capítulo 4: Flujos de Control

4.1 Estructuras condicionales

4.1.1 Expresiones booleanas

4.1.2 Estructura condicional < if >

4.1.3 Estructura condicional < if - else >

4.1.4 Estructura condicional anidada < if - else - if >

4.1.5 Estructura de selectiva múltiple < switch >

4.1.6 8 Recomendaciones para el uso de estructuras condicionales.

4.2 Estructuras repetitivas

4.2.1 Conceptos acerca de estructuras repetitivas

4.2.2 Operadores de incremento

4.2.3 inicialización de variables

4.2.4 Contadores y Acumuladores y Banderas (flag)

4.2.5 Estructura repetitiva < for >

4.2.6 Estructura repetitiva < while >

4.2.7 Estructura repetitiva < do - while >

4.2.8 Anidamiento de bucles

4.2.9 8 Recomendaciones para el uso de estructuras repetitivas

Capítulo 5: Ejercicios de autoevaluación

Capítulo 6: Funciones Predefinidas de C++

6.1 Concepto de Función

6.2 Funciones Aritméticas

6.3 Funciones trigonométricas

6.4 Funciones de caracteres

6.5 Funciones de Cadena

6.6 Generador de números aleatorios

6.7 De Control de pantalla

Page 6: Fundamento de Programacion en C++

UNIDAD 2

Capítulo 7: Programación Modular

6.3 Diseño descendente

6.4 Subprogramas

6.5 Variables globales y locales

6.6 Funciones

7.4.1 Definición de funciones

7.4.2 Invocación a las funciones

6.7 Procedimientos

7.5.1 Definición de Procedimientos

7.5.2 Invocación a las Procedimientos

7.6 Tipos de Parámetros

Capítulo 8: Arreglos

8.1 Arreglos Unidimensionales

8.1.1 Representación Grafica

8.1.2 Asignación de Valores

8.1.3 Lectura y escritura de datos

8.1.4 Recorrido, inserción y eliminación en un vector

8.2 Arreglos Bidimensionales

8.1.1 Representación Grafica

8.2.2 Asignación de Valores

8.2.3 Lectura y escritura de datos

8.2.4 Recorrido, inserción y eliminación en una matriz

8.3 Ordenamientos

8.3.1 método de intercambio o burbuja

8.3.2 método por inserción,

8.3.3 método por selección

8.3.4 método de ordenación rápida (quicksort).

8.4 Búsquedas

8.4.1 Tipos de búsqueda

Page 7: Fundamento de Programacion en C++

8.4.2 Método Búsqueda Binaria

Capítulo 9: Cadenas

9.1 Fundamentos de cadenas

9.2 Asignación de Valores

9.3 Lectura y escritura de datos

9.4 Arreglo de cadenas

9.5 Lectura y escritura de datos

Capítulo 10: Ejercicios de autoevaluación

Capítulo 11: Ejercicios Propuestos al estudiante

Page 8: Fundamento de Programacion en C++

Prefacio

Este libro ha sido creado para los iniciantes en la programación. Puede ser como

primer libro de programación ya que cuenta con los conceptos principales para la

resolución de problemas. Aunque la versión de C++.Net es 2012 es también valido

para versiones anteriores de C++.Net.

Para entender el libro no se requiere grandes conocimientos superiores, solo es

indispensable tener conocimientos de matemáticas tan básicos como algebra y

operaciones.

Un modelo, no una regla

Lo expuesto en el libro son conocimientos básicos fundamentales en la

programación, además de recomendaciones adquiridas con la experiencia en el

campo. Seguir las recomendaciones sugiere tener menos tropiezos en los

desarrollos ya que las recomendaciones vertidas son correctivos de dichos

tropiezos.

Bibliografia para complemento y apoyo

A continuación listamos algunos materiales que sirven como complemento del

estudio del libro. Se puede corroborar y encontrar adicionales

- Manual Estructura de Datos Universidad Tecnologica del Peru

- Fundamentos de Programacion (Luis Joyanes)

- Resolucion de Problemas con C++ (Walter Savitch)

- Manual de C++ para Microsoft Visual Studio 2012

Contacto por correo electrónico

Estoy sumamente interesado en sus comentarios y sugerencias. Por favor no

dudes en enviarlos al correo electrónico:

Page 9: Fundamento de Programacion en C++

[email protected]

Sus sugerencias serán procesadas para el mejoramiento continuo del libro, mas

no para la resolución de algún problema propuesto, puesto que los problemas

serán resueltos paulatinamente en las siguientes ediciones del libro.

Agradecimientos

Durante la preparación de este libro, ha intervenido muchas personas y diversas

han sido las ayudas, Mis grandes amigos de estudio, mi familia, a los que se

encuentran conmigo Dios creador de todo y el señor que es mi amigo que se

encuentra a mi lado, mi padre Ezequiel Mori.

Doy especial agradecimiento a los estudiantes de mis cursos que aprobaron y me

enseñaron a cómo instruir, fueron el mejor test que pude haber tenido al diseñar el

libro.

A la izquierda Christian con su padre Ezequiel.

Page 10: Fundamento de Programacion en C++

Introducción

El presente trabajo ha sido un gran esfuerzo místico con el fin de orientar a los

primeros estudiantes que ayudara a desarrollar la capacidad de análisis en los

problemas computacionales.

Este trabajo va dirigido a los futuros expertos en sistemas y programación de

computadoras, ya que varias personas por falta de motivación abandonan esta

parte valiosa de la computación y sistemas.

En este libro desarrollaremos los problemas computacionales desde los más

comunes para iniciantes y complejos de análisis para los avanzados.

Inicialmente se mostraran las equivalencias de pseudocódigo y C++ hasta el

capítulo 4, luego se desarrollaran los programas solo en lenguaje C++.

Page 11: Fundamento de Programacion en C++

Capítulo 1

Sistemas de Procesamiento

de Datos 1.1 Conceptos de la programación

1.1.1 Programa

1.1.2 Programación

1.1.3 Programador/Desarrollador

1.1.4 Sistema

1.1.5 Sistema de Información

1.1.6 Dato

1.1.7 Información

1.1.8 Software

1.1.9 Hardware

1.2 Ejecución de un programa

1.2.1 Representación sencilla de la ejecución de un programa

1.3 Lenguajes de Programación

1.4 Evolución los lenguajes de Programación

1.4.1 Lenguajes de Alto nivel

1.4.2 Lenguajes de bajo nivel

1.5 Tipos de lenguajes de programación

1.5.1 En función de la forma de programar

1.5.2 Orientados al problema

1.5.3 Según su campo de aplicación

Page 12: Fundamento de Programacion en C++

Sistemas de Procesamiento de Datos

Introducción

Es el conjunto de métodos y procedimientos que permiten obtener información.

A continuación se mencionan conceptos que será fundamental que el lector conozca:

1.1 Conceptos de los sistemas de computación

1.1.1 Programa

Es el conjunto de instrucciones que una computadora ha de seguir. Estas instrucciones son escritas en

un lenguaje de programación que la computadora es capaz de interpretar.

1.1.2 Programación

Es aquella actividad por la cual se crean programas para computadoras.

1.1.3 Programador/Desarrollador

Individuo que ejerce la programación, es decir escribe programas para computadoras.

1.1.4 Sistema

Es un conjunto de elementos interrelacionados entre sí, interactuando con un objetivo en común.

1.1.5 Sistema de Información

Es el conjunto de procedimientos ordenados que al ser ejecutados proporcionan información para

apoyar la Toma de Decisiones y el control de una organización.

1

Page 13: Fundamento de Programacion en C++

Entrada (INPUT) Proceso Salida (OUTPUT)

1.1.6 Dato

Representa observaciones o hechos fuera de contexto y sin significado inmediato (Es materia prima de

la información).

1.1.7 Información

Es el significado que una persona asigna a un dato (conjunto de datos).En otras palabras es el

resultado o salida que emite un programa o sistema de información.

1.1.8 Software

Serie de programas que la computadora utiliza con un fin en especial.

1.1.9 Hardware

Son las maquinas físicas reales que constituyen una instalación de cómputo.

1.2 Ejecución de un programa

En la ejecución de un programa intervienen elementos de entrada y de salida que interactúan en la

computadora. Se necesita de datos de entrada ingresados desde teclado usualmente, un programa

escrito en un lenguaje de programación, una computadora que mostrara los resultados y/o salida

usualmente por pantalla.

1.2.1 Representación sencilla de la ejecución de un programa

Programa

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

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

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

----

Datos

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

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

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

Computadora

Salida

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

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

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

Page 14: Fundamento de Programacion en C++

1.3 Lenguajes de Programación

Definición

Es un conjunto de reglas semánticas así como sintácticas que los programadores usan para la

codificación de instrucciones de un programa o algoritmo de programación.

1.4 Evolución los lenguajes de Programación

Es el desarrollo y mejoramiento de los lenguajes de programación a través de la historia, se

categorizan en:

1.4.1 Lenguajes de Alto nivel

4to nivel: Llamados también generador de aplicaciones Son en esencia programas para crear

programas, por ejemplo herramientas CASE, GENEXUS Tool, PowerDesigner, etc.

3er nivel: Es el nivel de lenguaje más parecido al lenguaje del ser humano, con más signos y reglas

para expresar con facilidad las cosas más complicadas, entre ellos existen C++, BASIC, PASCAL, C#,

JAVA, Php, ETC

Ejm: Z=X+Y

1.4.2 Lenguajes de Bajo Nivel

2do nivel: Es el tipo de lenguaje que cualquier computadora puede entender, por ejemplo

Ensamblador.

Ejm: ADD X Y Z

1er nivel: Llamado también Lenguaje de Maquina. Son los programas escritos en forma de ceros y

unos.

Ejm

0110 1001 1010 1011

Page 15: Fundamento de Programacion en C++

1.5 Tipos de lenguajes de programación

Son las distintas formas y categorías de los lenguajes de programación, se categorizan en:

1.5.1 En función a la forma de programar

Lenguajes procedurales: FORTRAN, BASIC, PASCAL, ADA, MODULA-2

Lenguajes declarativos: LIPS, PROLOG

Orientados a objetos: C++, Java, C#

1.5.2 Orientados al problema:

Generadores de aplicaciones: GENEXUS Tool, PowerDesigner, etc.

1.5.3 Según su campo de aplicación.

Aplicaciones científicas: FORTRAN y PASCAL

Aplicaciones en procesamiento de datos: COBOL y SQL.

Aplicaciones de tratamiento de textos: C

Aplicaciones en inteligencia artificial: LISP y PROLOG

Aplicaciones de programación de sistemas: ADA, MODULA-2 y C.

Lenguajes de Internet: HTML, JAVA, Perl, PHP, ASP.NET

Page 16: Fundamento de Programacion en C++

Capítulo 2

Metodología para solución

de problemas

computacionales 2.1 Pasos para la solución de problemas computacionales

2.1.1 Definición del problema

2.1.2 Análisis de la solución

2.1.3 Diseño de la solución

2.1.4 Codificación

2.1.5 Prueba y Depuración

2.1.6 Documentación

2.1.7 Mantenimiento

2.2 Tipos de errores

2.2.1 Error sintáctico de software

2.2.2 Error de lógica de programador

2.2.3 Error fatal en tiempo de ejecución

2.2.4 Error interno de software

Page 17: Fundamento de Programacion en C++

2 Metodología para solución de problemas computacionales

Introducción

Es la serie de pasos adecuados que se ha de seguir para obtener una solución completa de un

problema computacional.

2.1 Pasos para la solución de problemas computacionales

A continuación se mencionan los puntos a seguir:

2.1.1 Definición del problema

Conocer y delimitar por completo el problema, saber que es lo se desea realice la computadora.

2.1.2 Análisis de la solución

Establecer una serie de preguntas acerca de lo que establece el problema:

¿Con qué cuento? , ¿Qué hago con esos datos? , ¿Qué se espera obtener?

2.1.3 Diseño de la solución

Es la creación del algoritmo (Diagrama de flujo y/o pseudocódigo),

Page 18: Fundamento de Programacion en C++

2.1.4 Codificación

Escribir la solución del problema (de acuerdo al pseudocódigo), en una serie de instrucciones

detalladas en un código reconocible por la computadora (PROGRAMA).

En la actualidad y con algo de práctica se es posible pasar del análisis de la solución a la codificación,

en muchos casos es más rápido y permite detectar errores mediante la depuración o debug, asunto

que se haría manualmente en el pseudocódigo y/o diagrama de flujo.

2.1.5 Prueba y Depuración

La Prueba es el proceso de identificar los errores que se presenten durante la ejecución del programa.

La Depuración consiste en eliminar los errores que se hayan detectado durante la prueba.

2.1.6 Documentación

Es la guía o comunicación escrita que sirve como ayuda para usar un programa, o facilitar futuras

modificaciones.

La documentación que va a sustentar en términos legales la creación y/o modificación del programa.

Existen 3 tipos:

Documentación Interna

Consiste en los comentarios o mensajes que se agregan en el código del programa (Es la más usada),

mientras más detallado se encuentre el programa será más fácil la modificación en el futuro, además

es utilizado para controles internos dentro del área de TI.

Consta de: Nombre de modulo, Descripción del módulo, Nombre del Autor, fecha creación, fecha

modificación

Documentación Externa

Page 19: Fundamento de Programacion en C++

Es el Manual Técnico (A menudo obviada), está integrada por los siguientes elementos: Descripción

del Problema, Nombre del Autor, Diagrama del Flujo, Pseudocódigo, Lista de variables y constantes, y

Codificación del Programa.

Manual del Usuario

Es la documentación (Generalmente diapositivas) que se le proporciona al usuario final, presentando

todas las pantallas y menús que se va a encontrar y una explicación de los mismos.

Es de uso indispensable cuando se va a entregar el programa al usuario final puesto que facilitara el

manejo en gran medida del programa.

2.1.7 Mantenimiento

Se realiza después de determinado el programa cuando se detecta que es necesario hacer un cambio,

ajuste y/o complementación al programa para que siga trabajando de manera correcta.

Nota: En la actualidad para un performance adecuado en el desarrollo de sistemas algunas empresas

disponen de usar un software manejador de versiones de fuentes esto favorece en gran medida el

control y feedback de los desarrollos.

2.2 Tipos de Errores

A continuación se detallan los distintos tipos y formas en que aparecen los errores, además las

recomendaciones para disminuir su aparición.

2.2.1 Error sintáctico de software

Page 20: Fundamento de Programacion en C++

Son los errores conocidos como gramaticales respecto al software de lenguaje de programación que

se utiliza. Estos errores son los que se muestran en la mayoría de los casos en el programa editor de

código en tiempo de codificación.

Pueden aparecer por no teclear correctamente alguna instrucción y/o comando del lenguaje de

programación utilizado, la buena noticia de este tipo de errores son que se pueden detectar y corregir

en tiempo de codificación, El software del lenguaje de programación en muchos casos detecta los

errores automáticamente mientras se digita el código antes de ejecutar el programa.

Por ejemplo en C++ toda instrucción termina en punto y coma < ; > si obvias ponerla seguramente el

compilador te mostrara un mensaje de error al intentar ejecutar el programa.

2.2.2 Error de lógica de programador

Son los errores del desarrollador y son errores de interpretación de los procesos funcionales (A

menudo en expresiones de cálculos).

Por ejemplo le podrían pedir calcular el promedio de 2 números y por distracción suma los dos

números y los divide sobre tres, O quizás en su fórmula emplea lo siguiente: A+B / 2 y no coloca el

paréntesis para que primero sume.

Este tipo de errores no es percibido por el software editor de código ya que estos errores son

sintácticamente correctos, en consecuencia solo pueden ser percibidos en tiempo de ejecución del

programa al intentar ver el resultado o quizás mucho después.

2.2.3 Error fatal en tiempo de ejecución

Estos tipos de errores suelen mostrar el respectivo mensaje de error, y en muchos casos consiguen

hacer terminar forzosamente al programa.

Este tipo de errores son los más comunes aun cuando se alcanza a dominar la programación.

A menudo este tipo de errores son por cálculos numéricos y reglas matemáticas que no pueden ser

pasadas por alto por ejemplo si se intenta dividir un número sobre cero,

Page 21: Fundamento de Programacion en C++

Otro caso general es cuando se intenta obtener un valor ya sea por teclado o de otra ubicación, y no

se valida que haya obtenido realmente el valor y se hace una expresión con la variable como si tuviera

el valor y en ese momento seguramente tendrás un error en tiempo de ejecución.

La recomendación para este tercer tipo de error es siempre validar las entradas ya sea teclado, lectura

de archivos de texto, base de datos, etc.

2.2.4 Error interno de software

No solo el desarrollador tiene errores, el software de programación utilizado algunas veces muestra

errores. En algunos casos por modificación de algún componente interno ya sea por la instalación de

algún otro software en la PC (Personal Computer) que consigue modificar el componente.

Otros casos también suceden por no refrescar el proyecto utilizado, actualmente el software de

programación cuenta con herramientas de actualización incluido. Este es nombrado de muchas

formas: refrescar, actualizar, regenerar, etc. En cualquiera de los casos es recomendable actualizar

cada cierto tiempo el proyecto de programación.

Un caso menos usual es la infección de virus que en la actualidad se corrige con un antivirus efectivo.

Page 22: Fundamento de Programacion en C++

Capítulo 3

Fases de la Programación

3.1 Elementos de un programa

3.1.1 Tipos de datos en C++

3.1.2 Identificadores

3.1.3 Conceptos básicos al nombrar variables

3.1.4 Asignación de variables

3.1.5 Operadores

3.1.6 Prioridad de Operadores

3.1.7 Entrada y Salida

3.2 Manejo de Expresiones

3.2.1 Transformación de expresiones algebraicas a computacionales

3.2.2 Declaración de Variables

3.2.3 Datos Enteros vs Datos Reales

3.2. 4 Partes de la división

3.2.5 División Entera vs división real

3.2.6 Resultados de la división

3.2.7 Análisis de almacenamiento de la división con resultados numéricos

3.2.8 Residuo (Modulo)

Page 23: Fundamento de Programacion en C++

3Fases de la Programación

Introducción

En este capítulo comenzaremos a revisar los elementos de un programa, los conceptos necesarios

para realizar un programa sencillo.

3.1 Elementos de un programa

3.1.1 Tipos de datos en C++

Son clasificadores de variables ya sea en el dato que contendrá u operaciones que se realizara sobre

ellas. A continuación se muestra una tabla con los rangos y algunas otras características de los tipos

de datos:

Tipo de datos

Rango Mínimo (*) Precisión

Descripción C++

Enteros

short 32,767

int 32,767

long 2‟147,483,467

Entero sin signo unsigned long 4‟294,967,295

Reales

float 10^37 6 dígitos

double 10^37 6 dígitos

long double 10^37 6 dígitos

Carácter char 127

Cadena string

Booleano bool

Page 24: Fundamento de Programacion en C++

(*) EL limite considera límite inferior el mismo número con signo negativo hasta el límite superior que

es el numero mostrado, con excepción de los que llevan la palabra reservada unsigned(sin signo) en

esos casos el límite inferior es cero y el límite superior es el doble del numero mostrado.

Estos son los mínimos rangos sin embargo esto puede variar de acuerdo a la versión del compilador, a

continuación se muestra los típicos rangos para un ambiente de 32 bits:

Tipo de datos

Bytes utilizados Típico Rango(*)

Descripción C++

Enteros

short 2 bytes 32,767

int 4 bytes 2‟147,483,467

long 4 bytes 2‟147,483,467

Entero sin signo unsigned long 4 bytes 2‟147,483,467

Reales

float 4 bytes 1.8^-38 a 3.4^38

double 4 bytes 2.2^-308 a 1.8^308

long double 8 bytes 2.2^-308 a 1.8^308

Real sin signo

unsigned double

unsigned long double

Carácter char

1 Byte: guarda un carácter

Cadena string

Bytes Dinámicos, su tamaño es ilimitado

Booleano bool 1 bit

Nota: Para los iniciantes los tipos de datos definidos bajo pseudocódigo se puede utilizar la descripción

de la tabla. Sin embargo para este libro se utilizara los términos de C++.

3.1.2 Identificadores

Es el nombre de una variable. Las variables se dividen en 2 tipos:

Variable: Son ubicaciones de memoria en las cuales guarda un valor, además dicho valor puede ser

cambiado a lo largo del programa.

Page 25: Fundamento de Programacion en C++

Constante: Son un tipo de variable que mantiene su valor desde el principio hasta el final del

programa.

3.1.3 Conceptos básicos al nombrar variables

Se consideran las siguientes recomendaciones al nombrar variables:

Use un nombre de variable que le dé significado al valor que va a contener.

Es factible usar abreviaturas, parte de la palabra o concepto que va a almacenar, mnemónico

(palabra técnica) o palabra completa separada por guion bajo “_” ya sea por la complejidad de la

rutina o del problema.

Respecto a las terminaciones con numeración pueden usarse en caso de tener variables con el

mismo nombre pero con diferentes valores de una lista.

Se debe tener en cuenta que C++ distingue letras mayúsculas de minúsculas por lo tanto la

variable (A) es distinta de la variable (a).

No se puede nombrar variables que tengan como nombre algún comando, palabra

reservada, tipo de dato, etc. del lenguaje de programación utilizado. Por ejemplo en c++

existe el tipo de dato double si nombramos una variable con el nombre double

seguramente nos dirá que hay un error.

Una forma recomendada de nombrar variables es:

<ámbito (local, global, parámetro, etc.)><Tipo de dato>_<nombre variable>.

Imagine una variable local de tipo entero que va a contener una edad, el nombre de la variable podría

ser: li_edad.

Variable global para guardar el sexo de maría („M‟,‟F‟), podemos declarar: gc_sexo_maria.

A continuación listamos más ejemplos:

CAR

Car

CAR y Car son variables distintas

Page 26: Fundamento de Programacion en C++

a_50

b35a

pepito

Promedio_ventasC

31p => no valido

Luis Sánchez => no valido

Usuario-1 => no valido

lc_nombre =>local de tipo carácter (recomendado)

gl_cantidad => global de tipo long (recomendado)

afl_promedio =>argumento de tipo float (recomendado)

En este libro usaremos la forma recomendada de nombrar variables cuando veamos problemas

algorítmicos de sobremanera complejos.

3.1.4 Asignación de variables

Se asigna valores del mismo tipo que el que se declaró previamente a la variable/constante

(aritmética, lógica, textos y caracteres).

Pseudocódigo

C++

Observación

Variable = variable/valor

Variable = variable/valor;

A=10 A=10;

B=20 B=20;

C = A + B C = A + B;

D="Arriba Peru" strcpy(D,"Arriba Peru"); Se utiliza una función predefinida de C++ (Véase capítulo 6)

Page 27: Fundamento de Programacion en C++

E='A' E='A';

F = 10 + 50 F = 10 + 50;

G = 10 + "50" G = 10 + "50"; No valido(10 es un numero entero y “50” es cadena por estar entre comillas)

H = D + B H = D + B; No valido(D es cadena y B es un entero)

3.1.5 Operadores

Tipo Operadores Descripción Pseudocódigo C++

Aritméticos

Suma + +

Resta - -

Multiplicación * *

División real /

/

División entera Div

Residuo(división entera) Mod %

Relacionales

Mayor que > >

Mayor o igual que > >=

Menor < <

Menor o igual que < <=

Igualdad = ==

Diferente <> !=

(*)

Page 28: Fundamento de Programacion en C++

(*) Notar que para C++ se colocó el mismo símbolo en división real y entera, para saber en qué

momento funciona como división real y en qué momento como división entera (Véase los apartados

3.2.5, 3.2.6, 3.2.7)

3.1.6 Prioridad de Operadores

A continuación se detalla el orden de prioridad al momento de operar, se respeta de manera similar al

orden que se usa en el álgebra de las matemáticas. Al igual que en el álgebra es posible alterar el

orden de operación haciendo uso de paréntesis. Para agrupaciones más complejas solo está permitido

el uso del paréntesis “()”.

1. () (*)

2. /

3. *

4. +

5. –

(*) Las operaciones que están dentro de paréntesis se evalúan primero. Cuando existe múltiples paréntesis (anidado: internos unos a otros), se evalúan primero las expresiones más internas. Ejemplos

Considere si: A=3, B=4, C=5:

Lógicos

Y And &&

O Or ||

Negación Not !

a)

X = A - B + C

X = 3 - 4 + 5

X = 3 - 9

X = - 6

b)

Y = A*B + C

Y = 3*4 + 5

Y = 12 + 5

Y = 17

Page 29: Fundamento de Programacion en C++

3.1.7 Entrada y Salida

Entrada

Es el flujo de datos que el programa utilizará para realizar sus procesos. Vale decir que la entrada

puede originarse de distintas ubicaciones (Teclado, un archivo, etc.).

En c++ utilizaremos el comando:

scanf(<formato>, &<variable>);

Ejemplo:

int nro; scanf("%d”,&nro");

Salida

Es generalmente la información y/o resultado del programa. Además se puede utilizar como mensajes

para solicitud de entradas.

En c++ utilizaremos el comando:

printf(<formato>, <lista de variables>);

Ejemplos:

printf("\n\n\r Ingrese un numero entero: "); printf("\n El Entero ingresado: %d", nro); printf("\nEl real ingresado: %f y la cadena ingresada: %s", nro_float, cadena);

c)

Z = C*B + A / A

Z = 5*4 + 3 / 3

Z = 5*4 + 1

Z = 20 + 1

Z = 21

d)

W = ((A + B) - (C - A)) / C

W = ( (3 + 4) - (5 - 3) ) / 5

W = ( (7) - (2) ) / 5

W = (5) / 5 = 1

(*)

Page 30: Fundamento de Programacion en C++

printf("\nEl real ingresado: %8.4lf", nro_double); (**)

(*) Notar el texto en negrita %f y %s, dichos valores serán reemplazados por las variables listadas

después de la coma en orden de ocurrencia.

(**) Notar el número 8.4 del formato %8.4lf, representa el formato de impresión del número en pantalla

en este caso longitud 8 a 2 decimales.

Formatos de entrada y salida

Formato Tipo de dato

%d int

%ld long

%f float

%lf double

%c char

%s char(cadena)

%u Entero sin signo

Notar que %c y %s tienen el mismo tipo de dato, no obstante %c imprime solo un carácter y %s

imprime una cadena de caracteres.

Secuencias de escape

Como señalamos en los ejemplos de Salida en la impresión con printf, mostramos unos ejemplos de

uso de las secuencias de escape, a continuación listamos más secuencias de escape:

Descripción Símbolo

Nueva Línea \n Tabulación Horizontal \t Retorno de carro \r Alerta \a Diagonal invertida \\ Comillas dobles \"

Page 31: Fundamento de Programacion en C++

Ejemplos:

printf("\n\t Promedio: %8.2lf \n\n", prom); printf("\n\n la cadena \"%s\" tiene una longitud: %d \n\n", cadena, longitud);

Page 32: Fundamento de Programacion en C++

3.2 Manejo de Expresiones

3.2.1 Transformación de expresiones algebraicas a computacionales

Como ya se mencionó en el apartado Prioridad de operadores, solo están permitidos los paréntesis “()”

a continuación veremos cómo transformar las expresiones algebraicas hacia expresiones

computacionales:

Expresión algebraica Expresión computacional

4 + 5 4 + 5

A - 10

2 x 4 2 * 4

1 / 2

1 + 2 / 8 - ( 10 * 2 )

7(a + b) 7*(a+b)

8*x + 9y + 3*z

( )

(p+q) / (x+m/n)

(a / b)*c*d

(a+b)*(c-d)*(e-f)

(a+b)*(c-d) * ((e-f) / (g-h))

(A + 5 – b – 4 + 2) / D

[ ]

(a * b * (-c * d) + 5) / 10

1 / (a * b * c + c * d - 10)

((a-b)/(c-d) / ((e-f)/(g-h))

Page 33: Fundamento de Programacion en C++

3.2.2 Declaración de Variables

Es el acto de definir un Tipo de dato válido a una variable que se utilizará en el programa.

Ejemplos:

Pseudocódigo C++

Entero: A,B int A,B; long k,b;

Real: P,Q float P,Q; double R, s;

Carácter: Sexo, Condición char Sexo, Condición;

Constante Entero: P=10 const int P = 10;

3.2.3 Datos Enteros vs Datos Reales

En c++ hay que tener claro la diferencia entre los datos enteros y reales, para eso dividimos el

concepto en 2 partes: números y variables:

Para los números digitados en expresiones, son enteros siempre y cuando no se digita el punto

decimal y números posteriores, en caso contrario son reales.

Números Enteros

Son aquellos números que no cuentan con parte decimal.

Ejemplo: 0, 1, 15, 540, 1500, etc.

Números Reales

Son aquellos números que poseen parte real o decimal.

Ejemplo: 0.00001, 1.633, 20.3598, 1.3333333, 1.0, etc.

No obstante en la programación en C++, las variables que contendrán números son del tipo en el

que son declarados ya sea real (double o float) o entero (int, long).

Variables Enteras

Son aquellas variables que son declaradas como enteras.

Page 34: Fundamento de Programacion en C++

Ejemplo: int P; long Q, R;

Variables Reales

Son aquellas variables que son declaradas como tipo de dato reales.

Ejemplo: float A; double B, C;

3.2.4 Partes de la división

3.2.5 División Entera vs división real

En los problemas computacionales no solo es usada la división real sino también es a menudo

necesario el uso del operador de divisiones enteras.

3.2.6 Resultados de la división

Los resultados de la división van a depender del tipo de dato del dividendo y/o divisor. A continuación

mostraremos los resultados teniendo en cuenta el tipo de dato del dividendo y divisor:

División de Números

a) 10 ÷ 5 = 2 (Símbolo de división no utilizado en C++)

b) 12 / 5 = 2

c) 15 / 4.0 = 3.75

d) 15 / 4 = 3

e) 10 / 3 = 3

Page 35: Fundamento de Programacion en C++

f) 10.0 / 3 = 3.333333…

La representación c) muestra el resultado real pues la división cuenta con un dividendo entero y un

divisor real (por estar con punto decimal .0) y además tiene residuo inicial 3 (> 0)

Dónde:

15: Dividendo

4.0: Divisor

3.75: Cociente (es el resultado de la operación)

3: Residuo

La representación e) muestra el resultado entero pues se está usando operadores enteros.

Dónde:

10: Dividendo

3: Divisor

3: Cociente (es el resultado de la operación)

1: Residuo

Page 36: Fundamento de Programacion en C++

División de Variables

Supongamos que contamos con las siguientes variables:

int P, Q; double R,S;

Ahora supongamos que tienen los siguientes valores:

P=10; Q=20;

R=1.5; S=2.5;

División variables enteras

a) B / A = 2

b) A / B = 0

División variables Reales

c) S / R = 1.66666…

d) R / S = 0.6

División variables Enteros y Reales

e) Q / S = 8.0

f) R / P = 0.15

Page 37: Fundamento de Programacion en C++

División de variables y números

Supongamos que contamos con las variables P, Q, R, S mencionados anteriormente:

a) P / 5 = 2

b) Q / 4.0 = 5.0

c) P / 6 = 1

d) Q / 20.0 =1.000000 (*)

e) P / 0 = (Error en tiempo de ejecución)

f) R / 10 = 0.15

g) 5.0 / S = 2.0

h) 2.5 / R = 1.666666… (**)

(*): El resultado es real, en el ejemplo se muestra 1.000000 como resultado no obstante la cantidad de

dígitos decimales va a depender del tipo de dato definido en C++ ya sea float o double. (Véase el

apartado 3.1.1)

(**): Existen divisiones en las cuales el resultado de la división es un número con parte decimal muy

extenso como .33333..., la longitud de los dígitos va a depender del tamaño del tipo de dato de la

variable en la cual se va a almacenar o el formato redondeando el ultimo digito de ser necesario

(Véase el apartado 3.1.1)

En general para obtener los resultados esperados de acuerdo al dividendo y divisor ya sea variables o

números se puede aplicar la siguiente regla:

Dividendo Divisor Resultado

Entero Entero Entero

Entero Real Real

Real Entero Real

Real Real Real

Page 38: Fundamento de Programacion en C++

3.2.7 Análisis de almacenamiento de la división con resultados numéricos

Considere que las variables A, B, C y P son de tipo entero int, variables C, D E y Q de tipo double:

//Declaración de variables enteras int A, B, C, P; //Declaración de variables reales double D, E, F, Q;

//Asignación a variables A=10; B=5; C=0.5; // C almacena 1 ya que la variable C es de tipo int D=0.5; E=1.24; F=1; // F almacena 1.000000, ya que la variable F es de tipo double

A continuación se muestran típicas operaciones en la que se almacena valores erróneos por los tipos

de datos:

P=A / E;

Cuidado con este tipo de operaciones. El resultado de la división es 8.06 pero P=8, por la causa de

que la variable P es de tipo entero.

Q=(A+B) / 2;

El resultado de la división es un entero 7 y como Q es doublé Q=7.000000.

Q=(A+B) / 2.0;

El resultado de la división es real 7.5 por lo tanto Q=7.500000.

Page 39: Fundamento de Programacion en C++

3.2.8 Residuo (Modulo)

En C++ el operador modulo es representado por < % >, y se utiliza para obtener el residuo o resto de

una división entera, vale decir que para obtener el resto el dividendo y divisor deben ser

necesariamente enteros.

Ejemplos

Si A=15, B=14, C=3, D=2 entonces:

a) A % 6 = 3

b) B % 2 = 0

c) 19 % C = 1

d) 7 % 9 = 7

e) C % 3 = 0

f) D % 5 = 2

g) B % 0 = 0

Page 40: Fundamento de Programacion en C++

Capítulo 4

FLUJOS DE CONTROL

4.1 Estructuras condicionales

4.1.1 Expresiones booleanas

4.1.2 Estructura condicional < if >

4.1.3 Estructura condicional < if - else >

4.1.4 Estructura condicional anidada < if - else - if >

4.1.5 Estructura de selectiva múltiple < switch >

4.1.6 8 Recomendaciones para el uso de estructuras condicionales.

4.2 Estructuras repetitivas

4.2.1 Conceptos acerca de estructuras repetitivas

4.2.2 Operadores de incremento

4.2.3 inicialización de variables

4.2.4 Contadores y Acumuladores y Banderas (flag)

4.2.5 Estructura repetitiva < for >

4.2.6 Estructura repetitiva < while >

4.2.7 Estructura repetitiva < do - while >

4.2.8 Anidamiento de bucles

4.2.9 8 Recomendaciones para el uso de estructuras repetitivas

Page 41: Fundamento de Programacion en C++

4.3 Introducción a C++

4.3.1 Reseña histórica

4.3.2 Librerías y palabras reservadas básicas

4.3.3 Estructura de un programa en C++

4.3.4 Creación, ejecución y depuración de un programa mediante Visual Studio .Net

Page 42: Fundamento de Programacion en C++

4Flujos de Control

4.1 Estructuras Condicionales

Usualmente en los programas va a ser necesario que se ejecuten ciertas instrucciones bajo ciertas

condiciones, es en estos casos cuando resultan sumamente útiles las estructuras de control, las cuales

mediante expresiones booleanas en una estructura condicional van a determinar que bloque del

código se va a ejecutar.

4.1.1 Expresiones Booleanas

Se denomina expresión booleana a aquella expresión en la cual se va a realizar una evaluación y

como resultado de dicha evaluación solo puede devolver dos posibles valores true (Verdad) o false

(falso). Está compuesta generalmente por variables/valores, operadores de comparación y operadores

lógicos.

Expresiones con operadores de comparación

Son el tipo de expresiones más sencillas en las cuales se van a evaluar dos valores mediante un

operador de comparación.

Ejemplos:

Si A=50, B=70, C=‟A‟, D=1 entonces:

char

A == 50 => true B = 70 => No es una expresión booleana, es una asignación a la variable B con 70

A > B => false

C==”A” => Error en tiempo de codificación, las comillas dobles indica cadena

C==‟A‟ => true

B>C => true, „A‟ representa el número 65 en la tabla de los códigos ASCII Véase capitulo X

Page 43: Fundamento de Programacion en C++

A+B < B+D => false

D != D => false

D => true

!D => false (*)

(*) Nótese que < !D > retorna false, puesto que en C++ el numero 1 representa true y 0 false, aunque

esto es posible no se recomienda usar los números para este propósito, en su lugar C++ cuenta con

un tipo de dato especial bool.

Ejemplo:

bool sw;

sw = false;

sw=true;

Expresiones con operadores lógicos

Para este propósito utilizaremos los operadores lógicos, pero antes debemos mostrar las tablas de

verdad de los principales operadores:

Tabla de verdad && (Disyunción lógica “Y”)

Operando 1 Operador Y Operando 2 Resultado

true && true true

true && false false false && true false false && false false

Page 44: Fundamento de Programacion en C++

Una receta para recordar la tabla del Y: “Los operadores deben ser todos verdaderos para que el

resultado sea verdadero, caso contrario es falso”

Ejemplos:

Considere que:

A = 10, B = 20, C = 30 entonces:

A > 0 && B > 0 => true && true = true

A < C && B==C => true && false = false

A==10 && B==20 => true && true = true

B==20 && C==40 => true && false = false

A!=15 && B==20 => true && true = true

C==20 && A!=10 => false && false = false

Tabla de verdad || (Conjunción lógica “O”)

Una receta para recordar la tabla del O: “Los operadores deben ser todos falsos para que el resultado

sea falso, caso contrario es verdadero”

Ejemplos:

Considere que:

A = 10, B = 20, C = 30 entonces:

Operando 1 Operador O Operando 2 Resultado

true || true true

true || false true false || true true false || false false

Page 45: Fundamento de Programacion en C++

A > 0 || B > 0 => true || true = true A < C || B==C => true || false = true A==10 || B==20 => true || true = true B==20 || C==40 => true || false = true A!=15 || B==20 => true || true = true C==20 || A!=10 => false || false = false

Tabla de verdad ! (Negación lógica “No”)

Ejemplos:

Considere que:

A = 10, B = 20, C = 30 entonces:

A > 0 => true ! (A > 0) => ! true = false A > 0 && ! (B > 0) => true && ! true = true && false = false A < C || ! (B==C) => true || ! false = true || true = true !(A==10 || B==20) => !(true || true) = ! true = false !(!(B==20) || !(C==40))=> !(! true || ! false) = ! (false || true) = ! true = false !!(A!=15) || !(B==20) => !! true || ! true = ! false || false = true || false = true

Operando 1 Operador NO Resultado

true ! false false ! true

Page 46: Fundamento de Programacion en C++

4.1.2 Estructura Condicional < if >

Es una estructura que bifurca el flujo de ejecución del código del programa en función del resultado de

una expresión booleana.

Sintaxis

if(<Expresión booleana>)

{<Inicio de bloque>

<Bloque de Código>

}<Fin de bloque>

<Continuación del programa>

dónde:

Expresión booleana: Debe siempre retornar true o false.

Inicio de bloque: La llave abierta que indica el inicio del cuerpo de código a ejecutarse si la expresión

booleana retorna true.

Bloque de Código: El compilador va a ejecutarlo siempre que la expresión booleana retorne true.

Fin de bloque: La llave cerrada indica el fin del cuerpo de código a ejecutarse si la expresión

booleana retorna true.

Continuación del programa: Si la expresión booleana dentro de la instrucción < if > retorna false el

compilador salta hacia continuación del programa.

Ejemplos:

Promedio = 10.5; if( Promedio < 10.5 ){

flag_desaprobado = true; printf("Condicion Alumno: Repitente");

} scanf("Ingrese Nota1: %d", %n1); ….. …..

Salta

Page 47: Fundamento de Programacion en C++

Para este ejemplo no se ejecuta las instrucciones:

flag_desaprobado = true; printf("Condicion Alumno: Repitente");

Cuando el compilador llegue hasta la evaluación dentro de la instrucción < if > como el promedio no es

menor sino igual a 10.5 saltará hasta la instrucción:

scanf("Ingrese Nota1: %d", %n1);

En otro caso si el promedio hubiese sido: Promedio=10 se hubiese ejecutado:

flag_desaprobado = true; printf("Condicion Alumno: Repitente");

y aun también:

scanf("Ingrese Nota1: %d", %n1);

4.1.3 Estructura Condicional < if – else >

Es la estructura que bifurca el flujo de ejecución del código del programa con una estructura alternativa

en función del resultado de una expresión booleana.

Page 48: Fundamento de Programacion en C++

Sintaxis

if(<Expresión booleana>)

{<Inicio de bloque if>

<Bloque de Código if>

}<Fin de bloque if>

else

{<Inicio de bloque else>

<Bloque de Código else>

}<Fin de bloque else>

<Continuación del programa>

dónde:

Expresión booleana: Debe siempre retornar true o false.

Inicio de bloque if: La llave abierta que indica el inicio del cuerpo de código a ejecutarse si la

expresión booleana retorna true.

Bloque de Código if: El compilador va a ejecutarlo siempre que la expresión booleana retorne true.

Fin de bloque if: La llave cerrada indica el fin del cuerpo de código a ejecutarse si la expresión

booleana retorna true.

Inicio de bloque else: La llave abierta que indica el inicio del cuerpo de código a ejecutarse si la

expresión booleana retorna false.

Bloque de Código else: El compilador va a ejecutarlo siempre que la expresión booleana retorne

false.

Fin de bloque else: La llave cerrada indica el fin del cuerpo de código a ejecutarse si la expresión

booleana retorna false.

Continuación del programa: En este caso de estructura condicional como tiene parte alternativa

<else> este debe ejecutarse primero antes de la continuación del programa.

En este tipo de estructuras solo un bloque se ejecuta: el bloque de código if o el bloque de código else,

más no los dos bloques.

Page 49: Fundamento de Programacion en C++

Ejemplos:

Promedio = 15;

if( Promedio > 10.5 )

{

printf("Alumno Aprobado");

}

else

{

printf("Alumno Desaprobado");

}

….. …..

Para este ejemplo solo se ejecutara el bloque < if >, lo que no ocurriría si el Promedio=10 en ese caso

se ejecutaría el bloque < else >.

La instrucción <if> del ejemplo anterior se puede escribir de la siguiente forma:

if(Promedio > 10.5)

printf("Alumno Aprobado");

else

printf("Alumno Desaprobado");

O también:

Page 50: Fundamento de Programacion en C++

if(Promedio > 10.5) printf("Alumno Aprobado");

else printf("Alumno Desaprobado");

La razón es que en C++ son necesarias las llaves solo si un bloque tiene 2 a más instrucciones.

En C++ existe una forma adicional de condicional que simula la instrucción <if>, que no es

recomendada, pero que quizás observen en algunos códigos externos, y aquí se muestra para que sea

de conocimiento:

int A=11; (A==10) ? printf("A es 10") : printf("A No es 10");

Estas sentencias devolverán por pantalla: "A No es 10".

4.1.4 Estructura Condicional anidada < if – else – if >

Es la estructura con n alternativas de bifurcación del flujo de ejecución del código del programa, en

función del resultado de múltiples expresiones booleanas.

Sintaxis

if(<Expresión booleana 1>){

<Bloque de Código 1>

}else

if(<Expresión booleana 2>){

<Bloque de Código 2>

Page 51: Fundamento de Programacion en C++

}else

…..

if(<Expresión booleana n>){

<Bloque de Código n>

}

<Continuación del programa>

dónde:

Expresión booleana 1,2,…n: Debe siempre retornar true o false en la respectiva expresión booleana.

Bloque de Código 1,2,…n: El compilador va a ejecutarlo siempre que la expresión booleana

respectiva retorne true.

Continuación del programa: Si la estructura anidada tiene al final un bloque <else> en ese caso

debe ejecutarse primero antes de la continuación del programa. Si no tuviese un bloque < else > al

final, el compilador de no encontrar ningún true en las estructuras booleana saltará a la continuación

del programa.

Ejemplos:

Numero = 15; if(Numero < 0 ) { printf("Numero Negativo"); } else if(Numero == 0 ) { printf("Numero Neutro"); }else{ printf("Numero Positivo"); }

Page 52: Fundamento de Programacion en C++

Para este ejemplo el resultado será “Numero Positivo”

La instrucción < if > del ejemplo anterior se puede escribir de la siguiente forma:

if( Numero < 0 ) printf("Numero Negativo"); else if( Numero == 0 ) printf("Numero Neutro"); else printf("Numero Positivo");

O también:

if( Numero < 0 ) printf("Numero Negativo"); else if( Numero == 0 ) printf("Numero Neutro"); else printf("Numero Positivo");

Cabe decir que para este ejemplo, la última forma mostrada es la más fácil de entender e interpretar.

Este tipo de estructura es solo una variación ampliada de la estructura <if-else>. Realmente esta

estructura es flexible y se va a acomodar muy bien a cualquier tipo de problemas en las cuales se

evalúe varias condiciones.

4.1.5 Estructura selectiva múltiple < switch >

A diferencia de la instrucción < if - else > en C++ esta estructura puede evaluar solo una variable y solo

puede comparar igualdad además no permite la combinación con operadores lógicos como && (Y

lógico por ejemplo), en su lugar puede combinar el || (O lógico) de forma homologa.

Sintaxis

Page 53: Fundamento de Programacion en C++

switch (<variable a comparar>)

{

case <valor a comparar 1> : <Bloque de instrucción 1> break;

case <valor a comparar 2> : <Bloque de instrucción 2> break;

…..

case <valor a comparar i> : <Bloque de instrucción i> break;

…..

case <valor a comparar n> : <Bloque de instrucción n> break;

default: <Bloque de instrucción default> break;

}

Dónde:

<variable a comparar>: Variable a ser evaluada.

<valor a comparar i>: Constante con la cual la <variable a comparar >va a evaluar igualdad, si es

que no coincide pasa al siguiente <valor a comparar i>.

<Bloque de instrucción i>: Conjunto de instrucciones a ejecutarse si es que el <valor a comparar i>

respectivo retorna true.

<Bloque de instrucción default>: Conjunto de instrucciones a ejecutarse si es que la variable a

comparar no coincide con ninguno de los <valor a comparar i>.

break: Instrucción C++ para bifurcar o saltar al final de la estructura switch. De no invocar a la

instrucción break si es que encuentra coincidencia seguirá evaluando los siguientes “case” de la

instrucción.

Ejemplos:

char sexo; printf("Ingrese sexo de persona (M, F):"); sexo=getchar(); switch(sexo){ case 'M': printf("Masculino"); break; case 'F':

Page 54: Fundamento de Programacion en C++

printf("Femenino"); break; default: printf("Error: Dato de ingreso No valido"); break; }

La función getchar() permite el ingreso por teclado de un carácter.

Para el ejemplo anterior mostrado supongamos que se ingresó por teclado el carácter M, entonces se

imprime por pantalla: Masculino.

Supongamos que se ha ingresado por teclado la letra m, entonces por pantalla se mostrara: Error:

Dato de ingreso No valido. La siguiente estructura switch muestra el mensaje correcto sin distinguir

mayúsculas o minúsculas.

switch(sexo){ case 'M': case 'm': printf("Masculino"); break; case 'F': case 'f': printf("Femenino"); break; default: printf("Error: Dato de ingreso No valido"); break; }

4.1.6 8 Recomendaciones para el uso de estructuras condicionales.

Sin lugar a dudas es posible usar las estructuras condicionales de muchas formas, a continuación

mencionamos unos consejos para la elección de estructura:

1) Elija < if > cuando va a evaluar varias variables.

2) Elija < switch > cuando va a evaluar una sola variable y en casos de igualdad.

3) Evite en lo posible hacer anidamientos, solo realizarlo si es irremediable.

Ejemplo: Sumar 10 a un número ingresado solo si es mayor a 10 y solo si es par.

a) Solución anidada

if( A <= 10 ) printf("Error número no es mayor a 10.\n\n"); else if( A % 2!=0 ) printf("Error número no es par.\n\n");

Page 55: Fundamento de Programacion en C++

else { A = A + 10; printf("A = %d\n\n", A); } system("PAUSE");

Aunque esta solución es válida, dificulta la lectura cuando se cuenta con varios niveles de anidamiento y con más instrucciones.

b) Solución recomendada

if(A <= 10){ printf("Error numero no es mayor a 10.\n\n"); system("PAUSE"); exit(0); //Función para terminar el programa } if(A % 2!=0){ printf("Error numero no es par.\n\n"); system("PAUSE"); exit(0); //Función para terminar el programa } A = A + 10; printf("A = %d\n\n", A); system("PAUSE");

La debilidad de esta forma es que se generan más líneas de código, no obstante en los problemas

computacionales en algún momento va a pesar más el entendimiento que las líneas de código.

4) Para evaluaciones con tipos booleanos, usar los booleanos:

Ejemplo: Decir si un numero pasa la prueba de validación. Debe ser múltiplo de 3 y la vez divisible por

18.

Page 56: Fundamento de Programacion en C++

a) Solución pésima

bool pasa_prueba; if( A % 3 == 0 && 18 % A == 0 ) pasa_prueba=true; else pasa_prueba=false; if( pasa_prueba == true ) printf("Si pasa la prueba"); else printf("No pasa la prueba"); system("PAUSE");

No se recomienda este tipo de soluciones se sobrescribe las alternativas de los booleanos, ya que

sabemos que los booleanos solo tienen dos posibles valores (true o false)

b) Solución buena

bool pasa_prueba=false; if( A % 3 == 0 && 18 % A == 0 ) pasa_prueba=true; if( pasa_prueba == true ) printf("Si pasa la prueba"); else printf("No pasa la prueba"); system("PAUSE");

Page 57: Fundamento de Programacion en C++

Esta solución es a menudo utilizada, inicializar como false y luego preguntar si pasa la prueba y

asignar a true.

c) Solución recomendada:

bool pasa_prueba; pasa_prueba = ( A % 3 == 0 && 18 % A == 0 ); if( pasa_prueba ) printf("Si pasa la prueba"); else printf("No pasa la prueba"); system("PAUSE");

Con más conocimiento técnico sabemos que una expresión booleana retorna dos valores (true o

false) entonces, no es necesario preguntar con < if > por lo tanto es válido < pasa_prueba = ( A

% 3 == 0 && 18 % A == 0 ); >. Además tampoco es necesario if( pasa_prueba == true )

puesto que el código del < if > se va a ejecutar si la expresión retorna true, pero

la variable pasa_prueba solo tiene (true o false) como valor por lo tanto es válido

if( pasa_prueba )

Como consejo practico use if ( < true >) para booleanos.

5 ) Use switch para estructuras grandes, para demarcar algo importante y diferenciarlo de estructuras

< if >, además de lo explicado anteriormente.

6) Evite en lo posible utilizar switch para comparar muchos valores:

Ejemplo

Mostrar un mensaje si un carácter ingresado por teclado es una vocal minúscula.

a) Solución no recomendada

Page 58: Fundamento de Programacion en C++

char op; op=getchar(); switch(op){ case 'a': case 'e':case 'i': case 'o':case 'u': printf("Es vocal minúscula"); break; }

b) Solución recomendada

char op; op=getchar(); if(op=='a' || op=='e' || op=='i' || op=='o' || op=='u') printf("Es vocal minúscula ");

7) Utilice sangrías. Hasta ahora no habíamos resaltado la importancia de estas, sin embargo son

esenciales para la lectura del código.

Tenemos fortuna de utilizar C++, pues antiguamente no contábamos con estas, asi que a sangrar

código.

Para hacer un sangrado es usualmente utilizada la tecla < Tab >.

Ejemplo

a) Sin sangría

if( A > 0 ){ if( A == 5 ) printf("Es cinco positivo"); else printf("No es cinco positivo"); } else if ( A < 0 ){ if( A == -5 ) printf("Es cinco negativo"); else printf("No es cinco negativo"); }

Page 59: Fundamento de Programacion en C++

b) Con sangría

if( A > 0 ){ if( A == 5 ) printf("Es cinco positivo"); else printf("No es cinco positivo"); } else if ( A < 0 ){ if( A == -5 ) printf("Es cinco negativo"); else printf("No es cinco negativo"); }

8) Fíjese y utilice las ayudas del editor de código de fuente como el color (azul, rojo, verde, etc.). En

nuestro caso utilizamos Visual Studio .Net el cual tiene varias ayudas.

Al inicio no se tome mucho tiempo pensando con coraje en una solución cuando es difícil el problema y

no muestra los resultados esperados.

Use marcadores y validaciones de usuario, es decir asegúrese de que la variable contiene el deseado

o supuesto valor, imprimiendo la variable por pantalla antes de entrar a una estructura. Este

concepto nos puede ahorrar horas de análisis después de todo “Un vistazo no está de más“.

4.2 Estructuras repetitivas

Son estructuras en las cuales un bloque de código puede ser ejecutado un número de veces, ya sea

por un número que represente la cantidad de veces o por una expresión booleana.

4.2.1 Conceptos acerca de estructuras repetitivas

Bucle: Es el funcionamiento o el proceso de dar vueltas (repetir) de la estructura repetitiva.

Page 60: Fundamento de Programacion en C++

INICIO ESTRUCTURA REPETITIVA

FIN ESTRUCTURA REPETITIVA

Iteración: Es cada repetición del bucle. Por ejemplo si una estructura repetitiva

tiene 3 repeticiones, tendrá iteración 1, Iteración 2 e Iteración 3.

4.2.2 Operadores de incremento

A menudo las variables son utilizadas como controladores de bucles, para tal caso mostraremos como

incrementar o decrementar una variable:

Modo ampliado Modo Reducido Explicación

A = A + 1; A++; La variable incrementa su valor en 1

A = A - 1; A--; La variable decrementa su valor en 1

A = A + 3; A+=3; La variable incrementa su valor en 3

A = A - 4; A-=4; La variable decrementa su valor en 4

A = A + n; A+=n; La variable incrementa su valor en n

A = A - n; A-=n; La variable decrementa su valor en n

A = A * 5; A*=5; La variable multiplica su valor en 5

A = A / 6; A/=6; La variable divide su valor en 6

4.2.3 inicialización de variables

Antes de utilizar una variable es necesario que esta tenga un valor contenido, ya sea por teclado o

asignación. En estructuras repetitivas su uso muy amplio, y en aplicaciones reales son utilizadas de

muchas formas. En un sentido es una asignación simple. Para tal caso mostraremos un ejemplo:

Bucle

Page 61: Fundamento de Programacion en C++

//Declaracion de variables int A; bool bandera; //inicialización de variables A=0; bandera=false;

Existe un riesgo que ocurre al no inicializar variables, estas variables pueden ser utilizadas y el

compilador no mostrara error sino hasta el tiempo de ejecución y si el programa es complejo puede no

detectarse rápidamente

Para el caso de estructuras repetitivas (Punto a ver a continuación) es general inicializar las variables a

cero.

En términos prácticos una variable que no es ingresada por teclado y que va a usarse en una

estructura repetitiva siempre debe ser inicializada.

4.2.4 Contadores y Acumuladores y Banderas (flag)

Son variables que serán utilizadas en la estructura repetitiva, Algunas de ellas son inicializadas antes

de la estructura repetitiva, otras dentro de ellas.

Contadores

Son variables que controlan mediante conteo un aspecto del bucle, pueden se controlador de

iteraciones del bucle, o contar algunos aspectos del problema a resolver por el programa.

Generalmente el conteo es de a 1.

Ejemplo

Contador = Contador + 1

Acumuladores

Page 62: Fundamento de Programacion en C++

Son variables que van a funcionar como recolectoras de resultados individuales, es decir de cada

iteración. Su uso es para obtener un resultado general de todo el bucle y generalmente son

sumatorias.

Ejemplo

Acumulador = Acumulador + promedio

Banderas (Flag)

Son variables que trabajan como indicadores o marcadores. Son para resolver algún aspecto de

identificación dentro del programa. Su uso se extiende en las estructuras repetitivas para determinar la

continuación de iteraciones. Generalmente son de tipo booleano sin embargo su uso se puede ampliar

hasta el grado de usar enteros o caracteres para representar sus múltiples estados.

Ejemplo

bool flag_casado=false; ………. if(estado_civil=='C') flag_casado = true;

4.2.5 Estructura repetitiva < for >

Es la estructura repetitiva de C++ para ejecutar código teniendo como datos el inicio , el fin e

iteraciones a procesar.

Aunque en C++ la estructura < for > es muy flexible, no es muy utilizado en sus formas complejas,

para esos casos veremos más adelante estructuras que nos ayudaran en esos casos.

Sintaxis

for ( <valor inicial> ; <expresión booleana para continuar> ; <incremento / decremento> )

{//opcional, si hay más de 1 instrucción

<bloque de código>

}//opcional, si hay más de 1 instrucción

Page 63: Fundamento de Programacion en C++

<valor inicial> :variable con dato o punto de inicio del bucle.

<expresión booleana para continuar>: si retorna true continúa el bucle, caso contrario termina.

<incremento / decremento>: incremento o paso de variable dentro del bucle

<bloque de código>: Instrucciones a repetirse dentro del bucle

Orden de evaluación del compilador a la estructura < for >

La primera vez:

for( 1 ; 2; 4 )

{ 3, solo si la expresión booleana retorna true }

Las veces restantes:

for( <omitido> ; 1; 3 )

{ 2, solo si la expresión booleana retorna true }

Ejemplo:

Mostrar los 7 primeros números naturales positivos:

final=7; for( indice = 1 ; indice <= final ; indice = indice + 1 ) printf("\n Numero: %d", indice);

Page 64: Fundamento de Programacion en C++

Explicación del código:

Iteración índice expresión booleana ejecución código estado bucle

1 1 1 <= 7 = true printf("\n Numero: %d", 1); Continua

2 2 2 <= 7 = true printf("\n Numero: %d", 2); Continua

3 3 3 <= 7 = true printf("\n Numero: %d", 3); Continua

4 4 4 <= 7 = true printf("\n Numero: %d", 4); Continua

5 5 5 <= 7 = true printf("\n Numero: %d", 5); Continua

6 6 6 <= 7 = true printf("\n Numero: %d", 6); Continua

7 7 7 <= 7 = true printf("\n Numero: %d", 7); Continua

8 8 <= 7 = true <No ejecuta código> Termina

Notar que al final del bucle la variable índice queda con el valor final del bucle más el incremento, es

decir: índice = final + incremento.

La expresión booleana debe estar bien planteada de lo contrario ocurre 2 posibles eventos:

-El bucle no se ejecuta ni una vez

-El bucle se ejecuta indefinidamente hasta acabar los recursos o “bloquear” la computadora por

completo.

El bloque de código anterior da como resultado:

Forma alternativa de estructura repetitiva < for >

Una forma adicional de la estructura < for > es utilizarla como instrucción en los problemas

algorítmicos y es a menudo para abreviar conteos o para marcar posiciones.

Numero: 1

Numero: 2

Numero: 3

Numero: 4

Numero: 5

Numero: 6

Numero: 7

Page 65: Fundamento de Programacion en C++

for (<valor inicial> ; <expresión booleana para continuar> ; <incremento / decremento>) ;

Notar que la instrucción < for > termina en < ; >

Puede ser utilizada para obtener precisamente el valor final del <valor inicial> al finalizar el bucle.

Esta no es la forma más fácil de usar < for > pues puede crear confusiones, sin embargo en

aplicaciones prácticas veremos su uso.

Ejemplo:

final=7; for ( indice = 1; indice <= final ; indice = indice + 1 ); printf("\n Numero: %d", indice);

El bloque de código anterior da como resultado:

Trabajo con múltiples variables en la estructura repetitiva < for >

La estructura < for > puede admitir el trabajo con muchas variables, para separarlas se debe usar

coma < , > diferenciando claramente el < ; > que distingue la parte funcional del < for >.

Ejemplo:

Numero: 8

Page 66: Fundamento de Programacion en C++

final =10; for( A = 1, B = - A ; A <= final ; A++, B-- ) { printf("\n Positivo: %d", A); printf("\t Negativo: %d", B); }

Resultado:

Nota: Como último recurso también es posible declarar variables dentro de la estructura < for >.

for ( int indice = 1; indice <= final ; indice = indice + 1 )

Este tipo de declaraciones aunque no es tan usado solo permite usar la variable (en este caso indice)

dentro de la estructura, es decir la variable no será tomada en cuenta como declarada en otros lugares

del código del programa.

Positivo: 1 Negativo: -1

Positivo: 2 Negativo: -2

Positivo: 3 Negativo: -3

Positivo: 4 Negativo: -4

Positivo: 5 Negativo: -5

Positivo: 6 Negativo: -6

Positivo: 7 Negativo: -7

Page 67: Fundamento de Programacion en C++

4.2.6 Estructura repetitiva < while >

Es la estructura repetitiva para evaluar una expresión booleana y entonces ejecutar un bloque de

código. A diferencia del < for > no siempre cuenta con los límites de las iteraciones (Valor inicial y valor

final).

Sintaxis

while (<expresión booleana>)

{

<bloque de código>

}

<expresión booleana>: Retorna true o false.

<bloque de código>: Se ejecuta siempre que la expresión booleana retorne true.

Ejemplo:

int C, S, final; C=1; S=0; final=15 while( C <= final ){ S+=C; printf("\n%d",C); C+=2; } printf("\n\nSuma: %d",S);

El ejemplo mostrado anteriormente muestra por pantalla los 15 primeros números impares positivos y

además al final muestra la suma de ellos.

Notar las inicializaciones S=0 porque va a acumular, C=1 porque es el primer número impar, final=15

es el límite superior.

Para este ejemplo S es el acumulador <S+=C> en cada iteración acumula a la variable C.

Page 68: Fundamento de Programacion en C++

C trabaja como el número impar de la iteración y el contador. Notar que se incrementa a la variable C

de dos en dos: < C+=2; >.

Notar que dentro del < while > se cuenta con una instrucción printf que imprime por pantalla a la

variable C (número impar de cada iteración) con un salto de línea, y al finalizar el bucle imprime la

suma con dos saltos de línea

< printf("\n\nSuma: %d",S); >.

Detalle Trabajo de la Estructura Repetitiva:

Iteración final S C C <= final Estado Bucle

<Inicialización> 15 0 1

1 15 1 3 3 <= 15 = true Continua

2 15 4 5 5 <= 15 = true Continua

3 15 9 7 7 <= 15 = true Continua

4 15 16 9 9 <= 15 = true Continua

5 15 25 11 11 <= 15 = true Continua

6 15 36 13 13 <= 15 = true Continua

7 15 49 15 15 < = 15 = true Continua

8 15 64 17 17 < = 15 = false Termina

El resultado es:

1

3

5

7

9

11

13

15

Suma: 64

Page 69: Fundamento de Programacion en C++

4.2.7 Estructura repetitiva < do - while >

Es la estructura repetitiva para ejecutar un bloque de código por lo menos una vez, y evaluar una

expresión booleana.

Sintaxis

do{

<bloque de código>

} while (<expresión booleana>);

(<expresión booleana>): Retorna true o false.

<bloque de código>: Se ejecuta al menos una vez antes de que se evalué la expresión booleana,

para que se repita dicha expresión debe retornar true.

Ejemplo:

Ingresar una secuencia de números, mostrar por pantalla los números ingresados y su suma, hasta

que el usuario decida no ingresar más números.

char op; int N, S; S=0; do{ printf("\nIngrese numero: "); scanf("%d", &N); fflush(stdin); S+=N; printf("\n\nNumero ingresado: %d", N); printf("\n\n\nDesea seguir ingresando numeros?(S/N): "); op=getchar(); } while( op!='N' && op!='n' ); printf("\n\nSuma: %d",S);

Page 70: Fundamento de Programacion en C++

Notar las inicializaciones < S=0; > porque va a acumular, N es el número ingresado en la iteración

respectiva, < op > es la variable con la opción de seguir ingresando más números.

En este ejemplo se ingresa N mediante < scanf("%d", &N); >, se acumula < S+=N; > y se muestra

dicho valor ingresado.

Se imprime por pantalla el mensaje de solicitud para seguir ingresando números.

Luego se ingresa el carácter por teclado mediante getchar() y se guarda en la variable op

Entonces llega a la expresión booleana de la estructura repetitiva, la cual va a repetir siempre que el

usuario no digite la tecla N o n.

Al final se muestra la suma de los números ingresados < printf("\n\nSuma: %d",S);

>.

Detalle Trabajo de la Estructura Repetitiva:

Iteración N S op op!='N' && op!='n' Estado Bucle

<Inicialización> 0

1 5 5 S 'S'!='N' && 'S'!='n' = true Continua

2 1 6 S 'S'!='N' && 'S'!='n' = true Continua

3 9 15 S 'S'!='N' && 'S'!='n' = true Continua

4 7 22 S 'S'!='N' && 'S'!='n' = true Continua

5 50 72 N 'N'!='N' && 'N'!='n' = false Termina

< N > es un valor ingresado por teclado, es decir pueden ser cualquier número.

< op > es un carácter ingresado por teclado, para el ejemplo el usuario afirmo ingresar 4 números

pero, como se usa la estructura < do- while > se ejecuta la primera vez sin evaluar.

Page 71: Fundamento de Programacion en C++

El resultado es:

Ingrese numero: 5

Numero ingresado: 5

Desea seguir ingresando numeros?(S/N): S

Ingrese numero: 1

Numero ingresado: 1

Desea seguir ingresando numeros?(S/N): N

Ingrese numero: 9

Numero ingresado: 9

Desea seguir ingresando numeros?(S/N): N

Ingrese numero: 7

Numero ingresado: 7

Desea seguir ingresando numeros?(S/N): N

Ingrese numero: 50

Numero ingresado: 50

Desea seguir ingresando numeros?(S/N): N

Suma: 72

Page 72: Fundamento de Programacion en C++

4.2.8 Anidamiento de bucles

Del mismo modo en que se puede anidar las estructuras condicionales, también es posible anidar

estructuras repetitivas, ya que en realidad no hay regla que lo impida. Por tanto veremos el

anidamiento mediante este un ejemplo.

Ejemplo: Se pide generar la tabla de multiplicar de un número ingresado por teclado. Se debe solicitar

la finalización del programa.

char op; int N; do{ printf("\nIngrese numero: "); scanf("%d", &N); fflush(stdin); for(int i=0;i<=12;i++) printf("\n %d * %d = %d", N, i, N * i ); printf("\n\n\nDesea continuar?(S/N): "); op=getchar(); } while( op!='N' && op!='n' ); system("PAUSE");

Como se muestra en este ejemplo existe una estructura repetitiva < do – while > y dentro de ella una

estructura repetitiva < for >. Sin embargo puede haber varios niveles de anidamiento de acuerdo a la

complejidad del problema.

4.2.9 8 Recomendaciones para el uso de estructuras repetitivas

1) Cuando se conozcan los límites a iterar use la estructura < for >.

Page 73: Fundamento de Programacion en C++

2) Cuando al menos necesite ejecutar una vez la estructura repetitiva use < do – while>.

3) Cuando necesite salir de un bucle antes de ejecutar todas las iteraciones utilice la instrucción

break.

Ejemplo:

int N=5; for(int i=1;i<=12;i++){ if (i==5)break; printf("\n %d * %d = %d", N, i, N * i ); }

Este ejemplo muestra la tabla de multiplicar del número N desde 1 hasta 4, puesto que cuando llega a

5 está la instrucción break, por lo tanto termina la instrucción < for >.

4) Evite anidamientos de estructuras condicionales. Si necesita validaciones dentro de la estructura utilice la instrucción continue. Ejemplo:

a) No recomendado

int N=5; for(int i=1;i<=12;i++){ if (i==5) printf("\n %d * %d = %d", N, i, N * i ); }

b) Recomendado

Page 74: Fundamento de Programacion en C++

int N=5; for(int i=1;i<=12;i++){ if (i!=5)continue;

printf("\n %d * %d = %d", N, i, N * i ); }

Este ejemplo muestra la tabla de multiplicar del número <N>, pero si el indice es distinto a 5 itera

nuevamente por la instrucción continue, solo cuando llega a 5 muestra por pantalla el resultado.

5) Minimice el uso de constantes. En los bucles como en la mayoría de casos es de usarse variables

por más estática que parezca, ya cada vez más nos damos cuenta que no existen las constantes sino

las variables muy variables y las variables que son muy lentamente variables o las variables

lejanamente variables ya que en el futuro seguramente será modificado su valor.

Ejemplo

a) No recomendado

for(i=1;i<=12;i++) S+= precio * 0.18;

b) Recomendado

IGV=0.18; NroMeses=12; for(i=1;i<=NroMeses;i++)

Page 75: Fundamento de Programacion en C++

S+= precio * IGV;

La forma no recomendada parece correcta, pero si pensamos bien el porcentaje 0.18 representa el

IGV y aunque por años se mantiene esa tasa, en algún momento de seguro su valor cambiara a 0.19,

0.17 u otro.

Respecto a NroMeses=12, fácilmente se puede pensar que ese valor no va a cambiar, mas la lectura

puede volverse menos tediosa cuando dejamos de ver el código del programa por algún tiempo y

cuando volvamos a ver sabremos rápidamente que ese 12 que hubiesemos dejado representa los

números de meses del año.

Es solo un ejemplo de las variables que parecen constantes.

6) Analice que variables se inicializan fuera y dentro del bucle. Como consejo practico se inicializa

afuera del bucle respectivo (por que puede haber anidamientos) las variables que van a retener un

valor global acumulado respecto al bucle. Las variables que van a retener datos de la iteración se

deben inicializar dentro del bucle respectivo.

7) Use estructuras condicionales para asegurarse que las variables de la iteración son las correctas e

imprímalas.

Ejemplo

Supongamos que se desea sumar todos los múltiplos de 7 entre 7 y 100000.

int S=0; for( int i=7;i<=100000; i+=7 ){ S+=i; }

Ahora supongamos un caso particular, que necesitamos saber si el número 97930 también se está

sumando, entonces podríamos añadir:

Page 76: Fundamento de Programacion en C++

int S=0; for( int i=7;i<=100000; i+=7 ){ S+=i; if (i==97930) printf("\n Si esta sumando!"); }

Si se muestra el mensaje en pantalla sabremos que ese número está siendo sumado.

No obstante este ejemplo es solo una suposición, ya que sabemos que 97930 es múltiplo de 7. Pues

también podemos averiguarlo con 97930 % 7, como el resultado del módulo es cero decimos que si

es múltiplo de 7.

8) Cuídese de los bucles sin fin. Cuando en un bucle la expresión booleana que la controla nunca

retorna false entonces habremos caído en un bucle infinito. Un poco de práctica nos será necesario

para no preocuparnos por estas.

Ejemplo

Este es una terrible forma de definir bucles:

int S=0; while(S%2==0){ printf("\n%d", S); S+=2; }

Este ejemplo muestra claramente que no puede ser variado la condición de la variable S dentro del

código como numero par, por lo tanto no tiene un adecuado fin el programa, porque se va a ejecutar

hasta que se acaben los recursos o porque se forzó a cerrarse.

Page 77: Fundamento de Programacion en C++

4.3 Introducción a C++

4.3.1 Reseña histórica

C++ tiene sus orígenes en la década de los 70 y en ese entonces fue creado como C y su función fue

para mantener el sistema operativo UNIX y su creador fue Bjarne Stroustrup de la compañía AT&T.

Previamente hubo lenguajes: BCPL -> B -> C -> C++, pero no fue contundente como lo es hoy C++, C

comparte muchas características de C++ pero C++ hoy es más popular por su manejo mejorado de

memoria, funcionalidades además de contar con programación orientada a objetos.

4.3.2 Directivas y palabras reservadas básicas.

El lenguaje C++ utiliza directivas o archivos de cabecera que proporciona información necesaria útil para el programa. Para importar un archivo de cabecera se utiliza #include iostream es el nombre de la biblioteca que contiene las definiciones de las rutinas que manejan las

entradas del teclado y el despliegue en la pantalla. El espacio de nombres std ordena al compilador utilizar el espacio de nombres de std. Un programa básico debe tener escrito al inicio del programa:

#include <iostream> using namespace std;

fflush(stdin)

Es la función de C++ que va a eliminar los caracteres sobrantes en una entrada, el no utilizarla

provocará errores de entrada de múltiples variables. Se suele llamar a esta instrucción inmediatamente

luego de usar una instrucción scanf.

gets(<variable carácter>)

Funcion para ingresar una cadena de caracteres.

system("PAUSE")

Es el comando de C++ para detener la ejecución hasta que se presione la tecla < Enter >.

system("CLS")

Es el comando de C++ para borrar la pantalla de ejecución.

exit(0)

Termina inmediatamente el programa.

Page 78: Fundamento de Programacion en C++

getchar()

La función que permite el ingreso por teclado de un carácter.

break Permite salir o terminar a una estructura (Condicional o repetitiva por ejemplo).

continue Permite continuar o iterar a una estructura repetitiva.

goto Permite saltar o bifurcar el flujo del programa hacia una etiqueta.

Comentarios en C++

En C++ existen dos tipos de comentarios:

Para comentar una sola línea de código

//Comentario de una sola línea de código

Para comentar varias líneas de código

/*

Comentario de

varias líneas

de código

*/

4.3.3 Estructura de un programa en C++

Un programa en C++ se compone de directivas con archivos de cabecera, la función principal main,

declaración de variables e instrucciones validas de C++, a continuación se muestra un ejemplo sencillo

completo de un programa que envía por pantalla un mensaje “HOLA MUNDO”.

//Archivos de encabezado

#include <iostream>

using namespace std;

//Inicio de función principal

void main(){

Page 79: Fundamento de Programacion en C++

//Instrucciones C++

printf("\nHOLA MUNDO\n");

system("PAUSE");

}

4.3.4 Creación, ejecución y depuración de un programa mediante Visual Studio .Net

Creación

Para crear

un

programa

en C++,

utilizaremos

Visual

Studio .Net

Page 80: Fundamento de Programacion en C++

Ingresamos al menú Archivo – Nuevo – Proyecto

En el árbol de la izquierda, seleccionar Visual C++ En el panel central seleccionar Proyecto Vacío. En la parte inferior escribir el nombre del proyecto. Finalmente Click en Aceptar

Page 81: Fundamento de Programacion en C++

Click en boton de Nuevo y seleccionar Agregar Nuevo Elemento.

En el panel izquierdo, seleccionar Visual C++. En el panel central seleccionar Archivo C++.cpp). En la parte inferior escribir el nombre del archivo. Click en Agregar.

Page 82: Fundamento de Programacion en C++

Finalmente tendremos una pantalla con un editor de código fuente en el cual introduciremos nuestro código C++.

Ejecución

Ahora ejecutaremos el siguiente programa con la tecla < F5 > o en el botón verde con símbolo de play

de la barra de menú:

Page 83: Fundamento de Programacion en C++

Se mostrara la ventana de ejecución:

Depuración

Es el seguimiento y visualización del código de un programa mientras se ejecuta.

En el menú depurar se cuenta con algunas opciones de depuración:

Además se puede iniciar la depuración en un punto escogido por el desarrollador haciendo click, y

luego ejecutando:

Page 84: Fundamento de Programacion en C++

Al pasar el mouse por encima de alguna instrucción de C++ muestra un pequeño mensaje.

Page 85: Fundamento de Programacion en C++

También se puede seleccionar variable para una inspección rápida.

Page 86: Fundamento de Programacion en C++

Desplazarse en el código con los botones de depuración.

Detener la ejecución o depuración presionamos el botón stop.

Page 87: Fundamento de Programacion en C++

Capítulo 5

EJERCICIOS DE AUTOEVALUACION

5.1 Estructuras Simples

5.2 Estructura condicional < if - else >

5.3 Estructura de selectiva múltiple < switch >

5.4 Estructura repetitiva < for >

5.5 Estructura repetitiva < while > y < do - while >

5.6 Anidamiento de bucles

Page 88: Fundamento de Programacion en C++

5.1 Estructuras Simples

/**********************Inicio del Programa*************************** Ejercicio 01: Ingrese por teclado un número, calcular y mostrar: -El doble del número ingresado -La 3ra. parte del número ingresado. -El cubo del número ingresado. *********************************************************************/ #include <iostream> using namespace std; void main(){ int nro, doble, cubo; double tercera_parte; printf("\nIngrese un numero: "); scanf("%d", &nro); fflush(stdin); doble = nro * 2; cubo = nro * nro * nro; tercera_parte = nro / 3.0; printf("\nDoble: %d", doble); printf("\nCubo: %d", cubo); printf("\nTercera Parte: %8.3lf", tercera_parte); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 02: Ingrese por teclado el nombre y 3 notas de un alumno, calcular y mostrar el promedio del alumno *********************************************************************/ #include <iostream> using namespace std; void main(){ char nombre[30]; int n1, n2, n3; double prom; printf("\nIngrese nombre: "); gets(nombre); fflush(stdin); printf("\nIngrese nota 1: "); scanf("%d", &n1); fflush(stdin); printf("\nIngrese nota 2: "); scanf("%d", &n2); fflush(stdin);

Page 89: Fundamento de Programacion en C++

printf("\nIngrese nota 3: "); scanf("%d", &n3); fflush(stdin); prom = ( n1 + n2 + n3 ) / 3.0; printf("\n\n%s tiene promedio: %8.0lf", nombre, prom); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 03: Ingrese por teclado una cantidad en metros, transformar los metros a centímetros, pulgadas (2.54 cm) y a pies (12 pulgadas) *********************************************************************/ #include <iostream> using namespace std; void main(){ double centimetro=100, pulgada=2.54, pie=12 ; double metros, centimetros, pulgadas, pies; printf("\nIngrese cantidad en metros: "); scanf("%lf", &metros); fflush(stdin); centimetros = metros * centimetro; pulgadas = centimetros / pulgada; pies = pulgadas / pie; printf("\n\n Centimetros: %8.3lf", centimetros); printf("\n Pulgadas: %8.3lf", pulgadas); printf("\n Pies: %8.3lf", pies); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 04: Ingrese por teclado la descripción, precio y cantidad vendida de un producto, calcular y mostrar: -Importe de la compra -Impuesto general a las ventas (18%) -Importe Final

Page 90: Fundamento de Programacion en C++

*********************************************************************/ #include <iostream> using namespace std; void main(){ char descripcion[50]; double precio, importe_compra, igv=0.18, impuestos, importe_final; int cantidad; printf("\nIngrese descripcion producto: "); gets(descripcion); fflush(stdin); printf("\nIngrese precio: "); scanf("%lf", &precio); fflush(stdin); printf("\nIngrese cantidad vendida: "); scanf("%d", &cantidad); fflush(stdin); importe_compra = precio * cantidad; impuestos = importe_compra * igv; importe_final = importe_compra + impuestos; printf("\n\n Importe Compra: %8.2lf", importe_compra); printf("\n Impuesto General a las Ventas: %8.2lf", impuestos); printf("\n Importe Final: %8.2lf", importe_final); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 05: Ingrese por teclado un número de 3 cifras, calcular y mostrar: - Suma de las cifras - EL número ingresado en sentido inverso *********************************************************************/ #include <iostream> using namespace std; void main(){ int nro, U, D, C, nroinv; printf("\nIngrese un numero de tres cifras: "); scanf("%d", &nro); fflush(stdin); C = nro / 100; D = (nro % 100) / 10; U = nro % 10; nroinv = U*100 + D*10 + C; printf("\n\n Suma de cifras: %d", U + D + C); printf("\n\n Nro ingresado invertido: %d", nroinv); printf("\n\n");

Page 91: Fundamento de Programacion en C++

system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 06: Ingrese por teclado el número de alumnos matriculados en un colegio, calcular y mostrar: - Cantidad de aulas completas - Cantidad de alumnos que faltan para completar la última aula. Nota: Un aula completa es de 40 alumnos. *********************************************************************/ #include <iostream> using namespace std; void main(){ int nro_alu, aulac, alufal, aula=40; printf("\nIngrese un numero de alumnos matriculados: "); scanf("%d", &nro_alu); fflush(stdin); aulac = nro_alu / aula; alufal = aula - (nro_alu % aula); printf("\n\n Aulas completas: %d", aulac); printf("\n\n Alumnos que faltan para completar la ultima aula: %d", alufal); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 07: Se tiene n segundos, calcular y mostrar: - Cantidad de horas - Cantidad de minutos - Cantidad de segundos restantes *********************************************************************/ #include <iostream> using namespace std; void main(){

Page 92: Fundamento de Programacion en C++

int seg, hor, min, seg_res, segxhor=3600, segxmin=60; printf("\nIngrese numero de segundos: "); scanf("%d", &seg); fflush(stdin); hor = seg / segxhor; min = (seg % segxhor) / segxmin; seg_res = ((seg % segxhor) % segxmin); printf("\n\n Horas: %d", hor); printf("\n\n Minutos: %d", min); printf("\n\n Segundos restantes: %d", seg_res); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 08: Ingrese por teclado el sueldo de un empleado, visualizar la mejor forma de distribución, si para eso contamos con: -Billetes de 100, 50, 20, 10 -Monedas de 5, 2, 1, 0.50, 0.20, 0.10 *********************************************************************/ #include <iostream> using namespace std; void main(){ double sueldo_real, centavos_real; int sueldo, B100, B50, B20, B10, M5, M2, M1, centavos, M05, M02, M01; printf("\nIngrese sueldo: "); scanf("%lf", &sueldo_real); fflush(stdin); sueldo = sueldo_real; B100 = sueldo /100; B50 = (sueldo % 100) / 50; B20 = ((sueldo % 100) % 50) / 20; B10 = (((sueldo % 100) % 50) % 20) / 10; M5 = ((((sueldo % 100) % 50) % 20) % 10) / 5; M2 = (((((sueldo % 100) % 50) % 20) % 10) % 5) / 2; M1 = (((((sueldo % 100) % 50) % 20) % 10) % 5) % 2 ; centavos_real = sueldo_real - sueldo; centavos = centavos_real * 10; printf("\n\nCentavos:%d", centavos); M05 = centavos / 5; M02 = (centavos % 5) / 2;

Page 93: Fundamento de Programacion en C++

M01 = (centavos % 5) % 2; printf("\n\n Numero Billetes de 100: %d", B100); printf("\n\n Numero Billetes de 50: %d", B50); printf("\n\n Numero Billetes de 20: %d", B20); printf("\n\n Numero Billetes de 10: %d", B10); printf("\n\n Numero Monedas de 5: %d", M5); printf("\n\n Numero Monedas de 2: %d", M2); printf("\n\n Numero Monedas de 1: %d", M1); printf("\n\n Numero Monedas de 0.50: %d", M05); printf("\n\n Numero Monedas de 0.20: %d", M02); printf("\n\n Numero Monedas de 0.10: %d", M01); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 09: Ingrese por teclado el nombre y 2 fechas (día, mes año) una la fecha actual y otra la fecha de nacimiento de la persona, calcule y muestre la edad exacta de dicha persona. *********************************************************************/ #include <iostream> using namespace std; void main(){ int anio=360, mes=30; char nombre[50]; int an, mn, dn;//fecha nacimiento int aa, ma, da;//fecha actual int av, mv, dv;// tiempo vivido int tdfn, tdfa, tdv; printf("\nIngrese nombre: "); gets(nombre); fflush(stdin); printf("\n\nFecha Actual "); printf("\ndia: "); scanf("%d", &da); fflush(stdin); printf("mes: "); scanf("%d", &ma); fflush(stdin); printf("anio: "); scanf("%d", &aa); fflush(stdin); printf("\n\nFecha de Nacimiento "); printf("\ndia: "); scanf("%d", &dn); fflush(stdin); printf("mes: "); scanf("%d", &mn); fflush(stdin); printf("anio: "); scanf("%d", &an); fflush(stdin);

Page 94: Fundamento de Programacion en C++

//Pasamos los datos a días tdfa=(aa*anio)+(ma*mes)+da; tdfn=(an*anio)+(mn*mes)+dn; //Restamos los días tdv=tdfa-tdfn; //Pasamos a formato año, mes y día av=tdv/anio; mv=(tdv%anio)/mes; dv=(tdv%anio)%mes; printf("\n\n\%s tienes %d Ano(s) con %d Mes(es) y %d Dia(s) ", nombre, av, mv, dv ); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 10: Ingrese por teclado dos números, realice un intercambio interno de valores entre variables. *********************************************************************/ #include <iostream> using namespace std; void main(){ int A, B, aux; printf("\nIngrese numero 1: "); scanf("%d", &A); fflush(stdin); printf("\nIngrese numero 2: "); scanf("%d", &B); fflush(stdin); aux=A; A=B; B=aux; printf("\n\n Numeros intercambiados"); printf("\n\nNumero 1: %d ", A); printf("\n\nNumero 2: %d ", B); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 95: Fundamento de Programacion en C++

5.2 Estructura condicional < if - else >

/**********************Inicio del Programa*************************** Ejercicio 01: Ingrese por teclado un número y muestre un mensaje "es cero", solo cuando esto ocurra. *********************************************************************/ #include <iostream> using namespace std; void main(){ int nro; printf("\nIngrese numero : "); scanf("%d", &nro); fflush(stdin); if(nro==0) printf("\n\n Es cero"); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /**********************Inicio del Programa*************************** Ejercicio 02: Ingrese por teclado las tallas de dos personas, solo si la segunda talla es mayor a la primera se visualizara la mayor talla. *********************************************************************/ #include <iostream> using namespace std; void main(){ double talla1, talla2; printf("\nIngrese talla 1 : "); scanf("%lf", &talla1); fflush(stdin); printf("\nIngrese talla 2 : "); scanf("%lf", &talla2); fflush(stdin); if(talla2 > talla1) printf("\n\n La mayor talla es : %8.2lf", talla2); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 96: Fundamento de Programacion en C++

/**********************Inicio del Programa****************************** Ejercicio 03: Ingrese por teclado el nombre, cantidad de hijos y sueldo basico de un trabajador, Solo si el trabajador tiene hijos tendra una bonificación de 4% del sueldo basico, mostrar la bonificacion y el sueldo final. *********************************************************************/ #include <iostream> using namespace std; void main(){ char nombre[50]; int cant_hijos; double sueldo, bonificacion, porc=0.04, sueldoFinal; printf("\nIngrese nombre de trabajador : "); gets(nombre); fflush(stdin); printf("\nIngrese cantidad de hijos : "); scanf("%d", &cant_hijos); fflush(stdin); printf("\nIngrese sueldo basico : "); scanf("%lf", &sueldo); fflush(stdin); //Inicializacion bonificacion = 0; sueldoFinal = sueldo; //Evaluacion if(cant_hijos > 0){ bonificacion = sueldo * porc; sueldoFinal = sueldo + bonificacion; } //Impresion de informacion printf("\n\n Trabajador %s tiene ", nombre); printf("\n\n Bonificacion es : %8.2lf", bonificacion); printf("\n\n Sueldo Final es : %8.2lf", sueldoFinal); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 04: Ingrese un caracter por teclado y visualice el mensaje "es letra del alfabeto mayuscula" solo cuando esto ocurra. *********************************************************************/ #include <iostream> using namespace std; void main(){ char caracter; printf("\nIngrese caracter : "); caracter=getchar(); fflush(stdin);

Page 97: Fundamento de Programacion en C++

if(caracter >= 'A' && caracter <= 'Z') printf("\n\n Es letra del alfabeto mayuscula "); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 05: Ingrese un caracter por teclado y visualice el mensaje "es vocal mayuscula o minuscula" solo cuando esto ocurra. *********************************************************************/ #include <iostream> using namespace std; void main(){ char caracter; printf("\nIngrese caracter : "); caracter=getchar(); fflush(stdin); if(caracter == 'A' || caracter == 'E' || caracter == 'I' || caracter == 'O' || caracter == 'U') printf("\n\n Es vocal mayuscula "); if(caracter == 'a' || caracter == 'e' || caracter == 'i' || caracter == 'o' || caracter == 'u') printf("\n\n Es vocal minuscula "); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 06: Una empresa de transporte terrestre vendio una determinada cantidad de boletos vendidos, ingrese por teclado el numero de correlativo del primer y ultimo boleto vendido asi como el precio por boleto. Si es que la cantidad de boletos vendidos es mayor 1000, calcular y mostrar: -Importe de boletos vendidos -Incentivo que sera el 20% del importe de boletos vendidos *********************************************************************/ #include <iostream> using namespace std;

Page 98: Fundamento de Programacion en C++

void main(){ int bol_inicial, bol_final, cantidad, limite = 1000; double precio, importe, incentivo, porc = 0.25 ; printf("\nIngrese Numero del primer boleto : "); scanf("%d", &bol_inicial); fflush(stdin); printf("\nIngrese Numero del ultimo boleto : "); scanf("%d", &bol_final); fflush(stdin); printf("\nIngrese precio unitario de boleto : "); scanf("%lf", &precio); fflush(stdin); cantidad = (bol_final - bol_inicial) + 1 ; if(cantidad > limite){ importe = precio * cantidad; incentivo = importe * porc; printf("\n\n Importe: %8.2lf", importe); printf("\n\n Incentivo: %8.2lf", incentivo); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 07: Ingrese 3 numeros enteros, muestre el mayor, menor y el que se encuentra en el medio. *********************************************************************/ #include <iostream> using namespace std; void main(){ int a, b, c, mayor, menor, medio; printf("\n\rIngrese 1er #: ");scanf("%d",&a); fflush(stdin); printf("\n\rIngrese 2do #: ");scanf("%d",&b); fflush(stdin); printf("\n\rIngrese 3er #: ");scanf("%d",&c); fflush(stdin); mayor = a; if(b > mayor)mayor = b; if(c > mayor)mayor = c; menor = a; if(b < menor)menor = b; if(c < menor)menor = c; medio = ( a + b + c ) - ( mayor + menor ); printf("\n\n\rEl mayor es: %d", mayor); printf("\n\rEl que se situa en el medio es: %d", medio);

Page 99: Fundamento de Programacion en C++

printf("\n\rEl menor es: %d", menor); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 08: Realizar la siguiente funcion: |X , 1<=X<=5 |X + 5, 5< X <=25 Z => |1 / X, 25< X <=50 |5X -4, 50< X <=90 |X3 , X >90 *********************************************************************/ #include <iostream> using namespace std; void main(){ double X; printf("\n\rIngrese valor de X: "); scanf("%lf",&X); fflush(stdin); //No anidamos porque segun la funcion, X solo puede entrar a una condicion. if( 1 <= X && X <= 5){ printf("\n\n\rZ: %8.2lf \n\n", X ); system("PAUSE"); exit(0); } if( 5 < X && X <= 25){ printf("\n\n\rZ: %8.2lf \n\n", X + 5 ); system("PAUSE"); exit(0); } if( 25 < X && X <= 50){ printf("\n\n\rZ: %8.2lf \n\n", 1 / X ); system("PAUSE"); exit(0); } if( 50 < X && X <= 90){ printf("\n\n\rZ: %8.2lf \n\n", 5*X -4 ); system("PAUSE"); exit(0); } if( X > 90){

Page 100: Fundamento de Programacion en C++

printf("\n\n\rZ: %8.2lf \n\n", X*X*X ); system("PAUSE"); exit(0); } } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 09: Ingrese por teclado un numero entero, evalue si cumple: - Que sea positivo - Que sea de dos ó 4 cifras - Si es de dos cifras que la primera sea sea mayor a la segunda - Si es de cuatro cifras que la suma de las cifras sea mayor a la primera y a la segunda. *********************************************************************/ #include <iostream> using namespace std; void main(){ int nro, U, D, C, M; bool bandera=false; printf("\n\rIngrese numero a evaluar: "); scanf("%d",&nro); fflush(stdin); //No es necesario validar que sea positivo, //puesto que esta implicito en las evaluaciones if( nro>=10 && nro <=99 ) { D = nro / 10; U = nro % 10; bandera = D > U; } if( nro>=1000 && nro <=9999 ){ M = nro / 1000; C = (nro % 1000) / 100; D = ((nro % 1000) % 100) / 10; U = nro % 10; bandera = (M + C + D + U) > M && (M + C + D + U) > U; } if(bandera) printf("\n\nSi cumple las condiciones\n\n"); else printf("\n\nNo cumple las condiciones\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 101: Fundamento de Programacion en C++

/********************************************************************* Ejercicio 10: Ingrese un numero por teclado, diga si es par o impar *********************************************************************/ #include <iostream> using namespace std; void main(){ int nro; printf("\n\rIngrese numero a evaluar: "); scanf("%d",&nro); fflush(stdin); if( nro % 2 == 0 ) printf("\n\nNumero es Par\n\n"); else printf("\n\nNumero es Impar\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 11: Ingrese por teclado el nombre, edad y sexo (M, F), muestre uno de acuerdo a los datos ingresados los siguientes mensajes: -Masculino mayor de edad -Masculino menor de edad -Femenino mayor de edad -Femenino menor de edad *********************************************************************/ #include <iostream> using namespace std; void main(){ char nombre[50], sexo; int edad; printf("\n\rIngrese nombre : "); gets(nombre); fflush(stdin); printf("\n\rIngrese sexo (M, F): "); sexo=getchar(); fflush(stdin); printf("\n\rIngrese edad: "); scanf("%d",&edad); fflush(stdin); if( sexo=='M' ) if(edad>=18) printf("\n\nMasculino mayor de edad\n\n"); else

Page 102: Fundamento de Programacion en C++

printf("\n\nMasculino menor de edad\n\n"); else if( sexo=='F' ) if(edad>=18) printf("\n\nFemenino mayor de edad\n\n"); else printf("\n\nFemenino menor de edad\n\n"); else printf("\n\nError en ingreso de sexo\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 12: Ingrese por teclado, el nombre e importe de compra de un cliente, calcular y mostrar: - Impuesto general a la venta (18%), solo si el importe de compra es mayor a 5.00 soles, caso contrario sera cero. -Subtotal -Descuento del subtotal, Si el subtotal es mayor a 500.00 sera el 9% de no ser asi sera 2%. -Importe Final *********************************************************************/ #include <iostream> using namespace std; void main(){ char nombre[50]; double importe, lim_impcomp = 5, IGV = 0.18, impuestos, dscto, descuentos, subtotal, lim_subtotal = 500, importeFinal; printf("\n\rIngrese nombre : "); gets(nombre); fflush(stdin); printf("\n\rIngrese importe de la compra: "); scanf("%lf",&importe); fflush(stdin); if(importe > lim_impcomp) impuestos = importe * IGV; else impuestos = 0; subtotal = importe + impuestos; if(subtotal > lim_subtotal){ dscto = 0.09; descuentos = subtotal * dscto; }else{ dscto = 0.02; descuentos = subtotal * dscto; }

Page 103: Fundamento de Programacion en C++

importeFinal = subtotal - descuentos; printf("\n\nImpuesto general a la venta : %lf", impuestos); printf("\n\nSubtotal : %lf", subtotal); printf("\n\nDescuentos : %lf", descuentos); printf("\n\nImporte Final : %lf\n\n", importeFinal); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 13: Se desea saber cual es la mejor compra entre dos tipos de pizza rectangular y circular. Para eso se ingresan las dimensiones largo, ancho y diametro respectivamente, ademas del precio de la pizza. *********************************************************************/ #include <iostream> using namespace std; void main(){ double PI=3.14159, radio, area; double diametro,largo,ancho; double precio_redonda, preciounit_redonda; double precio_rectangular, preciounit_rectangular; printf("\n\nPizza redonda\n\n"); printf("Ingrese diametro(en pulgadas) de una pizza redonda:"); scanf("%lf", &diametro); fflush(stdin); printf("Ingrese precio de una pizza redonda $/ :"); scanf("%lf", &precio_redonda); fflush(stdin); printf("\n\nPizza rectangular\n\n"); printf("Ingrese largo(en pulgadas) de una pizza rectangular :"); scanf("%lf", &largo); fflush(stdin); printf("Ingrese ancho(en pulgadas) de una pizza rectangular :"); scanf("%lf", &ancho); fflush(stdin); printf("Ingrese precio de pizza rectangular $/ :"); scanf("%lf", &precio_rectangular); fflush(stdin); area = largo * ancho; preciounit_rectangular = precio_rectangular / area; radio = diametro / 2.0; area=PI*radio*radio; preciounit_redonda=precio_redonda / area; printf("\n\nPrecio pizza rendonda: $ %8.2lf", precio_redonda); printf("\n\rPrecio pizza por pulgada cuadrada: $ %8.2lf", preciounit_redonda); printf("\n\nPrecio pizza rectangular: $ %8.2lf", precio_rectangular); printf("\n\rPrecio pizza por pulgada cuadrada: $ %8.2lf", preciounit_rectangular);

Page 104: Fundamento de Programacion en C++

if(preciounit_redonda<preciounit_rectangular) printf("\n\nLa pizza redonda es la mejor compra."); else printf("\n\nLa pizza rectangular es la mejor compra."); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 105: Fundamento de Programacion en C++

5.3 Estructura de selectiva múltiple < switch >

/********************************************************************* Ejercicio 01: Se pide ingresar un número del uno al veinte, imprima dicho número en letras. *********************************************************************/ #include <iostream> using namespace std; void main(){ int n; printf("\n\rIngrese #(1-20) : "); scanf("%d",&n); printf("\n\n\r"); switch(n){ case 1: printf("Uno");break; case 2: printf("Dos");break; case 3: printf("Tres");break; case 4: printf("Cuatro");break; case 5: printf("Cinco");break; case 6: printf("Seis");break; case 7: printf("Siete");break; case 8: printf("Ocho");break; case 9: printf("Nueve");break; case 10:printf("Diez");break; case 11:printf("Once");break; case 12:printf("Doce");break; case 13:printf("Trece");break; case 14:printf("Catorce");break; case 15:printf("Quince");break; case 16:printf("Diez y Seis");break; case 17:printf("Diez y siete");break; case 18:printf("Diez y ocho");break; case 19:printf("Diez y nueve");break; case 20:printf("Veinte");break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 02: Realizar un algoritmo que lea un numero que represente el día de semana. Muestre el numero en dias: (Lunes=1, Martes=2, …, Domingo=7).

Page 106: Fundamento de Programacion en C++

*********************************************************************/ #include <iostream> using namespace std; void main(){ int n; printf("\n\rIngrese numero de dia de semana #(1-7) : "); scanf("%d",&n); printf("\n\n\r"); switch(n){ case 1: printf("Lunes");break; case 2: printf("Martes");break; case 3: printf("Miercoles");break; case 4: printf("Jueves");break; case 5: printf("Viernes");break; case 6: printf("Sabado");break; case 7: printf("Domingo");break; default: printf("Numero de dia No reconodido");break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 03: Escribir un algoritmo que solicite el ingreso de dos números y a continuación un operador aritmético (+, -, *, /). El algoritmo debe calcular el resultado de la operación seleccionada. *********************************************************************/ #include <iostream> using namespace std; void main(){ char ope; double n1, n2; printf("\n\rIngrese numero 1 : "); scanf("%lf",&n1); fflush(stdin); printf("\n\rIngrese numero 2 : "); scanf("%lf",&n2); fflush(stdin); printf("\n\rIngrese Operacion (+,-,*,/) : "); ope=getchar(); fflush(stdin); printf("\n\n\rResultado:"); switch(ope){ case '+': printf("%8.2lf", n1 + n2);break; case '-': printf("%8.2lf", n1 - n2);break; case '*': printf("%8.2lf", n1 * n2);break; case '/': printf("%8.2lf", n1 / n2);break;

Page 107: Fundamento de Programacion en C++

default: printf("Operacion ingresada No reconodido");break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ /********************************************************************* Ejercicio 04: Escribir un algoritmo que solicite el ingreso de dos números y a continuación un operador aritmético (+, -, *, /). El algoritmo debe calcular el resultado de la operación seleccionada. *********************************************************************/ #include <iostream> using namespace std; void main(){ char ope; double n1, n2; printf("\n\rIngrese numero 1 : "); scanf("%lf",&n1); fflush(stdin); printf("\n\rIngrese numero 2 : "); scanf("%lf",&n2); fflush(stdin); printf("\n\rIngrese Operacion (+,-,*,/) : "); ope=getchar(); fflush(stdin); printf("\n\n\rResultado:"); switch(ope && ope){ case '+': printf("%8.2lf", n1 + n2);break; case '-': printf("%8.2lf", n1 - n2);break; case '*': printf("%8.2lf", n1 * n2);break; case '/': printf("%8.2lf", n1 / n2);break; default: printf("Operacion ingresada No reconodido");break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 108: Fundamento de Programacion en C++

5.4 Estructura repetitiva < for >

/********************************************************************* Ejercicio 01: Mostrar el doble, triple y el cuadrado de todos los numeros que se encuentran entre el 10 y 30. *********************************************************************/ #include <iostream> using namespace std; void main(){ int ini = 10, fin = 30, i; for(i=ini;i<=fin;i++) printf("\n\rNumero %d, doble %d, triple %d y su cuadrado %d.", i, i * 2, i * 3, i * i); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 02: Visualice la palabra "ALGORITMO" 200 veces. *********************************************************************/ #include <iostream> using namespace std; void main(){ int ini = 1, fin = 200, i; for(i=ini;i<=fin;i++) printf("\n\rALGORITMO"); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/*********************************************************************

Page 109: Fundamento de Programacion en C++

Ejercicio 03: Digite un numero positivo y entero, visualice la palabra "SENTENCIA" 5 veces el numero ingresado. Ademas enumere cada visualizacion. *********************************************************************/ #include <iostream> using namespace std; void main(){ int ini = 1, fin , i, n; printf("\n\rIngrese numero : "); scanf("%d",&n); fin = n * 5; for(i=ini;i<=fin;i++) printf("\n\r %d ALGORITMO", i); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 04: Digite un numero entero, visualice los 50 numeros superiores e inferiores consecutivos a este. *********************************************************************/ #include <iostream> using namespace std; void main(){ int cantidad = 50, i, n, ini, fin; printf("\n\rIngrese numero : "); scanf("%d",&n); printf("\n\nNumeros Superiores consecutivos\n\n"); ini = n + 1; fin = n + cantidad ; for(i = ini;i<=fin;i++) printf("\n\r %d", i); printf("\n\nNumeros Inferiores consecutivos\n\n"); ini = n - 1; fin = n - cantidad ; for(i = ini;i>=fin;i--) printf("\n\r %d", i); printf("\n\n"); system("PAUSE");

Page 110: Fundamento de Programacion en C++

} /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 05: Ingrese por teclado dos numeros (asuma enteros y positivos) visualice todos los enteros consecutivos que estan comprendidos en estos. Ademas mostrar la suma al finalizar. *********************************************************************/ #include <iostream> using namespace std; void main(){ int S, i, n1, n2, ini, fin; printf("\n\rIngrese numero 1: "); scanf("%d",&n1); printf("\n\rIngrese numero 2: "); scanf("%d",&n2); if(n1>n2){ ini = n2; fin = n1; }else{ ini = n1; fin = n2; } S=0; for( i = ini + 1 ; i < fin ; i++ ){ S+=i; printf("\n\r %d", i); } printf("\n\n La Suma es %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 06: Ingrese por teclado dos notas y el nombre de N alumnos, mostrar el promedio, condicion (Aprobado, Desaprobado) y promedio global. *********************************************************************/ #include <iostream> using namespace std; void main(){

Page 111: Fundamento de Programacion en C++

char nombre[50]; int i, N, n1, n2; double promA, promG, SG; printf("\n\rIngrese numero de alumnos: "); scanf("%d",&N);fflush(stdin); SG=0; for(i=1;i<=N;i++){ printf("\n\rIngrese nombre alumno %d: ", i); gets(nombre); fflush(stdin); printf("\n\rIngrese nota 1: "); scanf("%d",&n1); fflush(stdin); printf("\n\rIngrese nota 2: "); scanf("%d",&n2); fflush(stdin); promA = (n1 + n2) / 2.0; if(promA >= 10.5) printf("\nAprobado con %8.2lf", promA); else printf("\nDesaprobado con %8.2lf", promA); SG+= promA; } printf("\n\n\n El promedio global es %8.2lf", SG / N); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 07: Genere: -Los 70 primeros impares positivos -Los 50 primeros numeros multiplos de 3 -Los multiplos de 2 y 3 a la vez comprendidos en (20-100), al final mostrar cuantos numeros se generaron. *********************************************************************/ #include <iostream> using namespace std; void main(){ int i, ini, fin, cantidad; printf("\n\n70 primeros impares positivos \n\n"); ini = 1; fin = 70 * 2; for(i=ini ; i<=fin ; i+=2) printf("%d\t", i); printf("\n\n50 primeros numeros multiplos de 3 \n\n"); ini = 3; fin = 50 * ini;

Page 112: Fundamento de Programacion en C++

for(i=ini ; i<=fin ; i+=3) printf("%d\t", i); printf("\n\nMultiplos de 2 y 3 a la vez comprendidos en (20-100) \n\n"); ini = 20; fin = 100; cantidad=0; for(i=ini ; i<=fin ; i++) if(i%2==0 && i%3==0){ printf("%d\t", i); cantidad++; } printf("\n\nNumeros generados %d\n\n", cantidad); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 08: Ingrese un numero, muestre el mensaje "Es primo o No" segun sea el caso. Numero primo es que solo es divisible por la unidad y el mismo numero Ejm:7(1, 7), 13(1,13) *********************************************************************/ #include <iostream> using namespace std; void main(){ int i, N, divisores; printf("\n\rIngrese numero : "); scanf("%d",&N); fflush(stdin); divisores=0; for(i=1;i<=N;i++) if(N%i==0)divisores++; if(N==1 || divisores==2) printf("\n\rEs primo "); else printf("\n\rNo es primo"); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/*********************************************************************

Page 113: Fundamento de Programacion en C++

Ejercicio 09: Ingrese un numero entero de n cifras, muestre y sume sus cifras. *********************************************************************/ #include <iostream> using namespace std; void main(){ int i, N, nro, digito, S; printf("\n\rIngrese numero : "); scanf("%d",&N); fflush(stdin); S=0; for(nro=N ; nro > 0 ; nro/= 10){ digito = nro % 10; S+=digito; } printf("\n\nSuma digitos: %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 10: Ingrese por teclados los N terminos. Sume y genére las siguientes secuencias: a) -2 -4 -6 -8 -10...N b) 3.3 4.4 5.5 6.6 7.7 8.8...N c) 1 4 9 16 25 36...N d) -1 +2 -3 +4 -5 +6 -7...N e) -1 3 15 35 63 99...N f) 1 2 4 7 11 16...N *********************************************************************/ #include <iostream> using namespace std; void main(){ int i, N, S, termino, parte_entera, incremento, A, B, C; double parte_real, termino_real, S_real; printf("\n\rIngrese numero de terminos : "); scanf("%d",&N); fflush(stdin); printf("\n\n a) -2 -4 -6 -8 -10...N \n\n"); S=0; for(i=1 ; i<=N ; i++){ termino = i*-2; printf("%d\t", termino); S+=termino; } printf("\n\nSuma de secuencia: %d\n\n", S);

Page 114: Fundamento de Programacion en C++

printf("\n\n b) 3.3 4.4 5.5 6.6 7.7 8.8...N \n\n"); S_real=0; for(i=1 ; i<=N ; i++){ parte_entera = i + 2; parte_real = parte_entera / 10.0; termino_real = parte_entera + parte_real; printf("%8.1lf\t", termino_real); S_real+=termino_real; } printf("\n\nSuma de secuencia: %8.1lf\n\n", S_real); printf("\n\n c) 1 4 9 16 25 36...N \n\n"); // B-> 3 5 7 9 11 S=0; A=1; B=3; for(i=1; i<=N ; i++){ printf("%d\t", A); S+=A; A+=B; B+=2; } printf("\n\nSuma de secuencia: %d\n\n", S); printf("\n\n d) -1 +2 -3 +4 -5 +6 -7...N \n\n"); S=0; for(i=1 ; i<=N ; i++){ if(i%2!=0){ termino = i*-1; printf("%d\t", termino); }else{ termino = i; printf("+%d\t", termino); } S+=termino; } printf("\n\nSuma de secuencia: %d\n\n", S); printf("\n\n e) -1 3 15 35 63 99...N \n\n"); // B-> 4 12 20 28 36 // C-> 8 8 8 8 S=0; A=-1; B=4; C=8; for(i=1; i<=N ; i++){ printf("%d\t", A); S+=A; A+=B; B+=C; } printf("\n\nSuma de secuencia: %d\n\n", S);

Page 115: Fundamento de Programacion en C++

printf("\n\n f) 1 2 4 7 11 16...N \n\n"); // i-> 1 2 3 4 5 S=0; A=1; for(i=1; i<=N ; i++){ printf("%d\t", A); S+=A; A+=i; } printf("\n\nSuma de secuencia: %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 11: Ingrese 2 numeros que representen una base y un exponente. Muestre el resultado de la operacion. *********************************************************************/ #include <iostream> using namespace std; void main(){ int x,y,i; long r; printf("Ingrese nro...");scanf("%d",&x); printf("Ingrese exponente...");scanf("%d",&y); r=1; for(i=1;i<=y;i++) r*=x; printf("Resultado...%ld\n\n",r); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 116: Fundamento de Programacion en C++

5.5 Estructura repetitiva < while > y < do - while >

/********************************************************************* Ejercicio 01: Contruya un proceso repetitivo que permita el ingreso por teclado de varias letras, el programa terminara cuando se ingrese la letra 'K' *********************************************************************/ #include <iostream> using namespace std; void main(){ char car; do{ printf("\nIngrese caracter: "); car=getchar(); fflush(stdin); }while(car!='K'); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 02: Contruya un proceso repetitivo que permita el ingreso por teclado de varias numeros, el programa terminara cuando se ingrese el numero cero. *********************************************************************/ #include <iostream> using namespace std; void main(){ int N; do{ printf("\n\rIngrese numero : "); scanf("%d",&N); }while(N!=0); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 03: Contruya un proceso repetitivo que permita el ingreso por teclado de numeros de una cifra positivos, el programa terminara cuando se

Page 117: Fundamento de Programacion en C++

ingrese un numero de mas de una cifra. *********************************************************************/ #include <iostream> using namespace std; void main(){ int N; do{ printf("\n\rIngrese numero : "); scanf("%d",&N); }while(N>=10); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 04: Contruya un proceso repetitivo que permita el ingreso por teclado de numeros de dos cifras positivos, el programa terminara cuando la suma de las cifras sea 12. *********************************************************************/ #include <iostream> using namespace std; void main(){ int N, U, D; do{ printf("\n\rIngrese numero de dos cifras: "); scanf("%d",&N); fflush(stdin); D = N/10; U = N%10; }while( D + U != 12 ); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 05: Contruya un proceso repetitivo que muestre en forma ascendente todos los numeros impares comprendidos entre 33 y 9000 *********************************************************************/ #include <iostream> using namespace std; void main(){

Page 118: Fundamento de Programacion en C++

int ini, fin, i; ini=33; fin=9000; i=ini; while( i<=fin ){ printf("\n\r %d", i); i+=2; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 06: Se pide ingresar un numero entero positivo de N cifras, realice el proceso de invertir dicho numero. *********************************************************************/ #include <iostream> using namespace std; void main(){ long N, nro, nroInv; int R; printf("\n\rIngrese numero de n cifras: "); scanf("%ld",&N); fflush(stdin); nro=N; nroInv=R=0; //Inicializamos las dos variables a cero. do{ R = nro % 10; nro = nro / 10; nroInv = (nroInv * 10) + R; }while( nro > 0 ); printf("\n\r Nro Invertido: %ld", nroInv); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 07: Se pide ingresar un numero en base 10, convierta dicho numero a base 5.

Page 119: Fundamento de Programacion en C++

*********************************************************************/ #include <iostream> using namespace std; void main(){ long N, nro, nroInv, incremento; int R; printf("\n\rIngrese numero en base 10: "); scanf("%ld",&N); fflush(stdin); nro=N; nroInv=R=0; incremento=1; do{ R = nro % 5; nro = nro / 5; nroInv = nroInv + R * incremento; incremento = incremento * 10; }while( nro > 0 ); printf("\n\r Nro Convertido: %ld", nroInv); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 08: Se pide ingresar una secuencia de numeros, diga cuantos son pares, impares y multiplos de 7, ademas de la cantidad de numeros ingresados. El programa acaba cuando se ingresa el numero cero. *********************************************************************/ #include <iostream> using namespace std; void main(){ int N, cp, ci, c7, ct; cp=ci=c7=ct=0; do{ printf("\n\rIngrese numero : "); scanf("%d",&N); fflush(stdin); if(N!=0){ if(N%2==0) cp++; else ci++; if(N%7==0)c7++; } ct++; }while( N != 0 );

Page 120: Fundamento de Programacion en C++

printf("\n\r Cantidad Pares : %ld", cp); printf("\n\r Cantidad ImPares : %ld", ci); printf("\n\r Cantidad Multiplos 7 : %ld", c7); printf("\n\r Total Numeros Ingresados: %ld", ct); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 09: Se pide sumar y generar la serie fibonacci. 1 1 2 3 5 8 13 21 ...N *********************************************************************/ #include <iostream> using namespace std; void main(){ int N, A, B, i, S; printf("\n\rIngrese numero de terminos : "); scanf("%d",&N); fflush(stdin); // A-> 1 1 2 3 5 8 13 21 ...N // B-> 1 0 1 1 2 3 5 8 S=i=A=0; B=1; do{ A=A + B; B=A - B; S+= A; printf("\t%d", A); i++; }while( i<N ); printf("\n\n Suma : %d", S); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 10: Ingresar una secuencia de numeros, estos deben ser sumados siempre que: - Sea Impar - Sus cifras sean diferentes - Que la cifra del medio sea cualquiera

Page 121: Fundamento de Programacion en C++

- Que sea de tres cifras - Que sea Positivo *********************************************************************/ #include <iostream> using namespace std; void main(){ int nro, U, D, C, S; bool bandera=true; S=0; while(bandera){ printf("\n\rIngrese numero a evaluar: "); scanf("%d",&nro); fflush(stdin); bandera = ( nro>=100 && nro <=999 ); if(!bandera)continue; bandera = ( nro%2!=0 ); if( !bandera )continue; C = nro / 100 ; D = (nro % 100) / 10; U = nro % 10; bandera = ( C != D && D != U ); if( !bandera )continue; S+=nro; } printf("\n\nSumatoria: %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 11: Sumar y generar la siguiente secuencia: a) -1 -2 3 4 -5 -6 7 8...N b) -1 -2 -3 4 5 6 -7 -8 -9...N c) -1 -2 -3 -4 5 6 7 8...N *********************************************************************/ #include <iostream> using namespace std; void main(){ int N, i, S, termino, cambio_signo, C; bool bandera=true; printf("\n\rIngrese numero de terminos: "); scanf("%d",&N); fflush(stdin);

Page 122: Fundamento de Programacion en C++

cambio_signo=2; S=C=0; i=1; while(i<=N){ C++; if(bandera) termino = i*-1; else termino = i; printf("%d\t", termino); S+= termino; if( C == cambio_signo ){ C=0; bandera = !bandera; } i++; } printf("\n\nSumatoria: %d\n\n", S); //Para la secuencia b) solo cambie la variable cambio_signo=3 //Para la secuencia c) solo cambie la variable cambio_signo=4 system("PAUSE"); } /***************************Fin del Programa****************************/

Page 123: Fundamento de Programacion en C++

5.6 Anidamiento de bucles

/**********************Inicio del Programa*************************** Ejercicio 01: Se tiene en la billetera S/. 1,000 soles y se desea comprar varios articulos, pero todos tienen el precio de S/. 10, S/. 50 y S/. 100 soles. Diga las combinaciones posibles de compra de tal forma que: a) No me sobre dinero b) Me sobre al menos S/. 10 soles c) Me sobre al menos S/. 500 soles *********************************************************************/ #include <iostream> using namespace std; void main(){ int i100, i50, i10, final100, final50, final10, B100=100, B50=50, B10=10; int Monto=1000, sobra=0, combinacion; final100 = Monto / B100; final50 = Monto / B50; final10 = Monto / B10; combinacion=0; for(i100=1;i100<=final100;i100++) for(i50=1;i50<=final50;i50++) for(i10=1;i10<=final10;i10++){ if( !((i100*B100 + i50*B50 + i10*B10) == (Monto - sobra)) )continue; combinacion++; printf("\n\rCombinacion: %d\tB100: %d B50: %d B10: %d", combinacion, i100, i50, i10); } //Para el punto b) cambiar la variable sobra a 10 //Para el punto c) cambiar la variable sobra a 500 printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 02: Sume u genere la siguiente secuencia de potencias (base, potencia):

Page 124: Fundamento de Programacion en C++

(10, 1), (15, 2), (20, 3), (25, 4), ...N *********************************************************************/ #include <iostream> using namespace std; void main(){ int i,j, n, base ; unsigned long s, termino;//Tipo long sin signo printf("Ingrese #...");scanf("%d",&n); base=10; s=0; for( i=1 ; i<=n ; i++){ termino=1; for( j=1 ; j<=i ; j++) termino = termino * base; printf("\n\r(%d, %d) = %u \n ",base, i, termino); base+=5; s+=termino; } printf("\n\nLa suma es...%u",s); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 03: Se pide mostrar y sumar todos los numeros primos de cuatro cifras. *********************************************************************/ #include <iostream> using namespace std; void main(){ int c,cd,i,j; long s; c=s=0; for(i=1000;i<=9999;i++){ cd=0; for(j=1;j<=i;j++) if(i%j==0)

Page 125: Fundamento de Programacion en C++

cd++; if(cd==2){ printf("Primo %d : %d\n\r",c, i); c++; s+=i; } } printf("\n\n\rSuma de los # primos de 4 cifras es...%d", s); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 04: Se pide mostrar y sumar la secuencia de factoriales. FACTORIAL DE N TERMINOS S=1!+3!+5!+7!...N Recordar que: !3 = 3*2*1 !n = n*(n-1)*(n-2)*...* 1 *********************************************************************/ #include <iostream> using namespace std; void main(){ int n,i,j; unsigned long s, termino; printf("Ingrese #...");scanf("%d",&n); s=0; for(i=1;i<=n*2;i+=2){ termino=1; for(j=1;j<=i;j++) termino*=j; printf("!%d = %u\n", i, termino); s+=termino; }//CIERRE FOR printf("\n\nLa suma es...%u",s); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 126: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 05: Sume u muestre todos los numeros perfectos entre 5 y 1000. *********************************************************************/ #include <iostream> using namespace std; void main(){ int i,j, sd, s; s=0; for(i=5;i<=1000;i++){ sd=0; for(j=1;j<=i/2;j++) if(i%j==0) sd+=j; if(sd==i){ printf("Es perfecto..%d\n", i); s+=i; } } printf("\n\nLa suma es...%d",s); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 06: Sume y genere la siguiente secuencia: 1! 1 2! 1 3! 2 4! 3 5! 5 ...N *********************************************************************/ #include <iostream> using namespace std; void main(){ int n,i; unsigned long S, termino; int A, B;//fibonacci int j, terminofac;//factorial

Page 127: Fundamento de Programacion en C++

printf("Ingrese #...");scanf("%d",&n); // 1! 1 2! 1 3! 2 4! 3 5! 5 ...N // 1! 2! 3! 4! 5! =>factorial // 1 1 2 3 5 =>fibonacci // 1 2 3 4 5 6 7 8 9 10...N -> i S=0; A=0;B=1;//fibonacci terminofac=0;//factorial for(i=1;i<=n;i++){ if(i%2==0){//fibonacci A=A+B; B=A-B; termino = A; printf("%u\n", termino); }else{//factorial terminofac++; termino=1; printf("%d! = ", terminofac); for( j=1 ; j<=terminofac ; j++ ){ termino = termino * j; if(j < terminofac) printf("%d * ", j); else printf("%d", j); } printf(" = %u\n", termino); } S+=termino; } printf("\n\nLa suma es...%u",S); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 07: Ingrese por teclado el numerador y denominador de una fraccion, visualice la fraccion simplificada, o la fraccion original de no poderse simplificar. *********************************************************************/ #include <iostream> using namespace std; void main(){

Page 128: Fundamento de Programacion en C++

int n,m, i, mayor, menor, ns, ms; printf("Ingrese numerador...");scanf("%d",&n); printf("Ingrese denominador...");scanf("%d",&m); mayor=n; if(m>mayor)mayor=m; ns=n; ms=m; for(i=mayor;i>=1;i--) if(ns%i==0 && ms%i==0){ ns=ns/i; ms=ms/i; } printf("\n\nNumerador simplificado...%d",ns); printf("\n\nDenominador simplificado...%d",ms); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 07: Ingrese por teclado el numerador y denominador de una fraccion, visualice la fraccion simplificada, o la fraccion original de no poderse simplificar. *********************************************************************/ #include <iostream> using namespace std; void main(){ int n,m, i, mayor, menor, ns, ms; printf("Ingrese numerador...");scanf("%d",&n); printf("Ingrese denominador...");scanf("%d",&m); mayor=n; if(m>mayor)mayor=m; ns=n; ms=m; for(i=mayor;i>=1;i--) if(ns%i==0 && ms%i==0){ ns=ns/i; ms=ms/i; } printf("\n\nNumerador simplificado...%d",ns); printf("\n\nDenominador simplificado...%d",ms);

Page 129: Fundamento de Programacion en C++

printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 08:Ingresar por teclado un numero (1-3999). Mostrar el numero en romanos. *********************************************************************/ #include <iostream> using namespace std; void main(){ int n,u,d,c,m, i; char r; do{ printf("\n\n\rIngrese Numero(1-3999)..."; scanf("%d",&n); fflush(stdin); m=n/1000; c=(n%1000)/100; d=((n%1000)%100)/10; u=n%10; printf("\n\n\t\t"; for(i=1;i<=m;i++) printf("M"); if(c==9) printf("CM"); else for(i=1;i<=c;i++) printf("C"); if(d==9) printf("XC"); else for(i=1;i<=d;i++) printf("X"); switch(u){ case 1:printf("I");break; case 2:printf("II");break; case 3:printf("III");break; case 4:printf("IV");break; case 5:printf("V");break; case 6:printf("VI");break; case 7:printf("VII");break; case 8:printf("VIII");break; case 9:printf("IX");break;

Page 130: Fundamento de Programacion en C++

} printf("\n\nDesea Continuar S/N "; r=getchar(); }while(r=='s'|| r=='S'); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 09: Caja de Prestamos a Plazos con descuentos Se pide ingresar por teclado el monto, tasa de interes y duracion de un prestamo a asignar a un cliente. Debe mostrar el monto a entregar, ademas dar la opcion si desea entregar exactamente el monto solicitado. Debera mostrar las cuotas a pagar por meses. *********************************************************************/ #include <iostream> using namespace std; void main(){ const double MES=12; double cant, tasa, ncant, cant_sug, pag_men, inte; int tiempo;char op; printf("\n\t\t\tPRESTAMOS A PLAZOS CON DESCUENTOS"); printf("\n\nIngrese monto de dinero que necesita..."); scanf("%lf",&cant); fflush(stdin); printf("\nIngrese tasa de interes..."); scanf("%lf",&tasa); fflush(stdin); printf("\nIngrese duracion de prestamo (En meses)..."); scanf("%d",&tiempo); fflush(stdin); inte=((cant*tasa) / 100) * (tiempo / MES); ncant=cant - inte; pag_men=cant / tiempo; printf("\n\nUsted recibira %1.2f y los pagara en %d meses con cuotas de %1.2f.", ncant, tiempo, pag_men); printf("\n\n1. Esta conforme con lo que recibe.\n2. Desea recibir %1.2f", cant); printf("\n\nIgrese Opcion: "); op=getchar(); fflush(stdin); switch(op){ case '2': cant_sug=cant;

Page 131: Fundamento de Programacion en C++

do{ cant_sug+=0.1; inte=((cant_sug*tasa) / 100) * (tiempo / MES); ncant=cant_sug - inte; pag_men=cant_sug / tiempo; }while(ncant < cant); printf("\n\nUsted debe solicitar %1.2lf y los pagara en %d meses con cuotas de %1.2lf.", cant_sug, tiempo, pag_men); break; default: break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 132: Fundamento de Programacion en C++

Capítulo 6

Funciones Predefinidas de

C++ 6.1 Concepto de Función

6.2 Funciones Aritméticas

6.3 Funciones trigonométricas

6.4 Funciones de caracteres

6.5 Funciones de Cadena

6.6 Generador de números aleatorios

6.7 De Control de pantalla

Page 133: Fundamento de Programacion en C++

Funciones Predefinidas de C++

Introducción

Los desarrolladores en C++, hacen sus programas teniendo siempre en mente escribir lo menos

posible reutilizando bloques de código, dividiendo mentalmente las partes del programa (entrada -

proceso – salida) como divisiones principales.

Además hay procesos cotidianos en los programas que a menudo no vale la pena escribirlos

reiteradamente, En eso C++ nos facilita la labor pues cuenta con funciones predefinidas de diferentes

tipos y para cada tipo de situaciones. No obstante antes de mostrar las funciones predefinidas

mostraremos el concepto de función para ingresar con más visión a las funciones.

6.1 Concepto de Función

Una función es un conjunto de instrucciones con una tarea determinada, una función es utilizada para

dividir un programa en subprogramas con tareas propias de la función. Una función siempre devuelve

valor.

Para ver definición de funciones Véase capítulo 7.

6.2 Funciones Aritméticas

Función Descripción Tipo Dato

Argumento Tipo Dato devuelto

Ejemplo Valor

devuelto ejemplo

Librería (**)

sqrt Raíz cuadrada

double double sqrt(4.0) 2.0 math.h float float sqrt(4.0) 2.0

long long sqrt(4) 2

pow (*)

Potencias

double double

pow(2.0, 3.0) pow(2.0, 3)

8.0 8.0

math.h float

float

pow(2.0, 3.0) pow(2.0, 3)

8.0 8.0

long double

long double

pow(20.0, 3) 8000.0

6

Page 134: Fundamento de Programacion en C++

abs Valor Absoluto

double double abs(-7.0) abs(7.0)

7 7

math.h

float float abs(-7.0) abs(7.0)

7 7

int int abs(-7) abs(7)

7 7

long long abs(-70000) abs(70000)

70000 70000

stdlib.h long double

long double

abs(-70000.0) abs(70000.0)

70000.0 70000.0

ceil Techo(redondeo arriba)

double double ceil(3.2) ceil(3.9)

4.0 4.0

math.h

float float ceil(3.2) ceil(3.9)

4.0 4.0

long double

long double

ceil(30000.2) ceil(30000.9)

30001.0 30001.0

floor Piso(redondeo abajo)

double double floor(3.2) floor (3.9)

3.0 3.0

math.h

float float floor (3.2) floor (3.9)

3.0 3.0

long double

long double

floor (30000.2) floor (30000.9)

30000.0 30000.0

exp Exponencial

double double exp(1.0) 2.7

math.h float float exp(1.0) 2.7 long double

long double

exp(10.0) 22026.5

log Logaritmo natural(ln)

double double log(5.0) 1.6

math.h float float log(5.0) 1.6 long double

long double

log(1000.0) 6.9

log10 Logaritmo base 10 (ln)

double double log10(10.0) 1.0

math.h float float log10(10.0) 1.0 long double

long double

log10(1000.0)

3.0

(*) Para la función pow y otras, solo basta con asignar a una variable de tipo del valor devuelto de la

función o mostrar por pantalla con el formato, por ejemplo: Guardando el valor en variable:

double base=2.0, exponente=3.0, resultado;

Page 135: Fundamento de Programacion en C++

resultado=pow(base, exponente); printf("\n\nResultado: %8.1lf ", resultado);

o mostrar directamente por pantalla:

double base=2.0, exponente=3.0; printf("\n\nResultado: %8.1lf ", pow(base, exponente));

6.3 Funciones trigonométricas

Función Descripción Tipo Dato

Argumento Tipo Dato devuelto

Ejemplo(*) Valor

devuelto ejemplo

Librería (**)

cos Coseno

double double cos(0.0) 1.0 math.h float float cos(0.0) 1.0

long double long cos(1000.0) 0.6

acos Arco Coseno

double double acos(1.0) 0.0 math.h float float acos(1.0) 0.0

long double long double acos(0.5) 1.0

sin Seno

double double sin(0.5) 0.5 math.h

float float sin(0.5) 0.5 long double long double sin(10.0) -0.5

asin Arco Seno

double double asin(0.8) 0.9 math.h float float asin(0.8) 0.9

long double long double asin(1.0) 1.6

tan Tangente

double double tan(1.0) 1.6 math.h float float tan(1.0) 1.6

long double long double tan(100.0) -0.6

atan Arco Tangente

double double atan(0.8) 0.7 math.h float float atan(0.8) 0.7

long double long double atan(100.0) 1.6

cosh Coseno Hiperbólico

double double cosh(1.0) 1.5 math.h float float cosh(1.0) 1.5

long double long double cosh(10.0) 11013.2

tanh Tangente Hiperbólico

double double tanh(1.0) 0.8 math.h float float tanh(1.0) 0.8

long double long double tanh(0.5) 0.5

Page 136: Fundamento de Programacion en C++

(*) Notar que en los ejemplos se asignan como parámetros constantes de tipo real, pues todos aceptan

reales ya sea double, float o long double, no obstante también es posible asignar variables con

el tipo solicitado en la función.

6.4 Funciones de caracteres

Muchas de las funciones predefinidas toman como base la tabla de códigos ascii.

Para hacer comparaciones, conversiones y búsquedas generalmente es trabajado mediante el número

de código de cada carácter. A continuación mostramos la tabla de código ascii con los caracteres

imprimibles.

Tabla de códigos ascii Imprimibles

Código Carácter Código Carácter Código Carácter Código Carácter

(*)32 56 8 80 P 104 h

33 ! 57 9 81 Q 105 i

34 " 58 : 82 R 106 j

35 # 59 ; 83 S 107 k

36 $ 60 < 84 T 108 l

37 % 61 = 85 U 109 m

38 & 62 > 86 V 110 n

39 ' 63 ? 87 W 111 o

40 ( 64 @ 88 X 112 p

41 ) 65 A 89 Y 113 q

42 * 66 B 90 Z 114 r

43 + 67 C 91 [ 115 s

44 , 68 D 92 \ 116 t

45 - 69 E 93 ] 117 u

46 . 70 F 94 ^ 118 v

47 / 71 G (*)95 _ 119 w

48 0 72 H 96 ` 120 x

49 1 73 I 97 a 121 y

50 2 74 J 98 b 122 z

51 3 75 K 99 c 123 {

52 4 76 L 100 d 124 |

53 5 77 M 101 e 125 }

54 6 78 N 102 f 126 ~

55 7 79 O 103 g

Page 137: Fundamento de Programacion en C++

La tabla muestra los caracteres imprimibles por pantalla incluyendo el carácter con código número 32

que representa el espacio en blanco y el carácter número 95 es la línea inferior.

Funciones de caracteres

Función Descripción Tipo Dato

Argumento

Tipo Dato

devuelto Ejemplo(*)

Valor devuelt

o ejemplo

Librería (**)

isalnum

Devuelve true si su

argumento satisface isalpha o isdigit.

Caso contrario devuelve false.

char bool

isalnum('B') isalnum('1') isalnum('+')

true true false

ctype.h

isalpha

Devuelve true si su

argumento es letra (Mayúscula o Minúscula). Caso contrario devuelve false.

char bool

isalpha('B') isalpha('1') isalpha('+')

true false false

ctype.h

isdigit

Devuelve true si su

argumento es un digito. Caso contrario devuelve false.

char bool

isdigit('B') isdigit('1') isdigit('+')

false true false

ctype.h

ispunct

Devuelve true si su

argumento es un carácter imprimible que no satisface isalnum y

no es espacio en blanco (Caracteres de puntuación). Caso contrario devuelve false.

char bool

ispunct('B') ispunct('1') ispunct('+')

false false true

ctype.h

isspace

Devuelve true si su

argumento es un carácter de espacio en blanco (Tabular, Enter). Caso contrario devuelve false.

char bool

isspace( ' ') isspace(' ') isspace('\n')

true true true

ctype.h

iscntrl (*)

Devuelve true si su

argumento es un carácter de control. Caso contrario devuelve false.

char bool

iscntrl ( char(127) )

true ctype.h

islower Devuelve true si su

argumento es letra char bool

islower('a') islower('A')

true false

ctype.h

Page 138: Fundamento de Programacion en C++

Minúscula. Caso contrario devuelve false.

islower('+')

false

isupper

Devuelve true si su

argumento es letra Mayúscula. Caso contrario devuelve false.

char bool

isupper ('a') isupper ('A') isupper ('+')

false true false

ctype.h

tolower

Devuelve la versión en minúscula de su argumento. Si no tiene minúscula devuelve el mismo argumento

char char

tolower('A') tolower('a') tolower('+')

a a +

ctype.h

toupper

Devuelve la versión en mayúscula de su argumento. Si no tiene mayúscula devuelve el mismo argumento

char char

toupper('A') toupper('a') toupper('+')

A A +

ctype.h

(*) Hay una forma de averiguar cuáles son caracteres de control y esto es con las siguientes

instrucciones:

for(int i=1;i<=127;i++) if(iscntrl(char(i))) printf("\n%d = %c", i, char(i));

El resultado nos mostrara todos los caracteres en el cual su código ascii esta entre (1-31) y el 127. Son

caracteres no imprimibles por ejemplo el número 10 que representa la tecla <Enter>

6.5 Funciones de Cadena

Prototipo Descripción Ejemplo Valor

devuelto ejemplo

Librería (**)

int atoi (char* <cadena>)

Convierte <cadena>

hacia un int

char cad[2]={'1','0'}; atoi(cad);

10 stdlib.h

Page 139: Fundamento de Programacion en C++

long atol (char* <cadena>)

Convierte <cadena>

hacia un long

char cad[2]={'0','5'}; atol(cad);

5 stdlib.h

double atof (char* <cadena>)

Convierte <cadena>

hacia un double

char cad[3]={'0','.','5'}; atof(cad)

0.5 math.h

char* strcat( char* <cad_destino>, char* <cad_origen> )

Anexa o junta <cad_origen > al

final de <cad_destino>

char cad1[10]={'A','B'}; char cad2[2]={'C'}; strcat(cad1, cad2); printf("\n%s", cad1);

ABC string.h

int strcmp( char* <cadena1>, char* <cadena2>)

Devuelve 0, si las cadenas son iguales, 1 si <cadena1> es mayor

a <cadena2> y -1 si

es menor (*)

char cad1[1]={'A'}; char cad2[1]={'A'}; printf("\n%d", strcmp(cad1, cad2));

0 string.h

char* strcpy( char* <cad_destino>, char* <Expresioncad>)

Cambia el valor de <Expresioncad> hacia <cad_destino>

char cad[10]; strcpy(cad, "ABC"); printf("\n%s", cad);

ABC string.h

int strlen (char* <cadena>)

Devuelve la longitud de <cadena>

char cad[10]={'A','B'}; printf("\n%d", strlen(cad));

ABC string.h

char* strncat( char* <cad_destino>, char* <cad_origen>, int <n>)

Anexa o junta <n> caracteres de <cad_origen > al

final de <cad_destino>

char cad1[10]={'A','B'}; char cad2[2]={'C','D'}; strncat(cad1,cad2,1); printf("\n%s", cad1);

ABC string.h

int strncmp( char* <cadena1>, char* <cadena2>, int <n>)

Compara <n> caracteres de <cadena1> con

<cadena2>

char cad1[10]={'A','B'}; char cad2[2]={'A','C'}; printf("\n%d", strncmp(cad1, cad2, 1));

0 string.h

char* strstr( char* <cadena>, char* <Patrón>)

Devuelve un puntero a la primera ocurrencia de la cadena <Patrón> en <cadena> y NULL si no lo encuentra

char cad1[10]={'A','B','C'}; char cad2[10]={'B'}; char cad3[10]; strcpy(cad3, strstr(cad1, cad2)); printf("\n%s", cad3);

BC string.h

char* strchr( char* <cadena>, char <caracter>)

Devuelve un puntero a la primera ocurrencia de la cadena <

char cad1[10]={'A','B', 'A','B'}; char car='B'; char cad3[10];

BAB string.h

Page 140: Fundamento de Programacion en C++

caracter> en <cadena> y NULL si no lo encuentra

strcpy(cad3, strchr(cad1, car)); printf("\n%s", cad3);

char* strrchr( char* <cadena>, char <caracter>)

Devuelve un puntero a la última ocurrencia de la cadena < caracter> en <cadena> y NULL si no lo encuentra

char cad1[10]={'A','B', 'A','B'}; char car='B'; char cad3[10]; strcpy( cad3, strrchr(cad1, car) ); printf("\n%s", cad3);

B string.h

(*) Devuelve 0, si son iguales en longitud y caracteres, 1 si <cadena1> es mayor a <cadena2> y -1 si

es menor.

Ejemplos:

char cad1[10]={'B', 'B'}; char cad2[2]={'A'}; printf("\nResultado: %d", strcmp(cad1, cad2)); /*Retorna 1, por que el caracter mas alto de cad1 es 'B' y el caracter mas alto de cad2 es 'A' es decir 'B'>'A' en la tabla de los codigos ascii */

char cad1[10]={'B', 'B'}; char cad2[2]={'C'}; printf("\nResultado: %d", strcmp(cad1, cad2)); /*Retorna -1, por que el caracter mas alto de cad1 es 'B' y el caracter mas alto de cad2 es 'C' es decir 'B'<'C' en la tabla de los codigos ascii */

(**) Las librerías mostradas en las tablas son automáticamente referenciadas en Visual Studio .Net por

la ya conocida referencia:

Page 141: Fundamento de Programacion en C++

#include <iostream> using namespace std;

6.6 Generador de números aleatorios

A menudo en los problemas computacionales es necesario generar números al azar o aleatorios. A

continuación mostramos la forma de generar números aleatorios en C++.

#include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ int tiempo, desde, hasta, Numero; tiempo=time(NULL); srand(tiempo); desde=50; hasta=150; Numero=desde + rand() % (1 + hasta - desde); printf("%d\n", Numero); system("PAUSE"); }

Observamos del ejemplo anterior las nuevas directivas a utilizar:

#include "stdlib.h" #include "time.h"

Generamos la semilla de números aleatorios:

Page 142: Fundamento de Programacion en C++

tiempo=time(NULL); srand(tiempo);

Establecemos los límites de generación de números (50-150):

desde=50; hasta=150;

Generamos el número aleatorio y lo guardamos en la variable Número:

Numero=desde + rand() % (1 + hasta - desde);

En general la fórmula para generar números aleatorios entre a y b:

a + rand() % (1 + b - a)

Page 143: Fundamento de Programacion en C++

Capítulo 7

Programación Modular 7.1 Diseño descendente

7.2 Subprogramas

7.3 Variables globales y locales

7.4 Funciones

7.4.1 Definición de funciones

7.4.2 Invocación a las funciones

7.5 Procedimientos

7.5.1 Definición de Procedimientos

7.5.2 Invocación a las Procedimientos

7.6 Tipos de Parámetros

Page 144: Fundamento de Programacion en C++

7Programación Modular

Introducción

Los desarrolladores en C++, hacen sus programas teniendo siempre en mente el conocido dicho

“Divide y vencerás”, el cual nos va a evitar serios dolores de cabeza a la hora de realizar aplicaciones

grandes y complejas. En C++ es esencial el trabajo modular ya sea por objetivos, abstracción o por

reutilización.

Un módulo representa un bloque abstracto de código, esto es el programa principal o subprogramas

en una solución a un problema computacional.

7.1 Diseño descendente

Las aplicaciones en C++ y varios lenguajes de programación tienen como característica el diseño descendente en la escritura de código, es decir “de arriba hacia abajo” esto significa que en una hoja de código el compilador va a hacer un barrido desde la primera hasta la última línea en la hoja de código.

Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 3 xxxxxxxx Línea 4 xxxxxxxx Línea 5 xxxxxxxx …………………... …………………… Línea n-1 ...…….. Línea n...………..

7.2 Subprogramas

Son subdivisiones que bifurcan o alteran el flujo del código en un programa. Hacia la zona del

subprograma, esto puede ser en la hoja de código o en ocasiones a otros archivos.

A continuación mostramos un esquema de un programa hecho de forma modular:

Page 145: Fundamento de Programacion en C++

PROGRAMA PRINCIPAL

Línea 1 xxxxxxxx Línea 2 xxxxxxxx LLAMA SUBPROGRAMA X Línea 4 xxxxxxxx Línea 5 xxxxxxxx Línea 6 xxxxxxxx LLAMA SUBPROGRAMA X Línea 8 xxxxxxxx Línea 9 xxxxxxxx Línea 10 xxxxxxxx LLAMA SUBPROGRAMA Y Línea 11 xxxxxxxx Línea 12 xxxxxxxx …………………... …………………… Línea n-1 ...…….. Línea n...………..

Notar que el programa principal cuenta con 2 subprogramas estos puede estar dentro de la hoja de código o en otro archivo. El compilador comienza con la línea 1, línea 2 y llega a la línea en la cual se llama al subprograma X, entonces el flujo brinca al subprograma X entonces comienza a ejecutarse la línea 1, 2, …n del subprograma. Al terminar de ejecutarse el subprograma el flujo retorna al programa principal. Entonces continúa el programa principal con la línea 4, 5, 6 entonces vuelve a llamar al subprograma X y vuelve a ejecutar y terminar sus instrucciones para retornar nuevamente al programa principal. Se ejecuta las líneas 8,9,10 y llega a la invocación del subprograma Y, entonces similar a lo que hizo el compilador con el subprograma X hace con Y, ejecuta las líneas del subprograma Y, al finalizar retorna al programa principal hasta terminar de ejecutar lo restante.

SUBPROGRAMA (X)

Línea 1 xxxxxxxx Línea 2 xxxxxxxx …………………… Línea n-1 ...…….. Línea n...………..

SUBPROGRAMA (Y)

Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 3 xxxxxxxx …………………… Línea n...………..

El esquema representa el

flujo de un programa con

dos subprogramas.

Page 146: Fundamento de Programacion en C++

7.3 Variables globales y locales

Una variable es global o local en función de la zona dentro de la hoja de código en donde es

declarada. Esto puede ser por el alcance del valor de la variable con la cual se necesita trabajar.

Variable global

Es una variable que es declarada fuera de todo modulo, su valor almacenado es mantenido hasta que

se termine el programa.

#include <iostream> using namespace std; int nro; //Variable global nro void main(){

Variable local

Es una variable que es declarada dentro de un módulo, su valor almacenado es mantenido hasta que

termine el modulo.

#include <iostream>

using namespace std;

void main(){

int nro; //Variable Local del programa principal

Page 147: Fundamento de Programacion en C++

7.4 Funciones

Una función es un módulo de instrucciones con una tarea específica que retorna siempre resultado(s).

Este resultado es del tipo de datos con el cual fue definido.

Una función es código en espera hasta que la función sea invocada desde el programa principal, el

valor devuelto por la función puede ser almacenado o mostrado directamente por pantalla.

7.4.1 Definición de funciones

Para utilizar una función antes previamente debe ser definida. A continuación mostramos la definición

de una función:

<Tipo de dato> <Nombre Función> (<Lista de argumentos>){

<Conjunto de instrucciones>

return <valor/variable>;

}

Dónde:

<Tipo de dato>:

Tipo de datos valido C++ (int, double, bool, etc.) Véase apartado 3.1.1

<Nombre Función> :

Identificador valido C++(Aplica las reglas a nombrar variables Véase apartado 3.1.3)

<Lista de argumentos>:

Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato

(<Tipo de dato > <Argumento1>, < Tipo de dato > <Argumento2>,…)

<valor/variable>:

Page 148: Fundamento de Programacion en C++

Valor o variable que la función devolverá como resultado, cabe decir que este resultado debe ser del

tipo de dato declarado por la función.

Ejemplo:

La siguiente función es de tipo entera y retorna la suma de dos números enteros.

int f_sumar(int A, int B){ int devolver; devolver = A + B; return devolver; }

7.4.2 Invocación a las funciones

La función f_sumar es un código en espera sino hasta que es invocado desde el modulo void main.

Para invocar a una función se nombra la función y se pasan valores como se muestra a continuación:

void main(){ int A, resultado; A=10; resultado=f_sumar(A, 5);//Invocacion a funcion printf("%d\n", resultado);//Muestra 15 system("PAUSE"); }

Una función no es necesariamente invocado de la función principal void main también es posible que

sea invocado desde cualquier función valida de C++, y todas ellas estarán en espera hasta que sean

invocados desde el modulo void main. A continuación mostraremos como se invoca una función

dentro de otra:

Page 149: Fundamento de Programacion en C++

int f_sumar(int A, int B){ int devolver; devolver = A + B; return devolver; } int f_doble(int A){ int devolver; devolver = f_sumar(A, A);//Invocacion a funcion f_sumar return devolver; }

El programa completo es:

#include <iostream> using namespace std; //Definicion de la funcion f_sumar int f_sumar(int A, int B){ int devolver; devolver = A + B; return devolver; } //Definición de la funcion f_doble int f_doble(int A){ int devolver; devolver = f_sumar(A, A);//Invocacion a función f_sumar return devolver; } //Programa Principal void main(){ int A, resultado; A=10; resultado=f_doble(A);//Invocacion a función f_doble printf("%d\n", resultado);//Muestra 20 system("PAUSE"); }

Page 150: Fundamento de Programacion en C++

7.5 Procedimientos

Un procedimiento es un tipo de función con la única restricción que NO retorna resultado(s). Por tanto

todas las reglas que se describieron para las funciones son también aplicables a los procedimientos.

En C++ los procedimientos también son conocidos como funciones void. Se concibe a un

procedimiento como bloque de código que es anexado al módulo que lo invoca.

7.5.1 Definición de Procedimientos

Para utilizar un procedimiento antes previamente debe ser definida. A continuación mostramos la

definición de un procedimiento:

void <Nombre Procedimiento > (<Lista de argumentos>){

<Conjunto de instrucciones>

}

Dónde:

<Nombre Procedimiento > :

Identificador valido C++(Aplica las reglas a nombrar variables Véase apartado 3.1.3)

<Lista de argumentos>:

Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato

(<Tipo de dato > <Argumento1>, < Tipo de dato > <Argumento2>,…)

Ejemplo:

El siguiente procedimiento muestra por pantalla un entero.

Page 151: Fundamento de Programacion en C++

void f_mostrar(int A){ printf("%d\n", A); system("PAUSE"); }

7.4.2 Invocación a los Procedimientos

El procedimiento f_mostrar es un código en espera sino hasta que es invocado desde el modulo

void main.

void main(){ int A, resultado; A=10; f_mostrar(A); //Invocacion a Procedimiento f_mostrar }

El programa completo es:

#include <iostream> using namespace std; //Definición de Procedimiento f_mostrar void f_mostrar(int A){ printf("%d\n", A); system("PAUSE"); } //Procedimiento Principal void main(){ int A, resultado; A=10; f_mostrar(A);//Invocacion a Procedimiento f_mostrar }

Page 152: Fundamento de Programacion en C++

Como podemos apreciar la función principal void main es un procedimiento o una función void.

Tener en cuenta que las variables que se declaran y los argumentos solo cuentan dentro del módulo

donde fueron declaradas, por lo tanto el argumento (int A) del procedimiento f_mostrar y la

variable int A de void main son distintas.

7.6 Tipos de Parámetros

En C++ los parámetros o argumentos de una función pueden ser de dos tipos: Por valor o por

referencia.

Parámetro Por Valor

Son aquellos parámetros en los cuales el valor o contenido de los parámetros es copiado, y dentro de

la función se trabaja con dicha copia. Esto sugiere que la variable real no puede ser modificada en

contenido.

Parámetro Por Referencia

Son aquellos parámetros en los cuales la dirección de memoria es pasada hacia la función, esto indica

que dentro de la función se trabaja realmente con la variable que es pasada como argumento, por

tanto dicha variable puede ser modificada.

void f_incrementar(int A){//Argumento A es por valor A++; printf("%d\n", A); } void main(){ int A; A=10; f_incrementar(A);//Muestra 11 printf("%d\n", A);//Muestra 10 system("PAUSE"); }

Page 153: Fundamento de Programacion en C++

Para decirle al compilador de C++ que un argumento es por referencia se debe anteponer a la variable

el símbolo de ampersand &.

void f_incrementar(int &A){ //Argumento A es por referencia A++; printf("%d\n", A); } void main(){ int A; A=10; f_incrementar(A);//Muestra 11 printf("%d\n", A);//Muestra 11 system("PAUSE"); }

Se recomienda usar parámetros por referencia en lo mínimo. Es posible también modificar variables en

funciones si la declaramos como variables globales, esto nos va a facilitar el entendimiento y sabremos

que estamos modificando.

Page 154: Fundamento de Programacion en C++

Capítulo 8

Arreglos

8.1 Arreglos Unidimensionales

8.1.1 Representación Grafica

8.1.2 Asignación de Valores

8.1.3 Lectura y escritura de datos

8.1.4 Recorrido, inserción y eliminación en un vector

8.2 Arreglos Bidimensionales

8.1.1 Representación Grafica

8.2.2 Asignación de Valores

8.2.3 Lectura y escritura de datos

8.2.4 Recorrido, inserción y eliminación en una matriz

8.3 Ordenamientos

8.3.1 método de intercambio o burbuja

8.3.2 método por inserción,

8.3.3 método por selección

8.3.4 método de ordenación rápida (quicksort).

8.4 Búsquedas

8.4.1 Tipos de búsqueda

8.4.2 Método Búsqueda Binaria

Page 155: Fundamento de Programacion en C++

Arreglos

Introducción

Los arreglos son conjuntos de datos del mismo tipo, agrupados en una variable y cuyo acceso

individual es numérico, este acceso individual es denominado índice. Un arreglo puede contener por

ejemplo listas de calificaciones de exámenes, de temperaturas o de nombres.

Cabe decir que la cantidad de elementos de los arreglos es de tipo estática es decir que al declarar la

longitud del vector esta va a mantener su longitud hasta el final del programa.

8.1 Arreglos Unidimensionales

8.1.1 Representación Grafica

A continuación mostramos un vector de tipo entero de 10 elementos:

int A[10] 0 1 2 3 4 5 6 7 8 9

7 5 6 3 0 8 2 1 15 9

A[0]=7 A[3]=3 A[8]=15

8.1.2 Asignación de Valores

Asignar a un elemento del vector es mediante la variable seguida del índice entre corchetes así como

sigue a continuación:

<Variable_vector>[<indice>] = <variable / valor>;

8

Page 156: Fundamento de Programacion en C++

Ejemplos:

A[0] = 7; A[3] = 3; A[8] = 15;

A[5] = A[1]; A[6] = A[6] * 2; A[7] = A[0] / A[1];

A[9] = desde + rand() % (1 + hasta - desde);

8.1.3 Lectura y escritura de datos

Leer o escribir un elemento del vector es similar ha como se hace a variables individuales mediante la

variable seguida del índice entre corchetes así como sigue a continuación:

Lectura

scanf(<formato>, &<Variable_vector>[<indice>] );

Ejemplos

scanf("%d", &A[ 5 ]); scanf("%d", &A[ 0 ]); scanf("%d", &A[ p ]);

Escritura

printf(<formato>, <lista de elementos de vector>);

Ejemplos

printf("%d", A[ 5 ]);

Page 157: Fundamento de Programacion en C++

printf("%lf", B[ 0 ]); printf("%d y %8.2lf", A[ p ], B[ p ]);

8.1.4 Recorrido, inserción, eliminación y ejemplos en un vector

Recorrido

Para recorrer un vector ya sea para asignación, lectura o escritura utilizamos la sentencia for

ya que conocemos el inicio y el final del recorrido, así como se muestra a continuación: Ejemplo 1 Asignación del índice a cada elemento de un vector de 10 elementos:

Longitud=10; for(i=0 ; i< Longitud ; i++){ A[i]=i; }

Ejemplo 2 Ingreso por teclado a cada elemento de un vector de 10 elementos:

Longitud=10; for(i=0 ; i< Longitud ; i++){ scanf("%d", &A[i]); }

Ejemplo 3 Impresión por teclado a cada elemento en una línea para un vector de 10 elementos:

Longitud=10; for(i=0 ; i< Longitud ; i++){ printf("%d\n", A[i]); }

Page 158: Fundamento de Programacion en C++

Inserción

Sabemos que la longitud del vector es de tipo estática por tanto la inserción es simulada, es decir no

aumenta la longitud declarada al inicio.

Para tal caso debemos declarar la longitud del vector con un valor máximo tope, que contemple la

longitud actual más las inserciones.

Debemos tener la longitud virtual del vector en una variable

A continuación mostramos el algoritmo de inserción si suponemos que:

int A[6], N=4;

0 1 2 3 4 5

2 3 1 4

Algoritmo de inserción:

for(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i]; A[posicion-1] = nro_insertar; N++;

Dónde:

< A > : Vector de elementos

< posicion >: Posición a insertar

< nro_insertar >: Valor a insertar

< N >: Longitud del vector

Page 159: Fundamento de Programacion en C++

Explicación del algoritmo

for(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i];

< for(i = N-1 ; i>=posicion-1 ; i--) > significa que la variable < i > comienza de la longitud

del vector < N-1 >, y termina en la posición a insertar < i>=posicion-1 >. < A[i+1] = A[i] > significa el elemento siguiente es igual al anterior.

Si < posicion > a insertar es 2 entonces:

Procedemos a desplazar los elementos desde el final hasta la posición:

A[i+1] = A[i]

A[4] = A[3] A[3] = A[2] A[2] = A[1]

Resultado: 0 1 2 3 4 5

2 3 3 1 4

A[posicion-1] = nro_insertar;

Si < nro_insertar > es 10 entonces:

A[2-1] = 10; 0 1 2 3 4 5

2 10 3 1 4

Page 160: Fundamento de Programacion en C++

N++;

Como N tenía el valor de 4 y se incrementa en uno entonces:

N = 5

Eliminación

Sabemos que la longitud del vector es de tipo estática por tanto la eliminación es simulada, es decir no

decrementa la longitud declarada al inicio.

Debemos tener la longitud virtual del vector en una variable.

A continuación mostramos el algoritmo de eliminación si suponemos que:

int A[6], N=5;

0 1 2 3 4 5

2 3 1 4 5

Algoritmo de eliminación:

for(i= posicion; i<N ; i++) A[i-1]=A[i]; N--;

Dónde:

Page 161: Fundamento de Programacion en C++

< A > : Vector de elementos

< posicion >: Posición a eliminar

< N >: Longitud del vector

Explicación del algoritmo

for(i= posicion; i<N ; i++) A[i-1]=A[i];

< for(i= posicion; i<N ; i++) > significa que la variable < i > comienza de la posición a

eliminar < i= posicion > hasta la longitud del vector < i<N >. < A[i-1] = A[i] > significa el

elemento anterior es igual al siguiente.

Si < posicion > a eliminar es 2 entonces:

Procedemos a desplazar los elementos desde la posición hasta el final:

A[i-1] = A[i]

A[1] = A[2] A[2] = A[3] A[3] = A[4]

Resultado: 0 1 2 3 4 5

2 1 4 5 5

N--;

Como N tenía el valor de 5 y se decrementa en uno entonces:

Page 162: Fundamento de Programacion en C++

N = 4

8.2.1 Representación Grafica

A continuación mostramos una matriz de tipo entero de 5x5 (filas x columnas) elementos:

int A[5][5] A[0][0]=2 A[0][3]=6

0 1 2 3 4

0 2 3 5 6 7

1 5 6 0 8 6

2 2 6 3 9 5

3 1 2 7 2 8

4 7 8 9 3 4

A[4] [0]=7 A[3][3]=2

A[1] [1]=6 A[2] [3]=9 A[3] [1]=2

8.2.2 Asignación de Valores

Asignar a un elemento de la matriz es mediante la variable seguida de los índices entre corchetes así

como sigue a continuación:

<Variable_matriz>[<índice_fila>][<índice_columna>] = <variable / valor>;

Ejemplos:

Page 163: Fundamento de Programacion en C++

A[0][0] = 7; A[3][1] = 3; A[8][8] = 15;

A[5][0] = A[1][3]; A[6][2] = A[6][2] * 2; A[7][5] = A[0][3] / A[1][9];

A[9][1] = desde + rand() % (1 + hasta - desde);

8.1.3 Lectura y escritura de datos

Leer o escribir un elemento de la matriz es similar ha como se hace a variables individuales mediante

la variable seguida de los índices entre corchetes así como sigue a continuación:

Lectura

scanf(<formato>, &<Variable_matriz>[<índice_fila>][<índice_columna>]);

Ejemplos

scanf("%d", &A[ 5 ][ 5 ]); scanf("%d", &A[ 0 ][ 1 ]); scanf("%d", &A[ f ][ c ]);

Escritura

printf(<formato>, <lista de elementos de la matriz>);

Ejemplos

printf("%d", A[ 5 ][ 4 ]); printf("%lf", B[ 0 ][ 0 ]); printf("%d y %8.2lf", A[ f ][ 1 ], B[ f ][ c ]);

Page 164: Fundamento de Programacion en C++

8.2.4 Recorridos y ejemplos de matrices.

Para recorrer una matriz ya sea para asignación, lectura o escritura utilizamos 2 sentencias for

Uno para controlar las filas y otro para las columnas, así como se muestra a continuación: Ejemplo 1 Asignación de la suma de los índices a cada elemento de una matriz de 5x4 elementos:

TotalFilas=5; TotalColumnas=4; for(fila=0 ; fila < TotalFilas ; fila++) for(columna=0 ; columna < TotalColumnas; columna++) A[fila][columna]= fila + columna;

Ejemplo 2 Recorrer y sumar cada elemento en forma horizontal para una matriz de 2x3 elementos:

TotalFilas=2; TotalColumnas=3; S=0; for(fila=0 ; fila < TotalFilas ; fila++) for(columna=0 ; columna < TotalColumnas; columna++) S+=A[fila][columna]; Recorrido:

fila columna

0 0

0 1

0 2

1 0

1 1

1 2

Page 165: Fundamento de Programacion en C++

Ejemplo 3 Recorrer y sumar cada elemento en forma vertical para una matriz de 2x3 elementos:

TotalFilas=2; TotalColumnas=3; S=0; for(columna=0 ; columna < TotalColumnas; columna++) for(fila=0 ; fila < TotalFilas ; fila++) S+=A[fila][columna]; Recorrido:

columna fila

0 0

0 1

1 0

1 1

2 0

2 1

Ejemplo 4 Cargar elementos a una matriz de 5x6 elementos:

TotalFilas=5; TotalColumnas=6; for(fila=0 ; fila < TotalFilas ; fila++) for(columna=0 ; columna < TotalColumnas; columna++) scanf("%d", A[fila][columna]);

Las instrucciones anteriores son correctas sin embargo tendremos que ingresar por teclado 5x6 veces

es decir 30.

Para tal caso podemos utilizar los números aleatorios:

Page 166: Fundamento de Programacion en C++

tiempo=time(NULL); srand(tiempo); TotalFilas=5; TotalColumnas=6; desde=1; hasta=10;

for(fila=0 ; fila< TotalFilas ; fila++) for(columna=0 ; columna< TotalColumnas ; columna++) A[fila][columna] = desde + rand() % (1 + hasta - desde);

Ejemplo 5 Generar y mostrar por pantalla una matriz de 5x6 elementos:

tiempo=time(NULL); srand(tiempo); TotalFilas=5; TotalColumnas=6; desde=1; hasta=5; for(fila=0 ; fila< TotalFilas ; fila++){ printf("\n\n\t"); for(columna=0 ; columna< TotalColumnas ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } }

Ejemplo 6 Definir e ingresar el orden NxM a una matriz:

//Definition const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; //Ingreso printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin);

Ejemplo 7 Se tiene una matriz de orden N*M de tipo entero, se pide generar y mostrar números aleatorios entre 1 y 16 dentro de la matriz.

#include <iostream>

Page 167: Fundamento de Programacion en C++

using namespace std; #include "stdlib.h" #include "time.h" void main(){ //Definition de matriz const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; //Ingreso orden matriz printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=16; //rango números a generar for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ //generación de numero A[fila][columna] = desde + rand() % (1 + hasta - desde); //impresión de numero printf("\t%d", A[fila][columna]); } } printf("\n\n"); system("PAUSE"); }

8.3 Ordenamientos

En arreglos existen muchos métodos de ordenación de elementos a continuación mostraremos los

más utilizados.

8.3.1 método de intercambio o burbuja

Page 168: Fundamento de Programacion en C++

for(i=0 ; i<N-1 ; i++) for(j=i+1 ; j<N ; j++) if(A[i] > A[j]){ aux=A[i]; A[i]=A[j]; A[j]=aux; }

Explicación del algoritmo

El primer < for > indica que se debe recorrer desde el inicio < i=0 > hasta el penúltimo elemento <

i<N-1 >

for(i=0 ; i<N-1 ; i++)

El segundo < for > indica que se debe recorrer desde el siguiente del elemento actual < j=i+1 >

hasta el último elemento < j<N >

for(j=i+1 ; j<N ; j++)

Si N=6 el recorrido de los dos for:

i j

0 1,2,3,4,5

1 2,3,4,5

2 3,4,5

3 4,5

4 5

Recordar el algoritmo del intercambio de valores entre dos variables A y B:

aux = A; A = B; B = aux;

Page 169: Fundamento de Programacion en C++

Supongamos que el vector es el siguiente:

0 1 2 3 4 5

3 5 4 6 7 0

Como conocemos N=6, el recorrido de las variables <i> y <j> el algoritmo del intercambio es

entonces:

i j A[i] A[j] A[i] > A[j] Intercambio 0 1 3 5 false

0 2 3 4 false

0 3 3 6 false

0 4 3 7 false

0 5 3 0 true 0 5 4 6 7 3

1 2 5 4 true 0 4 5 6 7 3

1 3 4 6 false

1 4 4 7 false

1 5 4 3 true 0 3 5 6 7 4

2 3 5 6 false

2 4 5 7 false

2 5 5 4 true 0 3 4 6 7 5

3 4 6 7 false

3 5 6 5 true 0 3 4 5 7 6

4 5 7 6 0 3 4 5 6 7

El resultado final es el arreglo ordenado:

0 3 4 5 6 7

Page 170: Fundamento de Programacion en C++

Capítulo 9

Cadenas

9.1 Fundamentos de cadenas

9.2 Asignación de Valores

9.3 Lectura y escritura de datos

9.4 Arreglo de cadenas

9.5 Lectura y escritura de datos

Page 171: Fundamento de Programacion en C++

9.1 Fundamentos de cadenas

Introducción

En el mundo de la programación y sistemas se trabajan con base de datos. Que no es más que datos

interrelacionados, y en su mayoría almacena datos de tipo texto (Cadenas).

Entonces debemos aprender también a manejar bien los datos tipos cadenas en operaciones de

concatenación, extracción, filtros, etc.

En C++ existen dos tipos de cadenas: estáticas y dinámicas. Nosotros comenzaremos con las de tipos

estáticas para comprender el manejo interno y de cómo son las operaciones primitivas.

Representación Grafica

A continuación mostramos un vector de tipo carácter de 12 elementos:

9.2 Asignación de valores

Asignar a un elemento de la cadena es mediante la variable seguida de los índices entre corchetes así

como sigue a continuación:

<Variable_cadena>[<índice>] = <variable / valor>;

char A[12] 0 1 2 3 4 5 6 7 8 9 10 11 12

H O L A M U N D O \0 ? ?

A[0]=H A[3]=A A[8]=D Operador marcador de fin de cadena

Page 172: Fundamento de Programacion en C++

Ejemplos:

A[0] = '7'; A[3] = (char)65; A[8] = 'A';

9.3 Lectura y escritura de Datos

Leer o escribir un elemento de la cadena es similar a como se hace en los vectores, con la adición de

entrada completa de la cadena mediante la función < gets >. Muchas de las operaciones en cadenas

se realizan mediante funciones (Véase apartado 6.5).

Lectura Carácter

scanf(<formato>, &<Variable_cadena>[<indice>] );

Ejemplos

scanf("%c", &A[ 5 ]); scanf("%c", &A[ 0 ]); scanf("%c", &A[ p ]);

Lectura Cadena

gets(<Variable_cadena>);

Page 173: Fundamento de Programacion en C++

Ejemplos

gets(A); gets(B);

Escritura Caracter

printf(<formato caracter>, <lista de elementos de cadena>);

Ejemplos

printf("%c", A[ 5 ]); printf("%c y %c", A[ p ], B[ p ]);

Escritura Cadena

printf(<formato cadena>, <Variable cadena>);

Ejemplos

printf("%s", A); printf("%s y %s", A, B);

Page 174: Fundamento de Programacion en C++

9.4 Arreglo de cadenas

A continuación mostramos una matriz de tipo carácter de 5x16 elementos:

char A[5][16]

A[0][0]=J A[0][3]= <espacio> A[0][7]=A

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 J O E R O C A \0 ? ? ? ? ? ? ?

1 M A R I A S A L A S \0 ? ? ? ?

2 J U L I O T E L L O \0 ? ? ? ?

3 P E D R O M O R E N O \0 ? ? ?

4 P I L A R \0 ? ? ? ? ? ? ? ? ? ?

A[4][0]=P A[4][4]=R A[3][7]=O A[3][12]=\0

A[1][10]=S A[2][9]=L

9.5 Lectura y escritura de datos

Lectura Cadena

gets(<Variable_cadena>[<índice fila>]);

Ejemplos

gets(A[0]); gets(B[p]);

Page 175: Fundamento de Programacion en C++

Escritura Cadena

printf(<formato cadena>, <Variable cadena>);

Ejemplos

printf("%s", A[0]); printf("%s y %s", A[0], B[p]);

Ejemplo 1:

Ingrese una cadena de caracteres por teclado, desarrolle la simulación de la función extraer.

Solución

#include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax], Resultado[LongitudMax]; int i, inicio, fin, nrocar, c; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\n\rPosicion de Inicio a Extraer: "); scanf("%d", &inicio); fflush(stdin); printf("\n\rNumero de caracteres a Extraer: "); scanf("%d", &nrocar); fflush(stdin); c=0; fin=(inicio-1) + nrocar; for(i=inicio-1 ; i < fin ; i++){ Resultado[c]=cadena[i];

Page 176: Fundamento de Programacion en C++

c++; } Resultado[c]='\0'; printf("\n\nLa cadena extraida es %s\n\n", Resultado); system("PAUSE"); }

Explicación del algoritmo

const int LongitudMax = 100; char cadena[LongitudMax], Resultado[LongitudMax]; int i, inicio, fin, nrocar, c;

Observamos la declaración de variables: una constante con la longitud máxima de la cadena, una

variable cadena para el ingreso y una variable resultado para mostrar lo que se va a extraer. Y un

conjunto de variables numéricas.

printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\n\rPosicion de Inicio a Extraer: "); scanf("%d", &inicio); fflush(stdin); printf("\n\rNumero de caracteres a Extraer: "); scanf("%d", &nrocar); fflush(stdin);

Las instrucciones mostradas son para el ingreso de variables. Observar la instrucción <fflush> después

de cada instrucción de ingreso, para no perder caracteres.

c=0; fin=(inicio-1) + nrocar; for(i=inicio-1 ; i < fin ; i++){ Resultado[c]=cadena[i]; c++; }

Page 177: Fundamento de Programacion en C++

Inicializamos a la variable c a cero. La variable fin representa hasta donde se va a extraer, es inicio

menos uno más la cantidad de caracteres a extraer.

En el bucle for la variable i comienza en inicio menos uno hasta fin y se va asignando a resultado el

contenido carácter a carácter. La variable c representa el índice de la variable resultado.

Resultado[c]='\0';

Demarcamos el final de la cadena.

printf("\n\nLa cadena extraida es %s\n\n", Resultado);

Mostramos por pantalla el resultado.

Supongamos que los datos ingresados en el programa son los siguientes:

cadena=”JUAN PEREZ”

inicio=6

nrocar=4

Entonces:

c=0

fin = ( 6 - 1 ) + 4 = 9

i=5

Page 178: Fundamento de Programacion en C++

i c Resultado[c]

5 0 P

6 1 E

7 2 R

8 3 E

Page 179: Fundamento de Programacion en C++

Capítulo 10

EJERCICIOS DE AUTOEVALUACION

10.1 Arreglos Unidimensionales

10.2 Arreglos Bidimensionales

10.3 Cadenas

10.4 Ejercicios Varios

Page 180: Fundamento de Programacion en C++

10.1 Arreglos Unidimensionales

/**********************Inicio del Programa*************************** Ejercicio 01: Se tiene un vector de 20 elementos de tipo entero. Genere y muestre en el vector numeros aleatorios entre el 50 y 150. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int Longitud=20; int A[Longitud], tiempo, desde, hasta, i, mayor; tiempo=time(NULL); srand(tiempo); desde=50; hasta=150; for(i=0 ; i<Longitud ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 02: Se tiene un vector de N elementos de tipo entero con numeros al azar. Calcule y muestre la suma y promedio del vector. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, S; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo);

Page 181: Fundamento de Programacion en C++

desde=2; hasta=19; S=0; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); S+=A[i]; } printf("\n\nSuma del Vector: %d", S); printf("\nPromedio del Vector: %8.2lf\n\n", S/double(N)); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 03: Se tiene un vector de N elementos de tipo entero con numeros al azar. Muestre el Mayor y Menor elemento con sus respectivas posiciones dentro del vector. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, mayor, menor, posmay, posmen; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; mayor=desde; menor=hasta; posmay=posmen=0; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); if(A[i] > mayor){ mayor=A[i]; posmay=i + 1; } if(A[i] < menor){

Page 182: Fundamento de Programacion en C++

menor=A[i]; posmen=i + 1; } } printf("\n\nMayor elemento del Vector: %d posicion: %d", mayor, posmay); printf("\nMenor elemento del Vector: %d posicion: %d\n\n", menor, posmen); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 04: Se tiene un vector de N elementos de tipo entero con numeros al azar. Diga cuantos numeros pares e impares hay. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, cp, ci; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; cp=ci=0; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); if(A[i] % 2 ==0)cp++; else ci++; } printf("\n\nCantidad de elementos Pares: %d", cp); printf("\nantidad de elementos Impares: %d\n\n", ci); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa***************************

Page 183: Fundamento de Programacion en C++

Ejercicio 05: Se tiene un vector de n elementos, muestre los elementos múltiplos de su índice. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } printf("\n\n"); //i=1, para evitar la division sobre cero for(i=1 ; i<N ; i++) if(A[i] % i ==0) printf("\nA[%d] = %d es multiplo de %d", i, A[i], i); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 06: Se tiene un vector de 50 elementos con numeros al azar se desea llevar dicho contenido a otros 2 vectores uno con todos los múltiplos de 5 y el otro con los números no múltiplos de 5. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], M5[LongitudMax], NM5[LongitudMax], tiempo, desde, hasta, i;

Page 184: Fundamento de Programacion en C++

int N, c5, cn5; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; c5=cn5=0; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); if(A[i] % 5 ==0){ M5[c5]=A[i]; c5++; }else{ NM5[cn5]=A[i]; cn5++; } } printf("\n\nMultiplos de 5\n\n"); for(i=0 ; i<c5 ; i++) printf("%d\t ", M5[i]); printf("\n\nNO Multiplos de 5\n\n"); for(i=0 ; i<cn5 ; i++) printf("%d\t ", NM5[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 07:Se tiene un vector con n elementoscon numeros al azar, realice el proceso de invertir el contenido de dicho vector. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, aux; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin);

Page 185: Fundamento de Programacion en C++

printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } printf("\n\nInvirtiendo contenido...\n\n"); for(i=0 ; i<N/2 ; i++) { aux=A[i]; A[i]=A[N-i-1]; A[N-i-1]=aux; } printf("Vector Invertido\n\n"); for(i=0 ; i<N ; i++) printf("%d\t",A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 08: Se tiene un vector de N elementos de tipo entero con numeros al azar. Diga si el promedio de los numeros pares es mayor al promedio de los numeros impares hay. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, cp, ci, sp, si; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19;

Page 186: Fundamento de Programacion en C++

cp=ci=sp=si=0; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); if(A[i]%2==0){ cp++; sp+=A[i]; }else{ ci++; si+=A[i]; } } if(sp/double(cp) > si/double(ci)) printf("\n\nEl promedio de los Pares es mayor"); else printf("\n\nEl promedio de los Impares es mayor"); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 09: Se tiene un vector de N elementos de tipo entero con numeros al azar. Realice la insercion de un elemento por posicion. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, nro_insertar, posicion; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%4d", A[i]); } printf("\n\nIngrese nro a insertar.."); scanf("%d",&nro_insertar); printf("\nIngrese nro de posicion a insertar.."); scanf("%d",&posicion);

Page 187: Fundamento de Programacion en C++

for(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i]; A[posicion-1] = nro_insertar; N++; printf("\n\nEl nro ha sido insertado\n\n"); for(i=0 ; i<N ; i++) printf("%4d", A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 188: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 10: Se tiene un vector de N elementos de tipo entero con numeros al azar. Muestre la cantidad de digitos pares e impares que existe en el vector. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, cdp, cdi, nro, u; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i] = desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } cdp=cdi=0; for(i=0;i<N;i++){ nro=A[i]; do{ u=nro%10; nro=nro/10; if(u%2==0) cdp++; else cdi++; }while(nro>0); } printf("\n\nCantidad de digitos Pares es..%d", cdp); printf("\nCantidad de digitos Impares es..%d", cdi); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 189: Fundamento de Programacion en C++
Page 190: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 12: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar el ordenamiento burbuja. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, nro, aux; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i] = desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } //ORDENAMIENTO BURBUJA(Ascendente) for(i=0 ; i<N-1 ; i++) for(j=i+1 ; j<N ; j++) if(A[i] > A[j]){ aux=A[i]; A[i]=A[j]; A[j]=aux; } printf("\nVector Ordenado Ascendente..\n\n"); for(i=0;i<N;i++) printf("%d\t", A[i]); //ORDENAMIENTO BURBUJA(Descendente) for(i=0 ; i<N-1 ; i++) for(j=i+1 ; j<N ; j++) if(A[i] < A[j]){ aux = A[i]; A[i]= A[j]; A[j]= aux; } printf("\nVector Ordenado..Descendente..\n\n"); for(i=0;i<N;i++) printf("%d\t", A[i]); printf("\n\n"); system("PAUSE");

Page 191: Fundamento de Programacion en C++

} /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 12: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar realizar la insercion ordenada de un elemento. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, nro, aux; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i] = desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } printf("\n\nIngrese nro a insertar..");scanf("%d",&nro); //ORDENAMIENTO BURBUJA(Ascendente) for(i=0 ; i<N-1 ; i++) for(j=i+1 ; j<N ; j++) if(A[i] > A[j]){ aux=A[i]; A[i]=A[j]; A[j]=aux; } for(i=0 ; i < N && A[i] < nro ; i++); for(j=N-1 ; j>=i ; j--) A[j+1] = A[j]; A[j+1]=nro;

Page 192: Fundamento de Programacion en C++

N++; printf("\n\n\n"); for(i=0 ; i<N ; i++) printf("%d\t", A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 13: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar realizar la eliminacion de elementos por valor. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, k, nro, aux; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i] = desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } printf("\n\nIngrese nro a eliminar.."); scanf("%d",&nro); fflush(stdin); for(i=0 ; i<N ; i++) if(nro==A[i]){ for(j=i+1 ; j<N ; j++) A[j-1]=A[j]; N--; i--; printf("\nHa sido Eliminado.."); //Descomentar break; si solo se quiere eliminar un solo elemento //break; } printf("\n\n\n");

Page 193: Fundamento de Programacion en C++

for(i=0 ; i<N ; i++) printf("%d\t", A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 14: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar la eliminacion de elementos repetidos. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, k, nro, aux; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i] = desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } //Ordenamiento Burbuja, solo para efecto de visualizacion for(i=0 ; i<N-1 ; i++) for(j=i+1 ; j<N ; j++) if(A[i] > A[j]){ aux=A[i]; A[i]=A[j]; A[j]=aux; } printf("\n\nVector Ordenado\n\n"); for(i=0 ; i<N ; i++) printf("%d\t", A[i]); printf("\n\n"); //Eliminacion for(i=0 ; i<N-1 ; i++)

Page 194: Fundamento de Programacion en C++

for(j=i+1 ; j<N ; j++) if(A[i]==A[j]){ for(k=j+1;k<N;k++) A[k-1]=A[k]; N--; j--; printf("\nEliminado %d", A[i]); } printf("\n\n\nVector sin elementos repetidos\n\n\n"); for(i=0 ; i<N ; i++) printf("%d\t", A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 195: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 15: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar la eliminacion de elementos por posicion. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, posicion; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ A[i] = desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } printf("\n\nIngrese # de posicion a Eliminar.."); scanf("%d",&posicion); fflush(stdin); for(i=0 ; i<N ; i++) if(i == posicion-1){ for(j=i+1 ; j<N ; j++) A[j-1] = A[j]; N--; printf("Ha sido Eliminado!.."); } printf("\n\n\n"); for(i=0 ; i<N ; i++) printf("%d\t", A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa***************************

Page 196: Fundamento de Programacion en C++

Ejercicio 16: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar la generacion ordenada de elementos. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, k, nro; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0 ; i<N ; i++){ nro = desde + rand() % (1 + hasta - desde); //Modificar el for para ordenar descendente //for(j=0 ; j<i && A[j] > nro ; j++); for(j=0 ; j<i && A[j] < nro ; j++); for(k=i-1 ; k>=j ; k--) A[k+1]=A[k]; A[k+1]=nro; } for(i=0 ; i<N ; i++) printf("%d\t", A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 17: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar la generacion de elementos sin repeticion. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h"

Page 197: Fundamento de Programacion en C++

void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, k, nro; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; i=0; do{ nro = desde + rand() % (1 + hasta - desde); for(j=0 ; j<i && A[j]!=nro ; j++); if(A[j]!=nro){ for(k=i-1 ; k>=j ; k--) A[k+1]=A[k]; A[k+1]=nro; i++; } }while(i<N); for(i=0 ; i<N ; i++) printf("%d\t", A[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 18: Aplicar la teoría de vectores paralelos, realice lo siguiente: X[0] + Y[9] = Z[0] X[1] + Y[8] = Z[1] X[2] + Y[7] = Z[2] . . . . . . X[9] + Y[0] = Z[9] *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h"

Page 198: Fundamento de Programacion en C++

void main(){ const int LongitudMax = 50; int A[LongitudMax], B[LongitudMax], C[LongitudMax], tiempo, desde, hasta, i; int N, j, k, nro; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); desde=2; hasta=19; for(i=0;i<N;i++){ A[i]=desde + rand() % (1 + hasta - desde); B[i]=desde + rand() % (1 + hasta - desde); } for(i=0;i<N;i++) C[i]= A[i] + B[N-i-1]; for(i=0;i<N;i++) printf("\n%d\t+\t%d\t=\t%d\t", A[i], B[i], C[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 19: Se tiene un vector de N elementos de tipo entero con numeros al azar. Se pide realizar un programa para determinar si un vector esta ordenado o no. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax = 50; int A[LongitudMax], tiempo, desde, hasta, i; int N, j, k, nro; printf("\nIngrese numero de elementos: "); scanf("%d", &N); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo);

Page 199: Fundamento de Programacion en C++

desde=2; hasta=19; for(i=0;i<N;i++){ A[i]=desde + rand() % (1 + hasta - desde); printf("%d\t", A[i]); } for(i=0 ; i<N-1 && A[i]<=A[i+1] ; i++); if(i == N-1){ printf("\nVector Ordenado Ascendentemente"); printf("\n\n"); system("PAUSE"); exit(0); } for(i=0 ; i<N-1 && A[i]>=A[i+1] ; i++); if(i==N-1){ printf("\nVector Ordenado Descendentemente"); printf("\n\n"); system("PAUSE"); exit(0); } printf("\nVector Desordenado"); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 20: Se dice que en un salon de N alumnos de un colegio, se encontraban en una incertidumbre porque no sabian quien era el encargado que tenia que ir a hablar con el director para pedir la autorizacion para la fiesta de promocion. No obstante contaban con dos dados y decidieron ponerlo al azar, entonces los alumnos se colocaron en un circulo en orden alfabetico a jugar para seleccionar al alumno que tenia la dificil mision. El juego consiste en seleccionar al azar el alumno que empieza, el lanzaba los dados y el resultado era las posiciones que se tenia que avanzar incluyendose el mismo hacia el lado izquierdo el alumno es deacartado pero antes de salir de su posicion tira los dados, el juego acaba cuando queda un solo alumno. *********************************************************************/ #include <iostream> using namespace std;

Page 200: Fundamento de Programacion en C++

#include "stdlib.h" #include "time.h" void main(){ const int LongitudMax=50; int N, salvado, turno, cg, c, i, desde, hasta; int a[LongitudMax], tiempo; printf("\nIngrese numero de alumnos: "); scanf("%d", &N); fflush(stdin); for(i=0;i<N;i++) a[i]=0; tiempo=time(NULL); srand(tiempo); printf("\n"); cg=0; salvado=0; desde=1; hasta=6; for(cg=1 ; cg<=N-1 ; cg++){ for(i=0 ; i<N ; i++) if(a[i]!=1) printf("%d\t", i+1); turno = desde + rand() % (1 + hasta - desde); printf("\n\rEl alumno %d saco con el dado %d", salvado + 1, turno); c=0; do{ c++; salvado++; if(salvado > N-1) salvado=0; if(a[salvado]== 1 ) c--; }while(c < turno); a[salvado]=1; printf("\t\t\tSe salvo el alumno %d\n\n", salvado + 1); getchar(); } for(i=0 ; i<N ; i++){ if(a[i]!=0)continue; printf("\n\n\rEl alumno %d y tiene que ir a hablar con el director\n\n", i+1); } system("PAUSE"); } /***************************Fin del Programa****************************/

Page 201: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 21: Mostrar la cantidad de veces que se repite los numeros entre (a-b) en el vector. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int LongitudMax=50; int a[LongitudMax], N, i, j, c, tiempo, desde, hasta; printf("\n\rIngrese cantidad de # que tendra el vector..."); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese numero minimo de los elementos..."); scanf("%d", &desde); fflush(stdin); printf("\n\rIngrese numero maximo de los elementos..."); scanf("%d", &hasta); fflush(stdin); printf("\n\n"); tiempo=time(NULL); srand(tiempo); for(i=0;i<N;i++){ a[i]=desde + rand() % (1 + hasta - desde); printf("%d\t",a[i]); } for(i=desde;i<=hasta;i++){ c=0; for(j=0;j<N;j++){ if(a[j]!=i) continue; c++; } if(c > 0) printf("\n\r%d Se repite...%d veces", i, c); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

10.2 Arreglos Bidimensionales

/**********************Inicio del Programa***************************

Page 202: Fundamento de Programacion en C++

Ejercicio 1: Se tiene una matriz de orden N*M de tipo entero, se pide generar numeros aleatorios entre 1 y 16 en la matriz. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=16; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 203: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 2: Se tiene una matriz de orden N*M de tipo entero con numeros al azar, se pide encontrar el mayor y menor elemento de toda la matriz. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int Mayor, Menor; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=16; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } Mayor=desde; Menor=hasta; for(fila=0 ; fila<N ; fila++) for(columna=0 ; columna<M ; columna++){ if(A[fila][columna] > Mayor) Mayor = A[fila][columna]; if(A[fila][columna] < Menor) Menor = A[fila][columna]; } printf("\n\n\nEl Mayor elemento: %d", Mayor); printf("\nEl Menor elemento: %d\n\n", Menor); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 3: Se tiene una matriz de orden N*M de tipo entero con numeros al azar, se pide encontrar el mayor y menor elemento por fila y por columna.

Page 204: Fundamento de Programacion en C++

*********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int Mayor, Menor; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=16; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } printf("\n\n\nEl Mayor y Menor elemento por filas...\n\n"); for(fila=0 ; fila<N ; fila++){ Mayor=desde; Menor=hasta; for(columna=0 ; columna<M ; columna++){ if(A[fila][columna] > Mayor) Mayor = A[fila][columna]; if(A[fila][columna] < Menor) Menor = A[fila][columna]; } printf("\nFila: %d -> Mayor: %d\t Menor: %d", fila + 1, Mayor, Menor); } printf("\n\n\nEl Mayor y Menor elemento por Columnas...\n\n"); for(columna=0 ; columna<M ; columna++){ Mayor=desde; Menor=hasta; for(fila=0 ; fila<N ; fila++){ if(A[fila][columna] > Mayor) Mayor = A[fila][columna]; if(A[fila][columna] < Menor) Menor = A[fila][columna]; } printf("\nColumna: %d -> Mayor: %d\t Menor: %d", columna + 1, Mayor, Menor); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 205: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 4: Se tiene una matriz de orden N*M de tipo entero con numeros al azar, se pide encontrar el promedio de la matriz. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int S; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=16; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } S=0; for(fila=0 ; fila<N ; fila++) for(columna=0 ; columna<M ; columna++) S+= A[fila][columna]; printf("\n\nEl Promedio de la Matriz: %8.2lf\n\n", double(S) / (N*M) ); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 5: Se tiene una matriz de orden N*M de tipo entero con numeros al azar, se pide encontrar la suma de los elementos de la periferie de la matriz. *********************************************************************/

Page 206: Fundamento de Programacion en C++

#include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int S; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } S=0; for(fila=0 ; fila<N ; fila++){ S+= A[fila][0]; S+= A[fila][M-1]; } for(columna=1 ; columna<M-1 ; columna++){ S+= A[0][columna]; S+= A[N-1][columna]; } printf("\n\nLa Suma de la periferie de la Matriz: %d\n\n", S ); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 6: Se tiene una matriz de orden N*M de tipo entero con numeros al azar, se pide encontrar la suma de los elementos que no pertenecen la periferie de la matriz. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h"

Page 207: Fundamento de Programacion en C++

void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int S; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } S=0; for(fila=1 ; fila<N-1 ; fila++) for(columna=1 ; columna<M-1 ; columna++) S+= A[fila][columna]; printf("\n\nLa Suma de la No periferie de la Matriz: %d\n\n", S ); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 7: Se tiene una matriz cuadrada de orden N de tipo entero con numeros al azar, Mostrar la suma de los elementos de la diagonal principal y la suma de la diagonal secundaria. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int SP, SS; printf("\n\rIngrese orden de la matriz: "); scanf("%d", &N); fflush(stdin);

Page 208: Fundamento de Programacion en C++

tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } SP=SS=0; for(fila=0 ; fila<N ; fila++){ SP+= A[fila][fila]; SS+= A[fila][N-fila-1]; } printf("\n\nLa Suma de la diagonal Principal: %d", SP ); printf("\nLa Suma de la diagonal Secundaria: %d\n\n", SS ); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 209: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 8: Se tiene una matriz de orden N*M de tipo entero con numeros al azar, se pide realizar el concepto de matriz transpuesta. *********************************************************************/ /* ANALISIS: Matriz transpuesta es transponer los elementos de las filas a las columnas y viceversa. */ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], B[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } printf("\n\nMatriz Transpuesta...\n\n"); for(fila=0 ; fila<M ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++){ B[fila][columna] = A[columna][fila]; printf("\t%d", B[fila][columna]); } } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 210: Fundamento de Programacion en C++
Page 211: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 9: Se tiene una matriz cuadrada de orden N de tipo entero con numeros al azar, se pide realizar la suma de la matriz triangular superior. *********************************************************************/ /* ANALISIS: Matriz triangular superior son los elementos por encima de la diagonal principal inclusive. Ejm: Matriz 2 3 4 1 3 2 3 2 4 Matriz triangular superior: 1 3 4 3 2 4 */ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N; int tiempo, desde, hasta, fila, columna; int S; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } S=0; for(fila=0 ; fila<N ; fila++) for(columna=fila ; columna<N ; columna++) S+=A[fila][columna]; printf("\n\nSumatoria de la Matriz Triangular Superior %d\n\n", S); system("PAUSE"); }

Page 212: Fundamento de Programacion en C++

/***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 10: Se tiene una matriz cuadrada de orden N de tipo entero con numeros al azar, se pide realizar la suma de la matriz triangular inferior. *********************************************************************/ /* ANALISIS: Matriz triangular inferior son los elementos por debajo de la diagonal principal inclusive. Ejm: Matriz 2 3 4 1 3 2 3 2 4 Matriz triangular inferior: 2 1 3 3 2 4 */ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N; int tiempo, desde, hasta, fila, columna; int S; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } S=0;

Page 213: Fundamento de Programacion en C++

for(columna=0 ; columna<N ; columna++) for(fila=columna ; fila<N ; fila++) S+=A[fila][columna]; printf("\n\nSumatoria de la Matriz Triangular Inferior %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 11: Se tiene una matriz cuadrada de orden N de tipo entero con numeros al azar, se pide realizar la suma de los elementos que no pertencen a la matriz triangular superior. *********************************************************************/ /* ANALISIS: No Matriz triangular superior son los elementos por debajo de la diagonal principal. Ejm: Matriz 2 3 4 1 3 2 3 2 4 No Matriz triangular superior: 1 3 2 */ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N; int tiempo, desde, hasta, fila, columna; int S; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); }

Page 214: Fundamento de Programacion en C++

} S=0; for(columna=0 ; columna<N-1 ; columna++) for(fila=columna+1 ; fila<N ; fila++) S+=A[fila][columna]; printf("\n\nSumatoria de la No Matriz Triangular Superior %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 12: Se tiene una matriz cuadrada de orden N de tipo entero con numeros al azar, se pide realizar la suma de los elementos que no pertencen a las diagonales. *********************************************************************/ /* ANALISIS: No diagonales son los elementos que no se encuentran en la diagonal principal y la secundaria. Ejm: Matriz 2 3 4 1 3 2 3 2 4 No diagonales: 3 1 2 2 */ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N; int tiempo, desde, hasta, fila, columna; int S; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); tiempo=time(NULL); srand(tiempo);

Page 215: Fundamento de Programacion en C++

desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } S=0; for(fila=0 ; fila<N ; fila++) for(columna=0 ; columna<N ; columna++) if(fila!=columna && fila!= N-columna-1) S+=A[fila][columna]; printf("\n\nSumatoria de la No diagonales %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 216: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 13: Se tiene una matriz cuadrada de orden N de tipo entero con numeros al azar, se pide intercambiar el contenido de sus diagonales. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N; int tiempo, desde, hasta, fila, columna; int aux; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } for(fila=0;fila<N;fila++){ aux=A[fila][fila]; A[fila][fila]=A[fila][N-fila-1]; A[fila][N-fila-1]=aux; } printf("\n\nDiagonales Intercambiadas\n\n"); for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<N ; columna++) printf("\t%d", A[fila][columna]); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 14: Se tiene una matriz orden N*M de tipo entero con numeros al azar, se pide invertir el contenido de sus columnas.

Page 217: Fundamento de Programacion en C++

*********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int aux; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } for(fila=0 ; fila<N/2 ; fila++) for(columna=0 ; columna<M ; columna++){ aux = A[fila][columna]; A[fila][columna] = A[N-fila-1][columna]; A[N-fila-1][columna] = aux; } printf("\n\nColumnas Invertidas\n\n"); for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++) printf("\t%d", A[fila][columna]); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 15: Se tiene una matriz orden N*M de tipo entero con numeros al azar, se pide mostrar el promedio de los elementos pares e impares siempre y cuando la suma de sus indices sea par e impar respectivamente.

Page 218: Fundamento de Programacion en C++

*********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; int sp, si, cp, ci; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } } sp=cp=si=ci=0; for(fila=0;fila<N;fila++) for(columna=0;columna<M;columna++) if((fila+columna)%2==0 && A[fila][columna]%2==0){ sp+=A[fila][columna]; cp++; } else{ si+=A[fila][columna]; ci++; } printf("\n\nEl promedio de los pares es...%8.1lf",sp/double(cp)); printf("\nEl promedio de los impares es...%8.1lf\n\n",si/double(ci)); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 16: Se tiene una matriz de orden N*M y otra de orden M*Q ambos de tipo entero con numeros al azar, se pide realizar el concepto de Producto de Matrices. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h"

Page 219: Fundamento de Programacion en C++

#include "time.h" void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax], B[OrdenMax][OrdenMax],C[OrdenMax][OrdenMax], N, M, Q; int tiempo, desde, hasta, filaA, columnaA, filaB, columnaB ; int S; printf("\n\rIngrese N de filas de la matriz 1: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese M columnas de la matriz 1: "); scanf("%d", &M); fflush(stdin); printf("\n\rIngrese Q columnas de la matriz 2: "); scanf("%d", &Q); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=5; printf("\n\n Matriz 1 N*M\n\n"); for(filaA=0 ; filaA<N ; filaA++){ printf("\n\t"); for(columnaA=0 ; columnaA<M ; columnaA++){ A[filaA][columnaA] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[filaA][columnaA]); } } printf("\n\n Matriz 2 M*Q\n\n"); for(filaB=0 ; filaB<M ; filaB++){ printf("\n\t"); for(columnaB=0 ; columnaB<Q ; columnaB++){ B[filaB][columnaB] = desde + rand() % (1 + hasta - desde); printf("\t%d", B[filaB][columnaB]); } } printf("\n\n Matriz Resultado 3 N*Q\n\n"); for(filaA=0 ; filaA<N ; filaA++){ printf("\n\t"); for(columnaB=0 ; columnaB<Q ; columnaB++){ S=0; for(columnaA=0 ; columnaA<M ; columnaA++) S+=A[filaA][columnaA] * B[columnaA][columnaB]; C[filaA][columnaB]=S; printf("\t%d", C[filaA][columnaB]); } } printf("\n\n \n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 220: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 17: Se tiene una matriz cuadrada de orden N tipo entero, se pide realizar el concepto del Cuadrado Magico. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int OrdenMax = 10; int A[OrdenMax][OrdenMax],N; int fila, columna, c, i ; printf("\n\rIngrese orden N de la matriz (Impar): "); scanf("%d", &N); fflush(stdin); fila=0; c=N/2; for(i=1;i<=N*N;i++){ A[fila][c]=i; if(i%N==0)fila++; else{ if(fila==0) fila=N-1; else fila--; if(c==N-1) c=0; else c++; } } for(fila=0;fila<N;fila++){ printf("\n\n"); for(c=0;c<N;c++) printf("\t%d",A[fila][c]); } printf("\n\n \n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 221: Fundamento de Programacion en C++

10.3 Cadenas

/**********************Inicio del Programa*************************** Ejercicio 1: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion longitud. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; int L; printf("\n\rIngrese cadena: "); gets(cadena); fflush(stdin); for(L=0 ; cadena[L]!='\0' ; L++); printf("\n\nLa longitud es %d\n\n", L); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 2: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion extraer. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax], Resultado[LongitudMax]; int i, inicio, fin, nrocar, c; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\n\rPosicion de Inicio a Extraer: "); scanf("%d", &inicio); fflush(stdin); printf("\n\rNumero de caracteres a Extraer: "); scanf("%d", &nrocar); fflush(stdin); c=0; fin=(inicio-1) + nrocar; for(i=inicio-1 ; i < fin ; i++){ Resultado[c]=cadena[i]; c++; } Resultado[c]='\0'; printf("\n\nLa cadena extraida es %s\n\n", Resultado);

Page 222: Fundamento de Programacion en C++

system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 3: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion izquierda. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax], Resultado[LongitudMax]; int i, nrocar, c; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\n\rNumero de caracteres a Extraer: "); scanf("%d", &nrocar); fflush(stdin); c=0; for(i=0 ; i<nrocar; i++){ Resultado[c]=cadena[i]; c++; } Resultado[c]='\0'; printf("\n\nLa cadena extraida es %s\n\n", Resultado); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 4: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion derecha. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax], Resultado[LongitudMax]; int i, nrocar, c, L; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\n\rNumero de caracteres a Extraer: "); scanf("%d", &nrocar);

Page 223: Fundamento de Programacion en C++

fflush(stdin); L=strlen(cadena); c=0; for(i=L-nrocar ; cadena[i]!='\0' ; i++){ Resultado[c]=cadena[i]; c++; } Resultado[c]='\0'; printf("\n\nLa cadena extraida es %s\n\n", Resultado); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 5: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion concatenar. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena1[LongitudMax], cadena2[LongitudMax], Resultado[LongitudMax]; int i, c, L; printf("\n\rIngrese Cadena 1: "); gets(cadena1); fflush(stdin); printf("\n\rIngrese Cadena 2: "); gets(cadena2); fflush(stdin); L=strlen(cadena1); c=0; for(i=0 ; i<L ; i++){ Resultado[c]=cadena1[i]; c++; } L=strlen(cadena2); for(i=0 ; i<L ; i++){ Resultado[c]=cadena2[i]; c++; } Resultado[c]='\0'; printf("\n\nLa cadena resultado es:\n\n%s\n\n", Resultado); system("PAUSE"); }

Page 224: Fundamento de Programacion en C++

/***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 6: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion comparar. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena1[LongitudMax], cadena2[LongitudMax]; int i, L1, L2; printf("\n\rIngrese Cadena: "); gets(cadena1); fflush(stdin); printf("\n\rIngrese Cadena: "); gets(cadena2); fflush(stdin); L1=strlen(cadena1); L2=strlen(cadena2); for(i=0 ; cadena1[i]!='\0' && cadena1[i]==cadena2[i] ; i++); if(i==L1 && i==L2) printf("\n\nLa cadena son iguales\n\n"); else printf("\n\nLa cadena son distintas\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 7: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion ascii y chr. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char caracter; int N; printf("\n\rIngrese caracter: "); caracter=getchar(); fflush(stdin); printf("\n\rIngrese numero: "); scanf("%d",&N); fflush(stdin);

Page 225: Fundamento de Programacion en C++

printf("\n\nCodigo Ascii de caracter: %d", int(caracter)); printf("\nCaracter de Numero: %c\n\n", char(N)); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 8: Ingrese una cadena de caracteres por teclado, desarrolle la simulacion de la funcion mayuscula y minuscula. *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax], Resultado1[LongitudMax], Resultado2[LongitudMax]; int i, L; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); L=strlen(cadena); for(i=0 ; i<L ; i++){ //Hacia Mayusculas if(cadena[i]>='a' && cadena[i]<='z') Resultado1[i]=char(int(cadena[i]) - 32); else Resultado1[i]=cadena[i]; //Hacia Minusculas if(cadena[i]>='A' && cadena[i]<='Z') Resultado2[i]=char(int(cadena[i]) + 32); else Resultado2[i]=cadena[i]; } Resultado1[L]='\0'; Resultado2[L]='\0'; printf("\n\nLa cadena mayuscula es: %s", Resultado1); printf("\nLa cadena minuscula es: %s\n\n", Resultado2); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 226: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 9: Ingrese una cadena de caracteres por teclado, muestrelo de la siguiente forma: Palabra=> WORD Salida: W O R D *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; int i, L; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); L=strlen(cadena); for(i=0 ; i<L ; i++) printf("\n\t%c", cadena[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 10: Ingrese una cadena de caracteres por teclado, muestrelo de la siguiente forma: Palabra=> EXCEL Salida: E EX EXC EXCE EXCEL *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; int i, j, L;

Page 227: Fundamento de Programacion en C++

printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); L=strlen(cadena); for(i=0 ; i<L ; i++){ printf("\n\t"); for(j=0 ; j<=i ; j++) printf("%c", cadena[j]); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 11: Ingrese una cadena de caracteres por teclado, muestrelo de la siguiente forma: Palabra=> EXCEL Salida: E XX CCC EEEE LLLLL *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; int i, j, L; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); L=strlen(cadena); for(i=0 ; i<L ; i++){ printf("\n\t"); for(j=0 ; j<=i ; j++) printf("%c", cadena[i]); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 228: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 12: Ingrese una cadena de caracteres por teclado, muestrelo de la siguiente forma: Palabra=> HOLA Salida: HHHH OOO LL A *********************************************************************/ #include <iostream> using namespace std; void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; int i, j, L; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); L=strlen(cadena); for(i=L-1 ; i>=0 ; i--){ printf("\n\t"); for(j=0 ; j<=i ; j++) printf("%c", cadena[L-i-1]); } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 13: Ingrese una cadena de caracteres por teclado, realice una funcion que elimine el primer y ultimo caracter de cada palabra. *********************************************************************/ #include <iostream> using namespace std; //Funcion para eliminar el primer y ultimo caracter de cada palabra char *elimina(char cad[]){ int i,j,k; i=strlen(cad); //i-1 para que no considere al ultimo caracter DE LA ULTIMA PALABRA for(j=0 ; j<i-1 ; j++) if(j==0){ //j==0 para que elimine al primer caracter

Page 229: Fundamento de Programacion en C++

for(k=j+1 ; k<i ; k++) cad[k-1]=cad[k]; k--; i--; }else if(cad[j]==' '){ for(k=j ; k<i ; k++) //elimina el caracter anterior al espacio cad[k-1]=cad[k]; for(k=j+1 ; k<i ; k++) //elimina el caracter posterior al espacio cad[k-1]=cad[k]; k-=2; i-=2; } cad[j]='\0'; return(cad); } //Procedimiento Principal void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\nEliminacion de 1er y ultimo caracter"); printf(" de cada palabra..\n\n%s\n\n",elimina(cadena)); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 14: Ingrese una cadena de caracteres por teclado, realice una funcion que elimine todas las vocales de la cadena. *********************************************************************/ #include <iostream> using namespace std; //funcion para eliminar las vocales char *sinvocal(char cad[]){ int i,j,k; char car; i=strlen(cad); for(j=0;j<i;j++){ car=tolower(cad[j]); if(car=='a'|| car=='e'|| car=='i'|| car=='o'|| car=='u'){ for(k=j+1;k<i;k++)

Page 230: Fundamento de Programacion en C++

cad[k-1]=cad[k]; j--; i--; } } return (cad); } //Procedimiento Principal void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\nFrase sin vocales..\n\n%s\n\n", sinvocal(cadena)); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 15: Ingrese una palabra, realice una funcion que diga si la palabra es palindromo o no. Recordar que una palabra es palindromo si se lee igual de izquierda a derecha y viceversa. Ejemplo: reconocer-> Es palindromo *********************************************************************/ #include <iostream> using namespace std; bool palindromo(char cad[]){ int i, L; char car; L=strlen(cad); for(i=0 ; cad[i]==cad[L-i-1] ; i++); return i==L; } void main(){ const int LongitudMax = 100; char cadena[LongitudMax]; printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); palindromo(cadena) ? printf("\n\nEs Palindromo\n\n"): printf("\n\nNo es Palindromo\n\n") ; system("PAUSE"); } /***************************Fin del Programa****************************/

Page 231: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 16: Ingrese una cadena de caracteres, realice una funcion que elimine los espacios, la funcion debe retornar la cantidad de espacios eliminados. Ejemplo: " Si tienes alguna duda sobre el uso de este programa, acude a la pagina oficial del programa, o pregunta en la lista de correo " Resultado "Si tienes alguna duda sobre el uso de este programa, acude a la pagina oficial del programa, o pregunta en la lista de correo" La funcion devolvera: 12 *********************************************************************/ #include <iostream> using namespace std; //Procedimiento para reemplazar espacios void reemplaza_espacios(char cad[], char car){ int i, L; L=strlen(cad); for(i=0 ; i<L; i++) if(cad[i]==' ') cad[i]=car; } //Funcion para eliminar espacios int elimina_espacios(char cad[], char car){ int i, j, L, p, can; L=strlen(cad); can=0; for(i=0 ; i<L; i++) if(cad[i]==car && cad[i+1]==car){ for(j=i+2 ; j<L ; j++) cad[j-1]=cad[j]; i--; L--; can++; cad[L]='\0'; } for(p=1;p<=2;p++){ (p==1) ? i=0: i=L-1; if(cad[i]==car){

Page 232: Fundamento de Programacion en C++

for(j=i+1 ; j<L ; j++) cad[j-1]=cad[j]; L--; can++; cad[L]='\0'; } } return can; } void main(){ const int LongitudMax = 100; char cadena[LongitudMax], espacio_reemplazo='_'; int can; printf("\n\rIngrese Cadena:\n"); gets(cadena); fflush(stdin); reemplaza_espacios(cadena, espacio_reemplazo); printf("\n\nCadena con espacios reemplazados:\n%s", cadena); can=elimina_espacios(cadena, espacio_reemplazo); printf("\n\nCadena Procesada:\n%s", cadena); printf("\n\nEspacios Eliminados: %d\n\n", can); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 233: Fundamento de Programacion en C++

10.4 Ejercicios Varios

/**********************Inicio del Programa*************************** Ejercicio 1: SIMPLIFICADOR DE PALABRAS Elaborar un programa que simplifique una expresion formada con las letras A, B, C y E, de acuerdo con la sgte tabla de multiplicacion: P E A B C E E A B C A A B C E B B C E A C C E A B El significado de esta tabla es la sgte: Si se ingresa :AB El resultado es :C (ya que el producto<interseccion> de AB es C) Si se ingresa :AACB El resultado es :C Pues AA es igual a B, BC es igual a A y finalmente AB es vale C. *********************************************************************/ /* ANALISIS: Se toman dos caracteres entonces segun la tabla fijarse en la primera fila y en la primera columna entonces el resultado esta en la interseccion. Ejemplo: Ingreso: AB _ _ A _ _ _ _ _ _ _ B _ C _ _ _ _ _ _ _ Ingreso: BC _ _ _ _ C _ _ _ _ _ B _ _ _ A _ _ _ _ _ */ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ char tabla[5][5], cad[50],val; int i,j,k,l,lon;

Page 234: Fundamento de Programacion en C++

bool sw=false; //creando tabla de multiplicacion tabla[0][0]='P';tabla[0][1]='E';tabla[0][2]='A';tabla[0][3]='B';tabla[0][4]='C'; tabla[1][0]='E';tabla[1][1]='E';tabla[1][2]='A';tabla[1][3]='B';tabla[1][4]='C'; tabla[2][0]='A';tabla[2][1]='A';tabla[2][2]='B';tabla[2][3]='C';tabla[2][4]='E'; tabla[3][0]='B';tabla[3][1]='B';tabla[3][2]='C';tabla[3][3]='E';tabla[3][4]='A'; tabla[4][0]='C';tabla[4][1]='C';tabla[4][2]='E';tabla[4][3]='A';tabla[4][4]='B'; printf("\nIngrese cadena..."); gets(cad); fflush(stdin); lon=strlen(cad); //validando caracteres for(i=0;i<lon;i++) if(cad[i]!='A' && cad[i]!='B' && cad[i]!='C' && cad[i]!='E' && cad[i]!=' '){ printf("\nError Caracter %c no permitido!",cad[i]); exit(0); } //Operacion for(k=0;k<lon;k++)//k-> cadena ingresada for(i=1;i<5;i++){//filas de la matriz if(cad[k] != tabla[i][0]) continue; for(j=1;j<5;j++){//columnas de la matriz if(cad[k+1] != tabla[0][j])continue; val=tabla[i][j]; printf("\n%c por %c es igual a %c",tabla[i][0], tabla[0][j], val); //eliminacion 1: primer caracter evaluado for(l=k+1;l<lon;l++) cad[l-1]=cad[l]; k--; lon--; //eliminacion 2:segundo caracter evaluado for(l=k+2;l<lon;l++) cad[l-1]=cad[l]; k--; lon--; //insertando resultado de la operacion for(l=lon-1 ; l>=k+2 ; l--) cad[l+1]=cad[l]; cad[l+1]=val; //Demarcando el final de la cadena lon++;cad[lon]='\0'; } } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 235: Fundamento de Programacion en C++

/**********************Inicio del Programa*************************** Ejercicio 2: Dos numeros se dicen amigos cuando uno de ellos es igual a la suma de todos los divisores del otro excepto el mismo. Ejemplo: 220(1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284) 284( 1 + 2 4 + 71 + 142 = 220) Por lo tanto son amigos. Se pide: a) Escribir una funcion booleana que llamada desde un programa, permita dicernir si dos numeros (parametros) son amigos. b) Usar otra funcion para calcular la suma de los divisores de un numero determinado. c) Hacer referencia a dichas funciones desde un programa o desde otro subprograma *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" //Funcion para extraer la suma de divisores long suma_divisores(long nro){ long k,sd=0; for(k=1 ; k<nro ; k++) if(nro % k==0) sd+=k; return sd; } //Funcion para dicernir numeros amigos bool amigo(long n, long m){ long sd_n=0,sd_m=0; sd_n = suma_divisores(n); printf("\n\rLa suma de los divisores de %ld es...%ld",n, sd_n); sd_m = suma_divisores(m); printf("\n\rLa suma de los divisores de %ld es...%ld",m, sd_m); return(sd_n==m && sd_m==n); } //Procedimiento Principal void main(){ long n, m; printf("Ingrese 1er #..");scanf("%ld",&n); fflush(stdin);

Page 236: Fundamento de Programacion en C++

printf("Ingrese 2do #..");scanf("%ld",&m); fflush(stdin); if(amigo(n, m)) printf("\n\n\rSon numeros amigos"); else printf("\n\n\rNo son numeros amigos"); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 3: Un juego consiste en encontrar un numero de 5 digitos que ha sido generado aleatoriamente por la computadora. El jugador tiene 6 oportunidades, y en cada una de ellas imprimira los siguientes mensajes: -Si algun digito se encuentra en el numero, y esta en posicion correcta se debera imprimir 'y'. -Si algun digito se encuentra en el numero, pero no esta en la posicion correcta, se debera imprimir una 'x'. Ejemplo: Supongamos que el numero sea 28635 y el numero ingresado es 38165. La computadora mostrara por pantalla 'xy1xy' Si al final de los seis intentos no se acierta con m se debera mostrar el numero ingresado. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ long azar, n; int i, j, k, A[5], B[5], desde, hasta, intentos=6, cantidad_digitos=5; int u,d,c,m,um, u1,d1,c1,m1,um1, tiempo; char r; bool sw; tiempo=time(NULL); srand(tiempo); desde=10000; hasta=99999;

Page 237: Fundamento de Programacion en C++

do{ azar=desde + rand() % (1 + hasta - desde); //azar= 28635; um=azar/10000; m=(azar%10000)/1000; c=((azar%10000)%1000)/100; d=(((azar%10000)%1000)%100)/10; u=azar%10; A[0]=um, A[1]=m, A[2]=c, A[3]=d, A[4]=u; //printf("\n\n%d...", azar); for(i=0 ; i<intentos ; i++){ printf("\n\nDigite # de 5 digitos..."); scanf("%ld",&n); fflush(stdin); if(!(n>=10000 && n<=99999)){ printf("\n\nNumero no es de 5 cifras\n\n"); system("PAUSE"); continue; } um1=n/10000; m1=(n%10000)/1000; c1=((n%10000)%1000)/100; d1=(((n%10000)%1000)%100)/10; u1=n%10; B[0]=um1,B[1]=m1,B[2]=c1,B[3]=d1,B[4]=u1; for(j=0 ; j<cantidad_digitos ; j++){ if(B[j]==A[j]){ printf("y"); continue; } sw=false; for(k=0 ; k<cantidad_digitos ; k++){ if(j==k)continue; if(B[j]==A[k]){ printf("x"); sw=true; break; } } if(!sw) printf("%d", B[j]); } if(n==azar){ printf("\n\nUsted ha acertado \t\"Felicitaciones\""); break; }else if(i<=intentos ) printf("\nNo acerto tiene %d oportunidades",intentos -i -1); }

Page 238: Fundamento de Programacion en C++

if(n!=azar) printf("\n\nNo acerto \"QUE LASTIMA...\" el # de la PC era...%ld", azar); printf("\n\nContinua? S/N "); r=getchar(); fflush(stdin); }while(r=='s'|| r=='S'); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 4: CODIFICACION DE MENSAJES Elaborar un programa para codificar mensajes con la sgte clave: Se intercambia el caracter en blanco con el simbolo @, para las letras A-M con las letras N-Z y las letras N-Z con A-M, los otros carceteres se dejan intactos. Ejemplo Mensaje: HOLA COMO TE VA CODIFICADO: UBYN@PBZB@GR@IN *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ char frase[50]; int i, j, lon; printf("\nIngrese frase..."); gets(frase); fflush(stdin); lon=strlen(frase); for(i=0 ; i<lon ; i++) frase[i]=toupper(frase[i]); for(i=0 ; i<lon ; i++) if(frase[i]>='A' && frase[i]<='M') frase[i]=char(int(frase[i]) + 13); else if(frase[i]>='N' && frase[i]<='Z') frase[i]=char(int(frase[i]) - 13); else if(frase[i]==' ') frase[i]='@'; printf("\n\nLa nueva frase es..%s", frase); printf("\n\n"); system("PAUSE");

Page 239: Fundamento de Programacion en C++

} /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 5: JUEGO 21 Se tiene un juego de cartas en las cuales se han separado las cartas con letras (J=11, Q=12, K=13). Es decir solo se cuentan con 4 rangos de numeros (1-11) corazones, espadas, treboles, diamantes. El juego consiste en asignar a un banquero (PC) el que reparte las cartas y a otro que es el retador. El banquero reparte las cartas una a una cuando el retador las solicita, el retador puede detenerse en cualquier momento. Si el retador o el banquero sobrepasa 21 acumulado pierde. Cuando el retador decide detenerse de solicitar cartas, es el turno del banquero. Gana el que acumula exactamente 21 Gana el banquero si el retador acumulo igual al banquero Gana el que se aproxime mas a 21. Para que sea aleatorio y variados las cartas, al iniciar el juego se deben barajar las cartas. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" /*CONSTANTES Y VARIABLES GLOBALES*/ const int Max_Carta=11, GrupoCartas=4, Tope=21; int tiempo; int MazoCartas[4][Max_Carta], cartas_retador[Max_Carta], cartas_banquero[Max_Carta]; /*************PROCEDIMIENTOS Y FUNCIONES**************/ void barajar(){ tiempo=time(NULL); srand(tiempo); } void IniciarMazoCartas(){ for(int fila=0 ; fila<GrupoCartas ; fila++) for(int columna=0 ; columna<Max_Carta ; columna++) MazoCartas[fila][columna]=columna+1; } int Cantidad_MazoCartas_Disponibles(){ int cant=0; for(int fila=0 ; fila<GrupoCartas ; fila++)

Page 240: Fundamento de Programacion en C++

for(int columna=0 ; columna<Max_Carta ; columna++) if(MazoCartas[fila][columna]!=0) cant++; return cant; } void Añadir_Carta(int &ai_longitud, int ai_cartas[], int carta){ ai_cartas[ai_longitud]=carta; ai_longitud++; } int Carta_Aleatoria(int ai_numero){ int contador=0, carta; for(int fila=0 ; fila<GrupoCartas ; fila++) for(int columna=0 ; columna<Max_Carta ; columna++){ if(MazoCartas[fila][columna]==0)continue; contador++; if(contador==ai_numero){ carta=MazoCartas[fila][columna]; MazoCartas[fila][columna]=0; break; break; } } return carta; } int SumaCartas(int ai_longitud, int ai_cartas[]){ int S=0; for(int i =0 ; i<ai_longitud ; i++) S+=ai_cartas[i]; return S; } void Faltan_Cartas(){ int cantidad_cartas = Cantidad_MazoCartas_Disponibles(); if(cantidad_cartas!=0)return; printf("\n\n\rNo hay cartas disponibles, se van a barajar cartas"); IniciarMazoCartas(); barajar(); cantidad_cartas=Cantidad_MazoCartas_Disponibles(); printf("\n\n\rCartas disponibles: %d", cantidad_cartas); } /*****************PROCEDIMIENTO PRINCIPAL*****************/ void main(){ char solicitud, juego_nuevamente; int desde, hasta, azar, carta, cantidad_cartas; int longitud_retador, acumulado_retador, longitud_banquero, acumulado_banquero; do{

Page 241: Fundamento de Programacion en C++

printf("\n\n\rCartas disponibles: %d\n\n", Cantidad_MazoCartas_Disponibles()); //Turno del retador longitud_retador=acumulado_retador=0; do{ Faltan_Cartas(); printf("\n\n\rDesea carta? S/N:");solicitud=getchar();fflush(stdin); if(toupper(solicitud)=='N')break; desde=1; hasta=Cantidad_MazoCartas_Disponibles(); azar=desde + rand() % (1 + hasta - desde); carta=Carta_Aleatoria(azar); Añadir_Carta(longitud_retador, cartas_retador, carta); acumulado_retador=SumaCartas(longitud_retador, cartas_retador); printf("\nHa Sacado %d, ha Acumulado %d", carta, acumulado_retador); if(acumulado_retador==Tope){ printf("\n\nHa ganado el retador, ha acumulado"); printf("%d\n\n", acumulado_retador); system("PAUSE"); goto final; }else if(acumulado_retador>Tope){ printf("\n\nRetador ha perdido, obtuvo %d", acumulado_retador); printf("y ha sobrepasado el tope %d\n\n", Tope); system("PAUSE"); goto final; } }while(toupper(solicitud)!='N' ); printf("\n\n.........Ud. se ha detenido en %d...........\n\n", acumulado_retador); printf("\n\n.........Ahora es turno del Banquero...........\n\n\n"); //Turno del Banquero longitud_banquero=acumulado_banquero=0; do{ Faltan_Cartas(); desde=1; hasta=Cantidad_MazoCartas_Disponibles(); azar=desde + rand() % (1 + hasta - desde); carta=Carta_Aleatoria(azar); Añadir_Carta(longitud_banquero, cartas_banquero, carta); acumulado_banquero=SumaCartas(longitud_banquero, cartas_banquero); printf("\nHa Sacado %d, ha Acumulado %d", carta, acumulado_banquero); if(acumulado_banquero==Tope){ printf("\n\nHa ganado el banquero, ha "); printf("acumulado %d\n\n", acumulado_banquero); system("PAUSE"); goto final; }else if(acumulado_banquero>Tope){ printf("\n\nBanquero ha perdido obtuvo %d ", acumulado_banquero); printf("y ha sobrepasado el tope %d\n\n", Tope); system("PAUSE");

Page 242: Fundamento de Programacion en C++

goto final; } }while(acumulado_banquero < acumulado_retador && acumulado_banquero < Tope ); if(acumulado_banquero < Tope) if(acumulado_banquero>=acumulado_retador){ printf("\n\nHa ganado el banquero, ha acumulado "); printf("%d\n\n", acumulado_banquero); system("PAUSE"); goto final; }else{ printf("\n\nHa ganado el retador, ha acumulado "); printf("%d\n\n", acumulado_retador); system("PAUSE"); goto final; } final: printf("\n\n\rJugar de nuevo? S/N:"); juego_nuevamente=getchar(); fflush(stdin); }while(toupper(juego_nuevamente)!='N' ); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 6: Se tiene una matriz orden N*M de tipo entero, se pide llevar todos los numeros amstrong a un vector. *********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" void main(){ const int OrdenMax = 100; int A[OrdenMax][OrdenMax],N, M, fila, columna; int V[OrdenMax * OrdenMax], i, L; int tiempo, desde, hasta; int nro, s, u; printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=1000;

Page 243: Fundamento de Programacion en C++

for(fila=0;fila<N;fila++){ printf("\n\n"); for(columna=0;columna<M;columna++){ A[fila][columna]=desde + rand() % (1 + hasta - desde); printf("\t%d",A[fila][columna]); } } L=0; for(fila=0;fila<N;fila++) for(columna=0;columna<M;columna++){ nro=A[fila][columna]; s=0; do{ u=nro%10; nro/=10; s+=(u*u*u); }while(nro>0); if(s==A[fila][columna]){ V[L]=A[fila][columna]; L++; } } printf("\n\nVector con numeros amstrong...\n\n"); for(i=0;i<L;i++) printf("\t%d",V[i]); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/**********************Inicio del Programa*************************** Ejercicio 7: GRAFOS Se tiene una matriz cuadrada de orden N de tipo entero que representa un grafo. se pide mostrar la cantidad de formas de ir desde (a,b) pasando por (E arcos). Ingresar por teclado: -El orden de la matriz -Los puntos de conexion entre dos puntos (1 hay conexion, 0 No). -Cantidad de arcos E. El Resultado es una matriz con la cantidad de formas de ir desde un punto (a,b) pasando por E arcos. *********************************************************************/ /* ANALISIS

Page 244: Fundamento de Programacion en C++

SE UTILIZA EL CONCEPTO DE PRODUCTO DE MATRICES. ML= A B C D 0 0 1 1 A 1 0 0 1 B 0 1 0 0 C 0 0 1 0 D SI E=2 MLxML= 0 0 1 1 0 0 1 1 1 0 0 1 X 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 MLxML= A B C D 0 1 1 0 A 0 0 2 1 B 1 0 0 1 C 0 1 0 0 D Existen 1 forma de ir de A hacia B pasando por dos arcos Existen 2 forma de ir de C hacia B pasando por dos arcos Existen 0 formas de ir de A hacia D pasando por dos arcos */ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h" //CONSTANTES Y VARIABLES GLOBALES const int OrdenMax = 10; int N, E; //PROCEDIMIENTOS void Asignar_Matriz(int &indice, int ai_cubo[][OrdenMax][OrdenMax], int ai_matriz[][OrdenMax]){ for(int fila=0 ; fila<N ; fila++) for(int columna=0 ; columna<N ; columna++) ai_cubo[indice][fila][columna] = ai_matriz[fila][columna]; indice++; } void Mostrar_MatrizResultado(int indice, int ai_cubo[][OrdenMax][OrdenMax]){ int data, fila, columna; for(fila=0 ; fila<N ; fila++) printf("\t%c", char(65+fila)); printf("\n\n"); for( fila=0 ; fila<N ; fila++){ for(columna=0 ; columna<N ; columna++){ data=ai_cubo[indice-1][fila][columna]; printf("\t%d", data); } printf("%4c\n\n", char(65+fila)); }

Page 245: Fundamento de Programacion en C++

for( fila=0 ; fila<N ; fila++) for(columna=0 ; columna<N ; columna++){ data=ai_cubo[indice-1][fila][columna]; if(data>0){ printf("\nExiste %d forma(s) de ir de ", data); printf("%c hasta %c ", char(65+fila), char(65+columna)); printf("pasando por %d arcos", E); } } } //PROCEDIMIENTO PRINCIPAL void main(){ int A[OrdenMax][OrdenMax], B[OrdenMax][OrdenMax], C[OrdenMax][OrdenMax], D[OrdenMax][OrdenMax], ML[OrdenMax][OrdenMax][OrdenMax], i, p; int tiempo, desde, hasta, filaA, columnaA, filaB, columnaB, S; printf("\n\rIngrese orden N de la matriz : "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese cantidad de arcos del resultado: "); scanf("%d", &E); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=0; hasta=1; printf("\n\nPuntos de conexion de grafo\n\n"); for(filaA=0 ; filaA<N ; filaA++) printf("\t%c", char(65+filaA)); printf("\n\n"); i=0; for(filaA=0 ; filaA<N ; filaA++){ for(columnaA=0 ; columnaA<N ; columnaA++){ printf("\t"); if(filaA!=columnaA){ A[filaA][columnaA] = desde + rand() % (1 + hasta - desde); }else A[filaA][columnaA]=0; printf("%d", A[filaA][columnaA]); } printf("%4c\n\n", char(65+filaA)); } Asignar_Matriz(i, ML, A); //Al cuadrado for(filaA=0 ; filaA<N ; filaA++) for(columnaB=0 ; columnaB<N ; columnaB++){ S=0; for(columnaA=0 ; columnaA<N ; columnaA++) S+=A[filaA][columnaA] * A[columnaA][columnaB]; B[filaA][columnaB]=S;

Page 246: Fundamento de Programacion en C++

} Asignar_Matriz(i, ML, B); if(E==2) goto final; //Al cubo for(filaA=0 ; filaA<N ; filaA++) for(columnaB=0 ; columnaB<N ; columnaB++){ S=0; for(columnaA=0 ; columnaA<N ; columnaA++) S+=A[filaA][columnaA] * B[columnaA][columnaB]; C[filaA][columnaB]=S; } Asignar_Matriz(i, ML, C); if(E==3) goto final; //E > 3 for(p=3;p<E;p++){ for(filaA=0 ; filaA<N ; filaA++) for(columnaB=0 ; columnaB<N ; columnaB++){ S=0; for(columnaA=0 ; columnaA<N ; columnaA++) S+=ML[0][filaA][columnaA] * ML[p-1][columnaA][columnaB]; D[filaA][columnaB]=S; } Asignar_Matriz(i, ML, D); } final: printf("\n\nMatriz Resultado\n\n"); Mostrar_MatrizResultado(i, ML); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

Page 247: Fundamento de Programacion en C++

Capítulo 11

Ejercicios Propuestos al

estudiante

Page 248: Fundamento de Programacion en C++

Ejercicios Propuestos al estudiante

1. Realizar el juego del “laberinto” en una matriz de 20x20.

En un fichero guardo una matriz con ceros y unos. Un 1 es una posición válida, mientras que

un 0 no me deja pasar. En el fichero también debe aparecer la posición final e inicial en forma

de coordenada.

2. Lo que se pide es graficar la siguiente estrella en modo texto, en C o C++.

o

o o

o o

o o o o o o o o

o ¡FELIZ o

o NAVIDAD! o

o 2000 o

o o

o o o

o o o o

o o

o o

Solo se pide que la letra "I" de la palabra NAVIDAD este en el centro de la pantalla.( por ejm si

trabajamos en una pantalla de 80 columnas y 25 líneas el centro será el punto 40,12 )

3. Carreras: Eres miembro de un equipo de carreras a campo traviesa, estas carreras son un poco

diferentes a las que conoces, ya que no importa quien llegue más rápido, sino quien lo haga de

manera más eficiente. La carrera se lleva a cabo en un terreno cuadriculado y en carros que

pueden avanzar solo en dirección vertical y horizontal, la cantidad de combustible que puede

llevar cada uno de los carros del equipo no le alcanza para llegar de la salida a la meta (una

unidad de combustible alcanza exactamente para avanzar un cuadro), en el terreno se

encuentran abastecimientos de combustible en los que los carros pueden recargar, cada uno

de los abastecimientos puede ser utilizado solo una vez durante la carrera sin importar la

cantidad de combustible que se obtenga de él. También un carro de tu equipo puede

proporcionarte combustible si se cruzan en algún lugar del terreno. Todos los carros de tu

11

Page 249: Fundamento de Programacion en C++

equipo pueden tomar caminos diferentes, y no es necesario que vayan juntos en ningún

momento.

Problema:

Escribe un programa que dados los puntos en los que se encuentran los abastecimientos de

combustible, sea capaz de elaborar un itinerario que pueda hacer que alguno de los carros de

tu equipo realice el recorrido desde la salida hasta la meta utilizando el menor número de

carros del equipo ó en caso contrario determinar que no existe ninguna solución posible.

Límites

Tamaño del mapa (100 x 100) FIJO SIEMPRE.

Número de carros por equipo (16) FIJO TAMBIEN.

Número máximo de abastecedores (500).

Cantidad máxima de combustible por carro (15).

Entrada

Primer ingreso por teclado la cantidad de combustible que puede llevar cada uno de los carros

del equipo (todos los carros del equipo son siempre iguales y parten de la salida con el tanque

lleno).

Segunda entrada son las coordenadas (xs,ys) del punto de salida.

Tercera entrada son las coordenadas (xm,ym) de la meta.

Cuarta entrada es el número N de abastecedores que hay en el mapa, y en las últimas N líneas

están las coordenadas x, y de cada uno de los abastecedores.

Salida

Tu programa deberá escribir por pantalla el itinerario que utilizó tu equipo para llegar a la meta,

empleando para ello 4 números separados por un espacio utilizando la siguiente notación:

C Xa Ya A

Donde C es el número del carro,

Xa Ya son las coordenadas en las que se abasteció el carro C y

A puede tomar los siguientes valores:

0 si el carro C cargó combustible en un abastecimiento, el número del carro del que se

abasteció y 17 si llegó a la meta.

En caso de no existir solución posible deberá

escribir: NO SOLUCION.

Ejemplo

ENTRADA SALIDA 8

20 14

1 14

1 18 19 0

1 10 19 0

1 7 18 0

Page 250: Fundamento de Programacion en C++

6

19 9

18 19

13 7

10 19

7 9

7 18

2 19 9 0

2 13 7 0

2 7 9 0

2 7 14 1

2 1 14 17

El carro uno se abastece en el abastecedor que se encuentra en 18, 19. El carro dos se abastece del carro uno en 7, 14. Carro dos llega a la meta.

4. Castillo: Neo ha ingresado de nuevo a la matriz y las máquinas han logrado encerrarlo en un complejo con forma de castillo medieval. Sin embargo esto no es suficiente para atraparlo, ya que él es capaz de modificar la matriz, con lo que puede hacer que desaparezcan paredes, logrando de esta forma, encontrar una ruta de escape que lo lleve de vuelta al mundo real para llegar a Zión.

Las máquinas sin embargo, pueden darse cuenta de cada cambio que se realice en el sistema, por lo que Neo desea derribar el menor número de paredes para que se dificulte su rastreo. Su tarea es ayudar a salvar la especie humana, escribiendo un programa que determine la menor cantidad de paredes que deben modificarse para salir del castillo.

Entrada

El castillo consta de m filas (2<=m<=50) cada una con n módulos (2<=n<=50) rectangulares

donde cada módulo puede estar rodeado de a lo más 4 paredes.

La entrada consta de una línea con los números m y n y a continuación m líneas cada una

describiendo los n módulos de esa fila.

El número que describe a cada módulo es un entero entre 0 y 15 que es el resultado de la

suma de: 1 si tiene pared en el lado oeste, 2 si tiene pared en el lado norte, 4 si tiene pared en

el lado este y 8 si tiene pared en el lado sur.

Por ejemplo el número 11 representa un módulo con paredes en los lados oeste, norte y sur.

Finalmente, una línea indicando la posición inicial en formato fila, columna, en la que se

encuentra Neo. Nótese que el castillo puede estar totalmente encerrado, o puede tener

módulos con salida directa al exterior. Para salir, Neo puede modificar cualquier pared, incluso

las que conectan directamente al exterior.

Page 251: Fundamento de Programacion en C++

Salida

Un número entero que indica el menor número de paredes que debe modificar Neo para salir

del castillo y escapar de los agentes.

Ejemplo

Este el mapa del castillo ejemplo. La “X” marca el lugar inicial donde se encuentra Neo. Una

posible salida derriba dos paredes hacia el norte. Sin embargo esta no es la única forma de

salir derribando dos paredes.

5. Desórdenes:

Una permutación de los números del 1 al N es una secuencia de números a1, a2,... aN en la

cual aparece exactamente una vez cada uno de los números del 1 al N.

Un desorden de una permutación es una nueva permutación que se obtiene al realizar un

conjunto de intercambios de parejas de números en la primera tal que cada número sea

intercambiado a lo más una vez.

ENTRADA SALIDA 5 8 15 3 2 10 14 11 6 7 7 9 12 7 15 15 13 5 1 14 11 8 10 14 11 4 12 11 10 10 10 10 14 13 11 10 10 10 10 10 10 14

2 5

2

Page 252: Fundamento de Programacion en C++

Comenzando con la permutación 1, 2,..., N se desea encontrar la menor cantidad de

desórdenes que se le deben aplicar sucesivamente para obtener una permutación dada.

Por ejemplo, para N=5 se desea obtener la permutación 3, 4, 1, 5, 2. Esto se logra con dos

desórdenes, primero intercambiando el 1 por el 3 y el 2 por el 5 para posteriormente

intercambiar el 2 por el 4.

Escriba un programa que encuentre:

la cantidad D de desórdenes (Subproblema A) y

los intercambios (Subproblema B) que se deben efectuar en cada uno de los primeros para

obtener una permutación dada.

Entrada:

La primera entrada contiene el valor de N (con 1 N 1000) y en la segunda línea una lista de

N enteros del 1 al N.

Salida:

Mostrar por pantalla en la primera línea el valor de D y en cada una de las siguientes D líneas

la cantidad K de intercambios seguida de K parejas de enteros indicando los números

intercambiados. Las parejas podrán estar escritas en cualquier orden, pero los desórdenes

deberán escribirse en el orden en que fueron aplicados.

Ejemplos

ENTRADA SALIDA

5

3 4 1 5 2

2

2 1 3 2 5

1 2 4

ENTRADA SALIDA

7

3 2 1 7 6 5 4

1

3 1 3 4 7 5 6

Page 253: Fundamento de Programacion en C++

6. Calendario de un curso:

En una Universidad hay un grupo de M personas interesadas en tomar un curso, numeradas de

la 1 a la M. La Universidad está dispuesta a contratar los servicios de un profesor para que

imparta ese curso. El profesor tiene N fechas disponibles para dar clases, numeradas de la 1 a

la N.

La Universidad seleccionará algunos de las personas interesadas y algunas de las fechas

disponibles para el curso de modo que todas las personas seleccionadas puedan asistir a todas

las clases que se impartirán en las fechas seleccionadas.

Para ello la Universidad solicita a todos los interesados que le indiquen en que fechas pueden

asistir a las clases del curso.

Escribe un programa que encuentre una selección de P alumnos y Q fechas que cumplan las

condiciones exigidas y que maximicen el producto PQ.

Por ejemplo, suponga que M=3 y N=5, la persona 1 puede asistir en las fechas 1, 2, 4 y 5; la

persona 2 puede asistir en las fechas 2, 3 y 4; y la persona 3 puede asistir en las fechas 1, 3, 4

y 5. Entonces la Universidad seleccionará a las personas 1 y 3, las cuales pueden asistir en las

fechas 1, 4 y 5, el producto PQ es 6.

Entrada:

La primera entrada son los enteros M y N (1 M, N 30), y en cada una de las siguientes M

líneas N enteros 0 ó 1, un 0 indica que la persona no puede asistir a la clase correspondiente y

un 1 que si puede asistir.

Salida:

Mostrar por pantalla en la primera línea los enteros P y Q, en ese orden, en la segunda línea

las P personas que asistirán al curso y en la tercera línea las Q fechas en las que se impartirá

el curso. Estas dos últimas listas deberán estar en orden creciente.

Ejemplos

ENTRADA SALIDA

3 5

1 1 0 1 1

0 1 1 1 0

1 0 1 1 1

2 3

1 3

1 4 5

Page 254: Fundamento de Programacion en C++

ENTRADA SALIDA

4 5

0 1 0 1 0

1 1 1 1 1

1 0 1 0 1

1 1 1 0 1

3 3

2 3 4

1 3 5

7. Curvas:

Todo el mundo prefiere carreteras con pocas curvas. Un ingeniero debe diseñar una carretera que una dos ciudades y quiere que tenga el menor número de curvas posible, sin importar la longitud de la carretera. Para facilitar el diseño, el ingeniero dibujó un mapa con los accidentes naturales por donde no puede construirse la carretera, tales como montañas y barrancos muy grandes. Cuadriculó su mapa y quiere que los tramos rectos de la carretera sean horizontales o verticales o diagonales. La carretera sólo puede ir de un cuadro a otro si tienen un lado o una esquina en común, y no puede pasar por un accidente natural. Hay una curva en la carretera en un cuadro donde termina un tramo recto e inicia otro. Cada cuadro del mapa se identifica por sus coordenadas, primero la columna y después el renglón. Las columnas están numeradas de izquierda a derecha iniciando con el 0. Los renglones están numerados de arriba hacia abajo iniciando con el 0. Problema Escribe un programa que dado un mapa con los accidentes naturales encuentre el menor número posible de curvas que puede tener una carretera que inicie en el cuadro donde se encuentra la ciudad A y termine en el cuadro donde se encuentra la ciudad B. Entrada La primera entrada son los enteros N y M, el número de columnas y renglones del mapa, donde 1 N 50, 1 M 50. En cada uno de los siguientes M renglones hay N números que pueden ser 1 ó 0, 1 si hay un accidente natural en el cuadro correspondiente y 0 si no hay ninguno. En el siguiente renglón (el penúltimo) la columna y el renglón de la ciudad A. En el último renglón la columna y el renglón del punto B.

Salida La primera salida el menor número de curvas que puede tener una carretera entre las ciudades A y B.

Page 255: Fundamento de Programacion en C++

Ejemplo En el siguiente mapa de 5 por 7, la ciudad A está en el cuadro (1,1) y la ciudad B en el cuadro (4,6). Cada cuadro negro representa un accidente natural. El menor número de curvas posibles es 3. Una carretera con 3 curvas esta dibujada sobre el mapa, y los cuadros donde hay una curva están numerados:

ENTRADA SALIDA 5 7

0 0 0 1 0

1 0 1 0 0

0 0 1 0 0

1 1 0 0 1

0 0 0 1 0

0 0 1 1 0

0 0 0 0 0

1 1

4 6

3

NOTA: en todos los casos de prueba se puede diseñar al menos una carretera.

8. Incendio:

En una ciudad se han presentado últimamente una gran cantidad de incendios, y las autoridades

sospechan que estos han sido provocados por un conocido maleante. Pero mientras se realiza su

captura, el alcalde ha decidido organizar un sistema de bomberos.

La alcaldía ha dividido la ciudad en zonas y ha determinado para cada una de ellas, estadísticas

sobre el número de incendios presentados y ha determinado una medida del número de incendios

que se podrían prevenir si se asigna una determinada cantidad de bomberos a esa zona. Por

ejemplo, podemos decir que si a la zona 1 se asignan dos bomberos, se podrían prevenir tres

incendios, si se le asignan tres, se podrían prevenir seis, si se asignan cuatro se podrían prevenir

Page 256: Fundamento de Programacion en C++

seis y para cada cantidad de bomberos asignada se pueden prevenir una cantidad determinada de

incendios

Es importante notar que esta relación no es lineal, es decir el hecho de asignar el doble de

bomberos, no implica que se puedan prevenir el doble de incendios. Además, debido a que no se

quiere que ninguna zona se considere discriminada, se debe asignar un mínimo de bomberos para

cada una, aunque en zonas sin construir es posible que este mínimo sea cero, es decir, que no sea

necesario asignar bomberos.

Debido a que esta alcaldía tiene algunos problemas respecto a las cuestiones de planeación, ha solicitado ayuda para determinar cómo distribuir los bomberos de tal forma que se puedan prevenir la mayor cantidad de incendios, mientras logra atrapar al criminal. Su tarea es escribir un programa que ayude a la alcaldía a cumplir su propósito.

Entrada:

La primera entrada consiste de n (2<=n<=50, el número de zonas) y m (2<=m<=500, el número de

bomberos disponible).

En la siguiente entrada vienen n números, que indican el número mínimo de bomberos necesarios

en cada zona. Enseguida aparecen n líneas, cada una de ellas conteniendo m números, cada

línea representando una zona, donde el i-ésimo número de esa línea es la cantidad de incendios

que se pueden prevenir en esa zona si se asignan i bomberos.

Salida:

La salida son dos líneas. La primera indica cual es la mayor cantidad de incendios que se pueden

prevenir en la ciudad. En la segunda vienen n números, en la que el i-ésimo número indica el

número de bomberos asignados a la i-ésima zona. En caso de que exista más de una

configuración que prevenga la mayor cantidad de incendios, cualquiera de ellas puede darse en la

salida.

Ejemplo

ENTRADA SALIDA

2 6 1 2 2 3 6 6 9 10 4 5 6 8 9 20

12 3 3

Page 257: Fundamento de Programacion en C++

9. TENER ENE PADRES:

Unos extraños microbios descubiertos en un lago oculto debajo de la gruesa capa de hielo que

cubre el continente antártico han demostrado una extraña forma de reproducción que no se ha

encontrado en otros seres vivos.

En lugar de tener uno o dos padres como los demás seres vivos, pueden llegar a tener hasta N

padres, donde N puede ser un entero no mayor que 1000.

La información genética de cada padre viene dada en una cadena de a lo sumo 200 letras

mayúsculas.

La información genética que da lugar al neonato esta dada por una cadena formada por la

intercalación de un elemento de cada cadena de cada padre mientras estas cadenas tengan letras

disponibles. No todas las cadenas de los padres son de la misma longitud. La cadena del neonato

tendrá la longitud de la suma de las longitudes de las cadenas de todos sus padres, siendo esto

una curiosidad biológica adicional de estos microbios.

Problema

Debes escribir un programa para calcular la cadena del microbio neonato a partir de las cadenas

de sus padres.

Entrada:

La primera entrada es el siguiente formado:

línea 1: un número entero N (1 N 1.000) que indica la cantidad de padres.

líneas 2 a N+1: cada una con una cadena con Ci ( 1 Ci 200) letras mayúsculas indicando la

información genética de cada padre.

Salida:

La salida será hacia pantalla la cual estará formada por una sola línea. Esta línea debe contener la

cadena del microbio neonato.

Ejemplo

ENTRADA SALIDA

Page 258: Fundamento de Programacion en C++

3

ABABAFGFG

CDCD

XZXZXEEF

ACXBDZACXBDZAXFEGEFFG

Nota: la información vertida en este enunciado es apócrifa.

10. PUEBLO ONDULADO Un pueblo de Ibero América, de cuyo nombre no quiero acordarme, se ha vuelto muy inseguro a causa de la delincuencia y el jefe de policía ha decidido poner P policías a patrullarla. Esta ciudad tiene una particularidad, ha nacido y se ha desarrollado a lo largo de una carretera, de modo tal que todo el patrullaje se reduce a la calle principal que tiene B-1 cuadras de largo, que visto de otra forma son B bocacalles. A cada policía se le debe asignar un conjunto de bocacalles consecutivas a cubrir durante su ronda, desde ellas podrá observar sin necesidad de recorrerlas las pocas casas que hay en cada calle transversal. Si a un policía le corresponde por ejemplo las bocacalles 1 a 7, el siguiente patrullará desde la bocacalle 8 y así siguiendo. Este problema se complica porque el terreno de la ciudad es fuertemente ondulado y el esfuerzo que realiza el policía no depende tanto de la distancia horizontal, puesto que todos caminan permanentemente durante su turno, sino de los desniveles que deba vencer. Para simplificar la tarea de asignación el jefe de policía determina la máxima y mínima altura que hay en el tramo que le corresponde a un policía y por diferencia determina un número representativo del desnivel. Considera una asignación buena de tramos a los policías aquella que minimiza el máximo desnivel que pudiera tocarle a algún policía. Tarea Debes escribir un programa que le ayude a determinar ese número para poder juzgar si la tarea que le impondrá a sus agentes es razonable. Se conoce la altura sobre el nivel del mar de cada bocacalle. Se ha utilizado una unidad de medida lo suficientemente pequeña para que estas alturas sean cantidades enteras. Tu resultado quedará expresada en la misma unidad.

Entrada: La entrada tiene el siguiente formato:

línea 1: los números B (1 B 10.000) y P (1 P 1.000) separados por un blanco.

líneas 2 a B+1: las alturas Yi (-400 Yi 8850) sobre el nivel del mar de las B bocacalles

Page 259: Fundamento de Programacion en C++

Salida: La salida será hacia pantalla que contendrá una única línea con un único número: el peor desnivel que inevitablemente le tocará a algún policía.

Ejemplo

ENTRADA SALIDA

6 2 100 101 104 101 108 105

4

Podrás comprobar este resultado imaginando las distintas formas de asignar tramos a cada policía.

11. Rompecabezas

Se tienen N x N piezas cuadradas numeradas del mismo tamaño. Cada una viene con su número en el interior y con cada lado marcado con algún número. Un ejemplo de pieza 1 es el siguiente:

Se trata de acomodar las piezas en un arreglo de N x N de tal manera que si dos lados de dos piezas son adyacentes entonces esos lados deben estar marcados con los mismos números. Por ejemplo:

Page 260: Fundamento de Programacion en C++

Las piezas no pueden ser giradas ni rotadas al momento de buscar una configuración. Entrada La primera entrada es el número N, donde 1 N 7. En las siguientes N líneas subsecuentes la descripción de cada pieza. En cada una de estas líneas (comenzando por la ficha 1) primero va el número que marca el lado vertical izquierdo y luego en sentido horario los que marcan los otros lados para cada una de las piezas. Salida En pantalla en N líneas, en cada línea van los números de las piezas en el orden hallado para cumplir las condiciones del problema de cada fila. Se garantiza que toda entrada de prueba tiene al menos una solución. Cualquier solución que cumpla las condiciones del problema es válida. Ejemplo

Page 261: Fundamento de Programacion en C++

ENTRADA SALIDA

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

8 6 2 1 5 3 9 4 7

12. Ruleta: El juego de la ruleta ha sido objeto de innumerables intentos de descubrir alguna flaqueza que permitiera diseñar un método para obtener ganancias sistemáticas. Numerosos autores han escrito tratados de cómo saltar la banca. Norman Leigh escribió una obra clásica donde expone como, junto con doce compañeros, saltaron la banca de Montecarlo. La obra, magistralmente escrita, cuenta hechos “verídicos”. Pero con el auxilio de la ciencia de la computación podemos ver que esos hechos tal como los relata Leigh en su libro no pueden haber sucedido.

El método que Leigh relata en su libro es el Labouchere inverso. El apostador comienza anotando

en una libreta los números 1, 2, 3 y 4. Siempre apuesta una ficha igual a la suma de los números

de los extremos de la lista. Si gana agrega al final de la lista un número de igual valor al de su

última apuesta, que acaba de ganar. Si pierde tacha los dos números de los extremos de la lista. Si

en principio pierde las dos apuestas iniciales, la lista se acaba y en total ha perdido $10 y entonces

vuelve a comenzar anotando los números 1, 2, 3 y 4 en su libreta y reiniciando el método. Si la

apuesta llega a superar el límite de la mesa el jugador también reinicia el método anotando una

nueva lista de 1, 2, 3 y 4 en su libreta y apostando $5.

Recordamos que la ruleta europea consta de los números del 0 al 36 y que, jugando a par se gana

si se obtiene un número par distinto de cero, el que juega a impar gana si el número es impar y en

caso de salir cero ambos pierden. La apuesta máxima es de $100, recuerde que cuando se supera

esta apuesta el método se reinicia. En cada apuesta se gana o se pierde el monto apostado.

Con dos jugadores uno jugando a par y otro a impar el método se comporta así en unas bolas de ejemplo.

Page 262: Fundamento de Programacion en C++

Se le pide que escriba un programa que calcule la ganancia o pérdida alcanzada luego de jugarse

cierta cantidad de bolas de ruleta.

Entrada: La entrada consta de un entero 0 < N <= 30000 en la primera línea indicando la cantidad de tiradas de ruleta y a continuación N líneas cada una con un número entero entre 0 y 36, representando las bolas obtenidas en cada uno de los N giros de la ruleta.

Salida:

La salida consistirá de dos enteros P y Q separados por un blanco indicando respectivamente la ganancia (o pérdida) de par e impar, proveniente de aplicar el método de Labouchere inverso a las apuestas de par e impar en la serie de bolas contenida en la entrada.

Sale 31 22 26 11 4 36 0 4

Par

Lista 1 2 3 4 2

3

2

3

5

2

3

5

7

3

5

3

5

8

3

5

8

11

5

8

5

8 13

Ganancia Acumulada 0 -5 0 +7 -2 +6 +17 +3 +16

Impar

Lista 1 2 3 4 1

2

3

4

5

2

3 4

3 3

3

1

2

3

4

2

3

1

2

3

4

2

3

Ganancia Acumulada 0 +5 -1 -7 -4 -10 -15 -20 -25

Page 263: Fundamento de Programacion en C++

Ejemplo

ENTRADA SALIDA

8

31

22

26

11

4

36

0

4

16 -25

13. SIERPE ENROSCADA: En el mundo de la Herpetología Combinatoria pensaremos a las sierpes como ofidios compuestos por una sucesión de cubos del mismo tamaño articulados entre sí. Una sierpe de N x N cubos busca enroscarse formando un cuadrado de N cubos de lado. La sierpe para dormir adopta la posición, en el plano, que le permite tener el cubo 1, (la cabeza), lo más lejos posible del cubo N2, (la cola). Exceptuando la cabeza y la cola todos los demás cubos de la sierpe se articulan con los vecinos en dos caras opuestas (cubos tipo 0) o en dos caras adyacentes (cubos tipo 1). Lo que hace a una sierpe distinta de otra es la ubicación de los cubos de tipo cero y tipo uno en su conformación. Así la sierpe ilustrada tiene luego de la cabeza cuatro cubos seguidos de tipo 1 y luego alterna un cubo de tipo 0 otro de tipo 1 y finalmente otro de tipo 0. Un plegado corresponde a una rotación de 180 grados de la sierpe entre dos cubos vecinos. Aunque la rotación invade la tercera dimensión, al final de la misma la sierpe queda nuevamente en un plano.

Problema Debes escribir un programa que indique, a partir de la posición que adopta para dormir, entre que cubos debe plegarse para lograr su cometido de quedar enroscada formando un cuadrado. Luego de cada plegado ningún cubo de la sierpe puede quedar apoyado sobre otro. Se considerará como solución la lista pares de cubos vecinos entre los cuales que debe plegarse la sierpe para llegar a formar un cuadrado.

Page 264: Fundamento de Programacion en C++

Entrada:

La sierpe viene descripta por pantalla que en su primera línea tiene el número entero N (3 N

5) que indica la raíz cuadrada de la longitud de la sierpe. A continuación el archivo tiene N2-2 líneas. Cada una con la descripción (un cero o un uno) del tipo de cada uno de los N2-2 cubos centrales (los que no son la cabeza ni la cola).

Salida: Mostrar por pantalla, a razón de uno por línea, los números de los pares de cubos entre los cuales se ha plegado la sierpe respecto de la posición de reposo separados entre sí por un blanco. Los plegados deben darse en el orden en que fueron sucediendo. En caso de haber más de una solución cualquiera se considerará como correcta.

Ejemplo

ENTRADA SALIDA

3

1

1

1

1

0

1

0

2 3

5 6

4 5

Nota 1: observen que 5-6 4-5 2-3 no es una solución porque después de plegar en 5-6 no puede hacerse el plegado en 4-5 debido a que se produce la superposición de los cubos 1 y 9.

Page 265: Fundamento de Programacion en C++

Nota 2: Todas las sierpes que se presenten como casos de prueba tendrán al menos una forma de enroscarse para formar un cuadrado. Nota 3: Si hay más de una solución, basta con listar una. 14. Territorios: En el juego "territorios" dos jugadores A y B se alternan para ir destruyendo el territorio del enemigo. El terreno de juego es una cadena de N territorios alineados, 1 N 120. El territorio 1 limita sólo con el territorio 2 que limita a su vez también con el territorio 3 que limita a su vez también con el territorio 4, hasta llegar al territorio N-1 que limita con los territorios N-2 y N que a su vez sólo limita con el territorio N-1. El primero que juega es A quien es dueño de todos los territorios impares, mientras que B quien juega en segundo turno es dueño de todos los territorios pares. Cada territorio i esta inicialmente ocupado por una cantidad entera Ti de soldados, 0 Ti 500. En cada turno un jugador puede aniquilar los soldados de un territorio enemigo si la cantidad de soldados suyos en un territorio vecino o la suma de los soldados en sus dos territorios vecinos es superior a la cantidad de soldados que tiene el jugador enemigo en ese territorio, quedando 0 soldados en el territorio vencido. Si un jugador no puede jugar deberá cederle el turno al otro jugador. Cuando ninguno de los dos pueda jugar se dará por terminado el juego. El puntaje que obtiene el jugador A es igual a la cantidad de terrenos salvados por A menos los salvados por el jugador B. Si el puntaje de A es positivo gana A, si es negativo gana B y 0 significa un empate. Problema Escribe un programa que dados todos los Ti halle el valor del juego para A, considerando que ambos jugadores hacen la mejor jugada posible en cada turno, es decir utilizan una estrategia óptima. Entrada La primera entrada tiene el entero N y las siguientes N líneas tienen los enteros Ti, 1 i N.

Salida La salida se hará escribiendo el valor del juego para A en pantalla Ejemplo

ENTRADA SALIDA

5 33 71 56 44 21

2

Page 266: Fundamento de Programacion en C++

15. Agente de Comunicaciones: En toda área de telecomunicaciones se transmiten datos de un origen a un destino, por ejemplo en el caso de AVL (Automatic Vehicle Location – Localización automática de Vehículos) la transmisión es realizada desde un origen móvil (Vehiculo) hacia un destino Centro de Control (Oficina central de una empresa donde se recibe la información) tal como se ve en el la ilustración 1.

Ilustración 1 Esquema General de un sistema AVL

Todos los mensajes son del mismo tamaño y contienen datos como tiempo, posición, velocidad y

rumbo.

Al centro de control llegan mensajes de varias unidades móviles, estos mensajes forman una cola

de mensajes el cual debe ser procesado por un Agente de comunicaciones que finalmente

muestra al usuario información útil.

Problema Implementar un Agente de Comunicaciones que tiene como entrada una cola de mensajes y

como salida un reporte con información procesada.

La cola de mensajes es una cadena de texto que contiene uno o más mensajes.

>C847B7622083466200000780>C84811082098A30C1E02D78A>C847B87520EE17C72805A79E>C942F2AE20EF08522310E796

>C943E6D220EEB2625C1187A0

Agente

De

Información

Procesada

Cola de Mensajes

recién llegados

Unidad Móvil 201

Unidad Móvil 200

Mensajes Mensajes

Centro de Control

Usuario

Page 267: Fundamento de Programacion en C++

Un mensaje tiene un tamaño único de 26 caracteres conteniendo las siguientes partes indicadas

en Anexo 1.

>C847B7622083466200000780

El agente de comunicaciones tendrá como entrada solo la cola de mensajes.

Debe procesar los mensajes para obtener a partir de su formato hexadecimal sus respectivos

valores decimales de acuerdo al Anexo 2.

Finalmente imprimir en pantalla un reporte de acuerdo a las reglas indicadas en el Anexo3.

------------------------------------Reporte de Mensajes Procesado-------------------------------------

Total Unidades : 2

Total de Mensajes: 5

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

Unidad: 200 Total de Mensajes: 3

Orden Longitud Latitud Vel. Rumbo Tiempo Est. Operativo Est. Posición

1 75.204434 15.603655 40 090 2006/05/08 08:30 En Movimiento En Zona Normal

2 75.567234 10.003212 30 045 2006/05/08 08:10 En Movimiento En Zona Prohib

3 75.200034 08.603234 00 000 2006/05/08 08:00 Detenido En Zona Normal

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

Unidad: 201 Total de Mensajes: 2

Orden Longitud Latitud Vel. Rumbo Tiempo Est. Operativo Est. Posición

1 71.200034 15.643234 92 280 2006/05/08 08:32 Velocidad Alta En Zona Normal

2 70.200034 15.665234 35 270 2006/05/08 08:22 En Movimiento En Zona Normal

Page 268: Fundamento de Programacion en C++

Los procesos solicitados son:

Anexos Anexo1: Estructura de cada Mensaje

Parte \ Descripción Tipo Carácter (*) Numero de Caracteres

Posición Inicial

Posición Final

Datos Adicionales

Carácter Inicial > 1 1 1 Siempre tiene valor “>”

Unidad HH 2 2 3 Código de la unidad móvil

Longitud HHHHHHH 7 4 10 Coordenada x

Latitud HHHHHHH 7 11 17 Coordenada y

Velocidad HH 2 18 19 Km./h

Rumbo HHH 3 20 22 Grados (0° a 360°)

Tiempo HHHH 4 23 26 Total de Minutos transcurridos de la semana actual.

(*) H representa un digito Hexadecimal para su conversión a decimal ver Anexo 4.

Anexo2: Ejemplo de una Cola de Mensajes que se ingresara como entrada al programa:

>C847B7622083466200000780>C84811082098A30C1E02D78A>C847B87520EE17C72805A79E>C942F2AE20EF08522310E796

>C943E6D220EEB2625C1187A0

Ordenada resultaría:

Carácter Inicial Unidad Longitud Latitud Velocidad Rumbo Tiempo > C8 47B7622 0834662 00 000 780

> C8 4811082 098A30C 1E 02D 78A

> C8 47B8752 0EE17C7 28 05A 79E

Proceso de Descodificación de los mensajes

Reporte :Listado de los mensajes procesado

Reporte :El Listado ordenarlo cronológicamente descendentemente

Reporte :Los mensajes agruparlos por unidad y poner los totales de mensaje por grupo y el total general

Reporte :Para el calculo de los estados Operativo

Reporte :Para el calculo de los estados Posición

Page 269: Fundamento de Programacion en C++

> C9 42F2AE2 0EF0852 23 10E 796

> C9 43E6D22 0EEB262 5C 118 7A0

Procesada de hexadecimal a decimal resultaría:

Carácter Inicial Unidad Longitud Latitud Velocidad Rumbo Tiempo > 200 75200034 08603234 0 0 1920

> 200 75567234 10003212 30 45 1930

> 200 75204434 15603655 40 90 1950

> 201 70200034 15665234 35 270 1942

> 201 71200034 15643234 92 280 1952

Formateando latitud y longitud(*) y calculado la fecha hora(**) correspondiente resultaría:

Carácter Inicial Unidad Longitud Latitud Velocidad Rumbo Tiempo (Fecha Hora) > 200 75.200034 08.603234 0 0 2006/05/08 08:00

> 200 75.567234 10.003212 30 45 2006/05/08 08:10

> 200 75.204434 15.603655 40 90 2006/05/08 08:30

> 201 70.200034 15.665234 35 270 2006/05/08 08:22

> 201 71.200034 15.643234 92 280 2006/05/08 08:32

(*)Para Latitud y Longitud dividir el valor decimal entre 100000.

(**)Para el calculo de la fecha y hora agregar a la fecha hora inicial de la semana (domingo a las o horas) la

cantidad de minutos correspondiente al mensaje.

Anexo3: Reglas de negocio a cumplir para elaborar el reporte:

El Listado ordenarlo cronológicamente descendentemente

Los mensajes agruparlos por unidad y poner los totales de mensaje por grupo y el total general

Para el calculo de los estados Operativo son tres posibilidades: o Detenido.- si la velocidad es cero o En Movimiento.- si la velocidad es mayor a cero y menor a 90 km/h o Con Velocidad Alta.- si la velocidad es mayor o igual a 90 km/h

Para el calculo de los estados Posición son dos posibilidades(*): o En Zona Normal.- si no esta dentro de la zona Prohibida o En Zona Prohibida.- si esta dentro de la zona Prohibida

(*)La Zona Prohibida es un rectángulo definido mediante coordenadas de dos vértices en diagonal: (70.000000,

09.000000) (80.000000, 12.000000)

Page 270: Fundamento de Programacion en C++

Anexo4: Un numero Hexadecimal esta compuesto por los dígitos: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E y F

Y su equivalente unitario en decimal es el siguiente:

DígitoHexacecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F

DígitoDecimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Para transformar un número hexadecimal a su correspondiente decimal debes realizar la sumatoria del

equivalente real (es equivalente unitario por potencia de 16, la potencia depende de la posición del

digito) de cada digito Por ejemplo:

2BC4 hexadecimal es equivalente a 11204 decimal pues:

4*(16^0) + 12*(16^1) + 11*(16^2) + 2*(16^3)=11204