Техническое задание и блок-схема алгоритма программы построения графиков функций. Инструкция по инсталляции и описание работы программного продукта 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;aDeleteDC (); 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;aMoveTo(OtstX (int)(a*d),OtstY); pDCbuf->LineTo(OtstX (int)(a*d),OtstY DlOY); } //Рисование разметки Y d=((double)DlOY/(KolLY-1)); for(a=0;aMoveTo(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;aTextOut(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;aTextOut(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) { pDCbuf->MoveTo(OtstX-(int)(X1*KoefX),OtstY); pDCbuf->LineTo(OtstX-(int)(X1*KoefX),OtstY DlOY); } if(vFunc.MinY=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;aMoveTo(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(Ошибка сохранения!,Ошибка!); } } 4.