Помогите с прогой на СИ++

Михаил

Участник
Вообщем надо написать прогу, которая будет решать уравнение численным методом: т.е. при запуске она запрашивает отрезок от a до b и степень точности eps..... потом должна считать некую точку с=(а+b)/2 и взависимости от того f(a)*f(c)<=0? присваивать с либо и либо а.....тем самым сужая отрезок поиска корня......в момент когда fabs(f(c))<=0 должна выдавать С.

Проблемма в том что когда задаешь отрезок -4 до -3 и от -2 до -1 где собственно и нах. корни прога ВИСНИТ.....

в чем проблемма?

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
#include "math.h"


float root( float x)
{
return pow(x, 3.0)+pow(sin(x), 2.0)+pow((pow(x ,2.0)-5),2.0);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float a;
float b;
float eps;
float c;
float f_a, f_b, f_c;
float res;
float x;

a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
eps = StrToFloat(Edit3->Text);

c=(a+b)/2;

x = a;
f_a = root(x);
x=c;
f_c=root(x);
x=b;
f_b=root(x);
if (f_a*f_b<=0)
{
while(fabs(f_c)>=eps)
{
if(f_a*f_c<=0)
b=c;
else
a=c;
}
res=c;
Label4->Caption = "Êîðåíü: " +
FloatToStrF(res,ffGeneral,7,2);
}
else
Label4->Caption = "Êîðíÿ íåò";

}
 

Searching

Новичок
99,9% все циклиться в
Код:
while(fabs(f_c)>=eps)
{
if(f_a*f_c<=0) b=c;
else a=c;
}
так как внутри него не производиться перерасчет f_c.
Да и вообще наплодил переменных :D
 

Михаил

Участник
Рябяты работает!!!!!!!!! Спасибо Вам........а я то мучился....... вот блин....дурень-то

вот как все собрал:
while(fabs(f_c)>=eps)
{c=(a+b)/2;
x=c;
f_c=root(x);
x = a;
f_a = root(x);

if(f_a*f_c<=0)
b=c;
else
a=c;

}
Спасибо!!!!!

Тему мона закрывать!!!!
 

Nautilus

Старожил
Помогите решить проблему:
Есть файлик с русским текстом, написаный в DOSовской кодировке. Надо в Visual C++ его програмно перекодировать в виндовскую кодировку, чтобы преобразовывать этот файлик и потом его вывести.

Как перекодировать?
 

SerЕga

Старожил
Не занаю, возможно есть какая-нибудь готовая функция, но что тебе мешает по символьно перекодировать?
 

SteelRat

Старожил
Что именно как? Как тебе вариант такой:
1) загрузить текст в буфер
2) пройтись посимвольно по буферу, заменив значения
3) сохранить буфер в файл.new

Или проблема в том, что ты не знаешь таблиц? Посмотри в Дос Навигаторе таблицы XLT. Они там отдельными файлами, можешь их и использовать.
 

Glorius

Старожил
Nautilus":1tzlnyqz сказал(а):
Помогите решить проблему: Есть файлик с русским текстом, написаный в DOSовской кодировке. Надо в Visual C++ его програмно перекодировать в виндовскую кодировку, чтобы преобразовывать этот файлик и потом его вывести. Как перекодировать?
Юзай стадартные API'шные функции: OemToChar и CharToOem
 

Nautilus

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

P.S. API-функции CharToOem и OemToChar не помогают - выдают кракозябрики.
 

Harry

Старожил
2Nautilus
Создай файлик, состоящий из байтов последовательно от 32 до 255 (или не от 32, а от 16 или типа того, чтобы знаки препинания учесть). Открой его каким-нибудь виндовским текстовым редактором как текстовый файл MS-DOS и сохрани в виндовской кодировке. Вот и получится таблица перекодировки - если рассматривать полученный файл как массив байтов с индексацией начиная с 32, то используя в качестве индекса код досовского символа, получаем код этого же символа в виндовской кодировке. В общем, примерно такая идея.
 

Хирург

Старожил
Nautilus":3aysf4pi сказал(а):
По-видимому придется посимвольно перекодировать. Проблема была именно в том, что я не знал кодовых таблиц. P.S. API-функции CharToOem и OemToChar не помогают - выдают кракозябрики.

Если нормально ими пользоваться, должны выдавать то, что надо :)
Я сам ими пользовался для перевода из дос в вин и все было ок.
изучи подробнее параметры
 
Верх