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

Программа неверно строит график функции

18.01.2015, 18:42. Показов 960. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Необходимо написать программу которая строит графики трёх функций. Если с первыми двумя всё более менее хорошо то с 3-й у меня возник затык. Программа правильно считает минимальное и максимальное значение функции но сам график строит неправильно. Если для примера ввести диапазон значений Х от 1 до 10 то получается такой результат:
https://www.cyberforum.ru/atta... 1421595067
А должен быть примерно такой (взято из Mathcad):
https://www.cyberforum.ru/atta... 1421595067
Никак не пойму в чём проблема. По идее что-то идёт не так в 192 строке, но вот что? Ведь другие функции строятся по тому же принципу и всё ок.
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
223
224
225
226
227
228
229
230
#define _WIN32_WINNT 0x0501
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <windows.h>
#include <conio.h>
 
using namespace std;
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2){
    //HDC hDc = GetDC(hWnd);
    MoveToEx(hdc, x1, y1, NULL);
    return LineTo(hdc, x2, y2);
}
BOOL Setka(HDC hDc, float ymax, float ymin, float a, float b){
    int i;
    Line(hDc, 350, 0, 350, 250);
    Line(hDc, 350, 250, 600, 250);
    Line(hDc, 350, 0, 355, 5);
    Line(hDc, 350, 0, 345, 5);
    Line(hDc, 600, 250, 595, 255);
    Line(hDc, 600, 250, 595, 245);
    for (i=0; i<=10; i++){
        Line(hDc, 350, 250-i*24, 345, 250-i*24);
        Line(hDc, 350+i*24, 250, 350+i*24, 255);
    }
    printf("\t\t\t\t%f\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t%f\n\n\t\t\t\t\t%f\t\t\t%f", ymax, ymin, a, b);
    return 0;
}
float diapazon(float &a, float &b, float &step){
    /*float a, b, step;*/
    printf("Введите диапазон, на котором необходимо рассчитать значения функции и шаг.\n");
    printf("a=");
    scanf("%f", &a);
    printf("\nb=");;
    scanf("%f", &b);
    printf("\nшаг=");
    scanf("%f", &step);
    return a, b, step;
}
float func1(float x){
    return 2/tan(3*x)-(1/(12*pow(x,2)+7*x-5));
}
float func2(float x){
    return abs(pow(x,2)-pow(x,3))-7/(pow(x,3)-15*x);
}
float func3(float x){
    return -x*log10f(x)*(cos(3*x)-x/3);
}
void f1(){
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    float a, b, step, x, x1, ymin, ymax, zero, lx1, lx2;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("y(x)=2ctg(3x)-1/(12x^2+7x-5)\n");
    printf("x     y\n");
    for (x=a; x<b; x+=step){
        printf("%f   %f\n", x, func1(x));
    }
    printf("%f   %f\n", b, func1(b));
    for(x=a; x<=b; x+=(b-a)/240){
        if(func1(x)<10 && func1(x)>-10){
            ymin=func1(x);
            ymax=func1(x);
            x=b+1;
        }
    }
    for(x=a; x<=b; x+=(b-a)/240){
        if(ymax<func1(x) && func1(x)<10)
            ymax=func1(x);
        if(ymin>func1(x) && func1(x)>-10)
            ymin=func1(x);
    }
    printf("%f\t%f", ymin, ymax);
    getch();
    system("cls");
    zero=(ymax-ymin)/240;
    if (ymax>=0)
        zero=10+ymax/zero;
    else
        zero=10-ymax/zero;
    for (i=0; i<=240; i++){
        x=a+(b-a)/240*i;
        x1=x+(b-a)/240;
        lx1=zero-func1(x)*abs(func1(x)/(ymax-ymin));
        lx2=zero-func1(x1)*abs(func1(x1)/(ymax-ymin));
        if (func1(x)*func1(x1)>=0){
            if (lx1<250 && lx2<250)
        Line(hDc, 350+i, zero-func1(x)*abs(func1(x))/(ymax-ymin), 351+i, zero-func1(x1)*abs(func1(x1)/(ymax-ymin)));
            else
                if (lx1>0 && lx2>250 && lx1<250)
                    Line(hDc, 350+i, zero-func1(x)*abs(func1(x))/(ymax-ymin), 351+i, 250);
    }
    }
    Setka(hDc, ymax, ymin, a, b);
    getch();
}
void f2(){
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    float a, b, step, x, x1, ymin, ymax, zero, lx1, lx2;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("y(x)=|x^2-x^3|-7/(x^3-15x)\n");
    printf("x     y\n");
    for (x=a; x<b; x+=step){
        printf("%f   %f\n", x, func2(x));
    }
    printf("%f   %f\n", b, func2(b));
    for(x=a; x<=b; x+=(b-a)/240){
        if((pow(x,3)-15*x)>0.01){
            ymin=func2(x);
            ymax=func2(x);
            x=b+1;
            }
    }
    printf("%f   %f\n", ymin, ymax);
    for(x=a; x<=b; x+=(b-a)/240){
        if(abs((pow(x,3)-15*x))>0.01 && ymax<func2(x))
            ymax=func2(x);
        if(abs((pow(x,3)-15*x))>0.01 && ymin>func2(x))
            ymin=func2(x);
    }
    printf("%f\t%f", ymin, ymax);
    zero=(ymax-ymin)/240;
    if (ymax>=0)
        zero=10+ymax/zero;
    else
        zero=10-ymax/zero;
    getch();
    system("cls");
    for (i=0; i<=240; i++){
        x=a+(b-a)/240*i;
        x1=x+(b-a)/240;
        lx1=zero-func1(x)*abs(func1(x)/(ymax-ymin));
        lx2=zero-func1(x1)*abs(func1(x1)/(ymax-ymin));
                if ((x<-sqrt(15) && x1<-sqrt(15)) || (x>-sqrt(15) && x1>-sqrt(15) && x<0 && x1<0) || (x<sqrt(15) && x1<sqrt(15) && x>0 && x1>0) || (x>sqrt(15) && x1>sqrt(15)))
        Line(hDc, 350+i, zero-func2(x)*abs(func2(x)/(ymax-ymin)), 351+i, zero-func2(x1)*abs(func2(x1)/(ymax-ymin)));
                else{
                    if ((x<-sqrt(15) && x1>-sqrt(15)) || (x<sqrt(15) && x1>sqrt(15))){
                        Line(hDc, 350+i, zero-func2(x)*abs(func2(x)/(ymax-ymin)), 350+i, 0);
                        Line(hDc, 350+i, zero-func2(x1)*abs(func2(x1)/(ymax-ymin)), 350+i, 250);
                    }
                    if (x<0 && x1>0){
                        Line(hDc, 350+i, zero-func2(x1)*abs(func2(x1)/(ymax-ymin)), 350+i, 250);
                        Line(hDc, 350+i, zero-func2(x)*abs(func2(x)/(ymax-ymin)), 350+i, 0);
                    }
                }
    }
    Setka(hDc, ymax, ymin, a, b);
    getch();
}
void f3(){
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    float a, b, step, x, x1, ymin=0, ymax=0, zero;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("y(x)=-xln(x)(cos(3*x)-x/3)\n");
    printf("x     y\n");
    for (x=a; x<b; x+=step){
        printf("%f   %f\n", x, func3(x));
    }
    printf("%f   %f\n", b, func3(b));
    for(x=a; x<=b; x+=(b-a)/240){
        if(ymax<func3(x))
            ymax=func3(x);
        if(ymin>func3(x))
            ymin=func3(x);
    }
    printf("%f\t%f", ymin, ymax);
    zero=10+(240*ymax/(ymax-ymin));
    getch();
    system("cls");
    for (i=0; i<240; i++){
        x=a+(b-a)/240*i;
        x1=x+(b-a)/240;
        Line(hDc, 350+i, zero-func3(x)*abs(func3(x)/(ymax-ymin)), 351+i, zero-func3(x1)*abs(func3(x1)/(ymax-ymin))); \\Вот здесь что-то идёт не так
    }
    Setka(hDc, ymax, ymin, a, b);
    getch();
}
int main (){
    system ("color f0");
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    int vblbor=0;
    setlocale(LC_CTYPE, "rus");
        while(vblbor!=4){
            printf("Выберите функцию:\n");
            printf("1 - y(x)=2ctg(3x)-1/(12x^2+7x-5)\n\n");
            printf("2 - y(x)=|x^2-x^3|-7/(x^3-15x)\n\n");
            printf("3 - y(x)=-xln(x)(cos(x)-x/3)\n\n");
            printf("4 - Выход\n\n");
            scanf("%d", &vblbor);
            switch(vblbor){
                case 1:
                    f1();
                    break;
                case 2:
                    f2();
                    break;
                case 3:
                    f3();
                    break;
                }
            COORD WCoord={0,0};
            DWORD nKol=0;
            size_t xy=80*25;
            BOOL fSuccess=FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0, xy, WCoord, &nKol);
            system("cls");
        }
}
Миниатюры
Программа неверно строит график функции   Программа неверно строит график функции  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2015, 18:42
Ответы с готовыми решениями:

Написать приложение, которое строит график математической функции y=f(x)
Добрый день, коллеги! Столкнулся с задачей, в которой испытываю затруднения. Ранее не сталкивался...

Написать программу, которая строит график параметрической функции
Всем привет. Не могу понять задачу. Используя операторы цикла написать программу, которая...

Скласты программу, которая строит на екране график функции двигающей стрелкой с рисунка.
Кривая графика появляется с кончика стрелки; скорость движения 1...2,5 см/сек; стрелка -...

Написать код который строит график по функции, которую нужно ввести самому.
Всем доброго времени суток, помогите пожалуйста. Совсем не понимаю с чего начать. Задание таково:...

3
0 / 0 / 1
Регистрация: 15.01.2015
Сообщений: 16
19.01.2015, 19:31  [ТС] 2
Попробовал построить график при помощи SetPixel, та же проблема. Причём проблема возникает стабильно в 3-й функции, даже если попытаться её заменить другим выражением.
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
#define _WIN32_WINNT 0x0501
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <windows.h>
#include <conio.h>
 
using namespace std;
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2){
    MoveToEx(hdc, x1, y1, NULL);
    return LineTo(hdc, x2, y2);
}
BOOL Setka(HDC hDc, float ymax, float ymin, float a, float b){
    int i;
    Line(hDc, 350, 0, 350, 250);
    Line(hDc, 350, 250, 600, 250);
    Line(hDc, 350, 0, 355, 5);
    Line(hDc, 350, 0, 345, 5);
    Line(hDc, 600, 250, 595, 255);
    Line(hDc, 600, 250, 595, 245);
    for (i=0; i<=10; i++){
        Line(hDc, 350, 250-i*24, 345, 250-i*24);
        Line(hDc, 350+i*24, 250, 350+i*24, 255);
    }
    printf("\t\t\t\t%f\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t%f\n\n\t\t\t\t\t%f\t\t\t%f", ymax, ymin, a, b);
    return 0;
}
float diapazon(float &a, float &b, float &step){ //Ввод отрезка на котором необходимо рассчитать значения функции и шага
    /*float a, b, step;*/
    printf("Введите диапазон, на котором необходимо рассчитать значения функции и шаг.\n");
    printf("a=");
    scanf("%f", &a);
    printf("\nb=");;
    scanf("%f", &b);
    printf("\nшаг=");
    scanf("%f", &step);
    return 0;
}
float func1(float x){
    return 2/tan(3*x)-(1/(12*pow(x,2)+7*x-5));
}
float func2(float x){
    return abs(pow(x,2)-pow(x,3))-7/(pow(x,3)-15*x);
}
double func3(float x){
    return -x*log10f(x)*(cos(3*x)-x/3);
}
void f1(){
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    float a, b, step, x, ymin, ymax, zero;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("y(x)=2ctg(3x)-1/(12x^2+7x-5)\n");
    printf("x     y\n");
    for (x=a; x<b; x+=step){
        printf("%f   %f\n", x, func1(x));
    }
    printf("%f   %f\n", b, func1(b));
    for(x=a; x<=b; x+=(b-a)/240){
        if(func1(x)<10 && func1(x)>-10){
            ymin=func1(x);
            ymax=func1(x);
            x=b+1;
        }
    }
    for(x=a; x<=b; x+=(b-a)/240){
        if(ymax<func1(x) && func1(x)<10)
            ymax=func1(x);
        if(ymin>func1(x) && func1(x)>-10)
            ymin=func1(x);
    }
    printf("%f\t%f", ymin, ymax);
    getch();
    system("cls");
    zero=(ymax-ymin)/240;
    if (ymax>=0)
        zero=10+ymax/zero;
    else
        zero=10-ymax/zero;
    for (i=0; i<=240; i++){
        x=a+(b-a)/240*i;
        SetPixel(hDc, 350+i, zero-func1(x)*abs(func1(x)/(ymax-ymin)), 1);
    }
    Setka(hDc, ymax, ymin, a, b);
    getch();
}
void f2(){
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    float a, b, step, x, ymin, ymax, zero;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("y(x)=|x^2-x^3|-7/(x^3-15x)\n");
    printf("x     y\n");
    for (x=a; x<b; x+=step){
        printf("%f   %f\n", x, func2(x));
    }
    printf("%f   %f\n", b, func2(b));
    for(x=a; x<=b; x+=(b-a)/240){
        if((pow(x,3)-15*x)>0.01){
            ymin=func2(x);
            ymax=func2(x);
            x=b+1;
            }
    }
    printf("%f   %f\n", ymin, ymax);
    for(x=a; x<=b; x+=(b-a)/240){
        if(abs((pow(x,3)-15*x))>0.01 && ymax<func2(x))
            ymax=func2(x);
        if(abs((pow(x,3)-15*x))>0.01 && ymin>func2(x))
            ymin=func2(x);
    }
    printf("%f\t%f", ymin, ymax);
    zero=(ymax-ymin)/240;
    if (ymax>=0)
        zero=10+ymax/zero;
    else
        zero=10-ymax/zero;
    getch();
    system("cls");
    for (i=0; i<=240; i++){
        x=a+(b-a)/240*i;
        SetPixel(hDc, 350+i, zero-func2(x)*abs(func2(x)/(ymax-ymin)), 1);
    }
    Setka(hDc, ymax, ymin, a, b);
    getch();
}
void f3(){
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    float a, b, step, x, ymin=0, ymax=0, zero;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("y(x)=-xln(x)(cos(3*x)-x/3)\n");
    printf("x     y\n");
    for (x=a; x<b; x+=step){
        printf("%f   %f\n", x, func3(x));
    }
    printf("%f   %f\n", b, func3(b));
    for(x=a; x<=b; x+=(b-a)/240){
        if(ymax<func3(x))
            ymax=func3(x);
        if(ymin>func3(x))
            ymin=func3(x);
    }
    printf("%f\t%f", ymin, ymax);
    getch();
    system("cls");
    for (i=0; i<240; i++){
        x=a+(b-a)/240*i;
        SetPixel(hDc, 350+i, zero-func3(x)*abs(func3(x)/(ymax-ymin)), 1);
    }
    Setka(hDc, ymax, ymin, a, b);
    getch();
}
int main (){
    system ("color f0");
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    int vblbor=0;
    setlocale(LC_CTYPE, "rus");
        while(vblbor!=4){
            printf("Выберите функцию:\n");
            printf("1 - y(x)=2ctg(3x)-1/(12x^2+7x-5)\n\n");
            printf("2 - y(x)=|x^2-x^3|-7/(x^3-15x)\n\n");
            printf("3 - y(x)=-xln(x)(cos(x)-x/3)\n\n");
            printf("4 - Выход\n\n");
            scanf("%d", &vblbor);
            switch(vblbor){
                case 1:
                    f1();
                    break;
                case 2:
                    f2();
                    break;
                case 3:
                    f3();
                    break;
                }
            COORD WCoord={0,0};
            DWORD nKol=0;
            size_t xy=80*25;
            BOOL fSuccess=FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0, xy, WCoord, &nKol);
            system("cls");
        }
}
0
Модератор
Эксперт С++
13496 / 10751 / 6406
Регистрация: 18.12.2011
Сообщений: 28,688
19.01.2015, 21:25 3
Привел Вашу программу к более-менее приемлемому виду.
Недоделана только функция Setka.
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
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include <windows.h>
#include <conio.h>
#pragma warning(disable:4996) 
 
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2){
    MoveToEx(hdc, x1, y1, NULL);
    return LineTo(hdc, x2, y2);
}
 
BOOL Setka(HWND hwnd, double ymax, double ymin, double a, double b)
{
    HDC hDc=GetDC(hwnd);
    RECT rc;
    GetClientRect(hwnd,&rc); // размер рабочей области окна (ширина rc.right, высота rc.bottom)
    COLORREF color = RGB(0,0,255); // синее перо
    HPEN pen = CreatePen(PS_SOLID,1,color);
    HPEN hpenOld=(HPEN)SelectObject(hDc,pen);
    Line(hDc, 0, rc.bottom/2, rc.right,rc.bottom/2);
    Line(hDc, rc.right/2, 0, rc.right/2,rc.bottom);
    /*
    for (int i=0; i<=10; i++)
    {
    Line(hDc, 350, 250-i*24, 345, 250-i*24);
    Line(hDc, 350+i*24, 250, 350+i*24, 255);
    }
    printf("\t\t\t\t%f\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t%f\n\n\t\t\t\t\t%f\t\t\t%f", ymax, ymin, a, b);
    */
    ReleaseDC(hwnd,hDc); // освободили контекс устройства
    SelectObject(hDc,hpenOld); // Вернули старое перо
    DeleteObject(pen); // удалили созданное
    return 0;
}
double diapazon(double &a, double &b, double &step)
{ //Ввод отрезка на котором необходимо рассчитать значения функции и шага
    printf("Введите диапазон, на котором необходимо рассчитать значения функции и шаг.\n");
    printf("a=");
    scanf("%lf", &a);
    printf("\nb=");;
    scanf("%lf", &b);
    printf("\nшаг=");
    scanf("%lf", &step);
    return 0;
}
double func1(double x)
{
    return 2./tan(3.*x)-1.0/(12.*x*x+7.0*x-5.0);
}
double func2(double x)
{
    return fabs(x*x*(1.0-x))-7.0/(x*(x*x-15.0));
}
double func3(double x)
{
    return -x*log(x)*(cos(x)-x/3.0);
}
void f(double (*fun)(double))
{
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    HPEN hpenOld=(HPEN)SelectObject(hDc,pen);
    SelectObject(hDc,pen);
    double a, b, step, x, ymin, ymax;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("x     y\n");
    for (x=a; x<b; x+=step){
        printf("%lf\t%lf\n", x, fun(x));
    }
    printf("%lf\t%lf\n", b, fun(b));
    ymin=fun(a);
    ymax=fun(a);
    for(x=a; x<=b; x+=step) //(b-a)/240.0
    {
        if(ymax<fun(x))
            ymax=fun(x);
        if(ymin>fun(x))
            ymin=fun(x);
    }
    printf("max=%lf\tmin=%lf", ymin, ymax);
    getch();
    system("cls");
    RECT rc;GetClientRect(hWnd,&rc);
    Rectangle(hDc,0,0,rc.right,rc.bottom); // Для стирания старого графика
    double y1=(fun(x)-ymin)/(ymax-ymin)*rc.bottom;
    for (i=0; i<=rc.right; i++)
    {
        x=a+(b-a)/rc.right*i;
        double y=(fun(x)-ymin)/(ymax-ymin)*rc.bottom;
        Line(hDc, i, int(y1), i+1,int(y));
        y1=y;
    }
    Setka(hWnd, ymax, ymin, a, b);
    ReleaseDC(hWnd,hDc);
    SelectObject(hDc,hpenOld); // Вернули старое перо
    DeleteObject(pen); // удалили созданное
    getch();
}
int main ()
{
    system ("color f0");
    HWND hWnd = GetConsoleWindow();
    int vblbor=0;
    setlocale(LC_CTYPE, "rus");
    while(vblbor!=4)
    {
        printf("Выберите функцию:\n");
        printf("1 - y(x)=2ctg(3x)-1/(12x^2+7x-5)\n\n");
        printf("2 - y(x)=|x^2-x^3|-7/(x^3-15x)\n\n");
        printf("3 - y(x)=-xln(x)(cos(x)-x/3)\n\n");
        printf("4 - Выход\n\n");
        scanf("%d", &vblbor);
        switch(vblbor)
        {
        case 1:
            f(func1);
            break;
        case 2:
            f(func2);
            break;
        case 3:
            f(func3);
            break;
        }
        system("cls");
    }
}
2
0 / 0 / 1
Регистрация: 15.01.2015
Сообщений: 16
22.01.2015, 17:08  [ТС] 4
Спасибо, всё работает. Вот код с небольшими дополнениями
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
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include <windows.h>
#include <conio.h>
#pragma warning(disable:4996)
 
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2){
    MoveToEx(hdc, x1, y1, NULL);
    return LineTo(hdc, x2, y2);
}
 
BOOL Setka(HWND hwnd, double ymax, double ymin, double a, double b)
{
    HDC hDc=GetDC(hwnd);
    RECT rc;
    GetClientRect(hwnd,&rc); // размер рабочей области окна (ширина rc.right, высота rc.bottom)
    COLORREF color = RGB(0,0,255); // синее перо
    HPEN pen = CreatePen(PS_SOLID,1,color);
    HPEN hpenOld=(HPEN)SelectObject(hDc,pen);
    Line(hDc, 0, rc.bottom/2, rc.right,rc.bottom/2);
    Line(hDc, rc.right/2, 0, rc.right/2,rc.bottom);
    ReleaseDC(hwnd,hDc); // освободили контекс устройства
    SelectObject(hDc,hpenOld); // Вернули старое перо
    DeleteObject(pen); // удалили созданное
    return 0;
}
double diapazon(double &a, double &b, double &step)
{ //Ввод отрезка на котором необходимо рассчитать значения функции и шага
    printf("Введите диапазон, на котором необходимо рассчитать значения функции и шаг.\n");
    printf("a=");
    scanf("%lf", &a);
    printf("\nb=");;
    scanf("%lf", &b);
    printf("\nшаг=");
    scanf("%lf", &step);
    return 0;
}
double func1(double x)
{
    return 2./tan(3.*x)-1.0/(12.*x*x+7.0*x-5.0);
}
double func2(double x)
{
    return fabs(x*x*(1.0-x))-7.0/(x*(x*x-15.0));
}
double func3(double x)
{
    return -x*log(x)*(cos(3.0*x)-x/3.0);
}
void f(double (*fun)(double))
{
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    HPEN hpenOld=(HPEN)SelectObject(hDc,pen);
    SelectObject(hDc,pen);
    double a, b, step, x, ymin, ymax, step1;
    int i;
    diapazon(a, b, step);
    system("cls");
    printf("x     y\n");
    for (x=a; x<=b; x+=step){
        printf("%lf\t%lf\n", x, fun(x));
    }
      for (x=a; x<=b; x+=step){
          if (fun(x)<1000.0){ //страховка на тот случай если fun(a) равно бесконечности 
    ymin=fun(x);
    ymax=fun(x);
          }
      }
    for(x=a; x<=b; x+=step/10.0){ //деление шага позволяет точнее определить ymax и ymin
        if(ymax<fun(x) && abs(fun(x))<10000000.0) //второе условие необходимо, чтобы ymax и ymin не были равны бесконечности
            ymax=fun(x);
        if(ymin>fun(x) && abs(fun(x))<10000000.0)
            ymin=fun(x);
    }
    printf("max=%lf\tmin=%lf", ymin, ymax);
    getch();
    system("cls");
    RECT rc;GetClientRect(hWnd,&rc);
    Rectangle(hDc,0,0,rc.right,rc.bottom); // Для стирания старого графика
    double y1=(fun(x)-ymin)/(ymax-ymin)*rc.bottom;
    step1=(b-a)/rc.right;
        printf("\t\t\t\t\tymax=%.2lf\n\n\n\n\n\n\n\n\n\n\n\n\na=%.2lf\t\t\t\t\t\t\t\tb=%.2lf\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\tymin=%.2lf", ymax, a, b, ymin); //вывод значений ymax, ymin, a, b на графике
    for (i=0; i<=rc.right; i++){
        x=a+step1*i;
        double y=rc.bottom-(fun(x)-ymin)/(ymax-ymin)*rc.bottom;
        if ((fun(x-step1)<fun(x-step1/2) && fun(x-step1/2)<fun(x)) || (fun(x-step1)>fun(x-step1/2) && fun(x-step1/2)>fun(x))){ //проверка монотонности убывания или возрастания функции чтобы график не строился в точках разрыва
        Line(hDc, i, int(y1), i+1,int(y));
        }
        y1=y;
    }
    Setka(hWnd, ymax, ymin, a, b);
    ReleaseDC(hWnd,hDc);
    SelectObject(hDc,hpenOld); // Вернули старое перо
    DeleteObject(pen); // удалили созданное
    getch();
}
int main ()
{
    system ("color f0");
    HWND hWnd = GetConsoleWindow();
    int vblbor=0;
    setlocale(LC_CTYPE, "rus");
    while(vblbor!=4)
    {
        printf("Выберите функцию:\n");
        printf("1 - y(x)=2ctg(3x)-1/(12x^2+7x-5)\n\n");
        printf("2 - y(x)=|x^2-x^3|-7/(x^3-15x)\n\n");
        printf("3 - y(x)=-xln(x)(cos(x)-x/3)\n\n");
        printf("4 - Выход\n\n");
        scanf("%d", &vblbor);
        switch(vblbor)
        {
        case 1:
            f(func1);
            break;
        case 2:
            f(func2);
            break;
        case 3:
            f(func3);
            break;
        }
        system("cls");
    }
}
0
22.01.2015, 17:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2015, 17:08
Помогаю со студенческими работами здесь

Написать программу, в которую вбиваешь любую функцую, а она строит ее график
Вообщем, надо написать программу, в которую вбиваешь любую функцую, а она строит ее график.я не...

Программа определяющая, пройдет ли график функции y = 5x2 – 7 x + 2
Ааа, народ выручайте пожалуйста. Сейчас экзамен в академии, а я не очень шарю в этом. Задание:...

Программа, которая строит квадратную матрицу и переставляет её блоки по условию
Составить программу, которая строит квадратную матрицу случайных целых чисел (размером 2n ×...

Программа написана, но работает неверно
Программа написана, но работает неверно. Ввести символьную строку и заменить все буквы &quot;а&quot; на буквы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru