#include "mainwindow.h" #include "ui_mainwindow.h" #define START_X 40 #define START_Y 40 #define DELTA_Y 40 #define LABEL_X 20 #define LABEL_Y 30 #define LINE_X 200 #define LINE_Y 30 #define X 30 #define Y 500 #define SIZE 100 QString filepath=""; QStringList K; QStringList Sigma; QStringList Q0; QStringList B; QStringList F; QString function[SIZE][5]; QString q; int now; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); this->setFixedSize(1000, 700); this->setWindowTitle("Universal Turing Machine"); qDebug()<setGeometry(START_X, START_Y+DELTA_Y*0, LABEL_X, LABEL_Y); label_k->setAlignment(Qt::AlignCenter); label_k->setText("\n 状态集合:"); label_sigma = new QLabel(this); label_sigma->setGeometry(START_X, START_Y+DELTA_Y*1, LABEL_X, LABEL_Y); label_sigma->setAlignment(Qt::AlignCenter); label_sigma->setText("\n 带上符号:"); label_q0 = new QLabel(this); label_q0->setGeometry(START_X, START_Y+DELTA_Y*3, LABEL_X, LABEL_Y); label_q0->setAlignment(Qt::AlignCenter); label_q0->setText(" 开始状态:"); label_B = new QLabel(this); label_B->setGeometry(START_X, START_Y+DELTA_Y*4, LABEL_X, LABEL_Y); label_B->setAlignment(Qt::AlignVCenter); label_B->setText(" 空白符:\n"); label_F = new QLabel(this); label_F->setGeometry(START_X, START_Y+DELTA_Y*5, LABEL_X, LABEL_Y); label_F->setAlignment(Qt::AlignVCenter); label_F->setText(" 终止状态:\n"); line_k = new QLineEdit(this); line_k->setFixedSize(LINE_X,LINE_Y); line_sigma = new QLineEdit(this); line_sigma->setFixedSize(LINE_X,LINE_Y); line_q0 = new QLineEdit(this); line_q0->setFixedSize(LINE_X,LINE_Y); line_B = new QLineEdit(this); line_B->setFixedSize(LINE_X,LINE_Y); line_F = new QLineEdit(this); line_F->setFixedSize(LINE_X,LINE_Y); layout_label = new QVBoxLayout(this); layout_label->addWidget(label_k); layout_label->addWidget(label_sigma); layout_label->addWidget(label_q0); layout_label->addWidget(label_B); layout_label->addWidget(label_F); layout_line = new QVBoxLayout(this); layout_line->addWidget(line_k); layout_line->addWidget(line_sigma); layout_line->addWidget(line_q0); layout_line->addWidget(line_B); layout_line->addWidget(line_F); layout_1=new QHBoxLayout(this); layout_1->addLayout(layout_label); layout_1->addLayout(layout_line); group_1=new QGroupBox(this); group_1->setGeometry(40, 50, 300, 390); group_1->setLayout(layout_1); //配置文件引入窗 list_file = new QListWidget(this); list_file->setGeometry(380, 50, 220, 240); loadFileList(); btn_import = new QPushButton(this); btn_import->setGeometry(380, 320, 220, 40); btn_import->setText("导入文件"); //状态转移函数框 list_func = new QListWidget(this); list_func->setGeometry(640, 50, 340, 300); list_func->setWrapping(true); //输入纸带 label_str = new QLabel(this); label_str->setGeometry(380, 395, 60, 30); label_str->setText("输入纸带:"); line_str = new QLineEdit(this); line_str->setGeometry(440,390,420,40); btn_confirm = new QPushButton(this); btn_confirm->setGeometry(870, 390, 50, 40); btn_confirm->setText("确认"); btn_step = new QPushButton(this); btn_step->setGeometry(930, 390, 50, 40); btn_step->setText("下一步"); //纸带 for(int i=0;i<25;i++) { label[i]=new MyLabel(this); label[i]->setPos(X+40*i,Y); label[i]->hide(); } label_now=new MyLabel(this); label_now->setStyleSheet("border-width: 2px;border-style: solid;border-color: rgb(236, 255, 251);background-color: rgb(20, 250, 20);"); label_now->setFixedSize(40,35); label_now->hide(); label_fun = new QLabel(this); label_fun->setGeometry(X+50,Y-40, 500,30); label_fun->setAlignment(Qt::AlignCenter); label_fun->setText("状态转移函数:"); //connect QObject::connect(btn_import, SIGNAL(clicked()), this, SLOT(importFile())); QObject::connect(btn_confirm, SIGNAL(clicked()), this, SLOT(startSimulate())); QObject::connect(btn_step, SIGNAL(clicked()), this, SLOT(nextStep())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::importFile() { qDebug()<<"import1"; K.clear(); Sigma.clear(); Q0.clear(); B.clear(); F.clear(); int row=list_file->currentRow(); list_func->clear(); QFile file(filepath + QString::number(row) + ".txt"); qDebug()<<"import3"; if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); QString temp; int i=0; while(1) { temp=in.readLine(); if(temp.size()==0) break; qDebug()<<"import1"; QStringList list = temp.split(" "); qDebug()<<"import2"; list[0]="q"+list[0]; if(list.size()>2) list[2]="q"+list[2]; qDebug()<<"import3"; if(list.contains("#")) { function[i][0]=list[0]; function[i][1]=list[1]; } else for(int j=0;j<5;j++) function[i][j]=list[j]; qDebug()<<"import4"; if(list.contains("#")) append(&F,list[0]); else { qDebug()<<"import6"; list_func->addItem(" δ("+list[0]+","+list[1]+")=("+list[2]+","+list[3]+","+list[4]+") "); append(&K,list[0]); append(&Sigma,list[1]); qDebug()<<"import7"; } qDebug()<<"import5"<setText(k); line_sigma->setText(sigma); line_q0->setText(q0); line_B->setText(b); line_F->setText(f); line_k->setEnabled(false); line_sigma->setEnabled(false); line_q0->setEnabled(false); line_B->setEnabled(false); line_F->setEnabled(false); qDebug()<<"import12"; } void MainWindow::startSimulate() { for(int i=0;i<25;i++) label[i]->hide(); //qDebug()<<"1"; if(line_str->text().length()==0) return; str="BBB"+line_str->text()+"BB"; label[2]->setText("B"); label[2]->show(); // for(int i=3;isetText(str[i]); // label[i]->show(); // } now = 3; label_now->setPos(X+40*3,Y+55); label_now->show(); q=Q0[0]; label_now->setText(q); update(0); } void MainWindow::nextStep() { bool flag=false; QChar c = str[now]; QString comp; qDebug()<<"next0"; comp+=c; qDebug()<<"next1"; for(int i=0;isetText("δ("+function[i][0]+","+function[i][1]+")=("+function[i][2]+","+function[i][3]+","+function[i][4]+")"); qDebug()<<("δ("+function[i][0]+","+function[i][1]+")=("+function[i][2]+","+function[i][3]+","+function[i][4]+")"); if(comp=="B" && now==str.length()-1) { str+="B"; } if(function[i][4]=="R"){ now++; update(1); }else if(function[i][4]=="L"){ now--; update(-1); }else{ update(0); } break; } if(function[i][0].length()==0) break; } if(flag==false) QMessageBox::warning(0 , " 失败! ", " 失败! ",QMessageBox::Ok | QMessageBox::Default , QMessageBox::Cancel | QMessageBox::Escape ); if(F.contains(q)) { QMessageBox::information(0 , " 成功! "," 成功! ", QMessageBox::Ok | QMessageBox::Default , QMessageBox::Cancel | QMessageBox::Escape ); //终止状态 } } void MainWindow::loadFileList() { QFile file(filepath+"filelist.txt"); if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); QString temp; while(1) { temp=in.readLine(); if(temp.size()==0) break; QStringList list = temp.split(" "); list_file->addItem(list[1]); } } } void MainWindow::append(QStringList* list,QString in) { int flag=0; for(int i=0;isize();i++) { if(list->contains(in)) return; } if(flag==0) list->append(in); } void MainWindow::update(int move_q) { label_now->setPos(label_now->pos().width()+move_q*40,label_now->pos().height()); label_now->setText(q); qDebug()<<"update"<setText(str[i]); label[i]->show(); if(i<=2&&str[i]=='B'&&str[i+1]=='B') label[i]->hide(); if(i==str.length()-2&&str[i]=='B') { label[i]->setText(str[i+1]); label[i]->show(); break; } } qDebug()<<"ipdate2"; }