Консультация № 176929
26.02.2010, 21:16
0.00 руб.
0 13 2
Подскажите что я делаю не так.
Задание: Вычислить по заданному n функцию f(x)=summ(i=1..n) x - x^(x-x/3)
Код в приложении

Приложение:
#include<iostream>
#include<math.h>
#include <conio.h>

using namespace std;

double n,Summ,i,x;

int main()
{

cout<<"Vvedite n:\n";
cin>>n;
for(i=1;i<n;i++)
{
Summ = Summ + (x-pow(x,(x-x/3));
i++;
}
cout<<Summ<<endl;
}

Обсуждение

Неизвестный
26.02.2010, 21:24
общий
Azarov88:
начальная инициализация Summ и x обязательна
давно
Академик
20764
1861
26.02.2010, 22:08
общий
Kamerad:
Они и так инициализированы Вся статическая память инициализируется нолями.
Неизвестный
26.02.2010, 23:04
общий
Хватов Сергей:
Это содержится в каком-либо стандарте??
Неизвестный
26.02.2010, 23:10
общий
это ответ
Здравствуйте, Azarov88.

Как уже отмечалось выше переменные лучше инициинализировать явным образом.

Во-вторых Вы не считаете последний член.
Цикл должен выглядеть
for(i=1;i<=n;i++)


давно
Академик
20764
1861
26.02.2010, 23:24
общий
Vadim22:
Да. Со времён Кернигана и Ричи.
Цитирую ISO/IEC 9899:TC2, раздел 6.7.8:
10 If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these
rules.
давно
Профессор
230118
3054
27.02.2010, 00:06
общий
Azarov88:
Члены не зависят от n. Нужно все-таки уточнить задание.
Неизвестный
27.02.2010, 00:08
общий
Хватов Сергей:
Несмотря на стандарт, не стоит надеяться, что переменные проинициализированы, это очень опасная привычка :)
давно
Профессор
230118
3054
27.02.2010, 00:08
общий
это ответ
Здравствуйте, Azarov88.

Не нужно увеличивать i внутри цикла. У Вас i++ в заголовке цикла и еще раз в теле. Таким образом, цикл выполняется в 2 раза меньше раз, чем нужно.

давно
Профессор
230118
3054
27.02.2010, 00:11
общий
Хватов Сергей:
Да, и переменные должны быть описаны в функции. То есть автор хочет сэкономить на инициалиации, жертвуя структурностью.
давно
Академик
20764
1861
27.02.2010, 08:23
общий
Verena:
Ещё раз: это поведение - гарантируется. В чужом коде (причём, популярных проектов) я копаюсь регулярно и вижу, что этим широко пользуются. К тому же у такого поведения есть веская причина - область данных, предоставляемую задаче, система всё равно очищает из соображений безопасности, так что разработчикам компилятора тут не намусорить даже сознательно.
Но инициализировать такие переменные явно всё равно стоит по принципу "свои намерения рекомендуется выражать явно, а не испытывать интеллект компилятора". Правда, это увеличивает размер образа задачи, но это уже "экономия на спичках".
давно
Академик
20764
1861
27.02.2010, 08:34
общий
Гаряка Асмик:
Цитата: Асмик Гаряка
переменные должны быть описаны в функции

Почему "должны"? Настоятельно рекомендуется, но работает и так, и даже не только в учебных задачках (особенно, если автор хочет помучаться на этапе отладки)

P.S. Я сейчас раскапываю icinga - свежий fork nagios - популярной системы мониторинга сетей. Так там большинство функций без параметров и ничего не возвращают, а данные передаются через специальные глобальные переменные. Зато сразу стала понятна причина этого fork-а, которая в манифесте была описана достаточно невнятно.
давно
Академик
320937
2216
27.02.2010, 09:33
общий
Azarov88:
Добрый день!
Код:
// 176929
// Задание: Вычислить по заданному n функцию f(x)=summ(i=1..n) x - x^(x-x/3)
#include<iostream>
#include<cmath>

using namespace std;

int main()
{
int n;
double summ,x;


cout<<"Vvedite n:\n";
cin>>n;

cout<<"Vvedite x:\n";
cin>>x;

if (x==0)
{
cout << "Ошибка. 0^0 не определено" << endl;
}
else if (x<0)
{
cout << "Ошибка. Дробная степень отрицательного числа не определена" << endl;
}
else
{
// Если верить заданию, проще так:
// summ := n*(x-pow(x,2*x/3));
// вместо следующих строк
summ = 0;
for(int i=1;i<=n;i++)
{
summ += x-pow(x,(x-x/3));
}
cout<<summ<<endl;
}

return 0;
}

Неизвестный
27.02.2010, 21:02
общий
Спасибо всем за помощь. Исправил. Если кому интересно, вот рабочий код(хотя не на 100% уверен, может быть где-то "дырка" и есть, но пока не вижу).
Код:
#include<iostream>
#include<math.h>
#include <conio.h>
#include <iomanip>

using namespace std;

int main()
{
double z;
int i;
int n;

cout<<"Vvedite n:\n";
cin>>n;
z = 0;

for(i=1;i<=n;i++)
{
z=z+(i-pow(i,(i-(double)i/3)));

}
cout<<setprecision(2)<<z;
cout<<endl;
}
Форма ответа