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 | 1221 (958) | lebdim |
» | KalkulatorOddelek: Programiranje | 1312 (1079) | lebdim |
» | [java] Osnovna vprašanjaOddelek: Programiranje | 2621 (1628) | killa bee |
» | [c#] Vstavljanje vrednosti v tabeloOddelek: Programiranje | 1607 (1429) | Cvenemir |
» | [C++] velikost matrikeOddelek: Programiranje | 1695 (1507) | Jean-Paul |