Program liczący iloczyn macierzy

Program liczący iloczyn macierzy
NI
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:2
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:

Kopiuj
 

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

Zobacz pozostałe 4 komentarze
_13th_Dragon
Mam do pomalowania mieszkanie, jesteś bezinteresowny? No to - "przeganiał kocioł garnkowi".
NI
jeśli mieszkasz w zasięgu KZKGOP to w zamian za poprawę programu pomogę malować, tymbardziej, że jak oddam projekt to mam już prawie miesiąć ferii :)
_13th_Dragon
Sformatuj kod po ludzku - sam zobaczysz gdzie problem.
NI
nie będę się powtarzał.
MK
"w zamian za poprawę programu pomogę malować" - Polska, zero bezinteresowanych ludzi :> oczekujesz, że ktoś odwali za Ciebie robotę za darmo, ale sam za darmo nie masz zamiaru pomóc - widzisz niesprawiedliwość? :> I co to za tłumaczenie, że jesteś po liceum? Że niby po liceum to mniej inteligentny niż po technikum i ma prawo nie ogarniać programowania?
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:12 minut
1

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

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

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
NI
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:2
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ć.

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:12 minut
1
Kopiuj
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ą).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.