Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
akimbladina
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 4
#1

Вычислить значение выражения - C++

25.09.2011, 20:08. Просмотров 1555. Ответов 26
Метки нет (Все метки)

http://www.cyberforum.ru/attachment....1&d=1316966829

Example:
Input:
65
Output:
0.452665
http://www.cyberforum.ru/cpp-beginners/thread984871.html
0
Миниатюры
Вычислить значение выражения  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2011, 20:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вычислить значение выражения (C++):

Вычислить значение выражения
Вычислить:

Вычислить значение выражения
для данных действительных чисел х и у посчитать...

Вычислить значение выражения
Помогите изменить код программы что бы подходил под мои условия Условие Данны...

Вычислить значение выражения
Пожалуйста, весь код.

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

26
Olga_
25.09.2011, 21:52
  #2

Не по теме:

Придется на калькуляторе вам эту сумму считать). Поймите, легче самому обучиться, чем искать помощи все время

0
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 22:00 #3
akimbladina, в
Цитата Сообщение от akimbladina Посмотреть сообщение
Example:
Input:
для ввода нужен не только предел последовательности 65, но и само х
Вот алгоритм на плюсах
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main () 
{
    int i,n;
    double x,upsum,downsum;
    do
    {
        std::cout<<"Enter x : ";
        std::cin>>x;
        std::cout<<"Enter max power in sequence : ";
        std::cin>>n;
        //Начальные счётчики сумм в ноль
        upsum = 0;
        downsum = 0;
        for(i = 1; i < n; i++)
        {
            if(i % 2 == 0)
                upsum += (x - i);
            else
                downsum += (x - i);
        }
        std::cout <<"answer : "<<upsum/downsum<<std::endl;
        std::cout<<"\r\nPress Y to new input\r\n";
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
Результат работы
Enter x : 5.64
Enter max power in sequence : 65
answer : 1.03794

Press Y to new input
1
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.09.2011, 22:03 #4
Как вариант:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
int main()
{
   double x, rez;
   int i, flag;
   std::cin >> x;
   flag = rez = 1;
   for (i = 2; i <= 64 && flag; i += 2)
      if (x - i + 1 == 0)
         flag = 0;
      else
         rez *= (x - i)/(x - i + 1);
   flag ? std::cout << rez : std::cout << "incorrect x";
   std::cin.get();
   return 0;
}
2
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 22:09 #5
akimbladina, учитывая пост Thinker, предложенный мной алгоритм можно ускорить в 2 раза записав этот цикл
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i = 1; i < n; i++)
* * * * * * * * {
* * * * * * * * * * * * if(i % 2 == 0)
* * * * * * * * * * * * * * * * upsum += (x - i);
* * * * * * * * * * * * else
* * * * * * * * * * * * * * * * downsum += (x - i);
* * * * * * * * }
таким образом
C++
1
2
3
4
5
for(i = 2; i < n; i += 2)
        {
            upsum   += (x - i);
            downsum += (x - (i - 1));
        }
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.09.2011, 22:12 #6
-=ЮрА=-, а почему вы суммируете, если там произведения в числителе и знаменателе. Вечер сказывается
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.09.2011, 22:40 #7
Thinker, да точно уже совсем невнимателен стал...
0
alkagolik
Заблокирован
26.09.2011, 00:12 #8
Thinker, да вечер на вас обоих сказывается
http://www.cyberforum.ru/cgi-bin/latex.cgi?f(x) =\frac{f_{1}(x)}{f_{2}(x)}= \frac{(x - n_{i - 1})  (x - n_{i }) (x - n_{i + 1})} {(x - m_{i - 1}) (x - m_{i } )(x - m_{i + 1})} при этом http://www.cyberforum.ru/cgi-bin/latex.cgi?n_{1} = 2, m_{1} = 1, m_{2} = 3 и дальше http://www.cyberforum.ru/cgi-bin/latex.cgi?n_{i}= 2^{i} \wedge n_{i} \leq 65 \Rightarrow i_{max} = 6 , http://www.cyberforum.ru/cgi-bin/latex.cgi? m_{i + 1} =m_{i - 1} + 2m_{i} я только не понимаю как получается http://www.cyberforum.ru/cgi-bin/latex.cgi?m = 63 ну, вообще - то я понял как при i = 6, m = 63 с кем поделиться? ладно, не буду выделываться :-) http://www.cyberforum.ru/cgi-bin/latex.cgi?m_{i+1} = 3m_{i} - 2m_{i - 1}

Добавлено через 59 минут
конечно чтобы скомпилировать в винде придется поработать головой немного
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
#include </usr/include/c++/4.5/iostream>
#include </usr/include/c++/4.5/cstdlib>
#include </usr/include/c++/4.5/cmath>
 
float up_rez(float rezult, float x, int stepen, int iter);
float down_rez(float rezult, float x, int iter);
 
int main(){
    float x = 65, up_rezult = 1, down_rezult = 1, rez;
 
    rez = up_rez(up_rezult, x, 1, 6) / down_rez(down_rezult, x, 6);
 
    std::cout << rez << "\n";
    return 0;
}
 
float up_rez(float rezult, float x, int stepen, int iter){
    if(iter > 0){
        rezult *= x - pow(2, stepen);
        return up_rez(rezult, x, ++stepen, --iter);
    }
    return rezult;
}
 
float down_rez(float rezult, float x, int iter){
    int dx = 1, x1 = 0, tmp;
    while(iter){
        rezult *= x - dx;
        tmp = dx;
        dx = 3 * dx - 2 * x1;
        x1 = tmp;
        --iter;
    }
    return rezult;
}
результат
Код
$ ./temp 
0.452665
был бы признателен, если бы показали вызов функции рекурсивно
C++
1
float down_rez(float rezult, float x, int iter)
1
magirus
26.09.2011, 09:44
  #9
 Комментарий модератора 
akimbladina, называйте темы информативно...
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 09:51 #10
Цитата Сообщение от alkagolik Посмотреть сообщение
float up_rez(float rezult, float x, int stepen, int iter);
float down_rez(float rezult, float x, int iter);
, можно вообще на каждой итерации считать отношение
C++
1
2
3
buf = 1;
for(i = 2; i < n; i += 2)
        buf *= (x - i)/(x - (i - 1));
и не считать ни верх ни низ

Не по теме:

Когда вчера сонным делал задачу грешным образом думал что и в числителе и в знаменателе суммы скобок, а в случае произведения лучше использовать свойства дробей.

0
alkagolik
Заблокирован
26.09.2011, 14:22 #11
-=ЮрА=-, вы так и не поняли. там нет цикла с шагом 2. есть цикл числителя с шагом http://www.cyberforum.ru/cgi-bin/latex.cgi?n=2^{i},~i = 1, 2, 3, 4, 5, 6 и цикл знаменателя с шагом http://www.cyberforum.ru/cgi-bin/latex.cgi?m_{i+1} = 3m_{i}-2m_{i-1}, i = 1, 2, 3, 4, 5, 6 i - шаг и отрезок цикла, n, m - переменные. В вашем варианте это будет выглядеть так
C++
1
2
3
4
5
6
7
8
float rezult = 1, x = 65, dx = 1, x1 = 0;/*x1 = 0 это значение переменной m с индексом 0,
которое опускается т.к. i > 0*/
for(int i = 1; i < 6, ++i){
      rezult *= (x - pow(2, i)) / (x - dx);
      int tmp = dx;
      dx = 3 * dx - 2 * x1;
      x1 = tmp;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 14:24 #12
alkagolik, посмотрите 10-й пост и сравните с вашим циклом
Цитата Сообщение от alkagolik Посмотреть сообщение
float rezult = 1, x = 65, dx = 1, x1 = 0;/*x1 = 0 это значение переменной m с индексом 0,
которое опускается т.к. i > 0*/
for(int i = 1; i <=6, ++i){
* * * rezult *= (x - pow(2, i)) / (x - dx);
* * * int tmp = dx;
* * * dx = 3 * dx - 2 * x1;
* * * x1 = tmp;
}
- смысл искать скрытые последовательности, если в лоб намного быстрей и понятней решать. PS:Я прекрасно понял о чём говорилось вами ранее...
0
alkagolik
Заблокирован
26.09.2011, 14:26 #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если в лоб намного быстрей и понятней решать
так я не спорю, я просто говорю что решаете вы не то что нужно решать ведь видно же что при х = 65 у меня результат верный, а ваш нет. значит что-то не так с алгоритмом, верно ведь?
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 14:48 #14
Цитата Сообщение от alkagolik Посмотреть сообщение
так я не спорю, я просто говорю что решаете вы не то что нужно решать ведь видно же что при х = 65 у меня результат верный, а ваш нет.
- с чего вы это взяли???

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i = 1; i < n; i++)
- цикл прекратиться при i = 64 < 65 или что вам не понятно в моём решении???

Добавлено через 2 минуты
Для избежания неверных трактовок предлагаю ТС в этих циклах заменить условие окончания цикла на следующее i <= n и вводить 64 по этому запросу
std::cout<<"Enter max power in sequence : ";
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i = 1; i < n; i++)
* * * * * * * * {
* * * * * * * * * * * * if(i % 2 == 0)
* * * * * * * * * * * * * * * * upsum += (x - i);
* * * * * * * * * * * * else
* * * * * * * * * * * * * * * * downsum += (x - i);
* * * * * * * * }
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
buf = 1;
for(i = 2; i < n; i += 2)
* * * * buf *= (x - i)/(x - (i - 1));
Добавлено через 11 минут
alkagolik, вот листинг с выводом промежуточных результатов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main () 
{
        int i,n;
        double x,buf;
        do
        {
                std::cout<<"Enter x : ";
                std::cin>>x;
                std::cout<<"Enter max power in sequence : ";
                std::cin>>n;
                //Начальные счётчики сумм в ноль
                for(buf = 1, i = 2; i <= n; i += 2)
                    std::cout<<(buf *= (x - i)/(x - (i - 1)))<<"\r\n";
                std::cout <<"answer : "<<buf<<std::endl;
                std::cout<<"\r\nPress Y to new input\r\n";
        }
        while(toupper(getch()) == 'Y');
    return 0;
}
Enter x : 65
Enter max power in sequence : 64
0.984375
0.968498
продолжение
0.952356
0.935936
0.919223
0.902201
0.884851
0.867154
0.849088
0.830629
0.811752
0.792424
0.772613
0.752282
0.731385
0.709874
0.68769
0.664767
0.641025
0.61637
0.590688
0.563839
0.535647
0.505889
0.474271
0.440394
0.403695
0.363325
0.31791
0.264925
0.198694
0.0993468
answer : 0.0993468


Добавлено через 3 минуты
Проверка
Итерация 1
(64 - 2)/(64 - 1) = 62/63 = 0,9841
Итерация 2
0,9841*(64 - 4)/(64 - 3) = 0,9841*60/61 = 0,9841*0,9836 = 0,96796076 (~0,968)
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 15:08 #15
alkagolik, чтобы снять у вас все вопросы не поленился и добросовестно вбил 64 скобки в маткаде, прилагаю скрин и ответ 0.09935 , сравните его с этим
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
answer : 0.0993468
думаю все вопросы будут сняты
0
Миниатюры
Вычислить значение выражения  
alkagolik
Заблокирован
26.09.2011, 15:14 #16
-=ЮрА=-, вы же видите что ваш результат не отвечает заданному... вывод: не так построено вычисление.
требуемый результат:
Input:
65
Output:
0.452665
представлю задачу иначе, немного проще.
дано:
http://www.cyberforum.ru/cgi-bin/latex.cgi?F(x, n, m) = \frac {\sigma(x, f_{1}(n))}{\omega (x, f_{2}(m))}<br />
\sigma (x, f_{1}(n)) = (x - f_{1}(n_{1}))(x - f_{1}(n_{2})) \dot ... \dot (x - f_{1}(n_{i}))<br />
\omega (x, f_{2}(m)) = (x - f_{2}(m_{1})) (x - f_{2}(m_{2})) \dot ... \dot (x - f_{2}(i))<br />
f_{1}(n) = n_{i} = 2^{i}<br />
f_{2}(m) = m_{i} = 3m_{i - 1} - 2m_{i - 2}<br />
в моем решении http://www.cyberforum.ru/cgi-bin/latex.cgi?F(x, n, m) была вычислена с помощью двух функций числителя http://www.cyberforum.ru/cgi-bin/latex.cgi?\sigma(x, f_{1}(n)) и знаменателя http://www.cyberforum.ru/cgi-bin/latex.cgi?\omega (x, f_{2}(m)) и что самое главное получен верный результат. Вы просто запутались в задаче, поэтому и неверно составили алгоритм, т.е. просто не то что надо вычисляете. Посмотрите внимательно уравнение функции в первом топике. Доказательство моей правоты - верный результат при исходном х = 65. Без обид, ничего дурного.
а где дано числитель
(x - 2)(x - 4)( x - 6)(x - 8)... ? я такого не видел в задании.
тоже касается и знаменателя. думаю все вопросы будут сняты
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 15:22 #17
alkagolik,в задании в числетеле даны чётные минусы в знаменателе нечётные, все их перебрал в маткад, и програмно, я уже не пойму почему спорим???
Цитата Сообщение от akimbladina Посмотреть сообщение
0.452665
не думали что данный ответ может быть взят из головы лишь для того чтобы показать как вводить и как выводить
0
alkagolik
Заблокирован
26.09.2011, 15:27 #18
ага вот так

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
alkagolik,в задании в числетеле даны чётные минусы в знаменателе нечётные, все их перебрал в маткад, и програмно, я уже не пойму почему спорим???
не думали что данный ответ может быть взят из головы лишь для того чтобы показать как вводить и как выводить
вас не смущает третий множитель числителя?
1
-=ЮрА=-
Заблокирован
Автор FAQ
26.09.2011, 15:28 #19
Цитата Сообщение от alkagolik Посмотреть сообщение
ага вот так
- в смысле?Я уж думал что скобки сокращаются, но они не сократимы, вбил в ручную чтобы и себя проверить и вас переубедить -результаты програмного расчёта и маткад совпали до 3-го знака думаю вопросов не далжно уже возникать...
0
alkagolik
Заблокирован
26.09.2011, 15:41 #20
-=ЮрА=-, почему в задании в числителе нету четного числа 6?
1
26.09.2011, 15:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2011, 15:41
Привет! Вот еще темы с решениями:

Вычислить значение выражения
Доброй ночи, Господа. Помогите решить простенький пример. Буду Всем очень...

Вычислить значение выражения
Составит программу на языке С++ для решения Первого варианта задания с...

Вычислить значение выражения
Вычислить значение функции x/i! , i изменяется от1 до n

Вычислить значение выражения
Вычислить значение выражения С++


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

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

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