Guest User

Untitled

a guest
May 14th, 2012
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program Task2(input, output);
  2.  
  3. type term = record coeff, deg: integer end;
  4.      list = ^node;
  5.      node = record t: term; next: list end;
  6.  
  7.      errCode = (success,
  8.                 invalidZeroPolynom,
  9.                 signExpected,
  10.                 degAlreadyPresent,
  11.                 emptyPolynom,
  12.                 invalidCoeff,
  13.                 invalidDeg,
  14.                 degExpected,
  15.                 emptyTerm);
  16.      error = record pos: integer; code: errCode end;
  17.  
  18. var polynoms: array[1..2] of list;
  19.     errInfo: error;
  20.     i: integer;
  21.  
  22. { ================================ ‘ЇЁб®Є =============================== }
  23.  
  24. procedure CreateList(var l: list);
  25. begin
  26.      new(l);
  27.      l^.t.coeff := 0; l^.t.deg := -1;
  28.      l^.next := nil
  29. end;
  30.  
  31. procedure Insert(var l: list; t: term);
  32. var temp: list;
  33. begin
  34.      temp := l;
  35.      new(l); l^.t := t; l^.next := temp
  36. end;
  37.  
  38. function IsEmpty(l: list): boolean;
  39. begin
  40.      IsEmpty := l^.next = nil
  41. end;
  42.  
  43. procedure FindAndInsert(var l: list; t: term; var errInfo: error);
  44. var i: list;
  45. begin
  46.      if t.deg > l^.t.deg then Insert(l, t)
  47.      else
  48.      begin
  49.           i := l;
  50.           while t.deg < i^.next^.t.deg do i := i^.next;
  51.  
  52.           if (i^.t.deg = t.deg) or (i^.next^.t.deg = t.deg) then
  53.              errInfo.code := degAlreadyPresent
  54.           else Insert(i^.next, t)
  55.      end
  56. end;
  57.  
  58. function Compare(l1, l2: list): boolean;
  59. var res: boolean;
  60. begin
  61.      res := true;
  62.      while res and not IsEmpty(l1) and not IsEmpty(l2) do
  63.      begin
  64.           res := (l1^.t.deg = l2^.t.deg) and (l1^.t.coeff = l2^.t.coeff);
  65.           l1 := l1^.next; l2 := l2^.next
  66.      end;
  67.  
  68.      res := res and (IsEmpty(l1) = IsEmpty(l2));
  69.      Compare := res
  70. end;
  71.  
  72. { =========================== —⥭ЁҐ ¬­®Ј®з«Ґ­  ========================= }
  73.  
  74. { —⥭ЁҐ 楫®Ј® зЁб«  }
  75. procedure ReadInteger(var n: integer; var ch: char);
  76. begin
  77.      n := 0;
  78.      repeat
  79.            n := n * 10 + ord(ch) - ord('0');
  80.            read(ch)
  81.      until ('0' > ch) or (ch > '9')
  82. end;
  83.  
  84. { —⥭ЁҐ ®¤­®з«Ґ­  ЎҐ§ ЇаҐ¤иҐбвўго饣® §­ Є  }
  85. procedure ReadTerm(var out: term; var ch: char; var errInfo: error);
  86. var coeffExplicit, degExplicit: boolean;
  87.  
  88.   { —⥭ЁҐ Є®нддЁжЁҐ­в  ®¤­®з«Ґ­  }
  89.   procedure ReadCoeff(var n: integer);
  90.   begin
  91.        ReadInteger(n, ch);
  92.        if n = 0 then errInfo.code := invalidCoeff
  93.   end;
  94.  
  95.   { —⥭ЁҐ Ї®Є § вҐ«п б⥯Ґ­Ё }
  96.   procedure ReadDeg(var n: integer);
  97.   begin
  98.        read(ch);
  99.        if ch = '^' then
  100.        begin
  101.             read(ch);
  102.             if ('0' <= ch) and (ch <= '9') then
  103.             begin
  104.                  ReadInteger(n, ch);
  105.                  if n < 2 then errInfo.code := invalidDeg
  106.             end
  107.             else errInfo.code := degExpected
  108.        end
  109.        else n := 1
  110.   end;
  111.  
  112. begin
  113.      coeffExplicit := ('0' <= ch) and (ch <= '9');
  114.      if coeffExplicit then ReadCoeff(out.coeff)
  115.      else out.coeff := 1;
  116.  
  117.      if errInfo.code = success then
  118.      begin
  119.           degExplicit := ch = 'X';
  120.           if degExplicit then ReadDeg(out.deg)
  121.           else out.deg := 0;
  122.  
  123.           if not (coeffExplicit or degExplicit) and (errInfo.code = success) then
  124.              errInfo.code := emptyTerm
  125.      end
  126. end;
  127.  
  128. { —⥭ЁҐ ­Ґ­г«Ґў®Ј® ¬­®Ј®з«Ґ­  }
  129. procedure ReadNonZeroPolynom(var out: list; var ch: char; var errInfo: error);
  130. var signNeeded, sign: boolean;
  131.     i: integer;
  132.  
  133.   { —⥭ЁҐ §­ Є  ЇҐаҐ¤ ®¤­®з«Ґ­®¬ }
  134.   procedure ReadSign(var s: boolean);
  135.   begin
  136.        if (ch = '+') or (ch = '-') then
  137.        begin
  138.             s := ch = '-';
  139.             read(ch)
  140.        end
  141.        else if not signNeeded then
  142.        begin
  143.             s := false;
  144.             signNeeded := true
  145.        end
  146.        else errInfo.code := signExpected
  147.   end;
  148.  
  149.   { —⥭ЁҐ ®¤­®з«Ґ­  Ё ҐЈ® ўбв ўЄ  ў бЇЁб®Є }
  150.   procedure ReadAndInsertTerm;
  151.   var t: term;
  152.   begin
  153.        ReadTerm(t, ch, errInfo);
  154.  
  155.        if errInfo.code = success then
  156.        begin
  157.             if sign then t.coeff := -t.coeff;
  158.             FindAndInsert(out, t, errInfo)
  159.        end
  160.   end;
  161.  
  162. begin
  163.      signNeeded := false; i := 0;
  164.  
  165.      while (ch <> ' ') and (errInfo.code = success) do
  166.      begin
  167.           ReadSign(sign);
  168.           if errInfo.code = success then ReadAndInsertTerm;
  169.           i := i + 1
  170.      end;
  171.  
  172.      if errInfo.code <> success then errInfo.pos := i
  173. end;
  174.  
  175. { —⥭ЁҐ ¬­®Ј®з«Ґ­  }
  176. procedure ReadPolynom(var out: list; var errInfo: error);
  177. var ch: char;
  178.     zero: term;
  179. begin
  180.      errInfo.code := success; errInfo.pos := 0;
  181.      CreateList(out);
  182.      read(ch);
  183.  
  184.      if ch = '0' then
  185.      begin { Zero polynomial }
  186.           zero.coeff := 0;
  187.           zero.deg := 0;
  188.           Insert(out, zero);
  189.  
  190.           read(ch);
  191.           if ch <> ' ' then errInfo.code := invalidZeroPolynom
  192.      end
  193.      else
  194.      begin { Non-zero polynomial }
  195.           ReadNonZeroPolynom(out, ch, errInfo);
  196.           if (errInfo.code = success) and IsEmpty(out) then
  197.              errInfo.code := emptyPolynom
  198.      end
  199. end;
  200.  
  201. { =========================== €­вҐа䥩б ================================= }
  202.  
  203. { ‚лў®¤ б®®ЎйҐ­ЁҐ ®Ў ®иЁЎЄҐ ­  нЄа ­ }
  204. procedure ReportError(errInfo: error);
  205. begin
  206.      write('Error');
  207.      if errInfo.pos <> 0 then write(' in monomial ', errInfo.pos);
  208.      write(': ');
  209.  
  210.      case errInfo.code of
  211.           invalidZeroPolynom: writeln('Invalid zero polynomial.');
  212.           signExpected: writeln('Sign expected before monomial.');
  213.           degAlreadyPresent: writeln('Monomial of this power is already present in polynomial.');
  214.           emptyPolynom: writeln('Polynomial must contain at least one monomial.');
  215.           invalidCoeff: writeln('Coefficient must be different from zero.');
  216.           invalidDeg: writeln('Power must be greater than 1.');
  217.           degExpected: writeln('Number expected after ^ sign.');
  218.           emptyTerm: writeln('Monomial is empty.');
  219.      end
  220. end;
  221.  
  222. begin
  223.      i := 1;
  224.      repeat
  225.            writeln('Enter polynomial ', i, ', space-terminated:');
  226.            ReadPolynom(polynoms[i], errInfo); readln;
  227.            i := i + 1;
  228.      until (i > 2) or (errInfo.code <> success);
  229.  
  230.      if errInfo.code = success then
  231.         writeln('Result: ', Compare(polynoms[1], polynoms[2]))
  232.      else ReportError(errInfo)
  233. end.
Advertisement
Add Comment
Please, Sign In to add comment