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

lab4 / mainwindow

.cpp
Скачиваний:
19
Добавлен:
10.02.2019
Размер:
3.39 Кб
Скачать
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "HelpBrowser.h"
#include "string.h"
#include <sstream>
#include <QMessageBox>
#include <QWidget>
#include <QtWidgets>
#include<QString>

using namespace std;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_actionInfo_triggered()
{
    HelpBrowser *helpBrowser = new HelpBrowser(":/", "index.htm");

    helpBrowser->resize(600, 600);
    helpBrowser->show();
}

void MainWindow::on_actionAuthor_triggered(){
HelpAuthor *helpAuthor = new HelpAuthor(":/", "author.htm");

helpAuthor->resize(600, 600);
helpAuthor->show();
}

node* make_leaf(char* date){
    node* leaf = new node;
    leaf->date = strdup(date);
    leaf->left =NULL;
    leaf->right = NULL;
    return leaf;
}

void read(node **tree, istringstream &in_stream){
    if(in_stream.peek()=='\0'){
        (*tree) = NULL;
        return ;
    }
    while(in_stream.peek() == ' ')
        in_stream.get();

    char c = in_stream.peek();

    if(c == '('){
        in_stream.get();
        int i =0;
        char str[50] ="";
        while(in_stream.peek() != ' ' && in_stream.peek() != ')' && in_stream.peek() != '(' && in_stream.peek() !='\n'){
            in_stream.get(str[i]);
            str[++i]='\0';
        }
        if(strlen(str)  == 0){
           (*tree) = NULL;
            in_stream.get();
        }else{
            (*tree) = make_leaf(str);
            read(&(*tree)->left,in_stream);
            c = in_stream.peek();
            if( c == ')'){
                in_stream.get();
                return;
            }
            read(&(*tree)->right,in_stream);
            c = in_stream.peek();
            if( c == ')'){
                in_stream.get();
                return;
            }
        }
    }else if (c == '#') {
        (*tree) = NULL;
         in_stream.get();
    }
}

int number_N_level(node* tree,int N){
    int sum = 0;
    N--;
    if(N == 0)  return 1;
    if(tree->left != NULL)  sum+=number_N_level(tree->left,N);
    if(tree->right!= NULL)  sum+=number_N_level(tree->right,N);
    return sum;
}

void MainWindow::write_tree(node* tree,int n){
    QString qstr;

    for(int i =0;i<n;i++){
        qstr+="    ";
    }
    string str(tree->date);
    qstr+=QString::fromStdString(str);


    qstr+="\n";
    ui->tree_show->insertPlainText(qstr);

   if(tree->left != NULL)  write_tree(tree->left,n+1);
   if(tree->right!= NULL)  write_tree(tree->right,n+1);
}

void MainWindow::on_pushButton_clicked()
{
    QString input_str;
    string str = ui->input_text->toPlainText().toLocal8Bit().data();
    istringstream input_string(str);

    node* tree = NULL;
    read(&tree,input_string);

    ui->output_text->setText( QString::number(number_N_level(tree,ui->tree_number->value())));
    ui->tree_show->clear();
    write_tree(tree,0);

}

void MainWindow::on_actionFile_triggered()
{
    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->input_text->setText(data);
}
Соседние файлы в папке lab4