Sunteți pe pagina 1din 270

INICIANDO PROGRAMADORES CON

Anlisis y Resolucin de problemas

C++ .nET

PRIMERA EDICION

Christian Mori

Esta es la entrega que ofrece una amplia enseanza acerca de la resolucin de problemas computacionales en lenguaje C++.Net.

Este libro muestra ejercicios diseados didcticamente para la fcil asimilacin del estudiante.

Adems se incluye ejercicios de maratn, exmenes y ejercicios para aplicaciones actuales.

Con este libro Usted podr culminar su carrera de ciencias informticas sin morir en el intento.

Contenido
UNIDAD 1
Captulo 1: Sistemas de procesamiento de datos
1.1 Conceptos de la programacin 1.1.1 Programa 1.1.2 Programacin 1.1.3 Programador/Desarrollador 1.1.4 Sistema 1.1.5 Sistema de Informacin 1.1.6 Dato 1.1.7 Informacin 1.1.8 Software 1.1.9 Hardware 1.2 Ejecucin de un programa 1.2.1 Representacin sencilla de la ejecucin de un programa 1.3 Lenguajes de Programacin 1.4 Evolucin los lenguajes de Programacin 1.4.1 Lenguajes de Alto nivel 1.4.2 Lenguajes de bajo nivel 1.5 Tipos de lenguajes de programacin 1.5.1 En funcin de la forma de programar 1.5.2 Orientados al problema 1.5.3 Segn su campo de aplicacin

Captulo 2: Metodologa para solucin de problemas computacionales


2.1 Pasos para la solucin de problemas computacionales

2.1.1 Definicin del problema 2.1.2 Anlisis de la solucin 2.1.3 Diseo de la solucin 2.1.4 Codificacin 2.1.5 Prueba y Depuracin 2.1.6 Documentacin 2.1.7 Mantenimiento

2.2 Tipos de errores 2.2.1 Error sintctico de software 2.2.2 Error de lgica de programador 2.2.3 Error fatal en tiempo de ejecucin 2.2.4 Error interno de software

Captulo 3: Fases de la programacin


3.1 Elementos de un programa 3.1.1 Tipos de datos en C++ 3.1.2 Identificadores 3.1.3 Conceptos bsicos al nombrar variables 3.1.4 Asignacin 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 Transformacin de expresiones algebraicas a computacionales 3.2.2 Declaracin de Variables 3.2.3 Datos Enteros vs Datos Reales 3.2. 4 Partes de la divisin 3.2.5 Divisin Entera vs divisin real 3.2.6 Resultados de la divisin 3.2.7 Anlisis de almacenamiento de la divisin con resultados numricos

3.2.8 Residuo (Modulo)

Captulo 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 mltiple < 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 inicializacin 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

Captulo 5: Ejercicios de autoevaluacin Captulo 6: Funciones Predefinidas de C++


6.1 Concepto de Funcin 6.2 Funciones Aritmticas 6.3 Funciones trigonomtricas 6.4 Funciones de caracteres 6.5 Funciones de Cadena 6.6 Generador de nmeros aleatorios 6.7 De Control de pantalla

UNIDAD 2
Captulo 7: Programacin Modular
6.3 Diseo descendente 6.4 Subprogramas 6.5 Variables globales y locales 6.6 Funciones 7.4.1 Definicin de funciones 7.4.2 Invocacin a las funciones 6.7 Procedimientos 7.5.1 Definicin de Procedimientos 7.5.2 Invocacin a las Procedimientos 7.6 Tipos de Parmetros

Captulo 8: Arreglos
8.1 Arreglos Unidimensionales 8.1.1 Representacin Grafica 8.1.2 Asignacin de Valores 8.1.3 Lectura y escritura de datos 8.1.4 Recorrido, insercin y eliminacin en un vector 8.2 Arreglos Bidimensionales 8.1.1 Representacin Grafica 8.2.2 Asignacin de Valores 8.2.3 Lectura y escritura de datos 8.2.4 Recorrido, insercin y eliminacin en una matriz 8.3 Ordenamientos 8.3.1 mtodo de intercambio o burbuja 8.3.2 mtodo por insercin, 8.3.3 mtodo por seleccin 8.3.4 mtodo de ordenacin rpida (quicksort). 8.4 Bsquedas 8.4.1 Tipos de bsqueda

8.4.2 Mtodo Bsqueda Binaria

Captulo 9: Cadenas
9.1 Fundamentos de cadenas 9.2 Asignacin de Valores 9.3 Lectura y escritura de datos 9.4 Arreglo de cadenas 9.5 Lectura y escritura de datos

Captulo 10: Ejercicios de autoevaluacin Captulo 11: Ejercicios Propuestos al estudiante

Prefacio
Este libro ha sido creado para los iniciantes en la programacin. Puede ser como primer libro de programacin ya que cuenta con los conceptos principales para la resolucin de problemas. Aunque la versin de C++.Net es 2012 es tambin valido para versiones anteriores de C++.Net. Para entender el libro no se requiere grandes conocimientos superiores, solo es indispensable tener conocimientos de matemticas tan bsicos como algebra y operaciones.

Un modelo, no una regla Lo expuesto en el libro son conocimientos bsicos fundamentales en la programacin, adems 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 continuacin 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 electrnico Estoy sumamente interesado en sus comentarios y sugerencias. Por favor no dudes en enviarlos al correo electrnico:

firstjon26@gmail.com

Sus sugerencias sern procesadas para el mejoramiento continuo del libro, mas no para la resolucin de algn problema propuesto, puesto que los problemas sern resueltos paulatinamente en las siguientes ediciones del libro.

Agradecimientos Durante la preparacin 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 seor 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 ensearon a cmo instruir, fueron el mejor test que pude haber tenido al disear el libro.

A la izquierda Christian con su padre Ezequiel.

Introduccin

El presente trabajo ha sido un gran esfuerzo mstico con el fin de orientar a los primeros estudiantes que ayudara a desarrollar la capacidad de anlisis en los problemas computacionales.

Este trabajo va dirigido a los futuros expertos en sistemas y programacin de computadoras, ya que varias personas por falta de motivacin abandonan esta parte valiosa de la computacin y sistemas.

En este libro desarrollaremos los problemas computacionales desde los ms comunes para iniciantes y complejos de anlisis para los avanzados. Inicialmente se mostraran las equivalencias de pseudocdigo y C++ hasta el captulo 4, luego se desarrollaran los programas solo en lenguaje C++.

Captulo 1 Sistemas de Procesamiento de Datos


1.1 Conceptos de la programacin 1.1.1 Programa 1.1.2 Programacin 1.1.3 Programador/Desarrollador 1.1.4 Sistema 1.1.5 Sistema de Informacin 1.1.6 Dato 1.1.7 Informacin 1.1.8 Software 1.1.9 Hardware 1.2 Ejecucin de un programa 1.2.1 Representacin sencilla de la ejecucin de un programa 1.3 Lenguajes de Programacin 1.4 Evolucin los lenguajes de Programacin 1.4.1 Lenguajes de Alto nivel 1.4.2 Lenguajes de bajo nivel 1.5 Tipos de lenguajes de programacin 1.5.1 En funcin de la forma de programar 1.5.2 Orientados al problema 1.5.3 Segn su campo de aplicacin

1
Introduccin

Sistemas de Procesamiento de Datos

Es el conjunto de mtodos y procedimientos que permiten obtener informacin. A continuacin se mencionan conceptos que ser fundamental que el lector conozca:

1.1 Conceptos de los sistemas de computacin

1.1.1 Programa Es el conjunto de instrucciones que una computadora ha de seguir. Estas instrucciones son escritas en un lenguaje de programacin que la computadora es capaz de interpretar.

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

1.1.3 Programador/Desarrollador Individuo que ejerce la programacin, es decir escribe programas para computadoras.

1.1.4 Sistema Es un conjunto de elementos interrelacionados entre s, interactuando con un objetivo en comn.

1.1.5 Sistema de Informacin Es el conjunto de procedimientos ordenados que al ser ejecutados proporcionan informacin para apoyar la Toma de Decisiones y el control de una organizacin.

1.1.6 Dato Representa observaciones o hechos fuera de contexto y sin significado inmediato (Es materia prima de la informacin).

1.1.7 Informacin 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 informacin.

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

1.1.9 Hardware Son las maquinas fsicas reales que constituyen una instalacin de cmputo.

1.2 Ejecucin de un programa


En la ejecucin de un programa intervienen elementos de entrada y de salida que interactan en la computadora. Se necesita de datos de entrada ingresados desde teclado usualmente, un programa escrito en un lenguaje de programacin, una computadora que mostrara los resultados y/o salida usualmente por pantalla.

1.2.1 Representacin sencilla de la ejecucin de un programa


Entrada (INPUT) Programa ---------------------------------------Datos ------------------------------------Proceso Salida (OUTPUT)

Computadora

Salida ----------------------------------------

1.3 Lenguajes de Programacin

Definicin
Es un conjunto de reglas semnticas as como sintcticas que los programadores usan para la codificacin de instrucciones de un programa o algoritmo de programacin.

1.4 Evolucin los lenguajes de Programacin


Es el desarrollo y mejoramiento de los lenguajes de programacin a travs de la historia, se categorizan en:

1.4.1 Lenguajes de Alto nivel 4to nivel: Llamados tambin 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 ms parecido al lenguaje del ser humano, con ms signos y reglas para expresar con facilidad las cosas ms 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 tambin Lenguaje de Maquina. Son los programas escritos en forma de ceros y unos. Ejm 0110 1001 1010 1011

1.5 Tipos de lenguajes de programacin


Son las distintas formas y categoras de los lenguajes de programacin, se categorizan en:

1.5.1 En funcin 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

Segn su campo de aplicacin.

Aplicaciones cientficas: 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 programacin de sistemas: ADA, MODULA-2 y C. Lenguajes de Internet: HTML, JAVA, Perl, PHP, ASP.NET

Captulo 2 Metodologa para solucin de problemas computacionales


2.1 Pasos para la solucin de problemas computacionales 2.1.1 Definicin del problema 2.1.2 Anlisis de la solucin 2.1.3 Diseo de la solucin 2.1.4 Codificacin 2.1.5 Prueba y Depuracin 2.1.6 Documentacin 2.1.7 Mantenimiento

2.2 Tipos de errores 2.2.1 Error sintctico de software 2.2.2 Error de lgica de programador 2.2.3 Error fatal en tiempo de ejecucin 2.2.4 Error interno de software

2
Introduccin

Metodologa para solucin de problemas computacionales

Es la serie de pasos adecuados que se ha de seguir para obtener una solucin completa de un problema computacional.

2.1 Pasos para la solucin de problemas computacionales


A continuacin se mencionan los puntos a seguir:

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

2.1.2 Anlisis de la solucin

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 Diseo de la solucin Es la creacin del algoritmo (Diagrama de flujo y/o pseudocdigo),

2.1.4 Codificacin Escribir la solucin del problema (de acuerdo al pseudocdigo), en una serie de instrucciones detalladas en un cdigo reconocible por la computadora (PROGRAMA). En la actualidad y con algo de prctica se es posible pasar del anlisis de la solucin a la codificacin, en muchos casos es ms rpido y permite detectar errores mediante la depuracin o debug, asunto que se hara manualmente en el pseudocdigo y/o diagrama de flujo.

2.1.5 Prueba y Depuracin La Prueba es el proceso de identificar los errores que se presenten durante la ejecucin del programa. La Depuracin consiste en eliminar los errores que se hayan detectado durante la prueba.

2.1.6 Documentacin Es la gua o comunicacin escrita que sirve como ayuda para usar un programa, o facilitar futuras modificaciones. La documentacin que va a sustentar en trminos legales la creacin y/o modificacin del programa. Existen 3 tipos:

Documentacin Interna Consiste en los comentarios o mensajes que se agregan en el cdigo del programa (Es la ms usada), mientras ms detallado se encuentre el programa ser ms fcil la modificacin en el futuro, adems es utilizado para controles internos dentro del rea de TI. Consta de: Nombre de modulo, Descripcin del mdulo, Nombre del Autor, fecha creacin, fecha modificacin Documentacin Externa

Es el Manual Tcnico (A menudo obviada), est integrada por los siguientes elementos: Descripcin del Problema, Nombre del Autor, Diagrama del Flujo, Pseudocdigo, Lista de variables y constantes, y Codificacin del Programa.

Manual del Usuario Es la documentacin (Generalmente diapositivas) que se le proporciona al usuario final, presentando todas las pantallas y mens que se va a encontrar y una explicacin 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 despus de determinado el programa cuando se detecta que es necesario hacer un cambio, ajuste y/o complementacin 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 continuacin se detallan los distintos tipos y formas en que aparecen los errores, adems las recomendaciones para disminuir su aparicin.

2.2.1 Error sintctico de software

Son los errores conocidos como gramaticales respecto al software de lenguaje de programacin que se utiliza. Estos errores son los que se muestran en la mayora de los casos en el programa editor de cdigo en tiempo de codificacin. Pueden aparecer por no teclear correctamente alguna instruccin y/o comando del lenguaje de programacin utilizado, la buena noticia de este tipo de errores son que se pueden detectar y corregir en tiempo de codificacin, El software del lenguaje de programacin en muchos casos detecta los errores automticamente mientras se digita el cdigo antes de ejecutar el programa. Por ejemplo en C++ toda instruccin 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 lgica de programador Son los errores del desarrollador y son errores de interpretacin de los procesos funcionales (A menudo en expresiones de clculos). Por ejemplo le podran pedir calcular el promedio de 2 nmeros y por distraccin suma los dos nmeros y los divide sobre tres, O quizs en su frmula emplea lo siguiente: A+B / 2 y no coloca el parntesis para que primero sume. Este tipo de errores no es percibido por el software editor de cdigo ya que estos errores son sintcticamente correctos, en consecuencia solo pueden ser percibidos en tiempo de ejecucin del programa al intentar ver el resultado o quizs mucho despus.

2.2.3 Error fatal en tiempo de ejecucin 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 ms comunes aun cuando se alcanza a dominar la programacin. A menudo este tipo de errores son por clculos numricos y reglas matemticas que no pueden ser pasadas por alto por ejemplo si se intenta dividir un nmero sobre cero,

Otro caso general es cuando se intenta obtener un valor ya sea por teclado o de otra ubicacin, y no se valida que haya obtenido realmente el valor y se hace una expresin con la variable como si tuviera el valor y en ese momento seguramente tendrs un error en tiempo de ejecucin. La recomendacin 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 programacin utilizado algunas veces muestra errores. En algunos casos por modificacin de algn componente interno ya sea por la instalacin de algn otro software en la PC (Personal Computer) que consigue modificar el componente. Otros casos tambin suceden por no refrescar el proyecto utilizado, actualmente el software de programacin cuenta con herramientas de actualizacin 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 programacin. Un caso menos usual es la infeccin de virus que en la actualidad se corrige con un antivirus efectivo.

Captulo 3 Fases de la Programacin


3.1 Elementos de un programa 3.1.1 Tipos de datos en C++ 3.1.2 Identificadores 3.1.3 Conceptos bsicos al nombrar variables 3.1.4 Asignacin 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 Transformacin de expresiones algebraicas a computacionales 3.2.2 Declaracin de Variables 3.2.3 Datos Enteros vs Datos Reales 3.2. 4 Partes de la divisin 3.2.5 Divisin Entera vs divisin real 3.2.6 Resultados de la divisin 3.2.7 Anlisis de almacenamiento de la divisin con resultados numricos 3.2.8 Residuo (Modulo)

Fases de la Programacin

Introduccin
En este captulo 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 continuacin se muestra una tabla con los rangos y algunas otras caractersticas de los tipos de datos:

Tipo de datos Rango Mnimo (*) Descripcin short int Enteros Entero sin signo long unsigned long float double Reales Carcter Cadena Booleano long double char string bool C++ 32,767 32,767 2147,483,467 4294,967,295 10^37 10^37 10^37 127 6 dgitos 6 dgitos 6 dgitos Precisin

(*) EL limite considera lmite inferior el mismo nmero con signo negativo hasta el lmite superior que es el numero mostrado, con excepcin de los que llevan la palabra reservada unsigned(sin signo) en esos casos el lmite inferior es cero y el lmite superior es el doble del numero mostrado. Estos son los mnimos rangos sin embargo esto puede variar de acuerdo a la versin del compilador, a continuacin se muestra los tpicos rangos para un ambiente de 32 bits:

Tipo de datos Bytes utilizados Descripcin short int Enteros Entero sin signo long unsigned long float double Reales Real sin signo Carcter Cadena Booleano long double unsigned double unsigned long double char
string bool

Tpico Rango(*) 32,767 2147,483,467 2147,483,467 2147,483,467 1.8^-38 a 3.4^38 2.2^-308 a 1.8^308 2.2^-308 a 1.8^308

C++ 2 bytes 4 bytes 4 bytes 4 bytes 4 bytes 4 bytes 8 bytes

1 Byte: guarda un carcter Bytes Dinmicos, su tamao es ilimitado 1 bit

Nota: Para los iniciantes los tipos de datos definidos bajo pseudocdigo se puede utilizar la descripcin de la tabla. Sin embargo para este libro se utilizara los trminos 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, adems dicho valor puede ser cambiado a lo largo del programa.

Constante: Son un tipo de variable que mantiene su valor desde el principio hasta el final del programa.
3.1.3 Conceptos bsicos 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, mnemnico (palabra tcnica) o palabra completa separada por guion bajo _ ya sea por la complejidad de la rutina o del problema. Respecto a las terminaciones con numeracin 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 maysculas de minsculas por lo tanto la variable (A) es distinta de la variable (a).

No se puede nombrar variables que tengan como nombre algn comando, palabra reservada, tipo de dato, etc. del lenguaje de programacin 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, parmetro, etc.)><Tipo de dato>_<nombre variable>. Imagine una variable local de tipo entero que va a contener una edad, el nombre de la variable podra ser: li_edad. Variable global para guardar el sexo de mara (M,F), podemos declarar: gc_sexo_maria. A continuacin listamos ms ejemplos:

CAR CAR y Car son variables distintas Car

a_50 b35a pepito Promedio_ventasC 31p Luis Snchez Usuario-1 lc_nombre gl_cantidad afl_promedio => no valido => no valido => no valido =>local de tipo carcter (recomendado) => global de tipo long (recomendado) =>argumento de tipo float (recomendado) veamos problemas

En este libro usaremos la forma recomendada de nombrar variables cuando algortmicos de sobremanera complejos.

3.1.4 Asignacin de variables

Se asigna valores del mismo tipo que el que se declar previamente a la variable/constante (aritmtica, lgica, textos y caracteres).

Pseudocdigo Variable = variable/valor A=10 B=20 C = A + B D="Arriba Peru"

C++ Variable = variable/valor; A=10; B=20; C = A + B; strcpy(D,"Arriba Peru");

Observacin

Se utiliza una funcin predefinida de C++ (Vase captulo 6)

E='A' F = 10 + 50 G = 10 + "50" H = D + B

E='A'; F = 10 + 50; G = 10 + "50"; H = D + B; No valido(10 es un numero entero y 50 es cadena por estar entre comillas) No valido(D es cadena y B es un entero)

3.1.5 Operadores

Tipo Operadores Suma Resta

Descripcin

Pseudocdigo

C++

+ * /

+ *

Multiplicacin Aritmticos Divisin real Divisin entera Residuo(divisin entera) Mayor que Mayor o igual que Menor Relacionales Menor o igual que Igualdad Diferente

(*) /
Div Mod

% > >= < <= == !=

> > < < = <>

Y Lgicos O Negacin

And Or Not

&& || !

(*) Notar que para C++ se coloc el mismo smbolo en divisin real y entera, para saber en qu
momento funciona como divisin real y en qu momento como divisin entera (Vase los apartados 3.2.5, 3.2.6, 3.2.7)

3.1.6 Prioridad de Operadores A continuacin 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 matemticas. Al igual que en el lgebra es posible alterar el orden de operacin haciendo uso de parntesis. Para agrupaciones ms complejas solo est permitido el uso del parntesis (). 1. () 2. / 3. * 4. + 5. (*)

(*) Las operaciones que estn dentro de parntesis se evalan primero. Cuando existe mltiples parntesis (anidado: internos unos a otros), se evalan primero las expresiones ms internas.

Ejemplos Considere si: A=3, B=4, C=5: 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

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

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 informacin y/o resultado del programa. Adems 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); (*)

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

(**)

(*) Notar el texto en negrita %f y %s, dichos valores sern reemplazados por las variables listadas despus de la coma en orden de ocurrencia. (**) Notar el nmero 8.4 del formato %8.4lf, representa el formato de impresin del nmero en pantalla en este caso longitud 8 a 2 decimales.

Formatos de entrada y salida

Formato %d %ld %f %lf %c %s %u

Tipo de dato int long float double char char(cadena) Entero sin signo

Notar que %c y %s tienen el mismo tipo de dato, no obstante %c imprime solo un carcter y %s imprime una cadena de caracteres.

Secuencias de escape Como sealamos en los ejemplos de Salida en la impresin con printf, mostramos unos ejemplos de uso de las secuencias de escape, a continuacin listamos ms secuencias de escape:

Descripcin Nueva Lnea Tabulacin Horizontal Retorno de carro Alerta Diagonal invertida Comillas dobles

Smbolo \n \t \r \a \\ \"

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

3.2 Manejo de Expresiones


3.2.1 Transformacin de expresiones algebraicas a computacionales Como ya se mencion en el apartado Prioridad de operadores, solo estn permitidos los parntesis () a continuacin veremos cmo transformar las expresiones algebraicas hacia expresiones computacionales:

Expresin algebraica 4+5

Expresin computacional 4+5 A - 10

2x4

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

3.2.2 Declaracin de Variables Es el acto de definir un Tipo de dato vlido a una variable que se utilizar en el programa. Ejemplos:

Pseudocdigo Entero: A,B Real: P,Q Carcter: Sexo, Condicin Constante Entero: P=10

C++ int A,B; long k,b; float P,Q; double R, s; char Sexo, Condicin; 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: nmeros y variables: Para los nmeros digitados en expresiones, son enteros siempre y cuando no se digita el punto decimal y nmeros posteriores, en caso contrario son reales.

Nmeros Enteros Son aquellos nmeros que no cuentan con parte decimal. Ejemplo: 0, 1, 15, 540, 1500, etc.

Nmeros Reales Son aquellos nmeros que poseen parte real o decimal. Ejemplo: 0.00001, 1.633, 20.3598, 1.3333333, 1.0, etc.

No obstante en la programacin en C++, las variables que contendrn nmeros 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.

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 divisin

3.2.5 Divisin Entera vs divisin real

En los problemas computacionales no solo es usada la divisin real sino tambin es a menudo necesario el uso del operador de divisiones enteras.

3.2.6 Resultados de la divisin Los resultados de la divisin van a depender del tipo de dato del dividendo y/o divisor. A continuacin mostraremos los resultados teniendo en cuenta el tipo de dato del dividendo y divisor:

Divisin de Nmeros

a) 10 5 = 2 (Smbolo de divisin no utilizado en C++) b) 12 / 5 = 2 c) 15 / 4.0 = 3.75 d) 15 / 4 = 3 e) 10 / 3 = 3

f) 10.0 / 3 = 3.333333 La representacin c) muestra el resultado real pues la divisin cuenta con un dividendo entero y un divisor real (por estar con punto decimal .0) y adems tiene residuo inicial 3 (> 0)

Dnde: 15: Dividendo 4.0: Divisor 3.75: Cociente (es el resultado de la operacin) 3: Residuo

La representacin e) muestra el resultado entero pues se est usando operadores enteros.

Dnde: 10: Dividendo 3: Divisor 3: Cociente (es el resultado de la operacin) 1: Residuo

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

Divisin variables enteras

a) B / A = 2 b) A / B = 0

Divisin variables Reales

c) S / R = 1.66666 d) R / S = 0.6

Divisin variables Enteros y Reales

e) Q / S = 8.0 f) R / P = 0.15

Divisin de variables y nmeros 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 ejecucin) 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 dgitos decimales va a depender del tipo de dato definido en C++ ya sea float o double. (Vase el apartado 3.1.1)

(**): Existen divisiones en las cuales el resultado de la divisin es un nmero con parte decimal muy extenso como .33333..., la longitud de los dgitos va a depender del tamao del tipo de dato de la variable en la cual se va a almacenar o el formato redondeando el ultimo digito de ser necesario (Vase el apartado 3.1.1) En general para obtener los resultados esperados de acuerdo al dividendo y divisor ya sea variables o nmeros se puede aplicar la siguiente regla:

Dividendo Entero Entero Real Real

Divisor Entero Real Entero Real

Resultado Entero Real Real Real

3.2.7 Anlisis de almacenamiento de la divisin con resultados numricos

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

//Declaracin de variables enteras int A, B, C, P; //Declaracin de variables reales double D, E, F, Q; //Asignacin 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 continuacin se muestran tpicas operaciones en la que se almacena valores errneos por los tipos de datos:

P=A / E; Cuidado con este tipo de operaciones. El resultado de la divisin 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 divisin es un entero 7 y como Q es doubl Q=7.000000.

Q=(A+B) / 2.0; El resultado de la divisin es real 7.5 por lo tanto Q=7.500000.

3.2.8 Residuo (Modulo) En C++ el operador modulo es representado por < % >, y se utiliza para obtener el residuo o resto de una divisin 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) e) f) g)

7%9=7 C%3=0 D%5=2 B%0=0

Captulo 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 mltiple < 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 inicializacin 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

4.3 Introduccin a C++ 4.3.1 Resea histrica 4.3.2 Libreras y palabras reservadas bsicas 4.3.3 Estructura de un programa en C++ 4.3.4 Creacin, ejecucin y depuracin de un programa mediante Visual Studio .Net

Flujos 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 cdigo se va a ejecutar. 4.1.1 Expresiones Booleanas Se denomina expresin booleana a aquella expresin en la cual se va a realizar una evaluacin y como resultado de dicha evaluacin solo puede devolver dos posibles valores true (Verdad) o false (falso). Est compuesta generalmente por variables/valores, operadores de comparacin y operadores lgicos.

Expresiones con operadores de comparacin Son el tipo de expresiones ms sencillas en las cuales se van a evaluar dos valores mediante un operador de comparacin. Ejemplos: Si A=50, B=70, C=A, D=1 entonces: char A == 50 B = 70 A>B C==A C==A B>C => true => No es una expresin booleana, es una asignacin a la variable B con 70 => false => Error en tiempo de codificacin, las comillas dobles indica cadena => true => true, A representa el nmero 65 en la tabla de los cdigos ASCII Vase capitulo X

A+B < B+D D != D D !D

=> false => false => true => false (*)

(*) Ntese 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 nmeros para este propsito, en su lugar C++ cuenta con un tipo de dato especial bool. Ejemplo:

bool sw; sw = false; sw=true;

Expresiones con operadores lgicos Para este propsito utilizaremos los operadores lgicos, pero antes debemos mostrar las tablas de verdad de los principales operadores:

Tabla de verdad && (Disyuncin lgica Y)

Operando 1 true true false false

Operador Y && && && &&

Operando 2 true false true false

Resultado true false false false

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 A < C && B==C A==10 && B==20 B==20 && C==40 A!=15 && B==20 C==20 && A!=10

=> true && true = true => true && false = false => true && true = true => true && false = false => true && true = true => false && false = false

Tabla de verdad || (Conjuncin lgica O)

Operando 1 true true false false

Operador O || || || ||

Operando 2 true false true false

Resultado true true true false

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:

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

=> true || true = true => true || false = true => true || true = true => true || false = true => true || true = true => false || false = false

Tabla de verdad ! (Negacin lgica No)

Operando 1 true false

Operador NO ! !

Resultado false true

Ejemplos: Considere que: A = 10, B = 20, C = 30 entonces:

A>0 ! (A > 0)

=> true => ! true = false => true && ! true = true && false = false => true || ! false = true || true = true => !(true || true) = ! true = false

A > 0 && ! (B > 0) A < C || ! (B==C) !(A==10 || B==20)

!(!(B==20) || !(C==40))=> !(! true || ! false) = ! (false || true) = ! true = false !!(A!=15) || !(B==20) => !! true || ! true = ! false || false = true || false = true

4.1.2 Estructura Condicional < if > Es una estructura que bifurca el flujo de ejecucin del cdigo del programa en funcin del resultado de una expresin booleana. Sintaxis if(<Expresin booleana>) {<Inicio de bloque> <Bloque de Cdigo> }<Fin de bloque> <Continuacin del programa>

dnde: Expresin booleana: Debe siempre retornar true o false. Inicio de bloque: La llave abierta que indica el inicio del cuerpo de cdigo a ejecutarse si la expresin booleana retorna true. Bloque de Cdigo: El compilador va a ejecutarlo siempre que la expresin booleana retorne true. Fin de bloque: La llave cerrada indica el fin del cuerpo de cdigo a ejecutarse si la expresin booleana retorna true. Continuacin del programa: Si la expresin booleana dentro de la instruccin < if > retorna false el compilador salta hacia continuacin del programa.

Ejemplos: Promedio = 10.5; if( Promedio < 10.5 ){ flag_desaprobado = true; printf("Condicion Alumno: Repitente");

Salta }

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

Para este ejemplo no se ejecuta las instrucciones: flag_desaprobado = true; printf("Condicion Alumno: Repitente");

Cuando el compilador llegue hasta la evaluacin dentro de la instruccin < if > como el promedio no es menor sino igual a 10.5 saltar hasta la instruccin: 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 tambin: scanf("Ingrese Nota1: %d", %n1);

4.1.3 Estructura Condicional < if else > Es la estructura que bifurca el flujo de ejecucin del cdigo del programa con una estructura alternativa en funcin del resultado de una expresin booleana.

Sintaxis

if(<Expresin booleana>) {<Inicio de bloque if> <Bloque de Cdigo if> }<Fin de bloque if> else {<Inicio de bloque else> <Bloque de Cdigo else> }<Fin de bloque else> <Continuacin del programa> dnde:

Expresin booleana: Debe siempre retornar true o false. Inicio de bloque if: La llave abierta que indica el inicio del cuerpo de cdigo a ejecutarse si la expresin booleana retorna true. Bloque de Cdigo if: El compilador va a ejecutarlo siempre que la expresin booleana retorne true. Fin de bloque if: La llave cerrada indica el fin del cuerpo de cdigo a ejecutarse si la expresin booleana retorna true. Inicio de bloque else: La llave abierta que indica el inicio del cuerpo de cdigo a ejecutarse si la expresin booleana retorna false. Bloque de Cdigo else: El compilador va a ejecutarlo siempre que la expresin booleana retorne false. Fin de bloque else: La llave cerrada indica el fin del cuerpo de cdigo a ejecutarse si la expresin booleana retorna false. Continuacin del programa: En este caso de estructura condicional como tiene parte alternativa <else> este debe ejecutarse primero antes de la continuacin del programa. En este tipo de estructuras solo un bloque se ejecuta: el bloque de cdigo if o el bloque de cdigo else, ms no los dos bloques.

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 ocurrira si el Promedio=10 en ese caso se ejecutara el bloque < else >.

La instruccin <if> del ejemplo anterior se puede escribir de la siguiente forma:

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

O tambin:

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

La razn es que en C++ son necesarias las llaves solo si un bloque tiene 2 a ms instrucciones.

En C++ existe una forma adicional de condicional que simula la instruccin <if>, que no es recomendada, pero que quizs observen en algunos cdigos 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 devolvern por pantalla: "A No es 10".

4.1.4 Estructura Condicional anidada < if else if > Es la estructura con n alternativas de bifurcacin del flujo de ejecucin del cdigo del programa, en funcin del resultado de mltiples expresiones booleanas. Sintaxis

if(<Expresin booleana 1>){ <Bloque de Cdigo 1> }else if(<Expresin booleana 2>){ <Bloque de Cdigo 2>

}else .. if(<Expresin booleana n>){ <Bloque de Cdigo n> } <Continuacin del programa>

dnde:

Expresin booleana 1,2,n: Debe siempre retornar true o false en la respectiva expresin booleana. Bloque de Cdigo 1,2,n: El compilador va a ejecutarlo siempre que la expresin booleana respectiva retorne true. Continuacin del programa: Si la estructura anidada tiene al final un bloque <else> en ese caso debe ejecutarse primero antes de la continuacin del programa. Si no tuviese un bloque < else > al final, el compilador de no encontrar ningn true en las estructuras booleana saltar a la continuacin del programa. Ejemplos:

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

Para este ejemplo el resultado ser Numero Positivo

La instruccin < 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 tambin:

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 ms fcil de entender e interpretar.

Este tipo de estructura es solo una variacin 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 evale varias condiciones.

4.1.5 Estructura selectiva mltiple < switch > A diferencia de la instruccin < if - else > en C++ esta estructura puede evaluar solo una variable y solo puede comparar igualdad adems no permite la combinacin con operadores lgicos como && (Y lgico por ejemplo), en su lugar puede combinar el || (O lgico) de forma homologa.

Sintaxis

switch (<variable a comparar>) { case <valor a comparar 1> : <Bloque de instruccin 1> break; case <valor a comparar 2> : <Bloque de instruccin 2> break; .. case <valor a comparar i> : <Bloque de instruccin i> break; .. case <valor a comparar n> : <Bloque de instruccin n> break; default: <Bloque de instruccin default> break; }

Dnde:

<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 instruccin i>: Conjunto de instrucciones a ejecutarse si es que el <valor a comparar i> respectivo retorna true. <Bloque de instruccin default>: Conjunto de instrucciones a ejecutarse si es que la variable a comparar no coincide con ninguno de los <valor a comparar i>. break: Instruccin C++ para bifurcar o saltar al final de la estructura switch. De no invocar a la instruccin break si es que encuentra coincidencia seguir evaluando los siguientes case de la instruccin. Ejemplos:

char sexo; printf("Ingrese sexo de persona (M, F):"); sexo=getchar();

switch(sexo){ case 'M': printf("Masculino"); break; case 'F':

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

La funcin getchar() permite el ingreso por teclado de un carcter. Para el ejemplo anterior mostrado supongamos que se ingres por teclado el carcter 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 maysculas o minsculas. 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 continuacin mencionamos unos consejos para la eleccin 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 nmero ingresado solo si es mayor a 10 y solo si es par.

a) Solucin anidada

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

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

Aunque esta solucin es vlida, dificulta la lectura cuando se cuenta con varios niveles de anidamiento y con ms instrucciones. b) Solucin recomendada

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

La debilidad de esta forma es que se generan ms lneas de cdigo, no obstante en los problemas computacionales en algn momento va a pesar ms el entendimiento que las lneas de cdigo.

4) Para evaluaciones con tipos booleanos, usar los booleanos: Ejemplo: Decir si un numero pasa la prueba de validacin. Debe ser mltiplo de 3 y la vez divisible por 18.

a) Solucin psima

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

Esta solucin es a menudo utilizada, inicializar como false y luego preguntar si pasa la prueba y asignar a true. c) Solucin 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 ms conocimiento tcnico sabemos que una expresin booleana retorna dos valores (true o false) entonces, no es necesario preguntar con < if > por lo tanto es vlido < pasa_prueba = ( A % 3 == 0 && 18 % A == 0 ); >. Adems tampoco es necesario if( pasa_prueba == true ) puesto que el cdigo del < if > se va a ejecutar si la expresin retorna true, pero la variable pasa_prueba solo tiene (true o false) como valor por lo tanto es vlido 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 >, adems de lo explicado anteriormente. 6) Evite en lo posible utilizar switch para comparar muchos valores: Ejemplo Mostrar un mensaje si un carcter ingresado por teclado es una vocal minscula.

a) Solucin no recomendada

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

b) Solucin recomendada

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

7) Utilice sangras. Hasta ahora no habamos resaltado la importancia de estas, sin embargo son esenciales para la lectura del cdigo. Tenemos fortuna de utilizar C++, pues antiguamente no contbamos con estas, asi que a sangrar cdigo. Para hacer un sangrado es usualmente utilizada la tecla < Tab >. Ejemplo a) Sin sangra 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"); }

b) Con sangra
if( A > 0 ){ if( A == 5 ) printf("Es else printf("No } else if ( A < 0 ){ if( A == -5 ) printf("Es else printf("No }

cinco positivo"); es cinco positivo");

cinco negativo"); es cinco negativo");

8) Fjese y utilice las ayudas del editor de cdigo 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 solucin cuando es difcil el problema y no muestra los resultados esperados. Use marcadores y validaciones de usuario, es decir asegrese 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 anlisis despus de todo Un vistazo no est de ms.

4.2 Estructuras repetitivas


Son estructuras en las cuales un bloque de cdigo puede ser ejecutado un nmero de veces, ya sea por un nmero que represente la cantidad de veces o por una expresin booleana.

4.2.1 Conceptos acerca de estructuras repetitivas Bucle: Es el funcionamiento o el proceso de dar vueltas (repetir) de la estructura repetitiva.

INICIO ESTRUCTURA REPETITIVA

Bucle

FIN ESTRUCTURA REPETITIVA

Iteracin: Es cada repeticin del bucle. Por ejemplo si una estructura repetitiva tiene 3 repeticiones, tendr iteracin 1, Iteracin 2 e Iteracin 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 A = A + 1; A = A - 1; A = A + 3; A = A - 4; A = A + n; A = A - n; A = A * 5; A = A / 6;

Modo Reducido A++; A--; A+=3; A-=4; A+=n; A-=n; A*=5; A/=6;

Explicacin La variable incrementa su valor en 1 La variable decrementa su valor en 1 La variable incrementa su valor en 3 La variable decrementa su valor en 4 La variable incrementa su valor en n La variable decrementa su valor en n La variable multiplica su valor en 5 La variable divide su valor en 6

4.2.3 inicializacin de variables Antes de utilizar una variable es necesario que esta tenga un valor contenido, ya sea por teclado o asignacin. En estructuras repetitivas su uso muy amplio, y en aplicaciones reales son utilizadas de muchas formas. En un sentido es una asignacin simple. Para tal caso mostraremos un ejemplo:

//Declaracion de variables int A; bool bandera; //inicializacin 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 ejecucin y si el programa es complejo puede no detectarse rpidamente

Para el caso de estructuras repetitivas (Punto a ver a continuacin) es general inicializar las variables a cero.

En trminos prcticos 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 sern 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

Son variables que van a funcionar como recolectoras de resultados individuales, es decir de cada iteracin. 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 algn aspecto de identificacin dentro del programa. Su uso se extiende en las estructuras repetitivas para determinar la continuacin 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 mltiples 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 cdigo 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 ms adelante estructuras que nos ayudaran en esos casos.

Sintaxis for ( <valor inicial> ; <expresin booleana para continuar> ; <incremento / decremento> ) {//opcional, si hay ms de 1 instruccin <bloque de cdigo> }//opcional, si hay ms de 1 instruccin

<valor inicial> :variable con dato o punto de inicio del bucle. <expresin booleana para continuar>: si retorna true contina el bucle, caso contrario termina. <incremento / decremento>: incremento o paso de variable dentro del bucle <bloque de cdigo>: Instrucciones a repetirse dentro del bucle

Orden de evaluacin del compilador a la estructura < for > La primera vez: for( 1 ; 2; 4 ) { 3, solo si la expresin booleana retorna true }

Las veces restantes: for( <omitido> ; 1; 3 ) { 2, solo si la expresin booleana retorna true }

Ejemplo: Mostrar los 7 primeros nmeros naturales positivos: final=7; for( indice = 1 ; indice <= final ; indice = indice + 1 ) printf("\n Numero: %d", indice);

Explicacin del cdigo:

Iteracin 1 2 3 4 5 6 7

ndice 1 2 3 4 5 6 7 8

expresin booleana 1 <= 7 = true 2 <= 7 = true 3 <= 7 = true 4 <= 7 = true 5 <= 7 = true 6 <= 7 = true 7 <= 7 = true 8 <= 7 = true

ejecucin cdigo printf("\n Numero: %d", 1); printf("\n Numero: %d", 2); printf("\n Numero: %d", 3); printf("\n Numero: %d", 4); printf("\n Numero: %d", 5); printf("\n Numero: %d", 6); printf("\n Numero: %d", 7); <No ejecuta cdigo>

estado bucle Continua Continua Continua Continua Continua Continua Continua Termina

Notar que al final del bucle la variable ndice queda con el valor final del bucle ms el incremento, es decir: ndice = final + incremento. La expresin 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 cdigo anterior da como resultado: Numero: 1 Numero: 2 Numero: 3 Numero: 4 Numero: 5 Numero: 6 Numero: 7

Forma alternativa de estructura repetitiva < for > Una forma adicional de la estructura < for > es utilizarla como instruccin en los problemas algortmicos y es a menudo para abreviar conteos o para marcar posiciones.

for (<valor inicial> ; <expresin booleana para continuar> ; <incremento / decremento>) ;

Notar que la instruccin < for > termina en < ; > Puede ser utilizada para obtener precisamente el valor final del <valor inicial> al finalizar el bucle. Esta no es la forma ms fcil de usar < for > pues puede crear confusiones, sin embargo en aplicaciones prcticas veremos su uso. Ejemplo: final=7; for ( indice = 1; indice <= final ; indice = indice + 1 ); printf("\n Numero: %d", indice);

El bloque de cdigo anterior da como resultado:

Numero: 8

Trabajo con mltiples 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:

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

Resultado:

Positivo: 1 Positivo: 2 Positivo: 3 Positivo: 4 Positivo: 5 Positivo: 6 Positivo: 7

Negativo: -1 Negativo: -2 Negativo: -3 Negativo: -4 Negativo: -5 Negativo: -6 Negativo: -7

Nota: Como ltimo recurso tambin 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 cdigo del programa.

4.2.6 Estructura repetitiva < while > Es la estructura repetitiva para evaluar una expresin booleana y entonces ejecutar un bloque de cdigo. A diferencia del < for > no siempre cuenta con los lmites de las iteraciones (Valor inicial y valor final). Sintaxis while (<expresin booleana>) { <bloque de cdigo> }

<expresin booleana>: Retorna true o false. <bloque de cdigo>: Se ejecuta siempre que la expresin 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 nmeros impares positivos y adems al final muestra la suma de ellos.

Notar las inicializaciones S=0 porque va a acumular, C=1 porque es el primer nmero impar, final=15 es el lmite superior. Para este ejemplo S es el acumulador <S+=C> en cada iteracin acumula a la variable C.

C trabaja como el nmero impar de la iteracin 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 instruccin printf que imprime por pantalla a la variable C (nmero impar de cada iteracin) con un salto de lnea, y al finalizar el bucle imprime la suma con dos saltos de lnea < printf("\n\nSuma: %d",S); >.

Detalle Trabajo de la Estructura Repetitiva:

Iteracin <Inicializacin> 1 2 3 4 5 6 7 8

final 15 15 15 15 15 15 15 15 15

S 0 1 4 9 16 25 36 49 64

C 1 3 5 7 9 11 13 15 17

C <= final

Estado Bucle

3 <= 15 = true 5 <= 15 = true 7 <= 15 = true 9 <= 15 = true 11 <= 15 = true 13 <= 15 = true 15 < = 15 = true 17 < = 15 = false

Continua Continua Continua Continua Continua Continua Continua Termina

El resultado es:

1 3 5 7 9 11 13 15

Suma: 64

4.2.7 Estructura repetitiva < do - while > Es la estructura repetitiva para ejecutar un bloque de cdigo por lo menos una vez, y evaluar una expresin booleana.

Sintaxis

do{ <bloque de cdigo> } while (<expresin booleana>);

(<expresin booleana>): Retorna true o false. <bloque de cdigo>: Se ejecuta al menos una vez antes de que se evalu la expresin booleana, para que se repita dicha expresin debe retornar true.

Ejemplo: Ingresar una secuencia de nmeros, mostrar por pantalla los nmeros ingresados y su suma, hasta que el usuario decida no ingresar ms nmeros.

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

Notar las inicializaciones < S=0; > porque va a acumular, N es el nmero ingresado en la iteracin respectiva, < op > es la variable con la opcin de seguir ingresando ms nmeros. 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 nmeros. Luego se ingresa el carcter por teclado mediante getchar() y se guarda en la variable op Entonces llega a la expresin 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 nmeros ingresados < printf("\n\nSuma: %d",S); >.

Detalle Trabajo de la Estructura Repetitiva:

Iteracin <Inicializacin> 1 2 3 4 5

S 0

op

op!='N' && op!='n'

Estado Bucle Continua Continua Continua Continua Termina

5 1 9 7 50

5 6 15 22 72

S S S S N

'S'!='N' && 'S'!='n' = true 'S'!='N' && 'S'!='n' = true 'S'!='N' && 'S'!='n' = true 'S'!='N' && 'S'!='n' = true 'N'!='N' && 'N'!='n' = false

< N > es un valor ingresado por teclado, es decir pueden ser cualquier nmero. < op > es un carcter ingresado por teclado, para el ejemplo el usuario afirmo ingresar 4 nmeros pero, como se usa la estructura < do- while > se ejecuta la primera vez sin evaluar.

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

4.2.8 Anidamiento de bucles Del mismo modo en que se puede anidar las estructuras condicionales, tambin 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 nmero ingresado por teclado. Se debe solicitar la finalizacin del programa.

char op; int N; do{ printf("\nIngrese numero: "); scanf("%d", &N); 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");

fflush(stdin);

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 lmites a iterar use la estructura < for >.

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 instruccin 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 nmero N desde 1 hasta 4, puesto que cuando llega a 5 est la instruccin break, por lo tanto termina la instruccin < for >.

4) Evite anidamientos de estructuras condicionales. Si necesita validaciones dentro de la estructura utilice la instruccin 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

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 nmero <N>, pero si el indice es distinto a 5 itera nuevamente por la instruccin continue, solo cuando llega a 5 muestra por pantalla el resultado.

5) Minimice el uso de constantes. En los bucles como en la mayora de casos es de usarse variables por ms esttica que parezca, ya cada vez ms 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++)

S+= precio * IGV;

La forma no recomendada parece correcta, pero si pensamos bien el porcentaje 0.18 representa el IGV y aunque por aos se mantiene esa tasa, en algn momento de seguro su valor cambiara a 0.19, 0.17 u otro. Respecto a NroMeses=12, fcilmente se puede pensar que ese valor no va a cambiar, mas la lectura puede volverse menos tediosa cuando dejamos de ver el cdigo del programa por algn tiempo y cuando volvamos a ver sabremos rpidamente que ese 12 que hubiesemos dejado representa los nmeros de meses del ao. 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 iteracin se deben inicializar dentro del bucle respectivo.

7) Use estructuras condicionales para asegurarse que las variables de la iteracin son las correctas e imprmalas. Ejemplo

Supongamos que se desea sumar todos los mltiplos 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 nmero 97930 tambin se est sumando, entonces podramos aadir:

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 nmero est siendo sumado. No obstante este ejemplo es solo una suposicin, ya que sabemos que 97930 es mltiplo de 7. Pues tambin podemos averiguarlo con 97930 % 7, como el resultado del mdulo es cero decimos que si es mltiplo de 7.

8) Cudese de los bucles sin fin. Cuando en un bucle la expresin booleana que la controla nunca retorna false entonces habremos cado en un bucle infinito. Un poco de prctica 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 condicin de la variable S dentro del cdigo 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.

4.3 Introduccin a C++

4.3.1 Resea histrica C++ tiene sus orgenes en la dcada de los 70 y en ese entonces fue creado como C y su funcin fue para mantener el sistema operativo UNIX y su creador fue Bjarne Stroustrup de la compaa AT&T. Previamente hubo lenguajes: BCPL -> B -> C -> C++, pero no fue contundente como lo es hoy C++, C comparte muchas caractersticas de C++ pero C++ hoy es ms popular por su manejo mejorado de memoria, funcionalidades adems de contar con programacin orientada a objetos.

4.3.2 Directivas y palabras reservadas bsicas. El lenguaje C++ utiliza directivas o archivos de cabecera que proporciona informacin 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 bsico debe tener escrito al inicio del programa: #include <iostream> using namespace std;

fflush(stdin) Es la funcin de C++ que va a eliminar los caracteres sobrantes en una entrada, el no utilizarla provocar errores de entrada de mltiples variables. Se suele llamar a esta instruccin inmediatamente luego de usar una instruccin scanf. gets(<variable carcter>) Funcion para ingresar una cadena de caracteres. system("PAUSE") Es el comando de C++ para detener la ejecucin hasta que se presione la tecla < Enter >. system("CLS") Es el comando de C++ para borrar la pantalla de ejecucin. exit(0) Termina inmediatamente el programa.

getchar() La funcin que permite el ingreso por teclado de un carcter. 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 lnea de cdigo //Comentario de una sola lnea de cdigo

Para comentar varias lneas de cdigo /* Comentario de varias lneas de cdigo */

4.3.3 Estructura de un programa en C++ Un programa en C++ se compone de directivas con archivos de cabecera, la funcin principal main, declaracin de variables e instrucciones validas de C++, a continuacin se muestra un ejemplo sencillo completo de un programa que enva por pantalla un mensaje HOLA MUNDO.

//Archivos de encabezado #include <iostream> using namespace std; //Inicio de funcin principal void main(){

//Instrucciones C++ printf("\nHOLA MUNDO\n"); system("PAUSE"); }

4.3.4 Creacin, ejecucin y depuracin de un programa mediante Visual Studio .Net Creacin

Para crear un programa en C++, utilizaremos Visual Studio .Net

Ingresamos al men Archivo Nuevo Proyecto

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

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.

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

Ejecucin Ahora ejecutaremos el siguiente programa con la tecla < F5 > o en el botn verde con smbolo de play de la barra de men:

Se mostrara la ventana de ejecucin:

Depuracin Es el seguimiento y visualizacin del cdigo de un programa mientras se ejecuta. En el men depurar se cuenta con algunas opciones de depuracin:

Adems se puede iniciar la depuracin en un punto escogido por el desarrollador haciendo click, y luego ejecutando:

Al pasar el mouse por encima de alguna instruccin de C++ muestra un pequeo mensaje.

Tambin se puede seleccionar variable para una inspeccin rpida.

Desplazarse en el cdigo con los botones de depuracin.

Detener la ejecucin o depuracin presionamos el botn stop.

Captulo 5 EJERCICIOS DE AUTOEVALUACION


5.1 Estructuras Simples 5.2 Estructura condicional < if - else > 5.3 Estructura de selectiva mltiple < switch > 5.4 Estructura repetitiva < for > 5.5 Estructura repetitiva < while > y < do - while > 5.6 Anidamiento de bucles

5.1 Estructuras Simples


/**********************Inicio del Programa*************************** Ejercicio 01: Ingrese por teclado un nmero, calcular y mostrar: -El doble del nmero ingresado -La 3ra. parte del nmero ingresado. -El cubo del nmero 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);

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 centmetros, 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 descripcin, precio y cantidad vendida de un producto, calcular y mostrar: -Importe de la compra -Impuesto general a las ventas (18%) -Importe Final

*********************************************************************/ #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 nmero de 3 cifras, calcular y mostrar: - Suma de las cifras - EL nmero 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");

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

/**********************Inicio del Programa*************************** Ejercicio 06: Ingrese por teclado el nmero 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 = alufal = nro_alu / aula; 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(){

int seg, hor, min, seg_res, segxhor=3600, segxmin=60; printf("\nIngrese numero de segundos: "); scanf("%d", &seg); fflush(stdin); hor = min = seg_res seg / segxhor; (seg % segxhor) / segxmin; = ((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 distribucin, 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 B50 B20 B10 M5 M2 M1 = sueldo = = = = = = /100; (sueldo % 100) / 50; ((sueldo % 100) % 50) / 20; (((sueldo % 100) % 50) % 20) / 10; ((((sueldo % 100) % 50) % 20) % 10) / 5; (((((sueldo % 100) % 50) % 20) % 10) % 5) / 2; (((((sueldo % 100) % 50) % 20) % 10) % 5) % 2 ;

centavos_real = sueldo_real - sueldo; centavos = centavos_real * 10; printf("\n\nCentavos:%d", centavos); M05 M02 = = centavos / 5; (centavos % 5) / 2;

M01

(centavos % 5) % 2;

printf("\n\n printf("\n\n printf("\n\n printf("\n\n

Numero Numero Numero Numero

Billetes Billetes Billetes Billetes

de de de de

100: %d", B100); 50: %d", B50); 20: %d", B20); 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 (da, mes ao) 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);

//Pasamos los datos a das tdfa=(aa*anio)+(ma*mes)+da; tdfn=(an*anio)+(mn*mes)+dn; //Restamos los das tdv=tdfa-tdfn; //Pasamos a formato ao, mes y da 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 nmeros, 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****************************/

5.2 Estructura condicional < if - else >

/**********************Inicio del Programa*************************** Ejercicio 01: Ingrese por teclado un nmero 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****************************/

/**********************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 bonificacin 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);

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;

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

printf("\n\rEl menor es: %d", menor); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

/********************************************************************* Ejercicio 08: Realizar la siguiente funcion: |X , |X + 5, Z => |1 / X, |5X -4, |X3 , 1<=X<=5 5< X <=25 25< X <=50 50< X <=90 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){

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 && D = nro U = nro bandera } nro <=99 ) { / 10; % 10; = 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****************************/

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

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

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 double double double PI=3.14159, radio, area; diametro,largo,ancho; precio_redonda, preciounit_redonda; 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);

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

5.3 Estructura de selectiva mltiple < switch >

/********************************************************************* Ejercicio 01: Se pide ingresar un nmero del uno al veinte, imprima dicho nmero 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 case case case case case case case case case case case case case case case case case case case }

1: printf("Uno");break; 2: printf("Dos");break; 3: printf("Tres");break; 4: printf("Cuatro");break; 5: printf("Cinco");break; 6: printf("Seis");break; 7: printf("Siete");break; 8: printf("Ocho");break; 9: printf("Nueve");break; 10:printf("Diez");break; 11:printf("Once");break; 12:printf("Doce");break; 13:printf("Trece");break; 14:printf("Catorce");break; 15:printf("Quince");break; 16:printf("Diez y Seis");break; 17:printf("Diez y siete");break; 18:printf("Diez y ocho");break; 19:printf("Diez y nueve");break; 20:printf("Veinte");break;

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

/********************************************************************* Ejercicio 02: Realizar un algoritmo que lea un numero que represente el da de semana. Muestre el numero en dias: (Lunes=1, Martes=2, , Domingo=7).

*********************************************************************/ #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 nmeros y a continuacin un operador aritmtico (+, -, *, /). El algoritmo debe calcular el resultado de la operacin 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 '+': case '-': case '*': case '/':

printf("%8.2lf", printf("%8.2lf", printf("%8.2lf", printf("%8.2lf",

n1 n1 n1 n1

+ * /

n2);break; n2);break; n2);break; n2);break;

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 nmeros y a continuacin un operador aritmtico (+, -, *, /). El algoritmo debe calcular el resultado de la operacin 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 '+': case '-': case '*': case '/':

printf("%8.2lf", printf("%8.2lf", printf("%8.2lf", printf("%8.2lf",

n1 n1 n1 n1

+ * /

n2);break; n2);break; n2);break; n2);break;

default: printf("Operacion ingresada No reconodido");break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/

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, i, i * 2, i * 3, i * i);

doble %d, triple %d y su cuadrado %d.",

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

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

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

} /***************************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 fin }else{ ini fin }

= n2; = n1; = n1; = 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(){

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;

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

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

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 genre las siguientes secuencias: a) b) c) d) e) f) -2 -4 -6 -8 -10...N 3.3 4.4 5.5 6.6 7.7 8.8...N 1 4 9 16 25 36...N -1 +2 -3 +4 -5 +6 -7...N -1 3 15 35 63 99...N 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);

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

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

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

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

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.

*********************************************************************/ #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 );

printf("\n\r printf("\n\r printf("\n\r printf("\n\r

Cantidad Pares : %ld", cp); Cantidad ImPares : %ld", ci); Cantidad Multiplos 7 : %ld", c7); 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

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

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

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 final50 final10 = Monto / B100; = Monto / B50; = 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 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****************************/

B50: %d B10: %d",

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

(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+=5; s+=termino; } printf("\n\nLa suma es...%u",s); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ ",base, i, termino);

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

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

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

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

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

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

1:printf("I");break; 2:printf("II");break; 3:printf("III");break; 4:printf("IV");break; 5:printf("V");break; 6:printf("VI");break; 7:printf("VII");break; 8:printf("VIII");break; 9:printf("IX");break;

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

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

Captulo 6 Funciones Predefinidas de C++


6.1 Concepto de Funcin 6.2 Funciones Aritmticas 6.3 Funciones trigonomtricas 6.4 Funciones de caracteres 6.5 Funciones de Cadena 6.6 Generador de nmeros aleatorios 6.7 De Control de pantalla

6
Introduccin

Funciones Predefinidas de C++

Los desarrolladores en C++, hacen sus programas teniendo siempre en mente escribir lo menos posible reutilizando bloques de cdigo, dividiendo mentalmente las partes del programa (entrada proceso salida) como divisiones principales. Adems 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 funcin para ingresar con ms visin a las funciones.

6.1 Concepto de Funcin


Una funcin es un conjunto de instrucciones con una tarea determinada, una funcin es utilizada para dividir un programa en subprogramas con tareas propias de la funcin. Una funcin siempre devuelve valor. Para ver definicin de funciones Vase captulo 7.

6.2 Funciones Aritmticas

Funcin

Descripcin

Tipo Dato Argumento double float long double

Tipo Dato devuelto double float long double

Ejemplo sqrt(4.0) sqrt(4.0) sqrt(4) pow(2.0, 3.0) pow(2.0, 3) pow(2.0, 3.0) pow(2.0, 3) pow(20.0, 3)

sqrt

Raz cuadrada

Valor devuelto ejemplo 2.0 2.0 2 8.0 8.0 8.0 8.0 8000.0

Librera (**) math.h

pow (*)

Potencias

float long double

float long double

math.h

double float abs Valor Absoluto int long long double double Techo(redondeo arriba) float long double double float floor Piso(redondeo abajo) long double double float long double double float long double double float long double

double float int long long double double float long double double float long double double float long double double float long double double float long double

ceil

exp

Exponencial

abs(-7.0) abs(7.0) abs(-7.0) abs(7.0) abs(-7) abs(7) abs(-70000) abs(70000) abs(70000.0) abs(70000.0) ceil(3.2) ceil(3.9) ceil(3.2) ceil(3.9) ceil(30000.2 ) ceil(30000.9 ) floor(3.2) floor (3.9) floor (3.2) floor (3.9) floor (30000.2) floor (30000.9) exp(1.0) exp(1.0) exp(10.0) log(5.0) log(5.0) log(1000.0) log10(10.0) log10(10.0) log10(1000.0 )

7 7 7 7 7 7 70000 70000 70000.0 70000.0 4.0 4.0 4.0 4.0 30001.0 30001.0 3.0 3.0 3.0 3.0 30000.0 30000.0 2.7 2.7 22026.5 1.6 1.6 6.9 1.0 1.0 3.0

math.h

stdlib.h

math.h

math.h

math.h

log

Logaritmo natural(ln)

math.h

log10

Logaritmo base 10 (ln)

math.h

(*) Para la funcin pow y otras, solo basta con asignar a una variable de tipo del valor devuelto de la funcin o mostrar por pantalla con el formato, por ejemplo: Guardando el valor en variable:

double base=2.0, exponente=3.0, resultado;

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 trigonomtricas

Funcin

Descripcin

Tipo Dato Argumento double float long double double float long double double float long double double float long double double float long double double float long double double float long double double float long double

Tipo Dato devuelto double float long double float long double double float long double double float long double double float long double double float long double double float long double double float long double

Ejemplo(*) cos(0.0) cos(0.0) cos(1000.0) acos(1.0) acos(1.0) acos(0.5) sin(0.5) sin(0.5) sin(10.0) asin(0.8) asin(0.8) asin(1.0) tan(1.0) tan(1.0) tan(100.0) atan(0.8) atan(0.8) atan(100.0) cosh(1.0) cosh(1.0) cosh(10.0) tanh(1.0) tanh(1.0) tanh(0.5)

cos

Coseno

acos

Arco Coseno

sin

Seno

asin

Arco Seno

tan

Tangente Arco Tangente Coseno Hiperblico Tangente Hiperblico

atan

cosh

tanh

Valor devuelto ejemplo 1.0 1.0 0.6 0.0 0.0 1.0 0.5 0.5 -0.5 0.9 0.9 1.6 1.6 1.6 -0.6 0.7 0.7 1.6 1.5 1.5 11013.2 0.8 0.8 0.5

Librera (**) math.h

math.h math.h

math.h

math.h

math.h

math.h

math.h

(*) Notar que en los ejemplos se asignan como parmetros constantes de tipo real, pues todos aceptan reales ya sea double, float o long double, no obstante tambin es posible asignar variables con el tipo solicitado en la funcin.

6.4 Funciones de caracteres


Muchas de las funciones predefinidas toman como base la tabla de cdigos ascii. Para hacer comparaciones, conversiones y bsquedas generalmente es trabajado mediante el nmero de cdigo de cada carcter. A continuacin mostramos la tabla de cdigo ascii con los caracteres imprimibles.

Tabla de cdigos ascii Imprimibles

Cdigo (*)32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

Carcter

Cdigo 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

Carcter 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O

Cdigo 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 (*)95 96 97 98 99 100 101 102 103

Carcter P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g

Cdigo 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

Carcter h i j k l m n o p q r s t u v w x y z { | } ~

! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7

La tabla muestra los caracteres imprimibles por pantalla incluyendo el carcter con cdigo nmero 32 que representa el espacio en blanco y el carcter nmero 95 es la lnea inferior. Funciones de caracteres

Funcin

Descripcin Devuelve true si su argumento satisface isalpha o isdigit. Caso contrario devuelve false. Devuelve true si su argumento es letra (Mayscula o Minscula). Caso contrario devuelve false. Devuelve true si su argumento es un digito. Caso contrario devuelve false. Devuelve true si su argumento es un carcter imprimible que no satisface isalnum y no es espacio en blanco (Caracteres de puntuacin). Caso contrario devuelve false. Devuelve true si su argumento es un carcter de espacio en blanco (Tabular, Enter). Caso contrario devuelve false. Devuelve true si su argumento es un carcter de control. Caso contrario devuelve false. Devuelve true si su argumento es letra

Tipo Dato Argumento

Tipo Dato devuelto

Ejemplo(*)

Valor devuelt o ejemplo true true false

Librera (**)

isalnum

char

bool

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

ctype.h

isalpha

char

bool

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

true false false

ctype.h

isdigit

char

bool

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

false true false

ctype.h

ispunct

char

bool

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

false false true

ctype.h

isspace

char

bool

isspace( ' ') isspace(' ') isspace('\n' ) iscntrl ( char(127) ) islower('a') islower('A')

true true true

ctype.h

iscntrl (*)

char

bool

true

ctype.h

islower

char

bool

true false

ctype.h

Minscula. Caso contrario devuelve false. Devuelve true si su argumento es letra Mayscula. Caso contrario devuelve false. Devuelve la versin en minscula de su argumento. Si no tiene minscula devuelve el mismo argumento Devuelve la versin en mayscula de su argumento. Si no tiene mayscula devuelve el mismo argumento

islower('+')

false

isupper

char

bool

isupper ('a') isupper ('A') isupper ('+') tolower('A') tolower('a') tolower('+') toupper('A') toupper('a') toupper('+')

false true false

ctype.h

tolower

char

char

a a + A A +

ctype.h

toupper

char

char

ctype.h

(*) Hay una forma de averiguar cules 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 cdigo ascii esta entre (1-31) y el 127. Son caracteres no imprimibles por ejemplo el nmero 10 que representa la tecla <Enter>

6.5 Funciones de Cadena

Prototipo int atoi (char* <cadena>)

Descripcin Convierte <cadena> hacia un int

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

Valor devuelto ejemplo 10

Librera (**) stdlib.h

long atol (char* <cadena>) double atof (char* <cadena>) char* strcat( char* <cad_destino>, char* <cad_origen> ) int strcmp( char* <cadena1>, char* <cadena2>) char* strcpy( char* <cad_destino>, char* <Expresioncad>) int strlen (char* <cadena>) char* strncat( char* <cad_destino>, char* <cad_origen>, int <n>) int strncmp( char* <cadena1>, char* <cadena2>, int <n>)

Convierte <cadena> hacia un long Convierte <cadena> hacia un double Anexa o junta <cad_origen > al final de <cad_destino> Devuelve 0, si las cadenas son iguales, 1 si <cadena1> es mayor a <cadena2> y -1 si es menor (*) Cambia el valor de <Expresioncad> hacia <cad_destino> Devuelve la longitud de <cadena> Anexa o junta <n> caracteres de <cad_origen > al final de <cad_destino> Compara <n> caracteres de <cadena1> con <cadena2> Devuelve un puntero a la primera ocurrencia de la cadena <Patrn> en <cadena> y NULL si no lo encuentra Devuelve un puntero a la primera ocurrencia de la cadena <

char cad[2]={'0','5'}; atol(cad); char cad[3]={'0','.','5'}; atof(cad) char cad1[10]={'A','B'}; char cad2[2]={'C'}; strcat(cad1, cad2); printf("\n%s", cad1); char cad1[1]={'A'}; char cad2[1]={'A'}; printf("\n%d", strcmp(cad1, cad2));

stdlib.h

0.5

math.h

ABC

string.h

string.h

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

ABC

string.h

ABC

string.h

ABC

string.h

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

string.h

char* strstr( char* <cadena>, char* <Patrn>)

BC

string.h

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

BAB

string.h

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

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

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

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 libreras mostradas en las tablas son automticamente referenciadas en Visual Studio .Net por la ya conocida referencia:

#include <iostream> using namespace std;

6.6 Generador de nmeros aleatorios


A menudo en los problemas computacionales es necesario generar nmeros al azar o aleatorios. A continuacin mostramos la forma de generar nmeros 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 nmeros aleatorios:

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

Establecemos los lmites de generacin de nmeros (50-150):

desde=50; hasta=150;

Generamos el nmero aleatorio y lo guardamos en la variable Nmero:

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

En general la frmula para generar nmeros aleatorios entre a y b: a + rand() % (1 + b - a)

Captulo 7 Programacin Modular


7.1 Diseo descendente 7.2 Subprogramas 7.3 Variables globales y locales 7.4 Funciones 7.4.1 Definicin de funciones 7.4.2 Invocacin a las funciones 7.5 Procedimientos 7.5.1 Definicin de Procedimientos 7.5.2 Invocacin a las Procedimientos 7.6 Tipos de Parmetros

7
Introduccin

Programacin Modular

Los desarrolladores en C++, hacen sus programas teniendo siempre en mente el conocido dicho Divide y vencers, 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, abstraccin o por reutilizacin. Un mdulo representa un bloque abstracto de cdigo, esto es el programa principal o subprogramas en una solucin a un problema computacional.

7.1 Diseo descendente


Las aplicaciones en C++ y varios lenguajes de programacin tienen como caracterstica el diseo descendente en la escritura de cdigo, es decir de arriba hacia abajo esto significa que en una hoja de cdigo el compilador va a hacer un barrido desde la primera hasta la ltima lnea en la hoja de cdigo.

Lnea 1 xxxxxxxx Lnea 2 xxxxxxxx Lnea 3 xxxxxxxx Lnea 4 xxxxxxxx Lnea 5 xxxxxxxx ... Lnea n-1 ..... Lnea n.....

7.2 Subprogramas
Son subdivisiones que bifurcan o alteran el flujo del cdigo en un programa. Hacia la zona del subprograma, esto puede ser en la hoja de cdigo o en ocasiones a otros archivos.

A continuacin mostramos un esquema de un programa hecho de forma modular:

PROGRAMA PRINCIPAL Lnea 1 xxxxxxxx Lnea 2 xxxxxxxx LLAMA SUBPROGRAMA X Lnea 4 xxxxxxxx Lnea 5 xxxxxxxx Lnea 6 xxxxxxxx LLAMA SUBPROGRAMA X Lnea 8 xxxxxxxx Lnea 9 xxxxxxxx Lnea 10 xxxxxxxx LLAMA SUBPROGRAMA Y Lnea 11 xxxxxxxx Lnea 12 xxxxxxxx ... Lnea n-1 ..... Lnea n.....

SUBPROGRAMA (X) Lnea 1 xxxxxxxx Lnea 2 xxxxxxxx Lnea n-1 ..... Lnea n.....

El esquema representa el flujo de un programa con dos subprogramas.

SUBPROGRAMA (Y) Lnea 1 xxxxxxxx Lnea 2 xxxxxxxx Lnea 3 xxxxxxxx Lnea n.....

Notar que el programa principal cuenta con 2 subprogramas estos puede estar dentro de la hoja de cdigo o en otro archivo. El compilador comienza con la lnea 1, lnea 2 y llega a la lnea en la cual se llama al subprograma X, entonces el flujo brinca al subprograma X entonces comienza a ejecutarse la lnea 1, 2, n del subprograma. Al terminar de ejecutarse el subprograma el flujo retorna al programa principal. Entonces contina el programa principal con la lnea 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 lneas 8,9,10 y llega a la invocacin del subprograma Y, entonces similar a lo que hizo el compilador con el subprograma X hace con Y, ejecuta las lneas del subprograma Y, al finalizar retorna al programa principal hasta terminar de ejecutar lo restante.

7.3 Variables globales y locales


Una variable es global o local en funcin de la zona dentro de la hoja de cdigo 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 mdulo, su valor almacenado es mantenido hasta que termine el modulo.

#include <iostream> using namespace std; void main(){ int nro; //Variable Local del programa principal

7.4 Funciones
Una funcin es un mdulo de instrucciones con una tarea especfica que retorna siempre resultado(s). Este resultado es del tipo de datos con el cual fue definido. Una funcin es cdigo en espera hasta que la funcin sea invocada desde el programa principal, el valor devuelto por la funcin puede ser almacenado o mostrado directamente por pantalla.

7.4.1 Definicin de funciones Para utilizar una funcin antes previamente debe ser definida. A continuacin mostramos la definicin de una funcin: <Tipo de dato> <Nombre Funcin> (<Lista de argumentos>){ <Conjunto de instrucciones> return <valor/variable>; }

Dnde: <Tipo de dato>: Tipo de datos valido C++ (int, double, bool, etc.) Vase apartado 3.1.1

<Nombre Funcin> : Identificador valido C++(Aplica las reglas a nombrar variables Vase 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>:

Valor o variable que la funcin devolver como resultado, cabe decir que este resultado debe ser del tipo de dato declarado por la funcin.

Ejemplo: La siguiente funcin es de tipo entera y retorna la suma de dos nmeros enteros. int f_sumar(int A, int B){ int devolver; devolver = A + B; return devolver; }

7.4.2 Invocacin a las funciones La funcin f_sumar es un cdigo en espera sino hasta que es invocado desde el modulo void main. Para invocar a una funcin se nombra la funcin y se pasan valores como se muestra a continuacin:

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

Una funcin no es necesariamente invocado de la funcin principal void main tambin es posible que sea invocado desde cualquier funcin valida de C++, y todas ellas estarn en espera hasta que sean invocados desde el modulo void main. A continuacin mostraremos como se invoca una funcin dentro de otra:

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; } //Definicin de la funcion f_doble int f_doble(int A){ int devolver; devolver = f_sumar(A, A);//Invocacion a funcin f_sumar return devolver; } //Programa Principal void main(){ int A, resultado; A=10; resultado=f_doble(A);//Invocacion a funcin f_doble printf("%d\n", resultado);//Muestra 20 system("PAUSE"); }

7.5 Procedimientos
Un procedimiento es un tipo de funcin con la nica restriccin que NO retorna resultado(s). Por tanto todas las reglas que se describieron para las funciones son tambin aplicables a los procedimientos. En C++ los procedimientos tambin son conocidos como funciones void. Se concibe a un procedimiento como bloque de cdigo que es anexado al mdulo que lo invoca.

7.5.1 Definicin de Procedimientos Para utilizar un procedimiento antes previamente debe ser definida. A continuacin mostramos la definicin de un procedimiento:

void <Nombre Procedimiento > (<Lista de argumentos>){ <Conjunto de instrucciones> }

Dnde:

<Nombre Procedimiento > : Identificador valido C++(Aplica las reglas a nombrar variables Vase 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.

void f_mostrar(int A){ printf("%d\n", A); system("PAUSE"); }

7.4.2 Invocacin a los Procedimientos El procedimiento f_mostrar es un cdigo 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; //Definicin 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 }

Como podemos apreciar la funcin principal void main es un procedimiento o una funcin void. Tener en cuenta que las variables que se declaran y los argumentos solo cuentan dentro del mdulo 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 Parmetros


En C++ los parmetros o argumentos de una funcin pueden ser de dos tipos: Por valor o por referencia.

Parmetro Por Valor


Son aquellos parmetros en los cuales el valor o contenido de los parmetros es copiado, y dentro de la funcin se trabaja con dicha copia. Esto sugiere que la variable real no puede ser modificada en contenido.

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

Parmetro Por Referencia


Son aquellos parmetros en los cuales la direccin de memoria es pasada hacia la funcin, esto indica que dentro de la funcin se trabaja realmente con la variable que es pasada como argumento, por tanto dicha variable puede ser modificada.

Para decirle al compilador de C++ que un argumento es por referencia se debe anteponer a la variable el smbolo 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 parmetros por referencia en lo mnimo. Es posible tambin modificar variables en funciones si la declaramos como variables globales, esto nos va a facilitar el entendimiento y sabremos que estamos modificando.

Captulo 8 Arreglos
8.1 Arreglos Unidimensionales 8.1.1 Representacin Grafica 8.1.2 Asignacin de Valores 8.1.3 Lectura y escritura de datos 8.1.4 Recorrido, insercin y eliminacin en un vector 8.2 Arreglos Bidimensionales 8.1.1 Representacin Grafica 8.2.2 Asignacin de Valores 8.2.3 Lectura y escritura de datos 8.2.4 Recorrido, insercin y eliminacin en una matriz 8.3 Ordenamientos 8.3.1 mtodo de intercambio o burbuja 8.3.2 mtodo por insercin, 8.3.3 mtodo por seleccin 8.3.4 mtodo de ordenacin rpida (quicksort). 8.4 Bsquedas 8.4.1 Tipos de bsqueda 8.4.2 Mtodo Bsqueda Binaria

8
Introduccin

Arreglos

Los arreglos son conjuntos de datos del mismo tipo, agrupados en una variable y cuyo acceso individual es numrico, este acceso individual es denominado ndice. Un arreglo puede contener por ejemplo listas de calificaciones de exmenes, de temperaturas o de nombres. Cabe decir que la cantidad de elementos de los arreglos es de tipo esttica 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 Representacin Grafica A continuacin 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 Asignacin de Valores Asignar a un elemento del vector es mediante la variable seguida del ndice entre corchetes as como sigue a continuacin:

<Variable_vector>[<indice>] = <variable / valor>;

Ejemplos:

A[0] = 7; A[5] = A[1];

A[3] = 3; A[6] = A[6] * 2;

A[8] = 15; 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 continuacin:

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

printf("%lf", B[ 0 ]); printf("%d y %8.2lf", A[ p ], B[ p ]);

8.1.4 Recorrido, insercin, eliminacin y ejemplos en un vector

Recorrido Para recorrer un vector ya sea para asignacin, lectura o escritura utilizamos la sentencia for ya que conocemos el inicio y el final del recorrido, as como se muestra a continuacin:

Ejemplo 1 Asignacin 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 Impresin por teclado a cada elemento en una lnea para un vector de 10 elementos:

Longitud=10; for(i=0 ; i< Longitud ; i++){ printf("%d\n", A[i]); }

Insercin Sabemos que la longitud del vector es de tipo esttica por tanto la insercin es simulada, es decir no aumenta la longitud declarada al inicio. Para tal caso debemos declarar la longitud del vector con un valor mximo tope, que contemple la longitud actual ms las inserciones. Debemos tener la longitud virtual del vector en una variable A continuacin mostramos el algoritmo de insercin si suponemos que:

int A[6], N=4; 0 1 2 3 4 5 2 3 1 4

Algoritmo de insercin:
for(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i]; A[posicion-1] = nro_insertar; N++;

Dnde:

<A>: < posicion >: < nro_insertar >: < N >:

Vector de elementos Posicin a insertar Valor a insertar Longitud del vector

Explicacin 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 posicin 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 posicin: A[i+1] A[4] A[3] A[2] Resultado: 0 1 2 3 4 5 2 3 3 1 4 = = = = A[i] A[3] A[2] A[1]

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

N++;

Como N tena el valor de 4 y se incrementa en uno entonces: N=5

Eliminacin Sabemos que la longitud del vector es de tipo esttica por tanto la eliminacin es simulada, es decir no decrementa la longitud declarada al inicio. Debemos tener la longitud virtual del vector en una variable. A continuacin mostramos el algoritmo de eliminacin si suponemos que:

int A[6], N=5; 0 1 2 3 4 5 2 3 1 4 5

Algoritmo de eliminacin: for(i= posicion; i<N ; i++) A[i-1]=A[i]; N--;

Dnde:

<A>: < posicion >: < N >:

Vector de elementos Posicin a eliminar Longitud del vector

Explicacin 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 posicin 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 posicin hasta el final: A[i-1] A[1] A[2] A[3] Resultado: 0 1 2 3 4 5 2 1 4 5 5 = = = = A[i] A[2] A[3] A[4]

N--;

Como N tena el valor de 5 y se decrementa en uno entonces:

N=4

8.2.1 Representacin Grafica A continuacin mostramos una matriz de tipo entero de 5x5 (filas x columnas) elementos: int A[5][5] A[0][0]=2 0 2 5 2 1 7 1 3 6 6 2 8 2 5 0 3 7 9 A[0][3]=6 3 6 8 9 2 3 4 7 6 5 8 4 A[1] [1]=6 A[2] [3]=9 A[3] [1]=2

0 1 2 3 4

A[4] [0]=7

A[3][3]=2

8.2.2 Asignacin de Valores Asignar a un elemento de la matriz es mediante la variable seguida de los ndices entre corchetes as como sigue a continuacin:

<Variable_matriz>[<ndice_fila>][<ndice_columna>] = <variable / valor>;

Ejemplos:

A[0][0] = 7; A[5][0] = A[1][3];

A[3][1] = 3;

A[8][8] = 15;

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

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

8.2.4 Recorridos y ejemplos de matrices.

Para recorrer una matriz ya sea para asignacin, lectura o escritura utilizamos 2 sentencias for Uno para controlar las filas y otro para las columnas, as como se muestra a continuacin:

Ejemplo 1 Asignacin 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

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 nmeros aleatorios:

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 nmeros aleatorios entre 1 y 16 dentro de la matriz.

#include <iostream>

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 nmeros a generar for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); for(columna=0 ; columna<M ; columna++){ //generacin de numero A[fila][columna] = desde + rand() % (1 + hasta - desde); //impresin de numero printf("\t%d", A[fila][columna]); } } printf("\n\n"); system("PAUSE"); }

8.3 Ordenamientos
En arreglos existen muchos mtodos de ordenacin de elementos a continuacin mostraremos los ms utilizados.

8.3.1 mtodo de intercambio o burbuja

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

Explicacin del algoritmo

El primer < for > indica que se debe recorrer desde el inicio < i=0 > hasta el penltimo 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 0 1 2 3 4

j 1,2,3,4,5 2,3,4,5 3,4,5 4,5 5

Recordar el algoritmo del intercambio de valores entre dos variables A y B:


aux = A; A = B; B = aux;

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 0 0 0 0 0 1 1 1 1 j A[i] A[j] A[i] > A[j] false 1 3 5 false 2 3 4 false 3 3 6 false 4 3 7 true 5 3 0 2 3 4 5 5 4 4 4 5 5 5 6 6 7 4 6 7 3 6 7 4 7 5 6 true false false true false false true false true Intercambio

0 0

5 4

4 5

6 6

7 7

3 3

2 3 2 4 2 5 3 4 3 5 4 5

0 0

3 3

4 4

5 5

7 6

6 7

El resultado final es el arreglo ordenado:


0 3 4 5 6 7

Captulo 9 Cadenas
9.1 Fundamentos de cadenas 9.2 Asignacin de Valores 9.3 Lectura y escritura de datos 9.4 Arreglo de cadenas 9.5 Lectura y escritura de datos

9.1 Fundamentos de cadenas


Introduccin En el mundo de la programacin y sistemas se trabajan con base de datos. Que no es ms que datos interrelacionados, y en su mayora almacena datos de tipo texto (Cadenas). Entonces debemos aprender tambin a manejar bien los datos tipos cadenas en operaciones de concatenacin, extraccin, filtros, etc. En C++ existen dos tipos de cadenas: estticas y dinmicas. Nosotros comenzaremos con las de tipos estticas para comprender el manejo interno y de cmo son las operaciones primitivas.

Representacin Grafica A continuacin mostramos un vector de tipo carcter de 12 elementos:

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

9.2 Asignacin de valores


Asignar a un elemento de la cadena es mediante la variable seguida de los ndices entre corchetes as como sigue a continuacin:

<Variable_cadena>[<ndice>] = <variable / valor>;

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 adicin de entrada completa de la cadena mediante la funcin < gets >. Muchas de las operaciones en cadenas se realizan mediante funciones (Vase apartado 6.5).

Lectura Carcter

scanf(<formato>, &<Variable_cadena>[<indice>] );

Ejemplos

scanf("%c", &A[ 5 ]); scanf("%c", &A[ 0 ]); scanf("%c", &A[ p ]);

Lectura Cadena

gets(<Variable_cadena>);

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

9.4 Arreglo de cadenas

A continuacin mostramos una matriz de tipo carcter de 5x16 elementos: char A[5][16]

A[0][0]=J

A[0][3]= <espacio>

A[0][7]=A

0 1 2 3 0 J O E 1 M A R I 2 J U L I 3 P E D R 4 P I L A

4 5 6 R O C A S O T O M R \0 ?

7 8 9 10 11 12 13 14 15 A \0 ? ? ? ? ? ? ? A L A S \0 ? ? ? ? E L L O \0 ? ? ? ? O R E N O \0 ? ? ? ? ? ? ? ? ? ? ? ?

A[1][10]=S

A[2][9]=L

A[4][0]=P

A[4][4]=R

A[3][7]=O

A[3][12]=\0

9.5 Lectura y escritura de datos

Lectura Cadena

gets(<Variable_cadena>[<ndice fila>]);

Ejemplos

gets(A[0]); gets(B[p]);

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 simulacin de la funcin extraer.

Solucin #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); system("PAUSE"); }

Explicacin del algoritmo

const int LongitudMax = 100; char cadena[LongitudMax], Resultado[LongitudMax]; int i, inicio, fin, nrocar, c;

Observamos la declaracin de variables: una constante con la longitud mxima 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 numricas.

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 instruccin <fflush> despus de cada instruccin de ingreso, para no perder caracteres.

c=0; fin=(inicio-1) + nrocar; for(i=inicio-1 ; i < fin ; i++){ Resultado[c]=cadena[i]; c++; }

Inicializamos a la variable c a cero. La variable fin representa hasta donde se va a extraer, es inicio menos uno ms 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 carcter a carcter. 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

i 5 6 7 8

c Resultado[c] 0 P 1 E 2 R 3 E

Captulo 10 EJERCICIOS DE AUTOEVALUACION


10.1 Arreglos Unidimensionales 10.2 Arreglos Bidimensionales 10.3 Cadenas 10.4 Ejercicios Varios

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

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

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

Ejercicio 05: Se tiene un vector de n elementos, muestre los elementos mltiplos 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 mltiplos de 5 y el otro con los nmeros no mltiplos 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;

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

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;

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

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

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

/**********************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");

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

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

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

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

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

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"

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 teora de vectores paralelos, realice lo siguiente: X[0] X[1] X[2] . . X[9] + + + Y[9] Y[8] Y[7] . . + Y[0] = = = = Z[0] Z[1] Z[2] . . Z[9]

*********************************************************************/ #include <iostream> using namespace std; #include "stdlib.h" #include "time.h"

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

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;

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

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

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

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

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

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

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

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

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

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

/**********************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"); }

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

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

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

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

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

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

*********************************************************************/ #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"

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

/**********************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) else if(c==N-1) else } } 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****************************/

fila=N-1; fila--; c=0; 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);

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

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

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

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

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

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

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

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

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

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

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

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;

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

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

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 se debera -Si algun correcta, 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; digito se encuentra en el numero, y esta en posicion correcta imprimir 'y'. digito se encuentra en el numero, pero no esta en la posicion se debera imprimir una 'x'.

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) } if(n==azar){ printf("\n\nUsted ha acertado \t\"Felicitaciones\""); break; }else if(i<=intentos ) printf("\nNo acerto tiene %d oportunidades",intentos -i -1); } printf("%d", B[j]);

if(n!=azar) printf("\n\nNo acerto \"QUE LASTIMA...\" el # de la PC era...%ld", azar); printf("\n\nContinua? S/N }while(r=='s'|| r=='S'); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/ "); r=getchar(); fflush(stdin);

/**********************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");

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

for(int columna=0 ; columna<Max_Carta ; columna++) if(MazoCartas[fila][columna]!=0) cant++; return cant; } void Aadir_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{

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

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;

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 un se (E tiene una matriz cuadrada de orden N de tipo entero que representa grafo. pide mostrar la cantidad de formas de ir desde (a,b) pasando por 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

SE UTILIZA EL CONCEPTO DE PRODUCTO DE MATRICES. ML= A B 0 0 1 0 0 1 0 0

C 1 0 0 1

D 1 1 0 0

A B C D

SI E=2 MLxML= 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 MLxML= A B C D 0 1 1 0 0 0 2 1 1 0 0 1 0 1 0 0

0 1 0 0

0 0 1 0

1 0 0 1

1 1 0 0

A B C 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)); }

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;

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

Captulo 11

Ejercicios Propuestos al estudiante

11

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 posicin vlida, mientras que un 0 no me deja pasar. En el fichero tambin debe aparecer la posicin 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 o o o o o o o o o o o o o o o o o o FELIZ NAVIDAD! 2000

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 lneas 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 ms rpido, sino quien lo haga de manera ms eficiente. La carrera se lleva a cabo en un terreno cuadriculado y en carros que pueden avanzar solo en direccin 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. Tambin un carro de tu equipo puede proporcionarte combustible si se cruzan en algn lugar del terreno. Todos los carros de tu

equipo pueden tomar caminos diferentes, y no es necesario que vayan juntos en ningn 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 nmero de carros del equipo en caso contrario determinar que no existe ninguna solucin posible. Lmites Tamao del mapa (100 x 100) FIJO SIEMPRE. Nmero de carros por equipo (16) FIJO TAMBIEN. Nmero mximo de abastecedores (500). Cantidad mxima 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 nmero N de abastecedores que hay en el mapa, y en las ltimas N lneas estn 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 nmeros separados por un espacio utilizando la siguiente notacin: C Xa Ya A Donde C es el nmero 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 nmero del carro del que se abasteci y 17 si lleg a la meta. En caso de no existir solucin posible deber escribir: NO SOLUCION.

Ejemplo
ENTRADA 8 20 14 1 14 SALIDA 1 18 19 0 1 10 19 0 1 7 18 0

6 19 9 18 19 13 7 10 19 7 9 7 18

2 2 2 2 2

19 9 0 13 7 0 7 9 0 7 14 1 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 mquinas 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 Zin.

Las mquinas sin embargo, pueden darse cuenta de cada cambio que se realice en el sistema, por lo que Neo desea derribar el menor nmero 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 mdulos (2<=n<=50) rectangulares donde cada mdulo puede estar rodeado de a lo ms 4 paredes. La entrada consta de una lnea con los nmeros m y n y a continuacin m lneas cada una describiendo los n mdulos de esa fila. El nmero que describe a cada mdulo 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 nmero 11 representa un mdulo con paredes en los lados oeste, norte y sur. Finalmente, una lnea indicando la posicin inicial en formato fila, columna, en la que se encuentra Neo. Ntese que el castillo puede estar totalmente encerrado, o puede tener mdulos con salida directa al exterior. Para salir, Neo puede modificar cualquier pared, incluso las que conectan directamente al exterior.

Salida Un nmero entero que indica el menor nmero de paredes que debe modificar Neo para salir del castillo y escapar de los agentes.

Ejemplo ENTRADA
58 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

SALIDA 2

2 5

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. Desrdenes: Una permutacin de los nmeros del 1 al N es una secuencia de nmeros a1, a2,... aN en la cual aparece exactamente una vez cada uno de los nmeros del 1 al N. Un desorden de una permutacin es una nueva permutacin que se obtiene al realizar un conjunto de intercambios de parejas de nmeros en la primera tal que cada nmero sea intercambiado a lo ms una vez.

Comenzando con la permutacin 1, 2,..., N se desea encontrar la menor cantidad de desrdenes que se le deben aplicar sucesivamente para obtener una permutacin dada. Por ejemplo, para N=5 se desea obtener la permutacin 3, 4, 1, 5, 2. Esto se logra con dos desrdenes, 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 desrdenes (Subproblema A) y los intercambios (Subproblema B) que se deben efectuar en cada uno de los primeros para obtener una permutacin dada.

Entrada: La primera entrada contiene el valor de N (con 1 N 1000) y en la segunda lnea una lista de N enteros del 1 al N.

Salida: Mostrar por pantalla en la primera lnea el valor de D y en cada una de las siguientes D lneas la cantidad K de intercambios seguida de K parejas de enteros indicando los nmeros intercambiados. Las parejas podrn estar escritas en cualquier orden, pero los desrdenes debern escribirse en el orden en que fueron aplicados.

Ejemplos ENTRADA SALIDA

5 2 3 4 1 5 2 2 1 3 2 5 1 2 4
ENTRADA SALIDA

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

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 impartirn 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 seleccin 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 lneas 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 lnea los enteros P y Q, en ese orden, en la segunda lnea las P personas que asistirn al curso y en la tercera lnea las Q fechas en las que se impartir el curso. Estas dos ltimas listas debern estar en orden creciente.

Ejemplos

ENTRADA

SALIDA

3 1 0 1

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

ENTRADA

SALIDA

4 0 1 1 1

5 1 1 0 1

0 1 1 1

1 1 0 0

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

7. Curvas: Todo el mundo prefiere carreteras con pocas curvas. Un ingeniero debe disear una carretera que una dos ciudades y quiere que tenga el menor nmero de curvas posible, sin importar la longitud de la carretera. Para facilitar el diseo, el ingeniero dibuj un mapa con los accidentes naturales por donde no puede construirse la carretera, tales como montaas y barrancos muy grandes. Cuadricul su mapa y quiere que los tramos rectos de la carretera sean horizontales o verticales o diagonales. La carretera slo puede ir de un cuadro a otro si tienen un lado o una esquina en comn, 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 despus el rengln. Las columnas estn numeradas de izquierda a derecha iniciando con el 0. Los renglones estn numerados de arriba hacia abajo iniciando con el 0.

Problema Escribe un programa que dado un mapa con los accidentes naturales encuentre el menor nmero 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 nmero de columnas y renglones del mapa, donde 1 N 50, 1 M 50. En cada uno de los siguientes M renglones hay N nmeros que pueden ser 1 0, 1 si hay un accidente natural en el cuadro correspondiente y 0 si no hay ninguno. En el siguiente rengln (el penltimo) la columna y el rengln de la ciudad A. En el ltimo rengln la columna y el rengln del punto B. Salida La primera salida el menor nmero de curvas que puede tener una carretera entre las ciudades A y B.

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 nmero de curvas posibles es 3. Una carretera con 3 curvas esta dibujada sobre el mapa, y los cuadros donde hay una curva estn numerados:

ENTRADA
5 0 1 0 1 0 0 0 1 4 7 0 0 0 1 0 0 0 1 6 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0

SALIDA
3

NOTA: en todos los casos de prueba se puede disear 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 alcalda ha dividido la ciudad en zonas y ha determinado para cada una de ellas, estadsticas sobre el nmero de incendios presentados y ha determinado una medida del nmero de incendios que se podran 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 podran prevenir tres incendios, si se le asignan tres, se podran prevenir seis, si se asignan cuatro se podran prevenir

seis y para cada cantidad de bomberos asignada se pueden prevenir una cantidad determinada de incendios Es importante notar que esta relacin no es lineal, es decir el hecho de asignar el doble de bomberos, no implica que se puedan prevenir el doble de incendios. Adems, debido a que no se quiere que ninguna zona se considere discriminada, se debe asignar un mnimo de bomberos para cada una, aunque en zonas sin construir es posible que este mnimo sea cero, es decir, que no sea necesario asignar bomberos. Debido a que esta alcalda tiene algunos problemas respecto a las cuestiones de planeacin, ha solicitado ayuda para determinar cmo 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 alcalda a cumplir su propsito. Entrada: La primera entrada consiste de n (2<=n<=50, el nmero de zonas) y m (2<=m<=500, el nmero de bomberos disponible). En la siguiente entrada vienen n nmeros, que indican el nmero mnimo de bomberos necesarios en cada zona. Enseguida aparecen n lneas, cada una de ellas conteniendo m nmeros, cada lnea representando una zona, donde el i-simo nmero de esa lnea es la cantidad de incendios que se pueden prevenir en esa zona si se asignan i bomberos.

Salida: La salida son dos lneas. La primera indica cual es la mayor cantidad de incendios que se pueden prevenir en la ciudad. En la segunda vienen n nmeros, en la que el i-simo nmero indica el nmero de bomberos asignados a la i-sima zona. En caso de que exista ms de una configuracin que prevenga la mayor cantidad de incendios, cualquiera de ellas puede darse en la salida.

Ejemplo ENTRADA SALIDA 26 12 12 33 2 3 6 6 9 10 4 5 6 8 9 20

9. TENER ENE PADRES: Unos extraos microbios descubiertos en un lago oculto debajo de la gruesa capa de hielo que cubre el continente antrtico han demostrado una extraa forma de reproduccin que no se ha encontrado en otros seres vivos. En lugar de tener uno o dos padres como los dems seres vivos, pueden llegar a tener hasta N padres, donde N puede ser un entero no mayor que 1000. La informacin gentica de cada padre viene dada en una cadena de a lo sumo 200 letras maysculas. La informacin gentica que da lugar al neonato esta dada por una cadena formada por la intercalacin 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 biolgica 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: lnea 1: un nmero entero N (1 N 1.000) que indica la cantidad de padres. lneas 2 a N+1: cada una con una cadena con Ci ( 1 Ci 200) letras maysculas indicando la informacin gentica de cada padre.

Salida: La salida ser hacia pantalla la cual estar formada por una sola lnea. Esta lnea debe contener la cadena del microbio neonato.

Ejemplo

ENTRADA

SALIDA

3 ABABAFGFG CDCD XZXZXEEF

ACXBDZACXBDZAXFEGEFFG

Nota: la informacin vertida en este enunciado es apcrifa.

10. PUEBLO ONDULADO Un pueblo de Ibero Amrica, de cuyo nombre no quiero acordarme, se ha vuelto muy inseguro a causa de la delincuencia y el jefe de polica ha decidido poner P policas 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 polica 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 polica 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 polica 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 asignacin el jefe de polica determina la mxima y mnima altura que hay en el tramo que le corresponde a un polica y por diferencia determina un nmero representativo del desnivel. Considera una asignacin buena de tramos a los policas aquella que minimiza el mximo desnivel que pudiera tocarle a algn polica. Tarea Debes escribir un programa que le ayude a determinar ese nmero 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 pequea para que estas alturas sean cantidades enteras. Tu resultado quedar expresada en la misma unidad. Entrada: La entrada tiene el siguiente formato: lnea 1: los nmeros B (1 B 10.000) y P (1 P 1.000) separados por un blanco. lneas 2 a B+1: las alturas Yi (-400 Yi 8850) sobre el nivel del mar de las B bocacalles

Salida: La salida ser hacia pantalla que contendr una nica lnea con un nico nmero: el peor desnivel que inevitablemente le tocar a algn polica. Ejemplo

ENTRADA SALIDA 62 4 100 101 104 101 108 105

Podrs comprobar este resultado imaginando las distintas formas de asignar tramos a cada polica.

11. Rompecabezas Se tienen N x N piezas cuadradas numeradas del mismo tamao. Cada una viene con su nmero en el interior y con cada lado marcado con algn nmero. 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 nmeros. Por ejemplo:

Las piezas no pueden ser giradas ni rotadas al momento de buscar una configuracin. Entrada La primera entrada es el nmero N, donde 1 N 7. En las siguientes N lneas subsecuentes la descripcin de cada pieza. En cada una de estas lneas (comenzando por la ficha 1) primero va el nmero 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 lneas, en cada lnea van los nmeros 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 solucin. Cualquier solucin que cumpla las condiciones del problema es vlida.

Ejemplo

ENTRADA 3 4133 4214 3432 4535 3135 4441 3214 1541 4344

SALIDA 862 153 947

12. Ruleta: El juego de la ruleta ha sido objeto de innumerables intentos de descubrir alguna flaqueza que permitiera disear un mtodo para obtener ganancias sistemticas. Numerosos autores han escrito tratados de cmo saltar la banca. Norman Leigh escribi una obra clsica donde expone como, junto con doce compaeros, saltaron la banca de Montecarlo. La obra, magistralmente escrita, cuenta hechos verdicos. Pero con el auxilio de la ciencia de la computacin podemos ver que esos hechos tal como los relata Leigh en su libro no pueden haber sucedido. El mtodo que Leigh relata en su libro es el Labouchere inverso. El apostador comienza anotando en una libreta los nmeros 1, 2, 3 y 4. Siempre apuesta una ficha igual a la suma de los nmeros de los extremos de la lista. Si gana agrega al final de la lista un nmero de igual valor al de su ltima apuesta, que acaba de ganar. Si pierde tacha los dos nmeros 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 nmeros 1, 2, 3 y 4 en su libreta y reiniciando el mtodo. Si la apuesta llega a superar el lmite de la mesa el jugador tambin reinicia el mtodo anotando una nueva lista de 1, 2, 3 y 4 en su libreta y apostando $5. Recordamos que la ruleta europea consta de los nmeros del 0 al 36 y que, jugando a par se gana si se obtiene un nmero par distinto de cero, el que juega a impar gana si el nmero es impar y en caso de salir cero ambos pierden. La apuesta mxima es de $100, recuerde que cuando se supera esta apuesta el mtodo 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 mtodo se comporta as en unas bolas de ejemplo.

Sale Par
Lista 1 2 3 4

31

22 26 11

36

2 3

2 3 5

2 3 5 7

3 5

3 5 8

3 5 8 11

5 8 8

5 13

Ganancia Acumulada 0 Impar Lista 1 2 3 4

-5

0 +7 -2

+6 +17

+3

+16

1 2 3 4 5

2 3 4

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

Se le pide que escriba un programa que calcule la ganancia o prdida alcanzada luego de jugarse cierta cantidad de bolas de ruleta.

Entrada: La entrada consta de un entero 0 < N <= 30000 en la primera lnea indicando la cantidad de tiradas de ruleta y a continuacin N lneas cada una con un nmero 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 prdida) de par e impar, proveniente de aplicar el mtodo de Labouchere inverso a las apuestas de par e impar en la serie de bolas contenida en la entrada.

Ejemplo ENTRADA 8 31 22 26 11 4 36 0 4 16 -25 SALIDA

13. SIERPE ENROSCADA: En el mundo de la Herpetologa Combinatoria pensaremos a las sierpes como ofidios compuestos por una sucesin de cubos del mismo tamao 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 posicin, en el plano, que le permite tener el cubo 1, (la cabeza), lo ms lejos posible del cubo N2, (la cola). Exceptuando la cabeza y la cola todos los dems 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 ubicacin de los cubos de tipo cero y tipo uno en su conformacin. 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 rotacin de 180 grados de la sierpe entre dos cubos vecinos. Aunque la rotacin invade la tercera dimensin, al final de la misma la sierpe queda nuevamente en un plano.

Problema Debes escribir un programa que indique, a partir de la posicin que adopta para dormir, entre que cubos debe plegarse para lograr su cometido de quedar enroscada formando un cuadrado. Luego de cada plegado ningn cubo de la sierpe puede quedar apoyado sobre otro. Se considerar como solucin la lista pares de cubos vecinos entre los cuales que debe plegarse la sierpe para llegar a formar un cuadrado.

Entrada: La sierpe viene descripta por pantalla que en su primera lnea tiene el nmero entero N (3 N 5) que indica la raz cuadrada de la longitud de la sierpe. A continuacin el archivo tiene N2-2 lneas. Cada una con la descripcin (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 razn de uno por lnea, los nmeros de los pares de cubos entre los cuales se ha plegado la sierpe respecto de la posicin de reposo separados entre s por un blanco. Los plegados deben darse en el orden en que fueron sucediendo. En caso de haber ms de una solucin 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 solucin porque despus de plegar en 5-6 no puede hacerse el plegado en 4-5 debido a que se produce la superposicin de los cubos 1 y 9.

Nota 2: Todas las sierpes que se presenten como casos de prueba tendrn al menos una forma de enroscarse para formar un cuadrado. Nota 3: Si hay ms de una solucin, 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 slo con el territorio 2 que limita a su vez tambin con el territorio 3 que limita a su vez tambin con el territorio 4, hasta llegar al territorio N-1 que limita con los territorios N-2 y N que a su vez slo limita con el territorio N-1. El primero que juega es A quien es dueo de todos los territorios impares, mientras que B quien juega en segundo turno es dueo 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 lneas tienen los enteros Ti, 1 i N.

Salida La salida se har escribiendo el valor del juego para A en pantalla Ejemplo ENTRADA 5 33 71 56 44 21 2 SALIDA

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 Localizacin automtica de Vehculos) la transmisin es realizada desde un origen mvil (Vehiculo) hacia un destino Centro de Control (Oficina central de una empresa donde se recibe la informacin) tal como se ve en el la ilustracin 1.

Centro de Control

Cola de Mensajes recin llegados

Usuario

Agente De

Informacin Procesada

Mensajes Mensajes

Unidad Mvil 200 Unidad Mvil 201

Ilustracin 1 Esquema General de un sistema AVL

Todos los mensajes son del mismo tamao y contienen datos como tiempo, posicin, velocidad y rumbo. Al centro de control llegan mensajes de varias unidades mviles, estos mensajes forman una cola de mensajes el cual debe ser procesado por un Agente de comunicaciones que finalmente muestra al usuario informacin til.

Problema Implementar un Agente de Comunicaciones que tiene como entrada una cola de mensajes y como salida un reporte con informacin procesada.

La cola de mensajes es una cadena de texto que contiene uno o ms mensajes.


>C847B7622083466200000780>C84811082098A30C1E02D78A>C847B87520EE17C72805A79E>C942F2AE20EF08522310E796 >C943E6D220EEB2625C1187A0

Un mensaje tiene un tamao 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 Orden 1 2 3 Total de Mensajes: 3 Latitud 15.603655 10.003212 08.603234 Vel. 40 30 00 Rumbo 090 045 000 Tiempo 2006/05/08 08:30 2006/05/08 08:10 2006/05/08 08:00 Est. Operativo Est. Posicin En Movimiento En Movimiento Detenido En Zona Normal En Zona Prohib En Zona Normal

Longitud 75.204434 75.567234 75.200034

-----------------------------------------------------------------------------------------------------Unidad: 201 Orden 1 2 Total de Mensajes: 2 Latitud 15.643234 15.665234 Vel. 92 35 Rumbo 280 270 Tiempo 2006/05/08 08:32 2006/05/08 08:22 Est. Operativo Est. Posicin Velocidad Alta En Zona Normal En Movimiento En Zona Normal

Longitud 71.200034 70.200034

Los procesos solicitados son:

Proceso de Descodificacin de los mensajes Reporte :Listado de los mensajes procesado Reporte :El Listado ordenarlo cronolgicamente 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 Posicin Anexos Anexo1: Estructura de cada Mensaje

Parte \ Descripcin

Tipo Carcter (*)

Numero de Caracteres

Posicin Inicial

Posicin Final

Datos Adicionales

Carcter Inicial Unidad Longitud Latitud Velocidad Rumbo Tiempo

> HH HHHHHHH HHHHHHH HH HHH HHHH

1 2 7 7 2 3 4

1 2 4 11 18 20 23

1 3 10 17 19 22 26

Siempre tiene valor > Cdigo de la unidad mvil Coordenada x Coordenada y Km./h Grados (0 a 360) Total de Minutos transcurridos de la semana actual.

(*) H representa un digito Hexadecimal para su conversin 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 resultara: Carcter Inicial > > > Unidad C8 C8 C8 Longitud 47B7622 4811082 47B8752 Latitud 0834662 098A30C 0EE17C7 Velocidad 00 1E 28 Rumbo 000 02D 05A Tiempo 780 78A 79E

> >

C9 C9

42F2AE2 43E6D22

0EF0852 0EEB262

23 5C

10E 118

796 7A0

Procesada de hexadecimal a decimal resultara: Carcter Inicial > > > > > Unidad 200 200 200 201 201 Longitud 75200034 75567234 75204434 70200034 71200034 Latitud 08603234 10003212 15603655 15665234 15643234 Velocidad 0 30 40 35 92 Rumbo 0 45 90 270 280 Tiempo 1920 1930 1950 1942 1952

Formateando latitud y longitud(*) y calculado la fecha hora(**) correspondiente resultara: Carcter Inicial > > > > > Unidad 200 200 200 201 201 Longitud 75.200034 75.567234 75.204434 70.200034 71.200034 Latitud 08.603234 10.003212 15.603655 15.665234 15.643234 Velocidad 0 30 40 35 92 Rumbo 0 45 90 270 280 Tiempo (Fecha Hora) 2006/05/08 08:00 2006/05/08 08:10 2006/05/08 08:30 2006/05/08 08:22 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 cronolgicamente 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 Posicin 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 rectngulo definido mediante coordenadas de dos vrtices en diagonal: (70.000000, 09.000000) (80.000000, 12.000000)

Anexo4: Un numero Hexadecimal esta compuesto por los dgitos: 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: DgitoHexacecimal 0 DgitoDecimal 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 A 10 B 11 C 12 D 13 E 14 F 15

Para transformar un nmero hexadecimal a su correspondiente decimal debes realizar la sumatoria del equivalente real (es equivalente unitario por potencia de 16, la potencia depende de la posicin 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

S-ar putea să vă placă și