Exemplo n.º 1
0
        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);
                }
                ;
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }