Другие языки программирования и технологии

Помогите доделать программу пожалуйста ) На языке Си

Вот условие задачи: Площадь выпуклого многоугольника. Даны натуральное число n, действительные числа x1, y1, x2, y2, ..xn, yn. Найти площадь выпуклого n-угольника, вершины которого при некотором последовательном обходе имеют координаты (x1, y1), (x2, y2), ..(xn, yn). Определите подпрограмму вычисления площади треугольника по координатам его вершин. Моя программа: #include <stdio.h> #include <math.h> #include <conio.h> #include <stdlib.h> float ploshad (int x1, int y1, int x2, int y2, int x3, int y3) { float S=0; int i; float d1, d2, d3, p; d1=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); d2=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); d3=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); p=(d1+d2+d3)/2; S=sqrt(p*(p-d1)*(p-d2)*(p-d3)); return S; } int main() { //Ввод исходных данных int n, i, x1, x2, x3, y1, y2, y3; int x[20], y[20]; float p, d1, d2, d3, S; printf("Введите количество углов многоугольника n= "); scanf("%d", &n); printf("Введите координаты точек\n"); for (i=0; i<n;>); printf("y[%d]= ", i); scanf("%d", &y); } printf("S= %d\n", S); getch(); return 0; //Возвращает ноль при правильном завершении программы } Нужно разделить многоугольник на треугольники и посчитать площадь, складывая площади треугольников. Подсчет площади треугольника организован в подпрограмме.
#include <stdio.h>
#include <math.h>
int main(){
int i,n; float x[100],y[100],m,s;
printf("n? "); scanf("%d",&n);
for(i=1;i<=n;i++){printf("Point %d : ",i); scanf("%f%f",&x[ i],&y[ i]);}
m=y[1]; for(i=2;i<=n;i++)if(y[ i]< m)m=y[ i];
if(m< 0)for(i=1;i<=n;i++)y[ i]-=m;
s=fabs((x[1]-x[n])*(y[1]+y[n]))/2;
for(i=2;i<=n;i++)s+=fabs((x[ i]-x[ i-1])*(y[ i]+y[ i-1]))/2;
printf("S=%f",s); getchar(); getchar(); return 0;}

Вычисление площади в подпрограмму выделять не стал, это и сама сделаешь.
P.S. Немного перестарался, эта программа должна работать и для невыпуклого многоугольника. Для выпуклого можно проще:

#include <stdio.h>
#include <math.h>
int main(){
int i,n; float x[100],y[100],s;
printf("n? "); scanf("%d",&n);
for(i=1;i<=n;i++){printf("Point %d : ",i); scanf("%f%f",&x[ i],&y[ i]);}
s=0; for(i=1;i<=n-2;i++)s+=fabs((x[ i+1]-x[1])*(y[ i+2]-y[1])-(x[ i+2]-x[1])*(y[ i+1]-y[1]))/2;
printf("S=%f",s); getchar(); getchar(); return 0;}
Дмитрий Богданов
Дмитрий Богданов
56 928
Лучший ответ
// ~ЯнОчК@~_Polygon
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale>
#define M 2

float triangleArea(float, float, float, float, float, float);

int main()
{
setlocale(LC_CTYPE, "Russian_Russia.1251");

float polygonArea = 0.0;
int N;

printf("\n Введите количество улов многоугольника, n = ");
scanf("%d", &N);
float ** Array = (float **) malloc(N * sizeof(float *));

printf("\n Введите координаты точек: \n");
for (int n = 0; n < N; n++)
{
Array[n] = (float *) malloc(M * sizeof(float));

for (int m = 0; m < M; m++)
{
if (m == 0)
{
printf("\n x%d = ", m + 1);
scanf("%f", &Array[n][m]);
}
else
{
printf(" y%d = ", m + 1);
scanf("%f", &Array[n][m]);
}
}
printf("\n");
}

for (int n = 1; n < N - 1; n++) polygonArea += triangleArea(Array[0][0], Array[0][1], Array[n][0], Array[n][1], Array[n + 1][0], Array[n + 1][1]);

printf("\n\n Площадь выпуклого многоугольника = %f", polygonArea);
getch();

for (int n = 0; n < N; n++) free (Array[n]);
free (Array);
}

float triangleArea(float x1, float y1, float x2, float y2, float x3, float y3)
{
if (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2) == 0) return 0.0;
else
{
float a, b, c, p;

a = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
b = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));
c = sqrt(pow(x1 - x3, 2) + pow(y1 - y3, 2));
p = (a + b + c) / 2;

return sqrt(p * (p - a) * (p - b) * (p - c));
}
}
ИШ
Игорь Шустов
63 147
Если многоугольник выпуклый, примите одну из его вершин за общую для всех треугольников.
Даниил Козлов
Даниил Козлов
83 892
мне кажется при подсчете сумм нужно иметь в виду n-2 и наверное подпрограмму надо переделать она не привязана к вершине
Павел Курлович
Павел Курлович
12 442