/// <summary>
        /// Строит ассоциативные поля для всех экспериментальных слов.
        /// </summary>
        private void btnFieldsForAllWords_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
            //проверяем списки с экспериментальными данными на корректность длины
            if (CheckLists())
            {
                //очищаем компоненты данных
                dgvWords.Rows.Clear();
                dgvMarkems1.Rows.Clear();
                dgvMarkems2.Rows.Clear();
                dgvСorFactor1.Rows.Clear();
                dgvСorFactor2.Rows.Clear();
                foreach (string word in AllWords)
                {
                    dgvWords.Rows.Add(word, 0, 0, 0);
                }

                //инициализируем параметры
                int[] Markems1 = new int[Markems.Count];
                int[] Markems2 = new int[Markems.Count];
                for (int i = 0; i < Markems.Count; i++)
                {
                    Markems1[i] = 0;
                    Markems2[i] = 0;
                }

                double NumSwitInMarkems    = 0;
                double NumAllSwitInMarkems = 0;
                double NumConcInMarkems    = 0;
                double NumAllConcInMarkems = 0;
                double NumInMarkems        = 0;
                double NumAllInMarkems     = 0;

                double NumSwitInNoMarkems    = 0;
                double NumAllSwitInNoMarkems = 0;
                double NumConcInNoMarkems    = 0;
                double NumAllConcInNoMarkems = 0;
                double NumInNoMarkems        = 0;
                double NumAllInNoMarkems     = 0;

                double NumMarkemsSwitMarkems    = 0;
                double NumAllMarkemsSwitMarkems = 0;
                double NumMarkemsConcMarkems    = 0;
                double NumAllMarkemsConcMarkems = 0;
                double NumMarkemsAllMarkems     = 0;
                double NumAllMarkemsAllMarkems  = 0;

                double NumMarkemsSwitNoMarkems    = 0;
                double NumAllMarkemsSwitNoMarkems = 0;
                double NumMarkemsConcNoMarkems    = 0;
                double NumAllMarkemsConcNoMarkems = 0;
                double NumMarkemsAllNoMarkems     = 0;
                double NumAllMarkemsAllNoMarkems  = 0;

                _field = new FieldConstruction(AllWords, Definitions, DirectAssociations, FreeAssociations, Similarities, Opposities);
                //строим ассоциативное поле для каждого слова из экспериментального списка
                for (int k = 0; k < AllWords.Count; k++)
                {
                    _field.InitField(AllWords[k]);    //строим ассоциативное поле для выбранного слова
                    //инициализируем параметры ассоциативного поля
                    int    NumOfSwitches           = 0;
                    int    NumOfAllSwitches        = 0;
                    int    NumOfContactors         = _field.Contactors.Count;
                    int    NumOfAllContactors      = _field.NumOfContactors;
                    double NumOfSwAmongMarkems     = 0;
                    double NumOfConAmongMarkems    = 0;
                    double NumOfAllSwAmongMarkems  = 0;
                    double NumOfAllConAmongMarkems = 0;

                    //вычисляем параметры
                    for (int i = 0; i < AllWords.Count; i++)
                    {
                        if (_field.AllWordsAsSwitches[AllWords[i]] != 0 || _field.AllWordsAsContactors[AllWords[i]] != 0)
                        {
                            dgvWords.Rows[i].Cells[1].Value = (int)dgvWords.Rows[i].Cells[1].Value + _field.AllWordsAsSwitches[AllWords[i]];
                            dgvWords.Rows[i].Cells[2].Value = (int)dgvWords.Rows[i].Cells[2].Value + _field.AllWordsAsContactors[AllWords[i]];
                            dgvWords.Rows[i].Cells[3].Value = (int)dgvWords.Rows[i].Cells[3].Value + _field.AllWordsAsSwitches[AllWords[i]] + _field.AllWordsAsContactors[AllWords[i]];

                            int ind = Markems.IndexOf(AllWords[i]);
                            if (ind != -1)
                            {
                                Markems1[ind] += _field.AllWordsAsContactors[AllWords[i]];
                                Markems2[ind] += _field.AllWordsAsSwitches[AllWords[i]] + _field.AllWordsAsContactors[AllWords[i]];
                            }
                            if (_field.AllWordsAsSwitches[AllWords[i]] != 0)
                            {
                                NumOfSwitches++;
                                NumOfAllSwitches += _field.AllWordsAsSwitches[AllWords[i]];
                                if (ind != -1)
                                {
                                    NumOfSwAmongMarkems++;
                                    NumOfAllSwAmongMarkems += _field.AllWordsAsSwitches[AllWords[i]];
                                }
                            }
                            if ((_field.AllWordsAsContactors[AllWords[i]] != 0) && (ind != -1))
                            {
                                NumOfConAmongMarkems++;
                                NumOfAllConAmongMarkems += _field.AllWordsAsContactors[AllWords[i]];
                            }
                        }
                    }

                    double NumOfMarkemsInAll    = NumOfSwAmongMarkems + NumOfConAmongMarkems;
                    double NumOfAllMarkemsInAll = NumOfAllSwAmongMarkems + NumOfAllConAmongMarkems;

                    double ShareOfMarkemsInSwitches, ShareOfMarkemsInContactors;
                    double ShareOfMarkemsInAllSwitches, ShareOfMarkemsInAllContactors;

                    double ShareOfMarkemsInAll, ShareOfAllMarkemsInAll;

                    if (NumOfSwitches == 0)
                    {
                        ShareOfMarkemsInSwitches    = 0;
                        ShareOfMarkemsInAllSwitches = 0;
                    }
                    else
                    {
                        ShareOfMarkemsInSwitches    = NumOfSwAmongMarkems / NumOfSwitches;
                        ShareOfMarkemsInAllSwitches = NumOfAllSwAmongMarkems / NumOfAllSwitches;
                    }
                    if (NumOfContactors == 0)
                    {
                        ShareOfMarkemsInContactors    = 0;
                        ShareOfMarkemsInAllContactors = 0;
                    }
                    else
                    {
                        ShareOfMarkemsInContactors    = NumOfConAmongMarkems / NumOfContactors;
                        ShareOfMarkemsInAllContactors = NumOfAllConAmongMarkems / NumOfAllContactors;
                    }
                    if (NumOfSwitches == 0 && NumOfContactors == 0)
                    {
                        ShareOfMarkemsInAll    = 0;
                        ShareOfAllMarkemsInAll = 0;
                    }
                    else
                    {
                        ShareOfMarkemsInAll    = NumOfMarkemsInAll / (NumOfSwitches + NumOfContactors);
                        ShareOfAllMarkemsInAll = NumOfAllMarkemsInAll / (NumOfAllSwitches + NumOfAllContactors);
                    }

                    if (Markems.IndexOf(AllWords[k]) != -1)
                    {
                        NumSwitInMarkems    += NumOfSwitches;
                        NumAllSwitInMarkems += NumOfAllSwitches;
                        NumConcInMarkems    += NumOfContactors;
                        NumAllConcInMarkems += NumOfAllContactors;
                        NumInMarkems        += NumOfSwitches + NumOfContactors;
                        NumAllInMarkems     += NumOfAllSwitches + NumOfAllContactors;

                        NumMarkemsSwitMarkems    += NumOfSwAmongMarkems;
                        NumAllMarkemsSwitMarkems += NumOfAllSwAmongMarkems;
                        NumMarkemsConcMarkems    += NumOfConAmongMarkems;
                        NumAllMarkemsConcMarkems += NumOfAllConAmongMarkems;
                        NumMarkemsAllMarkems     += NumOfMarkemsInAll;
                        NumAllMarkemsAllMarkems  += NumOfAllMarkemsInAll;
                    }
                    else
                    {
                        NumSwitInNoMarkems    += NumOfSwitches;
                        NumAllSwitInNoMarkems += NumOfAllSwitches;
                        NumConcInNoMarkems    += NumOfContactors;
                        NumAllConcInNoMarkems += NumOfAllContactors;
                        NumInNoMarkems        += NumOfSwitches + NumOfContactors;
                        NumAllInNoMarkems     += NumOfAllSwitches + NumOfAllContactors;

                        NumMarkemsSwitNoMarkems    += NumOfSwAmongMarkems;
                        NumAllMarkemsSwitNoMarkems += NumOfAllSwAmongMarkems;
                        NumMarkemsConcNoMarkems    += NumOfConAmongMarkems;
                        NumAllMarkemsConcNoMarkems += NumOfAllConAmongMarkems;
                        NumMarkemsAllNoMarkems     += NumOfMarkemsInAll;
                        NumAllMarkemsAllNoMarkems  += NumOfAllMarkemsInAll;
                    }

                    //выводим полученные параметры в DataGridView
                    dgvAllWords.Rows[k].Cells[1].Value = NumOfSwitches.ToString() + " (" + NumOfAllSwitches.ToString() + ")\n";
                    dgvAllWords.Rows[k].Cells[2].Value = NumOfContactors.ToString() + " (" + NumOfAllContactors.ToString() + ")\n";
                    dgvAllWords.Rows[k].Cells[3].Value = (NumOfSwitches + NumOfContactors).ToString() + " (" + (NumOfAllSwitches + NumOfAllContactors).ToString() + ")";
                    dgvAllWords.Rows[k].Cells[4].Value = String.Format("{0:0.00}", ShareOfMarkemsInSwitches) + " (" + String.Format("{0:0.00}", ShareOfMarkemsInAllSwitches) + ")";
                    dgvAllWords.Rows[k].Cells[5].Value = String.Format("{0:0.00}", ShareOfMarkemsInContactors) + " (" + String.Format("{0:0.00}", ShareOfMarkemsInAllContactors) + ")";
                    dgvAllWords.Rows[k].Cells[6].Value = String.Format("{0:0.00}", ShareOfMarkemsInAll) + " (" + String.Format("{0:0.00}", ShareOfAllMarkemsInAll) + ")";
                    if (_field.Steps == 0)
                    {
                        dgvAllWords.Rows[k].Cells[7].Value = (_field.Steps) + " " + (_field.Levels);
                    }
                    else
                    {
                        dgvAllWords.Rows[k].Cells[7].Value = (_field.Steps) + " " + (_field.Levels + 1);
                    }
                }

                int[] MarkemsRang = new int[Markems.Count];
                for (int i = 0; i < Markems.Count; i++)
                {
                    MarkemsRang[i] = Markems.Count - i;
                }

                for (int i = 0; i < Markems.Count; i++)
                {
                    dgvMarkems1.Rows.Add(Markems[i], MarkemsRang[i], Markems1[i], 0);
                    dgvMarkems2.Rows.Add(Markems[i], MarkemsRang[i], Markems2[i], 0);
                }

                /*вычисляем коэффициенты корреляции между рангами и частотами встречаемости маркем
                 * и выводим полученные коэффициенты в DataGridView*/
                int numOfGroups = Markems.Count / Constants.NUM_OF_MARKEMS;
                for (int i = 0; i < numOfGroups; i++)
                {
                    dgvСorFactor1.Rows.Add(i * 10 + 1 + " - " + (i + 1) * 10, Utility.CalcCorretationFactor(MarkemsRang, Markems1, i, true));
                    dgvСorFactor2.Rows.Add(i * 10 + 1 + " - " + (i + 1) * 10, Utility.CalcCorretationFactor(MarkemsRang, Markems2, i, true));
                }

                tbxCorFactor1.Text = Utility.CalcCorretationFactor(MarkemsRang, Markems1, 0, false).ToString();
                tbxCorFactor2.Text = Utility.CalcCorretationFactor(MarkemsRang, Markems2, 0, false).ToString();

                tbxAvgNumSwitInMarkems.Text   = (NumSwitInMarkems / 50).ToString() + " (" + (NumAllSwitInMarkems / 50).ToString() + ")";
                tbxAvgNumConcInMarkems.Text   = (NumConcInMarkems / 50).ToString() + " (" + (NumAllConcInMarkems / 50).ToString() + ")";
                tbxAvgNumSwitInNoMarkems.Text = (NumSwitInNoMarkems / 50).ToString() + " (" + (NumAllSwitInNoMarkems / 50).ToString() + ")";
                tbxAvgNumConcInNoMarkems.Text = (NumConcInNoMarkems / 50).ToString() + " (" + (NumAllConcInNoMarkems / 50).ToString() + ")";
                tbxAvgNumAllInMarkems.Text    = (NumInMarkems / 50).ToString() + " (" + (NumAllInMarkems / 50).ToString() + ")";
                tbxAvgNumAllInNoMarkems.Text  = (NumInNoMarkems / 50).ToString() + " (" + (NumAllInNoMarkems / 50).ToString() + ")";

                tbxAvgNumMarkemsSwitMarkems.Text   = (NumMarkemsSwitMarkems / 50).ToString() + " (" + (NumAllMarkemsSwitMarkems / 50).ToString() + ")";
                tbxAvgNumMarkemsConcMarkems.Text   = (NumMarkemsConcMarkems / 50).ToString() + " (" + (NumAllMarkemsConcMarkems / 50).ToString() + ")";
                tbxAvgNumMarkemsAllMarkems.Text    = (NumMarkemsAllMarkems / 50).ToString() + " (" + (NumAllMarkemsAllMarkems / 50).ToString() + ")";
                tbxAvgNumMarkemsSwitNoMarkems.Text = (NumMarkemsSwitNoMarkems / 50).ToString() + " (" + (NumAllMarkemsSwitNoMarkems / 50).ToString() + ")";
                tbxAvgNumMarkemsConcNoMarkems.Text = (NumMarkemsConcNoMarkems / 50).ToString() + " (" + (NumAllMarkemsConcNoMarkems / 50).ToString() + ")";
                tbxAvgNumMarkemsAllNoMarkems.Text  = (NumMarkemsAllNoMarkems / 50).ToString() + " (" + (NumAllMarkemsAllNoMarkems / 50).ToString() + ")";

                btnExportToExcel.Enabled = true;
                dgvAllWords.FirstDisplayedScrollingRowIndex = 0;
            }
            Cursor = Cursors.Default;
        }
        /// <summary>
        /// Строит ассоциативное поле для выбранного слова.
        /// </summary>
        private void btnFieldForSelectedWord_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
            //проверяем списки с экспериментальными данными на корректность длины
            if (CheckLists())
            {
                dgvWords.Rows.Clear();
                int index = AllWords.IndexOf(cmbAllWords.SelectedItem.ToString());
                _field = new FieldConstruction(AllWords, Definitions, FreeAssociations, DirectAssociations, Similarities, Opposities);
                _field.InitField(cmbAllWords.SelectedItem.ToString());    //строим ассоциативное поле для выбранного слова

                //инициализируем параметры ассоциативного поля
                int    NumOfSwitches           = 0;
                int    NumOfAllSwitches        = 0;
                int    NumOfContactors         = _field.Contactors.Count;
                int    NumOfAllContactors      = _field.NumOfContactors;
                double NumOfSwAmongMarkems     = 0;
                double NumOfConAmongMarkems    = 0;
                double NumOfAllSwAmongMarkems  = 0;
                double NumOfAllConAmongMarkems = 0;
                //вычисляем параметры
                for (int i = 0; i < AllWords.Count; i++)
                {
                    if (_field.AllWordsAsSwitches[AllWords[i]] != 0 || _field.AllWordsAsContactors[AllWords[i]] != 0)
                    {
                        dgvWords.Rows.Add(AllWords[i], _field.AllWordsAsSwitches[AllWords[i]], _field.AllWordsAsContactors[AllWords[i]], _field.AllWordsAsSwitches[AllWords[i]] + _field.AllWordsAsContactors[AllWords[i]]);
                        if (_field.AllWordsAsSwitches[AllWords[i]] != 0)
                        {
                            NumOfSwitches++;
                            NumOfAllSwitches += _field.AllWordsAsSwitches[AllWords[i]];
                            if (Markems.IndexOf(AllWords[i]) != -1)
                            {
                                NumOfSwAmongMarkems++;
                                NumOfAllSwAmongMarkems += _field.AllWordsAsSwitches[AllWords[i]];
                            }
                        }
                        if (_field.AllWordsAsContactors[AllWords[i]] != 0 && Markems.IndexOf(AllWords[i]) != -1)
                        {
                            NumOfConAmongMarkems++;
                            NumOfAllConAmongMarkems += _field.AllWordsAsContactors[AllWords[i]];
                        }
                    }
                }

                double NumOfMarkemsInAll    = NumOfSwAmongMarkems + NumOfConAmongMarkems;
                double NumOfAllMarkemsInAll = NumOfAllSwAmongMarkems + NumOfAllConAmongMarkems;

                double ShareOfMarkemsInSwitches, ShareOfMarkemsInContactors;
                double ShareOfMarkemsInAllSwitches, ShareOfMarkemsInAllContactors;

                double ShareOfMarkemsInAll, ShareOfAllMarkemsInAll;

                if (NumOfSwitches == 0)
                {
                    ShareOfMarkemsInSwitches    = 0;
                    ShareOfMarkemsInAllSwitches = 0;
                }
                else
                {
                    ShareOfMarkemsInSwitches    = NumOfSwAmongMarkems / NumOfSwitches;
                    ShareOfMarkemsInAllSwitches = NumOfAllSwAmongMarkems / NumOfAllSwitches;
                }
                if (NumOfContactors == 0)
                {
                    ShareOfMarkemsInContactors    = 0;
                    ShareOfMarkemsInAllContactors = 0;
                }
                else
                {
                    ShareOfMarkemsInContactors    = NumOfConAmongMarkems / NumOfContactors;
                    ShareOfMarkemsInAllContactors = NumOfAllConAmongMarkems / NumOfAllContactors;
                }
                if (NumOfSwitches == 0 && NumOfContactors == 0)
                {
                    ShareOfMarkemsInAll    = 0;
                    ShareOfAllMarkemsInAll = 0;
                }
                else
                {
                    ShareOfMarkemsInAll    = NumOfMarkemsInAll / (NumOfSwitches + NumOfContactors);
                    ShareOfAllMarkemsInAll = NumOfAllMarkemsInAll / (NumOfAllSwitches + NumOfAllContactors);
                }

                //выводим полученные параметры в DataGridView
                dgvAllWords.Rows[index].Cells[1].Value = NumOfSwitches.ToString() + " (" + NumOfAllSwitches.ToString() + ")";
                dgvAllWords.Rows[index].Cells[2].Value = NumOfContactors.ToString() + " (" + NumOfAllContactors.ToString() + ")";
                dgvAllWords.Rows[index].Cells[3].Value = (NumOfSwitches + NumOfContactors).ToString() + " (" + (NumOfAllSwitches + NumOfAllContactors).ToString() + ")";
                dgvAllWords.Rows[index].Cells[4].Value = String.Format("{0:0.00}", ShareOfMarkemsInSwitches) + " (" + String.Format("{0:0.00}", ShareOfMarkemsInAllSwitches) + ")";
                dgvAllWords.Rows[index].Cells[5].Value = String.Format("{0:0.00}", ShareOfMarkemsInContactors) + " (" + String.Format("{0:0.00}", ShareOfMarkemsInAllContactors) + ")";
                dgvAllWords.Rows[index].Cells[6].Value = String.Format("{0:0.00}", ShareOfMarkemsInAll) + " (" + String.Format("{0:0.00}", ShareOfAllMarkemsInAll) + ")";
                if (_field.Steps == 0)
                {
                    dgvAllWords.Rows[index].Cells[7].Value = (_field.Steps) + " " + (_field.Levels);
                }
                else
                {
                    dgvAllWords.Rows[index].Cells[7].Value = (_field.Steps) + " " + (_field.Levels + 1);
                }
                btnExportToExcel.Enabled                    = true;
                dgvAllWords.Rows[index].Selected            = true;
                dgvAllWords.FirstDisplayedScrollingRowIndex = index;

                //делаем запрос на сохранение полученного ассоциативного поля в таблицу MS Excel
                var confirmResult = MessageBox.Show("Хотите отобразить полученную таблицу в Microsoft Excel?",
                                                    "Сохранение ассоциативного поля",
                                                    MessageBoxButtons.YesNo);
                //если пользователь отвечает "да", то полученное поле экспортируем в таблицу MS Excel
                if (confirmResult == DialogResult.Yes)
                {
                    _resultWriter.ExportField(_field.Field);
                }
            }
            Cursor = Cursors.Default;
        }