Загрузка данных


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cmath>
#include <utility>
#include <fstream>
#include <QString>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    chartView = new QChartView(this);
    ui->gridLayout->addWidget(chartView);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_loadData_clicked()
{
    // --- БЛОК 1: Загрузка данных из файла ---
    std::fstream file("/home/robot33-10/Documents/Krivoj_Aleksej_433/data/test_data.txt"); 
    float x, y;
    data.clear(); 

    while(file >> x >> y) {
        data.push_back({x, y});
    }
    file.close();

    ui->label_status->setText("Загружено: " + QString::number(data.size()) + " измерений"); 
}

void MainWindow::on_pushButton_show_clicked()
{
    if (data.empty()) return; 

    // --- БЛОК 2: Подготовка основного графика и поиск границ ---
    QChart *chart = new QChart();
    QLineSeries *line_series = new QLineSeries();
    line_series->setName("Измерения");
    
    float x_min = 1e18, x_max = -1e18, y_min = 1e18, y_max = -1e18;

    for (int i = 0; i < data.size(); i++) {
        std::pair<float,float> current = data.at(i);
        
        if(current.first < x_min) x_min = current.first;
        if(current.second > y_max) y_max = current.second;
        if(current.first > x_max) x_max = current.first;
        if(current.second < y_min) y_min = current.second;
        
        line_series->append(current.first, current.second);
    }

    // --- БЛОК 3: Математические расчеты ---
    int n = data.size();
    
    float sum_y = 0;
    for (int i = 0; i < n; i++) sum_y += data.at(i).second;
    float mean = sum_y / n;

    float sum_sq_diff = 0;
    for (int i = 0; i < n; i++) sum_sq_diff += std::pow(data.at(i).second - mean, 2);
    float std_dev = std::sqrt(sum_sq_diff / (n - 1));

    float error = 2.093 * (std_dev / std::sqrt(n));

    // Расширяем оси по вертикали для интервалов
    if (mean + error > y_max) y_max = mean + error + (error * 0.5);
    if (mean - error < y_min) y_min = mean - error - (error * 0.5);

    // --- БЛОК 4: Создание линий доверительного интервала ---
    QLineSeries *mean_series = new QLineSeries();
    mean_series->append(x_min, mean);
    mean_series->append(x_max, mean);
    QPen meanPen(Qt::red);
    meanPen.setWidth(2);
    mean_series->setPen(meanPen);

    QLineSeries *upper_ci = new QLineSeries();
    upper_ci->append(x_min, mean + error);
    upper_ci->append(x_max, mean + error);
    QPen ciPen(Qt::green);
    ciPen.setStyle(Qt::DashLine);
    ciPen.setWidth(2);
    upper_ci->setPen(ciPen);

    QLineSeries *lower_ci = new QLineSeries();
    lower_ci->append(x_min, mean - error);
    lower_ci->append(x_max, mean - error);
    lower_ci->setPen(ciPen);

    // --- БЛОК 5: Настройка осей и привязка графиков ---
    QValueAxis *axisX = new QValueAxis();
    QValueAxis *axisY = new QValueAxis();
    axisX->setRange(x_min, x_max);
    axisY->setRange(y_min, y_max);

    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY, Qt::AlignRight);

    chart->addSeries(line_series);
    line_series->attachAxis(axisX);
    line_series->attachAxis(axisY);

    if (n > 1) {
        chart->addSeries(mean_series);
        mean_series->attachAxis(axisX);
        mean_series->attachAxis(axisY);

        chart->addSeries(upper_ci);
        upper_ci->attachAxis(axisX);
        upper_ci->attachAxis(axisY);

        chart->addSeries(lower_ci);
        lower_ci->attachAxis(axisX);
        lower_ci->attachAxis(axisY);
    }

    // --- БЛОК 6: Вывод статистики текстом в интерфейс ---
    QString stats_text = QString("Среднее арифметическое (Y): %1\n"
                                 "СКО: %2\n"
                                 "Доверительный интервал (95%): [%3; %4]")
                                 .arg(mean, 0, 'f', 4)
                                 .arg(std_dev, 0, 'f', 4)
                                 .arg(mean - error, 0, 'f', 4)
                                 .arg(mean + error, 0, 'f', 4);

    ui->label_stats->setText(stats_text);

    chart->setTitle("График распределения");
    chartView->setChart(chart);
}