![]() |
|
|
#1
|
|||
|
|||
![]() Привет. Мне необходимо было написать программу, считывающую посимвольно информацию из текстового файла, позволяющую отредактировать считанный текст и сохранить файл на диске. Вторая часть задания заключалось в том, что бы в тексте найти самое длинное слово. Я это всё сделал , но теперь мне необходимо заменить вторую часть задания ( самое длинное слово) на то, что бы после кждого слова в тексте ставилась запятая. А я такого примера найти не смог. Потому и прошу помощи.
Код:
procedure TForm1.N1Click(Sender: TObject); var f: textfile; w: integer; c: char; begin If OpenDialog1.Execute then begin Label1.Visible := false; Memo1.Clear; AssignFile(F,OpenDialog1.FileName); {$I-} reset(F); {$I+} If IOResult = 0 then begin Form1.Caption := OpenDialog1.FileName; W := 0; If CheckBox1.Checked then begin while Not EOF(F) do begin Memo1.Lines.Add(''); While Not EOLn(F) do begin read(F,C); Memo1.Lines[W]:=Memo1.Lines[W]+C; end; Inc(W); //Увеличить счетчик строк readln(F); {Перейти к считыванию новой строки} end; end else //Файл считывается сразу begin Memo1.Lines.LoadFromFile(OpenDialog1.FileName); {Считать файл} end; CloseFile(F); //Закрыть файл Label1.Caption := 'Текс изменен'; end else //Файл не открыть ShowMessage('Ошибка открытия файла '+OpenDialog1.FileName); {Выдать сообщение об ошибке} end; //Конец работы с файлом end; procedure TForm1.N2Click(Sender: TObject); var f: textfile; res:integer; begin If SaveDialog1.Execute then begin AssignFile(F,SaveDialog1.FileName); {$I-} reset(F); res := IOResult; {$I+} If (res <> 0) or ((res = 0) and (MessageDlg('Файл уже существует. Перезаписать?', mtWarning, [mbYes, mbCancel], -1) = mrYes)) then begin if (res = 0) then CloseFile(F); Memo1.Lines.SaveToFile(SaveDialog1.FileName); Form1.Caption := SaveDialog1.FileName; Label1.Visible := false; end; end; end; procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char); begin Label1.Visible := true; end; procedure TForm1.FormCreate(Sender: TObject); begin Label1.Visible := false; end; procedure TForm1.Button1Click(Sender: TObject); var i, j: integer; w, lw: string; begin lw := ''; for i:=0 to Memo1.Lines.Count-1 do begin j := 1; w := ''; while j <= length(Memo1.Lines[i]) do begin if Memo1.Lines[i][j] = ' ' then begin if (length(w) > length(lw)) then lw := w; w := ''; end else w := w + Memo1.Lines[i][j]; inc(j); end; if (length(w) > length(lw)) then lw := w; end; ShowMessage('Самое длинное слово длиной '+inttostr(length(lw))+'символов: '+lw); end; end. |
#2
|
|||
|
|||
![]() А чем в тексте разделены слова?
|
#3
|
|||
|
|||
![]() Пусть текст находится в Memo1.
Разделители слов - пробелы. Все слова без переноса (-), т.е. одно слово всегда находится на строке. И еще одно усливие - нет двойных/тройных/и т.д. пробелов. Тогда самый простой способ такой: 1. StringReplace заменяет пробел на комбинацию запятая-пробел. 2. Проходим по все строкам и добавялем в конце еще по запятой. Код:
procedure TForm1.btnCommaClick(Sender : TObject); var I : Integer; begin Memo1.Lines.Text := StringReplace(Memo1.Lines.Text,' ',', ',[rfReplaceAll]); For I := 0 to Memo1.Lines.Count-1 Do Memo1.Lines[i] := Memo1.Lines[i]+','; end; Случай вырожденный, конечно, но для лабы/контрольной сойдет. |
#4
|
|||
|
|||
![]() lmikle, Спасибо. Думаю так устроит. ВЫручил
|