Mnożenie macierzy

0
#include <stdio.h>

int main()
{
  int w1, k1, w2, k2, c, d, k, sum = 0;
  int pierwsza[40][40], druga[40][40], iloczyn[40][40];

  printf("Podaj ilosc wierszy pierwszej macierzy: ");
  scanf("%d", &w1);
  printf("Podaj ilosc kolumn pierwszej macierzy: ");
  scanf("%d", &k1);

  printf("\nPodaj elementy pierwszej macierzy:\n\n");
    for (  c = 0 ; c < w1 ; c++ )
    for ( d = 0 ; d < k1 ; d++ )
        {

      scanf("%d", &pierwsza[c][d]);
    }

  printf("\nPodaj ilosc wierszy drugiej macierzy: ");
  scanf("%d", &w2);
  printf("\nPodaj ilosc kolumn drugiej macierzy: ");
  scanf("%d", &k2);

  if ( k1 != w2 )
    printf("\nMacierze o podanych wymiarach nie moga zostac wymnozone ze wzgledu na niedopasowane wymiary\n");
  else
  {
    printf("Podaj elementy drugiej macierzy.\n\n");

    for ( c = 0 ; c < w2 ; c++ )
      for ( d = 0 ; d < k2 ; d++ )
      {

        scanf("%d", &druga[c][d]);
      }
    for ( c = 0 ; c < w1 ; c++ )
    {
      for ( d = 0 ; d < k2 ; d++ )
      {
        for ( k = 0 ; k < w2 ; k++ )
        {
          sum = sum + pierwsza[c][k]*druga[k][d];
        }

        iloczyn[c][d] = sum;
        sum = 0;
      }
    }

        printf("\nMacierz pierwsza to: \n\n");

    for ( c = 0 ; c < w1 ; c++ )
    {
      for ( d = 0 ; d < k1 ; d++ )
        printf("%d\t", pierwsza[c][d]);

      printf("\n");
    }

    printf("\nMacierz druga to: \n\n");

    for ( c = 0 ; c < w2 ; c++ )
    {
      for ( d = 0 ; d < k2 ; d++ )
        printf("%d\t", druga[c][d]);

      printf("\n");
    }

    printf("\nMacierz bedaca iloczynem podanych macierzy to: \n\n");

    for ( c = 0 ; c < w1 ; c++ )
    {
      for ( d = 0 ; d < k2 ; d++ )
        printf("%d\t", iloczyn[c][d]);

      printf("\n");
    }
  }


  return 0;
}

Posiadam taki kod, do mnożenia macierzy jednak nie umiem go przerobić tak by wykonać zadanie tak jak z załącznika. Bardzo proszę o pomoc. Od tego zależy moje zaliczenie z przedmiotu. Z góry dziękuję.

1

podpowiem tak:
Masz wczytać całą linię:

char lina[256];
scanf("%255[^\n] ", lina);

Potem masz ja przeanalizować, ale nie za pomocą sscanf (bo nie będziesz znał dokładnego miejsca błędu), ale używając strtod.

Nie pchaj wszystkiego do main, zrób sobie takie funkcję wczytajMacierz, mnozMacierze, wydrukujMacierz itd.
Dla utrzymania porządku zdefiniuj strukturę opasującą macierz (ile kolumn, wierszy, gdzie są dane).

Jak coś zrobisz zgodnie z moimi radami to pomogę więcej, ale teraz to przypuszczalnie nic nie zrobiłeś sam (zapewne ten kod nie jest twój), wiec na więcej nie licz.

0
 #include <stdio.h>

void wczytajMacierz1(){

    char lina1[256];
  printf("Wprowadz  pierwsza macierz: ");
  scanf("%255[^\n] ", lina1);

}

void wczytajMacierz2(){
     char lina2[256];
  printf("Wprowadz  druga macierz: ");
  scanf("%255[^\n] ", lina2);

}

void mnozMacierze(){

  }


void wydrukujMacierz(){
    printf("\nMacierz bedaca iloczynem podanych macierzy to: \n\n");


}

int main()
{


  return 0;
}
1

no i źle. wczytajMacierz powinna wyczytywać dowolną macierz, a nie tylko pierwszą! W końcu jest to dokładnie to samo, tylko "zachęta" wygląda inaczej.
Powinna też zwracać jakiś rezultat. Zdefiniuj sobie też strukturę opisująca macierz, właśnie tą wartość będziesz zwracał z funkcji macierz:

struct  Matrix {
    int columns;
    int rows;
    double *data; // albo: double **data; // zależnie jak chcesz trzymać dane
};

Matrix * wczytajMacierz(){ 
    char linia[256];
    scanf("%255[^\n] ", linia);
    char *p = linia;
    Matrix *result = (Matrix *)alloc(sizeof(Matrix));
    result->columns = 0;
    result->rows = 0;
    result->data = ???;
    while(p ???? ) {
    }
}

Najpierw zrób am działające wczytanie macierzy, potem jej drukowanie.

void drukujMacierz(Matrix *m) {
     … … …
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1