Форумы-->Форум для внеигровых тем--> 1|2
Автор | Кто разбирается в Паскале |
для Йопсель:
Так лучше?)
лучше, но можно попробовать еще лучше, с классами эквивалентности - чтобы не сравнивать каждую прямую с каждой, так как если есть параллельные прямые - то их можно считать уже одним объектом :) Но Паскаль я не помню) | Ну же =) | 13к!!! | За исходник работающей проги даю 15к!!! | Целых 15000 золотых!!! | int pr(double *a,double *b)
{
int i,j,k=0,max=0,max_i=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
if ((a[i]/a[j])!=(b[i]/b[j])) {k++;}
if (k>max) {max=k;max_i=i;}
}
return i;
}
Как - то так на СИ будет примерно. | просто так хреново, что ты себе не представляешь как лениво... | для Антохен:
а на паскале накатать можешь? | Давайте! 15к! | для RCAPDART:
Считать массивы сможешь сам, нарисовать - тоже, ибо особая рисовальная магия в паскале мне неизвестна:
Тело программы - в сообщении 26 (только там возвращает она не i, а max_i).
На Паскале будет примерно так:
Type my = array[1..n] of double; //Или как там происходит объявление типа?
Function pr(my a,my b);
int i,j,k:=0,max:=0,max_i:=0;
begin
for i:=1 to n do
begin
for j:=1 to n do
if (a[i]<>a[j]) then inc(k)
else
if (b[i]=b[j]) then
begin
writeln("Panic! Logical error!");
//Тут должен быть экстренный выход из программы - нарушение условия.
end;
if (k>max) then
begin
max:=k;
max_i:=i;
end;
end;
pr=max_i;
end;
Далее считываем массивы, вызываем эту функцию, рисуем прямые, выделяем прямую с номером max_i другим цветом.
Это при условии, что прямые заданы как y=ax+b, среди них нет одинаковых (как по условию, но в нем не сказано, какие коэффициенты прямых даны).
Кое - где может синтаксис быть кривым, плохо помню. | для Антохен:
таких прямых может быть несколько, а у тебя только одна всегда выделяется :) | для Антохен:
Не вижу никакого нарушения.Линии имеют право полностью накладываться.Просто во избежание проверки линии с самой собой организуй цикл немного по другому.Иначе writeln("Panic! Logical error!"); сработает n раз.
жаль я подзабыл языки.А програмка ниче доработай.
Кстати Тайпан прав.
для RCAPDART:
Если учитель у тебя нормальный (шарюший), то будет смотреть на стиль исполнения.Всегда так было чем конструкция проше - тем надежней. | Забыл сказать.С точки зрения матаматики, линии, которые накладываются друг на друга, имеют бесконечное множество пересечений.
Просто сначала подумал что праметр - b - можно вопще не учитывать, на самом деле такая проверка имеет смысл.Только придется обьяснить концепцию такой проверки. | program m;
Uses Crt;
Const n=10;
eps=1000;
Type lines=array[1..n,1..2] of real;
Var t:text;
l:lines;
i,j,num,max,cross:byte;
Function is_cross(m,k:byte):boolean;
begin
if l[k,1]=0 then
if l[m,1]<>0 then is_cross:=true
else is_cross:=false
else
if l[k,2]=0 then
if l[m,1]<>l[k,1] then is_cross:=true
else is_cross:=false
else
if (round(eps*l[m,1]/l[k,1])<>round(eps*l[m,2]/l[k,2]))
and
(l[m,1]<>l[k,1]) then is_cross:=true
else is_cross:=false
end;
Begin
assign(t,'lines.txt');
reset(t);
for i:=1 to n do
readln(t,l[i,1],l[i,2]);
close(t);
max:=0;
for i:=1 to n do
begin
cross:=0;
for j:=1 to n do
if is_cross(i,j) then inc(cross);
if cross>max then begin
max:=cross;
num:=i
end;
end;
clrscr;
textbackground(1);
textcolor(14);
clrscr;
writeln('The max number of crosses has line N=',num,' with ',max,'crosses');
writeln('Press <ESC>');
repeat until readkey=#27
End.
Программа работает(отлажена), но только в текстовом режиме - нет у меня модуля граф и скачивать в лом, нарисуй уж сам. Выводит на экран номер прямой и кол-во ее пересечений. Для нормальной работы необходимо создать в той же папке, что и сама программа текстовой файл lines.txt с данными в виде - n строк, в каждой строке по два числа разделенных пробелом - коэффициенты прямой. Например, такой
12 1
-2 4
-2 5
12 -4
0 2
-12 3
-1 0
12 5
0 -4
-2 -2 | для Aili:
она мою 1-ую версию тестировала файлом
с текстом
7
13 5
5 7 7
3 5 1
9 3 3
1 1 1
4 4 7
9 1 1
=) | всё! Спасибо Aili =) | тема закрыта by RCAPDART (2008-12-14 13:15:36) |
---|
1|2К списку тем
|