Вы находитесь на странице: 1из 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 Sistemas de Procesamiento de Datos

Introduccin

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) Proceso Salida (OUTPUT)

Programa
-------------
-------------
Salida
-------------
--------------
---- Computadora
--------------
Datos --------------
-------------
-------------
-------------
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 Metodologa para solucin de problemas computacionales

Introduccin

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)


3 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 (*) Precisin
Descripcin C++
short 32,767
int 32,767
Enteros long 2147,483,467
Entero sin signo unsigned long 4294,967,295
float 10^37 6 dgitos
double 10^37 6 dgitos
Reales long double 10^37 6 dgitos
Carcter char 127
Cadena string
Booleano bool
(*) 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 Tpico Rango(*)
Descripcin C++
short 2 bytes 32,767
int 4 bytes 2147,483,467
Enteros long 4 bytes 2147,483,467
Entero sin signo unsigned long 4 bytes 2147,483,467
float 4 bytes 1.8^-38 a 3.4^38
double 4 bytes 2.2^-308 a 1.8^308
Reales long double 8 bytes 2.2^-308 a 1.8^308
unsigned double
Real sin signo unsigned long double
1 Byte: guarda un
char
Carcter carcter
Bytes Dinmicos, su
string
Cadena tamao es ilimitado
Booleano bool 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 => no valido

Luis Snchez => no valido

Usuario-1 => no valido

lc_nombre =>local de tipo carcter (recomendado)

gl_cantidad => global de tipo long (recomendado)

afl_promedio =>argumento de tipo float (recomendado)

En este libro usaremos la forma recomendada de nombrar variables cuando veamos problemas
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 C++ Observacin

Variable = variable/valor Variable = variable/valor;


A=10 A=10;
B=20 B=20;
C = A + B C = A + B;
Se utiliza una funcin predefinida de
D="Arriba Peru" strcpy(D,"Arriba Peru");
C++ (Vase captulo 6)
E='A' E='A';
F = 10 + 50 F = 10 + 50;
No valido(10 es un numero entero y
G = 10 + "50" G = 10 + "50"; 50 es cadena por estar entre
comillas)
No valido(D es cadena y B es un
H = D + B H = D + B;
entero)

3.1.5 Operadores

Tipo Operadores Descripcin Pseudocdigo C++

Suma + +

Resta - -

Multiplicacin * *
Aritmticos
Divisin real /
(*) /
Divisin entera Div

Residuo(divisin entera) Mod %

Mayor que > >

Mayor o igual que > >=

Menor < <


Relacionales
Menor o igual que < <=

Igualdad = ==

Diferente <> !=
Y And &&

Lgicos O Or ||

Negacin 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) b)
X = A-B+C Y = A*B + C
X=3-4+5 Y = 3*4 + 5
X= 3-9 Y = 12 + 5
X= -6 Y = 17
c) d)

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

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

Z = 5*4 + 1 W = ( (7) - (2) ) / 5

Z = 20 + 1 W = (5) / 5 = 1

Z = 21

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 Tipo de dato


%d int
%ld long
%f float
%lf double
%c char
%s char(cadena)
%u Entero sin signo

Notar que %c y %s tienen el mismo tipo de dato, no obstante %c imprime solo un 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 Smbolo
Nueva Lnea \n
Tabulacin Horizontal \t
Retorno de carro \r
Alerta \a
Diagonal invertida \\
Comillas dobles \"
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 Expresin computacional

4+5 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 C++
Entero: A,B int A,B; long k,b;
Real: P,Q float P,Q; double R, s;
Carcter: Sexo, Condicin char Sexo, Condicin;
Constante Entero: P=10 const int P = 10;

3.2.3 Datos Enteros vs Datos Reales

En c++ hay que tener claro la diferencia entre los datos enteros y reales, para eso dividimos el
concepto en 2 partes: 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 Divisor Resultado


Entero Entero Entero
Entero Real Real
Real Entero Real
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) 7%9=7
e) C%3=0
f) D%5=2
g) 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


4 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 => true

B = 70 => No es una expresin booleana, es una asignacin a la variable B con 70

A>B => false

C==A => Error en tiempo de codificacin, las comillas dobles indica cadena

C==A => true

B>C => true, A representa el nmero 65 en la tabla de los cdigos ASCII Vase capitulo X
A+B < B+D => false

D != D => false

D => true

!D => 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 Operador Y Operando 2 Resultado


true && true true
true && false false
false && true false
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 => true && true = true

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

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

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

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

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

Tabla de verdad || (Conjuncin lgica O)

Operando 1 Operador O Operando 2 Resultado


true || true true
true || false true
false || true true
false || false 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 => true || true = true

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

A==10 || B==20 => true || true = true

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

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

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

Tabla de verdad ! (Negacin lgica No)

Operando 1 Operador NO Resultado


true ! false
false ! true

Ejemplos:

Considere que:

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

A>0 => true

! (A > 0) => ! true = false

A > 0 && ! (B > 0) => true && ! true = true && false = false

A < C || ! (B==C) => true || ! false = true || true = true

!(A==10 || B==20) => !(true || true) = ! true = false

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

!!(A!=15) || !(B==20) => !! true || ! true = ! false || false = true || false = true
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;
Salta printf("Condicion Alumno: Repitente");

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

8) 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 Modo Reducido Explicacin


A = A + 1; A++; La variable incrementa su valor en 1
A = A - 1; A--; La variable decrementa su valor en 1
A = A + 3; A+=3; La variable incrementa su valor en 3
A = A - 4; A-=4; La variable decrementa su valor en 4
A = A + n; A+=n; La variable incrementa su valor en n
A = A - n; A-=n; La variable decrementa su valor en n
A = A * 5; A*=5; La variable multiplica su valor en 5
A = A / 6; A/=6; La variable divide su valor en 6

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

estado
Iteracin ndice expresin booleana ejecucin cdigo
bucle
1 1 1 <= 7 = true printf("\n Numero: %d", 1); Continua
2 2 2 <= 7 = true printf("\n Numero: %d", 2); Continua
3 3 3 <= 7 = true printf("\n Numero: %d", 3); Continua
4 4 4 <= 7 = true printf("\n Numero: %d", 4); Continua
5 5 5 <= 7 = true printf("\n Numero: %d", 5); Continua
6 6 6 <= 7 = true printf("\n Numero: %d", 6); Continua
7 7 7 <= 7 = true printf("\n Numero: %d", 7); Continua
8 8 <= 7 = true <No ejecuta cdigo> 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 Negativo: -1

Positivo: 2 Negativo: -2

Positivo: 3 Negativo: -3

Positivo: 4 Negativo: -4

Positivo: 5 Negativo: -5

Positivo: 6 Negativo: -6

Positivo: 7 Negativo: -7

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 final S C C <= final Estado Bucle

<Inicializacin> 15 0 1
1 15 1 3 3 <= 15 = true Continua
2 15 4 5 5 <= 15 = true Continua
3 15 9 7 7 <= 15 = true Continua
4 15 16 9 9 <= 15 = true Continua
5 15 25 11 11 <= 15 = true Continua
6 15 36 13 13 <= 15 = true Continua
7 15 49 15 15 < = 15 = true Continua
8 15 64 17 17 < = 15 = false Termina

El resultado es:

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:

Estado
Iteracin N S op op!='N' && op!='n'
Bucle
<Inicializacin> 0
1 5 5 S 'S'!='N' && 'S'!='n' = true Continua
2 1 6 S 'S'!='N' && 'S'!='n' = true Continua
3 9 15 S 'S'!='N' && 'S'!='n' = true Continua
4 7 22 S 'S'!='N' && 'S'!='n' = true Continua
5 50 72 N 'N'!='N' && 'N'!='n' = false Termina

< N > es un valor ingresado por teclado, es decir pueden ser cualquier 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); fflush(stdin);
for(int i=0;i<=12;i++)
printf("\n %d * %d = %d", N, i, N * i );

printf("\n\n\nDesea continuar?(S/N): ");


op=getchar();
} while( op!='N' && op!='n' );

system("PAUSE");

Como se muestra en este ejemplo existe una estructura repetitiva < do while > y dentro de ella una
estructura repetitiva < for >. Sin embargo puede haber varios niveles de anidamiento de acuerdo a la
complejidad del problema.

4.2.9 8 Recomendaciones para el uso de estructuras repetitivas

1) Cuando se conozcan los 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 = nro_alu / aula;


alufal = aula - (nro_alu % aula);

printf("\n\n Aulas completas: %d", aulac);


printf("\n\n Alumnos que faltan para completar la ultima aula: %d", alufal);

printf("\n\n");
system("PAUSE");

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

/**********************Inicio del Programa***************************

Ejercicio 07: Se tiene n segundos, calcular y mostrar:


- Cantidad de horas
- Cantidad de minutos
- Cantidad de segundos restantes

*********************************************************************/
#include <iostream>
using namespace std;

void main(){
int seg, hor, min, seg_res, segxhor=3600, segxmin=60;

printf("\nIngrese numero de segundos: "); scanf("%d", &seg); fflush(stdin);

hor = seg / segxhor;


min = (seg % segxhor) / segxmin;
seg_res = ((seg % segxhor) % segxmin);

printf("\n\n Horas: %d", hor);


printf("\n\n Minutos: %d", min);
printf("\n\n Segundos restantes: %d", seg_res);

printf("\n\n");
system("PAUSE");

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

/**********************Inicio del Programa***************************

Ejercicio 08: Ingrese por teclado el sueldo de un empleado, visualizar


la mejor forma de 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 = sueldo /100;


B50 = (sueldo % 100) / 50;
B20 = ((sueldo % 100) % 50) / 20;
B10 = (((sueldo % 100) % 50) % 20) / 10;

M5 = ((((sueldo % 100) % 50) % 20) % 10) / 5;


M2 = (((((sueldo % 100) % 50) % 20) % 10) % 5) / 2;
M1 = (((((sueldo % 100) % 50) % 20) % 10) % 5) % 2 ;

centavos_real = sueldo_real - sueldo;


centavos = centavos_real * 10;
printf("\n\nCentavos:%d", centavos);

M05 = centavos / 5;
M02 = (centavos % 5) / 2;
M01 = (centavos % 5) % 2;

printf("\n\n Numero Billetes de 100: %d", B100);


printf("\n\n Numero Billetes de 50: %d", B50);
printf("\n\n Numero Billetes de 20: %d", B20);
printf("\n\n Numero Billetes de 10: %d", B10);

printf("\n\n Numero Monedas de 5: %d", M5);


printf("\n\n Numero Monedas de 2: %d", M2);
printf("\n\n Numero Monedas de 1: %d", M1);

printf("\n\n Numero Monedas de 0.50: %d", M05);


printf("\n\n Numero Monedas de 0.20: %d", M02);
printf("\n\n Numero Monedas de 0.10: %d", M01);

printf("\n\n");
system("PAUSE");

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

/**********************Inicio del Programa***************************

Ejercicio 09: Ingrese por teclado el nombre y 2 fechas (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 , 1<=X<=5
|X + 5, 5< X <=25
Z => |1 / X, 25< X <=50
|5X -4, 50< X <=90
|X3 , X >90

*********************************************************************/
#include <iostream>
using namespace std;

void main(){

double X;

printf("\n\rIngrese valor de X: "); scanf("%lf",&X); fflush(stdin);

//No anidamos porque segun la funcion, X solo puede entrar a una condicion.
if( 1 <= X && X <= 5){
printf("\n\n\rZ: %8.2lf \n\n", X );
system("PAUSE");
exit(0);
}

if( 5 < X && X <= 25){


printf("\n\n\rZ: %8.2lf \n\n", X + 5 );
system("PAUSE");
exit(0);
}

if( 25 < X && X <= 50){


printf("\n\n\rZ: %8.2lf \n\n", 1 / X );
system("PAUSE");
exit(0);
}

if( 50 < X && X <= 90){


printf("\n\n\rZ: %8.2lf \n\n", 5*X -4 );
system("PAUSE");
exit(0);
}

if( X > 90){


printf("\n\n\rZ: %8.2lf \n\n", X*X*X );
system("PAUSE");
exit(0);
}

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

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

Ejercicio 09: Ingrese por teclado un numero entero, evalue si cumple:


- Que sea positivo
- Que sea de dos 4 cifras
- Si es de dos cifras que la primera sea sea mayor a la segunda
- Si es de cuatro cifras que la suma de las cifras sea mayor a la primera
y a la segunda.

*********************************************************************/
#include <iostream>
using namespace std;

void main(){

int nro, U, D, C, M;
bool bandera=false;

printf("\n\rIngrese numero a evaluar: "); scanf("%d",&nro); fflush(stdin);

//No es necesario validar que sea positivo,


//puesto que esta implicito en las evaluaciones

if( nro>=10 && nro <=99 ) {


D = nro / 10;
U = nro % 10;
bandera = D > U;
}

if( nro>=1000 && nro <=9999 ){


M = nro / 1000;
C = (nro % 1000) / 100;
D = ((nro % 1000) % 100) / 10;
U = nro % 10;
bandera = (M + C + D + U) > M && (M + C + D + U) > U;
}

if(bandera)
printf("\n\nSi cumple las condiciones\n\n");
else
printf("\n\nNo cumple las condiciones\n\n");

system("PAUSE");

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

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 PI=3.14159, radio, area;


double diametro,largo,ancho;
double precio_redonda, preciounit_redonda;
double precio_rectangular, preciounit_rectangular;

printf("\n\nPizza redonda\n\n");
printf("Ingrese diametro(en pulgadas) de una pizza redonda:"); scanf("%lf", &diametro);
fflush(stdin);
printf("Ingrese precio de una pizza redonda $/ :"); scanf("%lf", &precio_redonda);
fflush(stdin);
printf("\n\nPizza rectangular\n\n");
printf("Ingrese largo(en pulgadas) de una pizza rectangular :"); scanf("%lf", &largo);
fflush(stdin);
printf("Ingrese ancho(en pulgadas) de una pizza rectangular :"); scanf("%lf", &ancho);
fflush(stdin);
printf("Ingrese precio de pizza rectangular $/ :"); scanf("%lf", &precio_rectangular);
fflush(stdin);

area = largo * ancho;


preciounit_rectangular = precio_rectangular / area;

radio = diametro / 2.0;


area=PI*radio*radio;
preciounit_redonda=precio_redonda / area;

printf("\n\nPrecio pizza rendonda: $ %8.2lf", precio_redonda);


printf("\n\rPrecio pizza por pulgada cuadrada: $ %8.2lf", preciounit_redonda);

printf("\n\nPrecio pizza rectangular: $ %8.2lf", precio_rectangular);


printf("\n\rPrecio pizza por pulgada cuadrada: $ %8.2lf", preciounit_rectangular);
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 1: printf("Uno");break;
case 2: printf("Dos");break;
case 3: printf("Tres");break;
case 4: printf("Cuatro");break;
case 5: printf("Cinco");break;
case 6: printf("Seis");break;
case 7: printf("Siete");break;
case 8: printf("Ocho");break;
case 9: printf("Nueve");break;
case 10:printf("Diez");break;
case 11:printf("Once");break;
case 12:printf("Doce");break;
case 13:printf("Trece");break;
case 14:printf("Catorce");break;
case 15:printf("Quince");break;
case 16:printf("Diez y Seis");break;
case 17:printf("Diez y siete");break;
case 18:printf("Diez y ocho");break;
case 19:printf("Diez y nueve");break;
case 20:printf("Veinte");break;
}

printf("\n\n");
system("PAUSE");

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

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

Ejercicio 02: Realizar un algoritmo que lea un numero que represente


el 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 '+': printf("%8.2lf", n1 + n2);break;
case '-': printf("%8.2lf", n1 - n2);break;
case '*': printf("%8.2lf", n1 * n2);break;
case '/': printf("%8.2lf", n1 / n2);break;
default: printf("Operacion ingresada No reconodido");break;
}

printf("\n\n");
system("PAUSE");

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

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

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 '+': printf("%8.2lf", n1 + n2);break;
case '-': printf("%8.2lf", n1 - n2);break;
case '*': printf("%8.2lf", n1 * n2);break;
case '/': printf("%8.2lf", n1 / n2);break;

default: printf("Operacion ingresada No reconodido");break;


}

printf("\n\n");
system("PAUSE");

}
/***************************Fin del Programa****************************/
5.4 Estructura repetitiva < for >

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

Ejercicio 01: Mostrar el doble, triple y el cuadrado de todos


los numeros que se encuentran entre el 10 y 30.

*********************************************************************/
#include <iostream>
using namespace std;

void main(){

int ini = 10, fin = 30, i;

for(i=ini;i<=fin;i++)
printf("\n\rNumero %d, doble %d, triple %d y su cuadrado %d.",
i,
i * 2,
i * 3,
i * i);

printf("\n\n");
system("PAUSE");

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

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

Ejercicio 02: Visualice la palabra "ALGORITMO" 200 veces.

*********************************************************************/
#include <iostream>
using namespace std;

void main(){

int ini = 1, fin = 200, i;

for(i=ini;i<=fin;i++)
printf("\n\rALGORITMO");

printf("\n\n");
system("PAUSE");

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

/*********************************************************************
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 = n2;
fin = n1;
}else{
ini = n1;
fin = n2;
}

S=0;
for( i = ini + 1 ; i < fin ; i++ ){
S+=i;
printf("\n\r %d", i);
}

printf("\n\n La Suma es %d\n\n", S);

system("PAUSE");

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

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

Ejercicio 06: Ingrese por teclado dos notas y el nombre de


N alumnos, mostrar el promedio, condicion (Aprobado, Desaprobado)
y promedio global.

*********************************************************************/
#include <iostream>
using namespace std;

void main(){
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) -2 -4 -6 -8 -10...N
b) 3.3 4.4 5.5 6.6 7.7 8.8...N
c) 1 4 9 16 25 36...N
d) -1 +2 -3 +4 -5 +6 -7...N
e) -1 3 15 35 63 99...N
f) 1 2 4 7 11 16...N

*********************************************************************/
#include <iostream>
using namespace std;

void main(){

int i, N, S, termino, parte_entera, incremento, A, B, C;


double parte_real, termino_real, S_real;

printf("\n\rIngrese numero de terminos : "); scanf("%d",&N); fflush(stdin);

printf("\n\n a) -2 -4 -6 -8 -10...N \n\n");


S=0;
for(i=1 ; i<=N ; i++){
termino = i*-2;
printf("%d\t", termino);
S+=termino;
}
printf("\n\nSuma de secuencia: %d\n\n", S);
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 Cantidad Pares : %ld", cp);
printf("\n\r Cantidad ImPares : %ld", ci);
printf("\n\r Cantidad Multiplos 7 : %ld", c7);
printf("\n\r Total Numeros Ingresados: %ld", ct);

printf("\n\n");
system("PAUSE");

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

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

Ejercicio 09: Se pide sumar y generar la serie fibonacci.


1 1 2 3 5 8 13 21 ...N

*********************************************************************/
#include <iostream>
using namespace std;

void main(){

int N, A, B, i, S;

printf("\n\rIngrese numero de terminos : "); scanf("%d",&N); fflush(stdin);

// A-> 1 1 2 3 5 8 13 21 ...N
// B-> 1 0 1 1 2 3 5 8
S=i=A=0;
B=1;
do{
A=A + B;
B=A - B;
S+= A;
printf("\t%d", A);
i++;
}while( i<N );

printf("\n\n Suma : %d", S);

printf("\n\n");
system("PAUSE");

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

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

Ejercicio 10: Ingresar una secuencia de numeros, estos deben ser


sumados siempre que:
- Sea Impar
- Sus cifras sean diferentes
- Que la cifra del medio sea cualquiera
- 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 = Monto / B100;


final50 = Monto / B50;
final10 = Monto / B10;

combinacion=0;
for(i100=1;i100<=final100;i100++)
for(i50=1;i50<=final50;i50++)
for(i10=1;i10<=final10;i10++){
if( !((i100*B100 + i50*B50 + i10*B10) == (Monto - sobra)) )continue;

combinacion++;
printf("\n\rCombinacion: %d\tB100: %d B50: %d B10: %d",
combinacion,
i100,
i50,
i10);
}

//Para el punto b) cambiar la variable sobra a 10


//Para el punto c) cambiar la variable sobra a 500
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/

/**********************Inicio del Programa***************************

Ejercicio 02: Sume u genere la siguiente secuencia de potencias


(base, potencia):
(10, 1), (15, 2), (20, 3), (25, 4), ...N

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

#include <iostream>
using namespace std;

void main(){

int i,j, n, base ;


unsigned long s, termino;//Tipo long sin signo
printf("Ingrese #...");scanf("%d",&n);

base=10;
s=0;
for( i=1 ; i<=n ; i++){

termino=1;
for( j=1 ; j<=i ; j++)
termino = termino * base;

printf("\n\r(%d, %d) = %u \n ",base, i, termino);

base+=5;
s+=termino;

}
printf("\n\nLa suma es...%u",s);

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

/**********************Inicio del Programa***************************

Ejercicio 03: Se pide mostrar y sumar todos los numeros primos de


cuatro cifras.

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

#include <iostream>
using namespace std;

void main(){

int c,cd,i,j;
long s;

c=s=0;
for(i=1000;i<=9999;i++){
cd=0;
for(j=1;j<=i;j++)
if(i%j==0)
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 1:printf("I");break;
case 2:printf("II");break;
case 3:printf("III");break;
case 4:printf("IV");break;
case 5:printf("V");break;
case 6:printf("VI");break;
case 7:printf("VII");break;
case 8:printf("VIII");break;
case 9:printf("IX");break;
}
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 Funciones Predefinidas de C++

Introduccin

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

Valor
Tipo Dato Tipo Dato Librera
Funcin Descripcin Ejemplo devuelto
Argumento devuelto (**)
ejemplo
double double sqrt(4.0) 2.0
sqrt Raz cuadrada float float sqrt(4.0) 2.0 math.h
long long sqrt(4) 2
pow(2.0,
double 8.0
double 3.0)
8.0
pow(2.0, 3)
pow pow(2.0,
Potencias float float 8.0 math.h
(*) 3.0)
8.0
pow(2.0, 3)
long long
pow(20.0, 3) 8000.0
double double
abs(-7.0) 7
double double
abs(7.0) 7
abs(-7.0) 7 math.h
float float
abs(7.0) 7
abs(-7) 7
int int
abs Valor Absoluto abs(7) 7
abs(-70000) 70000
long long
abs(70000) 70000
long long abs(- stdlib.h
70000.0
double double 70000.0)
70000.0
abs(70000.0)
ceil(3.2) 4.0
double double
ceil(3.9) 4.0
ceil(3.2) 4.0
float float
Techo(redondeo ceil(3.9) 4.0
ceil math.h
arriba) ceil(30000.2
long long ) 30001.0
double double ceil(30000.9 30001.0
)
floor(3.2) 3.0
double double
floor (3.9) 3.0
floor (3.2) 3.0
float float
floor (3.9) 3.0
floor Piso(redondeo abajo) math.h
floor
long long (30000.2) 30000.0
double double floor 30000.0
(30000.9)
double double exp(1.0) 2.7
float float exp(1.0) 2.7
exp Exponencial math.h
long long
exp(10.0) 22026.5
double double
double double log(5.0) 1.6
float float log(5.0) 1.6
log Logaritmo natural(ln) math.h
long long
log(1000.0) 6.9
double double
double double log10(10.0) 1.0
Logaritmo base 10 float float log10(10.0) 1.0
log10 math.h
(ln) long long log10(1000.0
3.0
double double )

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

Valor
Tipo Dato Tipo Dato Librera
Funcin Descripcin Ejemplo(*) devuelto
Argumento devuelto (**)
ejemplo
double double cos(0.0) 1.0
cos Coseno float float cos(0.0) 1.0 math.h
long double long cos(1000.0) 0.6
double double acos(1.0) 0.0
acos Arco Coseno float float acos(1.0) 0.0 math.h
long double long double acos(0.5) 1.0
double double sin(0.5) 0.5
math.h
sin Seno float float sin(0.5) 0.5
long double long double sin(10.0) -0.5
double double asin(0.8) 0.9
asin Arco Seno float float asin(0.8) 0.9 math.h
long double long double asin(1.0) 1.6
double double tan(1.0) 1.6
tan Tangente float float tan(1.0) 1.6 math.h
long double long double tan(100.0) -0.6
double double atan(0.8) 0.7
Arco
atan float float atan(0.8) 0.7 math.h
Tangente
long double long double atan(100.0) 1.6
double double cosh(1.0) 1.5
Coseno
cosh float float cosh(1.0) 1.5 math.h
Hiperblico
long double long double cosh(10.0) 11013.2
double double tanh(1.0) 0.8
Tangente
tanh float float tanh(1.0) 0.8 math.h
Hiperblico
long double long double tanh(0.5) 0.5
(*) 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 Carcter Cdigo Carcter Cdigo Carcter Cdigo Carcter

(*)32 56 8 80 P 104 h
33 ! 57 9 81 Q 105 i
34 " 58 : 82 R 106 j
35 # 59 ; 83 S 107 k
36 $ 60 < 84 T 108 l
37 % 61 = 85 U 109 m
38 & 62 > 86 V 110 n
39 ' 63 ? 87 W 111 o
40 ( 64 @ 88 X 112 p
41 ) 65 A 89 Y 113 q
42 * 66 B 90 Z 114 r
43 + 67 C 91 [ 115 s
44 , 68 D 92 \ 116 t
45 - 69 E 93 ] 117 u
46 . 70 F 94 ^ 118 v
47 / 71 G (*)95 _ 119 w
48 0 72 H 96 ` 120 x
49 1 73 I 97 a 121 y
50 2 74 J 98 b 122 z
51 3 75 K 99 c 123 {
52 4 76 L 100 d 124 |
53 5 77 M 101 e 125 }
54 6 78 N 102 f 126 ~
55 7 79 O 103 g
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

Valor
Tipo
Tipo Dato devuelt Librera
Funcin Descripcin Dato Ejemplo(*)
Argumento o (**)
devuelto
ejemplo
Devuelve true si su
isalnum('B')
argumento satisface true
isalnum('1')
isalnum isalpha o isdigit. char bool true ctype.h
isalnum('+')
Caso contrario devuelve false
false.
Devuelve true si su
argumento es letra isalpha('B')
true
(Mayscula o isalpha('1')
isalpha char bool false ctype.h
Minscula). Caso isalpha('+')
false
contrario devuelve
false.
Devuelve true si su isdigit('B')
false
argumento es un digito. isdigit('1')
isdigit char bool true ctype.h
Caso contrario devuelve isdigit('+')
false
false.
Devuelve true si su
argumento es un
carcter imprimible que
ispunct('B')
no satisface isalnum y false
ispunct('1')
ispunct no es espacio en blanco char bool false ctype.h
ispunct('+')
(Caracteres de true
puntuacin). Caso
contrario devuelve
false.
Devuelve true si su isspace(
argumento es un ' ') true
carcter de espacio en isspace(' ') true
isspace char bool ctype.h
blanco (Tabular, Enter). isspace('\n' true
Caso contrario devuelve )
false.
Devuelve true si su iscntrl
argumento es un (
iscntrl
carcter de control. Caso char bool char(127) true ctype.h
(*)
contrario devuelve )
false.
Devuelve true si su islower('a') true
islower char bool ctype.h
argumento es letra islower('A') false
Minscula. Caso islower('+') false
contrario devuelve
false.
isupper
Devuelve true si su ('a')
argumento es letra isupper false
isupper Mayscula. Caso char bool ('A') true ctype.h
contrario devuelve isupper false
false. ('+')

Devuelve la versin en
tolower('A')
minscula de su a
tolower('a')
tolower argumento. Si no tiene char char a ctype.h
tolower('+')
minscula devuelve el +
mismo argumento
Devuelve la versin en
toupper('A')
mayscula de su A
toupper('a')
toupper argumento. Si no tiene char char A ctype.h
toupper('+')
mayscula devuelve el +
mismo argumento

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

Valor
Librera
Prototipo Descripcin Ejemplo devuelto
(**)
ejemplo
int atoi
Convierte <cadena> char cad[2]={'1','0'};
(char* <cadena>) 10 stdlib.h
hacia un int atoi(cad);
long atol
Convierte <cadena> char cad[2]={'0','5'};
(char* <cadena>) 5 stdlib.h
hacia un long atol(cad);
double atof char
Convierte <cadena>
(char* <cadena>) cad[3]={'0','.','5'}; 0.5 math.h
hacia un double
atof(cad)
char* strcat(
Anexa o junta char cad1[10]={'A','B'};
char*
<cad_origen > al char cad2[2]={'C'};
<cad_destino>, ABC string.h
final de strcat(cad1, cad2);
char* <cad_origen>
<cad_destino> printf("\n%s", cad1);
)
Devuelve 0, si las
char cad1[1]={'A'};
cadenas son
int strcmp( char cad2[1]={'A'};
iguales, 1 si
char* <cadena1>, printf("\n%d", 0 string.h
<cadena1> es mayor
char* <cadena2>) strcmp(cad1, cad2));
a <cadena2> y -1 si
es menor (*)
char* strcpy(
Cambia el valor de char cad[10];
char*
<Expresioncad> strcpy(cad, "ABC");
<cad_destino>, ABC string.h
hacia printf("\n%s", cad);
char*
<cad_destino>
<Expresioncad>)
int strlen char cad[10]={'A','B'};
Devuelve la longitud
(char* <cadena>) printf("\n%d", ABC string.h
de <cadena>
strlen(cad));
char* strncat(
char* Anexa o junta <n>
char cad1[10]={'A','B'};
<cad_destino>, caracteres de
char cad2[2]={'C','D'};
char* <cad_origen > al ABC string.h
strncat(cad1,cad2,1);
<cad_origen>, final de
printf("\n%s", cad1);
int <n>) <cad_destino>

int strncmp(
Compara <n> char cad1[10]={'A','B'};
char* <cadena1>,
caracteres de char cad2[2]={'A','C'};
char* <cadena2>, 0 string.h
<cadena1> con printf("\n%d",
int <n>)
<cadena2> strncmp(cad1, cad2, 1));
char
Devuelve un puntero
cad1[10]={'A','B','C'};
a la primera
char cad2[10]={'B'};
char* strstr( ocurrencia de la
char cad3[10];
char* <cadena>, cadena <Patrn> BC string.h
strcpy(cad3, strstr(cad1,
char* <Patrn>) en <cadena> y
cad2));
NULL si no lo
printf("\n%s", cad3);
encuentra
Devuelve un puntero char cad1[10]={'A','B',
char* strchr(
a la primera 'A','B'};
char* <cadena>, BAB string.h
ocurrencia de la char car='B';
char <caracter>)
cadena < char cad3[10];
caracter> en strcpy(cad3, strchr(cad1,
<cadena> y NULL car));
si no lo printf("\n%s", cad3);
encuentra
Devuelve un puntero char cad1[10]={'A','B',
a la ltima 'A','B'}; char car='B';
ocurrencia de la char cad3[10];
char* strrchr(
cadena < strcpy(
char* <cadena>, B string.h
caracter> en cad3, strrchr(cad1, car)
char <caracter>)
<cadena> y NULL );
si no lo printf("\n%s", cad3);
encuentra

(*) 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 Programacin Modular

Introduccin

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 SUBPROGRAMA (X)
Lnea 1 xxxxxxxx Lnea 1 xxxxxxxx
Lnea 2 xxxxxxxx Lnea 2 xxxxxxxx
LLAMA SUBPROGRAMA X
Lnea 4 xxxxxxxx Lnea n-1 .....
Lnea 5 xxxxxxxx Lnea n.....
Lnea 6 xxxxxxxx
LLAMA SUBPROGRAMA X
Lnea 8 xxxxxxxx
Lnea 9 xxxxxxxx
Lnea 10 xxxxxxxx
LLAMA SUBPROGRAMA Y
Lnea 11 xxxxxxxx El esquema representa el
Lnea 12 xxxxxxxx flujo de un programa con
... dos subprogramas.

Lnea n-1 .....
Lnea n.....

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 Arreglos

Introduccin

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

A[5] = A[1]; A[6] = A[6] * 2; A[7] = A[0] / A[1];

A[9] = desde + rand() % (1 + hasta - desde);

8.1.3 Lectura y escritura de datos

Leer o escribir un elemento del vector es similar ha como se hace a variables individuales mediante la
variable seguida del ndice entre corchetes as como sigue a 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>: Vector de elementos

< posicion >: Posicin a insertar

< nro_insertar >: Valor a insertar

< N >: 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[i]
A[4] = A[3]
A[3] = A[2]
A[2] = A[1]

Resultado:

0 1 2 3 4 5
2 3 3 1 4

A[posicion-1] = nro_insertar;

Si < nro_insertar > es 10 entonces:

A[2-1] = 10;

0 1 2 3 4 5
2 10 3 1 4
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>: Vector de elementos

< posicion >: Posicin a eliminar

< N >: 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[i]
A[1] = A[2]
A[2] = A[3]
A[3] = A[4]

Resultado:

0 1 2 3 4 5
2 1 4 5 5

N--;

Como N 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 A[0][3]=6

0 1 2 3 4 A[1] [1]=6
0 2 3 5 6 7
1 5 6 0 8 6 A[2] [3]=9
2 2 6 3 9 5
3 1 2 7 2 8 A[3] [1]=2
4 7 8 9 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[3][1] = 3; A[8][8] = 15;

A[5][0] = A[1][3]; A[6][2] = A[6][2] * 2; A[7][5] = A[0][3] / A[1][9];

A[9][1] = desde + rand() % (1 + hasta - desde);

8.1.3 Lectura y escritura de datos

Leer o escribir un elemento de la matriz es similar ha como se hace a variables individuales mediante
la variable seguida de los ndices entre corchetes as como sigue a 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 j
0 1,2,3,4,5
1 2,3,4,5
2 3,4,5
3 4,5
4 5

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

aux = A;
A = B;
B = aux;
Supongamos que el vector es el siguiente:

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

Como conocemos N=6, el recorrido de las variables <i> y <j> el algoritmo del intercambio es
entonces:

i j A[i] A[j] A[i] > A[j] Intercambio


0 1 3 5 false
0 2 3 4 false
0 3 3 6 false
0 4 3 7 false
0 5 3 0 true 0 5 4 6 7 3

1 2 5 4 true 0 4 5 6 7 3
1 3 4 6 false
1 4 4 7 false
1 5 4 3 true 0 3 5 6 7 4

2 3 5 6 false
2 4 5 7 false
2 5 5 4 true 0 3 4 6 7 5

3 4 6 7 false
3 5 6 5 true 0 3 4 5 7 6

4 5 7 6 0 3 4 5 6 7

El resultado final es el arreglo ordenado:

0 3 4 5 6 7
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 4 5 6 7 8 9 10 11 12 13 14 15
0 J O E R O C A \0 ? ? ? ? ? ? ? A[1][10]=S
1 M A R I A S A L A S \0 ? ? ? ?
2 J U L I O T E L L O \0 ? ? ? ?
3 P E D R O M O R E N O \0 ? ? ? A[2][9]=L
4 P I L A R \0 ? ? ? ? ? ? ? ? ? ?

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 c Resultado[c]
5 0 P
6 1 E
7 2 R
8 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] + Y[9] = Z[0]


X[1] + Y[8] = Z[1]
X[2] + Y[7] = Z[2]
. . .
. . .
X[9] + Y[0] = Z[9]

*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
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) fila=N-1;
else fila--;

if(c==N-1) c=0;
else c++;
}
}

for(fila=0;fila<N;fila++){
printf("\n\n");
for(c=0;c<N;c++)
printf("\t%d",A[fila][c]);
}

printf("\n\n \n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
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 digito se encuentra en el numero, y esta en posicion correcta


se debera imprimir 'y'.
-Si algun digito se encuentra en el numero, pero no esta en la posicion
correcta, se debera imprimir una 'x'.

Ejemplo:

Supongamos que el numero sea 28635 y el numero ingresado es 38165. La


computadora mostrara por pantalla 'xy1xy'

Si al final de los seis intentos no se acierta con m se debera mostrar


el numero ingresado.

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

void main(){

long azar, n;
int i, j, k, A[5], B[5], desde, hasta, intentos=6, cantidad_digitos=5;
int u,d,c,m,um, u1,d1,c1,m1,um1, tiempo;
char r;
bool sw;

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

desde=10000;
hasta=99999;
do{

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


//azar= 28635;
um=azar/10000;
m=(azar%10000)/1000;
c=((azar%10000)%1000)/100;
d=(((azar%10000)%1000)%100)/10;
u=azar%10;
A[0]=um, A[1]=m, A[2]=c, A[3]=d, A[4]=u;

//printf("\n\n%d...", azar);
for(i=0 ; i<intentos ; i++){

printf("\n\nDigite # de 5 digitos..."); scanf("%ld",&n); fflush(stdin);

if(!(n>=10000 && n<=99999)){


printf("\n\nNumero no es de 5 cifras\n\n");
system("PAUSE");
continue;
}

um1=n/10000;
m1=(n%10000)/1000;
c1=((n%10000)%1000)/100;
d1=(((n%10000)%1000)%100)/10;
u1=n%10;
B[0]=um1,B[1]=m1,B[2]=c1,B[3]=d1,B[4]=u1;

for(j=0 ; j<cantidad_digitos ; j++){

if(B[j]==A[j]){
printf("y");
continue;
}

sw=false;
for(k=0 ; k<cantidad_digitos ; k++){
if(j==k)continue;

if(B[j]==A[k]){
printf("x");
sw=true;
break;
}
}

if(!sw) printf("%d", B[j]);

if(n==azar){
printf("\n\nUsted ha acertado \t\"Felicitaciones\"");
break;
}else if(i<=intentos )
printf("\nNo acerto tiene %d oportunidades",intentos -i -1);
}
if(n!=azar)
printf("\n\nNo acerto \"QUE LASTIMA...\" el # de la PC era...%ld", azar);

printf("\n\nContinua? S/N "); r=getchar(); fflush(stdin);

}while(r=='s'|| r=='S');

printf("\n\n");
system("PAUSE");

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

/**********************Inicio del Programa***************************

Ejercicio 4: CODIFICACION DE MENSAJES

Elaborar un programa para codificar mensajes con la sgte clave:


Se intercambia el caracter en blanco con el simbolo @, para las letras A-M con
las letras N-Z y las letras N-Z con A-M, los otros carceteres se dejan intactos.
Ejemplo
Mensaje: HOLA COMO TE VA
CODIFICADO: UBYN@PBZB@GR@IN

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

void main(){

char frase[50]; int i, j, lon;


printf("\nIngrese frase..."); gets(frase); fflush(stdin);

lon=strlen(frase);
for(i=0 ; i<lon ; i++)
frase[i]=toupper(frase[i]);

for(i=0 ; i<lon ; i++)


if(frase[i]>='A' && frase[i]<='M')
frase[i]=char(int(frase[i]) + 13);
else if(frase[i]>='N' && frase[i]<='Z')
frase[i]=char(int(frase[i]) - 13);
else if(frase[i]==' ')
frase[i]='@';

printf("\n\nLa nueva frase es..%s", frase);

printf("\n\n");
system("PAUSE");
}
/***************************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 tiene una matriz cuadrada de orden N de tipo entero que representa


un grafo.
se pide mostrar la cantidad de formas de ir desde (a,b) pasando por
(E arcos).

Ingresar por teclado:


-El orden de la matriz
-Los puntos de conexion entre dos puntos (1 hay conexion, 0 No).
-Cantidad de arcos E.

El Resultado es una matriz con la cantidad de formas de ir desde un


punto (a,b) pasando por E arcos.

*********************************************************************/
/*
ANALISIS
SE UTILIZA EL CONCEPTO DE PRODUCTO DE MATRICES.

ML=
A B C D
0 0 1 1 A
1 0 0 1 B
0 1 0 0 C
0 0 1 0 D

SI E=2
MLxML=
0 0 1 1 0 0 1 1
1 0 0 1 X 1 0 0 1
0 1 0 0 0 1 0 0
0 0 1 0 0 0 1 0

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

Existen 1 forma de ir de A hacia B pasando por dos arcos


Existen 2 forma de ir de C hacia B pasando por dos arcos
Existen 0 formas de ir de A hacia D pasando por dos arcos
*/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
//CONSTANTES Y VARIABLES GLOBALES
const int OrdenMax = 10;
int N, E;
//PROCEDIMIENTOS
void Asignar_Matriz(int &indice, int ai_cubo[][OrdenMax][OrdenMax], int ai_matriz[][OrdenMax]){
for(int fila=0 ; fila<N ; fila++)
for(int columna=0 ; columna<N ; columna++)
ai_cubo[indice][fila][columna] = ai_matriz[fila][columna];

indice++;
}

void Mostrar_MatrizResultado(int indice, int ai_cubo[][OrdenMax][OrdenMax]){


int data, fila, columna;

for(fila=0 ; fila<N ; fila++)


printf("\t%c", char(65+fila));
printf("\n\n");

for( fila=0 ; fila<N ; fila++){


for(columna=0 ; columna<N ; columna++){
data=ai_cubo[indice-1][fila][columna];
printf("\t%d", data);
}
printf("%4c\n\n", char(65+fila));
}
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 FELIZ o
o NAVIDAD! o
o 2000 o
o o
o o o
o o o o
o o
o o

Solo se pide que la letra "I" de la palabra NAVIDAD este en el centro de la pantalla.( por ejm si
trabajamos en una pantalla de 80 columnas y 25 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 SALIDA
8 1 18 19 0
20 14 1 10 19 0
1 14 1 7 18 0
6 2 19 9 0
19 9 2 13 7 0
18 19 2 7 9 0
13 7 2 7 14 1
10 19 2 1 14 17
7 9
7 18

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 SALIDA
58 2
15 3 2 10 14 11 6 7
7 9 12 7 15 15 13 5
1 14 11 8 10 14 11 4
12 11 10 10 10 10 14 13
11 10 10 10 10 10 10 14
2 5

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 5 2 3
1 1 0 1 1 1 3
0 1 1 1 0 1 4 5
1 0 1 1 1
ENTRADA SALIDA
4 5 3 3
0 1 0 1 0 2 3 4
1 1 1 1 1 1 3 5
1 0 1 0 1
1 1 1 0 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 SALIDA
5 7 3
0 0 0 1 0
1 0 1 0 0
0 0 1 0 0
1 1 0 0 1
0 0 0 1 0
0 0 1 1 0
0 0 0 0 0
1 1
4 6

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 ACXBDZACXBDZAXFEGEFFG

ABABAFGFG

CDCD

XZXZXEEF

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 SALIDA
3 862
4133 153
4214 947
3432
4535
3135
4441
3214
1541
4344

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.
31 22 26 11 4 36 0 4
Sale

Par
Lista 1 2 3 4 2 2 2 3 3 3 5 5

3 3 3 5 5 5 8 8 13

5 5 8 8

7 11

Ganancia Acumulada 0 -5 0 +7 -2 +6 +17 +3 +16

Impar

Lista 1 2 3 4 1 2 3 3 1 2 1 2

2 3 4 3 2 3 2 3

3 3 3

4 4 4

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 SALIDA
8 16 -25

31

22

26

11

36

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 2 3
1 5 6
1 4 5
1
1
0
1
0

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 SALIDA
5 2
33
71
56
44
21
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 Usuario


recin llegados Informacin
Agente Procesada

De

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 Total de Mensajes: 3

Orden Longitud Latitud Vel. Rumbo Tiempo Est. Operativo Est. Posicin

1 75.204434 15.603655 40 090 2006/05/08 08:30 En Movimiento En Zona Normal

2 75.567234 10.003212 30 045 2006/05/08 08:10 En Movimiento En Zona Prohib

3 75.200034 08.603234 00 000 2006/05/08 08:00 Detenido En Zona Normal

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

Unidad: 201 Total de Mensajes: 2

Orden Longitud Latitud Vel. Rumbo Tiempo Est. Operativo Est. Posicin

1 71.200034 15.643234 92 280 2006/05/08 08:32 Velocidad Alta En Zona Normal

2 70.200034 15.665234 35 270 2006/05/08 08:22 En Movimiento En Zona Normal


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 Posicin Posicin Datos Adicionales
Caracteres Inicial Final
Carcter Inicial > 1 1 1 Siempre tiene valor >
Unidad HH 2 2 3 Cdigo de la unidad mvil
Longitud HHHHHHH 7 4 10 Coordenada x
Latitud HHHHHHH 7 11 17 Coordenada y
Velocidad HH 2 18 19 Km./h
Rumbo HHH 3 20 22 Grados (0 a 360)
Tiempo HHHH 4 23 26 Total de Minutos
transcurridos de la semana
actual.

(*) H representa un digito Hexadecimal para su 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 Longitud Latitud Velocidad Rumbo Tiempo


> C8 47B7622 0834662 00 000 780
> C8 4811082 098A30C 1E 02D 78A
> C8 47B8752 0EE17C7 28 05A 79E
> C9 42F2AE2 0EF0852 23 10E 796
> C9 43E6D22 0EEB262 5C 118 7A0

Procesada de hexadecimal a decimal resultara:

Carcter Inicial Unidad Longitud Latitud Velocidad Rumbo Tiempo


> 200 75200034 08603234 0 0 1920
> 200 75567234 10003212 30 45 1930
> 200 75204434 15603655 40 90 1950
> 201 70200034 15665234 35 270 1942
> 201 71200034 15643234 92 280 1952

Formateando latitud y longitud(*) y calculado la fecha hora(**) correspondiente resultara:

Carcter Inicial Unidad Longitud Latitud Velocidad Rumbo Tiempo (Fecha Hora)
> 200 75.200034 08.603234 0 0 2006/05/08 08:00
> 200 75.567234 10.003212 30 45 2006/05/08 08:10
> 200 75.204434 15.603655 40 90 2006/05/08 08:30
> 201 70.200034 15.665234 35 270 2006/05/08 08:22
> 201 71.200034 15.643234 92 280 2006/05/08 08:32

(*)Para Latitud y Longitud dividir el valor decimal entre 100000.

(**)Para el calculo de la fecha y hora agregar a la fecha hora inicial de la semana (domingo a las o horas) la
cantidad de minutos correspondiente al mensaje.

Anexo3: Reglas de negocio a cumplir para elaborar el reporte:

El Listado ordenarlo 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 1 2 3 4 5 6 7 8 9 A B C D E F
DgitoDecimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 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