Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Перевод с Паскаль в си ++

Закрытая тема
Настройки темы
C/C++ - [решено] Перевод с Паскаль в си ++

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 11-03-2012
Описание: удобочитаемый формат
Вложения
Тип файла: txt Новый текстовый документ.txt
(2.0 Kb, 10 просмотров)
Помогите, пожалуйста, перевести программу на СИ++ : На плоскости заданы множество точек А и множество окружностей В. Найти две различные точки из А такие, чтобы проходящая через них прямая пересекалась с максимальным количеством окружностей В
.
Код: Выделить весь код
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.

Отправлено: 15:35, 11-03-2012

 

Новый участник


Сообщения: 28
Благодарности: 3

Профиль | Отправить PM | Цитировать


Компилировал в 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); // если высота больше радиуса, пересекаются
}

-------
подпись

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:17, 12-03-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 16:31, 22-03-2012 | #3


Аватара для Hector

Misanthrope


Сообщения: 474
Благодарности: 38

Профиль | Отправить PM | Цитировать


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

-------
Information must be free!
Нет границ, есть только препятствия


Отправлено: 17:12, 22-03-2012 | #4


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:35, 22-03-2012 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Перевод с Паскаль в си ++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Паскаль kakmandu Программирование в *nix 2 28-08-2011 22:01
Теория - паскаль Дашка Программирование и базы данных 1 07-01-2011 17:44
C/C++ - Паскаль-си Drago56 Программирование и базы данных 3 24-12-2010 19:09
Теория - Паскаль и NaN ManHack Программирование и базы данных 9 20-01-2009 15:57
С++ и Паскаль Casper Программирование и базы данных 5 18-04-2003 19:35




 
Переход