Премини към съдържанието
rusrusrus

Програма намираща нещо подобно на детерминанта

Препоръчан отговор


Здравейте, онзи ден се мъчих да напиша програма намираща детерминантата на дадена матрица.

Всъщност накрая реших да напиша програма, която е нещо подобно - например, ако имаме

1 23 4ще ни изведе 10, защото 1.4 + 2.3 = 10 , ако имаме

1 2 34 5 6

7 8 9

ще ни изведе 450, защото 1.5.9 + 1.6.8 + 2.4.9 + 2.6.7 + 3.4.8 + 3.5.7 = 450. Т.е. прилага същия метод като за намиране на детерминанта само,че само събира числата.

Въпросът ми е дали е добре написана и евентуално кои са и недостатъците и как могат да се поправят.Ето и самата програма:

#include <iostream>using namespace std; void det(int arr[][20] , bool col[20] , int n , int &sum , int i , int counter, int tmp ){if(counter == n) {sum+=tmp;return;}for(int j = 0 ; j<= n-1 ; j++)if(col[j]){col[j] = 0 ;  det(arr, col , n , sum , i+1 ,counter + 1,tmp*arr[i][j]); col[j] = 1;} } int main(){int arr[20][20];cout << "Enter n : ";int n ;  cin >> n; cout << "Enter the matrix: " << endl ;for(int i = 0 ; i <= n-1 ; i ++)for(int j = 0 ; j <= n-1 ; j++)cin >> arr[i][j]; bool col[20]; for(int i = 0 ; i <= n-1 ; i ++ )col[i] = 1; int sum = 0; det(arr , col , n , sum , 0 , 0 ,  1); cout << sum << endl; cin.sync();cin.get();return 0 ;}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

..

Привет !

 

Прегледах приложеното от Вас и за съжаление трябва да започнем по - отдалеч...

 

1) Формулите, които сте записал за изчисляване на детерминанта не са много правилни ...

Моля, погледнете за повече информация тук  - разписани са формулите именно за изчисляване на детерминанти на матрици 2х2 и 3х3.

2) От 1), следва, че и кода Ви не е много правилен. Изчисляването на детерминанти за матрици 2х2 и 3х3 става за константно време, защото формулата може да се изведе непосредствено (както е и разписано на сайта, цитиран в точка 1).

3) Има едно ужасяващо нещо в линейната алгебра, което успява да ми докара главоболие всеки път, когато си помисля за него и което ще трябва да се използва в кода Ви, в случай, че искате програмата Ви да може да намира детерминанта на матрица N x N (N >= 4). Нарича се Адюнгирано Количество . Тогава вече има смисъл кода Ви да е рекурсивен :).

 

Само за протокола: броя събираеми, при изчисляването на детерминанта на матрица N x N е N! (т.е. както и по дефиниция - броя на пермутации на елементите по колони и редове).

 

Тъй като това не е лека задачка, ще Ви приложа малко ресурси, които могат да Ви помогнат в начинанието:

 

Клик, клик, клик, клик

 

Поздрави и успех !

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Въпросът ми е дали е добре написана и евентуално кои са и недостатъците и как могат да се поправят.Ето и самата програма:

След като soundtracker, отбеляза математическите проблеми, аз ще се насоча към програмирането.

[*]Идентацията на кода - ужас. По принцип липсата на такава е предостатъчно за мен да спра да коментирам "добре ли е написана".

[*]Константите. Всеизвестно е, че всички матрици в математиката са най-много 20х20. Това е по-неизменно от скоростта на светлината във вакуум.

[*]Параметрите на функцията - е сигурно можеше и да измислиш още 5-6 по-ненужни параметъра, но с много въображение. Но пък при положение че резултатът е едно число я правиш void. Умно...

[*]Параметрите на функцията 2 част - щом така и така задаваш размерите на масивите и матрицата е с променлив такъв, ползвай указатели, не типове с изрични ограничения - няма полза.

[*]Рекурсията - защо? Може и итеративно.

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Може ли само да ми кажете къде по- точно да използвам указатели, смисъл за кои променливи и също така кои са излишните променливи и съответно как мога да ги избегна.

Иначе това, че има директна формула за 2x2  и 3x3  ми е ясно, просто гледах да се пробвам да докарам случая за по-голяма размерност.Ясно ми е и че това не намира детерминантата , ако искам да я намеря с тази програма трябва някои от тези събираеми не да се събират, а да се вадят.А това ограничение 20x20 го написах просто ей така. В случаят идеята ми е да измисля идеята.Съжалявам, че не написах идеята на това как работи програмата и че нямаше коментари знам, че е ужасно да се чете код така!

 

 

Само за протокола: броя събираеми, при изчисляването на детерминанта на матрица N x N е N! (т.е. както и по дефиниция - броя на пермутации на елементите по колони и редове).

Това ми е ясно също.

А за итеративното решение не мога да го измисля :( . В случая рекурсията ми се струваше удобна, защото програмата се връща на задното число и променя новото.Иначе знам , че рекурсивните програми са по-бавни, но само това измислих :(.

 

Благодаря и на двамата за забележките и отделеното време.

 

П.П. Ще се радвам, ако можете да ми препоръчате някой учебник по C++ , който е в pdf формат или нещо такова( да го има в интернет), тъй като чета по този на Магдалина Тодорова, който уж го водеха много подробен и хубав.За подробен е подробен като за първи учебник, обаче при рекурсията редовно си бяха вкарвани някакви глобални променливи, което казват, че било лоша практика, в уроците за циклите има само от тези по- лесните задачи решени и за упражнение.Няма например такива като горните.За това в момента не мога да напиша горната програма с цикли, а само с рекурсия. Естествено трябва да се има предвид, че се занимавам с програмиране от 5 месеца ( има - няма) .

Редактирано от rusrusrus (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.