#include "sequential_design.h"
#include "ui_sequential_design.h"
sequential_design::sequential_design(QWidget *parent) :
QWidget(parent),
ui(new Ui::sequential_design)
{
ui->setupUi(this);
}
sequential_design::~sequential_design()
{
delete ui;
}
void sequential_design::gold_cut()
{
//寻找极值(最大值、最小值确定计算范围)
if(ui->lineEdit->text().isEmpty() || ui->lineEdit->text().isNull()||ui->lineEdit_2->text().isEmpty() || ui->lineEdit_2->text().isNull())
{
QMessageBox::warning(NULL, QStringLiteral("提示"), QString::fromLocal8Bit("请填写计算列或比队列的数值"));
return;
}
else
{
cal_col = ui->lineEdit->text().toInt();
bill_col = ui->lineEdit_2->text().toInt();
int min_v=999999,max_v=0;
int num,row_num;
for(int i=0;i<ui->tableWidget->rowCount();i++)
{
if(ui->tableWidget->item(i,cal_col) == 0 || ui->tableWidget->item(i,cal_col)->text().isEmpty()||ui->tableWidget->item(i,cal_col)->text().isNull())
{
row_num = i;
break;
}
}
qDebug()<<row_num;
table_same(cal_col);
for(int i=1;i<row_num;i++)
{
if(ui->tableWidget->item(i,cal_col) == 0)
{
continue;
}
else
{
num++;
if(num==1)
{
min_v = ui->tableWidget->item(i,cal_col)->text().toInt();
max_v = ui->tableWidget->item(i,cal_col)->text().toInt();
}
else
{
if(ui->tableWidget->item(i,cal_col)->text().toInt()<min_v)
{
min_v = ui->tableWidget->item(i,cal_col)->text().toInt();
}
if(ui->tableWidget->item(i,cal_col)->text().toInt()>max_v)
{
max_v = ui->tableWidget->item(i,cal_col)->text().toInt();
}
}
}
}
qDebug()<<min_v<<max_v;
cal_fun(min_v,max_v);
}
}
void sequential_design::cal_fun(int min, int max)
{
//黄金分割法的计算方式
double x1=0,x2=0;
x1 = min+(max-min)*VALUE;
int x_1 = qRound(x1);
QString v1 = find_table_data(QString::number(x_1),cal_col);
if(v1=="")
{
return;
}
x2=max-(max-min)*VALUE;
int x_2 = qRound(x2);
QString v2 = find_table_data(QString::number(x_2),cal_col);
if(v2=="")
{
return;
}
qDebug()<<x_1<<x_2<<v1<<v2;
create_table();
ui->tableWidget_2->insertRow(ui->tableWidget_2->rowCount());
if(v2.toDouble()>v1.toDouble())
{
// x3 = x2+(max-x2)*VALUE;
max_result = v2.toDouble();
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,0,new QTableWidgetItem(QString::number(x_2)));
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,1,new QTableWidgetItem(v2));
visit_cal (x_2,min);
}
else
{
// x3 = min+(x2-min)*VALUE;
max_result = v1.toDouble();
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,0,new QTableWidgetItem(QString::number(x_1)));
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,1,new QTableWidgetItem(v1));
visit_cal(x_1,max);
}
}
void sequential_design::table_same(int col)
{
for(int i=1;i<ui->tableWidget->rowCount();i++)
{
int flag_num=0;
for(int k=1;k<ui->tableWidget->rowCount();k++)
{
if(ui->tableWidget->item(i,col)!=0 && ui->tableWidget->item(k,col)!=0 )
{
if(ui->tableWidget->item(i,col)->text() == ui->tableWidget->item(k,col)->text())
{
flag_num++;
}
}
}
if(flag_num>1)
{
QMessageBox::warning(NULL, QStringLiteral("提示"), QString::fromLocal8Bit("表中的数据重复,修正后操作!"));
return;
}
}
}
QString sequential_design::find_table_data(QString str, int col)
{
for(int i=1;i<ui->tableWidget->rowCount();i++)
{
if(ui->tableWidget->item(i,col)->text() == str)
{
if( ui->tableWidget->item(i,bill_col) != 0)
{
return ui->tableWidget->item(i,bill_col)->text();
}
else
{
QMessageBox::warning(NULL, QStringLiteral("提示"), QString::fromLocal8Bit("表中数据为空,无法计算"));
return "";
}
}
}
}
void sequential_design::visit_cal(int x1, int m_v)
{
double x=0;
if(x1>m_v)
{
x = m_v+(x1-m_v)*VALUE;
}
else
{
x = x1+(m_v-x1)*VALUE;
}
int x_ = qRound(x);
QString v_str = find_table_data(QString::number(x_),cal_col);
qDebug()<<"x_"<<x_<<v_str;
if(v_str.toDouble()<max_result)
{
return;
}
else
{
ui->tableWidget_2->insertRow(ui->tableWidget_2->rowCount());
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,0,new QTableWidgetItem(QString::number(x_)));
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,1,new QTableWidgetItem(v_str));
visit_cal(x_,m_v);
}
}
void sequential_design::create_table()
{
ui->tableWidget_2->setRowCount(0);
ui->tableWidget_2->setColumnCount(2);
QStringList list;
list<<ui->tableWidget->item(0,cal_col)->text()<<ui->tableWidget->item(0,bill_col)->text();
ui->tableWidget_2->setHorizontalHeaderLabels(list);
}
void sequential_design::separate_figure()
{
if(ui->lineEdit->text().isEmpty() || ui->lineEdit->text().isNull()||ui->lineEdit_2->text().isEmpty() || ui->lineEdit_2->text().isNull())
{
QMessageBox::warning(NULL, QStringLiteral("提示"), QString::fromLocal8Bit("请填写计算列或比队列的数值"));
return;
}
else
{
cal_col = ui->lineEdit->text().toInt();
bill_col = ui->lineEdit_2->text().toInt();
int row_num,count;
for(int i=0;i<ui->tableWidget->rowCount();i++)
{
if(ui->tableWidget->item(i,cal_col) == 0 || ui->tableWidget->item(i,cal_col)->text().isEmpty()||ui->tableWidget->item(i,cal_col)->text().isNull())
{
row_num = i;
break;
}
}
count = row_num-1;
qDebug()<<"count:"<<count;
max_result = 0.0;
int cur_max_num,cur_min_num;
if(count>0)
{
QStringList templist;
templist<<ui->tableWidget->item(0,cal_col)->text()<<ui->tableWidget->item(0,bill_col)->text();
ui->tableWidget_2->setHorizontalHeaderLabels(templist);
ui->tableWidget_2->setRowCount(0);
ui->tableWidget_2->setColumnCount(2);
double temp_value = count*5/8;
int a1 = qRound(temp_value);
temp_value = count*4/8;
int a2 = qRound(temp_value);
QString v1 = table_data_sep(a1,bill_col);
QString v2 = table_data_sep(a2,bill_col);
qDebug()<<a1<<bill_col<<v1<<a2<<bill_col<<v2;
if(v1.toDouble()>v2.toDouble())
{
max_result = v1.toDouble();
ui->tableWidget_2->insertRow(ui->tableWidget_2->rowCount());
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,0,new QTableWidgetItem(table_data_sep(a1,cal_col)));
ui->tableWidget_2->setItem(ui->tableWidget_2->rowCount()-1,1,new QTableWidgetItem(v1));
cur_max_num = count;
cur_