Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Математические функции


Автор: OuterHeaven 14.12.2008, 01:45
Требуется решить выражение типа:
user posted image

Где:
[x] – целая часть числа

Для программирования использую Microsoft Visual Studio C++ 2008 (Express Edition)

Вот код написанной программы:
Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

int main()
{
    float x, y;
    float z;
    
    cout << "Vvedite x, y:\n";
    
    cout << "x: ";

    cin >> x;

    cout << "y: ";

    cin >> y;

    z = tan(x/2) + sqrt((1-cos(x))/(1+cos(x))) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x)) – pow(modf(sin(x+y)*sin(x))),cos(y);

    cout << "\nz = " << z;

    getch();
    return 0;
}


Компилятор выдает ошибку. Я неправильно записал выражение начиная с функции pow... и так далее. Как правильно записать выражение? Помогите плиз.

Автор: Dmi3ev 14.12.2008, 02:13
Цитата

pow(modf(sin(x+y)*sin(x))),cos(y)

не разбирался в остальном но здесь скобки расставлены неверно, надо так:
pow(modf(sin(x+y)*sin(x)), cos(y))

Автор: OuterHeaven 14.12.2008, 02:18
Все равно выдает ошибку
error C2661: modf: нет перегруженной функции, принимающей 1 аргументов

Что она означает smile 

Автор: Dmi3ev 14.12.2008, 02:30
Код

z = tan(x/2) + sqrt((1-cos(x))/(1+cos(x))) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x))-pow(int(sin(x+y)*sin(x)),cos(y));


Добавлено через 2 минуты и 14 секунд
modf, во-первых принимает два параметра, а во-вторых она возвращает дробную часть числа )))

Автор: Ellmi 14.12.2008, 02:58
так ведь у modf 2 параметра:    double modf(double x, double *intptr);

Код

   double *a;
   modf( sin(x+y)*sin(x), a );
   z = tan(x/2) + sqrt( (1-cos(x)) / (1+cos(x)) ) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x)) - pow(*a , cos(y));
   cout << "\nz = " << z;


Автор: Dmi3ev 14.12.2008, 03:03
Ellmi, это да, я просто сказал про ситуацию, в которой OuterHeaven применял. По-моему int здесь проще будет использовать. 

Автор: Ellmi 14.12.2008, 03:05
Цитата

modf, во-первых принимает два параметра, а во-вторых она возвращает дробную часть числа )))


упс, всё уже сказано smile

Добавлено через 1 минуту и 22 секунды
ага,  с int я согласна, если не обязательно мат функции использовать

Автор: OuterHeaven 14.12.2008, 03:23
Цитата(Ellmi @  14.12.2008,  02:58 Найти цитируемый пост)
  double *a;
   modf( sin(x+y)*sin(x), a );
   z = tan(x/2) + sqrt( (1-cos(x)) / (1+cos(x)) ) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x)) - pow(*a , cos(y));
   cout << "\nz = " << z;


Не совсем понял, что означает этот код... Да и при попытке его воткнуть выдает снова ошибку. Что-то тут явно не совпадает с выражением вначале темы... Откуда "а" взявлось? Прокомментируйте плиз. Я только неделю занимаюсь этим С++. 

Сделал так:
Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

int main()
{
    float x, y;
    float z;
    
    cout << "Vvedite x, y:\n";
    
    cout << "x: ";

    cin >> x;

    cout << "y: ";

    cin >> y;

    double *a;
    
    modf( sin(x+y)*sin(x), a );
    
    z = tan(x/2) + sqrt( (1-cos(x)) / (1+cos(x)) ) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x)) - pow(*a , cos(y));

    cout << "\nz = " << z;

    getch();

    return 0;
}

Автор: OuterHeaven 14.12.2008, 22:15
Кто-нибудь мне поможет? Народ!!! smile  smile  smile  smile  smile  smile  smile  smile 

Автор: Remiznik 14.12.2008, 22:31
Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
    float x, y;
    float z;
    
    cout << "Vvedite x, y:\n";
    
    cout << "x: ";
    cin >> x;
    cout << "y: ";
    cin >> y;
    double a;
    
    modf( sin(x+y)*sin(x), &a );
    
    z = tan(x/2) + sqrt( (1-cos(x)) / (1+cos(x)) ) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x)) - pow(a,(double)cos(y));
    cout << "\nz = " << z;
    getch();
    return 0;
}


попробуй так ... но я не уверен что преоброзование будет коректный результат выдавать !

Автор: OuterHeaven 15.12.2008, 01:13
А по какой причине он может выдавать неверный результат???

Автор: Ellmi 15.12.2008, 19:34
Я местами дробную и целую части перепутала smile 
Исправила, у меня работает:
Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;

int main()
{
   float x, y;
   float z;

   cout << "Vvedite x, y:\n";

   cout << "x: ";

   cin >> x;

   cout << "y: ";

   cin >> y;


  double a,n;

  n = modf( sin(x+y)*sin(x), &a );
  cout<<endl<<sin(x+y)*sin(x) ;
  cout<<endl<<"a=" << a; //целая часть
  cout<<endl<<"n=" << n; // дробная часть

  z = tan(x/2) + sqrt( (1-cos(x)) / (1+cos(x)) ) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x)) - pow(a , cos(y));
  cout << "\nz = " << z;

    getch();
    return 0;
}



Описание функци modf

#include 
double modf(x,intptr);
double x; значение с плавающей точкой
double *intptr; указатель на хранение целой части

Функция modf разрывает значение с плавающей точкой x на
дробную и целую части. Возвращается знаковая дробная часть x. Це-
лая часть хранится в intptr как значение с плавающей точкой.

Функция modf возвращает знаковую дробную часть x. 

Пример: 
double x,y,n;
x = -14.87654321;
y = modf(x,&n); /* y = -0.87654321, n = -14.0 */

Автор: Remiznik 16.12.2008, 00:08
Цитата(Ellmi @ 15.12.2008,  19:34)
#include 
double modf(x,intptr);
double x; значение с плавающей точкой
double *intptr; указатель на хранение целой части

Функция modf разрывает значение с плавающей точкой x на
дробную и целую части. Возвращается знаковая дробная часть x. Це-
лая часть хранится в intptr как значение с плавающей точкой.

Функция modf возвращает знаковую дробную часть x. 

Пример: 
double x,y,n;
x = -14.87654321;
y = modf(x,&n); /* y = -0.87654321, n = -14.0 */

а у меня вот вопрос )
почему мы используем только целу часть ? нельзя разве использовать всё число ? 

Автор: OuterHeaven 16.12.2008, 02:08
ОГРОМНОЕ СПАСИБО ТЕБЕ Ellmi 
Цитата

а у меня вот вопрос )
почему мы используем только целу часть ? нельзя разве использовать всё число ? 

Remiznik, я учусь на факультете "Информатика и прикладная математика". Вот нас и заставили писать программу именно с таким условием. У меня еще три задачи впереди... Вторая задача такого же типа, но я надеюсь справиться сам. Ну, а если не смогу, то буду снова просить помощи у Вас.

Автор: OuterHeaven 18.12.2008, 12:49
Народ, ни могу понять. Раньше программа работала.
Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
   float x, y;
   float z;
   cout << "Vvedite x, y:\n";
   cout << "x: ";
   cin >> x;
   cout << "y: ";
   cin >> y;
  double a,n;
  n = modf( sin(x+y)*sin(x), &a );
  cout<<endl<<sin(x+y)*sin(x) ;
  cout<<endl<<"a=" << a; //целая часть
  cout<<endl<<"n=" << n; // дробная часть
  z = tan(x/2) + sqrt( (1-cos(x)) / (1+cos(x)) ) - (1-cos(x))/sin(x) + sin(x)/(1+cos(x)) - pow(a , cos(y));
  cout << "\nz = " << z;
    getch();
    return 0;
}


А сейчас, вдруг ни с того ни с сего стала выдавать ошибки:
1>c:\users\ahilles\documents\visual studio 2008\projects\задача №7\задача №7\задача №7.cpp(35) : error C2666: pow: для 6 перегрузок есть подобные преобразования
1>        c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): может быть 'long double pow(long double,int)'
1>        c:\program files\microsoft visual studio 9.0\vc\include\math.h(573): или       'long double pow(long double,long double)'
1>        c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): или       'float pow(float,int)'
1>        c:\program files\microsoft visual studio 9.0\vc\include\math.h(525): или       'float pow(float,float)'
1>        c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): или       'double pow(double,int)'
1>        c:\program files\microsoft visual studio 9.0\vc\include\math.h(123): или       'double pow(double,double)'
1>        при попытке сопоставить список аргументов '(double, float)'

Автор: OuterHeaven 18.12.2008, 13:30
Кто-нибудь объясните пожалуйста в чем проблема.

Автор: Remiznik 18.12.2008, 19:30
у тебя z - float используй double  и всё должно работать !

Автор: OuterHeaven 21.12.2008, 18:12
Пробовал не работает. smile 

Автор: Dmi3ev 21.12.2008, 18:38
Код

pow(a , cos(y));

тут надо разобраться в ситуации, а не в функции!!!  smile 
у тебя все работает, сначала я подправил, потом другие, все фурычит!!! только одно но  smile 
вот это выражение, которое я написал, очень интересно
a=[sin(x+y)*sin(x)] (целая часть этого выражения), дело в том, что это выражение достаточно специфично.
для того, чтобы это дело было отлично от 0, необходимо, чтобы sin(x)=+-1 и одновременно sin(x+y)=+-1, тогда a будет отлично от нуля, в остальных случаях а=0.
вот теперь и подумаем об этих случаях:  smile 
а=0
cos(y)<0
Код

pow(a , cos(y));

попробуй, взведи 0 в отрицательную степень 0^(-1)=0/0  smile 
Думать надо...  smile

Добавлено через 1 минуту и 38 секунд
и еще одно, ты, наверное думаешь, что угол у тебя в градусах  smile а он не в градусах  smile  совсем  smile

Добавлено через 5 минут и 46 секунд
Цитата

попробуй, взведи 0 в отрицательную степень 0^(-1)=0/0

когда твоя прога пытается сделать на экране появляется -inf наверное, что означает -бесконечность, так?( я просто не пробовал запускать) так что все работает))) получил, что хотел)))

Автор: OuterHeaven 21.12.2008, 19:21
До этого уровня я еще не добрался, я сперва хочу заставить эту прогу работать. А уже потом вносить изменения. По поводу корня пока еще не делал, но будет. Не могу понять что ты делал там выше. Покажи на примере кода.

Автор: Dmi3ev 22.12.2008, 01:25
код по идее рабочий, на первый взгляд, вот попробуйте скопировать его и откомпилить, что за ошибки??? еще раз проделайте это и выкладывайте сюда результаты.
Цитата

у тебя z - float используй double  и всё должно работать ! 

это не суть важно, но все же поменяйте все на double...
делайте, результаты сюда...

Автор: OuterHeaven 22.12.2008, 16:54
Попробовал заменить на double та же ошибка. Сделал кое-какие изменения в коде, вот посмотрите сейчас все работает, но правильно ли?
Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
   float x, y;

   float z;                                                    //Замена в этом месте "Float" на "Double" ничего не дала, поэтому оставил все как есть.

   cout << "Enter x, y:\n";

   cout << "x: ";

   cin >> x;

   cout << "y: ";

   cin >> y;

    float a,n;                                               //Заменил тут "Double" на "Float"

    n = modf( sin(x+y)*sin(x), &a );

    cout << endl << sin(x+y)*sin(x);

    cout << endl << "a=" << a;

    cout << endl << "n=" << n;

  z = tan(x/2)+sqrt((1-cos(x))/(1+cos(x)))-(1-cos(x))/sin(x)+sin(x)/(1+cos(x))-pow(a,cos(y));

  cout << "\nz = " << z << endl;

  cout << "\nPress any key to exit...";

  getch();

  return 0;
}

Автор: Remiznik 22.12.2008, 18:01
короче нужно составить ОДЗ ... я думаю так .... и для начала в ручную всё посчитать )))

Автор: OuterHeaven 22.12.2008, 20:07
В общем вот моя задача: Необходимо решить выражение (оно вначале темы), без преобразований. Во время выполнения, поставленной задачи предусмотреть все ошибки времени выполнения (деление на 0 и корень из отрицательного числа). Я в С/С++ еще мало, что понимаю. Давайте вместе попробуем решить данную задачу.

Я полагаю так: надо разбить это сложное выражение на части и вести вычисления по каждой части, аккуратно проверяя - можно ли выполнить те или иные действия.
Помогите пожалуйста с проблемой...

Автор: OuterHeaven 2.1.2009, 23:49
Тут вообще есть кто живой, и кто может помочь? Люди...

Автор: OuterHeaven 17.2.2009, 22:06
Вот что я смог сделать, помогите пожалуйста довести до ума.

При решении выдает ошибку. Проблема при выведении целой части. Выдает примерно такое 1.#inf. Нифига не пойму.
Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
    setlocale(0,"");                                //Настраиваем кодировку под кириллицу
    float x, y;                                        //Задаем переменные для ввода в выражение
    float a, b, c, d, e, f, g, h, res;                    //Объявляем переменные для разбивки выражения на 5 частей и общего результата
//-----------------------------------------------------------------------------------------------------------------
    cout << "Введите данные:\n";                    //Выводим на экран предложение о вводе данных
    cout << "x -> ";                                //Выводим на экран предложение о вводе x
    cin >> x;                                        //Считываем x из потока
    cout << "y -> ";
    cin >> y;
    a = tan(x/2);                                    //Выполняем действие
    cout << "\nПервая часть = " << a << endl;        //Выводим результат по первой части
//-----------------------------------------------------------------------------------------------------------------
        if ((1 + cos(x)) != 0) 
        
            b = sqrt(1 - cos(x)) / (1 + cos(x));
        
        else cout << "Внимание! Во второй части выражения возникла ошибка деления на 0\nи дальнейшее выполнение программы невозможно!";
        
            if (sqrt (b) >= 0)
            
                c = sqrt (b);
            
            else cout << "Внимание! Во второй части выражения возникла ошибка извлечения корня из отрицательного числа\nи дальнейшее выполнение программы невозможно!";
            cout << "Вторая часть = " << c << endl;
            
                if (sin(x) != 0)

                    d = (1-cos(x))/sin(x);

                else cout << "Внимание! В третьей части выражения возникла ошибка деления на нуль\nи дальнейшее выполнение программы невозможно!";
        
                cout << "Третья часть = " << d << endl;

                if (1+cos(x) != 0)

                    e = sin(x)/(1 + cos(x));

                else cout << "Внимание! В четвертой части выражения возникла ошибка деления на нуль\nи дальнейшее выполнение программы невозможно!";

                cout << "Четвертая часть = " << e << endl;

//Выводим целую часть числа----------------------------------------------------------------------------------------
                 f = modf(sin(x+y)*sin(x), &h);
                 g = pow(h,cos(y));
                 cout << "Пятая часть = " << g << endl;

//-----------------------------------------------------------------------------------------------------------------
        
    cout << "\nДля выхода из программы нажмите любую клавишу...";

  getch();

  return 0;
}

Автор: Dmi3ev 18.2.2009, 01:17
Цитата

1.#inf. Нифига не пойму.

еще раз попытаюсь объяснить
вот эта шняга
Цитата

f = modf(sin(x+y)*sin(x), &h);

будет очень часто давать 0, т. к. -1<=sin(x+y)<=1, -1<=sinx<=1, если не ( sin(x+y)=1(-1) && sinx=1(-1), то выражение равно 0
поэтому тут ты 0 возводишь в степень, поэтому важно какая она
Цитата

g = pow(h,cos(y));

вот эта шняга заработает или нет, зависит от cos(y), если он положителен, то заработает, если нет, то будет выдавать ошибку
чтобы ты мне поверил, введи x и y меньше 0.5п и больше 0п, все будет работать, а потом введи x=0.6п и y=0.6п, те от 0 до п, будет твоя inf любимая.
попробуй, а потом поговорим о том, как это решить... 

Автор: bsa 18.2.2009, 17:41
Начнем с ограничений (школьный уровень):
α не может быть равна π/2+nπ, где n ∈ ℤ (tg α = sin α/cos α => cos α должен быть не равен 0)
α не может быть равна 3π/2 + 2nπ, где n ∈ ℤ (1/(1 + cos α) => cos α должен быть не равен -1)
α не может быть равна 0+nπ, где n ∈ ℤ (1/sin α => sin α должен быть не равен 0)
α+β не должно равняться 0+nπ, когда (-π+2nπ) ≤ β ≤ (2π + 2nπ), где n ∈ ℤ

под множеством ℤ понимается множество целых чисел (..., -2, -1, 0, 1, 2, ...)

Автор: Dmi3ev 18.2.2009, 18:18
bsa, я так понял, что этому человек просто надо поговорить, потому что я ему это все объяснял... 
теперь ты объясняешь это же. Надеюсь, теперь он поверит в то, что это все из-за самого выражения, что оно является причиной inf в ответе...
Ты - эксперт, думаю должен послушать...  smile 

Автор: OuterHeaven 18.2.2009, 19:31
Так, я вообще запутался... smile . Гляжу и нифига не понимаю. Пробовал я double...  Хорошо, тогда я так понимаю, тут нужно еще и условие для проверки на возведение в отрицательную степень, которой быть не должно. Верно?

Автор: bsa 19.2.2009, 12:07
Цитата(OuterHeaven @ 18.2.2009,  19:31)
Так, я вообще запутался... smile . Гляжу и нифига не понимаю. Пробовал я double...  Хорошо, тогда я так понимаю, тут нужно еще и условие для проверки на возведение в отрицательную степень, которой быть не должно. Верно?

причем тут double? и отрицательная степень?
Ты вообще читать умеешь? Тебе дана область, в которой указанное тобой выражение определено. При попытке выйти из нее ты должен писать об ошибке. Что сложно проверить исходные данные на вхождение в эту область? Или ты не понял, что тебе написали?

Автор: OuterHeaven 21.2.2009, 04:03
Все! Написал! Начал писать программу заново. И все получилось. smile

Код

#include <stdafx.h>
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
    setlocale(0,"");                            //Корректно отображаем кириллицу
/*Объявляем переменные===========================================================================================================*/
    float x, y, z;                                //Переменные для ввода данных
    float Pi = 3.1415926;                        //Выводим постоянную Пи
    float a, b, c, d, e, f, g, h, i;            //Делим выражение на части
    float res;                                    //Вывод результата
    double l;                                    //Выделяем целую часть выражения

/*Вводим данные==================================================================================================================*/
    cout << "Введите данные:\n";                //Выводим приглашение о вводе данных
    cout << "x => ";                            //Вводим x
    cin >> x;                                    //Читаем x из потока
    cout << "y => ";                            //Вводим y
    cin >> y;                                    //Читаем y из потока
    cout << "z => ";                            //Вводим z
    cin >> z;                                    //Читаем z из потока
    
/*Выполняем действия=============================================================================================================*/
    a = (1/tan(x));
    if ((tan(x)) != 0)
    b = (1/tan(x));
    else {cout << "Первая часть: ошибка деления на 0!\n"; cout << "\nДля завершения работы программы нажмите любую клавишу..."; getch(); return 0;}
    
    c = (1/tan(y));
    if ((tan(y)) != 0)
    d = (1/tan(y));
    else {cout << "Вторая часть: ошибка деления на 0!\n"; cout << "\nДля завершения работы программы нажмите любую клавишу..."; getch(); return 0;} 
    
    e = -(sin(x - y))/((sin(x))*(sin(y)));
    if ((sin(x))*(sin(y)) != 0)
    f = -(sin(x - y))/((sin(x))*(sin(y)));
    else {cout << "Третья часть: ошибка деления на 0!\n"; cout << "\nДля завершения работы программы нажмите любую клавишу..."; getch(); return 0;}
    
    g = (tan((x + y)/Pi))/(cos(x*cos(y*sin(z))));
    if ((cos(x*cos(y*sin(z)))) != 0)
    h = (tan((x + y)/Pi))/(cos(x*cos(y*sin(z))));
    else {cout << "Четвертая часть: ошибка деления на 0!\n"; cout << "\nДля завершения работы программы нажмите любую клавишу..."; getch(); return 0;}
    
    i = modf(tan(x)*sin(y)*cos(z), &l);

/*Выводим результат==============================================================================================================*/
    res = b + d + f - h - float(l);                //Считаем результат. Производим преобразование целой части к типу float (float(l))
    cout << "Результат: " << res << endl;        //Выводим результат
    cout << "\nДля завершения работы программы нажмите любую клавишу...";

/*Делаем так чтобы результат не исчез с экрана===================================================================================*/
    getch();
    return 0;
}

Автор: bsa 23.2.2009, 22:05

M
bsa
OuterHeaven, если ответ на вопрос получен - пометь тему решенной.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)