Добавил:
serega_ovc
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab2 / mainwindow
.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "HelpBrowser.h"
#include <QMessageBox>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <fstream>
using namespace std ;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->textEdit_1->setText("\0");
ui->textEdit_1->setText("\0");
head_1 = NULL;
head_2 = NULL;
}
MainWindow::~MainWindow()
{
delete ui;
}
//работа с списком
void MainWindow::destroy (lisp s){
if (s != NULL){
if(!isAtom(s)){
destroy(head(s));
destroy(tail(s));
}
delete s;
}
}
lisp MainWindow::head(const lisp s){
if(s != NULL ){
if(!isAtom(s)){
return s->node.pair.hd;
}else{
QMessageBox::warning(this, "Error","Head(atom)");
exit(1);
}
}else{
QMessageBox::warning(this, "Error","Head(NULL)");
exit(1);
}
}
lisp MainWindow::tail(const lisp s){
if(s != NULL ){
if(!isAtom(s)){
return s->node.pair.tl;
}else{
QMessageBox::warning(this, "Error","Tail(atom)");
exit(1);
}
}else{
QMessageBox::warning(this, "Error","Tail(NULL)");
exit(1);
}
}
bool MainWindow::isNull(const lisp s){
return s == NULL;
}
lisp MainWindow::cons(const lisp h, const lisp t){
lisp p;
if (isAtom(t)){
QMessageBox::warning(this, "Error"," cons(*, atom)");
exit(1);
}else{
p = new s_expr;
if( p== NULL){
QMessageBox::warning(this, "Error"," Memory ...");
exit(1);
}
p->node.pair.hd = h;
p->node.pair.tl = t;
p->tag = false;
return p;
}
}
//работа с Atom
lisp MainWindow::make_atom(const char *x){
lisp s = new s_expr;
s->tag = true;
s->node.atom = new char[50];
strncpy(s->node.atom,x,50);
return s;
}
char* MainWindow::getAtom(const lisp s){
if(!isAtom(s)){
QMessageBox::warning(this, "Error","getAtom(s) for !isAtom(s)");
return NULL;
}else{
return s->node.atom;
}
}
bool MainWindow::isAtom(const lisp s){
if(s == NULL) return false;
else return (s -> tag);
}
//считывание списка
void MainWindow::read_lisp(lisp &s, std::istringstream &in_stream){
char str[2];
if(in_stream.peek()=='\0'){
s=NULL;
return ;
}
while(in_stream.peek() == ' ')
in_stream.get();
in_stream.get(str[0]);
str[1]='\0';
read_s_expr(str,s,in_stream);
}
void MainWindow::read_s_expr(char *prev, lisp &s, std::istringstream &in_stream){
if(strcmp(prev, ")") == 0){
QMessageBox::warning(this, "Error","! List.Error 1");
return;
}else{
if(strcmp(prev, "(") != 0 ){
s = make_atom(prev);
}else{
read_seq(s,in_stream);
}
}
}
void MainWindow::read_seq(lisp &s, std::istringstream &in_stream){
char str[40] ="";
int i =0;
while(in_stream.peek() == ' ')
in_stream.get();
while(in_stream.peek() != ' ' && in_stream.peek() != ')'
&& in_stream.peek() != '(' && in_stream.peek() !='\n'){
in_stream.get(str[i]);
str[i+1]='\0';
i++;
}
if(strlen(str) == 0){
in_stream.get(str[i]);
str[i+1]='\0';
//i++;
}
lisp p1 = NULL,p2 =NULL;
if(strlen(str) == 0){
QMessageBox::warning(this, "Error","! List.Error 2");
return;
}else if(strcmp(str,")") == 0){
s = NULL;
}else{
read_s_expr(str,p1,in_stream);
read_seq(p2,in_stream);
s = cons(p1,p2);
}
}
//вывод
/*
void MainWindow::write_lisp(const lisp s){
if (isNull(s))
ui->Output_list->insertPlainText(" ()");
else
if (isAtom(s)) {
QString str = QString(s->node.atom);
ui->Output_list->insertPlainText(" ");
ui->Output_list->insertPlainText(str);
}
else { //непустой список
ui->Output_list->insertPlainText(" (");
write_seq(s);
ui->Output_list->insertPlainText(" )");
}
}
void MainWindow::write_seq(const lisp s){
if (!isNull(s)) {
write_lisp(head(s));
write_seq(tail(s));
}
}*/
//сравнение
bool MainWindow::equal_lisp(const lisp x,const lisp y){
bool sum = true;
if( isNull(x) || isNull(y) ) return false;
if(isAtom(x) && isAtom(y)){
if(strcmp(x->node.atom,y->node.atom) != 0) return false;
}else if(!isAtom(x) && !isAtom(y)){
sum = sum && equal_seq(x,y);
}else{
return false;
}
return sum;
}
bool MainWindow::equal_seq(const lisp x,const lisp y){
bool sum = true;
if (!isNull(x)&& !isNull(y)) {
sum = sum && equal_lisp(head(x),head(y));
sum = sum && equal_seq(tail(x),tail(y));
}else if(isNull(x) && isNull(y)){
return true;
}else{
return false;
}
return sum;
}
void MainWindow::on_equationButton_clicked(){
string str_1 = ui->textEdit_1->toPlainText().toLocal8Bit().data();
istringstream input_string_1(str_1);
string str_2 = ui->textEdit_2->toPlainText().toLocal8Bit().data();
istringstream input_string_2(str_2);
read_lisp(head_1,input_string_1);
read_lisp(head_2,input_string_2);
// write_lisp(head_1);
// write_lisp(head_2);
if(equal_lisp(head_1,head_2)){
QMessageBox::information(0, "Результат", "Списки идентичны");
}else{
QMessageBox::information(0, "Результат", "Списки различны");
}
}
void MainWindow::on_actionInfo_triggered()
{
HelpBrowser *helpBrowser = new HelpBrowser(":/", "index.htm");
helpBrowser->resize(400, 300);
helpBrowser->show();
}
void MainWindow::on_actionAbout_Authour_triggered()
{
HelpAuthor *helpAuthor = new HelpAuthor(":/", "author.htm");
helpAuthor->resize(300, 400);
helpAuthor->show();
}
void MainWindow::on_file_button_1_clicked()
{
QString patch_to_file = QFileDialog::getOpenFileName(this,"Open file", QDir::currentPath(),
"File with date (*.txt);;All files (*.*)");
if(patch_to_file.isEmpty()) return;
QFile file(patch_to_file);
QByteArray data;
if(!file.open(QIODevice::ReadOnly)) return;
data = file.readLine();
ui->textEdit_1->setText(data);
}
void MainWindow::on_file_button_2_clicked()
{
QString patch_to_file = QFileDialog::getOpenFileName(this,"Open file", QDir::currentPath(),
"File with date (*.txt);;All files (*.*)");
if(patch_to_file.isEmpty()) return;
QFile file(patch_to_file);
QByteArray data;
if(!file.open(QIODevice::ReadOnly)) return;
data = file.readLine();
ui->textEdit_2->setText(data);
}
Соседние файлы в папке lab2