![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
подскажите мою ошибку. программа считает кол-во слов в тексте [D7, WinXP]
sokol © (2008-12-20 22:54:00)Undeclared identifier StringToWord - что это значит??? и как сделать правильно.
Подскажите пожалуйста
procedure TForm1.Button1Click(Sender: TObject);
var Source,Dest:Tstrings;
i:integer;
begin
Source:=TstringList.Create;
Dest:=TstringList.Create;
Source.LoadFromFile('c:\MyText.txt');
for i:=0 to Source.Count-1 do
begin
StringToWords(Source[i],2,Dest);
Application.ProcessMessages;
end;
Dest.SaveToFile('c:\MyWords.txt');
ShowMessage('Найдено '+IntToStr(Dest.Count)+' слов');
end;
KilkennyCat (2008-12-21 19:23:00) [1]
> {RASkov} © (21.12.08 16:43) [36]
>
> и с одним не верно будет и например так: "это я" - скажет,
> что всего 1 слово....
обычно, предложение заканчивается точкой или иным знаком ;)
Тын-Дын (2008-12-21 18:11:00) [2]Я бы ещё вариант для комплекта предложил-)
function CntWords(const Str: String): Integer;
var
s: String;
isAlpha: Boolean;
i: integer;
begin
s := Trim(Str);
Result := 0;
if s='' then Exit;
isAlpha := False;
for i := 1 to Length(s)-1 do
begin
case s[i] of
#65..#90,#97..#122,#224..#255,#192..#223,#184,#168: isAlpha := True;
else
begin
if isAlpha then Inc(Result);
isAlpha := False;
end;
end;
end;
if isAlpha then Inc(Result);
end;
Leonid Troyanovsky (2008-12-21 17:32:00) [3]
> Denis__ © (21.12.08 17:17) [37]
> Ставить RxLib для решения учебной задачи, это, ИМХО, не
> очень правильно.
Быть может почитают исходнее на каникулах?
--
Regards, LVT.
Denis__ (2008-12-21 17:17:00) [4]
> А вообще, повторяюсь, такое(и больше) уже реализовано например
> в RxLib...
Ставить RxLib для решения учебной задачи, это, ИМХО, не очень правильно.
{RASkov} (2008-12-21 16:43:00) [5]> [35] KilkennyCat © (21.12.08 16:34)
и с одним не верно будет и например так: "это я" - скажет, что всего 1 слово....
KilkennyCat (2008-12-21 16:34:00) [6]
> но тогда так не верно будет работать если последнее слово
> в тексте один символ...
нет, неверно будет работать, если вся строка - один символ.
{RASkov} (2008-12-21 12:54:00) [7]
type TDelimCh = set of Char;
function GetWordCount(AStr: String; DelimCh: TDelimCh): Integer;
var N: Integer;
begin
Result:=0;
if Length(AStr)=0 then Exit;
if not (AStr[1] in DelimCh) then INC(Result);
for N:= 2 to Length(AStr) do
if (AStr[N-1] in DelimCh) and (not (AStr[N] in DelimCh)) then INC(Result);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetWordCount(Edit1.Text, [' ', ','])));
end;
Это просто исправленный и дополненный вариант [29]...
А вообще, повторяюсь, такое(и больше) уже реализовано например в RxLib...
{RASkov} (2008-12-21 12:22:00) [8]> //не нужно -1
Хм... вроде понял почему -1 сделал из-за
> str[c + 1]
но тогда так не верно будет работать если последнее слово в тексте один символ....
{RASkov} (2008-12-21 12:12:00) [9]> Это для автора вопроса если что...)
Хотя у автора в [27] правильно заданы границы цикла и без дополнительной перменной...
{RASkov} (2008-12-21 12:04:00) [10]> k := length(str) - 1; // дабы не вычислять
Не верно два раза:
procedure TForm1.Button1Click(Sender: TObject);
var n: Integer; S: String;
function Len: Integer;
begin
Result:=Length(S); //не нужно -1
ShowMessage('Вычисляем');
end;
begin
S:='Stroka'; Caption:='';
for N:=1 to Len do //т.е. можно напрямую 1 to Length(S)
Caption:=Caption+s[n];
end;
:) Это для автора вопроса если что...)
KilkennyCat (2008-12-21 06:11:00) [11]
> if (str[c] in [A..z, А..я]) then and (not (str[c + 1] in
> [A..z, А..я])) then
опечатался. первый then не читать.
KilkennyCat (2008-12-21 06:10:00) [12]
> sokol © (21.12.08 02:58) [27]
какой ужас....
procedure TForm1.Button2Click(Sender: TObject);
var
c, i, k : integer;
str: string;
begin
j := 0; // слова
k := length(str) - 1; // дабы не вычислять
for c := 1 to do к// бежим по тексту
begin
if (str[c] in [A..z, А..я]) then and (not (str[c + 1] in [A..z, А..я])) then // если граница слова
inc(j); // добавляем слово
end;
сосчитать пробелы - добавление еще одного иф. и все.
Германн (2008-12-21 04:30:00) [13]Удалено модератором
sokol (2008-12-21 02:58:00) [14]у меня сначала получилось с использованием StringCount, но потом онид хороший человек подсказал еще проще (но результат одинаков):
procedure TForm1.Button2Click(Sender: TObject);
var c, i, j, k : integer;
str:string;
const del: set of char = [',', '.']; // символы-разделители
begin
i:=0; // пробелы
j:=0; // слова
k:=0; // длина слова
for c:=1 to length(str)do // в str лежит нужный текст
begin
if (str[c] in del)then // если символ - разделитель
if k>0 then // если перед символом было слово
begin
inc(j); // добавляем слово
k:=0; // и обнуляем счетчик его длины
end
else
else // если другой символ
begin
if (str[c]=' ')then // если пробел
begin
if k>0 then // если перед пробелом было слово
inc(j); // добавляем слово
inc(i); // добавляем пробел
k:=0; // обнуляем счетчик длины слова
end
else // если обычная буква
inc(k); // увеличиваем счетчик длины слова
end;
end;
// дальше надо просто вывести содержимое i и j куда угодно (я вывел в Эдит)
end;
antonn (2008-12-21 01:15:00) [15]если будет правильным - добавлю в drkb, не дадим полученному опыту зачахнуть в архивах :))
{RASkov} (2008-12-21 01:12:00) [16]> Ну приведи решение-то. Пусть и другим польза будет.
Я бы сказал так: не столько другим, сколько сам себя бы проверил...)
{RASkov} (2008-12-21 01:10:00) [17]Хм... :) что-то не в тему мой [23] пост получился)... как быстро "навтыкали" последних постов)
{RASkov} (2008-12-21 01:08:00) [18]> [18] sokol © (21.12.08 00:11)
> а какой вообще принцип счета??
Принцип такой:
Все символы нужно разделить на две группы: разделители слов и остальные.
Далее бежим по символам и когда встретили первый разделитель, то увеличиваем счетчик слов, затем пропускаем все разделители(это может быть и один пробел, и группа пробелов или например #13#10(CRLF)) до первого символа не из разделителей, и опять бежим пока не попадется разделитель или конец текста увеличиваем счетчик слов.... увеличивать можно наверное на первом символе не разделителе...
Осилишь сам?
Тын-Дын (2008-12-21 01:08:00) [19]
> sokol © (21.12.08 01:07) [20]
> всё!!! решил этот вопрос другим способом, более легким :
> ))
Ну приведи решение-то. Пусть и другим польза будет.
antonn (2008-12-21 01:07:00) [20]
> sokol ©
считал разделители, а не "слова"? :)