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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2019, 19:41   #1
Konstantata
Новичок
Джуниор
 
Регистрация: 13.10.2019
Сообщений: 1
По умолчанию При подсчёте значений ошибка log:SING error

Добрый вечер. Столкнулся с такой проблемой, что после ввода значений программа выдаёт ошибку log:SING error раз 10 подряд, а после выводит полученные результаты на экран. В таблице часто встречаются нули, хотя я не уверен, что они должны получаться в ходе работы программы. Сама программа работает корректно, поскольку я подставлял в неё другую функцию без логарифма и всё правильно считалось. Так что дело явно в логарифме. Знаю, что эта ошибка вылезает, когда логарифм пытается считать значение от 0. Прописал условия, чтобы этого не происходило, однако, не помогло. Возможно какого-то условия не хватает, или в программе что-то не так. Прощу помочь решить эту проблему. Ниже код и скрин поля для ввода значений. Выводные значения: интеграл, количество итераций и таблица.

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

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

#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include <cmath>
#include "Unit1.h"
//---------------------------------------

------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------

------------------------------------
double F(double);
void Sim

(double,double,double,int,int&,double&,in

t&);
void Tab

(double,double,double,int,int,double&,dou

ble*,double*,double**,double**);
void RezOut

(int,int,double&,int&,double*,double*,dou

ble**,double**);
//---------------------------------------

------------------------------------
__fastcall TForm1::TForm1(TComponent* 

Owner)
        : TForm(Owner)
{
}
//---------------------------------------

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

void __fastcall TForm1::Button1Click

(TObject *Sender)
{
double C,D,Eps,Xn,Xk,Dx,B;
int Km,Er,M,LS;
Xn=StrToFloat(Form1->Edit1->Text);
Xk=StrToFloat(Form1->Edit2->Text);
Dx=StrToFloat(Form1->Edit3->Text);
C=StrToFloat(Form1->Edit4->Text);
D=StrToFloat(Form1->Edit5->Text);
Eps=StrToFloat(Form1->Edit6->Text);
Km=StrToFloat(Form1->Edit7->Text);
M=StrToFloat(Form1->Edit8->Text);
int N=(int)((Xk-Xn)/Dx)+1;
double *Mx=new double[N];
double *Ma=new double[M];
double **Mf=new double*[M];
for(int i=0;i<M;i++)
 Mf[i]=new double[N];
 double **Err=new double*[M];
for(int i=0;i<M;i++)
 Err[i]=new double[N];
if((Eps>0)&&(Eps<1))
 {
 Sim(C,D,Eps,Km,LS,B,Er);
 if(Er==1)
  {
  ShowMessage("Интеграл не найдет за 

"+IntToStr(Km)+" итераций");
  }
  else
  {
  Tab(Xn,Xk,Dx,N,M,B,Mx,Ma,Mf,Err);
  RezOut(N,M,B,LS,Mx,Ma,Mf,Err);
  }
 }
 else
  {
  ShowMessage("Погрешность должна быть 

больше 0 и меньше 1");
  }
delete[]Mx;
delete[]Ma;
for(int i=0;i<M;i++)
  delete[]Mf[i];
  delete[]Mf;
for(int i=0;i<M;i++)
  delete[]Err[i];
  delete[]Err;
}
//---------------------------------------

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

void __fastcall TForm1::Button2Click

(TObject *Sender)
{
Form1->Edit1->Clear();
Form1->Edit2->Clear();
Form1->Edit3->Clear();
Form1->Edit4->Clear();
Form1->Edit5->Clear();
Form1->Edit6->Clear();
Form1->Edit7->Clear();
Form1->Edit8->Clear();
Form1->Edit9->Clear();
Form1->Edit10->Clear();
for(int i=0;i<=Form1->StringGrid1-

>RowCount;i++)
 {
 Form1->StringGrid1->Rows[i]->Clear();
 }
}
//---------------------------------------

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

void __fastcall TForm1::Button3Click

(TObject *Sender)
{
Close();
}
//---------------------------------------

------------------------------------
double F(double X)
{
double F=exp(X)*cos(X*X);
return F;
}
//---------------------------------------

------------------------------------
void Sim(double C,double D,double Eps,int 

Km,int &LS,double &B,int &Er)
{
double Int,Y1,Yn,S4,S2,H,Del,Loc,X;
int I,J,K2;
Er=1;
LS=0;
Int=0;
Y1=F(C);
Yn=F(D);
K2=2;
J=1;
while(J<=Km)
 {
 H=(D-C)/K2;
 B=0;
 S2=0;
 S4=0;
 I=1;
 X=C+H;
 do {
   if((I%2)!=0)
    {
    S4=S4+F(X);
    }
    else
    {
    S2=S2+F(X);
    Loc=4*S4+2*S2;
    }
    I=I+1;
    X=X+H;
    }
 while(I<K2);
 B=H*(Y1+Yn+Loc)/3;
 Del=fabs(Int-B);
 if(Del<Eps)
   {
   Er=0;
   LS=J;
   J=Km;
   }
 else
   {
   Int=B;
   K2=K2*2;
   }
  J=J+1;
  }
}
//---------------------------------------

------------------------------------
void Tab(double Xn,double Xk,double 

Dx,int N,int M,double 

&B,double*Mx,double*Ma,double**Mf,double*

*Err)
{
for(int i=0;i<M;i++)
   {
   for(int j=0;j<N;j++)
   {
    Mx[j]=Xn+Dx*j;
    if ((log(Ma[i]*Mx[j])!=0) && (Ma[i]

*Mx[j]!=0) && (Ma[i]*Mx[j]!=1) && (Ma

[i]!=0) && (Ma[i]!=1) && (Mx[j]!=0) && 

(Mx[j]!=1))
    {
    Mf[i][j]=(Mx[j]*(cos(M_PI*Mx[j])-

3*B*sin(2*Mx[j])))/log(Ma[i]*Mx[j]);
    Err[i][j]=0;
    }
    else Err[i][j]=1;
   }
 }
}
//---------------------------------------

------------------------------------
void RezOut(int N,int M,double &B,int 

&LS,double *Mx,double *Ma,double 

**Mf,double**Err)
{
Form1->Edit9->Text=FloatToStr(B);
Form1->Edit10->Text=IntToStr(LS);
Form1->StringGrid1->RowCount=N+1;
Form1->StringGrid1->ColCount=M+1;
Form1->StringGrid1->Cells[0][0]="X/A";
for(int i=0;i<M;i++)
   {
   Form1->StringGrid1->Cells[i+1][0]="A

["+IntToStr(i)+"]="+FloatToStr(Ma[i]);
   for(int j=0;j<N;j++)
   {
   Form1->StringGrid1->Cells[0][j+1]="X

["+IntToStr(j)+"]="+FloatToStr(Mx[j]);
   if(Err[i][j]==1)
    Form1->StringGrid1->Cells[i+1][j+1]

="Err";
    else
   Form1->StringGrid1->Cells[i+1][j+1]

=FloatToStr(Mf[i][j]);
   }
 }
}
//---------------------------------------

------------------------------------
Изображения
Тип файла: png 1.PNG (18.3 Кб, 63 просмотров)
Konstantata вне форума Ответить с цитированием
Старый 14.10.2019, 22:01   #2
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Для начала Вам необходимо определится вот здесь:
Код:
#include <math.h>
#include <cmath>
math.h - инклюд языка C
cmath - инклюд языка C++
I am not a wizard, I am just learning.

Последний раз редактировалось Desc; 14.10.2019 в 22:04.
Desc вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual Studio С++. при проверке условий ошибка error C2059: syntax error : ')' Kitekat Помощь студентам 5 07.07.2014 18:36
MFC Sing... Обработчик в классе вида а не в рамке Madmaxisss Visual C++ 1 04.08.2013 16:39
Ошибка Parse error: syntax error, unexpected T_STRING в PHP gunsoy PHP 1 20.07.2012 23:18
ADO,SQL-Count (Ошибка при подсчёте записей) Never74 БД в Delphi 1 01.03.2012 10:40
Периодическая ошибка Run-time error -2147417848 (80010108) Automation error в файле с макросом faraviper Microsoft Office Excel 0 24.02.2011 16:23