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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Маквад
0 / 0 / 0
Регистрация: 04.01.2011
Сообщений: 8
#1

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

07.02.2011, 05:53. Просмотров 1935. Ответов 13
Метки нет (Все метки)

Две недели назад я выкладывал эту задачу на форуме. Мне помогли в ее решении, но решили неправильно. Сама задача такова:
Вычислить 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++
Доброго времени суток. Задали задачи на С++. Сам на С++ никогда не программировал (только Паскаль и Бейсик). Одна из задач: &quot;Дано...

Как в С++ работать с синусами, косинусами? - C++
Как в С++ работать с синусами, косинусами?? Допустим передать в функцию радианы(или градусы?), а там считать синус косинус? Что...

Задание на массив и задание на матрицу. - C++
1.Удалить из массива A(n) нулевые элементы, передвигая на их место следующие элементы, не нарушая порядка их следования. В результате...

Работа с углами, синусами и косинусами в 1с - 1С
Добрый день. мне нужно рисовать стрелочки на концах рисунков таб.дока типа прямая. и возникла проблемма , в 1с синус и косинас...

Интеграл с синусами и косинусами четвёртой степени - Математический анализ
Вообще, требуется найти площадь плоской фигуры, заданной неявно: ...

Выражение с косинусами и корнями - Математика
корень из 108 cos^2 п/12-корень из 27

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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
В чем "прелесть" вашей программы?
Предыдущий код меньше по объему и компилируемая программа получается меньше.
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
08.02.2011, 07:45 #6
Цитата Сообщение от Маквад Посмотреть сообщение
В чем "прелесть" вашей программы?
Цитата Сообщение от Mr.X Посмотреть сообщение
работает на несколько порядков быстрее
Думаю, понятно.
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
08.02.2011, 12:34 #7
Цитата Сообщение от Маквад Посмотреть сообщение
В чем "прелесть" вашей программы?
Предыдущий код меньше по объему и компилируемая программа получается меньше.
Ну, в C++ нет цели иметь программу покороче или исполняемый файл поменьше во что бы то ни стало.
Основное достоинство C++ - это высокий уровень абстракции, позволяющий оперировать в программе не битами и байтами, а понятиями из предметной области задачи. В моей программе, например, мы работаем непосредственно с объектами числителя и знаменателя дроби. Также в моей программе всего один цикл, имеющий понятные границы. В общем, с первого взгляда на программу понятно что и с чем она делает.
Ну и алгоритм использован более эффективный.
Согласно современным концепциям, лучшей считается та программа, которая понятнее читателю, даже если она проигрывает другой в быстродействии, объему используемой памяти, размеру кода и исполняемого файла.
Маквад
0 / 0 / 0
Регистрация: 04.01.2011
Сообщений: 8
10.02.2011, 12:57  [ТС] #8
Цитата Сообщение от Mr.X Посмотреть сообщение
Согласно современным концепциям, лучшей считается та программа, которая понятнее читателю, даже если она проигрывает другой в быстродействии, объему используемой памяти, размеру кода и исполняемого файла.
Как то я с вами не очень согласен. Код предыдущей программы мне более понятен. Там все логично и понятно, что она делает!
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
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
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
10.02.2011, 17:33 #10
Цитата Сообщение от easybudda Посмотреть сообщение
Это Вы где про такие концепции услышали?
В книжках прочитал. Они мотивируют это тем, что компьютерные время и память непрерывно и быстро дешевеют, а время программиста не меняется в цене, т.е. непрерывно и быстро дорожает по отношению к компьютерным времени и памяти. Поэтому стоит экономить не то, что сейчас стоит дешево, а завтра будет стоить очень дешево, а то, что сейчас стоит дорого, а завтра будет стоить очень дорого, т.е. время программиста, сопровождающего программу, делая ее максимально ему понятной.

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

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

Добавлено через 18 минут
easybudda, на моем компьютере ваша экспериментальная программа для n = 40000 считает 68 секунд, а моя мгновенно.
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 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)-ого слагаемого. Потом проверям для первых слагаемых (обязательно) и делаем соответсвующие выводы.
Digit@ll
Brainsbreaker
881 / 359 / 30
Регистрация: 01.02.2011
Сообщений: 1,576
11.02.2011, 09:13 #14
Евгений М., int i лишнее
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2011, 09:13
Привет! Вот еще темы с ответами:

Фаза между 2 синусами - Математика
Проводился опыт по получении АЧХ гироскопа на поворотном столе, для чего поворотному столу задали поворот на определённый угол(+-...

Дифференциальное уравнение со страшными синусами - Дифференциальные уравнения
не знаю как решать( помогите пожалуйста sin(2y)dx=({sin}^{2}(2y)-2{sin}^{2}(y)+2x)dy

Доказать справедливость равенства с косинусами - Алгебра
Всем привет. Есть задание: Доказать справедливость равенства \cos{\frac{\pi}{7}}\cdot\cos{\frac{4\pi}{7}}\cdot\cos{\frac{5\pi}{7}}...

Сумма членов бесконечного ряда с косинусами - Pascal ABC
Объясните пожалуйскта как сделать с косинусами программу. Вот задание: Вычислить сумму членов бесконечного ряда по формуле: ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.02.2011, 09:13
Ответ Создать тему
Опции темы

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