Ближе к началу координат та из точек, чей квадрат расстояния до начала координат x^2 + y^2 меньше. У меня описан алгоритм что_ближе, который принимает аргументами 4 вещественных числа - координаты точек и выводит сообщение о том, какая из точек ближе.
У меня для примера рассматриваются точки (1, 1) и (2, 0) - первая точка ближе, (4, 8) и (1, 7) - вторая точка ближе, и (3, 4) и (0, 5) - точки на одинаковом расстоянии.
Вы можете задавать значения и с клавиатуры, и записывать их сразу в текст программы, в зависимости от того, что требуется.
алг что_ближе(вещ x1, y1, x2, y2) нач вещ d d := (x1*x1 + y1*y1) - (x2*x2 + y2*y2) выбор при d < 0: вывод "Первая точка ближе", нс при d > 0: вывод "Вторая точка ближе", нс иначе вывод "Точки на одинаковом расстоянии", нс все кон
Средствами PascalABC.NET 3.2 эта задача решается очень просто.
1. Короткое решение, оставляющее в недоумении: а для чего тут было использовать двусвязный список? ответ: потому что таково задание!
// PascalABC.NET 3.2, сборка 1439 от 09.05.2017 // Внимание! Если программа не работает, обновите версию!
function IsFib(n:integer):boolean; begin if (n=1) or (n=2) then Result:=true else begin Result:=false; (var n1, var n2):=(1,2); var Fib:integer; repeat Fib:=n1+n2; if Fib=n then begin Result:=true; break end; (n2,n1):=(Fib,n2) until Fib>n end; end;
begin var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList; L:=L.Where(x->not IsFib(x)).ToLinkedList; L.Println end.
2. Несколько более длинное решение для желающих немного порулить удалением узлов.
Функция остается той же, а изменения делаются в главной программе.
begin var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList; var a:=L.Where(x->IsFib(x)).ToArray; // список значений для удаления foreach var t in a do L.Remove(t); // собственно удаление узлов L.Println end.
3. Бонус. Как это сделать без двусвязного списка (опять же, основная программа).
begin var a:=ReadSeqInteger('->',ReadInteger('n=')) .Where(x->not IsFib(x)).ToArray; a.Println end.
У меня для примера рассматриваются точки (1, 1) и (2, 0) - первая точка ближе, (4, 8) и (1, 7) - вторая точка ближе, и (3, 4) и (0, 5) - точки на одинаковом расстоянии.
Вы можете задавать значения и с клавиатуры, и записывать их сразу в текст программы, в зависимости от того, что требуется.
алг
нач
что_ближе(1, 1, 2, 0)
что_ближе(4, 8, 1, 7)
что_ближе(3, 4, 0, 5)
кон
алг что_ближе(вещ x1, y1, x2, y2)
нач
вещ d
d := (x1*x1 + y1*y1) - (x2*x2 + y2*y2)
выбор
при d < 0: вывод "Первая точка ближе", нс
при d > 0: вывод "Вторая точка ближе", нс
иначе вывод "Точки на одинаковом расстоянии", нс
все
кон
1. Короткое решение, оставляющее в недоумении: а для чего тут было использовать двусвязный список? ответ: потому что таково задание!
// PascalABC.NET 3.2, сборка 1439 от 09.05.2017
// Внимание! Если программа не работает, обновите версию!
function IsFib(n:integer):boolean;
begin
if (n=1) or (n=2) then Result:=true
else begin
Result:=false;
(var n1, var n2):=(1,2);
var Fib:integer;
repeat
Fib:=n1+n2;
if Fib=n then begin Result:=true; break end;
(n2,n1):=(Fib,n2)
until Fib>n
end;
end;
begin
var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList;
L:=L.Where(x->not IsFib(x)).ToLinkedList;
L.Println
end.
Пример
n= 9
-> 3 17 13 10 12 4 11 0 5
17 10 12 4 11 0
2. Несколько более длинное решение для желающих немного порулить удалением узлов.
Функция остается той же, а изменения делаются в главной программе.
begin
var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList;
var a:=L.Where(x->IsFib(x)).ToArray; // список значений для удаления
foreach var t in a do L.Remove(t); // собственно удаление узлов
L.Println
end.
3. Бонус. Как это сделать без двусвязного списка (опять же, основная программа).
begin
var a:=ReadSeqInteger('->',ReadInteger('n='))
.Where(x->not IsFib(x)).ToArray;
a.Println
end.