Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
70
Добавлен:
02.05.2014
Размер:
197.12 Кб
Скачать

Приложение а

Функция 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();

}