Программа зациклилась то это значит

Почему зацикливается программа? Программа, выполненная на C, компилируется с помощью gcc под Ubuntu. При запуске исполняемого файла происходит зацикливание и бесконечное выполнение программы. Входные данные a=1,b=7,accuracy=0,001. Метод, в котором программа зацикливается, представлен ниже.

void SimpsonMethod(double a,double b,double accuracy) < printf(«Simpson’s method.n»); double I1=0; double m=4.0; double h=(b-a)/4.0; double I2=0; for(;;) < I2=0; int i=2; for(;;) < double x2=a+i*h; double x1=x2-h; double x0=x1-h; double y0=exp(x0)/x0; double y1=exp(x1)/x1; double y2=exp(x2)/x2; double S=y0+(4*y1)+y2; I2=I2+S; if(iI2=I2*(h/3.0); if(abs(I1-I2) > printf(«I2=%fnn»,I2); >
Отслеживать
задан 9 фев 2016 в 16:07
133 7 7 бронзовых знаков
Используйте отладчик.
9 фев 2016 в 16:09
Отладчик? Карандаш и бумагу!

– user176262
9 фев 2016 в 16:11
9 фев 2016 в 16:12
Программа заработала, когда добавил #include . Тогда остается вопрос, как это влияет на программу.
9 фев 2016 в 16:35
9 фев 2016 в 16:44

Как ваши мысли влияют на человека? Что происходит, если постоянно думать о ком-то| навязчивые мысли

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В приведенном коде неправильно используется библиотечная функция abs . Данная функция работает с переменными типа int . Т.е. эта функция имеет прототип

int abs(int);

Используя эту функцию невозможно достичь заявленной точности — возвращаемое ею значение будет меньше 0.001 когда I1-I2 станет меньше единицы (при преобразовании числа с плавающей точкой в целое дробная часть будет отброшена).

В данной программе нужно использовать функцию fabs .

Теперь по поводу зависания.

Пока не было добавлено включение заголовочного файла stdlib.h компилятор должен был выдавать предупреждение о неявном объявлении функции (implicite declaration). На предупреждения компилятора лучше все-таки обращать внимание.

В данном случае происходило следующее.

Компилятор считал, что где-то определена функция, принимающая на вход значение типа double и генерировал соответствующий код. Компоновщик находил функцию с таким именем и связывал вызов с ней. Однако разные типы — даже имеющие один размер — могут передаваться по разному (соглашение о передаче параметров — внутреннее дело компилятора). В данном случае именно это и происходило, в результате чего в функцию abs попадало неверное значение, не равное 0, и, соответственно, возвращалось отличное от нуля значение и цикл не заканчивался.

После добавления заголовочного файла, содержащего прототип функции, компилятор выполнил преобразование передаваемого параметра к типу int и сгенерировал правильный вызов (хотя, по описанным в начале причинам, программа все равно работала не верно).

Читайте также:
Описание программы для пользователя

Поэтому на предупреждение компилятора о неявном объявлении функции нужно обращать пристальное внимание (многие задают опции компилятору, чтобы он считал это предупреждение ошибкой — несоответствие типов параметров функции ожидаемому может приводить к неожиданным последствиям). Ну и вообще использование прототипов в своем коде — тоже хорошая практика.

Как избавиться от старых убеждений? Про лень, инфофастфуд и как помочь мозгу быть эффективнее?

Источник: ru.stackoverflow.com

Неразрешимая проблема Тьюринга.

Вот пример неразрешимой проблемы, который я изложу здесь в терминах «повседневного» компьютера. Требуется составить программу U, которая бы по любому подаваемому ей на вход файлу X, содержащему текст программы (на каком-нибудь языке программирования, скажем, стандартном ANSI С), определяла бы, остановится ли когда-нибудь программа из файла Х в процессе своей работы, получив на вход известные данные, или «зациклится». Если программа Х зациклится, то программа U должна показать на экране фотографию юноши, иначе – девушки, после чего закончить свою работу. (Такого рода «проверяющая на зацикливаемость» программа U. была бы, очевидно, довольно полезна для проверки создаваемых компьютерных программ.) Оказывается, написать эту «проверяющую программу» U невозможно в принципе (даже если допустить, что компьютер, на котором выполняется U, имеет сколь угодно большую память и может работать неограниченно (астрономически) долгое время). Приведенный пример (так называемая «неразрешимость проблемы остановки») впервые был рассмотрен в цитированной выше работе Тьюринга 1936 г. – в то время, когда еще не было никаких компьютеров и программ для них!]; утверждают, будто он доказывает ограниченность возможностей машин, которая не присуща разуму человека.

А для тех любознательных компьютерщиков, которые, возможно, не поверили на слово, что такую программу U нельзя написать, поясню, опуская детали (к которым можно придраться, но они все же несущественны), в чем тут дело. Если бы такая программа U была написана, то ее можно было бы легко переделать так, чтобы вместо команды вывода изображения девушки на экран она бы зацикливалась (вставить для этого, скажем, «вечный цикл» for(„); ). Пусть эта переделанная программа называется U2.

Что будет делать программа U2, если ей на вход подать текст программы U2 (текст себя самой)? Если она зацикливается, то она должна показать фотографию юноши и остановиться, т.е. не зациклиться. Но если она не зацикливается, это значит, что она должна зациклиться (поскольку вывод девушки в программе U был заменен на «вечный цикл»). Тем самым программа U2 оказывается в безвыходном положении, несовместимом с допущением возможности ее существования. – Прим. И.Д.

Читайте также:
Упражнения для пресса программа для новичков

Что я думаю по этому поводу:
На самом деле я думаю что такую программу написать можно. Представим что программа U существует. При запуске программы U требуется предоставить код другой программы, которую она же будет анализировать. В нашем случае мы подаем код этой же программы U, для того чтобы не путать эти две идентичные программы, назовем их U1 и U2.
В итоге у нас получается U1 -> U2 (U1 анализирует U2).
При анализе программы U2, идентичной U1 мы придем к тому, что у нас существует нехватка данных для анализа. Объясняю, когда мы запускали U1, мы должны были подать на анализ программу(данные) и я считаю, что случай с U2 будет аналогичным. Программа U2 которая будет анализироваться потребует сторонних данных. Которые мы в свою очередь должны будем ей предоставить. Представим, что у нас есть сторонняя программа, назовем ее O и к тому же эта программа не требует других сторонних данных для ее функционирования, т.е. можно безусловно определить остановится она в процессе своего выполнения или же зациклится.
U1 -> U2 -> O.

В таком случае, когда мы будем знать точное состояние программы O мы так же сможем узнать и точное состояние U2. В пример, если программа O зациклиться, программа U2 выведет на экран фотографию юношы и завершит работу, а программа U1 анализирующая программу U2 будет зацикленна вследствии того что U2 завершила свою работу. И наоборот.

Вывод:
Теоретически программа U может существовать, но во первых, она должна обладать данными, которые требуются подать в процессе анализирования работы другой программы. Аналогия этой программы — сам человек, только от решения человека зависит, остановится ли программа в процессе своей работы или завершит процесс. Человек, подающий данные в программу может просчитать дальнейший ход программы, что может теоретически сделать и программа обладающая достаточными данными для того чтобы применить их в деле. Это собственно и упирается в программирование ИИ.

Надеюсь я правильно понял неразрешимую проблему и привел понятные вам мысли насчет возможности существования программы.

#1
0:25, 7 апр 2014

Weitec
демон как раз в деталях, которые ты назвал несущественными. почитай более подробное доказательство, там учитывается, что у анализируемого алгоритма на самом деле есть и входные данные и результат его работы(включая зацикливаемость) от этих данных существенно зависит. поэтому нельзя просто взять и подсунуть алгоритму U самого себя(можно подсунуть только самого себя с некоторыми входными данными), полное доказательство сложнее.

Читайте также:
Как удалить все ненужные программы с Самсунг

более корректную(хоть и тоже не полную) версию можешь посмотреть в разделе «набросок доказательства» в русской википедии: http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5… 2%D0%BA%D0%B8

#2
2:34, 7 апр 2014

Если взять строго верифицируемый язык, в котором все функции чистые, и доказать отдельно останавливаемость для каждой функции. Либо отметить вручную, как имеющую доказанную останавливаемость.
Конечно ответа на нерешаемую задачу это не даст, но зато даст кучу исходного материала, по которому человек может запустить, оценить и принять решение.

  • >:+()___ [Smile]
  • Постоялец

#3
2:58, 7 апр 2014

Weitec
> будто он доказывает ограниченность возможностей машин, которая не присуща разуму человека.
Такая убогая подмена понятий, что просто :factpalm:

Разум человека интересен тем, что на основе недостаточных данных способен достаточно эффективно (в смысле времени и потребления энергии) найти близкое к оптимальному решение.
Ключевое слово тут близкое, человеческий разум не предназначен для поиска действительно оптимальных решений (что имеет смысл только для чисто математических задач, для физических — сама постановка задачи не бывает абсолютно точной).
Приблизительное же решение задачи останова (как и кучи других неразрешимых или экспоненциально сложных задач) вообще элементарно: запустим тестируемую программу и подождем некоторое время — если за это время программа не остановилась, считаем ее приблизительно зациклившейся. Абсолютно также будет решать подобную задачу человек, если она ему попадется в реальной жизни.

#4
9:10, 7 апр 2014

зациклившиеся программы также чрезвычайно важны, сервера там всякие, операционки и т.п. : )

Источник: gamedev.ru

Почему программа зацикливается (легкая)?

int _tmain(int argc, _TCHAR* argv[])
double a = 0, b = 0.9, n = 4, S = 0, h, integ, IntegPrev;
h = (b — a) / n;
for (int i = 1; i S += f(a + h*i);
integ = h * ((f(a) + f(b)) / 2 + S);
//посчитали первый интеграл для n=4
do IntegPrev = integ;
n += 1;
h = (b — a) / n;
for (int i = 1; i S += f(a + h*i);
integ = h * ((f(a) + f(b)) / 2 + S);
> while (abs(IntegPrev — integ) > 0,000000001);
cout getchar();
return 0;
>

  • Вопрос задан более трёх лет назад
  • 2799 просмотров

3 комментария

Оценить 3 комментария

Источник: qna.habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru