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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2009, 21:05   #1
Interesno
 
Аватар для Interesno
 
Регистрация: 04.04.2009
Сообщений: 6
По умолчанию Подтолкните к решению

:roll:
Задание для программы такое:
Код:
Программа предназначена для исследования заданного выражения
 в интервале значений аргумента x от xmin до xmax с шагом h. Значения 
xmin, xmax,  h и значения коэффициентов выражения  задать вводом с 
клавиатуры, используя визуальные компоненты. Значения аргумента и 
результаты вычислений вывести на экран в виде таблицы и 
графика
Так как я вообще не знал с чего начинать, сначала написал
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a,b,x,z;
x=StrToFloat(Edit1->Text);
a=StrToFloat(Edit4->Text);
b=StrToFloat(Edit5->Text);
if(x<-1.25) z=(a)*sqrt(fabs(x-1))-3.25;
if(x<=-1.25 && x<1.25) z=(-x)*log(fabs(x));
if (x>=1.25) z=3.25-(b)*sqrt(x+1);
Edit6->Text=FloatToStr(z);
Как бы программа эта работает. Но как я поняла, чтобы записывать много значений в таблицу надо использовать цикл
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a,b,x,z,x1,x2,h;
x1=StrToFloat(Edit1->Text);
x2=StrToFloat(Edit2->Text);
h=StrToFloat(Edit3->Text);
a=StrToFloat(Edit4->Text);
b=StrToFloat(Edit5->Text);
for(x=x1;x<=x2;x=x+h);
{
if(x<-1.25) z=(a)*sqrt(fabs(x-1))-3.25;
if(x<=-1.25 && x<1.25) z=(-x)*log(fabs(x));
if (x>=1.25) z=3.25-(b)*sqrt(x+1);
Цикл вообще выполняется?
В интернете прочитал, что с помощью StringGrid рисуется сетка из значений...Я не могу понять саму суть этого всего... Значения цикла записываются в массив, а потом уже записываюстя в таблицу?
Вот, как я понял про этот элемент(из найденного примера):
в файле unit.h вводим определяем структуру таблицы:
Код:
struct tbl{ int m,p,l;};
, где m-сам шаг,l-номер шага, p-значение функции...
в файле unit.cpp
Код:
//  Функция очистки визуальной таблицы-----------------------
 void clearSring()
{int i;
 for(i=1;  i<n; i++)
  {Form1->StringGrid1->Cells[0][i]="0";
    Form1->StringGrid1->Cells[1][i]="";
    Form1->StringGrid1->Cells[2][i]="";
  }
}
// Функция очистки внутренней таблицы-------------------------
void clearTab()
{ int i;
  for(i=1; i<n; i++)
  {  pst[i].l = "";
      pst[i].m = "";
      pst[i].p = "";
  }
}
// Формирование визуальной таблицы при открытии формы----
void   __fastcall TForm1::FormCreate(TObject *Sender)
{  StringGrid1->Cells[0][0] = "№ ";
   StringGrid1->Cells[1][0] = "значение шага";
   StringGrid1->Cells[2][0] = "значение функции";
   clearTab();
   clearSring();
}
// Создание внутренней динамической таблицы----------------
void   __fastcall TForm1::Edit1Change(TObject *Sender)
{ n=StrToInt(Edit1->Text);
   StringGrid1->RowCount=n+1;
   pst=new tbl[n];
}
// Обработчик события OnClick для кнопки «Записать»----------
void   __fastcall TForm1::Button1Click(TObject *Sender)
{ m=StrToInt(Edit2->Text);  int i;
   for(i=0; i<m; i++)
   { pst[i].l = StringGrid1->Cells[1][i+1];
      pst[i].m = StringGrid1->Cells[2][i+1];
      pst[i].p = StringGrid1->Cells[3][i+1];
   }
}
В моем варианте тоже нужно проходить все эти дейсвтия(очистки визуальной таблицы, очистки внутренней таблицы и т.д.)?
Edit1(Edit2) служат для ввода значений уже в таблицу, как я понял в моем случае надо записывать значение функции в какую то переменную, которую потом уже выводить в Stringdir. Так?
Не понял так же, из какого поля взялось FormCreate
И еще с помощью какого элемента рисуется график?
З.Ы: Если администрация сочтет эту тему "для халявы", то ответьте хотя бы на последний вопрос...
Interesno вне форума Ответить с цитированием
Старый 05.04.2009, 19:05   #2
Interesno
 
Аватар для Interesno
 
Регистрация: 04.04.2009
Сообщений: 6
По умолчанию

У меня получилось
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i=1; 
int a, b; 
float x1, x2, x, z, h; 
x1=StrToFloat(Edit1->Text); 
x2=StrToFloat(Edit2->Text); 
h=StrToFloat(Edit3->Text); 
a=StrToFloat(Edit4->Text); 
b=StrToFloat(Edit5->Text);
StringGrid1->RowCount=int((x2-x1)/h)+2;
for(x=x1; x<=x2; x=x+h) 
{ 
if(x<-1.25) 
z=(a)*sqrt(fabs(x-1))-3.25; 
if(x>=-1.25 && x<1.25)
z=(-x)*log(fabs(x));
if (x>=1.25) 
z=3.25-(b)*sqrt(x+1);
StringGrid1->Cells[1][i]=FloatToStrF(x, ffFixed, 4, 2);
StringGrid1->Cells[2][i]=FloatToStrF(z, ffFixed, 4, 2);
i=i+1;
Chart1->Series[0]->AddXY(x,z);

}
}
всё работает, но теперь другое задание:
Реализовать всё с помощью классов, вычисление частных выражений ветвей основного выражения оформить в виде защищенных компонентных функций базового класса. Вычисление основного выражения оформить в виде открытой компонентной функции производного класса.
Как я понял надо делать вот так:
Файл Unit.cpp
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i=1;
int a, b;
int i=1;
int a, b, x,x1,x2,h;
x1=StrToFloat(Edit1->Text);
x2=StrToFloat(Edit2->Text);
h=StrToFloat(Edit3->Text);
a=StrToFloat(Edit4->Text);
b=StrToFloat(Edit5->Text);
StringGrid1->RowCount=int((x2-x1)/h)+2;
void mn();
StringGrid1->Cells[1][i]=FloatToStrF(x, ffFixed, 4, 2);
StringGrid1->Cells[2][i]=FloatToStrF(z, ffFixed, 4, 2);
i=i+1;
Chart1->Series[0]->AddXY(x,z);
Фaйл Unit.h
Код:
class proc
{
private:
public:
void mn::proc()
{
for(x=x1; x<=x2; x=x+h)
{
if(x<-1.25)
z=z1;
if(x>=-1.25 && x<1.25)
z=z2;
if (x>=1.25)
z=z3;
}
protected:
float z1,z2,z3;
void proc()
z1=(a)*sqrt(fabs(x-1))-3.25;
z2=(-x)*log(fabs(x));
z3=3.25-(b)*sqrt(x+1);
};
Выдает кучу ошибок...как правильно реализовать на основе классов?
Interesno вне форума Ответить с цитированием
Старый 06.04.2009, 20:34   #3
Interesno
 
Аватар для Interesno
 
Регистрация: 04.04.2009
Сообщений: 6
По умолчанию

Код:
// описание базового класса 
class baseClass { 
private: 
double a,b; 
// защищенные компонентные функции (встраиваемые) 
protected: 
// первая "ветвь" 
double branch1 (double x) { 
return a * sqrt(fabs(x - 1)) - 3.25; 
} 
// вторая ветка 
double branch2 (double x) { 
return (-x) * log(fabs(x)); 
} 
// третья ветка 
double branch3 (double x) { 
return 3.25 - b * sqrt(x + 1); 
} 
// как бы конструктор 
public: 
baseClass (double xa, double xb) { 
a = xa; 
b = xb; 
} 
}; 

// производный класс 
class heirClass : public baseClass { 
public: 
// наследование конструктора 
heirClass (double xa, double xb) : baseClass(xa, xb) {} 
// функция вычисления выражения 
double func (double x) { 
if (x < -1.25) return branch1(x); 
else if (x >= -1.25 && x < 1.25) return branch2(x); 
else return branch3(x); 
} 
};
Подскажите, как вызвать func в обработчике кнопок, сразу после начала цикла for ?
У мя приходит на ум тока:
Код:
int main() 
{ 
  heirClass s1;  // инициализация нового объекта класса 
  s1.func( double x);  //вызов функции 
  return; 
}
но так не работает...
Interesno вне форума Ответить с цитированием
Старый 10.04.2009, 00:23   #4
Interesno
 
Аватар для Interesno
 
Регистрация: 04.04.2009
Сообщений: 6
По умолчанию

Спасибо, что всем было влом мне помочь
надо было вызывать так:
Код:
heirClass s1(a,b);
s1.func(x);
А вообще там с реализацией полиморфизма и абстрактного класса. Если кому интересно могу скину код.
Interesno вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна помощь по решению задач на паскале, одномерные массивы! NOUSTA Помощь студентам 16 09.12.2009 23:34
помогите по решению задачи Irok Паскаль, Turbo Pascal, PascalABC.NET 2 08.01.2009 00:52
Нужна помощь по решению задачи .(Delphi) Nora Помощь студентам 4 24.05.2008 07:29
Нобхадима помощь по решению задач. Данилыч Д. Паскаль, Turbo Pascal, PascalABC.NET 11 12.12.2007 22:12