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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2010, 19:00   #1
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию Delphi7. Разбитие строки на подстроки

Доброго времени суток, уважаемые форумчане!
Блин, весь мозг сломал...описание ситуации (конкретно сам вопрос будет ниже) :есть поле Memo1, в которое вписано сообщение, пускай QWERTYUIO
Есть поле Edit2, в которой пользователь вписывает число, в соответствии с которым нужно разбить текст из поля Memo1 на n частей таким образом, чтобы в каждой части была каждая n-ная буква, и записать всё это в поле Memo3.
В итоге, если мы в поле Edit2 введём 3, то в поле Memo3 получим:
QRU
WTI
EYO
Листинг моей процедуры такой:
Код:
procedure TForm1.Button3Click(Sender: TObject); 
var
   a,b:string; // a -cтрока введённых данных в Memo1, b -копия а
   i,j,n,length_text,ni:integer; //i,j-более 20 лет на рынке счётчиков! n-длина ключевого слова, ni - тоже счётчик который отсчитывает n шагов, length_text -длина а
begin
   //Отлов ошибки
   if Edit2.Text = '' then
   begin
      ShowMessage('Не указана n!');
      exit;
   end;
   //Отлов ошибки
   if Memo1.Text = '' then
   begin
      ShowMessage('Нет открытого файла!');
      exit;
   end;

   n:=StrToInt(Edit2.Text); //Считываем n
   Memo3.Lines.Clear; // Чистка
   length_text:=Memo1.GetTextLen;  //Определение длины а
   //Считываем а из Memo1
   a:='';
   for i:=0 to length_text  do
   begin
      a:=a+Memo1.Lines[i];
   end;

   //До этого момента программы всё работает как часики! Проблема ниже
   //Разбиваем а на n частей, где каждая часть - это b
   b:='';
   for ni:=0 to n do
   begin
   i:=ni;
   j:=0;
   while i<=length_text do
   begin
      b[j]:=a[i];
      insert(copy(a,i,1),b,j);
      i:=i+n;
      j:=j+1;
   end;
   Memo3.Lines.Add(b);
   //Memo3.Lines.Add(' ');
   end;
end;
А теперь, внимание, вопрос!
Почему это не работает и где ошибка?
Pecho вне форума Ответить с цитированием
Старый 12.12.2010, 19:23   #2
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию

А, ложная тревога, я разобрался!
Строчку "b[j]:=a[i];"- в топку, перед строчкой "while i<=length_text do" вставить "b:='';" - и всё работает!
Pecho вне форума Ответить с цитированием
Старый 12.12.2010, 19:42   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код
Код:
  for i:=0 to length_text  do
  begin
     a:=a+Memo1.Lines[i];
  end;
тоже в топку.
И разбиение поизящнее бы сделать. Зачем лишние итерации (шаги) в циклах.
Код:
  a := '';
  for i := 0 to Memo1.Lines.Count-1 do
    a := a + Memo1.Lines[i];

  j := Length(a) div n;
  for ni := 1 to n do begin
    Memo2.Lines.Add(Copy(a, 1, j));
    a := Copy(a, j+1, 1000);
  end;
  if a <> '' then
    Memo2.Lines.Add(a);
Если применять Memo1.GetTextLen, то расчет длины строки будет не верным из-за символов-разделителей строки, которые всегда присутствуют в Memo.Lines.

Последний раз редактировалось Прик; 12.12.2010 в 20:00. Причина: Уточнение
Прик вне форума Ответить с цитированием
Старый 12.12.2010, 21:19   #4
Pecho
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 37
По умолчанию

Ага, спасибо!
Pecho вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод строки и числа, вывод усеченной подстроки - как? olgasssssss Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 08.12.2010 17:28
Разделение строки на подстроки (Delphi) Zilian Помощь студентам 3 12.05.2010 20:06
Строки, подстроки Grom48 Помощь студентам 0 30.04.2010 01:19
строки и подстроки Work Group Помощь студентам 1 17.11.2009 15:02
Удалить из строки S1 первую, последнюю, все подстроки совпадающие с S2 ТРОЯН=) Паскаль, Turbo Pascal, PascalABC.NET 1 10.12.2008 23:28