Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1229789252
self
2008-12-20 19:07
2009.02.01
ticqclient в dll


9-1167021706
MonoLife
2006-12-25 07:41
2009.02.01
puzzle


2-1229861533
flunkkkk
2008-12-21 15:12
2009.02.01
доработка в программе


15-1228576006
Artem
2008-12-06 18:06
2009.02.01
Литература COM в Delphi


2-1229897343
AlexF
2008-12-22 01:09
2009.02.01
TComboBox