Премини към съдържанието
15 години Kaldata.com – време е да почерпим! Прочети още... ×
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 (преглед на промените)

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


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

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

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

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

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

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

Вход

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

Вход

×

Информация

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