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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> строка и массив, Не могу разобраться =) 
V
    Опции темы
MotoArhangel
Дата 25.5.2014, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сижу не могу сообразить как реализовать.
Есть допустим многочлен 
-7x^4-8x^2-1x-9
Его необходимо запихнуть в массив в виде
-9
-1
-8
0
-7

Вот мое кривое, не рабочее творение:d
Код

procedure input(line: integer; str:string);
var
  i,n,k: integer;
  s:string;
begin
  //обнуляем массив
  for i:=0 to maxpower do
    koeff[i, line] := 0;

  //узнаем длину строки
  n:=Length(str);
  k:=0;
  s:='';
  for i := 1 to n do
    begin
     if (str[i]<>'X') and (str[i]<>'+') and (str[i]<>'^')
       then
         if k=0 then s:=s+str[i];
     else
       begin
         if str[i]='^' then k:=1;
         if (k=1) and (str[i]<>'^')
           begin
             koeff[str[i]+1, line] := StrToInt(s);
             k:=0;
             s:='';
           end;
          if (k=0) and (s<>'') then
            begin
              koeff[str[1], line] := StrToInt(s);
              s:='';
              if (str[i]='-')
                  then s:=s+str[i];
            end;
       end;
    end;
end;  
 
PM MAIL   Вверх
PointerToNil
Дата 26.5.2014, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


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

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



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


Новичок



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

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



Поясню в чем проблемма
Код
var
  i,n,k: integer;
  s:string;
begin
  //обнуляем массив
  for i:=0 to maxpower do
    koeff[i, line] := 0;
 
  //узнаем длину строки
  n:=Length(str);
  k:=0;
  s:='';
  for i := 1 to n do
    begin
     if (str[i]<>'X') and (str[i]<>'+') and (str[i]<>'^')
       then
         if k=0 then s:=s+str[i]
     else
       begin
         if str[i]='^' then k:=1;
         if (k=1) and (str[i]<>'^') then
           begin
             koeff[str[i]+1, line] := StrToInt(s);
             k:=0;
             s:='';
           end;

Вот эта части отрабатывается нормально.
Для -7x^4-8x^2. 
-Проходим в цикле и записываем в строку: - и числа
-Если встречаем x пропускаем
-Попадается ^ тогда указываем, что следующее число будет указателем на месте в массиве +1
- записываем в массив 
- убираем указатель
- очищаем строку 

Беда в том что для участка -1x-9 это не пройдет, т.к. нет ^. Попробовал 
что то придумать
Код

 if (k=0) and (s<>'') then
            begin
              koeff[str[1], line] := StrToInt(s);
              s:='';
              if (str[i]='-')
                  then s:=s+str[i];
            end;

, но как то не то.
PM MAIL   Вверх
MotoArhangel
Дата 26.5.2014, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как последнее число записать не соображу. -9
Код

 State := Start;
  for i := 1 to Length(Str) do
  case State of
    Start:
      case Str[i] of
        '0'..'9','-' : State := InInt;
        'x','X': State := InX;
        '^': State := InStep;
      end;
    
    InInt:
         begin
          if k=0 then
            s:=s+Str[i]
          else 
            begin
              koeff[str[i]+1, line] := StrToInt(s);
              k:=0;
              s:='';
            end;
         end; 
          
    InX:
          begin
            if (s='') 
              then s=s+'1' 
            else 
              if (S[1]='-') and (Length(S)=1) Then  
                s=s+'1';  
          end;
    
    InStep:
          begin
            k:=1;
          end;
            
  end;
end;

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



*


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

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



рисуй диаграмму состояний/переходов
PM MAIL   Вверх
Poseidon
Дата 26.5.2014, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MotoArhangel
Дата 26.5.2014, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Здесь все должно быть просто. Возьмем тот же пример -7x^4-8x^2-1x-9
user posted image
x^4 по сути является указателем на место в массиве. А как разбить строку не соображу.

Это сообщение отредактировал(а) MotoArhangel - 26.5.2014, 15:48
PM MAIL   Вверх
PointerToNil
Дата 26.5.2014, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


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

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



это что, ваша диаграмма??????????????????
состояния: начало строки, знак, основание степени, идентификатор переменной, оператор возведения, показатель степени, конец строки
переходы - отдельные символы и их группы: +, -, ^, цифра, буква
PM MAIL   Вверх
MotoArhangel
Дата 26.5.2014, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(PointerToNil @ 26.5.2014,  18:00)
это что, ваша диаграмма??????????????????

Нет. Вот она. 
user posted image
Так? Ни разу не рисовал=)


Это сообщение отредактировал(а) MotoArhangel - 26.5.2014, 20:59
PM MAIL   Вверх
Poseidon
Дата 26.5.2014, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Тут, конечно, надо бы узнать какие в принципе могут быть входные строки. Но для выражения, которое в примере, подойдет вот такая вот регулярка:
Код
((-?\d+)x\^4)?((-?\d+)x\^3)?((-?\d+)x\^2)?((-?\d+)x)?(-?\d+)?
Писалось на коленке что бы показать принцип действия. Не претендую на идеал.

Пример использования:
Код

uses
  System.RegularExpressions;

function GetDigits(const Str: string): TArray<Integer>;
const
  Pattern = '((-?\d+)x\^4)?((-?\d+)x\^3)?((-?\d+)x\^2)?((-?\d+)x)?(-?\d+)?';
var
  RegEx: TRegEx;
  Match: TMatch;
begin
  RegEx := TRegEx.Create(Pattern);
  if RegEx.IsMatch(Str) then
    begin
      Match := RegEx.Match(Str);
      SetLength(Result, 5);

      Result[0] := StrToIntDef(Match.Groups[9].Value, 0);
      Result[1] := StrToIntDef(Match.Groups[8].Value, 0);
      Result[2] := StrToIntDef(Match.Groups[6].Value, 0);
      Result[3] := StrToIntDef(Match.Groups[4].Value, 0);
      Result[4] := StrToIntDef(Match.Groups[2].Value, 0);
    end;
end;


Это сообщение отредактировал(а) Poseidon - 26.5.2014, 22:13


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MotoArhangel
Дата 26.5.2014, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В чем ошибка? Почему в строка при записи пустая?
Код
procedure inputPoly(line: integer; str:string);
var
  i,x,k: integer;
  s:string;
begin
  //обнуляем массив
  for i:=0 to maxpower do
    koeff[i, line] := 0;
  k:=0;
  //от 1 до длины строки
  for i := 1 to Length(str) do
    //если символ в строке
    case str[i] of
     '0'..'9':
        begin
          //если еще не было Х записываем число
          if x=0
            then s:=s+Str[i]
          else
           // if s<>'' then
            begin
              //Записываем в массив S в строку номером = степени
              koeff[strtoint(str[i]), line]:= strtoint(s);
              s:='';
              x:=0;
            end;
        end;
     'x','X':
       begin
         x:=1;
       end;
     '^':
       begin

       end;
     '+','=':
       begin
         // Если минус записываем в строку второе условие для множетеля с x^1
         if (str[i]='-') and (x<>1)
           then s:=s+Str[i]
         else
          // if s<>'' then
           begin
             //запись для множетеля с x^1
             koeff[1, line]:= strtoint(s);
             s:='';
             x:=0;
            // s:=s+Str[i];
           end;
       end;
    end;
end;      


Добавлено @ 22:23
Функция рабочая? Проверяли?
Код

System.RegularExpressions;

В какой версии Delphi уже есть? Просто сейчас в Lazarus'e пишу =) Но если функция нормально работает и в delphi не долго перенести или к lazarusу прицепить регулярку.

И вопрос если массив в 10 строк то
Код

      SetLength(Result, 10);
      Result[0] := StrToIntDef(Match.Groups[20].Value, 0);
      Result[1] := StrToIntDef(Match.Groups[16].Value, 0);
      Result[2] := StrToIntDef(Match.Groups[15].Value, 0);
      Result[3] := StrToIntDef(Match.Groups[14].Value, 0);
      Result[4] := StrToIntDef(Match.Groups[12].Value, 0);
      Result[5] := StrToIntDef(Match.Groups[10].Value, 0);
      Result[6] := StrToIntDef(Match.Groups[8].Value, 0);
      Result[7] := StrToIntDef(Match.Groups[6].Value, 0);
      Result[8] := StrToIntDef(Match.Groups[4].Value, 0);
      Result[9] := StrToIntDef(Match.Groups[2].Value, 0);


И соответственно Pattern поправить? 

Это сообщение отредактировал(а) MotoArhangel - 26.5.2014, 22:33
PM MAIL   Вверх
Poseidon
Дата 26.5.2014, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(MotoArhangel @  26.5.2014,  22:18 Найти цитируемый пост)
В какой версии уже есть?
В XE3 точно есть. В более ранних, если нет, то можно воспользоваться сторонними модулями для регулярок. Их полно в сети.

Цитата(MotoArhangel @  26.5.2014,  22:18 Найти цитируемый пост)
И вопрос если массив в строк 10 то
Нужно смотреть саму регулярку. Как там указаны группировки, так и разносить их по массиву.


Это сообщение отредактировал(а) Poseidon - 26.5.2014, 22:34


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MotoArhangel
Дата 26.5.2014, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По логике, даже так
Код

      SetLength(Result, 10);
      Result[0] := StrToIntDef(Match.Groups[19].Value, 0);
      Result[1] := StrToIntDef(Match.Groups[18].Value, 0);
      Result[2] := StrToIntDef(Match.Groups[16].Value, 0);
      Result[3] := StrToIntDef(Match.Groups[14].Value, 0);
      Result[4] := StrToIntDef(Match.Groups[12].Value, 0);
      Result[5] := StrToIntDef(Match.Groups[10].Value, 0);
      Result[6] := StrToIntDef(Match.Groups[8].Value, 0);
      Result[7] := StrToIntDef(Match.Groups[6].Value, 0);
      Result[8] := StrToIntDef(Match.Groups[4].Value, 0);
      Result[9] := StrToIntDef(Match.Groups[2].Value, 0);

Буду пробовать=) Спасибо что отозвались. Посмотрите мой код выше. Что в нем не так, просто по правильности написания хотя бы.
PM MAIL   Вверх
Poseidon
Дата 26.5.2014, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(MotoArhangel @  26.5.2014,  22:18 Найти цитируемый пост)
В какой версии Delphi уже есть?
Судя по справке, в XE2 появилась.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MotoArhangel
Дата 27.5.2014, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сам все же разобрался с автоматами =)
Код

procedure inputPoly(line: integer; str:string);
var
  i,x,k: integer;
  s:string;
begin
  //обнуляем массив перед записью
  for i:=0 to maxpower do
    koeff[i, line] := 0;

  // обнуляем на всякий случай
  k:=0;
  x:=0;
  s:='';

  //от 1 до длины строки
  for i := 1 to Length(str) do
    //если символ в строке
    case str[i] of
     '0'..'9':
        begin
          //если еще не было Х записываем число в строку
          if x=0
            then s:=s+Str[i];

          // Если был x и ^ тогда
          if (x=1) and (k=1) then
            begin
              //Записываем в массив S в строку номером = степени
              koeff[strtoint(str[i]), line]:= strtoint(s);
              s:='';
              x:=0;
              k:=0;
            end;

         // Если конец строки записываем число
         if (i=Length(str))
           then koeff[0, line]:= strtoint(s);
        end;
     'x','X':
       begin
         //встретили x
         x:=1;
         // если просто x или -x добавляем 1
         if (s='') or (s='-')
           then s:=s+'1';

         // Если x последний в строке
         if i=Length(str)
           then
             begin
               koeff[1, line]:= strtoint(s);
               s:='';
               x:=0;
               k:=0;
             end;
       end;
     '^':
       begin
         //Встретили ^
         k:=1;
       end;
     '+','-':
       begin
         // Если был x но небыло ^
         if (x=1) and (k=0)
           then
             begin
               koeff[1, line]:= strtoint(s);
               s:='';
               x:=0;
               k:=0;
             end;

         // Если минус записываем в строку
         if (str[i]='-')
           then s:=s+Str[i];
       end;
    end;
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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