Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Hoši, nutně bych potřeboval vědět jak přibližně napsat program, který má vyřešit soustavu lineárních rovnic pomocí matice max 20 řádků na 21 sloupců. Máme za úkol to udělat pomocí pole. Např x [m][n], kde m je počet řádků a n samozřejmě počet sloupců. Jsem začátečník v C, takže nějak nemůžu vymyslet to, jak naprogramovat aby pod diagonálou byli samý nuly bez opakování určitýho vzorce či cyklu pro každej řádek samostatně a nakonec dosadit výsledek posledniho řádku do rovnic nahoře. Prosím o něčí pomoc :D předem děkuju
Offline

http://forum.matweb.cz/viewtopic.php?pid=110623#p110623
Přepsat výpisy, aby to bylo ve stylu c a ne c++ snad zváldneš. Příště zkus hledat než se zeptáš.
Offline
↑ renegade1:
Jo..právě že jsem na tohle koukal, ale přepsat bych to asi bohužel neuměl...jsem začátečník v C , zatim jsme C++ vůbec neměli a určitě se to docela liší, tak jestli bys mi nějak nepomohl?
Offline

výpis je cout << promenna; tak místo toho dáš printf("%i", promenna); Snaž se trochu když už to máš celé hotové přímo pod nosem.
Offline
↑ renegade1:
Věř mi, že kdybych věděl jak, tak to udělam...tak díky za nápovědu, zkusim to.
Offline

↑ renegade1:
Hlavně ať tam máš správně datový typ
%i - je integer
%f - flout
....
Offline
↑ gladiator01:
Takhle jsem to nakonec přepsal, ale něco mám špatně a nevím co? + to že nakonec do mainu jsem nedával schválně žadnou určitou matici, nechápu na co je tam ta zadaná..pls poraď....pokud víš, kde mám tu elementární chybu, dej mi vědět ...nechci se furt opakovat ale fakt jsem ještě začátečník v C ..dikes
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 20
#define S 21
void mat(float x[R][S]) {
int i,j,max = 0;
float pom;
for ( i = 0; i < R; i++)
{
for ( j = i + 1; j < R; j++)
if (fabs(x[j][i]) > fabs(x[i][i]))
max = j;
int k;
for (k = i; k < S; k++)
{
pom = x[i][k];
x[i][k] = x[max][k];
x[max][k] = pom;
}
for (j = i + 1; j < R; j++)
for (k = R; k >= i; k--)
x[j][k] = x[j][k] - x[i][k] * x[j][i] / x[i][i];
}
/* vypis*/
for (i = 0; i < R; i++)
{
for (j = 0; j < S - 1; j++)
{
printf("%i", x[i][j]);
if (j == R - 1)
{
printf("%i\n");
}
}
}
}
int main(int argc, char** argv) {
int i, j, k;
float X[R][S];
/* vypis matice */
printf("matice\n");
for (i = 0; i < R; i++)
{
for (j = 0; j < S - 1; j++)
{
printf("%i", X[i][j]);
if (j == R - 1)
{
printf("\n");
}
}
}
printf("\n");
mat(X);
printf("\n");
return (EXIT_SUCCESS);
}
Offline

Hlavne ze ti gladiator01 psala at tam mas spravny datovy typ :-) U tech printf ma byt %f a ne %i, protoze x a X jsou typu float. Take kdyz vymazes tu inicializaci, tak tam budes mit v te matici nejaka nahodna cisla, takze bys tam ji tam mel prozatim vratit (dokud nevyresis nacitani jinak). Muze tam vic chyb, to kdyztak pozdeji.
Co ti tam vlastne konkretne nefunguje? Vypisuje to nejaka divna cisla?
Offline
↑ Lumikodlak:
No to jsem si myslel :D..
Ted jsem to teda opravil a přidal tam tu matici v tom mainu..a vypisuje mi to tohle..
5.0000002.0000003.0000002.000000......................
0.0000000.0000000.0000000...........................
určitě mám někde malou chybu ale nevim kde?
Offline

↑ renegade1:
Mozna velikost te matice, ty tam mas
#define R 20
#define S 21
ale v puvodnim zadani byly velikosti 4 a 5, tak se tam nactou ty hodnoty spatne pri te inicializaci (jestli jsi to neupravoval).
Jestli neni problem v tomhle, tak to bude asi slozitejsi uz.
Offline
↑ Lumikodlak:
Jasný máš pravdu, vypadáto že to bylo tím...ale ted bych potřeboval vyřešit to, jak to udělat pro jakoukoliv matici 20řádků x 21sloupců ....:(
Offline

↑ renegade1:
To zalezi na tom - jakym zpusobem se ty matice maji zadavat? Normalne ze velikost matice a prvky matice ma napsat uzivatel kdyz se ten program spusti?
Offline

↑ renegade1:
To je jednoduché. Nadeklaruješ si pole 20x21, potom uživatel na vstupu zadá hodnoty M a N (rozměry matice) a posloupnost hodnot, kterou pomocí for-cyklů načítáš do toho pole. Musíš hlídat, aby hodnoty M, N nebyly větší než 20,21 aby ti pole nepřeteklo.
Offline
Dělám stejnej příklad a nemůžu dát do kupy kdy má nekonečno řešení a kdy nemá žádný. Potřeboval bych prosím poradit s cyklem, který postupně veme každý řádek a dát podmínku, že když všechny prvky pole v tom řádku jsou rovny nule, tak má nekonečno řešení. A pak ten samý cyklus ale že když každá hodnota v řádku, kromě té poslední, je rovna nule, tak nemá řešení. Zkoušel sem to přes dva for cykly, jeden nacita do poctu řádku a druhý do počtu sloupů, ale to nějak nešlapalo
ukázka výstupu programu pro zadaní matice [(1,1,2),(1,1,2)]- má nekonečno řešení
1.000000 1.000000 2.000000
0.000000 0.000000 0.000000
1.000000 1.000000 2.000000
0.000000 0.000000 0.000000
díky za tipy :)
Offline

↑ Green333:↑ renegade1:
Tady máte pro kontrolu nebo pro inspiraci:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 20
#define S 21
void PocReseni(float a[R][S], float r[R], int N, int M, int res);
// Gaussova eliminace -------------------------------
void mat(float a[R][S], int N, int M, int res)
{
int max = 0,pr=0;
float pom;
for(int i=0; i<N; i++) //nalezení pivota
{
max=i;
for(int j=i+1; j<N; j++)
if(fabs(a[j][i])>fabs(a[i][i]))
max=j;
for(int k=i; k<M; k++)
{
pom=a[i][k];
a[i][k]=a[max][k];
a[max][k]=pom;
}
for(int j=i+1; j<N; j++)
for(int k=N; k>=i; k--)
if(a[i][i]!=0)
a[j][k]= a[j][k] - a[i][k] * a[j][i] / a[i][i];
}
//----------------------------------------------------------------
//Zpětný chod - řešení soustavy
float r[N];
for(int i=0; i<N; i++)
r[i]=a[i][res];
if(pr==0)
{
for(int j=N-1; j>=0; j--)
{
pom=0;
for(int k=j+1; k<=N; k++)
pom=pom+a[j][k]*r[k];
r[j]=(a[j][N]-pom)/a[j][j];
}
}
PocReseni(a,r, N, M, res);
//----------------------------------------------------------------
//---------------------------------------------------------------
}
//Výpis soustavy ----------------------------------------
void vypis(float a[R][S],int N, int n, int m)
{
//Výpis
for(int i=0; i<N; i++)
{//vypisuje prvky, když dojde na konec řadky, odřádkuje
for(int j=0; j<m; j++)
{
printf("%5.3f ", a[i][j]);
if(j==n-1)
printf(" | ");
if(j==n)
printf("\n");
}
}
}
//----------------------------------------------------------------
//Počet řešení ---------------------------------------------------
void PocReseni(float a[R][S],float r[R], int N, int M, int res)
{
float rP[R]; //Pro testování počtu řešení
//Osetreni poctu reseni
for(int i=0; i<N; i++)
rP[i]=a[i][res]; //vektor pravych stran
int p=0,pr=0;
for(int j=0; j<res; j++)
{
while(p<N)
{
if(a[p][j]==0)
{
if(rP[p]==0) //má nekonečně mnoho řešení
pr=1;
else if(rP[p]!=0) //nemá žádné řešení
pr=2;
break;
}
else
{
pr=0; //má jedno řešení
p++;
}
}
}
//Reseni--------
printf("\n");
if(pr==1)
printf("\n!!!Soustava ma nekonecne mnoho reseni!!!\n\n");
else if(pr==2)
printf("\n!!!Soustava nema reseni!!!\n\n"); //např. pokud je více rovnic než proměnných a žádná nejpřejde na nulový řádek
else if(pr==0) // vyjde tedy 0=něco
{
printf("\n!!!Soustava ma jedno reseni!!!\n\n");
printf("\nVektor reseni:\n");
for (int i = 0; i < N; i++)
{
printf("%5.3f ", r[i]);
}
printf("\n");
}
}
//----------------------------------------------------------------
//----------------------------------------------------------------
int main(int argc, char** argv) {
int i, j, k,M,N, res, n, m;
float X[R][S];
//Nacitani cisel-------------------------------------------------
int cisla=0;
printf("Zadej pocet radku a sloupcu (max 20x21)\n ----------------------------------\n");
printf("Pokud je vektor pravych stran nulovy zadejte nuly (pokud ho nezadate dostanete\nspatny vysledek) : ");
while(N>20 || M>21)
{
scanf("%i %i",&N,&M);
if(N<=20 && M<=21) break;
printf("pocet radku a sloupku musi byt < 20 a 21, Zadejte pocet radku a sloupku: \n");
}
printf("Zadavej hodnoty matice (po radcich): \n");
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
scanf("%i", &cisla);
X[i][j]=cisla;
if(M==N)
X[i][M+1]=0;
}
}
//-----------------------------------------------------------------------
// Pokud je matice ctvercova - rovnice navic
if(M==N)
{
M++;
res=M-2;
n=N-1;
m=M-1;
}
else
{
res=M;
n=N;
m=M;
}
//------------------------------------------------------------------------
printf("\n Matice A:\n");
vypis(X,N, n,m);
printf("\n");
mat(X, N, M, res); // Volání fce, která provádí eliminace
printf("\n");
printf("\n Matice GEA(A):\n");
vypis(X,N, n,m);
system("pause");
return (0);
}Offline
Stránky: 1