La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Programación 2 Unidad 01 - Conceptos Básicos de Programación Orientada a Objetos y Entorno Visual.

Presentaciones similares


Presentación del tema: "Programación 2 Unidad 01 - Conceptos Básicos de Programación Orientada a Objetos y Entorno Visual."— Transcripción de la presentación:

1 Programación 2 Unidad 01 - Conceptos Básicos de Programación Orientada a Objetos y Entorno Visual

2 Entorno Visual Permite:
Al programador aplicar conceptos necesarios para diseñar y desarrollar aplicaciones  con un entorno visual amigable y fácil de utilizar para el usuario. Los lenguajes visuales tienden a facilitar la tarea de los programadores, dado que con los primeros lenguajes de programación crear una ventana era tarea de meses de desarrollo y de un equipo de trabajo

3 Programación Orientada a Eventos:
Entorno Visual Programación Orientada a Eventos: Permite interactuar con el usuario en cualquier momento de la ejecución. Esto se consigue debido a que los programas creados bajo esta arquitectura se componen de un mecanismo permanente encargado de recoger los eventos, y distintos procesos que se encargan de tratarlos. Este mecanismo permanece oculto al programador que simplemente se encarga de tratar los eventos.

4 Entorno Visual

5 Entorno Visual Controles:
Permiten que la aplicación interactúe con el usuario Botones TextBox ListBox ComboBox PictureBox….

6 Crear Proyectos Windows Forms
Entorno Visual Crear Proyectos Windows Forms En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto…. En el panel Tipos de proyecto, seleccione CLR en el nodo Visual C++ y, a continuación, elija Aplicación de Windows Forms en el panel Plantillas. Escriba un nombre para el proyecto, por ejemplo winformsapp. Puede aceptar la ubicación predeterminada, escribir una ubicación o buscar un directorio donde desee guardar el proyecto. El Diseñador de Windows Forms se abre y muestra la ventana Form1 del proyecto creado.

7 Agregar Controles al Formulario
Entorno Visual Agregar Controles al Formulario Si no puede ver la ventana Cuadro de herramientas, abra el menú Ver y haga clic en Cuadro de herramientas. Coloque tres controles del Cuadro de herramientas en la superficie de diseño Form1

8 Memoria Dinámica Objetivos de la Clase: Asignación de memoria dinámica
New - Delete NULL

9 Memoria de la computadora
Existen 3 tipos de memoria: Memoria estática Los objetos son creados al comenzar el programa y destruidos sólo al finalizar el mismo. Mantienen la misma localización en memoria durante todo el transcurso del programa. (Ej. Variables globales) Memoria automática Los objetos son creados al entrar en el bloque en que están declarados, y se destruyen al salir del bloque. Se trata de un proceso dinámico pero manejado de modo automático por el compilador. (Ejemplo. Funciones) Memoria dinámica En este caso tanto la creación como destrucción de los objetos está en manos del programador.

10 Memoria dinámica “La memoria dinámica es un espacio de almacenamiento que se solicita en tiempo de ejecución. De esa manera, a medida que el proceso va necesitando espacio para más líneas, va solicitando más memoria al sistema operativo para guardarlas” (1). El medio para manejar la memoria que otorga el sistema operativo, es el puntero. (1) tml

11 Memoria dinámica Zona Estática Pila Zona dinámica (Heap) Límite de la Zona Estática Límite de la Pila Puntero de la Pila (Stack pointer) Texto del Programa Datos Estáticos Cuando el sistema operativo carga un programa para ejecutarlo y lo convierte en proceso, le asigna cuatro partes lógicas en memoria principal: texto, datos (estáticos), pila y una zona libre (o heap) . Esta zona libre es la que va a contener los datos dinámicos, la cual, a su vez, en cada instante de la ejecución tendrá partes asignadas a los mismos y partes libres que fragmentarán esta zona, siendo posible que se agote si no se liberan las partes utilizadas ya inservibles. La pila también varía su tamaño dinámicamente, pero la gestiona el sistema operativo, no el programador.

12 En resumen… Ejemplos: int x; Int A[20][10]; Memoria Estática
Memoria Dinámica Es asignada por el compilador al inicio del programa y liberado al término del mismo. Ejemplos: int x; Int A[20][10]; Debe ser asignada y liberada por el programador luego de haber cumplido su función.

13 ¿Por qué usar punteros? Para poder emplear variables dinámicas es necesario emplear un tipo de dato que permita referenciar nuevas posiciones de memoria que no han sido declaradas a priori y que se van a crear y destruir en tiempo de ejecución.

14 Asignación de memoria dinámica

15 Asignación de memoria dinámica
Para manejar la memoria dinámicamente podemos utilizar los siguientes comandos: New – Delete Definidos en la librería <stdio.h>

16 New y Delete Solo en C++ stdio.h

17 New Permite reservar memoria dinámicamente y asignarla a una variable de tipo puntero. Sintaxis TipoDato *nombrePuntero; nombrePuntero = new TipoDato; Ejemplo int *variableA; variableA = new int; Ejemplo 2 int *variableA = new int;

18 Delete Permite liberar la memoria reservada con new.
SIEMPRE que exista un new debe existir un delete correspondiente. Sintaxis delete nombrePuntero; Ejemplo delete variableA; IMPORTANTE: Una vez liberada la memoria ya no se podrá acceder a ella por lo que es necesario que se libere cuando ya no será utilizada.

19 Cómo funciona New – (1/7) Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Pila Supongamos que la memoria se encuentra como en el dibujo. Analizaremos únicamente la Zona estática y el Heap… El color blanco representa espacios de memoria libre y las de color representan espacios de memoria ocupados.

20 Cómo funciona New – (2/7) Y queremos realizar lo siguiente:
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Y queremos realizar lo siguiente: Definir un puntero a float llamado ptrFloat. Asignar dinámicamente el espacio de memoria donde se almacenará el dato float que apuntará el puntero.

21 Cómo funciona New – (3/7) Definir un puntero a float llamado ptrFloat.
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Definir un puntero a float llamado ptrFloat. float * ptrFloat; En este caso la variable ptrFloat es una variable estática, por lo tanto ocupará una posición de memoria dentro de la zona estática.

22 Cómo funciona New – (4/7) float *ptrFloat; Mediante un algoritmo de selección se busca un espacio en memoria para alojar al puntero. Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap ptrFloat = ??? Imaginemos que el espacio de color rojo es el asignado para alojar a la variable ptrfloat.

23 Cómo funciona New – (5/7) Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Asignar dinámicamente el espacio de memoria donde se almacenará el dato float que apuntará el puntero. ptrFloat = new float; En este caso al ser una asignación dinámica se le asignará un espacio dentro del Heap. ptrFloat = ???

24 Cómo funciona New – (6/7) Mediante un algoritmo de selección se busca un espacio de memoria suficiente para alojar un dato según el tipo al que apunta el puntero. Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap ptrFloat = 78B1 ptrFloat = ??? En este caso se ha definido que el espacio de memoria 78B1 es el adecuado para guardar el dato. ??? El valor 78B1 se almacena en la variable ptrFloat conectando así al puntero con el espacio en memoria.

25 Cómo funciona New – (7/7) Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Por último, si deseamos asignarle un valor al dato apuntado tendríamos que hacerlo de la siguiente forma: *ptrFloat = 18.50 78B1 ptrFloat 18.50

26 Cómo funciona Delete – (1/2)
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Del ejemplo anterior se tenía lo siguiente: Mediante el comando New se había asignado dinámicamente el espacio de memoria al puntero llamado ptrFloat. Cuando el puntero ya no sea usado durante la ejecución del programa, tendremos que liberar la memoria que fue asignada. 78B1 ptrFloat 18.50

27 Cómo funciona Delete – (2/2)
Para liberar la memoria reservada utilizaremos el siguiente comando: delete ptrFloat; Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap 78B1 ptrFloat Este comando libera la memoria reservada, y rompe el enlace entre el puntero y la memoria que guarda el dato almacenado. Se dice que el puntero deja de “apuntar” a la dirección de memoria. 18.50

28 Ejemplos New y Delete

29 Ejemplo 1 Asignarle memoria dinámica a un puntero a un dato de tipo int, luego asignarle el valor de 5 e imprimirlo por pantalla. void main() { int *A; A = new int; *A = 5; printf("El dato es %d\n", *A); delete A; getch(); }

30 Ejemplo 2 Asignarle memoria dinámica a dos punteros float, asignarle un valor, sumarlos y presentar el resultado por pantalla. void main() { float *B, *C; B = new float; C = new float; *B = 16.4; *C = 3.2; printf("La suma de %.2f y %.2f es %.2f\n", *B, *C, *B + *C); delete B; delete C; getch(); }

31 Resuelva el ejercicio declarando dos punteros a enteros.
Ejemplo 3 Realice un programa que permita leer dos números enteros desde el teclado, e imprima la suma, diferencia y el producto de ellos. Resuelva el ejercicio declarando dos punteros a enteros. void main() { int *A = new int; int *B = new int; printf("Ingrese el primer numero: "); scanf("%d", A); printf("Ingrese el segundo numero: "); scanf("%d", B); printf("\n\nRESULTADOS\n \n"); printf("Suma: %d\n", *A + *B); printf("Diferencia: %d\n", *A - *B); printf("Producto: %d\n", *A * *B); delete A; delete B; getch(); }

32 NULL Definición La importancia de NULL al utilizar New
La importancia de NULL al momento de declarar La importancia de NULL al utilizar Delete

33 NULL - Definición Es una constante que se aplica, especialmente, a los punteros para indicar que estos no apuntan a ningún valor. Sintaxis TipoDato *nombrePuntero nombrePuntero = NULL Ejemplo 1 int *pA; pA = NULL; Ejemplo 2 int *pA = NULL; NOTA: No olvide de asignarle un espacio de memoria al puntero antes de utilizarlo.

34 Al momento de utilizar New
Importancia de NULL Al momento de utilizar New

35 La importancia de NULL al utilizar New
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Pila Imaginemos que la memoria se encuentra como en el dibujo. Analizaremos únicamente la Zona estática y el Heap… El color blanco representa espacios de memoria libre y las de color representan espacios de memoria ocupados.

36 La importancia de NULL al utilizar New
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Y queremos realizar lo siguiente: Definir un puntero a float llamado ptrFloat. float * ptrFloat; Asignar dinámicamente el espacio de memoria donde se almacenará el dato float que apuntará el puntero. ptrFloat = new float;

37 La importancia de NULL al utilizar New o Malloc
float *ptrFloat; Mediante un algoritmo de selección se busca un espacio en memoria para alojar al puntero. Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap ptrFloat = ??? Imaginemos que el espacio de color rojo es el asignado para alojar a la variable ptrfloat.

38 La importancia de NULL al utilizar New
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Asignar dinámicamente el espacio de memoria donde se almacenará el dato float que apuntará el puntero. ptrFloat = new float; En este caso al ser una asignación dinámica se le asignará un espacio dentro del Heap. ptrFloat = ???

39 La importancia de NULL al utilizar New
Mediante un algoritmo de selección se busca un espacio de memoria suficiente para alojar un dato según el tipo al que apunta el puntero. En este caso no se ha podido encontrar espacio suficiente en la memoria dinámica por lo que se le asigna el valor de NULL a la variable ptrFloat. Esto indica que la variable ptrFloat no apunta a ningún lugar por lo que se considera que no tiene espacio reservado. Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap ptrFloat = NULL ptrFloat = ??? NULL NOTA: El funcionamiento de NULL es igual para New que para Malloc

40 Al momento de declarar punteros
Importancia de NULL Al momento de declarar punteros

41 La importancia de NULL al momento de declarar
Cuando declaramos variables, es recomendable inicializarlas para eliminar posibles errores. Por ejemplo cuando declaramos int A; es posible que el valor de A sea 256 o cualquier otra cosa ya que no necesariamente comienza con un valor de 0. Para evitar estos errores por lo general después de declarada la variable la inicializamos con un valor como por ejemplo A = 10;

42 La importancia de NULL al momento de declarar
Lo mismo sucede con los punteros. Al declarar int *pA; el valor de pA puede ser cualquier cosa, inclusive puede ser una dirección de memoria que no nos corresponde por lo que si intentamos acceder a dicha memoria obtendremos un error. Es por esta razón que es importante inicializar el valor del puntero y por esa razón colocamos inmediatamente el valor que nos otorga New que puede ser una dirección de memoria o NULL. pA = new int;

43 La importancia de NULL al momento de declarar
Si por alguna razón no se reservará la memoria para el puntero de forma inmediata o nunca (si es un puntero para manipular variables) deberíamos colocarle inmediatamente la dirección de memoria a donde queremos que apunte. Si no deseamos que apunte a ningún lado por el momento debemos colocarle el valor de NULL.

44 Al momento de liberar la memoria usando delete
Importancia de NULL Al momento de liberar la memoria usando delete

45 La importancia de NULL al utilizar delete
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap Del ejemplo anterior se tenía lo siguiente: Mediante el comando New se había asignado dinámicamente el espacio de memoria al puntero llamado ptrFloat. Cuando el puntero ya no sea usado durante la ejecución del programa, liberábamos la memoria utilizando del comando delete. 78B1 ptrFloat 18.50

46 La importancia de NULL al utilizar delete
Zona Estática 7851 7855 7864 7868 7899 78A1 78A9 78B1 78F0 78F8 Zona dinámica o Heap El problema surge que ahora la variable ptrFloat ya no apunta al espacio de memoria y tampoco existe memoria reservada para esta variable. Sin embargo la variable ptrFloat aún contiene la dirección de memoria 78B1 por lo que si alguien realiza la siguiente operación: if (ptrFloat != NULL) printf(“ptrFloat tiene datos”); Se imprimirá que aún tiene datos para dicha variable cuando esto ya no es cierto. Es por esta razón que es recomendable colocar NULL al puntero después de un delete o free. 78B1 ptrFloat

47 Ejemplos NULL

48 Ejemplo 1 Declarar una variable entera de forma dinámica y en caso de que se pueda reservar el espacio necesario, solicitar un numero y mostrar el valor incrementado en 5. En caso de no poder reservar el espacio necesario mostrar un mensaje de error. #include <stdio.h> #include <conio.h> void main() { int *A; A = new int; if (A == NULL) printf("No se pudo asignar la memoria..."); else printf("Ingrese un valor entero: "); scanf("%d", A); *A = *A + 5; printf("El valor entero incrementado en 5 es : %d", *A); delete A; } getch();

49 Demostrar la importancia de NULL.
Ejemplo 2 Demostrar la importancia de NULL. Mostrar que al declarar un puntero apunta a una dirección cualquiera. Mostrar que al utilizar New o Malloc el puntero apunta a otra dirección de memoria. Mostrar que al liberar la memoria mediante delete o free, el puntero sigue manteniendo la misma dirección de memoria. #include <stdio.h> #include <conio.h> void main() { int *ptr; printf("ptr apunta a la direccion: %p\n", ptr); ptr = new int; printf("ptr despues de new apunta a la direccion: %p\n", ptr); delete ptr; printf("ptr despues de delete apunta a la direccion: %p\n", ptr); if (ptr == NULL) printf("Ya se libero la memoria"); else printf("No se ha liberado nada"); getch(); }

50 Se le puede asignar dinámicamente la memoria a un arreglo???
La respuesta es SI.

51 Arreglos como punteros
Programación Unidad 1 - Memoria Dinámica Arreglos como punteros Supongamos que tenemos la siguiente variable: Tipodato *Nombrepuntero; Usando New sería de la siguiente forma: Nombrepuntero=new Tipodato[cantidad];

52 Arreglos como punteros
Imaginemos que la memoria se encuentra de esta forma: Analizaremos únicamente la Zona Estática y el HEAP… El color blanco representa espacios de memoria libre y el color rojo espacios de memoria ocupado

53 Arreglos como punteros
Y queremos realizar lo siguiente: Definir un puntero a float llamado ptrfloat float * ptrfloat; Asignar dinámicamente los espacio de memoria donde se almacenarán los 10 datos float. ptrfloat=new float[10]; Programación Unidad 1 - Memoria Dinámica

54 Como funciona New float * ptrfloat;
Definir un puntero a float llamado ptrfloat float * ptrfloat; En este caso la variable ptrfloat es una variable estática, por lo tanto ocupará una posición de memoria dentro de la zona estática.

55 Arreglos como punteros
float * ptrfloat; Mediante un algoritmo de selección se busca un espacio de memoria para alojar al puntero Imaginemos que el espacio de color azul es el asignado para alojar a la variable ptrfloat

56 Arreglos como punteros
Asignar dinámicamente los espacio de memoria donde se almacenarán los 10 datos float. ptrfloat=new float[10]; Al ser una asignación dinámica se le asignará un espacio dentro del HEAP

57 Arreglos como punteros
78B1 78A1 Mediante un algoritmo de selección se busca 10 espacios continuos de memoria para alojar los 10 datos según el tipo al que apunta el puntero En este caso se ha definido que a partir del espacio 78A1 existen los espacios de memoria requeridos

58 Arreglos como punteros
Ejemplo Asignarle memoria dinámica a un puntero a un dato del int de 100 posiciones. void main() {int *Arreglo; Arreglo= new int[100]; for (int i=0;i<100;i++) Arreglo[i]=i; printf(“%d \n”,Arreglo[i]); ….. }

59 Arreglos como punteros
Y si se le asignó dinámicamente la memoria a un arreglo, cómo se libera????

60 Arreglos como punteros
Si hemos utilizado new para asignar debemos utilizar Delete para liberar Delete [ ] Nombrepuntero; Debemos anteponer los corchetes al nombre de la variable del tipo puntero

61 Ejercicio 1 Escribir un programa que permita almacenar N datos, que representan los montos de venta realizados por día en Pizza Hut. Estos datos se deberán almacenar en un vector dinámico, dimensionado de acuerdo al valor de N que se ingresa como dato. El programa deberá hallar e imprimir: La venta promedio Formar un nuevo vector dinámico con los valores de venta que estén por encima del promedio y luego imprimir estos valores. Hallar e imprimir el monto de la mayor venta.

62 Ejercicio 2 Escribir un programa que permita generar N valores enteros al azar, y luego con estos datos permita realizar lo siguiente: Formar un nuevo vector, en donde figuren todos los números que sean múltiplos de 2 Formar un nuevo vector, en donde figuren todos los números que sean múltiplos de 3 Formar un nuevo vector, en donde figuren todos los números primos. Los vectores, se crearan dinámicamente y se hará un buen uso de la memoria .

63 Random: Para generar números al azar, se debe crear un objeto de la clase Random: System::Random ^Azar = gcnew System::Random(System::DateTime::Now.Ticks); Luego se puede crear los valores aleatorios: x= Azar->Next(); x= Azar->Next(5); x = Azar->Next(1,5);


Descargar ppt "Programación 2 Unidad 01 - Conceptos Básicos de Programación Orientada a Objetos y Entorno Visual."

Presentaciones similares


Anuncios Google