Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Математические функции, Решение выражений 
:(
    Опции темы
OuterHeaven
  Дата 14.12.2008, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Требуется решить выражение типа:
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... и так далее. Как правильно записать выражение? Помогите плиз.

Это сообщение отредактировал(а) OuterHeaven - 14.12.2008, 02:21
PM MAIL   Вверх
Dmi3ev
Дата 14.12.2008, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

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

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


--------------------

PM MAIL   Вверх
OuterHeaven
Дата 14.12.2008, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



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

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


Это сообщение отредактировал(а) OuterHeaven - 14.12.2008, 02:21
PM MAIL   Вверх
Dmi3ev
Дата 14.12.2008, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Код

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, во-первых принимает два параметра, а во-вторых она возвращает дробную часть числа )))


--------------------

PM MAIL   Вверх
Ellmi
Дата 14.12.2008, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



так ведь у 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;


PM MAIL   Вверх
Dmi3ev
Дата 14.12.2008, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



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


--------------------

PM MAIL   Вверх
Ellmi
Дата 14.12.2008, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Цитата

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


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

Добавлено через 1 минуту и 22 секунды
ага,  с int я согласна, если не обязательно мат функции использовать
PM MAIL   Вверх
OuterHeaven
Дата 14.12.2008, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Цитата(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, 03:26
PM MAIL   Вверх
OuterHeaven
Дата 14.12.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Кто-нибудь мне поможет? Народ!!! smile  smile  smile  smile  smile  smile  smile  smile 
PM MAIL   Вверх
Remiznik
Дата 14.12.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



Код

#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;
}


попробуй так ... но я не уверен что преоброзование будет коректный результат выдавать !
PM MAIL   Вверх
OuterHeaven
Дата 15.12.2008, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



А по какой причине он может выдавать неверный результат???
PM MAIL   Вверх
Ellmi
Дата 15.12.2008, 19:34 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Я местами дробную и целую части перепутала 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 */

PM MAIL   Вверх
Remiznik
Дата 16.12.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



Цитата(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 */

а у меня вот вопрос )
почему мы используем только целу часть ? нельзя разве использовать всё число ? 
PM MAIL   Вверх
OuterHeaven
Дата 16.12.2008, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



ОГРОМНОЕ СПАСИБО ТЕБЕ Ellmi 
Цитата

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

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

Это сообщение отредактировал(а) OuterHeaven - 16.12.2008, 02:09
PM MAIL   Вверх
OuterHeaven
  Дата 18.12.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Народ, ни могу понять. Раньше программа работала.
Код

#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)'
PM MAIL   Вверх
OuterHeaven
Дата 18.12.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Кто-нибудь объясните пожалуйста в чем проблема.
PM MAIL   Вверх
Remiznik
Дата 18.12.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



у тебя z - float используй double  и всё должно работать !
PM MAIL   Вверх
OuterHeaven
Дата 21.12.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Пробовал не работает. smile 
PM MAIL   Вверх
Dmi3ev
Дата 21.12.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Код

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 наверное, что означает -бесконечность, так?( я просто не пробовал запускать) так что все работает))) получил, что хотел)))


--------------------

PM MAIL   Вверх
OuterHeaven
Дата 21.12.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



До этого уровня я еще не добрался, я сперва хочу заставить эту прогу работать. А уже потом вносить изменения. По поводу корня пока еще не делал, но будет. Не могу понять что ты делал там выше. Покажи на примере кода.
PM MAIL   Вверх
Dmi3ev
Дата 22.12.2008, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



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

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

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


--------------------

PM MAIL   Вверх
OuterHeaven
Дата 22.12.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Попробовал заменить на 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;
}

PM MAIL   Вверх
Remiznik
Дата 22.12.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



короче нужно составить ОДЗ ... я думаю так .... и для начала в ручную всё посчитать )))
PM MAIL   Вверх
OuterHeaven
  Дата 22.12.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) OuterHeaven - 22.12.2008, 20:08
PM MAIL   Вверх
OuterHeaven
Дата 2.1.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Тут вообще есть кто живой, и кто может помочь? Люди...
PM MAIL   Вверх
OuterHeaven
  Дата 17.2.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Вот что я смог сделать, помогите пожалуйста довести до ума.

При решении выдает ошибку. Проблема при выведении целой части. Выдает примерно такое 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;
}

PM MAIL   Вверх
Dmi3ev
Дата 18.2.2009, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

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 любимая.
попробуй, а потом поговорим о том, как это решить... 

Это сообщение отредактировал(а) Dmi3ev - 18.2.2009, 18:14


--------------------

PM MAIL   Вверх
bsa
Дата 18.2.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Начнем с ограничений (школьный уровень):
α не может быть равна π/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, ...)
PM   Вверх
Dmi3ev
Дата 18.2.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



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


--------------------

PM MAIL   Вверх
OuterHeaven
Дата 18.2.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Так, я вообще запутался... smile . Гляжу и нифига не понимаю. Пробовал я double...  Хорошо, тогда я так понимаю, тут нужно еще и условие для проверки на возведение в отрицательную степень, которой быть не должно. Верно?
PM MAIL   Вверх
bsa
Дата 19.2.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



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

причем тут double? и отрицательная степень?
Ты вообще читать умеешь? Тебе дана область, в которой указанное тобой выражение определено. При попытке выйти из нее ты должен писать об ошибке. Что сложно проверить исходные данные на вхождение в эту область? Или ты не понял, что тебе написали?
PM   Вверх
OuterHeaven
  Дата 21.2.2009, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Все! Написал! Начал писать программу заново. И все получилось. 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;
}

PM MAIL   Вверх
bsa
Дата 23.2.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




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

PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0787 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.