Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних технологій автоматики і метрології
Кафедра ЕОМ
ЗВІТ
З навчальної практики з дисципліни
Об'єктно орієнтованого прогрограмування
Львів 2009
Мета практити
Розвинути навики використання Об’єктно-Орієетованого Програмування (ООП) при створенні програмних продуктів для операційної системи Windows та системного програмного забезпечення. Засвоїти навики використання типових об’єктно-орієнтованих бібліотек при розробці сучасного графічного інтерфейсу користувача. Познайомитись з бібліотекою класів MFC, навчитись створювати віконні програми, що будуються на основі діалогу, одно- та багатодокументної архітектури.
Частина 1.
Завдання:
Розробити клас CСomplex за допомогою якого візуальна програма буде виконуватись прості математичні операції над комплексними числами.
Основними методами класу є:
void CAdd(double re, double im); - Виконує операцію додавання
void CSub(double re, double im); - Виконує операцію віднімання
void CMul(double re, double im); - Виконує операцію множення
void CDiv(double re, double im); - Виконує операцію ділення
void CRes(double re, double im); - Виводить результат операції
double GetRe(); - повертає значення дійсної частини комплексного числа
double GetIm();- повертає значення уявної частини комплексного числа
void ToFile() – записує у файл;
Вікно програми:
Аналіз виконання Частини 2:
Завдання:
Розробити програму на основі, однодокументного проекту, за допомогою якої будуть відкриватис і редагуватись текстові файли.
Основними класами і методами є:
class CDocumentView : public CeditView – клас вигляду, на основі класу CeditView
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); початок друку
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) – завершення друку;
class CDocumentDoc : public Cdocument – клас документ, відповідає за вміст документу
Вигляд програми:
Аналіз виконання Частини 3:
Завдання:
Розробити багатодокументну програму на основі класу ClistView, за допомогою якої буде читатись текстовий документ і відображатись у вигляді таблиці
Частина 3
Основними структурами є:
struct StableRow – структура таблиці
class CStoreTableDoc : public Cdocument – клас відповідає за роботу з документом програми
class CStoreTableView : public ClistView – клас який відповідає за вигляд таблиці, на основі красу ClistView
У середовищі Visual Studio 2008 створюємо багатодокументну програму..
Вигляд програми:
Висновок: на навчальній практиці я навчився працювати з візуальним середовищем розробки MS Visual Studio 2008, навчився працювати з стандартною бібліотекою компонентів MFC, а зокрема розробляти програми на основі діалогового проекту, однодокуметного проекту і багатодокументного проекту.
Додаток 1
Код програми:
#pragma once
#include "afxwin.h"
class CComplex {
private:
double m_Re, m_Im;
char m_oper;
CString m_ReS, m_ImS;
CString m_text;
CStdioFile file;
public:
CComplex();
void CAdd(double re, double im);
void CSub(double re, double im);
void CMul(double re, double im);
void CDiv(double re, double im);
void CRes(double re, double im);
double GetRe();
double GetIm();
void ToFile();
};
#include "stdafx.h"
#include "CComplex.h"
CComplex::CComplex (){
m_Re = 0;
m_Im = 0;
file.Open ((CString)"Operation.txt", CFile::modeCreate );
file.Close ();
}
void CComplex::CAdd (double re, double im){
m_Re = re;
m_Im = im;
m_oper = '+';
m_ReS.Format ((CString)"%0.1Lf", m_Re);
m_ImS.Format ((CString)"%0.1Lf", m_Im);
m_text =(CString)"(" + m_ReS +(CString)" + " + m_ImS +(CString)"i) + ";
}
void CComplex::CSub(double re, double im){
m_Re = re;
m_Im = im;
m_oper = '-';
m_ReS.Format ((CString)"%0.1Lf", m_Re);
m_ImS.Format ((CString)"%0.1Lf", m_Im);
m_text =(CString)"(" + m_ReS +(CString)" + " + m_ImS +(CString)"i) - ";
}
void CComplex::CMul (double re, double im){
m_Re = re;
m_Im = im;
m_oper = '*';
m_ReS.Format ((CString)"%0.1Lf", m_Re);
m_ImS.Format ((CString)"%0.1Lf", m_Im);
m_text =(CString)"(" + m_ReS +(CString)" + " + m_ImS +(CString)"i) * ";
}
void CComplex::CDiv (double re, double im){
m_Re = re;
m_Im = im;
m_oper = '/';
m_ReS.Format ((CString)"%0.1Lf", m_Re);
m_ImS.Format ((CString)"%0.1Lf", m_Im);
m_text =(CString)"(" + m_ReS +(CString)" + " + m_ImS +(CString)"i) / ";
}
void CComplex::CRes(double re, double im){
m_ReS.Format ((CString)"%0.1Lf", re);
m_ImS.Format ((CString)"%0.1Lf", im);
m_text = m_text + (CString)"(" + m_ReS +(CString)" + " + m_ImS +(CString)"i) = ";
switch(m_oper){
case '+':
m_Re = m_Re + re;
m_Im = m_Im + im;
break;
case '-':
m_Re = m_Re - re;
m_Im = m_Im - im;
break;
case '*':
m_Re = m_Re * re - m_Im * im;
m_Im = m_Re * im + m_Im * re;
break;
case '/':
if (re!=0&&im!=0){
m_Re = (m_Re * re + m_Im * im)/(re*re+im*im);
m_Im = (m_Im * re - m_Re * im)/(re*re+im*im);
}
break;
}
m_ReS.Format ((CString)"%0.1Lf", m_Re);
m_ImS.Format ((CString)"%0.1Lf", m_Im);
m_text = m_text + (CString)"(" + m_ReS +(CString)" + " + m_ImS +(CString)"i)";
}
double CComplex::GetRe() {
return m_Re;
}
double CComplex::GetIm() {
return m_Im;
}
void CComplex::ToFile (){
file.Open ((CString)"Operation.txt", CFile::modeWrite);
file.SeekToEnd ();
file.WriteString (m_text + (CString)"\n");
m_text = "";
file.Close ();
}
void Cpract1Dlg::OnBnClickedButton6()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"1";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"1";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton7()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"2";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"2";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton8()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"3";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"3";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton3()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"4";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"4";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton4()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"5";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"5";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton5()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"6";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"6";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton10()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"7";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"7";
UpdateData(FALSE);
}// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton1()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"8";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"8";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton2()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"9";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"9";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton9()
{
if (op) {
m_valRe="0";
m_valIm="0";
UpdateData(FALSE);
op=FALSE;
}
if(m_var1.GetCheck ()){
UpdateData(TRUE);
if (m_valRe == (CString)"0") m_valRe.Empty();
m_valRe = m_valRe + (CString)"0";
UpdateData(FALSE);
}else{
UpdateData(TRUE);
if (m_valIm == (CString)"0") m_valIm.Empty();
m_valIm = m_valIm + (CString)"0";
UpdateData(FALSE);
}
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton19()
{
m_valRe = (CString)"0";
m_valIm = (CString)"0";
UpdateData(FALSE);
m_plus.EnableWindow (TRUE);
m_minus.EnableWindow (TRUE);
m_mul.EnableWindow (TRUE);
m_div.EnableWindow (TRUE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton18()
{
m_valRe = (CString)"0";
m_valIm = (CString)"0";
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton17()
{
UpdateData(TRUE);
if(m_var1.GetCheck ()){
len = m_valRe.GetLength ();
m_valRe.Delete (len-1,1);
if (m_valRe==(CString)"")
m_valRe = (CString)"0";
}else{
len = m_valIm.GetLength ();
m_valIm.Delete (len-1,1);
if (m_valIm==(CString)"")
m_valIm = (CString)"0";
}
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton16()
{
UpdateData(TRUE);
re = _tstof(m_valRe);
im = _tstof(m_valIm);
complex.CAdd(re, im);
op=TRUE;
m_plus.EnableWindow (FALSE);
m_minus.EnableWindow (FALSE);
m_mul.EnableWindow (FALSE);
m_div.EnableWindow (FALSE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton12()
{
UpdateData(TRUE);
re = _tstof(m_valRe);
im = _tstof(m_valIm);
complex.CRes(re, im);
m_valRe.Format ((CString)"%0.1Lf", complex.GetRe());
m_valIm.Format ((CString)"%0.1Lf", complex.GetIm());
UpdateData(FALSE);
op=TRUE;
complex.ToFile ();
m_plus.EnableWindow (TRUE);
m_minus.EnableWindow (TRUE);
m_mul.EnableWindow (TRUE);
m_div.EnableWindow (TRUE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton15()
{
UpdateData(TRUE);
re = _tstof(m_valRe);
im = _tstof(m_valIm);
complex.CSub(re, im);
op=TRUE;
m_plus.EnableWindow (FALSE);
m_minus.EnableWindow (FALSE);
m_mul.EnableWindow (FALSE);
m_div.EnableWindow (FALSE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton14()
{
UpdateData(TRUE);
re = _tstof(m_valRe);
im = _tstof(m_valIm);
complex.CMul(re, im);
op=TRUE;
m_plus.EnableWindow (FALSE);
m_minus.EnableWindow (FALSE);
m_mul.EnableWindow (FALSE);
m_div.EnableWindow (FALSE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton13()
{
UpdateData(TRUE);
re = _tstof(m_valRe);
im = _tstof(m_valIm);
complex.CDiv(re, im);
op=TRUE;
m_plus.EnableWindow (FALSE);
m_minus.EnableWindow (FALSE);
m_mul.EnableWindow (FALSE);
m_div.EnableWindow (FALSE);
// TODO: Add your control notification handler code here
}
void Cpract1Dlg::OnBnClickedButton11()
{
UpdateData(TRUE);
re = _tstof(m_valRe);
re = re * (-1);
m_valRe.Format ((CString)"%0.1Lf", re);
UpdateData(FALSE);
// TODO: Add your control notification handler code here
}
Додаток 2
Код програми:
#include "stdafx.h"
#include "Document.h"
#include "MainFrm.h"
#include "DocumentDoc.h"
#include "DocumentView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDocumentApp
BEGIN_MESSAGE_MAP(CDocumentApp, CWinApp)
//{{AFX_MSG_MAP(CDocumentApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDocumentApp construction
CDocumentApp::CDocumentApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CDocumentApp object
CDocumentApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CDocumentApp initialization
BOOL CDocumentApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CDocumentDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CDocumentView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CDocumentApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
Додаток 3
Код програми:
struct STableRow
{
char num1[35];
char op[35];
char num2[35];
char dorv[35];
char rez[35];
};
class CStoreTableDoc : public CDocument
{
protected: // create from serialization only
CStoreTableDoc();
DECLARE_DYNCREATE(CStoreTableDoc)
// Attributes
public:
// Operations
public:
// Overrides
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
virtual void DeleteContents();
int GetRowTotal(){ return m_RowTotal; }
STableRow * GetTable(){ return m_pTable; }
// Implementation
public:
virtual ~CStoreTableDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
DECLARE_MESSAGE_MAP()
int m_RowTotal;
STableRow * m_pTable;
};
#pragma once
class CStoreTableView : public CListView
{
protected: // create from serialization only
CStoreTableView();
STableRow m_SelectedPos;
DECLARE_DYNCREATE(CStoreTableView)
// Attributes
public:
CStoreTableDoc* GetDocument() const;
// Operations
public:
// Overrides
public:
afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void OnInitialUpdate(); // called first time after construct
// Implementation
public:
virtual ~CStoreTableView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in StoreTableView.cpp
inline CStoreTableDoc* CStoreTableView::GetDocument() const
{ return reinterpret_cast<CStoreTableDoc*>(m_pDocument); }
#endif
#include "stdafx.h"
#include "StoreTable.h"
#include "StoreTableDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CStoreTableDoc
IMPLEMENT_DYNCREATE(CStoreTableDoc, CDocument)
BEGIN_MESSAGE_MAP(CStoreTableDoc, CDocument)
END_MESSAGE_MAP()
// CStoreTableDoc construction/destruction
CStoreTableDoc::CStoreTableDoc()
{
m_RowTotal = 0;
}
CStoreTableDoc::~CStoreTableDoc()
{
if (m_RowTotal) free(m_pTable), m_RowTotal = 0;
}
BOOL CStoreTableDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
int i;
char szInBuff[1024];
char * szCurr;
FILE * fIn = fopen(lpszPathName, "r");
while (!feof(fIn)) {
fgets(szInBuff, 1024, fIn);
m_RowTotal++;
}
fseek(fIn, 0, 0);
if (m_RowTotal) {
m_pTable = (STableRow *)malloc(m_RowTotal * sizeof(STableRow));
i = 0;
while (!feof(fIn) && i < m_RowTotal) {
fgets(szInBuff, 1024, fIn);
if (szCurr = strtok(szInBuff, ",")) {
sscanf(szCurr, "%s", m_pTable[i].num1);
}
if (szCurr = strtok(NULL, ",")) {
sscanf(szCurr, "%s", m_pTable[i].op);
}
if (szCurr = strtok(NULL, ",")) {
sscanf(szCurr, "%s", m_pTable[i].num2);
}
if (szCurr = strtok(NULL, ",")) {
sscanf(szCurr, "%s", m_pTable[i].dorv);
}
if (szCurr = strtok(NULL, ",")) {
sscanf(szCurr, "%s", m_pTable[i].rez);
}
i++;
}
m_RowTotal = i;
}
fclose(fIn);
return TRUE;
}
void CStoreTableDoc::DeleteContents()
{
if (m_RowTotal) free(m_pTable), m_RowTotal = 0;
CDocument::DeleteContents();
}
BOOL CStoreTableDoc::OnNewDocument()
{
if (!