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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2009, 11:21   #11
San4o
Пользователь
 
Регистрация: 26.08.2009
Сообщений: 23
По умолчанию

у меня тогда пара вопросов :
Дело в том что я работаю с большим коичеством значений 2000-10000, которые надо забирать из текстового файла и рисовать по ним график. Я делаю так:
1. заношу в стринговскую переменную все из файла.
2. по циклу который представлен ниже вычленяю цифпы.
3. заношу их сначала в массив потом в стринггрид.
4. по кнопке рисую по значениям из массива график.
отсюда пара вопросов что быстрее будет выполняться :
1. если я буду идти по строке и вычленять все цифры, просто прикрепляя их к какой-то переменной, а затем когда встречаю нецифру вывожу все из переменной в массив, вот так :
Код:
setlength(form1.mas,0);
    s:='';
    i:=0;
    j:=0;
    f_fl:=false;
    f_num:=false;
    while i<=length(str) do //(copy(str,i,1)<>'')
    begin
         inc(i);
         x:=copy(str,i,1);
         val(copy(str,i,1),n,er);
         if er=0 then
         begin
              s:=s+copy(str,i,1);
              f_num:=true;
         end
         else
         begin
              if (t4k.Checked) and (copy(str,i,1)='.') and not f_fl then
              begin
                  f_fl:=true;
                  if s='' then s:='0';
                  s:=s+',';
              end
              else
              begin
                    if (zp.Checked) and (copy(str,i,1)=',') and not (f_fl) then
                    begin
                          f_fl:=true;
                          if s='' then s:='0';
                          s:=s+',';
                    end
                    else
                    begin
                          if (f_num)then
                          begin
                                if (copy(s,length(s),1)=',') then
                                s:=s+'0';
                                inc(j);
                                setlength(form1.mas,j);
                                form1.mas[j-1]:=strtofloat(s);
                                s:='';
                                f_num:=false;
                                f_fl:=false;
                          end;
                    end;
              end;
         end
    end;
2. или я использую Stringlist?
Как в Delimitor записть записать множество разделителей?
________________

3. еще если я буду заносить не в массив, а в стринггрид это убыстрит процесс?

4. и в программе по этим значениям Я строю график. как быстрее : строить переводя из стринга в real или имея массив типа real и рисовать по нему?

5. Что еще можете порекомендовать для убыстрения процесса?, а то если читаешь из файла, где 2500 значений приграмма зависает на секунд 20-30.

заранее спасибо
San4o вне форума Ответить с цитированием
Старый 11.09.2009, 11:42   #12
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

3. Нет;
4. Одинаково. Вопрос лишь в том - когда ты переводишь строку в реал(когда ты можешь себе это позволить): во время чтения(+ ко времени чтения) или во время построения(+ ко времени построения).
5. Что-то я не пойму... Ты каждый символ перебираешь??!! Кощунство!!! Разделители тебе известны? Если да, то используй pos(). + замени все copy(str,i,1) на str[i]
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось SuperVisor; 11.09.2009 в 11:44.
SuperVisor вне форума Ответить с цитированием
Старый 11.09.2009, 12:07   #13
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Вот функция и пример использования, дальше если надо сами допишите
Код:
function parse(str,znak:string):tstringlist;
var
   sl:tstringlist;
begin
  sl:=tstringlist.Create;
  while length(str)<>0 do
  begin
     if pos(znak,str)<>0 then
     begin
       sl.Add(copy(str,1,pos(znak,str)-1));
       delete(str,1,pos(znak,str));
     end else
     begin
     sl.Add(str);
     delete(str,1,length(str));
     end;
  end;
  result:=sl;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   s:string;
   sl:tstringlist;
   i:integer;
begin
   sl:=tstringlist.Create;
   s:='';
   sl:=parse(edit1.Text,',');
   for I := 0 to sl.Count - 1 do
      s:=s+sl[i]+#10+#13;
   showmessage(s);
end;
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 11.09.2009, 14:30   #14
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

San4o как тебе подсказывает уважаемый товарищ SuperVisor - строки можно представлять не только как строки, но и как массив символов (индексация начинается от единицы), соответственно, чтобы обратиться к конкретному символу нужно писать str[i]. В смысле так быстрей, а самое главное понятней. И второй минус: полное отсутствие комментариев. Когда составляешь программу расписывай действия, которые ты хочешь выполнить. Это здорово помогает при отладке. Это еще только цветочки, представь у тебя будет код в несколько тысяч строк и ты случайно где-то поставил не там запятую и как быть?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
строки массив Артэс Общие вопросы C/C++ 1 06.09.2009 20:31
Массив и строки New_One Общие вопросы C/C++ 8 14.08.2009 12:50
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
Сформировать массив (строки) felmor Паскаль, Turbo Pascal, PascalABC.NET 1 25.12.2008 20:10
3 задачки на Паскаль. Массив,строки. помогите решить до завтра! meds Паскаль, Turbo Pascal, PascalABC.NET 2 29.05.2008 08:29