0 / 0 / 0
Регистрация: 10.04.2021
Сообщений: 19
1

График функции. Точки разрыва

03.05.2021, 21:18. Показов 212. Ответов 0
Метки нет (Все метки)

Задание: нарисовать два графика функции, которые выбираются из меню. Я написала код, но как прописать точки разрыва у тангенса я не понимаю. функция : tanf(0.55*x+0.1)-a*pow(x,2)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#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 
#define _WIN32_WINNT 0x0A00
 
typedef float fun(float,float); // новый пользовательский тип, функция типа фловт которая зависит от двух элементов
const double Pi=31415926535;
HDC hDC;
HWND hWnd;
RECT Rect;
HPEN hPen, hOldPen;
HBRUSH hBrush, hOldBrush;
HFONT hFont,hOldFont;
LOGFONT Lf={0}; //для рисования
 
float f1(float x, float a)
{return tanf(0.55*x+0.1)-a*pow(x,2);}
 
float f2(float x,float a)
{return exp(-x)*cos(2*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(fun f,float a,float b,float *mx,float *my,float *miny,float *maxy,float r) 
{
    float x,y,dx;
    x=a; 
    dx=(b-a)/100;
    *maxy=-1000; 
    *miny=1000;
    while (x<=b)
    {
        y=f(x,r);
        if (y>*maxy) *maxy=y;
        if (y<*miny) *miny=y;
        x=x+dx;
    }
    *my=(Rect.bottom-2*DY)/(*maxy-*miny);
    *mx=(Rect.right-2*DX)/(b-a);
}
 
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;
    //определяет координату у для оси x
    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_DOT,1,RGB(255,0,255));
    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,(LPCSTR)"Y",1); //подписываем оси буквами
    TextOut(hDC,Rect.right-DX+2,osx-20,(LPCSTR)"X",1);
    //построение сетки
    float dx,x,y;
    int xt,yt;
    RECT d;
    dx=(maxx-minx)/10;
    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);
        sprintf(S,"%.1f",x); //переводим числовое значение х, преобразуем в строковое и сохраняем в S
        TextOut(hDC,xt,osx+8,(LPCSTR)S,strlen(S)); //подписываем числовое значение
    }
    float dy=(maxy-miny)/10;
    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);
        sprintf(S,"%.1f",y);
        TextOut(hDC,osy+5,yt,(LPCSTR)S,strlen(S));
    }
    SelectObject(hDC,hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC,hOldFont);
    DeleteObject(hFont);
}
 
void grafik(fun f,float minx, float maxx, float miny, float mx, float my,float a)
{
    float x,y,dx;
    int xt,yt;
    dx=(maxx-minx)/200;
    hPen=CreatePen(PS_SOLID,4,RGB(255,0,0));
    hOldPen=(HPEN)SelectObject(hDC,hPen);
    //расчет координат начальной точки функции
    x=minx;
    y=f(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=f(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 _tmain(int argc, _TCHAR* argv[])
{
    fun *ff; //указатель на функцию типа fun
    char p; 
    float a,b,maxy,miny,mx,my, r=0;
    int osx,osy, c=0;
    setlocale(LC_ALL,"Russian");
    
    hWnd=GetConsoleWindow();
    MoveWindow(hWnd,0,0,800,600,TRUE); //координаты верхнего угла, размеры окна
 
    SetWindowText(hWnd,(LPCSTR)"График функции"); // заголовок окна
    if(!hWnd)
    {   printf("Не могу получить hWnd консоли!\n");
        getch();
        return -1;
    }
    
    hDC=GetDC(hWnd);
    if(!hDC)
    {   printf("Не удается получить контекст устройства!\n");
        getch();
        return -2;
    }
    GetClientRect(hWnd,&Rect);
    
    do
    {clearscreen(0,0,0);
    //главное меню
    printf("1 - tan(0.55*x+0.1)-a*pow(x,2)\n");
    printf("2 - exp(-x)*cos(2*x)\n");
    printf("3 - Выход\n");
    scanf ("%d", &c); //вводим номер пункта нашего меню
    switch(c) //анализирует какой пункт меню мы выбрали
    {
    case 1: ff=f1; printf("Введите параметр функции\n"); scanf("%f",&r); break;
    case 2: ff=f2;break;
    case 3: exit(0); //завершение программы
    }
    printf("Введите диапазон по X\n");
    scanf("%f%f",&a,&b);
    if(c==1 && a==Pi/2 && b==Pi/2 ) //и здесь не так как-то 
    {
        printf("Область неопределенна\n");
    }
    else
        do
        {
            clearscreen(255,255,255); 
            mashtab(ff,a, b, &mx, &my,&miny,&maxy, r);
            osi(a, b, miny, maxy, mx, my, &osx, &osy);
            setka(osx,osy,a,b,miny,maxy,mx,my);
            grafik(ff,a,b,miny,mx,my, r);
            p=getch();
            switch (p)
            {
                //стрелка в лево
            case 75: if(c==1 && a<=2)  //здесь как-то не так
                                         printf("Область неопределенна\n"); 
                     else{ a=a-1; b=b-1;} 
                     break;
                //стрелка в право
            case 77: a=a+1; b=b+1;break;
                //уменьшение масштаба
            case '-': a=a-1; b=b+1; if(c==1 && a<=2) a=2; break;
                //увеличение масштаба
            case '+': if (b-a>3){a=a+1; b=b-1;}
            }
        } while(p!=27);
    }
    while (c!=3);
    ReleaseDC(hWnd, hDC);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2021, 21:18
Ответы с готовыми решениями:

Точки с координатами (x1, y1) и (x2, y2) являются концами отрезка. Определить, пересекает ли этот отрезок график функции
Точки с координатами (x1, y1) и (x2, y2) являются концами отрезка. Определить, пересекает ли этот...

Найти точки разрыва функции, если они существуют, скачок функции в каждой точке разрыва и построить график:
f(x) =\begin{cases}-{x}^{2}, x\leq 0, \\tgx,0&lt;x\leq \pi /4, \\2, x&gt;\pi /4.\end{cases}

Для данной функции найти точки разрыва, и если они существуют, указать тип разрыва. Построить график
Для данной функции найти точки разрыва, и если они существуют, указать тип разрыва. Построить...

Построить график функции, учитывая точки разрыва
Построить график функции, учитывая точки разрыва f(x)=(x-2)/(x+1)(x-3). Программа не работает:(...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2021, 21:18

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Найти точки разрыва и построить график функции c модулями.
найти точки разрыва и построить график функции y=\frac{|x|-1}{|x+2|} Добавлено через 2 часа 20...

Построить график явно заданной функции (указать асимптоты и точки разрыва)
Построить график явно заданной функции; на графике указать асимптоты и точки разрыва: у = cos...

для заданной функции найти точки разрыва и исследовать их характер и построить график
y=x+4, x&lt;0 y=x+1, 1&lt;=x&lt;=4 3+корень3, x&gt;4

Найти точки разрыва и скачок функции в каждой точке разрыва.
Найти точки разрыва и Найти скачок функции в каждой точке разрыва \begin{bmatrix}x+1, &amp; x&lt;0\\...

Определить точки разрыва и род разрыва функции
Определить точки разрыва и род разрыва функции у=е^(1/(х-4))

Найти точки разрыва функции, если они существуют, найти скачок функции в точке разрыва
Задача 2 Для кусочно-заданной функции y=f(x) 1)Найти точки разрыва функции, если они...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.