
Приложение а
Функция OnGraph() задает координатную плоскость и в ней строит график.
void CLoserDlg::OnGraph()
{
this->RedrawWindow();
UpdateData(TRUE);
CClientDC MyDC(GetDlgItem(IDC_STATIC));
CRect Rect;
CWnd *pWnd = MyDC.GetWindow();
pWnd->GetClientRect(&Rect);
MyDC.FillSolidRect(&Rect, RGB(255,255,255));
MyDC.SetViewportOrg(Rect.Width()/2+t, Rect.Height()/2+p);
if((-Rect.Height()/2 <= p)&&(p <= Rect.Height()/2)) {
MyDC.MoveTo(-Rect.Width()/2-t,0);
MyDC.LineTo(Rect.Width()/2-t,0); }
if((-Rect.Width()/2 <= t)&&(t <= Rect.Width()/2)) {
MyDC.MoveTo(0,-Rect.Height()/2-p);
MyDC.LineTo(0, Rect.Height()/2-p); }
MyDC.MoveTo(-Rect.Width()/2-t, 0);
CPen Pen(PS_SOLID,1,RGB(255,0,0));
MyDC.SelectObject(&Pen);
int local = 0;
int y;
int y0 = 0;
int x = (-Rect.Width()/2-t)/m_M;
y = -(m_A*x*x*x*x+m_B*x*x+m_C);
while((y+p < -Rect.Height()/2)||(y+p > Rect.Height()/2)) {
x++;
y0=y+p;
y = -(m_A*x*x*x*x+m_B*x*x+m_C);
}
x--;
if(y0 < -Rect.Height()/2) MyDC.MoveTo(x*m_M, -Rect.Height()/2-p);
else if (y0 > Rect.Height()/2) MyDC.MoveTo(x*m_M, Rect.Height()/2-p);
for(; x < (Rect.Width()/2-t)/m_M; x++) {
y = -(m_A*x*x*x*x+m_B*x*x+m_C);
if((y+p >= -Rect.Height()/2)&&(y+p <= Rect.Height()/2)) {
MyDC.LineTo(x*m_M, y);
local = 1; }
else if(y+p < -Rect.Height()/2)
if(local == 0) { MyDC.MoveTo(x*m_M, -Rect.Height()/2-p); local = 0; }
else { MyDC.LineTo(x*m_M, -Rect.Height()/2-p); local = 0; }
else
if(local == 0) {MyDC.MoveTo(x*m_M, Rect.Height()/2-p); local = 0;}
else {MyDC.LineTo(x*m_M, Rect.Height()/2-p); local = 0;}
}
}
Функции OnOxp(), OnOxm(), OnOyp(), OnOym() позволяют передвигать координатные ось с графиком.
void CLoserDlg::OnOxp()
{
t++;
CLoserDlg::OnGraph();
}
void CLoserDlg::OnOxm()
{
t--;
CLoserDlg::OnGraph();
}
void CLoserDlg::OnOyp()
{
p++;
CLoserDlg::OnGraph();
}
void CLoserDlg::OnOym()
{
p--;
CLoserDlg::OnGraph();
}
Функция OnGo() находит точки пересечения графика функции с осями координат и выводит их на экран.
void CLoserDlg::OnGo()
{
double Diskr;
double x[2];
m_X = "";
m_Y = "";
UpdateData(TRUE);
if(m_A == 0)
if(m_B == 0)
if(m_C == 0) {
m_X = "Любое число!";
m_Y = "0";
UpdateData(FALSE);
return; }
else {
m_X= "Действительных корней нет!";
m_Y.Format("%f ", m_C);
UpdateData(FALSE);
return; }
else
if((-m_C / m_B) < 0) {
m_X= " Действительных корней нет!";
m_Y.Format("%f ", m_C);
UpdateData(FALSE);
return; }
else {
x[0] = sqrt(-m_C / m_B);
m_X.Format("%f %f", x[0], -x[0]);
m_Y.Format("%f ", m_C);
UpdateData(FALSE);
return; }
else {
Diskr = m_B*m_B-4*m_A*m_C;
if(Diskr < 0) {
m_X= " Действительных корней нет!";
m_Y.Format("%f ", m_C);
UpdateData(FALSE);
return; }
else if((-m_B + sqrt(Diskr)) / (2 * m_A) < 0) {
m_X= " Действительных корней нет!";
m_Y.Format("%f ", m_C);
UpdateData(FALSE);
return; }
else {
x[0] = sqrt((-m_B + sqrt(Diskr)) / (2 * m_A));
if((-m_B - sqrt(Diskr)) / (2 * m_A) < 0) {
m_X.Format("%f %f", x[0], -x[0]);
m_Y.Format("%f ", m_C);
UpdateData(FALSE);
return;
}
else {
x[1] = sqrt((-m_B - sqrt(Diskr)) / (2 * m_A));
m_X.Format("%f %f %f %f", x[0], -x[0], x[1], -x[1]);
m_Y.Format("%f ", m_C);
UpdateData(FALSE);
return;
}
}
}
}
Функция OnSave() создает стандартный диалог сохранения файла, создает файл с именем, выбранным пользователем, и записывает в него результат.
void CLoserDlg::OnSave()
{
CString FileName;
CFileDialog MyFile(FALSE);
MyFile.DoModal();
FILE *f;
FileName = MyFile.GetPathName();
if(FileName != "") {
f = fopen(FileName, "w");
fprintf(f,"%s %s\n","OX:", m_X);
fprintf(f,"%s %s","OY:", m_Y);
fclose(f);
}
}
Функции OnP() и OnM() производят растяжение и сжатие графика.
void CLoserDlg::OnP()
{
m_M *= 10;
CLoserDlg::OnGraph();
}
void CLoserDlg::OnM()
{
if(m_M== 1) {MessageBox("Сжимать далее нельзя.");return;}
m_M /= 10;
CLoserDlg::OnGraph();
}