Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 78 из 116<  1 ... 75  76  77  78  79  80  81 ... 116  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Максим
Дико извиняюсь, но нельзя ли как нибудь попроще? я просто еще плохо программирую, и плохо понимаю динамические структуры :(
я понимаю, что я тебя уже достал, но не мог бы ты объяснить "метод Фибоначчи" на словах? а то до меня никак не допрет

и что за свойство TCryogenOptAPI?



Партнер
 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
HardMan
TCryogenOptAPI - это класс моего объекта и ты его можешь не писать. А так, это все равно что писать TForm1 к примеру :)
Динамические массивы - а что в них сложного то? Не хочешь с ними возиться, так не возись. Просто везде, где стоит крышка, то можешь ее убить.
GetOpt(Index).ID - это все равно как MyArr[Index] (у меня просто несколько другая задача, но переделать под твои нужды очень и очень легко.
Метод Фибоначчи примерно такой же, как и бинарный - он чуть-чуть по другому работает. Ему более важна не позиция, а значение по позиции.
Сейчас найду текст одной книжки Рода Стивенсона
Код:
Двоичный поиск оптимизирует поиск полным перебором, так как исключает
большие части списка, не проверяя значения пропускаемых элементов. Если изве-
стно, что значения распределены достаточно равномерно, то можно на каждом
шаге исключить еще большее количество элементов, используя интерполяционный
поиск (interpolation search) .
Интерполяция - это процесс предсказания неизвестных значений на основе
имеющихся. В данном случае вы используете индексы известных значений в спис-
ке, чтобы определить, какой индекс должно иметь искомое значение. Предполо-
жим, что вы имеете такой же список, как на рис. 10.2. Этот список содержит 20
элементов со значениями от 1 до 70. Допустим, что вы хотите найти в этом списке
элемент со значением 44. Значение 44 составляет 64% размера диапазона от 1 до
70. Если считать, что значения элементов распределены равномерно, то искомый
элемент, предположительно, будет находиться в позиции, составляющей 64% от
размера списка - то есть в позиции с индексом 13.
Если найденная алгоритмом позиция неверна, то он сравнивает искомое зна-
чение со значением в выбранной позиции. Если искомое значение меньше, алго-
ритм продолжает искать элемент в первой части списка, если больше, то поиск
продолжается во второй части списка. На рис. 10.3 графически представлен про-
цесс интерполяционного поиска.

Двоичный поиск разбивает список пополам. Интерполяционный поиск делит
список, пытаясь найти ближайший к искомому элемент в списке, при этом точка
разбиения определяется следующим кодом:
Middle := Round(min + ((target - list^[min]) *
((max - min)/(list^[max] - l i s t^[min] ) ) ) ) ;

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Максим
ок, спасибо :) это понял

Максим если тебе не влом, посмотри плиз мой код. я просто хочу где я там ошибся, ведь по идее все должно работать


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
HardMan
Гм, на досуге (наверное завтра с утречка) твой код посмотрю. Пока занят.

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
как сохранить из ричэдита в формате TXT без символов RTF.
То есть при сохранении в TXT при просмотре в блокноте видно это
Цитата:
\par StartPos := SelStart + SelLength;
\par SelAttributes.Style:=SelAttributes.Style+[fsbold];
\par end;
\par end;
\par end;
\par
\par end.
\par \f0
\par }

как сделать что бы не было этих левых символов типа "\par"

_________________
Удачи и мудрости.


 

Member
Статус: Не в сети
Регистрация: 03.03.2006
Откуда: Москва
Максим Дело в том что, к одному и томуже файлу переодически обращается от 2-х до 10-ти программ.


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
Dr.Alc_H>W
Ну и в чем проблема то? Если тебе нужно из него только читать, то открываешь его не эксклюзивно и все. Если нужно писать в файл из нескольких программ, то можно написать цикл, который будет ждать максимум 5 секунд, чтобы записать файл. То есть все время пытаться открыть файл на запись, быстро записать и закрыть.

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 03.03.2006
Откуда: Москва
Максим Но нужно чтоб программа после запуска открывала и записывала инфу в файл не более чем за 1 сек. (лучше меньше), а другая проверяла на изменения за тоже самое время! Ошибка появляется не всегда. Пробовал всякими разными способами в том числе и Try Except... так можноли отключить в компеляторе генератор сообщений об ошибках???


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
Dr.Alc_H>W
В компиляторе ты можешь отключить I/O Errors, только толку от этого будет немного.
А так, нужно пробовать как я сказал - пробовать писать в цикле и ждать не более 5 сек (в жизни будет точно меньше секунды, 5 сек - это тайм-аут), а когда читаешь - открывать файл без экслюзива.
Добавлено спустя 54 секунды
Я вот не помню, может можно как-то открыть файл без эксклюзива. Надо будет посмотреть сегодня.

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Koval
Koval писал(а):
как сделать что бы не было этих левых символов типа "\par"

Установить значение свойства PlainText в False. -> Точнее в True. :wink:
По утрам быват притормаживаю… :haha:
Подправил SaveAs для RichEdit из папки Demos.
Код:
procedure TMainForm.FileSaveAs(Sender: TObject);
begin
  if SaveDialog.Execute then
  begin
    if FileExists(SaveDialog.FileName) then
      if MessageDlg(Format(sOverWrite, [SaveDialog.FileName]),
        mtConfirmation, mbYesNoCancel, 0) <> idYes then Exit;
    Editor.PlainText:= AnsiLowerCase(ExtractFileExt(SaveDialog.FileName)) <> '.rtf'; // Вот :)))
    Editor.Lines.SaveToFile(SaveDialog.FileName);
    SetFileName(SaveDialog.FileName);
    Editor.Modified := False;
    SetModified(False);
  end;
end;


Последний раз редактировалось _SGK 15.12.2006 12:58, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
Dr.Alc_H>W
Вот специально посмотрел. Читать из файла не эксклюзивно.
Код:
    AssignFile(F, FName); { File selected in dialog }
    FileMode := fmOpenRead;
    Reset(F);
    // ...
    // ...
    CloseFile(F);
    FileMode := fmOpenReadWrite;

Добавлено спустя 2 минуты, 41 секунду
Кстати, или же можно сделать вот так:
Код:
  with TFileStream.create('c:\MyFile.doc', fmShareDenyWrite) do
  try
    read(b, 14);
    showmessage(b);
  finally
    Free;
  end;

Тогда тебе позволит в какой-то основной программе читать и писать, а в других только читать более-менее не эксклюзивно. Но правда опять же - до поры, до времени.
Есть есть fmShareCompat - правда не разу им не пользовался, так что не знаю.
Добавлено спустя 25 минут, 47 секунд
HardMan
Ну если ты массив нормально отсортируешь, то вот так будет работать.
Код:
function GetArray: mass;
var
  i: integer;
begin
  for i:=1 to maxarrsize do
    if Length(Form1.StringGrid1.Cells[i-1,0])=0
      then
        Result[i]:=0
      else
        Result[i]:=StrToInt(Form1.StringGrid1.Cells[i-1,0]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  arr: mass;
  exs, middle, index: integer;
  min, max: Integer;
begin
  arr:=GetArray;
  exs:=StrToInt(Edit1.Text);
  Min := 1;
  Max := MaxArrSize;
  Index := 0;
  while (min <= max) do
  begin
    middle := Round((max+min) / 2);
    if (exs = arr[middle]) then
    begin
      Index := middle;
      break;
    end
    else
      if exs < arr[middle] then max := middle - 1
      else min := middle + 1;
  end;
  if index=0
    then
      MessageDlg('Значение '+IntToStr(exs)+' в массиве не найдено.',
                 MtInformation,[mbOk],0)
    else
      Label2.Caption:='Значение '+IntToStr(exs)+' найдено в массиве в позиции '+IntToStr(index);

end;

end.

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 03.03.2006
Откуда: Москва
Максим Спасибо.


 

Member
Статус: Не в сети
Регистрация: 23.12.2004
Откуда: Новосибирск
Если есть у когонибудь модуль XPStyleActnCtrls сбросьте на мыло ivan_f@bk.ru , можно конечно ссылку подбросить, также буду благодарен. Исходники достались по наследству, система была переустановлена и в инете не могу найти.

_________________
Все проходит


 

Member
Статус: Не в сети
Регистрация: 11.07.2004
Откуда: Воронеж
_SGK
Большое человеческое спасибо

_________________
Удачи и мудрости.


 

Максим спасибо тебе большое :)


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
HardMan Dr.Alc_H>W
Не за что.

Dr.Alc_H>W
Вообще, чтение файлов не эксклюзивное легко устроить, а вот такую же запись уже чуть сложнее.
Кстати нашел способ интереснее, только сложнее намного. Можно сделать через мапирование в память в фaйлов.

Или же самый легкий способ - все твои программы завязанны на одной dll, и там есть процедура записи в файл, причем в ней есть такая вещь как критическая секция. Тогда система сама подождет, пока процедуру выполнит предыдущая программа. Правда тут сразу есть мини проблема - нужно сделать так, чтобы эта dll была одной в памяти, а вот это не знаю как под Дельфей реализуемо. Спроси на енту тему у _SGK - он наверное сталкивался с такой штукой.

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Максим
хм.. сейчас перделал код - все равно не пашет :(
для простоты сделал maxarrsize=10, дык не находит кажется 3-ий 4-ый и 7-ой 8-ой элементы
например: -40 -25 -20 -3 0 6 11 28 30 34
как исходное пишу -20, дык рабтает сообщение, что не найдено
не знаю, что за х..... :( уже голову сломал


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
HardMan
У меня работало :( Ща еще посмотрю.
Добавлено спустя 8 минут, 37 секунд
HardMan
Вообщем ищи в своем коде ошибки. У меня все работает.
ВОт просто написал отладочный код.
Код:
procedure TForm1.Button1Click(Sender: TObject);
Const
  MaxArrSize = 11;
  arr: Array [1..MaxArrSize] Of Integer = (-40, -25, -20, -3, 0, 6, 11, 20, 28, 30,34);
var
  exs, middle, index: integer;
  min, max: Integer;
begin
  exs:=20;
  Min := 1;
  Max := MaxArrSize;
  Index := 0;
  while (min <= max) do
  begin
    middle := Round((max+min) / 2);
    if (exs = arr[middle]) then
    begin
      Index := middle;
      break;
    end
    else
      if exs < arr[middle] then max := middle - 1
      else min := middle + 1;
  end;
  if index=0
    then
      MessageDlg('Значение '+IntToStr(exs)+' в массиве не найдено.',
                 mtInformation,[mbOk],0)
    else
      MessageDlg('Значение '+IntToStr(exs)+' найдено в массиве в позиции '+
                 IntToStr(index), mtInformation,[mbOk],0);
end;

Попробовал сначала найти -20, потом попробовал найти просто 20. потом пробовал изменять размер массива с 10 до 11 и тоже самое пробовал. Все работает без проблем.

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Максим
Максим писал(а):
Спроси на енту тему у _SGK - он наверное сталкивался с такой штукой.

Да :) – вариантов море.
Думаю, что в случае с Dr.Alc_H>W, где пишущая программа, судя по всему не его, без разницы.
Потоки вполне подойдут.

Dr.Alc_H>W
Вот набросал пример.
запись значений массива в поток и сохранение в файл.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  arr: array of Integer;
  ms: TMemoryStream;
  i: Integer;
begin
  SetLength(arr, 5);
  ms:= TMemoryStream.Create;
  try
    for i:= low(arr) to high(arr) do
    begin
      arr[i]:= Random(9) + 1;
      ms.Write(arr[i], SizeOf(Integer));
    end;
    ms.SaveToFile('C:\IntArr.dat');
  finally
    Ms.Free;
  end;
end;


соответственно загрузка из файла, заполнение массива данными из потока и их обработка.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  arr: array of Integer;
  Ms: TMemoryStream;
  i, Sum: Integer;
  S: String;
begin
  if FileExists('C:\IntArr.dat') then
  begin
    Sum:= 0; S:= 'Типа инфа:' + #13#13;
    Ms:= TMemoryStream.Create;
    try
      Ms.LoadFromFile('C:\IntArr.dat');
      SetLength(arr, 5);
      for i:= low(arr) to high(arr) do
      begin
        ms.Read(arr[i], SizeOf(Integer));
        Sum:= Sum + arr[i];
        S:= S + #9 + 'arr[' + IntToStr(i) + '] = ' + IntToStr(arr[i]) + #13;
      end;
    finally
      Ms.Free;
    end;
    S:= S + #13#13 + 'Сумма = ' + IntToStr(Sum);
    ShowMessage(S);
  end;
end;


Короче элементарно, при знании структуры файла вообще вопросов нет, а при незнании можно и поискать.

Нестандартная загрузка данных в Memo1.
Предполагается, что Memo1 уже на форме, а ОС установлена по пути: C:\Windows
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  Ms: TMemoryStream;
begin
  Ms:= TMemoryStream.Create;
  try
    Ms.LoadFromFile('C:\Windows\win.ini');
    Memo1.Lines.LoadFromStream(Ms);
  finally
    Ms.Free;
  end;
end;


 

Member
Статус: Не в сети
Регистрация: 05.01.2003
Откуда: Москва
Фото: 2
_SGK
Ему чуть другое нужно, как я понял. Типа клиент-сервер считывание и запись из файлов.

_________________
Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2317 • Страница 78 из 116<  1 ... 75  76  77  78  79  80  81 ... 116  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan