Advertisement
THOMAS_SHELBY_18

AISD LAB1_1

Feb 11th, 2024 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.07 KB | Source Code | 0 0
  1. program Lab1_1;
  2.  
  3. Type
  4.     TPointer = ^TListElement;
  5.     TListElement = record
  6.         Power: Integer;
  7.         Coef: Integer;
  8.         NextElementPointer: TPointer;
  9.     end;
  10.  
  11. Var
  12.     Choice, PolynomMeaning, X: Integer;
  13.     P, Q, R: TPointer;
  14.     IsEquality: Boolean;
  15.  
  16. Const
  17.     MIN_NUM = -2000000000;
  18.     MAX_NUM = 2000000000;
  19.  
  20. Function PowerNum(X, Pow: Integer): Integer;
  21. Var
  22.     I, ResultNum: Integer;
  23. Begin
  24.     ResultNum := 1;
  25.     For I := 1 To Pow Do
  26.         ResultNum := ResultNum * X;
  27.  
  28.     PowerNum := ResultNum;
  29. End;
  30.  
  31. Function ReadNum (Min: Integer; Max: Integer): Integer;
  32. Var
  33.     Str: String;
  34.     ResultNum, CheckNum, Code: Integer;
  35.     IsCorrect: Boolean;
  36. Begin
  37.     Repeat
  38.         Readln(Str);
  39.         Val(Str, CheckNum, Code);
  40.         If(Code = 0) And (CheckNum >= Min) And (CheckNum <= Max) Then
  41.         Begin
  42.             ResultNum := CheckNum;
  43.             IsCorrect := True;
  44.         End
  45.         Else
  46.         Begin
  47.             Writeln('Некорректный ввод! Попробуйте еще раз!');
  48.             IsCorrect := False;
  49.         End;
  50.     Until IsCorrect;
  51.     ReadNum := ResultNum;
  52. End;
  53.  
  54. Procedure DisposeList(HeaderPointer: TPointer);
  55. Var
  56.     Pointer, TempPointer: TPointer;
  57. Begin
  58.     Pointer := HeaderPointer;
  59.     While(Pointer^.NextElementPointer <> nil) Do
  60.     Begin
  61.         TempPointer := Pointer^.NextElementPointer;
  62.         Dispose(Pointer);
  63.         Pointer := TempPointer;
  64.     End;
  65. End;
  66.  
  67. Procedure InputPolynom(HeaderPointer: TPointer);
  68. Var
  69.     N, I, A: Integer;
  70.     Pointer: TPointer;
  71. Begin
  72.     Write('Введите степень N многочлена: ');
  73.     N := ReadNum(1, MAX_NUM);
  74.     I := N;
  75.  
  76.     Pointer := HeaderPointer;
  77.  
  78.     //Для первого:
  79.     Repeat
  80.         Write('Введите коэффициент многочлена при степени Х равной ', N, ': ');
  81.         A := ReadNum(MIN_NUM, MAX_NUM);
  82.         If A = 0 Then
  83.             Writeln('Старший коэффициент не может быть нулевым!');
  84.     Until A <> 0;
  85.  
  86.     New(Pointer^.NextElementPointer);
  87.     Pointer := Pointer^.NextElementPointer;
  88.     Pointer^.Power := I;
  89.     Pointer^.Coef := A;
  90.  
  91.     //Для остальных
  92.     For I := N-1 DownTo 0 Do
  93.     Begin
  94.         Write('Введите коэффициент многочлена при степени Х равной ', I, ': ');
  95.         A := ReadNum(MIN_NUM, MAX_NUM);
  96.         If A <> 0 Then
  97.         Begin
  98.             New(Pointer^.NextElementPointer);
  99.             Pointer := Pointer^.NextElementPointer;
  100.             Pointer^.Power := I;
  101.             Pointer^.Coef := A;
  102.         End;
  103.     End;
  104.     Pointer^.NextElementPointer := nil;
  105. End;
  106.  
  107. Procedure OutputPolynom(HeaderPointer: TPointer);
  108. Var
  109.     Pointer: TPointer;
  110. Begin
  111.     Pointer := HeaderPointer;
  112.     if Pointer^.NextElementPointer = nil then
  113.         Writeln('0')
  114.     Else
  115.         While(Pointer^.NextElementPointer <> nil) Do
  116.         Begin
  117.             Pointer := Pointer^.NextElementPointer;
  118.  
  119.             case Pointer^.Power of
  120.                 0: Write(Pointer^.Coef);
  121.                 1: If Pointer^.Coef = 1 then
  122.                         Write('X')
  123.                     Else
  124.                         Write (Pointer^.Coef, 'X');
  125.             else
  126.                 if Pointer^.Coef = 1 then
  127.                     Write('X^', Pointer^.Power)
  128.                 Else
  129.                     Write(Pointer^.Coef, 'X^', Pointer^.Power);
  130.             end;
  131.  
  132.             if (Pointer^.NextElementPointer <> Nil) then
  133.                 Write(' + ');
  134.         End;
  135.     Writeln;
  136. End;
  137.  
  138. Function Equality (PHeaderPointer,QHeaderPointer: TPointer): Boolean;
  139. Var
  140.     PPointer, QPointer: TPointer;
  141.     IsEquality: Boolean;
  142. Begin
  143.     IsEquality := True;
  144.  
  145.     PPointer := PHeaderPointer;
  146.     QPointer := QHeaderPointer;
  147.  
  148.     While (PPointer^.NextElementPointer <> Nil) And (QPointer^.NextElementPointer <> Nil)  Do
  149.     Begin
  150.         PPointer := PPointer^.NextElementPointer;
  151.         QPointer := QPointer^.NextElementPointer;
  152.         If(PPointer^.Power <> QPointer^.Power) Or (PPointer^.Coef <> QPointer^.Coef) Then
  153.             IsEquality := False;
  154.     End;
  155.     If (PPointer^.NextElementPointer <> Nil) Or (QPointer^.NextElementPointer <> Nil) then
  156.         IsEquality := False;
  157.  
  158.     Equality := IsEquality;
  159. End;
  160.  
  161. Function Meaning (PHeaderPointer: TPointer; X: Integer): Integer;
  162. Var
  163.     PPointer: TPointer;
  164.     Sum: Integer;
  165. Begin
  166.     PPointer := PHeaderPointer;
  167.     Sum := 0;
  168.     While PPointer^.NextElementPointer <> Nil Do
  169.     Begin
  170.         PPointer := PPointer^.NextElementPointer;
  171.         Sum := Sum + PowerNum(X, PPointer^.Power) * PPointer^.Coef;
  172.     End;
  173.     Meaning := Sum;
  174.  
  175. End;
  176.  
  177. Procedure Add (PHeaderPointer, QHeaderPointer, RHeaderPointer: TPointer);
  178. Var
  179.     PPointer, QPointer, RPointer: TPointer;
  180.     I, PowP, PowQ, N, A, PowR: Integer;
  181. Begin
  182.     PPointer := PHeaderPointer;
  183.     QPointer := QHeaderPointer;
  184.     RPointer := RHeaderPointer;
  185.  
  186.     PowP := PPointer^.NextElementPointer^.Power;
  187.     PowQ := QPointer^.NextElementPointer^.Power;
  188.     If PowP > PowQ then
  189.         N := PowP
  190.     Else
  191.         N := PowQ;
  192.  
  193.     PPointer := PPointer^.NextElementPointer;
  194.     QPointer := QPointer^.NextElementPointer;
  195.  
  196.     For I := N DownTo 0 do
  197.     Begin
  198.         A := 0;
  199.         PowR := -1;
  200.         If PPointer^.Power = I then
  201.         Begin
  202.             PowR := I;
  203.             A := A + PPointer^.Coef;
  204.             If(PPointer^.NextElementPointer <> Nil) Then
  205.                 PPointer := PPointer^.NextElementPointer;
  206.         End;
  207.  
  208.         If QPointer^.Power = I then
  209.         Begin
  210.             PowR := I;
  211.             A := A + QPointer^.Coef;
  212.             If(QPointer^.NextElementPointer <> Nil) Then
  213.                 QPointer := QPointer^.NextElementPointer;
  214.         End;
  215.  
  216.         If (A <> 0) And (PowR <> -1) Then
  217.         Begin
  218.             New(RPointer^.NextElementPointer);
  219.             RPointer := RPointer^.NextElementPointer;
  220.             RPointer^.Power := PowR;
  221.             RPointer^.Coef := A;
  222.         End;
  223.     End;
  224. End;
  225.  
  226.  
  227. Begin
  228.     Writeln('Данная программа предлагает:');
  229.     Writeln('1) Сравнить многочлены степени N на равенство между собой.');
  230.     Writeln('2) Вычислить значение многочлена при аргументе X.');
  231.     Writeln('3) Сложить два многочлена.');
  232.     Writeln('Введите 0 если хотите выйти.');
  233.     Writeln;
  234.  
  235.     Repeat
  236.         Writeln('Выберите желаемое действие! Введите 0, 1, 2 или 3.');
  237.         Choice := ReadNum(0,3);
  238.         Case Choice of
  239.             1:
  240.             Begin
  241.                 Writeln;
  242.                 Writeln('Введите многочлен P');
  243.                 New(P);
  244.                 InputPolynom(P);
  245.  
  246.                 Writeln;
  247.                 Writeln('Введите многочлен Q');
  248.                 New(Q);
  249.                 InputPolynom(Q);
  250.  
  251.                 Writeln;
  252.                 Writeln('Введенные многочлены:');
  253.                 OutputPolynom(P);
  254.                 OutputPolynom(Q);
  255.                 IsEquality := Equality(P, Q);
  256.                 If IsEquality then
  257.                     Writeln('Многочлены эквивалентны!')
  258.                 Else
  259.                     Writeln('Многочлены НЕ эквивалентны!');
  260.  
  261.                 DisposeList(P);
  262.                 DisposeList(Q);
  263.             End;
  264.             2:
  265.             Begin
  266.                 Writeln;
  267.                 Writeln('Введите многочлен P');
  268.                 New(P);
  269.                 InputPolynom(P);
  270.  
  271.                 Writeln;
  272.                 Write('Введите Х: ');
  273.                 X := ReadNum(MIN_NUM, MAX_NUM);
  274.                 PolynomMeaning := Meaning(P, X);
  275.  
  276.                 Writeln;
  277.                 Writeln('Введенный многочлен:');
  278.                 OutputPolynom(P);
  279.                 Writeln('Значение многочлена при Х = ', X, ' равно ', PolynomMeaning);
  280.  
  281.                 DisposeList(P);
  282.             End;
  283.             3:
  284.             Begin
  285.                 Writeln;
  286.                 Writeln('Введите многочлен P');
  287.                 New(P);
  288.                 InputPolynom(P);
  289.  
  290.                 Writeln;
  291.                 Writeln('Введите многочлен Q');
  292.                 New(Q);
  293.                 InputPolynom(Q);
  294.                 New(R);
  295.                 Add(P, Q, R);
  296.  
  297.                 Writeln;
  298.                 Writeln('Введенные многочлены:');
  299.                 OutputPolynom(P);
  300.                 OutputPolynom(Q);
  301.  
  302.                 Writeln;
  303.                 Writeln('Результат сложения многочленов:');
  304.                 OutputPolynom(R);
  305.  
  306.                 DisposeList(P);
  307.                 DisposeList(Q);
  308.                 DisposeList(R);
  309.             End;
  310.         End;
  311.         Writeln('-------------------------------------------------------------');
  312.     Until Choice = 0;
  313. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement