Advertisement
venik2405

lab2_siaod

Sep 30th, 2021
1,444
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.74 KB | None | 0 0
  1. program Project2;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils;
  7.  
  8. type
  9.     Node = ^Odnochl;
  10.     Odnochl = record
  11.         Pow:Integer;
  12.         Koef:Integer;
  13.         Next:Node;
  14.     end;
  15. var
  16.     FirstMn, SecMn, Sum:Node;
  17.     x:integer;
  18.  
  19. function ReadMnogochlen(): Node;
  20. var
  21.     Rez, X, Y: Node;
  22.     I, Koef, N, Size, LastPow:integer;
  23.     IsCorrect: Boolean;
  24. begin
  25.     lastPow := 40;
  26.     new(x);
  27.     rez:=x;
  28.     Repeat
  29.         IsCorrect := false;
  30.         writeln('Введите количество одночленов многочлена: ');
  31.         Try
  32.             ReadLn(Size);
  33.             IsCorrect := true;
  34.         Except
  35.             WriteLn('Введите число, не большее 6')
  36.         End;
  37.         if (Size > 6) Or (Size < 1) then
  38.         Begin
  39.             WriteLn('Введите натуральное число, не большее 6');
  40.             IsCorrect := false;
  41.         End;
  42.     Until IsCorrect;
  43.     for i := Size downto 1 do                /////////////////////////////////////////////
  44.     begin
  45.         Repeat
  46.             IsCorrect := false;
  47.             writeln('Введите степень ' , I, '-ого одночлена(Макс:', LastPow, ')');
  48.             Try
  49.                 ReadLn(n);
  50.                 IsCorrect := true;
  51.             Except
  52.                 WriteLn('Введите натуральное число, не большее 6')
  53.             End;
  54.             if (N > 40) Or (N < 1) then
  55.             Begin
  56.                 WriteLn('Введите натуральное число, не большее 40');
  57.                 IsCorrect := false;
  58.             End;
  59.             if (n > lastPow - 1) then
  60.             Begin
  61.                 WriteLn('Степень этого одночлена должна быть меньше предыдущих');
  62.                 IsCorrect := false;
  63.             End;
  64.         Until IsCorrect;
  65.         LastPow := n;
  66.         Repeat
  67.             IsCorrect := false;
  68.             writeln('Введите коэфицент ' , I, '-ого одночлена');
  69.             Try
  70.                 ReadLn(Koef);
  71.                 IsCorrect := true;
  72.             Except
  73.                 WriteLn('Введите натуральное число')
  74.             End;
  75.             if (Koef > 100) Or (Koef < -100) then
  76.             Begin
  77.                 WriteLn('Введите натуральное число, не большее 100 и не меньщее -100');
  78.                 IsCorrect := false;
  79.             End;
  80.         Until IsCorrect;
  81.         if Koef<>0 then
  82.         begin
  83.             x^.Koef := Koef;
  84.             x^.Pow := N;
  85.             Y := X ;
  86.             new(X);
  87.             y^.Next :=X;
  88.         end;
  89.     end;
  90.     y^.Next:=nil;
  91.     ReadMnogochlen:=rez;
  92. end;
  93.  
  94. procedure WriteMnogochlen(X: Node);
  95. var
  96.     IsCorrect :boolean;
  97. begin
  98.     IsCorrect := true;
  99.     while X <> nil do
  100.     begin
  101.         if (X^.Koef >0) and (not IsCorrect) then
  102.             write('+');
  103.             IsCorrect := false;
  104.         if X^.Pow <> 0 then
  105.             write(IntToStr(X^.Koef),'x^',IntToStr(X^.Pow))
  106.         else
  107.             write(IntToStr(X^.Koef));
  108.         X := X^.Next;
  109.     end;
  110.     writeln;
  111. end;
  112.  
  113. function Ravni(P, Q:Node):boolean;
  114. var
  115.    AreTheSame:boolean;
  116. begin
  117.     AreTheSame := true;
  118.     while (p<>nil) and (q<>nil) and AreTheSame do
  119.     begin
  120.         if (p=nil) and (q=nil) then
  121.         AreTheSame := false
  122.         else
  123.         begin
  124.             if (p^.Pow <> q^.Pow) or (p^.Koef <> q^.Koef) then
  125.                 AreTheSame:=false;
  126.             p:=p^.Next;
  127.             q:=q^.Next;
  128.         end
  129.     end;
  130.     Ravni := AreTheSame;
  131. end;
  132.  
  133. function FindTheResult(Mnogochlen:Node; X:integer):integer;
  134. var
  135.     rez:integer;
  136. begin
  137.     rez:=0;
  138.     while Mnogochlen <> nil do
  139.     begin
  140.         rez := rez + Mnogochlen^.Koef * Round(exp( Mnogochlen^.Pow * ln(x)));
  141.         Mnogochlen := Mnogochlen^.Next;
  142.     end;
  143.     FindTheResult := rez;
  144. end;
  145.  
  146. procedure Add(out p:Node; q,r:Node);
  147. var
  148.     x,y:Node;
  149. begin
  150.       new(x);
  151.       p:=x;
  152.       while (q<>nil) and (r<>nil) do
  153.       begin
  154.          if q^.Pow > r^.Pow then
  155.           begin
  156.               x^.Pow := q^.Pow;
  157.               x^.Koef := q^.Koef;
  158.               q:=q^.Next;
  159.           end
  160.           else if q^.Pow < r^.Pow then
  161.           begin
  162.               x^.Pow := r^.Pow;
  163.               x^.Koef := r^.Koef;
  164.               r:=r^.Next;
  165.           end
  166.           else
  167.           begin
  168.               x^.Pow := r^.Pow;
  169.               x^.Koef := r^.Koef + q^.Koef;
  170.               q:=q^.Next;
  171.               r:=r^.Next;
  172.           end;
  173.           y:=x;
  174.           new(x);
  175.           y^.Next := x;
  176.       end;
  177.           y^.Next := nil;
  178. end;
  179.  
  180. begin
  181.     writeln('Данная программа позволяет ввести два многочлена, проверить их равенство,');
  182.     Writeln('найти их сумму и найти значение каждого многочлена в точке Х0');
  183.     FirstMn := ReadMnogochlen;
  184.     write('Первый многочлен: ');
  185.     WriteMnogochlen(FirstMn);
  186.     writeln;
  187.  
  188.     writeln('Ввод второго многочлена.');
  189.     SecMn := ReadMnogochlen;
  190.     write('Второй многочлен: ');
  191.     WriteMnogochlen(SecMn);
  192.     writeln;
  193.     if Ravni(FirstMn,SecMn) then
  194.         writeln('Ваши многочлены равны')
  195.     else
  196.         writeln('Ваши многочлены не равны');
  197.     writeln;
  198.     writeln;
  199.  
  200.     write('Введите Х для расчёта значения: ');
  201.     readln(x);
  202.     writeln('Значение первого многочлена: ',FindTheResult(FirstMn,x));
  203.     writeln('Значение второго многочлена: ',FindTheResult(SecMn,x));
  204.  
  205.     Add(Sum, FirstMn, SecMn);
  206.     write('Сумма многочленов: ');
  207.     WriteMnogochlen(Sum);
  208.     readln;
  209. end.
  210. program Project2;
  211.  
  212. {$APPTYPE CONSOLE}
  213.  
  214. uses
  215.   SysUtils;
  216.  
  217. type
  218.     Node = ^Odnochl;
  219.     Odnochl = record
  220.         Pow:Integer;
  221.         Koef:Integer;
  222.         Next:Node;
  223.     end;
  224. var
  225.     FirstMn, SecMn, Sum:Node;
  226.     x:integer;
  227.  
  228. function ReadMnogochlen(): Node;
  229. var
  230.     Rez, X, Y: Node;
  231.     I, Koef, N, Size, LastPow:integer;
  232.     IsCorrect: Boolean;
  233. begin
  234.     lastPow := 40;
  235.     new(x);
  236.     rez:=x;
  237.     Repeat
  238.         IsCorrect := false;
  239.         writeln('Введите количество одночленов многочлена: ');
  240.         Try
  241.             ReadLn(Size);
  242.             IsCorrect := true;
  243.         Except
  244.             WriteLn('Введите число, не большее 6')
  245.         End;
  246.         if (Size > 6) Or (Size < 1) then
  247.         Begin
  248.             WriteLn('Введите натуральное число, не большее 6');
  249.             IsCorrect := false;
  250.         End;
  251.     Until IsCorrect;
  252.     for i := Size downto 1 do                /////////////////////////////////////////////
  253.     begin
  254.         Repeat
  255.             IsCorrect := false;
  256.             writeln('Введите степень ' , I, '-ого одночлена(Макс:', LastPow, ')');
  257.             Try
  258.                 ReadLn(n);
  259.                 IsCorrect := true;
  260.             Except
  261.                 WriteLn('Введите натуральное число, не большее 6')
  262.             End;
  263.             if (N > 40) Or (N < 1) then
  264.             Begin
  265.                 WriteLn('Введите натуральное число, не большее 40');
  266.                 IsCorrect := false;
  267.             End;
  268.             if (n > lastPow - 1) then
  269.             Begin
  270.                 WriteLn('Степень этого одночлена должна быть меньше предыдущих');
  271.                 IsCorrect := false;
  272.             End;
  273.         Until IsCorrect;
  274.         LastPow := n;
  275.         Repeat
  276.             IsCorrect := false;
  277.             writeln('Введите коэфицент ' , I, '-ого одночлена');
  278.             Try
  279.                 ReadLn(Koef);
  280.                 IsCorrect := true;
  281.             Except
  282.                 WriteLn('Введите натуральное число')
  283.             End;
  284.             if (Koef > 100) Or (Koef < -100) then
  285.             Begin
  286.                 WriteLn('Введите натуральное число, не большее 100 и не меньщее -100');
  287.                 IsCorrect := false;
  288.             End;
  289.         Until IsCorrect;
  290.         if Koef<>0 then
  291.         begin
  292.             x^.Koef := Koef;
  293.             x^.Pow := N;
  294.             Y := X ;
  295.             new(X);
  296.             y^.Next :=X;
  297.         end;
  298.     end;
  299.     y^.Next:=nil;
  300.     ReadMnogochlen:=rez;
  301. end;
  302.  
  303. procedure WriteMnogochlen(X: Node);
  304. var
  305.     IsCorrect :boolean;
  306. begin
  307.     IsCorrect := true;
  308.     while X <> nil do
  309.     begin
  310.         if (X^.Koef >0) and (not IsCorrect) then
  311.             write('+');
  312.             IsCorrect := false;
  313.         if X^.Pow <> 0 then
  314.             write(IntToStr(X^.Koef),'x^',IntToStr(X^.Pow))
  315.         else
  316.             write(IntToStr(X^.Koef));
  317.         X := X^.Next;
  318.     end;
  319.     writeln;
  320. end;
  321.  
  322. function Ravni(P, Q:Node):boolean;
  323. var
  324.    AreTheSame:boolean;
  325. begin
  326.     AreTheSame := true;
  327.     while (p<>nil) and (q<>nil) and AreTheSame do
  328.     begin
  329.         if (p=nil) and (q=nil) then
  330.         AreTheSame := false
  331.         else
  332.         begin
  333.             if (p^.Pow <> q^.Pow) or (p^.Koef <> q^.Koef) then
  334.                 AreTheSame:=false;
  335.             p:=p^.Next;
  336.             q:=q^.Next;
  337.         end
  338.     end;
  339.     Ravni := AreTheSame;
  340. end;
  341.  
  342. function FindTheResult(Mnogochlen:Node; X:integer):integer;
  343. var
  344.     rez:integer;
  345. begin
  346.     rez:=0;
  347.     while Mnogochlen <> nil do
  348.     begin
  349.         rez := rez + Mnogochlen^.Koef * Round(exp( Mnogochlen^.Pow * ln(x)));
  350.         Mnogochlen := Mnogochlen^.Next;
  351.     end;
  352.     FindTheResult := rez;
  353. end;
  354.  
  355. procedure Add(out p:Node; q,r:Node);
  356. var
  357.     x,y:Node;
  358. begin
  359.       new(x);
  360.       p:=x;
  361.       while (q<>nil) and (r<>nil) do
  362.       begin
  363.          if q^.Pow > r^.Pow then
  364.           begin
  365.               x^.Pow := q^.Pow;
  366.               x^.Koef := q^.Koef;
  367.               q:=q^.Next;
  368.           end
  369.           else if q^.Pow < r^.Pow then
  370.           begin
  371.               x^.Pow := r^.Pow;
  372.               x^.Koef := r^.Koef;
  373.               r:=r^.Next;
  374.           end
  375.           else
  376.           begin
  377.               x^.Pow := r^.Pow;
  378.               x^.Koef := r^.Koef + q^.Koef;
  379.               q:=q^.Next;
  380.               r:=r^.Next;
  381.           end;
  382.           y:=x;
  383.           new(x);
  384.           y^.Next := x;
  385.       end;
  386.           y^.Next := nil;
  387. end;
  388.  
  389. begin
  390.     writeln('Данная программа позволяет ввести два многочлена, проверить их равенство,');
  391.     Writeln('найти их сумму и найти значение каждого многочлена в точке Х0');
  392.     FirstMn := ReadMnogochlen;
  393.     write('Первый многочлен: ');
  394.     WriteMnogochlen(FirstMn);
  395.     writeln;
  396.  
  397.     writeln('Ввод второго многочлена.');
  398.     SecMn := ReadMnogochlen;
  399.     write('Второй многочлен: ');
  400.     WriteMnogochlen(SecMn);
  401.     writeln;
  402.     if Ravni(FirstMn,SecMn) then
  403.         writeln('Ваши многочлены равны')
  404.     else
  405.         writeln('Ваши многочлены не равны');
  406.     writeln;
  407.     writeln;
  408.  
  409.     write('Введите Х для расчёта значения: ');
  410.     readln(x);
  411.     writeln('Значение первого многочлена: ',FindTheResult(FirstMn,x));
  412.     writeln('Значение второго многочлена: ',FindTheResult(SecMn,x));
  413.  
  414.     Add(Sum, FirstMn, SecMn);
  415.     write('Сумма многочленов: ');
  416.     WriteMnogochlen(Sum);
  417.     readln;
  418. end.
  419.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement