не выводится значение
Код:
#include <iostream>
#include <stdio.h>
#include <math.h>
static int N=1;//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
static int m;
static double var1;
static double var2;
static double var3;
static double var4;
static double var5;
static double func(double x)
{
return sin(N * pow(x, 3.0 / 4.0) +
4 * pow(x, 2)) + 2 * pow(x, 3.0 / 4.0) - 2;
}
static double antiderivative(double x, double h, double y0, double eps = 0.01)
{
int it = 0;
double y;
double y_previous=y0;
while (true)
{
y = y_previous - h * func(x-h);
double delta = abs(y - y_previous);
if (delta < eps) break;
else y_previous = y;
++it;
}
return 0;
}
static double derivative(double x, double h=0.1)
//для точности 1% нужен шаг h=0.1, тогда т.к. точность метода o(h^2), точность будет 1% (0.01)
{
double y = (func(x + h) - func(x-h)) / (2.0*h);
return y;
}
static double dichotomy(double a,double b,double eps=0.0001)
{
double c;
while (abs(a - b) > eps)
{
c = (a + b) / 2.0;
if (func(c) >= 0) b = c;
else a = c;
}
double r = (a + b) / 2.0;
return r;
}
static int extrem(double a, double b, double h/*шаг табулирования*/)
{
int count = 0;
for (double x = a+h; abs(x + h - b) > DBL_EPSILON; x += h)
{
double x_prev = x - h;
double x_next = x + h;
if (func(x_prev) <= func(x) && func(x) <= func(x_next) || func(x_prev) >= func(x) && func(x) >= func(x_next)) continue;//функция не изменяет свой характер ПОВЕДЕНИЕ
//(т.е. она либо монотонно возрастает, либо убывает)
else ++count; //ЭКСТРЕМУМ
}
return count;
}
int main() {
printf("Insert 1-4\n");
scanf_s("%d", &m);
if (m==1) {
printf("1. Insert x,h\n");
scanf_s("%lf%lf\n", &var1,&var2);
printf("%4.2f\n", func(var1));
printf("%4.2f\n", derivative(var1, var2));
printf("%4.2f\n", antiderivative(var1, var2, 0));
} else if (m==2){
printf("2. Insert a,b\n");
scanf_s("%lf%lf\n", &var1,&var2);
printf("%f\n", dichotomy(var1, var2));
} else if (m==3) {
printf("3. Insert a,b,h\n");
scanf_s("%lf%f%lf\n", &var1,&var2,&var3);
int printf(extrem(var1, var2, var3));
}else if (m==4) {
printf("4. Insert a,b,h\n");
scanf_s("%lf%f%lf\n", &var1,&var2,&var3);
int printf(extrem(var1, var2, var3));
};
system("pause");
}
#include <stdio.h>
#include <math.h>
static int N=1;//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
static int m;
static double var1;
static double var2;
static double var3;
static double var4;
static double var5;
static double func(double x)
{
return sin(N * pow(x, 3.0 / 4.0) +
4 * pow(x, 2)) + 2 * pow(x, 3.0 / 4.0) - 2;
}
static double antiderivative(double x, double h, double y0, double eps = 0.01)
{
int it = 0;
double y;
double y_previous=y0;
while (true)
{
y = y_previous - h * func(x-h);
double delta = abs(y - y_previous);
if (delta < eps) break;
else y_previous = y;
++it;
}
return 0;
}
static double derivative(double x, double h=0.1)
//для точности 1% нужен шаг h=0.1, тогда т.к. точность метода o(h^2), точность будет 1% (0.01)
{
double y = (func(x + h) - func(x-h)) / (2.0*h);
return y;
}
static double dichotomy(double a,double b,double eps=0.0001)
{
double c;
while (abs(a - b) > eps)
{
c = (a + b) / 2.0;
if (func(c) >= 0) b = c;
else a = c;
}
double r = (a + b) / 2.0;
return r;
}
static int extrem(double a, double b, double h/*шаг табулирования*/)
{
int count = 0;
for (double x = a+h; abs(x + h - b) > DBL_EPSILON; x += h)
{
double x_prev = x - h;
double x_next = x + h;
if (func(x_prev) <= func(x) && func(x) <= func(x_next) || func(x_prev) >= func(x) && func(x) >= func(x_next)) continue;//функция не изменяет свой характер ПОВЕДЕНИЕ
//(т.е. она либо монотонно возрастает, либо убывает)
else ++count; //ЭКСТРЕМУМ
}
return count;
}
int main() {
printf("Insert 1-4\n");
scanf_s("%d", &m);
if (m==1) {
printf("1. Insert x,h\n");
scanf_s("%lf%lf\n", &var1,&var2);
printf("%4.2f\n", func(var1));
printf("%4.2f\n", derivative(var1, var2));
printf("%4.2f\n", antiderivative(var1, var2, 0));
} else if (m==2){
printf("2. Insert a,b\n");
scanf_s("%lf%lf\n", &var1,&var2);
printf("%f\n", dichotomy(var1, var2));
} else if (m==3) {
printf("3. Insert a,b,h\n");
scanf_s("%lf%f%lf\n", &var1,&var2,&var3);
int printf(extrem(var1, var2, var3));
}else if (m==4) {
printf("4. Insert a,b,h\n");
scanf_s("%lf%f%lf\n", &var1,&var2,&var3);
int printf(extrem(var1, var2, var3));
};
system("pause");
}
Ну и в scanf_s вместо "%lf%f%lf все-таки "%lf%lf%lf
Зачем вообще пункт 4, если 3 такой-же?
Условие надо с учетом приоритетов операций писать:
Код:
if (
((func(x_prev) <= func(x)) && (func(x) <= func(x_next)))
||
((func(x_prev) >= func(x)) && (func(x) >= func(x_next)))
) continue;
((func(x_prev) <= func(x)) && (func(x) <= func(x_next)))
||
((func(x_prev) >= func(x)) && (func(x) >= func(x_next)))
) continue;
Код:
else if (m==3) {
printf("3. Insert a,b,h\n");
scanf("%lf%lf%lf", &var1,&var2,&var3);
printf("%d\n",extrem(var1, var2, var3));
printf("3. Insert a,b,h\n");
scanf("%lf%lf%lf", &var1,&var2,&var3);
printf("%d\n",extrem(var1, var2, var3));
Цитата: sadovoya
Для начала, printf("%d\n",extrem(var1, var2, var3)), а не int printf(extrem(var1, var2, var3));
Ну и в scanf_s вместо "%lf%f%lf все-таки "%lf%lf%lf
Зачем вообще пункт 4, если 3 такой-же?
Условие надо с учетом приоритетов операций писать:
Можно и через обычный scanf:
Всего не смотрел, может есть еще ошибки.
Ну и в scanf_s вместо "%lf%f%lf все-таки "%lf%lf%lf
Зачем вообще пункт 4, если 3 такой-же?
Условие надо с учетом приоритетов операций писать:
Код:
if (
((func(x_prev) <= func(x)) && (func(x) <= func(x_next)))
||
((func(x_prev) >= func(x)) && (func(x) >= func(x_next)))
) continue;
((func(x_prev) <= func(x)) && (func(x) <= func(x_next)))
||
((func(x_prev) >= func(x)) && (func(x) >= func(x_next)))
) continue;
Код:
else if (m==3) {
printf("3. Insert a,b,h\n");
scanf("%lf%lf%lf", &var1,&var2,&var3);
printf("%d\n",extrem(var1, var2, var3));
printf("3. Insert a,b,h\n");
scanf("%lf%lf%lf", &var1,&var2,&var3);
printf("%d\n",extrem(var1, var2, var3));
Исправил, но все равно при запуске выводится консоль, выбираем 4 пункт, предлагает вбить a b h, что мы и делаем, жмем энтер. и на этом всё. значение экстремума не выводится, ничего не происходит
Код:
abs(x + h - b) > DBL_EPSILON