private void button_plus_Click(object sender, EventArgs e) { Matrica A = new Matrica(); Matrica B = new Matrica(); Matrica C = new Matrica(); SetMatrixSize(MatrixC, dataGridView3, MatrixA.Rows.Count); if (!(A.FromDataTable(MatrixA, MatrixA.Rows.Count) && B.FromDataTable(MatrixB, MatrixB.Rows.Count))) { MessageBox.Show("Проверьте корректность", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { SetView(ref MatrixA, MatrixA.Rows.Count); SetView(ref MatrixB, MatrixB.Rows.Count); C = (A + B); if (!C.ToDataTable(ref MatrixC, MatrixA.Rows.Count)) { MessageBox.Show("Проверьте корректность", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } ; } }
public static Matrica operator +(Matrica A, Matrica B) { int n1, n2; n1 = A.pd.Length; n2 = B.pd.Length; if (n1 != n2 && A.mas != null && B.mas != null)//если разные размерности { return(new Matrica()); } else { Matrica C = new Matrica(); if (n1 == 1)//если 1*1 { C.pd = new int[1]; C.mas = new int[1]; C.pd[0] = 0; C.mas[0] = A.mas[0] + B.mas[0]; return(C); } else { int j, count; List <int> temp_mas = new List <int>(); List <int> temp_pd = new List <int>(); List <int> temp = new List <int>();//список для хранение сложенных строк temp_mas.Add(A.mas[0] + B.mas[0]); temp_pd.Add(0); for (int i = 1; i < n1; i++) { int posA1 = A.pd[i - 1]; //положение предыдужещего диагонального элем int posB1 = B.pd[i - 1]; int posA = A.pd[i]; //текущего int posB = B.pd[i]; if (posA - posA1 == posB - posB1) { bool flag = true; count = posA - posA1;//количество элементов в строке for (j = 1; j < count; j++) { if ((A.mas[posA1 + j] + B.mas[posB1 + j] == 0) && flag) { flag = true; } else { temp.Add(A.mas[posA1 + j] + B.mas[posB1 + j]); flag = false; } } temp.Add(A.mas[posA] + B.mas[posB]); } else { if (posA - posA1 > posB - posB1) { while (posA - posA1 != posB - posB1)//доходим до равной позиции { posA1++; temp.Add(A.mas[posA1]); } count = posB - posB1; for (j = 1; j <= count; j++) { temp.Add(A.mas[posA1 + j] + B.mas[posB1 + j]); } } else { while (posA - posA1 != posB - posB1) //доходим до равной позиции { temp.Add(B.mas[posB1 + 1]); posB1++; } count = posA - posA1; for (j = 1; j <= count; j++) { temp.Add(A.mas[posA1 + j] + B.mas[posB1 + j]); } } } temp_mas.AddRange(temp); temp_pd.Add(temp_mas.Count - 1); temp.Clear(); } C.mas = new int[temp_mas.Count]; C.pd = new int[temp_pd.Count]; C.mas = temp_mas.ToArray(); C.pd = temp_pd.ToArray(); return(C); } } }