Program liczący iloczyn macierzy

0

Witajcie. Mam taki problem:
Na zaliczenie semestru z programowania mam zrobić projekt liczący iloczyn dwóch macierzy wpisanych przez użytkownika z klawiatury w języku C. Oto do czego doszedłem:

 

#include <stdio.h>
 
int main()
{
  int m, n, p, q, c, d, k, sum = 0;
  int pierwsza[50][50], druga[50][50], iloczyn[50][50];
  
  printf("Podaj ilosc wierszy pierwszej macierzy: ");
  scanf("%d", &m);
  printf("Podaj ilosc kolumn pierwszej macierzy: ");
  scanf("%d", &n);
  
  printf("\nPodaj elementy pierwszej macierzy:\n\n");
    for (  c = 0 ; c < m ; c++ )
    for ( d = 0 ; d < n ; d++ )
	{
      printf("Element o wspolrzednych (%d , %d): ",c+1,d+1);
      scanf("%d", &pierwsza[c][d]);
    }
    
  printf("\nPodaj ilosc wierszy drugiej macierzy: ");
  scanf("%d", &p);
  printf("\nPodaj ilosc kolumn drugiej macierzy: ");
  scanf("%d", &q);

  if ( n != p )
    printf("\nMacierze o podanych wymiarach nie moga zostac wymnozone.\n");
  else
  {
    printf("Podaj elementy drugiej macierzy.\n\n");
 
    for ( c = 0 ; c < p ; c++ )
      for ( d = 0 ; d < q ; d++ )
      {
		printf("Element o wspolrzednych ( %d , %d ): ",c+1,d+1);	
        scanf("%d", &druga[c][d]);
      }
    for ( c = 0 ; c < m ; c++ )
    {
      for ( d = 0 ; d < q ; d++ )
      {
        for ( k = 0 ; k < p ; 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 < m ; c++ )
    {
      for ( d = 0 ; d < n ; d++ )
        printf("%d\t", pierwsza[c][d]);
 
      printf("\n");
    } 
 
    printf("\nMacierz druga to: \n\n");
 
    for ( c = 0 ; c < p ; c++ )
    {
      for ( d = 0 ; d < q ; d++ )
        printf("%d\t", druga[c][d]);
 
      printf("\n");
    }
 
    printf("\nMacierz bedaca iloczynem podanych macierzy to: \n\n");
 
    for ( c = 0 ; c < m ; c++ )
    {
      for ( d = 0 ; d < q ; d++ )
        printf("%d\t", iloczyn[c][d]);
 
      printf("\n");
    }
  }
  
  FILE *plik_zapis;
   if((plik_zapis=fopen( "wynik.txt" , "w" ))!=NULL)
    {
     for( c = 0 ; c < m ; c++ )
     {
     
      for ( d = 0 ; d < q ; d++ )
      {
       fprintf(plik_zapis,"%d\t",iloczyn[c][d]);
     //  printf("\n");
      }
	 fclose(plik_zapis);
     printf("Zakonczono zapis do pliku.\n\n");
    }}
   else
     printf("Blad zapisu pliku!\n\n");

  system("PAUSE");
  return 0;
}

Porblem polega na tym, że nie wiem jak zrobić, aby w pliku wynik.txt liczby były zapisane jako macierz, a nie jedna za drugą. Czyli np maciesz 2 x 2, to byłoby: liczba (spacja) liczba (enter) liczba (spacja) liczba.
Mógłby mi ktoś to poprawić w kodzie? Czy mógłbym o to prosić? Z góry dzięki :)

1

Zlituję się nad tobą, tu masz sformatowany kod:

#include <stdio.h>

int main()
{
    int m, n, p, q, c, d, k, sum = 0;
    int pierwsza[50][50], druga[50][50], iloczyn[50][50];

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

    printf("\nPodaj elementy pierwszej macierzy:\n\n");
    for (  c = 0 ; c < m ; c++ ) {
        for ( d = 0 ; d < n ; d++ ) {
            printf("Element o wspolrzednych (%d , %d): ",c+1,d+1);
            scanf("%d", &pierwsza[c][d]);
        }
    }

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

    if ( n != p ) {
        printf("\nMacierze o podanych wymiarach nie moga zostac wymnozone.\n");
    } else {
        printf("Podaj elementy drugiej macierzy.\n\n");

        for ( c = 0 ; c < p ; c++ )
            for ( d = 0 ; d < q ; d++ ) {
                printf("Element o wspolrzednych ( %d , %d ): ",c+1,d+1);        
                scanf("%d", &druga[c][d]);
            }
        for ( c = 0 ; c < m ; c++ ) {
            for ( d = 0 ; d < q ; d++ ) {
                for ( k = 0 ; k < p ; 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 < m ; c++ ) {
            for ( d = 0 ; d < n ; d++ )
                printf("%d\t", pierwsza[c][d]);
            printf("\n");
        } 

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

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

            printf("\n");
        }

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

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

            printf("\n");
        }
    }

    FILE *plik_zapis;
    if((plik_zapis=fopen( "wynik.txt" , "w" ))!=NULL) {
        for( c = 0 ; c < m ; c++ ) {
            for ( d = 0 ; d < q ; d++ ) {
                fprintf(plik_zapis,"%d\t",iloczyn[c][d]);
                //  printf("\n");
            }
            fclose(plik_zapis);
            printf("Zakonczono zapis do pliku.\n\n");
        }
    } else {
        printf("Blad zapisu pliku!\n\n");
    }

    system("PAUSE");
    return 0;
}

zobacz gdzie zamykasz plik ile razy


Czemu nie używasz własnych funkcji? Popatrz ile razy piszesz dokładnie to samo: gdy wczytujesz macierze, gdy je drukujesz
0

Dobra, ogarnąłem, dzięki za pomoc. :)
a co do własnych funkcji, to mam z tym problemy i muszę jeszcze to poogarniać, bo póki co to nie wiem jak to zrobić.

1
void drukujMacierz(FILE *f, int kolumn, int wierszy, int macierz[50][50]) {
    for ( c = 0 ; c < wierszy; c++ ) {
        for ( d = 0 ; d < kolumn ; d++ )
            fprintf(f, "%d\t", macierz[c][d]);
        fprintf(f, "\n");
    }
}
// i możesz użyć tego w 3 miejscach
...
drukujMacierz(stdout, n, m, pierwsza);
...
drukujMacierz(stdout, q, p, druga);
...
drukujMacierz(plik_zapis, q, m, iloczyn);

Wtedy nie miałbyś takiego błędu, bo zrobiłbyś to raz a dobrze (a tak to na 3 razy raz się machnąłeś). Do tego byłoby o wile czytelniejsze.
Prawda jest taka, że te wielkie krzaczy odstraszyły ludzi (ciebie pewnie też odstraszają).

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