求助一道C语言题目?

设计合适的数据体结构,能够表示平面上的多边形,编写程序,读入一个多边形的顶点数据,并计算此多边形的面积。... 设计合适的数据体结构,能够表示平面上的多边形,编写程序,读入一个多边形的顶点数据,并计算此多边形的面积。 展开
 我来答
网站开发经验分享
2019-12-06 · TA获得超过786个赞
知道答主
回答量:192
采纳率:70%
帮助的人:10.8万
展开全部

运行结果如图所示

// gcc polygon.c -Wall -lm

#include <stdio.h>

#include <stdlib.h>

#include <math.h>


#ifndef null

#define null ((void *)0)

#endif


typedef struct {

  float x;

  float y;

} Point;


typedef struct {

  Point p1;

  Point p2;

} Line;


typedef Point Vertex;

typedef Line Edge;


void *mymemset(void *s, int c, size_t n) {

  int i = 0;

  char *b = s;

  for (; i < n; i++) {

    b[i]= c;

  }

  return s;

}


char * const Vertex_toString(const Vertex const *v) {

  const size_t BUFFSIZE = 32;

  char *s = (char *)malloc(sizeof(char) * BUFFSIZE);

  mymemset(s, 0, BUFFSIZE);

  sprintf(s, "(%.3f,%.3f)", v->x, v->y);

  return s;

}


float Vertex_distance(const Vertex const *v1, const Vertex const *v2) {

  return sqrt( (v1->x -v2->x) * (v1->x - v2->x) + (v1->y - v2->y) * (v1->y - v2->y) );

}


float Vertex_angle(const Vertex const *v1, const Vertex const *v2) {

  return atanf( (v2->y - v1->y) / (v2->x - v1->x) );

}


void Edge_init(Edge *e, Vertex v1, Vertex v2) {

  e->p1 = v1;

  e->p2 = v2;

}


float Edge_len(const Edge *const e) {

  return Vertex_distance(&e->p1, &e->p2);

}


float Edge_angle(const Edge *const e) {

  return Vertex_angle(&e->p1, &e->p2);

}


float absf(float v) {

  return v > 0 ? v : -v;

}


float getAreaByAdjEdges(const Edge *const e1, const Edge *const e2) {

  float len1 = Edge_len(e1);

  float len2 = Edge_len(e2);

  float theta = Edge_angle(e2) - Edge_angle(e1);

  return (1.0/2) * len1 * len2 * absf( sinf(theta) );

}


typedef struct {

  Vertex *v;

  size_t size;

  size_t cap;

} Polygon;


void Polygon_init(Polygon *p, size_t cap) {

  p->size = 0;

  p->cap = cap;

  p->v = malloc(sizeof(Vertex) * p->cap);

}


int Polygon_addVertex(Polygon *p, Vertex v) {

  if (p->size >= p->cap) {

    return -1; 

  }

  p->v[ p->size++ ] = v;

  return 0;

}


Vertex *Polygon_getVertex(const Polygon *const p, int idx) {

  if (idx < 0 || idx > p->size) {

    return null;

  }

  return &p->v[ idx ];

}


float Polygon_area(Polygon *p) {

  int i;

  Vertex v0, v1, v2;

  Edge e1, e2;

  float area = 0;

  for (i = 0; i < p->size-2; i++) {

    v0 = *Polygon_getVertex(p, i );

    v1 = *Polygon_getVertex(p, i+1 );

    v2 = *Polygon_getVertex(p, i+2 );

    

    Edge_init( &e1, v0, v1 );

    Edge_init( &e2, v0, v2 );

    

    area += getAreaByAdjEdges( &e1, &e2 );

  }

  return area;

}


void Polygon_print(const Polygon *p) {

  if (p->size < 1) {

    printf("Empty polygon.\n");

    return;

  }

  int i;

  char * s = Vertex_toString(&p->v[0]);

  printf(s);

  free(s);

  

  for (i = 1; i < p->size; i++) {

    s = Vertex_toString(&p->v[i]);

    printf(", %s", s);

    free(s);

  }

  printf("\n");

}


void Polygon_destroy(Polygon *p) {

  free(p->v);

  p->v = null;

}


int main() {

  Vertex v1 = {0, 0};

  Vertex v2 = {1, 2};

  Vertex v3 = {2, 0};

  Vertex v4 = {1, -2};

  printf("Distance=%.3f\n", Vertex_distance(&v1, &v2));


  Polygon p;

  Polygon_init(&p, 3);

  Polygon_addVertex(&p, v1);

  Polygon_addVertex(&p, v2);

  Polygon_addVertex(&p, v3);

  Polygon_print(&p);

  

  printf("Polygon(p) area=%.3f\n", Polygon_area(&p));

  Polygon_destroy(&p);


  Polygon q;

  Polygon_init(&q, 4);

  Polygon_addVertex(&q, v1);

  Polygon_addVertex(&q, v2);

  Polygon_addVertex(&q, v3);

  Polygon_addVertex(&q, v4);

  Polygon_print(&q);

  printf("Polygon(q) area=%.3f\n", Polygon_area(&q));

  Polygon_destroy(&q);

  

  return 0;

}

李快来1314
2019-12-05 · TA获得超过1653个赞
知道小有建树答主
回答量:1395
采纳率:62%
帮助的人:92万
展开全部
一道C语言题目,发来看看,与水泥中的氢氧根离子发生反应生成硅酸盐,与水泥中的氢氧化钙反应生成水合硅酸钙,引起混凝土的不均匀膨胀。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
萍水相逢就是缘吧
2019-12-05 · TA获得超过6078个赞
知道大有可为答主
回答量:1.5万
采纳率:54%
帮助的人:2057万
展开全部
初步判断
都可以用三角形来计算吧
三角形面积公式

哦,还得查查
追问
求源代码
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
株野先生
2019-12-05 · TA获得超过2179个赞
知道小有建树答主
回答量:8135
采纳率:23%
帮助的人:302万
展开全部
这个问题问得好我觉得我无法理解这个问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式