Está en la página 1de 47

UNIVERSIDAD NACIONAL MAYOR DE SAN

MARCOS
FIEE

Curso: Programación y Computación

Docente: Mg. Jaime Escobar Aguirre

FIEE-UNMSM 1
Estructuras
Las estructuras nos permiten agrupar varios datos, que mantengan
algún tipo de relación, aunque sean de distinto tipo, permitiendo
manipularlos todos juntos, usando un mismo identificador, o cada uno
por separado.
Las estructuras son llamadas también muy a menudo registros, o en
inglés records. Tienen muchos aspectos en común con los registros
usados en bases de datos. Y siguiendo la misma analogía, cada objeto
de una estructura se denomina a menudo campo, o field.
• sintaxis
struct [<identificador>] {
[<tipo> <nombre_objeto>[,<nombre_objeto>,...]];
} [<objeto_estructura>[,<objeto_estructura>,...];

FIEE- UNMSM 2
El identificador de la estructura es un nombre opcional para referirse a la estructura.

Los objetos de estructura son objetos declarados del tipo de la estructura, y su


inclusión también es opcional. Sin bien, aún siendo ambos opcionales, al menos uno
de estos elementos debe existir.

En el interior de una estructura, entre las llaves, se pueden definir todos los
elementos que consideremos necesarios, del mismo modo que se declaran los
objetos.

Las estructuras pueden referenciarse completas, usando su nombre, como hacemos


con los objetos que ya conocemos, y también se puede acceder a los elementos
definidos en el interior de la estructura, usando el operador de selección (.), un punto.

FIEE- UNMSM 3
Ejemplo de estructura
FIEE- UNMSM 4
Inicialización de la estructura
• De un modo parecido al que se inicializan los arrays, se pueden inicializar estructuras, tan
sólo hay que tener cuidado con las estructuras anidadas.

FIEE- UNMSM 5
• La asignación de estructuras está permitida, pero sólo entre objetos del
mismo tipo de estructura, (salvo que se usen constructores), y funciona
como la intuición nos dice que debe hacerlo.

La línea Punto2 = Punto1; equivale a Punto2.x = Punto1.x; Punto2.y = Punto1.y;.

FIEE-UNMSM 6
Usando constructores en estructuras
• Crearemos como ejemplo, una estructura para manejar números
complejos. Un número complejo está compuesto por dos valores
reales, el primero contiene lo que se llama la parte real y el segundo la
parte imaginaria.

Este constructor se usara si requerimos crear un array →complejo array[10];

FIEE- UNMSM 7
• El constructor por defecto será llamado para cada elemento del array,
aunque no aparezca tal llamada en ningún punto del programa.
• Otro constructor nos puede servir para asignar un valor a partir de dos
números:

• Mediante este constructor podemos asignar valores iniciales en la


declaración : complejo c1(10.23, 213.22);

FIEE- UNMSM 8
• Los números reales se consideran un subconjunto de los imaginarios,
en los que la parte imaginaria vale cero. Esto nos permite crear otro
constructor que sólo admita un valor real:

Este constructor nos permite, como en el caso anterior, inicializar un valor de un complejo en la
declaración, pero también nos permite asignar un valor double a un complejo, y por el sistema
de promoción automático, también podemos asignar valores enteros o en coma flotante:

FIEE- UNMSM 9
Este tipo de constructores se comportan como conversores de tipo, nada nos impide
crear constructores con cualquier tipo de parámetro, y tales constructores se podrán
usar para convertir cualquier tipo al de nuestra estructura.

FIEE- UNMSM 10
Funciones Parte II- Parámetros por valor y por referencia
• La forma en que hemos declarado y pasado los parámetros de las funciones hasta ahora es la que
normalmente se conoce como "por valor". Esto quiere decir que cuando el control pasa a la
función, los valores de los parámetros en la llamada se copian a "objetos" locales de la función,
estos "objetos" son de hecho los propios parámetros.

Empezamos haciendo a = 10 y b = 20, después llamamos a la función "funcion" con las objetos a y b como parámetros.
Dentro de "funcion" esos parámetros se llaman n y m, y sus valores son modificados. Sin embargo al retornar a main, a y
b conservan sus valores originales. ¿Por qué?
La respuesta es que lo que pasamos no son los objetos a y b, sino que copiamos sus valores a los objetos n y m.
Si los parámetros por valor no funcionasen
Escuela de así, no Generales
Estudios sería posible llamar a una función con valores constantes o11literales.
- UNMSM
Referencias a objetos

• Las referencias sirven para definir "alias" o


nombres alternativos para un mismo objeto.
Para ello se usa el operador de referencia (&).
• Sintaxis:
<tipo> &<alias> = <objeto de referencia>
<tipo> &<alias>
• La primera forma es la que se usa para declarar
objetos que son referencias, la asignación es
obligatoria ya que no pueden definirse
referencias indeterminadas.

FIEE- UNMSM 12
• La segunda forma es la que se usa para definir parámetros por
referencia en funciones, en estos casos, las asignaciones son
implícitas.
• Ejemplo:
En este ejemplo los identificadores a y r se refieren al
mismo objeto, cualquier cambio en una de ellos se
produce en el otro, ya que son, el mismo objeto.

El compilador mantiene una tabla en la que se hace


corresponder una dirección de memoria para cada
identificador de objeto. A cada nuevo objeto declarado se
le reserva un espacio de memoria y se almacena su
dirección. En el caso de las referencias, se omite ese
paso, y se asigna la dirección de otro objeto que ya existía
previamente.

De ese modo, podemos tener varios identificadores que


hacen referencia al mismo objeto, pero sin usar punteros.
FIEE- UNMSM 13
Pasando parámetros por referencia
• Si queremos que los cambios realizados en los parámetros dentro de la
función se conserven al retornar de la llamada, deberemos pasarlos
por referencia. Esto se hace declarando los parámetros de la función
como referencias a objetos. Por ejemplo:

FIEE- UNMSM 14
• En este caso, los objetos "a" y "b" tendrán valores
distintos después de llamar a la función. Cualquier
cambio de valor que realicemos en los parámetros
dentro de la función, se hará también en los objetos
referenciadas.

• Esto quiere decir que no podremos llamar a la


función con parámetros constantes, como se indica
en (1), ya que aunque es posible definir referencias a
constantes, en este ejemplo, la función tiene como
parámetros referencias a objetos variables.

• Y si bien es posible hacer un casting implícito de un


objeto variable a uno constante, no es posible
hacerlo en el sentido inverso. Un objeto constante no
puede tratarse como objeto variable.

FIEE- UNMSM 15
Programa que suma dos matrices usando funciones
1

FIEE- UNMSM 16
Sobrecarga de funciones

• Anteriormente hemos visto operadores que tienen varios usos, como por
ejemplo *, &, << o >>. Esto se llama sobrecarga de operadores.
• Con las funciones existe un mecanismo análogo, de hecho, en C++, los
operadores no son sino un tipo especial de funciones, aunque eso sí, algo
peculiares.
• Así que en C++ podemos definir varias funciones con el mismo nombre, con la
única condición de que el número y/o el tipo de los argumentos sean distintos.
El compilador decide cual de las versiones de la función usará después de
analizar el número y el tipo de los parámetros. Si ninguna de las funciones se
adapta a los parámetros indicados, se aplicarán las reglas implícitas de
conversión de tipos.
Sobrecarga de funciones

• Las ventajas son más evidentes cuando debemos hacer las


mismas operaciones con objetos de diferentes tipos o con
distinto número de objetos. Hasta ahora habíamos usado macros
para esto, pero no siempre es posible usarlas, y además las
macros tienen la desventaja de que se expanden siempre, y son
difíciles de diseñar para funciones complejas.
• Sin embargo las funciones serán ejecutadas mediante llamadas,
y por lo tanto sólo habrá una copia de cada una.
ejemplo01

FIEE- UNMSM 19
Ejemplo02

FIEE- UNMSM 20
Comentarios …

• El primer ejemplo ilustra el uso de sobrecarga de funciones para


operar con objetos de distinto tipo. El segundo muestra cómo se
puede sobrecargar una función para operar con distinto número
de objetos. Por supuesto, el segundo ejemplo se puede resolver
también con parámetros por defecto.
Arboles
• Un árbol consta de un conjunto finito de elementos denominados
nodos y un conjunto finito de líneas denominadas ramas que
conectan esos nodos.

FIEE- UNMSM 22
Como se llamarían
???

FIEE- UNMSM 23
Temario:
• Funciones matemáticas
• Métodos Numéricos
• Introducción al calculo de raíces
• Sistema de ecuaciones algebraicas lineales
• Ajuste de curvas
• Ecuaciones diferenciales ordinarias
• Raíces de ecuaciones
• Método de la bisección
• Criterio de convergencia
Funciones matemáticas – math.h

• C++ Tiene predefinida en su biblioteca varias funciones matemáticas


• Una de ellas es la funcion sqrt(), su argumento es del tipo double y su
resultado también.
• El siguiente programa(func_math.cpp) permite calcular las raíces de una
ecuación cuadrática
Func_math.cpp

FIEE- UNMSM 26
Mejorando el código anterior

FIEE- UNMSM 27
acos arco coseno double double

asin arco seno double double

atan arco tangente double double

ceil parte entera superior double double

cos coseno double double

cosh coseno hiperbólico double double

exp exponencial: eX double double

fabs valor absoluto double double


Principales Funciones Matemáticas
floor parte entera inferior double double

log logaritmo neperiano double double

log10 logaritmo en base 10 double double

pow xY double, double double

sin seno double double

sinh seno hiperbólico double double

sqrt raíz cuadrada double double

tan tangente double double


FIEE- UNMSM 28
tanh tangente hiperbólica double double
Métodos numéricos
• Una de las tareas realizadas en las ciencias y las ingenierías es
encontrar las raíces de ecuaciones a través de las funciones.
• Este tipo de problemas requiere incluir los puntos de intersección de
dos curvas.
• Si los puntos de intersección de las curvas están representadas por
dos funciones f(x) y g(x) , los puntos de intersección son F(x)=f(x)-g(x)
• Una segunda tarea importante es la integración numérica, en la cual
se utilizan aproximaciones para determinar el valor de la integral
cuando las soluciones no son exactas.
• Emplearemos las técnicas mas comunes en la integración numérica.

FIEE- UNMSM 29
Introducción al calculo de raíces

• Estos problemas están relacionados con el valor de una variable o de un parámetro que satisface
una ecuación ya sea trascendental o un polinomio (trataremos las raíces de un polinomio).
• Son especialmente valiosos en proyectos de ingeniería donde con frecuencia resulta imposible
despejar analíticamente parámetros de ecuaciones de diseño.

FIEE- UNMSM 30
Sistemas de ecuaciones algebraicas lineales

• Estos problemas son similares a los de raíces de ecuaciones en el sentido


de que están relacionados con valores que satisfacen ecuaciones.
• Sin embargo, a diferencia de satisfacer una sola ecuación, se busca un
conjunto de valores que satisfaga simultáneamente a un conjunto de
ecuaciones algebraicas.
• Las ecuaciones lineales simultáneas surgen en el contexto de una variedad
de problemas y en todas las disciplinas de la ingeniería. En particular, se
originan a partir de modelos matemáticos de sistemas grandes de
elementos interconectados, como: estructuras, circuitos eléctricos y redes
de flujo de fluidos, aunque también pueden encontrarse en otras áreas de
los métodos numéricos como el ajuste de curvas.

FIEE- UNMSM 31
Ajuste de curvas

• Con frecuencia se presentará la oportunidad de ajustar curvas a un conjunto de datos


representados por puntos. Las técnicas que se han desarrollado para
• este fin pueden dividirse en dos categorías generales:
• Regresión e Interpolación.
• La regresión se emplea cuando hay un grado significativo de error asociado a los datos;
frecuentemente los resultados experimentales son de esta clase.
• Para estas situaciones, la estrategia es encontrar una curva que represente la tendencia
general de los datos sin necesidad de tocar los puntos individuales.
• La interpolación se maneja cuando el objetivo es determinar valores intermedios entre
datos que estén relativamente libres de error. Tal es el caso de la información tabulada.
Para estas situaciones, la
• estrategia es ajustar una curva directamente a través de los puntos y usar esta curva para
predecir valores intermedios.

FIEE- UNMSM 32
Ecuaciones diferenciales ordinarias

• Las ecuaciones diferenciales ordinarias tienen un enorme significado en la práctica de la


ingeniería.
• Esto se debe a que muchas leyes físicas están expresadas en términos de la razón de
cambio de una cantidad más que en términos de su magnitud.
• Entre los ejemplos se observan desde los modelos de predicción demográfica (razón de
cambio de la población) hasta la aceleración de un cuerpo en descenso (razón de cambio
de la velocidad)

FIEE- UNMSM 33
Raíces de ecuaciones

• Los métodos cerrados consisten en dar 2 puntos tales que éstos encierren el valor de la raíz,
dichos puntos es cuando al sustituirlos en la función, ésta cambia de signo.
• En éste caso se aplica un análisis de la curva mediante la implementación de un programa
ejer01.cpp en c++, el cual evalúa la función para valores obtenidos a través de un intervalo dado y
un número de puntos en los cuales se divide dicho intervalo.

FIEE- UNMSM 34
Analizando el siguiente polinomio

• Se introduce la funcion en la librería define de la siguiente manera


• #define f1(x)(1.0*pow(x,4)‐5.0*pow(x,3)+0.5*pow(x,2)‐11.0*x+10.0)

FIEE- UNMSM 35
ejer01

FIEE- UNMSM 36
El método de bisección

Se sabe que un polinomio de grado “n” tiene “n” raíces las cuales pueden
ser:
• Reales y distintas.
• Reales e iguales.
• Complejas conjugadas.
De acuerdo a ello un polinomio de grado impar tendrá por lo menos una
raíz real, para dichas raíces ocuparemos los métodos numéricos de
Bisección, Regla Falsa, Newton Raphson.
En general, si f(x) es real y continúa en el intervalo que va desde xl hasta
xu y f(xl) y f(xu) tienen signos opuestos, es decir,

FIEE- UNMSM 37
Entonces hay al menos una raíz real entre xl y xu.

• Los métodos de búsqueda incremental aprovechan esta característica localizando un intervalo en


el que la función cambie de signo. Entonces, la localización del cambio de signo (y, en
consecuencia, de la raíz) se logra con más exactitud al dividir el intervalo en varios subintervalos.
• Se investiga cada uno de estos subintervalos para encontrar el cambio de signo. El proceso se
repite y la aproximación a la raíz mejora cada vez más en la medida que los subintervalos se
dividen en intervalos cada vez más pequeños.
• Por lo que sabemos que existe, al menos, una raíz real. A partir de este punto se va reduciendo el
intervalo sucesivamente hasta hacerlo tan pequeño como exija la precisión que hayamos decidido
emplear

FIEE- UNMSM 38
Algoritmo del método de la bisección
• Paso 1:elija los valores iniciales xi y superior xu, que encierren la raíz
de forma tal que la funcion cambie de signo en el intervalo. Esto se
comprueba cuando f(xl)f(xu)<0
• Paso 2:Una aproximación de la raíz Xf se determina mediante:
𝑥𝑖 +𝑥𝑢
•𝑥 𝑓 = 2
• Paso 3: realice las siguientes evaluaciones para determinar en que
intervalo esta la raíz.
• f(xl)f(xu)<0 la raíz se encuentra en el subintervalo inferior
• f(xl)f(xu)>0 la raíz se encuentra en el subintervalo superior
• f(xl)f(xu)<0 la raíz es igual a Xl, termina el calculo

FIEE- UNMSM 39
Escuela de Estudios Generales - UNMSM 40
Criterio de convergencia

• Se debe desarrollar un criterio objetivo para decidir cuándo debe terminar el método.
• Una sugerencia inicial sería finalizar el cálculo cuando el error verdadero se encuentre por debajo
de algún nivel prefijado.
• Puede decidirse que el método termina cuando se alcance un error más bajo, por ejemplo, al
0.1%.
• Se requiere estimar el error de forma tal que no se necesite el conocimiento previo de la raíz, se
puede calcular el error relativo porcentual es de la siguiente manera:

FIEE- UNMSM 41
Donde xr nuevo es la raíz en la iteración actual y xr anterior es el valor de la raíz en la iteración
anterior. Se utiliza el valor absoluto, ya que por lo general importa sólo la magnitud de ea sin
considerar su signo. Cuando ea es menor que un valor previamente fijado es, termina el
cálculo.
A partir del polinomio del cual se obtuvieron los intervalos para los cuales la unción cambia de
signo, se usa el primer intervalo +0.5500 y +1.1000 para probar el programa de ejer02.cpp y
obtener la primer raíz. Para eso se escribe la función en la cabecera #define al igual que en el
programa de ejemplo01.cpp y se corre el programa para un criterio de convergencia de 0.0001
y 20
iteraciones.

FIEE- UNMSM 42
Divide dos polinomios
• El polinomio es :
• 𝐹 𝑥 = 𝑥 3 − 4.23603𝑥 2 − 2.73620𝑥 − 1309037
• Se ejecuta el programa ejer03.cpp. El cual pide tanto los grados como
los coeficientes del divisor y del dividendo y muestra el cociente y el
residuo. Se tiene que especificar si un coeficiente es cero (En
• dado caso).

FIEE- UNMSM 43
Escuela de Estudios Generales - UNMSM 44
FIEE- UNMSM 45
Método de la regla falsa
• Un método alternativo que aprovecha esta visualización gráfica
consiste en unir f(xl) y f(xu) con una línea recta. La intersección de
esta línea con el eje de las x representa una mejor aproximación de la
raíz.
• El hecho de que se reemplace la curva por una línea recta da una
“falsa posición” de la raíz; de aquí el nombre de método de la falsa
posición, o en latín, regula falsi. También se le conoce como método
de interpolación lineal

FIEE- UNMSM 46
Gracias

Escuela de Estudios Generales - UNMSM 47

También podría gustarte