Найдите ошибку в программе вычисления определителя матрицы - Pascal

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

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

Программа считает определитель матрицы, но делает это не правильно, найдите пожалуйста ошибку в программе...
Листинг программы
  1. Program Gaus;
  2. Uses Crt;
  3. Type mat=array[1..20,1..20] of real;
  4. Var a:mat; n:integer; det:real;
  5. Procedure wwod(n:integer; Var a:mat);
  6. Var i,j:integer;
  7. Begin
  8. Writeln('Введите элементы матрицы(по строкам)');
  9. For i:=1 to n do
  10. For j:=1 to n do
  11. Read(a[i,j]);
  12. End;
  13. Function Gauss(n:integer; a:mat):Real;
  14. Var i,j,k:integer;
  15. c,p,m,s:Real;
  16. Begin
  17. p:=1;
  18. For k:=1 to n-1 do Begin
  19. s:=a[k,k];
  20. j:=k;
  21. For i:=1 to n do
  22. Begin
  23. m:=a[i,k];
  24. if abs(m)>abs(s) then
  25. Begin
  26. s:=m; j:=i;
  27. end;
  28. end;
  29. if j<>k then
  30. Begin
  31. p:=p-1;
  32. For i:=k to n do
  33. Begin
  34. m:=a[k,i];
  35. a[k,i]:=a[j,i];
  36. a[j,i]:=m;
  37. End;
  38. End;
  39. For i:=k+1 to n do Begin
  40. c:=a[i,k]/a[k,k];
  41. For j:=k+1 to n do
  42. a[i,j]:=a[i,j]-c*a[k,j];
  43. end;
  44. p:=p*s; end;
  45. Gauss:=p*a[n,n];
  46. end;
  47. Begin(*Основная программа*)
  48. Clrscr;
  49. Write('Введите размер матрицы n=');
  50. Readln(n);
  51. Wwod(n,a); det:=Gauss(n,a);
  52. Writeln('Определитель равен',det:8:4);
  53. End.

Решение задачи: «Найдите ошибку в программе вычисления определителя матрицы»

textual
Листинг программы
  1. Uses Crt;
  2. type
  3.   mat = array[1..20, 1..20] of real;
  4.  
  5. var
  6.   a: mat;
  7.   n: integer;
  8.   det: real;
  9.  
  10. procedure wwod(n: integer; var a: mat);
  11. var
  12.   i, j: integer;
  13. begin
  14.   Writeln('Введите элементы матрицы(по строкам)');
  15.   for i := 1 to n do
  16.     for j := 1 to n do
  17.       Read(a[i, j]);
  18. end;
  19.  
  20. function Gauss(n: integer; a: mat): Real;
  21. var
  22.   i, j, k: integer;
  23.   c, p, m, s: Real;
  24. begin
  25.   p := 1;
  26. {  for k := 1 to n - 1 do
  27.   begin
  28.     s := a[k, k];
  29.     j := k;
  30.     for i := 1 to n do
  31.     begin
  32.       m := a[i, k];
  33.       if abs(m) > abs(s) then
  34.       begin
  35.         s := m;j := i;
  36.       end;
  37.     end;
  38.     if j <> k then
  39.     begin
  40.       p := p - 1;
  41.       for i := k to n do
  42.       begin
  43.         m := a[k, i];
  44.         a[k, i] := a[j, i];
  45.         a[j, i] := m;
  46.       end;
  47.     end;     }
  48.     for k:=1 to n do
  49.     begin
  50.       p:=p*a[k,k];
  51.       for i := k + 1 to n do
  52.       begin
  53.          c := a[i, k] / a[k, k];
  54.          for j := k to n do
  55.              a[i, j] := a[i, j] - c * a[k, j];
  56.          end;
  57.       end;
  58.     {p := p * s;}
  59.   Gauss := p;
  60. end;
  61.  
  62. begin(*Основная программа*)
  63.   Clrscr;
  64.   Write('Введите размер матрицы n=');
  65.   Readln(n);
  66.   Wwod(n, a);det := Gauss(n, a);
  67.   Writeln('Определитель равен', det:8:4);
  68.   readln; readln;
  69. end.

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

  1. В функции wwod переменная i и j инициализируются как 0. Но в цикле for они начинаются с 1, поэтому их нужно инициализировать как 1.
  2. В функции Gauss переменная p инициализируется как 1. Но в цикле for она умножается на элемент матрицы a[k,k], поэтому ее нужно инициализировать как 0.
  3. В цикле for в функции Gauss перед проверкой условия if abs(m) > abs(s) нужно добавить переменную j как счетчик для перебора строк матрицы.
  4. В цикле for в функции Gauss после проверки условия if abs(m) > abs(s) нужно обновить значения переменных s и j для следующей итерации.
  5. В цикле for в функции Gauss после обновления значения s и j нужно добавить переменную i как счетчик для перебора столбцов матрицы.
  6. В цикле for в функции Gauss перед обновлением значения a[i, j] нужно добавить переменную m как временное значение для вычисления нового значения.
  7. В цикле for в функции Gauss после обновления значения a[i, j] нужно добавить переменную c как временное значение для вычисления нового значения.
  8. В цикле for в функции Gauss после вычисления значения c нужно обновить значение a[i, j] для следующей итерации.
  9. В основной программе после ввода размера матрицы n нужно инициализировать переменные a, n и det как 0.
  10. В основной программе после вычисления значения det нужно вывести его на экран с точностью до 4 знаков после запятой.

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


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

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

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

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

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

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