Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 16.11.2012
Сообщений: 27

То ли баг, то ли я говнокод написал

16.11.2012, 02:08. Показов 841. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Попросил знакомый написать прогу. Тема заезженная, про ряд Тейлора.
Дана функция: https://www.cyberforum.ru/cgi-bin/latex.cgi?y=\left(1 + 2{x}^{2} \right){e}^{{x}^{2}}
Промежуток: https://www.cyberforum.ru/cgi-bin/latex.cgi?\left[0;1 \right]
Шаг: 0.2
Точность: https://www.cyberforum.ru/cgi-bin/latex.cgi?\varepsilon = 0.0001

Суть задачи: табуляция функции тремя способами
1) 5 раз просуммировать ряд Тейлора
2) просуммировать ряд Тейлора с точностью эпсилон
3) вывести как считает компьютер

сложного ничего нет, ряд Тейлора я сделал правильно (в точке а=0, если что)
вот полный код:

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
#include <math.h>
#include <iostream>
using namespace std;
 
const double e = 0.0001, n = 5, step = 1/n;
int    fact             (int); // Вычисление факториала
double rowsum        (double); // Вычисление суммы ряда в точке х
double rowsum_epsilon(double); // Вычисление суммы ряда в точке х для точности e
double truefunc      (double); // Вычисление компьютером значения функции в точке х 
 
int main()
{
    cout<<n+1<<" steps: "<<endl;
    for (double i = 0; i <= 1; i += step) 
        cout<<"x = "<<i<<": "<<rowsum(i)<<endl;
    cout<<endl<<e<<" accuracy: "<<endl;
    for (double i = 0; i <= 1; i += step) 
        cout<<"x = "<<i<<": "<<rowsum_epsilon(i)<<endl;
    cout<<endl<<"Computer result: "<<endl;
    for (double i = 0; i <= 1; i += step) 
        cout<<"x = "<<i<<": "<<truefunc(i)<<endl;
    cin.get();
}
 
int fact(int number)
{
    return (number == 0) ? 1 : number * fact(number - 1); 
}
 
double rowsum(double x)
{
    double sum = 0;
    for (int i = 0; i <= n; i++) sum += pow(x, 2*i) * (2*i + 1) / fact(i);
    return sum;
}
 
double rowsum_epsilon(double x)
{
    double sum = 0, el = 0;
    int i=0;
    do sum += el = pow(x, 2*i) * (2*i + 1) / fact(i);
    while ((el > e)&&(++i));
    return sum;
}
 
double truefunc(double x)
{
    return (1 + 2*pow(x, 2))*exp(pow(x,2));
}
это все неважно.важно вот что. вы можете найти две быдлострочки (в функции rowsum_epsilon):

C++
1
2
    do sum += el = pow(x, 2*i) * (2*i + 1) / fact(i);
    while ((el > e)&&(++i));
они работают, но написано конечно некрасиво. гораздо лучше сделать так, собственно как я и сделал

C++
1
2
    do sum += el = pow(x, 2*i) * (2*i + 1) / fact(i++);
    while (el > e);
но когда я запустил программу, в графЕ подсчета с точностью эпсилон выводились абсолютно неверные результаты.
я выполнил построчно и обнаружил что в функции rowsum_epsilon неправильно присваивается значение переменной el

тогда я вставил такой код (чтоб наблюдать el):

C++
1
2
3
4
el = pow(x, 2*i); 
el = (2*i + 1); 
el = fact(i);
el = pow(x, 2*i) * (2*i + 1) / fact(i++);
первые три строчки выполнились корректно, а четвертая опять выдала какую-то чушь.
я вставил этот код в функцию rowsum в таком виде:

C++
1
2
3
4
5
6
7
for (int i = 0; i <= n; i++) 
{
el = pow(x, 2*i)
el = (2*i + 1); 
el = fact(i);
sum += el = pow(x, 2*i) * (2*i + 1) / fact(i);
}
результаты выводились верные.
я начал нервничать: я изменял переменные, считал на листике, следил за абсолютно всеми переменными.
а потом решил написать то, что вы видели в самом начале, и все заработало.

отсюда вопрос: неужели если я в рекурсивную функцию передаю переменную и инкреминирую её, то функция что-то некорректно считает? или это какой-то баг?
Объясните, пожалуйста, и задавайте вопросы если что непонятно

Среда Visual Studio 2010, компилятор стандартный который в ней
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2012, 02:08
Ответы с готовыми решениями:

написал программу для этой формулы. Скажите правильно ли я написал ее
написал программу для этой формулы. Скажите правильно ли я написал ее #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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

Почему это говнокод?!
:-| Есть задачка, очень простенькая, но код ее, на мой взгляд, ужасен, что можно исправить здесь? Метод, ну очень раздражает как...

6
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,867
16.11.2012, 05:31
Цитата Сообщение от bychevoz Посмотреть сообщение
el = pow(x, 2*i) * (2*i + 1) / fact(i++);
Вот здесь когда исполняется i++?
гарантированно что после вызова fact но
до pow? после?
у тебя при i =1
может быть так
C++
1
2
3
4
pow(x, 2*1) * (2*1 + 1) / fact(1);
pow(x, 2*2) * (2*2 + 1) / fact(1);
pow(x, 2*2) * (2*1 + 1) / fact(1);
pow(x, 2*1) * (2*2 + 1) / fact(1);
странно что разбив практически все ты до этого не добрался

Добавлено через 6 минут
Цитата Сообщение от bychevoz Посмотреть сообщение
while ((el > e)&&(++i))
а вот здесь все правильно и трудно это назвать быдлокодом
и если i используется в других расчетах единственно верная
дело в том что при && гарантированно исполняется левая часть и если она ложь то правая не исполняется
C++
1
if((el>e)&&(++i))
анологично
C++
1
2
if((el>e)
  if(++i)
но не
C++
1
2
if(++i)
  if(el>e)
1
1 / 1 / 1
Регистрация: 16.11.2012
Сообщений: 27
16.11.2012, 11:39  [ТС]
спасибо огромное, вот это я затупил конечно)) ну главное что нашел выход
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,867
16.11.2012, 11:50
Цитата Сообщение от bychevoz Посмотреть сообщение
спасибо огромное,
Для Спасибы кнопка есть
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.11.2012, 11:56
Цитата Сообщение от bychevoz Посмотреть сообщение
el = pow(x, 2*i);
el = (2*i + 1);
el = fact(i);
el = pow(x, 2*i) * (2*i + 1) / fact(i++);
первые три строчки выполнились корректно, а четвертая опять выдала какую-то чушь.
я вставил этот код в функцию rowsum в таком виде:
А как работает i++? Факт получает уже инкремированную i, или нет?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,867
16.11.2012, 13:31
Цитата Сообщение от taras atavin Посмотреть сообщение
Факт получает уже инкремированную i, или нет?
конечно нет
там же оговорено постинкремент
но вот что получает pow?
может и инкремированную если вызывается pow после fact
а может и нет если перед
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.11.2012, 13:33
Ну вообще да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2012, 13:33
Помогаю со студенческими работами здесь

Что значит говнокод в php?
Очень часто слышу, что пхп рождает говнокодеров. И что на самом деле на нем можно хорошо писать, но 90% пишут ужасный код и.т.д. Что значит...

Как правильно писать говнокод?
теорию я знаю, а практики маловато( поделитесь опытом

Это говнокод или так и делают ?
Пишу программу в которой пользователь должен угадывать столицы стран мира в Windows Form. И вот у меня вопрос: мне теперь каждую страну и...

мой говнокод работает только в старом IE
Всем привет. Впервые столкнулся с JQuery, когда стал писать данную вещь. Она была написана методом гуглежки и форума про яваскрипт, но...

Игра «Угадай число от 1 до 100». Говнокод
Суть такова: программа запускается и просит человека ввести число от 1 до 100, второй человек должен угадать это число. У второго человека...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru