Войти

Показать полную графическую версию : [решено] Перевод с Паскаль в си ++


Юлианна_Спивак@fb
11-03-2012, 15:35
Помогите, пожалуйста, перевести программу на СИ++ : На плоскости заданы множество точек А и множество окружностей В. Найти две различные точки из А такие, чтобы проходящая через них прямая пересекалась с максимальным количеством окружностей В
.uses crt;
type point=record
x,y:real;
end;
okr=record
x,y,r:real;
end;
const nmax=20;
{функция определяет пересекается прямая с окружностью или нет}
function Peres(a,b:point;c:okr):boolean;
var s,ab,h:real;
begin
{строим треугольник на точках прямой о центре окружности
определяем его площадь, длину стороны на прямой и высоту на нее}
s:=abs(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y));
ab:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
h:=s/ab;
Peres:=h<c.r;{если высота меньше радиуса, перемекаются}
end;
var a:array[1..nmax] of point;{множество точек}
b:array[1..nmax] of okr;{множество окружностей}
n,m,i,j,k,p,mx,imx,jmx:integer;
begin
clrscr;
randomize;
repeat
write('Количество точек до ',nmax,' n=');
readln(n);
until n in [1..nmax];
repeat
write('Количество окружностей до ',nmax,' m=');
readln(m);
until m in [1..nmax];
for i:=1 to n do
begin
a[i].x:=-10+random*21;
a[i].y:=-10+random*21;
end;
for i:=1 to m do
begin
b[i].x:=-5+11*random;
b[i].y:=-5+11*random;
b[i].r:=5*random;
end;
writeln('Координаты точек:');
write('X:');
for i:=1 to n do
write(a[i].x:6:2);
writeln;
write('Y:');
for i:=1 to n do
write(a[i].y:6:2);
writeln;
writeln;
writeln('Параметры окружностей:');
write('X:');
for i:=1 to m do
write(b[i].x:6:2);
writeln;
write('Y:');
for i:=1 to m do
write(b[i].y:6:2);
writeln;
write('R:');
for i:=1 to m do
write(b[i].r:6:2);
writeln;
writeln;
{ищем прямую с максимальными пересечениями}
mx:=0;
imx:=0;
jmx:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
begin
k:=0;
for p:=1 to m do
if Peres(a[i],a[j],b[p]) then k:=k+1;
if k>mx then
begin
mx:=k;
imx:=i;
jmx:=j;
end;
end;
if mx=0 then write('Нет пересекающихся прямых и окружностей')
else
begin
writeln('Максимальное число пересечений прямой с окружностями=',mx);
write('Эта прямая проходит через точки (',a[imx].x:0:2,';',a[imx].y:0:2,') и (',a[jmx].x:0:2,';',a[jmx].y:0:2,')');
end;
readln
end.

ferona
12-03-2012, 21:17
Компилировал в Visual Studio 2010, если нужны будут поправки, пишите...

#include <iostream>
#include <cstdlib>
#include <clocale>
#include <ctime>
#include <cmath>
using namespace std;

struct point {
double x,y;
};

struct okr {
double x,y,r;
};

const int nmax=20;

/* функция определяет пересекается прямая с окржуностью или нет */
bool Peres(point a, point b, okr c);

int main() {
setlocale(0,"");

point a[nmax];
okr b[nmax];
int n,m,i,j,k,p,mx,imx,jmx;

srand(time(0));

do {
cout << "Количество точек до " << nmax << " n=";
cin >> n;
}while(n<1 || n>20);

do {
cout << "Количество окружностей до " << nmax << " m=";
cin >> m;
}while(m<1 || m>20);

for(i=0; i<n; ++i) {
a[i].x=rand()%30-10;
a[i].y=rand()%30-10;
}

for(i=0; i<m; ++i) {
b[i].x=rand()%30-10;
b[i].y=rand()%30-10;
b[i].r=5*rand();
}

cout << "Координаты точек:\nX:";
for(i=0;i<n;++i)
cout << a[i].x << " ";
cout << "\nY:";
for(i=0;i<n;++i)
cout << a[i].y << " ";
cout << "\n\nПараметры окружностей:\nX:";
for(i=0;i<m;++i)
cout << b[i].x << " ";
cout << "\nY:";
for(i=0;i<m;++i)
cout << b[i].y << " ";
cout << "\nR:";
for(i=0;i<m;++i)
cout << b[i].r << " ";
cout << "\n\n";
/* ищем прямую с максимальными пересечениями */
mx=0;
imx=0;
jmx=0;

for(i=0;i<n-1;++i)
for(j=i+1;j<n;++j) {
k=0;
for(p=1;p<m;++p)
if(Peres(a[i],a[j],b[p]))
++k;
if(k>mx) {
mx=k;
imx=i;
jmx=j;
}
}

if(mx==0)
cout << "Нет пересекающихся прямых и окружностей\n";
else
cout << "Максимальное число пересечений прямой с окружностями=" << mx
<< "\nЭта прямая проходит через точки ("<<a[imx].x<<';'<<a[imx].y<<") и ("<<a[jmx].x<<';'<<a[jmx].y<<")\n";
cout << "\n";
system("pause");
}

bool Peres(point a, point b, okr c) {
double s, ab, h;
/* строим треугольник на точках прямой о центре окружности
определяем его площадь, длину стороны на прямой и высоту на нее
*/

s = abs(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y));
ab = sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
h = s/ab;
return (h<c.r); // если высота больше радиуса, пересекаются
}

Юлианна_Спивак@fb
22-03-2012, 16:31
Скажите пожалуйста, а тесты к данной задаче можете составить?? верные и неверные

Hector
22-03-2012, 17:12
Юлианна_Спивак@fb, а может уже не стоит так наглеть?

Drongo
22-03-2012, 17:35
Юлианна_Спивак@fb, Если по теме остались вопросы пишите в личку, открою тему. А сейчас закрываю. Одна тема - одна проблема.




© OSzone.net 2001-2012