ASPER
UNIBRATEC

Gabarito da Lista 6
Aula 9: Tipos de dados definidos pelo usuário


Exercício 1:

Enunciado:
Escreva um programa fazendo o uso de struct's. Você deverá criar uma struct
chamada Ponto, contendo apenas a posição x e y (inteiros) do ponto. Declare 2
pontos, leia a posição (coordenadas x e y) de cada um e calcule a distância
entre eles. Apresente no final a distância entre os dois pontos.


Solução:
#include <stdio.h>
#include <math.h> /* Para as funcoes de raiz e potencia */
struct ponto {
int x;
int y;
};
void le_ponto(struct ponto *p, char *);
float dist(struct ponto p1, struct ponto p2);
void main(void)
{
struct ponto p1, p2;
printf("\nDistancia entre os pontos:\n");
le_ponto(&p1, "primeiro");
le_ponto(&p2, "segundo");
printf("\n\nDistancia entre os pontos: %5.2f\n", dist(p1, p2));
}
void le_ponto(struct ponto *p, char *s)
{
int x, y;
printf("Digite as coordenadas do %s ponto (x,y): ", s);
scanf("%d%d", &x, &y);
p->x = x;
p->y = y;
}
float dist(struct ponto p1, struct ponto p2)
{
float s1, s2;
s1 = pow((p1.x-p2.x), 2); /* Funcao pow(x,y) retorna x^y */
s2 = pow((p1.y-p2.y), 2);
return sqrt( s1 + s2); /* Funcao sqrt(x) retorna a
raiz quadrada de x */
}



Exercício 2:

Enunciado:
Prosseguindo o exercício da pagina cb10.html, crie uma estrutura chamada
retângulo, que possua duas estruturas ponto (o ponto superior esquerdo e o ponto
inferior direito). Faça um programa que receba (via teclado ou arquivo) as
informações acerca de um retângulo (as coordenadas dos dois pontos), e informe
dados interessantes sobre o retângulo, como a área, o comprimento da diagonal e
o comprimento de cada aresta.


Solução:
#include <stdio.h>
#include <math.h>
typedef struct _ponto /* Aqui usa-se typedef para dar o nome */
{ /* desejado ao tipo */
int x;
int y;
} ponto;
typedef struct _retangulo /* Idem anterior */
{
ponto sup_esq;
ponto inf_dir;
} retangulo;
void le_ponto(ponto *p, char *);
float diagonal(retangulo r);
int area(retangulo r);
void arestas(retangulo r);
void main(void)
{
retangulo r;
printf("\nPontos do retangulo:\n");
le_ponto(&(r.sup_esq), "primeiro");
le_ponto(&(r.inf_dir), "segundo");
printf("\n\nComprimento da diagonal do retangulo: %5.2f\n", diagonal(r));
printf("\nArea do retangulo: %d", area(r));
arestas(r);
}
void le_ponto(ponto *p, char *s)
{
int x, y;
printf("Digite a posicao do %s ponto (x,y): ", s);
scanf("%d%d", &x, &y);
p->x = x;
p->y = y;
}
float diagonal(retangulo r)
{
float s1, s2;
s1 = pow(r.sup_esq.x - r.inf_dir.x, 2);
s2 = pow(r.sup_esq.y - r.inf_dir.y, 2);
return sqrt( s1 + s2);
}
int area(retangulo r)
{
return ((r.sup_esq.x - r.inf_dir.x) * (r.sup_esq.y - r.inf_dir.y));
}
void arestas(retangulo r)
{
printf("\nComprimento das arestas:");
printf("\nAresta 1: %d", abs(r.sup_esq.x-r.inf_dir.x));
printf("\nAresta 2: %d", abs(r.sup_esq.y-r.inf_dir.y));
}


Comentários:
A função abs(x) retorna o módulo (valor absoluto) de x. Está na biblioteca
<math.h>.