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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2008, 21:09   #1
EAAlien
 
Регистрация: 09.05.2008
Сообщений: 5
По умолчанию Дробные числа

Драсти!

В ходе написания проги у мя возникла проблема. Перешерстив книги я не нашел ответа и вот пришел сюды.

Я сравниваю делаю сартировку дробных значений по убыванию в StringGrid1 и записываю её результаты в StringGrid3. Когда у меня разница между 2мя значениями более 0,5 , то все нормально, но когда она меньше (6,31 и 5,97), то начинаются проблемы. Типы переменных Real.

1. Как мне корректно их сравнивать?
2. Можно ли в StringGrid делать сортировку как-то проще?


Код:
procedure TForm2.Button7Click(Sender: TObject);
var
//Для сортировки
istsg1, {тек столбик SG1}
istsg2,   {тек столбик SG3}
ic     {Номер очищаемого столбца}
:integer;

imax, {Макс знач}
inow  {текущ знач}
:Real;
begin

//Очистка SG3
for ic:=1 to StringGrid3.ColCount do
  begin
    StringGrid3.Cells[ic,1]:='';
    StringGrid3.Cells[ic,2]:='';
  end;
{StringGrid3.ColCount:=2;}


//**********************Для SG1

//Задание нач величины (макс знач 99)
imax:=100;

//От начала до длинны SG1-1
for istsg2:=1 to StringGrid1.ColCount-1 do
Begin


//Поиск макс


    inow:=0;
    for istsg1:=1 to StringGrid1.ColCount-1 do
    Begin
      if (imax>inow) and (StrToFloat(StringGrid1.Cells[istsg1,2])>inow) and (imax>StrToFloat(StringGrid1.Cells[istsg1,2]))  then
      begin
        inow:=StrToFloat(StringGrid1.Cells[istsg1,2]);//Сох в inow
        StringGrid3.Cells[istsg2,0]:=FloatToStr(istsg2);//Автоматическая нумерация
        StringGrid3.Cells[istsg2,1]:=StringGrid1.Cells[istsg1,2];//Сох-ие найденого

        //Тест
        StringGrid3.Cells[istsg2,2]:=FloatToStr(istsg1);
        StringGrid3.Cells[istsg2,3]:=FloatToStr(inow);
        StringGrid3.Cells[istsg2,4]:=FloatToStr(imax);
      end;

    end;
    imax:=inow;
end;

end;

Последний раз редактировалось Stilet; 12.05.2008 в 09:15.
EAAlien вне форума Ответить с цитированием
Старый 09.05.2008, 21:19   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Что в таблице должно быть отсортировано по убыванию?
Значения в строках? в столбцах? Или как-то иначе сортируется таблица?
(не могу понять из вашего алгоритма)

Последний раз редактировалось _Dmitry; 09.05.2008 в 22:20.
_Dmitry вне форума Ответить с цитированием
Старый 09.05.2008, 23:03   #3
EAAlien
 
Регистрация: 09.05.2008
Сообщений: 5
По умолчанию

СПС что откликнулись.
Сартируются строки из SG1[istsg1,2] по убыванию в SG3[istsg2,1]. У меня вопрос лишь в том как правильно сравнивать дробные числа, а остальное я в приципе сделаю.

Вот упрощенный вариант:

Цитата:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
st1,st2:integer;
now,max:real;
begin
max:=100;
for st2:=0 to StringGrid1.ColCount do
Begin
now:=0;
for st1:=0 to StringGrid1.ColCount-1 do
begin
if (max>now) and (StrToFloat(StringGrid1.Cells[st1,0])>now) and (max>StrToFloat(StringGrid1.Cells[st1,0])) then
Begin
now:=StrToFloat(StringGrid1.Cells[st1,0]);
StringGrid2.Cells[st2,0]:=StringGrid1.Cells[st1,0];
end;
end;
max:=now;
end;


end;

procedure TForm1.FormActivate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='9';
StringGrid1.Cells[1,0]:='4,2';
StringGrid1.Cells[2,0]:='5,2';
StringGrid1.Cells[3,0]:='6,1';
StringGrid1.Cells[4,0]:='8,3';

end;

end.
По ходу ваще я чет намудрил ниче не пашиь

Последний раз редактировалось EAAlien; 10.05.2008 в 16:45.
EAAlien вне форума Ответить с цитированием
Старый 11.05.2008, 10:05   #4
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  st1,st2,k: integer;
  now,max: real;
  M: array of real; //массив
begin
  SetLength(M,StringGrid1.ColCount); //размер массива
  //заполняем массив
  for st1:=0 to StringGrid1.ColCount-1 do
    M[st1]:=StrToFloat(StringGrid1.Cells[st1,0]);
  //сортируем массив
  for st1:=0 to High(M) do
    begin
      k:=st1; max:=M[k];
      for st2:=st1 to High(M) do
        if M[st2] > max then
          begin
            k:=st2; max:=M[k];
          end;
      now:=M[st1]; M[st1]:=max; M[k]:=now;
    end;
  //выводим результат
  for st1:=0 to StringGrid1.ColCount-1 do
    StringGrid2.Cells[st1,0]:=FloatToStr(M[st1]);
end;
_Dmitry вне форума Ответить с цитированием
Старый 12.05.2008, 17:56   #5
EAAlien
 
Регистрация: 09.05.2008
Сообщений: 5
По умолчанию

Спасибо большое, воспользовался вашим методом. Все пашет, хотя и пришлося переписать треть проги =). И всеже мне интересно почему этот алгаритм не работает 1.rar
EAAlien вне форума Ответить с цитированием
Старый 12.05.2008, 19:59   #6
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Цитата:
и всеже мне интересно почему этот алгаритм не работает
Наверно что-то в нем неправильно.
Массив сортируется следующим образом: просматриваем весь массив, начиная с нулевого элемента, находим max и меняем с нулевым, далее просматриваем массив уже с первого элемента, потом со второго и т.д. Существуют и другие алгоритмы сортировки...
_Dmitry вне форума Ответить с цитированием
Старый 12.05.2008, 21:10   #7
EAAlien
 
Регистрация: 09.05.2008
Сообщений: 5
По умолчанию

Про способы сортировки я знаю, просто это был самый удобный в моей ситуации при написании проги. Этот(Вложение 3754) алгаритм я проверил и ошибок не нашел, вот мне и стало интересно, может я не змеил, или все же глюк...
EAAlien вне форума Ответить с цитированием
Старый 12.05.2008, 21:44   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Алгоритм работоспособный (хотя есть что убрать), но такое сравнение вещественных чисел в данном случае неприменимо.

Можно так:
Код:
         if ((max-now) > 0.01) and
            ((StrToFloat(StringGrid1.Cells[st1,0]) - now) > 0.01) and
            ((max-StrToFloat(StringGrid1.Cells[st1,0])) > 0.01)
         then
(max > StrToFloat(StringGrid1.Cells[st1,0])) = true
для max = 8.1 и StringGrid1.Cells[st1,0] = '8.1'
из-за ограниченной точности вещественных чисел.

-------------------
кроме того, алгоритм не будет работать, если в массиве будут повторяющиеся числа.

Последний раз редактировалось alexBlack; 12.05.2008 в 21:51.
alexBlack вне форума Ответить с цитированием
Старый 13.05.2008, 19:09   #9
EAAlien
 
Регистрация: 09.05.2008
Сообщений: 5
По умолчанию

Йа глюпий! Спасибо большое! Чет про ограниченную точность ВЧ я и позбиль.

Последний раз редактировалось EAAlien; 13.05.2008 в 20:12.
EAAlien вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Числа в строку DeDoK Общие вопросы Delphi 8 07.06.2008 00:08
вывод числа sergei64_89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 25.05.2008 21:35
ДАНЫ 4 ЧИСЛА X Y Z W составит программу найти произведение все положительные нечетные числа Woland-itn Паскаль, Turbo Pascal, PascalABC.NET 3 23.03.2008 21:49
Про числа Акашаев Нурлан Паскаль, Turbo Pascal, PascalABC.NET 6 12.12.2007 07:18
подскажите какая процедура округляет дробные числа , а не откидывает дробную часть, к ***СкаЙ*** Помощь студентам 5 13.06.2007 16:03