Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.05.2010, 12:49
Аватар для virgin34
virgin34 virgin34 вне форума
Прохожий
 
Регистрация: 24.04.2010
Сообщения: 7
Репутация: 10
По умолчанию разделение строки

Помогите разделить строки из edit на слова, скопировать их в ячейки массива строк, там сравнить и вывести упорядоченно в другой edit
Вот, то что смог навоять(turbo delphi 2006):
Код:
{разделение на слова строки из edit и занесение слова в одну ячейку массива}
procedure TForm1.Razdelenie(Sender: TObject);
var
mas:array[0..100]of string;
i,u,kon:integer;
s,s1:string;
begin
s:=edit1.text;
kon:=Length(s);
i:=1;
u:=0;
for i:=1 to kon do
if s[i]=' ' then
  begin
  s1:=copy(s,i,i-1);
  mas[u]:=s1;
  inc(u);
  end;
edit1.Text:=s;
FOR u:=0 to 100 do
mas[u]:=stringgrid1[u];
end;

{сравнение ячеек в массиве и вывод слов по кол-ву символов в edit в порядке убывания}
procedure TForm1.Sortirovka(Sender: TObject);
var
mas:array[0..100]of string;
i,n,change:integer;
begin
i:=0;
n:=100;
change:=1;
FOR i:=0 to 100 do
begin
StringGrid1.Cells[i]:=mas[i];
end;
while change>0 do
  begin
  change:=0;
  i:=1;
    while i<n do
    if mas[i]>mas[n] then
    begin
    edit2.Text:=s;
    s[i]:=s[i+1];
    s[i+1]:=buf;
    inc(change);
    end
                    else inc(i);
  end;
s:=s+mas[i];
edit2.Text:=s;
end;
Ответить с цитированием
  #2  
Старый 12.05.2010, 12:57
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Чтобы не углублятся в поиск ошибки, скажи что не выходит или что неверно работает???
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #3  
Старый 12.05.2010, 13:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Все это можно сделать намного проще если воспользоваться стандартным классом TStringList.
Код:
procedure TForm1.Edit1Change(Sender: TObject);
Var
 L: TStringList;
begin
 L := TStringList.Create;
 L.Sorted := True;
 L.Text := StringReplace(Edit1.Text,' ',#13,[rfReplaceAll]);
 Edit2.Text := StringReplace(L.Text,#13#10,' ',[rfReplaceAll]);
 L.Free;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 12.05.2010, 16:16
Аватар для virgin34
virgin34 virgin34 вне форума
Прохожий
 
Регистрация: 24.04.2010
Сообщения: 7
Репутация: 10
По умолчанию

Страдалецъ, как-то странно он сортирует. Мне надо по убыванию длины слова. Да и класс TstringList на информатике не затрагивали, придется обьяснять преподавателю как я это сделал. Только работать с массивом и сравнивать ячейки.
У меня не получается выделить слово и скопировать ну или переместить его в ячейку

Последний раз редактировалось virgin34, 13.05.2010 в 18:56.
Ответить с цитированием
  #5  
Старый 13.05.2010, 18:55
Аватар для virgin34
virgin34 virgin34 вне форума
Прохожий
 
Регистрация: 24.04.2010
Сообщения: 7
Репутация: 10
По умолчанию

Помогите здесь разобраться, где if mas[i]>mas[i+1] then происходит неправильное сравнение длины строк ячеек в массиве строк. Ячейки в массиве уже заполнены:1)дома 2)я 3)был. В итоге чтобы в edit слова разместились в порядке убывания длины слова.
Код:
procedure TForm1.RastanovkaSlov(Sender: TObject);
var
mas:array[0..100]of string;
s:string;
i,n,change:integer;
begin
n:=4;
change:=1;
            for i:=0 to 4 do
            mas[i]:=stringgrid1.Cells[i,0];
while change>0 do
  begin
  change:=0;
  i:=0;
    while i<n do
    if mas[i]>mas[i+1] then
    begin
    s:=mas[i]+' ';
    mas[i]:=mas[i+1];
    mas[i+1]:=s;
    inc(change);
    end
                    else inc(i);
  end;

  for i:=0 to 100 do
       begin
       s:=s+mas[i];
       end;

edit2.Text:=s;
end;

Последний раз редактировалось virgin34, 13.05.2010 в 18:58.
Ответить с цитированием
  #6  
Старый 13.05.2010, 19:06
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Тогда тебе надо сравнивать не сами слова, а их длину Length(<слово №I>) > Length(<слово №I+1>)
Ответить с цитированием
  #7  
Старый 13.05.2010, 21:23
Аватар для virgin34
virgin34 virgin34 вне форума
Прохожий
 
Регистрация: 24.04.2010
Сообщения: 7
Репутация: 10
По умолчанию

помогло, спасибо!
Вот еще здесь не могу разобраться, разделить edit на слова и скопировать их по одному в каждую ячейку, не могу понять как задать начало слова для нахождения длины слова в функции copy,(k-n) гдк к-конец слова и n начало
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
mas:array[0..100]of string;
i,u,kon,change:integer;
s,s1:string;
n,k:integer; //начало и конец слова
begin
s:=edit1.text;
kon:=Length(s);
n:=1;
u:=0;
    for i:=0 to kon do
    if s[i]=' ' then
    begin
    k:=i;
    s1:=copy(s,1,k-n);
    mas[u]:=s1;
    change:=1;
    inc(u);
    if change=1 then break
    end;
      for i:=0 to kon do
      if s[i]=' ' then
      begin
      change:=1;
      if change=1 then break
      end;
//n:=i;
        for i:=i to kon do
        begin
        if n=0 then  n:=i else
        begin
        k:=i;
        s1:=copy(s,i-1,k-n);
        n:=0;
        mas[u]:=s1;
        inc(u);
        end;
        end;

edit1.Text:=s;

    for u:=0 to 100 do
    begin
    StringGrid1.Cells[u,0]:=mas[u];
    end;
end;
Ответить с цитированием
  #8  
Старый 13.05.2010, 22:27
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

тебе надо не вычислять априори начало и конец слова, а вырезать их поочереди по пробелу.

Код:
var
  M : Array Of String;
  S : Strng;

  Idx : Integer;
begin
  SetLength(M,0);
  S := 'любая строка, наример полученная из Edit.Text';
  Idx := Pos(' ',S);
  While Idx > 0 Do
    Begin
      SetLength(M,Length(M)+1);
      M[High(M)] := Copy(S,1,Idx-1);
      S := Copy(S,Idx+1,Length(S));
      Idx := Pos(' ',S);
    End;
  SetLength(M,Length(M)+1);
  M[High(M)] := S;
end;
Ответить с цитированием
  #9  
Старый 14.05.2010, 12:26
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

если еще нужно разделение строки.rar
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025