Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Delphi 7: строки, обратный порядок слов


Страницы:   1 2

Первокурсница ©   (2010-03-25 21:53:00) 

Добрый вечер, господа! =)
У меня очень лёгкий вопрос. Мне нужно вывести слова в строке в обратном порядке. Т.е.: папа мама брат->брат мама папа.
Вот программа которую я пытаюсь делать:
unit Laba4_2Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Label1: TLabel;
   Edit2: TEdit;
   Label2: TLabel;
   Button1: TButton;
   procedure Edit1Change(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 str: string;

implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
str:=Edit1.Text;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
 A   : Array[1..100] of String;
 i,n : Longint;
 z : String;
begin
 str:=str+' ';
 z:='';
 n:=0;
 For i:=1 to Length(str) Do
 If str[i]<>' ' Then
 z:=z+str[i]
   Else
    Begin
      n:=n+1;
      A[n]:=z;
      z:='';
    End;
 For i:=n Downto 1 Do
 Edit2.Text:=A[n]+' ';
end;
end.

Но она мне выводит только последнее слово и всё. Как исправить?


Sha   (2010-03-26 19:42:00) [21]

> Jeer ©   (26.03.10 18:23) [19]
> посмотри на стиль Sha :)

А мне он нравится :)
Не воспринимайте дальнейшее слишком серьезно, но все-таки...

Точка с запятой после begin'а - наследие Algol'а.
Если это противоречит чьему-то вкусу, то можно задать встречный вопрос:
почему в коде эстетов встречаются точки с запятой перед end'ами? :)

Аналогичная непоследовательность бросается в глаза с отступами.
Если вы делаете отступ после begin'а, то почему делаете отступ перед, а не после end'а. Программирование на ПЛ/1 приучило делать отступы после end'ов, т.к. в этом случае блок кода становится на одну строчку выше и хорошо выделяется на распечатках с близко идущими строками.

Возможность в любой момент рассыпать колоду перфокарт или расположить карты не в той последовательности после использования ручного дырокола приучила не разрывать оператор if, или, если это невозможно, располагать then на той же строке, что и следующий за ним оператор.

Разработчики терминала ЕС-1066 не предполагали, что вы будете писать begin на отдельной строке. Я хоть и недолюбливаю их, но тоже считаю, что код с меньшим числом строк понимается проще.

Есть и другие причуды, но эти основные.

Вот <=' ' я тоже никогда не пишу, почти всегда <=#32.
Точно также никогда не вызываю Length(s) по 3 раза в одной процедуре.
Скорее всего и s[BegPos]:=s[EndPos] никогда не напишу.
А все не так потому, что код в [17] для Первокурсницы. Когда она перейдет на второй курс, я напишу ей по-другому :)


Jeer   (2010-03-26 18:23:00) [22]


> Sha ©   (26.03.10 15:47) [17]


Кстати, к вопросу о стиле - посмотри на стиль Sha :)
Одни ; после бегинов - чего стоят !

А вот такие вещи
<=' '
я давно себе не позволяю, заменяя на
<=#32
или через объявление/инициализацию
WS = #32;


Плохиш   (2010-03-26 16:24:00) [23]

Ну, кто ещё лабу выполнит?


Sha   (2010-03-26 15:47:00) [24]

procedure SwapChars(var s: string; BegPos, EndPos: integer);
var
 ch: char;
begin;
 while BegPos<EndPos do begin;
   ch:=s[BegPos]; s[BegPos]:=s[EndPos]; s[EndPos]:=ch;
   inc(BegPos);
   dec(EndPos);
   end;
 end;

procedure SwapWords(var s: string);
var
 BegPos, EndPos: integer;
begin;
 if Length(s)>0 then begin;
   SwapChars(s,1,Length(s));
   BegPos:=1;
   for EndPos:=1 to Length(s)+1 do
     if s[EndPos]<=' ' then begin;
       if BegPos<EndPos then SwapChars(s,BegPos,EndPos-1);
       BegPos:=EndPos+1;
       end;
   end;
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
begin;
 s:=Edit1.Text;
 SwapWords(s);
 Edit2.Text:=s;
 end;


12   (2010-03-26 09:03:00) [25]

имхо пост без

> unit ***;
>
> interface
>
> uses
>  Windows, Messages, SysUtils, Variants, Classes, Graphics,
>  Controls, Forms,
>  Dialogs, StdCtrls;
>

вызовет более вероятно ответы.
Ничего в этом тексте полезного нет, только наводит на мысль, что автор не понимает какую часть текста программы надо привести.


Jeer   (2010-03-26 08:51:00) [26]


> Leonid Troyanovsky ©   (26.03.10 08:43) [14]


Я и не сомневался, что Первокурсницу завалят предложениями и чем дальше, тем более для нее (него) непонятными.  :)


Leonid Troyanovsky   (2010-03-26 08:43:00) [27]


> Jeer ©   (25.03.10 22:26) [4]

Edit2.Text := '';

Это лишнее, у меня тут все стерильно. [ОНР]


 with TStringList.Create do
   begin
     Delimiter := ' ';
     DelimitedText := Edit1.Text;
     for i := 0 to (Count-1) div 2 do
       Exchange(i, Count-1-i);
     Edit1.Text := DelimitedText;
     Free;
   end;

--
Regards, LVT.


Anatoly Podgoretsky   (2010-03-26 07:30:00) [28]

> Первокурсница  (25.03.2010 22:12:03)  [3]

А так программ тоже неправильная, надо использовать конкатенацию, чтобы получить список


Германн   (2010-03-26 00:58:00) [29]


> Первокурсница ©   (25.03.10 22:12) [3]
>
> А так программа правильная?

Если исправить то на что я указал, то для лабы сойдёт. В кулинарном техникуме потянет на 4+.


Германн   (2010-03-26 00:53:00) [30]


> Первокурсница ©   (25.03.10 22:57) [9]
>
>  For i:=1 to n Do
>  Edit2.Text:=A[i]+' ';
> так тоже не выходит :(
>

Сравни два фрагмента из "твоего" кода:
1.
>  z:='';
>  ...
>  For i:=1 to Length(str) Do
>  If str[i]<>' ' Then
>  z:=z+str[i]
>

2.
>  For i:=1 to n Do
>  Edit2.Text:=A[i]+' ';
>


Найди два существенных отличия.


Плохиш   (2010-03-25 22:59:00) [31]


> Первокурсница ©   (25.03.10 22:57) [9]
>
>  For i:=1 to n Do
>  Edit2.Text:=A[i]+' ';
> так тоже не выходит :(

мда...


Первокурсница   (2010-03-25 22:57:00) [32]

 For i:=1 to n Do
 Edit2.Text:=A[i]+' ';

так тоже не выходит :(


Германн   (2010-03-25 22:53:00) [33]


> Не секрет, один раз

А ну да. Один раз. Остальные затираются.

>  For i:=n Downto 1 Do
>  Edit2.Text:=A[n]+' ';
>


Первокурсница   (2010-03-25 22:47:00) [34]

Не секрет, один раз


Германн   (2010-03-25 22:42:00) [35]


> Но она мне выводит только последнее слово и всё.

И сколько раз выводит, если не секрет? :)


Первокурсница   (2010-03-25 22:28:00) [36]

Jeer, спасибо спасибо спасибо всем :*. Самый лучший форум! =)


Jeer   (2010-03-25 22:26:00) [37]

Лови, может когда и лишнее спасибо скажешь :)
Другим людям... по другому поводу - им будет приятно.

 i: integer;
//
 Edit2.Text := '';
 with  TStringList.Create do begin
   Text := StringReplace(Edit1.Text, #32, #10, [rfReplaceAll]);
   for i:= Count-1 downto 0 do
     Edit2.Text := Edit2.Text + #32 +  Strings[i];
   Free;
 end;


Первокурсница   (2010-03-25 22:12:00) [38]

А так программа правильная? только Edit не вписывается?


Первокурсница   (2010-03-25 22:08:00) [39]

Сейчас попробую, спасибо :)


Игорь Шевченко   (2010-03-25 22:07:00) [40]

используй TStringList


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо