C中的周长计算

时间:2017-09-16 23:56:00

标签: c math

我正在尝试使用点公式之间的距离来计算任何几何图形的周长,但该函数没有提供它应该的值。我不知道我做错了什么

#include <math.h>

int perimeter(int flag, dot d[]){
 float result, sum1, sum2, sum3, quad1, quad2, op[flag], sum;

 for(int c=0;c<flag;c++){
    sum1=d[c+1].x-d[c].x;
    sum2=d[c+1].y-d[c].y;
    quad1=pow(sum1, 2);
    quad2=pow(sum2, 2);
    sum3=quad1+quad2;
    result=sqrt(sum3);
    op[c]=result;
 }
 for(int c=0;c<flag;c++){
    sum+=op[c];
 }return sum;
}

测试值:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct dot{
  float x,y;
}dot;

int main(){
  int flag=4;
  dot d[flag];
  d[0].x=9;
  d[0].y=10;
  d[1].x=21;
  d[1].y=10;
  d[2].x=21;
  d[2].y=16;
  d[3].x=9;
  d[4].y=16;

  float result, sum1, sum2, sum3, quad1, quad2, op[flag], sum=0.0;

  for(int c=0;c<flag;c++){
    sum1=d[c+1%flag].x-d[c].x;
    sum2=d[c+1%flag].y-d[c].y;
    quad1=pow(sum1, 2);
    quad2=pow(sum2, 2);
    sum3=quad1+quad2;
    result=sqrt(sum3);
    printf("distance %d: %d\n", c, result);
    sum+=result;

 }
 printf("final result: %d\n", result);
}

控制台日志(打印步骤):

gcc version 4.6.3

distance 0: 0
distance 1: 1
distance 2: 2
distance 3: 3
final result: 26533904     

3 个答案:

答案 0 :(得分:0)

使用0.0。

初始化sum

然后

替换

op[c]=result;

sum+=result;

您不需要其他for循环。

其次,确保传递给周边函数的变量flag的值比点阵列d的大小小1。

最后,您需要将最后一个点和第一个点之间的距离添加到总和中。 (在for循环之后)。

sum1 = d[flag+1].x - d[0].x;
sum2 = d[flag+1].y - d[0].y;
quad1=pow(sum1, 2);    
quad2=pow(sum2, 2);
sum3=quad1+quad2;
result=sqrt(sum3);
sum+=result;

答案 1 :(得分:0)

这是我的版本,具有更好的变量名称,

#include <math.h>

float perimeter(int flag, dot d[]){
    float sum_x, sum_y, quad_x, quad_y, sum = 0;

    for(int c=0;c<flag;c++){
        sum_x=d[(c+1) % flag].x-d[c].x;
        sum_y=d[(c+1) % flag].y-d[c].y;
        quad_x=pow(sum_x, 2);
        quad_y=pow(sum_y, 2);
        sum += sqrt(quad_x + quad_y);
    }
    return sum;
}

答案 2 :(得分:0)

您应该查找<math.h>标头中声明的hypot()个函数。你最终可能会:

float perimeter(int n_dots, dot d[])
{
    float sum = 0.0;
    for (int i = 0; i < n_dots; i++)
    {
        int n = (i+1) % n_dots;
        sum += hypotf(d[n].x - d[i].x, d[n].y - d[i].y);
    }
    return sum;
}

如果您需要报告所计算的值,则可以在将hypotf()添加到sum之前捕获float的结果。

另请注意,您应返回float值。在我的书中,您应该将double改为hypot()(并使用hypotf()代替float),但这有点分开作为一个问题。我认为,返回double(或int)而不是#include <math.h> #include <stdio.h> typedef struct dot { float x, y; } dot; float perimeter(int n_dots, dot d[]); int main(void) { enum { num_dots = 4 }; dot d[num_dots] = { { .x = 9, .y = 10 }, { .x = 21, .y = 10 }, { .x = 21, .y = 16 }, { .x = 9, .y = 16 }, }; printf("Perimeter: %.3f\n", perimeter(num_dots, d)); return 0; } float perimeter(int n_dots, dot d[]) { float sum = 0.0; for (int i = 0; i < n_dots; i++) { int n = (i + 1) % n_dots; sum += hypotf(d[n].x - d[i].x, d[n].y - d[i].y); } return sum; } 非常重要。

您的代码的MCVE(Minimal, Complete, Verifiable Example)版本可能是:

Perimeter: 36.000

使用VLA会阻止您使用初始化程序,因此我将数组制作为常规固定大小的数组。

输出:

?- delete_unique([a, b, a, a], L).
L = [a, a, a]

对于给定的数据,这是正确的(四边长度分别为12,6,12,6)。