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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2014, 23:59   #1
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

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

Вот мое кривое, не рабочее творение
Код:
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;
Поясню в чем проблемма.
Код:
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;
, но как то не то.

Последний раз редактировалось Stilet; 26.05.2014 в 07:59.
MotoArhangel вне форума Ответить с цитированием
Старый 26.05.2014, 07:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Использовать регулярные выражения разрешено?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2014, 09:13   #3
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Здесь все должно быть просто. Возьмем тот же пример -7x^4-8x^2-1x-9

x^4 по сути является указателем на место в массиве. А как разбить строку не соображу.

Последний раз редактировалось MotoArhangel; 26.05.2014 в 16:46.
MotoArhangel вне форума Ответить с цитированием
Старый 26.05.2014, 22:00   #4
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Никто не поможет? Вот нарисовал, и все равно не получается=(
MotoArhangel вне форума Ответить с цитированием
Старый 26.05.2014, 23:18   #5
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

В чем ошибка? Почему в строка при записи пустая?
Код:
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;
MotoArhangel вне форума Ответить с цитированием
Старый 27.05.2014, 08:40   #6
MotoArhangel
Пользователь
 
Регистрация: 25.02.2011
Сообщений: 51
По умолчанию

Спасибо огромное в помощи.
Сам все же разобрался =) Может надо кому будет
Код:
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;
MotoArhangel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Строка в массив Nerotim Помощь студентам 3 13.11.2012 22:04
Двумерный динамический массив: с каждым шагом создаётся дополнительная строка Gudsaf Общие вопросы C/C++ 8 27.10.2012 08:43
двухмерный и простой массив и дана строка, состоящая из русских слов. Ритуша Microsoft Office Excel 1 20.05.2010 06:48
Строка в массив из строк Alex Cones Общие вопросы Delphi 9 05.10.2009 16:39
Строка состаяния или загрузачная строка Sergeu Мультимедиа в Delphi 8 27.08.2008 10:32