Новичок
Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.5.2009
Репутация: нет Всего: нет
|
SpisokReber.h | Код | #pragma once #include "tipydannykh.h" #include "SpisokUzlov.h"
const UINT16 SpisokReberPrirashhenie=10;
class C_SpisokReber { public: C_SpisokReber(UINT32 KolichestvoZapisejj=50); ~C_SpisokReber(void); //------------данные-------------------------------------------------------------- public: Ts_Rebro* PRebra ;//Указатель на массив рёбер UINT32 mKolichestvoReber;//Количество ребер в массиве UINT32 mKolichestvoPamyati;//Количество памяти под ребра в массиве(в записях) UINT32 mSleduyushheeSvobodnoeMesto; bool Sortirovan; C_SpisokUzlov* PSpisokUzlov; //------------редактирование рёбер графа------------------------------------------ public: bool Dobavit(Ts_Rebro Rebro);//Добавить ребро bool Udalit(Ts_Rebro Rebro);//Удалить ребро bool UdalitRebraUzla(UINT16 IndeksUzla);//Удалить ребра, идущие из узла bool PerenaznachitRebra(UINT16 StaryjjUzel, UINT16 NovyjjUzel); UINT32 EstLiRebro(Ts_Rebro Rebro);//Проверить количество ребер из узла в узел void UporyadochitRebra();//Сортировка bool VygruzitVFajjl();// bool ZagruzitIzFajjla();// bool OptimizirovatPamyat(UINT32 DopolnitelnayaPamyat);//Оптимизировать по памяти(сортировать ребра, сокращение или выделение памяти путем перемещения в памяти. bool Bolshe(UINT32 Rebro1,UINT32 Rebro2);
};
|
SpisocReber.cpp | Код | #include "StdAfx.h" #include "SpisokReber.h"
C_SpisokReber::C_SpisokReber(UINT32 KolichestvoZapisejj)
{ Sortirovan=false; PRebra=(Ts_Rebro*)malloc(sizeof(Ts_Rebro)*KolichestvoZapisejj); mKolichestvoReber=0; mSleduyushheeSvobodnoeMesto=0; mKolichestvoPamyati=KolichestvoZapisejj; }
C_SpisokReber::~C_SpisokReber(void) { free((void*)PRebra); mKolichestvoReber=0; mKolichestvoPamyati=0; } bool C_SpisokReber::Dobavit(Ts_Rebro Rebro) { if(mSleduyushheeSvobodnoeMesto<mKolichestvoPamyati) { PRebra[mSleduyushheeSvobodnoeMesto]=Rebro; PRebra[mSleduyushheeSvobodnoeMesto].Metka=Ts_Rebro_Metka::NePustojj; mSleduyushheeSvobodnoeMesto++; mKolichestvoReber++; Sortirovan=false; return true; } else { if (mKolichestvoReber<mKolichestvoPamyati) { UporyadochitRebra(); return Dobavit( Rebro); } else { bool t; t=OptimizirovatPamyat(SpisokReberPrirashhenie); t=t && Dobavit( Rebro); return t; } return false; } } bool C_SpisokReber::Udalit(Ts_Rebro Rebro) { if (mKolichestvoReber==0)return false; for(UINT32 i=0;i<mKolichestvoPamyati;i++) { if ( PRebra[i].Konec==Rebro.Konec && PRebra[i].Nachalo==Rebro.Nachalo && PRebra[i].Metka != (Ts_Rebro_Metka::Pustojj) ) { PRebra[i].Konec=0; PRebra[i].Nachalo=0; PRebra[i].Metka = (Ts_Rebro_Metka::Pustojj); mKolichestvoReber--; Sortirovan=false; return true; } } return false; } bool C_SpisokReber::Bolshe(UINT32 Rebro1,UINT32 Rebro2) { UINT64 f1,f2; f1=PRebra[Rebro1].Nachalo; f1=f1<<16; f1=f1+PRebra[Rebro1].Konec; f1=f1<<16; f1=f1+PRebra[Rebro1].DopolnitelnyjjNomer;
f2=PRebra[Rebro2].Nachalo; f2=f2<<16; f2=f2+PRebra[Rebro2].Konec; f2=f2<<16; f2=f2+PRebra[Rebro2].DopolnitelnyjjNomer;
if(PRebra[Rebro1].Metka==0){return true;} if(f1>f2){return true;} return false; } void C_SpisokReber::UporyadochitRebra() {
Ts_Rebro t; bool KonecSortirovke;
for(UINT32 j=mSleduyushheeSvobodnoeMesto-2;j>0;j--) { KonecSortirovke=true; for(UINT32 i=0;i<j;i++) { if(Bolshe(i,i+1)) { t=PRebra[i+1]; PRebra[i+1]=PRebra[i]; PRebra[i]=t; KonecSortirovke=false; }; } if (KonecSortirovke ) break; } mSleduyushheeSvobodnoeMesto=mKolichestvoReber; Sortirovan=true; return; }
bool C_SpisokReber::OptimizirovatPamyat(UINT32 DopolnitelnayaPamyat) { UINT32 p; void* t; UporyadochitRebra(); p=mKolichestvoReber+DopolnitelnayaPamyat; t=realloc(PRebra,sizeof(Ts_Rebro)*p); if (t==NULL) {return false;} else { PRebra=(Ts_Rebro*)t; return true; };
}
bool C_SpisokReber::UdalitRebraUzla(UINT16 IndeksUzla) { bool t; t=false; if (mKolichestvoReber==0)return false; for(UINT32 i=0;i<mKolichestvoPamyati;i++) { if ( ( PRebra[i].Nachalo==IndeksUzla || PRebra[i].Konec == IndeksUzla )&& (PRebra[i].Metka != Ts_Rebro_Metka::Pustojj) ) { PRebra[i].Konec=0; PRebra[i].Nachalo=0; PRebra[i].Metka = (Ts_Rebro_Metka::Pustojj); mKolichestvoReber--; Sortirovan=false; t=true; } } return t; }
bool C_SpisokReber::PerenaznachitRebra(UINT16 StaryjjUzel, UINT16 NovyjjUzel) { bool t=false; for(UINT32 i=0;i<mSleduyushheeSvobodnoeMesto;i++) { if(PRebra[i].Nachalo==StaryjjUzel && PRebra[i].Metka!=0) {PRebra[i].Nachalo=NovyjjUzel;t=true;} if(PRebra[i].Konec==StaryjjUzel && PRebra[i].Metka!=0) {PRebra[i].Konec=NovyjjUzel;t=true;} } return t; }
|
SpisokUzlov.h | Код | #pragma once #include "tipydannykh.h" #include "SpisokReber.h"
const int SpisokUzlovPrirashhenie=10; const int RadiusUzla=10;
class C_SpisokUzlov { public:
C_SpisokUzlov(UINT16 KolichestvoZapisejj); ~C_SpisokUzlov(); Ts_Uzel* PUzly;//Указатель на массив узлов C_SpisokReber* PSpisokReber; UINT32 mKolichestvoUzlov;//Количество узлов в массиве UINT32 mKolichestvoPamyati;//Количество памяти под узлы в массиве(в записях)
void RisovatUzly(CDC* pdc); bool Dobavit(Ts_Uzel Uzel);//Добавить узел bool Udalit(UINT16 IndeksUzla);//Удалить узел bool OptimizirovatPamyat(UINT16 DopolnitelnayaPamyat);//Оптимизировать по памяти void UporadochitUzly(void); bool NajjtiUzelPoKoordinatam(POINT Koordinaty,UINT16* NomerUzla);
}
|
SpisocUzlov.cpp | Код | #include "StdAfx.h" #include "SpisokUzlov.h"
C_SpisokUzlov::C_SpisokUzlov(UINT16 KolichestvoZapisejj) { PUzly=(Ts_Uzel*)malloc(sizeof(Ts_Uzel)*KolichestvoZapisejj);//Выделить память mKolichestvoPamyati=KolichestvoZapisejj; mKolichestvoUzlov=0; //инициализация массива for(UINT16 i=mKolichestvoUzlov;i<mKolichestvoPamyati;i++) { PUzly[i].Udalennyjj=true; }; }; C_SpisokUzlov::~C_SpisokUzlov() { free(PUzly); mKolichestvoPamyati=0; mKolichestvoUzlov=0; }; bool C_SpisokUzlov::Dobavit(Ts_Uzel Uzel) { if(mKolichestvoUzlov<mKolichestvoPamyati)//есть ли еще память ? { for (UINT16 i=0;i<mKolichestvoPamyati;i++)//искать свободное место { if (PUzly[i].Udalennyjj==true) { PUzly[i].Poziciya=Uzel.Poziciya;//вставить PUzly[i].Cvet=Uzel.Cvet; PUzly[i].Udalennyjj=false; mKolichestvoUzlov++; return true; } } return false;//ошибка гдето } else//если нету памяти { bool t; t=OptimizirovatPamyat(SpisokUzlovPrirashhenie);//выделить память t=t && Dobavit(Uzel);//попытка добавить return t; } }; bool C_SpisokUzlov::OptimizirovatPamyat(UINT16 DopolnitelnayaPamyat) { UINT16 p; void* t; UporadochitUzly(); p=mKolichestvoUzlov+DopolnitelnayaPamyat; t=realloc(PUzly,sizeof(Ts_Uzel)*p); if (t==NULL) {return false;} else { PUzly=(Ts_Uzel*)t; mKolichestvoPamyati=p; for(UINT16 i=mKolichestvoUzlov;i<mKolichestvoPamyati;i++) { PUzly[i].Udalennyjj=true; } return true; }; }
bool C_SpisokUzlov::Udalit(UINT16 IndeksUzla) {
if (PUzly[IndeksUzla].Udalennyjj==false) { PSpisokReber->UdalitRebraUzla(IndeksUzla); PUzly[IndeksUzla].Udalennyjj=true; return true; } else { return false; } } void C_SpisokUzlov::UporadochitUzly(void) { UINT16 x1,x2; x1=0; x2=mKolichestvoPamyati-1; if(!(mKolichestvoPamyati>mKolichestvoUzlov ))return ; do { for(UINT16 i=x1;i<=x2;i++){if (PUzly[i].Udalennyjj==true ){x1=i;break;}} for(UINT16 i=x2;i>=0;i--){if (PUzly[i].Udalennyjj==false ){x2=i;break;}} if(x1<x2) { PSpisokReber->PerenaznachitRebra(x2,x1); PSpisokReber->UdalitRebraUzla(x2); } }while(x1<x2); return; }
void C_SpisokUzlov::RisovatUzly(CDC* pdc) { POINT p; int r=RadiusUzla;
pdc->SetDCPenColor(RGB(0,0,0)); for (UINT32 i=0 ;i<mKolichestvoPamyati;i++) { if(PUzly[i].Udalennyjj!=true) { pdc->SetBkColor(PUzly[i].Cvet); p=PUzly[i].Poziciya; pdc->RoundRect(p.x-r,p.y-r,p.x+r,p.y+r,r<<2,r<<2); CString s; s.Format(_T("%u"),i); pdc->TextOut(p.x,p.y,s); } } }
bool C_SpisokUzlov::NajjtiUzelPoKoordinatam(POINT Koordinaty,UINT16* NomerUzla) { LONG dx,dy,r2,minr2,RadiusUzla2; UINT16 minr2i; bool t=false; minr2=RadiusUzla+100; minr2i=0; RadiusUzla2=RadiusUzla*RadiusUzla; for (UINT16 i=0 ;i<mKolichestvoPamyati;i++) { if(PUzly[i].Udalennyjj==true)continue;
dx=abs(PUzly[i].Poziciya.x-Koordinaty.x); dy=abs(PUzly[i].Poziciya.y-Koordinaty.y); r2=(dx*dx)+(dy*dy); if(r2<=RadiusUzla2) { if(r2<minr2){minr2=r2;minr2i=i;t=true;} } } *NomerUzla=minr2i; return t; }
|
RedaktorDialog.h | Код | #pragma once #include "SpisokReber.h" #include "SpisokUzlov.h"
// CRedaktorDialog dialog
class CRedaktorDialog : public CDialog { DECLARE_DYNAMIC(CRedaktorDialog)
public: CRedaktorDialog(CWnd* pParent = NULL); // standard constructor virtual ~CRedaktorDialog();
// Dialog Data enum { IDD = IDD_REDAKTOR_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedCvet(); private: CColorDialog ColorDlg; COLORREF Palitra[16]; COLORREF Cvet; enum Te_Rezhim:char { Rezhim_UzelDobavit =0, Rezhim_UzelRedactirovat =1, Rezhim_RebroDobavit =2, Rezhim_RebroRedactirovat=3 } ; Te_Rezhim Rezhim ; C_SpisokReber* pSpisokReber; C_SpisokUzlov* pSpisokUzlov; void DobavitUzel(CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); void Risovat(void); void UdalitUzel(CPoint point); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnPaint(); afx_msg void OnBnClickedOk(); afx_msg void OnBnClickedButtonDobavituzel(); afx_msg void OnBnClickedRadio1(); afx_msg void OnBnClickedRadio2(); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnBnClickedRadio3(); private: bool TashhitMysh; UINT16 TashhitMyshUzelIndeks; POINT TashhitMyshNachalo; POINT TashhitMyshKonec;
};
|
RedaktorDialog.cpp | Код | // RedaktorDialog.cpp : implementation file //
#include "stdafx.h" #include "GRAF.h" #include "RedaktorDialog.h"
// CRedaktorDialog dialog
IMPLEMENT_DYNAMIC(CRedaktorDialog, CDialog)
CRedaktorDialog::CRedaktorDialog(CWnd* pParent /*=NULL*/) : CDialog(CRedaktorDialog::IDD, pParent) { Rezhim=Te_Rezhim::Rezhim_UzelDobavit; pSpisokUzlov=new C_SpisokUzlov; pSpisokReber=new C_SpisokReber; pSpisokUzlov->PSpisokReber=pSpisokReber; pSpisokReber->PSpisokUzlov=pSpisokUzlov; TashhitMysh=false;
}
CRedaktorDialog::~CRedaktorDialog() { }
void CRedaktorDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CRedaktorDialog, CDialog) ON_BN_CLICKED(IDC_CVET, &CRedaktorDialog::OnBnClickedCvet) ON_WM_LBUTTONUP() ON_WM_RBUTTONUP() ON_WM_PAINT() ON_BN_CLICKED(IDOK, &CRedaktorDialog::OnBnClickedOk) ON_BN_CLICKED(IDC_RADIO1, &CRedaktorDialog::OnBnClickedRadio1) ON_BN_CLICKED(IDC_RADIO2, &CRedaktorDialog::OnBnClickedRadio2) ON_BN_CLICKED(IDC_RADIO3, &CRedaktorDialog::OnBnClickedRadio3) ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP()
// CRedaktorDialog message handlers
void CRedaktorDialog::OnBnClickedCvet() { ColorDlg.m_cc.lpCustColors=Palitra;
ColorDlg.DoModal();
};
void CRedaktorDialog::DobavitUzel(CPoint point) { Ts_Uzel U;
U.Poziciya=point; U.Cvet=Cvet; pSpisokUzlov->Dobavit(U); Risovat(); }
void CRedaktorDialog::Risovat() { CDC* pdc; RECT klientr; pdc=GetDC(); GetClientRect(&klientr); klientr.top=klientr.top+60; pdc->FillSolidRect(&klientr,RGB(128,128,128)); pSpisokUzlov->RisovatUzly(pdc); }
void CRedaktorDialog::UdalitUzel(CPoint point) { UINT16 Index; if(pSpisokUzlov->NajjtiUzelPoKoordinatam(point, &Index)) { pSpisokUzlov->Udalit(Index); }; Risovat(); }
void CRedaktorDialog::OnLButtonDown(UINT nFlags, CPoint point) { TashhitMysh=false; UINT16 i; if(pSpisokUzlov->NajjtiUzelPoKoordinatam(point,&i)) { TashhitMyshUzelIndeks=i; TashhitMyshNachalo=point; TashhitMysh=true; }; switch (Rezhim) { case Te_Rezhim::Rezhim_RebroDobavit: { }break; }
CDialog::OnLButtonDown(nFlags, point); } void CRedaktorDialog::OnLButtonUp(UINT nFlags, CPoint point) { switch (Rezhim) { case Te_Rezhim::Rezhim_UzelDobavit:DobavitUzel(point);break; case Te_Rezhim::Rezhim_UzelRedactirovat: { if(TashhitMysh==true ) { pSpisokUzlov->PUzly[TashhitMyshUzelIndeks].Poziciya=point; }; TashhitMysh=false; Risovat(); };break; }; CDialog::OnLButtonUp(nFlags, point); }
void CRedaktorDialog::OnRButtonUp(UINT nFlags, CPoint point) { switch (Rezhim) { case Te_Rezhim::Rezhim_UzelDobavit:UdalitUzel(point);break; case Te_Rezhim::Rezhim_UzelRedactirovat:;break;
}; CDialog::OnRButtonUp(nFlags, point); }
void CRedaktorDialog::OnPaint() { CPaintDC dc(this); Risovat(); }
void CRedaktorDialog::OnBnClickedOk() { // TODO: Add your control notification handler code here OnOK(); }
void CRedaktorDialog::OnBnClickedButtonDobavituzel() { // TODO: Add your control notification handler code here }
void CRedaktorDialog::OnBnClickedRadio1() { Rezhim=Te_Rezhim::Rezhim_UzelDobavit; }
void CRedaktorDialog::OnBnClickedRadio2() { Rezhim=Te_Rezhim::Rezhim_UzelRedactirovat; }
void CRedaktorDialog::OnMouseMove(UINT nFlags, CPoint point) { switch (Rezhim) { case Te_Rezhim::Rezhim_UzelRedactirovat: { if(TashhitMysh==true ) { pSpisokUzlov->PUzly[TashhitMyshUzelIndeks].Poziciya=point; }; Risovat(); };break;
}; CDialog::OnMouseMove(nFlags, point); }
void CRedaktorDialog::OnBnClickedRadio3() { Rezhim=Te_Rezhim::Rezhim_RebroDobavit; }
|
| Код | // GRAFDlg.h : header file //
#pragma once
// CGRAFDlg dialog class CGRAFDlg : public CDialog { // Construction public: CGRAFDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data enum { IDD = IDD_GRAF_DIALOG };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation protected: HICON m_hIcon;
// Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedZapuskredaktora(); };
|
| Код | // GRAFDlg.cpp : implementation file //
#include "stdafx.h" #include "GRAF.h" #include "GRAFDlg.h" #include "RedaktorDialog.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
// CGRAFDlg dialog
CGRAFDlg::CGRAFDlg(CWnd* pParent /*=NULL*/) : CDialog(CGRAFDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
void CGRAFDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); }
BEGIN_MESSAGE_MAP(CGRAFDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_ZapuskRedaktora, &CGRAFDlg::OnBnClickedZapuskredaktora) END_MESSAGE_MAP()
// CGRAFDlg message handlers
BOOL CGRAFDlg::OnInitDialog() { CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control }
// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.
void CGRAFDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }
// The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CGRAFDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); }
void CGRAFDlg::OnBnClickedZapuskredaktora() { CRedaktorDialog Redaktor; Redaktor.DoModal(); // TODO: Add your control notification handler code here }
|
|