Форум программистов, компьютерный форум CyberForum.ru

Задание с синусами и косинусами - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Маквад
0 / 0 / 0
Регистрация: 04.01.2011
Сообщений: 8
07.02.2011, 05:53     Задание с синусами и косинусами #1
Две недели назад я выкладывал эту задачу на форуме. Мне помогли в ее решении, но решили неправильно. Сама задача такова:
Вычислить S=cos1/sin1+(cos1+cos2/sin2+sin3)+...+(cos1+cos2+...+cosN)/(sinN+sin(n+1)+...+sin(2N-1).
Вот что у меня получилось:
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 <iostream>
#include <math.h>
 
using namespace std;
 
int main()
{
        int n,i,j;
        float s,sc,ss; //s-сумма, sc-сумма сосинусов, ss-сумма синусов
 
        cout << "Vvedite N ";
        cin>> n;
        n++;
                
        for(i=1;i<n;i++)
     
          sc=ss=s=sum=0;
             
        for(j=1;j<i;j++)             
                 
          sc=sc+cos(j);
          cout<<"sc= "<<sc<<endl;
               
        for(j=i;j<(2*i-1);j++)        
      
            ss=ss+sin(j);
     
       s=s+sc/ss;
       
        cout<<"ss= "<<ss<<endl;    
        
        cout<<"s= "<<s<<endl;
        cin.get(),cin.get();
        return 0;
}
Она конечно считает, но считает ерунду-правильно только при N=1.
Сумму она считает неправильно. В чем моя ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2011, 05:53     Задание с синусами и косинусами
Посмотрите здесь:

C++ Задание!
C++ Задание по С.
Задание на массив и задание на матрицу. C++
C++ ошибка в программе с косинусами и синусами C++
Задание на C C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
07.02.2011, 08:12     Задание с синусами и косинусами #2
Есть вопрос по Вашему коду. По идее какой участок кода исполняется циклом по i и циклами по j?
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 <math.h>
 
using namespace std;
 
int main()
{
    int n,i,j;
    float s=0,sc=0,ss=0; //s-сумма, sc-сумма сосинусов, ss-сумма синусов
 
    cout << "Vvedite N ";
    cin>> n;
    
    for (j=1; j<=n; j++)
    {
        ss=0;
        
        sc += cos(j);
        cout<<"sc= "<<sc<<endl;
 
        for(i=j;i<=(2*j-1);i++)        
            ss += sin(i);
 
        cout<<"ss= "<<ss<<endl;
 
        s=s+sc/ss;
    }
    
    cout<<"s= "<<s<<endl;
    return 0;
}
Маквад
0 / 0 / 0
Регистрация: 04.01.2011
Сообщений: 8
07.02.2011, 08:54  [ТС]     Задание с синусами и косинусами #3
Я пытался перевести задачу с Паскаля на С++. В Паскале там это работает.

Добавлено через 25 минут
Спасибо за помощь в решении задачи!
Все работает!
Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,649
07.02.2011, 16:01     Задание с синусами и косинусами #4
Вот так работает на несколько порядков быстрее:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/////////////////////////////////////////////////////////////////////////////////////////
//Вычислить S = cos1/sin1 + (cos1 + cos2)/(sin2 + sin3) +...
//+ (cos1 + cos2 +...+ cosN)/(sinN + sin(n + 1)+ ... + sin(2N-1)
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <functional>
#include <iostream>
#include <numeric>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef double       T_real_num;
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_numerator
{    
    T_real_num  arg_val_;
    T_real_num  sum_;
    //-----------------------------------------------------------------------------------
    T_numerator() : arg_val_(1)          
    {
        sum_ = cos(arg_val_);
    }
    //-----------------------------------------------------------------------------------
    T_real_num  operator++(int)
    {
        T_real_num  sum_old(sum_);
        sum_ += cos(++arg_val_);
        return  sum_old;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_denominator
{    
    T_real_num  arg_val_;
    T_real_num  sum_;
    //-----------------------------------------------------------------------------------
    T_denominator() : arg_val_(1)          
    {
        sum_ = sin(arg_val_);
    }
    //-----------------------------------------------------------------------------------
    T_real_num  operator++(int)
    {
        T_real_num  sum_old(sum_);
        sum_ += -sin(arg_val_) + sin(arg_val_ * 2) + sin(arg_val_ * 2 + 1); 
        ++arg_val_;
        return  sum_old;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
T_real_num  get_arr_sum(int  n)
{
    T_numerator    numerator_cur;
    T_denominator  denominator_cur;
    T_real_num     sum_res = 0;
    for(int  i = 0; i < n; ++i)
    {
        sum_res += numerator_cur++ / denominator_cur++;        
    }
    return  sum_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << std::endl
                  << std::endl
                  << std::endl
                  << "N = ";
 
        T_str  s;
        getline(std::cin, s);
        std::istringstream  ssin(s);
        int  n = 0;
        if(!(ssin >> n))
        {
            break;
        }
        
        std::cout << std::endl
                  << "  cos1/sin1"
                  << std::endl
                  << "+ (cos1+cos2)/(sin2+sin3)"
                  << std::endl
                  << "+..."
                  << std::endl
                  << "+ (cos1+cos2+...+cosN)/(sinN+sin(N+1)+...+sin(2N-1)) "
                  << std::endl
                  << "= "
                  << get_arr_sum(n)
                  << std::endl;    
    }
}
Маквад
0 / 0 / 0
Регистрация: 04.01.2011
Сообщений: 8
08.02.2011, 07:43  [ТС]     Задание с синусами и косинусами #5
В чем "прелесть" вашей программы?
Предыдущий код меньше по объему и компилируемая программа получается меньше.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
08.02.2011, 07:45     Задание с синусами и косинусами #6
Цитата Сообщение от Маквад Посмотреть сообщение
В чем "прелесть" вашей программы?
Цитата Сообщение от Mr.X Посмотреть сообщение
работает на несколько порядков быстрее
Думаю, понятно.
Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,649
08.02.2011, 12:34     Задание с синусами и косинусами #7
Цитата Сообщение от Маквад Посмотреть сообщение
В чем "прелесть" вашей программы?
Предыдущий код меньше по объему и компилируемая программа получается меньше.
Ну, в C++ нет цели иметь программу покороче или исполняемый файл поменьше во что бы то ни стало.
Основное достоинство C++ - это высокий уровень абстракции, позволяющий оперировать в программе не битами и байтами, а понятиями из предметной области задачи. В моей программе, например, мы работаем непосредственно с объектами числителя и знаменателя дроби. Также в моей программе всего один цикл, имеющий понятные границы. В общем, с первого взгляда на программу понятно что и с чем она делает.
Ну и алгоритм использован более эффективный.
Согласно современным концепциям, лучшей считается та программа, которая понятнее читателю, даже если она проигрывает другой в быстродействии, объему используемой памяти, размеру кода и исполняемого файла.
Маквад
0 / 0 / 0
Регистрация: 04.01.2011
Сообщений: 8
10.02.2011, 12:57  [ТС]     Задание с синусами и косинусами #8
Цитата Сообщение от Mr.X Посмотреть сообщение
Согласно современным концепциям, лучшей считается та программа, которая понятнее читателю, даже если она проигрывает другой в быстродействии, объему используемой памяти, размеру кода и исполняемого файла.
Как то я с вами не очень согласен. Код предыдущей программы мне более понятен. Там все логично и понятно, что она делает!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.02.2011, 15:41     Задание с синусами и косинусами #9
Цитата Сообщение от Mr.X Посмотреть сообщение
В общем, с первого взгляда на программу понятно что и с чем она делает.
Ну Вам-то может и понятно, а со стороны немного пугает, если честно...

Цитата Сообщение от Mr.X Посмотреть сообщение
Согласно современным концепциям, лучшей считается та программа, которая понятнее читателю, даже если она проигрывает другой в быстродействии, объему используемой памяти, размеру кода и исполняемого файла.
Это Вы где про такие концепции услышали? По моему скромному мнению программа в первую очередь должна поставленную задачу решать. А задача может быть как "запихнуть в пару сотен байт", или "выполнить со скоростью пули", так и "написать так, чтобы новичкам понятно было, забыв при этом о компактности и скорости"...
А по поводу скорости: вот из Вашей программы для чистоты эксперимента
ввод убрал
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cmath>
#include <functional>
#include <iostream>
#include <numeric>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef double       T_real_num;
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_numerator
{    
    T_real_num  arg_val_;
    T_real_num  sum_;
    //-----------------------------------------------------------------------------------
    T_numerator() : arg_val_(1)          
    {
        sum_ = cos(arg_val_);
    }
    //-----------------------------------------------------------------------------------
    T_real_num  operator++(int)
    {
        T_real_num  sum_old(sum_);
        sum_ += cos(++arg_val_);
        return  sum_old;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_denominator
{    
    T_real_num  arg_val_;
    T_real_num  sum_;
    //-----------------------------------------------------------------------------------
    T_denominator() : arg_val_(1)          
    {
        sum_ = sin(arg_val_);
    }
    //-----------------------------------------------------------------------------------
    T_real_num  operator++(int)
    {
        T_real_num  sum_old(sum_);
        sum_ += -sin(arg_val_) + sin(arg_val_ * 2) + sin(arg_val_ * 2 + 1); 
        ++arg_val_;
        return  sum_old;
    }
};
/////////////////////////////////////////////////////////////////////////////////////////
T_real_num  get_arr_sum(int  n)
{
    T_numerator    numerator_cur;
    T_denominator  denominator_cur;
    T_real_num     sum_res = 0;
    for(int  i = 0; i < n; ++i)
    {
        sum_res += numerator_cur++ / denominator_cur++;        
    }
    return  sum_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    /*for(;;)
    {*/
        //std::cout << "N = ";
        /*
        T_str  s;
        getline(std::cin, s);
        std::istringstream  ssin(s);
        */
        int  n = 180;
        /*
        if(!(ssin >> n))
        {
            break;
        }
        */
        std::cout << "N = " << n << std::endl;
        std::cout << std::endl
                  << "  cos1/sin1"
                  << std::endl
                  << "+ (cos1+cos2)/(sin2+sin3)"
                  << std::endl
                  << "+..."
                  << std::endl
                  << "+ (cos1+cos2+...+cosN)/(sinN+sin(N+1)+...+sin(2N-1)) "
                  << std::endl
                  << "= "
                  << get_arr_sum(n)
                  << std::endl;    
    /*}*/
}
и свою сделал
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
#include <stdio.h>
#include <math.h>
    
double cos_sum(int startVal, int endVal){
    double sum = 0.0;
    while ( startVal <= endVal )
        sum += cos((double)startVal++);
    return sum;
}
 
double sin_sum(int startVal, int endVal){
    double sum = 0.0;
    while ( startVal <= endVal )
        sum += sin((double)startVal++);
    return sum;
}
 
int main(void){
    int n, i;
    double s;
    
    n = 180;
    printf("N = %d\n", n);
    
    s = 0.0;
    for ( i = 1; i <= n; ++i )
        s += cos_sum(1, i)/sin_sum(i, 2 * i - 1);
    
    printf("Result: %f\n", s);
    
    return 0;
}
а в результате:
Код
andrew@rd-andrew ~/cpp/numbers
$ g++ -o mr_x_cos_div_sin_sum mr_x_cos_div_sin_sum.cpp

andrew@rd-andrew ~/cpp/numbers
$ gcc -o cos_div_sin_sum cos_div_sin_sum.c

andrew@rd-andrew ~/cpp/numbers
$ time ./mr_x_cos_div_sin_sum
N = 180

  cos1/sin1
+ (cos1+cos2)/(sin2+sin3)
+...
+ (cos1+cos2+...+cosN)/(sinN+sin(N+1)+...+sin(2N-1))
= 197.563

real    0m0.154s
user    0m0.030s
sys     0m0.031s

andrew@rd-andrew ~/cpp/numbers
$ time ./cos_div_sin_sum
N = 180
Result: 197.562778

real    0m0.081s
user    0m0.030s
sys     0m0.031s

andrew@rd-andrew ~/cpp/numbers
$
по-моему наглядно...
Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,649
10.02.2011, 17:33     Задание с синусами и косинусами #10
Цитата Сообщение от easybudda Посмотреть сообщение
Это Вы где про такие концепции услышали?
В книжках прочитал. Они мотивируют это тем, что компьютерные время и память непрерывно и быстро дешевеют, а время программиста не меняется в цене, т.е. непрерывно и быстро дорожает по отношению к компьютерным времени и памяти. Поэтому стоит экономить не то, что сейчас стоит дешево, а завтра будет стоить очень дешево, а то, что сейчас стоит дорого, а завтра будет стоить очень дорого, т.е. время программиста, сопровождающего программу, делая ее максимально ему понятной.

Цитата Сообщение от easybudda Посмотреть сообщение
А по поводу скорости: вот из Вашей программы для чистоты эксперимента
А вы не могли бы по-русски сформулировать цель вашего эксперимента и его результаты?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.02.2011, 18:34     Задание с синусами и косинусами #11
Цитата Сообщение от Mr.X Посмотреть сообщение
Они мотивируют это тем, что компьютерные время и память непрерывно и быстро дешевеют, а время программиста не меняется в цене, т.е. непрерывно и быстро дорожает по отношению к компьютерным времени и памяти. Поэтому стоит экономить не то, что сейчас стоит дешево, а завтра будет стоить очень дешево, а то, что сейчас стоит дорого, а завтра будет стоить очень дорого, т.е. время программиста, сопровождающего программу, делая ее максимально ему понятной.
Ну в принципе звучит разумно, если бы не одна мелочь... Вместе с ростом мощности компьютеров растут и запросы пользователей. При чём не просто "вместе", а зачастую значительно опережая. А соответственно и процессор никогда не будет достаточно быстрым, и памяти в компе никогда не будет много. Хуже того! Чем примитивнее и неповоротливее будет работать программа, тем выше будут запросы к железу. Это я к тому, что какие бы навороченные железяки ни придумали, писать программы по принципу "лишь бы было всем понятно" как-то всё-таки не правильно. Ну а сопровождение программ - это отдельная песня. Есть документация, комментарии, стиль кода, снимающий большинство вопросов при внимательном ознакомлении, стандарты именования функций/переменных и прочее, прочее... В любом случае, писать программу так, чтобы каждый, кому не лень, мог в ней что-нибудь "поправить" не особо вникая в суть написанного, я бы не стал. Всё-таки в первую очередь программа должна хорошо работать, а не легко и ненапряжно сопровождаться...

Цитата Сообщение от Mr.X Посмотреть сообщение
А вы не могли бы по-русски сформулировать цель вашего эксперимента и его результаты?
Пытался для себя понять - стоит ли городить такой огород, если програмка в три раза короче делает точно то же самое, да ещё и почти в два раза быстрее, как оказалось...
Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,649
10.02.2011, 20:27     Задание с синусами и косинусами #12
Цитата Сообщение от easybudda Посмотреть сообщение
в первую очередь программа должна хорошо работать, а не легко и ненапряжно сопровождаться...
Ну, трудно и напряженно сопровождаемая программа даже плохо долго не проработает.

Добавлено через 18 минут
easybudda, на моем компьютере ваша экспериментальная программа для n = 40000 считает 68 секунд, а моя мгновенно.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
11.02.2011, 08:56     Задание с синусами и косинусами #13
Давайте закончим беседовать насчет быстродействия, простоты, крутизны и т.п.
Вот переделаная программа из сообщения №2 этой темы.
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
#include <iostream>
#include <math.h>
 
using namespace std;
 
int main()
{
    int n,i,j;
    double s=0,sc=0,ss=0,jj; //s-сумма, sc-сумма сосинусов, ss-сумма синусов
 
    cout << "Vvedite N ";
    cin>> n;
    
    for (j=1; j<=n; j++)
    {
        jj = (double)j;
        
        sc += cos(jj);
        
        ss += sin(2*jj-2) + sin(2*jj-1) - sin(jj-1);
 
        s=s+sc/ss;
    }
    
    cout<<"s= "<<s<<endl;
    return 0;
}
Строку
C++
1
ss += sin(2*jj-2) + sin(2*jj-1) - sin(jj-1);
содрал с кода Mr.X.
А вообще идея с синусами такая: просто находим чем знаменатель от n-ого слагаемого отличается от знаменателя (n-1)-ого слагаемого. Потом проверям для первых слагаемых (обязательно) и делаем соответсвующие выводы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2011, 09:13     Задание с синусами и косинусами
Еще ссылки по теме:

Задание C++
Как в С++ работать с синусами, косинусами? C++
C++ задание

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

Или воспользуйтесь поиском по форуму:
Digit@ll
Brainsbreaker
 Аватар для Digit@ll
832 / 343 / 27
Регистрация: 01.02.2011
Сообщений: 1,483
11.02.2011, 09:13     Задание с синусами и косинусами #14
Евгений М., int i лишнее
Yandex
Объявления
11.02.2011, 09:13     Задание с синусами и косинусами
Ответ Создать тему
Опции темы

Текущее время: 06:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru