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

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

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

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

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

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

Всем привет.
Прошу помощи. Нужен совет
Есть строка в ней есть числа. Надо их занести в массив. Способов много. Какой наименее трудоемкий для программы? У меня большой массив, чисел только 2000-10000.
San4o вне форума Ответить с цитированием
Старый 09.09.2009, 12:55   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Каким образом располагаются числа в строке?
Ищите разделители чисел в цикле. Между двумя разделителями будет ваше число, если последнего разделителя нет, значит в строке кончились числа. Лучше всего в цикле сканируете строку посимвольно. Запоминаете позиции двух последних разделителей. В этом диапазоне будет очередное число. Затем позицию последнего разделителя заносите в первую переменную и ищите следующий разделитель.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.09.2009, 13:11   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

вот глянь сюда, я давал пример быстрого распарсивания массива.
http://www.programmersforum.ru/showthread.php?t=62210
Там находится минимальный элемент, но ничего не стоит его переделать под твою задачую.
I'm learning to live...

Последний раз редактировалось SuperVisor; 10.09.2009 в 10:28. Причина: Чтобы вписывалось в логику темы ;)
Stilet вне форума Ответить с цитированием
Старый 09.09.2009, 18:13   #4
San4o
Пользователь
 
Регистрация: 26.08.2009
Сообщений: 23
По умолчанию Про процедуру

Можно ли в процедуре динмаический массив, который объявлен глобальной переменной, и который в этой процедуре заносится как var ... , расширять. Я это делаю так :

SetLength(f1,i+1);
и он мне говорит ошибку - несовместимый тип.
Почему так?
ведь в других местах не в этой процедуре все идет хорошо.
San4o вне форума Ответить с цитированием
Старый 09.09.2009, 19:29   #5
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Слишком сумбурно и расплывчато описано. На код бы посмотреть, чтобы сориентироваться...

Цитата:
Можно ли в процедуре динмаический массив, который объявлен глобальной переменной, и который в этой процедуре заносится как var ... , расширять.
Пугают меня вот эти ваши слова. Он переобъявлен чтоли внутри процедуры?
Если массив динамический, то, вроде, такой ошибки не должно быть.
Как объявлены f1 и i посмотреть бы...
mMAg вне форума Ответить с цитированием
Старый 09.09.2009, 19:37   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я думаю ТС делает так:
Код:
procedure Test(var TestArr:array of integer);
то там действительно ошибка будет, надо поискать как я обходил это
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.09.2009, 19:39   #7
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Объявить свой тип
Код:
type IntdynArray = array of integer
А затем уже пользоваться этим типом.
mMAg вне форума Ответить с цитированием
Старый 09.09.2009, 19:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
SetLength(f1,i+1);
КАТЕГОРИЧЕСКИ НЕ РЕКОМЕНДУЮ ДЕЛАТЬ ЭТО В ЦИКЛЕ!!! Если никоим образом нельзя оценить (хотя бы приблизительно и "с запасом" сколько понадобится чисел в массиве, то надо выделять память по мере необходимости кусками (ну, хотя бы по 100, 200 или 500 чисел). Иначе получите огромные тормоза - setlength операция не быстрая...

а вообще, код вроде нормальный..
и mMAg прав - показывайте описание переменных f1 и i
вот код, работает без вопросов:
Код:
var
  f1 : array of integer;
  i : integer;
begin
  i:=0;
  while i<10 do begin
    SetLength(f1,i+1);
    f1[i] := i*10;
    inc(i);
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.09.2009, 10:21   #9
San4o
Пользователь
 
Регистрация: 26.08.2009
Сообщений: 23
По умолчанию тут более понятно

Код такой(место ошибки я подчеркнул):

Код:
procedure TForm1.draw(var s:Tlineseries; var k:integer; var f1,f2:array of real; fm:array of real; f:boolean; num:byte);
var i,j:integer;
    fl,fk:boolean;
    g:array of real;
begin
  if num=1 then
   begin
       for i:=0 to high(fm)-1 do
       s.AddXY(i+1,fm[i],'',color1);
   end;
   if num=2 then
   begin
      if f then   //пересчет From SV: Штирлиц 4 рулит...
      begin
          fl:=false;
          fk:=false;
          j:=0;
          for i:=0 to high(fm)-1 do
          begin

             if not fl then
             begin

                if (high(f1)<=i) then
                SetLength(f1,i+1);

                f1[i]:=mas[i];
                fl:=true;
            end
            else
            begin
                if high(f1)<=inttofloat(i) then setlength(f1,i+1);
                f1[i]:=f1[i-1]+(mas[i]-f1[i-1])*(strtofloat(form1.E1.Text));
                if (f1[i-1]-f1[i])>=strtofloat(form1.E2.Text) then
                begin
                    inc(j);
                    if j=1 then  // первое значение хранит номер начала в fx 
                    begin
                        setlength(ffx,j);
                        ffx[0]:=i;
                    end;
                    if high(f2)<=j then setlength(f2,j)
                    f2[j-1]:=f1[i];
                    if not fk then
                    begin
                                      fk:=true;
                                      inc(k);
                    end;


                end
                else
                begin

                fk:=false;
                end;
             end;
         end;
      end;

          for i:=0 to high(fx)-1 do
          s.AddXY(i+1,f1[i],'',color2);

          for i:=0 to high(fxx)-1 do
          s.AddXY(i+1,f2[i],'',color3);



   end;
end;
FROM SV: Есть кнопка "Правка" для своих сообщений. Чтобы код корректно отображался, нужно ставить тэги..

Последний раз редактировалось SuperVisor; 10.09.2009 в 10:36. Причина: Причина выше
San4o вне форума Ответить с цитированием
Старый 10.09.2009, 11:08   #10
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
Счастье Что за непонятки?

Что за непонятки? Не о чём поговорить?
Самый первый комент был правильный.{Как задал вопрос так и ответил}

Определи размер строки ->Считай строку посимволЬно ->Определяй знак-разделитель->Выводи свои цифры.

{Для чего устанавливать размер массива если нужно считывать со строки?}
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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