Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Табулируем функцию. Может что подскажете? 
:(
    Опции темы
Doonkan
Дата 11.5.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Всем привет! 
Есть прогрмака табулирование функции y=x*x-1;
Впринципе работаетsmile Но может кто подскажет что или как улучшить?
Код

procedure TForm1.Button1Click(Sender: TObject);
var x,y,xn,xk,dx: real;        // объявление локальных переменных


begin
// (edit1.Text='') or (edit2.Text='') or (edit3.Text='') then label5.Caption:='Не введен какой то из параметров';
//if edit3.Text='0' then label5.Caption:='шаг не может быть равным 0' else


 xn:=StrToFloat(Edit1.Text);  // Начало табуляции, первая точка например -6,28(-2pi)
 xk:=StrToFloat(Edit2.Text);  // Конец табуляции, например 6,28(2pi)
 dx:=StrToFloat(Edit3.Text);  // Щаг табуляции, например 0,395


// Вычисляется  выражение   y:=x*x-1;
if Edit1.Text>Edit2.Text then label5.Caption:='Неправильно заданы границы!';





Memo1.Lines.Add('       X          Y'); //заголовок в Memo
x:=xn;  //начало табулирования
while x<=xk do  //конец табуляции хк
  begin
    y:=x*x-1;
    // Вывод результата в Memo1:

    Memo1.Lines.Add('  '+FloatToStrF(x,ffFixed,5,3)+'     '+FloatToStrF(y,ffFixed,5,3));

    x:=x+dx;
  end;

end;
procedure TForm1.Button2Click(Sender: TObject);
 begin
  Memo1.Lines.Clear;
 end;
procedure TForm1.Button3Click(Sender: TObject);
 begin
  close;
 end;

procedure TForm1.Edit3Change(Sender: TObject);
begin

end;

end.

PM MAIL   Вверх
Keeper89
Дата 11.5.2009, 10:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Цитата(Doonkan @  11.5.2009,  10:36 Найти цитируемый пост)
Но может кто подскажет что или как улучшить?

А что конкретно беспокоит? Улучшать можно до бесконечности.

Пока что касается ошибок:
Неправильно (сравнение строк):
Код

if Edit1.Text>Edit2.Text then label5.Caption:='Неправильно заданы границы!';

Правильно:
Код

if xn > xk then
begin
  label5.Caption:='Неправильно заданы границы!';
  Exit;
end;



--------------------
PM MAIL WWW   Вверх
Doonkan
Дата 11.5.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Keeper89, спасибо!

А беспокоит ввод цифр в поле "шаг" при нуле он бесконечно считает.
И как правильно прописать условие что бы при хотя бы одном не заполненом поле выводилась соответсвующая надпись? а то у меня ошибку выкидывает  и все на этом.


PM MAIL   Вверх
Keeper89
Дата 11.5.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Можно попробовать так:
Код

function DataIsEmpty(): Boolean;
begin
  with Form1 do
    Result := (Trim(Edit1.Text) = '') or (Trim(Edit2.Text) = '') or (Trim(Edit3.Text) = ''); 
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y,xn,xk,dx: real;        // объявление локальных переменных
begin
  xn:=StrToFloat(Edit1.Text);  // Начало табуляции, первая точка например -6,28(-2pi)
  xk:=StrToFloat(Edit2.Text);  // Конец табуляции, например 6,28(2pi)
  dx:=StrToFloat(Edit3.Text);  // Щаг табуляции, например 0,395

  // Вычисляется  выражение   y:=x*x-1;
  if DataIsEmpty() then
  begin
    label5.Caption:='Введите все значения!';
    Exit;
  end;
  if xn > xk then
  begin
    label5.Caption:='Неправильно заданы границы!';
    Exit;
  end;
  if dx <= 0 then
  begin
    label5.Caption:='Неправильно задан шаг табуляции!';
    Exit;
  end;

  Memo1.Lines.Add('       X          Y'); //заголовок в Memo
  x:=xn;  //начало табулирования
  while x<=xk do  //конец табуляции хк
  begin
    y:=x*x-1;
    // Вывод результата в Memo1:
    Memo1.Lines.Add('  '+FloatToStrF(x,ffFixed,5,3)+'     '+FloatToStrF(y,ffFixed,5,3));
    x:=x+dx;
  end;
end;


Это сообщение отредактировал(а) Keeper89 - 11.5.2009, 11:26


--------------------
PM MAIL WWW   Вверх
Doonkan
Дата 11.5.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Keeper89 почти бест! smile 
Все отлично но почему то все же если поле ввода оставить пустым вылетает ошибка...:( 
PM MAIL   Вверх
THandle
Дата 11.5.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Doonkan @  11.5.2009,  13:10 Найти цитируемый пост)
Все отлично но почему то все же если поле ввода оставить пустым вылетает ошибка...:(  


Вместо StrToFloat использовать TryStrToFloat?
PM   Вверх
Keeper89
Дата 11.5.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Да, исключения не обработал smile
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y,xn,xk,dx: real;        // объявление локальных переменных
begin
  
  try
    xn:=StrToFloat(Edit1.Text);  // Начало табуляции, первая точка например -6,28(-2pi)
    xk:=StrToFloat(Edit2.Text);  // Конец табуляции, например 6,28(2pi)
    dx:=StrToFloat(Edit3.Text);  // Щаг табуляции, например 0,395

    if xn > xk then
    begin
      label5.Caption:='Неправильно заданы границы!';
      Exit;
    end;
    if dx <= 0 then
    begin
      label5.Caption:='Неправильно задан шаг табуляции!';
      Exit;
    end;  

    // Вычисляется  выражение   y:=x*x-1;

    Memo1.Lines.Add('       X          Y'); //заголовок в Memo
    x:=xn;  //начало табулирования
    while x<=xk do  //конец табуляции хк
    begin
      y:=x*x-1;
      // Вывод результата в Memo1:
      Memo1.Lines.Add('  '+FloatToStrF(x,ffFixed,5,3)+'     '+FloatToStrF(y,ffFixed,5,3));
      x:=x+dx;
    end;
  except
   label5.Caption:='Значения введены неверно!'
  end;

end;



--------------------
PM MAIL WWW   Вверх
Beltar
Дата 12.5.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



ИМХО лучше проверить пустые ли поля и не использовать без нужды try.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Doonkan
Дата 13.5.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



При пустых значениях полей все равно ошибку выкидывает:( Я уже наверное запарил вас..Извените если что smile

ВСЕМ ОГРОМНОЕ Спасибо большое за помощь! Это лучший форум по програмированиюsmile 
PM MAIL   Вверх
Gwire
Дата 13.5.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



Doonkan, Попробуй перед началом проверить значения. Например так:
Код

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var R: Double;
begin
    Button1.Enabled:= TryStrToFloat( (Sender as TEdit).Text, R );
    if Button1.Enabled
      then Label5.Caption:= ''
      else begin
          Beep;
          Label5.Caption:= 'Это не число!';
      end;
end;

Edit1KeyUp привязываешь ко всем Edit-ам на OnKeyUp, где нужно вводить цифры (в данном примере только TEdit).
Удачи. smile

PM MAIL   Вверх
Gwire
Дата 13.5.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 7.8.2007
Где: Николаев

Репутация: 1
Всего: 4



 А еще добавить можно это:
Код

procedure TForm1.Edit1Exit(Sender: TObject);
var R: Double;
begin
    Button1.Enabled:= TryStrToFloat( (Sender as TEdit).Text, R );
    if not Button1.Enabled then
    begin
        Beep;
        Label5.Caption:= 'Это все еще не число!!!';
        ActiveControl:= (Sender as TEdit);
    end;
end;


Это сообщение отредактировал(а) Gwire - 13.5.2009, 15:43
PM MAIL   Вверх
Doonkan
Дата 13.5.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Цитата(Gwire @ 13.5.2009,  15:19)
Doonkan, Попробуй перед началом проверить значения. Например так:
Код

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var R: Double;
begin
    Button1.Enabled:= TryStrToFloat( (Sender as TEdit).Text, R );
    if Button1.Enabled
      then Label5.Caption:= ''
      else begin
          Beep;
          Label5.Caption:= 'Это не число!';
      end;
end;

Edit1KeyUp привязываешь ко всем Edit-ам на OnKeyUp, где нужно вводить цифры (в данном примере только TEdit).
Удачи. smile

щас попробуюsmile Благадраю.
PM MAIL   Вверх
Keeper89
Дата 13.5.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Цитата(Doonkan @  13.5.2009,  14:39 Найти цитируемый пост)
При пустых значениях полей все равно ошибку выкидывает

из IDE он и будет сначала выдавать ошибку...


--------------------
PM MAIL WWW   Вверх
Mechanic
Дата 14.5.2009, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Можно заюзать VAL.
Он не выдает Exception'ов, и легко проверяется на наличие ошибки.
К тому же, он понимает даже числа, введенные в HEX'е (!) ;-)
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Doonkan
  Дата 16.5.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



а поподробнее?smile как Val заюзать?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.