Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Využij akce až 80 % zdarma při nákupu e-learningu - více informací. Zároveň pouze tento týden sleva až 80 % na e-learning týkající se Swift
Avatar
Daniel Bršťák:3.9.2019 12:25

Dobrý deň,priatelia.
Volám sa Daniel,som začiatočník- samouk v programovaní. Učím sa jazyk C podľa knihy Ritchie Kerningham - Programovací jazyk C. Momentálne som u kapitol pole - funkcie.

Môj problém : neviem ako urobiť funkciu,ktorá vracia pole a zároveň dostáva pole ako vstup. Potrebujem práve túto funkciu,aby som mohol kódovať pre mna zaujímave a dôležité matematické funkcie- súčin matíc,determi­nanty,subdeter­minanty,adjun­gované matice,inverzné matice,gaussovu eliminacnu metodu,Strassenov algoritmus atď. Programovať hviezdičky usporiadané do trojuholníkov ma nebaví.
Pri týchto programoch sa nezaobídem bez polí ako funkcii polí. Naposledy som naprogramoval Gaussovu eliminačnú metódu pre determinant matice 4x4 avšak bez funkcii,takže výpočtovú časť som musel v zdrojovom kóde stále kopírovať len s inými parametrami,čo spôsobilo že kód mal 300 riadkov a bol extrémne neprehľadný. Ale ak by som ho napísal ako funkciu,zmestil by som sa do 50. Pre dalšiu prácu s maticami väčších rozmerov je pole ako funkcia poľa nevyhnutná. Program,ktorý som napísal nefunguje...kom­pilátor ho síce vezme,ale výstup je nezmyselný...vždy vypíše iba jedno číslo do všetkých prvkov matice. Môj program najprv vygeneruje 2 náhodné matice a nakoniec ich sčíta pomocou funkcie,ktorú som napísal.
Dôležitá vec: potrebujem túto funkciu napísať bez pointerov...lebo ešte som sa k nim v R&K nedostal.Za pomoc vopred ďakujem.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/* Deklarácia funkcie*/
int matrixsum( int pole1[5][5] , int pole2[ 5 ] [ 5 ] );

int main()
{
int i,j ;
srand( (unsigned) time(NULL) );
int mat1 [ 5 ] [ 5 ];
int mat2 [ 5 ] [ 5 ];

/*Vygenerovanie 1. matice nahodnych prvkov*/
for( j=0 ; j<5; j++ )
{
for( i=0 ; i<5 ; i++ )
{
mat1[ j ] [ i ] =rand()%4;
printf("%d",mat1[ j ] [ i ]);
printf("\t");
}
printf("\n");
}
printf("\n");

/* Vygenerovanie 2. matice nahodnych prvkov*/
for( j=0 ; j<5; j++ )
{
for( i=0 ; i<5 ; i++ )
{
mat2[ j ] [ i ] = rand()%4;
printf("%d",mat2[ j ] [ i ]);
printf("\t");
}
printf("\n");
}
printf("\n");

/* Výpis súčtu náhodnych matíc*/
for( i=0 ; i<5; i++ )
{
for( j=0 ; j<5 ; j++ )
{
printf(" %d ", matrixsum( ( mat1), (mat2 ) ) );
printf("\t");
}
printf("\n");
}

return 0;
}

/* Funkcia : Sucet matic*/
int matrixsum(int pole1[ 5 ] [ 5 ] ,int pole2[ 5 ] [ 5 ] )
{
int sucet[ 5 ][ 5 ] ;
int i,j;

for(j=0 ; j<5 ; j++ )
{
for( i=0 ; i<5 ; i++ )
{
sucet[ j ] [ i ]= pole1[ j ] [ i ] + pole2[ j ] [ i ]; }
}

return sucet[ j ] [ i ];
}

 
Odpovědět
3.9.2019 12:25
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Daniel Bršťák
DarkCoder:4.9.2019 14:57

Možností je spousta. Jelikož chceš pracovat s maticemi, bude Tě nejspíš zajímat práce s 2D poli. Podívej se na následující příklad, který jsem pro tebe zpracoval. Je v něm vidět, jak předávat 2D pole funkci a jak 2D pole z funkce vracet. Činnost programu by měla být jasná. Pokud Ti přesto nebude cokoli jasné, ptej se.

#include <stdio.h>

#define M 4 // Pocet radku
#define N 5 // Pocet sloupcu

void assign(int arr[][N], int m, int n);
void copy(int arr[][N], int arr2[][N], int m, int n);
void print(int arr[][N], int m, int n);

int main(void){
        int a1[M][N], a2[M][N];

        assign(a1, M, N);
        copy(a1, a2, M, N);
        print(a2, M, N);

        return 0;
}

// Prirazeni dat matici
void assign(int arr[][N], int m, int n){
        for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                        arr[i][j] = i + j;
                }
        }
}

// Kopirovani matic
void copy(int arr[][N], int arr2[][N], int m, int n){
        for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                        arr2[i][j] = arr[i][j];
                }
        }
}

// vypis matice
void print(int arr[][N], int m, int n){
        for (int i = 0; i < M; i++) {
                for (int j = 0; j < N; j++) {
                        printf("%3d", arr[i][j]);
                }
                putchar('\n');
        }
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
4.9.2019 14:57
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na DarkCoder
Daniel Bršťák:6.9.2019 9:03

Ahoj,DarkCoder.
Ďakujem za pomoc. S tvojho kódu som vytiahol to pre mňa podstatné a už zase môžem v samoštúdiu pokračovať ďalej. Až dokončím nejaký programík,ktorý bude stáť za ukážku,tak ho sem hodím.

 
Nahoru Odpovědět
6.9.2019 9:03
Avatar
Odpovídá na Daniel Bršťák
Matúš Olejník:6.9.2019 9:33

Ahoj, keď už ti DarkCoder pomohol, mohol by si jeho odpoveď označiť ako riešenie problému a on vďaka tomu dostane bod na platené články/lekcie.

Nahoru Odpovědět
6.9.2019 9:33
/* I am not sure why this works but it fixes the problem */
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.