ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 19.03.2019
Просмотров: 191
Скачиваний: 1
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра математического обеспечения и применения ЭВМ
ОТЧЁТ
по лабораторной работе №4
по дисциплине «АиСД»
Тема: Бинарные деревья
Студент гр. 3303 |
|
|
Преподаватель |
|
|
Санкт-Петербург
Цель работы:
Изучение бинарных деревьев и способов работы с ними.
Для заданного бинарного дерева b типа ВТ с произвольным типом элементов подсчитать число узлов на заданном уровне п дерева b (корень считать узлом 1-го уровня).
Коды всех функций, слотов, и описания структур находятся в Приложении А.
Была написана структура для бинарного дерева и вынесена в отдельный заголовочный файл.
Затем были описаны функции работы со бинарным деревом:
-
функция для создания пустого листа node* make_leaf(char* date)
-
функция для считывания бинарного дерева из потока void read(node **tree, istringstream &in_stream)
-
функция для подсчёта узлов на уровне n бинарного дерева int number_N_level(node* tree,int N)
-
функция для ступенчатой отрисовки бинарного дерева void MainWindow::write_tree(node* tree,int n)
Далее были описаны слоты – функции, вызываемые при нажатии определённых пунктов меню:
-
слот on_actionInfo_triggered() – вызывается при выборе в меню пункта «Info» и вызывает справку по программе;
-
слот on_actionAbout_Authour_triggered() – вызывается при выборе в меню пункта «Author» и вызвает справку об авторе;
-
слот on_pushButton_clicked()– вызывает загрузку данных в бинарное дерево и последующую отрисовку и вывод результата;
-
слот on_action_triggered вызывает загрузку данных из файла.
Далее был описан класс HelpBrowser в файле helpbrowser.h, в котором содержится лишь описание конструктора, который в переданном по указателю виджете располагает кнопки для переключения между html страницами, и «соединяет» соответствующие сигналы со слотами.
Далее были созданы 5 html файлов, описывающих страницы для виджета HelpBrowser.
Само приложение представляет из себя окно с несколькими текстовым полями QTextEdit для ввода бинарного дерева и вывода его в схематическом виде, с полем QLineText для вывода результат, полем QSpinButton для выбора уровня дерева и меню вверху окна. В текстовое поле необходимо ввести бинарное дерево в скобочной записи, выбрать необходимый уровень и нажать кнопку «Считать». Также бинарное дерево можно ввести из файла через пункт меню File. Результат будет выведен в текстовом поле. Также в верхнем меню есть пункты Help и Author для просмотра информации о всех функциях программы, задании и её авторе соответственно. При их выборе создастся отдельное окно - QWidget.
На рис. 2-3 приведены примеры работы программы
Рисунок 2 – Пример работы программы
Рисунок 3 – Справка по программе
Вывод:
С
помощью функций стандартных библиотек
c++ было осуществлено решение поставленной
задачи с помощью дека, получены навыки
в работе с стеками и списками.
ПРИЛОЖЕНИЕ А
#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);
}
MainWindow::~MainWindow()
{
delete ui;
}
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();
}
typedef struct lisp{
int field;
struct lisp *next;
struct lisp *prev;
}lisp;
typedef struct DECK{
lisp* head;
lisp* tail;
int size;
}DECK;
void push_deck_head(DECK &deck,int number){
lisp *temp = new lisp;
if(deck.head != NULL){
temp->field=number;
temp->prev= NULL;
temp->next=deck.head;
deck.head->prev=temp;
deck.head=temp;
}else{
deck.head = temp;
deck.head->field=number;
deck.head->next=NULL;
deck.head->prev=NULL;
deck.tail = deck.head;
}
deck.size++;
}
void push_deck_tail(DECK &deck,int number){
lisp *temp = new lisp;
temp->field=number;
temp->prev= deck.tail;
temp->next=NULL;
deck.tail->next=temp;
deck.tail = temp;
deck.size++;
}
int pop_deck_head(DECK &deck){
int x = deck.head->field;
if(deck.size != 1){
deck.head = deck.head->next;
delete deck.head->prev;
deck.head->prev=NULL;
}else{
delete deck.head;
deck.head =NULL;
deck.tail =NULL;
}
deck.size--;
return x;
}
int pop_deck_tail(DECK &deck){
int x = deck.tail->field;
if(deck.size != 1){
deck.tail = deck.tail->prev;
delete deck.tail->next;
deck.tail->next=NULL;
}else{
delete deck.tail;
deck.head =NULL;
deck.tail =NULL;
}
deck.size--;
return x;
}
void read_deck(DECK &deck, istringstream &in_stream){
char c;
while((c = in_stream.peek()) != '$'){
if(c == '\n' || c == ' ' || c == ',' || c == ';' ){
in_stream.get();
}else{
int x;
in_stream>>x;
push_deck_head(deck,x);
}
}
}
void MainWindow::on_sort_button_clicked(){
DECK deck ={ NULL ,NULL,0 };
QString input_str;
string str = ui->Train_input->toPlainText().toLocal8Bit().data();
str+="$";
istringstream input_string(str);
read_deck(deck,input_string);
if(deck.size>0){
int N = deck.size;
for (int i = 0; i < N/2; i++) {
input_str+=QString::number(pop_deck_head(deck));
input_str+=", ";
input_str+=QString::number(pop_deck_tail(deck));
if(deck.size != 0){
input_str+=", ";
}else{
input_str+=";";
}
}
if( deck.size == 1){
input_str+=QString::number(pop_deck_head(deck));
input_str+=";";
}
}else{
input_str = "NULL";
}
ui->Train_output->setText(input_str);
}
void MainWindow::on_action_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->Train_input->setText(data);
}
Mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_actionInfo_triggered();
void on_actionAbout_Authour_triggered();
void on_sort_button_clicked();
void on_action_triggered();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H