Вы находитесь на странице: 1из 14

Федеральное государственное автономное образовательное учреждение

высшего образования
"Национальный исследовательский университет
"Высшая школа экономики"

Московский институт электроники и математики им. А.Н. Тихонова НИУ


ВШЭ
Департамент компьютерной инженерии

Курс: Алгоритмизация и программирование

Раздел Мах 1 2 Итог


оценка оценка
Работа 1
программы
Тесты 1

Правильность 3
алгоритма
Ответы на 2
вопросы
Доп. задание 3

ОТЧЕТ
по лабораторной работе № 11

Студент: Немашкало Александр


Витальевич
Группа: БИВ197
Вариант:_№ 8 12
Руководитель: Волкова Лилия
Леонидовна
Оценка:
МОСКВА 2020
Содержание
Задание...................................................................................................................................................3
Листинг программы...............................................................................................................................4
Тесты к программе..............................................................................................................................12
Задание

1. В первом задании лабораторной работы 6 необходимо разработать


графический интерфейс для решения задачи. При решении задачи требуется
вычислить и вывести в качестве одного из результатов время выполнения
рекурсивного и итерационного (без использования рекурсии) алгоритмов. В
случае если разработка рекурсивного алгоритма затруднительна, следует
ограничиться вычислением времени выполнения рекурсивного алгоритма.
Значения функции F(n), где n– натуральное число, по формуле:

{ F(1)=0,¿ { F(2)=1,¿¿¿¿
2.Написать программу, которая создает бинарное дерево, состоящее из
целых чисел, которые вводятся с клавиатуры. Затем программа выполняет
преобразования в соответствии с номером варианта и печатает все числа
исходного и преобразованного бинарного дерева (или другой результат
работы программы).
Находит число, ближайшее к среднему арифметическому минимального и
максимального чисел в бинарном дереве.
Листинг программы
1.

untitled.pro
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated
APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain
version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the
APIs deprecated before Qt 6.0.0

SOURCES += \
main.cpp \
mainwindow.cpp \
work.cpp

HEADERS += \
mainwindow.h \
work.h

FORMS += \
mainwindow.ui

# Default rules for deployment.


qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "work.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow {


Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
};
#endif // MAINWINDOW_H

work.h
#ifndef WORK_H
#define WORK_H

class Work
{
public:
Work();
~Work();

unsigned long long first_alg(unsigned long long number);


unsigned long long second_alg(unsigned long long number);
};

#endif // WORK_H

main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])


{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

work.cpp
#include "work.h"

Work::Work() {
}
Work::~Work() {
}
unsigned long long Work::first_alg(unsigned long long number) {
if(number==1 ||number==2){
return number -1;
}
int pred=0;
int next=1;
int x;
for(int i=3;i<=number;i++){
x= next;
next = 2*pred +next;
pred =x;
}
return next;
}

unsigned long long Work::second_alg(unsigned long long number) {


if(number==1 ||number==2){
return number -1;
}

return this->second_alg(number-1)+2*second_alg(number-2);
//return number <= 1 ? 1 : number * this->second_alg(number - 1);
}

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <chrono>
#include <QString>
#include <QRegExpValidator>
#include "iostream"

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

QRegExp int_exp("[0-9]*");
ui->lineEdit->setValidator(new QRegExpValidator(int_exp, this));
}

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

void MainWindow::on_pushButton_clicked() {
Work *work_obj = new Work;
QString toSetText;
unsigned long long number = ui->lineEdit->text().toLongLong();

auto begin = std::chrono::steady_clock::now();


auto total_number = work_obj->first_alg(number);
auto end = std::chrono::steady_clock::now();
auto elapsed_ms =
std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);

ui->textEdit1->setText(toSetText.setNum(total_number));
ui->lineEdit_3->setText(toSetText.setNum(elapsed_ms.count()));
}

void MainWindow::on_pushButton_2_clicked() {
Work *work_obj = new Work;
QString toSetText;
auto number = ui->lineEdit->text().toLongLong();

auto begin = std::chrono::steady_clock::now();


auto total_number = work_obj->second_alg(number);
auto end = std::chrono::steady_clock::now();
auto elapsed_ms =
std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin);

ui->textEdit2->setText(toSetText.setNum(total_number));
ui->lineEdit_5->setText(toSetText.setNum(elapsed_ms.count()));
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>953</width>
<height>476</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Input number</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>First algoritm</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Start</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="textEdit1"/>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_3">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>nano seconds</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Start</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="textEdit2"/>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_5">
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>nano seconds</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>953</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
2.
#include <stdio.h>
#include <iostream>

using namespace std;

struct node
{
int info;
node *left,*right;
};

//новый узел с числом p


node *newn(int p)
{
node *uk = new node;
uk->info=p;
uk->left=uk->right=NULL;
return(uk);
}

//присоединение нового узла


// c числом x к узлу p слева
void setleft(node*p, int x)
{
p->left=newn(x);
}

void setright(node*p, int x)


{
p->right=newn(x);
}

int min_search(node *der, int min)


{
if (!der) return min;
else
{
if (der->info<min)
min = der->info;
min = min_search (der->left, min);
return min;
}
}

int max_search(node *der, int max)


{
if (!der) return max;
else
{
if (der->info>max) max = der->info;
max = max_search (der->right, max);
return max;
}
}

int close_to_avg(node* der, int avg, int elem, int mina)


{
if (!der)
return elem;
else {
if (abs(der->info - avg) < mina)
{
mina = abs(der->info - avg);
elem = der->info;
return elem;
}
}
}

node *form()
{
int n;
node *der=NULL,*next,*tek;
puts("Input integer numbers\nletter means that input is over");
if(scanf("%d",&n)==1)
{
der=newn(n);
while(scanf("%d",&n)==1)
{
next=tek=der;
while (next!=NULL)
{
tek=next;
if (n<tek->info)
next=tek->left;
else next=tek->right;
}
if (n<tek->info) setleft(tek,n);
else setright(tek,n);
}
}
return der;
}

void addToArray(node* root, int * a, size_t& idx)


{
a[idx++] = root->info;
if (root->left) addToArray(root->left,a,idx);
if (root->right) addToArray(root->right,a,idx);
}

//вывод дерева на экран


void print_tree(node *der, int h)
{ if (der) {
print_tree(der->left,h+1);
for(int i=0; i<h;i++) cout <<" ";
cout << der->info << endl;
print_tree(der->right,h+1);
}
}

int main() {
node *der;
puts("Now we'll make tree\n");
der = form();
if (!der)
puts("Tree is empty");
else {
print_tree(der, 0);
int max=der->info;
max=max_search(der,max);
int min=der->info;
min=min_search(der,min);
int avg = (min + max)/2;

int elem=der->info;
int mina = abs(der->info - avg);
size_t idx = 0;
int a[100];
addToArray(der,a,idx);
int elemt = a[0];
int minat = abs(a[0] - avg);
for(int i=0; i<idx; i++) {
if (abs(a[i] - avg) < minat)
{
minat = abs(a[i] - avg);
elemt = a[i];
}
}
elem = close_to_avg(der, avg,elem,mina);
printf("\n min = %d", min);
printf("\n max = %d", max);
printf("\n avg = %d\n", avg);
for (int i =0; i<idx; i++)
printf("%d ", a[i]);
printf("\n\nThe integer which close to an average between max and min
element is %d", elemt);
}
return 0;
}
Тесты к программе
1.
1 тест:

2 тест:
2.
1 тест:

4 тест:

Вам также может понравиться