Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 9
1

Компилятор игнорирует присваивание переменной

07.01.2018, 18:04. Показов 1010. Ответов 2
Метки нет (Все метки)

Написал небольшую программу в VStudio, запнулся во втором цикле while. Имеется отрезок от a до b. С каждым циклом отрезок сокращается в двое, пока не достигнет точности e. В какой то момент времени выражение в цикле while "c = (a + b / 2);" попросту игнорируется. Застревает на a= 1.789999 и b=3.579999 и c=3.579999. При этом счетчик k продолжает увеличиваться, то есть цикл не останавливается. Если считать на калькуляторе следующее значение c должно быть в районе 2.684999
Результатом должно быть значение с , лежащее в диапазоне от а до b,при этом |a-b|<e
Не подскажите ли, в чем может быть проблема? Почему игнорируется присваивание?

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace lab6
{
    class Program
    {
        public static double Myfun(double x)
        {
            double m= Math.Log(0.5*x)-0.5* Math.Cos(x);
            return m;
        }
 
        static void Main(string[] args)
        {
            double a, b, c;//a-левая граница, b-правая граница, c- средняя граница
            double e=0.001; //е - точность E
            bool q = true;
            a = 5; b = 100;//задаем границы
            
 
 
              while (Myfun(a)*Myfun(b) > 0)  //находим границы
                {
                if (q == true) { a=a+0.01; } else { b=b-0.01; }
                q = !q;
                Console.Write("а = "); Console.Write(a); Console.Write("   b = "); Console.WriteLine(b);
            }
            
 
        if (a > b) { c = b; b = a; a = c; }//переприсваиваем границы
            c = (a + b / 2);//задаем первое среднее a и b
            Console.Write("а = "); Console.Write(a); Console.Write("   b = "); Console.Write(b); Console.Write("   c = "); Console.WriteLine(c);
            int k=1; // счетчик числа итераций
            
 
          while (Math.Abs(a - b) >= e)  //проверка на точность
            {
                k++;
                if (Myfun(a) * Myfun(c) < 0) { b = c; } else { a = c; }  //сдвиг границы вправо (влево)
                c = (a + b / 2); //новое среднее
                Console.Write("k = "); Console.Write(k); Console.Write(" а = "); Console.Write(a); Console.Write("   b = "); Console.Write(b); Console.Write("   c = "); Console.WriteLine(c);
            }
            Console.ReadKey();//ожидание нажатия клавишы
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2018, 18:04
Ответы с готовыми решениями:

Компилятор игнорирует строку
Здравствуйте. Пытаюсь записать строку в файл с помощью Trace.WriteLine. Но ничего не выходит,...

Присваивание рандомной переменной по времени
Здравствуйте, не подскажите, как присвоить рандомное значение переменной, используя системное время?

Присваивание переменной типа double строки
Возможно ли без создания новой переменной?

Присваивание переменной значения, введенного в TextBox
Здравствйте, помогите, пожалуйста! У меня есть поле TextBox, в которое пользователь вводит...

2
Эксперт .NET
7788 / 5252 / 1251
Регистрация: 25.05.2015
Сообщений: 16,019
Записей в блоге: 14
07.01.2018, 18:58 2
Лучший ответ Сообщение было отмечено dex252 как решение

Решение

Цитата Сообщение от dex252 Посмотреть сообщение
Почему игнорируется присваивание?
Не игнорирует.
Там b становится равным c.
После вычисления получается, что c становится равным.... c.
Поэтому получается бесконечный цикл.

C#
1
2
3
4
5
6
7
8
9
10
11
// Myfun(a) ==  -0.0022053503815132741
// Myfun(b) == 1.0349300645905668
if (Myfun(a) * Myfun(c) < 0)
{ b = c; } // b == c
else
{ a = c; }  //сдвиг границы вправо (влево)
 
// a == 1.7899999999857514
// b == 3.5799999999715029
c = (a + b / 2); //новое среднее
// c == 3.5799999999715029
А всё почему?
Не соблюдён порядок скобок. И там вычисляется не среднее, а не пойми что. Потому что деление приоритетнее сложнения.
1
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 9
07.01.2018, 19:03  [ТС] 3
Спасибо большое за найденную ошибку, буквально минуту назад обнаружил ее на простом примере, это моя невнимательность. Спасибо за ответ!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2018, 19:03

Присваивание зачения переменной в классе через TextBox
Не могу понять как присвоить значения для переменных в классе через TextBox using System; using...

Компилятор игнорирует директиву $F
Здравствуйте! Компилятор игнорирует директиву $F. Проверял код в PascalABС, там все работает. ...

Компилятор игнорирует функции cin, if, for
После запуска программа дает ввести только строку. После чего выбивается весь cout, игнорируя и...

Игнорирует ли компилятор javac директиву -cp (иногда)?
Приходится изучать всякую фигню, вместо того, чтобы изучать программирование, а что делать? ...

Компилятор игнорирует явный конструктор копирования
Уже в который раз возникают проблемы с конструкторами класса и вот очередная из них. Насколько я...

В проекте VS2012 компилятор игнорирует конструкторы классов
Компилятор отлично компилирует проект и не выдаёт ошибок, но при генерации DEBUG версии и надо...


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

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

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