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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2012, 13:57   #1
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию Сформировать массив. Ошибка: Invalid floating point operation. Не могу понять в чем дело

Дана функция y=3sin^2(x)+cos(6x+1)
Сформировать массив значений аргумента и функции в точках экстремумов (минимумы и максимумы): x1*, y1*, x2*, y2 *, … .

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int massiv_y(double x1,double x2, double h);
void main()
{ double x1, x2, h;
printf("Vvedite interval i shag funkcii: \n");
scanf("%lf%lf%lf", &x1, &x2, &h);
massiv_y(x1,x2,h);
getch();
}

int massiv_y(double x1,double x2, double h)
{
int i=0;
double y[100], y_min, x_min, y_max, x_max;
for(x1;x1<=x2;x1+=h)
{y[i++]=3*sin(x1)*sin(x1)+cos(6*x1+1);
if(y[i]<y[i+1])
{y_min=y[i];
x_min=x1;
printf("y_min=%lf x_min=%lf", y_min, x_min);} //Здесь ошибка
else
{y_max=y[i];
x_max=x1;
printf("y_max=%lf x_max=%lf", y_max, x_max);}}
return 0;
}
Sv. вне форума Ответить с цитированием
Старый 14.11.2012, 14:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

На какой строчке?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2012, 14:17   #3
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

Цитата:
На какой строчке?
где комментарий стоит

с этой ошибкой разобралась. увеличила размер массива.
но выводит все x, но не при всех x считает значение y


значит проблема в условии?

и еще вот такую строку вывода сделала:
Код:
printf("\n y_min=%.3lf  x_min=%lf", y_min, x_min);
но выводит много цифр

Последний раз редактировалось Stilet; 15.11.2012 в 17:39.
Sv. вне форума Ответить с цитированием
Старый 14.11.2012, 15:10   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
//Пусть i=3
y[i++]=3*sin(x1)*sin(x1)+cos(6*x1+1);//Записали что-то в y[3], i=4
if(y[i]<y[i+1]) //Если y[4]<y[5] ...
Короче: осторожней с инкрементом.
Abstraction вне форума Ответить с цитированием
Старый 14.11.2012, 16:28   #5
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

спасибо
Sv. вне форума Ответить с цитированием
Старый 14.11.2012, 18:04   #6
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int massiv_y(double x1,double x2, double h);
void main()
{ double x1, x2, h;
printf("Vvedite interval i shag funkcii: \n");
scanf("%lf%lf%lf", &x1, &x2, &h);
massiv_y(x1,x2,h);
getch();
}

int massiv_y(double x1,double x2, double h)
{
int i=0;
double y[400], y_min, x_min, y_max, x_max;
for(x1;x1<x2;x1+=h)
{y[++i]=3*sin(x1)*sin(x1)+cos(6*x1+1);
if(y[i-1]<y[i] && y[i]>y[i+1])
{y_max=y[i];
x_max=x1;
printf("\n x_max=%.3lf  y_max=%lf", x_max, y_max);}
else if(y[i-1]>y[i] && y[i]<y[i+1])
{y_min=y[i];
x_min=x1;
printf("\n x_min=%.3lf  y_min=%lf", x_min, y_min);}}
return 0;
}
почему при изменении размера массива, вычисляются другие значения:


и не все точки совпадают с графиком, хотя условие вроде правильное.
Sv. вне форума Ответить с цитированием
Старый 14.11.2012, 22:37   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Дубль два:
Код:
//Пусть i=3
y[++i]=3*sin(x1)*sin(x1)+cos(6*x1+1);//В y[4] что-то записано, i=4
if(y[i-1]<y[i] && y[i]>y[i+1]) // Если y[3]<y[4] && y[4]>y[5]...
//Только вот засада в том, что в y[5] ещё никто ничего не писал, там мусор
Лучше сначала заполнить массив y. И настоятельно не советую менять значения x1, x2 и h: это может открыть двери достаточно неприятным ошибкам:
Код:
double y[400], y_min, x_min, y_max, x_max;
i=0;
for(double x = x1; x<x2; x+=h, ++i){ //Неплохо бы вначале удостовериться, что x1+400h>=x2
  y[i] = 3*sin(x)*sin(x)+cos(6*x+1); //Сначала заполнили y
}
i=0; //Вернули i "в начало"
for(double x = x1; x<x2; x+=h, ++i){
  //Пошёл основной цикл. Следует быть внимательными, чтобы ненароком не обратиться к y[-1] или y[i+1] при "последнем" i
Abstraction вне форума Ответить с цитированием
Старый 15.11.2012, 17:35   #8
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

будет ли вот так правильно?

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int massiv_y(double x1,double x2, double h);
void main()
{ double x1, x2, h;
printf("Vvedite interval i shag funkcii: \n");
scanf("%lf%lf%lf", &x1, &x2, &h);
massiv_y(x1,x2,h);
getch();
}

int massiv_y(double x1,double x2, double h)
{
int i;
double y[400], y_min, x_min, y_max, x_max;
i=0;
for(double x=x1; x<=x2; x+=h, ++i)
{y[i]=3*sin(x)*sin(x)+cos(6*x+1);}
i=0;
for(double x=x1; x<x2; x+=h, ++i)
{if(x==x1)
{continue;}
y[i]=3*sin(x)*sin(x)+cos(6*x+1);
if(y[i-1]<y[i] && y[i]>y[i+1])
{y_max=y[i];
x_max=x;
printf("\n x_max=%.3lf  y_max=%lf", x_max, y_max);}
else if(y[i-1]>y[i] && y[i]<y[i+1])
{y_min=y[i];
x_min=x;
printf("\n x_min=%.3lf  y_min=%lf", x_min, y_min);}}
return 0;
}

Последний раз редактировалось Sv.; 15.11.2012 в 17:51.
Sv. вне форума Ответить с цитированием
Старый 15.11.2012, 18:20   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Если гарантируется, что в x1-x2 укладывается целое число h, то вроде нормально; чуть более обще будет условие выхода во втором цикле поменять с x<x2 на x+h<=x2.
Abstraction вне форума Ответить с цитированием
Старый 15.11.2012, 18:26   #10
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

Abstraction, спасибо большое))
Sv. вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе (invalid floating point operation ?) ALABAMA Паскаль, Turbo Pascal, PascalABC.NET 3 15.02.2012 19:18
Ошибка Invalid floating point operation ksv1991 Помощь студентам 0 10.08.2011 16:42
Invalid floating point operation ужасная ошибка ВСЁПРОСТО Помощь студентам 3 24.08.2010 15:32
Ошибка: invalid floating point operation Willow Помощь студентам 3 24.01.2010 18:42
Возникает ошибка Invalid floating point operation Иринкаа Помощь студентам 3 29.11.2007 22:10