Documente Academic
Documente Profesional
Documente Cultură
Laboratorios de computación
salas A y B
Profesor: Ing. Jonathan Roberto Torres Castillo
Grupo: 9
No de Práctica(s): 4
Semestre: 2018-II
Fecha de entrega:
Observaciones:
CALIFICACIÓN: _________
1
PRACTICA 4
ALMACENAMIENTO EN TIEMPO DE EJECUCIÓN
ESTRUCTURA DE DATOS Y ALGORITMOS I
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
2. Objetivos
Utilizarás funciones en lenguaje C que permiten reservar y almacenar información de
manera dinámica (en tiempo de ejecución).
3. Introducción
La memoria dinámica se refiere al espacio de almacenamiento que se reserva en tiempo de
ejecución, debido a que su tamaño puede variar durante la ejecución del programa.
El uso de memoria dinámica es necesario cuando a priori no se conoce el número de datos y/o
elementos que se van a manejar.
2
Licencia GPL de GNU
El software presente en esta guía práctica es libre bajo la licencia GPL de
GNU, es decir, se puede modificar y distribuir mientras se mantenga la
licencia GPL. /*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
<http://www.gnu.org/licenses/>.
*
* Author: Jorge A. Solano
*/
4.1. Actividad 1
Transcriba y compile el código que se encuentra en el anexo 1. Luego comente cada una de
las líneas de código. Describa brevemente en este apartado lo que realizar el programa.
El programa te pide el número de puntos del polígono y reserva una cantidad de datos
principal a la memoria con la función malloc, posteriormente te pide ingresar las
coordenadas de cada punto en 2d, una en x y otra en y así como te muestra la dirección
de memoria de cada uno de estos puntos, al final libera la memoria asignada con la
función free()
3
4.2. Actividad 2
Tomando como referencia el código anterior modifique el código que desarrolló en la tarea
1, para que en lugar de usar vectores tipo ‘point’ emplee memoria dinámica a partir de las
estructuras ‘point’.
El programa debe pedirle al usuario la cantidad de puntos del polígono (cuadrado, rectángulo,
triangulo, etc), dato que servirá para separar el espacio de memoria exacto en donde van a
ser almacenados. Luego debe pedir la coordenada ‘x’ e ‘y’ de cada punto (pueden tener
decimales) y guardarlos usando el apuntador de la memoria asignada.
Como resultado el programa identificara si el polígono a evaluar corresponde a un cuadrado,
un triángulo, un rectángulo o no corresponden a ninguno de estos.
Nota: No se debe emplear ningún tipo de vector y las funciones deben usar únicamente
parámetros por referencia.
4
(0.00, 0.00) (0.00, 0.00) (0.00, 0.00)
(0.50, 0.00) (10.00, 0.00) (5.00, 2.50)
(0.50, 0.50) (10.00, 5.00) (0.00, 5.00)
(0.00, 0.50) (0.00, 5.00) (-5.00, 2.50)
En esta sección se presenta el código fuente del programa que permitió cumplir los
objetivos propuestos. El programa debe estar comentado en cada una de sus líneas de código
y/o en sus ciclos iterativos.
/** Y coordinate */
float y;
/**
* Prints the point
*/
void print(Point *p);//crea un puntero point
// --------------------------------------------------------------------------
// -------------------------------- Main ----------------------------------
// --------------------------------------------------------------------------
int main()
{
5
unsigned short num_puntos, cont;//define un dato tipo entero unsigned short
Point *P;
// Solicita las coordenadas de cada punto del poligono y lo almacena por medio de
apuntadores
printf("\n\tIngrese las coordenadas de cada punto:\n\t");
for (cont=0 ; cont<num_puntos ; cont++){
printf("\n\tCual es la coordenada x del punto %d?\n\t",cont+1);//pide una
cooordenada en x
scanf("%f",&(P+cont)->x);//guarda en el apuntador x la variable
printf("\n\tCual es la coordenada y del punto %d?\n\t",cont+1);//pide una
coordenada en y
scanf("%f",&(P+cont)->y);//guarda en el apuntador y la variable
}
// Accede a la memoria separada por medio de apuntadores para obtener los puntos
almacenados
// Se imprime en pantalla las coordenadas de cada punto y la direccion donde se
encuentra almacenado
for (cont=0 ; cont<num_puntos ; cont++){ //con el cilo iterativo repite la instruccion
para el num de puntos
printf("\n\n\tEl punto %d es: ",cont+1);
printf(&((P+cont)->x));//nos dice el punto que es en cada iteracion
printf("\testa almacenado en la direccion %p.",(P+cont));//nos manda la dirreccion
del punto
printf("\n\tLa coordenada x del punto %d es: ",cont+1);//imprime la coordenada del
punto x
printf("%f \n\ty esta almacenado en la direccion %p.",((P+cont)->x),&(P+cont)-
>x);//imptime la direeccion del punto x en la memoria
printf("\n\tLa coordenada y del punto %d es: ",cont+1);//imprime la coordenada del
punto y
printf("%f \n\ty esta almacenado en la direccion %p.",((P+cont)->y),&(P+cont)-
>y);//imprime la direccion de la memoria
}
6
printf("\n\nSe libera el espacio reservado.\n");
free(P);//con esta funcion se libera el espacio para ser reutilizado
}
return 0;//retorna 0
// --------------------------------------------------------------------------
void print(Point *p)//crea la funcion imprimir
{
printf("(%0.2f, %0.2f) \n", p->x, p->y);
}
* de los mismos.
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
typedef struct
/** X coordinate */
float x;
7
/** Y coordinate */
float y;
}Point;
/**
*/
/**
*/
/**
*/
// --------------------------------------------------------------------------
8
// --------------------------------------------------------------------------
// --------------------------------------------------------------------------
return x + y;
// --------------------------------------------------------------------------
// --------------------------------------------------------------------------
// --------------------------------------------------------------------------
typedef struct {
int num_points;
Point *vertex;
}polygon;
9
void is_square(polygon *p);
paral->num_points = 4;
paral->vertex = _vertex;
// --------------------------------------------------------------------------
if(p->num_points == 3)
} else {
// --------------------------------------------------------------------------
if(p->num_points == 4)
10
float d3 = distance(*(p->vertex+2), *(p->vertex+3));
if (dot == 0)
return;
// --------------------------------------------------------------------------
if(p->num_points == 4)
11
//printf("%0.1f, %0.1f \n", d5, d6);
return;
// --------------------------------------------------------------------------
// --------------------------------------------------------------------------
int main()
int i;
// the square
arreglo1->vertex->x=0;
arreglo1->vertex->y = 0;
print((arreglo1+i));
// the rectangle
12
Point r4; r4.x = 0; r4.y = 5;
print(&(R[i]));
// the diamod
print(&(D[i]));
polygon P01;
constructor(&P01, arreglo);
is_triangle(&P01);
is_square(&P01);
is_rectangle(&P01);
13
printf(" --- ---- --- \n");
polygon pr1,*prr;
prr=&pr1;
constructor(prr, &R[0]);
is_triangle(prr);
is_square(prr);
is_rectangle(prr);
int a=4;
para=∥
constructor(para,&D[0]);
is_triangle(para);
is_square(para);
is_rectangle(para);
return 0;
14
5.-Conclusiones
EN ESTA PRACTICA LO QUE ME FUE MAS DIFICIL REALIZAR FUE LA
ACTIDAD 2 QUE CONSISITIO EN CREAR DE LA TAREA EL MISMO
CODIGO OCUPANDO MEMORIA DINAMICA Y EN GENERAL PUDE
APRENDER A UTILIZAR LA ESTRUCTURAS DE MEMORIA DINAMIXA
MALLOC Y COMO UTILIZARLAS, ASI COMO TAMBIEN EL USO DE
MEMORIA DINAMICA PARA LA RESOLUCION DE PROBLEMAS Y
HACIENDO UN USO MAS EFICIENTE DE LA MEMORIA DEL
DISPOSITIVO.
6.-Referencias
[1] GARCÍA CANO, Edgar, SOLANO GÁLVEZ, Jorge, Guía práctica de estudio 4,
Almacenamiento en tiempo de ejecución, Facultad de ingeniería, UNAM.
15
5. Anexo 1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct
{
/** X coordinate */
float x;
/** Y coordinate */
float y;
}Point;
/**
* Prints the point
*/
void print(Point *p);
// --------------------------------------------------------------------------
// -------------------------------- Main ----------------------------------
// --------------------------------------------------------------------------
int main()
{
// Solicita las coordenadas de cada punto del poligono y lo almacena por medio de
apuntadores
printf("\n\tIngrese las coordenadas de cada punto:\n\t");
for (cont=0 ; cont<num_puntos ; cont++){
printf("\n\tCual es la coordenada x del punto %d?\n\t",cont+1);
scanf("%f",&(P+cont)->x);
printf("\n\tCual es la coordenada y del punto %d?\n\t",cont+1);
scanf("%f",&(P+cont)->y);
16
}
// Accede a la memoria separada por medio de apuntadores para obtener los puntos
almacenados
// Se imprime en pantalla las coordenadas de cada punto y la direccion donde se encuentra
almacenado
for (cont=0 ; cont<num_puntos ; cont++){
printf("\n\n\tEl punto %d es: ",cont+1);
print(&((P+cont)->x));
printf("\testa almacenado en la direccion %p.",(P+cont));
printf("\n\tLa coordenada x del punto %d es: ",cont+1);
printf("%f \n\ty esta almacenado en la direccion %p.",((P+cont)->x),&(P+cont)->x);
printf("\n\tLa coordenada y del punto %d es: ",cont+1);
printf("%f \n\ty esta almacenado en la direccion %p.",((P+cont)->y),&(P+cont)->y);
}
printf("\n\nSe libera el espacio reservado.\n");
free(P);
}
return 0;
// --------------------------------------------------------------------------
void print(Point *p)
{
printf("(%0.2f, %0.2f) \n", p->x, p->y);
}
17