Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

INFO088_2018_02

No description
by

Erick Araya

on 13 April 2018

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of INFO088_2018_02

Taller de Ingeniería: Estructura de Datos y Algoritmos
Funciones sin retorno de valores
Funciones Predefinidas en C++
"Casting" de tipos
Ejemplo: Secuencias Aleatorias
Funciones sin retorno de valores
Funciones que retornan valores
C++ provee dos funciones predefinidas para generar secuencias seudo aleatorias:
srand()
y
rand()
Si hay segmentos de código repetido, se recurre a las funciones
FUNCIONES Y ARREGLOS
APUNTE 02
La mayoría requiere el uso de la biblioteca cmath (
#include <cmath>
). Otras funciones, como abs y labs deben usar cstdlib (
#include <cstdlib>
). Las más usadas son:
srand()
define el valor de una "semilla", la cual, si se repite, siempre se generarán las mismas secuencias (por ello, lo de "seudo aleatoria").
rand()
genera números aleatorios entre 0 y RAND_MAX (2147483647)
El código que genera una secuencia de 10 números aleatorios y hace uso de la función time(0) como semilla (siempre será diferente porque time(0) calcula el número de segundos ocurridos desde el 01 de Enero de 1970) será:
Una salida será:
Dividir dos operandos
int
usando
/
genera un resultado entero (ejemplo: 6/4 = 1)
Convertir uno de los operandos a
double
resuelve el problema (Ejemplo: 6.0/4 = 1.5)
También es posible convertir un int en double si se usa el tipo como si fuera una función (Ejemplo:
double
(6)/4 = 1.5). Sin embargo, se espera que las futuras versiones de C++ no contemplen como válida esta opción.
Lo que debe usarse:
static_cast<double>(
valor entero
)
Ejemplo de código:
Para declarar una función sin retorno de valores:
void nombre(){
:
return;
// puede omitirse
}
Formateo de Números Decimales en C++
Use las siguientes sentencias en un programa para formatear un double con 2 decimales. Analice el siguiente ejemplo:
Lo que imprime:
Para declarar una función con retorno de valores (ej:
int
):
int nombre(){
:
return
variable_int
;
}
En esos casos, se usan variables GLOBALES, que son compartidas por main() y las funciones
Ejemplo:
Usando sólo funciones sin retorno de valores (void), escriba un programa en C++ que solicite al usuario indique el número de veces que ha de repetirse la palabra "Hola". No se permite el ingreso de un entero inferior a 2. Un ejemplo de E/S se muestra a continuación:
El main() se muestra a continuación:
leeVeces() valida el entero ingresado
repetidorPalabra() imprime la palabra "Hola" cierto número de veces (valor ingresado por el usuario) en igual número de líneas
Solución:
Variable Global
Funciones sin retorno de valores
Otra forma de escribir la solución es ordenar el código de modo que primero aparezca el main:
Pero marcará error si no declaro las funciones antes
Ejercicio
Repita el ejercicio anterior, sólo que esta vez, para el ingreso del número de repeticiones ha de usar una función con retorno de valor. El main() y la declaración de funciones y variables globales será:
Función que retorna un
int
Funciones que retornan valores
Solución:
Variable local
Variable global
Funciones con parámetros
Uso de Arreglos
Los arreglos permiten almacenar múltiples datos del MISMO TIPO, con un único nombre.
Dos formas para pasar un parámetro:
Paso-por-valor
Paso-por-referencia
Paso-por-valor:
Arreglos en C++
Se hace una copia del valor en la función, sin afectar al valor original
Ejemplo:
Función recibe un valor
Valor incrementado en 20
Valor original
Valor no cambia
Funciones con parámetros
Paso-por-referencia:
Valor pasado a la función al ser modificado por ésta, cambia el valor original. Se antepone
&
al parámetro
Ejemplo:
La salida:
Paso-por-referencia
La salida:
Un ejemplo de declaración:
int Arreglo[3] = {5,10,15};
Al declarar un arreglo se debe definir su tamaño.
Ejemplos de declaración
int arreglo [3];
Si no se ha definido el valor de cada elemento, el contenido a imprimir puede ser variable (depende de la localización de memoria asignada)
Para verificar esto, escriba el siguiente programa simple:
Una vez compilado con make y ejecutado varias veces con ./prog, los resultados se muestran a continuación:
Se recomienda definir los valores de cada elemento cuando se declara el arreglo
Arreglo[0] = 5; Arreglo[1] = 10; Arreglo[2] = 15
Y si quiero imprimir Arreglo?
Se imprime una dirección de memoria (en hexa) donde se inicia el arreglo
Lo anterior es heredado del lenguaje C, que funciona en C++
Otro ejemplo de declaración y asignación:
int Arreglo[3] = {0};
// a cada elemento se le asigna 0
Pero C++ tiene su propio tipo:
std::array
. definido en el archivo de encabezado
<array>
El siguiente ejemplo ilustra la nueva declaración de un arreglo en C++:
Declaración y asignación
Tamaño del arreglo
Si un arreglo se utiliza como un parámetro de una función, en forma directa se está pasando por referencia (sin usar
&
), dado que el nombre del arreglo es la dirección de inicio de éste.
El siguiente ejemplo pasa un arreglo como parámetro, con valores que han de cambiarse al interior de la función.
Arreglos en C++
La salida será:
Solución con Sintaxis alternativa en C++
Recordemos que, desde C++11, se propone un cambio: usar auto como palabra de inicio de una función (incluso main()!) y agregar una flecha que indica el valor de retorno a continuación del nombre de la función
El ejemplo anterior con la nueva sintaxis en C++:
Solución
Solución
Solución
Atributos adicionales de variables y funciones
Ejercicios
Ejercicios
Ejercicios
4. Escriba un programa que genere 20 números aleatorios enteros entre 10 y 99 (ambos inclusive)y los almacene en un arreglo unidimensional de 20 enteros. A continuación ha de solicitar al usuario que ingrese un número cualquiera entre 10 y 99. El programa debe buscar en el arreglo la primera ocurrencia de este número (si existe) e indicar si existe o no en la lista. Finalmente, ha de mostrar la lista generada con los 20 números aleatorios. Algunos ejemplos de E/S se muestran a continuación:
a) Usando declaración convencional de arreglos
Hay que recordar el uso de la función rand(). Para que genere números aleatorios en un rango acotado hay que aplicar el operador módulo (%). Recordemos el main():
El main() propuesto:
b) Usando <array>
Un identificador en C++ (variable, función) tiene más atributos que los conocidos (nombre, tipo, tamaño y valor): La duración de un identificador en memoria y el "enlace"
Atributos de almacenamiento de identificadores C++:
Duración en memoria - "static" y "automatic"
Duración "
automatic
" de variables en memoria: Valor
by default
. Afecta a variables locales declaradas en funciones, y parámetros de funciones.
Duración "
static
" de variables en memoria: Valor fijo. Existen en memoria desde el inicio de la ejecución de un programa y hasta que éste finaliza
Dos tipos de declaración de variables con almacenamiento permanente en memoria (mientras se ejecuta el programa):
extern
(variables globales) y
static
(variables locales)
Solución
3. Escriba un programa que lea 10 enteros y los almacene en un arreglo unidimensional de 10 elementos (inicialmente, el arreglo debe contener sólo ceros y debe mostrarse su contenido). A continuación. el usuario debe ingresar los 10 enteros solicitados, los cuales deben imprimirse una vez ingresados. Para ello, debe usar las funciones
leeNumeros()
que ha de solicitar los 10 elementos y
escribeNumeros()
que ha de imprimir en pantalla los elementos del arreglo. Se solicita encontrar dos soluciones: La primera, usando la declaración de arreglo convencional y la siguiente, usando <array>
Solución
2. Escriba la función calculaFactorial() que, dado un entero ingresado como parámetro, ha de calcular y retornar el factorial del número. Escriba un programa que use la función anterior, junto a las funciones leeNumero() e imprimeResultado() ha de calcular e imprimir en pantalla el factorial de un número ingresado por el usuario. Ejemplos posibles de E/S se muestran a continuación:
Solución
Funciones con parámetros
Ejercicios
5. Escriba un programa que genere 12 números aleatorios enteros entre 10 y 99 (ambos inclusive) y los almacene en un arreglo bidimensional de 4 filas y 3 columnas. El programa ha de imprimir el arreglo generado, así como la suma de sus elementos por fila, como se muestra en el siguiente ejemplo de E/S:
Dos formas para pasar un parámetro:
Paso-por-valor
Paso-por-referencia
Paso-por-valor:
Solución
Se hace una copia del valor en la función, sin afectar al valor original
Ejemplo:
Función recibe un valor
Valor incrementado en 20
Valor original
Valor no cambia
La salida:
Solución
Recordemos el main() entregado:
Sintaxis alternativo en C++
Nuevamente, la sintaxis utilizada hasta ahora ha sido heredada del lenguaje C, que funciona en C++
Desde C++11, se propone un cambio: usar auto como palabra de inicio de una función (incluso main()!) y agregar una flecha que indica el valor de retorno a continuación del nombre de la función
El siguiente ejemplo ilustra la nueva sintaxis en C++:
Ejercicios
1. Escriba la función potenciaEntera(base, exponente) que retorne el valor de
base
exponente
Por ejemplo, potenciaEntera(3,4) = 3*3*3*3 (no debe usarse la biblioteca de funciones matemáticas para la potencia). Asuma que exponente es entero positivo y que base es un entero. Escriba un programa que lea la base y el exponente, invoque la función potenciaEntera() para el cálculo e imprima el resultado en la consola. Un ejemplo de E/S se muestra a continuación:
Se propone el siguiente main():
Ejercicios
Solución:
Ejercicios
Solución:
Arreglos Bidimensionales (Matrices)
Un arreglo bidimensional (2D) tiene filas y columnas (como una matriz de 2 x 2)
Declaración de una matriz en modo convencional:
Declaración de una matriz en modo C++ moderno:
Arreglos Bidimensionales (Matrices)
Sintaxis:
int A[2][3] = {{1,2,3},{4,5,6}};
// matriz de 2 filas y 3 columnas
array<array<int,2>,4> B = {{{5,10},{3,6},{4,8},{7,14}}};
// 4 filas y 2 columnas
La nueva sentencia
for
en C++
Evita la posibilidad de acceder a un elemento no existente de un arreglo
Sintaxis:
La nueva sentencia
for
en C++
Ejemplo:
El programa muestra el contenido inicial de un arreglo y luego muestra el nuevo contenido del arreglo, donde cada elemento ha sido multiplicado por 5. La salida es:
Distribución de un arreglo de 3 x 4:
array<array<
int
,columnas>,filas> nombre;
Si se desea inicializar un arreglo de 4 filas y 3 columnas con 0 para cada uno de los elementos del arreglo.
array<array<
int
,2>,3> nombre = {1,2,1,2,1,2};
array<array<
int
,3>,4> nombre;
Si se desea inicializar un arreglo de 3 filas y 2 columnas con otros valores para cada uno de los elementos del arreglo:
El orden de los elementos va por filas, comenzando desde la primera fila, primera columna. Para el ejemplo anterior, la salida será:
Se propone el siguiente main():
Un ejemplo de E/S:
El main() propuesto para cada solución es:
defineLista()
recibe un arreglo de 20 enteros inicializados en 0 y lo cambia por 20 enteros aleatorios entre 10 y 99
leeValor()
solicita y valida el ingreso de un entero entre 10 y 99 por parte del usuario
buscaNumero()
se encarga de revisar el arreglo de 20 elementos y ver si existe al menos un entero que coincida su valor con el ingresado por el usuario. Retorna un false o true, dependiendo del resultado.
imprimeResultado()
indica si el número ingresado por el usuario se encuentra o no en el arreglo aleatorio
imprimeLista()
escribe el arreglo de 20 enteros aleatorios generado
Para lo anterior, se propone el siguiente main():
El arreglo Matriz es de 2D, donde se almacenarán los 12 enteros aleatorios
El arreglo Columna es de 1D, donde se almacenarán las sumas de cada fila.
defineMatriz()
recibe un arreglo de 4 x 3 enteros inicializados en 0 y lo cambia por otro arreglo de 4 x 3 enteros aleatorios entre 10 y 99
sumaFila()
recibe el arreglo de 4 x 3 enteros aleatorios, además de un arreglo columna inicializado en 0 y retorna el arreglo columna con la suma de cada fila.
imprimeResultado()
recibe el arreglo de 4 x 3 enteros aleatorios, además del arreglo columna con la suma de cada fila e imprime los datos como se muestran en el ejemplo.
Escribe valor en pto. flotante usando notación de punto fijo (http://www.cplusplus.com/reference/ios/fixed/)
Porque uno de ustedes preguntó...
Qué es C#?
Lenguaje orientado a objetos
Lenguaje orientado a objetos desarrollado por Microsoft para la plataforma .net
Raíces en Java, C y C++. Adapta las mejores características de ellos y agrega nuevas, propias de ese lenguaje
Para aplicaciones de escritorio y también para aplicaciones web
Primero se mostrará la solución en el modo convencional y luego usando auto como palabra de inicio de una función
Solución con Sintaxis alternativa en C++
Nuevamente, la sintaxis utilizada hasta ahora ha sido heredada del lenguaje C, que funciona en C++
Desde C++11, se propone un cambio: usar auto como palabra de inicio de una función (incluso main()!) y agregar una flecha que indica el valor de retorno a continuación del nombre de la función
El siguiente ejemplo ilustra la nueva sintaxis en C++:
Variable global
Uso de & para que los cambios se transmitan
Constantes!!
Full transcript