Condiţia: Să se scrie un program MFC de tipul single document care va desena în fereastra aplicaţiei graficul funcţiei y = cos(x) şi va înscrie date în 2 fişiere.
Primul fişier va conţine:
- valoarea argumentului
- valoarea funcţiei standarte în punctul stabilit
- valoarea funcţiei proprii în acelaşi punct
- valoarea absolută a diferenţei dintre valoarea funcţiei standarte şi a funcţiei proprii
- precizia
Al doilea fişier va conţine:
- valoarea argumentului
- valoarea funcţiei prorii in punctul stabilit
Funcţia proprie va fi calculată cu ajutorul seriei:
Codul programului:
GraficaLabView.cpp
#include "stdafx.h"
#include "GraficaLab1.h"
#include "GraficaLab1Doc.h"
#include "GraficaLab1View.h"
#include <cmath>
#include <fstream>
#include <iostream>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
using namespace std;
double fact(int n)
{
double factorial = 1;
for(int i = 1; i <= n; i++)
{
factorial *= i;
}
return factorial;
}
double MyCos(double x, double E)
{
double value = 0, term_serie;
int k = 0;
do
{
term_serie = pow(-1.0, k) * pow(x, 2 * k) / fact(2 * k);
value += term_serie;
k++;
}
while(fabs(term_serie) > E);
return value;
}
void CGraficaLab1View::OnDraw(CDC* pDC)
{
CGraficaLab1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
else
{
CRect RClient;
GetClientRect(&RClient);
int nrseg = 100;
double E = 0.0001, scale = 60, a = (-RClient.Width() / 2) / scale, b = (RClient.Width() / 2) / scale, step = (b - a) / nrseg;
double x,y;
double ah = (-RClient.Height() / 2) / scale, bh = (RClient.Height() / 2) / scale;
CPen pen_axis(PS_SOLID, 2, RGB(0, 0, 255));
CPen pen_cos(PS_SOLID, 1, RGB(255, 0, 0));
CPen pen_divisions(PS_SOLID, 2, RGB(0, 255, 0));
CPen *current_pen = pDC->SelectObject(&pen_axis);
pDC->MoveTo(0, RClient.CenterPoint().y);
pDC->LineTo(RClient.Width() - 1, RClient.CenterPoint().y);
pDC->MoveTo(RClient.CenterPoint().x, 0);
pDC->LineTo(RClient.CenterPoint().x, RClient.Height() - 1);
pDC->SelectObject(pen_divisions);
for(x = ceil(a); x <= b; ++x)
{
pDC->MoveTo(RClient.CenterPoint().x + (int)(x * scale), RClient.CenterPoint().y - 3);
pDC->LineTo(RClient.CenterPoint().x + (int)(x * scale), RClient.CenterPoint().y + 3);
}
for(y = ceil(ah); y <= bh; ++y)
{
pDC->MoveTo(RClient.CenterPoint().x - 3, RClient.CenterPoint().y - (int)(y * scale));
pDC->LineTo(RClient.CenterPoint().x + 3, RClient.CenterPoint().y - (int)(y * scale));
Documentul este oferit gratuit,
trebuie doar să te autentifici in contul tău.