public void TestTableExtend() { IterTableStruct input_table = new IterTableStruct(); input_table.row_headers = new double[2] { 145, 150 }; input_table.column_headers = new double[2] { 20, 22 }; input_table.matrix = new double[2, 2] { { 41.6, 35 }, { 44.3, 37.2 } }; IterTableStruct expect_table = new IterTableStruct(); expect_table.row_headers = new double[2] { 145, 147.5 }; expect_table.column_headers = new double[2] { 20, 21 }; expect_table.matrix = new double[2, 2] { { 41.6, 38.3 }, { 42.95, 39.525 } }; TableExtender test_extender = new TableExtender(input_table); test_extender.extend(); IterTableStruct real_result = test_extender.getNewMatrix(146, 20.3); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { try { Assert.AreEqual(real_result.matrix[i, j], expect_table.matrix[i, j]); } catch (Exception e) { Console.WriteLine("Matrix test id failed. This is real meaning: " + real_result.matrix[i, j] + "; and expected: " + expect_table.matrix[i, j]); throw e; } } } for (int i = 0; i < 2; i++) { try { Assert.AreEqual(real_result.column_headers[i], expect_table.column_headers[i]); } catch (Exception e) { Console.WriteLine("Column headers test id failed. This is real meaning: " + real_result.column_headers[i] + "; and expected: " + expect_table.column_headers[i]); throw e; } try { Assert.AreEqual(real_result.row_headers[i], expect_table.row_headers[i]); } catch (Exception e) { Console.WriteLine("Row headers test id failed. This is real meaning: " + real_result.row_headers[i] + "; and expected: " + expect_table.row_headers[i]); throw e; } } }
/// <summary> /// Непосредственно вычисление значения /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void вычислениеЗначенияToolStripMenuItem_Click(object sender, EventArgs e) { try { using (var calcDlg = new calculateDlg()) // Создаём экземпляр диалоговой формы { var result = calcDlg.ShowDialog(); // Вызываем диалоговую форму, запрашиваем у пользователя входные данные if (result == DialogResult.OK) // Постараюсь как можно внятнее растолковать, что тут происходит... { double[] full_table_head_rows = getDoubleValuesFromHeadersOfRows(); // Заголовки строк для области данных во всей таблице double[] full_table_head_cols = getDoubleValuesFromHeadersOfColumns(); // Заголовки для столбцов из области данных во всей таблице double[,] full_table_data = getDoubleValuesFromData(); // Непосредственно табличные значения из области данных, тоже вся таблица int[] iter_matrix_rows_indexes = InterpolSearch.Execute(full_table_head_rows, calcDlg.hammingDist); // Индексы заголовков строк искомых элементов в массиве, созданном выше. Важный момент, этот индекс не соответствует индексу из таблицы, что у пользователя на экране. int[] iter_matrix_cols_indexes = InterpolSearch.Execute(full_table_head_cols, calcDlg.standDeviation); // Индексы заголовков столбцов для искомых в таблице данных double[] iter_matrix_row_heads = new double[2]; // Непосредственно заголовки строк искомых элементов double[] iter_matrix_col_heads = new double[2]; // Заголовки столбцов искомых элементов for (int i = 0; i < 2; i++) // Присваиваем значения двум последним массивам { iter_matrix_col_heads[i] = full_table_head_cols[iter_matrix_cols_indexes[i]]; iter_matrix_row_heads[i] = full_table_head_rows[iter_matrix_rows_indexes[i]]; } double[,] iter_matrix = new double[2, 2]; // Здесь будут храниться табличные данные, над которыми будут производиться вычисления // Запись преобразуемых табличных данных в двумерный массив, который будет обрабатываться дальше for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { iter_matrix[i, j] = full_table_data[iter_matrix_rows_indexes[i], iter_matrix_cols_indexes[j]]; } } string full_answer_str = ""; // Эта строка содержит полный ответ, который затем будет выведен в файл string tmp_ans_str; // Строка, куда будут записываться промежуточные результаты tmp_ans_str = string.Format("Усреднение найденных значений: {0} бит", EntropyCalculator.calculate(iter_matrix)); MessageBox.Show(tmp_ans_str); // Выводим среднее значение full_answer_str += tmp_ans_str + '\n'; // Записываем double iter_entropy = 0; // Значение энтропии, вычисленное на каждой итерации IterTableStruct iter_table = new IterTableStruct(); // Структура таблицы iter_table.matrix = iter_matrix; // Записываем начальные табличные значения iter_table.row_headers = iter_matrix_row_heads; // Записывам заголовки строк iter_table.column_headers = iter_matrix_col_heads; // Записываем заголовки столбцов bool continue_iter = true; // Логическая переменная, отвечающая за то, продолжать ли вычисления uint counter = 0; // Счётчик итераций while (continue_iter) // Пока пользователь говорит, что хочет продолжить { TableExtender iterTableExter = new TableExtender(iter_table); // Создаём экземпляр класса для расширения таблицы на текущей итерации iterTableExter.extend(); // Расширяем таблицу iter_table = iterTableExter.getNewMatrix(calcDlg.hammingDist, calcDlg.standDeviation); // Получаем новую таблицу iter_entropy = EntropyCalculator.calculate(iter_table.matrix); // Вычисляем среднее значение энтропии на данной итерации tmp_ans_str = string.Format("Результат по {0}-й итерации: {1} бит", Convert.ToString(counter + 1), Convert.ToString(iter_entropy)); // Записываем промежуточный результат continue_iter = ErrorHandler.processingQuestion(tmp_ans_str + ". Продолжить вычисления?"); // Выводим промежуточный результат full_answer_str += tmp_ans_str + '\n'; // И записываем его в ответ if (continue_iter) { counter++; // Увеличиваем счётчик } } string file_name = "ans.txt"; // Имя файла для записи if (File.Exists(file_name)) // Если он существует - удаляем { File.Delete(file_name); } using (FileStream file = File.OpenWrite(file_name)) // Создаём файловый поток для создания файла и работы с ним using (StreamWriter writer = new StreamWriter(file, Encoding.UTF8)) // Создаём поток для записи в файл writer.Write(full_answer_str); // Записываем данные в файл Process.Start(file_name); // Запускаем файл } } } catch (Exception ex) { ErrorHandler.showErrorMessage(ex.Message + '\n' + ex.StackTrace); } }