Мегаобучалка Главная | О нас | Обратная связь


Описание работы программного продукта



2019-12-29 214 Обсуждений (0)
Описание работы программного продукта 0.00 из 5.00 0 оценок




Техническое задание

 

Программный продукт GRAPHIC позволяет строить и сохранять графики любых функций одной переменной. Продукт разработан на языке программирования Мicrosoft Visual C++ 6.0 с использованием объектно-ориентированной методологии. Диалог пользователя с программой, а именно введение параметров, осуществляется посредством диалоговых окон программы. Диапазон вводимых значений программно ограничен, с целью недопущения некорректной работы или возникновения ошибки.

 

Общая блок-схема алгоритма

 

Общая блок схема алгоритма программы GRAPHIC:

 

Описание работы программного продукта

 

Программа “GRAPHIC” позволяет строить и сохранять графики функций одной переменной. При открытии программы появляется окно, в котором уже по умолчанию построен график функции f(x)=sin(x)+0.05*x на отрезке [-5,10]. Выбрав на панели меню пункт Функция, и, изменяя поле ввода в появившемся диалоговом окне, можно построить необходимый график функции или изменить отрезок, на котором построен график.

Для того, чтобы лучше понять работу программы приведем некоторые коды

 

class CGRAPHICView : public CView //Класс Single Document

{

public:

    CString sFunc;

    double XX;

    double X1;

    double X2;

    int SdvX;

    int SdvY;

    int DlX;

    int DlY;

    CDC* pDCbuf;

    bool GbNeedRepaint;

    CMFunc vFunc;

    CFuncEval FuncEval;

    void Vichislenie();

    void VFillBuffer (CDC* pSrcDC);

    //Остальные свойства и методы класса Single Document

};

class CMFunc           //Класс расчета функции

{       

public:

    double FXX[400];

    double FYY[400];

    bool FYYER[400];

    int KolT;

    double MinY;

    double MaxY;

    void FuncMaxMinY();

    CMFunc();

};

void CGRAPHICView::OnDraw(CDC* pDC) //Функция прорисовки документа

{

    CGRAPHICDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    // TODO: add draw code for native data here

    try

    {

              VFillBuffer(pDC);

    }

    catch (...)

    {

              MessageBox(_T("Ошибка построения графика!"),_T("Ошибка"));

    }

}

void CGRAPHICView::Vichislenie()    //Функция вычисления параметров функции

{

    int a; double shag;

    extern BOOL bMathError;

    FuncEval.SetString(sFunc);

    //Вычисляем шаг shag

    shag=((X2-X1)/(vFunc.KolT-1));

    //Вычисляем узлы функции vFunc.FXX[a]

    for(a=0;a<(vFunc.KolT-1);a++)

              vFunc.FXX[a]=X1+a*shag;

    vFunc.FXX[vFunc.KolT-1]=X2;

    //Вычисляем значения функции в узлах vFunc.FYY[a] и ошибку вычисления vFunc.FYYER[a]

    for(a=0;a<vFunc.KolT;a++) {

              bMathError = FALSE;

              XX=vFunc.FXX[a];

              vFunc.FYY[a] = FuncEval.Compute ();

              vFunc.FYYER[a] = bMathError;

              }

    //Вычисляем max и min значения функции vFunc.MaxY и vFunc.MinY

    vFunc.FuncMaxMinY();

}

void CGRAPHICView::VFillBuffer (CDC* pSrcDC) //Функция рисования графика

{

    int OtstX;

    int OtstY;

    int DlOX;

    int DlOY;

    int KolLX;

    int KolLY;

    SdvX=30;

    SdvY=30;

    DlX=700;

    DlY=370;

    OtstX=80;

    OtstY=30;

    DlOX=DlX-OtstX-50;

    DlOY=DlY-2*OtstY;

    KolLX=10;

    KolLY=10;

    double KoefX;

    double KoefY;

    int a; double d,dd; CString sss;

    if(GbNeedRepaint==TRUE) {

              //Вычисление параметров функции (объект vFunc класса CMFunc)

              Vichislenie();

              //???????????????????????????????????????????????

              pDCbuf->DeleteDC ();

              pDCbuf->CreateCompatibleDC (pSrcDC);

              CBitmap bitmap;

              bitmap.CreateCompatibleBitmap(pSrcDC,DlX,DlY);

              CBitmap* pbmp=pDCbuf->SelectObject(&bitmap);

                  

//Рисование графика-------------------------------------------------

              //Цвета (разметки (линий) - cvet1, осей - cvet2, графика - cvet3)

              CPen cvet1(PS_SOLID,1,RGB(100,100,50));

              CPen cvet2(PS_SOLID,1,RGB(200,0,200));

              CPen cvet3(PS_SOLID,1,RGB(255,0,0));

              //Отключаем фон текста и устанавливаем цвет текста

              pDCbuf->SetBkMode(TRANSPARENT);

              pDCbuf->SetTextColor(RGB(0,0,210));

              //Закрашиваем область графика

              pDCbuf->FillSolidRect(0,0,DlX,DlY,RGB(235,235,235));

              //Рисование разметки X

              pDCbuf->SelectObject(cvet1);

              d=((double)DlOX/(KolLX-1));

              for(a=0;a<KolLX;a++) {

                       pDCbuf->MoveTo(OtstX+(int)(a*d),OtstY);

                       pDCbuf->LineTo(OtstX+(int)(a*d),OtstY+DlOY);

                       }

              //Рисование разметки Y

              d=((double)DlOY/(KolLY-1));

              for(a=0;a<KolLY;a++) {

                       pDCbuf->MoveTo(OtstX,OtstY+(int)(a*d));

                       pDCbuf->LineTo(OtstX+DlOX,OtstY+(int)(a*d));

                       }

              //Подписи X

              d=(X2-X1)/(KolLX-1);

              dd=((double)DlOX/(KolLX-1));

              for(a=0;a<(KolLX-1);a++) {

                       sss.Format(_T("%.3f"),X1+a*d);

                       pDCbuf->TextOut(OtstX+(int)(a*dd)-4*sss.GetLength(),OtstY+DlOY+3,sss);

                       }

              sss.Format(_T("%.3f"),X2); a=KolLX-1;

              pDCbuf->TextOut(OtstX+(int)(a*dd)-4*sss.GetLength(),OtstY+DlOY+3,sss);

              //Подписи Y

              d=(vFunc.MaxY-vFunc.MinY)/(KolLY-1);

              dd=((double)DlOY/(KolLY-1));

              for(a=1;a<(KolLY-1);a++) {

                       sss.Format(_T("%.3f"),vFunc.MinY+a*d);

                       pDCbuf->TextOut(OtstX-3-7*sss.GetLength(),OtstY+DlOY-(int)(a*dd)-7,sss);

                       }

              sss.Format(_T("%.3f"),vFunc.MinY);

              pDCbuf->TextOut(OtstX-3-7*sss.GetLength(),OtstY+DlOY-12,sss);

              sss.Format(_T("%.3f"),vFunc.MaxY); a=KolLY-1;

              pDCbuf->TextOut(OtstX-3-7*sss.GetLength(),OtstY+DlOY-(int)(a*dd)-7,sss);

              //Подпись "График функции..."

              sss.Format(_T(" на отрезке [%.2f,%.2f]"),X1,X2);

              pDCbuf->TextOut(OtstX+80-2*sFunc.GetLength(),OtstY-25,(_T("График функции f(x)=")+sFunc+sss));

              //Вычисления коэффициентов сжатия на экране KoefX и KoefY

              KoefX=((double)DlOX)/(X2-X1);

              KoefY=((double)DlOY)/(vFunc.MaxY-vFunc.MinY);

              //Рисование осей X и Y

              pDCbuf->SelectObject(cvet2);

              if(X1<=0&&X2>=0) {

                       pDCbuf->MoveTo(OtstX-(int)(X1*KoefX),OtstY);

                       pDCbuf->LineTo(OtstX-(int)(X1*KoefX),OtstY+DlOY);

                       }

              if(vFunc.MinY<=0&&vFunc.MaxY>=0) {

                       pDCbuf->MoveTo(OtstX,OtstY+DlOY+(int)(KoefY*vFunc.MinY));

                       pDCbuf->LineTo(OtstX+DlOX,OtstY+DlOY+(int)(KoefY*vFunc.MinY));

                       }

              //Рисование самого графика функции

              pDCbuf->SelectObject(cvet3);

              for(a=1;a<vFunc.KolT;a++) {

                       if(vFunc.FYYER[a-1]==FALSE&&vFunc.FYYER[a]==FALSE) {

                                 pDCbuf->MoveTo(OtstX+(int)(KoefX*(vFunc.FXX[a-1]-X1)),OtstY+DlOY-(int)(KoefY*(vFunc.FYY[a-1]-vFunc.MinY)));

                                 pDCbuf->LineTo(OtstX+(int)(KoefX*(vFunc.FXX[a]-X1)),OtstY+DlOY-(int)(KoefY*(vFunc.FYY[a]-vFunc.MinY)));

                                 }                

                       }

//------------------------------------------------------------------

              GbNeedRepaint=FALSE;

              }

    //Копирование буфера pDCbuf на экран

    pSrcDC->BitBlt (SdvX, SdvY, DlX, DlY, pDCbuf, 0, 0, SRCCOPY);

}

void CGRAPHICView::OnFileSave()   //Функция сохранения графика

{

    HRESULT hResult;

    CString strFilter;

    strFilter = "PNG image (*.png)|*.png||";

    CFileDialog dlg(FALSE,_T("png"),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER,strFilter);

    hResult = (int)dlg.DoModal();

    if (hResult != IDOK) {MessageBox("Отменено пользователем","Предупреждение"); return;}

        

    CString strFileName;

    strFileName = dlg.m_ofn.lpstrFile;

    CImage imgOriginal;

    imgOriginal.Create (DlX, DlY, 24);

    //Это позволяет нарисовать все что должно быть сохранено

    (pDCbuf->FromHandle (imgOriginal.GetDC ()))->BitBlt (0, 0, DlX, DlY, pDCbuf, 0, 0, SRCCOPY);

    hResult = imgOriginal.Save(strFileName);

    try

    {

              imgOriginal.ReleaseDC ();

              imgOriginal.Detach ();

              imgOriginal.Destroy ();

    }

    catch (...)

    {

    }

    if (FAILED(hResult)) {

              MessageBox("Ошибка сохранения!","Ошибка!");

    }

}

 



2019-12-29 214 Обсуждений (0)
Описание работы программного продукта 0.00 из 5.00 0 оценок









Обсуждение в статье: Описание работы программного продукта

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (214)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.005 сек.)