Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Паскаль
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Название темы включает слова - "Помогите", "Спасите", "Срочно"
Название темы не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте >>>правила <<< и заново правильно создайте тему.
 
Опции темы
Старый 02.07.2011, 23:34   #1
Andrew2012
Новичок
 
Регистрация: 02.07.2011
Сообщений: 2
Репутация: 10
По умолчанию Определитель матрицы nxn

Помогите пожалуйста написать комментарии для каждой строки программы.
Условие задачи: Найти детерминант матрицы А размером nxn.
Код:
Program Determinant;
const
 N1=10;
type
Matrice=array[1..N1,1..N1] of real;
var
A:matrice;
I,J,N:integer;
D:real;

Function Det(A:Matrice;N:integer):real;
var
B:matrice;
I:integer;
T,Mn,S:real;

Function Minor(var C:matrice;A:Matrice;N,I,J:integer):real;
var
Im,Jm,Ia,Ja,Nm:integer;
begin
Nm:=N-1; Im:=1; Ia:=1;
while Im<=Nm do
  if Ia<>I then
    begin
      Jm:=1; Ja:=1;
      while Jm<=Nm  do
        if Ja<>J then
          begin
            C[Im,Jm]:=A[Ia,Ja];
            Ja:=Ja+1; Jm:=Jm+1;
          end
                 else Ja:=Ja+1;
        Ia:=Ia+1; Im:=Im+1;
    end
           else Ia:=Ia+1;
end; {*Minor*}

begin
if N=1 then Det:=A[N,N];
if N=2 then Det:=A[1,1]*A[2,2]-A[2,1]*A[1,2];
if N>2 then
  begin
    S:=0;
    for I:=1 to N do
      begin
        Mn:=Minor(B,A,N,I,1);
        if (I mod 2)=1 then begin
                             T:=Det(B,N-1);
                             S:=S+T*A[I,1];
                            end
                       else begin
                             T:=Det(B,N-1);
                             S:=S-T*A[I,1];
                            end;
      end;
    Det:=S;    
  end;
end; {*Determ*}

begin
Write('Vvedite porajdok matrichi N: '); readln(N);
for I:=1 to N do
  begin
   writeln('Vvoditeelementu stroki ',I:2);
   for J:=1 to N do readln(A[I,J]);
  end;
D:=Det(A,N);
Writeln('Opredelitel raven: ',D:7:4);
readln;
end.
Andrew2012 вне форума  
Старый 03.07.2011, 04:45   #2
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Репутация: 19
По умолчанию

Набор данных функций вычисляет определитель матрицы разложением по строке. Зайди на элементарную Википедию, там аналогичным образом считается определитель матрицы третьего порядка. Когда прочтешь и разберешься, думаю, сам комментарии напишешь. Сам когда-то вычислял определитель таким образом.
Серьезно в код не всматривался, но условие:
Код:
if N=2 then
можно убрать
__________________
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума  
Старый 05.07.2011, 01:28   #3
Andrew2012
Новичок
 
Регистрация: 02.07.2011
Сообщений: 2
Репутация: 10
Вопрос

Код:
Program Determinant;//название программы
const N1=10;//константа (используется везде (не изменяется))
type Matrice=array[1..N1,1..N1] of real;//свой тип массива
var//глобальные переменные (способный измениться по ходу программы)
        A:matrice;//переменная с нашим массивом
        I,J,N:integer;//переменные для работы с массивом
        D:real;//переменная для нахождения детерминанта
 
Function Det(A:Matrice;N:integer):real;
var
        B:matrice;
        I:integer;
        T,Mn,S:real;
 
        Function Minor(var C:matrice;A:Matrice;N,I,J:integer):real;
//нахождение дополнительного минора
        var
                Im,Jm,Ia,Ja,Nm:integer; 
//Im - строки минора, Jm - столбцы минора, Ia - строки матрицы А, Ja - столбцы матрицы А, Nm - порядок (размерность) минора.
        begin
                Nm:=N-1; //порядок минора на единицу меньше порядка матрицы
                Im:=1; //берем первую строку
                Ia:=1;
                while Im<=Nm do
                        if Ia<>I then
                        begin
                                Jm:=1; Ja:=1;
                                while Jm<=Nm  do
                                        if Ja<>J then
                                        begin
                                                C[Im,Jm]:=A[Ia,Ja];    
                                                Ja:=Ja+1; Jm:=Jm+1; //определяем какой элемент будет стоять перед минором ?
                                        end
                                else 
                                        Ja:=Ja+1;
                                Ia:=Ia+1; 
                                Im:=Im+1;
                        end
                        else 
                                Ia:=Ia+1;
        end; {*Minor*}
 
begin
        if N=1 then //если  n=1
                Det:=A[N,N]; //нашей функции передается число из массива
        if N=2 then 
                Det:=A[1,1]*A[2,2]-A[2,1]*A[1,2];//нашей функции передается число из массива
        if N>2 then//всё что больше 2 
        begin
                S:=0; //сумма
                for I:=1 to N do
                begin
                        Mn:=Minor(B,A,N,I,1);//находим дополнительный минор
                        if (I mod 2)=1 then //если после деления на 2 равно единице
                        begin
                                T:=Det(B,N-1); 
                                S:=S+T*A[I,1];
                        end
                        else //если не равно выполняется
                        begin
                                T:=Det(B,N-1);
                                S:=S-T*A[I,1];
                        end;
                end;
                Det:=S;    
        end;
end; {*Determ*}
 
begin
        Write('Vvedite porajdok matrichi N: '); 
        readln(N);//ввод длины массива не больше 10
        for I:=1 to N do
        begin
                writeln('Vvoditeelementu stroki ',I:2);
                for J:=1 to N do //заполнение массива
                        readln(A[I,J]);
        end;
        D:=Det(A,N);//нахождение деттерминанта
        Writeln('Opredelitel raven: ',D:7:4);//вывод результата
        readln;//пауза
end.
Как-то так?
Andrew2012 вне форума  
Старый 09.05.2015, 17:18   #4
Юля23
Пользователь
 
Регистрация: 23.03.2015
Сообщений: 20
Репутация: 10
По умолчанию

а как сделать i от 0 до N-1 и j от 0 до N-1?
Юля23 вне форума  
Старый 09.05.2015, 19:08   #5
Вадим Мошев

Заслуженный модератор
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Адрес: programmersforum
Сообщений: 8,457
Репутация: 4056
По умолчанию

Цитата:
Сообщение от Юля23 Посмотреть сообщение
а как сделать i от 0 до N-1 и j от 0 до N-1?
Создайте новую тему для своих вопросов. Одна тема - один атвор.
Вадим Мошев вне форума  
Закрытая тема

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить функцию для определения минимального элемента матрицы NxN sergant71 Паскаль 3 23.06.2011 08:30
Определитель матрицы Rekky Свободное общение 10 24.05.2011 20:40
Определитель Матрицы(реккурсия С) XSerGx Общие вопросы C/C++ 1 08.01.2011 20:29
Определитель матрицы 2 на 2 С++ Mashul'ka Помощь студентам 1 03.11.2010 01:08
Определитель матрицы Snake_ua Помощь студентам 7 10.02.2010 11:44


13:22.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.