Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab2 / mainwindow

.cpp
Скачиваний:
17
Добавлен:
10.02.2019
Размер:
6.99 Кб
Скачать
#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