-
Notifications
You must be signed in to change notification settings - Fork 0
/
EP1.c
125 lines (99 loc) · 3.01 KB
/
EP1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct Vertice {
double x;
double y;
struct Vertice *prox;
};
/*
Um polígono é definido como o ponteiro de um Struct de vértice. Afinal, saber a posição de memória de um vértice
permite saber a posição de memória de todos os vértices.
*/
typedef struct Vertice* Poligono;
struct Vertice* CriaVertice() {
double a, b;
scanf("%lf %lf", &a , &b);
struct Vertice *vertice = (struct Vertice*) malloc(sizeof(struct Vertice));
vertice->x = a;
vertice->y = b;
return vertice;
}
void AdicionaVertice(Poligono poligono, struct Vertice* vertice) {
struct Vertice* ultimovertice = poligono;
while (ultimovertice->prox != poligono) {
ultimovertice = ultimovertice->prox;
}
vertice->prox = poligono;
ultimovertice->prox = vertice;
}
void CriaPoligono(int n, Poligono* poligono) {
for (int i = 0; i < n; i++) {
if (i == 0) { /* Vertice inicial */
*poligono = CriaVertice();
(*poligono)->prox = *poligono;
} else {
AdicionaVertice(*poligono, CriaVertice());
}
}
}
void PrintaLista(Poligono poligono) {
struct Vertice* ultimovertice = poligono;
printf("%lf %lf\n", ultimovertice->x, ultimovertice->y);
while (ultimovertice->prox != poligono) {
ultimovertice = ultimovertice->prox;
printf("%lf %lf\n", ultimovertice->x, ultimovertice->y);
}
}
int NumeroDeVertices(Poligono P) {
int numero = 1;
struct Vertice* vertice = P;
while (vertice->prox != P) {
numero += 1;
vertice = vertice->prox;
}
return numero;
}
double Distancia(struct Vertice* A, struct Vertice* B) {
return sqrt((A->x - B->x)*(A->x - B->x) + (A->y - B->y)*(A->y - B->y));
}
double Perimetro(Poligono P) {
struct Vertice* vertice = P;
double perimetro = 0;
do {
perimetro += Distancia(vertice, vertice->prox);
vertice = vertice->prox;
} while (vertice != P);
return perimetro;
}
double Area(Poligono P) {
double area = 0;
struct Vertice* vertice = P;
do {
area += (vertice->y)*(vertice->prox->x) / 2;
area -= (vertice->x)*(vertice->prox->y) / 2;
vertice = vertice->prox;
} while (vertice != P);
if (area < 0) {
area = area * (-1);
}
return area;
}
void DeletaVerticeRecursivamente(Poligono P, struct Vertice* V) {
if (V->prox != P) {
DeletaVerticeRecursivamente(P, V->prox);
}
free(V);
}
void LiberaPoligono(Poligono P) {
DeletaVerticeRecursivamente(P, P);
}
int main() {
int numerodevertices;
Poligono poligono; /* Já é o endereço de memória de um vértice inicial */
scanf("%d", &numerodevertices);
CriaPoligono(numerodevertices, &poligono);
printf("Perimetro: %.1lf\n", Perimetro(poligono));
printf("Area: %.1lf\n", Area(poligono));
LiberaPoligono(poligono);
}