Poniżej leci kodzik mnożenia i dodawania macierzy napisany w C#. Będę wdzięczny za komentarze uzupełniające bądź wytykające błędy. Łapcie 🙂
static void Main(string[] args) { int wybor; Console.WriteLine("1. Dodaj macierze"); Console.WriteLine("2. Pomnoz macierze"); Console.Write("\nTwoj wybor to: "); wybor = int.Parse(Console.ReadLine()); switch (wybor) { case 1: dodawanie(); break; case 2: mnozenie(); break; default: Console.WriteLine("Wybierz od 1 do 2"); Console.ReadKey(); break; } } private new static void dodawanie() { int x, y, x1, x2, a, b; double[,] tabA = new double[100, 100]; double[,] tabB = new double[100, 100]; double[,] tabC = new double[100, 100]; Console.WriteLine("Max wymiary macierzy wynosza 100×100.\n\n"); Console.WriteLine("Podaj wymiar macierzy A: "); x = int.Parse(Console.ReadLine()); Console.WriteLine("x"); y = int.Parse(Console.ReadLine()); a = x + y; Console.WriteLine("Macierz A sklada sie z {0} elementow. Podaj je wszystkie: \n", a); for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { tabA[i, j] = int.Parse(Console.ReadLine()); } } Console.WriteLine("Podaj wymiar macierzy B: "); x1 = int.Parse(Console.ReadLine()); x2 = int.Parse(Console.ReadLine()); b = x1 + x2; Console.WriteLine("Macierz B sklada sie z {0} elementow. Podaj je wszystkie: \n", b); for (int i = 0; i < x1; i++) { for (int j = 0; j < x2; j++) { tabB[i, j] = int.Parse(Console.ReadLine()); } } Console.Clear(); Console.WriteLine("Dodawanie macierzy A+B\n"); if (x == x1 && y == x2) { for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { tabC[i, j] = tabA[i, j] + tabB[i, j]; } } for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { Console.Write("\t" + tabC[i, j]); } Console.WriteLine(); } } else { Console.WriteLine("Nie mozna dodać macierzy A i B!!!\n"); } Console.Read(); } private new static void mnozenie() { int x, y, x1, x2, a, b; double[,] tabA = new double[100, 100]; double[,] tabB = new double[100, 100]; double[,] tabC = new double[100, 100]; Console.WriteLine("Max wymiary macierzy wynosza 100×100.\n\n"); Console.WriteLine("Podaj wymiar macierzy A: "); x = int.Parse(Console.ReadLine()); Console.WriteLine("x"); y = int.Parse(Console.ReadLine()); a = x + y; Console.WriteLine("Macierz A sklada sie z {0} elementow. Podaj je wszystkie: \n", a); for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { tabA[i, j] = int.Parse(Console.ReadLine()); } } Console.WriteLine("Podaj wymiar macierzy B: "); x1 = int.Parse(Console.ReadLine()); x2 = int.Parse(Console.ReadLine()); b = x1 + x2; Console.WriteLine("Macierz B sklada sie z {0} elementow. Podaj je wszystkie: \n", b); for (int i = 0; i < x1; i++) { for (int j = 0; j < x2; j++) { tabB[i, j] = int.Parse(Console.ReadLine()); } } Console.Clear(); Console.WriteLine("Mnożenie macierzy A*B\n"); double suma = 0; if (y == x1) { for (int i = 0; i < x; i++) { for (int k = 0; k < x2; k++) { for (int j = 0; j < y; j++) { tabC[i, k] += (tabA[i, j] * tabB[j, k]); } } } for (int i = 0; i < x; i++) { for (int k = 0; k < x2; k++) { Console.Write("\t" + tabC[i, k]); } Console.WriteLine(); } } else { Console.WriteLine("Nie można pomnozyć macierzy A i B"); } Console.ReadLine(); }
Nie sprawdzałem dodawania ale wynik mnożenia jest niepoprawny, tak więc część kodu:
suma = suma + tabA[i, j] * tabB[j, k];
tabC[i, k] = suma;
należy zastąpić np tak:
tabC[i,k] += (tabA[i, j] * tabB[j, k]);
Pozadrawiam asiqq23
Bardzo dziękuję 🙂 Już poprawiam kod.
Przed implementacją jakiegokolwiek algorytmu warto dobrze zrozumieć jego mechanizm. Jeśli ktoś ma problemy ze zrozumieniem dodawania i mnożenia macierzy, to zapraszam na mojego bloga. Znajdziecie tam filmik pokazujący jak krok po kroku wykonać dodawanie i mnożenie macierzy.
Przy mnożeniu macierzy [2,3] przez np [1,3] w wyniku następuje wykraczanie pozna rozmiar tablicy.
Pozdrawiam arqus 🙂
Poprawka chodziło mi o macierz [3,2] * [1,3].
Przepraszam nie było pytania. Wiem gdzie popełniłem błąd.