Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Перевод с Паскаль в си ++ (http://forum.oszone.net/showthread.php?t=230061)

Юлианна_Спивак@fb 11-03-2012 15:35 1876869

Перевод с Паскаль в си ++
 
Вложений: 1
Помогите, пожалуйста, перевести программу на СИ++ : На плоскости заданы множество точек А и множество окружностей В. Найти две различные точки из А такие, чтобы проходящая через них прямая пересекалась с максимальным количеством окружностей В
.
Код:

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 1877929

Компилировал в 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 1884744

Скажите пожалуйста, а тесты к данной задаче можете составить?? верные и неверные

Hector 22-03-2012 17:12 1884770

Юлианна_Спивак@fb, а может уже не стоит так наглеть?

Drongo 22-03-2012 17:35 1884784

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


Время: 06:57.

Время: 06:57.
© OSzone.net 2001-