![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi 7: строки, обратный порядок слов
Первокурсница © (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