Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2020, 13:14   #1
Georgi Judajev
 
Регистрация: 13.02.2020
Сообщений: 4
Вопрос табулирование функции

Доброго времени суток!

Имеется задача на табулирование функции. y = f(x)

Дано начальное значение аргумента х - А , шаг - Н и низший предел функции y - YM.

Условие: Н > 0.

Значение функции у вычисляется в точках :

А + Н
А + 2Н
А + 3Н
...
пока действует условие,что значение функции у > УМ, но не более 15 точек.

Функция: y=(1/cosx)/(sqrt(1+sinx^2))

Все начальные данные реальные числа и вводятся с клавиатуры,если получается ответ в виде комплексного ,то выводится не его место - "Комплексное число"

Код я написал,но вычисления неправильные.Гляньте ,пожалуйста ,сперва изначальную работу кода(результаты),может я ошибаюсь и всё правильно,но вряд ли(если я ещё не поехал и не забыл математику,что впрочем возможно).Mожет кто-то сумеет проконсультировать и найти ошибку:

Код:
#include <stdio.h>
#include <math.h>
#define MASS 15

int main (void)
{
float A, H, YM; // Условия функции
float X[MASS], Y[MASS]; // Массив с ответами
int i; // Счетчик массивов

printf ("Здравствуйте!\n\nЭта программа вычисляет значение функции до 15 точек, ") ;
printf ("с заданными условиями пользователя .\n");
printf ("\nf(x) = [1/cos(x)]/sqrt(1+sin(pow(x, 2)))");

// 1. Часть
// Введение начальных данных

i = 0;
printf("\nВведите начальное значение аргумента х - А = ");
scanf("%f", &A);
do
{
printf("\nВведите шаг H = ");
scanf("%f", &H);
if (H <= 0)
{
printf("Ошибка,шаг не может быть меньше или равным нулю");
}
}
while(H <= 0);

printf ("\nВведите низший предел - YM = ");
scanf ("%f", &YM);
printf ("\n A = %.3f \n", A);
printf (" H = %.3f \n", H);
printf (" YM = %.3f \n", YM);


// 2. Часть
// Нахождение ответа


do
{
if (((1+sin(pow(X[i], 2)))) > 0)
{
Y[i] = (1/cos(X[i]));
Y[i] = Y[i]/(sqrt(1+sin(pow(X[i], 2)))); // Формула
}
else
{
Y[i] = 0; // Если отсутствует вещественный ответ,ставим на его место нуль.
}
if (i < (MASS - 1)) // Если в массиве есть ещё место,вычисляем следующие значение Х
{
X[i+1] = X[i] + (i+1)*H;
}
i++;
}
while (i < MASS);

// 3. Часть
// Выводим ответ

i = 0;
printf("\n X | Y \n");
printf(" --------+------- \n");

while( i < MASS && Y[i] > YM)
{
if (((1+sin(pow(X[i], 2)))) < 0)
{
printf(" %5.3f | Комплексное число\n", X[i]);
}
else if (((1+sin(pow(X[i], 2)))) == 0)
{
printf(" %5.3f | Отсутствует\n", X[i]);
}
else
{
printf(" %5.3f | %f\n", X[i], Y[i]);
}
i++;
}

return 0;
}
Georgi Judajev вне форума Ответить с цитированием
Старый 13.02.2020, 14:17   #2
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

А можно фото исходного задания и еще тестовый набор с результатами как должно быть)

сдается мне шаг вводится только 1 раз, а не каждый раз в цикле
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 13.02.2020, 22:49   #3
Georgi Judajev
 
Регистрация: 13.02.2020
Сообщений: 4
По умолчанию

Добрый вечер!

Исходное задание переведено с эстонского на русский в точности
Изображения
Тип файла: jpg B3876FBD-D827-4F5B-92DE-4B5BB27AA949.jpg (61.8 Кб, 1 просмотров)
Georgi Judajev вне форума Ответить с цитированием
Старый 14.02.2020, 01:17   #4
Georgi Judajev
 
Регистрация: 13.02.2020
Сообщений: 4
По умолчанию

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

Во второй уже финальные результаты,но я изменил формулу,так как похоже программа выдает мои подсчёты в радианах...

printf(" %5.3f | %5.3f | %5.3f | %5.3f\n", X[i], cos(X[i]), (1/cos(X[i])), (sqrt(1+sin(pow(X[i], 2)))));
Y[i] = (1/cos(X[i] / 180 * 3.14159695)) / (sqrt(1+sin(pow(X[i] / 180 * 3.14159695, 2))));

Тот же код,только добавил промежуточные результаты и изменил формулу для перевода ответов в нормальный вид,но всё равно ответы не те..
Изображения
Тип файла: jpg 2020-02-14.jpg (57.0 Кб, 3 просмотров)
Georgi Judajev вне форума Ответить с цитированием
Старый 14.02.2020, 09:17   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,537
По умолчанию

....

Последний раз редактировалось digitalis; 14.02.2020 в 10:58. Причина: неактуально уже
digitalis вне форума Ответить с цитированием
Старый 14.02.2020, 10:46   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

При пересчёте градусов в радианы нужно ALFA*(Pi/180), потому, что в Pi ровно 180 градусов. Значит градусы делим на градусы и умножаем на радианы.

Здесь, я бы скобками проставил приоритеты вычислений, лучше лишняя скобка, чем гадания, как машина это интерпретирует
Код:
while( i < MASS && Y[i] > YM)
Без пересчёта в радианы и ввода я бы сделал
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define EPS 1e-20
#define RETURN_OK 0
#define RETURN_DIV_BY_ZERO 1
#define RETURN_COMPLEX 2

int f(float x, float *y)
{
    float temp;
    temp=cos(x);
    if(fabs(temp)<EPS)
        return RETURN_DIV_BY_ZERO;
    (*y)=(1/temp);
    temp=1+sin(x*x);
    if(fabs(temp)<EPS)
        return RETURN_DIV_BY_ZERO;
    if(temp<0)
        return RETURN_COMPLEX;
    (*y) /=sqrt(temp);
    return RETURN_OK;
}

int main()
{

    float A=0;
    float H=5.0;
    float YM=-10.0;

    int i;
    float y;
    float x=A;
    for(i=15; i>0; i--)
    {
        switch (f(x,&y))
        {
        case RETURN_OK:
            printf("%7.3f | %7.3f\n", x, y);
            break;
        case RETURN_DIV_BY_ZERO:
            printf("%7.3f | division by zero\n", x);
            break;
        case RETURN_COMPLEX:
            printf("%7.3f | complex result\n", x);
            break;
        }
        if(y<YM)
            break;
        x+=H;
    }
    return 0;
}
Пересчёт градусов в радианы есть смысл сосредоточить в одном месте. Я пользуюсь gcc, в котором определена константа M_PI, а как дела у Visual Studio не знаю
Код:
int f(float x, float *y)
{
    x=x*M_PI/180.0;
    float temp;
.................
}
Т.к. язык C совсем не знаю, то не смог по человечески определить параметр y в функции. Пробовал
Код:
int f(float x, float &y)
Но компилятор gcc из Code::Block выдал ошибку.

Буду благодарен, если подскажете.

Последний раз редактировалось FPaul; 14.02.2020 в 11:23.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Табулирование заданной функции и определение максимального и минимального значения функции в таблице Марина1986 C/C++ Сетевое программирование 0 07.05.2013 11:31
табулирование функции Alexandr000006 Общие вопросы Delphi 0 29.06.2011 08:02
Табулирование функции oksik_777 Паскаль, Turbo Pascal, PascalABC.NET 0 26.05.2010 19:27
Табулирование функции СИ savra Помощь студентам 1 13.01.2010 11:32
Табулирование функции bygoga Общие вопросы C/C++ 4 02.05.2009 12:50