Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2010, 00:12   #1
Гиро-Гинор
Новичок
Джуниор
 
Регистрация: 12.11.2010
Сообщений: 2
По умолчанию Найдите ошибку

Программа корректно решает уравнения методом Гаусса, но не выводит их
на экран, как ожидается.
Если игнорировать ClsScr в самом начале, становятся видны результаты рассчётов.

Программа:

Код:
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]);

End;



{ Функция, реализующая метод Гаусса }

Function Gauss(n: Integer; a: Matrix; b: Vector; var x:Vector): Boolean;

Var

   i, j, k, l: Integer;

   q, m, t: Data;

Begin


     For k := 1 to n - 1 do begin


         { Ищем строку l с максимальным элементом в k-ом столбце}

         l := 0;

         m := 0;

         For i := k to n do

             If Abs(a[i, k]) > m then begin

                m := Abs(a[i, k]);

                l := i;

             end;


         { Если у всех строк от k до n элемент в k-м столбце нулевой,

                то система не имеет однозначного решения }

         If l = 0 then begin

            Gauss := false;

            Exit;

         end;


         { Меняем местом l-ую строку с k-ой }

         If l <> k then begin

            For j := 1 to n do begin

                t := a[k, j];

                a[k, j] := a[l, j];

                a[l, j] := t;

            end;

            t := b[k];

            b[k] := b[l];

            b[l] := t;

         end;


         { Преобразуем матрицу }

         For i := k + 1 to n do begin

             q := a[i, k] / a[k, k];

             For j := 1 to n do

                 If j = k then

                    a[i, j] := 0

                 else

                      a[i, j] := a[i, j] - q * a[k, j];

                 b[i] := b[i] - q * b[k];

             end;


     end;


     { Вычисляем решение }

     x[n] := b[n] / a[n, n];

     For i := n - 1 downto 1 do begin

         t := 0;

         For j := 1 to n-i do

             t := t + a[i, i + j] * x[i + j];

         x[i] := (1 / a[i, i]) * (b[i] - t);

     end;


     Gauss := true;

End;


Var

    n, i: Integer;

    a: Matrix ;

    b, x: Vector;

Begin

      ClrScr;

      Writeln('Программа решения систем линейных уравнений по методу Гаусса');

      Writeln;


      Writeln('Введите порядок матрицы системы (макс. 10)');

      Repeat

             Write('>');

             Read(n);

      Until (n > 0) and (n <= maxn);

      Writeln;


      Writeln('Введите расширенную матрицу системы');

      ReadSystem(n, a, b);

      Writeln;


      If Gauss(n, a, b, x) then begin

         Writeln('Результат вычислений по методу Гаусса');

         WriteX(n, x);

      end

      else

          Writeln('Данную систему невозможно решить по методу Гаусса');

      Writeln;

End.
Гиро-Гинор вне форума Ответить с цитированием
Старый 12.11.2010, 09:47   #2
BeJIuKuu_Hexo4yxa
Пользователь
 
Регистрация: 13.10.2010
Сообщений: 96
По умолчанию

Весь код не разбирал. Вероятно проблема в том, что программа после вывода результатов закрывается и Вы этих результатов не видите. Их становится видно, если не чистить экран перед следующим вызовом.

Для решения добавьте Read(n); в конце программы.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. (Стив Макконнелл)
BeJIuKuu_Hexo4yxa вне форума Ответить с цитированием
Старый 12.11.2010, 23:16   #3
Гиро-Гинор
Новичок
Джуниор
 
Регистрация: 12.11.2010
Сообщений: 2
По умолчанию

Попробую, спасибо
Гиро-Гинор вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найдите ошибку Peperovich Общие вопросы C/C++ 15 12.06.2010 20:50
Найдите ошибку MaJlbBuHa Паскаль, Turbo Pascal, PascalABC.NET 2 20.10.2009 23:26
Найдите ошибку St1fler92 Помощь студентам 4 26.05.2009 15:23
Найдите ошибку! geniy JavaScript, Ajax 4 04.12.2007 16:22