Консультация № 179061
12.06.2010, 06:01
0.00 руб.
0 4 0
Уваждаемые эксперты. помогите чуть чуть изменить программку.
в данной программе ввод матрица используют Goto,а мне нужно без ней, просто,через клавиатуру.а потом вывести. помогите пожалуйста.


Приложение:
Uses CRT;
Const
maxn = 10;
Type
Data = Real;
Matrix = Array[1..maxn, 1..maxn] of Data;
Vector = Array[1..maxn] of Data;
{ Процедура ввода расширенной матрицы системы }
Procedure ReadSystem(n: Integer; var a: Matrix; var b: Vector);
Var
i, j, r: Integer;
Begin
r := WhereY;
GotoXY(2, r);
Write('A');
For i := 1 to n do begin
GotoXY(i * 6 + 2, r);
Write(i);
GotoXY(1, r + i + 1);
Write(i:2);
end;
GotoXY((n + 1) * 6 + 2, r);
Write('b');
For i := 1 to n do begin
For j := 1 to n do begin
GotoXY(j * 6 + 2, r + i + 1);

Read(a[i, j]);
end;
GotoXY((n + 1) * 6 + 2, r + i + 1);
Read(b[i]);
end;
End;
{ Процедура вывода результатов }
Procedure WriteX(n :Integer; x: Vector);
Var
i: Integer;
Begin
For i := 1 to n do
Writeln('x', i, ' = ', x[i]:10:2);
End;
{ Функция, реализующая метод Зейделя }
Function Seidel(n: Integer; a: Matrix; b: Vector; var x: Vector; e: Data) :Boolean;
Var
i, j: Integer;
s1, s2, s, v, m: Data;
Begin
{ Исследуем сходимость }
For i := 1 to n do begin
s := 0;
For j := 1 to n do
If j <> i then
s := s + Abs(a[i, j]);
If s >= Abs(a[i, i]) then begin
Seidel := false;
Exit;
end;
end;
Repeat
m := 0;
For i := 1 to n do begin
{ Вычисляем суммы }
s1 := 0;
s2 := 0;
For j := 1 to i - 1 do
s1 := s1 + a[i, j] * x[j];
For j := i to n do
s2 := s2 + a[i, j] * x[j];
{ Вычисляем новое приближение и погрешность }
v := x[i];
x[i] := x[i] - (1 / a[i, i]) * (s1 + s2 - b[i]);
If Abs(v - x[i]) > m then
m := Abs(v - x[i]);
end;
Until m < e;
Seidel := true;
End;
Var
n, i: Integer;
a: Matrix;
b, x: Vector;
e: Data;
Begin
ClrScr;
Writeln('Программа решения систем линейных уравнений по методу Зейделя');
Writeln;
Writeln('Введите порядок матрицы системы (макс. 10)');
Repeat
Write('n=');
Read(n);
Until (n > 0) and (n <= maxn);
Writeln;
Writeln('Введите точность вычислений');
Repeat
Write('e=');
Read(e);
Until (e > 0) and (e < 1);
Writeln;
Writeln('Введите расширенную матрицу системы');
ReadSystem(n, a, b);
Writeln;
{ Предполагаем начальное приближение равным нулю }
For i := 1 to n do
x[i] := 0;
If Seidel(n, a, b, x, e) then begin
Writeln('Результат вычислений по методу Зейделя');
WriteX(n, x);
end
else
Writeln('Метод Зейделя не сходится для данной системы');
Writeln;
readkey;
End.

Обсуждение

давно
Профессор
401888
1232
12.06.2010, 06:45
общий
Что-то Ваша программа как заведенная при любых коэффициентах сообщает, что
Метод Зейделя не сходится для данной системы'
Неизвестный
12.06.2010, 11:12
общий
Пупорев Юрий Борисович:
блиин...точно...раньше работало...а щас не знаю что даже такое.
Неизвестный
12.06.2010, 14:11
общий
Иван Петров:
Представленная программа НЕ ИСПОЛЬЗУЕТ оператор GoTo. В тексте присутствует GoToXY, которая переставляет курсор в место следующего элемента матрицы (таким образом решается проблема ввода элементов с одновременным отображением их на экране). Заметьте, что GoTo и GoToXY это две большие разницы! А ввод элементов осуществляется, как и требуется автору вопроса, пользователем с клавиатуры. Так что же в самом деле нужно сделать в задаче?
Неизвестный
15.06.2010, 21:32
общий
Иван Петров:
Так что же делать нужно? Или ничего не нужно?
Форма ответа