Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Programare orientata pe obiecte
Descrierea temei
Sa se scrie un program (un wizard) care sa permita generarea unui fisier header si a unui fisier sursa pentru definirea si implementarea unei clase C++.Numele variabilelor membre ,precum si a numelui functiilor membre ,a parametrilor si a rezultatului trebuie specificat de catre utilizator.In plus,wizard-ul trebuie sa permita editarea unei anumite functii,prin pozitionarea cursorului in interiorul corpului functiei din fisierul de implementare.
Scurta descriere a modului de rezolvare al problemei
Pentru implementarea problemei s-a generat o aplicatie de tip MFCApplicationWizard cu interfata pentru documente multiple.S-a folosit arhitectura Document/View,unde pentru clasa pentru vizualizare a fost derivata din clasa de baza CeditView.
Crearea celor 2 fisiere presupune parcurgerea mai multor etape,in care se inregistreaza datele necesare programului.Aceste date cerute de problema sunt introduse de utilizator in campuri speciale din cadrul unor casute de dialog,pentru fiecare variabila si functie si apoi sunt salvate in liste de astfel de structuri.Dupa terminarea pasilor de introducere a datelor in campurile din casutele de dialog pentru fiecare variabila si functie,pe baza listelor create se trece la scrirea celor doua fisiere conform structurii limbajului C++.Astfel este creat scheletul aplicatiei,singura sarcina a utilizatorului fiind editarea continutului functiilor clasei din fisierul de inplementare.Editarea este realizata prin intermediul clasei CEditView.
Capitolul 1: Introducere
Elementele principale ale proiectului sunt clasele de baza CDocument si CEditView din care sunt derivate clasele de tip document si vizualizare din cadrul arhitecturii Document/View pe care se sprijina aplicatia.Totusi dintre aceste doua clase cea mai importanta in ceea ce priveste problema noastra este clasa CEditView.Datorita acestei clase sarcina de editare a functiilor clasei asa cum este cerut in problema devine ceva banal.De fapt singura munca facuta de programator in aceasta privinta este derivarea clasei de vizualizare din clasa CEditView.
O alta clasa importanta a aplicatiei este clasa CDialog care usureaza foarte mult sarcina programatorului de a realiza interfata grafica in cadrul pasilor de la inceput,cand se introduc valorile pentru numele variabilelor membre ,precum si a numelui functiilor membre ,a parametrilor si a rezultatului.
Insa aceste clase nu sunt suficiente pentru a rezolva cerintele aplicatiei.Toate datele introduse in pasii de inceput cu ajutorul casutelor de dialog trebuie salvate undeva pentru o prelucrare ulterioara,cand vom avea nevoie de ele pentru a genera fisierele sursa si header cerute de problma.Aceasta stocare se va face in doua liste special create de catre programator,una pentru informatii despre variabile iar a doua pentru informatii despre functii.S-au folosit liste pentru ca nu se cunostea numarul de variabile si functii in mod aprioric.Daca am fi folosit tablouri era posibil sa se depaseasca dimensiunea maxima a lor.Informatia dintr-un nod al listei reprezinta o clasa ce contine campuri pentru stocarea numelui,tipului si a madificatorului de acces pentru variabile,iar pentru functii avem pe langa aceste informatii o alta lista de variabile pentru stocarea informatiei pentru parametrii.
Putem spune ca singura munca a programatorului este de a crea structurile de date pentru varibile si functii,sa realizeze preluarea lor din casutele de dialog si sa le stocheze,iar apoi pe baza acestor date sa creeze fisierele cerute.Fisierele sunt create cu ajutorul clasei "fstream" predefinita in limbajul C++.
Drept constrangeri care pot afecta modul de rezolvare al temei pot fi mentionate faptul ca nu putem folosi,cum am mai spus,tablouri pentru stocarea datelor necunoscand numarul de elemente.Deasemenea este de mentionat faptul ca acele clase pe care le-am definit pentru reprezentarea listelor lucreaza cu pointeri,deci implicit si cu operatorii "new" si "delete".Datorita acestui fapt aceste clase nu pot fi derivate din clasa CObject sau orice alta clasa derivata din aceasta.Deci nu ne putem folosi de facilitatile acestora(de exemplu aici nu putem folosi functia "MessageBox" direct ci numai prin instantierea unei clase ce permite folosirea acestei functii).
In continuare veti vedea o analiza a cerintelor,apoi proiectarea aplicatiei,implementarea solutiei iar in final testarea aplicatiei.
Analiza cerintelor
Programul trebuie sa generaze un fisier header si un fisier sursa ce corespunde definirii si implementarii unei clase C++ . Numele variabilelor membre ,precum si a numelui functiilor membre ,a parametrilor si a rezultatului trebuie specificat de catre utilizator intr-o serie de etape iar pe baza acestor informatii sunt create fisierele cerute.
In etapa de proiectare trebuie stabilit ce clase se vor folosi pentru a putea realiza aplicatia cum vor fi construite si de unde vor fi derivate daca este cazul.Pentru reprezentarea claselor ce corespund informatiilor despre variabile si functii nu avem nevoie de nici un fel de interfata deoarece ecestea se folosesc doar ca mijloc de stocare.Astfel nu avem nevoie sa le derivam din nici o alta clasa.Pentru clasa document aceasta este derivata de Wizard automat din clasa CDocument.Pentru a ne usura munca in privinta editarii care este o facilitate ce trebuie oferita utilizatorului vom deriva clasa de vizualizare din CEditView .De asemenea pentru a realiza stocarea informatiei in fisiere pe disc , avem nevoie de clasa "fstream".
La pornirea aplicatiei se executa pasii pentru introducerea datelor,deci vor fi incarcate casutele de dialog.Evident aceste lucruri se executa in interiorul constructorului clasei "CMainFrame",deci cadrul principal va aparea dupa terminarea introducerii datelor.La orice etapa de introducere a datelor pe casutele de dialog exista un buton "Cancel",care daca este apasat se renunta la crearea clasei.Astfel nu se va mai crea nici un fisier si se va iesi din program.Daca se continua cu introducerea datelor se vor crea listele de variabile si de functii.
Primul pas cere introducerea numelui clasei. Daca se apasa "cancel" se va afisa un mesaj prin care se anunta ca s-a renuntat la crearea clasei.Dupa ce se va apasa "ok" se va iesi din program.
Daca se introduce numele clasei si se apasa "next" se trece la pasul urmator unde se va afisa o casuta de dialog in care se vor introduce numele variabilei,tipul si se va alege butonul radio corespunzator pentru tipul de acces al acesteia.Prin apasarea butonului "Add" se vor adauga informatiile in variabila de tip "list control" si in lista de variabile creata de programator. Operatia de adaugare se repeta de cate ori doreste utilizatorul.Cand se apasa "Next" se trece la pasul urmator.
Se va afisa o casuta de dialog in care se vor introduce numele functiei,tipul,numarul de parametrii si se va alege butonul radio corespunzator in acelasi mod ca la variabile.Pin apasarea "Add" se vor adauga informatiile in variabila de tip "list control",si in lista de functii creata de utilizator.Daca numarul de parametrii este mai mare ca zero va urma un ciclu de alte casute de dialog pentru introducerea numelui si tipului lor.Daca se va introduce pentru numarul de parametrii un numar negativ sau orice alta valoare de alt tip decat intreg fara semn se va afisa un mesaj prin care se cere introducerea unui numar natural.
Analog se repeta operatia de adaugare.Cand se apasa "next" se trece la pasul urmator care este ultimul pas si reprezinta doar un pas informativ.
Prin apasarea butonului "Finish" se termina introducerea datelor si se deschide cadrul principal. Aici se vor deschide cele doua fisiere create si se vor face editarile necesare.
Proiectarea aplicatiei
Pentru rezolvarea problemei s-a ales scheletul de aplicatie de tip MDI,ce se bazeaza pe arhitectura Document/View, pus la dispozitia programatorilor de catre mediul de programare "Visual C++" al pachetului "Visual Studio".Pentru stocarea informatiei s-a ales ca metoda alocarea dinamica.Aceasta stocare se va face in doua liste special create de catre programator,una pentru informatii despre variabile iar a doua pentru informatii despre functii.S-au folosit liste pentru ca nu se cunostea numarul de variabile si functii in mod aprioric.Daca am fi folosit tablouri era posibil sa se depaseasca dimensiunea maxima a lor.Informatia dintr-un nod al listei reprezinta o clasa ce contine campuri pentru stocarea numelui,tipului si a modificatorului de acces pentru variabile,iar pentru functii avem pe langa aceste informatii o alta lista de variabile pentru stocarea informatiei pentru parametrii.
Structurile arborescente pentru clasele CDialog,CDocument si CEditView pe care le folosim sunt:
Pentru clasele CMDIChildWnd din care este derivata fereastra copil,CMDIFrameWnd di care este derivata fereastra cadru si CWinApp din care este derivat firul principal de executie structurile arborescente sunt:
Structura diagramei UML pentru casutele de dialog este urmatoarea:
Implementarea solutiei
Structurile nodurilor si listelor pentru variabile sunt de forma:
class Vnode
class Vlist
class Fnode
class Flist
Pentru a realiza interfata grafica a casutelor de dialog s-au folosit controale de tipul list control sub forma de raport,casute de editare pentru introducerea si afisarea informatiilor in format text,butoane radio si de control.Pentru a beneficia de aceste facilitati deja existente , controalele inserate cu "ClassWizard" au fost derivate din clase din biblioteca MFC precum:CEdit , CListCtrl , CButton .De asemenea s-au folosit si elemente statice ca Static Text si Group Box.
Dupa ce se parcurg pasii initiali de introducere a datelor,acestea vor fi pastrate in listele special proiectate.Urmatorul pas este acela de genera fisierele conform sintaxei limbajului.Spre exemplu pentru a introduce variabilele membre publice se va parcurge lista cu informatii despre variabile iar daca modificatorul de format este "public" variabila respectiva se va scrie sub forma : "tip nume;".Ciclul repetitiv este:
Vnode* vnode;
for(vnode=ferstep2.m_vlist.get_first();vnode!=NULL;vnode=vnode->m_next)
if(!vnode->m_access.Compare('public'))
file<<'t'<<vnode->m_type<<' '<<vnode->m_name<<';'<<endl;
unde ferstep2 este fereastra in care se introduc datele pentru variabile,iar m_vlist este o variabila membra a acesteia de tip lista de variabile;vnode este o variabila de tip nod din lista de variabile;file este un obiect de tip "fstream".
Asemanator se fac scrierile pentru functii(vezi anexa).
Testarea aplicatiei
Primul pas cere introducerea numelui clasei.
Daca se apasa "cancel" se va afisa mesajul :
Dupa ce se apasa "ok",se va iesi din program.
Prin introducerea numelui si apasarea "next" se trece la pasul urmator.
Se vor introduce numele variabilei,tipul si se va alege butonul radio corespunzator.Pin apasarea "Add" se vor adauga informatiile in variabila de tip "list control",si in lista de variabile creata de utilizator.
Apoi se repeta operatia de adaugare.Cand se apasa "next" se trece la pasul urmator.
Se vor introduce numele functiei,tipul,numarul de parametrii si se va alege butonul radio corespunzator.Pin apasarea "Add" se vor adauga informatiile in variabila de tip "list control",si in lista de functii creata de utilizator.Daca numarul de parametrii este mai mare ca zero va urma un ciclu de alte casute de dialog pentru introducerea numelui si tipului lor.
Daca se va introduce pentru numarul de parametrii un numar negativ se va afisa un mesaj prin care se cere introducerea unui numar pozitiv.
Apoi se repeta operatia de adaugare.Cand se apasa "next" se trece la pasul urmator.
Prin apasarea butonului "Finish" se termina introducerea datelor si se deschide cadrul principal.Aici se vor deschide cele doua fisiere create si se vor face editarile.
Concluzii
Aplicatia poate fi dezvoltata fata de cerintele problemei , in sensul ca pe langa operatia de creare a clasei se poate crea in cadrul principal al programului si un meniu cu operatii de adaugare variabile si functii la o anumita clasa creata.
De asemenea in cadrul clasei "MainFrame" se poate crea o alta fereastra de tip "CTreeCtrl" in care sa fie afisate pentru fiecare clasa creata o structura arborescenta care sa contina datele si functiile membre.
Referinte bibliografice
1. Anderson, R.E. Social impacts of computing: Codes of professional ethics. Social Science Computing
Review 10, 2 (Winter 1992), 453-469.
2. CHI Conference Publications Format. Available at https://www.acm.org/sigchi/chipubform/.
3. Conger., S., and Loch, K.D. (eds.). Ethics and computer use. Commun. ACM 38, 12 (entire issue).
4. Mackay, W.E. Ethics, lies and videotape, in Proceedings of CHI '95 (Denver CO, May 1995), ACM
Press, 138-145.
5. Schwartz, M., and Task Force on Bias-Free Language. Guidelines for Bias-Free Writing. Indiana
University Press, Bloomington IN, 1995.
Anexe
// MainFrm.cpp : implementation of the CMainFrame class
#include 'stdafx.h'
#include 'twiz.h'
#include 'MainFrm.h'
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
else file<<');'<<endl;
}
file<<'private:'<<endl;
for(fnode=ferstep3.m_flist.get_first();fnode!=NULL;fnode=fnode->m_next)
if(!fnode->m_access.Compare('private'))
else file<<');'<<endl;
}
file<<'protected:'<<endl;
for(fnode=ferstep3.m_flist.get_first();fnode!=NULL;fnode=fnode->m_next)
if(!fnode->m_access.Compare('protected'))
else file<<');'<<endl;
}
file<<'}'<<endl;
file.close();
s=ferstep1.m_class;
s+='.cpp';
file.open(s,ios::out);
s=ferstep1.m_class;
file<<'#include ''<<s<<'.h''<<endl<<endl;
for(fnode=ferstep3.m_flist.get_first();fnode!=NULL;fnode=fnode->m_next)
else file<<')'<<endl;
file<<''<<endl<<endl;
}
file<<s<<'::'<<s<<'()'<<endl;
file<<''<<endl<<endl;
file<<s<<'::~'<<s<<'()'<<endl;
file<<''<<endl;
file.close();
}
else
}
else
}
else
CMainFrame::~CMainFrame()
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
void CMainFrame::Dump(CDumpContext& dc) const
#endif //_DEBUG
// CMainFrame message handlers
// Vnode.h: interface for the Vnode class.
#if !defined(AFX_VNODE_H__177BA2A0_3D31_11D8_872C_9D18496E4829__INCLUDED_)
#define AFX_VNODE_H__177BA2A0_3D31_11D8_872C_9D18496E4829__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class Vnode
#endif // !defined(AFX_VNODE_H__177BA2A0_3D31_11D8_872C_9D18496E4829__INCLUDED_)
// Vnode.cpp: implementation of the Vnode class.
#include 'stdafx.h'
#include 'twiz.h'
#include 'Vnode.h'
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// Construction/Destruction
Vnode :: Vnode() // constructorul structurii 'Vnode'
Vnode :: Vnode(CString name , CString type, CString access, Vnode* next) // constructorul structurii 'Vnode'
Vnode::~Vnode()
/ Vlist.h: interface for the Vlist class.
#if !defined(AFX_VLIST_H__177BA2A1_3D31_11D8_872C_9D18496E4829__INCLUDED_)
#define AFX_VLIST_H__177BA2A1_3D31_11D8_872C_9D18496E4829__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include 'Vnode.h'
class Vlist
#endif // !defined(AFX_VLIST_H__177BA2A1_3D31_11D8_872C_9D18496E4829__INCLUDED_)
// Vlist.cpp: implementation of the Vlist class.
#include 'stdafx.h'
#include 'twiz.h'
#include 'Vlist.h'
#include 'Vnode.h'
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// Construction/Destruction
Vlist::Vlist()
Vlist::~Vlist()
void Vlist :: delete_list()
void Vlist :: add(CString name , CString type, CString access)
else
Vnode* Vlist::get_first()
Vnode* Vlist::get_last()
// Fnode.h: interface for the Fnode class.
#if !defined(AFX_FNODE_H__177BA2A2_3D31_11D8_872C_9D18496E4829__INCLUDED_)
#define AFX_FNODE_H__177BA2A2_3D31_11D8_872C_9D18496E4829__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include 'Vlist.h'
class Fnode
#endif // !defined(AFX_FNODE_H__177BA2A2_3D31_11D8_872C_9D18496E4829__INCLUDED_)
// Fnode.cpp: implementation of the Fnode class.
#include 'stdafx.h'
#include 'twiz.h'
#include 'Fnode.h'
#include 'Vlist.h'
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// Construction/Destruction
Fnode::Fnode()
Fnode::~Fnode()
Fnode :: Fnode(CString name , CString type, CString access, Fnode *next) // constructorul structurii 'Fnode'
// Flist.h: interface for the Flist class.
#if !defined(AFX_FLIST_H__177BA2A3_3D31_11D8_872C_9D18496E4829__INCLUDED_)
#define AFX_FLIST_H__177BA2A3_3D31_11D8_872C_9D18496E4829__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include 'Fnode.h'
class Flist
#endif // !defined(AFX_FLIST_H__177BA2A3_3D31_11D8_872C_9D18496E4829__INCLUDED_)
// Flist.cpp: implementation of the Flist class.
#include 'stdafx.h'
#include 'twiz.h'
#include 'Flist.h'
#include 'Fnode.h'
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// Construction/Destruction
Flist::Flist()
Flist::~Flist()
void Flist :: delete_list()
void Flist :: add(CString name , CString type, CString access)
else
Fnode *Flist::get_last()
Fnode *Flist::get_first()
#if !defined(AFX_STEP2_H__A8C5AB41_3960_11D8_872C_EC4ECB46092A__INCLUDED_)
#define AFX_STEP2_H__A8C5AB41_3960_11D8_872C_EC4ECB46092A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// step2.h : header file
// step2 dialog
#include 'Vlist.h'
class step2 : public CDialog
CListCtrl m_list;
CString m_name;
CString m_type;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//}AFX_MSG
DECLARE_MESSAGE_MAP()
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STEP2_H__A8C5AB41_3960_11D8_872C_EC4ECB46092A__INCLUDED_)
// step2.cpp : implementation file
#include 'stdafx.h'
#include 'twiz.h'
#include 'step2.h'
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// step2 dialog
step2::step2(CWnd* pParent /*=NULL*/)
: CDialog(step2::IDD, pParent)
}AFX_DATA_INIT
m_access = _T('public');
void step2::DoDataExchange(CDataExchange* pDX)
}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(step2, CDialog)
//}AFX_MSG_MAP
END_MESSAGE_MAP()
// step2 message handlers
void step2::Onadd()
BOOL step2::OnInitDialog()
void step2::Onpublic()
void step2::Onprivate()
void step2::Onprotected()
#if !defined(AFX_STEP3_H__177BA2A8_3D31_11D8_872C_9D18496E4829__INCLUDED_)
#define AFX_STEP3_H__177BA2A8_3D31_11D8_872C_9D18496E4829__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// step3.h : header file
// step3 dialog
#include 'Flist.h'
class step3 : public CDialog
CListCtrl m_list;
CString m_name;
CString m_type;
UINT m_no;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//}AFX_MSG
DECLARE_MESSAGE_MAP()
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STEP3_H__177BA2A8_3D31_11D8_872C_9D18496E4829__INCLUDED_)
// step3.cpp : implementation file
#include 'stdafx.h'
#include 'twiz.h'
#include 'step3.h'
#include 'step4.h'
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// step3 dialog
step3::step3(CWnd* pParent /*=NULL*/)
: CDialog(step3::IDD, pParent)
}AFX_DATA_INIT
m_access = _T('public');
void step3::DoDataExchange(CDataExchange* pDX)
}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(step3, CDialog)
//}AFX_MSG_MAP
END_MESSAGE_MAP()
// step3 message handlers
void step3::Onadd()
}
BOOL step3::OnInitDialog()
void step3::Onpublic()
void step3::Onprivate()
void step3::Onprotected()
Politica de confidentialitate |
Copyright © 2024 - Toate drepturile rezervate