Не строится график функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Посмотрите, пожалуйста, что не так? Не строится график функции.
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "dos.h"
#include "string.h"
#include "locale.h"
 
#define DX 20
#define DY 20
 
HDC hDC;
HWND hWnd;
RECT Rect;
HPEN hPen, hOldPen;
HBRUSH hBrush, hOldBrush;
HFONT hFont, hOldFont;
LOGFONT Lf = { 0 };
float f1(float x, int a)
{
    return (x*cos(x));
}
float f2(float x, int a)
{
    return (exp(3*log(tan(x)))) - a*x;
}
 
void clearscreen(int r, int g, int b)
{
    hPen = CreatePen(PS_SOLID, 4, RGB(r, g, b));
    hOldPen = (HPEN)SelectObject(hDC, hPen);
    hBrush = CreateSolidBrush(RGB(r, g, b));
    hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
    Rectangle(hDC, Rect.left, Rect.top, Rect.right, Rect.bottom);
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
}
void mashtab(float xn, float xk, float *mx, float *my, float *miny, float *maxy, float(*func)(float, int), int a) 
{
    float x, y, dx;
    x = xn;
    dx = (xk - xn) / 100;
    *maxy = -1000;
    *miny = 1000;
    while (x <= xk)
    {
        y = func(x, a);
        if (y > *maxy) *miny = y;
        if (y < *miny) *miny = y;
        x = x + dx;
    }
    *my = (Rect.bottom - 2 * DY) / (*maxy - *miny);
    *mx = (Rect.right - 2 * DX) / (xk - xn);
}
void osi(float minx, float maxx, float miny, float maxy, float mx, float my, int *osx, int *osy) 
{
    if (minx*maxx < 0) *osy = fabs(minx)*mx + DX;
    else 
        if (minx >= 0) *osy = DX;
        else *osy = Rect.right - DX;
        if(miny*maxy < 0) *osx = Rect.bottom - fabs(miny)*my - DY;
        else
            if(miny >= 0) *osx = Rect.bottom - DY;
            else *osx = DY;
            hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
            hOldPen = (HPEN)SelectObject(hDC, hPen);
            MoveToEx(hDC, DX, *osx, NULL);
            LineTo(hDC, Rect.right - DX, *osx);
            MoveToEx(hDC, *osy, DY, NULL);
            LineTo(hDC, *osy, Rect.bottom - DY);
            SelectObject(hDC, hOldPen);
            DeleteObject(hPen);
    }
 
void setka(int osx, int osy, float minx, float maxx, float miny, float maxy, float mx, float my) 
{
    hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
    hOldPen = (HPEN)SelectObject(hDC, hPen);
    Lf.lfHeight = 12;
    Lf.lfWeight = 900;
    Lf.lfWidth = 8;
    CHAR S[20];
    strcpy((char*)Lf.lfFaceName, "Times New Roman");
    hFont = CreateFontIndirect(&Lf);
    hOldFont = (HFONT)SelectObject(hDC, hFont);
    SetTextColor(hDC, RGB(0, 0, 0));
    SetBkColor(hDC, RGB(255, 255, 255));
    TextOut(hDC, osy - 20, Rect.top + DY - 8, (LPCWSTR)"Y", 1);
    TextOut(hDC, Rect.right - DX + 2, osx - 20, (LPCWSTR)"X", 1);
    //построение сетки
    float dx, x, y;
    int xt, yt;
    RECT d;
    dx = (maxx - minx) / 20;
    for (x = minx; x <= maxx; x += dx)
    {
        xt = DX + mx*(x - minx);
        MoveToEx(hDC, xt, Rect.top + DY, NULL);
        LineTo(hDC, xt, Rect.bottom - DY);
        printf_s(S, "%.1f", x);
        TextOut(hDC, xt, osx + 8, (LPCWSTR)S, strlen(S));
    }
    float dy = (maxy - miny) / 20;
    for (y = miny; y<maxy + dy; y += dy) 
    {
        yt = Rect.bottom - my*(y - miny) - DY;
        MoveToEx(hDC, Rect.left + DX, yt, NULL);
        LineTo(hDC, Rect.right + DX, yt);
        printf_s(S, "%.1f", y);
        TextOut(hDC, osy + 5, yt, (LPCWSTR)S, strlen(S));
    }
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldFont);
    DeleteObject(hFont);
}
void grafik(float minx, float maxx, float miny, float mx, float my, float(*func)(float, int), int a) {
    float x, y, dx;
    int xt, yt;
    dx = (maxx - minx) / 200;
    //установка цвета и стиля линий для построения функции 
    hPen = CreatePen(PS_SOLID, 4, RGB(0, 255, 0));
    hOldPen = (HPEN)SelectObject(hDC, hPen);
    //расчет координат начальной точки функции  
    x = minx;
    y = func(x, a);
    xt = Rect.left + (x - minx)*mx + DX;
    yt = Rect.bottom - (y - miny)*my - DY;
    MoveToEx(hDC, xt, yt, NULL);
    //построение графика
    do {
        x = x + dx;
        y = func(x, a);
 
        xt = Rect.left + (x - minx)*mx + DX;
        yt = Rect.bottom - (y - miny)*my - DY;
        LineTo(hDC, xt, yt);
    } while (x<maxx - dx);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
}
 
int main(int argc, _TCHAR* argv[]) {
    float(*f)(float, int);
    float b, maxy, miny, mx, my;
    int osx, osy;
    int xn, xk, a = 0;
    setlocale(LC_ALL, "Russian");
 
    hWnd = GetConsoleWindow();
    if (!hWnd) {
        printf("Can't get hWnd\n");
        _getch();
        return -1;
    }
    MoveWindow(hWnd, 0, 0, 800, 600, TRUE);
    SetWindowText(hWnd, (LPCWSTR)"График");
 
    hDC = GetDC(hWnd);
    if (!hDC) {
        printf("Can't get hDC\n");
        _getch();
        return -2;
    }
    GetClientRect(hWnd, &Rect);
    clearscreen(255, 255, 255);
 
    //do {
 
    //_getch();
    ReleaseDC(hWnd, hDC);
    system("cls");
    clearscreen(0, 0, 0);
    printf("1 - x*cos(x)\n");
    printf("2 - exp(3*log(tan(x)))\n");
 
    switch (_getch()) {
        system("cls");
        //clearscreen(0, 0, 0);
    case '1':
        printf("x*cos(x)\n\n");
        printf("X\n");
        f = f1;
        scanf_s("%d %d", &xn, &xk);
        break;
    case '2':
        printf("exp(3*log(tan(x))) - a*x\n");
        printf("X\n");
        f = f2;
        scanf_s("%d %d", &xn, &xk);
        printf("a\n");
        scanf_s("%d", &a);
        break;
    default:
        return 0;
        break;
    }
    char ch;
    int scale = 1;
    do  {
        clearscreen(255, 255, 255);
        mashtab(xn, xk, &mx, &my, &miny, &maxy, f, a);
        osi(xn, xk, miny, maxy, mx, my, &osx, &osy);
        setka(osx, osy, xn, xk, miny, maxy, mx, my);
        grafik(xn, xk, miny, mx, my, f, a);
        ch = _getch();
        switch (ch) {
        case 61: //+
            if ((xk - xn) > 2.0) {
                xn += scale;
                xk -= scale;
            }
            break;
        case 45: //-
            xn -= scale;
            xk += scale;
            break;
        }
 
    } while (ch != 27);
 
    ReleaseDC(hWnd, hDC);
    //} while (true);
    _getch();
    return 0;
}

Решение задачи: «Не строится график функции»

textual
Листинг программы
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
//здесь код
 return msg.wParam;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы