Создать множество прямых, проходящих через начало координат, и упорядочить его по заданному условию - Pascal ABC
Формулировка задачи:
Решение задачи: «Создать множество прямых, проходящих через начало координат, и упорядочить его по заданному условию»
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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д