75670

Динамічні структури, що розгалужуються (дерева)

Практическая работа

Информатика, кибернетика и программирование

На початку програми зявляється розбита на елементи формула-зразок у вигляді дерева. Вершина цього дерева містись саму формулу. У листах дерева містяться змінні. Користувач може ввести свою формулу натиснувши клавішу Insert. Після того можна змінити значення змінних, які за замовчуванням дорівнюють

Украинкский

2015-01-24

455.83 KB

2 чел.

Міністерство  освіти  і  науки України

Вінницький національний технічний університет

Інститут інформаційних технологій та комп’ютерної інженерії

Кафедра ПЗ

Практична робота №6 варіант №9

з дисципліни Алгоритми та структури даних

Виконала: ст. гр. 1 ПІ-13б                            Лілик Л. С.

Перевірив:                                                       Власюк В. Х.

Вінниця, 2013


Тема: Динамічні структури, що розгалужуються (дерева).

 

Мета:  Засвоїти поняття дерева як структури даних. Закріпити навички застосування динамічних структур даних при розв’язуванні задач. Сформувати уміння реалізовувати дерева з використанням списків.

Завдання:

Варіант № 9.

  1.  Клас арифметичних виразів, що містить однобуквені змінні, операції +, -, *, / і круглі дужки, назвемо класом найпростіших виразів. Реалізувати:
  2.  процедуру побудови дерева найпростішого арифметичного виразу, заданого у виді рядка.
  3.  процедуру обчислення значення найпростішого арифметичного виразу, заданого деревом при значеннях змінних, що вводяться з клавіатури.
  4.  процедуру перетворення дерева в рядок.

Опис алгоритму виконання

На початку програми з'являється розбита на елементи формула-зразок у вигляді дерева. Вершина цього дерева містись саму формулу. У листах дерева містяться змінні. Користувач може ввести свою формулу натиснувши клавішу Insert. Після того можна змінити значення змінних, які за замовчуванням дорівнюють 2. Для цього треба натиснути на лист правою клавішею миші. Щоб отримати готовий результат слід натиснути клавішу Space.

Складність алгоритму

Складність алгоритму дорівнює О(N2) від t,

де tчас виконаня,

Nкількість символів у стрічці формули.


Блок-схема алгоритму

 



Лістинг фрагментів програми

#include <vector>

using namespace std;

#pragma once

class Node

{

public:

string data;

double value;

int x;

int y;

vector <Node*> children;

Node *parent;

Node(void);

Node(string _data, int _x, int _y);

Node(const Node &arg);

~Node(void);

void Show(HDC hdc, int x, int y);

int ChangeX(int _x);

int ChangeY(int _y);

void InputData(string _data);

void Push(string a, int _x, int _y);

static void ShowTree(Node *tr,  HDC hdc);

void Split(string input);

void FindThisNode(int mdx, int mdy);

int PressedArea(int mdx, int mdy);

int UpMouseArea(int mux, int muy);

bool PressedNode(int mdx, int mdy);

double Calc(bool last=false);

static void MakeStr(char s, double d);

void ChangeXY();

};

extern Node *ThisNode;


#include "StdAfx.h"

//#include "Node.h"

using namespace std;

Node *ThisNode=0;

string Output="";

Node::Node(void)

{

parent=0;

x=300;

y=50;

value=2.0;

}

Node::Node(string _data, int _x, int _y):data(_data), x(_x), y(_y)

{

parent=0;

value=2.0;

}

Node::Node(const Node &arg)

{

data=arg.data;

x=arg.x;

y=arg.y;

parent=0;

value=0.0;

}

Node::~Node(void)

{

}

void Node::Show(HDC hdc, int x, int y)

{

HPEN hNodePen, hRightPen, holdpen;

HBRUSH hNodeBrush, holdbrush;

 

hNodePen = CreatePen(PS_SOLID, 4, RGB(255, 128, 0));

hRightPen = CreatePen(PS_SOLID, 4, RGB(7, 100, 255));

holdpen = (HPEN)SelectObject(hdc, hNodePen);

 

hNodeBrush = CreateSolidBrush(RGB(255, 128, 0));

holdbrush = (HBRUSH)SelectObject(hdc, hNodeBrush);

 

if (parent!=0)

{

  holdpen = (HPEN)SelectObject(hdc, hRightPen);

  POINT pnt;

  ::MoveToEx(hdc, x, y-10, &pnt);

  ::LineTo(hdc, parent->x, parent->y+10);

 

}

 

holdpen = (HPEN)SelectObject(hdc, hNodePen);

Ellipse(hdc, x-30, y-30, x+30, y+30);

if (this->children.size()==0)

{

 char buffer[20];

 sprintf (buffer, "%f", value);

 ::TextOutA(hdc, x-5, y+8, (LPCSTR) buffer, strlen(buffer) );

}

::TextOutA(hdc, x-5, y-7, (LPCSTR) data.c_str(), data.size() );

  

::DeleteObject(hNodePen);

::DeleteObject(hRightPen);

::DeleteObject(hNodeBrush);

}

int Node::ChangeX(int _x)

{

x=_x;

return x;

}

int Node::ChangeY(int _y)

{

y=_y;

return y;

}

void Node::InputData(string _data)

{

data=_data;

}

void Node::Push(string a, int _x, int _y)  // push new element to the tree

{

int dx=100;

Node *cur = new Node(a, _x, _y);

cur->parent=this;

cur->x=x-200+dx*children.size();

cur->y=y+80;

children.push_back(cur);

}

void Node::ChangeXY()

{

if(this!=0&&this->parent!=0)

{

 int dx=100;

 if(this->parent->parent==0)

 {

  dx=1000/(this->parent->children.size()+1);

 }

 else dx=this->parent->parent->children[0]->x*2;

 for(int i=0;i<this->parent->children.size(); ++i)

  this->parent->children[i]->x=dx/this->parent->children.size()/2+i*dx;

}

}

void Node::ShowTree(Node *tr,  HDC hdc)  // prints tree

{

   if (tr==NULL)  // return if the tree is empty

       return;

     // if tree exists and not empty

   for (int i=0; i<tr->children.size(); ++i)

 Node::ShowTree(tr->children[i],  hdc);

tr->Show(hdc, tr->x, tr->y);

}

void Node::Split (string input)

{

   data=input;

string s="";

int prior=5;

int skob=0;

if(input.size()<=2) return;

 

for(int i=0; i<input.size()-1; ++i)

 {

 switch(input[i])

 {

  case '+':

  case '-':

   if(skob==0&&prior>1)prior=1;

   break;

  case '*':

  case '/':

   if(skob==0&&prior>2)prior=2;

   break;

  case '(':

   ++skob;

   break;

  case ')':

   --skob;

   break;

 }

 }

skob=0;

for (int i=0; i<input.size(); ++i)

 {

 switch(input[i])

 {

  case '+':

  case '-':

   s+=input[i];

   if(prior==1&&skob==0)

   {

    Push(s, x, y);

    s="";

   }

   break;

  case '*':

  case '/':

   s+=input[i];

   if(prior==2&&skob==0)

   {

    Push(s, x, y);

    s="";

   }

   break;

  case '(':

   if(skob!=0)

   s+=input[i];

   ++skob;

   break;

  case ')':

   if(skob!=1)

   s+=input[i];

   --skob;

   break;

  

  default:

   s+=input[i];

   break;

 }

}

 if(s!="")

Push(s, x, y);

for (int i=0; i<this->children.size(); ++i)

 this->children[i]->Split(children[i]->data);

}

double Node::Calc(bool last)

{

if (this->children.size()==0)

{

  if (this->data.size()==1)

  {

   if(last)

   {

   MakeStr(')', this->value);

   }

   else

   MakeStr(' ', this->value);

  }

  else

  {

   if(last)

   {

   MakeStr(')', this->value);

   Output+=this->data[this->data.size()-1];

   }

   else MakeStr(this->data[this->data.size()-1], this->value);

  }

  return value;

}

Output+="(";

double res=children[0]->Calc();

 

for (int i=0; i<this->children.size()-1; ++i)

{

 bool last=i==children.size()-2;

 switch(children[i]->data[children[i]->data.size()-1])

 {

  case '+':

   res+=children[i+1]->Calc(last);

   break;

  case '-':

   res-=children[i+1]->Calc(last);

   break;

  case '*':

   res*=children[i+1]->Calc(last);

   break;

  case '/':

   res/=children[i+1]->Calc(last);

   break;

  default: break;

 }

}

 

 

 

 if (this->data.size()>2)

 if (this->data[this->data.size()-2]==')')

 {

  Output+=this->data[this->data.size()-1];

  Output+="(";

 }

 

return res;

}

int Node::PressedArea(int mdx, int mdy)

{

if (mdx>(x-30)&&mdx<x&&mdy<(y+30)&&mdy>(y-30)) return 1;   // left child

else if (mdx<(x+30)&&mdx>x&&mdy<(y+30)&&mdy>(y-30)) return 2; // right child

else return -1;

}

int Node::UpMouseArea(int mux, int muy)

{

if (mux<(x-10)&&muy>(y+10)) return 1;   // left child

else if (mux>(x+10)&&muy>(y+10)) return 2; // right child

else return -1;

}

bool Node::PressedNode(int mdx, int mdy)

{

if (mdx>(x-30)&&mdx<(x+30)&&mdy<(y+30)&&mdy>(y-30)) return true;   

else return false;

}

void Node::FindThisNode(int mdx, int mdy)  // traverses the tree

{

   if  (ThisNode!=0) return;

   

 if(this->PressedNode(mdx, mdy))

 ThisNode=this;

else for (int i=0; i<this->children.size(); ++i)

 this->children[i]->FindThisNode(mdx, mdy);

 

}

void Node::MakeStr(char s, double d)

{

// double convert to buf

char buff [100];

sprintf (buff, "%f", d);

string buf(buff);

 buf+=s;

Output+=buf;

}

Результат виконання

Висновки

Засвоїли поняття дерева як структури даних. Закріпили навички застосування динамічних структур даних при розв’язуванні задач. Сформували уміння реалізовувати дерева з використанням списків.


 

А также другие работы, которые могут Вас заинтересовать

65532. Створення адаптивних засобів обліку і аналізу якості електроенергії 391 KB
  Обсяг спожитої електричної енергії фіксується електролічильниками а її якість контролюється приладами для вимірювання показників якості. Подана робота присвячена питанням розробки адаптивних засобів обліку електроенергії вимірювання показників її якості та відтворення...
65533. МЕТОДИ, МОДЕЛІ ТА ЗАСОБИ ПРОЕКТУВАННЯ І УПРАВЛІННЯ БІЗНЕС-ПРОЦЕСАМИ ДЛЯ ОРГАНІЗАЦІЙНО-ТЕХНІЧНИХ ОБ’ЄКТІВ УПРАВЛІННЯ 721 KB
  Сучасне процесне управління підприємствами і організаціями включає в себе управління гнучкими бізнеспроцесами орієнтованими на користувача і мінливими під впливом внутрішніх і зовнішніх чинників.
65534. МАЛЕ ПІДПРИЄМНИЦТВО В СИСТЕМІ РЕГІОНАЛЬНОГО РОЗВИТКУ 322 KB
  Хоч протягом усього пeрiоду ринкових рeформ в eкономiчнiй лiтeртурi бгто увги придiлялося проблeмм розвитку в Укрїнi млого бiзнeсу лe його стн всe щe злишється нeздовiльним. Проблeм полягє нвiть нe в кiлькiсних прмeтрх функцiонувння цiєї сфeри якi поступово полiпшуються нсмпeрeд у структурi вiтчизняного...
65535. Інформаційна технологія синтезу моделей систем управління автоматизованими процесами 1.05 MB
  При створенні нових інформаційних технологій ІТ сучасні компютери та різні спеціалізовані математичні моделі слугують фундаментом побудови нових методів перетворення інформації для складних систем управління ССУ.
65536. РЕФРАКЦІЙНА КЕРАТОПЛАСТИКА АМЕТРОПІЙ (ВДОСКОНАЛЕННЯ ТЕХНОЛОГІЇ, ПРОГНОЗУВАННЯ РЕЗУЛЬТАТІВ, ПОПЕРЕДЖЕННЯ РОЗВИТКУ УСКЛАДНЕНЬ) 389.5 KB
  Тенденції світової офтальмохірургії за останні роки переконливо свідчать про бурхливий розвиток керато-рефракційної хірургії заснованої на моделюванні передньої поверхні рогівки шляхом пошарового її зрізання методом кератомільозу.
65537. АВТОМАТИЧНИЙ КОНТРОЛЬ СТУПЕНЯ ЗДРІБНЕННЯ РУДИ В ТЕХНОЛОГІЧНИХ КОМПЛЕКСАХ ФЛОТАЦІЙНОГО ТА МАГНІТНОГО ЗБАГАЧЕННЯ 272.5 KB
  Завданням автоматизації здрібнення перед флотаційним або магнітним збагаченням є розкриття руд зі змінними фізикомеханічними властивостями тобто здрібнення їх до такої оптимальної крупності при якій частки корисного мінералу дезінтегруються з порожньою породою...
65538. Етіопатогенетичне обґрунтування способу лікування карієсу у дітей молодшого шкільного віку 156 KB
  Карієс зубів обумовлений прогресуючою демінералізацією зубних тканин викликаною кислотоутворюючими автохтонними бактеріями ротової порожнини серед яких найбільший карієсогенний потенціал мають стрептококи.
65539. МІЦНІСТЬ ТА ДЕФОРМАЦІЇ ЗАЛІЗОБЕТОННИХ ЕЛЕМЕНТІВ З ВИСОКОМІЦНОГО БЕТОНУ З УРАХУВАННЯМ ТРИВАЛОСТІ НАВАНТАЖЕННЯ І НЕРІВНОМІРНОГО НАГРІВАННЯ ДО +200 С 5.05 MB
  Для даного часу характерна характерною тенденціэю тенденцією в будівельній галузі є інтенсивний розвиток висотного будівництва з монолітного залізобетону із застосуванням сучасних високоякісних бетонів які мають високі характеристики міцності...
65540. ЕФЕКТИВНІСТЬ ВІДНОВЛЕННЯ СИНУСОВОГО РИТМУ У ХВОРИХ З ТРІПОТІННЯМ ПЕРЕДСЕРДЬ МЕТОДОМ ЧЕРЕЗСТРАВОХІДНОЇ ЕЛЕКТРОКАРДІОСТИМУЛЯЦІЇ 183.5 KB
  Тріпотіння передсердь – одне з найбільш поширених порушень серцевого ритму, яке складає біля 10 % від всіх пароксизмальних надшлуночкових тахіаритмій. Воно є частим ускладненням гострого інфаркту міокарда і хірургічних втручань на відкритому серці.