Forum » Programiranje » Program v C
Program v C

borut2121 ::
A bi bil kdo tako prijazen in mi pomagal napisat tale program? Sam niti ne vem, kako bi se ga rešil
Naloga se glasi:
Napišite program v programskem jeziku C, ki izračunal produkt množenja matrike in vektorja! Uporabite kazalce in dinamično alokacijo pomnilnika. Produkt naj izračuna funkcija!

Naloga se glasi:
Napišite program v programskem jeziku C, ki izračunal produkt množenja matrike in vektorja! Uporabite kazalce in dinamično alokacijo pomnilnika. Produkt naj izračuna funkcija!

darkkk ::
Evo lahko si s tem pomagaš. Problem je, da VS tega noče kompilat(neke zafrkancije, ker c++ ne pozna tipa void *). Tole je meni še najbolj elegantna implementacija matrik v C-ju.
Aja... vektor je m*1 matrika, tako da lahko samo malo prirediš zadeve. :P
Aja... vektor je m*1 matrika, tako da lahko samo malo prirediš zadeve. :P
#include <stdio.h>
#include <stdlib.h>
/* Delo z matrikami: vnos, izpis, množenje. */
static double **matrika(int, int);
static double **vnos(int *, int *);
static void izpis(double **, int, int);
static double **produkt(double **, int, int, double **, int, int);
int main(void)
{
double **a, **b, **c;
int ma, na, mb, nb;
if ((a = vnos(&ma, &na)) == NULL) return 1;
if ((b = vnos(&mb, &nb)) == NULL) return 1;
if ((c = produkt(a, ma, na, b, mb, nb)) == NULL)
printf(
"\aNapacni podatki ali premalo pomnilnika.\n"
"Matrik ne morem zmnoziti.\n"
);
else {
printf("Produkt danih matrik je:\n");
izpis(c, ma, nb);
}
free(a); free(b); free(c);
return 0;
}
/* Pripravi prostor za matriko velikosti m x n. Če ne uspe, vrne NULL. */
static double **matrika(int m, int n)
{
double **p, *q;
int i;
if ((p = malloc(m * sizeof(q) + m * n * sizeof(*q))) != NULL)
for (i = 0, q = (double *)&p[m]; i < m; q += n) p[i++] = q;
return p;
}
/* Zgradi matriko: prebere elemente, vrne kazalec nanje, */
/* v m in n zapiše velikost matrike. Če ne uspe, vrne NULL. */
static double **vnos(int *m, int *n)
{
double **a;
int i, j;
printf("Vnos matrike:\n");
printf("Stevilo vrstic: "); scanf("%d", m);
printf("Stevilo stolpcev: "); scanf("%d", n);
if ((a = matrika(*m, *n)) == NULL) {
printf("\aPremalo pomnilnika.\n");
return NULL;
}
printf("Vnesi vse elemente (%d) matrike.\n", *n * *m);
printf("Locis jih lahko s poljubnimi 'belimi' znaki.\n");
for (i = 0; i < *m; ++i)
for (j = 0; j < *n; ++j)
scanf("%lf", &a[i][j]);
return a;
}
/* Izpiše elemente matrike a, ki je velikosti m x n. */
static void izpis(double **a, int m, int n)
{
int i, j;
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
printf("%g%c", a[i][j], (j < n - 1) ? '\t' : '\n');
}
/* Zmnoži matriki a in b. Če ne uspe, vrne NULL. */
static double **produkt(double **a, int m, int n, double **b, int p, int q)
{
double **c;
int i, j, k;
if (a == NULL || b == NULL) return NULL; /* Napačni podatki. */
if (n != p) return NULL; /* Matriki nista usklajenih velikosti. */
if ((c = matrika(m, q)) == NULL) return NULL; /* Ni dovolj pomnilnika. */
for (i = 0; i < m; ++i)
for (j = 0; j < q; ++j) {
c[i][j] = 0;
for (k = 0; k < n; ++k)
c[i][j] += a[i][k] * b[k][j];
}
return c;
}
Zgodovina sprememb…
- spremenil: darkkk ()

Tutankhamun ::
Seveda se ne prevede če maš pa narobe. malloc vrne void *, ti maš pa tm double **. Sej ti lepo napiše. A si to sam napisu al si od nek copy/paste naredu. K res ne vem kaj nj bi to pomenl, al sm pa še preveč zaspan. Kje si pa to prevedu in a to dela prov?
/* Pripravi prostor za matriko velikosti m x n. Če ne uspe, vrne NULL. */
static double **matrika(int m, int n)
{
double **p, *q;
int i;
if ((p = malloc(m * sizeof(q) + m * n * sizeof(*q))) != NULL)
for (i = 0, q = (double *)&p[m]; i < m; q += n) p[i++] = q;
return p;
}
AMD Phenom QUAD 9950 Black Edition, 8GB

darkkk ::
Jap dela prav. Nisem pa sam tega pisal že ene 2 leti, tko da copy paste.
Fora je v tem, da tale stvar potem dela tako kot matrika: aij = a[i][j].
Pač rezerviraš si še prostor za tabelo kazalcev na vrstice, katere nastavi ona for zanka.
Takrat sem prevajal s kakim GNU C.
Fora je v tem, da tale stvar potem dela tako kot matrika: aij = a[i][j].
Pač rezerviraš si še prostor za tabelo kazalcev na vrstice, katere nastavi ona for zanka.
Takrat sem prevajal s kakim GNU C.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Algoritmi za urejanje tabelOddelek: Programiranje | 1289 (1026) | lebdim |
» | KalkulatorOddelek: Programiranje | 1378 (1145) | lebdim |
» | [java] Osnovna vprašanjaOddelek: Programiranje | 2724 (1731) | killa bee |
» | [c#] Vstavljanje vrednosti v tabeloOddelek: Programiranje | 1661 (1483) | Cvenemir |
» | [C++] velikost matrikeOddelek: Programiranje | 1756 (1568) | Jean-Paul |