» »

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:8)

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!

 Formule

Formule

BigWhale ::

A lahko poves ime tvojega profesorja? :>

misek ::

Tule najdeš množenje dveh matrix: http://www.phanderson.com/C/mat_mult.ht....

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



#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.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Algoritmi za urejanje tabel

Oddelek: Programiranje
51154 (891) lebdim
»

Kalkulator

Oddelek: Programiranje
111228 (995) lebdim
»

[java] Osnovna vprašanja

Oddelek: Programiranje
372483 (1490) killa bee
»

[c#] Vstavljanje vrednosti v tabelo

Oddelek: Programiranje
111518 (1340) Cvenemir
»

[C++] velikost matrike

Oddelek: Programiranje
191631 (1443) Jean-Paul

Več podobnih tem