Создать множество прямых, проходящих через начало координат, и упорядочить его по заданному условию - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Множество прямых М задано коэффициентами их уравнений вида Ах + Вy + C = 0. Выполнить над М последовательность действий, указанную в задании. Задание 4.1. а) Сформировать множество P ( M, включающее в себя только прямые, проходящие через начало координат; в) упорядочить Р так, чтобы прямые располагались в порядке возрастания углов, образованных каждой прямой с осью Х. Помогите пожалуйста

Решение задачи: «Создать множество прямых, проходящих через начало координат, и упорядочить его по заданному условию»

textual
Листинг программы
const mi = 100;
 
type lin = record a, b, c, fi: real end;
     set_lin = array [1..mi] of lin;
 
procedure out_lin(x: lin);
begin
  with x do
    begin
      write(a:17, ' * X');
      if b >= 0 then write(' +') else write(' -');
      write(abs(b):17, ' * Y');
      if c >= 0 then write(' +') else write(' -');
      writeln(abs(c):17, ' = 0');
    end;
end;
 
procedure out_set(s: string; var x: set_lin; n: integer);
var i: integer;
begin
  writeln(s);
  for i := 1 to n do out_lin(x[i])
end;
 
var m, p: set_lin;
    t: lin;
    i, j, n, k, min: integer;
    f: boolean;
 
begin
  repeat
    write('Количество прямых [1..', mi, ']? ');
    readln(n)
  until n in [1..mi];
  writeln('Введите коэффициенты канонического уравнения прямых:');
  for i := 1 to n do
    with m[i] do
      begin
        writeln('Прямая ', i);
        repeat
          write('A = ');
          readln(a);
          write('B = ');
          readln(b);
          if (a = 0) and (b = 0) then writeln('A и B не могут быть равными 0 одновременно, повторите ввод.')
        until (a <> 0) or (b <> 0);
        write('C = ');
        readln(c);
        if b = 0
          then fi := pi / 2
          else fi := arctan(-a / b)
      end;
  out_set('Множество M:', m, n);
  k := 0;
  for i := 1 to n do
    if m[i].c = 0
      then begin
        f := true;
        for j := 1 to k do
          begin
            f := p[j].fi <> m[i].fi;
            if not f then break
          end;
        if f
          then begin
            inc(k);
            p[k] := m[i]
          end
      end;
  if k = 0
    then writeln('Нет прямых, проходящих через начало координат.')
    else begin
      out_set('Множество P:', p, k);
      for i := 1 to k - 1 do
        begin
          min := i;
          for j := i + 1 to k do if p[j].fi < p[min].fi then min := j;
          if min > i
            then begin
              t := p[i];
              p[i] := p[min];
              p[min] := t
            end
        end;
      out_set('Множество P, упорядоченное по возрастанию угла между прямой и осью абсцисс:', p, k)
    end;
  readln
end.

Объяснение кода листинга программы

const mi = 100; type lin = record a, b, c, fi: real end; set_lin = array [1..mi] of lin; out_lin(x: lin); procedure out_set(s: string; var x: set_lin; n: integer); var i: integer; begin writeln(s); for i := 1 to n do out_lin(x[i]) end; var m, p: set_lin; t: lin; i, j, n, k, min: integer; f: boolean; begin repeat write('Количество прямых [1..', mi, ']? '); readln(n) until n in [1..mi]; writeln('Введите коэффициенты канонического уравнения прямых:'); for i := 1 to n do begin with m[i] do begin writeln('Прямая ', i); repeat write('A = '); readln(a); end; write('B = '); readln(b); if (a = 0) and (b = 0) then writeln('A и B не могут быть равными 0 одновременно, повторите ввод.') write('C = '); readln(c); if b = 0 then fi := pi / 2 else fi := arctan(-a / b) end; out_set('Множество M:', m, n); k := 0; for i := 1 to n do begin if m[i].c = 0 then begin f := true; for j := 1 to k do begin f := p[j].fi <> m[i].fi; if not f then break end; if f then begin inc(k); p[k] := m[i] end end; end; if k = 0 then writeln('Нет прямых, проходящих через начало координат.') else begin out_set('Множество P:', p, k); for i := 1 to k - 1 do begin min := i; for j := i + 1 to k do if p[j].fi < p[min].fi then min := j; if min > i then begin t := p[i]; p[i] := p[min]; p[min] := t end end; out_set('Множество P, упорядоченное по возрастанию угла между прямой и осью абсцисс:', p, k) end; readln end; end; end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы