INICIANDO PROGRAMADORES CON
C++ .nET
Análisis y Resolución de problemas PRIMERA EDICION
Christian Mori
Esta es la entrega que ofrece una amplia enseñanza acerca de la resolución de problemas computacionales en lenguaje C++.Net.
Este libro muestra ejercicios diseñados didácticamente para la fácil asimilación del estudiante. estud iante.
Además se incluye ejercicios de maratón, exámenes y ejercicios para aplicaciones actuales.
Con este libro Usted podrá culminar su carrera de ciencias informáticas sin morir en el intento.
Contenido UNIDAD 1 Capítulo 1: Sistemas de procesamiento de datos 1.1 Conceptos de la programación 1.1.1 Programa 1.1.2 Programación 1.1.3 Programador/Desarrollador 1.1.4 Sistema 1.1.5 Sistema de Información 1.1.6 Dato 1.1.7 Información 1.1.8 Software 1.1.9 Hardware 1.2 Ejecución de un programa 1.2.1 Representación sencilla de la ejecución de un programa 1.3 Lenguajes de Programación 1.4 Evolución los lenguajes de Programación 1.4.1 Lenguajes de Alto nivel 1.4.2 Lenguajes de bajo nivel 1.5 Tipos de lenguajes de programación programación 1.5.1 En función de la forma de programar 1.5.2 Orientados al problema 1.5.3 Según su campo de aplicación
Capítulo 2: Metodología para solución de problemas computacionales 2.1 Pasos para la solución de problemas computacionales computacionales
2.1.1 Definición del problema 2.1.2 Análisis de la solución 2.1.3 Diseño de la solución 2.1.4 Codificación 2.1.5 Prueba y Depuración 2.1.6 Documentación 2.1.7 Mantenimiento
2.2 Tipos de errores 2.2.1 Error sintáctico de software 2.2.2 Error de lógica de programador 2.2.3 Error fatal en tiempo de ejecución 2.2.4 Error interno de software
Capítulo 3: Fases de la programación 3.1 Elementos de un programa 3.1.1 Tipos de datos en C++ 3.1.2 Identificadores 3.1.3 Conceptos básicos al nombrar variables 3.1.4 Asignación de variables 3.1.5 Operadores 3.1.6 Prioridad de Operadores 3.1.7 Entrada y Salida 3.2 Manejo de Expresiones 3.2.1 Transformación de expresiones algebraicas a computacionales 3.2.2 Declaración de Variables 3.2.3 Datos Enteros vs Datos Reales 3.2. 4 Partes de la división 3.2.5 División Entera vs división real 3.2.6 Resultados de la división 3.2.7 Análisis de almacenamiento de la división con resultados numéricos
3.2.8 Residuo (Modulo)
Capítulo 4: Flujos de Control 4.1 Estructuras condicionales 4.1.1 Expresiones booleanas 4.1.2 Estructura condicional < if > 4.1.3 Estructura condicional < if - else > 4.1.4 Estructura condicional anidada < if - else - if > 4.1.5 Estructura de selectiva múltiple < switch > 4.1.6 8 Recomendaciones para el uso de estructuras condicionales. 4.2 Estructuras repetitivas 4.2.1 Conceptos acerca de estructuras repetitivas 4.2.2 Operadores de incremento 4.2.3 inicialización de variables 4.2.4 Contadores y Acumuladores y Banderas (flag) 4.2.5 Estructura repetitiva < for > 4.2.6 Estructura repetitiva < while > 4.2.7 Estructura repetitiva < do - while > 4.2.8 Anidamiento de bucles 4.2.9 8 Recomendaciones para el uso de estructuras repetitivas
Capítulo 5: Ejercicios de autoevaluación Capítulo 6: Funciones Predefinidas de C++ 6.1 Concepto de Función 6.2 Funciones Aritméticas 6.3 Funciones trigonométricas 6.4 Funciones de caracteres 6.5 Funciones de Cadena 6.6 Generador de números aleatorios 6.7 De Control de pantalla
UNIDAD 2 Capítulo 7: Programación Modular 6.3 Diseño descendente 6.4 Subprogramas 6.5 Variables globales y locales 6.6 Funciones 7.4.1 Definición de funciones 7.4.2 Invocación a las funciones 6.7 Procedimientos 7.5.1 Definición de Procedimientos 7.5.2 Invocación a las Procedimientos 7.6 Tipos de Parámetros
Capítulo 8: Arreglos 8.1 Arreglos Unidimensionales 8.1.1 Representación Grafica 8.1.2 Asignación de Valores 8.1.3 Lectura y escritura de datos 8.1.4 Recorrido, inserción y eliminación en un vector 8.2 Arreglos Bidimensionales 8.1.1 Representación Grafica 8.2.2 Asignación de Valores 8.2.3 Lectura y escritura de datos 8.2.4 Recorrido, inserción y eliminación en una matriz 8.3 Ordenamientos 8.3.1 método de intercambio o burbuja 8.3.2 método por inserción, 8.3.3 método por selección 8.3.4 método de ordenación rápida (quicksort). 8.4 Búsquedas 8.4.1 Tipos de búsqueda
8.4.2 Método Búsqueda Binaria
Capítulo 9: Cadenas 9.1 Fundamentos de cadenas 9.2 Asignación de Valores 9.3 Lectura y escritura de datos 9.4 Arreglo de cadenas 9.5 Lectura y escritura de datos
Capítulo 10: Ejercicios de autoevaluación Capítulo 11: Ejercicios Propuestos al estudiante
Prefacio Este libro ha sido creado para los iniciantes en la programación. Puede ser como primer libro de programación ya que cuenta con los conceptos principales para la resolución de problemas. Aunque la versión de C++.Net es 2012 es también valido para versiones anteriores de C++.Net. Para entender el libro no se requiere grandes conocimientos superiores, solo es indispensable tener conocimientos de matemáticas tan básicos como algebra y operaciones.
Un modelo, no una regla Lo expuesto en el libro son conocimientos básicos fundamentales en la programación, además de recomendaciones adquiridas con la experiencia en el campo. Seguir las recomendaciones sugiere tener menos tropiezos en los desarrollos ya que las recomendaciones vertidas son correctivos de dichos tropiezos.
Bibliografia para complemento y apoyo A continuación listamos algunos materiales que sirven como complemento del estudio del libro. Se puede corroborar y encontrar adicionales -
Manual Estructura de Datos Universidad Tecnologica del Peru Fundamentos de Programacion (Luis Joyanes) Resolucion de Problemas con C++ (Walter Savitch) Manual de C++ para Microsoft Visual Studio 2012
Contacto por correo electrónico Estoy sumamente interesado en sus comentarios y sugerencias. Por favor no dudes en enviarlos al correo electrónico:
[email protected]
Sus sugerencias serán procesadas para el mejoramiento continuo del libro, mas no para la resolución de algún problema propuesto, puesto que los problemas serán resueltos paulatinamente en las siguientes ediciones del libro.
Agradecimientos Durante la preparación de este libro, ha intervenido muchas personas y diversas han sido las ayudas, Mis grandes amigos de estudio, mi familia, a los que se encuentran conmigo Dios creador de todo y el señor que es mi amigo que se encuentra a mi lado, mi padre Ezequiel Mori. Doy especial agradecimiento a los estudiantes de mis cursos que aprobaron y me enseñaron a cómo instruir, fueron el mejor test que pude haber tenido al diseñar el libro.
A la izquierda Christian con su padre Ezequiel.
Introducción
El presente trabajo ha sido un gran esfuerzo místico con el fin de orientar a los primeros estudiantes que ayudara a desarrollar la capacidad de análisis en los problemas computacionales.
Este trabajo va dirigido a los futuros expertos en sistemas y programación de computadoras, ya que varias personas por falta de motivación abandonan esta parte valiosa de la computación y sistemas.
En este libro desarrollaremos los problemas computacionales desde los más comunes para iniciantes y complejos de análisis para los avanzados. Inicialmente se mostraran las equivalencias de pseudocódigo y C++ hasta el capítulo 4, luego se desarrollaran los programas solo en lenguaje C++.
Capítulo 1 Sistemas de Procesamiento de Datos 1.1 Conceptos de la programación 1.1.1 Programa 1.1.2 Programación 1.1.3 Programador/Desarrollador 1.1.4 Sistema 1.1.5 Sistema de Información 1.1.6 Dato 1.1.7 Información 1.1.8 Software 1.1.9 Hardware 1.2 Ejecución de un programa 1.2.1 Representación sencilla de la ejecución de un programa 1.3 Lenguajes de Programación 1.4 Evolución los lenguajes de Programación 1.4.1 Lenguajes de Alto nivel 1.4.2 Lenguajes de bajo nivel 1.5 Tipos de lenguajes de programación 1.5.1 En función de la forma de programar 1.5.2 Orientados al problema 1.5.3 Según su campo de aplicación
1
Sistemas de Procesamiento de Datos
Introducción Es el conjunto de métodos y procedimientos que permiten obtener información. A continuación se mencionan conceptos que será fundamental que el lector conozca:
1.1 Conceptos de los sistemas de computación 1.1.1 Programa Es el conjunto de instrucciones que una computadora ha de seguir. Estas instrucciones son escritas en un lenguaje de programación que la computadora es capaz de interpretar.
1.1.2 Programación Es aquella actividad por la cual se crean programas para computadoras.
1.1.3 Programador/Desarrollador Individuo que ejerce la programación, es decir escribe programas para computadoras.
1.1.4 Sistema Es un conjunto de elementos interrelacionados entre sí, interactuando con un objetivo en común.
1.1.5 Sistema de Información Es el conjunto de procedimientos ordenados que al ser ejecutados proporcionan información para apoyar la Toma de Decisiones y el control de una organización.
1.1.6 Dato Representa observaciones o hechos fuera de contexto y sin significado inmediato (Es materia prima de la información).
1.1.7 Información Es el significado que una persona asigna a un dato (conjunto de datos).En otras palabras es el resultado o salida que emite un programa o sistema de información.
1.1.8 Software Serie de programas que la computadora utiliza con un fin en especial.
1.1.9 Hardware Son las maquinas físicas reales que constituyen una instalación de cómputo.
1.2 Ejecución de un programa En la ejecución de un programa intervienen elementos de entrada y de salida que interactúan en la computadora. Se necesita de datos de entrada ingresados desde teclado usualmente, un programa escrito en un lenguaje de programación, una computadora que mostrara los resultados y/o salida usualmente por pantalla.
1.2.1 Representación sencilla de la ejecución de un programa Entrada (INPUT)
Proceso
Salida (OUTPUT)
Programa -------------------------
Salida
------------Computadora Datos -------------
-------------------------
----------------------------------------
1.3 Lenguajes de Programación
Definición Es un conjunto de reglas semánticas así como sintácticas que los programadores usan para la codificación de instrucciones de un programa o algoritmo de programación .
1.4 Evolución los lenguajes de Programación Es el desarrollo y mejoramiento de los lenguajes de programación a través de la historia, se categorizan en:
1.4.1 Lenguajes de Alto nivel 4to nivel: Llamados también generador de aplicaciones Son en esencia programas para crear programas, por ejemplo herramientas CASE, GENEXUS Tool, PowerDesigner, etc. 3er nivel: Es el nivel de lenguaje más parecido al lenguaje del ser humano, con más signos y reglas para expresar con facilidad las cosas más complicadas, entre ellos existen C++, BASIC, PASCAL, C#, JAVA, Php, ETC Ejm: Z=X+Y
1.4.2 Lenguajes de Bajo Nivel
2do nivel: Es el tipo de lenguaje que cualquier computadora puede entender, por ejemplo Ensamblador. Ejm: ADD X Y Z
1er nivel: Llamado también Lenguaje de Maquina. Son los programas escritos en forma de ceros y unos. Ejm 0110 1001 1010 1011
1.5 Tipos de lenguajes de programación Son las distintas formas y categorías de los lenguajes de programación, se categorizan en:
1.5.1 En función a la forma de programar Lenguajes procedurales: FORTRAN, BASIC, PASCAL, ADA, MODULA-2 Lenguajes declarativos: LIPS , PROLOG Orientados a objetos: C++, Java, C#
1.5.2
Orientados al problema:
Generadores de aplicaciones: GENEXUS Tool, PowerDesigner, etc.
1.5.3
Según su campo de aplicación.
Aplicaciones científicas: FORTRAN y PASCAL Aplicaciones en procesamiento de datos: COBOL y SQL. Aplicaciones de tratamiento de textos: C Aplicaciones en inteligencia artificial: LISP y PROLOG Aplicaciones de programación de sistemas: ADA, MODULA-2 y C. Lenguajes de Internet: HTML, JAVA, Perl, PHP, ASP.NET
Capítulo 2 Metodología para solución de problemas computacionales 2.1 Pasos para la solución de problemas computacionales 2.1.1 Definición del problema 2.1.2 Análisis de la solución 2.1.3 Diseño de la solución 2.1.4 Codificación 2.1.5 Prueba y Depuración 2.1.6 Documentación 2.1.7 Mantenimiento
2.2 Tipos de errores 2.2.1 Error sintáctico de software 2.2.2 Error de lógica de programador 2.2.3 Error fatal en tiempo de ejecución 2.2.4 Error interno de software
2
Metodología para solución de problemas computacionales
Introducción Es la serie de pasos adecuados que se ha de seguir para obtener una solución completa de un problema computacional.
2.1 Pasos para la solución de problemas computacionales A continuación se mencionan los puntos a seguir:
2.1.1 Definición del problema Conocer y delimitar por completo el problema, saber que es lo se desea realice la computadora.
2.1.2 Análisis de la solución
Establecer una serie de preguntas acerca de lo que establece el problema: ¿Con qué cuento? , ¿Qué hago con esos datos? , ¿Qué se espera obtener?
2.1.3 Diseño de la solución Es la creación del algoritmo (Diagrama de flujo y/o pseudocódigo),
2.1.4 Codificación Escribir la solución del problema (de acuerdo al pseudocódigo), en una serie de instrucciones detalladas en un código reconocible por la computadora (PROGRAMA). En la actualidad y con algo de práctica se es posible pasar del análisis de la solución a la codificación, en muchos casos es más rápido y permite detectar errores mediante la depuración o debug, asunto que se haría manualmente en el pseudocódigo y/o diagrama de flujo.
2.1.5 Prueba y Depuración La Prueba es el proceso de identificar los errores que se presenten durante la ejecución del programa. La Depuración consiste en eliminar los errores que se hayan detectado durante la prueba.
2.1.6 Documentación Es la guía o comunicación escrita que sirve como ayuda para usar un programa, o facilitar futuras modificaciones. La documentación que va a sustentar en términos legales la creación y/o modificación del programa. Existen 3 tipos:
Documentación Interna Consiste en los comentarios o mensajes que se agregan en el código del programa (Es la más usada), mientras más detallado se encuentre el programa será más fácil la modificación en el futuro, además es utilizado para controles internos dentro del área de TI. Consta de: Nombre de modulo, Descripción del módulo, Nombre del Autor, fecha creación, fecha modificación
Documentación Externa
Es el Manual Técnico (A menudo obviada), está integrada por los siguientes elementos: Descripción del Problema, Nombre del Autor, Diagrama del Flujo, Pseudocódigo, Lista de variables y constantes, y Codificación del Programa.
Manual del Usuario Es la documentación (Generalmente diapositivas) que se le proporciona al usuario final, presentando todas las pantallas y menús que se va a encontrar y una explicación de los mismos. Es de uso indispensable cuando se va a entregar el programa al usuario final puesto que facilitara el manejo en gran medida del programa.
2.1.7 Mantenimiento
Se realiza después de determinado el programa cuando se detecta que es necesario hacer un cambio, ajuste y/o complementación al programa para que siga trabajando de manera correcta. Nota: En la actualidad para un performance adecuado en el desarrollo de sistemas algunas empresas disponen de usar un software manejador de versiones de fuentes esto favorece en gran medida el control y feedback de los desarrollos.
2.2 Tipos de Errores A continuación se detallan los distintos tipos y formas en que aparecen los errores, además las recomendaciones para disminuir su aparición.
2.2.1 Error sintáctico de software
Son los errores conocidos como gramaticales respecto al software de lenguaje de programación que se utiliza. Estos errores son los que se muestran en la mayoría de los casos en el programa editor de código en tiempo de codificación. Pueden aparecer por no teclear correctamente alguna instrucción y/o comando del lenguaje de programación utilizado, la buena noticia de este tipo de errores son que se pueden detectar y corregir en tiempo de codificación, El software del lenguaje de programación en muchos casos detecta los errores automáticamente mientras se digita el código antes de ejecutar el programa . Por ejemplo en C++ toda instrucción termina en punto y coma < ; > si obvias ponerla seguramente el compilador te mostrara un mensaje de error al intentar ejecutar el programa.
2.2.2 Error de lógica de programador Son los errores del desarrollador y son errores de interpretación de los procesos funcionales (A menudo en expresiones de cálculos). Por ejemplo le podrían pedir calcular el promedio de 2 números y por distracción suma los dos números y los divide sobre tres, O quizás en su fórmula emplea lo siguiente: A+B / 2 y no coloca el paréntesis para que primero sume. Este tipo de errores no es percibido por el software editor de código ya que estos errores son sintácticamente correctos, en consecuencia solo pueden ser percibidos en tiempo de ejecución del programa al intentar ver el resultado o quizás mucho después.
2.2.3 Error fatal en tiempo de ejecución Estos tipos de errores suelen mostrar el respectivo mensaje de error, y en muchos casos consiguen hacer terminar forzosamente al programa. Este tipo de errores son los más comunes aun cuando se alcanza a dominar la programación. A menudo este tipo de errores son por cálculos numéricos y reglas matemáticas que no pueden ser pasadas por alto por ejemplo si se intenta dividir un número sobre cero,
Otro caso general es cuando se intenta obtener un valor ya sea por teclado o de otra ubicación, y no se valida que haya obtenido realmente el valor y se hace una expresión con la variable como si tuviera el valor y en ese momento seguramente tendrás un error en tiempo de ejecución. La recomendación para este tercer tipo de error es siempre validar las entradas ya sea teclado, lectura de archivos de texto, base de datos, etc.
2.2.4 Error interno de software No solo el desarrollador tiene errores, el software de programación utilizado algunas veces muestra errores. En algunos casos por modificación de algún componente interno ya sea por la instalación de algún otro software en la PC (Personal Computer) que consigue modificar el componente. Otros casos también suceden por no refrescar el proyecto utilizado, actualmente el software de programación cuenta con herramientas de actualización incluido. Este es nombrado de muchas formas: refrescar, actualizar, regenerar, etc. En cualquiera de los casos es recomendable actualizar cada cierto tiempo el proyecto de programación. Un caso menos usual es la infección de virus que en la actualidad se corrige con un antivirus efectivo.
Capítulo 3 Fases de la Programación 3.1 Elementos de un programa 3.1.1 Tipos de datos en C++ 3.1.2 Identificadores 3.1.3 Conceptos básicos al nombrar variables 3.1.4 Asignación de variables 3.1.5 Operadores 3.1.6 Prioridad de Operadores 3.1.7 Entrada y Salida 3.2 Manejo de Expresiones 3.2.1 Transformación de expresiones algebraicas a computacionales 3.2.2 Declaración de Variables 3.2.3 Datos Enteros vs Datos Reales 3.2. 4 Partes de la división 3.2.5 División Entera vs división real 3.2.6 Resultados de la división 3.2.7 Análisis de almacenamiento de la división con resultados numéricos 3.2.8 Residuo (Modulo)
3
Fases de la Programación
Introducción En este capítulo comenzaremos a revisar los elementos de un programa, los conceptos necesarios para realizar un programa sencillo.
3.1 Elementos de un programa
3.1.1 Tipos de datos en C++ Son clasificadores de variables ya sea en el dato que contendrá u operaciones que se realizara sobre ellas. A continuación se muestra una tabla con los rangos y algunas otras características de los tipos de datos:
Tipo de datos Rango Mínimo (*) Descripción
Precisión
C++
short
32,767
int
32,767
Enteros
long
2‟147,483,467
Entero sin signo
unsigned long
4‟294,967,295
float
10^37
6 dígitos
double
10^37
6 dígitos
Reales
long double
10^37
6 dígitos
Carácter
char
127
Cadena
string
Booleano
bool
(*) EL limite considera límite inferior el mismo número con signo negativo hasta el límite superior que es el numero mostrado, con excepción de los que llevan la palabra reservada unsigned(sin signo) en esos casos el límite inferior es cero y el límite superior es el doble del numero mostrado. Estos son los mínimos rangos sin embargo esto puede variar de acuerdo a la versión del compilador, a continuación se muestra los típicos rangos para un ambiente de 32 bits:
Tipo de datos Bytes utilizados Descripción
Típico Rango(*)
C++
short
2 bytes
32,767
int
4 bytes
2‟147,483,467
Enteros
long
4 bytes
2‟147,483,467
Entero sin signo
unsigned long
4 bytes
2‟147,483,467
float
4 bytes
1.8^-38 a 3.4^38
double
4 bytes
2.2^-308 a 1.8^308
long double
8 bytes
2.2^-308 a 1.8^308
Reales
unsigned double Real sin signo Carácter Cadena Booleano
unsigned long double char string bool
1 Byte: guarda un carácter Bytes Dinámicos, su tamaño es ilimitado 1 bit
Nota: Para los iniciantes los tipos de datos definidos bajo pseudocódigo se puede utilizar la descripción de la tabla. Sin embargo para este libro se utilizara los términos de C++.
3.1.2 Identificadores
Es el nombre de una variable. Las variables se dividen en 2 tipos:
Variable: Son ubicaciones de memoria en las cuales guarda un valor, además dicho valor puede ser cambiado a lo largo del programa.
Constante: Son un tipo de variable que mantiene su valor desde el principio hasta el final del programa. 3.1.3 Conceptos básicos al nombrar variables
Se consideran las siguientes recomendaciones al nombrar variables:
Use un nombre de variable que le dé significado al valor que va a contener.
Es factible usar abreviaturas, parte de la palabra o concepto que va a almacenar, mnemónico (palabra técnica) o palabra completa separada por guion bajo “_” ya sea por la complejidad de la rutina o del problema.
Respecto a las terminaciones con numeración pueden usarse en caso de tener variables con el mismo nombre pero con diferentes valores de una lista.
Se debe tener en cuenta que C++ distingue letras mayúsculas de minúsculas por lo tanto la variable (A) es distinta de la variable (a).
No se puede nombrar variables que tengan como nombre algún comando, palabra reservada, tipo de dato, etc. del lenguaje de programación utilizado. Por ejemplo en c++ existe el tipo de dato double si nombramos una variable con el nombre double seguramente nos dirá que hay un error.
Una forma recomendada de nombrar variables es:
<ámbito (local, global, parámetro, etc.) >
_ . Imagine una variable local de tipo entero que va a contener una edad, el nombre de la variable podría ser: li_edad. Variable global para guardar el sexo de maría („M‟,‟F‟), podemos declarar: gc_sexo_maria. A continuación listamos más ejemplos:
CAR CAR y Car son variables distintas
Car
a_50 b35a pepito Promedio_ventasC 31p
=> no valido
Luis Sánchez
=> no valido
Usuario-1
=> no valido
lc_nombre
=>local de tipo carácter (recomendado)
gl_cantidad
=> global de tipo long (recomendado)
afl_promedio
=>argumento de tipo float (recomendado)
En este libro usaremos la forma recomendada de nombrar variables cuando
veamos problemas
algorítmicos de sobremanera complejos.
3.1.4 Asignación de variables
Se asigna valores del mismo tipo que el que se declaró previamente a la variable/constante (aritmética, lógica, textos y caracteres).
Pseudocódigo
C++
Variable = variable/valor A=10
Variable = variable/valor; A=10;
B=20
B=20;
C = A + B
C = A + B;
D="Arriba Peru"
strcpy(D,"Arriba Peru");
Observación
Se utiliza una función predefinida de C++ (Véase capítulo 6)
E='A'
E='A';
F = 10 + 50
F = 10 + 50;
G = 10 + "50"
G = 10 + "50";
H = D + B
H = D + B;
No valido(10 es un numero entero y “50” es cadena por estar entre comillas) No valido(D es cadena y B es un entero)
3.1.5 Operadores
Tipo Operadores
Descripción
Pseudocódigo
C++
Suma
+
+
Resta
-
-
Multiplicación
*
*
División real
/
Aritméticos
(*) / División entera
Div
Residuo(división entera)
Mod
%
Mayor que
>
>
Mayor o igual que
>
>=
Menor
<
<
Menor o igual que
<
<=
Igualdad
=
==
Diferente
<>
!=
Relacionales
Lógicos
Y
And
&&
O
Or
||
Negación
Not
!
(*) Notar que para C++ se colocó el mismo símbolo en división real y entera, para saber en qué momento funciona como división real y en qué momento como división entera (Véase los apartados 3.2.5, 3.2.6, 3.2.7)
3.1.6 Prioridad de Operadores A continuación se detalla el orden de prioridad al momento de operar, se respeta de manera similar al orden que se usa en el álgebra de las matemáticas. Al igual que en el álgebra es posible alterar el orden de operación haciendo uso de paréntesis. Para agrupaciones más complejas solo está permitido el uso del paréntesis “()”. 1. () 2. / 3. * 4. + 5. –
(*)
(*) Las operaciones que están dentro de paréntesis se evalúan primero. Cuando existe múltiples paréntesis (anidado: internos unos a otros), se evalúan primero las expresiones más internas.
Ejemplos Considere si: A=3, B=4, C=5:
a) X = A-B+C X=3-4+5 X= 3- 9 X= -6
b) Y = A*B + C Y = 3*4 + 5 Y = 12 + 5 Y = 17
c)
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(, &);
Ejemplo: int nro; scanf("%d”,&nro" );
Salida Es generalmente la información y/o resultado del programa. Además se puede utilizar como mensajes para solicitud de entradas. En c++ utilizaremos el comando: printf(, ); 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 serán reemplazados por las variables listadas después de la coma en orden de ocurrencia. (**) Notar el número 8.4 del formato % 8.4lf, representa el formato de impresión del número en pantalla en este caso longitud 8 a 2 decimales.
Formatos de entrada y salida
Formato %d %ld %f %lf %c %s %u
Tipo de dato int long float double char char(cadena) Entero sin signo
Notar que %c y %s tienen el mismo tipo de dato, no obstante %c imprime solo un carácter y %s imprime una cadena de caracteres.
Secuencias de escape Como señalamos en los ejemplos de Salida en la impresión con printf, mostramos unos ejemplos de uso de las secuencias de escape, a continuación listamos más secuencias de escape:
Descripción Nueva Línea Tabulación Horizontal Retorno de carro Alerta Diagonal invertida Comillas dobles
Símbolo \n \t \r \a \\ \"
Ejemplos: printf("\n\t Promedio: %8.2lf \n\n", prom); printf("\n\n la cadena \"%s\" tiene una longitud: %d \n\n" , cadena, longitud);
3.2 Manejo de Expresiones 3.2.1 Transformación de expresiones algebraicas a computacionales Como ya se mencionó en el apartado Prioridad de operadores, solo están permitidos los paréntesis “ ()” a continuación veremos cómo transformar las expresiones algebraicas hacia expresiones computacionales:
Expresión algebraica
Expresión computacional
4+5
4+5
A - 10
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))
– – 4 + 2) / D
(A + 5 b
(a * b * (-c * d) + 5) / 10 1 / (a * b * c + c * d - 10)
((a-b)/(c-d) / ((e-f)/(g-h))
3.2.2 Declaración de Variables Es el acto de definir un Tipo de dato válido a una variable que se utilizará en el programa. Ejemplos:
Pseudocódigo Entero: A,B Real: P,Q Carácter: Sexo, Condición Constante Entero: P=10
C++ int A,B; long k,b; float P,Q; double R, s; char Sexo, Condición;
const int P = 10;
3.2.3 Datos Enteros vs Datos Reales En c++ hay que tener claro la diferencia entre los datos enteros y reales, para eso dividimos el concepto en 2 partes: números y variables:
Para los números digitados en expresiones, son enteros siempre y cuando no se digita el punto decimal y números posteriores, en caso contrario son reales.
Números Enteros Son aquellos números que no cuentan con parte decimal. Ejemplo: 0, 1, 15, 540, 1500, etc.
Números Reales Son aquellos números que poseen parte real o decimal. Ejemplo: 0.00001, 1.633, 20.3598, 1.3333333, 1.0, etc.
No obstante en la programación en C++, las variables que contendrán números son del tipo en el que son declarados ya sea real (double o float) o entero (int, long).
Variables Enteras Son aquellas variables que son declaradas como enteras.
Ejemplo: int P; long Q, R;
Variables Reales Son aquellas variables que son declaradas como tipo de dato reales. Ejemplo: float A; double B, C;
3.2.4 Partes de la división
3.2.5 División Entera vs división real
En los problemas computacionales no solo es usada la división real sino también es a menudo necesario el uso del operador de divisiones enteras.
3.2.6 Resultados de la división Los resultados de la división van a depender del tipo de dato del dividendo y/o divisor. A continuación mostraremos los resultados teniendo en cuenta el tipo de dato del dividendo y divisor:
División de Números
a) 10
÷ 5 = 2 (Símbolo de división no utilizado en C++)
b) 12 / 5 = 2 c) 15 / 4.0 = 3.75 d) 15 / 4 = 3 e) 10 / 3 = 3
f) 10.0 / 3 = 3.333333… La representación c) muestra el resultado real pues la división cuenta con un dividendo entero y un divisor real (por estar con punto decimal .0) y además tiene residuo inicial 3 (> 0)
Dónde: 15: Dividendo 4.0: Divisor 3.75: Cociente (es el resultado de la operación) 3: Residuo
La representación e) muestra el resultado entero pues se está usando operadores enteros.
Dónde: 10: Dividendo 3: Divisor 3: Cociente (es el resultado de la operación) 1: Residuo
División de Variables Supongamos que contamos con las siguientes variables:
int P, Q; double R,S;
Ahora supongamos que tienen los siguientes valores:
P=10; Q=20; R=1.5; S=2.5;
División variables enteras
a) B / A = 2 b) A / B = 0
División variables Reales
c) S / R = 1.66666… d) R / S = 0.6
División variables Enteros y Reales
e) Q / S = 8.0 f) R / P = 0.15
División de variables y números Supongamos que contamos con las variables P, Q, R, S mencionados anteriormente:
a) P / 5 = 2 b) Q / 4.0 = 5.0 c) P / 6 = 1 d) Q / 20.0 =1.000000
(*)
e) P / 0 = (Error en tiempo de ejecución) f)
R / 10 = 0.15
g) 5.0 / S = 2.0 h) 2.5 / R = 1.666666… (**)
(*): El resultado es real, en el ejemplo se muestra 1.000000 como resultado no obstante la cantidad de dígitos decimales va a depender del tipo de dato definido en C++ ya sea float o double. (Véase el apartado 3.1.1)
(**): Existen divisiones en las cuales el resultado de la división es un número con parte decimal muy extenso como .33333..., la longitud de los dígitos va a depender del tamaño del tipo de dato de la variable en la cual se va a almacenar o el formato redondeando el ultimo digito de ser necesario (Véase el apartado 3.1.1) En general para obtener los resultados esperados de acuerdo al dividendo y divisor ya sea variables o números se puede aplicar la siguiente regla:
Dividendo Entero Entero Real Real
Divisor Entero Real Entero Real
Resultado Entero Real Real Real
3.2.7 Análisis de almacenamiento de la división con resultados numéricos
Considere que las variables A, B, C y P son de tipo entero int, variables C, D E y Q de tipo double:
//Declaración de variables enteras int A, B, C, P; //Declaración de variables reales double D, E, F, Q; //Asignación a variables A=10; B=5; C=0.5;
// C almacena 1 ya que la variable C es de tipo int
D=0.5; E=1.24; F=1; // F almacena 1.000000, ya que la variable F es de tipo double
A continuación se muestran típicas operaciones en la que se almacena valores erróneos erróneos por los tipos de datos:
P=A / E; Cuidado con este tipo de operaciones. El resultado de la división es 8.06 pero P=8, por la causa de que la variable P es de tipo entero.
Q=(A+B) / 2; El resultado de la división es un entero 7 y como Q es doublé doublé Q=7.000000.
Q=(A+B) / 2.0; El resultado de la división es real 7.5 por lo tanto Q=7.500000.
3.2.8 Residuo (Modulo) En C++ el operador modulo es representado por < % >, y se utiliza para obtener el residuo o resto de una división entera, vale decir que para obtener el resto el dividendo y divisor deben ser necesariamente enteros. Ejemplos Si A=15, B=14, C=3, D=2 entonces:
a) A % 6 = 3
b) B % 2 = 0
c) 19 % C = 1
d)
7%9=7
e)
C%3=0
f)
D%5=2
g)
B%0=0
Capítulo 4 FLUJOS DE CONTROL 4.1 Estructuras condicionales 4.1.1 Expresiones booleanas 4.1.2 Estructura condicional < if > 4.1.3 Estructura condicional < if - else > 4.1.4 Estructura condicional anidada < if - else - if > 4.1.5 Estructura de selectiva múltiple < switch > 4.1.6 8 Recomendaciones para el uso de estructuras condicionales. 4.2 Estructuras repetitivas 4.2.1 Conceptos acerca de estructuras repetitivas 4.2.2 Operadores de incremento 4.2.3 inicialización de variables 4.2.4 Contadores y Acumuladores y Banderas (flag) 4.2.5 Estructura repetitiva < for > 4.2.6 Estructura repetitiva < while > 4.2.7 Estructura repetitiva < do - while > 4.2.8 Anidamiento de bucles 4.2.9 8 Recomendaciones para el uso de estructuras repetitivas
4.3 Introducción a C++ 4.3.1 Reseña histórica 4.3.2 Librerías y palabras reservadas básicas 4.3.3 Estructura de un programa en C++ 4.3.4 Creación, ejecución y depuración de un programa mediante Visual Studio .Net
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 código se va a ejecutar.
4.1.1 Expresiones Booleanas Se denomina expresión booleana a aquella expresión en la cual se va a realizar una evaluación y como resultado de dicha evaluación solo puede devolver dos posibles valores true (Verdad) o false (falso). Está compuesta generalmente por variables/valores, operadores de comparación y operadores lógicos.
Expresiones con operadores de comparación Son el tipo de expresiones más sencillas en las cuales se van a evaluar dos valores mediante un operador de comparación. Ejemplos: Si A=50, B=70, C=‟A‟, D=1 entonces:
char A == 50 B = 70 A > B
=> true => No es una expresión booleana, es una asignación a la variable B con 70 => false
C==”A”
=> Error en tiempo de codificación, las comillas dobles indica cadena
C==‟A‟
=> true
B>C
=> true, „A‟ representa el número 65 en la tabla de los códigos ASCII Véase capitulo X
A+B < B+D
=> false
D != D
=> false
D
=> true
!D
=> false (*)
(*) Nótese que < !D > retorna false, puesto que en C++ el numero 1 representa true y 0 false, aunque esto es posible no se recomienda usar los números para este propósito, en su lugar C++ cuenta con un tipo de dato especial bool. Ejemplo:
bool sw; sw = false; sw=true;
Expresiones con operadores lógicos Para este propósito utilizaremos los operadores lógicos, pero antes debemos mostrar las tablas de verdad de los principales operadores:
Tabla de verdad && (Disyunción lógica “Y”)
Operando 1 true true false false
Operador Y && && && &&
Operando 2 true false true false
Resultado true false false false
Una receta para recordar la tabla del Y: “Los operadores deben ser todos verdaderos para que el resultado sea verdadero, caso contrario es falso” Ejemplos: Considere que: A = 10, B = 20, C = 30 entonces:
A > 0 && B > 0
=> true && true = true
A < C && B==C
=> true && false = false
A==10 && B==20
=> true && true = true
B==20 && C==40
=> true && false = false
A!=15 && B==20
=> true && true = true
C==20 && A!=10
=> false && false = false
Tabla de verdad || (Conjunción lógica “O”)
Operando 1 true true false false
Operador O || || || ||
Operando 2 true false true false
Resultado true true true false
Una receta para recordar la tabla del O: “Los operadores deben ser todos falsos para que el resultado sea falso, caso contrario es verdadero”
Ejemplos: Considere que: A = 10, B = 20, C = 30 entonces:
A > 0 || B > 0
=> true || true = true
A < C || B==C
=> true || false = true
A==10 || B==20
=> true || true = true
B==20 || C==40
=> true || false = true
A!=15 || B==20
=> true || true = true
C==20 || A!=10
=> false || false = false
Tabla de verdad ! (Negación lógica “No”)
Operando 1 true false
Operador NO ! !
Resultado 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 ejecución del código del programa en función del resultado de una expresión booleana.
Sintaxis
if() { }
dónde:
Expresión booleana : Debe siempre retornar true o false. Inicio de bloque: La llave abierta que indica el inicio del cuerpo de código a ejecutarse si la expresión booleana retorna true. Bloque de Código: El compilador va a ejecutarlo siempre que la expresión booleana retorne true. Fin de bloque: La llave cerrada indica el fin del cuerpo de código a ejecutarse si la expresión booleana retorna true. Continuación del programa : Si la expresión booleana dentro de la instrucción < if > retorna false el compilador salta hacia continuación del programa.
Ejemplos:
Promedio = 10.5;
if( Promedio < 10.5 ){
Salta
flag_desaprobado = true; 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 evaluación dentro de la instrucción < if > como el promedio no es menor sino igual a 10.5 saltará hasta la instrucción:
scanf("Ingrese Nota1: %d", %n1);
En otro caso si el promedio hubiese sido: Promedio=10 se hubiese ejecutado:
flag_desaprobado = true; printf("Condicion Alumno: Repitente");
y aun también:
scanf("Ingrese Nota1: %d", %n1);
4.1.3 Estructura Condicional < if – else > Es la estructura que bifurca el flujo de ejecución del código del programa con una estructura alternativa en función del resultado de una expresión booleana.
Sintaxis
if() { }
else { } dónde:
Expresión booleana : Debe siempre retornar true o false. Inicio de bloque if: La llave abierta que indica el inicio del cuerpo de código a ejecutarse si la expresión booleana retorna true. Bloque de Código if: El compilador va a ejecutarlo siempre que la expresión booleana retorne true. Fin de bloque if: La llave cerrada indica el fin del cuerpo de código a ejecutarse si la expresión booleana retorna true. Inicio de bloque else: La llave abierta que indica el inicio del cuerpo de código a ejecutarse si la expresión booleana retorna false. Bloque de Código else : El compilador va a ejecutarlo siempre que la expresión booleana retorne false. Fin de bloque else: La llave cerrada indica el fin del cuerpo de código a ejecutarse si la expresión booleana retorna false. Continuación del programa : En este caso de estructura condicional como tiene parte alternativa este debe ejecutarse primero antes de la continuación del programa. En este tipo de estructuras solo un bloque se ejecuta: el bloque de código if o el bloque de código else, más no los dos bloques.
Ejemplos:
Promedio = 15; if( Promedio > 10.5 ) { printf("Alumno Aprobado"); } else { printf("Alumno Desaprobado"); } ….. …..
Para este ejemplo solo se ejecutara el bloque < if >, lo que no ocurriría si el Promedio=10 en ese caso se ejecutaría el bloque < else >.
La instrucción del ejemplo anterior se puede escribir de la siguiente forma:
if(Promedio > 10.5) printf("Alumno Aprobado"); else printf("Alumno Desaprobado");
O también:
if(Promedio > 10.5) printf("Alumno Aprobado"); else
printf("Alumno Desaprobado");
La razón es que en C++ son necesarias las llaves solo si un bloque tiene 2 a más instrucciones.
En C++ existe una forma adicional de condicional que simula la instrucción < if>, que no es recomendada, pero que quizás observen en algunos códigos externos, y aquí se muestra para que sea de conocimiento:
int A=11; (A==10) ? printf("A es 10") : printf("A No es 10");
Estas sentencias devolverán por pantalla: "A No es 10" .
4.1.4 Estructura Condicional anidada < if – else – if > Es la estructura con n alternativas de bifurcación del flujo de ejecución del código del programa, en función del resultado de múltiples expresiones booleanas.
Sintaxis
if(){ }else
if(){
}else …..
if(){ }
dónde:
Expresión booleana 1,2,…n : Debe siempre retornar true o false en la respectiva expresión booleana. Bloque de Código 1,2,…n: El compilador va a ejecutarlo siempre que la expresión booleana respectiva retorne true. Continuación del programa : Si la estructura anidada tiene al final un bloque < else> en ese caso debe ejecutarse primero antes de la continuación del programa. Si no tuviese un bloque < else > al final, el compilador de no encontrar ningún true en las estructuras booleana saltará a la continuación del programa. Ejemplos:
Numero = 15;
if(Numero < 0 ) { printf("Numero Negativo"); } else if(Numero == 0 ) { printf("Numero Neutro"); }else{ printf("Numero Positivo"); }
Para este ejemplo el resultado será “Numero Positivo”
La instrucción < if > del ejemplo anterior se puede escribir de la siguiente forma:
if( Numero < 0 ) printf("Numero Negativo"); else if( Numero == 0 ) printf("Numero Neutro"); else printf("Numero Positivo");
O también:
if( Numero < 0 ) printf("Numero Negativo"); else if( Numero == 0 ) printf("Numero Neutro"); else printf("Numero Positivo");
Cabe decir que para este ejemplo, la última forma mostrada es la más fácil de entender e interpretar.
Este tipo de estructura es solo una variación ampliada de la estructura . Realmente esta estructura es flexible y se va a acomodar muy bien a cualquier tipo de problemas en las cuales se evalúe varias condiciones.
4.1.5 Estructura selectiva múltiple < switch > A diferencia de la instrucción < if - else > en C++ esta estructura puede evaluar solo una variable y solo puede comparar igualdad además no permite la combinación con operadores lógicos como && (Y lógico por ejemplo), en su lugar puede combinar el || (O lógico) de forma homologa.
Sintaxis
switch () {
case : break; case : break; …..
case : break; …..
case : break; default: break; }
Dónde:
: Variable a ser evaluada . : Constante con la cual la va a evaluar igualdad, si es que no coincide pasa al siguiente . : Conjunto de instrucciones a ejecutarse si es que el respectivo retorna true. : Conjunto de instrucciones a ejecutarse si es que la variable a comparar no coincide con ninguno de los . break: Instrucción C++ para bifurcar o saltar al final de la estructura switch. De no invocar a la instrucción break si es que encuentra coincidencia seguirá evaluando los siguientes “case” de la instrucción. Ejemplos:
char sexo; printf("Ingrese sexo de persona (M, F):" ); sexo=getchar(); switch(sexo){ case 'M': printf("Masculino"); break; case 'F':
printf("Femenino"); break; default: printf("Error: Dato de ingreso No valido"); break; }
La función getchar() permite el ingreso por teclado de un carácter. Para el ejemplo anterior mostrado supongamos que se ingresó por teclado el carácter M, entonces se imprime por pantalla: Masculino. Supongamos que se ha ingresado por teclado la letra m, entonces por pantalla se mostrara: Error: Dato de ingreso No valido. La siguiente estructura switch muestra el mensaje correcto sin distinguir mayúsculas o minúsculas.
switch(sexo){ case 'M': case 'm': printf("Masculino"); break; case 'F': case 'f': printf("Femenino"); break; default: printf("Error: Dato de ingreso No valido"); break; }
4.1.6 8 Recomendaciones para el uso de estructuras condicionales. Sin lugar a dudas es posible usar las estructuras condicionales de muchas formas, a continuación mencionamos unos consejos para la elección de estructura: 1) Elija < if > cuando va a evaluar varias variables. 2) Elija < switch > cuando va a evaluar una sola variable y en casos de igualdad. 3) Evite en lo posible hacer anidamientos, solo realizarlo si es irremediable. Ejemplo: Sumar 10 a un número ingresado solo si es mayor a 10 y solo si es par.
a) Solución anidada
if( A <= 10 ) printf("Error número no es mayor a 10.\n\n" ); else if( A % 2!=0 ) printf("Error número no es par.\n\n");
else { A = A + 10; printf("A = %d\n\n", A); } system("PAUSE");
Aunque esta solución es válida, dificulta la lectura cuando se cuenta con varios niveles de anidamiento y con más instrucciones. b) Solución recomendada
if(A <= 10){ printf("Error numero no es mayor a 10.\n\n" ); system("PAUSE"); exit(0); //Función para terminar el programa } if(A % 2!=0){ printf("Error numero no es par.\n\n"); system("PAUSE"); exit(0); //Función para terminar el programa } A = A + 10; printf("A = %d\n\n", A); system("PAUSE");
La debilidad de esta forma es que se generan más líneas de código, no obstante en los problemas computacionales en algún momento va a pesar más el entendimiento que las líneas de código.
4) Para evaluaciones con tipos booleanos, usar los booleanos: Ejemplo: Decir si un numero pasa la prueba de validación. Debe ser múltiplo de 3 y la vez divisible por 18.
a) Solución pésima
bool pasa_prueba; if( A % 3 == 0 && 18 % A == 0 ) pasa_prueba=true; else pasa_prueba=false; if( pasa_prueba == true ) printf("Si pasa la prueba"); else printf("No pasa la prueba"); system("PAUSE");
No se recomienda este tipo de soluciones se sobrescribe las alternativas de los booleanos, ya que sabemos que los booleanos solo tienen dos posibles valores ( true o false)
b) Solución buena
bool pasa_prueba=false; if( A % 3 == 0 && 18 % A == 0 ) pasa_prueba=true; if( pasa_prueba == true ) printf("Si pasa la prueba"); else printf("No pasa la prueba"); system("PAUSE");
Esta solución es a menudo utilizada, inicializar como false y luego preguntar si pasa la prueba y asignar a true. c) Solución recomendada:
bool pasa_prueba; pasa_prueba = ( A % 3 == 0 && 18 % A == 0 ); if( pasa_prueba ) printf("Si pasa la prueba"); else printf("No pasa la prueba"); system("PAUSE");
Con más conocimiento técnico sabemos que una expresión booleana retorna dos valores ( true o false) entonces, no es necesario preguntar con < if > por lo tanto es válido < pasa_prueba = ( A % 3 == 0 && 18 % A == 0 ); > . Además tampoco es necesario if( pasa_prueba == true )
puesto que el código del < if > se va a ejecutar si la expresión retorna true, pero la variable pasa_prueba solo tiene ( true o false) como valor por lo tanto es válido if( pasa_prueba )
Como consejo practico use if ( < true >) para booleanos.
5 ) Use switch para estructuras grandes, para demarcar algo importante y diferenciarlo de estructuras < if >, además de lo explicado anteriormente. 6) Evite en lo posible utilizar switch para comparar muchos valores: Ejemplo Mostrar un mensaje si un carácter ingresado por teclado es una vocal minúscula.
a) Solución no recomendada
char op; op=getchar(); switch(op){ case 'a': case 'e':case 'i': case 'o':case 'u': printf("Es vocal minúscula"); break; }
b) Solución recomendada
char op; op=getchar(); if(op=='a' || op=='e' || op=='i' || op=='o' || op=='u') printf("Es vocal minúscula ");
7) Utilice sangrías. Hasta ahora no habíamos resaltado la importancia de estas, sin embargo son esenciales para la lectura del código. Tenemos fortuna de utilizar C++, pues antiguamente no contábamos con estas, asi que a sangrar código. Para hacer un sangrado es usualmente utilizada la tecla < Tab >. Ejemplo a) Sin sangría
if( A > 0 ){ if( A == 5 ) printf("Es cinco positivo"); else printf("No es cinco positivo"); } else if ( A < 0 ){ if( A == -5 ) printf("Es cinco negativo"); else printf("No es cinco negativo"); }
b) Con sangría if( A > 0 ){ if( A == 5 ) printf("Es else printf("No } else if ( A < 0 ){ if( A == -5 ) printf("Es else printf("No }
cinco positivo"); es cinco positivo");
cinco negativo"); es cinco negativo");
8) Fíjese y utilice las ayudas del editor de código de fuente como el color (azul, rojo, verde, etc.). En nuestro caso utilizamos Visual Studio .Net el cual tiene varias ayudas. Al inicio no se tome mucho tiempo pensando con coraje en una solución cuando es difícil el problema y no muestra los resultados esperados. Use marcadores y validaciones de usuario, es decir asegúrese de que la variable contiene el deseado o supuesto valor , imprimiendo la variable por pantalla antes de entrar a una estructura. Este concepto nos puede ahorrar horas de análisis d espués de todo “Un vistazo no está de más “.
4.2 Estructuras repetitivas Son estructuras en las cuales un bloque de código puede ser ejecutado un número de veces, ya sea por un número que represente la cantidad de veces o por una expresión booleana.
4.2.1 Conceptos acerca de estructuras repetitivas Bucle: Es el funcionamiento o el proceso de dar vueltas (repetir) de la estructura repetitiva.
INICIO ESTRUCTURA REPETITIVA
Bucle
FIN ESTRUCTURA REPETITIVA
Iteración: Es cada repetición del bucle. Por ejemplo si una estructura repetitiva tiene 3 repeticiones, tendrá iteración 1, Iteración 2 e Iteración 3.
4.2.2 Operadores de incremento A menudo las variables son utilizadas como controladores de bucles, para tal caso mostraremos como incrementar o decrementar una variable:
Modo ampliado
Modo Reducido
Explicación
A = A + 1;
A++;
La variable incrementa su valor en 1
A = A - 1;
A--;
La variable decrementa su valor en 1
A = A + 3;
A+=3;
La variable incrementa su valor en 3
A = A - 4;
A-=4;
La variable decrementa su valor en 4
A = A + n;
A+=n;
La variable incrementa su valor en n
A =
A - n;
A-=n;
La variable decrementa su valor en n
A = A * 5;
A*=5;
La variable multiplica su valor en 5
A = A / 6;
A/=6;
La variable divide su valor en 6
4.2.3 inicialización de variables Antes de utilizar una variable es necesario que esta tenga un valor contenido, ya sea por teclado o asignación. En estructuras repetitivas su uso muy amplio, y en aplicaciones reales son utilizadas de muchas formas. En un sentido es una asignación simple. Para tal caso mostraremos un ejemplo:
//Declaracion de variables int A; bool bandera; //inicialización de variables A=0; bandera=false;
Existe un riesgo que ocurre al no inicializar variables, estas variables pueden ser utilizadas y el compilador no mostrara error sino hasta el tiempo de ejecución y si el programa es complejo puede no detectarse rápidamente
Para el caso de estructuras repetitivas (Punto a ver a continuación) es general inicializar las variables a cero.
En términos prácticos una variable que no es ingresada por teclado y que va a usarse en una estructura repetitiva siempre debe ser inicializada.
4.2.4 Contadores y Acumuladores y Banderas (flag) Son variables que serán utilizadas en la estructura repetitiva, Algunas de ellas son inicializadas antes de la estructura repetitiva, otras dentro de ellas.
Contadores Son variables que controlan mediante conteo un aspecto del bucle, pueden se controlador de iteraciones del bucle, o contar algunos aspectos del problema a resolver por el programa. Generalmente el conteo es de a 1. Ejemplo Contador = Contador + 1
Acumuladores
Son variables que van a funcionar como recolectoras de resultados individuales, es decir de cada iteración. Su uso es para obtener un resultado general de todo el bucle y generalmente son sumatorias.
Ejemplo Acumulador = Acumulador + promedio
Banderas (Flag) Son variables que trabajan como indicadores o marcadores. Son para resolver algún aspecto de identificación dentro del programa. Su uso se extiende en las estructuras repetitivas para determinar la continuación de iteraciones. Generalmente son de tipo booleano sin embargo su uso se puede ampliar hasta el grado de usar enteros o caracteres para representar sus múltiples estados. Ejemplo
bool flag_casado=false; ……….
if(estado_civil=='C') flag_casado = true;
4.2.5 Estructura repetitiva < for > Es la estructura repetitiva de C++ para ejecutar código teniendo como datos el inicio , el fin e iteraciones a procesar. Aunque en C++ la estructura < for > es muy flexible, no es muy utilizado en sus formas complejas, para esos casos veremos más adelante estructuras que nos ayudaran en esos casos.
Sintaxis
for ( ; ; ) {//opcional, si hay más de 1 instrucción }//opcional, si hay más de 1 instrucción
: variable con dato o punto de inicio del bucle. : si retorna true continúa el bucle, caso contrario termina. : incremento o paso de variable dentro del bucle : Instrucciones a repetirse dentro del bucle
Orden de evaluación del compilador a la estructura < for > La primera vez:
for( 1 ; 2; 4 ) { 3, solo si la expresión booleana retorna true }
Las veces restantes:
for( ; 1; 3 ) { 2, solo si la expresión booleana retorna true }
Ejemplo: Mostrar los 7 primeros números naturales positivos:
final=7; for( indice = 1 ; indice <= final ; indice = indice + 1 ) printf("\n Numero: %d", indice);
Explicación del código:
Iteración
índice
expresión booleana
ejecución código
1
1
1 <= 7 = true
printf("\n Numero: %d", 1);
estado bucle 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
Termina
Notar que al final del bucle la variable índice queda con el valor final del bucle más el incremento, es decir: índice = final + incremento. La expresión booleana debe estar bien planteada de lo contrario ocurre 2 posibles eventos: -El bucle no se ejecuta ni una vez -El bucle se ejecuta indefinidamente hasta acabar los recursos o “bloquear” la computadora por completo.
El bloque de código anterior da como resultado: 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 instrucción en los problemas algorítmicos y es a menudo para abreviar conteos o para marcar posiciones.
for ( ; ; ) ;
Notar que la instrucción < for > termina en < ; > Puede ser utilizada para obtener precisamente el valor final del al finalizar el bucle. Esta no es la forma más fácil de usar < for > pues puede crear confusiones, sin embargo en aplicaciones prácticas veremos su uso. Ejemplo:
final=7; for ( indice = 1; indice <= final ; indice = indice + 1 ); printf("\n Numero: %d", indice);
El bloque de código anterior da como resultado:
Numero: 8
Trabajo con múltiples variables en la estructura repetitiva < for > La estructura < for > puede admitir el trabajo con muchas variables, para separarlas se debe usar coma < , > diferenciando claramente el < ; > que distingue la parte funcional del < for >.
Ejemplo:
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 también es posible declarar variables dentro de la estructura < for >.
for ( int indice = 1; indice <= final ; indice = indice + 1 )
Este tipo de declaraciones aunque no es tan usado solo permite usar la variable (en este caso indice) dentro de la estructura, es decir la variable no será tomada en cuenta como declarada en otros lugares del código del programa.
4.2.6 Estructura repetitiva < while > Es la estructura repetitiva para evaluar una expresión booleana y entonces ejecutar un bloque de código. A diferencia del < for > no siempre cuenta con los límites de las iteraciones (Valor inicial y valor final). Sintaxis
while () { }
: Retorna true o false. : Se ejecuta siempre que la expresión booleana retorne true.
Ejemplo:
int C, S, final; C=1; S=0; final=15 while( C <= final ){ S+=C; printf("\n%d",C); C+=2; } printf("\n\nSuma: %d",S);
El ejemplo mostrado anteriormente muestra por pantalla los 15 primeros números impares positivos y además al final muestra la suma de ellos.
Notar las inicializaciones S=0 porque va a acumular, C=1 porque es el primer número impar, final=15 es el límite superior. Para este ejemplo S es el acumulador en cada iteración acumula a la variable C.
C trabaja como el número impar de la iteración y el contador. Notar que se incrementa a la variable C de dos en dos: < C+=2; >. Notar que dentro del < while > se cuenta con una instrucción printf que imprime por pantalla a la variable C (número impar de cada iteración) con un salto de línea, y al finalizar el bucle imprime la suma con dos saltos de línea < printf("\n\nSuma: %d",S); >.
Detalle Trabajo de la Estructura Repetitiva:
Iteración
final
S
C
C <= final
Estado Bucle
15
0
1
1
15
1
3
3 <= 15 = true
Continua
2
15
4
5
5 <= 15 = true
Continua
3
15
9
7
7 <= 15 = true
Continua
4
15
16
9
9 <= 15 = true
Continua
5
15
25
11
11 <= 15 = true
Continua
6
15
36
13
13 <= 15 = true
Continua
7
15
49
15
15 < = 15 = true
Continua
8
15
64
17
17 < = 15 = false
Termina
El resultado es:
1 3 5 7 9 11 13 15
Suma: 64
4.2.7 Estructura repetitiva < do - while > Es la estructura repetitiva para ejecutar un bloque de código por lo menos una vez, y evaluar una expresión booleana.
Sintaxis
do{ } while ();
(): Retorna true o false. : Se ejecuta al menos una vez antes de que se evalué la expresión booleana, para que se repita dicha expresión debe retornar true.
Ejemplo: Ingresar una secuencia de números, mostrar por pantalla los números ingresados y su suma, hasta que el usuario decida no ingresar más números.
char op; int N, S; S=0; do{ printf("\nIngrese numero: "); scanf("%d", &N); fflush(stdin); S+=N; printf("\n\nNumero ingresado: %d", N); printf("\n\n\nDesea seguir ingresando numeros?(S/N): " ); op=getchar(); } while( op!='N' && op!='n' ); printf("\n\nSuma: %d",S);
Notar las inicializaciones < S=0; > porque va a acumular, N es el número ingresado en la iteración respectiva, < op > es la variable con la opción de seguir ingresando más números. En este ejemplo se ingresa N mediante < scanf("%d", &N); >, se acumula < S+=N; > y se muestra dicho valor ingresado. Se imprime por pantalla el mensaje de solicitud para seguir ingresando números. Luego se ingresa el carácter por teclado mediante getchar() y se guarda en la variable op Entonces llega a la expresión booleana de la estructura repetitiva, la cual va a repetir siempre que el usuario no digite la tecla N o n. Al final se muestra la suma de los números ingresados < printf("\n\nSuma: %d",S); >.
Detalle Trabajo de la Estructura Repetitiva:
Iteración
N
S
op
op!='N' && op!='n'
Estado Bucle
0
1
5
5
S
'S'!='N' && 'S'!='n' = true
Continua
2
1
6
S
'S'!='N' && 'S'!='n' = true
Continua
3
9
15
S
'S'!='N' && 'S'!='n' = true
Continua
4
7
22
S
'S'!='N' && 'S'!='n' = true
Continua
5
50
72
N
'N'!='N' && 'N'!='n' = false
Termina
< N > es un valor ingresado por teclado, es decir pueden ser cualquier número. < op > es un carácter ingresado por teclado, para el ejemplo el usuario afirmo ingresar 4 números pero, como se usa la estructura < do- while > se ejecuta la primera vez sin evaluar.
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, también es posible anidar estructuras repetitivas, ya que en realidad no hay regla que lo impida. Por tanto veremos el anidamiento mediante este un ejemplo. Ejemplo: Se pide generar la tabla de multiplicar de un número ingresado por teclado. Se debe solicitar la finalización del programa.
char op; int N; do{ printf("\nIngrese numero: "); scanf("%d", &N); for(int i=0;i<=12;i++) printf("\n %d * %d = %d", N, i, N * i );
fflush(stdin);
printf("\n\n\nDesea continuar?(S/N): "); op=getchar(); } while( op!='N' && op!='n' ); system("PAUSE");
Como se muestra en este ejemplo existe una estructura repetitiva < do – while > y dentro de ella una estructura repetitiva < for >. Sin embargo puede haber varios niveles de anidamiento de acuerdo a la complejidad del problema.
4.2.9 8 Recomendaciones para el uso de estructuras repetitivas
1) Cuando se conozcan los límites a iterar use la estructura < for >.
2) Cuando al menos necesite ejecutar una vez la estructura repetitiva use < do – while>. 3) Cuando necesite salir de un bucle antes de ejecutar todas las iteraciones utilice la instrucción
break.
Ejemplo:
int N=5; for(int i=1;i<=12;i++){ if (i==5)break; printf("\n %d * %d = %d", N, i, N * i ); }
Este ejemplo muestra la tabla de multiplicar del número N desde 1 hasta 4, puesto que cuando llega a 5 está la instrucción break, por lo tanto termina la instrucción < for >.
4) Evite anidamientos de estructuras condicionales. Si necesita validaciones dentro de la estructura utilice la instrucción continue. Ejemplo:
a) No recomendado
int N=5; for(int i=1;i<=12;i++){ if (i==5) printf("\n %d * %d = %d" , N, i, N * i ); }
b) Recomendado
int N=5; for(int i=1;i<=12;i++){
if (i!=5)continue; printf("\n %d * %d = %d", N, i, N * i ); }
Este ejemplo muestra la tabla de multiplicar del número , pero si el indice es distinto a 5 itera nuevamente por la instrucción continue, solo cuando llega a 5 muestra por pantalla el resultado.
5) Minimice el uso de constantes. En los bucles como en la mayoría de casos es de usarse variables por más estática que parezca, ya cada vez más nos damos cuenta que no existen las constantes sino las variables muy variables y las variables que son muy lentamente variables o las variables lejanamente variables ya que en el futuro seguramente será modificado su valor.
Ejemplo
a) No recomendado
for(i=1;i<=12;i++) S+= precio * 0.18;
b) Recomendado
IGV=0.18; NroMeses=12; for(i=1;i<=NroMeses;i++)
S+= precio * IGV;
La forma no recomendada parece correcta, pero si pensamos bien el porcentaje 0.18 representa el IGV y aunque por años se mantiene esa tasa, en algún momento de seguro su valor cambiara a 0.19, 0.17 u otro. Respecto a NroMeses=12, fácilmente se puede pensar que ese valor no va a cambiar, mas la lectura puede volverse menos tediosa cuando dejamos de ver el código del programa por algún tiempo y cuando volvamos a ver sabremos rápidamente que ese 12 que hubiesemos dejado representa los números de meses del año. Es solo un ejemplo de las variables que parecen constantes.
6) Analice que variables se inicializan fuera y dentro del bucle. Como consejo practico se inicializa afuera del bucle respectivo (por que puede haber anidamientos) las variables que van a retener un valor global acumulado respecto al bucle. Las variables que van a retener datos de la iteración se deben inicializar dentro del bucle respectivo.
7) Use estructuras condicionales para asegurarse que las variables de la iteración son las correctas e imprímalas. Ejemplo
Supongamos que se desea sumar todos los múltiplos de 7 entre 7 y 100000.
int S=0; for( int i=7;i<=100000; i+=7 ){ S+=i; }
Ahora supongamos un caso particular, que necesitamos saber si el número 97930 también se está sumando, entonces podríamos añadir:
int S=0; for( int i=7;i<=100000; i+=7 ){ S+=i; if (i==97930) printf("\n Si esta sumando!"); }
Si se muestra el mensaje en pantalla sabremos que ese número está siendo sumado. No obstante este ejemplo es solo una suposición, ya que sabemos que 97930 es múltiplo de 7. Pues también podemos averiguarlo con 97930 % 7, como el resultado del módulo es cero decimos que si es múltiplo de 7.
8) Cuídese de los bucles sin fin. Cuando en un bucle la expresión booleana que la controla nunca retorna false entonces habremos caído en un bucle infinito. Un poco de práctica nos será necesario para no preocuparnos por estas.
Ejemplo Este es una terrible forma de definir bucles:
int S=0; while(S%2==0){ printf("\n%d", S); S+=2; }
Este ejemplo muestra claramente que no puede ser variado la condición de la variable S dentro del código como numero par, por lo tanto no tiene un adecuado fin el programa, porque se va a ejecutar hasta que se acaben los recursos o porque se forzó a cerrarse.
4.3 Introducción a C++
4.3.1 Reseña histórica C++ tiene sus orígenes en la década de los 70 y en ese entonces fue creado como C y su función fue para mantener el sistema operativo UNIX y su creador fue Bjarne Stroustrup de la compañía AT&T. Previamente hubo lenguajes: BCPL -> B -> C -> C++, pero no fue contundente como lo es hoy C++, C comparte muchas características de C++ pero C++ hoy es más popular por su manejo mejorado de memoria, funcionalidades además de contar con programación orientada a objetos.
4.3.2 Directivas y palabras reservadas básicas. El lenguaje C++ utiliza directivas o archivos de cabecera que proporciona información necesaria útil para el programa. Para importar un archivo de cabecera se utiliza #include
iostream es el nombre de la biblioteca que contiene las definiciones de las rutinas que manejan las entradas del teclado y el despliegue en la pantalla. El espacio de nombres std ordena al compilador utilizar el espacio de nombres de std. Un programa básico debe tener escrito al inicio del programa:
#include using namespace std;
fflush(stdin) Es la función de C++ que va a eliminar los caracteres sobrantes en una entrada, el no utilizarla provocará errores de entrada de múltiples variables. Se suele llamar a esta instrucción inmediatamente luego de usar una instrucción scanf. gets() Funcion para ingresar una cadena de caracteres. system("PAUSE") Es el comando de C++ para detener la ejecución hasta que se presione la tecla < Enter >. system("CLS") Es el comando de C++ para borrar la pantalla de ejecución.
exit(0) Termina inmediatamente el programa.
getchar() La función que permite el ingreso por teclado de un carácter. break Permite salir o terminar a una estructura (Condicional o repetitiva por ejemplo). continue Permite continuar o iterar a una estructura repetitiva. goto Permite saltar o bifurcar el flujo del programa hacia una etiqueta.
Comentarios en C++ En C++ existen dos tipos de comentarios: Para comentar una sola línea de código
//Comentario de una sola línea de código
Para comentar varias líneas de código
/* Comentario de varias líneas de código */
4.3.3 Estructura de un programa en C++ Un programa en C++ se compone de directivas con archivos de cabecera, la función principal main, declaración de variables e instrucciones validas de C++, a continuación se muestra un ejemplo sencillo completo de un programa que envía por pantalla un mensaje “HOLA MUNDO”.
//Archivos de encabezado #include using namespace std; //Inicio de función principal void main(){
//Instrucciones //Instruccione s C++ printf("\nHOLA printf("\nHOLA MUNDO\n"); MUNDO\n" ); system("PAUSE" system("PAUSE"); ); }
4.3.4 Creación, ejecución y depuración de un programa mediante Visual Studio .Net Creación
Para crear un programa en C++, utilizaremos Visual Studio .Net
Ingresamos al menú Archivo – Archivo – Nuevo – Nuevo – Proyecto
En el árbol de la izquierda, seleccionar Visual C++ En el panel central seleccionar Proyecto Vacío. En la parte inferior escribir el nombre del proyecto. Finalmente Click en Aceptar
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). C++.cpp). En la parte inferior escribir el nombre del archivo. Click en Agregar.
Finalmente tendremos una pantalla con un editor de código fuente en el cual introduciremos nuestro código C++.
Ejecución Ahora ejecutaremos ejecutaremos el el siguiente programa con con la tecla tecla < F5 > o en en el botón botón verde con símbolo de de play de la barra de menú:
Se mostrara la ventana de ejecución:
Depuración Es el seguimiento y visualización del código de un programa mientras se ejecuta. En el menú depurar se cuenta con algunas opciones de depuración:
Además se puede iniciar la depuración en un punto escogido por el desarrollador haciendo click, y luego ejecutando:
Al pasar el mouse por encima de alguna instrucción de C++ muestra un pequeño mensaje.
También se puede seleccionar variable para una inspección rápida.
Desplazarse en el código con los botones de depuración.
Detener la ejecución o depuración presionamos el botón stop.
Capítulo 5 EJERCICIOS DE AUTOEVALUACION 5.1 Estructuras Simples 5.2 Estructura condicional < if - else > 5.3 Estructura de selectiva múltiple < switch > 5.4 Estructura repetitiva < for > 5.5 Estructura repetitiva < while > y < do - while > 5.6 Anidamiento de bucles
5.1 Estructuras Simples /**********************Inicio del Programa*************************** Ejercicio 01: Ingrese por teclado un número, calcular y mostrar: -El doble del número ingresado -La 3ra. parte del número ingresado. -El cubo del número ingresado. *********************************************************************/ #include 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 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 centímetros, pulgadas (2.54 cm) y a pies (12 pulgadas) *********************************************************************/ #include using namespace std; void main(){ double centimetro=100, pulgada=2.54, pie=12 ; double metros, centimetros, pulgadas, pies; printf("\nIngrese cantidad en metros: " ); scanf("%lf", &metros); fflush(stdin); centimetros = metros * centimetro; pulgadas = centimetros / pulgada; pies = pulgadas / pie; printf("\n\n Centimetros: %8.3lf" , centimetros); printf("\n Pulgadas: %8.3lf", pulgadas); printf("\n Pies: %8.3lf", pies); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/**********************Inicio del Programa*************************** Ejercicio 04: Ingrese por teclado la descripción, precio y cantidad vendida de un producto, calcular y mostrar: -Importe de la compra -Impuesto general a las ventas (18%) -Importe Final
*********************************************************************/ #include using namespace std; void main(){ char descripcion[50]; double precio, importe_compra, igv=0.18, impuestos, importe_final; int cantidad; printf("\nIngrese descripcion producto: " ); gets(descripcion); fflush(stdin); printf("\nIngrese precio: "); scanf("%lf", &precio); fflush(stdin); printf("\nIngrese cantidad vendida: " ); scanf("%d", &cantidad); fflush(stdin); importe_compra = precio * cantidad; impuestos = importe_compra * igv; importe_final = importe_compra + impuestos; printf("\n\n Importe Compra: %8.2lf" , importe_compra); printf("\n Impuesto General a las Ventas: %8.2lf", impuestos); printf("\n Importe Final: %8.2lf" , importe_final); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/**********************Inicio del Programa*************************** Ejercicio 05: Ingrese por teclado un número de 3 cifras, calcular y mostrar: - Suma de las cifras - EL número ingresado en sentido inverso *********************************************************************/ #include 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 número de alumnos matriculados en un colegio, calcular y mostrar: Cantidad de aulas completas Cantidad de alumnos que faltan para completar la última aula. Nota: Un aula completa es de 40 alumnos. *********************************************************************/ #include using namespace std; void main(){ int nro_alu, aulac, alufal, aula=40; printf("\nIngrese un numero de alumnos matriculados: " ); scanf("%d", &nro_alu); fflush(stdin); aulac = alufal =
nro_alu / aula; aula - (nro_alu % aula);
printf("\n\n Aulas completas: %d" , aulac); printf("\n\n Alumnos que faltan para completar la ultima aula: %d" , alufal); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/**********************Inicio del Programa*************************** Ejercicio 07: Se tiene n segundos, calcular y mostrar: Cantidad de horas Cantidad de minutos Cantidad de segundos restantes *********************************************************************/ #include using namespace std; void main(){
int seg, hor, min, seg_res, segxhor=3600, segxmin=60; printf("\nIngrese numero de segundos: " ); scanf("%d", &seg); fflush(stdin); hor = min = seg_res
seg / segxhor; (seg % segxhor) / segxmin; = ((seg % segxhor) % segxmin);
printf("\n\n Horas: %d", hor); printf("\n\n Minutos: %d", min); printf("\n\n Segundos restantes: %d" , seg_res); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/**********************Inicio del Programa*************************** Ejercicio 08: Ingrese por teclado el sueldo de un empleado, visualizar la mejor forma de distribución, si para eso contamos con: -Billetes de 100, 50, 20, 10 -Monedas de 5, 2, 1, 0.50, 0.20, 0.10 *********************************************************************/ #include using namespace std; void main(){ double sueldo_real, centavos_real; int sueldo, B100, B50, B20, B10, M5, M2, M1, centavos, M05, M02, M01; printf("\nIngrese sueldo: "); scanf("%lf", &sueldo_real); fflush(stdin); sueldo = sueldo_real; B100 B50 B20 B10 M5 M2 M1
=
sueldo = = =
/100; (sueldo % 100) / 50; ((sueldo % 100) % 50) / 20; (((sueldo % 100) % 50) % 20) / 10;
= = =
((((sueldo % 100) % 50) % 20) % 10) / 5; (((((sueldo % 100) % 50) % 20) % 10) % 5) / 2; (((((sueldo % 100) % 50) % 20) % 10) % 5) % 2 ;
centavos_real = sueldo_real - sueldo; centavos = centavos_real * 10; printf("\n\nCentavos:%d", centavos); M05 M02
= =
centavos / 5; (centavos % 5) / 2;
M01 printf("\n\n printf("\n\n printf("\n\n printf("\n\n
= Numero Numero Numero Numero
(centavos % 5) % 2; Billetes Billetes Billetes Billetes
de de de de
100: %d" , B100); 50: %d" , B50); 20: %d" , B20); 10: %d" , B10);
printf("\n\n Numero Monedas de 5: %d" , M5); printf("\n\n Numero Monedas de 2: %d" , M2); printf("\n\n Numero Monedas de 1: %d" , M1); printf("\n\n Numero Monedas de 0.50: %d" , M05); printf("\n\n Numero Monedas de 0.20: %d" , M02); printf("\n\n Numero Monedas de 0.10: %d" , M01); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/**********************Inicio del Programa*************************** Ejercicio 09: Ingrese por teclado el nombre y 2 fechas (día, mes año) una la fecha actual y otra la fecha de nacimiento de la persona, calcule y muestre la edad exacta de dicha persona. *********************************************************************/ #include 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 días tdfa=(aa*anio)+(ma*mes)+da; tdfn=(an*anio)+(mn*mes)+dn; //Restamos los días tdv=tdfa-tdfn; //Pasamos a formato año, mes y día av=tdv/anio; mv=(tdv%anio)/mes; dv=(tdv%anio)%mes; printf("\n\n\%s tienes %d Ano(s) con %d Mes(es) y %d Dia(s) " , nombre, av, mv, dv ); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/**********************Inicio del Programa*************************** Ejercicio 10: Ingrese por teclado dos números, realice un intercambio interno de valores entre variables. *********************************************************************/ #include 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 número y muestre un mensaje "es cero", solo cuando esto ocurra. *********************************************************************/ #include 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 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 bonificación de 4% del sueldo basico, mostrar la bonificacion y el sueldo final. *********************************************************************/ #include 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 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 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 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 using namespace std; void main(){ int a, b, c, mayor, menor, medio; printf("\n\rIngrese 1er #: ");scanf("%d",&a); fflush(stdin); printf("\n\rIngrese 2do #: ");scanf("%d",&b); fflush(stdin); printf("\n\rIngrese 3er #: ");scanf("%d",&c); fflush(stdin); mayor = a; if(b > mayor)mayor = b; if(c > mayor)mayor = c; menor = a; if(b < menor)menor = b; if(c < menor)menor = c; medio = ( a + b + c ) - ( mayor + menor ); printf("\n\n\rEl mayor es: %d", mayor); printf("\n\rEl que se situa en el medio es: %d" , medio);
printf("\n\rEl menor es: %d", menor); printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 08: Realizar la siguiente funcion: |X , |X + 5, Z => |1 / X, |5X -4, |X3 ,
1<=X<=5 5< X <=25 25< X <=50 50< X <=90 X >90
*********************************************************************/ #include 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 using namespace std; void main(){ int nro, U, D, C, M; bool bandera=false; printf("\n\rIngrese numero a evaluar: " ); scanf("%d",&nro); fflush(stdin); //No es necesario validar que sea positivo, //puesto que esta implicito en las evaluaciones if( nro>=10 && D = nro U = nro bandera }
nro <=99 ) { / 10; % 10; = D > U;
if( nro>=1000 && nro <=9999 ){ M = nro / 1000; C = (nro % 1000) / 100; D = ((nro % 1000) % 100) / 10; U = nro % 10; bandera = (M + C + D + U) > M && (M + C + D + U) > U; } if(bandera) printf("\n\nSi cumple las condiciones\n\n"); else printf("\n\nNo cumple las condiciones\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 10: Ingrese un numero por teclado, diga si es par o impar *********************************************************************/ #include 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 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 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 using namespace std; void main(){ double double double double
PI=3.14159, radio, area; diametro,largo,ancho; precio_redonda, preciounit_redonda; precio_rectangular, preciounit_rectangular;
printf("\n\nPizza redonda\n\n"); printf("Ingrese diametro(en pulgadas) de una pizza redonda:" ); scanf("%lf", &diametro); fflush(stdin); printf("Ingrese precio de una pizza redonda $/ :" ); scanf("%lf", &precio_redonda); fflush(stdin); printf("\n\nPizza rectangular\n\n"); printf("Ingrese largo(en pulgadas) de una pizza rectangular :" ); scanf("%lf", &largo); fflush(stdin); printf("Ingrese ancho(en pulgadas) de una pizza rectangular :" ); scanf("%lf", &ancho); fflush(stdin); printf("Ingrese precio de pizza rectangular $/ :" ); scanf("%lf", &precio_rectangular); fflush(stdin); area = largo * ancho; preciounit_rectangular = precio_rectangular / area; radio = diametro / 2.0; area=PI*radio*radio; preciounit_redonda=precio_redonda / area; printf("\n\nPrecio pizza rendonda: $ %8.2lf" , precio_redonda); printf("\n\rPrecio pizza por pulgada cuadrada: $ %8.2lf" , preciounit_redonda); printf("\n\nPrecio pizza rectangular: $ %8.2lf" , precio_rectangular); printf("\n\rPrecio pizza por pulgada cuadrada: $ %8.2lf" , preciounit_rectangular);
if(preciounit_redonda
5.3 Estructura de selectiva múltiple < switch >
/********************************************************************* Ejercicio 01: Se pide ingresar un número del uno al veinte, imprima dicho número en letras. *********************************************************************/ #include using namespace std; void main(){ int n; printf("\n\rIngrese #(1-20) : "); scanf("%d",&n); printf("\n\n\r"); switch(n){ case case case case case case case case case case case case case case case case case case case case }
1: printf("Uno");break; 2: printf("Dos");break; 3: printf("Tres");break; 4: printf("Cuatro");break; 5: printf("Cinco");break; 6: printf("Seis");break; 7: printf("Siete");break; 8: printf("Ocho");break; 9: printf("Nueve");break; 10:printf("Diez");break; 11:printf("Once");break; 12:printf("Doce");break; 13:printf("Trece");break; 14:printf("Catorce");break; 15:printf("Quince");break; 16:printf("Diez y Seis");break; 17:printf("Diez y siete");break; 18:printf("Diez y ocho");break; 19:printf("Diez y nueve");break; 20:printf("Veinte");break;
printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 02: Realizar un algoritmo que lea un numero que represente el día de semana. Muestre el numero en dias: (Lunes=1, Martes=2, …, Domingo=7).
*********************************************************************/ #include using namespace std; void main(){ int n; printf("\n\rIngrese numero de dia de semana #(1-7) : " ); scanf("%d",&n); printf("\n\n\r"); switch(n){ case 1: printf("Lunes");break; case 2: printf("Martes");break; case 3: printf("Miercoles");break; case 4: printf("Jueves");break; case 5: printf("Viernes");break; case 6: printf("Sabado");break; case 7: printf("Domingo");break; default: printf("Numero de dia No reconodido" );break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 03: Escribir un algoritmo que solicite el ingreso de dos números y a continuación un operador aritmético (+, -, *, /). El algoritmo debe calcular el resultado de la operación seleccionada. *********************************************************************/ #include using namespace std; void main(){ char ope; double n1, n2; printf("\n\rIngrese numero 1 : "); scanf("%lf",&n1); fflush(stdin); printf("\n\rIngrese numero 2 : "); scanf("%lf",&n2); fflush(stdin); printf("\n\rIngrese Operacion (+,-,*,/) : "); ope=getchar(); fflush(stdin); printf("\n\n\rResultado:"); switch(ope){ case '+': case '-': case '*': case '/':
printf("%8.2lf", printf("%8.2lf", printf("%8.2lf", printf("%8.2lf",
n1 n1 n1 n1
+ * /
n2);break; n2);break; n2);break; n2);break;
default: printf("Operacion ingresada No reconodido" );break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 04: Escribir un algoritmo que solicite el ingreso de dos números y a continuación un operador aritmético (+, -, *, /). El algoritmo debe calcular el resultado de la operación seleccionada. *********************************************************************/ #include using namespace std; void main(){ char ope; double n1, n2; printf("\n\rIngrese numero 1 : "); scanf("%lf",&n1); fflush(stdin); printf("\n\rIngrese numero 2 : "); scanf("%lf",&n2); fflush(stdin); printf("\n\rIngrese Operacion (+,-,*,/) : "); ope=getchar(); fflush(stdin); printf("\n\n\rResultado:" ); switch(ope && ope){ case '+': case '-': case '*': case '/':
printf("%8.2lf", printf("%8.2lf", printf("%8.2lf", printf("%8.2lf",
n1 n1 n1 n1
+ * /
n2);break; n2);break; n2);break; n2);break;
default: printf("Operacion ingresada No reconodido" );break; } printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
5.4 Estructura repetitiva < for >
/********************************************************************* Ejercicio 01: Mostrar el doble, triple y el cuadrado de todos los numeros que se encuentran entre el 10 y 30. *********************************************************************/ #include using namespace std; void main(){ int ini = 10, fin = 30, i; for(i=ini;i<=fin;i++) printf("\n\rNumero %d, i, i * 2, i * 3, i * i);
doble %d, triple %d y su cuadrado %d." ,
printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 02: Visualice la palabra "ALGORITMO" 200 veces. *********************************************************************/ #include 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 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 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 using namespace std; void main(){ int S, i, n1, n2, ini, fin; printf("\n\rIngrese numero 1: "); scanf("%d",&n1); printf("\n\rIngrese numero 2: "); scanf("%d",&n2); if(n1>n2){ ini fin }else{ ini fin }
= n2; = n1; = n1; = n2;
S=0; for( i = ini + 1 ; i < fin ; i++ ){ S+=i; printf("\n\r %d", i); } printf("\n\n La Suma es %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 06: Ingrese por teclado dos notas y el nombre de N alumnos, mostrar el promedio, condicion (Aprobado, Desaprobado) y promedio global. *********************************************************************/ #include 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 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 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 using namespace std; void main(){ int i, N, nro, digito, S; printf("\n\rIngrese numero : "); scanf("%d",&N); fflush(stdin); S=0; for(nro=N ; nro > 0 ; nro/= 10){ digito = nro % 10; S+=digito; } printf("\n\nSuma digitos: %d\n\n", S); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 10: Ingrese por teclados los N terminos. Sume y genére las siguientes secuencias: a) b) c) d) e) f)
-2 -4 -6 -8 -10...N 3.3 4.4 5.5 6.6 7.7 8.8...N 1 4 9 16 25 36...N -1 +2 -3 +4 -5 +6 -7...N -1 3 15 35 63 99...N 1 2 4 7 11 16...N
*********************************************************************/ #include 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 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 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 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 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 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 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 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 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 using namespace std; void main(){ int N, cp, ci, c7, ct; cp=ci=c7=ct=0; do{ printf("\n\rIngrese numero : "); scanf("%d",&N); fflush(stdin); if(N!=0){ if(N%2==0) cp++; else ci++; if(N%7==0)c7++; } ct++; }while( N != 0 );
printf("\n\r printf("\n\r printf("\n\r printf("\n\r
Cantidad Pares : %ld" , cp); Cantidad ImPares : %ld" , ci); Cantidad Multiplos 7 : %ld" , c7); Total Numeros Ingresados: %ld" , ct);
printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/********************************************************************* Ejercicio 09: Se pide sumar y generar la serie fibonacci. 1 1 2 3 5 8 13 21 ...N *********************************************************************/ #include 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
/********************************************************************* 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 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 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 using namespace std; void main(){ int i100, i50, i10, final100, final50, final10, B100=100, B50=50, B10=10; int Monto=1000, sobra=0, combinacion; final100 final50 final10
=
Monto / B100; = Monto / B50; = Monto / B10;
combinacion=0; for(i100=1;i100<=final100;i100++) for(i50=1;i50<=final50;i50++) for(i10=1;i10<=final10;i10++){ if( !((i100*B100 + i50*B50 + i10*B10) == (Monto - sobra)) ) continue; combinacion++; printf("\n\rCombinacion: %d\tB100: %d combinacion, i100, i50, i10);
B50: %d B10: %d" ,
} //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 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 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 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 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 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 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 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 using namespace std; void main(){ int n,u,d,c,m, i; char r; do{ printf("\n\n\rIngrese Numero(1-3999)..."; scanf("%d",&n); fflush(stdin); m=n/1000; c=(n%1000)/100; d=((n%1000)%100)/10; u=n%10; printf("\n\n\t\t"; for(i=1;i<=m;i++) printf("M"); if(c==9) printf("CM"); else for(i=1;i<=c;i++) printf("C"); if(d==9) printf("XC"); else for(i=1;i<=d;i++) printf("X"); switch(u){ case case case case case case case case case
1:printf("I");break; 2:printf("II");break; 3:printf("III");break; 4:printf("IV");break; 5:printf("V");break; 6:printf("VI");break; 7:printf("VII");break; 8:printf("VIII");break; 9:printf("IX");break;
} printf("\n\nDesea Continuar S/N r=getchar(); }while(r=='s'|| r=='S');
";
printf("\n\n"); system("PAUSE"); } /***************************Fin del Programa****************************/
/**********************Inicio del Programa*************************** Ejercicio 09: Caja de Prestamos a Plazos con descuentos Se pide ingresar por teclado el monto, tasa de interes y duracion de un prestamo a asignar a un cliente. Debe mostrar el monto a entregar, ademas dar la opcion si desea entregar exactamente el monto solicitado. Debera mostrar las cuotas a pagar por meses. *********************************************************************/ #include 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****************************/
Capítulo 6 Funciones Predefinidas de C++ 6.1 Concepto de Función 6.2 Funciones Aritméticas 6.3 Funciones trigonométricas 6.4 Funciones de caracteres 6.5 Funciones de Cadena 6.6 Generador de números aleatorios 6.7 De Control de pantalla
6
Funciones Predefinidas de C++
Introducción Los desarrolladores en C++, hacen sus programas teniendo siempre en mente escribir lo menos posible reutilizando bloques de código, dividiendo mentalmente las partes del programa (entrada proceso – salida) como divisiones principales. Además hay procesos cotidianos en los programas que a menudo no vale la pena escribirlos reiteradamente, En eso C++ nos facilita la labor pues cuenta con funciones predefinidas de diferentes tipos y para cada tipo de situaciones. No obstante antes de mostrar las funciones predefinidas mostraremos el concepto de función para ingresar con más visión a las funciones.
6.1 Concepto de Función Una función es un conjunto de instrucciones con una tarea determinada, una función es utilizada para dividir un programa en subprogramas con tareas propias de la función. Una función siempre devuelve valor. Para ver definición de funciones Véase capítulo 7.
6.2 Funciones Aritméticas
Función
sqrt
Descripción
Raíz cuadrada
Tipo Dato Argumento double float long double
pow (*)
Potencias
Tipo Dato devuelto double float long double
float
float
long double
long double
Ejemplo
Valor devuelto ejemplo
sqrt(4.0) sqrt(4.0) sqrt(4) pow(2.0, 3.0) pow(2.0, 3) pow(2.0, 3.0) pow(2.0, 3)
2.0 2.0 2
pow(20.0, 3)
8000.0
Librería (**) math.h
8.0 8.0 8.0 8.0
math.h
abs
ceil
floor
exp
log
log10
Valor Absoluto
Techo(redondeo arriba)
double
double
float
float
int
int
long
long
long double
long double
double
double
float
float
long double
long double
double
double
float
float
Piso(redondeo abajo)
Exponencial
Logaritmo natural(ln)
Logaritmo base 10 (ln)
long double
long double
double float long double double float long double double float long double
double float long double double float long double double float long double
abs(-7.0) abs(7.0) abs(-7.0) abs(7.0) abs(-7) abs(7) abs(-70000) abs(70000) abs(70000.0) abs(70000.0) ceil(3.2) ceil(3.9) ceil(3.2) ceil(3.9) ceil(30000.2 ) ceil(30000.9 ) floor(3.2) floor (3.9) floor (3.2) floor (3.9) floor (30000.2) floor (30000.9) exp(1.0) exp(1.0)
7 7 7 7 7 7 70000 70000
2.7 2.7
exp(10.0)
22026.5
log(5.0) log(5.0)
1.6 1.6
log(1000.0)
6.9
log10(10.0) log10(10.0) log10(1000.0 )
1.0 1.0
70000.0 70000.0 4.0 4.0 4.0 4.0
math.h
stdlib.h
math.h
30001.0 30001.0 3.0 3.0 3.0 3.0
math.h
30000.0 30000.0
math.h
math.h
math.h
3.0
(*) Para la función pow y otras, solo basta con asignar a una variable de tipo del valor devuelto de la función o mostrar por pantalla con el formato, por ejemplo: Guardando el valor en variable:
double base=2.0, exponente=3.0, resultado;
resultado=pow(base, exponente); printf("\n\nResultado: %8.1lf " , resultado);
o mostrar directamente por pantalla:
double base=2.0, exponente=3.0; printf("\n\nResultado: %8.1lf " , pow(base, exponente));
6.3 Funciones trigonométricas
Función
cos
acos
sin
Descripción
Coseno
Arco Coseno
Seno
asin
Arco Seno
tan
Tangente
atan
Arco Tangente
cosh
Coseno Hiperbólico
tanh
Tangente Hiperbólico
Tipo Dato Argumento double float long double double float long double double float long double double float long double double float long double double float long double double float long double double float long double
Tipo Dato devuelto double float long double float long double double float long double double float long double double float long double double float long double double float long double double float long double
Ejemplo(*) cos(0.0) cos(0.0) cos(1000.0) acos(1.0) acos(1.0) acos(0.5) sin(0.5) sin(0.5) sin(10.0) asin(0.8) asin(0.8) asin(1.0) tan(1.0) tan(1.0) tan(100.0) atan(0.8) atan(0.8) atan(100.0) cosh(1.0) cosh(1.0) cosh(10.0) tanh(1.0) tanh(1.0) tanh(0.5)
Valor devuelto ejemplo 1.0 1.0 0.6 0.0 0.0 1.0 0.5 0.5 -0.5 0.9 0.9 1.6 1.6 1.6 -0.6 0.7 0.7 1.6 1.5 1.5 11013.2 0.8 0.8 0.5
Librería (**) math.h
math.h math.h
math.h
math.h
math.h
math.h
math.h
(*) Notar que en los ejemplos se asignan como parámetros constantes de tipo real, pues todos aceptan reales ya sea double , float o long double , no obstante también es posible asignar variables con el tipo solicitado en la función.
6.4 Funciones de caracteres Muchas de las funciones predefinidas toman como base la tabla de códigos ascii. Para hacer comparaciones, conversiones y búsquedas generalmente es trabajado mediante el número de código de cada carácter. A continuación mostramos la tabla de código ascii con los caracteres imprimibles.
Tabla de códigos ascii Imprimibles
Código
Carácter
(*)32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7
Código
Carácter
Código
Carácter
Código
Carácter
56
8 9 : ; < = > ? @ A B C D E F G H I J K L M N O
80
P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g
104
h i j k l m n o p q r s t u v w x y z { | } ~
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
81 82 83 84 85 86 87 88 89 90 91 92 93 94 (*)95 96 97 98 99 100 101 102 103
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
La tabla muestra los caracteres imprimibles por pantalla incluyendo el carácter con código número 32 que representa el espacio en blanco y el carácter número 95 es la línea inferior.
Funciones de caracteres
Función
isalnum
isalpha
isdigit
ispunct
isspace
iscntrl (*)
islower
Descripción Devuelve true si su argumento satisface isalpha o isdigit. Caso contrario devuelve false. Devuelve true si su argumento es letra (Mayúscula o Minúscula). Caso contrario devuelve false. Devuelve true si su argumento es un digito. Caso contrario devuelve false. Devuelve true si su argumento es un carácter imprimible que no satisface isalnum y no es espacio en blanco (Caracteres de puntuación). Caso contrario devuelve false. Devuelve true si su argumento es un carácter de espacio en blanco (Tabular, Enter). Caso contrario devuelve false. Devuelve true si su argumento es un carácter de control. Caso contrario devuelve false. Devuelve true si su argumento es letra
Tipo Dato Argumento
char
char
char
char
char
Tipo Dato devuelto
bool
bool
bool
bool
bool
char
bool
char
bool
Ejemplo(*)
isalnum('B') isalnum('1') isalnum('+')
isalpha('B') isalpha('1') isalpha('+')
isdigit('B') isdigit('1') isdigit('+')
ispunct('B') ispunct('1') ispunct('+')
isspace( ' ') isspace(' ') isspace('\n' ) iscntrl ( char(127) ) islower('a') islower('A')
Valor devuelt o ejemplo
Librería (**)
true true false
ctype.h
true false false
ctype.h
false true false
ctype.h
false false true
ctype.h
true true true
ctype.h
true
ctype.h
true false
ctype.h
islower('+')
Minúscula. Caso contrario devuelve false.
isupper
tolower
toupper
Devuelve true si su argumento es letra Mayúscula. Caso contrario devuelve false. Devuelve la versión en minúscula de su argumento. Si no tiene minúscula devuelve el mismo argumento Devuelve la versión en mayúscula de su argumento. Si no tiene mayúscula devuelve el mismo argumento
char
char
char
bool
char
char
isupper ('a') isupper ('A') isupper ('+') tolower('A') tolower('a') tolower('+')
toupper('A') toupper('a') toupper('+')
false
false true false
ctype.h
a a +
ctype.h
A A +
ctype.h
(*) Hay una forma de averiguar cuáles son caracteres de control y esto es con las siguientes instrucciones:
for(int i=1;i<=127;i++) if(iscntrl(char(i))) printf("\n%d = %c", i, char(i));
El resultado nos mostrara todos los caracteres en el cual su código ascii esta entre (1-31) y el 127. Son caracteres no imprimibles por ejemplo el número 10 que representa la tecla
6.5 Funciones de Cadena
Prototipo int atoi (char* )
Descripción Convierte hacia un int
Ejemplo char cad[2]={'1','0'}; atoi(cad);
Valor devuelto ejemplo
Librería (**)
10
stdlib.h
long atol (char* ) double atof (char* ) char* strcat( char* , char* ) int strcmp( char* , char* ) char* strcpy( char* , char* ) int strlen (char* ) char* strncat( char* , char* , int ) int strncmp( char* , char* , int )
Convierte hacia un long
char cad[2]={'0','5'}; atol(cad);
5
stdlib.h
Convierte hacia un double
char cad[3]={'0','.','5'}; atof(cad)
0.5
math.h
char cad1[10]={'A','B'}; char cad2[2]={'C'}; strcat(cad1, cad2); printf("\n%s", cad1);
ABC
string.h
0
string.h
ABC
string.h
char cad[10]={'A','B'}; printf("\n%d", strlen(cad));
ABC
string.h
char cad1[10]={'A','B'}; char cad2[2]={'C','D'}; strncat(cad1,cad2,1); printf("\n%s", cad1);
ABC
string.h
char cad1[10]={'A','B'}; char cad2[2]={'A','C'}; printf("\n%d", strncmp(cad1, cad2, 1));
0
string.h
BC
string.h
BAB
string.h
Anexa o junta al final de Devuelve 0, si las cadenas son iguales, 1 si es mayor a y -1 si es menor (*) Cambia el valor de hacia Devuelve la longitud de Anexa o junta caracteres de al final de Compara caracteres de con
char* strstr( char* , char* )
Devuelve un puntero a la primera ocurrencia de la cadena en y NULL si no lo encuentra
char* strchr( char* , char )
Devuelve un puntero a la primera ocurrencia de la cadena <
char cad1[1]={'A'}; char cad2[1]={'A'}; printf("\n%d", strcmp(cad1, cad2));
char cad[10]; strcpy(cad, "ABC"); printf("\n%s", cad);
char cad1[10]={'A','B','C'}; char cad2[10]={'B'}; char cad3[10]; strcpy(cad3, strstr(cad1, cad2)); printf("\n%s", cad3); char cad1[10]={'A','B', 'A','B'}; char car='B'; char cad3[10];
char* strrchr( char* , char )
caracter> en y NULL si no lo encuentra Devuelve un puntero a la última ocurrencia de la cadena < caracter> en y NULL si no lo encuentra
strcpy(cad3, strchr(cad1, car)); printf("\n%s" printf("\n%s", , cad3); char cad1[10]={'A' cad1[10]={'A', ,'B' 'B', , 'A', 'A' ,'B' 'B'}; }; char car='B' car='B'; ; char cad3[10]; strcpy( cad3, strrchr(cad1, car) ); printf("\n%s" printf("\n%s", , cad3);
B
string.h
(*) Devuelve 0, si son iguales en longitud y caracteres, 1 si es mayor a y -1 si es menor.
Ejemplos:
char cad1[10]={'B' cad1[10]={'B', , 'B' 'B'}; }; char cad2[2]={'A' cad2[2]={'A'}; }; printf("\nResultado: printf("\nResultado: %d", %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' cad1[10]={'B', , 'B' 'B'}; }; char cad2[2]={'C' cad2[2]={'C'}; }; printf("\nResultado: printf("\nResultado: %d", %d" , strcmp(cad1, cad2)); /*Retorna -1, por que el caracter mas alto de cad1 es 'B' y el caracter mas alto de cad2 es 'C' es decir 'B'<'C' en la tabla de los codigos ascii */
(**) Las librerías mostradas en las tablas son automáticamente referenciadas en Visual Studio .Net por la ya conocida referencia:
#include using namespace std;
6.6 Generador de números aleatorios A menudo en los problemas problemas computacion computacionales ales es necesario necesario generar generar números números al azar o aleatorios. aleatorios. A continuación mostramos la forma de generar números aleatorios en C++.
#include 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" printf("%d\n", , Numero); system("PAUSE" system("PAUSE"); ); }
Observamos del ejemplo anterior las nuevas directivas a utilizar:
#include "stdlib.h" #include "time.h"
Generamos la semilla de números aleatorios:
tiempo=time(NULL); srand(tiempo);
Establecemos los límites de generación de números (50-150):
desde=50; hasta=150;
Generamos el número aleatorio y lo guardamos en la variable Número:
Numero=desde + rand() % (1 + hasta - desde);
En general la fórmula para generar números aleatorios entre a y b:
a + rand() % (1 + b - a)
Capítulo 7 Programación Modular 7.1 Diseño descendente descendente 7.2 Subprogramas 7.3 Variables globales globales y locales 7.4 Funciones 7.4.1 Definición de funciones 7.4.2 Invocación a las funciones 7.5 Procedimientos 7.5.1 Definición de Procedimientos Procedimientos 7.5.2 Invocación a las Procedimientos 7.6 Tipos de Parámetros
7
Programación Modular
Introducción Los desarrolladores en C++, hacen sus programas teniendo siempre en mente el conocido dicho “Divide y vencerás”, vencerás ”, el cual nos va a evitar serios dolores de cabeza a la hora de realizar aplicaciones grandes y complejas. En C++ es esencial el trabajo modular ya sea por objetivos, abstracción o por reutilización. Un módulo representa un bloque abstracto de código, esto es el programa principal o subprogramas en una solución a un problema computacional.
7.1 Diseño descendente Las aplicaciones en C++ y varios lenguajes de programación tienen como característica el diseño descendente en la escritura de código, es decir “de arriba hacia abajo” esto significa que en una hoja de código el compilador va a hacer un barrido desde la primera hasta la última línea en la hoja de código.
Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 3 xxxxxxxx Línea 4 xxxxxxxx Línea 5 xxxxxxxx …………………... …………………… Línea n-1 ...…….. ... …….. Línea n...……….. n... ………..
7.2 Subprogramas Son subdivisiones que bifurcan o alteran el flujo del código en un programa. Hacia la zona del subprograma, esto puede ser en la hoja de código o en ocasiones a otros archivos.
A continuación continuación mostramos mostramos un esquema esquema de un programa programa hecho de de forma modular:
PROGRAMA PRINCIPAL Línea 1 xxxxxxxx Línea 2 xxxxxxxx LLAMA SUBPROGRAMA X Línea 4 xxxxxxxx Línea 5 xxxxxxxx Línea 6 xxxxxxxx LLAMA SUBPROGRAMA X Línea 8 xxxxxxxx Línea 9 xxxxxxxx Línea 10 xxxxxxxx LLAMA SUBPROGRAMA Y Línea 11 xxxxxxxx Línea 12 xxxxxxxx …………………... …………………… Línea n-1 ...…….. Línea n...………..
SUBPROGRAMA (X) Línea 1 xxxxxxxx Línea 2 xxxxxxxx …………………… Línea n-1 ...…….. Línea n...………..
El esquema representa el flujo de un programa con dos subprogramas.
SUBPROGRAMA (Y) Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 3 xxxxxxxx …………………… Línea n...………..
Notar que el programa principal cuenta con 2 subprogramas estos puede estar dentro de la hoja de código o en otro archivo. El compilador comienza con la línea 1, línea 2 y llega a la línea en la cual se llama al subprograma X, entonces el flujo brinca al subprograma X entonces comienza a ejecutarse la línea 1, 2, …n del subprograma. Al terminar de ejecutarse el subprograma el flujo retorna al programa principal. Entonces continúa el programa principal con la línea 4, 5, 6 entonces vuelve a llamar al subprograma X y vuelve a ejecutar y terminar sus instrucciones para retornar nuevamente al programa principal. Se ejecuta las líneas 8,9,10 y llega a la invocación del subprograma Y, entonces similar a lo que hizo el compilador con el subprograma X hace con Y, ejecuta las líneas del subprograma Y, al finalizar retorna al programa principal hasta terminar de ejecutar lo restante.
7.3 Variables globales y locales Una variable es global o local en función de la zona dentro de la hoja de código en donde es declarada. Esto puede ser por el alcance del valor de la variable con la cual se necesita trabajar.
Variable global Es una variable que es declarada fuera de todo modulo, su valor almacenado es mantenido hasta que se termine el programa.
#include using namespace std; int nro; //Variable global nro void main(){
Variable local Es una variable que es declarada dentro de un módulo, su valor almacenado es mantenido hasta que termine el modulo.
#include using namespace std; void main(){ int nro; //Variable Local del programa principal
7.4 Funciones Una función es un módulo de instrucciones con una tarea específica que retorna siempre resultado(s). Este resultado es del tipo de datos con el cual fue definido. Una función es código en espera hasta que la función sea invocada desde el programa principal, el valor devuelto por la función puede ser almacenado o mostrado directamente por pantalla.
7.4.1 Definición de funciones Para utilizar una función antes previamente debe ser definida. A continuación mostramos la definición de una función:
(){
return ; }
Dónde: : Tipo de datos valido C++ ( int, double, bool , etc.) Véase apartado 3.1.1
: Identificador valido C++(Aplica las reglas a nombrar variables Véase apartado 3.1.3)
: Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato ( , < Tipo de dato > ,…)
:
Valor o variable que la función devolverá como resultado, cabe decir que este resultado debe ser del tipo de dato declarado por la función.
Ejemplo: La siguiente función es de tipo entera y retorna la suma de dos números enteros.
int f_sumar(int A, int B){ int devolver; devolver = A + B; return devolver; }
7.4.2 Invocación a las funciones La función f_sumar es un código en espera sino hasta que es invocado desde el modulo void main. Para invocar a una función se nombra la función y se pasan valores como se muestra a continuación:
void main(){ int A, resultado; A=10; resultado=f_sumar(A, 5);//Invocacion a funcion printf("%d\n", resultado);//Muestra 15 system("PAUSE"); }
Una función no es necesariamente invocado de la función principal void main también es posible que sea invocado desde cualquier función valida de C++, y todas ellas estarán en espera hasta que sean invocados desde el modulo void main . A continuación mostraremos como se invoca una función dentro de otra:
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 using namespace std; //Definicion de la funcion f_sumar int f_sumar(int A, int B){ int devolver; devolver = A + B; return devolver; } //Definición de la funcion f_doble int f_doble(int A){ int devolver; devolver = f_sumar(A, A); //Invocacion a función f_sumar return devolver; } //Programa Principal void main(){ int A, resultado; A=10; resultado=f_doble(A);//Invocacion a función f_doble printf("%d\n", resultado);//Muestra 20 system("PAUSE"); }
7.5 Procedimientos Un procedimiento es un tipo de función con la única restricción que NO retorna resultado(s). Por tanto todas las reglas que se describieron para las funciones son también aplicables a los procedimientos. En C++ los procedimientos también son conocidos como funciones void. Se concibe a un procedimiento como bloque de código que es anexado al módulo que lo invoca.
7.5.1 Definición de Procedimientos Para utilizar un procedimiento antes previamente debe ser definida. A continuación mostramos la definición de un procedimiento:
void (){
}
Dónde:
: Identificador valido C++(Aplica las reglas a nombrar variables Véase apartado 3.1.3)
: Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato ( , < Tipo de dato > ,…)
Ejemplo: El siguiente procedimiento muestra por pantalla un entero.
void f_mostrar(int A){ printf("%d\n", A); system("PAUSE"); }
7.4.2 Invocación a los Procedimientos El procedimiento f_mostrar es un código en espera sino hasta que es invocado desde el modulo void main.
void main(){ int A, resultado; A=10; f_mostrar(A); //Invocacion a Procedimiento f_mostrar }
El programa completo es:
#include using namespace std; //Definición de Procedimiento f_mostrar void f_mostrar(int A){ printf("%d\n", A); system("PAUSE"); } //Procedimiento Principal void main(){ int A, resultado; A=10; f_mostrar(A);//Invocacion a Procedimiento f_mostrar }
Como podemos apreciar la función principal void main es un procedimiento o una función void. Tener en cuenta que las variables que se declaran y los argumentos solo cuentan dentro del módulo donde fueron declaradas, por lo tanto el argumento (int A) del procedimiento f_mostrar y la variable int A de void main son distintas.
7.6 Tipos de Parámetros En C++ los parámetros o argumentos de una función pueden ser de dos tipos: Por valor o por referencia.
Parámetro Por Valor Son aquellos parámetros en los cuales el valor o contenido de los parámetros es copiado, y dentro de la función se trabaja con dicha copia. Esto sugiere que la variable real no puede ser modificada en contenido.
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"); }
Parámetro Por Referencia Son aquellos parámetros en los cuales la dirección de memoria es pasada hacia la función, esto indica que dentro de la función se trabaja realmente con la variable que es pasada como argumento, por tanto dicha variable puede ser modificada.
Para decirle al compilador de C++ que un argumento es por referencia se debe anteponer a la variable el símbolo de ampersand &.
void f_incrementar(int &A){ //Argumento A es por referencia A++; printf("%d\n", A); } void main(){ int A; A=10; f_incrementar(A);//Muestra 11 printf("%d\n", A);//Muestra 11 system("PAUSE"); }
Se recomienda usar parámetros por referencia en lo mínimo. Es posible también modificar variables en funciones si la declaramos como variables globales, esto nos va a facilitar el entendimiento y sabremos que estamos modificando.
Capítulo 8 Arreglos 8.1 Arreglos Unidimensionales 8.1.1 Representación Grafica 8.1.2 Asignación de Valores 8.1.3 Lectura y escritura de datos 8.1.4 Recorrido, inserción y eliminación en un vector 8.2 Arreglos Bidimensionales 8.1.1 Representación Grafica 8.2.2 Asignación de Valores 8.2.3 Lectura y escritura de datos 8.2.4 Recorrido, inserción y eliminación en una matriz 8.3 Ordenamientos 8.3.1 método de intercambio o burbuja 8.3.2 método por inserción, 8.3.3 método por selección 8.3.4 método de ordenación rápida (quicksort). 8.4 Búsquedas 8.4.1 Tipos de búsqueda 8.4.2 Método Búsqueda Binaria
8
Arreglos
Introducción Los arreglos son conjuntos de datos del mismo tipo, agrupados en una variable y cuyo acceso individual es numérico, este acceso individual es denominado índice. Un arreglo puede contener por ejemplo listas de calificaciones de exámenes, de temperaturas o de nombres. Cabe decir que la cantidad de elementos de los arreglos es de tipo estática es decir que al declarar la longitud del vector esta va a mantener su longitud hasta el final del programa.
8.1 Arreglos Unidimensionales 8.1.1 Representación Grafica A continuación mostramos un vector de tipo entero de 10 elementos:
int A[10]
0 1 2 3 4 5 6 7 8 9 7 5 6 3 0 8 2 1 15 9
A[0]=7
A[3]=3
A[8]=15
8.1.2 Asignación de Valores Asignar a un elemento del vector es mediante la variable seguida del índice entre corchetes así como sigue a continuación:
[] = ;
Ejemplos:
A[0] = 7;
A[3] = 3;
A[8] = 15;
A[5] = A[1];
A[6] = A[6] * 2;
A[7] = A[0] / A[1];
A[9] = desde + rand() % (1 + hasta - desde);
8.1.3 Lectura y escritura de datos Leer o escribir un elemento del vector es similar ha como se hace a variables individuales mediante la variable seguida del índice entre corchetes así como sigue a continuación:
Lectura
scanf( , &[] );
Ejemplos
scanf("%d", & A[ 5 ]); scanf("%d", & A[ 0 ]); scanf("%d", & A[ p ]);
Escritura printf( ); ,
Ejemplos
printf("%d", A[ 5 ]);
printf("%lf", B[ 0 ]); printf("%d y %8.2lf", A[ p ], B[ p ]);
8.1.4 Recorrido, inserción, eliminación y ejemplos en un vector
Recorrido Para recorrer un vector ya sea para asignación, lectura o escritura utilizamos la sentencia for ya que conocemos el inicio y el final del recorrido, así como se muestra a continuación:
Ejemplo 1 Asignación del índice a cada elemento de un vector de 10 elementos:
Longitud=10; for(i=0 ; i< Longitud ; i++){ A[i]=i; }
Ejemplo 2 Ingreso por teclado a cada elemento de un vector de 10 elementos:
Longitud=10; for(i=0 ; i< Longitud ; i++){ scanf("%d", &A[i]); }
Ejemplo 3 Impresión por teclado a cada elemento en una línea para un vector de 10 elementos:
Longitud=10; for(i=0 ; i< Longitud ; i++){ printf("%d\n", A[i]); }
Inserción Sabemos que la longitud del vector es de tipo estática por tanto la inserción es simulada, es decir no aumenta la longitud declarada al inicio. Para tal caso debemos declarar la longitud del vector con un valor máximo tope, que contemple la longitud actual más las inserciones. Debemos tener la longitud virtual del vector en una variable A continuación mostramos el algoritmo de inserción si suponemos que:
int A[6], N=4;
0 1 2 3 4 5 2 3 1 4
Algoritmo de inserción:
for(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i]; A[posicion-1] = nro_insertar; N++;
Dónde:
:
Vector de elementos
< posicion >:
Posición a insertar
< nro_insertar >:
Valor a insertar
< N >:
Longitud del vector
Explicación del algoritmo
for(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i];
< for(i = N-1 ; i>=posicion-1 ; i--) > significa que la variable < i > comienza de la longitud del vector < N-1 >, y termina en la posición a insertar < i>=posicion-1 >. < A[i+1] = A[i] > significa el elemento siguiente es igual al anterior.
Si < posicion > a insertar es 2 entonces:
Procedemos a desplazar los elementos desde el final hasta la posición: A[i+1] A[4] A[3] A[2]
= = = =
A[i] A[3] 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 tenía el valor de 4 y se incrementa en uno entonces:
N=5
Eliminación Sabemos que la longitud del vector es de tipo estática por tanto la eliminación es simulada, es decir no decrementa la longitud declarada al inicio. Debemos tener la longitud virtual del vector en una variable. A continuación mostramos el algoritmo de eliminación si suponemos que:
int A[6], N=5;
0 1 2 3 4 5 2 3 1 4 5
Algoritmo de eliminación:
for(i= posicion; i
Dónde:
:
Vector de elementos
< posicion >:
Posición a eliminar
< N >:
Longitud del vector
Explicación del algoritmo
for(i= for (i= posicion; i
< for for(i= (i= posicion; i significa que la variable < i > comienza de la posición a eliminar < i= posicion > hasta la longitud del vector < i. < A[i-1] = A[i] > significa el elemento anterior es igual al siguiente.
Si < posicion > a eliminar es 2 entonces:
Procedemos a desplazar los elementos desde la posición hasta el final: A[i-1] A[1] A[2] A[3]
= = = =
A[i] A[2] A[3] A[4]
Resultado:
0 1 2 3 4 5 2 1 4 5 5
N--;
Como N tenía el valor de 5 y se decrementa en uno entonces:
N=4
8.2.1 Representación Grafica A continuación continuación mostramos mostramos una matriz matriz de tipo entero de 5x5 (filas x columnas) elementos: elementos:
int A[5][5]
A[0][0]=2
0 1 2 3 4
0 2 5 2 1 7
1 3 6 6 2 8
A[4] [0]=7
A[0][3]=6 A[0][3]=6
2 5 0 3 7 9
3 6 8 9 2 3
4 7 6 5 8 4
A[1] [1]=6 [1]=6 A[2] [3]=9 [3]=9 A[3] [1]=2 [1]=2
A[3][3]=2 A[3][3]=2
8.2.2 Asignación de Valores Asignar a un un elemento elemento de la matriz matriz es mediante mediante la variable variable seguida seguida de los los índices índices entre corchetes corchetes así como sigue a continuación:
[<índice_fila>][<índice_columna>] [<índice_fila>][< índice_columna>] = ;
Ejemplos:
A[0][0] = 7; 7;
A[3][1] = 3; 3;
A[8][8] = 15;
A[5][0] = A[1][3]; A[1][3];
A[6][2] = A[6][2] A[6][2] * 2; 2; A[7][5] = A[0][3] / A[1][9]; A[1][9];
A[9][1] = desde desde + rand() rand() % (1 + hasta - desde); desde);
8.1.3 Lectura y escritura de datos Leer o escribir un elemento de la matriz es similar ha como se hace a variables individuales mediante la variable seguida de los índices entre corchetes así como sigue a continuación:
Lectura scanf( , &[<índice_fila>][<índice_columna>] );
Ejemplos
scanf("%d" scanf("%d", , & A[ 5 ][ 5 ] ); scanf("%d" scanf("%d", , & A[ 0 ][ 1 ] ); scanf("%d" scanf("%d", , & A[ f ][ c ]);
Escritura pri printf( ); ,
Ejemplos
printf("%d" printf("%d", , A[ 5 ][ 4 ] ); printf("%lf" printf("%lf", , B[ 0 ][ 0 ] ); printf("%d printf("%d y %8.2lf", %8.2lf" , A[ f ][ 1 ] , B[ f ][ c ] );
8.2.4 Recorridos y ejemplos de matrices.
Para recorrer una matriz ya sea para asignación, lectura o escritura utilizamos 2 sentencias for Uno para controlar las filas y otro para las columnas, así como se muestra a continuación:
Ejemplo 1 Asignación de la suma de los índices a cada elemento de una matriz de 5x4 elementos:
TotalFilas=5; TotalColumnas=4; for(fila=0 for (fila=0 ; fila < TotalFilas ; fila++) for(columna=0 for (columna=0 ; columna < TotalColumnas; columna++) A[fila][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 for (fila=0 ; fila < TotalFilas ; fila++) for(columna=0 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 for (columna=0 ; columna < TotalColumnas; columna++) for(fila=0 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 for (fila=0 ; fila < TotalFilas ; fila++) for(columna=0 for (columna=0 ; columna < TotalColumnas; columna++) scanf("%d" scanf("%d", , A[fila][columna]); A[fila][columna]);
Las instrucciones anteriores son correctas sin embargo tendremos que ingresar por teclado 5x6 veces es decir 30.
Para tal caso podemos utilizar los números aleatorios:
tiempo=time(NULL); srand(tiempo); TotalFilas=5; TotalColumnas=6; desde=1; hasta=10; for(fila=0 ; fila< TotalFilas ; fila++) for(columna=0 ; columna< TotalColumnas ; columna++) A[fila][columna] = desde + rand() % (1 + hasta - desde);
Ejemplo 5 Generar y mostrar por pantalla una matriz de 5x6 elementos:
tiempo=time(NULL); srand(tiempo); TotalFilas=5; TotalColumnas=6; desde=1; hasta=5; for(fila=0 ; fila< TotalFilas ; fila++){ printf("\n\n\t"); for(columna=0 ; columna< TotalColumnas ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("\t%d", A[fila][columna]); } }
Ejemplo 6 Definir e ingresar el orden NxM a una matriz:
//Definition const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; //Ingreso printf("\n\rIngrese # de filas de la matriz: " ); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: " ); scanf("%d", &M); fflush(stdin);
Ejemplo 7 Se tiene una matriz de orden N*M de tipo entero, se pide generar y mostrar números aleatorios entre 1 y 16 dentro de la matriz.
#include
using namespace std; #include "stdlib.h" #include "time.h" void main(){ //Definition de matriz const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; //Ingreso orden matriz printf("\n\rIngrese # de filas de la matriz: " ); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: " ); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=16; //rango números a generar for(fila=0 ; fila
8.3 Ordenamientos En arreglos existen muchos métodos de ordenación de elementos a continuación mostraremos los más utilizados.
8.3.1 método de intercambio o burbuja
for(i=0 ; i A[j]){ aux=A[i]; A[i]=A[j]; A[j]=aux; }
Explicación del algoritmo
El primer < for > indica que se debe recorrer desde el inicio < i=0 > hasta el penúltimo elemento < i
for(i=0 ; i
El segundo < for > indica que se debe recorrer desde el siguiente del elemento actual < j=i+1 > hasta el último elemento < j
for(j=i+1 ; j
Si N=6 el recorrido de los dos for:
i 0 1 2 3 4
j 1,2,3,4,5 2,3,4,5 3,4,5 4,5 5
Recordar el algoritmo del intercambio de valores entre dos variables A y B: aux = A; A = B; B = aux;
Supongamos que el vector es el siguiente:
0 1 2 3 4 5 3 5 4 6 7 0 Como conocemos N=6, el recorrido de las variables y el algoritmo del intercambio es entonces: i 0 0 0 0 0
j 1 2 3 4 5
A[i] 3 3 3 3 3
A[j] 5 4 6 7 0
A[i] > A[j] false false false false true
1 1 1 1
2 3 4 5
5 4 4 4
4 6 7 3
true false false true
2 2 2
3 4 5
5 5 5
6 7 4
3 3
4 5
6 6
7 5
4
5
7
6
Intercambio
0
5
4
6
7
3
0
4
5
6
7
3
0
3
5
6
7
4
false false true
0
3
4
6
7
5
false true
0
3
4
5
7
6
0
3
4
5
6
7
El resultado final es el arreglo ordenado: 0
3
4
5
6
7
Capítulo 9 Cadenas 9.1 Fundamentos de cadenas 9.2 Asignación de Valores 9.3 Lectura y escritura de datos 9.4 Arreglo de cadenas 9.5 Lectura y escritura de datos
9.1 Fundamentos de cadenas Introducción En el mundo de la programación y sistemas se trabajan con base de datos. Que no es más que datos interrelacionados, y en su mayoría almacena datos de tipo texto (Cadenas). Entonces debemos aprender también a manejar bien los datos tipos cadenas en operaciones de concatenación, extracción, filtros, etc. En C++ existen dos tipos de cadenas: estáticas y dinámicas. Nosotros comenzaremos con las de tipos estáticas para comprender el manejo interno y de cómo son las operaciones primitivas.
Representación Grafica A continuación mostramos un vector de tipo carácter de 12 elementos:
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 Asignación de valores Asignar a un elemento de la cadena es mediante la variable seguida de los índices entre corchetes así como sigue a continuación:
[<índice>] = ;
Ejemplos:
A[0] = '7'; A[3] = (char)65; A[8] = 'A';
9.3 Lectura y escritura de Datos Leer o escribir un elemento de la cadena es similar a como se hace en los vectores, con la adición de entrada completa de la cadena mediante la función < gets >. Muchas de las operaciones en cadenas se realizan mediante funciones (Véase apartado 6.5).
Lectura Carácter
scanf( , &[] );
Ejemplos
scanf("%c", & A[ 5 ]); scanf("%c", & A[ 0 ]); scanf("%c", & A[ p ]);
Lectura Cadena
gets( );
Ejemplos
gets( A); gets(B);
Escritura Caracter printf( ); ,
Ejemplos
printf("%c", A[ 5 ]); printf("%c y %c", A[ p ], B[ p ]);
Escritura Cadena
printf( ); ,
Ejemplos
printf("%s", A); printf("%s y %s", A, B);
9.4 Arreglo de cadenas
A continuación mostramos una matriz de tipo carácter de 5x16 elementos: char A[5][16]
A[0][0]=J
0 1 2 3 4
0 J M J P P
1 O A U E I
A[0][3]=
A[0][7]=A
2 3 4 5 6 7 8 9 10 11 12 13 14 15 E R O C A \0 ? ? ? ? ? ? ? R I A S A L A S \0 ? ? ? ? L I O T E L L O \0 ? ? ? ? D R O M O R E N O \0 ? ? ? L A R \0 ? ? ? ? ? ? ? ? ? ?
A[4][0]=P
A[4][4]=R
A[3][7]=O
9.5 Lectura y escritura de datos
Lectura Cadena
gets([<índice fila>] );
Ejemplos
gets( A[0]); gets(B[p]);
A[3][12]=\0
A[1][10]=S
A[2][9]=L
Escritura Cadena
printf( ); ,
Ejemplos
printf("%s", A[0]); printf("%s y %s", A[0], B[p]);
Ejemplo 1: Ingrese una cadena de caracteres por teclado, desarrolle la simulación de la función extraer.
Solución #include 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"); }
Explicación del algoritmo
const int LongitudMax = 100; char cadena[LongitudMax], Resultado[LongitudMax]; int i, inicio, fin, nrocar, c;
Observamos la declaración de variables: una constante con la longitud máxima de la cadena, una variable cadena para el ingreso y una variable resultado para mostrar lo que se va a extraer. Y un conjunto de variables numéricas.
printf("\n\rIngrese Cadena: " ); gets(cadena); fflush(stdin); printf("\n\rPosicion de Inicio a Extraer: " ); scanf("%d", &inicio); fflush(stdin); printf("\n\rNumero de caracteres a Extraer: " ); scanf("%d", &nrocar); fflush(stdin);
Las instrucciones mostradas son para el ingreso de variables. Observar la instrucción después de cada instrucción de ingreso, para no perder caracteres.
c=0; fin=(inicio-1) + nrocar; for(i=inicio-1 ; i < fin ; i++){ Resultado[c]=cadena[i]; c++; }
Inicializamos a la variable c a cero. La variable fin representa hasta donde se va a extraer, es inicio menos uno más la cantidad de caracteres a extraer. En el bucle for la variable i comienza en inicio menos uno hasta fin y se va asignando a resultado el contenido carácter a carácter. La variable c representa el índice de la variable resultado.
Resultado[c]='\0';
Demarcamos el final de la cadena.
printf("\n\nLa cadena extraida es %s\n\n" , Resultado);
Mostramos por pantalla el resultado.
Supongamos que los datos ingresados en el programa son los siguientes:
cadena=”JUAN PEREZ” inicio=6 nrocar=4
Entonces:
c=0 fin = ( 6 - 1 ) + 4 = 9 i=5
i 5 6 7 8
c Resultado[c] 0 P 1 E 2 R 3 E
Capítulo 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 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