Консультация № 188494
21.12.2015, 07:20
0.00 руб.
0 1 1
Здравствуйте! Прошу помощи в следующем вопросе:
Помогите, пожалуйста, исправить ошибку в следующей программе.
Условие: дано множество A из N точек (N > 2, точки заданы своими координатами x, y). Найти наименьший периметр треугольника, вершины которого принадлежат различным точкам множества A, и сами эти точки (точки выводятся в том же порядке, в котором они перечислены при задании множества A).

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>

float per(float *a,float *b, float *c)
{
return sqrt((*(b)-*(a))*(*(b)-*(a)) + (*(b+1)-*(a+1))*(*(b+1)-*(a+1)))+\
sqrt((*(c)-*(b))*(*(c)-*(b)) + (*(c+1)-*(b+1))*(*(c+1)-*(b+1)))+\
sqrt((*(a)-*(c))*(*(a)-*(c)) + (*(a+1)-*(c+1))*(*(a+1)-*(c+1)));
}



int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,j,k;
int n=0;
while(n<3)
{
printf("Введите количество точек на плоскости(n>2)= ");
scanf("%d",&n);
}
float *t=(float*)malloc(n*2*sizeof(float));
for(i=0;i<n*2;i+=2)
{
printf("\nВведите координаты %d точки:\n",i/2+1);
printf("\tx= ");
scanf("%f",(t+i));
printf("\ty= ");
scanf("%f",(t+i+1));
}
int da=0;
float *ma,*mb,*mc;
float temp=0,mper=0;
for (i=0;i<n;i++)
{
for (j=i+1;j<n;j++)
for (k=j+1;k<n;k++)
{
da++;
temp=per(t+(i*2),t+(j*2),t+(k*2));
if (temp<mper)
{
mper=temp;
ma=(t+(i*2));
mb=(t+(j*2));
mc=(t+(k*2));
}
}
}
printf("Программа перебрала %d комбинации(й).\n",da);
printf("\nМинимальный периметр=%f",mper);
printf("\nТочки:\n");
printf("\ta= (%f;%f)\n",*ma,*(ma+1));
printf("\tb= (%f;%f)\n",*mb,*(mb+1));
printf("\tc= (%f;%f)\n",*mc,*(mc+1));
return 0;
}

Обсуждение

давно
Посетитель
7438
7205
21.12.2015, 15:37
общий
это ответ
Здравствуйте, fridge!
Чуток подправил.
Удачи!
[code h=200]
/*
дано множество A из N точек
(N > 2, точки заданы своими координатами x, y).
Найти наименьший периметр треугольника,
вершины которого принадлежат различным точкам множества A,
и сами эти точки (точки выводятся в том же порядке,
в котором они перечислены при задании множества A)
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>

float per(float *a,float *b, float *c)
{
return (float)(
sqrt((*(b)-*(a))*(*(b)-*(a)) + (*(b+1)-*(a+1))*(*(b+1)-*(a+1)))+
sqrt((*(c)-*(b))*(*(c)-*(b)) + (*(c+1)-*(b+1))*(*(c+1)-*(b+1)))+
sqrt((*(a)-*(c))*(*(a)-*(c)) + (*(a+1)-*(c+1))*(*(a+1)-*(c+1))));
}

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,j,k;
int n=0;
while(n<3)
{
printf("Введите количество точек на плоскости(n>2)= ");
scanf("%d",&n);
}
float *t=(float*)malloc(n*2*sizeof(float));
for(i=0;i<n*2;i+=2)
{
printf("\nВведите координаты %d точки:\n",i/2+1);
printf("\tx= ");
scanf("%f",(t+i));
printf("\ty= ");
scanf("%f",(t+i+1));
}
int da=0;
float temp,mper=per(t,t+2,t+4);
float *ma=t;
float *mb=t+2;
float *mc=t+4;
for (i=0;i<n;i++)
{
for (j=i+1;j<n;j++)
{
for (k=j+1;k<n;k++)
{
da++;
temp=per(t+(i*2),t+(j*2),t+(k*2));
if (temp<mper)
{
mper=temp;
ma=(t+(i*2));
mb=(t+(j*2));
mc=(t+(k*2));
}
}
}
}
printf("Программа перебрала %d комбинации(й).\n",da);
printf("\nМинимальный периметр=%f",mper);
printf("\nТочки:\n");
printf("\ta= (%f;%f)\n",*ma,*(ma+1));
printf("\tb= (%f;%f)\n",*mb,*(mb+1));
printf("\tc= (%f;%f)\n",*mc,*(mc+1));
return 0;
}
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа