Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

подскажите мою ошибку. программа считает кол-во слов в тексте [D7, WinXP]


Страницы:   1 2

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 ©  

считал разделители, а не "слова"? :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо