Title: Tipos de Datos Abstractos (IV)
1Tipos de Datos Abstractos (IV)
- Clase 24
- Introducción a la Programación
2Resumen de la última clase
- Implementamos el sistema manejador de CDs y
cassettes - TDA Registro CrearRegistro, TituloRegistro, ,
InterpreteRegistro, RegistroVacio,
ImprimirRegistro - TDA Lista CrearLista, Insertar, Primero,
Siguiente, Imprimir, BuscarT, BuscarI, Borrar - Implementamos el TDA de números complejos
3Ejercicio TDA que maneje objetos gráficos
- Objetos a manejar
- Puntos, Rectas, Cuadriláteros, CÃrculos
- Operaciones para cada objeto
- Crear, Desplazar
- Programa principal, lee de un archivo con el
siguiente formato2100 50 50 400
350320 180 175 0 02300 200 600
200 600 300 300 300 -250 15050
200 100 300 100 50 50 140 0
0 - Supuesto, la librerÃa graph.h tiene las
funciones - begin_graficos()
- punto(x,y)
- end_graficos
4TDA de manejo de figuras geométricasDefinición
de tipos de datos
/ Estructura del TDA Circulo / typedef struct
PUNTO centro int radio CIRCULO /
Estructura del TDA Cuadrilatero / typedef struct
LINEA L1 LINEA L2 LINEA L3 LINEA
L4 CUADRILATERO
include "graph.h" include ltmath.hgt include
ltstdio.hgt define MAX_FIGURAS 10 / Definicion
de estructuras para los TDA's / / Estructura
del TDA Punto / typedef struct int x
int y PUNTO / Estructura del TDA Linea
/ typedef struct PUNTO p1 PUNTO p2
LINEA
5TDA de manejo de figuras geométricasConstructore
s y Selectores
PUNTO DesplazarPunto(PUNTO P, int DespX, int
DespY) PUNTO P1 P1.x P.x DespX
P1.y P.y DespY return(P1) LINEA
CrearLinea(PUNTO p1, PUNTO p2) LINEA L if
(Xpunto(p1) lt Xpunto(p2)) L.p1 p1
L.p2 p2 else L.p1 p2
L.p2 p1 return(L)
PUNTO CrearPunto(int x, int y) PUNTO P
P.x x P.y y return(P) void
DibujarPunto(PUNTO P) punto(P.x,
P.y) int Xpunto(PUNTO P)
return(P.x) int Ypunto(PUNTO P)
return(P.y)
6TDA de manejo de figuras geométricasConstructore
s y Selectores (2)
void DibujarLinea(LINEA L) float m, b
int x, y if (Xpunto(L.p1) ! Xpunto(L.p2))
m (float)(Ypunto(L.p2)-Ypunto(L.p1))/(Xpunt
o(L.p2)-Xpunto(L.p1)) b
Ypunto(L.p1)-(mXpunto(L.p1))
for (xXpunto(L.p1) xltXpunto(L.p2) x)
y (int)(mxb)
DibujarPunto(CrearPunto(x,y))
else if (Ypunto(L.p2) gt Ypunto(L.p1))
for (yYpunto(L.p1) yltYpunto(L.p2) y)
DibujarPunto(CrearPunto(Xpunto(L.p1),y))
else for (yYpunto(L.p2)
yltYpunto(L.p1) y)
DibujarPunto(CrearPunto(Xpunto(L.p1),y))
7TDA de manejo de figuras geométricasConstructore
s y Selectores (3)
LINEA DesplazarLinea(LINEA L, int DespX, int
DespY) LINEA L1 L1.p1
DesplazarPunto(L.p1, DespX, DespY) L1.p2
DesplazarPunto(L.p2, DespX, DespY)
return(L1) CIRCULO CrearCirculo(PUNTO c, int
r) CIRCULO C C.centro c C.radio r
return(C) void DibujarCirculo(CIRCULO C)
float angulo, paso int x, y paso
(2PI)/(2PIC.radio) for (angulo0
angulolt360 anguloangulopaso) x
(int)(Xpunto(C.centro)C.radiocos(angulo))
y (int)(Ypunto(C.centro)C.radiosin(angulo))
DibujarPunto(CrearPunto(x,y))
CIRCULO DesplazarCirculo(CIRCULO C, int
DespX, int DespY) CIRCULO C1 C1.radio
C.radio C1.centro DesplazarPunto(C.centro,
DespX, DespY) return(C1)
8TDA de manejo de figuras geométricasConstructore
s y Selectores (3)
CUADRILATERO CrearCuadrilatero(PUNTO p1, PUNTO
p2, PUNTO p3, PUNTO p4) CUADRILATERO T
T.L1 CrearLinea(p1,p2) T.L2
CrearLinea(p2,p3) T.L3 CrearLinea(p3,p4)
T.L4 CrearLinea(p4,p1) return(T) void
DibujarCuadrilatero(CUADRILATERO T)
DibujarLinea(T.L1) DibujarLinea(T.L2)
DibujarLinea(T.L3) DibujarLinea(T.L4) CUADRILA
TERO DesplazarCuadrilatero(CUADRILATERO T, int
DespX, int DespY) CUADRILATERO T1 T1.L1
DesplazarLinea(T.L1, DespX, DespY) T1.L2
DesplazarLinea(T.L2, DespX, DespY) T1.L3
DesplazarLinea(T.L3, DespX, DespY) T1.L4
DesplazarLinea(T.L4, DespX, DespY)
return(T1)
9int LeerCirculos(FILE fp, CIRCULO Circulos)
int N, i, NumC, x, y, r, xDesp, yDesp
fscanf(fp, "d", N) NumC 0 for (i0
iltN i) fscanf(fp,"d d
d",x,y,r) fscanf(fp,"d
d",xDesp,yDesp) CirculosNumC
CrearCirculo(CrearPunto(x,y),r) NumC
if (xDespgt0 yDespgt0)
CirculosNumC DesplazarCirculo(CirculosNumC-1
,xDesp,yDesp) NumC
return(NumC) int LeerCuadrilateros(FILE fp,
CUADRILATERO Cuadrilateros) int N, i, j,
NumT, x, y, xDesp, yDesp PUNTO p4
fscanf(fp,"d", N) NumT 0 for (i0
iltN i) for (j0 jlt4 j)
fscanf(fp, "d d", x, y) pj
CrearPunto(x,y) fscanf(fp,"d
d",xDesp,yDesp) CuadrilaterosNumT
CrearCuadrilatero(p0,p1,p2,p3)
NumT if (xDespgt0 yDespgt0)
CuadrilaterosNumT DesplazarCuadrilatero(Cuadri
laterosNumT-1,xDesp,yDesp) NumT
return(NumT)
10main(int argc, char argv) int i int
NumCirculos, NumCuadrilateros FILE fp
CIRCULO CirculosMAX_FIGURAS CUADRILATERO
CuadrilaterosMAX_FIGURAS if (argc ! 2)
printf("Uso s archivo\n", argv0)
exit(1) fp fopen(argv1,"r") if
(fp NULL) printf("Error abriendo el
archivo s\n", argv1) exit(1)
NumCirculos LeerCirculos(fp, Circulos)
NumCuadrilateros LeerCuadrilateros(fp,
Cuadrilateros) fclose(fp)
begin_graficos() i 0 while (i lt
NumCirculos) DibujarCirculo(Circulosi
) i i 0 while (i
lt NumCuadrilateros) DibujarCuadrilatero
(Cuadrilaterosi) i
end_graficos()
11/include ltstdio.hgt typedef struct float
real float im Complejo Complejo
CrearComplejo(float r, float i) Complejo
aux aux.realr aux.imi return(aux)
Complejo sumaC(Complejo c1, Complejo c2)
Complejo c3 c3.realc1.real
c2.real c3.imc1.im c2.im return(c3) Co
mplejo restaC(Complejo c1, Complejo c2)
Complejo c3 c3.realc1.real -
c2.real c3.imc1.im - c2.im return(c3) Co
mplejo multiplicaC(Complejo c1, Complejo c2)
Complejo c3 c3.realc1.realc2.real-c1.imc2.im
c3.imc1.imc2.im return(c3) void
ImprimirComplejo(Complejo c) printf("Real f
Im f\n", c.real, c.im) float
RetornaParteIm(Complejo c) return(c.im) Com
plejo CompletaParteIm(float im, Complejo c)
Complejo aux aux.realc.real aux.imim r
eturn(aux) Complejo CompletaParteIm(float im,
Complejo c) Complejo aux aux-gtrealc.real
aux-Complejo CompletaParteIm(float im,
Complejo c) Complejo aux aux.realc.real
aux.imim return(aux) gtimim return(aux)
void main() int respuesta Complejo
c1,c2,c3 c1 CrearComplejo(3,4) c2
CrearComplejo(5,6) //c3 obtiene el
valor de la parte im de c2 c3CompletaParteIm(c3,
RetornaParteIm(c2)) printf("La parte
Imaginaria de c3 es f", RetornaParteIm(c3)) p
rintf("\nQue desea hacer con los numeros
complejos ingresados?\n") printf("suma1
resta2 multiplicacion3 ") scanf("d",
respuesta) if(respuesta1) c3
sumaC(c1,c2) ImprimirComplejo(c3)
if(respuesta2) c3 restaC(c1,
c2) ImprimirComplejo(c3)
if(respuesta3) c3
multiplicaC(c1, c2) ImprimirComplejo(c3)
/ / typedef struct int dia int
mes int anho TipoFecha typedef
struct char tipoClima100 float
minTemp float maxTemp float
humedad TipoFecha dia TipoClimaDiario char
caluroso"Caluroso" char normal"Normal" cha
r tempestoso"Tempestoso" TipoFecha
NuevaFecha(int d, int m, int a) TipoFecha
aux aux.diad aux.mesm aux.anhoa retu
rn(aux) char ClasificadorClima(TipoClimaDiar
io aux) if(aux.humedad gt80) return
(caluroso) if(aux.minTemp lt10) return
(tempestoso) else return (normal) TipoCli
maDiario NuevoClima(float minT, float
maxT, float hum, TipoFecha f)
TipoClimaDiario aux aux.diaf aux.maxTempma
xT aux.minTempminT aux.humedadhum
strcpy(aux.tipoClima,ClasificadorClima(aux)) r
eturn(aux) void ImprimirFecha(TipoFecha
fecha) printf("Fecha es d d d ",
fecha.dia, fecha.mes, fecha.anho) void
ImprimirClima(TipoClimaDiario clima) ImprimirFe
cha(clima.dia) printf(" Clima es f f
f\n",clima.minTemp, clima.maxTemp, clima.humedad
) TipoFecha NuevaFechaPantalla()
TipoFecha aux printf("\nIngrese
dia") scanf("d", aux.dia) printf("\nIng
rese anho") scanf("d", aux.anho) printf
("\nIngrese mes") scanf("d",
aux.mes) return(aux) void main()
TipoClimaDiario clima TipoFecha fecha,
fecha2 fechaNuevaFecha(24,5,2004)
fecha2NuevaFechaPantalla() climaNuevoClima(2.
5, 14.5, 20, fecha2) ImprimirClima(clima)