Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
carlwalther
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 15
1

Найти корень уравнения методом половинного деления

21.04.2016, 21:22. Просмотров 1171. Ответов 9
Метки нет (Все метки)

В программе методом половинного деления необходимо найти корень уравнения. Загвоздка в том что при вводе буквы программа автоматически приравнивает все переменные друг к другу и в итоге перебрасывает действие к последнему Else. Так же сделал защиту от дурака на примере одной переменной j, но к сожалению если ввести например 1к защита уже не работает.
Пожалуйста подскажите что исправить)

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
#include <stdlib.h>
 
double func(double x,double a, double b, double c, double d)
{
        return   ((a*x+b)+1/(c*x+d));
}
 
int main() {
double func(double x,double a, double b, double c, double d);
 
    int n=0;
        double a;    //  переменная
        double b;    //  переменная
        double c;    //  переменная
        double d;    //  переменная
        double j;    //  координата отрезка поиска корня
        double g;    //  координата отрезка поиска корня
        double u;    //  вспомогательная переменная
        double eps;  //  абсолютная погрешность
 
 
        printf("j=");
        if (scanf ("%d", &j) != 1) {
            printf("Error.\n");
 
        }
 
        printf("g=");
        scanf("%lf", &g);
        printf("eps=");
        scanf("%lf", &eps);
        printf("a=");
        scanf("%lf", &a);
        printf("b=");
        scanf("%lf", &b);
        printf("c=");
        scanf("%lf", &c);
        printf("d=");
        scanf("%lf", &d);
 
 
if (func(j,a,b,c,d)*func(g,a,b,c,d)<=0)
{
 
        do
{
        u=(j+g)/2;
        if (func(u,a,b,c,d)*func(j,a,b,c,d)<=0)
            g=u;
        else j=u;
 
                n+=1;
        printf("n=%d\n", n);
        printf("u=%lf\n", u);
        }
        while (fabs(j-g)>=eps);}
 
else {
        printf( "\n Neverno zadany nachalnye usloviya" );  // если ни одно из выше-перечисленных условий не подошло, то программа покажет этот вариант ответа
    }
                getch();
        return 0;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2016, 21:22
Ответы с готовыми решениями:

Найти корень уравнения методом деления отрезка пополам
Найти какой нибудь корень уравнения -2.4 x^3 - 28.512 x^2 - 40.6272 x + 44.928 = 0 Методом...

Поиск корня уравнения методом половинного деления и методом хорд
Нужно найти корень уравнения ctg(1,05x)-x^2=0 в отрезке . что-то не получается седлать это методом...

Решение уравнения методом половинного деления отрезка
решить уравнение x^2-7x+8=0 на отрезке я не понимаю почему у меня получается точный ответ...

Отыскать корень уравнения f(x)=0 на заданном интервале методом деления отрезка пополам
1. Задан многочлен f(x) и известно, что f(a)f(b)&lt;0. Требуется отыскать корень уравнения f(x)=0 на...

Найти корень уравнения методом хорд
2x + \ln(x+1) - 1

9
SergioO
169 / 185 / 90
Регистрация: 13.12.2015
Сообщений: 1,004
21.04.2016, 23:33 2
C
1
2
3
4
5
6
7
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    printf("%i\n", atoi(" -123junk"));
}

Output:
-123

как вариант проверять каждый символ
C
1
2
<ctype.h>
isdigit(c);
0
carlwalther
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 15
21.04.2016, 23:46  [ТС] 3
SergioO, Спасибо) скорее всего придется думать как проверять каждый символ) и почему при вводе буквы программа автоматически приравнивает все переменные.
0
SergioO
169 / 185 / 90
Регистрация: 13.12.2015
Сообщений: 1,004
22.04.2016, 00:02 4
Цитата Сообщение от carlwalther Посмотреть сообщение
scanf("%lf", &d);
%lf - что это за спецификатор?
0
22.04.2016, 00:02
carlwalther
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 15
22.04.2016, 13:43  [ТС] 5
SergioO, Спецификатор long double. Лучше наверно конечно поменять на %f но на некорректную работу это никак не отразится.
0
carlwalther
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 15
22.04.2016, 19:32  [ТС] 6
У кого нибудь есть идеи, почему при вводе данных в виде символов (в данной программе) происходит такое? А именно приравнивание всех переменных.
0
Изображения
Тип файла: png Снимок.PNG (6.6 Кб, 6 просмотров)
SergioO
169 / 185 / 90
Регистрация: 13.12.2015
Сообщений: 1,004
22.04.2016, 21:28 7
можно взять функцию get_number();
функцию можно допилить, но в общем она кооректно возвращает double или 0 в случае не корректного ввода
аргументом функции является строка, которая приглашает ввести переменную
например
d = get_number ("Enter a d:");
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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
 
int print_error() {
    printf("\nIncorrect number...\n");
    return 0;
}
 
double get_number(char* s)
{
    char arr_int[10] = { 0 }, arr_fract[10] = { 0 };
    char ch;
    unsigned short fract = 0, i = 0, j = 0;
    int sign = 1;
    double d;
 
    printf("\n%s:", s);
 
    while ((ch = getchar()) != '\n') {
 
        if ((ch == '-') && (i == 0)) { sign = -1;}
        else if (isdigit(ch) || (ch == '.')) {
            
            if ((ch == '.') && (i != 0)) fract = 1;
            if ((ch == '.') && !( (i==1) && (sign == 1) ) )  fract = 1;
            
            if ( isdigit(ch) && fract == 1) { arr_fract[j] = ch; j++; }
            if ( isdigit(ch) && fract == 0) { arr_int[i] = ch; i++; }
 
        }
        else return print_error();
 
        
 
        
 
 
    }
 
    d = atol(arr_int) + atol(arr_fract)*pow(10, -1.0*j);
 
    return d * sign;
}
 
int main() {
 
    double d;
    if ( (d = get_number("var g")) != 0 )   printf("\n %f \n", d);
    system("pause");
}
Добавлено через 10 минут
Цитата Сообщение от carlwalther Посмотреть сообщение
int main() {
double func(double x,double a, double b, double c, double d);
красное это что такое?
1
carlwalther
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 15
22.04.2016, 21:51  [ТС] 8
Спасибо) с вашей помощью один вопрос практически решился. Осталось разобраться
0
SergioO
169 / 185 / 90
Регистрация: 13.12.2015
Сообщений: 1,004
22.04.2016, 21:54 9
Лучший ответ Сообщение было отмечено carlwalther как решение

Решение

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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
 
double func(double x, double a, double b, double c, double d)
{
    return   ((a*x + b) + 1 / (c*x + d));
}
 
int print_error() {
    printf("\nIncorrect number...\n");
    return 0;
}
 
double get_number(char* s)
{
    char arr_int[10] = { 0 }, arr_fract[10] = { 0 };
    char ch;
    unsigned short fract = 0, i = 0, j = 0;
    int sign = 1;
    double d;
 
    printf("\nEnter %s: ", s);
 
    while ((ch = getchar()) != '\n') {
 
        if ((ch == '-') && (i == 0)) { sign = -1;}
        else if (isdigit(ch) || (ch == '.')) {
            
            if ((ch == '.') && (i != 0)) fract = 1;
            if ((ch == '.') && !( (i==1) && (sign == 1) ) )  fract = 1;
            
            if ( isdigit(ch) && fract == 1) { arr_fract[j] = ch; j++; }
            if ( isdigit(ch) && fract == 0) { arr_int[i] = ch; i++; }
 
        }
        else return print_error();
 
        
 
        
 
 
    }
    //printf("\n");
    d = atol(arr_int) + atol(arr_fract)*pow(10, -1.0*j);
 
    return d * sign;
}
 
int main() {
 
    int n = 0;
    double a;
    if ((a = get_number("a")) == 0) { system("pause"); return -1; }    //  переменная
    double b;   
    if ((b = get_number("b")) == 0) { system("pause"); return -1; }         //  переменная
 
    double c = get_number("c");    //  переменная
 
    double d = get_number("d");    //  переменная
 
    double j = get_number("j");    //  координата отрезка поиска корня
 
    double g = get_number("g");    //  координата отрезка поиска корня
 
    double u = get_number("u");    //  вспомогательная переменная
 
    double eps = get_number("eps");  //  абсолютная погрешность
 
    if (func(j, a, b, c, d)*func(g, a, b, c, d) > 0) {
        while (fabs(j - g) >= eps) {
            u = (j + g) / 2;
            if (func(u, a, b, c, d)*func(j, a, b, c, d) <= 0)
                g = u;
            else j = u;
 
            n += 1;
            printf("n=%d\n", n);
            printf("u=%lf\n", u);
        }
    }
    else {
        printf("\n Neverno zadany nachalnye usloviya\n");
    }
    
                                            
    system("pause");
    return 0;
}
func не смотрел, там или в этих формулах где-то ошибка

попробуйте запустите и посмотрите что получится. сыровато еще, но уже ввод корректный и видно куда допиливать
1
carlwalther
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 15
23.04.2016, 18:05  [ТС] 10
Насчет красного верно) это не нужно. Просто эту программу я делаю с модулями и для простоты, здесь я убрал модульность, и не досмотрел.

Добавлено через 49 минут
Но по сути проблема с тем что программа автоматически перебрасывает действие к последнему Else осталась. Хотя по идее выполнились все условия "If".

Добавлено через 19 часов 21 минуту
Спасибо разобрался)
0
23.04.2016, 18:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2016, 18:05

Найти корень уравнения методом простой итерации
Найти какой-нибудь корень уравнения 1.2x^3+10.56x^2+12.78x+46.98=0 метод простой итерации....

Найти количество итераций и корень уравнения методом простых итераций
Помогите с программкой. Ну совсем никак. Даже не представляю что надо писать (чайник в Си). если...

Решение уравнения методом деления пополам
Доброго времени суток снова обращаюсь к вам за помощью возникла некоторая проблемка написал...


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

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

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