Решить уравнение - Pascal (80478)

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

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

Ребят, не могли бы помочь? Очень нужно доделать, либо переделать программу. В общем, есть задание: Решить уравнение (ba)!x^2+2*(dc)!x+(mk)!=0, где b,a-сумма модулей и количество элементов, расположенных в матрице z(6,6) ниже побочной диагонали; d,c-сумма модулей и количество элементов, расположенных в матрице w(11,11) ниже побочной диагонали; m,k-сумма модулей и количество элементов, расположенных в матрице v(12,12) ниже побочной диагонали. Знакопеременные массивы сформировать случайным образом. Вот программа:
Листинг программы
  1. // (ba)!x^2+2*dc)!x+(mk)!=0
  2. // z 6-6 w 11-11 v 12-12
  3. program lab6zachas;
  4. uses
  5. crt;
  6. const
  7. ZA = 6;
  8. WA = 11;
  9. VA = 12;
  10. Y = 1;
  11. var
  12. z: array [1..ZA, 1..ZA] of integer;
  13. w: array [1..WA, 1..WA] of integer;
  14. v: array [1..VA, 1..VA] of integer;
  15. a, b, c, d, k, m, x1, x2: integer;
  16. rez, factba, factdc, factmk: LongInt;
  17. i, j: byte;
  18. //
  19. function fact(n: integer): LongInt;
  20. var
  21. r: LongInt;
  22. i: integer;
  23. begin
  24. r := 1;
  25. if n = 1 then fact := 1
  26. else
  27. for i := 2 to n do
  28. begin
  29. r := r * i;
  30. end;
  31. fact := r;
  32. end;
  33. //
  34. procedure xnadva(g, h, j: LongInt; var res: LongInt);
  35. var
  36. D: LongInt;
  37. begin
  38. if (g = 0) then
  39. begin
  40. writeln('Не квадратное уравнение.');
  41. halt;
  42. end;
  43. D := h * h - 4 * g * j;
  44. if (D = 0) then
  45. begin
  46. writeln('x = ', -h / 2.0 / g);
  47. halt;
  48. end;
  49. if (D > 0) then
  50. begin
  51. writeln('x1 = ', (-h + Sqrt(D)) / 2.0 / g);
  52. writeln('x2 = ', (-h - Sqrt(D)) / 2.0 / g);
  53. end
  54. else
  55. begin
  56. writeln('x1 = (', -h / 2.0 / g, ',', Sqrt(-D) / 2.0 / g, ')');
  57. writeln('x2 = (', -h / 2.0 / g, ',', -Sqrt(-D) / 2.0 / g, ')');
  58. end;
  59. end;
  60.  
  61. begin
  62. randomize;
  63. a := 0;
  64. b := 0;
  65. //Z
  66. for i := 1 to ZA do
  67. begin
  68. for j := 1 to ZA do
  69. begin
  70. z[i, j] := random(Y) - random(Y);
  71. write(z[i, j]:5);
  72. end;
  73. writeln;
  74. end;
  75. writeln;
  76. writeln;
  77. //W
  78. for i := 1 to WA do
  79. begin
  80. for j := 1 to WA do
  81. begin
  82. w[i, j] := random(Y) - random(Y);
  83. write(w[i, j]:5);
  84. end;
  85. writeln;
  86. end;
  87. writeln;
  88. writeln;
  89. //V
  90. for i := 1 to VA do
  91. begin
  92. for j := 1 to VA do
  93. begin
  94. v[i, j] := random(Y) - random(Y);
  95. write(v[i, j]:5);
  96. end;
  97. writeln;
  98. end;
  99. writeln;
  100. writeln;
  101. //Zmod
  102. for i := 1 to ZA do
  103. begin
  104. write(' ':5 * (ZA - i + 1));
  105. for j := ZA - i + 2 to ZA do
  106. begin
  107. write(z[i, j]:5);
  108. a := a + 1;
  109. b := b + abs(z[i, j]);
  110. end;
  111. writeln();
  112. end;
  113. writeln(a); // Вывод кол-ва
  114. writeln(b); // Вывод суммы модулей
  115. //Wmod
  116. for i := 1 to WA do
  117. begin
  118. write(' ':5 * (WA - i + 1));
  119. for j := WA - i + 2 to WA do
  120. begin
  121. write(w[i, j]:5);
  122. c := c + 1;
  123. d := d + abs(w[i, j]);
  124. end;
  125. writeln();
  126. end;
  127. writeln(c); // Вывод кол-ва
  128. writeln(d); // Вывод суммы модулей
  129. //Vmod
  130. for i := 1 to VA do
  131. begin
  132. write(' ':5 * (VA - i + 1));
  133. for j := VA - i + 2 to VA do
  134. begin
  135. write(v[i, j]:5);
  136. m := m + 1;
  137. k := k + abs(v[i, j]);
  138. end;
  139. writeln();
  140. end;
  141. writeln(m); // Вывод кол-ва
  142. writeln(k); // Вывод суммы модулей
  143. // (ba)! x^2 + 2(dc)! x + (mk)! = 0
  144. // (ba)! = factba
  145. // (dc)! = factdc
  146. // (mk)! = factmk
  147. factba := fact(a * b);
  148. factdc := fact(d * c);
  149. factmk := fact(m * k);
  150. writeln(factba);
  151. writeln;
  152. writeln(factdc);
  153. writeln;
  154. writeln(factmk);
  155. xnadva(factba, factdc, factmk, rez);
  156. readln;
  157. end.
В общем, ребят, помогите пожалуйста её изменить.Очень вас прошу. Я что-то не пойму, что с ней не так. Заранее, спасибо большое!

Решение задачи: «Решить уравнение»

textual
Листинг программы
  1. uses crt;
  2.  
  3. type BigReal = record mant: extended; expt: int64 end;
  4.      Matrix = array of array of longint;
  5.      rt = array [1..2] of BigReal;
  6.  
  7. procedure WriteBigReal(a: BigReal);
  8. begin
  9.   if a.mant >= 0
  10.     then write('+')
  11.     else write('-');
  12.   write(abs(a.mant):0:17, 'e');
  13.   if a.expt >= 0 then write('+');
  14.   write(a.expt)
  15. end;
  16.  
  17. procedure Normalize(var a: BigReal);
  18. begin
  19.   if a.mant = 0
  20.     then a.expt := 0
  21.     else begin
  22.       while abs(a.mant) >= 10 do
  23.         begin
  24.           inc(a.expt);
  25.           a.mant /= 10
  26.         end;
  27.       while abs(a.mant) < 1 do
  28.         begin
  29.           dec(a.expt);
  30.           a.mant *= 10
  31.         end
  32.     end
  33. end;
  34.  
  35. procedure Scale(var a: BigReal; n: int64);
  36. var i: int64;
  37. begin
  38.   i := 1;
  39.   while i <= n do
  40.     begin
  41.       inc(i);
  42.       inc(a.expt);
  43.       a.mant /= 10
  44.     end
  45. end;
  46.  
  47. function IntToBigReal(n: longint): BigReal;
  48. begin
  49.   Result.mant := n;
  50.   Normalize(Result)
  51. end;
  52.  
  53. procedure align(var a, b: BigReal);
  54. var diff: int64;
  55. begin
  56.   diff := a.expt - b.expt;
  57.   if diff > 20
  58.     then begin
  59.       b.mant := 0;
  60.       b.expt := a.expt
  61.     end
  62.     else if diff < -20
  63.       then begin
  64.         a.mant := 0;
  65.         a.expt := b.expt
  66.       end
  67.       else if diff > 0
  68.         then Scale(b, diff)
  69.         else if diff < 0
  70.           then Scale(a, -diff)
  71. end;
  72.  
  73. operator *(a, b: BigReal)c: BigReal;
  74. begin
  75.   c.mant := a.mant * b.mant;
  76.   c.expt := a.expt + b.expt;
  77.   normalize(c)
  78. end;
  79.  
  80. operator /(a, b: BigReal)c: BigReal;
  81. begin
  82.   if b.mant = 0
  83.     then begin
  84.       write('Ошибка: попытка деления на ноль.');
  85.       readln;
  86.       halt
  87.     end;
  88.   c.mant := a.mant / b.mant;
  89.   c.expt := a.expt - b.expt;
  90.   normalize(c)
  91. end;
  92.  
  93. operator +(a, b: BigReal)c: BigReal;
  94. begin
  95.   align(a, b);
  96.   c.mant := a.mant + b.mant;
  97.   c.expt := a.expt;
  98.   normalize(c)
  99. end;
  100.  
  101. operator -(a, b: BigReal)c: BigReal;
  102. begin
  103.   align(a, b);
  104.   c.mant := a.mant - b.mant;
  105.   c.expt := a.expt;
  106.   normalize(c)
  107. end;
  108.  
  109. function SqrtBigReal(a: BigReal): BigReal;
  110. begin
  111.   if a.mant < 0
  112.     then begin
  113.       write('Ошибка: попытка вычисления квадратного корня из отрицательного числа.');
  114.       readln;
  115.       halt
  116.     end;
  117.   if odd(a.expt)
  118.     then begin
  119.       dec(a.expt);
  120.       a.mant *= 10
  121.     end;
  122.   Result.mant := sqrt(a.mant);
  123.   Result.expt := a.expt div 2;
  124. end;
  125.  
  126. function Factorial(n: longint): BigReal;
  127. const one: BigReal = (mant: 1; expt: 0);
  128. var i: integer;
  129. begin
  130.   if n < 0
  131.     then begin
  132.       write('Ошибка: попытка вычисления факториала от отрицательного числа.');
  133.       readln;
  134.       halt
  135.     end;
  136.   Result := one;
  137.   for i := 2 to n do
  138.     begin
  139.       Result.mant := Result.mant * i;
  140.       Normalize(Result)
  141.     end;
  142. end;
  143.  
  144. const q = 1; //количество значащих цифр в элементах массива
  145.       r = round(exp(q * ln(10))) - 1;
  146.  
  147. procedure Generate(var x: Matrix);
  148. var i, j: longint;
  149. begin
  150.   for i := low(x) to high(x) do
  151.     for j := low(x[low(x)]) to high(x[low(x)]) do
  152.       x[i, j] := -r + random(2 * r + 1)
  153. end;
  154.  
  155. procedure WriteMatrix(s: string; var x: Matrix);
  156. var i, j: longint;
  157. begin
  158.   writeln('Матрица ', s, ':');
  159.   textcolor(LightGray);
  160.   for i := 0 to high(x) do
  161.     begin
  162.       for j := 0 to high(x[0]) do
  163.         begin
  164.           write(x[i, j]:q + 2);
  165.           if j = high(x) - i then textcolor(Yellow)
  166.         end;
  167.       textcolor(LightGray);
  168.       writeln
  169.     end
  170. end;
  171.  
  172. procedure Preprocessing(s: string; var x: Matrix; x_r: integer; var quantity, sum_abs: longint);
  173. var c: char;
  174.     i, j: integer;
  175. begin
  176.   setlength(x, x_r, x_r);
  177.   generate(x);
  178.   WriteMatrix(s, x);
  179.   quantity := x_r * (x_r - 1) div 2;
  180.   writeln('Количество элементов матрицы ниже побочной диагонали: ', quantity);
  181.   sum_abs := 0;
  182.   for i := 1 to high(x) do
  183.     for j := high(x) - i + 1 to high(x) do
  184.       sum_abs += abs(x[i, j]);
  185.   writeln('Сумма их модулей: ', sum_abs);
  186.   write('Нажмите <Enter> для продолжения работы', #13);
  187.   {c := }readkey;
  188.   writeln('                                      ')
  189. end;
  190.  
  191. procedure CompileRoots(a, b, c: BigReal; var x: rt; var n: integer);
  192. const mone: BigReal = (mant: -1; expt: 0);
  193.       two: BigReal = (mant: 2; expt: 0);
  194.       mtwo: BigReal = (mant: -2; expt: 0);
  195.       four: BigReal = (mant: 4; expt: 0);
  196. var d, d1: BigReal;
  197. begin
  198.   if (b.mant = 0) and (c.mant <> 0)
  199.     then n := 4
  200.     else if (a.mant = 0) and (b.mant = 0) and (c.mant = 0)
  201.       then n := 3
  202.       else if (a.mant = 0) and (b.mant <> 0)
  203.         then begin
  204.           n := 1;
  205.           c.mant *= -1;
  206.           x[1] := c / b
  207.         end
  208.         else begin
  209.           d := b * b - four * a * c;
  210.           if d.mant < 0
  211.             then n := 0
  212.             else if d.mant = 0
  213.               then begin
  214.                 n := 1;
  215.                 x[1] := (b / a) / mtwo
  216.               end
  217.               else begin
  218.                 n := 2;
  219.                 d := SqrtBigReal(d);
  220.                 x[1] := ((b - d) / a) / mtwo;
  221.                 x[2] := ((b + d) / a) / mtwo;
  222.               end
  223.         end
  224. end;
  225.  
  226. const z_r = 6;
  227.       w_r = 11;
  228.       v_r = 12;
  229.  
  230. var z, w, v: Matrix;
  231.     a, b, c, d, k, m: longint;
  232.     p2, p1, p0: BigReal;
  233.     roots: rt;
  234.     n, i: integer;
  235. begin
  236.   randomize;
  237.   Preprocessing('Z', z, z_r, a, b);
  238.   Preprocessing('W', w, w_r, c, d);
  239.   Preprocessing('V', v, v_r, k, m);
  240.   p2 := Factorial(a * b);
  241.   p1 := Factorial(c * d);
  242.   p0 := Factorial(k * m);
  243.   writeln('Уравнение:');
  244.   WriteBigReal(p2);
  245.   writeln(' * x^2');
  246.   WriteBigReal(p1);
  247.   writeln(' * x');
  248.   WriteBigReal(p0);
  249.   writeln(' = 0');
  250.   CompileRoots(p2, p1, p0, roots, n);
  251.   case n of
  252.     1: begin
  253.          writeln('Уравнение имеет один корень:');
  254.          write('x[1] = ');
  255.          WriteBigReal(roots[1]);
  256.          writeln
  257.        end;
  258.     2: begin
  259.          writeln('Уравнение имеет два корня:');
  260.          for i := 1 to 2 do
  261.            begin
  262.              write('x[', i, '] = ');
  263.              WriteBigReal(roots[i]);
  264.              writeln
  265.            end
  266.        end;
  267.     3: writeln('Уравнение имеет бесконечное множество корней')
  268.     else writeln('уравнение не имеет корней')
  269.   end;
  270.   write('Нажмите <Enter> для выхода');
  271.   readln
  272. end.

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

  1. Объявляются пользовательские типы данных:
    • BigReal - запись, представляющая большие числа
      • mant - вещественное число большой точности
      • expt - целочисленное число
    • Matrix - массив массивов целых чисел
    • rt - массив из двух переменных типа BigReal
  2. Описываются процедуры и функции для работы с большими числами:
    • WriteBigReal - процедура для вывода большого числа в виде экспоненты
    • Normalize - процедура для нормализации большого числа
    • Scale - процедура для масштабирования большого числа
    • IntToBigReal - функция для преобразования целого числа в большое число
    • align - процедура для выравнивания двух больших чисел
    • Перегруженные операторы для умножения, деления, сложения и вычитания больших чисел
    • SqrtBigReal - функция для нахождения квадратного корня из большого числа
    • Factorial - функция для вычисления факториала
  3. Объявляются константы и процедуры для работы с матрицей:
    • q - количество значащих цифр в элементах массива
    • r - округленное значение для матрицы
    • Generate - процедура для генерации матрицы
    • WriteMatrix - процедура для вывода матрицы в консоль
    • Preprocessing - процедура для предварительной обработки матрицы
    • CompileRoots - процедура для вычисления корней уравнения
  4. Основная часть программы:
    • Объявляются переменные и константы типа Matrix и longint
    • Генерируется три матрицы Z, W, V
    • Вычисляются факториалы от элементов матриц
    • Выводится уравнение и производится вычисление корней
    • Программа завершается после ввода данных пользователем. Этот код выполняет функции работы с большими числами и матрицами, а также вычисление корней уравнения.

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


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

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

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы