Текущий архив: 2009.02.01;
Скачать: CL | DM;
Вниз
подскажите мою ошибку. программа считает кол-во слов в тексте Найти похожие ветки
← →
sokol © (2008-12-20 22:54) [0]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;
← →
Johnmen © (2008-12-20 23:02) [1]
> Undeclared identifier StringToWord - что это значит???
Это значит, что компилятор тоже не знает, что это.
> var Source:Tstrings;
> Source:=TstringList.Create;
Вот здесь тебе ничего не кажется странным?
ЗЫ
Ещё есть F1. Которую можно нажать на Tstrings и почитать.
← →
sokol © (2008-12-20 23:10) [2]> var Source:Tstrings;
> Source:=TstringList.Create;
Вот здесь тебе ничего не кажется странным?
я мало что понимаю в этом :)
тогда какую команду можно использовать для подсчета слов??
направьте на путь истинный :))
← →
sokol © (2008-12-20 23:11) [3]прогу смотрел здесь http://kladovka.net.ru/delphibase/?action=viewfunc&topic=strsearch&id=10231
← →
Anatoly Podgoretsky © (2008-12-20 23:17) [4]
> прогу смотрел здесь http://kladovka.net.ru/delphibase/?action=viewfunc&topic=strsearch&id=10231
StringToWord присутствует в примере
← →
sokol © (2008-12-20 23:21) [5]присутствует, только делфи не знает, что это такое (Undeclared identifier StringToWord), может что-то еще нада? или прописать эту ф-ю где-то
← →
antonn © (2008-12-20 23:23) [6]
> Вот здесь тебе ничего не кажется странным?
А здесь есть что то странное?
Мастер соизволит рассказать? Ну просто чтобы вывернуться из ситуации.
← →
{RASkov} © (2008-12-20 23:24) [7]> [5] sokol © (20.12.08 23:21)
> или прописать эту ф-ю
Ага.... не все же копировать-то :)
Иначе не интересно будет...)
← →
{RASkov} © (2008-12-20 23:28) [8]Странным, а точнее недочет, там то, что нет уничтожения этих самых локальных Source и Dest.... утечка.
Автор, совет, меньше занимайся копипастом первое время, потом можно, а для начала лучше вникать в суть...)
← →
sokol © (2008-12-20 23:28) [9]
> Ага.... не все же копировать-то :)Иначе не интересно будет.
> ..)
конечно :) если б шарил это, то давно решил бы :)
а так прошу помощи
← →
{RASkov} © (2008-12-20 23:30) [10]> [9] sokol © (20.12.08 23:28)
Ты не помощи просишь, а полного решения твоей задачи.)
А если не шаришь, то зачем взялся за это? :)
← →
sokol © (2008-12-20 23:35) [11]нет не полного!! хотябы принцип, какие компоненты использовать.
а взялся,т.к. это задание у меня по курсачу
← →
{RASkov} © (2008-12-20 23:35) [12]В RxLib есть функции в RxStrUtil(или както так, не помню точно название модуля) типа: WordCount, WordPosition, ExtractWord и много других...
← →
Тын-Дын © (2008-12-20 23:37) [13]
> sokol © (20.12.08 23:21) [5]
Ты весь код твоей программы привёл?
← →
{RASkov} © (2008-12-20 23:39) [14]> [13] Тын-Дын © (20.12.08 23:37)
> код твоей программы
Это код не его программы.... он даже не понимает для чего и почему там :)
См [3] :)
← →
sokol © (2008-12-20 23:43) [15]ок, спасибо, буду разбираться :)
а где эту RxLib взять? пишет типо нету у меня в базе библиотек такой
← →
{RASkov} © (2008-12-20 23:47) [16]> [15] sokol © (20.12.08 23:43)
Попробуй в яндексе поискать или в гугле...
Или вот например: http://rx.delphiplus.org/
← →
KilkennyCat © (2008-12-21 00:04) [17]Присоединяюсь к вопросу
> antonn © (20.12.08 23:23) [6]
← →
sokol © (2008-12-21 00:11) [18]а какой вообще принцип счета?? мы пишем: если больше " ", то 1 далее еще +1 и т.д. так или нет?
← →
Тын-Дын © (2008-12-21 00:26) [19]
> {RASkov} © (20.12.08 23:39) [14]
> > [13] Тын-Дын © (20.12.08 23:37)> код твоей программы
> Это код не его программы.... он даже не понимает для чего
> и почему там :)См [3] :)
Не его.
Но там в кладовке и нужная ему функция приведена.
Возможно просто не там где нужно её описал...
← →
sokol © (2008-12-21 01:07) [20]всё!!! решил этот вопрос другим способом, более легким :))
← →
antonn © (2008-12-21 01:07) [21]
> sokol ©
считал разделители, а не "слова"? :)
← →
Тын-Дын © (2008-12-21 01:08) [22]
> sokol © (21.12.08 01:07) [20]
> всё!!! решил этот вопрос другим способом, более легким :
> ))
Ну приведи решение-то. Пусть и другим польза будет.
← →
{RASkov} © (2008-12-21 01:08) [23]> [18] sokol © (21.12.08 00:11)
> а какой вообще принцип счета??
Принцип такой:
Все символы нужно разделить на две группы: разделители слов и остальные.
Далее бежим по символам и когда встретили первый разделитель, то увеличиваем счетчик слов, затем пропускаем все разделители(это может быть и один пробел, и группа пробелов или например #13#10(CRLF)) до первого символа не из разделителей, и опять бежим пока не попадется разделитель или конец текста увеличиваем счетчик слов.... увеличивать можно наверное на первом символе не разделителе...
Осилишь сам?
← →
{RASkov} © (2008-12-21 01:10) [24]Хм... :) что-то не в тему мой [23] пост получился)... как быстро "навтыкали" последних постов)
← →
{RASkov} © (2008-12-21 01:12) [25]> Ну приведи решение-то. Пусть и другим польза будет.
Я бы сказал так: не столько другим, сколько сам себя бы проверил...)
← →
antonn © (2008-12-21 01:15) [26]если будет правильным - добавлю в drkb, не дадим полученному опыту зачахнуть в архивах :))
← →
sokol © (2008-12-21 02:58) [27]у меня сначала получилось с использованием 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;
← →
Германн © (2008-12-21 04:30) [28]Удалено модератором
← →
KilkennyCat © (2008-12-21 06:10) [29]
> 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;
сосчитать пробелы - добавление еще одного иф. и все.
← →
KilkennyCat © (2008-12-21 06:11) [30]
> if (str[c] in [A..z, А..я]) then and (not (str[c + 1] in
> [A..z, А..я])) then
опечатался. первый then не читать.
← →
{RASkov} © (2008-12-21 12:04) [31]> 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;
:) Это для автора вопроса если что...)
← →
{RASkov} © (2008-12-21 12:12) [32]> Это для автора вопроса если что...)
Хотя у автора в [27] правильно заданы границы цикла и без дополнительной перменной...
← →
{RASkov} © (2008-12-21 12:22) [33]> //не нужно -1
Хм... вроде понял почему -1 сделал из-за
> str[c + 1]
но тогда так не верно будет работать если последнее слово в тексте один символ....
← →
{RASkov} © (2008-12-21 12:54) [34]
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...
← →
KilkennyCat © (2008-12-21 16:34) [35]
> но тогда так не верно будет работать если последнее слово
> в тексте один символ...
нет, неверно будет работать, если вся строка - один символ.
← →
{RASkov} © (2008-12-21 16:43) [36]> [35] KilkennyCat © (21.12.08 16:34)
и с одним не верно будет и например так: "это я" - скажет, что всего 1 слово....
← →
Denis__ © (2008-12-21 17:17) [37]
> А вообще, повторяюсь, такое(и больше) уже реализовано например
> в RxLib...
Ставить RxLib для решения учебной задачи, это, ИМХО, не очень правильно.
← →
Leonid Troyanovsky © (2008-12-21 17:32) [38]
> Denis__ © (21.12.08 17:17) [37]
> Ставить RxLib для решения учебной задачи, это, ИМХО, не
> очень правильно.
Быть может почитают исходнее на каникулах?
--
Regards, LVT.
← →
Тын-Дын © (2008-12-21 18:11) [39]Я бы ещё вариант для комплекта предложил-)
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;
← →
KilkennyCat © (2008-12-21 19:23) [40]
> {RASkov} © (21.12.08 16:43) [36]
>
> и с одним не верно будет и например так: "это я" - скажет,
> что всего 1 слово....
обычно, предложение заканчивается точкой или иным знаком ;)
Страницы: 1 2 вся ветка
Текущий архив: 2009.02.01;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.011 c