Консультация № 182256
19.02.2011, 10:01
0.00 руб.
0 1 1
Здравствуйте, дорогие эксперты.
Требуется помощь в доработке программы.
Она написана на Delphi 7 в консольном приложении.....

Задача программы звучит так:
Из данного текстового файла удалить слова, длина которых превышает данное число n.

Есть своя наработка

Код:
program lab1;

{$APPTYPE CONSOLE}

function del_words(sl:string; count:byte):string;
var
i,k,j:integer;
len:integer;
begin
i:=1;
len:=length(sl);
while i<=len do begin
j:=i;
k := 0;
while (sl[i]<>' ') and (i<=len) do begin
inc(i);
inc(k);
end;
if k>count then begin
delete(sl,j,k);
len:=length(sl);
end;
inc(i);
end;
del_words := sl;
end;

var f,g:textfile;
s,s1,name_in,name_out:string;
ct:byte;
begin
write('input file name_in: ');
readln(name_in);
write('input file name_out: ');
readln(name_out);
write('input count symbols of word: ');
readln(ct);
assignfile(f,name_in);
assignfile(g,name_out);
reset(f);
rewrite(g);
while not eof(f) do
begin
read(f,s);
s1:=del_words(s,ct);
writeln(g,s1);
end;
CloseFile(f);
CloseFile(g);
end.


Суть доработки в чем:
1)Программа действительно удаляет слова, но почему то не все и не во всех случаях...
Тоисть, при 5 она оставляет несколько слов не удовлетворяющих условию работы и так далее..
2)Если это возможно, то как то модернизировать программу чтобы это делалось все через 1 фаил....без вспомогательного

Спасибо за внимание.

Обсуждение

Неизвестный
19.02.2011, 18:49
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич!
1) Когда в функции del_words уничтожается слово необходимо уменьшать не только длину строки, но и указатель на номер текущего символа:
function del_words(sl:string; count:byte):string;
var
....
begin
......
len:=length(sl);
i:=i-k;
....
end;
Кроме того, в головной программе строку
read(f,s);
необходимо заменить на
readln(f,s);
в противном случае строка не переводиться на следующую и происходит зацикливание

2) Для работы с текстами удобно использовать класс TStringList, объявленый в модуле Classes.
Основную программу можно написать с следующем виде

uses
SysUtils,Classes;
function del_words(sl:string; count:byte):string;
......
end;

var
i:integer;
FileText:TStringList;
begin
write('input file name_in: ');
readln(name_in);
write('input count symbols of word: ');
readln(ct);
FileText:=TStringList.Create;
FileText.LoadFromFile(name_in);
for M := 0 to FileText.Count - 1 do
FileText[M]:=del_words(FileText[M],ct);
FileText.SaveToFile(name_in);
FileText.Free;
end.
5
спасибо
Форма ответа